diff --git a/dep/PackageList.txt b/dep/PackageList.txt index df8139ddd3e..85bd19361c1 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -30,7 +30,7 @@ G3D (a commercial-grade C++ 3D engine available as Open Source (BSD License) jemalloc (a general-purpose scalable concurrent malloc-implementation) http://www.canonware.com/jemalloc/ - Version: 5.0.1 + Version: 5.1.0 libreadline (command line editing library) https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html diff --git a/dep/jemalloc/CMakeLists.txt b/dep/jemalloc/CMakeLists.txt index 39a48004a8e..f67237b66e1 100644 --- a/dep/jemalloc/CMakeLists.txt +++ b/dep/jemalloc/CMakeLists.txt @@ -40,9 +40,11 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/arena.c ${CMAKE_CURRENT_SOURCE_DIR}/src/background_thread.c ${CMAKE_CURRENT_SOURCE_DIR}/src/base.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/bin.c ${CMAKE_CURRENT_SOURCE_DIR}/src/bitmap.c ${CMAKE_CURRENT_SOURCE_DIR}/src/ckh.c ${CMAKE_CURRENT_SOURCE_DIR}/src/ctl.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/div.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_dss.c ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_mmap.c @@ -51,6 +53,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc.c ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc_cpp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/large.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/log.c ${CMAKE_CURRENT_SOURCE_DIR}/src/malloc_io.c ${CMAKE_CURRENT_SOURCE_DIR}/src/mutex.c ${CMAKE_CURRENT_SOURCE_DIR}/src/mutex_pool.c @@ -59,7 +62,6 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/src/prng.c ${CMAKE_CURRENT_SOURCE_DIR}/src/prof.c ${CMAKE_CURRENT_SOURCE_DIR}/src/rtree.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/spin.c ${CMAKE_CURRENT_SOURCE_DIR}/src/stats.c ${CMAKE_CURRENT_SOURCE_DIR}/src/sz.c ${CMAKE_CURRENT_SOURCE_DIR}/src/tcache.c diff --git a/dep/jemalloc/COPYING b/dep/jemalloc/COPYING index e308632a813..98458d971ac 100644 --- a/dep/jemalloc/COPYING +++ b/dep/jemalloc/COPYING @@ -1,10 +1,10 @@ Unless otherwise specified, files in the jemalloc source distribution are subject to the following license: -------------------------------------------------------------------------------- -Copyright (C) 2002-2017 Jason Evans . +Copyright (C) 2002-2018 Jason Evans . All rights reserved. Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved. -Copyright (C) 2009-2017 Facebook, Inc. All rights reserved. +Copyright (C) 2009-2018 Facebook, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/dep/jemalloc/ChangeLog b/dep/jemalloc/ChangeLog index ee1b7ead399..29a00fb78e5 100644 --- a/dep/jemalloc/ChangeLog +++ b/dep/jemalloc/ChangeLog @@ -4,6 +4,123 @@ brevity. Much more detail can be found in the git revision history: https://github.com/jemalloc/jemalloc +* 5.1.0 (May 4th, 2018) + + This release is primarily about fine-tuning, ranging from several new features + to numerous notable performance and portability enhancements. The release and + prior dev versions have been running in multiple large scale applications for + months, and the cumulative improvements are substantial in many cases. + + Given the long and successful production runs, this release is likely a good + candidate for applications to upgrade, from both jemalloc 5.0 and before. For + performance-critical applications, the newly added TUNING.md provides + guidelines on jemalloc tuning. + + New features: + - Implement transparent huge page support for internal metadata. (@interwq) + - Add opt.thp to allow enabling / disabling transparent huge pages for all + mappings. (@interwq) + - Add maximum background thread count option. (@djwatson) + - Allow prof_active to control opt.lg_prof_interval and prof.gdump. + (@interwq) + - Allow arena index lookup based on allocation addresses via mallctl. + (@lionkov) + - Allow disabling initial-exec TLS model. (@davidtgoldblatt, @KenMacD) + - Add opt.lg_extent_max_active_fit to set the max ratio between the size of + the active extent selected (to split off from) and the size of the requested + allocation. (@interwq, @davidtgoldblatt) + - Add retain_grow_limit to set the max size when growing virtual address + space. (@interwq) + - Add mallctl interfaces: + + arena..retain_grow_limit (@interwq) + + arenas.lookup (@lionkov) + + max_background_threads (@djwatson) + + opt.lg_extent_max_active_fit (@interwq) + + opt.max_background_threads (@djwatson) + + opt.metadata_thp (@interwq) + + opt.thp (@interwq) + + stats.metadata_thp (@interwq) + + Portability improvements: + - Support GNU/kFreeBSD configuration. (@paravoid) + - Support m68k, nios2 and SH3 architectures. (@paravoid) + - Fall back to FD_CLOEXEC when O_CLOEXEC is unavailable. (@zonyitoo) + - Fix symbol listing for cross-compiling. (@tamird) + - Fix high bits computation on ARM. (@davidtgoldblatt, @paravoid) + - Disable the CPU_SPINWAIT macro for Power. (@davidtgoldblatt, @marxin) + - Fix MSVC 2015 & 2017 builds. (@rustyx) + - Improve RISC-V support. (@EdSchouten) + - Set name mangling script in strict mode. (@nicolov) + - Avoid MADV_HUGEPAGE on ARM. (@marxin) + - Modify configure to determine return value of strerror_r. + (@davidtgoldblatt, @cferris1000) + - Make sure CXXFLAGS is tested with CPP compiler. (@nehaljwani) + - Fix 32-bit build on MSVC. (@rustyx) + - Fix external symbol on MSVC. (@maksqwe) + - Avoid a printf format specifier warning. (@jasone) + - Add configure option --disable-initial-exec-tls which can allow jemalloc to + be dynamically loaded after program startup. (@davidtgoldblatt, @KenMacD) + - AArch64: Add ILP32 support. (@cmuellner) + - Add --with-lg-vaddr configure option to support cross compiling. + (@cmuellner, @davidtgoldblatt) + + Optimizations and refactors: + - Improve active extent fit with extent_max_active_fit. This considerably + reduces fragmentation over time and improves virtual memory and metadata + usage. (@davidtgoldblatt, @interwq) + - Eagerly coalesce large extents to reduce fragmentation. (@interwq) + - sdallocx: only read size info when page aligned (i.e. possibly sampled), + which speeds up the sized deallocation path significantly. (@interwq) + - Avoid attempting new mappings for in place expansion with retain, since + it rarely succeeds in practice and causes high overhead. (@interwq) + - Refactor OOM handling in newImpl. (@wqfish) + - Add internal fine-grained logging functionality for debugging use. + (@davidtgoldblatt) + - Refactor arena / tcache interactions. (@davidtgoldblatt) + - Refactor extent management with dumpable flag. (@davidtgoldblatt) + - Add runtime detection of lazy purging. (@interwq) + - Use pairing heap instead of red-black tree for extents_avail. (@djwatson) + - Use sysctl on startup in FreeBSD. (@trasz) + - Use thread local prng state instead of atomic. (@djwatson) + - Make decay to always purge one more extent than before, because in + practice large extents are usually the ones that cross the decay threshold. + Purging the additional extent helps save memory as well as reduce VM + fragmentation. (@interwq) + - Fast division by dynamic values. (@davidtgoldblatt) + - Improve the fit for aligned allocation. (@interwq, @edwinsmith) + - Refactor extent_t bitpacking. (@rkmisra) + - Optimize the generated assembly for ticker operations. (@davidtgoldblatt) + - Convert stats printing to use a structured text emitter. (@davidtgoldblatt) + - Remove preserve_lru feature for extents management. (@djwatson) + - Consolidate two memory loads into one on the fast deallocation path. + (@davidtgoldblatt, @interwq) + + Bug fixes (most of the issues are only relevant to jemalloc 5.0): + - Fix deadlock with multithreaded fork in OS X. (@davidtgoldblatt) + - Validate returned file descriptor before use. (@zonyitoo) + - Fix a few background thread initialization and shutdown issues. (@interwq) + - Fix an extent coalesce + decay race by taking both coalescing extents off + the LRU list. (@interwq) + - Fix potentially unbound increase during decay, caused by one thread keep + stashing memory to purge while other threads generating new pages. The + number of pages to purge is checked to prevent this. (@interwq) + - Fix a FreeBSD bootstrap assertion. (@strejda, @interwq) + - Handle 32 bit mutex counters. (@rkmisra) + - Fix a indexing bug when creating background threads. (@davidtgoldblatt, + @binliu19) + - Fix arguments passed to extent_init. (@yuleniwo, @interwq) + - Fix addresses used for ordering mutexes. (@rkmisra) + - Fix abort_conf processing during bootstrap. (@interwq) + - Fix include path order for out-of-tree builds. (@cmuellner) + + Incompatible changes: + - Remove --disable-thp. (@interwq) + - Remove mallctl interfaces: + + config.thp (@interwq) + + Documentation: + - Add TUNING.md. (@interwq, @davidtgoldblatt, @djwatson) + * 5.0.1 (July 1, 2017) This bugfix release fixes several issues, most of which are obscure enough @@ -22,7 +139,7 @@ brevity. Much more detail can be found in the git revision history: unlikely to be an issue with other libc implementations. (@interwq) - Mask signals during background thread creation. This prevents signals from being inadvertently delivered to background threads. (@jasone, - @davidgoldblatt, @interwq) + @davidtgoldblatt, @interwq) - Avoid inactivity checks within background threads, in order to prevent recursive mutex acquisition. (@interwq) - Fix extent_grow_retained() to use the specified hooks when the @@ -515,7 +632,7 @@ brevity. Much more detail can be found in the git revision history: these fixes, xallocx() now tries harder to partially fulfill requests for optional extra space. Note that a couple of minor heap profiling optimizations are included, but these are better thought of as performance - fixes that were integral to disovering most of the other bugs. + fixes that were integral to discovering most of the other bugs. Optimizations: - Avoid a chunk metadata read in arena_prof_tctx_set(), since it is in the diff --git a/dep/jemalloc/include/jemalloc/internal/arena_externs.h b/dep/jemalloc/include/jemalloc/internal/arena_externs.h index af16d158852..4b3732b41da 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_externs.h @@ -1,6 +1,7 @@ #ifndef JEMALLOC_INTERNAL_ARENA_EXTERNS_H #define JEMALLOC_INTERNAL_ARENA_EXTERNS_H +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/pages.h" #include "jemalloc/internal/size_classes.h" @@ -9,25 +10,19 @@ extern ssize_t opt_dirty_decay_ms; extern ssize_t opt_muzzy_decay_ms; -extern const arena_bin_info_t arena_bin_info[NBINS]; - extern percpu_arena_mode_t opt_percpu_arena; extern const char *percpu_arena_mode_names[]; extern const uint64_t h_steps[SMOOTHSTEP_NSTEPS]; extern malloc_mutex_t arenas_lock; -void arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - szind_t szind, uint64_t nrequests); -void arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - size_t size); void arena_basic_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy); void arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy, arena_stats_t *astats, - malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats); + bin_stats_t *bstats, arena_stats_large_t *lstats); void arena_extents_dirty_dalloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent); #ifdef JEMALLOC_JET @@ -50,11 +45,11 @@ void arena_decay(tsdn_t *tsdn, arena_t *arena, bool is_background_thread, void arena_reset(tsd_t *tsd, arena_t *arena); void arena_destroy(tsd_t *tsd, arena_t *arena); void arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes); -void arena_alloc_junk_small(void *ptr, const arena_bin_info_t *bin_info, + cache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes); +void arena_alloc_junk_small(void *ptr, const bin_info_t *bin_info, bool zero); -typedef void (arena_dalloc_junk_small_t)(void *, const arena_bin_info_t *); +typedef void (arena_dalloc_junk_small_t)(void *, const bin_info_t *); extern arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small; void *arena_malloc_hard(tsdn_t *tsdn, arena_t *arena, size_t size, @@ -77,6 +72,8 @@ ssize_t arena_dirty_decay_ms_default_get(void); bool arena_dirty_decay_ms_default_set(ssize_t decay_ms); ssize_t arena_muzzy_decay_ms_default_get(void); bool arena_muzzy_decay_ms_default_set(ssize_t decay_ms); +bool arena_retain_grow_limit_get_set(tsd_t *tsd, arena_t *arena, + size_t *old_limit, size_t *new_limit); unsigned arena_nthreads_get(arena_t *arena, bool internal); void arena_nthreads_inc(arena_t *arena, bool internal); void arena_nthreads_dec(arena_t *arena, bool internal); diff --git a/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h index da5877060a8..9abf7f6ac70 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_inlines_a.h @@ -25,7 +25,7 @@ static inline bool arena_prof_accum(tsdn_t *tsdn, arena_t *arena, uint64_t accumbytes) { cassert(config_prof); - if (likely(prof_interval == 0)) { + if (likely(prof_interval == 0 || !prof_active_get_unlocked())) { return false; } diff --git a/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h b/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h index 003abe116fb..2b7e77e7216 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_inlines_b.h @@ -8,13 +8,6 @@ #include "jemalloc/internal/sz.h" #include "jemalloc/internal/ticker.h" -static inline szind_t -arena_bin_index(arena_t *arena, arena_bin_t *bin) { - szind_t binind = (szind_t)(bin - arena->bins); - assert(binind < NBINS); - return binind; -} - JEMALLOC_ALWAYS_INLINE prof_tctx_t * arena_prof_tctx_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) { cassert(config_prof); @@ -35,7 +28,7 @@ arena_prof_tctx_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) { } JEMALLOC_ALWAYS_INLINE void -arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, size_t usize, +arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, UNUSED size_t usize, alloc_ctx_t *alloc_ctx, prof_tctx_t *tctx) { cassert(config_prof); assert(ptr != NULL); @@ -54,7 +47,7 @@ arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, size_t usize, } static inline void -arena_prof_tctx_reset(tsdn_t *tsdn, const void *ptr, prof_tctx_t *tctx) { +arena_prof_tctx_reset(tsdn_t *tsdn, const void *ptr, UNUSED prof_tctx_t *tctx) { cassert(config_prof); assert(ptr != NULL); diff --git a/dep/jemalloc/include/jemalloc/internal/arena_stats.h b/dep/jemalloc/include/jemalloc/internal/arena_stats.h new file mode 100644 index 00000000000..5f3dca8b155 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/arena_stats.h @@ -0,0 +1,237 @@ +#ifndef JEMALLOC_INTERNAL_ARENA_STATS_H +#define JEMALLOC_INTERNAL_ARENA_STATS_H + +#include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/mutex.h" +#include "jemalloc/internal/mutex_prof.h" +#include "jemalloc/internal/size_classes.h" + +/* + * In those architectures that support 64-bit atomics, we use atomic updates for + * our 64-bit values. Otherwise, we use a plain uint64_t and synchronize + * externally. + */ +#ifdef JEMALLOC_ATOMIC_U64 +typedef atomic_u64_t arena_stats_u64_t; +#else +/* Must hold the arena stats mutex while reading atomically. */ +typedef uint64_t arena_stats_u64_t; +#endif + +typedef struct arena_stats_large_s arena_stats_large_t; +struct arena_stats_large_s { + /* + * Total number of allocation/deallocation requests served directly by + * the arena. + */ + arena_stats_u64_t nmalloc; + arena_stats_u64_t ndalloc; + + /* + * Number of allocation requests that correspond to this size class. + * This includes requests served by tcache, though tcache only + * periodically merges into this counter. + */ + arena_stats_u64_t nrequests; /* Partially derived. */ + + /* Current number of allocations of this size class. */ + size_t curlextents; /* Derived. */ +}; + +typedef struct arena_stats_decay_s arena_stats_decay_t; +struct arena_stats_decay_s { + /* Total number of purge sweeps. */ + arena_stats_u64_t npurge; + /* Total number of madvise calls made. */ + arena_stats_u64_t nmadvise; + /* Total number of pages purged. */ + arena_stats_u64_t purged; +}; + +/* + * Arena stats. Note that fields marked "derived" are not directly maintained + * within the arena code; rather their values are derived during stats merge + * requests. + */ +typedef struct arena_stats_s arena_stats_t; +struct arena_stats_s { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_t mtx; +#endif + + /* Number of bytes currently mapped, excluding retained memory. */ + atomic_zu_t mapped; /* Partially derived. */ + + /* + * Number of unused virtual memory bytes currently retained. Retained + * bytes are technically mapped (though always decommitted or purged), + * but they are excluded from the mapped statistic (above). + */ + atomic_zu_t retained; /* Derived. */ + + arena_stats_decay_t decay_dirty; + arena_stats_decay_t decay_muzzy; + + atomic_zu_t base; /* Derived. */ + atomic_zu_t internal; + atomic_zu_t resident; /* Derived. */ + atomic_zu_t metadata_thp; + + atomic_zu_t allocated_large; /* Derived. */ + arena_stats_u64_t nmalloc_large; /* Derived. */ + arena_stats_u64_t ndalloc_large; /* Derived. */ + arena_stats_u64_t nrequests_large; /* Derived. */ + + /* Number of bytes cached in tcache associated with this arena. */ + atomic_zu_t tcache_bytes; /* Derived. */ + + mutex_prof_data_t mutex_prof_data[mutex_prof_num_arena_mutexes]; + + /* One element for each large size class. */ + arena_stats_large_t lstats[NSIZES - NBINS]; + + /* Arena uptime. */ + nstime_t uptime; +}; + +static inline bool +arena_stats_init(UNUSED tsdn_t *tsdn, arena_stats_t *arena_stats) { + if (config_debug) { + for (size_t i = 0; i < sizeof(arena_stats_t); i++) { + assert(((char *)arena_stats)[i] == 0); + } + } +#ifndef JEMALLOC_ATOMIC_U64 + if (malloc_mutex_init(&arena_stats->mtx, "arena_stats", + WITNESS_RANK_ARENA_STATS, malloc_mutex_rank_exclusive)) { + return true; + } +#endif + /* Memory is zeroed, so there is no need to clear stats. */ + return false; +} + +static inline void +arena_stats_lock(tsdn_t *tsdn, arena_stats_t *arena_stats) { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_lock(tsdn, &arena_stats->mtx); +#endif +} + +static inline void +arena_stats_unlock(tsdn_t *tsdn, arena_stats_t *arena_stats) { +#ifndef JEMALLOC_ATOMIC_U64 + malloc_mutex_unlock(tsdn, &arena_stats->mtx); +#endif +} + +static inline uint64_t +arena_stats_read_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p) { +#ifdef JEMALLOC_ATOMIC_U64 + return atomic_load_u64(p, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + return *p; +#endif +} + +static inline void +arena_stats_add_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p, uint64_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + atomic_fetch_add_u64(p, x, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + *p += x; +#endif +} + +UNUSED static inline void +arena_stats_sub_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, + arena_stats_u64_t *p, uint64_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + UNUSED uint64_t r = atomic_fetch_sub_u64(p, x, ATOMIC_RELAXED); + assert(r - x <= r); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + *p -= x; + assert(*p + x >= *p); +#endif +} + +/* + * Non-atomically sets *dst += src. *dst needs external synchronization. + * This lets us avoid the cost of a fetch_add when its unnecessary (note that + * the types here are atomic). + */ +static inline void +arena_stats_accum_u64(arena_stats_u64_t *dst, uint64_t src) { +#ifdef JEMALLOC_ATOMIC_U64 + uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); + atomic_store_u64(dst, src + cur_dst, ATOMIC_RELAXED); +#else + *dst += src; +#endif +} + +static inline size_t +arena_stats_read_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p) { +#ifdef JEMALLOC_ATOMIC_U64 + return atomic_load_zu(p, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + return atomic_load_zu(p, ATOMIC_RELAXED); +#endif +} + +static inline void +arena_stats_add_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, + size_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + atomic_fetch_add_zu(p, x, ATOMIC_RELAXED); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); + atomic_store_zu(p, cur + x, ATOMIC_RELAXED); +#endif +} + +static inline void +arena_stats_sub_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, + size_t x) { +#ifdef JEMALLOC_ATOMIC_U64 + UNUSED size_t r = atomic_fetch_sub_zu(p, x, ATOMIC_RELAXED); + assert(r - x <= r); +#else + malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); + size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); + atomic_store_zu(p, cur - x, ATOMIC_RELAXED); +#endif +} + +/* Like the _u64 variant, needs an externally synchronized *dst. */ +static inline void +arena_stats_accum_zu(atomic_zu_t *dst, size_t src) { + size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); + atomic_store_zu(dst, src + cur_dst, ATOMIC_RELAXED); +} + +static inline void +arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, + szind_t szind, uint64_t nrequests) { + arena_stats_lock(tsdn, arena_stats); + arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind - + NBINS].nrequests, nrequests); + arena_stats_unlock(tsdn, arena_stats); +} + +static inline void +arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, size_t size) { + arena_stats_lock(tsdn, arena_stats); + arena_stats_add_zu(tsdn, arena_stats, &arena_stats->mapped, size); + arena_stats_unlock(tsdn, arena_stats); +} + + +#endif /* JEMALLOC_INTERNAL_ARENA_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h b/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h index d1fffec1936..38bc95962d8 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_structs_b.h @@ -1,7 +1,9 @@ #ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H #define JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H +#include "jemalloc/internal/arena_stats.h" #include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/bitmap.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/jemalloc_internal_types.h" @@ -10,45 +12,8 @@ #include "jemalloc/internal/ql.h" #include "jemalloc/internal/size_classes.h" #include "jemalloc/internal/smoothstep.h" -#include "jemalloc/internal/stats.h" #include "jemalloc/internal/ticker.h" -/* - * Read-only information associated with each element of arena_t's bins array - * is stored separately, partly to reduce memory usage (only one copy, rather - * than one per arena), but mainly to avoid false cacheline sharing. - * - * Each slab has the following layout: - * - * /--------------------\ - * | region 0 | - * |--------------------| - * | region 1 | - * |--------------------| - * | ... | - * | ... | - * | ... | - * |--------------------| - * | region nregs-1 | - * \--------------------/ - */ -struct arena_bin_info_s { - /* Size of regions in a slab for this bin's size class. */ - size_t reg_size; - - /* Total size of a slab for this bin's size class. */ - size_t slab_size; - - /* Total number of regions in a slab for this bin's size class. */ - uint32_t nregs; - - /* - * Metadata used to manipulate bitmaps for slabs associated with this - * bin. - */ - bitmap_info_t bitmap_info; -}; - struct arena_decay_s { /* Synchronizes all non-atomic fields. */ malloc_mutex_t mtx; @@ -104,37 +69,11 @@ struct arena_decay_s { * arena and ctl code. * * Synchronization: Same as associated arena's stats field. */ - decay_stats_t *stats; + arena_stats_decay_t *stats; /* Peak number of pages in associated extents. Used for debug only. */ uint64_t ceil_npages; }; -struct arena_bin_s { - /* All operations on arena_bin_t fields require lock ownership. */ - malloc_mutex_t lock; - - /* - * Current slab being used to service allocations of this bin's size - * class. slabcur is independent of slabs_{nonfull,full}; whenever - * slabcur is reassigned, the previous slab must be deallocated or - * inserted into slabs_{nonfull,full}. - */ - extent_t *slabcur; - - /* - * Heap of non-full slabs. This heap is used to assure that new - * allocations come from the non-full slab that is oldest/lowest in - * memory. - */ - extent_heap_t slabs_nonfull; - - /* List used to track full slabs. */ - extent_list_t slabs_full; - - /* Bin statistics. */ - malloc_bin_stats_t stats; -}; - struct arena_s { /* * Number of threads currently assigned to this arena. Each thread has @@ -162,14 +101,15 @@ struct arena_s { arena_stats_t stats; /* - * List of tcaches for extant threads associated with this arena. - * Stats from these are merged incrementally, and at exit if - * opt_stats_print is enabled. + * Lists of tcaches and cache_bin_array_descriptors for extant threads + * associated with this arena. Stats from these are merged + * incrementally, and at exit if opt_stats_print is enabled. * * Synchronization: tcache_ql_mtx. */ - ql_head(tcache_t) tcache_ql; - malloc_mutex_t tcache_ql_mtx; + ql_head(tcache_t) tcache_ql; + ql_head(cache_bin_array_descriptor_t) cache_bin_array_descriptor_ql; + malloc_mutex_t tcache_ql_mtx; /* Synchronization: internal. */ prof_accum_t prof_accum; @@ -239,9 +179,14 @@ struct arena_s { * be effective even if multiple arenas' extent allocation requests are * highly interleaved. * + * retain_grow_limit is the max allowed size ind to expand (unless the + * required size is greater). Default is no limit, and controlled + * through mallctl only. + * * Synchronization: extent_grow_mtx */ pszind_t extent_grow_next; + pszind_t retain_grow_limit; malloc_mutex_t extent_grow_mtx; /* @@ -258,7 +203,7 @@ struct arena_s { * * Synchronization: internal. */ - arena_bin_t bins[NBINS]; + bin_t bins[NBINS]; /* * Base allocator, from which arena metadata are allocated. diff --git a/dep/jemalloc/include/jemalloc/internal/arena_types.h b/dep/jemalloc/include/jemalloc/internal/arena_types.h index a691bd811e0..70001b5f16f 100644 --- a/dep/jemalloc/include/jemalloc/internal/arena_types.h +++ b/dep/jemalloc/include/jemalloc/internal/arena_types.h @@ -12,9 +12,7 @@ #define DECAY_NTICKS_PER_UPDATE 1000 typedef struct arena_slab_data_s arena_slab_data_t; -typedef struct arena_bin_info_s arena_bin_info_t; typedef struct arena_decay_s arena_decay_t; -typedef struct arena_bin_s arena_bin_t; typedef struct arena_s arena_t; typedef struct arena_tdata_s arena_tdata_t; typedef struct alloc_ctx_s alloc_ctx_t; diff --git a/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h b/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h index 8b4b8471a95..3209aa49ffa 100644 --- a/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/background_thread_externs.h @@ -2,9 +2,11 @@ #define JEMALLOC_INTERNAL_BACKGROUND_THREAD_EXTERNS_H extern bool opt_background_thread; +extern size_t opt_max_background_threads; extern malloc_mutex_t background_thread_lock; extern atomic_b_t background_thread_enabled_state; extern size_t n_background_threads; +extern size_t max_background_threads; extern background_thread_info_t *background_thread_info; extern bool can_enable_background_thread; diff --git a/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h b/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h index e69a7d022b4..c1107dfe9c4 100644 --- a/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/background_thread_structs.h @@ -8,6 +8,7 @@ #endif #define BACKGROUND_THREAD_INDEFINITE_SLEEP UINT64_MAX +#define MAX_BACKGROUND_THREAD_LIMIT MALLOCX_ARENA_LIMIT typedef enum { background_thread_stopped, diff --git a/dep/jemalloc/include/jemalloc/internal/base_externs.h b/dep/jemalloc/include/jemalloc/internal/base_externs.h index a4fd5ac7d9a..7b705c9b4d1 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/base_externs.h @@ -1,6 +1,9 @@ #ifndef JEMALLOC_INTERNAL_BASE_EXTERNS_H #define JEMALLOC_INTERNAL_BASE_EXTERNS_H +extern metadata_thp_mode_t opt_metadata_thp; +extern const char *metadata_thp_mode_names[]; + base_t *b0get(void); base_t *base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks); void base_delete(tsdn_t *tsdn, base_t *base); @@ -10,7 +13,7 @@ extent_hooks_t *base_extent_hooks_set(base_t *base, void *base_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment); extent_t *base_alloc_extent(tsdn_t *tsdn, base_t *base); void base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, - size_t *resident, size_t *mapped); + size_t *resident, size_t *mapped, size_t *n_thp); void base_prefork(tsdn_t *tsdn, base_t *base); void base_postfork_parent(tsdn_t *tsdn, base_t *base); void base_postfork_child(tsdn_t *tsdn, base_t *base); diff --git a/dep/jemalloc/include/jemalloc/internal/base_inlines.h b/dep/jemalloc/include/jemalloc/internal/base_inlines.h index 931560bfaea..aec0e2e1e1c 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/base_inlines.h @@ -6,4 +6,8 @@ base_ind_get(const base_t *base) { return base->ind; } +static inline bool +metadata_thp_enabled(void) { + return (opt_metadata_thp != metadata_thp_disabled); +} #endif /* JEMALLOC_INTERNAL_BASE_INLINES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/base_structs.h b/dep/jemalloc/include/jemalloc/internal/base_structs.h index 18e227bd5a6..2102247ac43 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/base_structs.h @@ -30,6 +30,8 @@ struct base_s { /* Protects base_alloc() and base_stats_get() operations. */ malloc_mutex_t mtx; + /* Using THP when true (metadata_thp auto mode). */ + bool auto_thp_switched; /* * Most recent size class in the series of increasingly large base * extents. Logarithmic spacing between subsequent allocations ensures @@ -50,6 +52,8 @@ struct base_s { size_t allocated; size_t resident; size_t mapped; + /* Number of THP regions touched. */ + size_t n_thp; }; #endif /* JEMALLOC_INTERNAL_BASE_STRUCTS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/base_types.h b/dep/jemalloc/include/jemalloc/internal/base_types.h index be7ee82589f..b6db77df7c6 100644 --- a/dep/jemalloc/include/jemalloc/internal/base_types.h +++ b/dep/jemalloc/include/jemalloc/internal/base_types.h @@ -4,4 +4,30 @@ typedef struct base_block_s base_block_t; typedef struct base_s base_t; +#define METADATA_THP_DEFAULT metadata_thp_disabled + +/* + * In auto mode, arenas switch to huge pages for the base allocator on the + * second base block. a0 switches to thp on the 5th block (after 20 megabytes + * of metadata), since more metadata (e.g. rtree nodes) come from a0's base. + */ + +#define BASE_AUTO_THP_THRESHOLD 2 +#define BASE_AUTO_THP_THRESHOLD_A0 5 + +typedef enum { + metadata_thp_disabled = 0, + /* + * Lazily enable hugepage for metadata. To avoid high RSS caused by THP + * + low usage arena (i.e. THP becomes a significant percentage), the + * "auto" option only starts using THP after a base allocator used up + * the first THP region. Starting from the second hugepage (in a single + * arena), "auto" behaves the same as "always", i.e. madvise hugepage + * right away. + */ + metadata_thp_auto = 1, + metadata_thp_always = 2, + metadata_thp_mode_limit = 3 +} metadata_thp_mode_t; + #endif /* JEMALLOC_INTERNAL_BASE_TYPES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/bin.h b/dep/jemalloc/include/jemalloc/internal/bin.h new file mode 100644 index 00000000000..9b416ada7ed --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/bin.h @@ -0,0 +1,106 @@ +#ifndef JEMALLOC_INTERNAL_BIN_H +#define JEMALLOC_INTERNAL_BIN_H + +#include "jemalloc/internal/extent_types.h" +#include "jemalloc/internal/extent_structs.h" +#include "jemalloc/internal/mutex.h" +#include "jemalloc/internal/bin_stats.h" + +/* + * A bin contains a set of extents that are currently being used for slab + * allocations. + */ + +/* + * Read-only information associated with each element of arena_t's bins array + * is stored separately, partly to reduce memory usage (only one copy, rather + * than one per arena), but mainly to avoid false cacheline sharing. + * + * Each slab has the following layout: + * + * /--------------------\ + * | region 0 | + * |--------------------| + * | region 1 | + * |--------------------| + * | ... | + * | ... | + * | ... | + * |--------------------| + * | region nregs-1 | + * \--------------------/ + */ +typedef struct bin_info_s bin_info_t; +struct bin_info_s { + /* Size of regions in a slab for this bin's size class. */ + size_t reg_size; + + /* Total size of a slab for this bin's size class. */ + size_t slab_size; + + /* Total number of regions in a slab for this bin's size class. */ + uint32_t nregs; + + /* + * Metadata used to manipulate bitmaps for slabs associated with this + * bin. + */ + bitmap_info_t bitmap_info; +}; + +extern const bin_info_t bin_infos[NBINS]; + + +typedef struct bin_s bin_t; +struct bin_s { + /* All operations on bin_t fields require lock ownership. */ + malloc_mutex_t lock; + + /* + * Current slab being used to service allocations of this bin's size + * class. slabcur is independent of slabs_{nonfull,full}; whenever + * slabcur is reassigned, the previous slab must be deallocated or + * inserted into slabs_{nonfull,full}. + */ + extent_t *slabcur; + + /* + * Heap of non-full slabs. This heap is used to assure that new + * allocations come from the non-full slab that is oldest/lowest in + * memory. + */ + extent_heap_t slabs_nonfull; + + /* List used to track full slabs. */ + extent_list_t slabs_full; + + /* Bin statistics. */ + bin_stats_t stats; +}; + +/* Initializes a bin to empty. Returns true on error. */ +bool bin_init(bin_t *bin); + +/* Forking. */ +void bin_prefork(tsdn_t *tsdn, bin_t *bin); +void bin_postfork_parent(tsdn_t *tsdn, bin_t *bin); +void bin_postfork_child(tsdn_t *tsdn, bin_t *bin); + +/* Stats. */ +static inline void +bin_stats_merge(tsdn_t *tsdn, bin_stats_t *dst_bin_stats, bin_t *bin) { + malloc_mutex_lock(tsdn, &bin->lock); + malloc_mutex_prof_read(tsdn, &dst_bin_stats->mutex_data, &bin->lock); + dst_bin_stats->nmalloc += bin->stats.nmalloc; + dst_bin_stats->ndalloc += bin->stats.ndalloc; + dst_bin_stats->nrequests += bin->stats.nrequests; + dst_bin_stats->curregs += bin->stats.curregs; + dst_bin_stats->nfills += bin->stats.nfills; + dst_bin_stats->nflushes += bin->stats.nflushes; + dst_bin_stats->nslabs += bin->stats.nslabs; + dst_bin_stats->reslabs += bin->stats.reslabs; + dst_bin_stats->curslabs += bin->stats.curslabs; + malloc_mutex_unlock(tsdn, &bin->lock); +} + +#endif /* JEMALLOC_INTERNAL_BIN_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/bin_stats.h b/dep/jemalloc/include/jemalloc/internal/bin_stats.h new file mode 100644 index 00000000000..86e673ec446 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/bin_stats.h @@ -0,0 +1,51 @@ +#ifndef JEMALLOC_INTERNAL_BIN_STATS_H +#define JEMALLOC_INTERNAL_BIN_STATS_H + +#include "jemalloc/internal/mutex_prof.h" + +typedef struct bin_stats_s bin_stats_t; +struct bin_stats_s { + /* + * Total number of allocation/deallocation requests served directly by + * the bin. Note that tcache may allocate an object, then recycle it + * many times, resulting many increments to nrequests, but only one + * each to nmalloc and ndalloc. + */ + uint64_t nmalloc; + uint64_t ndalloc; + + /* + * Number of allocation requests that correspond to the size of this + * bin. This includes requests served by tcache, though tcache only + * periodically merges into this counter. + */ + uint64_t nrequests; + + /* + * Current number of regions of this size class, including regions + * currently cached by tcache. + */ + size_t curregs; + + /* Number of tcache fills from this bin. */ + uint64_t nfills; + + /* Number of tcache flushes to this bin. */ + uint64_t nflushes; + + /* Total number of slabs created for this bin's size class. */ + uint64_t nslabs; + + /* + * Total number of slabs reused by extracting them from the slabs heap + * for this bin's size class. + */ + uint64_t reslabs; + + /* Current number of slabs in this bin. */ + size_t curslabs; + + mutex_prof_data_t mutex_data; +}; + +#endif /* JEMALLOC_INTERNAL_BIN_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/cache_bin.h b/dep/jemalloc/include/jemalloc/internal/cache_bin.h new file mode 100644 index 00000000000..12f3ef2dd0a --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/cache_bin.h @@ -0,0 +1,114 @@ +#ifndef JEMALLOC_INTERNAL_CACHE_BIN_H +#define JEMALLOC_INTERNAL_CACHE_BIN_H + +#include "jemalloc/internal/ql.h" + +/* + * The cache_bins are the mechanism that the tcache and the arena use to + * communicate. The tcache fills from and flushes to the arena by passing a + * cache_bin_t to fill/flush. When the arena needs to pull stats from the + * tcaches associated with it, it does so by iterating over its + * cache_bin_array_descriptor_t objects and reading out per-bin stats it + * contains. This makes it so that the arena need not know about the existence + * of the tcache at all. + */ + + +/* + * The count of the number of cached allocations in a bin. We make this signed + * so that negative numbers can encode "invalid" states (e.g. a low water mark + * of -1 for a cache that has been depleted). + */ +typedef int32_t cache_bin_sz_t; + +typedef struct cache_bin_stats_s cache_bin_stats_t; +struct cache_bin_stats_s { + /* + * Number of allocation requests that corresponded to the size of this + * bin. + */ + uint64_t nrequests; +}; + +/* + * Read-only information associated with each element of tcache_t's tbins array + * is stored separately, mainly to reduce memory usage. + */ +typedef struct cache_bin_info_s cache_bin_info_t; +struct cache_bin_info_s { + /* Upper limit on ncached. */ + cache_bin_sz_t ncached_max; +}; + +typedef struct cache_bin_s cache_bin_t; +struct cache_bin_s { + /* Min # cached since last GC. */ + cache_bin_sz_t low_water; + /* # of cached objects. */ + cache_bin_sz_t ncached; + /* + * ncached and stats are both modified frequently. Let's keep them + * close so that they have a higher chance of being on the same + * cacheline, thus less write-backs. + */ + cache_bin_stats_t tstats; + /* + * Stack of available objects. + * + * To make use of adjacent cacheline prefetch, the items in the avail + * stack goes to higher address for newer allocations. avail points + * just above the available space, which means that + * avail[-ncached, ... -1] are available items and the lowest item will + * be allocated first. + */ + void **avail; +}; + +typedef struct cache_bin_array_descriptor_s cache_bin_array_descriptor_t; +struct cache_bin_array_descriptor_s { + /* + * The arena keeps a list of the cache bins associated with it, for + * stats collection. + */ + ql_elm(cache_bin_array_descriptor_t) link; + /* Pointers to the tcache bins. */ + cache_bin_t *bins_small; + cache_bin_t *bins_large; +}; + +static inline void +cache_bin_array_descriptor_init(cache_bin_array_descriptor_t *descriptor, + cache_bin_t *bins_small, cache_bin_t *bins_large) { + ql_elm_new(descriptor, link); + descriptor->bins_small = bins_small; + descriptor->bins_large = bins_large; +} + +JEMALLOC_ALWAYS_INLINE void * +cache_bin_alloc_easy(cache_bin_t *bin, bool *success) { + void *ret; + + if (unlikely(bin->ncached == 0)) { + bin->low_water = -1; + *success = false; + return NULL; + } + /* + * success (instead of ret) should be checked upon the return of this + * function. We avoid checking (ret == NULL) because there is never a + * null stored on the avail stack (which is unknown to the compiler), + * and eagerly checking ret would cause pipeline stall (waiting for the + * cacheline). + */ + *success = true; + ret = *(bin->avail - bin->ncached); + bin->ncached--; + + if (unlikely(bin->ncached < bin->low_water)) { + bin->low_water = bin->ncached; + } + + return ret; +} + +#endif /* JEMALLOC_INTERNAL_CACHE_BIN_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/ctl.h b/dep/jemalloc/include/jemalloc/internal/ctl.h index a91c4cf556b..d927d94801e 100644 --- a/dep/jemalloc/include/jemalloc/internal/ctl.h +++ b/dep/jemalloc/include/jemalloc/internal/ctl.h @@ -40,14 +40,15 @@ typedef struct ctl_arena_stats_s { uint64_t ndalloc_small; uint64_t nrequests_small; - malloc_bin_stats_t bstats[NBINS]; - malloc_large_stats_t lstats[NSIZES - NBINS]; + bin_stats_t bstats[NBINS]; + arena_stats_large_t lstats[NSIZES - NBINS]; } ctl_arena_stats_t; typedef struct ctl_stats_s { size_t allocated; size_t active; size_t metadata; + size_t metadata_thp; size_t resident; size_t mapped; size_t retained; diff --git a/dep/jemalloc/include/jemalloc/internal/div.h b/dep/jemalloc/include/jemalloc/internal/div.h new file mode 100644 index 00000000000..aebae9398cf --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/div.h @@ -0,0 +1,41 @@ +#ifndef JEMALLOC_INTERNAL_DIV_H +#define JEMALLOC_INTERNAL_DIV_H + +#include "jemalloc/internal/assert.h" + +/* + * This module does the division that computes the index of a region in a slab, + * given its offset relative to the base. + * That is, given a divisor d, an n = i * d (all integers), we'll return i. + * We do some pre-computation to do this more quickly than a CPU division + * instruction. + * We bound n < 2^32, and don't support dividing by one. + */ + +typedef struct div_info_s div_info_t; +struct div_info_s { + uint32_t magic; +#ifdef JEMALLOC_DEBUG + size_t d; +#endif +}; + +void div_init(div_info_t *div_info, size_t divisor); + +static inline size_t +div_compute(div_info_t *div_info, size_t n) { + assert(n <= (uint32_t)-1); + /* + * This generates, e.g. mov; imul; shr on x86-64. On a 32-bit machine, + * the compilers I tried were all smart enough to turn this into the + * appropriate "get the high 32 bits of the result of a multiply" (e.g. + * mul; mov edx eax; on x86, umull on arm, etc.). + */ + size_t i = ((uint64_t)n * (uint64_t)div_info->magic) >> 32; +#ifdef JEMALLOC_DEBUG + assert(i * div_info->d == n); +#endif + return i; +} + +#endif /* JEMALLOC_INTERNAL_DIV_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/emitter.h b/dep/jemalloc/include/jemalloc/internal/emitter.h new file mode 100644 index 00000000000..3a2b2f7f2e4 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/emitter.h @@ -0,0 +1,435 @@ +#ifndef JEMALLOC_INTERNAL_EMITTER_H +#define JEMALLOC_INTERNAL_EMITTER_H + +#include "jemalloc/internal/ql.h" + +typedef enum emitter_output_e emitter_output_t; +enum emitter_output_e { + emitter_output_json, + emitter_output_table +}; + +typedef enum emitter_justify_e emitter_justify_t; +enum emitter_justify_e { + emitter_justify_left, + emitter_justify_right, + /* Not for users; just to pass to internal functions. */ + emitter_justify_none +}; + +typedef enum emitter_type_e emitter_type_t; +enum emitter_type_e { + emitter_type_bool, + emitter_type_int, + emitter_type_unsigned, + emitter_type_uint32, + emitter_type_uint64, + emitter_type_size, + emitter_type_ssize, + emitter_type_string, + /* + * A title is a column title in a table; it's just a string, but it's + * not quoted. + */ + emitter_type_title, +}; + +typedef struct emitter_col_s emitter_col_t; +struct emitter_col_s { + /* Filled in by the user. */ + emitter_justify_t justify; + int width; + emitter_type_t type; + union { + bool bool_val; + int int_val; + unsigned unsigned_val; + uint32_t uint32_val; + uint64_t uint64_val; + size_t size_val; + ssize_t ssize_val; + const char *str_val; + }; + + /* Filled in by initialization. */ + ql_elm(emitter_col_t) link; +}; + +typedef struct emitter_row_s emitter_row_t; +struct emitter_row_s { + ql_head(emitter_col_t) cols; +}; + +static inline void +emitter_row_init(emitter_row_t *row) { + ql_new(&row->cols); +} + +static inline void +emitter_col_init(emitter_col_t *col, emitter_row_t *row) { + ql_elm_new(col, link); + ql_tail_insert(&row->cols, col, link); +} + +typedef struct emitter_s emitter_t; +struct emitter_s { + emitter_output_t output; + /* The output information. */ + void (*write_cb)(void *, const char *); + void *cbopaque; + int nesting_depth; + /* True if we've already emitted a value at the given depth. */ + bool item_at_depth; +}; + +static inline void +emitter_init(emitter_t *emitter, emitter_output_t emitter_output, + void (*write_cb)(void *, const char *), void *cbopaque) { + emitter->output = emitter_output; + emitter->write_cb = write_cb; + emitter->cbopaque = cbopaque; + emitter->item_at_depth = false; + emitter->nesting_depth = 0; +} + +/* Internal convenience function. Write to the emitter the given string. */ +JEMALLOC_FORMAT_PRINTF(2, 3) +static inline void +emitter_printf(emitter_t *emitter, const char *format, ...) { + va_list ap; + + va_start(ap, format); + malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap); + va_end(ap); +} + +/* Write to the emitter the given string, but only in table mode. */ +JEMALLOC_FORMAT_PRINTF(2, 3) +static inline void +emitter_table_printf(emitter_t *emitter, const char *format, ...) { + if (emitter->output == emitter_output_table) { + va_list ap; + va_start(ap, format); + malloc_vcprintf(emitter->write_cb, emitter->cbopaque, format, ap); + va_end(ap); + } +} + +static inline void +emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier, + emitter_justify_t justify, int width) { + size_t written; + if (justify == emitter_justify_none) { + written = malloc_snprintf(out_fmt, out_size, + "%%%s", fmt_specifier); + } else if (justify == emitter_justify_left) { + written = malloc_snprintf(out_fmt, out_size, + "%%-%d%s", width, fmt_specifier); + } else { + written = malloc_snprintf(out_fmt, out_size, + "%%%d%s", width, fmt_specifier); + } + /* Only happens in case of bad format string, which *we* choose. */ + assert(written < out_size); +} + +/* + * Internal. Emit the given value type in the relevant encoding (so that the + * bool true gets mapped to json "true", but the string "true" gets mapped to + * json "\"true\"", for instance. + * + * Width is ignored if justify is emitter_justify_none. + */ +static inline void +emitter_print_value(emitter_t *emitter, emitter_justify_t justify, int width, + emitter_type_t value_type, const void *value) { + size_t str_written; +#define BUF_SIZE 256 +#define FMT_SIZE 10 + /* + * We dynamically generate a format string to emit, to let us use the + * snprintf machinery. This is kinda hacky, but gets the job done + * quickly without having to think about the various snprintf edge + * cases. + */ + char fmt[FMT_SIZE]; + char buf[BUF_SIZE]; + +#define EMIT_SIMPLE(type, format) \ + emitter_gen_fmt(fmt, FMT_SIZE, format, justify, width); \ + emitter_printf(emitter, fmt, *(const type *)value); \ + + switch (value_type) { + case emitter_type_bool: + emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width); + emitter_printf(emitter, fmt, *(const bool *)value ? + "true" : "false"); + break; + case emitter_type_int: + EMIT_SIMPLE(int, "d") + break; + case emitter_type_unsigned: + EMIT_SIMPLE(unsigned, "u") + break; + case emitter_type_ssize: + EMIT_SIMPLE(ssize_t, "zd") + break; + case emitter_type_size: + EMIT_SIMPLE(size_t, "zu") + break; + case emitter_type_string: + str_written = malloc_snprintf(buf, BUF_SIZE, "\"%s\"", + *(const char *const *)value); + /* + * We control the strings we output; we shouldn't get anything + * anywhere near the fmt size. + */ + assert(str_written < BUF_SIZE); + emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width); + emitter_printf(emitter, fmt, buf); + break; + case emitter_type_uint32: + EMIT_SIMPLE(uint32_t, FMTu32) + break; + case emitter_type_uint64: + EMIT_SIMPLE(uint64_t, FMTu64) + break; + case emitter_type_title: + EMIT_SIMPLE(char *const, "s"); + break; + default: + unreachable(); + } +#undef BUF_SIZE +#undef FMT_SIZE +} + + +/* Internal functions. In json mode, tracks nesting state. */ +static inline void +emitter_nest_inc(emitter_t *emitter) { + emitter->nesting_depth++; + emitter->item_at_depth = false; +} + +static inline void +emitter_nest_dec(emitter_t *emitter) { + emitter->nesting_depth--; + emitter->item_at_depth = true; +} + +static inline void +emitter_indent(emitter_t *emitter) { + int amount = emitter->nesting_depth; + const char *indent_str; + if (emitter->output == emitter_output_json) { + indent_str = "\t"; + } else { + amount *= 2; + indent_str = " "; + } + for (int i = 0; i < amount; i++) { + emitter_printf(emitter, "%s", indent_str); + } +} + +static inline void +emitter_json_key_prefix(emitter_t *emitter) { + emitter_printf(emitter, "%s\n", emitter->item_at_depth ? "," : ""); + emitter_indent(emitter); +} + +static inline void +emitter_begin(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth == 0); + emitter_printf(emitter, "{"); + emitter_nest_inc(emitter); + } else { + // tabular init + emitter_printf(emitter, "%s", ""); + } +} + +static inline void +emitter_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth == 1); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n}\n"); + } +} + +/* + * Note emits a different kv pair as well, but only in table mode. Omits the + * note if table_note_key is NULL. + */ +static inline void +emitter_kv_note(emitter_t *emitter, const char *json_key, const char *table_key, + emitter_type_t value_type, const void *value, + const char *table_note_key, emitter_type_t table_note_value_type, + const void *table_note_value) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": ", json_key); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + } else { + emitter_indent(emitter); + emitter_printf(emitter, "%s: ", table_key); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + if (table_note_key != NULL) { + emitter_printf(emitter, " (%s: ", table_note_key); + emitter_print_value(emitter, emitter_justify_none, -1, + table_note_value_type, table_note_value); + emitter_printf(emitter, ")"); + } + emitter_printf(emitter, "\n"); + } + emitter->item_at_depth = true; +} + +static inline void +emitter_kv(emitter_t *emitter, const char *json_key, const char *table_key, + emitter_type_t value_type, const void *value) { + emitter_kv_note(emitter, json_key, table_key, value_type, value, NULL, + emitter_type_bool, NULL); +} + +static inline void +emitter_json_kv(emitter_t *emitter, const char *json_key, + emitter_type_t value_type, const void *value) { + if (emitter->output == emitter_output_json) { + emitter_kv(emitter, json_key, NULL, value_type, value); + } +} + +static inline void +emitter_table_kv(emitter_t *emitter, const char *table_key, + emitter_type_t value_type, const void *value) { + if (emitter->output == emitter_output_table) { + emitter_kv(emitter, NULL, table_key, value_type, value); + } +} + +static inline void +emitter_dict_begin(emitter_t *emitter, const char *json_key, + const char *table_header) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": {", json_key); + emitter_nest_inc(emitter); + } else { + emitter_indent(emitter); + emitter_printf(emitter, "%s\n", table_header); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "}"); + } else { + emitter_nest_dec(emitter); + } +} + +static inline void +emitter_json_dict_begin(emitter_t *emitter, const char *json_key) { + if (emitter->output == emitter_output_json) { + emitter_dict_begin(emitter, json_key, NULL); + } +} + +static inline void +emitter_json_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + emitter_dict_end(emitter); + } +} + +static inline void +emitter_table_dict_begin(emitter_t *emitter, const char *table_key) { + if (emitter->output == emitter_output_table) { + emitter_dict_begin(emitter, NULL, table_key); + } +} + +static inline void +emitter_table_dict_end(emitter_t *emitter) { + if (emitter->output == emitter_output_table) { + emitter_dict_end(emitter); + } +} + +static inline void +emitter_json_arr_begin(emitter_t *emitter, const char *json_key) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "\"%s\": [", json_key); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_json_arr_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "]"); + } +} + +static inline void +emitter_json_arr_obj_begin(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_printf(emitter, "{"); + emitter_nest_inc(emitter); + } +} + +static inline void +emitter_json_arr_obj_end(emitter_t *emitter) { + if (emitter->output == emitter_output_json) { + assert(emitter->nesting_depth > 0); + emitter_nest_dec(emitter); + emitter_printf(emitter, "\n"); + emitter_indent(emitter); + emitter_printf(emitter, "}"); + } +} + +static inline void +emitter_json_arr_value(emitter_t *emitter, emitter_type_t value_type, + const void *value) { + if (emitter->output == emitter_output_json) { + emitter_json_key_prefix(emitter); + emitter_print_value(emitter, emitter_justify_none, -1, + value_type, value); + } +} + +static inline void +emitter_table_row(emitter_t *emitter, emitter_row_t *row) { + if (emitter->output != emitter_output_table) { + return; + } + emitter_col_t *col; + ql_foreach(col, &row->cols, link) { + emitter_print_value(emitter, col->justify, col->width, + col->type, (const void *)&col->bool_val); + } + emitter_table_printf(emitter, "\n"); +} + +#endif /* JEMALLOC_INTERNAL_EMITTER_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/extent_externs.h b/dep/jemalloc/include/jemalloc/internal/extent_externs.h index 489a813c80d..b8a4d026ceb 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_externs.h @@ -4,12 +4,13 @@ #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/mutex_pool.h" #include "jemalloc/internal/ph.h" -#include "jemalloc/internal/rb.h" #include "jemalloc/internal/rtree.h" -extern rtree_t extents_rtree; -extern const extent_hooks_t extent_hooks_default; -extern mutex_pool_t extent_mutex_pool; +extern size_t opt_lg_extent_max_active_fit; + +extern rtree_t extents_rtree; +extern const extent_hooks_t extent_hooks_default; +extern mutex_pool_t extent_mutex_pool; extent_t *extent_alloc(tsdn_t *tsdn, arena_t *arena); void extent_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *extent); diff --git a/dep/jemalloc/include/jemalloc/internal/extent_inlines.h b/dep/jemalloc/include/jemalloc/internal/extent_inlines.h index bb2bd699ed2..77181df8d24 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_inlines.h @@ -93,6 +93,12 @@ extent_committed_get(const extent_t *extent) { EXTENT_BITS_COMMITTED_SHIFT); } +static inline bool +extent_dumpable_get(const extent_t *extent) { + return (bool)((extent->e_bits & EXTENT_BITS_DUMPABLE_MASK) >> + EXTENT_BITS_DUMPABLE_SHIFT); +} + static inline bool extent_slab_get(const extent_t *extent) { return (bool)((extent->e_bits & EXTENT_BITS_SLAB_MASK) >> @@ -184,15 +190,22 @@ extent_addr_set(extent_t *extent, void *addr) { } static inline void -extent_addr_randomize(tsdn_t *tsdn, extent_t *extent, size_t alignment) { +extent_addr_randomize(UNUSED tsdn_t *tsdn, extent_t *extent, size_t alignment) { assert(extent_base_get(extent) == extent_addr_get(extent)); if (alignment < PAGE) { unsigned lg_range = LG_PAGE - lg_floor(CACHELINE_CEILING(alignment)); - size_t r = - prng_lg_range_zu(&extent_arena_get(extent)->offset_state, - lg_range, true); + size_t r; + if (!tsdn_null(tsdn)) { + tsd_t *tsd = tsdn_tsd(tsdn); + r = (size_t)prng_lg_range_u64( + tsd_offset_statep_get(tsd), lg_range); + } else { + r = prng_lg_range_zu( + &extent_arena_get(extent)->offset_state, + lg_range, true); + } uintptr_t random_offset = ((uintptr_t)r) << (LG_PAGE - lg_range); extent->e_addr = (void *)((uintptr_t)extent->e_addr + @@ -269,6 +282,12 @@ extent_committed_set(extent_t *extent, bool committed) { ((uint64_t)committed << EXTENT_BITS_COMMITTED_SHIFT); } +static inline void +extent_dumpable_set(extent_t *extent, bool dumpable) { + extent->e_bits = (extent->e_bits & ~EXTENT_BITS_DUMPABLE_MASK) | + ((uint64_t)dumpable << EXTENT_BITS_DUMPABLE_SHIFT); +} + static inline void extent_slab_set(extent_t *extent, bool slab) { extent->e_bits = (extent->e_bits & ~EXTENT_BITS_SLAB_MASK) | @@ -283,7 +302,7 @@ extent_prof_tctx_set(extent_t *extent, prof_tctx_t *tctx) { static inline void extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, bool slab, szind_t szind, size_t sn, extent_state_t state, bool zeroed, - bool committed) { + bool committed, bool dumpable) { assert(addr == PAGE_ADDR2BASE(addr) || !slab); extent_arena_set(extent, arena); @@ -295,6 +314,7 @@ extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, extent_state_set(extent, state); extent_zeroed_set(extent, zeroed); extent_committed_set(extent, committed); + extent_dumpable_set(extent, dumpable); ql_elm_new(extent, ql_link); if (config_prof) { extent_prof_tctx_set(extent, NULL); @@ -312,6 +332,7 @@ extent_binit(extent_t *extent, void *addr, size_t bsize, size_t sn) { extent_state_set(extent, extent_state_active); extent_zeroed_set(extent, true); extent_committed_set(extent, true); + extent_dumpable_set(extent, true); } static inline void @@ -334,6 +355,11 @@ extent_list_append(extent_list_t *list, extent_t *extent) { ql_tail_insert(list, extent, ql_link); } +static inline void +extent_list_prepend(extent_list_t *list, extent_t *extent) { + ql_head_insert(list, extent, ql_link); +} + static inline void extent_list_replace(extent_list_t *list, extent_t *to_remove, extent_t *to_insert) { diff --git a/dep/jemalloc/include/jemalloc/internal/extent_structs.h b/dep/jemalloc/include/jemalloc/internal/extent_structs.h index d2979503458..4873b9e9e49 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_structs.h @@ -5,7 +5,6 @@ #include "jemalloc/internal/bitmap.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/ql.h" -#include "jemalloc/internal/rb.h" #include "jemalloc/internal/ph.h" #include "jemalloc/internal/size_classes.h" @@ -24,13 +23,14 @@ struct extent_s { * a: arena_ind * b: slab * c: committed + * d: dumpable * z: zeroed * t: state * i: szind * f: nfree * n: sn * - * nnnnnnnn ... nnnnnfff fffffffi iiiiiiit tzcbaaaa aaaaaaaa + * nnnnnnnn ... nnnnffff ffffffii iiiiiitt zdcbaaaa aaaaaaaa * * arena_ind: Arena from which this extent came, or all 1 bits if * unassociated. @@ -45,6 +45,23 @@ struct extent_s { * as on a system that overcommits and satisfies physical * memory needs on demand via soft page faults. * + * dumpable: The dumpable flag indicates whether or not we've set the + * memory in question to be dumpable. Note that this + * interacts somewhat subtly with user-specified extent hooks, + * since we don't know if *they* are fiddling with + * dumpability (in which case, we don't want to undo whatever + * they're doing). To deal with this scenario, we: + * - Make dumpable false only for memory allocated with the + * default hooks. + * - Only allow memory to go from non-dumpable to dumpable, + * and only once. + * - Never make the OS call to allow dumping when the + * dumpable bit is already set. + * These three constraints mean that we will never + * accidentally dump user memory that the user meant to set + * nondumpable with their extent hooks. + * + * * zeroed: The zeroed flag is used by extent recycling code to track * whether memory is zero-filled. * @@ -69,38 +86,42 @@ struct extent_s { * serial number to both resulting adjacent extents. */ uint64_t e_bits; -#define EXTENT_BITS_ARENA_SHIFT 0 -#define EXTENT_BITS_ARENA_MASK \ - (((uint64_t)(1U << MALLOCX_ARENA_BITS) - 1) << EXTENT_BITS_ARENA_SHIFT) +#define MASK(CURRENT_FIELD_WIDTH, CURRENT_FIELD_SHIFT) ((((((uint64_t)0x1U) << (CURRENT_FIELD_WIDTH)) - 1)) << (CURRENT_FIELD_SHIFT)) -#define EXTENT_BITS_SLAB_SHIFT MALLOCX_ARENA_BITS -#define EXTENT_BITS_SLAB_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_SLAB_SHIFT) +#define EXTENT_BITS_ARENA_WIDTH MALLOCX_ARENA_BITS +#define EXTENT_BITS_ARENA_SHIFT 0 +#define EXTENT_BITS_ARENA_MASK MASK(EXTENT_BITS_ARENA_WIDTH, EXTENT_BITS_ARENA_SHIFT) -#define EXTENT_BITS_COMMITTED_SHIFT (MALLOCX_ARENA_BITS + 1) -#define EXTENT_BITS_COMMITTED_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_COMMITTED_SHIFT) +#define EXTENT_BITS_SLAB_WIDTH 1 +#define EXTENT_BITS_SLAB_SHIFT (EXTENT_BITS_ARENA_WIDTH + EXTENT_BITS_ARENA_SHIFT) +#define EXTENT_BITS_SLAB_MASK MASK(EXTENT_BITS_SLAB_WIDTH, EXTENT_BITS_SLAB_SHIFT) -#define EXTENT_BITS_ZEROED_SHIFT (MALLOCX_ARENA_BITS + 2) -#define EXTENT_BITS_ZEROED_MASK \ - ((uint64_t)0x1U << EXTENT_BITS_ZEROED_SHIFT) +#define EXTENT_BITS_COMMITTED_WIDTH 1 +#define EXTENT_BITS_COMMITTED_SHIFT (EXTENT_BITS_SLAB_WIDTH + EXTENT_BITS_SLAB_SHIFT) +#define EXTENT_BITS_COMMITTED_MASK MASK(EXTENT_BITS_COMMITTED_WIDTH, EXTENT_BITS_COMMITTED_SHIFT) -#define EXTENT_BITS_STATE_SHIFT (MALLOCX_ARENA_BITS + 3) -#define EXTENT_BITS_STATE_MASK \ - ((uint64_t)0x3U << EXTENT_BITS_STATE_SHIFT) +#define EXTENT_BITS_DUMPABLE_WIDTH 1 +#define EXTENT_BITS_DUMPABLE_SHIFT (EXTENT_BITS_COMMITTED_WIDTH + EXTENT_BITS_COMMITTED_SHIFT) +#define EXTENT_BITS_DUMPABLE_MASK MASK(EXTENT_BITS_DUMPABLE_WIDTH, EXTENT_BITS_DUMPABLE_SHIFT) -#define EXTENT_BITS_SZIND_SHIFT (MALLOCX_ARENA_BITS + 5) -#define EXTENT_BITS_SZIND_MASK \ - (((uint64_t)(1U << LG_CEIL_NSIZES) - 1) << EXTENT_BITS_SZIND_SHIFT) +#define EXTENT_BITS_ZEROED_WIDTH 1 +#define EXTENT_BITS_ZEROED_SHIFT (EXTENT_BITS_DUMPABLE_WIDTH + EXTENT_BITS_DUMPABLE_SHIFT) +#define EXTENT_BITS_ZEROED_MASK MASK(EXTENT_BITS_ZEROED_WIDTH, EXTENT_BITS_ZEROED_SHIFT) -#define EXTENT_BITS_NFREE_SHIFT \ - (MALLOCX_ARENA_BITS + 5 + LG_CEIL_NSIZES) -#define EXTENT_BITS_NFREE_MASK \ - ((uint64_t)((1U << (LG_SLAB_MAXREGS + 1)) - 1) << EXTENT_BITS_NFREE_SHIFT) +#define EXTENT_BITS_STATE_WIDTH 2 +#define EXTENT_BITS_STATE_SHIFT (EXTENT_BITS_ZEROED_WIDTH + EXTENT_BITS_ZEROED_SHIFT) +#define EXTENT_BITS_STATE_MASK MASK(EXTENT_BITS_STATE_WIDTH, EXTENT_BITS_STATE_SHIFT) -#define EXTENT_BITS_SN_SHIFT \ - (MALLOCX_ARENA_BITS + 5 + LG_CEIL_NSIZES + (LG_SLAB_MAXREGS + 1)) -#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT) +#define EXTENT_BITS_SZIND_WIDTH LG_CEIL_NSIZES +#define EXTENT_BITS_SZIND_SHIFT (EXTENT_BITS_STATE_WIDTH + EXTENT_BITS_STATE_SHIFT) +#define EXTENT_BITS_SZIND_MASK MASK(EXTENT_BITS_SZIND_WIDTH, EXTENT_BITS_SZIND_SHIFT) + +#define EXTENT_BITS_NFREE_WIDTH (LG_SLAB_MAXREGS + 1) +#define EXTENT_BITS_NFREE_SHIFT (EXTENT_BITS_SZIND_WIDTH + EXTENT_BITS_SZIND_SHIFT) +#define EXTENT_BITS_NFREE_MASK MASK(EXTENT_BITS_NFREE_WIDTH, EXTENT_BITS_NFREE_SHIFT) + +#define EXTENT_BITS_SN_SHIFT (EXTENT_BITS_NFREE_WIDTH + EXTENT_BITS_NFREE_SHIFT) +#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT) /* Pointer to the extent that this structure is responsible for. */ void *e_addr; @@ -120,20 +141,19 @@ struct extent_s { size_t e_bsize; }; - union { - /* - * List linkage, used by a variety of lists: - * - arena_bin_t's slabs_full - * - extents_t's LRU - * - stashed dirty extents - * - arena's large allocations - */ - ql_elm(extent_t) ql_link; - /* Red-black tree linkage, used by arena's extent_avail. */ - rb_node(extent_t) rb_link; - }; + /* + * List linkage, used by a variety of lists: + * - bin_t's slabs_full + * - extents_t's LRU + * - stashed dirty extents + * - arena's large allocations + */ + ql_elm(extent_t) ql_link; - /* Linkage for per size class sn/address-ordered heaps. */ + /* + * Linkage for per size class sn/address-ordered heaps, and + * for extent_avail + */ phn(extent_t) ph_link; union { @@ -148,7 +168,7 @@ struct extent_s { }; }; typedef ql_head(extent_t) extent_list_t; -typedef rb_tree(extent_t) extent_tree_t; +typedef ph(extent_t) extent_tree_t; typedef ph(extent_t) extent_heap_t; /* Quantized collection of extents, with built-in LRU queue. */ diff --git a/dep/jemalloc/include/jemalloc/internal/extent_types.h b/dep/jemalloc/include/jemalloc/internal/extent_types.h index b6905ce1055..c0561d99f8f 100644 --- a/dep/jemalloc/include/jemalloc/internal/extent_types.h +++ b/dep/jemalloc/include/jemalloc/internal/extent_types.h @@ -6,4 +6,12 @@ typedef struct extents_s extents_t; #define EXTENT_HOOKS_INITIALIZER NULL +#define EXTENT_GROW_MAX_PIND (NPSIZES - 1) + +/* + * When reuse (and split) an active extent, (1U << opt_lg_extent_max_active_fit) + * is the max ratio between the size of the active extent and the new extent. + */ +#define LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT 6 + #endif /* JEMALLOC_INTERNAL_EXTENT_TYPES_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/hash.h b/dep/jemalloc/include/jemalloc/internal/hash.h index 188296cf0e2..dcfc992df37 100644 --- a/dep/jemalloc/include/jemalloc/internal/hash.h +++ b/dep/jemalloc/include/jemalloc/internal/hash.h @@ -260,22 +260,22 @@ hash_x64_128(const void *key, const int len, const uint32_t seed, uint64_t k2 = 0; switch (len & 15) { - case 15: k2 ^= ((uint64_t)(tail[14])) << 48; - case 14: k2 ^= ((uint64_t)(tail[13])) << 40; - case 13: k2 ^= ((uint64_t)(tail[12])) << 32; - case 12: k2 ^= ((uint64_t)(tail[11])) << 24; - case 11: k2 ^= ((uint64_t)(tail[10])) << 16; - case 10: k2 ^= ((uint64_t)(tail[ 9])) << 8; + case 15: k2 ^= ((uint64_t)(tail[14])) << 48; /* falls through */ + case 14: k2 ^= ((uint64_t)(tail[13])) << 40; /* falls through */ + case 13: k2 ^= ((uint64_t)(tail[12])) << 32; /* falls through */ + case 12: k2 ^= ((uint64_t)(tail[11])) << 24; /* falls through */ + case 11: k2 ^= ((uint64_t)(tail[10])) << 16; /* falls through */ + case 10: k2 ^= ((uint64_t)(tail[ 9])) << 8; /* falls through */ case 9: k2 ^= ((uint64_t)(tail[ 8])) << 0; k2 *= c2; k2 = hash_rotl_64(k2, 33); k2 *= c1; h2 ^= k2; - - case 8: k1 ^= ((uint64_t)(tail[ 7])) << 56; - case 7: k1 ^= ((uint64_t)(tail[ 6])) << 48; - case 6: k1 ^= ((uint64_t)(tail[ 5])) << 40; - case 5: k1 ^= ((uint64_t)(tail[ 4])) << 32; - case 4: k1 ^= ((uint64_t)(tail[ 3])) << 24; - case 3: k1 ^= ((uint64_t)(tail[ 2])) << 16; - case 2: k1 ^= ((uint64_t)(tail[ 1])) << 8; + /* falls through */ + case 8: k1 ^= ((uint64_t)(tail[ 7])) << 56; /* falls through */ + case 7: k1 ^= ((uint64_t)(tail[ 6])) << 48; /* falls through */ + case 6: k1 ^= ((uint64_t)(tail[ 5])) << 40; /* falls through */ + case 5: k1 ^= ((uint64_t)(tail[ 4])) << 32; /* falls through */ + case 4: k1 ^= ((uint64_t)(tail[ 3])) << 24; /* falls through */ + case 3: k1 ^= ((uint64_t)(tail[ 2])) << 16; /* falls through */ + case 2: k1 ^= ((uint64_t)(tail[ 1])) << 8; /* falls through */ case 1: k1 ^= ((uint64_t)(tail[ 0])) << 0; k1 *= c1; k1 = hash_rotl_64(k1, 31); k1 *= c2; h1 ^= k1; } diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h index 8ae5ef48cd8..be70df510e3 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h @@ -5,7 +5,16 @@ #ifdef _WIN32 # include # include "msvc_compat/windows_extra.h" - +# ifdef _WIN64 +# if LG_VADDR <= 32 +# error Generate the headers using x64 vcargs +# endif +# else +# if LG_VADDR > 32 +# undef LG_VADDR +# define LG_VADDR 32 +# endif +# endif #else # include # include diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h index 24ea416297f..c6a1f7eb2ca 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h @@ -106,16 +106,16 @@ decay_ticker_get(tsd_t *tsd, unsigned ind) { return &tdata->decay_ticker; } -JEMALLOC_ALWAYS_INLINE tcache_bin_t * +JEMALLOC_ALWAYS_INLINE cache_bin_t * tcache_small_bin_get(tcache_t *tcache, szind_t binind) { assert(binind < NBINS); - return &tcache->tbins_small[binind]; + return &tcache->bins_small[binind]; } -JEMALLOC_ALWAYS_INLINE tcache_bin_t * +JEMALLOC_ALWAYS_INLINE cache_bin_t * tcache_large_bin_get(tcache_t *tcache, szind_t binind) { assert(binind >= NBINS &&binind < nhbins); - return &tcache->tbins_large[binind - NBINS]; + return &tcache->bins_large[binind - NBINS]; } JEMALLOC_ALWAYS_INLINE bool @@ -151,6 +151,7 @@ pre_reentrancy(tsd_t *tsd, arena_t *arena) { assert(arena != arena_get(tsd_tsdn(tsd), 0, false)); bool fast = tsd_fast(tsd); + assert(tsd_reentrancy_level_get(tsd) < INT8_MAX); ++*tsd_reentrancy_levelp_get(tsd); if (fast) { /* Prepare slow path for reentrancy. */ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h index 7ffce6fb035..c829ac60cbe 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h @@ -5,6 +5,24 @@ #include "jemalloc/internal/sz.h" #include "jemalloc/internal/witness.h" +/* + * Translating the names of the 'i' functions: + * Abbreviations used in the first part of the function name (before + * alloc/dalloc) describe what that function accomplishes: + * a: arena (query) + * s: size (query, or sized deallocation) + * e: extent (query) + * p: aligned (allocates) + * vs: size (query, without knowing that the pointer is into the heap) + * r: rallocx implementation + * x: xallocx implementation + * Abbreviations used in the second part of the function name (after + * alloc/dalloc) describe the arguments it takes + * z: whether to return zeroed memory + * t: accepts a tcache_t * parameter + * m: accepts an arena_t * parameter + */ + JEMALLOC_ALWAYS_INLINE arena_t * iaalloc(tsdn_t *tsdn, const void *ptr) { assert(ptr != NULL); @@ -27,8 +45,10 @@ iallocztm(tsdn_t *tsdn, size_t size, szind_t ind, bool zero, tcache_t *tcache, assert(size != 0); assert(!is_internal || tcache == NULL); assert(!is_internal || arena == NULL || arena_is_auto(arena)); - witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), - WITNESS_RANK_CORE, 0); + if (!tsdn_null(tsdn) && tsd_reentrancy_level_get(tsdn_tsd(tsdn)) == 0) { + witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), + WITNESS_RANK_CORE, 0); + } ret = arena_malloc(tsdn, arena, size, ind, zero, tcache, slow_path); if (config_stats && is_internal && likely(ret != NULL)) { @@ -91,7 +111,8 @@ idalloctm(tsdn_t *tsdn, void *ptr, tcache_t *tcache, alloc_ctx_t *alloc_ctx, if (config_stats && is_internal) { arena_internal_sub(iaalloc(tsdn, ptr), isalloc(tsdn, ptr)); } - if (!is_internal && tsd_reentrancy_level_get(tsdn_tsd(tsdn)) != 0) { + if (!is_internal && !tsdn_null(tsdn) && + tsd_reentrancy_level_get(tsdn_tsd(tsdn)) != 0) { assert(tcache == NULL); } arena_dalloc(tsdn, ptr, tcache, alloc_ctx, slow_path); diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h index 4571895ec37..ed75d3768e5 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h @@ -37,4 +37,7 @@ # define JET_MUTABLE const #endif +#define JEMALLOC_VA_ARGS_HEAD(head, ...) head +#define JEMALLOC_VA_ARGS_TAIL(head, ...) __VA_ARGS__ + #endif /* JEMALLOC_INTERNAL_MACROS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h index 50f9d001d54..1b750b122c9 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h @@ -79,22 +79,29 @@ typedef int malloc_cpuid_t; # ifdef __hppa__ # define LG_QUANTUM 4 # endif +# ifdef __m68k__ +# define LG_QUANTUM 3 +# endif # ifdef __mips__ # define LG_QUANTUM 3 # endif +# ifdef __nios2__ +# define LG_QUANTUM 3 +# endif # ifdef __or1k__ # define LG_QUANTUM 3 # endif # ifdef __powerpc__ # define LG_QUANTUM 4 # endif -# ifdef __riscv__ +# if defined(__riscv) || defined(__riscv__) # define LG_QUANTUM 4 # endif # ifdef __s390__ # define LG_QUANTUM 4 # endif -# ifdef __SH4__ +# if (defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || \ + defined(__SH4_SINGLE_ONLY__)) # define LG_QUANTUM 4 # endif # ifdef __tile__ diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h index 39045c857f3..a373a8b2d3e 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h @@ -47,6 +47,10 @@ #endif #include "jemalloc/internal/hooks.h" +#ifdef JEMALLOC_DEFINE_MADVISE_FREE +# define JEMALLOC_MADV_FREE 8 +#endif + static const bool config_debug = #ifdef JEMALLOC_DEBUG true @@ -61,6 +65,13 @@ static const bool have_dss = false #endif ; +static const bool have_madvise_huge = +#ifdef JEMALLOC_HAVE_MADVISE_HUGE + true +#else + false +#endif + ; static const bool config_fill = #ifdef JEMALLOC_FILL true @@ -111,13 +122,6 @@ static const bool config_stats = false #endif ; -static const bool config_thp = -#ifdef JEMALLOC_THP - true -#else - false -#endif - ; static const bool config_tls = #ifdef JEMALLOC_TLS true @@ -146,6 +150,17 @@ static const bool config_cache_oblivious = false #endif ; +/* + * Undocumented, for jemalloc development use only at the moment. See the note + * in jemalloc/internal/log.h. + */ +static const bool config_log = +#ifdef JEMALLOC_LOG + true +#else + false +#endif + ; #ifdef JEMALLOC_HAVE_SCHED_GETCPU /* Currently percpu_arena depends on sched_getcpu. */ #define JEMALLOC_PERCPU_ARENA diff --git a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in index 18539a09887..e621fbc8599 100644 --- a/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in +++ b/dep/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in @@ -47,6 +47,10 @@ #endif #include "jemalloc/internal/hooks.h" +#ifdef JEMALLOC_DEFINE_MADVISE_FREE +# define JEMALLOC_MADV_FREE 8 +#endif + static const bool config_debug = #ifdef JEMALLOC_DEBUG true @@ -61,6 +65,13 @@ static const bool have_dss = false #endif ; +static const bool have_madvise_huge = +#ifdef JEMALLOC_HAVE_MADVISE_HUGE + true +#else + false +#endif + ; static const bool config_fill = #ifdef JEMALLOC_FILL true @@ -111,13 +122,6 @@ static const bool config_stats = false #endif ; -static const bool config_thp = -#ifdef JEMALLOC_THP - true -#else - false -#endif - ; static const bool config_tls = #ifdef JEMALLOC_TLS true @@ -146,6 +150,17 @@ static const bool config_cache_oblivious = false #endif ; +/* + * Undocumented, for jemalloc development use only at the moment. See the note + * in jemalloc/internal/log.h. + */ +static const bool config_log = +#ifdef JEMALLOC_LOG + true +#else + false +#endif + ; #ifdef JEMALLOC_HAVE_SCHED_GETCPU /* Currently percpu_arena depends on sched_getcpu. */ #define JEMALLOC_PERCPU_ARENA diff --git a/dep/jemalloc/include/jemalloc/internal/log.h b/dep/jemalloc/include/jemalloc/internal/log.h new file mode 100644 index 00000000000..64208586354 --- /dev/null +++ b/dep/jemalloc/include/jemalloc/internal/log.h @@ -0,0 +1,115 @@ +#ifndef JEMALLOC_INTERNAL_LOG_H +#define JEMALLOC_INTERNAL_LOG_H + +#include "jemalloc/internal/atomic.h" +#include "jemalloc/internal/malloc_io.h" +#include "jemalloc/internal/mutex.h" + +#ifdef JEMALLOC_LOG +# define JEMALLOC_LOG_VAR_BUFSIZE 1000 +#else +# define JEMALLOC_LOG_VAR_BUFSIZE 1 +#endif + +#define JEMALLOC_LOG_BUFSIZE 4096 + +/* + * The log malloc_conf option is a '|'-delimited list of log_var name segments + * which should be logged. The names are themselves hierarchical, with '.' as + * the delimiter (a "segment" is just a prefix in the log namespace). So, if + * you have: + * + * log("arena", "log msg for arena"); // 1 + * log("arena.a", "log msg for arena.a"); // 2 + * log("arena.b", "log msg for arena.b"); // 3 + * log("arena.a.a", "log msg for arena.a.a"); // 4 + * log("extent.a", "log msg for extent.a"); // 5 + * log("extent.b", "log msg for extent.b"); // 6 + * + * And your malloc_conf option is "log=arena.a|extent", then lines 2, 4, 5, and + * 6 will print at runtime. You can enable logging from all log vars by + * writing "log=.". + * + * None of this should be regarded as a stable API for right now. It's intended + * as a debugging interface, to let us keep around some of our printf-debugging + * statements. + */ + +extern char log_var_names[JEMALLOC_LOG_VAR_BUFSIZE]; +extern atomic_b_t log_init_done; + +typedef struct log_var_s log_var_t; +struct log_var_s { + /* + * Lowest bit is "inited", second lowest is "enabled". Putting them in + * a single word lets us avoid any fences on weak architectures. + */ + atomic_u_t state; + const char *name; +}; + +#define LOG_NOT_INITIALIZED 0U +#define LOG_INITIALIZED_NOT_ENABLED 1U +#define LOG_ENABLED 2U + +#define LOG_VAR_INIT(name_str) {ATOMIC_INIT(LOG_NOT_INITIALIZED), name_str} + +/* + * Returns the value we should assume for state (which is not necessarily + * accurate; if logging is done before logging has finished initializing, then + * we default to doing the safe thing by logging everything). + */ +unsigned log_var_update_state(log_var_t *log_var); + +/* We factor out the metadata management to allow us to test more easily. */ +#define log_do_begin(log_var) \ +if (config_log) { \ + unsigned log_state = atomic_load_u(&(log_var).state, \ + ATOMIC_RELAXED); \ + if (unlikely(log_state == LOG_NOT_INITIALIZED)) { \ + log_state = log_var_update_state(&(log_var)); \ + assert(log_state != LOG_NOT_INITIALIZED); \ + } \ + if (log_state == LOG_ENABLED) { \ + { + /* User code executes here. */ +#define log_do_end(log_var) \ + } \ + } \ +} + +/* + * MSVC has some preprocessor bugs in its expansion of __VA_ARGS__ during + * preprocessing. To work around this, we take all potential extra arguments in + * a var-args functions. Since a varargs macro needs at least one argument in + * the "...", we accept the format string there, and require that the first + * argument in this "..." is a const char *. + */ +static inline void +log_impl_varargs(const char *name, ...) { + char buf[JEMALLOC_LOG_BUFSIZE]; + va_list ap; + + va_start(ap, name); + const char *format = va_arg(ap, const char *); + size_t dst_offset = 0; + dst_offset += malloc_snprintf(buf, JEMALLOC_LOG_BUFSIZE, "%s: ", name); + dst_offset += malloc_vsnprintf(buf + dst_offset, + JEMALLOC_LOG_BUFSIZE - dst_offset, format, ap); + dst_offset += malloc_snprintf(buf + dst_offset, + JEMALLOC_LOG_BUFSIZE - dst_offset, "\n"); + va_end(ap); + + malloc_write(buf); +} + +/* Call as log("log.var.str", "format_string %d", arg_for_format_string); */ +#define LOG(log_var_str, ...) \ +do { \ + static log_var_t log_var = LOG_VAR_INIT(log_var_str); \ + log_do_begin(log_var) \ + log_impl_varargs((log_var).name, __VA_ARGS__); \ + log_do_end(log_var) \ +} while (0) + +#endif /* JEMALLOC_INTERNAL_LOG_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/malloc_io.h b/dep/jemalloc/include/jemalloc/internal/malloc_io.h index 47ae58ec352..bfe556b523d 100644 --- a/dep/jemalloc/include/jemalloc/internal/malloc_io.h +++ b/dep/jemalloc/include/jemalloc/internal/malloc_io.h @@ -53,10 +53,50 @@ size_t malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap); size_t malloc_snprintf(char *str, size_t size, const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4); +/* + * The caller can set write_cb and cbopaque to null to choose to print with the + * je_malloc_message hook. + */ void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque, const char *format, va_list ap); void malloc_cprintf(void (*write_cb)(void *, const char *), void *cbopaque, const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4); void malloc_printf(const char *format, ...) JEMALLOC_FORMAT_PRINTF(1, 2); +static inline ssize_t +malloc_write_fd(int fd, const void *buf, size_t count) { +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write) + /* + * Use syscall(2) rather than write(2) when possible in order to avoid + * the possibility of memory allocation within libc. This is necessary + * on FreeBSD; most operating systems do not have this problem though. + * + * syscall() returns long or int, depending on platform, so capture the + * result in the widest plausible type to avoid compiler warnings. + */ + long result = syscall(SYS_write, fd, buf, count); +#else + ssize_t result = (ssize_t)write(fd, buf, +#ifdef _WIN32 + (unsigned int) +#endif + count); +#endif + return (ssize_t)result; +} + +static inline ssize_t +malloc_read_fd(int fd, void *buf, size_t count) { +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read) + long result = syscall(SYS_read, fd, buf, count); +#else + ssize_t result = read(fd, buf, +#ifdef _WIN32 + (unsigned int) +#endif + count); +#endif + return (ssize_t)result; +} + #endif /* JEMALLOC_INTERNAL_MALLOC_IO_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/mutex_prof.h b/dep/jemalloc/include/jemalloc/internal/mutex_prof.h index 3358bcf5351..ce183d33529 100644 --- a/dep/jemalloc/include/jemalloc/internal/mutex_prof.h +++ b/dep/jemalloc/include/jemalloc/internal/mutex_prof.h @@ -35,21 +35,34 @@ typedef enum { mutex_prof_num_arena_mutexes } mutex_prof_arena_ind_t; -#define MUTEX_PROF_COUNTERS \ - OP(num_ops, uint64_t) \ - OP(num_wait, uint64_t) \ - OP(num_spin_acq, uint64_t) \ - OP(num_owner_switch, uint64_t) \ - OP(total_wait_time, uint64_t) \ - OP(max_wait_time, uint64_t) \ - OP(max_num_thds, uint32_t) +#define MUTEX_PROF_UINT64_COUNTERS \ + OP(num_ops, uint64_t, "n_lock_ops") \ + OP(num_wait, uint64_t, "n_waiting") \ + OP(num_spin_acq, uint64_t, "n_spin_acq") \ + OP(num_owner_switch, uint64_t, "n_owner_switch") \ + OP(total_wait_time, uint64_t, "total_wait_ns") \ + OP(max_wait_time, uint64_t, "max_wait_ns") -typedef enum { -#define OP(counter, type) mutex_counter_##counter, - MUTEX_PROF_COUNTERS +#define MUTEX_PROF_UINT32_COUNTERS \ + OP(max_num_thds, uint32_t, "max_n_thds") + +#define MUTEX_PROF_COUNTERS \ + MUTEX_PROF_UINT64_COUNTERS \ + MUTEX_PROF_UINT32_COUNTERS + +#define OP(counter, type, human) mutex_counter_##counter, + +#define COUNTER_ENUM(counter_list, t) \ + typedef enum { \ + counter_list \ + mutex_prof_num_##t##_counters \ + } mutex_prof_##t##_counter_ind_t; + +COUNTER_ENUM(MUTEX_PROF_UINT64_COUNTERS, uint64_t) +COUNTER_ENUM(MUTEX_PROF_UINT32_COUNTERS, uint32_t) + +#undef COUNTER_ENUM #undef OP - mutex_prof_num_counters -} mutex_prof_counter_ind_t; typedef struct { /* diff --git a/dep/jemalloc/include/jemalloc/internal/pages.h b/dep/jemalloc/include/jemalloc/internal/pages.h index 28383b7f973..7dae633afe5 100644 --- a/dep/jemalloc/include/jemalloc/internal/pages.h +++ b/dep/jemalloc/include/jemalloc/internal/pages.h @@ -58,6 +58,20 @@ static const bool pages_can_purge_forced = #endif ; +typedef enum { + thp_mode_default = 0, /* Do not change hugepage settings. */ + thp_mode_always = 1, /* Always set MADV_HUGEPAGE. */ + thp_mode_never = 2, /* Always set MADV_NOHUGEPAGE. */ + + thp_mode_names_limit = 3, /* Used for option processing. */ + thp_mode_not_supported = 3 /* No THP support detected. */ +} thp_mode_t; + +#define THP_MODE_DEFAULT thp_mode_default +extern thp_mode_t opt_thp; +extern thp_mode_t init_system_thp_mode; /* Initial system wide state. */ +extern const char *thp_mode_names[]; + void *pages_map(void *addr, size_t size, size_t alignment, bool *commit); void pages_unmap(void *addr, size_t size); bool pages_commit(void *addr, size_t size); @@ -66,6 +80,9 @@ bool pages_purge_lazy(void *addr, size_t size); bool pages_purge_forced(void *addr, size_t size); bool pages_huge(void *addr, size_t size); bool pages_nohuge(void *addr, size_t size); +bool pages_dontdump(void *addr, size_t size); +bool pages_dodump(void *addr, size_t size); bool pages_boot(void); +void pages_set_thp_state (void *ptr, size_t size); #endif /* JEMALLOC_INTERNAL_PAGES_EXTERNS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h b/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h index eda6839ade4..a6efb4851dc 100644 --- a/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h +++ b/dep/jemalloc/include/jemalloc/internal/prof_inlines_a.h @@ -69,4 +69,15 @@ prof_accum_cancel(tsdn_t *tsdn, prof_accum_t *prof_accum, size_t usize) { #endif } +JEMALLOC_ALWAYS_INLINE bool +prof_active_get_unlocked(void) { + /* + * Even if opt_prof is true, sampling can be temporarily disabled by + * setting prof_active to false. No locking is used when reading + * prof_active in the fast path, so there are no guarantees regarding + * how long it will take for all threads to notice state changes. + */ + return prof_active; +} + #endif /* JEMALLOC_INTERNAL_PROF_INLINES_A_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h b/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h index d670cb7b8f8..6ff465ad7f0 100644 --- a/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h +++ b/dep/jemalloc/include/jemalloc/internal/prof_inlines_b.h @@ -3,17 +3,6 @@ #include "jemalloc/internal/sz.h" -JEMALLOC_ALWAYS_INLINE bool -prof_active_get_unlocked(void) { - /* - * Even if opt_prof is true, sampling can be temporarily disabled by - * setting prof_active to false. No locking is used when reading - * prof_active in the fast path, so there are no guarantees regarding - * how long it will take for all threads to notice state changes. - */ - return prof_active; -} - JEMALLOC_ALWAYS_INLINE bool prof_gdump_get_unlocked(void) { /* diff --git a/dep/jemalloc/include/jemalloc/internal/rtree.h b/dep/jemalloc/include/jemalloc/internal/rtree.h index b5d4db3988f..b59d33a80bc 100644 --- a/dep/jemalloc/include/jemalloc/internal/rtree.h +++ b/dep/jemalloc/include/jemalloc/internal/rtree.h @@ -178,9 +178,21 @@ rtree_leaf_elm_bits_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, JEMALLOC_ALWAYS_INLINE extent_t * rtree_leaf_elm_bits_extent_get(uintptr_t bits) { +# ifdef __aarch64__ + /* + * aarch64 doesn't sign extend the highest virtual address bit to set + * the higher ones. Instead, the high bits gets zeroed. + */ + uintptr_t high_bit_mask = ((uintptr_t)1 << LG_VADDR) - 1; + /* Mask off the slab bit. */ + uintptr_t low_bit_mask = ~(uintptr_t)1; + uintptr_t mask = high_bit_mask & low_bit_mask; + return (extent_t *)(bits & mask); +# else /* Restore sign-extended high bits, mask slab bit. */ return (extent_t *)((uintptr_t)((intptr_t)(bits << RTREE_NHIB) >> RTREE_NHIB) & ~((uintptr_t)0x1)); +# endif } JEMALLOC_ALWAYS_INLINE szind_t @@ -196,8 +208,8 @@ rtree_leaf_elm_bits_slab_get(uintptr_t bits) { # endif JEMALLOC_ALWAYS_INLINE extent_t * -rtree_leaf_elm_extent_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_extent_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_extent_get(bits); @@ -209,8 +221,8 @@ rtree_leaf_elm_extent_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } JEMALLOC_ALWAYS_INLINE szind_t -rtree_leaf_elm_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_szind_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_szind_get(bits); @@ -221,8 +233,8 @@ rtree_leaf_elm_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } JEMALLOC_ALWAYS_INLINE bool -rtree_leaf_elm_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool dependent) { +rtree_leaf_elm_slab_read(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool dependent) { #ifdef RTREE_LEAF_COMPACT uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); return rtree_leaf_elm_bits_slab_get(bits); @@ -233,8 +245,8 @@ rtree_leaf_elm_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_extent_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - extent_t *extent) { +rtree_leaf_elm_extent_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, extent_t *extent) { #ifdef RTREE_LEAF_COMPACT uintptr_t old_bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, true); uintptr_t bits = ((uintptr_t)rtree_leaf_elm_bits_szind_get(old_bits) << @@ -247,8 +259,8 @@ rtree_leaf_elm_extent_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_szind_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - szind_t szind) { +rtree_leaf_elm_szind_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, szind_t szind) { assert(szind <= NSIZES); #ifdef RTREE_LEAF_COMPACT @@ -265,8 +277,8 @@ rtree_leaf_elm_szind_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, } static inline void -rtree_leaf_elm_slab_write(tsdn_t *tsdn, rtree_t *rtree, rtree_leaf_elm_t *elm, - bool slab) { +rtree_leaf_elm_slab_write(UNUSED tsdn_t *tsdn, UNUSED rtree_t *rtree, + rtree_leaf_elm_t *elm, bool slab) { #ifdef RTREE_LEAF_COMPACT uintptr_t old_bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, true); @@ -448,8 +460,14 @@ rtree_szind_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, if (!dependent && elm == NULL) { return true; } +#ifdef RTREE_LEAF_COMPACT + uintptr_t bits = rtree_leaf_elm_bits_read(tsdn, rtree, elm, dependent); + *r_szind = rtree_leaf_elm_bits_szind_get(bits); + *r_slab = rtree_leaf_elm_bits_slab_get(bits); +#else *r_szind = rtree_leaf_elm_szind_read(tsdn, rtree, elm, dependent); *r_slab = rtree_leaf_elm_slab_read(tsdn, rtree, elm, dependent); +#endif return false; } diff --git a/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h b/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h index 3cdc8625487..93a75173a8d 100644 --- a/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h +++ b/dep/jemalloc/include/jemalloc/internal/rtree_tsd.h @@ -26,7 +26,7 @@ * Zero initializer required for tsd initialization only. Proper initialization * done via rtree_ctx_data_init(). */ -#define RTREE_CTX_ZERO_INITIALIZER {{{0}}} +#define RTREE_CTX_ZERO_INITIALIZER {{{0}}, {{0}}} typedef struct rtree_leaf_elm_s rtree_leaf_elm_t; diff --git a/dep/jemalloc/include/jemalloc/internal/spin.h b/dep/jemalloc/include/jemalloc/internal/spin.h index e2afc98cfda..22804c687f1 100644 --- a/dep/jemalloc/include/jemalloc/internal/spin.h +++ b/dep/jemalloc/include/jemalloc/internal/spin.h @@ -1,25 +1,29 @@ #ifndef JEMALLOC_INTERNAL_SPIN_H #define JEMALLOC_INTERNAL_SPIN_H -#ifdef JEMALLOC_SPIN_C_ -# define SPIN_INLINE extern inline -#else -# define SPIN_INLINE inline -#endif - #define SPIN_INITIALIZER {0U} typedef struct { unsigned iteration; } spin_t; -SPIN_INLINE void +static inline void +spin_cpu_spinwait() { +# if HAVE_CPU_SPINWAIT + CPU_SPINWAIT; +# else + volatile int x = 0; + x = x; +# endif +} + +static inline void spin_adaptive(spin_t *spin) { volatile uint32_t i; if (spin->iteration < 5) { for (i = 0; i < (1U << spin->iteration); i++) { - CPU_SPINWAIT; + spin_cpu_spinwait(); } spin->iteration++; } else { diff --git a/dep/jemalloc/include/jemalloc/internal/stats.h b/dep/jemalloc/include/jemalloc/internal/stats.h index 1198779ab9c..852e34269ab 100644 --- a/dep/jemalloc/include/jemalloc/internal/stats.h +++ b/dep/jemalloc/include/jemalloc/internal/stats.h @@ -1,12 +1,6 @@ #ifndef JEMALLOC_INTERNAL_STATS_H #define JEMALLOC_INTERNAL_STATS_H -#include "jemalloc/internal/atomic.h" -#include "jemalloc/internal/mutex_prof.h" -#include "jemalloc/internal/mutex.h" -#include "jemalloc/internal/size_classes.h" -#include "jemalloc/internal/stats_tsd.h" - /* OPTION(opt, var_name, default, set_value_to) */ #define STATS_PRINT_OPTIONS \ OPTION('J', json, false, true) \ @@ -33,132 +27,4 @@ extern char opt_stats_print_opts[stats_print_tot_num_options+1]; void stats_print(void (*write_cb)(void *, const char *), void *cbopaque, const char *opts); -/* - * In those architectures that support 64-bit atomics, we use atomic updates for - * our 64-bit values. Otherwise, we use a plain uint64_t and synchronize - * externally. - */ -#ifdef JEMALLOC_ATOMIC_U64 -typedef atomic_u64_t arena_stats_u64_t; -#else -/* Must hold the arena stats mutex while reading atomically. */ -typedef uint64_t arena_stats_u64_t; -#endif - -typedef struct malloc_bin_stats_s { - /* - * Total number of allocation/deallocation requests served directly by - * the bin. Note that tcache may allocate an object, then recycle it - * many times, resulting many increments to nrequests, but only one - * each to nmalloc and ndalloc. - */ - uint64_t nmalloc; - uint64_t ndalloc; - - /* - * Number of allocation requests that correspond to the size of this - * bin. This includes requests served by tcache, though tcache only - * periodically merges into this counter. - */ - uint64_t nrequests; - - /* - * Current number of regions of this size class, including regions - * currently cached by tcache. - */ - size_t curregs; - - /* Number of tcache fills from this bin. */ - uint64_t nfills; - - /* Number of tcache flushes to this bin. */ - uint64_t nflushes; - - /* Total number of slabs created for this bin's size class. */ - uint64_t nslabs; - - /* - * Total number of slabs reused by extracting them from the slabs heap - * for this bin's size class. - */ - uint64_t reslabs; - - /* Current number of slabs in this bin. */ - size_t curslabs; - - mutex_prof_data_t mutex_data; -} malloc_bin_stats_t; - -typedef struct malloc_large_stats_s { - /* - * Total number of allocation/deallocation requests served directly by - * the arena. - */ - arena_stats_u64_t nmalloc; - arena_stats_u64_t ndalloc; - - /* - * Number of allocation requests that correspond to this size class. - * This includes requests served by tcache, though tcache only - * periodically merges into this counter. - */ - arena_stats_u64_t nrequests; /* Partially derived. */ - - /* Current number of allocations of this size class. */ - size_t curlextents; /* Derived. */ -} malloc_large_stats_t; - -typedef struct decay_stats_s { - /* Total number of purge sweeps. */ - arena_stats_u64_t npurge; - /* Total number of madvise calls made. */ - arena_stats_u64_t nmadvise; - /* Total number of pages purged. */ - arena_stats_u64_t purged; -} decay_stats_t; - -/* - * Arena stats. Note that fields marked "derived" are not directly maintained - * within the arena code; rather their values are derived during stats merge - * requests. - */ -typedef struct arena_stats_s { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_t mtx; -#endif - - /* Number of bytes currently mapped, excluding retained memory. */ - atomic_zu_t mapped; /* Partially derived. */ - - /* - * Number of unused virtual memory bytes currently retained. Retained - * bytes are technically mapped (though always decommitted or purged), - * but they are excluded from the mapped statistic (above). - */ - atomic_zu_t retained; /* Derived. */ - - decay_stats_t decay_dirty; - decay_stats_t decay_muzzy; - - atomic_zu_t base; /* Derived. */ - atomic_zu_t internal; - atomic_zu_t resident; /* Derived. */ - - atomic_zu_t allocated_large; /* Derived. */ - arena_stats_u64_t nmalloc_large; /* Derived. */ - arena_stats_u64_t ndalloc_large; /* Derived. */ - arena_stats_u64_t nrequests_large; /* Derived. */ - - /* Number of bytes cached in tcache associated with this arena. */ - atomic_zu_t tcache_bytes; /* Derived. */ - - mutex_prof_data_t mutex_prof_data[mutex_prof_num_arena_mutexes]; - - /* One element for each large size class. */ - malloc_large_stats_t lstats[NSIZES - NBINS]; - - /* Arena uptime. */ - nstime_t uptime; -} arena_stats_t; - #endif /* JEMALLOC_INTERNAL_STATS_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/stats_tsd.h b/dep/jemalloc/include/jemalloc/internal/stats_tsd.h deleted file mode 100644 index d0c3bbe4945..00000000000 --- a/dep/jemalloc/include/jemalloc/internal/stats_tsd.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef JEMALLOC_INTERNAL_STATS_TSD_H -#define JEMALLOC_INTERNAL_STATS_TSD_H - -typedef struct tcache_bin_stats_s { - /* - * Number of allocation requests that corresponded to the size of this - * bin. - */ - uint64_t nrequests; -} tcache_bin_stats_t; - -#endif /* JEMALLOC_INTERNAL_STATS_TSD_H */ diff --git a/dep/jemalloc/include/jemalloc/internal/sz.h b/dep/jemalloc/include/jemalloc/internal/sz.h index 7f640d55ad7..97946289854 100644 --- a/dep/jemalloc/include/jemalloc/internal/sz.h +++ b/dep/jemalloc/include/jemalloc/internal/sz.h @@ -61,7 +61,7 @@ sz_psz2ind(size_t psz) { pszind_t lg_delta = (x < LG_SIZE_CLASS_GROUP + LG_PAGE + 1) ? LG_PAGE : x - LG_SIZE_CLASS_GROUP - 1; - size_t delta_inverse_mask = ZD(-1) << lg_delta; + size_t delta_inverse_mask = ZU(-1) << lg_delta; pszind_t mod = ((((psz-1) & delta_inverse_mask) >> lg_delta)) & ((ZU(1) << LG_SIZE_CLASS_GROUP) - 1); @@ -142,7 +142,7 @@ sz_size2index_compute(size_t size) { szind_t lg_delta = (x < LG_SIZE_CLASS_GROUP + LG_QUANTUM + 1) ? LG_QUANTUM : x - LG_SIZE_CLASS_GROUP - 1; - size_t delta_inverse_mask = ZD(-1) << lg_delta; + size_t delta_inverse_mask = ZU(-1) << lg_delta; szind_t mod = ((((size-1) & delta_inverse_mask) >> lg_delta)) & ((ZU(1) << LG_SIZE_CLASS_GROUP) - 1); diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_externs.h b/dep/jemalloc/include/jemalloc/internal/tcache_externs.h index db3e9c7d5d1..790367bd481 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_externs.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_externs.h @@ -6,7 +6,7 @@ extern bool opt_tcache; extern ssize_t opt_lg_tcache_max; -extern tcache_bin_info_t *tcache_bin_info; +extern cache_bin_info_t *tcache_bin_info; /* * Number of tcache bins. There are NBINS small-object bins, plus 0 or more @@ -30,10 +30,10 @@ extern tcaches_t *tcaches; size_t tcache_salloc(tsdn_t *tsdn, const void *ptr); void tcache_event_hard(tsd_t *tsd, tcache_t *tcache); void *tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, bool *tcache_success); -void tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, + cache_bin_t *tbin, szind_t binind, bool *tcache_success); +void tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin, szind_t binind, unsigned rem); -void tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, +void tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind, unsigned rem, tcache_t *tcache); void tcache_arena_reassociate(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena); diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h b/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h index c55bcd2723d..0f6ab8cb50a 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_inlines.h @@ -1,6 +1,7 @@ #ifndef JEMALLOC_INTERNAL_TCACHE_INLINES_H #define JEMALLOC_INTERNAL_TCACHE_INLINES_H +#include "jemalloc/internal/bin.h" #include "jemalloc/internal/jemalloc_internal_types.h" #include "jemalloc/internal/size_classes.h" #include "jemalloc/internal/sz.h" @@ -38,43 +39,16 @@ tcache_event(tsd_t *tsd, tcache_t *tcache) { } JEMALLOC_ALWAYS_INLINE void * -tcache_alloc_easy(tcache_bin_t *tbin, bool *tcache_success) { +tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, + UNUSED size_t size, szind_t binind, bool zero, bool slow_path) { void *ret; - - if (unlikely(tbin->ncached == 0)) { - tbin->low_water = -1; - *tcache_success = false; - return NULL; - } - /* - * tcache_success (instead of ret) should be checked upon the return of - * this function. We avoid checking (ret == NULL) because there is - * never a null stored on the avail stack (which is unknown to the - * compiler), and eagerly checking ret would cause pipeline stall - * (waiting for the cacheline). - */ - *tcache_success = true; - ret = *(tbin->avail - tbin->ncached); - tbin->ncached--; - - if (unlikely((low_water_t)tbin->ncached < tbin->low_water)) { - tbin->low_water = tbin->ncached; - } - - return ret; -} - -JEMALLOC_ALWAYS_INLINE void * -tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, - szind_t binind, bool zero, bool slow_path) { - void *ret; - tcache_bin_t *tbin; + cache_bin_t *bin; bool tcache_success; size_t usize JEMALLOC_CC_SILENCE_INIT(0); assert(binind < NBINS); - tbin = tcache_small_bin_get(tcache, binind); - ret = tcache_alloc_easy(tbin, &tcache_success); + bin = tcache_small_bin_get(tcache, binind); + ret = cache_bin_alloc_easy(bin, &tcache_success); assert(tcache_success == (ret != NULL)); if (unlikely(!tcache_success)) { bool tcache_hard_success; @@ -84,7 +58,7 @@ tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, } ret = tcache_alloc_small_hard(tsd_tsdn(tsd), arena, tcache, - tbin, binind, &tcache_hard_success); + bin, binind, &tcache_hard_success); if (tcache_hard_success == false) { return NULL; } @@ -103,22 +77,21 @@ tcache_alloc_small(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, if (likely(!zero)) { if (slow_path && config_fill) { if (unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, - &arena_bin_info[binind], false); + arena_alloc_junk_small(ret, &bin_infos[binind], + false); } else if (unlikely(opt_zero)) { memset(ret, 0, usize); } } } else { if (slow_path && config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, &arena_bin_info[binind], - true); + arena_alloc_junk_small(ret, &bin_infos[binind], true); } memset(ret, 0, usize); } if (config_stats) { - tbin->tstats.nrequests++; + bin->tstats.nrequests++; } if (config_prof) { tcache->prof_accumbytes += usize; @@ -131,12 +104,12 @@ JEMALLOC_ALWAYS_INLINE void * tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, szind_t binind, bool zero, bool slow_path) { void *ret; - tcache_bin_t *tbin; + cache_bin_t *bin; bool tcache_success; assert(binind >= NBINS &&binind < nhbins); - tbin = tcache_large_bin_get(tcache, binind); - ret = tcache_alloc_easy(tbin, &tcache_success); + bin = tcache_large_bin_get(tcache, binind); + ret = cache_bin_alloc_easy(bin, &tcache_success); assert(tcache_success == (ret != NULL)); if (unlikely(!tcache_success)) { /* @@ -176,7 +149,7 @@ tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, } if (config_stats) { - tbin->tstats.nrequests++; + bin->tstats.nrequests++; } if (config_prof) { tcache->prof_accumbytes += usize; @@ -190,24 +163,24 @@ tcache_alloc_large(tsd_t *tsd, arena_t *arena, tcache_t *tcache, size_t size, JEMALLOC_ALWAYS_INLINE void tcache_dalloc_small(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, bool slow_path) { - tcache_bin_t *tbin; - tcache_bin_info_t *tbin_info; + cache_bin_t *bin; + cache_bin_info_t *bin_info; assert(tcache_salloc(tsd_tsdn(tsd), ptr) <= SMALL_MAXCLASS); if (slow_path && config_fill && unlikely(opt_junk_free)) { - arena_dalloc_junk_small(ptr, &arena_bin_info[binind]); + arena_dalloc_junk_small(ptr, &bin_infos[binind]); } - tbin = tcache_small_bin_get(tcache, binind); - tbin_info = &tcache_bin_info[binind]; - if (unlikely(tbin->ncached == tbin_info->ncached_max)) { - tcache_bin_flush_small(tsd, tcache, tbin, binind, - (tbin_info->ncached_max >> 1)); + bin = tcache_small_bin_get(tcache, binind); + bin_info = &tcache_bin_info[binind]; + if (unlikely(bin->ncached == bin_info->ncached_max)) { + tcache_bin_flush_small(tsd, tcache, bin, binind, + (bin_info->ncached_max >> 1)); } - assert(tbin->ncached < tbin_info->ncached_max); - tbin->ncached++; - *(tbin->avail - tbin->ncached) = ptr; + assert(bin->ncached < bin_info->ncached_max); + bin->ncached++; + *(bin->avail - bin->ncached) = ptr; tcache_event(tsd, tcache); } @@ -215,8 +188,8 @@ tcache_dalloc_small(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, JEMALLOC_ALWAYS_INLINE void tcache_dalloc_large(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, bool slow_path) { - tcache_bin_t *tbin; - tcache_bin_info_t *tbin_info; + cache_bin_t *bin; + cache_bin_info_t *bin_info; assert(tcache_salloc(tsd_tsdn(tsd), ptr) > SMALL_MAXCLASS); assert(tcache_salloc(tsd_tsdn(tsd), ptr) <= tcache_maxclass); @@ -225,15 +198,15 @@ tcache_dalloc_large(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind, large_dalloc_junk(ptr, sz_index2size(binind)); } - tbin = tcache_large_bin_get(tcache, binind); - tbin_info = &tcache_bin_info[binind]; - if (unlikely(tbin->ncached == tbin_info->ncached_max)) { - tcache_bin_flush_large(tsd, tbin, binind, - (tbin_info->ncached_max >> 1), tcache); + bin = tcache_large_bin_get(tcache, binind); + bin_info = &tcache_bin_info[binind]; + if (unlikely(bin->ncached == bin_info->ncached_max)) { + tcache_bin_flush_large(tsd, bin, binind, + (bin_info->ncached_max >> 1), tcache); } - assert(tbin->ncached < tbin_info->ncached_max); - tbin->ncached++; - *(tbin->avail - tbin->ncached) = ptr; + assert(bin->ncached < bin_info->ncached_max); + bin->ncached++; + *(bin->avail - bin->ncached) = ptr; tcache_event(tsd, tcache); } diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_structs.h b/dep/jemalloc/include/jemalloc/internal/tcache_structs.h index 7eb516fb6b1..07b7387059f 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_structs.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_structs.h @@ -3,54 +3,51 @@ #include "jemalloc/internal/ql.h" #include "jemalloc/internal/size_classes.h" -#include "jemalloc/internal/stats_tsd.h" +#include "jemalloc/internal/cache_bin.h" #include "jemalloc/internal/ticker.h" -/* - * Read-only information associated with each element of tcache_t's tbins array - * is stored separately, mainly to reduce memory usage. - */ -struct tcache_bin_info_s { - unsigned ncached_max; /* Upper limit on ncached. */ -}; - -struct tcache_bin_s { - low_water_t low_water; /* Min # cached since last GC. */ - uint32_t ncached; /* # of cached objects. */ - /* - * ncached and stats are both modified frequently. Let's keep them - * close so that they have a higher chance of being on the same - * cacheline, thus less write-backs. - */ - tcache_bin_stats_t tstats; - /* - * To make use of adjacent cacheline prefetch, the items in the avail - * stack goes to higher address for newer allocations. avail points - * just above the available space, which means that - * avail[-ncached, ... -1] are available items and the lowest item will - * be allocated first. - */ - void **avail; /* Stack of available objects. */ -}; - struct tcache_s { - /* Data accessed frequently first: prof, ticker and small bins. */ - uint64_t prof_accumbytes;/* Cleared after arena_prof_accum(). */ - ticker_t gc_ticker; /* Drives incremental GC. */ /* - * The pointer stacks associated with tbins follow as a contiguous - * array. During tcache initialization, the avail pointer in each - * element of tbins is initialized to point to the proper offset within - * this array. + * To minimize our cache-footprint, we put the frequently accessed data + * together at the start of this struct. */ - tcache_bin_t tbins_small[NBINS]; - /* Data accessed less often below. */ - ql_elm(tcache_t) link; /* Used for aggregating stats. */ - arena_t *arena; /* Associated arena. */ - szind_t next_gc_bin; /* Next bin to GC. */ + + /* Cleared after arena_prof_accum(). */ + uint64_t prof_accumbytes; + /* Drives incremental GC. */ + ticker_t gc_ticker; + /* + * The pointer stacks associated with bins follow as a contiguous array. + * During tcache initialization, the avail pointer in each element of + * tbins is initialized to point to the proper offset within this array. + */ + cache_bin_t bins_small[NBINS]; + + /* + * This data is less hot; we can be a little less careful with our + * footprint here. + */ + /* Lets us track all the tcaches in an arena. */ + ql_elm(tcache_t) link; + /* + * The descriptor lets the arena find our cache bins without seeing the + * tcache definition. This enables arenas to aggregate stats across + * tcaches without having a tcache dependency. + */ + cache_bin_array_descriptor_t cache_bin_array_descriptor; + + /* The arena this tcache is associated with. */ + arena_t *arena; + /* Next bin to GC. */ + szind_t next_gc_bin; /* For small bins, fill (ncached_max >> lg_fill_div). */ uint8_t lg_fill_div[NBINS]; - tcache_bin_t tbins_large[NSIZES-NBINS]; + /* + * We put the cache bins for large size classes at the end of the + * struct, since some of them might not get used. This might end up + * letting us avoid touching an extra page if we don't have to. + */ + cache_bin_t bins_large[NSIZES-NBINS]; }; /* Linkage for list of available (previously used) explicit tcache IDs. */ diff --git a/dep/jemalloc/include/jemalloc/internal/tcache_types.h b/dep/jemalloc/include/jemalloc/internal/tcache_types.h index 1155d62cb44..e49bc9d79eb 100644 --- a/dep/jemalloc/include/jemalloc/internal/tcache_types.h +++ b/dep/jemalloc/include/jemalloc/internal/tcache_types.h @@ -3,14 +3,9 @@ #include "jemalloc/internal/size_classes.h" -typedef struct tcache_bin_info_s tcache_bin_info_t; -typedef struct tcache_bin_s tcache_bin_t; typedef struct tcache_s tcache_t; typedef struct tcaches_s tcaches_t; -/* ncached is cast to this type for comparison. */ -typedef int32_t low_water_t; - /* * tcache pointers close to NULL are used to encode state information that is * used for two purposes: preventing thread caching on a per thread basis and diff --git a/dep/jemalloc/include/jemalloc/internal/ticker.h b/dep/jemalloc/include/jemalloc/internal/ticker.h index 572b96459cc..4b3604708e1 100644 --- a/dep/jemalloc/include/jemalloc/internal/ticker.h +++ b/dep/jemalloc/include/jemalloc/internal/ticker.h @@ -32,14 +32,42 @@ ticker_read(const ticker_t *ticker) { return ticker->tick; } +/* + * Not intended to be a public API. Unfortunately, on x86, neither gcc nor + * clang seems smart enough to turn + * ticker->tick -= nticks; + * if (unlikely(ticker->tick < 0)) { + * fixup ticker + * return true; + * } + * return false; + * into + * subq %nticks_reg, (%ticker_reg) + * js fixup ticker + * + * unless we force "fixup ticker" out of line. In that case, gcc gets it right, + * but clang now does worse than before. So, on x86 with gcc, we force it out + * of line, but otherwise let the inlining occur. Ordinarily this wouldn't be + * worth the hassle, but this is on the fast path of both malloc and free (via + * tcache_event). + */ +#if defined(__GNUC__) && !defined(__clang__) \ + && (defined(__x86_64__) || defined(__i386__)) +JEMALLOC_NOINLINE +#endif +static bool +ticker_fixup(ticker_t *ticker) { + ticker->tick = ticker->nticks; + return true; +} + static inline bool ticker_ticks(ticker_t *ticker, int32_t nticks) { - if (unlikely(ticker->tick < nticks)) { - ticker->tick = ticker->nticks; - return true; - } ticker->tick -= nticks; - return(false); + if (unlikely(ticker->tick < 0)) { + return ticker_fixup(ticker); + } + return false; } static inline bool diff --git a/dep/jemalloc/include/jemalloc/internal/tsd.h b/dep/jemalloc/include/jemalloc/internal/tsd.h index 155a2ec6c44..0b9841aa7db 100644 --- a/dep/jemalloc/include/jemalloc/internal/tsd.h +++ b/dep/jemalloc/include/jemalloc/internal/tsd.h @@ -65,6 +65,7 @@ typedef void (*test_callback_t)(int *); O(arenas_tdata_bypass, bool, bool) \ O(reentrancy_level, int8_t, int8_t) \ O(narenas_tdata, uint32_t, uint32_t) \ + O(offset_state, uint64_t, uint64_t) \ O(thread_allocated, uint64_t, uint64_t) \ O(thread_deallocated, uint64_t, uint64_t) \ O(prof_tdata, prof_tdata_t *, prof_tdata_t *) \ @@ -84,6 +85,7 @@ typedef void (*test_callback_t)(int *); 0, \ 0, \ 0, \ + 0, \ NULL, \ RTREE_CTX_ZERO_INITIALIZER, \ NULL, \ diff --git a/dep/jemalloc/include/jemalloc/internal/tsd_tls.h b/dep/jemalloc/include/jemalloc/internal/tsd_tls.h index 757aaa0eeff..0de64b7b8bf 100644 --- a/dep/jemalloc/include/jemalloc/internal/tsd_tls.h +++ b/dep/jemalloc/include/jemalloc/internal/tsd_tls.h @@ -39,7 +39,7 @@ tsd_get_allocates(void) { /* Get/set. */ JEMALLOC_ALWAYS_INLINE tsd_t * -tsd_get(bool init) { +tsd_get(UNUSED bool init) { assert(tsd_booted); return &tsd_tls; } diff --git a/dep/jemalloc/include/jemalloc/internal/witness.h b/dep/jemalloc/include/jemalloc/internal/witness.h index 33be6661071..7ace8ae4a11 100644 --- a/dep/jemalloc/include/jemalloc/internal/witness.h +++ b/dep/jemalloc/include/jemalloc/internal/witness.h @@ -51,7 +51,7 @@ #define WITNESS_RANK_ARENA_LARGE 19U #define WITNESS_RANK_LEAF 0xffffffffU -#define WITNESS_RANK_ARENA_BIN WITNESS_RANK_LEAF +#define WITNESS_RANK_BIN WITNESS_RANK_LEAF #define WITNESS_RANK_ARENA_STATS WITNESS_RANK_LEAF #define WITNESS_RANK_DSS WITNESS_RANK_LEAF #define WITNESS_RANK_PROF_ACTIVE WITNESS_RANK_LEAF diff --git a/dep/jemalloc/include/jemalloc/jemalloc.h b/dep/jemalloc/include/jemalloc/jemalloc.h index 6ffe5c71b38..c41a9b48974 100644 --- a/dep/jemalloc/include/jemalloc/jemalloc.h +++ b/dep/jemalloc/include/jemalloc/jemalloc.h @@ -83,12 +83,12 @@ extern "C" { #include #include -#define JEMALLOC_VERSION "5.0.1-0-g896ed3a8b3f41998d4fb4d625d30ac63ef2d51fb" +#define JEMALLOC_VERSION "5.1.0-0-g61efbda7098de6fe64c362d309824864308c36d4" #define JEMALLOC_VERSION_MAJOR 5 -#define JEMALLOC_VERSION_MINOR 0 -#define JEMALLOC_VERSION_BUGFIX 1 +#define JEMALLOC_VERSION_MINOR 1 +#define JEMALLOC_VERSION_BUGFIX 0 #define JEMALLOC_VERSION_NREV 0 -#define JEMALLOC_VERSION_GID "896ed3a8b3f41998d4fb4d625d30ac63ef2d51fb" +#define JEMALLOC_VERSION_GID "61efbda7098de6fe64c362d309824864308c36d4" #define MALLOCX_LG_ALIGN(la) ((int)(la)) #if LG_SIZEOF_PTR == 2 diff --git a/dep/jemalloc/include/msvc_compat/inttypes.h b/dep/jemalloc/include/msvc_compat/inttypes.h deleted file mode 100644 index a4e6b75cb91..00000000000 --- a/dep/jemalloc/include/msvc_compat/inttypes.h +++ /dev/null @@ -1,313 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -#ifdef _WIN64 -# define __PRI64_PREFIX "l" -# define __PRIPTR_PREFIX "l" -#else -# define __PRI64_PREFIX "ll" -# define __PRIPTR_PREFIX -#endif - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "d" -#define PRIi32 "i" -#define PRIdLEAST32 "d" -#define PRIiLEAST32 "i" -#define PRIdFAST32 "d" -#define PRIiFAST32 "i" - -#define PRId64 __PRI64_PREFIX "d" -#define PRIi64 __PRI64_PREFIX "i" -#define PRIdLEAST64 __PRI64_PREFIX "d" -#define PRIiLEAST64 __PRI64_PREFIX "i" -#define PRIdFAST64 __PRI64_PREFIX "d" -#define PRIiFAST64 __PRI64_PREFIX "i" - -#define PRIdMAX __PRI64_PREFIX "d" -#define PRIiMAX __PRI64_PREFIX "i" - -#define PRIdPTR __PRIPTR_PREFIX "d" -#define PRIiPTR __PRIPTR_PREFIX "i" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "o" -#define PRIu32 "u" -#define PRIx32 "x" -#define PRIX32 "X" -#define PRIoLEAST32 "o" -#define PRIuLEAST32 "u" -#define PRIxLEAST32 "x" -#define PRIXLEAST32 "X" -#define PRIoFAST32 "o" -#define PRIuFAST32 "u" -#define PRIxFAST32 "x" -#define PRIXFAST32 "X" - -#define PRIo64 __PRI64_PREFIX "o" -#define PRIu64 __PRI64_PREFIX "u" -#define PRIx64 __PRI64_PREFIX "x" -#define PRIX64 __PRI64_PREFIX "X" -#define PRIoLEAST64 __PRI64_PREFIX "o" -#define PRIuLEAST64 __PRI64_PREFIX "u" -#define PRIxLEAST64 __PRI64_PREFIX "x" -#define PRIXLEAST64 __PRI64_PREFIX "X" -#define PRIoFAST64 __PRI64_PREFIX "o" -#define PRIuFAST64 __PRI64_PREFIX "u" -#define PRIxFAST64 __PRI64_PREFIX "x" -#define PRIXFAST64 __PRI64_PREFIX "X" - -#define PRIoMAX __PRI64_PREFIX "o" -#define PRIuMAX __PRI64_PREFIX "u" -#define PRIxMAX __PRI64_PREFIX "x" -#define PRIXMAX __PRI64_PREFIX "X" - -#define PRIoPTR __PRIPTR_PREFIX "o" -#define PRIuPTR __PRIPTR_PREFIX "u" -#define PRIxPTR __PRIPTR_PREFIX "x" -#define PRIXPTR __PRIPTR_PREFIX "X" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - - -#endif // _MSC_INTTYPES_H_ ] diff --git a/dep/jemalloc/include/msvc_compat/stdbool.h b/dep/jemalloc/include/msvc_compat/stdbool.h deleted file mode 100644 index da9ee8b809b..00000000000 --- a/dep/jemalloc/include/msvc_compat/stdbool.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef stdbool_h -#define stdbool_h - -#include - -/* MSVC doesn't define _Bool or bool in C, but does have BOOL */ -/* Note this doesn't pass autoconf's test because (bool) 0.5 != true */ -typedef BOOL _Bool; - -#define bool _Bool -#define true 1 -#define false 0 - -#define __bool_true_false_are_defined 1 - -#endif /* stdbool_h */ diff --git a/dep/jemalloc/include/msvc_compat/stdint.h b/dep/jemalloc/include/msvc_compat/stdint.h deleted file mode 100644 index d02608a5972..00000000000 --- a/dep/jemalloc/include/msvc_compat/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/dep/jemalloc/jemalloc_internal_defs.h.in.cmake b/dep/jemalloc/jemalloc_internal_defs.h.in.cmake index 1527fa2c2fe..be6f92713a4 100644 --- a/dep/jemalloc/jemalloc_internal_defs.h.in.cmake +++ b/dep/jemalloc/jemalloc_internal_defs.h.in.cmake @@ -34,6 +34,8 @@ * order to yield to another virtual CPU. */ #define CPU_SPINWAIT __asm__ volatile("pause") +/* 1 if CPU_SPINWAIT is defined, 0 otherwise. */ +#define HAVE_CPU_SPINWAIT 1 /* * Number of significant bits in virtual addresses. This may be less than the @@ -238,6 +240,12 @@ */ #define JEMALLOC_CACHE_OBLIVIOUS +/* + * If defined, enable logging facilities. We make this a configure option to + * avoid taking extra branches everywhere. + */ +/* #undef JEMALLOC_LOG */ + /* * Darwin (OS X) uses zones to work around Mach-O symbol override shortcomings. */ @@ -255,6 +263,12 @@ /* Defined if madvise(2) is available. */ #define JEMALLOC_HAVE_MADVISE +/* + * Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE + * arguments to madvise(2). + */ +#define JEMALLOC_HAVE_MADVISE_HUGE + /* * Methods for purging unused pages differ between operating systems. * @@ -268,15 +282,23 @@ * MADV_FREE, though typically with higher * system overhead. */ -@JEM_MADFREE_DEF@ JEMALLOC_PURGE_MADVISE_FREE +@JEM_MADFREE_DEF@ JEMALLOC_PURGE_MADVISE_FREE #define JEMALLOC_PURGE_MADVISE_DONTNEED -#define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS 1 +#define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS + +/* Defined if madvise(2) is available but MADV_FREE is not (x86 Linux only). */ +/* #undef JEMALLOC_DEFINE_MADVISE_FREE */ + +/* + * Defined if MADV_DO[NT]DUMP is supported as an argument to madvise. + */ +#define JEMALLOC_MADVISE_DONTDUMP /* * Defined if transparent huge pages (THPs) are supported via the * MADV_[NO]HUGEPAGE arguments to madvise(2), and THP support is enabled. */ -#define JEMALLOC_THP +/* #undef JEMALLOC_THP */ /* Define if operating system has alloca.h header. */ #define JEMALLOC_HAS_ALLOCA_H 1 @@ -337,6 +359,11 @@ /* If defined, jemalloc takes the malloc/free/etc. symbol names. */ #define JEMALLOC_IS_MALLOC 1 +/* + * Defined if strerror_r returns char * if _GNU_SOURCE is defined. + */ +#define JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE + /* sizeof(void *) == 2^LG_SIZEOF_PTR. */ #define LG_SIZEOF_PTR @JEM_SIZEDEF@ diff --git a/dep/jemalloc/src/arena.c b/dep/jemalloc/src/arena.c index 632fce5233e..5d55bf1a060 100644 --- a/dep/jemalloc/src/arena.c +++ b/dep/jemalloc/src/arena.c @@ -3,6 +3,7 @@ #include "jemalloc/internal/jemalloc_internal_includes.h" #include "jemalloc/internal/assert.h" +#include "jemalloc/internal/div.h" #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/extent_mmap.h" #include "jemalloc/internal/mutex.h" @@ -32,21 +33,6 @@ ssize_t opt_muzzy_decay_ms = MUZZY_DECAY_MS_DEFAULT; static atomic_zd_t dirty_decay_ms_default; static atomic_zd_t muzzy_decay_ms_default; -const arena_bin_info_t arena_bin_info[NBINS] = { -#define BIN_INFO_bin_yes(reg_size, slab_size, nregs) \ - {reg_size, slab_size, nregs, BITMAP_INFO_INITIALIZER(nregs)}, -#define BIN_INFO_bin_no(reg_size, slab_size, nregs) -#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ - lg_delta_lookup) \ - BIN_INFO_bin_##bin((1U<mtx, "arena_stats", - WITNESS_RANK_ARENA_STATS, malloc_mutex_rank_exclusive)) { - return true; - } -#endif - /* Memory is zeroed, so there is no need to clear stats. */ - return false; -} - -static void -arena_stats_lock(tsdn_t *tsdn, arena_stats_t *arena_stats) { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_lock(tsdn, &arena_stats->mtx); -#endif -} - -static void -arena_stats_unlock(tsdn_t *tsdn, arena_stats_t *arena_stats) { -#ifndef JEMALLOC_ATOMIC_U64 - malloc_mutex_unlock(tsdn, &arena_stats->mtx); -#endif -} - -static uint64_t -arena_stats_read_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p) { -#ifdef JEMALLOC_ATOMIC_U64 - return atomic_load_u64(p, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - return *p; -#endif -} - -static void -arena_stats_add_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p, uint64_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - atomic_fetch_add_u64(p, x, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - *p += x; -#endif -} - -UNUSED static void -arena_stats_sub_u64(tsdn_t *tsdn, arena_stats_t *arena_stats, - arena_stats_u64_t *p, uint64_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - UNUSED uint64_t r = atomic_fetch_sub_u64(p, x, ATOMIC_RELAXED); - assert(r - x <= r); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - *p -= x; - assert(*p + x >= *p); -#endif -} - -/* - * Non-atomically sets *dst += src. *dst needs external synchronization. - * This lets us avoid the cost of a fetch_add when its unnecessary (note that - * the types here are atomic). - */ -static void -arena_stats_accum_u64(arena_stats_u64_t *dst, uint64_t src) { -#ifdef JEMALLOC_ATOMIC_U64 - uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); - atomic_store_u64(dst, src + cur_dst, ATOMIC_RELAXED); -#else - *dst += src; -#endif -} - -static size_t -arena_stats_read_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p) { -#ifdef JEMALLOC_ATOMIC_U64 - return atomic_load_zu(p, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - return atomic_load_zu(p, ATOMIC_RELAXED); -#endif -} - -static void -arena_stats_add_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, - size_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - atomic_fetch_add_zu(p, x, ATOMIC_RELAXED); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); - atomic_store_zu(p, cur + x, ATOMIC_RELAXED); -#endif -} - -static void -arena_stats_sub_zu(tsdn_t *tsdn, arena_stats_t *arena_stats, atomic_zu_t *p, - size_t x) { -#ifdef JEMALLOC_ATOMIC_U64 - UNUSED size_t r = atomic_fetch_sub_zu(p, x, ATOMIC_RELAXED); - assert(r - x <= r); -#else - malloc_mutex_assert_owner(tsdn, &arena_stats->mtx); - size_t cur = atomic_load_zu(p, ATOMIC_RELAXED); - atomic_store_zu(p, cur - x, ATOMIC_RELAXED); -#endif -} - -/* Like the _u64 variant, needs an externally synchronized *dst. */ -static void -arena_stats_accum_zu(atomic_zu_t *dst, size_t src) { - size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); - atomic_store_zu(dst, src + cur_dst, ATOMIC_RELAXED); -} - void -arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, - szind_t szind, uint64_t nrequests) { - arena_stats_lock(tsdn, arena_stats); - arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind - - NBINS].nrequests, nrequests); - arena_stats_unlock(tsdn, arena_stats); -} - -void -arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats, size_t size) { - arena_stats_lock(tsdn, arena_stats); - arena_stats_add_zu(tsdn, arena_stats, &arena_stats->mapped, size); - arena_stats_unlock(tsdn, arena_stats); -} - -void -arena_basic_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, +arena_basic_stats_merge(UNUSED tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy) { *nthreads += arena_nthreads_get(arena, false); @@ -228,15 +77,15 @@ void arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy, arena_stats_t *astats, - malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats) { + bin_stats_t *bstats, arena_stats_large_t *lstats) { cassert(config_stats); arena_basic_stats_merge(tsdn, arena, nthreads, dss, dirty_decay_ms, muzzy_decay_ms, nactive, ndirty, nmuzzy); - size_t base_allocated, base_resident, base_mapped; + size_t base_allocated, base_resident, base_mapped, metadata_thp; base_stats_get(tsdn, arena->base, &base_allocated, &base_resident, - &base_mapped); + &base_mapped, &metadata_thp); arena_stats_lock(tsdn, &arena->stats); @@ -267,6 +116,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, arena_stats_accum_zu(&astats->base, base_allocated); arena_stats_accum_zu(&astats->internal, arena_internal_get(arena)); + arena_stats_accum_zu(&astats->metadata_thp, metadata_thp); arena_stats_accum_zu(&astats->resident, base_resident + (((atomic_load_zu(&arena->nactive, ATOMIC_RELAXED) + extents_npages_get(&arena->extents_dirty) + @@ -303,16 +153,16 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, /* tcache_bytes counts currently cached bytes. */ atomic_store_zu(&astats->tcache_bytes, 0, ATOMIC_RELAXED); malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx); - tcache_t *tcache; - ql_foreach(tcache, &arena->tcache_ql, link) { + cache_bin_array_descriptor_t *descriptor; + ql_foreach(descriptor, &arena->cache_bin_array_descriptor_ql, link) { szind_t i = 0; for (; i < NBINS; i++) { - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + cache_bin_t *tbin = &descriptor->bins_small[i]; arena_stats_accum_zu(&astats->tcache_bytes, tbin->ncached * sz_index2size(i)); } for (; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = &descriptor->bins_large[i]; arena_stats_accum_zu(&astats->tcache_bytes, tbin->ncached * sz_index2size(i)); } @@ -351,20 +201,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, nstime_subtract(&astats->uptime, &arena->create_time); for (szind_t i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - - malloc_mutex_lock(tsdn, &bin->lock); - malloc_mutex_prof_read(tsdn, &bstats[i].mutex_data, &bin->lock); - bstats[i].nmalloc += bin->stats.nmalloc; - bstats[i].ndalloc += bin->stats.ndalloc; - bstats[i].nrequests += bin->stats.nrequests; - bstats[i].curregs += bin->stats.curregs; - bstats[i].nfills += bin->stats.nfills; - bstats[i].nflushes += bin->stats.nflushes; - bstats[i].nslabs += bin->stats.nslabs; - bstats[i].reslabs += bin->stats.reslabs; - bstats[i].curslabs += bin->stats.curslabs; - malloc_mutex_unlock(tsdn, &bin->lock); + bin_stats_merge(tsdn, &bstats[i], &arena->bins[i]); } } @@ -384,8 +221,7 @@ arena_extents_dirty_dalloc(tsdn_t *tsdn, arena_t *arena, } static void * -arena_slab_reg_alloc(tsdn_t *tsdn, extent_t *slab, - const arena_bin_info_t *bin_info) { +arena_slab_reg_alloc(extent_t *slab, const bin_info_t *bin_info) { void *ret; arena_slab_data_t *slab_data = extent_slab_data_get(slab); size_t regind; @@ -412,37 +248,22 @@ arena_slab_regind(extent_t *slab, szind_t binind, const void *ptr) { assert((uintptr_t)ptr < (uintptr_t)extent_past_get(slab)); /* Freeing an interior pointer can cause assertion failure. */ assert(((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)) % - (uintptr_t)arena_bin_info[binind].reg_size == 0); + (uintptr_t)bin_infos[binind].reg_size == 0); + + diff = (size_t)((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)); /* Avoid doing division with a variable divisor. */ - diff = (size_t)((uintptr_t)ptr - (uintptr_t)extent_addr_get(slab)); - switch (binind) { -#define REGIND_bin_yes(index, reg_size) \ - case index: \ - regind = diff / (reg_size); \ - assert(diff == regind * (reg_size)); \ - break; -#define REGIND_bin_no(index, reg_size) -#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ - lg_delta_lookup) \ - REGIND_bin_##bin(index, (1U<nregs); @@ -692,7 +513,8 @@ arena_decay_try_purge(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, bool is_background_thread) { if (current_npages > npages_limit) { arena_decay_to_limit(tsdn, arena, decay, extents, false, - npages_limit, is_background_thread); + npages_limit, current_npages - npages_limit, + is_background_thread); } } @@ -738,7 +560,7 @@ arena_decay_epoch_advance(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, } static void -arena_decay_reinit(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms) { +arena_decay_reinit(arena_decay_t *decay, ssize_t decay_ms) { arena_decay_ms_write(decay, decay_ms); if (decay_ms > 0) { nstime_init(&decay->interval, (uint64_t)decay_ms * @@ -755,8 +577,8 @@ arena_decay_reinit(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms) { } static bool -arena_decay_init(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms, - decay_stats_t *stats) { +arena_decay_init(arena_decay_t *decay, ssize_t decay_ms, + arena_stats_decay_t *stats) { if (config_debug) { for (size_t i = 0; i < sizeof(arena_decay_t); i++) { assert(((char *)decay)[i] == 0); @@ -768,7 +590,7 @@ arena_decay_init(arena_decay_t *decay, extents_t *extents, ssize_t decay_ms, return true; } decay->purging = false; - arena_decay_reinit(decay, extents, decay_ms); + arena_decay_reinit(decay, decay_ms); /* Memory is zeroed, so there is no need to clear stats. */ if (config_stats) { decay->stats = stats; @@ -798,7 +620,8 @@ arena_maybe_decay(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (decay_ms <= 0) { if (decay_ms == 0) { arena_decay_to_limit(tsdn, arena, decay, extents, false, - 0, is_background_thread); + 0, extents_npages_get(extents), + is_background_thread); } return false; } @@ -876,7 +699,7 @@ arena_decay_ms_set(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, * infrequent, either between the {-1, 0, >0} states, or a one-time * arbitrary change during initial arena configuration. */ - arena_decay_reinit(decay, extents, decay_ms); + arena_decay_reinit(decay, decay_ms); arena_maybe_decay(tsdn, arena, decay, extents, false); malloc_mutex_unlock(tsdn, &decay->mtx); @@ -900,14 +723,15 @@ arena_muzzy_decay_ms_set(tsdn_t *tsdn, arena_t *arena, static size_t arena_stash_decayed(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, size_t npages_limit, - extent_list_t *decay_extents) { + size_t npages_decay_max, extent_list_t *decay_extents) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); /* Stash extents according to npages_limit. */ size_t nstashed = 0; extent_t *extent; - while ((extent = extents_evict(tsdn, arena, r_extent_hooks, extents, + while (nstashed < npages_decay_max && + (extent = extents_evict(tsdn, arena, r_extent_hooks, extents, npages_limit)) != NULL) { extent_list_append(decay_extents, extent); nstashed += extent_size_get(extent) >> LG_PAGE; @@ -982,12 +806,15 @@ arena_decay_stashed(tsdn_t *tsdn, arena_t *arena, } /* - * npages_limit: Decay as many dirty extents as possible without violating the - * invariant: (extents_npages_get(extents) >= npages_limit) + * npages_limit: Decay at most npages_decay_max pages without violating the + * invariant: (extents_npages_get(extents) >= npages_limit). We need an upper + * bound on number of pages in order to prevent unbounded growth (namely in + * stashed), otherwise unbounded new pages could be added to extents during the + * current decay run, so that the purging thread never finishes. */ static void arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, - extents_t *extents, bool all, size_t npages_limit, + extents_t *extents, bool all, size_t npages_limit, size_t npages_decay_max, bool is_background_thread) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 1); @@ -1005,7 +832,7 @@ arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, extent_list_init(&decay_extents); size_t npurge = arena_stash_decayed(tsdn, arena, &extent_hooks, extents, - npages_limit, &decay_extents); + npages_limit, npages_decay_max, &decay_extents); if (npurge != 0) { UNUSED size_t npurged = arena_decay_stashed(tsdn, arena, &extent_hooks, decay, extents, all, &decay_extents, @@ -1023,7 +850,7 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (all) { malloc_mutex_lock(tsdn, &decay->mtx); arena_decay_to_limit(tsdn, arena, decay, extents, all, 0, - is_background_thread); + extents_npages_get(extents), is_background_thread); malloc_mutex_unlock(tsdn, &decay->mtx); return false; @@ -1036,7 +863,7 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, bool epoch_advanced = arena_maybe_decay(tsdn, arena, decay, extents, is_background_thread); - size_t npages_new; + UNUSED size_t npages_new; if (epoch_advanced) { /* Backlog is updated on epoch advance. */ npages_new = decay->backlog[SMOOTHSTEP_NSTEPS-1]; @@ -1045,7 +872,8 @@ arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay, if (have_background_thread && background_thread_enabled() && epoch_advanced && !is_background_thread) { - background_thread_interval_check(tsdn, arena, decay, npages_new); + background_thread_interval_check(tsdn, arena, decay, + npages_new); } return false; @@ -1082,18 +910,18 @@ arena_slab_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *slab) { } static void -arena_bin_slabs_nonfull_insert(arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_nonfull_insert(bin_t *bin, extent_t *slab) { assert(extent_nfree_get(slab) > 0); extent_heap_insert(&bin->slabs_nonfull, slab); } static void -arena_bin_slabs_nonfull_remove(arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_nonfull_remove(bin_t *bin, extent_t *slab) { extent_heap_remove(&bin->slabs_nonfull, slab); } static extent_t * -arena_bin_slabs_nonfull_tryget(arena_bin_t *bin) { +arena_bin_slabs_nonfull_tryget(bin_t *bin) { extent_t *slab = extent_heap_remove_first(&bin->slabs_nonfull); if (slab == NULL) { return NULL; @@ -1105,7 +933,7 @@ arena_bin_slabs_nonfull_tryget(arena_bin_t *bin) { } static void -arena_bin_slabs_full_insert(arena_t *arena, arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_full_insert(arena_t *arena, bin_t *bin, extent_t *slab) { assert(extent_nfree_get(slab) == 0); /* * Tracking extents is required by arena_reset, which is not allowed @@ -1119,7 +947,7 @@ arena_bin_slabs_full_insert(arena_t *arena, arena_bin_t *bin, extent_t *slab) { } static void -arena_bin_slabs_full_remove(arena_t *arena, arena_bin_t *bin, extent_t *slab) { +arena_bin_slabs_full_remove(arena_t *arena, bin_t *bin, extent_t *slab) { if (arena_is_auto(arena)) { return; } @@ -1173,7 +1001,7 @@ arena_reset(tsd_t *tsd, arena_t *arena) { /* Bins. */ for (unsigned i = 0; i < NBINS; i++) { extent_t *slab; - arena_bin_t *bin = &arena->bins[i]; + bin_t *bin = &arena->bins[i]; malloc_mutex_lock(tsd_tsdn(tsd), &bin->lock); if (bin->slabcur != NULL) { slab = bin->slabcur; @@ -1262,7 +1090,7 @@ arena_destroy(tsd_t *tsd, arena_t *arena) { static extent_t * arena_slab_alloc_hard(tsdn_t *tsdn, arena_t *arena, - extent_hooks_t **r_extent_hooks, const arena_bin_info_t *bin_info, + extent_hooks_t **r_extent_hooks, const bin_info_t *bin_info, szind_t szind) { extent_t *slab; bool zero, commit; @@ -1285,7 +1113,7 @@ arena_slab_alloc_hard(tsdn_t *tsdn, arena_t *arena, static extent_t * arena_slab_alloc(tsdn_t *tsdn, arena_t *arena, szind_t binind, - const arena_bin_info_t *bin_info) { + const bin_info_t *bin_info) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -1321,10 +1149,10 @@ arena_slab_alloc(tsdn_t *tsdn, arena_t *arena, szind_t binind, } static extent_t * -arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, +arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, bin_t *bin, szind_t binind) { extent_t *slab; - const arena_bin_info_t *bin_info; + const bin_info_t *bin_info; /* Look for a usable slab. */ slab = arena_bin_slabs_nonfull_tryget(bin); @@ -1333,7 +1161,7 @@ arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, } /* No existing slabs have any space available. */ - bin_info = &arena_bin_info[binind]; + bin_info = &bin_infos[binind]; /* Allocate a new slab. */ malloc_mutex_unlock(tsdn, &bin->lock); @@ -1364,12 +1192,12 @@ arena_bin_nonfull_slab_get(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, /* Re-fill bin->slabcur, then call arena_slab_reg_alloc(). */ static void * -arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, +arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, bin_t *bin, szind_t binind) { - const arena_bin_info_t *bin_info; + const bin_info_t *bin_info; extent_t *slab; - bin_info = &arena_bin_info[binind]; + bin_info = &bin_infos[binind]; if (!arena_is_auto(arena) && bin->slabcur != NULL) { arena_bin_slabs_full_insert(arena, bin, bin->slabcur); bin->slabcur = NULL; @@ -1381,7 +1209,7 @@ arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, * bin lock in arena_bin_nonfull_slab_get(). */ if (extent_nfree_get(bin->slabcur) > 0) { - void *ret = arena_slab_reg_alloc(tsdn, bin->slabcur, + void *ret = arena_slab_reg_alloc(bin->slabcur, bin_info); if (slab != NULL) { /* @@ -1415,14 +1243,14 @@ arena_bin_malloc_hard(tsdn_t *tsdn, arena_t *arena, arena_bin_t *bin, assert(extent_nfree_get(bin->slabcur) > 0); - return arena_slab_reg_alloc(tsdn, slab, bin_info); + return arena_slab_reg_alloc(slab, bin_info); } void arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes) { + cache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes) { unsigned i, nfill; - arena_bin_t *bin; + bin_t *bin; assert(tbin->ncached == 0); @@ -1437,8 +1265,7 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, void *ptr; if ((slab = bin->slabcur) != NULL && extent_nfree_get(slab) > 0) { - ptr = arena_slab_reg_alloc(tsdn, slab, - &arena_bin_info[binind]); + ptr = arena_slab_reg_alloc(slab, &bin_infos[binind]); } else { ptr = arena_bin_malloc_hard(tsdn, arena, bin, binind); } @@ -1455,8 +1282,7 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, break; } if (config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ptr, &arena_bin_info[binind], - true); + arena_alloc_junk_small(ptr, &bin_infos[binind], true); } /* Insert such that low regions get used first. */ *(tbin->avail - nfill + i) = ptr; @@ -1474,14 +1300,14 @@ arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, } void -arena_alloc_junk_small(void *ptr, const arena_bin_info_t *bin_info, bool zero) { +arena_alloc_junk_small(void *ptr, const bin_info_t *bin_info, bool zero) { if (!zero) { memset(ptr, JEMALLOC_ALLOC_JUNK, bin_info->reg_size); } } static void -arena_dalloc_junk_small_impl(void *ptr, const arena_bin_info_t *bin_info) { +arena_dalloc_junk_small_impl(void *ptr, const bin_info_t *bin_info) { memset(ptr, JEMALLOC_FREE_JUNK, bin_info->reg_size); } arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small = @@ -1490,7 +1316,7 @@ arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small = static void * arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { void *ret; - arena_bin_t *bin; + bin_t *bin; size_t usize; extent_t *slab; @@ -1500,7 +1326,7 @@ arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { malloc_mutex_lock(tsdn, &bin->lock); if ((slab = bin->slabcur) != NULL && extent_nfree_get(slab) > 0) { - ret = arena_slab_reg_alloc(tsdn, slab, &arena_bin_info[binind]); + ret = arena_slab_reg_alloc(slab, &bin_infos[binind]); } else { ret = arena_bin_malloc_hard(tsdn, arena, bin, binind); } @@ -1524,14 +1350,14 @@ arena_malloc_small(tsdn_t *tsdn, arena_t *arena, szind_t binind, bool zero) { if (config_fill) { if (unlikely(opt_junk_alloc)) { arena_alloc_junk_small(ret, - &arena_bin_info[binind], false); + &bin_infos[binind], false); } else if (unlikely(opt_zero)) { memset(ret, 0, usize); } } } else { if (config_fill && unlikely(opt_junk_alloc)) { - arena_alloc_junk_small(ret, &arena_bin_info[binind], + arena_alloc_junk_small(ret, &bin_infos[binind], true); } memset(ret, 0, usize); @@ -1636,13 +1462,13 @@ arena_dalloc_promoted(tsdn_t *tsdn, void *ptr, tcache_t *tcache, } static void -arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, arena_bin_t *bin) { +arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, bin_t *bin) { /* Dissociate slab from bin. */ if (slab == bin->slabcur) { bin->slabcur = NULL; } else { szind_t binind = extent_szind_get(slab); - const arena_bin_info_t *bin_info = &arena_bin_info[binind]; + const bin_info_t *bin_info = &bin_infos[binind]; /* * The following block's conditional is necessary because if the @@ -1659,7 +1485,7 @@ arena_dissociate_bin_slab(arena_t *arena, extent_t *slab, arena_bin_t *bin) { static void arena_dalloc_bin_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, - arena_bin_t *bin) { + bin_t *bin) { assert(slab != bin->slabcur); malloc_mutex_unlock(tsdn, &bin->lock); @@ -1673,8 +1499,8 @@ arena_dalloc_bin_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, } static void -arena_bin_lower_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab, - arena_bin_t *bin) { +arena_bin_lower_slab(UNUSED tsdn_t *tsdn, arena_t *arena, extent_t *slab, + bin_t *bin) { assert(extent_nfree_get(slab) > 0); /* @@ -1704,14 +1530,14 @@ arena_dalloc_bin_locked_impl(tsdn_t *tsdn, arena_t *arena, extent_t *slab, void *ptr, bool junked) { arena_slab_data_t *slab_data = extent_slab_data_get(slab); szind_t binind = extent_szind_get(slab); - arena_bin_t *bin = &arena->bins[binind]; - const arena_bin_info_t *bin_info = &arena_bin_info[binind]; + bin_t *bin = &arena->bins[binind]; + const bin_info_t *bin_info = &bin_infos[binind]; if (!junked && config_fill && unlikely(opt_junk_free)) { arena_dalloc_junk_small(ptr, bin_info); } - arena_slab_reg_dalloc(tsdn, slab, slab_data, ptr); + arena_slab_reg_dalloc(slab, slab_data, ptr); unsigned nfree = extent_nfree_get(slab); if (nfree == bin_info->nregs) { arena_dissociate_bin_slab(arena, slab, bin); @@ -1736,7 +1562,7 @@ arena_dalloc_bin_junked_locked(tsdn_t *tsdn, arena_t *arena, extent_t *extent, static void arena_dalloc_bin(tsdn_t *tsdn, arena_t *arena, extent_t *extent, void *ptr) { szind_t binind = extent_szind_get(extent); - arena_bin_t *bin = &arena->bins[binind]; + bin_t *bin = &arena->bins[binind]; malloc_mutex_lock(tsdn, &bin->lock); arena_dalloc_bin_locked_impl(tsdn, arena, extent, ptr, false); @@ -1770,7 +1596,7 @@ arena_ralloc_no_move(tsdn_t *tsdn, void *ptr, size_t oldsize, size_t size, * Avoid moving the allocation if the size class can be left the * same. */ - assert(arena_bin_info[sz_size2index(oldsize)].reg_size == + assert(bin_infos[sz_size2index(oldsize)].reg_size == oldsize); if ((usize_max > SMALL_MAXCLASS || sz_size2index(usize_max) != sz_size2index(oldsize)) && (size > oldsize || usize_max < @@ -1885,6 +1711,33 @@ arena_muzzy_decay_ms_default_set(ssize_t decay_ms) { return false; } +bool +arena_retain_grow_limit_get_set(tsd_t *tsd, arena_t *arena, size_t *old_limit, + size_t *new_limit) { + assert(opt_retain); + + pszind_t new_ind JEMALLOC_CC_SILENCE_INIT(0); + if (new_limit != NULL) { + size_t limit = *new_limit; + /* Grow no more than the new limit. */ + if ((new_ind = sz_psz2ind(limit + 1) - 1) > + EXTENT_GROW_MAX_PIND) { + return true; + } + } + + malloc_mutex_lock(tsd_tsdn(tsd), &arena->extent_grow_mtx); + if (old_limit != NULL) { + *old_limit = sz_pind2sz(arena->retain_grow_limit); + } + if (new_limit != NULL) { + arena->retain_grow_limit = new_ind; + } + malloc_mutex_unlock(tsd_tsdn(tsd), &arena->extent_grow_mtx); + + return false; +} + unsigned arena_nthreads_get(arena_t *arena, bool internal) { return atomic_load_u(&arena->nthreads[internal], ATOMIC_RELAXED); @@ -1935,6 +1788,7 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { } ql_new(&arena->tcache_ql); + ql_new(&arena->cache_bin_array_descriptor_ql); if (malloc_mutex_init(&arena->tcache_ql_mtx, "tcache_ql", WITNESS_RANK_TCACHE_QL, malloc_mutex_rank_exclusive)) { goto label_error; @@ -2001,16 +1855,17 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { goto label_error; } - if (arena_decay_init(&arena->decay_dirty, &arena->extents_dirty, + if (arena_decay_init(&arena->decay_dirty, arena_dirty_decay_ms_default_get(), &arena->stats.decay_dirty)) { goto label_error; } - if (arena_decay_init(&arena->decay_muzzy, &arena->extents_muzzy, + if (arena_decay_init(&arena->decay_muzzy, arena_muzzy_decay_ms_default_get(), &arena->stats.decay_muzzy)) { goto label_error; } arena->extent_grow_next = sz_psz2ind(HUGEPAGE); + arena->retain_grow_limit = EXTENT_GROW_MAX_PIND; if (malloc_mutex_init(&arena->extent_grow_mtx, "extent_grow", WITNESS_RANK_EXTENT_GROW, malloc_mutex_rank_exclusive)) { goto label_error; @@ -2024,17 +1879,10 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { /* Initialize bins. */ for (i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - if (malloc_mutex_init(&bin->lock, "arena_bin", - WITNESS_RANK_ARENA_BIN, malloc_mutex_rank_exclusive)) { + bool err = bin_init(&arena->bins[i]); + if (err) { goto label_error; } - bin->slabcur = NULL; - extent_heap_new(&bin->slabs_nonfull); - extent_list_init(&bin->slabs_full); - if (config_stats) { - memset(&bin->stats, 0, sizeof(malloc_bin_stats_t)); - } } arena->base = base; @@ -2070,6 +1918,16 @@ void arena_boot(void) { arena_dirty_decay_ms_default_set(opt_dirty_decay_ms); arena_muzzy_decay_ms_default_set(opt_muzzy_decay_ms); +#define REGIND_bin_yes(index, reg_size) \ + div_init(&arena_binind_div_info[(index)], (reg_size)); +#define REGIND_bin_no(index, reg_size) +#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ + lg_delta_lookup) \ + REGIND_bin_##bin(index, (1U<bins[i].lock); + bin_prefork(tsdn, &arena->bins[i]); } } @@ -2124,7 +1982,7 @@ arena_postfork_parent(tsdn_t *tsdn, arena_t *arena) { unsigned i; for (i = 0; i < NBINS; i++) { - malloc_mutex_postfork_parent(tsdn, &arena->bins[i].lock); + bin_postfork_parent(tsdn, &arena->bins[i]); } malloc_mutex_postfork_parent(tsdn, &arena->large_mtx); base_postfork_parent(tsdn, arena->base); @@ -2154,15 +2012,21 @@ arena_postfork_child(tsdn_t *tsdn, arena_t *arena) { } if (config_stats) { ql_new(&arena->tcache_ql); + ql_new(&arena->cache_bin_array_descriptor_ql); tcache_t *tcache = tcache_get(tsdn_tsd(tsdn)); if (tcache != NULL && tcache->arena == arena) { ql_elm_new(tcache, link); ql_tail_insert(&arena->tcache_ql, tcache, link); + cache_bin_array_descriptor_init( + &tcache->cache_bin_array_descriptor, + tcache->bins_small, tcache->bins_large); + ql_tail_insert(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); } } for (i = 0; i < NBINS; i++) { - malloc_mutex_postfork_child(tsdn, &arena->bins[i].lock); + bin_postfork_child(tsdn, &arena->bins[i]); } malloc_mutex_postfork_child(tsdn, &arena->large_mtx); base_postfork_child(tsdn, arena->base); diff --git a/dep/jemalloc/src/background_thread.c b/dep/jemalloc/src/background_thread.c index eb30eb5b423..3517a3bb8ed 100644 --- a/dep/jemalloc/src/background_thread.c +++ b/dep/jemalloc/src/background_thread.c @@ -11,12 +11,14 @@ #define BACKGROUND_THREAD_DEFAULT false /* Read-only after initialization. */ bool opt_background_thread = BACKGROUND_THREAD_DEFAULT; +size_t opt_max_background_threads = MAX_BACKGROUND_THREAD_LIMIT; /* Used for thread creation, termination and stats. */ malloc_mutex_t background_thread_lock; /* Indicates global state. Atomic because decay reads this w/o locking. */ atomic_b_t background_thread_enabled_state; size_t n_background_threads; +size_t max_background_threads; /* Thread info per-index. */ background_thread_info_t *background_thread_info; @@ -30,19 +32,20 @@ bool can_enable_background_thread; static int (*pthread_create_fptr)(pthread_t *__restrict, const pthread_attr_t *, void *(*)(void *), void *__restrict); -static pthread_once_t once_control = PTHREAD_ONCE_INIT; static void -pthread_create_wrapper_once(void) { +pthread_create_wrapper_init(void) { #ifdef JEMALLOC_LAZY_LOCK - isthreaded = true; + if (!isthreaded) { + isthreaded = true; + } #endif } int pthread_create_wrapper(pthread_t *__restrict thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *__restrict arg) { - pthread_once(&once_control, pthread_create_wrapper_once); + pthread_create_wrapper_init(); return pthread_create_fptr(thread, attr, start_routine, arg); } @@ -286,7 +289,7 @@ background_work_sleep_once(tsdn_t *tsdn, background_thread_info_t *info, unsigne uint64_t min_interval = BACKGROUND_THREAD_INDEFINITE_SLEEP; unsigned narenas = narenas_total_get(); - for (unsigned i = ind; i < narenas; i += ncpus) { + for (unsigned i = ind; i < narenas; i += max_background_threads) { arena_t *arena = arena_get(tsdn, i, false); if (!arena) { continue; @@ -379,35 +382,32 @@ background_thread_create_signals_masked(pthread_t *thread, return create_err; } -static void +static bool check_background_thread_creation(tsd_t *tsd, unsigned *n_created, bool *created_threads) { + bool ret = false; if (likely(*n_created == n_background_threads)) { - return; + return ret; } - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_info[0].mtx); -label_restart: - malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); - for (unsigned i = 1; i < ncpus; i++) { + tsdn_t *tsdn = tsd_tsdn(tsd); + malloc_mutex_unlock(tsdn, &background_thread_info[0].mtx); + for (unsigned i = 1; i < max_background_threads; i++) { if (created_threads[i]) { continue; } background_thread_info_t *info = &background_thread_info[i]; - malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); - assert(info->state != background_thread_paused); + malloc_mutex_lock(tsdn, &info->mtx); + /* + * In case of the background_thread_paused state because of + * arena reset, delay the creation. + */ bool create = (info->state == background_thread_started); - malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); + malloc_mutex_unlock(tsdn, &info->mtx); if (!create) { continue; } - /* - * To avoid deadlock with prefork handlers (which waits for the - * mutex held here), unlock before calling pthread_create(). - */ - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); - pre_reentrancy(tsd, NULL); int err = background_thread_create_signals_masked(&info->thread, NULL, background_thread_entry, (void *)(uintptr_t)i); @@ -423,19 +423,21 @@ label_restart: abort(); } } - /* Restart since we unlocked. */ - goto label_restart; + /* Return to restart the loop since we unlocked. */ + ret = true; + break; } - malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_info[0].mtx); - malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); + malloc_mutex_lock(tsdn, &background_thread_info[0].mtx); + + return ret; } static void background_thread0_work(tsd_t *tsd) { /* Thread0 is also responsible for launching / terminating threads. */ - VARIABLE_ARRAY(bool, created_threads, ncpus); + VARIABLE_ARRAY(bool, created_threads, max_background_threads); unsigned i; - for (i = 1; i < ncpus; i++) { + for (i = 1; i < max_background_threads; i++) { created_threads[i] = false; } /* Start working, and create more threads when asked. */ @@ -445,8 +447,10 @@ background_thread0_work(tsd_t *tsd) { &background_thread_info[0])) { continue; } - check_background_thread_creation(tsd, &n_created, - (bool *)&created_threads); + if (check_background_thread_creation(tsd, &n_created, + (bool *)&created_threads)) { + continue; + } background_work_sleep_once(tsd_tsdn(tsd), &background_thread_info[0], 0); } @@ -456,15 +460,20 @@ background_thread0_work(tsd_t *tsd) { * the global background_thread mutex (and is waiting) for us. */ assert(!background_thread_enabled()); - for (i = 1; i < ncpus; i++) { + for (i = 1; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; assert(info->state != background_thread_paused); if (created_threads[i]) { background_threads_disable_single(tsd, info); } else { malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); - /* Clear in case the thread wasn't created. */ - info->state = background_thread_stopped; + if (info->state != background_thread_stopped) { + /* The thread was not created. */ + assert(info->state == + background_thread_started); + n_background_threads--; + info->state = background_thread_stopped; + } malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); } } @@ -498,7 +507,7 @@ background_work(tsd_t *tsd, unsigned ind) { static void * background_thread_entry(void *ind_arg) { unsigned thread_ind = (unsigned)(uintptr_t)ind_arg; - assert(thread_ind < ncpus); + assert(thread_ind < max_background_threads); #ifdef JEMALLOC_HAVE_PTHREAD_SETNAME_NP pthread_setname_np(pthread_self(), "jemalloc_bg_thd"); #endif @@ -532,7 +541,7 @@ background_thread_create(tsd_t *tsd, unsigned arena_ind) { malloc_mutex_assert_owner(tsd_tsdn(tsd), &background_thread_lock); /* We create at most NCPUs threads. */ - size_t thread_ind = arena_ind % ncpus; + size_t thread_ind = arena_ind % max_background_threads; background_thread_info_t *info = &background_thread_info[thread_ind]; bool need_new_thread; @@ -586,26 +595,29 @@ background_threads_enable(tsd_t *tsd) { assert(background_thread_enabled()); malloc_mutex_assert_owner(tsd_tsdn(tsd), &background_thread_lock); - VARIABLE_ARRAY(bool, marked, ncpus); + VARIABLE_ARRAY(bool, marked, max_background_threads); unsigned i, nmarked; - for (i = 0; i < ncpus; i++) { + for (i = 0; i < max_background_threads; i++) { marked[i] = false; } nmarked = 0; + /* Thread 0 is required and created at the end. */ + marked[0] = true; /* Mark the threads we need to create for thread 0. */ unsigned n = narenas_total_get(); for (i = 1; i < n; i++) { - if (marked[i % ncpus] || + if (marked[i % max_background_threads] || arena_get(tsd_tsdn(tsd), i, false) == NULL) { continue; } - background_thread_info_t *info = &background_thread_info[i]; + background_thread_info_t *info = &background_thread_info[ + i % max_background_threads]; malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx); assert(info->state == background_thread_stopped); background_thread_init(tsd, info); malloc_mutex_unlock(tsd_tsdn(tsd), &info->mtx); - marked[i % ncpus] = true; - if (++nmarked == ncpus) { + marked[i % max_background_threads] = true; + if (++nmarked == max_background_threads) { break; } } @@ -720,14 +732,14 @@ background_thread_prefork0(tsdn_t *tsdn) { void background_thread_prefork1(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_prefork(tsdn, &background_thread_info[i].mtx); } } void background_thread_postfork_parent(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_postfork_parent(tsdn, &background_thread_info[i].mtx); } @@ -736,7 +748,7 @@ background_thread_postfork_parent(tsdn_t *tsdn) { void background_thread_postfork_child(tsdn_t *tsdn) { - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { malloc_mutex_postfork_child(tsdn, &background_thread_info[i].mtx); } @@ -749,7 +761,7 @@ background_thread_postfork_child(tsdn_t *tsdn) { malloc_mutex_lock(tsdn, &background_thread_lock); n_background_threads = 0; background_thread_enabled_set(tsdn, false); - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; malloc_mutex_lock(tsdn, &info->mtx); info->state = background_thread_stopped; @@ -773,7 +785,7 @@ background_thread_stats_read(tsdn_t *tsdn, background_thread_stats_t *stats) { stats->num_threads = n_background_threads; uint64_t num_runs = 0; nstime_init(&stats->run_interval, 0); - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; malloc_mutex_lock(tsdn, &info->mtx); if (info->state != background_thread_stopped) { @@ -795,6 +807,26 @@ background_thread_stats_read(tsdn_t *tsdn, background_thread_stats_t *stats) { #undef BILLION #undef BACKGROUND_THREAD_MIN_INTERVAL_NS +static bool +pthread_create_fptr_init(void) { + if (pthread_create_fptr != NULL) { + return false; + } + pthread_create_fptr = dlsym(RTLD_NEXT, "pthread_create"); + if (pthread_create_fptr == NULL) { + can_enable_background_thread = false; + if (config_lazy_lock || opt_background_thread) { + malloc_write(": Error in dlsym(RTLD_NEXT, " + "\"pthread_create\")\n"); + abort(); + } + } else { + can_enable_background_thread = true; + } + + return false; +} + /* * When lazy lock is enabled, we need to make sure setting isthreaded before * taking any background_thread locks. This is called early in ctl (instead of @@ -805,7 +837,8 @@ void background_thread_ctl_init(tsdn_t *tsdn) { malloc_mutex_assert_not_owner(tsdn, &background_thread_lock); #ifdef JEMALLOC_PTHREAD_CREATE_WRAPPER - pthread_once(&once_control, pthread_create_wrapper_once); + pthread_create_fptr_init(); + pthread_create_wrapper_init(); #endif } @@ -818,18 +851,10 @@ background_thread_boot0(void) { "supports pthread only\n"); return true; } - #ifdef JEMALLOC_PTHREAD_CREATE_WRAPPER - pthread_create_fptr = dlsym(RTLD_NEXT, "pthread_create"); - if (pthread_create_fptr == NULL) { - can_enable_background_thread = false; - if (config_lazy_lock || opt_background_thread) { - malloc_write(": Error in dlsym(RTLD_NEXT, " - "\"pthread_create\")\n"); - abort(); - } - } else { - can_enable_background_thread = true; + if ((config_lazy_lock || opt_background_thread) && + pthread_create_fptr_init()) { + return true; } #endif return false; @@ -841,6 +866,12 @@ background_thread_boot1(tsdn_t *tsdn) { assert(have_background_thread); assert(narenas_total_get() > 0); + if (opt_max_background_threads == MAX_BACKGROUND_THREAD_LIMIT && + ncpus < MAX_BACKGROUND_THREAD_LIMIT) { + opt_max_background_threads = ncpus; + } + max_background_threads = opt_max_background_threads; + background_thread_enabled_set(tsdn, opt_background_thread); if (malloc_mutex_init(&background_thread_lock, "background_thread_global", @@ -848,17 +879,15 @@ background_thread_boot1(tsdn_t *tsdn) { malloc_mutex_rank_exclusive)) { return true; } - if (opt_background_thread) { - background_thread_ctl_init(tsdn); - } background_thread_info = (background_thread_info_t *)base_alloc(tsdn, - b0get(), ncpus * sizeof(background_thread_info_t), CACHELINE); + b0get(), opt_max_background_threads * + sizeof(background_thread_info_t), CACHELINE); if (background_thread_info == NULL) { return true; } - for (unsigned i = 0; i < ncpus; i++) { + for (unsigned i = 0; i < max_background_threads; i++) { background_thread_info_t *info = &background_thread_info[i]; /* Thread mutex is rank_inclusive because of thread0. */ if (malloc_mutex_init(&info->mtx, "background_thread", diff --git a/dep/jemalloc/src/base.c b/dep/jemalloc/src/base.c index 97078b134d1..b0324b5d758 100644 --- a/dep/jemalloc/src/base.c +++ b/dep/jemalloc/src/base.c @@ -10,25 +10,40 @@ /******************************************************************************/ /* Data. */ -static base_t *b0; +static base_t *b0; + +metadata_thp_mode_t opt_metadata_thp = METADATA_THP_DEFAULT; + +const char *metadata_thp_mode_names[] = { + "disabled", + "auto", + "always" +}; /******************************************************************************/ +static inline bool +metadata_thp_madvise(void) { + return (metadata_thp_enabled() && + (init_system_thp_mode == thp_mode_default)); +} + static void * base_map(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, size_t size) { void *addr; bool zero = true; bool commit = true; + /* Use huge page sizes and alignment regardless of opt_metadata_thp. */ assert(size == HUGEPAGE_CEILING(size)); - + size_t alignment = HUGEPAGE; if (extent_hooks == &extent_hooks_default) { - addr = extent_alloc_mmap(NULL, size, PAGE, &zero, &commit); + addr = extent_alloc_mmap(NULL, size, alignment, &zero, &commit); } else { /* No arena context as we are creating new arenas. */ tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn); pre_reentrancy(tsd, NULL); - addr = extent_hooks->alloc(extent_hooks, NULL, size, PAGE, + addr = extent_hooks->alloc(extent_hooks, NULL, size, alignment, &zero, &commit, ind); post_reentrancy(tsd); } @@ -51,16 +66,16 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr, */ if (extent_hooks == &extent_hooks_default) { if (!extent_dalloc_mmap(addr, size)) { - return; + goto label_done; } if (!pages_decommit(addr, size)) { - return; + goto label_done; } if (!pages_purge_forced(addr, size)) { - return; + goto label_done; } if (!pages_purge_lazy(addr, size)) { - return; + goto label_done; } /* Nothing worked. This should never happen. */ not_reached(); @@ -70,27 +85,33 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr, if (extent_hooks->dalloc != NULL && !extent_hooks->dalloc(extent_hooks, addr, size, true, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->decommit != NULL && !extent_hooks->decommit(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->purge_forced != NULL && !extent_hooks->purge_forced(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } if (extent_hooks->purge_lazy != NULL && !extent_hooks->purge_lazy(extent_hooks, addr, size, 0, size, ind)) { - goto label_done; + goto label_post_reentrancy; } /* Nothing worked. That's the application's problem. */ - label_done: + label_post_reentrancy: post_reentrancy(tsd); - return; + } +label_done: + if (metadata_thp_madvise()) { + /* Set NOHUGEPAGE after unmap to avoid kernel defrag. */ + assert(((uintptr_t)addr & HUGEPAGE_MASK) == 0 && + (size & HUGEPAGE_MASK) == 0); + pages_nohuge(addr, size); } } @@ -105,6 +126,56 @@ base_extent_init(size_t *extent_sn_next, extent_t *extent, void *addr, extent_binit(extent, addr, size, sn); } +static size_t +base_get_num_blocks(base_t *base, bool with_new_block) { + base_block_t *b = base->blocks; + assert(b != NULL); + + size_t n_blocks = with_new_block ? 2 : 1; + while (b->next != NULL) { + n_blocks++; + b = b->next; + } + + return n_blocks; +} + +static void +base_auto_thp_switch(tsdn_t *tsdn, base_t *base) { + assert(opt_metadata_thp == metadata_thp_auto); + malloc_mutex_assert_owner(tsdn, &base->mtx); + if (base->auto_thp_switched) { + return; + } + /* Called when adding a new block. */ + bool should_switch; + if (base_ind_get(base) != 0) { + should_switch = (base_get_num_blocks(base, true) == + BASE_AUTO_THP_THRESHOLD); + } else { + should_switch = (base_get_num_blocks(base, true) == + BASE_AUTO_THP_THRESHOLD_A0); + } + if (!should_switch) { + return; + } + + base->auto_thp_switched = true; + assert(!config_stats || base->n_thp == 0); + /* Make the initial blocks THP lazily. */ + base_block_t *block = base->blocks; + while (block != NULL) { + assert((block->size & HUGEPAGE_MASK) == 0); + pages_huge(block, block->size); + if (config_stats) { + base->n_thp += HUGEPAGE_CEILING(block->size - + extent_bsize_get(&block->extent)) >> LG_HUGEPAGE; + } + block = block->next; + assert(block == NULL || (base_ind_get(base) == 0)); + } +} + static void * base_extent_bump_alloc_helper(extent_t *extent, size_t *gap_size, size_t size, size_t alignment) { @@ -124,8 +195,8 @@ base_extent_bump_alloc_helper(extent_t *extent, size_t *gap_size, size_t size, } static void -base_extent_bump_alloc_post(tsdn_t *tsdn, base_t *base, extent_t *extent, - size_t gap_size, void *addr, size_t size) { +base_extent_bump_alloc_post(base_t *base, extent_t *extent, size_t gap_size, + void *addr, size_t size) { if (extent_bsize_get(extent) > 0) { /* * Compute the index for the largest size class that does not @@ -140,23 +211,31 @@ base_extent_bump_alloc_post(tsdn_t *tsdn, base_t *base, extent_t *extent, base->allocated += size; /* * Add one PAGE to base_resident for every page boundary that is - * crossed by the new allocation. + * crossed by the new allocation. Adjust n_thp similarly when + * metadata_thp is enabled. */ base->resident += PAGE_CEILING((uintptr_t)addr + size) - PAGE_CEILING((uintptr_t)addr - gap_size); assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + if (metadata_thp_madvise() && (opt_metadata_thp == + metadata_thp_always || base->auto_thp_switched)) { + base->n_thp += (HUGEPAGE_CEILING((uintptr_t)addr + size) + - HUGEPAGE_CEILING((uintptr_t)addr - gap_size)) >> + LG_HUGEPAGE; + assert(base->mapped >= base->n_thp << LG_HUGEPAGE); + } } } static void * -base_extent_bump_alloc(tsdn_t *tsdn, base_t *base, extent_t *extent, - size_t size, size_t alignment) { +base_extent_bump_alloc(base_t *base, extent_t *extent, size_t size, + size_t alignment) { void *ret; size_t gap_size; ret = base_extent_bump_alloc_helper(extent, &gap_size, size, alignment); - base_extent_bump_alloc_post(tsdn, base, extent, gap_size, ret, size); + base_extent_bump_alloc_post(base, extent, gap_size, ret, size); return ret; } @@ -166,8 +245,8 @@ base_extent_bump_alloc(tsdn_t *tsdn, base_t *base, extent_t *extent, * On success a pointer to the initialized base_block_t header is returned. */ static base_block_t * -base_block_alloc(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, - pszind_t *pind_last, size_t *extent_sn_next, size_t size, +base_block_alloc(tsdn_t *tsdn, base_t *base, extent_hooks_t *extent_hooks, + unsigned ind, pszind_t *pind_last, size_t *extent_sn_next, size_t size, size_t alignment) { alignment = ALIGNMENT_CEILING(alignment, QUANTUM); size_t usize = ALIGNMENT_CEILING(size, alignment); @@ -193,6 +272,25 @@ base_block_alloc(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, if (block == NULL) { return NULL; } + + if (metadata_thp_madvise()) { + void *addr = (void *)block; + assert(((uintptr_t)addr & HUGEPAGE_MASK) == 0 && + (block_size & HUGEPAGE_MASK) == 0); + if (opt_metadata_thp == metadata_thp_always) { + pages_huge(addr, block_size); + } else if (opt_metadata_thp == metadata_thp_auto && + base != NULL) { + /* base != NULL indicates this is not a new base. */ + malloc_mutex_lock(tsdn, &base->mtx); + base_auto_thp_switch(tsdn, base); + if (base->auto_thp_switched) { + pages_huge(addr, block_size); + } + malloc_mutex_unlock(tsdn, &base->mtx); + } + } + *pind_last = sz_psz2ind(block_size); block->size = block_size; block->next = NULL; @@ -216,7 +314,7 @@ base_extent_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment) { * called. */ malloc_mutex_unlock(tsdn, &base->mtx); - base_block_t *block = base_block_alloc(tsdn, extent_hooks, + base_block_t *block = base_block_alloc(tsdn, base, extent_hooks, base_ind_get(base), &base->pind_last, &base->extent_sn_next, size, alignment); malloc_mutex_lock(tsdn, &base->mtx); @@ -229,8 +327,16 @@ base_extent_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment) { base->allocated += sizeof(base_block_t); base->resident += PAGE_CEILING(sizeof(base_block_t)); base->mapped += block->size; + if (metadata_thp_madvise() && + !(opt_metadata_thp == metadata_thp_auto + && !base->auto_thp_switched)) { + assert(base->n_thp > 0); + base->n_thp += HUGEPAGE_CEILING(sizeof(base_block_t)) >> + LG_HUGEPAGE; + } assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + assert(base->n_thp << LG_HUGEPAGE <= base->mapped); } return &block->extent; } @@ -244,7 +350,7 @@ base_t * base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { pszind_t pind_last = 0; size_t extent_sn_next = 0; - base_block_t *block = base_block_alloc(tsdn, extent_hooks, ind, + base_block_t *block = base_block_alloc(tsdn, NULL, extent_hooks, ind, &pind_last, &extent_sn_next, sizeof(base_t), QUANTUM); if (block == NULL) { return NULL; @@ -265,6 +371,7 @@ base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { base->pind_last = pind_last; base->extent_sn_next = extent_sn_next; base->blocks = block; + base->auto_thp_switched = false; for (szind_t i = 0; i < NSIZES; i++) { extent_heap_new(&base->avail[i]); } @@ -272,10 +379,14 @@ base_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { base->allocated = sizeof(base_block_t); base->resident = PAGE_CEILING(sizeof(base_block_t)); base->mapped = block->size; + base->n_thp = (opt_metadata_thp == metadata_thp_always) && + metadata_thp_madvise() ? HUGEPAGE_CEILING(sizeof(base_block_t)) + >> LG_HUGEPAGE : 0; assert(base->allocated <= base->resident); assert(base->resident <= base->mapped); + assert(base->n_thp << LG_HUGEPAGE <= base->mapped); } - base_extent_bump_alloc_post(tsdn, base, &block->extent, gap_size, base, + base_extent_bump_alloc_post(base, &block->extent, gap_size, base, base_size); return base; @@ -332,7 +443,7 @@ base_alloc_impl(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment, goto label_return; } - ret = base_extent_bump_alloc(tsdn, base, extent, usize, alignment); + ret = base_extent_bump_alloc(base, extent, usize, alignment); if (esn != NULL) { *esn = extent_sn_get(extent); } @@ -368,7 +479,7 @@ base_alloc_extent(tsdn_t *tsdn, base_t *base) { void base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, size_t *resident, - size_t *mapped) { + size_t *mapped, size_t *n_thp) { cassert(config_stats); malloc_mutex_lock(tsdn, &base->mtx); @@ -377,6 +488,7 @@ base_stats_get(tsdn_t *tsdn, base_t *base, size_t *allocated, size_t *resident, *allocated = base->allocated; *resident = base->resident; *mapped = base->mapped; + *n_thp = base->n_thp; malloc_mutex_unlock(tsdn, &base->mtx); } diff --git a/dep/jemalloc/src/bin.c b/dep/jemalloc/src/bin.c new file mode 100644 index 00000000000..0886bc4ea92 --- /dev/null +++ b/dep/jemalloc/src/bin.c @@ -0,0 +1,50 @@ +#include "jemalloc/internal/jemalloc_preamble.h" +#include "jemalloc/internal/jemalloc_internal_includes.h" + +#include "jemalloc/internal/bin.h" +#include "jemalloc/internal/witness.h" + +const bin_info_t bin_infos[NBINS] = { +#define BIN_INFO_bin_yes(reg_size, slab_size, nregs) \ + {reg_size, slab_size, nregs, BITMAP_INFO_INITIALIZER(nregs)}, +#define BIN_INFO_bin_no(reg_size, slab_size, nregs) +#define SC(index, lg_grp, lg_delta, ndelta, psz, bin, pgs, \ + lg_delta_lookup) \ + BIN_INFO_bin_##bin((1U<lock, "bin", WITNESS_RANK_BIN, + malloc_mutex_rank_exclusive)) { + return true; + } + bin->slabcur = NULL; + extent_heap_new(&bin->slabs_nonfull); + extent_list_init(&bin->slabs_full); + if (config_stats) { + memset(&bin->stats, 0, sizeof(bin_stats_t)); + } + return false; +} + +void +bin_prefork(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_prefork(tsdn, &bin->lock); +} + +void +bin_postfork_parent(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_postfork_parent(tsdn, &bin->lock); +} + +void +bin_postfork_child(tsdn_t *tsdn, bin_t *bin) { + malloc_mutex_postfork_child(tsdn, &bin->lock); +} diff --git a/dep/jemalloc/src/ctl.c b/dep/jemalloc/src/ctl.c index 36bc8fb5b75..1e713a3d104 100644 --- a/dep/jemalloc/src/ctl.c +++ b/dep/jemalloc/src/ctl.c @@ -57,6 +57,7 @@ static const ctl_named_node_t *n##_index(tsdn_t *tsdn, \ CTL_PROTO(version) CTL_PROTO(epoch) CTL_PROTO(background_thread) +CTL_PROTO(max_background_threads) CTL_PROTO(thread_tcache_enabled) CTL_PROTO(thread_tcache_flush) CTL_PROTO(thread_prof_name) @@ -75,16 +76,17 @@ CTL_PROTO(config_prof) CTL_PROTO(config_prof_libgcc) CTL_PROTO(config_prof_libunwind) CTL_PROTO(config_stats) -CTL_PROTO(config_thp) CTL_PROTO(config_utrace) CTL_PROTO(config_xmalloc) CTL_PROTO(opt_abort) CTL_PROTO(opt_abort_conf) +CTL_PROTO(opt_metadata_thp) CTL_PROTO(opt_retain) CTL_PROTO(opt_dss) CTL_PROTO(opt_narenas) CTL_PROTO(opt_percpu_arena) CTL_PROTO(opt_background_thread) +CTL_PROTO(opt_max_background_threads) CTL_PROTO(opt_dirty_decay_ms) CTL_PROTO(opt_muzzy_decay_ms) CTL_PROTO(opt_stats_print) @@ -94,6 +96,8 @@ CTL_PROTO(opt_zero) CTL_PROTO(opt_utrace) CTL_PROTO(opt_xmalloc) CTL_PROTO(opt_tcache) +CTL_PROTO(opt_thp) +CTL_PROTO(opt_lg_extent_max_active_fit) CTL_PROTO(opt_lg_tcache_max) CTL_PROTO(opt_prof) CTL_PROTO(opt_prof_prefix) @@ -117,6 +121,7 @@ CTL_PROTO(arena_i_dss) CTL_PROTO(arena_i_dirty_decay_ms) CTL_PROTO(arena_i_muzzy_decay_ms) CTL_PROTO(arena_i_extent_hooks) +CTL_PROTO(arena_i_retain_grow_limit) INDEX_PROTO(arena_i) CTL_PROTO(arenas_bin_i_size) CTL_PROTO(arenas_bin_i_nregs) @@ -134,6 +139,7 @@ CTL_PROTO(arenas_nbins) CTL_PROTO(arenas_nhbins) CTL_PROTO(arenas_nlextents) CTL_PROTO(arenas_create) +CTL_PROTO(arenas_lookup) CTL_PROTO(prof_thread_active_init) CTL_PROTO(prof_active) CTL_PROTO(prof_dump) @@ -182,6 +188,7 @@ CTL_PROTO(stats_arenas_i_muzzy_nmadvise) CTL_PROTO(stats_arenas_i_muzzy_purged) CTL_PROTO(stats_arenas_i_base) CTL_PROTO(stats_arenas_i_internal) +CTL_PROTO(stats_arenas_i_metadata_thp) CTL_PROTO(stats_arenas_i_tcache_bytes) CTL_PROTO(stats_arenas_i_resident) INDEX_PROTO(stats_arenas_i) @@ -191,6 +198,7 @@ CTL_PROTO(stats_background_thread_num_threads) CTL_PROTO(stats_background_thread_num_runs) CTL_PROTO(stats_background_thread_run_interval) CTL_PROTO(stats_metadata) +CTL_PROTO(stats_metadata_thp) CTL_PROTO(stats_resident) CTL_PROTO(stats_mapped) CTL_PROTO(stats_retained) @@ -266,7 +274,6 @@ static const ctl_named_node_t config_node[] = { {NAME("prof_libgcc"), CTL(config_prof_libgcc)}, {NAME("prof_libunwind"), CTL(config_prof_libunwind)}, {NAME("stats"), CTL(config_stats)}, - {NAME("thp"), CTL(config_thp)}, {NAME("utrace"), CTL(config_utrace)}, {NAME("xmalloc"), CTL(config_xmalloc)} }; @@ -274,11 +281,13 @@ static const ctl_named_node_t config_node[] = { static const ctl_named_node_t opt_node[] = { {NAME("abort"), CTL(opt_abort)}, {NAME("abort_conf"), CTL(opt_abort_conf)}, + {NAME("metadata_thp"), CTL(opt_metadata_thp)}, {NAME("retain"), CTL(opt_retain)}, {NAME("dss"), CTL(opt_dss)}, {NAME("narenas"), CTL(opt_narenas)}, {NAME("percpu_arena"), CTL(opt_percpu_arena)}, {NAME("background_thread"), CTL(opt_background_thread)}, + {NAME("max_background_threads"), CTL(opt_max_background_threads)}, {NAME("dirty_decay_ms"), CTL(opt_dirty_decay_ms)}, {NAME("muzzy_decay_ms"), CTL(opt_muzzy_decay_ms)}, {NAME("stats_print"), CTL(opt_stats_print)}, @@ -288,6 +297,8 @@ static const ctl_named_node_t opt_node[] = { {NAME("utrace"), CTL(opt_utrace)}, {NAME("xmalloc"), CTL(opt_xmalloc)}, {NAME("tcache"), CTL(opt_tcache)}, + {NAME("thp"), CTL(opt_thp)}, + {NAME("lg_extent_max_active_fit"), CTL(opt_lg_extent_max_active_fit)}, {NAME("lg_tcache_max"), CTL(opt_lg_tcache_max)}, {NAME("prof"), CTL(opt_prof)}, {NAME("prof_prefix"), CTL(opt_prof_prefix)}, @@ -316,7 +327,8 @@ static const ctl_named_node_t arena_i_node[] = { {NAME("dss"), CTL(arena_i_dss)}, {NAME("dirty_decay_ms"), CTL(arena_i_dirty_decay_ms)}, {NAME("muzzy_decay_ms"), CTL(arena_i_muzzy_decay_ms)}, - {NAME("extent_hooks"), CTL(arena_i_extent_hooks)} + {NAME("extent_hooks"), CTL(arena_i_extent_hooks)}, + {NAME("retain_grow_limit"), CTL(arena_i_retain_grow_limit)} }; static const ctl_named_node_t super_arena_i_node[] = { {NAME(""), CHILD(named, arena_i)} @@ -362,7 +374,8 @@ static const ctl_named_node_t arenas_node[] = { {NAME("bin"), CHILD(indexed, arenas_bin)}, {NAME("nlextents"), CTL(arenas_nlextents)}, {NAME("lextent"), CHILD(indexed, arenas_lextent)}, - {NAME("create"), CTL(arenas_create)} + {NAME("create"), CTL(arenas_create)}, + {NAME("lookup"), CTL(arenas_lookup)} }; static const ctl_named_node_t prof_node[] = { @@ -474,6 +487,7 @@ static const ctl_named_node_t stats_arenas_i_node[] = { {NAME("muzzy_purged"), CTL(stats_arenas_i_muzzy_purged)}, {NAME("base"), CTL(stats_arenas_i_base)}, {NAME("internal"), CTL(stats_arenas_i_internal)}, + {NAME("metadata_thp"), CTL(stats_arenas_i_metadata_thp)}, {NAME("tcache_bytes"), CTL(stats_arenas_i_tcache_bytes)}, {NAME("resident"), CTL(stats_arenas_i_resident)}, {NAME("small"), CHILD(named, stats_arenas_i_small)}, @@ -512,6 +526,7 @@ static const ctl_named_node_t stats_node[] = { {NAME("allocated"), CTL(stats_allocated)}, {NAME("active"), CTL(stats_active)}, {NAME("metadata"), CTL(stats_metadata)}, + {NAME("metadata_thp"), CTL(stats_metadata_thp)}, {NAME("resident"), CTL(stats_resident)}, {NAME("mapped"), CTL(stats_mapped)}, {NAME("retained"), CTL(stats_retained)}, @@ -525,6 +540,7 @@ static const ctl_named_node_t root_node[] = { {NAME("version"), CTL(version)}, {NAME("epoch"), CTL(epoch)}, {NAME("background_thread"), CTL(background_thread)}, + {NAME("max_background_threads"), CTL(max_background_threads)}, {NAME("thread"), CHILD(named, thread)}, {NAME("config"), CHILD(named, config)}, {NAME("opt"), CHILD(named, opt)}, @@ -550,7 +566,7 @@ static const ctl_named_node_t super_root_node[] = { * synchronized by the ctl mutex. */ static void -accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { +ctl_accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { #ifdef JEMALLOC_ATOMIC_U64 uint64_t cur_dst = atomic_load_u64(dst, ATOMIC_RELAXED); uint64_t cur_src = atomic_load_u64(src, ATOMIC_RELAXED); @@ -562,7 +578,7 @@ accum_arena_stats_u64(arena_stats_u64_t *dst, arena_stats_u64_t *src) { /* Likewise: with ctl mutex synchronization, reading is simple. */ static uint64_t -arena_stats_read_u64(arena_stats_u64_t *p) { +ctl_arena_stats_read_u64(arena_stats_u64_t *p) { #ifdef JEMALLOC_ATOMIC_U64 return atomic_load_u64(p, ATOMIC_RELAXED); #else @@ -570,7 +586,8 @@ arena_stats_read_u64(arena_stats_u64_t *p) { #endif } -static void accum_atomic_zu(atomic_zu_t *dst, atomic_zu_t *src) { +static void +accum_atomic_zu(atomic_zu_t *dst, atomic_zu_t *src) { size_t cur_dst = atomic_load_zu(dst, ATOMIC_RELAXED); size_t cur_src = atomic_load_zu(src, ATOMIC_RELAXED); atomic_store_zu(dst, cur_dst + cur_src, ATOMIC_RELAXED); @@ -680,9 +697,9 @@ ctl_arena_clear(ctl_arena_t *ctl_arena) { ctl_arena->astats->ndalloc_small = 0; ctl_arena->astats->nrequests_small = 0; memset(ctl_arena->astats->bstats, 0, NBINS * - sizeof(malloc_bin_stats_t)); + sizeof(bin_stats_t)); memset(ctl_arena->astats->lstats, 0, (NSIZES - NBINS) * - sizeof(malloc_large_stats_t)); + sizeof(arena_stats_large_t)); } } @@ -745,18 +762,18 @@ ctl_arena_stats_sdmerge(ctl_arena_t *ctl_sdarena, ctl_arena_t *ctl_arena, &astats->astats.retained); } - accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge, &astats->astats.decay_dirty.npurge); - accum_arena_stats_u64(&sdstats->astats.decay_dirty.nmadvise, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.nmadvise, &astats->astats.decay_dirty.nmadvise); - accum_arena_stats_u64(&sdstats->astats.decay_dirty.purged, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.purged, &astats->astats.decay_dirty.purged); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.npurge, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.npurge, &astats->astats.decay_muzzy.npurge); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.nmadvise, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.nmadvise, &astats->astats.decay_muzzy.nmadvise); - accum_arena_stats_u64(&sdstats->astats.decay_muzzy.purged, + ctl_accum_arena_stats_u64(&sdstats->astats.decay_muzzy.purged, &astats->astats.decay_muzzy.purged); #define OP(mtx) malloc_mutex_prof_merge( \ @@ -773,6 +790,8 @@ MUTEX_PROF_ARENA_MUTEXES &astats->astats.internal); accum_atomic_zu(&sdstats->astats.resident, &astats->astats.resident); + accum_atomic_zu(&sdstats->astats.metadata_thp, + &astats->astats.metadata_thp); } else { assert(atomic_load_zu( &astats->astats.internal, ATOMIC_RELAXED) == 0); @@ -794,11 +813,11 @@ MUTEX_PROF_ARENA_MUTEXES assert(atomic_load_zu(&astats->astats.allocated_large, ATOMIC_RELAXED) == 0); } - accum_arena_stats_u64(&sdstats->astats.nmalloc_large, + ctl_accum_arena_stats_u64(&sdstats->astats.nmalloc_large, &astats->astats.nmalloc_large); - accum_arena_stats_u64(&sdstats->astats.ndalloc_large, + ctl_accum_arena_stats_u64(&sdstats->astats.ndalloc_large, &astats->astats.ndalloc_large); - accum_arena_stats_u64(&sdstats->astats.nrequests_large, + ctl_accum_arena_stats_u64(&sdstats->astats.nrequests_large, &astats->astats.nrequests_large); accum_atomic_zu(&sdstats->astats.tcache_bytes, @@ -835,11 +854,11 @@ MUTEX_PROF_ARENA_MUTEXES } for (i = 0; i < NSIZES - NBINS; i++) { - accum_arena_stats_u64(&sdstats->lstats[i].nmalloc, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].nmalloc, &astats->lstats[i].nmalloc); - accum_arena_stats_u64(&sdstats->lstats[i].ndalloc, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].ndalloc, &astats->lstats[i].ndalloc); - accum_arena_stats_u64(&sdstats->lstats[i].nrequests, + ctl_accum_arena_stats_u64(&sdstats->lstats[i].nrequests, &astats->lstats[i].nrequests); if (!destroyed) { sdstats->lstats[i].curlextents += @@ -938,6 +957,8 @@ ctl_refresh(tsdn_t *tsdn) { &ctl_sarena->astats->astats.base, ATOMIC_RELAXED) + atomic_load_zu(&ctl_sarena->astats->astats.internal, ATOMIC_RELAXED); + ctl_stats->metadata_thp = atomic_load_zu( + &ctl_sarena->astats->astats.metadata_thp, ATOMIC_RELAXED); ctl_stats->resident = atomic_load_zu( &ctl_sarena->astats->astats.resident, ATOMIC_RELAXED); ctl_stats->mapped = atomic_load_zu( @@ -1549,6 +1570,71 @@ label_return: return ret; } +static int +max_background_threads_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen) { + int ret; + size_t oldval; + + if (!have_background_thread) { + return ENOENT; + } + background_thread_ctl_init(tsd_tsdn(tsd)); + + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); + if (newp == NULL) { + oldval = max_background_threads; + READ(oldval, size_t); + } else { + if (newlen != sizeof(size_t)) { + ret = EINVAL; + goto label_return; + } + oldval = max_background_threads; + READ(oldval, size_t); + + size_t newval = *(size_t *)newp; + if (newval == oldval) { + ret = 0; + goto label_return; + } + if (newval > opt_max_background_threads) { + ret = EINVAL; + goto label_return; + } + + if (background_thread_enabled()) { + if (!can_enable_background_thread) { + malloc_printf(": Error in dlsym(" + "RTLD_NEXT, \"pthread_create\"). Cannot " + "enable background_thread\n"); + ret = EFAULT; + goto label_return; + } + background_thread_enabled_set(tsd_tsdn(tsd), false); + if (background_threads_disable(tsd)) { + ret = EFAULT; + goto label_return; + } + max_background_threads = newval; + background_thread_enabled_set(tsd_tsdn(tsd), true); + if (background_threads_enable(tsd)) { + ret = EFAULT; + goto label_return; + } + } else { + max_background_threads = newval; + } + } + ret = 0; +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + + return ret; +} + /******************************************************************************/ CTL_RO_CONFIG_GEN(config_cache_oblivious, bool) @@ -1560,7 +1646,6 @@ CTL_RO_CONFIG_GEN(config_prof, bool) CTL_RO_CONFIG_GEN(config_prof_libgcc, bool) CTL_RO_CONFIG_GEN(config_prof_libunwind, bool) CTL_RO_CONFIG_GEN(config_stats, bool) -CTL_RO_CONFIG_GEN(config_thp, bool) CTL_RO_CONFIG_GEN(config_utrace, bool) CTL_RO_CONFIG_GEN(config_xmalloc, bool) @@ -1568,12 +1653,15 @@ CTL_RO_CONFIG_GEN(config_xmalloc, bool) CTL_RO_NL_GEN(opt_abort, opt_abort, bool) CTL_RO_NL_GEN(opt_abort_conf, opt_abort_conf, bool) +CTL_RO_NL_GEN(opt_metadata_thp, metadata_thp_mode_names[opt_metadata_thp], + const char *) CTL_RO_NL_GEN(opt_retain, opt_retain, bool) CTL_RO_NL_GEN(opt_dss, opt_dss, const char *) CTL_RO_NL_GEN(opt_narenas, opt_narenas, unsigned) CTL_RO_NL_GEN(opt_percpu_arena, percpu_arena_mode_names[opt_percpu_arena], const char *) CTL_RO_NL_GEN(opt_background_thread, opt_background_thread, bool) +CTL_RO_NL_GEN(opt_max_background_threads, opt_max_background_threads, size_t) CTL_RO_NL_GEN(opt_dirty_decay_ms, opt_dirty_decay_ms, ssize_t) CTL_RO_NL_GEN(opt_muzzy_decay_ms, opt_muzzy_decay_ms, ssize_t) CTL_RO_NL_GEN(opt_stats_print, opt_stats_print, bool) @@ -1583,6 +1671,9 @@ CTL_RO_NL_CGEN(config_fill, opt_zero, opt_zero, bool) CTL_RO_NL_CGEN(config_utrace, opt_utrace, opt_utrace, bool) CTL_RO_NL_CGEN(config_xmalloc, opt_xmalloc, opt_xmalloc, bool) CTL_RO_NL_GEN(opt_tcache, opt_tcache, bool) +CTL_RO_NL_GEN(opt_thp, thp_mode_names[opt_thp], const char *) +CTL_RO_NL_GEN(opt_lg_extent_max_active_fit, opt_lg_extent_max_active_fit, + size_t) CTL_RO_NL_GEN(opt_lg_tcache_max, opt_lg_tcache_max, ssize_t) CTL_RO_NL_CGEN(config_prof, opt_prof, opt_prof, bool) CTL_RO_NL_CGEN(config_prof, opt_prof_prefix, opt_prof_prefix, const char *) @@ -2162,20 +2253,41 @@ arena_i_extent_hooks_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); MIB_UNSIGNED(arena_ind, 1); - if (arena_ind < narenas_total_get() && (arena = - arena_get(tsd_tsdn(tsd), arena_ind, false)) != NULL) { - if (newp != NULL) { - extent_hooks_t *old_extent_hooks; - extent_hooks_t *new_extent_hooks - JEMALLOC_CC_SILENCE_INIT(NULL); - WRITE(new_extent_hooks, extent_hooks_t *); - old_extent_hooks = extent_hooks_set(tsd, arena, - new_extent_hooks); + if (arena_ind < narenas_total_get()) { + extent_hooks_t *old_extent_hooks; + arena = arena_get(tsd_tsdn(tsd), arena_ind, false); + if (arena == NULL) { + if (arena_ind >= narenas_auto) { + ret = EFAULT; + goto label_return; + } + old_extent_hooks = + (extent_hooks_t *)&extent_hooks_default; READ(old_extent_hooks, extent_hooks_t *); + if (newp != NULL) { + /* Initialize a new arena as a side effect. */ + extent_hooks_t *new_extent_hooks + JEMALLOC_CC_SILENCE_INIT(NULL); + WRITE(new_extent_hooks, extent_hooks_t *); + arena = arena_init(tsd_tsdn(tsd), arena_ind, + new_extent_hooks); + if (arena == NULL) { + ret = EFAULT; + goto label_return; + } + } } else { - extent_hooks_t *old_extent_hooks = - extent_hooks_get(arena); - READ(old_extent_hooks, extent_hooks_t *); + if (newp != NULL) { + extent_hooks_t *new_extent_hooks + JEMALLOC_CC_SILENCE_INIT(NULL); + WRITE(new_extent_hooks, extent_hooks_t *); + old_extent_hooks = extent_hooks_set(tsd, arena, + new_extent_hooks); + READ(old_extent_hooks, extent_hooks_t *); + } else { + old_extent_hooks = extent_hooks_get(arena); + READ(old_extent_hooks, extent_hooks_t *); + } } } else { ret = EFAULT; @@ -2187,6 +2299,42 @@ label_return: return ret; } +static int +arena_i_retain_grow_limit_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen) { + int ret; + unsigned arena_ind; + arena_t *arena; + + if (!opt_retain) { + /* Only relevant when retain is enabled. */ + return ENOENT; + } + + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + MIB_UNSIGNED(arena_ind, 1); + if (arena_ind < narenas_total_get() && (arena = + arena_get(tsd_tsdn(tsd), arena_ind, false)) != NULL) { + size_t old_limit, new_limit; + if (newp != NULL) { + WRITE(new_limit, size_t); + } + bool err = arena_retain_grow_limit_get_set(tsd, arena, + &old_limit, newp != NULL ? &new_limit : NULL); + if (!err) { + READ(old_limit, size_t); + ret = 0; + } else { + ret = EFAULT; + } + } else { + ret = EFAULT; + } +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + return ret; +} + static const ctl_named_node_t * arena_i_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, size_t i) { const ctl_named_node_t *ret; @@ -2248,7 +2396,7 @@ arenas_decay_ms_ctl_impl(tsd_t *tsd, const size_t *mib, size_t miblen, ret = EINVAL; goto label_return; } - if (dirty ? arena_dirty_decay_ms_default_set(*(ssize_t *)newp) + if (dirty ? arena_dirty_decay_ms_default_set(*(ssize_t *)newp) : arena_muzzy_decay_ms_default_set(*(ssize_t *)newp)) { ret = EFAULT; goto label_return; @@ -2279,9 +2427,9 @@ CTL_RO_NL_GEN(arenas_page, PAGE, size_t) CTL_RO_NL_GEN(arenas_tcache_max, tcache_maxclass, size_t) CTL_RO_NL_GEN(arenas_nbins, NBINS, unsigned) CTL_RO_NL_GEN(arenas_nhbins, nhbins, unsigned) -CTL_RO_NL_GEN(arenas_bin_i_size, arena_bin_info[mib[2]].reg_size, size_t) -CTL_RO_NL_GEN(arenas_bin_i_nregs, arena_bin_info[mib[2]].nregs, uint32_t) -CTL_RO_NL_GEN(arenas_bin_i_slab_size, arena_bin_info[mib[2]].slab_size, size_t) +CTL_RO_NL_GEN(arenas_bin_i_size, bin_infos[mib[2]].reg_size, size_t) +CTL_RO_NL_GEN(arenas_bin_i_nregs, bin_infos[mib[2]].nregs, uint32_t) +CTL_RO_NL_GEN(arenas_bin_i_slab_size, bin_infos[mib[2]].slab_size, size_t) static const ctl_named_node_t * arenas_bin_i_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, size_t i) { if (i > NBINS) { @@ -2325,6 +2473,36 @@ label_return: return ret; } +static int +arenas_lookup_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, + size_t *oldlenp, void *newp, size_t newlen) { + int ret; + unsigned arena_ind; + void *ptr; + extent_t *extent; + arena_t *arena; + + ptr = NULL; + ret = EINVAL; + malloc_mutex_lock(tsd_tsdn(tsd), &ctl_mtx); + WRITE(ptr, void *); + extent = iealloc(tsd_tsdn(tsd), ptr); + if (extent == NULL) + goto label_return; + + arena = extent_arena_get(extent); + if (arena == NULL) + goto label_return; + + arena_ind = arena_ind_get(arena); + READ(arena_ind, unsigned); + + ret = 0; +label_return: + malloc_mutex_unlock(tsd_tsdn(tsd), &ctl_mtx); + return ret; +} + /******************************************************************************/ static int @@ -2460,6 +2638,7 @@ CTL_RO_NL_CGEN(config_prof, lg_prof_sample, lg_prof_sample, size_t) CTL_RO_CGEN(config_stats, stats_allocated, ctl_stats->allocated, size_t) CTL_RO_CGEN(config_stats, stats_active, ctl_stats->active, size_t) CTL_RO_CGEN(config_stats, stats_metadata, ctl_stats->metadata, size_t) +CTL_RO_CGEN(config_stats, stats_metadata_thp, ctl_stats->metadata_thp, size_t) CTL_RO_CGEN(config_stats, stats_resident, ctl_stats->resident, size_t) CTL_RO_CGEN(config_stats, stats_mapped, ctl_stats->mapped, size_t) CTL_RO_CGEN(config_stats, stats_retained, ctl_stats->retained, size_t) @@ -2490,24 +2669,24 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_retained, size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_npurge, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_dirty.npurge), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_dirty.npurge), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_nmadvise, - arena_stats_read_u64( + ctl_arena_stats_read_u64( &arenas_i(mib[2])->astats->astats.decay_dirty.nmadvise), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_purged, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_dirty.purged), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_dirty.purged), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_npurge, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_muzzy.npurge), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_muzzy.npurge), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_nmadvise, - arena_stats_read_u64( + ctl_arena_stats_read_u64( &arenas_i(mib[2])->astats->astats.decay_muzzy.nmadvise), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_muzzy_purged, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.decay_muzzy.purged), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.decay_muzzy.purged), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_base, atomic_load_zu(&arenas_i(mib[2])->astats->astats.base, ATOMIC_RELAXED), @@ -2515,6 +2694,9 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_base, CTL_RO_CGEN(config_stats, stats_arenas_i_internal, atomic_load_zu(&arenas_i(mib[2])->astats->astats.internal, ATOMIC_RELAXED), size_t) +CTL_RO_CGEN(config_stats, stats_arenas_i_metadata_thp, + atomic_load_zu(&arenas_i(mib[2])->astats->astats.metadata_thp, + ATOMIC_RELAXED), size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_tcache_bytes, atomic_load_zu(&arenas_i(mib[2])->astats->astats.tcache_bytes, ATOMIC_RELAXED), size_t) @@ -2534,14 +2716,17 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_large_allocated, atomic_load_zu(&arenas_i(mib[2])->astats->astats.allocated_large, ATOMIC_RELAXED), size_t) CTL_RO_CGEN(config_stats, stats_arenas_i_large_nmalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.nmalloc_large), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.nmalloc_large), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_large_ndalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.ndalloc_large), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.ndalloc_large), uint64_t) +/* + * Note: "nmalloc" here instead of "nrequests" in the read. This is intentional. + */ CTL_RO_CGEN(config_stats, stats_arenas_i_large_nrequests, - arena_stats_read_u64(&arenas_i(mib[2])->astats->astats.nmalloc_large), - uint64_t) /* Intentional. */ + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->astats.nmalloc_large), uint64_t) /* Intentional. */ /* Lock profiling related APIs below. */ #define RO_MUTEX_CTL_GEN(n, l) \ @@ -2622,7 +2807,7 @@ stats_mutexes_reset_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, MUTEX_PROF_RESET(arena->base->mtx); for (szind_t i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; + bin_t *bin = &arena->bins[i]; MUTEX_PROF_RESET(bin->lock); } } @@ -2659,14 +2844,14 @@ stats_arenas_i_bins_j_index(tsdn_t *tsdn, const size_t *mib, size_t miblen, } CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_nmalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].nmalloc), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].nmalloc), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_ndalloc, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].ndalloc), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].ndalloc), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_nrequests, - arena_stats_read_u64(&arenas_i(mib[2])->astats->lstats[mib[4]].nrequests), - uint64_t) + ctl_arena_stats_read_u64( + &arenas_i(mib[2])->astats->lstats[mib[4]].nrequests), uint64_t) CTL_RO_CGEN(config_stats, stats_arenas_i_lextents_j_curlextents, arenas_i(mib[2])->astats->lstats[mib[4]].curlextents, size_t) diff --git a/dep/jemalloc/src/div.c b/dep/jemalloc/src/div.c new file mode 100644 index 00000000000..808892a133f --- /dev/null +++ b/dep/jemalloc/src/div.c @@ -0,0 +1,55 @@ +#include "jemalloc/internal/jemalloc_preamble.h" + +#include "jemalloc/internal/div.h" + +#include "jemalloc/internal/assert.h" + +/* + * Suppose we have n = q * d, all integers. We know n and d, and want q = n / d. + * + * For any k, we have (here, all division is exact; not C-style rounding): + * floor(ceil(2^k / d) * n / 2^k) = floor((2^k + r) / d * n / 2^k), where + * r = (-2^k) mod d. + * + * Expanding this out: + * ... = floor(2^k / d * n / 2^k + r / d * n / 2^k) + * = floor(n / d + (r / d) * (n / 2^k)). + * + * The fractional part of n / d is 0 (because of the assumption that d divides n + * exactly), so we have: + * ... = n / d + floor((r / d) * (n / 2^k)) + * + * So that our initial expression is equal to the quantity we seek, so long as + * (r / d) * (n / 2^k) < 1. + * + * r is a remainder mod d, so r < d and r / d < 1 always. We can make + * n / 2 ^ k < 1 by setting k = 32. This gets us a value of magic that works. + */ + +void +div_init(div_info_t *div_info, size_t d) { + /* Nonsensical. */ + assert(d != 0); + /* + * This would make the value of magic too high to fit into a uint32_t + * (we would want magic = 2^32 exactly). This would mess with code gen + * on 32-bit machines. + */ + assert(d != 1); + + uint64_t two_to_k = ((uint64_t)1 << 32); + uint32_t magic = (uint32_t)(two_to_k / d); + + /* + * We want magic = ceil(2^k / d), but C gives us floor. We have to + * increment it unless the result was exact (i.e. unless d is a power of + * two). + */ + if (two_to_k % d != 0) { + magic++; + } + div_info->magic = magic; +#ifdef JEMALLOC_DEBUG + div_info->d = d; +#endif +} diff --git a/dep/jemalloc/src/extent.c b/dep/jemalloc/src/extent.c index fa45c84d34f..09d6d771817 100644 --- a/dep/jemalloc/src/extent.c +++ b/dep/jemalloc/src/extent.c @@ -17,6 +17,8 @@ rtree_t extents_rtree; /* Keyed by the address of the extent_t being protected. */ mutex_pool_t extent_mutex_pool; +size_t opt_lg_extent_max_active_fit = LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT; + static const bitmap_info_t extents_bitmap_info = BITMAP_INFO_INITIALIZER(NPSIZES+1); @@ -117,7 +119,7 @@ static void extent_record(tsdn_t *tsdn, arena_t *arena, /******************************************************************************/ -rb_gen(UNUSED, extent_avail_, extent_tree_t, extent_t, rb_link, +ph_gen(UNUSED, extent_avail_, extent_tree_t, extent_t, ph_link, extent_esnead_comp) typedef enum { @@ -304,8 +306,7 @@ extents_npages_get(extents_t *extents) { } static void -extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, - bool preserve_lru) { +extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent) { malloc_mutex_assert_owner(tsdn, &extents->mtx); assert(extent_state_get(extent) == extents->state); @@ -317,9 +318,7 @@ extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, (size_t)pind); } extent_heap_insert(&extents->heaps[pind], extent); - if (!preserve_lru) { - extent_list_append(&extents->lru, extent); - } + extent_list_append(&extents->lru, extent); size_t npages = size >> LG_PAGE; /* * All modifications to npages hold the mutex (as asserted above), so we @@ -333,8 +332,7 @@ extents_insert_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, } static void -extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, - bool preserve_lru) { +extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent) { malloc_mutex_assert_owner(tsdn, &extents->mtx); assert(extent_state_get(extent) == extents->state); @@ -346,9 +344,7 @@ extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, bitmap_set(extents->bitmap, &extents_bitmap_info, (size_t)pind); } - if (!preserve_lru) { - extent_list_remove(&extents->lru, extent); - } + extent_list_remove(&extents->lru, extent); size_t npages = size >> LG_PAGE; /* * As in extents_insert_locked, we hold extents->mtx and so don't need @@ -361,6 +357,43 @@ extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, cur_extents_npages - (size >> LG_PAGE), ATOMIC_RELAXED); } +/* + * Find an extent with size [min_size, max_size) to satisfy the alignment + * requirement. For each size, try only the first extent in the heap. + */ +static extent_t * +extents_fit_alignment(extents_t *extents, size_t min_size, size_t max_size, + size_t alignment) { + pszind_t pind = sz_psz2ind(extent_size_quantize_ceil(min_size)); + pszind_t pind_max = sz_psz2ind(extent_size_quantize_ceil(max_size)); + + for (pszind_t i = (pszind_t)bitmap_ffu(extents->bitmap, + &extents_bitmap_info, (size_t)pind); i < pind_max; i = + (pszind_t)bitmap_ffu(extents->bitmap, &extents_bitmap_info, + (size_t)i+1)) { + assert(i < NPSIZES); + assert(!extent_heap_empty(&extents->heaps[i])); + extent_t *extent = extent_heap_first(&extents->heaps[i]); + uintptr_t base = (uintptr_t)extent_base_get(extent); + size_t candidate_size = extent_size_get(extent); + assert(candidate_size >= min_size); + + uintptr_t next_align = ALIGNMENT_CEILING((uintptr_t)base, + PAGE_CEILING(alignment)); + if (base > next_align || base + candidate_size <= next_align) { + /* Overflow or not crossing the next alignment. */ + continue; + } + + size_t leadsize = next_align - base; + if (candidate_size - leadsize >= min_size) { + return extent; + } + } + + return NULL; +} + /* Do any-best-fit extent selection, i.e. select any extent that best fits. */ static extent_t * extents_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, @@ -369,8 +402,15 @@ extents_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, pszind_t i = (pszind_t)bitmap_ffu(extents->bitmap, &extents_bitmap_info, (size_t)pind); if (i < NPSIZES+1) { + /* + * In order to reduce fragmentation, avoid reusing and splitting + * large extents for much smaller sizes. + */ + if ((sz_pind2sz(i) >> opt_lg_extent_max_active_fit) > size) { + return NULL; + } assert(!extent_heap_empty(&extents->heaps[i])); - extent_t *extent = extent_heap_any(&extents->heaps[i]); + extent_t *extent = extent_heap_first(&extents->heaps[i]); assert(extent_size_get(extent) >= size); return extent; } @@ -415,12 +455,30 @@ extents_first_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, */ static extent_t * extents_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - size_t size) { + size_t esize, size_t alignment) { malloc_mutex_assert_owner(tsdn, &extents->mtx); - return extents->delay_coalesce ? extents_best_fit_locked(tsdn, arena, - extents, size) : extents_first_fit_locked(tsdn, arena, extents, - size); + size_t max_size = esize + PAGE_CEILING(alignment) - PAGE; + /* Beware size_t wrap-around. */ + if (max_size < esize) { + return NULL; + } + + extent_t *extent = extents->delay_coalesce ? + extents_best_fit_locked(tsdn, arena, extents, max_size) : + extents_first_fit_locked(tsdn, arena, extents, max_size); + + if (alignment > PAGE && extent == NULL) { + /* + * max_size guarantees the alignment requirement but is rather + * pessimistic. Next we try to satisfy the aligned allocation + * with sizes in [esize, max_size). + */ + extent = extents_fit_alignment(extents, esize, max_size, + alignment); + } + + return extent; } static bool @@ -436,7 +494,7 @@ extent_try_delayed_coalesce(tsdn_t *tsdn, arena_t *arena, if (!coalesced) { return true; } - extents_insert_locked(tsdn, extents, extent, true); + extents_insert_locked(tsdn, extents, extent); return false; } @@ -449,8 +507,10 @@ extents_alloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); - return extent_recycle(tsdn, arena, r_extent_hooks, extents, new_addr, - size, pad, alignment, slab, szind, zero, commit, false); + extent_t *extent = extent_recycle(tsdn, arena, r_extent_hooks, extents, + new_addr, size, pad, alignment, slab, szind, zero, commit, false); + assert(extent == NULL || extent_dumpable_get(extent)); + return extent; } void @@ -458,6 +518,7 @@ extents_dalloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent) { assert(extent_base_get(extent) != NULL); assert(extent_size_get(extent) != 0); + assert(extent_dumpable_get(extent)); witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -487,14 +548,13 @@ extents_evict(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, goto label_return; } /* Check the eviction limit. */ - size_t npages = extent_size_get(extent) >> LG_PAGE; size_t extents_npages = atomic_load_zu(&extents->npages, ATOMIC_RELAXED); - if (extents_npages - npages < npages_min) { + if (extents_npages <= npages_min) { extent = NULL; goto label_return; } - extents_remove_locked(tsdn, extents, extent, false); + extents_remove_locked(tsdn, extents, extent); if (!extents->delay_coalesce) { break; } @@ -567,29 +627,29 @@ extents_postfork_child(tsdn_t *tsdn, extents_t *extents) { static void extent_deactivate_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { assert(extent_arena_get(extent) == arena); assert(extent_state_get(extent) == extent_state_active); extent_state_set(extent, extents_state_get(extents)); - extents_insert_locked(tsdn, extents, extent, preserve_lru); + extents_insert_locked(tsdn, extents, extent); } static void extent_deactivate(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { malloc_mutex_lock(tsdn, &extents->mtx); - extent_deactivate_locked(tsdn, arena, extents, extent, preserve_lru); + extent_deactivate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); } static void extent_activate_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, - extent_t *extent, bool preserve_lru) { + extent_t *extent) { assert(extent_arena_get(extent) == arena); assert(extent_state_get(extent) == extents_state_get(extents)); - extents_remove_locked(tsdn, extents, extent, preserve_lru); + extents_remove_locked(tsdn, extents, extent); extent_state_set(extent, extent_state_active); } @@ -723,6 +783,13 @@ extent_reregister(tsdn_t *tsdn, extent_t *extent) { assert(!err); } +/* + * Removes all pointers to the given extent from the global rtree indices for + * its interior. This is relevant for slab extents, for which we need to do + * metadata lookups at places other than the head of the extent. We deregister + * on the interior, then, when an extent moves from being an active slab to an + * inactive state. + */ static void extent_interior_deregister(tsdn_t *tsdn, rtree_ctx_t *rtree_ctx, extent_t *extent) { @@ -737,8 +804,11 @@ extent_interior_deregister(tsdn_t *tsdn, rtree_ctx_t *rtree_ctx, } } +/* + * Removes all pointers to the given extent from the global rtree. + */ static void -extent_deregister(tsdn_t *tsdn, extent_t *extent) { +extent_deregister_impl(tsdn_t *tsdn, extent_t *extent, bool gdump) { rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); rtree_leaf_elm_t *elm_a, *elm_b; @@ -755,16 +825,30 @@ extent_deregister(tsdn_t *tsdn, extent_t *extent) { extent_unlock(tsdn, extent); - if (config_prof) { + if (config_prof && gdump) { extent_gdump_sub(tsdn, extent); } } +static void +extent_deregister(tsdn_t *tsdn, extent_t *extent) { + extent_deregister_impl(tsdn, extent, true); +} + +static void +extent_deregister_no_gdump_sub(tsdn_t *tsdn, extent_t *extent) { + extent_deregister_impl(tsdn, extent, false); +} + +/* + * Tries to find and remove an extent from extents that can be used for the + * given allocation request. + */ static extent_t * extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, - bool *zero, bool *commit, bool growing_retained) { + bool growing_retained) { witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, growing_retained ? 1 : 0); assert(alignment > 0); @@ -786,11 +870,6 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, } size_t esize = size + pad; - size_t alloc_size = esize + PAGE_CEILING(alignment) - PAGE; - /* Beware size_t wrap-around. */ - if (alloc_size < esize) { - return NULL; - } malloc_mutex_lock(tsdn, &extents->mtx); extent_hooks_assure_initialized(arena, r_extent_hooks); extent_t *extent; @@ -812,86 +891,172 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, extent_unlock(tsdn, unlock_extent); } } else { - extent = extents_fit_locked(tsdn, arena, extents, alloc_size); + extent = extents_fit_locked(tsdn, arena, extents, esize, + alignment); } if (extent == NULL) { malloc_mutex_unlock(tsdn, &extents->mtx); return NULL; } - extent_activate_locked(tsdn, arena, extents, extent, false); + extent_activate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); - if (extent_zeroed_get(extent)) { - *zero = true; - } - if (extent_committed_get(extent)) { - *commit = true; - } - return extent; } -static extent_t * -extent_recycle_split(tsdn_t *tsdn, arena_t *arena, - extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, +/* + * Given an allocation request and an extent guaranteed to be able to satisfy + * it, this splits off lead and trail extents, leaving extent pointing to an + * extent satisfying the allocation. + * This function doesn't put lead or trail into any extents_t; it's the caller's + * job to ensure that they can be reused. + */ +typedef enum { + /* + * Split successfully. lead, extent, and trail, are modified to extents + * describing the ranges before, in, and after the given allocation. + */ + extent_split_interior_ok, + /* + * The extent can't satisfy the given allocation request. None of the + * input extent_t *s are touched. + */ + extent_split_interior_cant_alloc, + /* + * In a potentially invalid state. Must leak (if *to_leak is non-NULL), + * and salvage what's still salvageable (if *to_salvage is non-NULL). + * None of lead, extent, or trail are valid. + */ + extent_split_interior_error +} extent_split_interior_result_t; + +static extent_split_interior_result_t +extent_split_interior(tsdn_t *tsdn, arena_t *arena, + extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, + /* The result of splitting, in case of success. */ + extent_t **extent, extent_t **lead, extent_t **trail, + /* The mess to clean up, in case of error. */ + extent_t **to_leak, extent_t **to_salvage, void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, - szind_t szind, extent_t *extent, bool growing_retained) { + szind_t szind, bool growing_retained) { size_t esize = size + pad; - size_t leadsize = ALIGNMENT_CEILING((uintptr_t)extent_base_get(extent), - PAGE_CEILING(alignment)) - (uintptr_t)extent_base_get(extent); + size_t leadsize = ALIGNMENT_CEILING((uintptr_t)extent_base_get(*extent), + PAGE_CEILING(alignment)) - (uintptr_t)extent_base_get(*extent); assert(new_addr == NULL || leadsize == 0); - assert(extent_size_get(extent) >= leadsize + esize); - size_t trailsize = extent_size_get(extent) - leadsize - esize; + if (extent_size_get(*extent) < leadsize + esize) { + return extent_split_interior_cant_alloc; + } + size_t trailsize = extent_size_get(*extent) - leadsize - esize; + + *lead = NULL; + *trail = NULL; + *to_leak = NULL; + *to_salvage = NULL; /* Split the lead. */ if (leadsize != 0) { - extent_t *lead = extent; - extent = extent_split_impl(tsdn, arena, r_extent_hooks, - lead, leadsize, NSIZES, false, esize + trailsize, szind, + *lead = *extent; + *extent = extent_split_impl(tsdn, arena, r_extent_hooks, + *lead, leadsize, NSIZES, false, esize + trailsize, szind, slab, growing_retained); - if (extent == NULL) { - extent_deregister(tsdn, lead); - extents_leak(tsdn, arena, r_extent_hooks, extents, - lead, growing_retained); - return NULL; + if (*extent == NULL) { + *to_leak = *lead; + *lead = NULL; + return extent_split_interior_error; } - extent_deactivate(tsdn, arena, extents, lead, false); } /* Split the trail. */ if (trailsize != 0) { - extent_t *trail = extent_split_impl(tsdn, arena, - r_extent_hooks, extent, esize, szind, slab, trailsize, - NSIZES, false, growing_retained); - if (trail == NULL) { - extent_deregister(tsdn, extent); - extents_leak(tsdn, arena, r_extent_hooks, extents, - extent, growing_retained); - return NULL; + *trail = extent_split_impl(tsdn, arena, r_extent_hooks, *extent, + esize, szind, slab, trailsize, NSIZES, false, + growing_retained); + if (*trail == NULL) { + *to_leak = *extent; + *to_salvage = *lead; + *lead = NULL; + *extent = NULL; + return extent_split_interior_error; } - extent_deactivate(tsdn, arena, extents, trail, false); - } else if (leadsize == 0) { + } + + if (leadsize == 0 && trailsize == 0) { /* * Splitting causes szind to be set as a side effect, but no * splitting occurred. */ - extent_szind_set(extent, szind); + extent_szind_set(*extent, szind); if (szind != NSIZES) { rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_addr_get(extent), szind, slab); - if (slab && extent_size_get(extent) > PAGE) { + (uintptr_t)extent_addr_get(*extent), szind, slab); + if (slab && extent_size_get(*extent) > PAGE) { rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_past_get(extent) - + (uintptr_t)extent_past_get(*extent) - (uintptr_t)PAGE, szind, slab); } } } - return extent; + return extent_split_interior_ok; } +/* + * This fulfills the indicated allocation request out of the given extent (which + * the caller should have ensured was big enough). If there's any unused space + * before or after the resulting allocation, that space is given its own extent + * and put back into extents. + */ +static extent_t * +extent_recycle_split(tsdn_t *tsdn, arena_t *arena, + extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents, + void *new_addr, size_t size, size_t pad, size_t alignment, bool slab, + szind_t szind, extent_t *extent, bool growing_retained) { + extent_t *lead; + extent_t *trail; + extent_t *to_leak; + extent_t *to_salvage; + + extent_split_interior_result_t result = extent_split_interior( + tsdn, arena, r_extent_hooks, rtree_ctx, &extent, &lead, &trail, + &to_leak, &to_salvage, new_addr, size, pad, alignment, slab, szind, + growing_retained); + + if (result == extent_split_interior_ok) { + if (lead != NULL) { + extent_deactivate(tsdn, arena, extents, lead); + } + if (trail != NULL) { + extent_deactivate(tsdn, arena, extents, trail); + } + return extent; + } else { + /* + * We should have picked an extent that was large enough to + * fulfill our allocation request. + */ + assert(result == extent_split_interior_error); + if (to_salvage != NULL) { + extent_deregister(tsdn, to_salvage); + } + if (to_leak != NULL) { + void *leak = extent_base_get(to_leak); + extent_deregister_no_gdump_sub(tsdn, to_leak); + extents_leak(tsdn, arena, r_extent_hooks, extents, + to_leak, growing_retained); + assert(extent_lock_from_addr(tsdn, rtree_ctx, leak) + == NULL); + } + return NULL; + } + unreachable(); +} + +/* + * Tries to satisfy the given allocation request by reusing one of the extents + * in the given extents_t. + */ static extent_t * extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, void *new_addr, size_t size, size_t pad, @@ -906,16 +1071,12 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); - bool committed = false; extent_t *extent = extent_recycle_extract(tsdn, arena, r_extent_hooks, - rtree_ctx, extents, new_addr, size, pad, alignment, slab, zero, - &committed, growing_retained); + rtree_ctx, extents, new_addr, size, pad, alignment, slab, + growing_retained); if (extent == NULL) { return NULL; } - if (committed) { - *commit = true; - } extent = extent_recycle_split(tsdn, arena, r_extent_hooks, rtree_ctx, extents, new_addr, size, pad, alignment, slab, szind, extent, @@ -934,6 +1095,13 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_zeroed_set(extent, true); } + if (extent_committed_get(extent)) { + *commit = true; + } + if (extent_zeroed_get(extent)) { + *zero = true; + } + if (pad != 0) { extent_addr_randomize(tsdn, extent, alignment); } @@ -999,11 +1167,12 @@ extent_alloc_core(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, static void * extent_alloc_default_impl(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit) { - void *ret; - - ret = extent_alloc_core(tsdn, arena, new_addr, size, alignment, zero, + void *ret = extent_alloc_core(tsdn, arena, new_addr, size, alignment, zero, commit, (dss_prec_t)atomic_load_u(&arena->dss_prec, ATOMIC_RELAXED)); + if (have_madvise_huge && ret) { + pages_set_thp_state(ret, size); + } return ret; } @@ -1028,7 +1197,18 @@ extent_alloc_default(extent_hooks_t *extent_hooks, void *new_addr, size_t size, static void extent_hook_pre_reentrancy(tsdn_t *tsdn, arena_t *arena) { tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn); - pre_reentrancy(tsd, arena); + if (arena == arena_get(tsd_tsdn(tsd), 0, false)) { + /* + * The only legitimate case of customized extent hooks for a0 is + * hooks with no allocation activities. One such example is to + * place metadata on pre-allocated resources such as huge pages. + * In that case, rely on reentrancy_level checks to catch + * infinite recursions. + */ + pre_reentrancy(tsd, NULL); + } else { + pre_reentrancy(tsd, arena); + } } static void @@ -1081,9 +1261,8 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, void *ptr; if (*r_extent_hooks == &extent_hooks_default) { - ptr = extent_alloc_core(tsdn, arena, NULL, alloc_size, PAGE, - &zeroed, &committed, (dss_prec_t)atomic_load_u( - &arena->dss_prec, ATOMIC_RELAXED)); + ptr = extent_alloc_default_impl(tsdn, arena, NULL, + alloc_size, PAGE, &zeroed, &committed); } else { extent_hook_pre_reentrancy(tsdn, arena); ptr = (*r_extent_hooks)->alloc(*r_extent_hooks, NULL, @@ -1094,21 +1273,18 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, extent_init(extent, arena, ptr, alloc_size, false, NSIZES, arena_extent_sn_next(arena), extent_state_active, zeroed, - committed); + committed, true); if (ptr == NULL) { extent_dalloc(tsdn, arena, extent); goto label_err; } + if (extent_register_no_gdump_add(tsdn, extent)) { extents_leak(tsdn, arena, r_extent_hooks, &arena->extents_retained, extent, true); goto label_err; } - size_t leadsize = ALIGNMENT_CEILING((uintptr_t)ptr, - PAGE_CEILING(alignment)) - (uintptr_t)ptr; - assert(alloc_size >= leadsize + esize); - size_t trailsize = alloc_size - leadsize - esize; if (extent_zeroed_get(extent) && extent_committed_get(extent)) { *zero = true; } @@ -1116,54 +1292,46 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, *commit = true; } - /* Split the lead. */ - if (leadsize != 0) { - extent_t *lead = extent; - extent = extent_split_impl(tsdn, arena, r_extent_hooks, lead, - leadsize, NSIZES, false, esize + trailsize, szind, slab, - true); - if (extent == NULL) { - extent_deregister(tsdn, lead); - extents_leak(tsdn, arena, r_extent_hooks, + rtree_ctx_t rtree_ctx_fallback; + rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); + + extent_t *lead; + extent_t *trail; + extent_t *to_leak; + extent_t *to_salvage; + extent_split_interior_result_t result = extent_split_interior( + tsdn, arena, r_extent_hooks, rtree_ctx, &extent, &lead, &trail, + &to_leak, &to_salvage, NULL, size, pad, alignment, slab, szind, + true); + + if (result == extent_split_interior_ok) { + if (lead != NULL) { + extent_record(tsdn, arena, r_extent_hooks, &arena->extents_retained, lead, true); - goto label_err; } - extent_record(tsdn, arena, r_extent_hooks, - &arena->extents_retained, lead, true); - } - - /* Split the trail. */ - if (trailsize != 0) { - extent_t *trail = extent_split_impl(tsdn, arena, r_extent_hooks, - extent, esize, szind, slab, trailsize, NSIZES, false, true); - if (trail == NULL) { - extent_deregister(tsdn, extent); - extents_leak(tsdn, arena, r_extent_hooks, - &arena->extents_retained, extent, true); - goto label_err; + if (trail != NULL) { + extent_record(tsdn, arena, r_extent_hooks, + &arena->extents_retained, trail, true); } - extent_record(tsdn, arena, r_extent_hooks, - &arena->extents_retained, trail, true); - } else if (leadsize == 0) { + } else { /* - * Splitting causes szind to be set as a side effect, but no - * splitting occurred. + * We should have allocated a sufficiently large extent; the + * cant_alloc case should not occur. */ - rtree_ctx_t rtree_ctx_fallback; - rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, - &rtree_ctx_fallback); - - extent_szind_set(extent, szind); - if (szind != NSIZES) { - rtree_szind_slab_update(tsdn, &extents_rtree, rtree_ctx, - (uintptr_t)extent_addr_get(extent), szind, slab); - if (slab && extent_size_get(extent) > PAGE) { - rtree_szind_slab_update(tsdn, &extents_rtree, - rtree_ctx, - (uintptr_t)extent_past_get(extent) - - (uintptr_t)PAGE, szind, slab); + assert(result == extent_split_interior_error); + if (to_salvage != NULL) { + if (config_prof) { + extent_gdump_add(tsdn, to_salvage); } + extent_record(tsdn, arena, r_extent_hooks, + &arena->extents_retained, to_salvage, true); } + if (to_leak != NULL) { + extent_deregister_no_gdump_sub(tsdn, to_leak); + extents_leak(tsdn, arena, r_extent_hooks, + &arena->extents_retained, to_leak, true); + } + goto label_err; } if (*commit && !extent_committed_get(extent)) { @@ -1177,13 +1345,14 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena, } /* - * Increment extent_grow_next if doing so wouldn't exceed the legal + * Increment extent_grow_next if doing so wouldn't exceed the allowed * range. */ - if (arena->extent_grow_next + egn_skip + 1 < NPSIZES) { + if (arena->extent_grow_next + egn_skip + 1 <= + arena->retain_grow_limit) { arena->extent_grow_next += egn_skip + 1; } else { - arena->extent_grow_next = NPSIZES - 1; + arena->extent_grow_next = arena->retain_grow_limit; } /* All opportunities for failure are past. */ malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); @@ -1271,7 +1440,8 @@ extent_alloc_wrapper_hard(tsdn_t *tsdn, arena_t *arena, return NULL; } extent_init(extent, arena, addr, esize, slab, szind, - arena_extent_sn_next(arena), extent_state_active, zero, commit); + arena_extent_sn_next(arena), extent_state_active, *zero, *commit, + true); if (pad != 0) { extent_addr_randomize(tsdn, extent, alignment); } @@ -1296,10 +1466,20 @@ extent_alloc_wrapper(tsdn_t *tsdn, arena_t *arena, extent_t *extent = extent_alloc_retained(tsdn, arena, r_extent_hooks, new_addr, size, pad, alignment, slab, szind, zero, commit); if (extent == NULL) { + if (opt_retain && new_addr != NULL) { + /* + * When retain is enabled and new_addr is set, we do not + * attempt extent_alloc_wrapper_hard which does mmap + * that is very unlikely to succeed (unless it happens + * to be at the end). + */ + return NULL; + } extent = extent_alloc_wrapper_hard(tsdn, arena, r_extent_hooks, new_addr, size, pad, alignment, slab, szind, zero, commit); } + assert(extent == NULL || extent_dumpable_get(extent)); return extent; } @@ -1329,16 +1509,7 @@ extent_coalesce(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, bool growing_retained) { assert(extent_can_coalesce(arena, extents, inner, outer)); - if (forward && extents->delay_coalesce) { - /* - * The extent that remains after coalescing must occupy the - * outer extent's position in the LRU. For forward coalescing, - * swap the inner extent into the LRU. - */ - extent_list_replace(&extents->lru, outer, inner); - } - extent_activate_locked(tsdn, arena, extents, outer, - extents->delay_coalesce); + extent_activate_locked(tsdn, arena, extents, outer); malloc_mutex_unlock(tsdn, &extents->mtx); bool err = extent_merge_impl(tsdn, arena, r_extent_hooks, @@ -1346,11 +1517,7 @@ extent_coalesce(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, malloc_mutex_lock(tsdn, &extents->mtx); if (err) { - if (forward && extents->delay_coalesce) { - extent_list_replace(&extents->lru, inner, outer); - } - extent_deactivate_locked(tsdn, arena, extents, outer, - extents->delay_coalesce); + extent_deactivate_locked(tsdn, arena, extents, outer); } return err; @@ -1422,6 +1589,10 @@ extent_try_coalesce(tsdn_t *tsdn, arena_t *arena, return extent; } +/* + * Does the metadata management portions of putting an unused extent into the + * given extents_t (coalesces, deregisters slab interiors, the heap operations). + */ static void extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent, bool growing_retained) { @@ -1447,9 +1618,20 @@ extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, if (!extents->delay_coalesce) { extent = extent_try_coalesce(tsdn, arena, r_extent_hooks, rtree_ctx, extents, extent, NULL, growing_retained); + } else if (extent_size_get(extent) >= LARGE_MINCLASS) { + /* Always coalesce large extents eagerly. */ + bool coalesced; + size_t prev_size; + do { + prev_size = extent_size_get(extent); + assert(extent_state_get(extent) == extent_state_active); + extent = extent_try_coalesce(tsdn, arena, + r_extent_hooks, rtree_ctx, extents, extent, + &coalesced, growing_retained); + } while (coalesced && + extent_size_get(extent) >= prev_size + LARGE_MINCLASS); } - - extent_deactivate_locked(tsdn, arena, extents, extent, false); + extent_deactivate_locked(tsdn, arena, extents, extent); malloc_mutex_unlock(tsdn, &extents->mtx); } @@ -1520,6 +1702,7 @@ extent_dalloc_wrapper_try(tsdn_t *tsdn, arena_t *arena, void extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent) { + assert(extent_dumpable_get(extent)); witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), WITNESS_RANK_CORE, 0); @@ -1780,6 +1963,13 @@ extent_split_default(extent_hooks_t *extent_hooks, void *addr, size_t size, } #endif +/* + * Accepts the extent to split, and the characteristics of each side of the + * split. The 'a' parameters go with the 'lead' of the resulting pair of + * extents (the lower addressed portion of the split), and the 'b' parameters go + * with the trail (the higher addressed portion). This makes 'extent' the lead, + * and returns the trail (except in case of error). + */ static extent_t * extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *extent, size_t size_a, @@ -1803,7 +1993,7 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_init(trail, arena, (void *)((uintptr_t)extent_base_get(extent) + size_a), size_b, slab_b, szind_b, extent_sn_get(extent), extent_state_get(extent), extent_zeroed_get(extent), - extent_committed_get(extent)); + extent_committed_get(extent), extent_dumpable_get(extent)); rtree_ctx_t rtree_ctx_fallback; rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); @@ -1814,7 +2004,7 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, extent_init(&lead, arena, extent_addr_get(extent), size_a, slab_a, szind_a, extent_sn_get(extent), extent_state_get(extent), extent_zeroed_get(extent), - extent_committed_get(extent)); + extent_committed_get(extent), extent_dumpable_get(extent)); extent_rtree_leaf_elms_lookup(tsdn, rtree_ctx, &lead, false, true, &lead_elm_a, &lead_elm_b); diff --git a/dep/jemalloc/src/extent_dss.c b/dep/jemalloc/src/extent_dss.c index e72da95870d..2b1ea9cafa0 100644 --- a/dep/jemalloc/src/extent_dss.c +++ b/dep/jemalloc/src/extent_dss.c @@ -156,7 +156,7 @@ extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, extent_init(gap, arena, gap_addr_page, gap_size_page, false, NSIZES, arena_extent_sn_next(arena), - extent_state_active, false, true); + extent_state_active, false, true, true); } /* * Compute the address just past the end of the desired @@ -199,7 +199,8 @@ extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, extent_init(&extent, arena, ret, size, size, false, NSIZES, - extent_state_active, false, true); + extent_state_active, false, true, + true); if (extent_purge_forced_wrapper(tsdn, arena, &extent_hooks, &extent, 0, size)) { diff --git a/dep/jemalloc/src/jemalloc.c b/dep/jemalloc/src/jemalloc.c index 0ee8ad48b98..f93c16fa3cf 100644 --- a/dep/jemalloc/src/jemalloc.c +++ b/dep/jemalloc/src/jemalloc.c @@ -8,6 +8,7 @@ #include "jemalloc/internal/extent_dss.h" #include "jemalloc/internal/extent_mmap.h" #include "jemalloc/internal/jemalloc_internal_types.h" +#include "jemalloc/internal/log.h" #include "jemalloc/internal/malloc_io.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/rtree.h" @@ -848,10 +849,8 @@ malloc_conf_error(const char *msg, const char *k, size_t klen, const char *v, size_t vlen) { malloc_printf(": %s: %.*s:%.*s\n", msg, (int)klen, k, (int)vlen, v); + /* If abort_conf is set, error out after processing all options. */ had_conf_error = true; - if (opt_abort_conf) { - malloc_abort_invalid_conf(); - } } static void @@ -1051,8 +1050,22 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_abort, "abort") CONF_HANDLE_BOOL(opt_abort_conf, "abort_conf") - if (opt_abort_conf && had_conf_error) { - malloc_abort_invalid_conf(); + if (strncmp("metadata_thp", k, klen) == 0) { + int i; + bool match = false; + for (i = 0; i < metadata_thp_mode_limit; i++) { + if (strncmp(metadata_thp_mode_names[i], + v, vlen) == 0) { + opt_metadata_thp = i; + match = true; + break; + } + } + if (!match) { + malloc_conf_error("Invalid conf value", + k, klen, v, vlen); + } + continue; } CONF_HANDLE_BOOL(opt_retain, "retain") if (strncmp("dss", k, klen) == 0) { @@ -1128,12 +1141,14 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc") } CONF_HANDLE_BOOL(opt_tcache, "tcache") + CONF_HANDLE_SIZE_T(opt_lg_extent_max_active_fit, + "lg_extent_max_active_fit", 0, + (sizeof(size_t) << 3), yes, yes, false) CONF_HANDLE_SSIZE_T(opt_lg_tcache_max, "lg_tcache_max", -1, (sizeof(size_t) << 3) - 1) if (strncmp("percpu_arena", k, klen) == 0) { - int i; bool match = false; - for (i = percpu_arena_mode_names_base; i < + for (int i = percpu_arena_mode_names_base; i < percpu_arena_mode_names_limit; i++) { if (strncmp(percpu_arena_mode_names[i], v, vlen) == 0) { @@ -1155,6 +1170,10 @@ malloc_conf_init(void) { } CONF_HANDLE_BOOL(opt_background_thread, "background_thread"); + CONF_HANDLE_SIZE_T(opt_max_background_threads, + "max_background_threads", 1, + opt_max_background_threads, yes, yes, + true); if (config_prof) { CONF_HANDLE_BOOL(opt_prof, "prof") CONF_HANDLE_CHAR_P(opt_prof_prefix, @@ -1173,6 +1192,37 @@ malloc_conf_init(void) { CONF_HANDLE_BOOL(opt_prof_final, "prof_final") CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak") } + if (config_log) { + if (CONF_MATCH("log")) { + size_t cpylen = ( + vlen <= sizeof(log_var_names) ? + vlen : sizeof(log_var_names) - 1); + strncpy(log_var_names, v, cpylen); + log_var_names[cpylen] = '\0'; + continue; + } + } + if (CONF_MATCH("thp")) { + bool match = false; + for (int i = 0; i < thp_mode_names_limit; i++) { + if (strncmp(thp_mode_names[i],v, vlen) + == 0) { + if (!have_madvise_huge) { + malloc_conf_error( + "No THP support", + k, klen, v, vlen); + } + opt_thp = i; + match = true; + break; + } + } + if (!match) { + malloc_conf_error("Invalid conf value", + k, klen, v, vlen); + } + continue; + } malloc_conf_error("Invalid conf pair", k, klen, v, vlen); #undef CONF_MATCH @@ -1188,7 +1238,11 @@ malloc_conf_init(void) { #undef CONF_HANDLE_SSIZE_T #undef CONF_HANDLE_CHAR_P } + if (opt_abort_conf && had_conf_error) { + malloc_abort_invalid_conf(); + } } + atomic_store_b(&log_init_done, true, ATOMIC_RELEASE); } static bool @@ -1493,6 +1547,8 @@ malloc_init_hard(void) { post_reentrancy(tsd); malloc_mutex_unlock(tsd_tsdn(tsd), &init_lock); + witness_assert_lockless(witness_tsd_tsdn( + tsd_witness_tsdp_get_unsafe(tsd))); malloc_tsd_boot1(); /* Update TSD after tsd_boot1. */ tsd = tsd_fetch(); @@ -1500,8 +1556,11 @@ malloc_init_hard(void) { assert(have_background_thread); /* * Need to finish init & unlock first before creating background - * threads (pthread_create depends on malloc). + * threads (pthread_create depends on malloc). ctl_init (which + * sets isthreaded) needs to be called without holding any lock. */ + background_thread_ctl_init(tsd_tsdn(tsd)); + malloc_mutex_lock(tsd_tsdn(tsd), &background_thread_lock); bool err = background_thread_create(tsd, 0); malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock); @@ -1701,7 +1760,7 @@ compute_size_with_overflow(bool may_overflow, dynamic_opts_t *dopts, } /* A size_t with its high-half bits all set to 1. */ - const static size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2); + static const size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2); *size = dopts->item_size * dopts->num_items; @@ -1962,6 +2021,8 @@ je_malloc(size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.malloc.entry", "size: %zu", size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -1976,6 +2037,8 @@ je_malloc(size_t size) { imalloc(&sopts, &dopts); + LOG("core.malloc.exit", "result: %p", ret); + return ret; } @@ -1986,6 +2049,9 @@ je_posix_memalign(void **memptr, size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.posix_memalign.entry", "mem ptr: %p, alignment: %zu, " + "size: %zu", memptr, alignment, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2002,6 +2068,10 @@ je_posix_memalign(void **memptr, size_t alignment, size_t size) { dopts.alignment = alignment; ret = imalloc(&sopts, &dopts); + + LOG("core.posix_memalign.exit", "result: %d, alloc ptr: %p", ret, + *memptr); + return ret; } @@ -2014,6 +2084,9 @@ je_aligned_alloc(size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.aligned_alloc.entry", "alignment: %zu, size: %zu\n", + alignment, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2032,6 +2105,9 @@ je_aligned_alloc(size_t alignment, size_t size) { dopts.alignment = alignment; imalloc(&sopts, &dopts); + + LOG("core.aligned_alloc.exit", "result: %p", ret); + return ret; } @@ -2043,6 +2119,8 @@ je_calloc(size_t num, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.calloc.entry", "num: %zu, size: %zu\n", num, size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2059,6 +2137,8 @@ je_calloc(size_t num, size_t size) { imalloc(&sopts, &dopts); + LOG("core.calloc.exit", "result: %p", ret); + return ret; } @@ -2161,17 +2241,37 @@ isfree(tsd_t *tsd, void *ptr, size_t usize, tcache_t *tcache, bool slow_path) { assert(malloc_initialized() || IS_INITIALIZER); alloc_ctx_t alloc_ctx, *ctx; - if (config_prof && opt_prof) { + if (!config_cache_oblivious && ((uintptr_t)ptr & PAGE_MASK) != 0) { + /* + * When cache_oblivious is disabled and ptr is not page aligned, + * the allocation was not sampled -- usize can be used to + * determine szind directly. + */ + alloc_ctx.szind = sz_size2index(usize); + alloc_ctx.slab = true; + ctx = &alloc_ctx; + if (config_debug) { + alloc_ctx_t dbg_ctx; + rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); + rtree_szind_slab_read(tsd_tsdn(tsd), &extents_rtree, + rtree_ctx, (uintptr_t)ptr, true, &dbg_ctx.szind, + &dbg_ctx.slab); + assert(dbg_ctx.szind == alloc_ctx.szind); + assert(dbg_ctx.slab == alloc_ctx.slab); + } + } else if (config_prof && opt_prof) { rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); rtree_szind_slab_read(tsd_tsdn(tsd), &extents_rtree, rtree_ctx, (uintptr_t)ptr, true, &alloc_ctx.szind, &alloc_ctx.slab); assert(alloc_ctx.szind == sz_size2index(usize)); ctx = &alloc_ctx; - prof_free(tsd, ptr, usize, ctx); } else { ctx = NULL; } + if (config_prof && opt_prof) { + prof_free(tsd, ptr, usize, ctx); + } if (config_stats) { *tsd_thread_deallocatedp_get(tsd) += usize; } @@ -2192,6 +2292,8 @@ je_realloc(void *ptr, size_t size) { size_t usize JEMALLOC_CC_SILENCE_INIT(0); size_t old_usize = 0; + LOG("core.realloc.entry", "ptr: %p, size: %zu\n", ptr, size); + if (unlikely(size == 0)) { if (ptr != NULL) { /* realloc(ptr, 0) is equivalent to free(ptr). */ @@ -2204,6 +2306,8 @@ je_realloc(void *ptr, size_t size) { tcache = NULL; } ifree(tsd, ptr, tcache, true); + + LOG("core.realloc.exit", "result: %p", NULL); return NULL; } size = 1; @@ -2236,7 +2340,9 @@ je_realloc(void *ptr, size_t size) { tsdn = tsd_tsdn(tsd); } else { /* realloc(NULL, size) is equivalent to malloc(size). */ - return je_malloc(size); + void *ret = je_malloc(size); + LOG("core.realloc.exit", "result: %p", ret); + return ret; } if (unlikely(ret == NULL)) { @@ -2257,11 +2363,15 @@ je_realloc(void *ptr, size_t size) { } UTRACE(ptr, size, ret); check_entry_exit_locking(tsdn); + + LOG("core.realloc.exit", "result: %p", ret); return ret; } JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_free(void *ptr) { + LOG("core.free.entry", "ptr: %p", ptr); + UTRACE(ptr, 0, 0); if (likely(ptr != NULL)) { /* @@ -2291,6 +2401,7 @@ je_free(void *ptr) { } check_entry_exit_locking(tsd_tsdn(tsd)); } + LOG("core.free.exit", ""); } /* @@ -2310,6 +2421,9 @@ je_memalign(size_t alignment, size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.memalign.entry", "alignment: %zu, size: %zu\n", alignment, + size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2327,6 +2441,8 @@ je_memalign(size_t alignment, size_t size) { dopts.alignment = alignment; imalloc(&sopts, &dopts); + + LOG("core.memalign.exit", "result: %p", ret); return ret; } #endif @@ -2341,6 +2457,8 @@ je_valloc(size_t size) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.valloc.entry", "size: %zu\n", size); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2359,6 +2477,7 @@ je_valloc(size_t size) { imalloc(&sopts, &dopts); + LOG("core.valloc.exit", "result: %p\n", ret); return ret; } #endif @@ -2432,6 +2551,8 @@ je_mallocx(size_t size, int flags) { static_opts_t sopts; dynamic_opts_t dopts; + LOG("core.mallocx.entry", "size: %zu, flags: %d", size, flags); + static_opts_init(&sopts); dynamic_opts_init(&dopts); @@ -2465,6 +2586,8 @@ je_mallocx(size_t size, int flags) { } imalloc(&sopts, &dopts); + + LOG("core.mallocx.exit", "result: %p", ret); return ret; } @@ -2545,6 +2668,10 @@ je_rallocx(void *ptr, size_t size, int flags) { arena_t *arena; tcache_t *tcache; + LOG("core.rallocx.entry", "ptr: %p, size: %zu, flags: %d", ptr, + size, flags); + + assert(ptr != NULL); assert(size != 0); assert(malloc_initialized() || IS_INITIALIZER); @@ -2607,6 +2734,8 @@ je_rallocx(void *ptr, size_t size, int flags) { } UTRACE(ptr, size, p); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.rallocx.exit", "result: %p", p); return p; label_oom: if (config_xmalloc && unlikely(opt_xmalloc)) { @@ -2615,6 +2744,8 @@ label_oom: } UTRACE(ptr, size, 0); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.rallocx.exit", "result: %p", NULL); return NULL; } @@ -2701,6 +2832,9 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags) { size_t alignment = MALLOCX_ALIGN_GET(flags); bool zero = flags & MALLOCX_ZERO; + LOG("core.xallocx.entry", "ptr: %p, size: %zu, extra: %zu, " + "flags: %d", ptr, size, extra, flags); + assert(ptr != NULL); assert(size != 0); assert(SIZE_T_MAX - size >= extra); @@ -2750,15 +2884,19 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags) { label_not_resized: UTRACE(ptr, size, ptr); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.xallocx.exit", "result: %zu", usize); return usize; } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW JEMALLOC_ATTR(pure) -je_sallocx(const void *ptr, int flags) { +je_sallocx(const void *ptr, UNUSED int flags) { size_t usize; tsdn_t *tsdn; + LOG("core.sallocx.entry", "ptr: %p, flags: %d", ptr, flags); + assert(malloc_initialized() || IS_INITIALIZER); assert(ptr != NULL); @@ -2773,11 +2911,15 @@ je_sallocx(const void *ptr, int flags) { } check_entry_exit_locking(tsdn); + + LOG("core.sallocx.exit", "result: %zu", usize); return usize; } JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_dallocx(void *ptr, int flags) { + LOG("core.dallocx.entry", "ptr: %p, flags: %d", ptr, flags); + assert(ptr != NULL); assert(malloc_initialized() || IS_INITIALIZER); @@ -2815,6 +2957,8 @@ je_dallocx(void *ptr, int flags) { ifree(tsd, ptr, tcache, true); } check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.dallocx.exit", ""); } JEMALLOC_ALWAYS_INLINE size_t @@ -2836,6 +2980,9 @@ je_sdallocx(void *ptr, size_t size, int flags) { assert(ptr != NULL); assert(malloc_initialized() || IS_INITIALIZER); + LOG("core.sdallocx.entry", "ptr: %p, size: %zu, flags: %d", ptr, + size, flags); + tsd_t *tsd = tsd_fetch(); bool fast = tsd_fast(tsd); size_t usize = inallocx(tsd_tsdn(tsd), size, flags); @@ -2872,6 +3019,8 @@ je_sdallocx(void *ptr, size_t size, int flags) { isfree(tsd, ptr, usize, tcache, true); } check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.sdallocx.exit", ""); } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @@ -2883,6 +3032,7 @@ je_nallocx(size_t size, int flags) { assert(size != 0); if (unlikely(malloc_init())) { + LOG("core.nallocx.exit", "result: %zu", ZU(0)); return 0; } @@ -2891,10 +3041,12 @@ je_nallocx(size_t size, int flags) { usize = inallocx(tsdn, size, flags); if (unlikely(usize > LARGE_MAXCLASS)) { + LOG("core.nallocx.exit", "result: %zu", ZU(0)); return 0; } check_entry_exit_locking(tsdn); + LOG("core.nallocx.exit", "result: %zu", usize); return usize; } @@ -2904,7 +3056,10 @@ je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, int ret; tsd_t *tsd; + LOG("core.mallctl.entry", "name: %s", name); + if (unlikely(malloc_init())) { + LOG("core.mallctl.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2912,6 +3067,8 @@ je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_byname(tsd, name, oldp, oldlenp, newp, newlen); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.mallctl.exit", "result: %d", ret); return ret; } @@ -2919,7 +3076,10 @@ JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) { int ret; + LOG("core.mallctlnametomib.entry", "name: %s", name); + if (unlikely(malloc_init())) { + LOG("core.mallctlnametomib.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2927,6 +3087,8 @@ je_mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp) { check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_nametomib(tsd, name, mibp, miblenp); check_entry_exit_locking(tsd_tsdn(tsd)); + + LOG("core.mallctlnametomib.exit", "result: %d", ret); return ret; } @@ -2936,7 +3098,10 @@ je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, int ret; tsd_t *tsd; + LOG("core.mallctlbymib.entry", ""); + if (unlikely(malloc_init())) { + LOG("core.mallctlbymib.exit", "result: %d", EAGAIN); return EAGAIN; } @@ -2944,6 +3109,7 @@ je_mallctlbymib(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, check_entry_exit_locking(tsd_tsdn(tsd)); ret = ctl_bymib(tsd, mib, miblen, oldp, oldlenp, newp, newlen); check_entry_exit_locking(tsd_tsdn(tsd)); + LOG("core.mallctlbymib.exit", "result: %d", ret); return ret; } @@ -2952,10 +3118,13 @@ je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque, const char *opts) { tsdn_t *tsdn; + LOG("core.malloc_stats_print.entry", ""); + tsdn = tsdn_fetch(); check_entry_exit_locking(tsdn); stats_print(write_cb, cbopaque, opts); check_entry_exit_locking(tsdn); + LOG("core.malloc_stats_print.exit", ""); } JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @@ -2963,6 +3132,8 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { size_t ret; tsdn_t *tsdn; + LOG("core.malloc_usable_size.entry", "ptr: %p", ptr); + assert(malloc_initialized() || IS_INITIALIZER); tsdn = tsdn_fetch(); @@ -2980,6 +3151,7 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { } check_entry_exit_locking(tsdn); + LOG("core.malloc_usable_size.exit", "result: %zu", ret); return ret; } diff --git a/dep/jemalloc/src/jemalloc_cpp.cpp b/dep/jemalloc/src/jemalloc_cpp.cpp index 844ab398a71..f0ceddae33a 100644 --- a/dep/jemalloc/src/jemalloc_cpp.cpp +++ b/dep/jemalloc/src/jemalloc_cpp.cpp @@ -39,12 +39,10 @@ void operator delete(void *ptr, std::size_t size) noexcept; void operator delete[](void *ptr, std::size_t size) noexcept; #endif -template -void * -newImpl(std::size_t size) noexcept(IsNoExcept) { - void *ptr = je_malloc(size); - if (likely(ptr != nullptr)) - return ptr; +JEMALLOC_NOINLINE +static void * +handleOOM(std::size_t size, bool nothrow) { + void *ptr = nullptr; while (ptr == nullptr) { std::new_handler handler; @@ -68,11 +66,22 @@ newImpl(std::size_t size) noexcept(IsNoExcept) { ptr = je_malloc(size); } - if (ptr == nullptr && !IsNoExcept) + if (ptr == nullptr && !nothrow) std::__throw_bad_alloc(); return ptr; } +template +JEMALLOC_ALWAYS_INLINE +void * +newImpl(std::size_t size) noexcept(IsNoExcept) { + void *ptr = je_malloc(size); + if (likely(ptr != nullptr)) + return ptr; + + return handleOOM(size, IsNoExcept); +} + void * operator new(std::size_t size) { return newImpl(size); diff --git a/dep/jemalloc/src/log.c b/dep/jemalloc/src/log.c new file mode 100644 index 00000000000..778902fb9b8 --- /dev/null +++ b/dep/jemalloc/src/log.c @@ -0,0 +1,78 @@ +#include "jemalloc/internal/jemalloc_preamble.h" +#include "jemalloc/internal/jemalloc_internal_includes.h" + +#include "jemalloc/internal/log.h" + +char log_var_names[JEMALLOC_LOG_VAR_BUFSIZE]; +atomic_b_t log_init_done = ATOMIC_INIT(false); + +/* + * Returns true if we were able to pick out a segment. Fills in r_segment_end + * with a pointer to the first character after the end of the string. + */ +static const char * +log_var_extract_segment(const char* segment_begin) { + const char *end; + for (end = segment_begin; *end != '\0' && *end != '|'; end++) { + } + return end; +} + +static bool +log_var_matches_segment(const char *segment_begin, const char *segment_end, + const char *log_var_begin, const char *log_var_end) { + assert(segment_begin <= segment_end); + assert(log_var_begin < log_var_end); + + ptrdiff_t segment_len = segment_end - segment_begin; + ptrdiff_t log_var_len = log_var_end - log_var_begin; + /* The special '.' segment matches everything. */ + if (segment_len == 1 && *segment_begin == '.') { + return true; + } + if (segment_len == log_var_len) { + return strncmp(segment_begin, log_var_begin, segment_len) == 0; + } else if (segment_len < log_var_len) { + return strncmp(segment_begin, log_var_begin, segment_len) == 0 + && log_var_begin[segment_len] == '.'; + } else { + return false; + } +} + +unsigned +log_var_update_state(log_var_t *log_var) { + const char *log_var_begin = log_var->name; + const char *log_var_end = log_var->name + strlen(log_var->name); + + /* Pointer to one before the beginning of the current segment. */ + const char *segment_begin = log_var_names; + + /* + * If log_init done is false, we haven't parsed the malloc conf yet. To + * avoid log-spew, we default to not displaying anything. + */ + if (!atomic_load_b(&log_init_done, ATOMIC_ACQUIRE)) { + return LOG_INITIALIZED_NOT_ENABLED; + } + + while (true) { + const char *segment_end = log_var_extract_segment( + segment_begin); + assert(segment_end < log_var_names + JEMALLOC_LOG_VAR_BUFSIZE); + if (log_var_matches_segment(segment_begin, segment_end, + log_var_begin, log_var_end)) { + atomic_store_u(&log_var->state, LOG_ENABLED, + ATOMIC_RELAXED); + return LOG_ENABLED; + } + if (*segment_end == '\0') { + /* Hit the end of the segment string with no match. */ + atomic_store_u(&log_var->state, + LOG_INITIALIZED_NOT_ENABLED, ATOMIC_RELAXED); + return LOG_INITIALIZED_NOT_ENABLED; + } + /* Otherwise, skip the delimiter and continue. */ + segment_begin = segment_end + 1; + } +} diff --git a/dep/jemalloc/src/malloc_io.c b/dep/jemalloc/src/malloc_io.c index 6b99afcd3fc..7bdc13f9519 100644 --- a/dep/jemalloc/src/malloc_io.c +++ b/dep/jemalloc/src/malloc_io.c @@ -70,20 +70,7 @@ static char *x2s(uintmax_t x, bool alt_form, bool uppercase, char *s, /* malloc_message() setup. */ static void wrtmessage(void *cbopaque, const char *s) { -#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write) - /* - * Use syscall(2) rather than write(2) when possible in order to avoid - * the possibility of memory allocation within libc. This is necessary - * on FreeBSD; most operating systems do not have this problem though. - * - * syscall() returns long or int, depending on platform, so capture the - * unused result in the widest plausible type to avoid compiler - * warnings. - */ - UNUSED long result = syscall(SYS_write, STDERR_FILENO, s, strlen(s)); -#else - UNUSED ssize_t result = write(STDERR_FILENO, s, strlen(s)); -#endif + malloc_write_fd(STDERR_FILENO, s, strlen(s)); } JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); @@ -111,7 +98,7 @@ buferror(int err, char *buf, size_t buflen) { FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (LPSTR)buf, (DWORD)buflen, NULL); return 0; -#elif defined(__GLIBC__) && defined(_GNU_SOURCE) +#elif defined(JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE) && defined(_GNU_SOURCE) char *b = strerror_r(err, buf, buflen); if (b != buf) { strncpy(buf, b, buflen); diff --git a/dep/jemalloc/src/mutex.c b/dep/jemalloc/src/mutex.c index a528ef0c243..30222b3e582 100644 --- a/dep/jemalloc/src/mutex.c +++ b/dep/jemalloc/src/mutex.c @@ -4,6 +4,7 @@ #include "jemalloc/internal/assert.h" #include "jemalloc/internal/malloc_io.h" +#include "jemalloc/internal/spin.h" #ifndef _CRT_SPINCOUNT #define _CRT_SPINCOUNT 4000 @@ -53,7 +54,7 @@ malloc_mutex_lock_slow(malloc_mutex_t *mutex) { int cnt = 0, max_cnt = MALLOC_MUTEX_MAX_SPIN; do { - CPU_SPINWAIT; + spin_cpu_spinwait(); if (!malloc_mutex_trylock_final(mutex)) { data->n_spin_acquired++; return; @@ -173,7 +174,7 @@ malloc_mutex_init(malloc_mutex_t *mutex, const char *name, mutex->lock_order = lock_order; if (lock_order == malloc_mutex_address_ordered) { witness_init(&mutex->witness, name, rank, - mutex_addr_comp, &mutex); + mutex_addr_comp, mutex); } else { witness_init(&mutex->witness, name, rank, NULL, NULL); } diff --git a/dep/jemalloc/src/pages.c b/dep/jemalloc/src/pages.c index fec64dd01d7..26002692d60 100644 --- a/dep/jemalloc/src/pages.c +++ b/dep/jemalloc/src/pages.c @@ -10,6 +10,9 @@ #ifdef JEMALLOC_SYSCTL_VM_OVERCOMMIT #include +#ifdef __FreeBSD__ +#include +#endif #endif /******************************************************************************/ @@ -25,6 +28,18 @@ static int mmap_flags; #endif static bool os_overcommits; +const char *thp_mode_names[] = { + "default", + "always", + "never", + "not supported" +}; +thp_mode_t opt_thp = THP_MODE_DEFAULT; +thp_mode_t init_system_thp_mode; + +/* Runtime support for lazy purge. Irrelevant when !pages_can_purge_lazy. */ +static bool pages_can_purge_lazy_runtime = true; + /******************************************************************************/ /* * Function prototypes for static functions that are referenced prior to @@ -252,12 +267,25 @@ pages_purge_lazy(void *addr, size_t size) { if (!pages_can_purge_lazy) { return true; } + if (!pages_can_purge_lazy_runtime) { + /* + * Built with lazy purge enabled, but detected it was not + * supported on the current system. + */ + return true; + } #ifdef _WIN32 VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE); return false; #elif defined(JEMALLOC_PURGE_MADVISE_FREE) - return (madvise(addr, size, MADV_FREE) != 0); + return (madvise(addr, size, +# ifdef MADV_FREE + MADV_FREE +# else + JEMALLOC_MADV_FREE +# endif + ) != 0); #elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \ !defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS) return (madvise(addr, size, MADV_DONTNEED) != 0); @@ -286,12 +314,13 @@ pages_purge_forced(void *addr, size_t size) { #endif } -bool -pages_huge(void *addr, size_t size) { - assert(HUGEPAGE_ADDR2BASE(addr) == addr); - assert(HUGEPAGE_CEILING(size) == size); - -#ifdef JEMALLOC_THP +static bool +pages_huge_impl(void *addr, size_t size, bool aligned) { + if (aligned) { + assert(HUGEPAGE_ADDR2BASE(addr) == addr); + assert(HUGEPAGE_CEILING(size) == size); + } +#ifdef JEMALLOC_HAVE_MADVISE_HUGE return (madvise(addr, size, MADV_HUGEPAGE) != 0); #else return true; @@ -299,23 +328,70 @@ pages_huge(void *addr, size_t size) { } bool -pages_nohuge(void *addr, size_t size) { - assert(HUGEPAGE_ADDR2BASE(addr) == addr); - assert(HUGEPAGE_CEILING(size) == size); +pages_huge(void *addr, size_t size) { + return pages_huge_impl(addr, size, true); +} -#ifdef JEMALLOC_THP +static bool +pages_huge_unaligned(void *addr, size_t size) { + return pages_huge_impl(addr, size, false); +} + +static bool +pages_nohuge_impl(void *addr, size_t size, bool aligned) { + if (aligned) { + assert(HUGEPAGE_ADDR2BASE(addr) == addr); + assert(HUGEPAGE_CEILING(size) == size); + } + +#ifdef JEMALLOC_HAVE_MADVISE_HUGE return (madvise(addr, size, MADV_NOHUGEPAGE) != 0); #else return false; #endif } +bool +pages_nohuge(void *addr, size_t size) { + return pages_nohuge_impl(addr, size, true); +} + +static bool +pages_nohuge_unaligned(void *addr, size_t size) { + return pages_nohuge_impl(addr, size, false); +} + +bool +pages_dontdump(void *addr, size_t size) { + assert(PAGE_ADDR2BASE(addr) == addr); + assert(PAGE_CEILING(size) == size); +#ifdef JEMALLOC_MADVISE_DONTDUMP + return madvise(addr, size, MADV_DONTDUMP) != 0; +#else + return false; +#endif +} + +bool +pages_dodump(void *addr, size_t size) { + assert(PAGE_ADDR2BASE(addr) == addr); + assert(PAGE_CEILING(size) == size); +#ifdef JEMALLOC_MADVISE_DONTDUMP + return madvise(addr, size, MADV_DODUMP) != 0; +#else + return false; +#endif +} + + static size_t os_page_detect(void) { #ifdef _WIN32 SYSTEM_INFO si; GetSystemInfo(&si); return si.dwPageSize; +#elif defined(__FreeBSD__) + return getpagesize(); #else long result = sysconf(_SC_PAGESIZE); if (result == -1) { @@ -332,9 +408,19 @@ os_overcommits_sysctl(void) { size_t sz; sz = sizeof(vm_overcommit); +#if defined(__FreeBSD__) && defined(VM_OVERCOMMIT) + int mib[2]; + + mib[0] = CTL_VM; + mib[1] = VM_OVERCOMMIT; + if (sysctl(mib, 2, &vm_overcommit, &sz, NULL, 0) != 0) { + return false; /* Error. */ + } +#else if (sysctlbyname("vm.overcommit", &vm_overcommit, &sz, NULL, 0) != 0) { return false; /* Error. */ } +#endif return ((vm_overcommit & 0x3) == 0); } @@ -350,27 +436,44 @@ static bool os_overcommits_proc(void) { int fd; char buf[1]; - ssize_t nread; #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open) - fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY | - O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY | + O_CLOEXEC); + #else + fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #elif defined(JEMALLOC_USE_SYSCALL) && defined(SYS_openat) - fd = (int)syscall(SYS_openat, - AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = (int)syscall(SYS_openat, + AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #else + fd = (int)syscall(SYS_openat, + AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #else - fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #if defined(O_CLOEXEC) + fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY | O_CLOEXEC); + #else + fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY); + if (fd != -1) { + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + #endif #endif + if (fd == -1) { return false; /* Error. */ } -#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read) - nread = (ssize_t)syscall(SYS_read, fd, &buf, sizeof(buf)); -#else - nread = read(fd, &buf, sizeof(buf)); -#endif - + ssize_t nread = malloc_read_fd(fd, &buf, sizeof(buf)); #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close) syscall(SYS_close, fd); #else @@ -390,6 +493,71 @@ os_overcommits_proc(void) { } #endif +void +pages_set_thp_state (void *ptr, size_t size) { + if (opt_thp == thp_mode_default || opt_thp == init_system_thp_mode) { + return; + } + assert(opt_thp != thp_mode_not_supported && + init_system_thp_mode != thp_mode_not_supported); + + if (opt_thp == thp_mode_always + && init_system_thp_mode != thp_mode_never) { + assert(init_system_thp_mode == thp_mode_default); + pages_huge_unaligned(ptr, size); + } else if (opt_thp == thp_mode_never) { + assert(init_system_thp_mode == thp_mode_default || + init_system_thp_mode == thp_mode_always); + pages_nohuge_unaligned(ptr, size); + } +} + +static void +init_thp_state(void) { + if (!have_madvise_huge) { + if (metadata_thp_enabled() && opt_abort) { + malloc_write(": no MADV_HUGEPAGE support\n"); + abort(); + } + goto label_error; + } + + static const char sys_state_madvise[] = "always [madvise] never\n"; + static const char sys_state_always[] = "[always] madvise never\n"; + static const char sys_state_never[] = "always madvise [never]\n"; + char buf[sizeof(sys_state_madvise)]; + +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open) + int fd = (int)syscall(SYS_open, + "/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY); +#else + int fd = open("/sys/kernel/mm/transparent_hugepage/enabled", O_RDONLY); +#endif + if (fd == -1) { + goto label_error; + } + + ssize_t nread = malloc_read_fd(fd, &buf, sizeof(buf)); +#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close) + syscall(SYS_close, fd); +#else + close(fd); +#endif + + if (strncmp(buf, sys_state_madvise, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_default; + } else if (strncmp(buf, sys_state_always, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_always; + } else if (strncmp(buf, sys_state_never, (size_t)nread) == 0) { + init_system_thp_mode = thp_mode_never; + } else { + goto label_error; + } + return; +label_error: + opt_thp = init_system_thp_mode = thp_mode_not_supported; +} + bool pages_boot(void) { os_page = os_page_detect(); @@ -418,5 +586,21 @@ pages_boot(void) { os_overcommits = false; #endif + init_thp_state(); + + /* Detect lazy purge runtime support. */ + if (pages_can_purge_lazy) { + bool committed = false; + void *madv_free_page = os_pages_map(NULL, PAGE, PAGE, &committed); + if (madv_free_page == NULL) { + return true; + } + assert(pages_can_purge_lazy_runtime); + if (pages_purge_lazy(madv_free_page, PAGE)) { + pages_can_purge_lazy_runtime = false; + } + os_pages_unmap(madv_free_page, PAGE); + } + return false; } diff --git a/dep/jemalloc/src/prof.c b/dep/jemalloc/src/prof.c index 975722c4c38..13df641a030 100644 --- a/dep/jemalloc/src/prof.c +++ b/dep/jemalloc/src/prof.c @@ -978,7 +978,7 @@ prof_dump_flush(bool propagate_err) { cassert(config_prof); - err = write(prof_dump_fd, prof_dump_buf, prof_dump_buf_end); + err = malloc_write_fd(prof_dump_fd, prof_dump_buf, prof_dump_buf_end); if (err == -1) { if (!propagate_err) { malloc_write(": write() failed during heap " @@ -1409,7 +1409,15 @@ prof_open_maps(const char *format, ...) { va_start(ap, format); malloc_vsnprintf(filename, sizeof(filename), format, ap); va_end(ap); + +#if defined(O_CLOEXEC) mfd = open(filename, O_RDONLY | O_CLOEXEC); +#else + mfd = open(filename, O_RDONLY); + if (mfd != -1) { + fcntl(mfd, F_SETFD, fcntl(mfd, F_GETFD) | FD_CLOEXEC); + } +#endif return mfd; } @@ -1463,8 +1471,9 @@ prof_dump_maps(bool propagate_err) { goto label_return; } } - nread = read(mfd, &prof_dump_buf[prof_dump_buf_end], - PROF_DUMP_BUFSIZE - prof_dump_buf_end); + nread = malloc_read_fd(mfd, + &prof_dump_buf[prof_dump_buf_end], PROF_DUMP_BUFSIZE + - prof_dump_buf_end); } while (nread > 0); } else { ret = true; @@ -1772,7 +1781,7 @@ prof_idump(tsdn_t *tsdn) { cassert(config_prof); - if (!prof_booted || tsdn_null(tsdn)) { + if (!prof_booted || tsdn_null(tsdn) || !prof_active_get_unlocked()) { return; } tsd = tsdn_tsd(tsdn); @@ -1829,7 +1838,7 @@ prof_gdump(tsdn_t *tsdn) { cassert(config_prof); - if (!prof_booted || tsdn_null(tsdn)) { + if (!prof_booted || tsdn_null(tsdn) || !prof_active_get_unlocked()) { return; } tsd = tsdn_tsd(tsdn); diff --git a/dep/jemalloc/src/spin.c b/dep/jemalloc/src/spin.c deleted file mode 100644 index 24372c26c94..00000000000 --- a/dep/jemalloc/src/spin.c +++ /dev/null @@ -1,4 +0,0 @@ -#define JEMALLOC_SPIN_C_ -#include "jemalloc/internal/jemalloc_preamble.h" - -#include "jemalloc/internal/spin.h" diff --git a/dep/jemalloc/src/stats.c b/dep/jemalloc/src/stats.c index 087df7676e9..08b9507cfe9 100644 --- a/dep/jemalloc/src/stats.c +++ b/dep/jemalloc/src/stats.c @@ -4,6 +4,7 @@ #include "jemalloc/internal/assert.h" #include "jemalloc/internal/ctl.h" +#include "jemalloc/internal/emitter.h" #include "jemalloc/internal/mutex.h" #include "jemalloc/internal/mutex_prof.h" @@ -84,41 +85,138 @@ gen_mutex_ctl_str(char *str, size_t buf_len, const char *prefix, } static void -read_arena_bin_mutex_stats(unsigned arena_ind, unsigned bin_ind, - uint64_t results[mutex_prof_num_counters]) { +mutex_stats_init_cols(emitter_row_t *row, const char *table_name, + emitter_col_t *name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + mutex_prof_uint64_t_counter_ind_t k_uint64_t = 0; + mutex_prof_uint32_t_counter_ind_t k_uint32_t = 0; + + emitter_col_t *col; + + if (name != NULL) { + emitter_col_init(name, row); + name->justify = emitter_justify_left; + name->width = 21; + name->type = emitter_type_title; + name->str_val = table_name; + } + +#define WIDTH_uint32_t 12 +#define WIDTH_uint64_t 16 +#define OP(counter, counter_type, human) \ + col = &col_##counter_type[k_##counter_type]; \ + ++k_##counter_type; \ + emitter_col_init(col, row); \ + col->justify = emitter_justify_right; \ + col->width = WIDTH_##counter_type; \ + col->type = emitter_type_title; \ + col->str_val = human; + MUTEX_PROF_COUNTERS +#undef OP +#undef WIDTH_uint32_t +#undef WIDTH_uint64_t +} + +static void +mutex_stats_read_global(const char *name, emitter_col_t *col_name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { char cmd[MUTEX_CTL_STR_MAX_LENGTH]; -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "arenas.0.bins.0","mutex", #c); \ - CTL_M2_M4_GET(cmd, arena_ind, bin_ind, \ - (t *)&results[mutex_counter_##c], t); -MUTEX_PROF_COUNTERS + + col_name->str_val = name; + + emitter_col_t *dst; +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "mutexes", name, #counter); \ + CTL_GET(cmd, (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS #undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t } static void -mutex_stats_output_json(void (*write_cb)(void *, const char *), void *cbopaque, - const char *name, uint64_t stats[mutex_prof_num_counters], - const char *json_indent, bool last) { - malloc_cprintf(write_cb, cbopaque, "%s\"%s\": {\n", json_indent, name); +mutex_stats_read_arena(unsigned arena_ind, mutex_prof_arena_ind_t mutex_ind, + const char *name, emitter_col_t *col_name, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + char cmd[MUTEX_CTL_STR_MAX_LENGTH]; - mutex_prof_counter_ind_t k = 0; - char *fmt_str[2] = {"%s\t\"%s\": %"FMTu32"%s\n", - "%s\t\"%s\": %"FMTu64"%s\n"}; -#define OP(c, t) \ - malloc_cprintf(write_cb, cbopaque, \ - fmt_str[sizeof(t) / sizeof(uint32_t) - 1], \ - json_indent, #c, (t)stats[mutex_counter_##c], \ - (++k == mutex_prof_num_counters) ? "" : ","); -MUTEX_PROF_COUNTERS + col_name->str_val = name; + + emitter_col_t *dst; +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "arenas.0.mutexes", arena_mutex_names[mutex_ind], #counter);\ + CTL_M2_GET(cmd, arena_ind, \ + (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS #undef OP - malloc_cprintf(write_cb, cbopaque, "%s}%s\n", json_indent, - last ? "" : ","); +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t } static void -stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool large, bool mutex, unsigned i) { +mutex_stats_read_arena_bin(unsigned arena_ind, unsigned bin_ind, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + char cmd[MUTEX_CTL_STR_MAX_LENGTH]; + emitter_col_t *dst; + +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, counter_type, human) \ + dst = &col_##counter_type[mutex_counter_##counter]; \ + dst->type = EMITTER_TYPE_##counter_type; \ + gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ + "arenas.0.bins.0","mutex", #counter); \ + CTL_M2_M4_GET(cmd, arena_ind, bin_ind, \ + (counter_type *)&dst->bool_val, counter_type); + MUTEX_PROF_COUNTERS +#undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t +} + +/* "row" can be NULL to avoid emitting in table mode. */ +static void +mutex_stats_emit(emitter_t *emitter, emitter_row_t *row, + emitter_col_t col_uint64_t[mutex_prof_num_uint64_t_counters], + emitter_col_t col_uint32_t[mutex_prof_num_uint32_t_counters]) { + if (row != NULL) { + emitter_table_row(emitter, row); + } + + mutex_prof_uint64_t_counter_ind_t k_uint64_t = 0; + mutex_prof_uint32_t_counter_ind_t k_uint32_t = 0; + + emitter_col_t *col; + +#define EMITTER_TYPE_uint32_t emitter_type_uint32 +#define EMITTER_TYPE_uint64_t emitter_type_uint64 +#define OP(counter, type, human) \ + col = &col_##type[k_##type]; \ + ++k_##type; \ + emitter_json_kv(emitter, #counter, EMITTER_TYPE_##type, \ + (const void *)&col->bool_val); + MUTEX_PROF_COUNTERS; +#undef OP +#undef EMITTER_TYPE_uint32_t +#undef EMITTER_TYPE_uint64_t +} + +static void +stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i) { size_t page; bool in_gap, in_gap_prev; unsigned nbins, j; @@ -126,18 +224,71 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.page", &page, size_t); CTL_GET("arenas.nbins", &nbins, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"bins\": [\n"); - } else { - char *mutex_counters = " n_lock_ops n_waiting" - " n_spin_acq total_wait_ns max_wait_ns\n"; - malloc_cprintf(write_cb, cbopaque, - "bins: size ind allocated nmalloc" - " ndalloc nrequests curregs curslabs regs" - " pgs util nfills nflushes newslabs" - " reslabs%s", mutex ? mutex_counters : "\n"); + + emitter_row_t header_row; + emitter_row_init(&header_row); + + emitter_row_t row; + emitter_row_init(&row); +#define COL(name, left_or_right, col_width, etype) \ + emitter_col_t col_##name; \ + emitter_col_init(&col_##name, &row); \ + col_##name.justify = emitter_justify_##left_or_right; \ + col_##name.width = col_width; \ + col_##name.type = emitter_type_##etype; \ + emitter_col_t header_col_##name; \ + emitter_col_init(&header_col_##name, &header_row); \ + header_col_##name.justify = emitter_justify_##left_or_right; \ + header_col_##name.width = col_width; \ + header_col_##name.type = emitter_type_title; \ + header_col_##name.str_val = #name; + + COL(size, right, 20, size) + COL(ind, right, 4, unsigned) + COL(allocated, right, 13, uint64) + COL(nmalloc, right, 13, uint64) + COL(ndalloc, right, 13, uint64) + COL(nrequests, right, 13, uint64) + COL(curregs, right, 13, size) + COL(curslabs, right, 13, size) + COL(regs, right, 5, unsigned) + COL(pgs, right, 4, size) + /* To buffer a right- and left-justified column. */ + COL(justify_spacer, right, 1, title) + COL(util, right, 6, title) + COL(nfills, right, 13, uint64) + COL(nflushes, right, 13, uint64) + COL(nslabs, right, 13, uint64) + COL(nreslabs, right, 13, uint64) +#undef COL + + /* Don't want to actually print the name. */ + header_col_justify_spacer.str_val = " "; + col_justify_spacer.str_val = " "; + + + emitter_col_t col_mutex64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col_mutex32[mutex_prof_num_uint32_t_counters]; + + emitter_col_t header_mutex64[mutex_prof_num_uint64_t_counters]; + emitter_col_t header_mutex32[mutex_prof_num_uint32_t_counters]; + + if (mutex) { + mutex_stats_init_cols(&row, NULL, NULL, col_mutex64, + col_mutex32); + mutex_stats_init_cols(&header_row, NULL, NULL, header_mutex64, + header_mutex32); } + + /* + * We print a "bins:" header as part of the table row; we need to adjust + * the header size column to compensate. + */ + header_col_size.width -=5; + emitter_table_printf(emitter, "bins:"); + emitter_table_row(emitter, &header_row); + emitter_json_arr_begin(emitter, "bins"); + for (j = 0, in_gap = false; j < nbins; j++) { uint64_t nslabs; size_t reg_size, slab_size, curregs; @@ -151,8 +302,8 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, in_gap_prev = in_gap; in_gap = (nslabs == 0); - if (!json && in_gap_prev && !in_gap) { - malloc_cprintf(write_cb, cbopaque, + if (in_gap_prev && !in_gap) { + emitter_table_printf(emitter, " ---\n"); } @@ -177,105 +328,127 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_M2_M4_GET("stats.arenas.0.bins.0.curslabs", i, j, &curslabs, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t{\n" - "\t\t\t\t\t\t\"nmalloc\": %"FMTu64",\n" - "\t\t\t\t\t\t\"ndalloc\": %"FMTu64",\n" - "\t\t\t\t\t\t\"curregs\": %zu,\n" - "\t\t\t\t\t\t\"nrequests\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nfills\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nflushes\": %"FMTu64",\n" - "\t\t\t\t\t\t\"nreslabs\": %"FMTu64",\n" - "\t\t\t\t\t\t\"curslabs\": %zu%s\n", - nmalloc, ndalloc, curregs, nrequests, nfills, - nflushes, nreslabs, curslabs, mutex ? "," : ""); - if (mutex) { - uint64_t mutex_stats[mutex_prof_num_counters]; - read_arena_bin_mutex_stats(i, j, mutex_stats); - mutex_stats_output_json(write_cb, cbopaque, - "mutex", mutex_stats, "\t\t\t\t\t\t", true); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t}%s\n", - (j + 1 < nbins) ? "," : ""); - } else if (!in_gap) { - size_t availregs = nregs * curslabs; - char util[6]; - if (get_rate_str((uint64_t)curregs, (uint64_t)availregs, - util)) { - if (availregs == 0) { - malloc_snprintf(util, sizeof(util), - "1"); - } else if (curregs > availregs) { - /* - * Race detected: the counters were read - * in separate mallctl calls and - * concurrent operations happened in - * between. In this case no meaningful - * utilization can be computed. - */ - malloc_snprintf(util, sizeof(util), - " race"); - } else { - not_reached(); - } - } - uint64_t mutex_stats[mutex_prof_num_counters]; - if (mutex) { - read_arena_bin_mutex_stats(i, j, mutex_stats); - } + if (mutex) { + mutex_stats_read_arena_bin(i, j, col_mutex64, + col_mutex32); + } - malloc_cprintf(write_cb, cbopaque, "%20zu %3u %12zu %12" - FMTu64" %12"FMTu64" %12"FMTu64" %12zu %12zu %4u" - " %3zu %-5s %12"FMTu64" %12"FMTu64" %12"FMTu64 - " %12"FMTu64, reg_size, j, curregs * reg_size, - nmalloc, ndalloc, nrequests, curregs, curslabs, - nregs, slab_size / page, util, nfills, nflushes, - nslabs, nreslabs); + emitter_json_arr_obj_begin(emitter); + emitter_json_kv(emitter, "nmalloc", emitter_type_uint64, + &nmalloc); + emitter_json_kv(emitter, "ndalloc", emitter_type_uint64, + &ndalloc); + emitter_json_kv(emitter, "curregs", emitter_type_size, + &curregs); + emitter_json_kv(emitter, "nrequests", emitter_type_uint64, + &nrequests); + emitter_json_kv(emitter, "nfills", emitter_type_uint64, + &nfills); + emitter_json_kv(emitter, "nflushes", emitter_type_uint64, + &nflushes); + emitter_json_kv(emitter, "nreslabs", emitter_type_uint64, + &nreslabs); + emitter_json_kv(emitter, "curslabs", emitter_type_size, + &curslabs); + if (mutex) { + emitter_json_dict_begin(emitter, "mutex"); + mutex_stats_emit(emitter, NULL, col_mutex64, + col_mutex32); + emitter_json_dict_end(emitter); + } + emitter_json_arr_obj_end(emitter); - /* Output less info for bin mutexes to save space. */ - if (mutex) { - malloc_cprintf(write_cb, cbopaque, - " %12"FMTu64" %12"FMTu64" %12"FMTu64 - " %14"FMTu64" %12"FMTu64"\n", - mutex_stats[mutex_counter_num_ops], - mutex_stats[mutex_counter_num_wait], - mutex_stats[mutex_counter_num_spin_acq], - mutex_stats[mutex_counter_total_wait_time], - mutex_stats[mutex_counter_max_wait_time]); + size_t availregs = nregs * curslabs; + char util[6]; + if (get_rate_str((uint64_t)curregs, (uint64_t)availregs, util)) + { + if (availregs == 0) { + malloc_snprintf(util, sizeof(util), "1"); + } else if (curregs > availregs) { + /* + * Race detected: the counters were read in + * separate mallctl calls and concurrent + * operations happened in between. In this case + * no meaningful utilization can be computed. + */ + malloc_snprintf(util, sizeof(util), " race"); } else { - malloc_cprintf(write_cb, cbopaque, "\n"); + not_reached(); } } + + col_size.size_val = reg_size; + col_ind.unsigned_val = j; + col_allocated.size_val = curregs * reg_size; + col_nmalloc.uint64_val = nmalloc; + col_ndalloc.uint64_val = ndalloc; + col_nrequests.uint64_val = nrequests; + col_curregs.size_val = curregs; + col_curslabs.size_val = curslabs; + col_regs.unsigned_val = nregs; + col_pgs.size_val = slab_size / page; + col_util.str_val = util; + col_nfills.uint64_val = nfills; + col_nflushes.uint64_val = nflushes; + col_nslabs.uint64_val = nslabs; + col_nreslabs.uint64_val = nreslabs; + + /* + * Note that mutex columns were initialized above, if mutex == + * true. + */ + + emitter_table_row(emitter, &row); } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t]%s\n", large ? "," : ""); - } else { - if (in_gap) { - malloc_cprintf(write_cb, cbopaque, - " ---\n"); - } + emitter_json_arr_end(emitter); /* Close "bins". */ + + if (in_gap) { + emitter_table_printf(emitter, " ---\n"); } } static void -stats_arena_lextents_print(void (*write_cb)(void *, const char *), - void *cbopaque, bool json, unsigned i) { +stats_arena_lextents_print(emitter_t *emitter, unsigned i) { unsigned nbins, nlextents, j; bool in_gap, in_gap_prev; CTL_GET("arenas.nbins", &nbins, unsigned); CTL_GET("arenas.nlextents", &nlextents, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"lextents\": [\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "large: size ind allocated nmalloc" - " ndalloc nrequests curlextents\n"); - } + + emitter_row_t header_row; + emitter_row_init(&header_row); + emitter_row_t row; + emitter_row_init(&row); + +#define COL(name, left_or_right, col_width, etype) \ + emitter_col_t header_##name; \ + emitter_col_init(&header_##name, &header_row); \ + header_##name.justify = emitter_justify_##left_or_right; \ + header_##name.width = col_width; \ + header_##name.type = emitter_type_title; \ + header_##name.str_val = #name; \ + \ + emitter_col_t col_##name; \ + emitter_col_init(&col_##name, &row); \ + col_##name.justify = emitter_justify_##left_or_right; \ + col_##name.width = col_width; \ + col_##name.type = emitter_type_##etype; + + COL(size, right, 20, size) + COL(ind, right, 4, unsigned) + COL(allocated, right, 13, size) + COL(nmalloc, right, 13, uint64) + COL(ndalloc, right, 13, uint64) + COL(nrequests, right, 13, uint64) + COL(curlextents, right, 13, size) +#undef COL + + /* As with bins, we label the large extents table. */ + header_size.width -= 6; + emitter_table_printf(emitter, "large:"); + emitter_table_row(emitter, &header_row); + emitter_json_arr_begin(emitter, "lextents"); + for (j = 0, in_gap = false; j < nlextents; j++) { uint64_t nmalloc, ndalloc, nrequests; size_t lextent_size, curlextents; @@ -289,119 +462,71 @@ stats_arena_lextents_print(void (*write_cb)(void *, const char *), in_gap_prev = in_gap; in_gap = (nrequests == 0); - if (!json && in_gap_prev && !in_gap) { - malloc_cprintf(write_cb, cbopaque, + if (in_gap_prev && !in_gap) { + emitter_table_printf(emitter, " ---\n"); } CTL_M2_GET("arenas.lextent.0.size", j, &lextent_size, size_t); CTL_M2_M4_GET("stats.arenas.0.lextents.0.curlextents", i, j, &curlextents, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t{\n" - "\t\t\t\t\t\t\"curlextents\": %zu\n" - "\t\t\t\t\t}%s\n", - curlextents, - (j + 1 < nlextents) ? "," : ""); - } else if (!in_gap) { - malloc_cprintf(write_cb, cbopaque, - "%20zu %3u %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64" %12zu\n", - lextent_size, nbins + j, - curlextents * lextent_size, nmalloc, ndalloc, - nrequests, curlextents); + + emitter_json_arr_obj_begin(emitter); + emitter_json_kv(emitter, "curlextents", emitter_type_size, + &curlextents); + emitter_json_arr_obj_end(emitter); + + col_size.size_val = lextent_size; + col_ind.unsigned_val = nbins + j; + col_allocated.size_val = curlextents * lextent_size; + col_nmalloc.uint64_val = nmalloc; + col_ndalloc.uint64_val = ndalloc; + col_nrequests.uint64_val = nrequests; + col_curlextents.size_val = curlextents; + + if (!in_gap) { + emitter_table_row(emitter, &row); } } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t]\n"); - } else { - if (in_gap) { - malloc_cprintf(write_cb, cbopaque, - " ---\n"); - } + emitter_json_arr_end(emitter); /* Close "lextents". */ + if (in_gap) { + emitter_table_printf(emitter, " ---\n"); } } static void -read_arena_mutex_stats(unsigned arena_ind, - uint64_t results[mutex_prof_num_arena_mutexes][mutex_prof_num_counters]) { - char cmd[MUTEX_CTL_STR_MAX_LENGTH]; +stats_arena_mutexes_print(emitter_t *emitter, unsigned arena_ind) { + emitter_row_t row; + emitter_col_t col_name; + emitter_col_t col64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col32[mutex_prof_num_uint32_t_counters]; - mutex_prof_arena_ind_t i; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "arenas.0.mutexes", arena_mutex_names[i], #c); \ - CTL_M2_GET(cmd, arena_ind, \ - (t *)&results[i][mutex_counter_##c], t); -MUTEX_PROF_COUNTERS -#undef OP + emitter_row_init(&row); + mutex_stats_init_cols(&row, "", &col_name, col64, col32); + + emitter_json_dict_begin(emitter, "mutexes"); + emitter_table_row(emitter, &row); + + for (mutex_prof_arena_ind_t i = 0; i < mutex_prof_num_arena_mutexes; + i++) { + const char *name = arena_mutex_names[i]; + emitter_json_dict_begin(emitter, name); + mutex_stats_read_arena(arena_ind, i, name, &col_name, col64, + col32); + mutex_stats_emit(emitter, &row, col64, col32); + emitter_json_dict_end(emitter); /* Close the mutex dict. */ } + emitter_json_dict_end(emitter); /* End "mutexes". */ } static void -mutex_stats_output(void (*write_cb)(void *, const char *), void *cbopaque, - const char *name, uint64_t stats[mutex_prof_num_counters], - bool first_mutex) { - if (first_mutex) { - /* Print title. */ - malloc_cprintf(write_cb, cbopaque, - " n_lock_ops n_waiting" - " n_spin_acq n_owner_switch total_wait_ns" - " max_wait_ns max_n_thds\n"); - } - - malloc_cprintf(write_cb, cbopaque, "%s", name); - malloc_cprintf(write_cb, cbopaque, ":%*c", - (int)(20 - strlen(name)), ' '); - - char *fmt_str[2] = {"%12"FMTu32, "%16"FMTu64}; -#define OP(c, t) \ - malloc_cprintf(write_cb, cbopaque, \ - fmt_str[sizeof(t) / sizeof(uint32_t) - 1], \ - (t)stats[mutex_counter_##c]); -MUTEX_PROF_COUNTERS -#undef OP - malloc_cprintf(write_cb, cbopaque, "\n"); -} - -static void -stats_arena_mutexes_print(void (*write_cb)(void *, const char *), - void *cbopaque, bool json, bool json_end, unsigned arena_ind) { - uint64_t mutex_stats[mutex_prof_num_arena_mutexes][mutex_prof_num_counters]; - read_arena_mutex_stats(arena_ind, mutex_stats); - - /* Output mutex stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, "\t\t\t\t\"mutexes\": {\n"); - mutex_prof_arena_ind_t i, last_mutex; - last_mutex = mutex_prof_num_arena_mutexes - 1; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { - mutex_stats_output_json(write_cb, cbopaque, - arena_mutex_names[i], mutex_stats[i], - "\t\t\t\t\t", (i == last_mutex)); - } - malloc_cprintf(write_cb, cbopaque, "\t\t\t\t}%s\n", - json_end ? "" : ","); - } else { - mutex_prof_arena_ind_t i; - for (i = 0; i < mutex_prof_num_arena_mutexes; i++) { - mutex_stats_output(write_cb, cbopaque, - arena_mutex_names[i], mutex_stats[i], i == 0); - } - } -} - -static void -stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, unsigned i, bool bins, bool large, bool mutex) { +stats_arena_print(emitter_t *emitter, unsigned i, bool bins, bool large, + bool mutex) { unsigned nthreads; const char *dss; ssize_t dirty_decay_ms, muzzy_decay_ms; size_t page, pactive, pdirty, pmuzzy, mapped, retained; - size_t base, internal, resident; + size_t base, internal, resident, metadata_thp; uint64_t dirty_npurge, dirty_nmadvise, dirty_purged; uint64_t muzzy_npurge, muzzy_nmadvise, muzzy_purged; size_t small_allocated; @@ -414,31 +539,16 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_GET("arenas.page", &page, size_t); CTL_M2_GET("stats.arenas.0.nthreads", i, &nthreads, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"nthreads\": %u,\n", nthreads); - } else { - malloc_cprintf(write_cb, cbopaque, - "assigned threads: %u\n", nthreads); - } + emitter_kv(emitter, "nthreads", "assigned threads", + emitter_type_unsigned, &nthreads); CTL_M2_GET("stats.arenas.0.uptime", i, &uptime, uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"uptime_ns\": %"FMTu64",\n", uptime); - } else { - malloc_cprintf(write_cb, cbopaque, - "uptime: %"FMTu64"\n", uptime); - } + emitter_kv(emitter, "uptime_ns", "uptime", emitter_type_uint64, + &uptime); CTL_M2_GET("stats.arenas.0.dss", i, &dss, const char *); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dss\": \"%s\",\n", dss); - } else { - malloc_cprintf(write_cb, cbopaque, - "dss allocation precedence: %s\n", dss); - } + emitter_kv(emitter, "dss", "dss allocation precedence", + emitter_type_string, &dss); CTL_M2_GET("stats.arenas.0.dirty_decay_ms", i, &dirty_decay_ms, ssize_t); @@ -455,205 +565,271 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, CTL_M2_GET("stats.arenas.0.muzzy_nmadvise", i, &muzzy_nmadvise, uint64_t); CTL_M2_GET("stats.arenas.0.muzzy_purged", i, &muzzy_purged, uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_decay_ms\": %zd,\n", dirty_decay_ms); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_decay_ms\": %zd,\n", muzzy_decay_ms); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pactive\": %zu,\n", pactive); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pdirty\": %zu,\n", pdirty); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"pmuzzy\": %zu,\n", pmuzzy); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_npurge\": %"FMTu64",\n", dirty_npurge); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_nmadvise\": %"FMTu64",\n", dirty_nmadvise); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"dirty_purged\": %"FMTu64",\n", dirty_purged); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_npurge\": %"FMTu64",\n", muzzy_npurge); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_nmadvise\": %"FMTu64",\n", muzzy_nmadvise); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"muzzy_purged\": %"FMTu64",\n", muzzy_purged); + + emitter_row_t decay_row; + emitter_row_init(&decay_row); + + /* JSON-style emission. */ + emitter_json_kv(emitter, "dirty_decay_ms", emitter_type_ssize, + &dirty_decay_ms); + emitter_json_kv(emitter, "muzzy_decay_ms", emitter_type_ssize, + &muzzy_decay_ms); + + emitter_json_kv(emitter, "pactive", emitter_type_size, &pactive); + emitter_json_kv(emitter, "pdirty", emitter_type_size, &pdirty); + emitter_json_kv(emitter, "pmuzzy", emitter_type_size, &pmuzzy); + + emitter_json_kv(emitter, "dirty_npurge", emitter_type_uint64, + &dirty_npurge); + emitter_json_kv(emitter, "dirty_nmadvise", emitter_type_uint64, + &dirty_nmadvise); + emitter_json_kv(emitter, "dirty_purged", emitter_type_uint64, + &dirty_purged); + + emitter_json_kv(emitter, "muzzy_npurge", emitter_type_uint64, + &muzzy_npurge); + emitter_json_kv(emitter, "muzzy_nmadvise", emitter_type_uint64, + &muzzy_nmadvise); + emitter_json_kv(emitter, "muzzy_purged", emitter_type_uint64, + &muzzy_purged); + + /* Table-style emission. */ + emitter_col_t decay_type; + emitter_col_init(&decay_type, &decay_row); + decay_type.justify = emitter_justify_right; + decay_type.width = 9; + decay_type.type = emitter_type_title; + decay_type.str_val = "decaying:"; + + emitter_col_t decay_time; + emitter_col_init(&decay_time, &decay_row); + decay_time.justify = emitter_justify_right; + decay_time.width = 6; + decay_time.type = emitter_type_title; + decay_time.str_val = "time"; + + emitter_col_t decay_npages; + emitter_col_init(&decay_npages, &decay_row); + decay_npages.justify = emitter_justify_right; + decay_npages.width = 13; + decay_npages.type = emitter_type_title; + decay_npages.str_val = "npages"; + + emitter_col_t decay_sweeps; + emitter_col_init(&decay_sweeps, &decay_row); + decay_sweeps.justify = emitter_justify_right; + decay_sweeps.width = 13; + decay_sweeps.type = emitter_type_title; + decay_sweeps.str_val = "sweeps"; + + emitter_col_t decay_madvises; + emitter_col_init(&decay_madvises, &decay_row); + decay_madvises.justify = emitter_justify_right; + decay_madvises.width = 13; + decay_madvises.type = emitter_type_title; + decay_madvises.str_val = "madvises"; + + emitter_col_t decay_purged; + emitter_col_init(&decay_purged, &decay_row); + decay_purged.justify = emitter_justify_right; + decay_purged.width = 13; + decay_purged.type = emitter_type_title; + decay_purged.str_val = "purged"; + + /* Title row. */ + emitter_table_row(emitter, &decay_row); + + /* Dirty row. */ + decay_type.str_val = "dirty:"; + + if (dirty_decay_ms >= 0) { + decay_time.type = emitter_type_ssize; + decay_time.ssize_val = dirty_decay_ms; } else { - malloc_cprintf(write_cb, cbopaque, - "decaying: time npages sweeps madvises" - " purged\n"); - if (dirty_decay_ms >= 0) { - malloc_cprintf(write_cb, cbopaque, - " dirty: %5zd %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", dirty_decay_ms, pdirty, dirty_npurge, - dirty_nmadvise, dirty_purged); - } else { - malloc_cprintf(write_cb, cbopaque, - " dirty: N/A %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", pdirty, dirty_npurge, dirty_nmadvise, - dirty_purged); - } - if (muzzy_decay_ms >= 0) { - malloc_cprintf(write_cb, cbopaque, - " muzzy: %5zd %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", muzzy_decay_ms, pmuzzy, muzzy_npurge, - muzzy_nmadvise, muzzy_purged); - } else { - malloc_cprintf(write_cb, cbopaque, - " muzzy: N/A %12zu %12"FMTu64" %12"FMTu64" %12" - FMTu64"\n", pmuzzy, muzzy_npurge, muzzy_nmadvise, - muzzy_purged); - } + decay_time.type = emitter_type_title; + decay_time.str_val = "N/A"; } - CTL_M2_GET("stats.arenas.0.small.allocated", i, &small_allocated, - size_t); - CTL_M2_GET("stats.arenas.0.small.nmalloc", i, &small_nmalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.small.ndalloc", i, &small_ndalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.small.nrequests", i, &small_nrequests, - uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"small\": {\n"); + decay_npages.type = emitter_type_size; + decay_npages.size_val = pdirty; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"allocated\": %zu,\n", small_allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nmalloc\": %"FMTu64",\n", small_nmalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"ndalloc\": %"FMTu64",\n", small_ndalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nrequests\": %"FMTu64"\n", small_nrequests); + decay_sweeps.type = emitter_type_uint64; + decay_sweeps.uint64_val = dirty_npurge; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t},\n"); + decay_madvises.type = emitter_type_uint64; + decay_madvises.uint64_val = dirty_nmadvise; + + decay_purged.type = emitter_type_uint64; + decay_purged.uint64_val = dirty_purged; + + emitter_table_row(emitter, &decay_row); + + /* Muzzy row. */ + decay_type.str_val = "muzzy:"; + + if (muzzy_decay_ms >= 0) { + decay_time.type = emitter_type_ssize; + decay_time.ssize_val = muzzy_decay_ms; } else { - malloc_cprintf(write_cb, cbopaque, - " allocated nmalloc" - " ndalloc nrequests\n"); - malloc_cprintf(write_cb, cbopaque, - "small: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - small_allocated, small_nmalloc, small_ndalloc, - small_nrequests); + decay_time.type = emitter_type_title; + decay_time.str_val = "N/A"; } - CTL_M2_GET("stats.arenas.0.large.allocated", i, &large_allocated, - size_t); - CTL_M2_GET("stats.arenas.0.large.nmalloc", i, &large_nmalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.large.ndalloc", i, &large_ndalloc, uint64_t); - CTL_M2_GET("stats.arenas.0.large.nrequests", i, &large_nrequests, - uint64_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"large\": {\n"); + decay_npages.type = emitter_type_size; + decay_npages.size_val = pmuzzy; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"allocated\": %zu,\n", large_allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nmalloc\": %"FMTu64",\n", large_nmalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"ndalloc\": %"FMTu64",\n", large_ndalloc); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nrequests\": %"FMTu64"\n", large_nrequests); + decay_sweeps.type = emitter_type_uint64; + decay_sweeps.uint64_val = muzzy_npurge; - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t},\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "large: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - large_allocated, large_nmalloc, large_ndalloc, - large_nrequests); - malloc_cprintf(write_cb, cbopaque, - "total: %12zu %12"FMTu64" %12"FMTu64 - " %12"FMTu64"\n", - small_allocated + large_allocated, small_nmalloc + - large_nmalloc, small_ndalloc + large_ndalloc, - small_nrequests + large_nrequests); - } - if (!json) { - malloc_cprintf(write_cb, cbopaque, - "active: %12zu\n", pactive * page); - } + decay_madvises.type = emitter_type_uint64; + decay_madvises.uint64_val = muzzy_nmadvise; - CTL_M2_GET("stats.arenas.0.mapped", i, &mapped, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"mapped\": %zu,\n", mapped); - } else { - malloc_cprintf(write_cb, cbopaque, - "mapped: %12zu\n", mapped); - } + decay_purged.type = emitter_type_uint64; + decay_purged.uint64_val = muzzy_purged; - CTL_M2_GET("stats.arenas.0.retained", i, &retained, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"retained\": %zu,\n", retained); - } else { - malloc_cprintf(write_cb, cbopaque, - "retained: %12zu\n", retained); - } + emitter_table_row(emitter, &decay_row); - CTL_M2_GET("stats.arenas.0.base", i, &base, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"base\": %zu,\n", base); - } else { - malloc_cprintf(write_cb, cbopaque, - "base: %12zu\n", base); - } + /* Small / large / total allocation counts. */ + emitter_row_t alloc_count_row; + emitter_row_init(&alloc_count_row); - CTL_M2_GET("stats.arenas.0.internal", i, &internal, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"internal\": %zu,\n", internal); - } else { - malloc_cprintf(write_cb, cbopaque, - "internal: %12zu\n", internal); - } + emitter_col_t alloc_count_title; + emitter_col_init(&alloc_count_title, &alloc_count_row); + alloc_count_title.justify = emitter_justify_left; + alloc_count_title.width = 25; + alloc_count_title.type = emitter_type_title; + alloc_count_title.str_val = ""; - CTL_M2_GET("stats.arenas.0.tcache_bytes", i, &tcache_bytes, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"tcache\": %zu,\n", tcache_bytes); - } else { - malloc_cprintf(write_cb, cbopaque, - "tcache: %12zu\n", tcache_bytes); - } + emitter_col_t alloc_count_allocated; + emitter_col_init(&alloc_count_allocated, &alloc_count_row); + alloc_count_allocated.justify = emitter_justify_right; + alloc_count_allocated.width = 12; + alloc_count_allocated.type = emitter_type_title; + alloc_count_allocated.str_val = "allocated"; - CTL_M2_GET("stats.arenas.0.resident", i, &resident, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"resident\": %zu%s\n", resident, - (bins || large || mutex) ? "," : ""); - } else { - malloc_cprintf(write_cb, cbopaque, - "resident: %12zu\n", resident); - } + emitter_col_t alloc_count_nmalloc; + emitter_col_init(&alloc_count_nmalloc, &alloc_count_row); + alloc_count_nmalloc.justify = emitter_justify_right; + alloc_count_nmalloc.width = 12; + alloc_count_nmalloc.type = emitter_type_title; + alloc_count_nmalloc.str_val = "nmalloc"; + + emitter_col_t alloc_count_ndalloc; + emitter_col_init(&alloc_count_ndalloc, &alloc_count_row); + alloc_count_ndalloc.justify = emitter_justify_right; + alloc_count_ndalloc.width = 12; + alloc_count_ndalloc.type = emitter_type_title; + alloc_count_ndalloc.str_val = "ndalloc"; + + emitter_col_t alloc_count_nrequests; + emitter_col_init(&alloc_count_nrequests, &alloc_count_row); + alloc_count_nrequests.justify = emitter_justify_right; + alloc_count_nrequests.width = 12; + alloc_count_nrequests.type = emitter_type_title; + alloc_count_nrequests.str_val = "nrequests"; + + emitter_table_row(emitter, &alloc_count_row); + +#define GET_AND_EMIT_ALLOC_STAT(small_or_large, name, valtype) \ + CTL_M2_GET("stats.arenas.0." #small_or_large "." #name, i, \ + &small_or_large##_##name, valtype##_t); \ + emitter_json_kv(emitter, #name, emitter_type_##valtype, \ + &small_or_large##_##name); \ + alloc_count_##name.type = emitter_type_##valtype; \ + alloc_count_##name.valtype##_val = small_or_large##_##name; + + emitter_json_dict_begin(emitter, "small"); + alloc_count_title.str_val = "small:"; + + GET_AND_EMIT_ALLOC_STAT(small, allocated, size) + GET_AND_EMIT_ALLOC_STAT(small, nmalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(small, ndalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(small, nrequests, uint64) + + emitter_table_row(emitter, &alloc_count_row); + emitter_json_dict_end(emitter); /* Close "small". */ + + emitter_json_dict_begin(emitter, "large"); + alloc_count_title.str_val = "large:"; + + GET_AND_EMIT_ALLOC_STAT(large, allocated, size) + GET_AND_EMIT_ALLOC_STAT(large, nmalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(large, ndalloc, uint64) + GET_AND_EMIT_ALLOC_STAT(large, nrequests, uint64) + + emitter_table_row(emitter, &alloc_count_row); + emitter_json_dict_end(emitter); /* Close "large". */ + +#undef GET_AND_EMIT_ALLOC_STAT + + /* Aggregated small + large stats are emitter only in table mode. */ + alloc_count_title.str_val = "total:"; + alloc_count_allocated.size_val = small_allocated + large_allocated; + alloc_count_nmalloc.uint64_val = small_nmalloc + large_nmalloc; + alloc_count_ndalloc.uint64_val = small_ndalloc + large_ndalloc; + alloc_count_nrequests.uint64_val = small_nrequests + large_nrequests; + emitter_table_row(emitter, &alloc_count_row); + + emitter_row_t mem_count_row; + emitter_row_init(&mem_count_row); + + emitter_col_t mem_count_title; + emitter_col_init(&mem_count_title, &mem_count_row); + mem_count_title.justify = emitter_justify_left; + mem_count_title.width = 25; + mem_count_title.type = emitter_type_title; + mem_count_title.str_val = ""; + + emitter_col_t mem_count_val; + emitter_col_init(&mem_count_val, &mem_count_row); + mem_count_val.justify = emitter_justify_right; + mem_count_val.width = 12; + mem_count_val.type = emitter_type_title; + mem_count_val.str_val = ""; + + emitter_table_row(emitter, &mem_count_row); + mem_count_val.type = emitter_type_size; + + /* Active count in bytes is emitted only in table mode. */ + mem_count_title.str_val = "active:"; + mem_count_val.size_val = pactive * page; + emitter_table_row(emitter, &mem_count_row); + +#define GET_AND_EMIT_MEM_STAT(stat) \ + CTL_M2_GET("stats.arenas.0."#stat, i, &stat, size_t); \ + emitter_json_kv(emitter, #stat, emitter_type_size, &stat); \ + mem_count_title.str_val = #stat":"; \ + mem_count_val.size_val = stat; \ + emitter_table_row(emitter, &mem_count_row); + + GET_AND_EMIT_MEM_STAT(mapped) + GET_AND_EMIT_MEM_STAT(retained) + GET_AND_EMIT_MEM_STAT(base) + GET_AND_EMIT_MEM_STAT(internal) + GET_AND_EMIT_MEM_STAT(metadata_thp) + GET_AND_EMIT_MEM_STAT(tcache_bytes) + GET_AND_EMIT_MEM_STAT(resident) +#undef GET_AND_EMIT_MEM_STAT if (mutex) { - stats_arena_mutexes_print(write_cb, cbopaque, json, - !(bins || large), i); + stats_arena_mutexes_print(emitter, i); } if (bins) { - stats_arena_bins_print(write_cb, cbopaque, json, large, mutex, - i); + stats_arena_bins_print(emitter, mutex, i); } if (large) { - stats_arena_lextents_print(write_cb, cbopaque, json, i); + stats_arena_lextents_print(emitter, i); } } static void -stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool more) { +stats_general_print(emitter_t *emitter) { const char *cpv; - bool bv; + bool bv, bv2; unsigned uv; uint32_t u32v; uint64_t u64v; - ssize_t ssv; + ssize_t ssv, ssv2; size_t sv, bsz, usz, ssz, sssz, cpsz; bsz = sizeof(bool); @@ -663,365 +839,248 @@ stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque, cpsz = sizeof(const char *); CTL_GET("version", &cpv, const char *); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"version\": \"%s\",\n", cpv); - } else { - malloc_cprintf(write_cb, cbopaque, "Version: %s\n", cpv); - } + emitter_kv(emitter, "version", "Version", emitter_type_string, &cpv); /* config. */ -#define CONFIG_WRITE_BOOL_JSON(n, c) \ - if (json) { \ - CTL_GET("config."#n, &bv, bool); \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : "false", \ - (c)); \ - } + emitter_dict_begin(emitter, "config", "Build-time option settings"); +#define CONFIG_WRITE_BOOL(name) \ + do { \ + CTL_GET("config."#name, &bv, bool); \ + emitter_kv(emitter, #name, "config."#name, \ + emitter_type_bool, &bv); \ + } while (0) - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"config\": {\n"); - } + CONFIG_WRITE_BOOL(cache_oblivious); + CONFIG_WRITE_BOOL(debug); + CONFIG_WRITE_BOOL(fill); + CONFIG_WRITE_BOOL(lazy_lock); + emitter_kv(emitter, "malloc_conf", "config.malloc_conf", + emitter_type_string, &config_malloc_conf); - CONFIG_WRITE_BOOL_JSON(cache_oblivious, ",") - - CTL_GET("config.debug", &bv, bool); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"debug\": %s,\n", bv ? "true" : "false"); - } else { - malloc_cprintf(write_cb, cbopaque, "Assertions %s\n", - bv ? "enabled" : "disabled"); - } - - CONFIG_WRITE_BOOL_JSON(fill, ",") - CONFIG_WRITE_BOOL_JSON(lazy_lock, ",") - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"malloc_conf\": \"%s\",\n", - config_malloc_conf); - } else { - malloc_cprintf(write_cb, cbopaque, - "config.malloc_conf: \"%s\"\n", config_malloc_conf); - } - - CONFIG_WRITE_BOOL_JSON(prof, ",") - CONFIG_WRITE_BOOL_JSON(prof_libgcc, ",") - CONFIG_WRITE_BOOL_JSON(prof_libunwind, ",") - CONFIG_WRITE_BOOL_JSON(stats, ",") - CONFIG_WRITE_BOOL_JSON(thp, ",") - CONFIG_WRITE_BOOL_JSON(utrace, ",") - CONFIG_WRITE_BOOL_JSON(xmalloc, "") - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t},\n"); - } -#undef CONFIG_WRITE_BOOL_JSON + CONFIG_WRITE_BOOL(prof); + CONFIG_WRITE_BOOL(prof_libgcc); + CONFIG_WRITE_BOOL(prof_libunwind); + CONFIG_WRITE_BOOL(stats); + CONFIG_WRITE_BOOL(utrace); + CONFIG_WRITE_BOOL(xmalloc); +#undef CONFIG_WRITE_BOOL + emitter_dict_end(emitter); /* Close "config" dict. */ /* opt. */ -#define OPT_WRITE_BOOL(n, c) \ - if (je_mallctl("opt."#n, (void *)&bv, &bsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : \ - "false", (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %s\n", bv ? "true" : "false"); \ - } \ - } -#define OPT_WRITE_BOOL_MUTABLE(n, m, c) { \ - bool bv2; \ - if (je_mallctl("opt."#n, (void *)&bv, &bsz, NULL, 0) == 0 && \ - je_mallctl(#m, (void *)&bv2, &bsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %s%s\n", bv ? "true" : \ - "false", (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %s ("#m": %s)\n", bv ? "true" \ - : "false", bv2 ? "true" : "false"); \ - } \ - } \ -} -#define OPT_WRITE_UNSIGNED(n, c) \ - if (je_mallctl("opt."#n, (void *)&uv, &usz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %u%s\n", uv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %u\n", uv); \ - } \ - } -#define OPT_WRITE_SSIZE_T(n, c) \ - if (je_mallctl("opt."#n, (void *)&ssv, &sssz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %zd%s\n", ssv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %zd\n", ssv); \ - } \ - } -#define OPT_WRITE_SSIZE_T_MUTABLE(n, m, c) { \ - ssize_t ssv2; \ - if (je_mallctl("opt."#n, (void *)&ssv, &sssz, NULL, 0) == 0 && \ - je_mallctl(#m, (void *)&ssv2, &sssz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": %zd%s\n", ssv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": %zd ("#m": %zd)\n", \ - ssv, ssv2); \ - } \ - } \ -} -#define OPT_WRITE_CHAR_P(n, c) \ - if (je_mallctl("opt."#n, (void *)&cpv, &cpsz, NULL, 0) == 0) { \ - if (json) { \ - malloc_cprintf(write_cb, cbopaque, \ - "\t\t\t\""#n"\": \"%s\"%s\n", cpv, (c)); \ - } else { \ - malloc_cprintf(write_cb, cbopaque, \ - " opt."#n": \"%s\"\n", cpv); \ - } \ +#define OPT_WRITE(name, var, size, emitter_type) \ + if (je_mallctl("opt."name, (void *)&var, &size, NULL, 0) == \ + 0) { \ + emitter_kv(emitter, name, "opt."name, emitter_type, \ + &var); \ } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"opt\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "Run-time option settings:\n"); - } - OPT_WRITE_BOOL(abort, ",") - OPT_WRITE_BOOL(abort_conf, ",") - OPT_WRITE_BOOL(retain, ",") - OPT_WRITE_CHAR_P(dss, ",") - OPT_WRITE_UNSIGNED(narenas, ",") - OPT_WRITE_CHAR_P(percpu_arena, ",") - OPT_WRITE_BOOL_MUTABLE(background_thread, background_thread, ",") - OPT_WRITE_SSIZE_T_MUTABLE(dirty_decay_ms, arenas.dirty_decay_ms, ",") - OPT_WRITE_SSIZE_T_MUTABLE(muzzy_decay_ms, arenas.muzzy_decay_ms, ",") - OPT_WRITE_CHAR_P(junk, ",") - OPT_WRITE_BOOL(zero, ",") - OPT_WRITE_BOOL(utrace, ",") - OPT_WRITE_BOOL(xmalloc, ",") - OPT_WRITE_BOOL(tcache, ",") - OPT_WRITE_SSIZE_T(lg_tcache_max, ",") - OPT_WRITE_BOOL(prof, ",") - OPT_WRITE_CHAR_P(prof_prefix, ",") - OPT_WRITE_BOOL_MUTABLE(prof_active, prof.active, ",") - OPT_WRITE_BOOL_MUTABLE(prof_thread_active_init, prof.thread_active_init, - ",") - OPT_WRITE_SSIZE_T_MUTABLE(lg_prof_sample, prof.lg_sample, ",") - OPT_WRITE_BOOL(prof_accum, ",") - OPT_WRITE_SSIZE_T(lg_prof_interval, ",") - OPT_WRITE_BOOL(prof_gdump, ",") - OPT_WRITE_BOOL(prof_final, ",") - OPT_WRITE_BOOL(prof_leak, ",") - OPT_WRITE_BOOL(stats_print, ",") - if (json || opt_stats_print) { - /* - * stats_print_opts is always emitted for JSON, so as long as it - * comes last it's safe to unconditionally omit the comma here - * (rather than having to conditionally omit it elsewhere - * depending on configuration). - */ - OPT_WRITE_CHAR_P(stats_print_opts, "") - } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t},\n"); +#define OPT_WRITE_MUTABLE(name, var1, var2, size, emitter_type, \ + altname) \ + if (je_mallctl("opt."name, (void *)&var1, &size, NULL, 0) == \ + 0 && je_mallctl(altname, (void *)&var2, &size, NULL, 0) \ + == 0) { \ + emitter_kv_note(emitter, name, "opt."name, \ + emitter_type, &var1, altname, emitter_type, \ + &var2); \ } +#define OPT_WRITE_BOOL(name) OPT_WRITE(name, bv, bsz, emitter_type_bool) +#define OPT_WRITE_BOOL_MUTABLE(name, altname) \ + OPT_WRITE_MUTABLE(name, bv, bv2, bsz, emitter_type_bool, altname) + +#define OPT_WRITE_UNSIGNED(name) \ + OPT_WRITE(name, uv, usz, emitter_type_unsigned) + +#define OPT_WRITE_SSIZE_T(name) \ + OPT_WRITE(name, ssv, sssz, emitter_type_ssize) +#define OPT_WRITE_SSIZE_T_MUTABLE(name, altname) \ + OPT_WRITE_MUTABLE(name, ssv, ssv2, sssz, emitter_type_ssize, \ + altname) + +#define OPT_WRITE_CHAR_P(name) \ + OPT_WRITE(name, cpv, cpsz, emitter_type_string) + + emitter_dict_begin(emitter, "opt", "Run-time option settings"); + + OPT_WRITE_BOOL("abort") + OPT_WRITE_BOOL("abort_conf") + OPT_WRITE_BOOL("retain") + OPT_WRITE_CHAR_P("dss") + OPT_WRITE_UNSIGNED("narenas") + OPT_WRITE_CHAR_P("percpu_arena") + OPT_WRITE_CHAR_P("metadata_thp") + OPT_WRITE_BOOL_MUTABLE("background_thread", "background_thread") + OPT_WRITE_SSIZE_T_MUTABLE("dirty_decay_ms", "arenas.dirty_decay_ms") + OPT_WRITE_SSIZE_T_MUTABLE("muzzy_decay_ms", "arenas.muzzy_decay_ms") + OPT_WRITE_UNSIGNED("lg_extent_max_active_fit") + OPT_WRITE_CHAR_P("junk") + OPT_WRITE_BOOL("zero") + OPT_WRITE_BOOL("utrace") + OPT_WRITE_BOOL("xmalloc") + OPT_WRITE_BOOL("tcache") + OPT_WRITE_SSIZE_T("lg_tcache_max") + OPT_WRITE_CHAR_P("thp") + OPT_WRITE_BOOL("prof") + OPT_WRITE_CHAR_P("prof_prefix") + OPT_WRITE_BOOL_MUTABLE("prof_active", "prof.active") + OPT_WRITE_BOOL_MUTABLE("prof_thread_active_init", + "prof.thread_active_init") + OPT_WRITE_SSIZE_T_MUTABLE("lg_prof_sample", "prof.lg_sample") + OPT_WRITE_BOOL("prof_accum") + OPT_WRITE_SSIZE_T("lg_prof_interval") + OPT_WRITE_BOOL("prof_gdump") + OPT_WRITE_BOOL("prof_final") + OPT_WRITE_BOOL("prof_leak") + OPT_WRITE_BOOL("stats_print") + OPT_WRITE_CHAR_P("stats_print_opts") + + emitter_dict_end(emitter); + +#undef OPT_WRITE +#undef OPT_WRITE_MUTABLE #undef OPT_WRITE_BOOL #undef OPT_WRITE_BOOL_MUTABLE +#undef OPT_WRITE_UNSIGNED #undef OPT_WRITE_SSIZE_T +#undef OPT_WRITE_SSIZE_T_MUTABLE #undef OPT_WRITE_CHAR_P - /* arenas. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"arenas\": {\n"); - } - - CTL_GET("arenas.narenas", &uv, unsigned); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"narenas\": %u,\n", uv); - } else { - malloc_cprintf(write_cb, cbopaque, "Arenas: %u\n", uv); - } - - if (json) { - CTL_GET("arenas.dirty_decay_ms", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"dirty_decay_ms\": %zd,\n", ssv); - - CTL_GET("arenas.muzzy_decay_ms", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"muzzy_decay_ms\": %zd,\n", ssv); - } - - CTL_GET("arenas.quantum", &sv, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"quantum\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, "Quantum size: %zu\n", sv); - } - - CTL_GET("arenas.page", &sv, size_t); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"page\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, "Page size: %zu\n", sv); - } - - if (je_mallctl("arenas.tcache_max", (void *)&sv, &ssz, NULL, 0) == 0) { - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"tcache_max\": %zu,\n", sv); - } else { - malloc_cprintf(write_cb, cbopaque, - "Maximum thread-cached size class: %zu\n", sv); - } - } - - if (json) { - unsigned nbins, nlextents, i; - - CTL_GET("arenas.nbins", &nbins, unsigned); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"nbins\": %u,\n", nbins); - - CTL_GET("arenas.nhbins", &uv, unsigned); - malloc_cprintf(write_cb, cbopaque, "\t\t\t\"nhbins\": %u,\n", - uv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"bin\": [\n"); - for (i = 0; i < nbins; i++) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t{\n"); - - CTL_M2_GET("arenas.bin.0.size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"size\": %zu,\n", sv); - - CTL_M2_GET("arenas.bin.0.nregs", i, &u32v, uint32_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"nregs\": %"FMTu32",\n", u32v); - - CTL_M2_GET("arenas.bin.0.slab_size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"slab_size\": %zu\n", sv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t}%s\n", (i + 1 < nbins) ? "," : ""); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t],\n"); - - CTL_GET("arenas.nlextents", &nlextents, unsigned); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"nlextents\": %u,\n", nlextents); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"lextent\": [\n"); - for (i = 0; i < nlextents; i++) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t{\n"); - - CTL_M2_GET("arenas.lextent.0.size", i, &sv, size_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\t\"size\": %zu\n", sv); - - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t}%s\n", (i + 1 < nlextents) ? "," : ""); - } - malloc_cprintf(write_cb, cbopaque, - "\t\t\t]\n"); - - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", (config_prof || more) ? "," : ""); - } - /* prof. */ - if (config_prof && json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"prof\": {\n"); + if (config_prof) { + emitter_dict_begin(emitter, "prof", "Profiling settings"); CTL_GET("prof.thread_active_init", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"thread_active_init\": %s,\n", bv ? "true" : - "false"); + emitter_kv(emitter, "thread_active_init", + "prof.thread_active_init", emitter_type_bool, &bv); CTL_GET("prof.active", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"active\": %s,\n", bv ? "true" : "false"); + emitter_kv(emitter, "active", "prof.active", emitter_type_bool, + &bv); CTL_GET("prof.gdump", &bv, bool); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"gdump\": %s,\n", bv ? "true" : "false"); + emitter_kv(emitter, "gdump", "prof.gdump", emitter_type_bool, + &bv); CTL_GET("prof.interval", &u64v, uint64_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"interval\": %"FMTu64",\n", u64v); + emitter_kv(emitter, "interval", "prof.interval", + emitter_type_uint64, &u64v); CTL_GET("prof.lg_sample", &ssv, ssize_t); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"lg_sample\": %zd\n", ssv); + emitter_kv(emitter, "lg_sample", "prof.lg_sample", + emitter_type_ssize, &ssv); - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", more ? "," : ""); + emitter_dict_end(emitter); /* Close "prof". */ } + + /* arenas. */ + /* + * The json output sticks arena info into an "arenas" dict; the table + * output puts them at the top-level. + */ + emitter_json_dict_begin(emitter, "arenas"); + + CTL_GET("arenas.narenas", &uv, unsigned); + emitter_kv(emitter, "narenas", "Arenas", emitter_type_unsigned, &uv); + + /* + * Decay settings are emitted only in json mode; in table mode, they're + * emitted as notes with the opt output, above. + */ + CTL_GET("arenas.dirty_decay_ms", &ssv, ssize_t); + emitter_json_kv(emitter, "dirty_decay_ms", emitter_type_ssize, &ssv); + + CTL_GET("arenas.muzzy_decay_ms", &ssv, ssize_t); + emitter_json_kv(emitter, "muzzy_decay_ms", emitter_type_ssize, &ssv); + + CTL_GET("arenas.quantum", &sv, size_t); + emitter_kv(emitter, "quantum", "Quantum size", emitter_type_size, &sv); + + CTL_GET("arenas.page", &sv, size_t); + emitter_kv(emitter, "page", "Page size", emitter_type_size, &sv); + + if (je_mallctl("arenas.tcache_max", (void *)&sv, &ssz, NULL, 0) == 0) { + emitter_kv(emitter, "tcache_max", + "Maximum thread-cached size class", emitter_type_size, &sv); + } + + unsigned nbins; + CTL_GET("arenas.nbins", &nbins, unsigned); + emitter_kv(emitter, "nbins", "Number of bin size classes", + emitter_type_unsigned, &nbins); + + unsigned nhbins; + CTL_GET("arenas.nhbins", &nhbins, unsigned); + emitter_kv(emitter, "nhbins", "Number of thread-cache bin size classes", + emitter_type_unsigned, &nhbins); + + /* + * We do enough mallctls in a loop that we actually want to omit them + * (not just omit the printing). + */ + if (emitter->output == emitter_output_json) { + emitter_json_arr_begin(emitter, "bin"); + for (unsigned i = 0; i < nbins; i++) { + emitter_json_arr_obj_begin(emitter); + + CTL_M2_GET("arenas.bin.0.size", i, &sv, size_t); + emitter_json_kv(emitter, "size", emitter_type_size, + &sv); + + CTL_M2_GET("arenas.bin.0.nregs", i, &u32v, uint32_t); + emitter_json_kv(emitter, "nregs", emitter_type_uint32, + &u32v); + + CTL_M2_GET("arenas.bin.0.slab_size", i, &sv, size_t); + emitter_json_kv(emitter, "slab_size", emitter_type_size, + &sv); + + emitter_json_arr_obj_end(emitter); + } + emitter_json_arr_end(emitter); /* Close "bin". */ + } + + unsigned nlextents; + CTL_GET("arenas.nlextents", &nlextents, unsigned); + emitter_kv(emitter, "nlextents", "Number of large size classes", + emitter_type_unsigned, &nlextents); + + if (emitter->output == emitter_output_json) { + emitter_json_arr_begin(emitter, "lextent"); + for (unsigned i = 0; i < nlextents; i++) { + emitter_json_arr_obj_begin(emitter); + + CTL_M2_GET("arenas.lextent.0.size", i, &sv, size_t); + emitter_json_kv(emitter, "size", emitter_type_size, + &sv); + + emitter_json_arr_obj_end(emitter); + } + emitter_json_arr_end(emitter); /* Close "lextent". */ + } + + emitter_json_dict_end(emitter); /* Close "arenas" */ } static void -read_global_mutex_stats( - uint64_t results[mutex_prof_num_global_mutexes][mutex_prof_num_counters]) { - char cmd[MUTEX_CTL_STR_MAX_LENGTH]; - - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { -#define OP(c, t) \ - gen_mutex_ctl_str(cmd, MUTEX_CTL_STR_MAX_LENGTH, \ - "mutexes", global_mutex_names[i], #c); \ - CTL_GET(cmd, (t *)&results[i][mutex_counter_##c], t); -MUTEX_PROF_COUNTERS -#undef OP - } -} - -static void -stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque, - bool json, bool merged, bool destroyed, bool unmerged, bool bins, - bool large, bool mutex) { - size_t allocated, active, metadata, resident, mapped, retained; +stats_print_helper(emitter_t *emitter, bool merged, bool destroyed, + bool unmerged, bool bins, bool large, bool mutex) { + /* + * These should be deleted. We keep them around for a while, to aid in + * the transition to the emitter code. + */ + size_t allocated, active, metadata, metadata_thp, resident, mapped, + retained; size_t num_background_threads; uint64_t background_thread_num_runs, background_thread_run_interval; CTL_GET("stats.allocated", &allocated, size_t); CTL_GET("stats.active", &active, size_t); CTL_GET("stats.metadata", &metadata, size_t); + CTL_GET("stats.metadata_thp", &metadata_thp, size_t); CTL_GET("stats.resident", &resident, size_t); CTL_GET("stats.mapped", &mapped, size_t); CTL_GET("stats.retained", &retained, size_t); - uint64_t mutex_stats[mutex_prof_num_global_mutexes][mutex_prof_num_counters]; - if (mutex) { - read_global_mutex_stats(mutex_stats); - } - if (have_background_thread) { CTL_GET("stats.background_thread.num_threads", &num_background_threads, size_t); @@ -1035,182 +1094,130 @@ stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque, background_thread_run_interval = 0; } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"stats\": {\n"); + /* Generic global stats. */ + emitter_json_dict_begin(emitter, "stats"); + emitter_json_kv(emitter, "allocated", emitter_type_size, &allocated); + emitter_json_kv(emitter, "active", emitter_type_size, &active); + emitter_json_kv(emitter, "metadata", emitter_type_size, &metadata); + emitter_json_kv(emitter, "metadata_thp", emitter_type_size, + &metadata_thp); + emitter_json_kv(emitter, "resident", emitter_type_size, &resident); + emitter_json_kv(emitter, "mapped", emitter_type_size, &mapped); + emitter_json_kv(emitter, "retained", emitter_type_size, &retained); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"allocated\": %zu,\n", allocated); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"active\": %zu,\n", active); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"metadata\": %zu,\n", metadata); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"resident\": %zu,\n", resident); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"mapped\": %zu,\n", mapped); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"retained\": %zu,\n", retained); + emitter_table_printf(emitter, "Allocated: %zu, active: %zu, " + "metadata: %zu (n_thp %zu), resident: %zu, mapped: %zu, " + "retained: %zu\n", allocated, active, metadata, metadata_thp, + resident, mapped, retained); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"background_thread\": {\n"); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"num_threads\": %zu,\n", num_background_threads); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"num_runs\": %"FMTu64",\n", - background_thread_num_runs); - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\t\"run_interval\": %"FMTu64"\n", - background_thread_run_interval); - malloc_cprintf(write_cb, cbopaque, "\t\t\t}%s\n", - mutex ? "," : ""); + /* Background thread stats. */ + emitter_json_dict_begin(emitter, "background_thread"); + emitter_json_kv(emitter, "num_threads", emitter_type_size, + &num_background_threads); + emitter_json_kv(emitter, "num_runs", emitter_type_uint64, + &background_thread_num_runs); + emitter_json_kv(emitter, "run_interval", emitter_type_uint64, + &background_thread_run_interval); + emitter_json_dict_end(emitter); /* Close "background_thread". */ - if (mutex) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"mutexes\": {\n"); - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { - mutex_stats_output_json(write_cb, cbopaque, - global_mutex_names[i], mutex_stats[i], - "\t\t\t\t", - i == mutex_prof_num_global_mutexes - 1); - } - malloc_cprintf(write_cb, cbopaque, "\t\t\t}\n"); + emitter_table_printf(emitter, "Background threads: %zu, " + "num_runs: %"FMTu64", run_interval: %"FMTu64" ns\n", + num_background_threads, background_thread_num_runs, + background_thread_run_interval); + + if (mutex) { + emitter_row_t row; + emitter_col_t name; + emitter_col_t col64[mutex_prof_num_uint64_t_counters]; + emitter_col_t col32[mutex_prof_num_uint32_t_counters]; + + emitter_row_init(&row); + mutex_stats_init_cols(&row, "", &name, col64, col32); + + emitter_table_row(emitter, &row); + emitter_json_dict_begin(emitter, "mutexes"); + + for (int i = 0; i < mutex_prof_num_global_mutexes; i++) { + mutex_stats_read_global(global_mutex_names[i], &name, + col64, col32); + emitter_json_dict_begin(emitter, global_mutex_names[i]); + mutex_stats_emit(emitter, &row, col64, col32); + emitter_json_dict_end(emitter); } - malloc_cprintf(write_cb, cbopaque, - "\t\t}%s\n", (merged || unmerged || destroyed) ? "," : ""); - } else { - malloc_cprintf(write_cb, cbopaque, - "Allocated: %zu, active: %zu, metadata: %zu," - " resident: %zu, mapped: %zu, retained: %zu\n", - allocated, active, metadata, resident, mapped, retained); - if (have_background_thread && num_background_threads > 0) { - malloc_cprintf(write_cb, cbopaque, - "Background threads: %zu, num_runs: %"FMTu64", " - "run_interval: %"FMTu64" ns\n", - num_background_threads, - background_thread_num_runs, - background_thread_run_interval); - } - if (mutex) { - mutex_prof_global_ind_t i; - for (i = 0; i < mutex_prof_num_global_mutexes; i++) { - mutex_stats_output(write_cb, cbopaque, - global_mutex_names[i], mutex_stats[i], - i == 0); - } - } + emitter_json_dict_end(emitter); /* Close "mutexes". */ } + emitter_json_dict_end(emitter); /* Close "stats". */ + if (merged || destroyed || unmerged) { unsigned narenas; - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\"stats.arenas\": {\n"); - } + emitter_json_dict_begin(emitter, "stats.arenas"); CTL_GET("arenas.narenas", &narenas, unsigned); - { - size_t mib[3]; - size_t miblen = sizeof(mib) / sizeof(size_t); - size_t sz; - VARIABLE_ARRAY(bool, initialized, narenas); - bool destroyed_initialized; - unsigned i, j, ninitialized; + size_t mib[3]; + size_t miblen = sizeof(mib) / sizeof(size_t); + size_t sz; + VARIABLE_ARRAY(bool, initialized, narenas); + bool destroyed_initialized; + unsigned i, j, ninitialized; - xmallctlnametomib("arena.0.initialized", mib, &miblen); - for (i = ninitialized = 0; i < narenas; i++) { - mib[1] = i; - sz = sizeof(bool); - xmallctlbymib(mib, miblen, &initialized[i], &sz, - NULL, 0); - if (initialized[i]) { - ninitialized++; - } - } - mib[1] = MALLCTL_ARENAS_DESTROYED; + xmallctlnametomib("arena.0.initialized", mib, &miblen); + for (i = ninitialized = 0; i < narenas; i++) { + mib[1] = i; sz = sizeof(bool); - xmallctlbymib(mib, miblen, &destroyed_initialized, &sz, + xmallctlbymib(mib, miblen, &initialized[i], &sz, NULL, 0); - - /* Merged stats. */ - if (merged && (ninitialized > 1 || !unmerged)) { - /* Print merged arena stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"merged\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "\nMerged arenas stats:\n"); - } - stats_arena_print(write_cb, cbopaque, json, - MALLCTL_ARENAS_ALL, bins, large, mutex); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t}%s\n", - ((destroyed_initialized && - destroyed) || unmerged) ? "," : - ""); - } + if (initialized[i]) { + ninitialized++; } + } + mib[1] = MALLCTL_ARENAS_DESTROYED; + sz = sizeof(bool); + xmallctlbymib(mib, miblen, &destroyed_initialized, &sz, + NULL, 0); - /* Destroyed stats. */ - if (destroyed_initialized && destroyed) { - /* Print destroyed arena stats. */ - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t\"destroyed\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "\nDestroyed arenas stats:\n"); - } - stats_arena_print(write_cb, cbopaque, json, - MALLCTL_ARENAS_DESTROYED, bins, large, - mutex); - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t\t}%s\n", unmerged ? "," : - ""); - } - } + /* Merged stats. */ + if (merged && (ninitialized > 1 || !unmerged)) { + /* Print merged arena stats. */ + emitter_table_printf(emitter, "Merged arenas stats:\n"); + emitter_json_dict_begin(emitter, "merged"); + stats_arena_print(emitter, MALLCTL_ARENAS_ALL, bins, + large, mutex); + emitter_json_dict_end(emitter); /* Close "merged". */ + } - /* Unmerged stats. */ - if (unmerged) { - for (i = j = 0; i < narenas; i++) { - if (initialized[i]) { - if (json) { - j++; - malloc_cprintf(write_cb, - cbopaque, - "\t\t\t\"%u\": {\n", - i); - } else { - malloc_cprintf(write_cb, - cbopaque, - "\narenas[%u]:\n", - i); - } - stats_arena_print(write_cb, - cbopaque, json, i, bins, - large, mutex); - if (json) { - malloc_cprintf(write_cb, - cbopaque, - "\t\t\t}%s\n", (j < - ninitialized) ? "," - : ""); - } - } + /* Destroyed stats. */ + if (destroyed_initialized && destroyed) { + /* Print destroyed arena stats. */ + emitter_table_printf(emitter, + "Destroyed arenas stats:\n"); + emitter_json_dict_begin(emitter, "destroyed"); + stats_arena_print(emitter, MALLCTL_ARENAS_DESTROYED, + bins, large, mutex); + emitter_json_dict_end(emitter); /* Close "destroyed". */ + } + + /* Unmerged stats. */ + if (unmerged) { + for (i = j = 0; i < narenas; i++) { + if (initialized[i]) { + char arena_ind_str[20]; + malloc_snprintf(arena_ind_str, + sizeof(arena_ind_str), "%u", i); + emitter_json_dict_begin(emitter, + arena_ind_str); + emitter_table_printf(emitter, + "arenas[%s]:\n", arena_ind_str); + stats_arena_print(emitter, i, bins, + large, mutex); + /* Close "". */ + emitter_json_dict_end(emitter); } } } - - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t\t}\n"); - } + emitter_json_dict_end(emitter); /* Close "stats.arenas". */ } } @@ -1257,29 +1264,23 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque, } } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "{\n" - "\t\"jemalloc\": {\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "___ Begin jemalloc statistics ___\n"); - } + emitter_t emitter; + emitter_init(&emitter, + json ? emitter_output_json : emitter_output_table, write_cb, + cbopaque); + emitter_begin(&emitter); + emitter_table_printf(&emitter, "___ Begin jemalloc statistics ___\n"); + emitter_json_dict_begin(&emitter, "jemalloc"); if (general) { - stats_general_print(write_cb, cbopaque, json, config_stats); + stats_general_print(&emitter); } if (config_stats) { - stats_print_helper(write_cb, cbopaque, json, merged, destroyed, - unmerged, bins, large, mutex); + stats_print_helper(&emitter, merged, destroyed, unmerged, + bins, large, mutex); } - if (json) { - malloc_cprintf(write_cb, cbopaque, - "\t}\n" - "}\n"); - } else { - malloc_cprintf(write_cb, cbopaque, - "--- End jemalloc statistics ---\n"); - } + emitter_json_dict_end(&emitter); /* Closes the "jemalloc" dict. */ + emitter_table_printf(&emitter, "--- End jemalloc statistics ---\n"); + emitter_end(&emitter); } diff --git a/dep/jemalloc/src/sz.c b/dep/jemalloc/src/sz.c index 0986615f711..9de77e45fff 100644 --- a/dep/jemalloc/src/sz.c +++ b/dep/jemalloc/src/sz.c @@ -26,7 +26,8 @@ const size_t sz_index2size_tab[NSIZES] = { JEMALLOC_ALIGNED(CACHELINE) const uint8_t sz_size2index_tab[] = { #if LG_TINY_MIN == 0 -#warning "Dangerous LG_TINY_MIN" +/* The div module doesn't support division by 1. */ +#error "Unsupported LG_TINY_MIN" #define S2B_0(i) i, #elif LG_TINY_MIN == 1 #warning "Dangerous LG_TINY_MIN" diff --git a/dep/jemalloc/src/tcache.c b/dep/jemalloc/src/tcache.c index 936ef3140d5..a769a6b17bc 100644 --- a/dep/jemalloc/src/tcache.c +++ b/dep/jemalloc/src/tcache.c @@ -12,7 +12,7 @@ bool opt_tcache = true; ssize_t opt_lg_tcache_max = LG_TCACHE_MAXCLASS_DEFAULT; -tcache_bin_info_t *tcache_bin_info; +cache_bin_info_t *tcache_bin_info; static unsigned stack_nelms; /* Total stack elms per tcache. */ unsigned nhbins; @@ -40,7 +40,7 @@ void tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { szind_t binind = tcache->next_gc_bin; - tcache_bin_t *tbin; + cache_bin_t *tbin; if (binind < NBINS) { tbin = tcache_small_bin_get(tcache, binind); } else { @@ -58,7 +58,7 @@ tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { * Reduce fill count by 2X. Limit lg_fill_div such that * the fill count is always at least 1. */ - tcache_bin_info_t *tbin_info = &tcache_bin_info[binind]; + cache_bin_info_t *tbin_info = &tcache_bin_info[binind]; if ((tbin_info->ncached_max >> (tcache->lg_fill_div[binind] + 1)) >= 1) { tcache->lg_fill_div[binind]++; @@ -86,7 +86,7 @@ tcache_event_hard(tsd_t *tsd, tcache_t *tcache) { void * tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, - tcache_bin_t *tbin, szind_t binind, bool *tcache_success) { + cache_bin_t *tbin, szind_t binind, bool *tcache_success) { void *ret; assert(tcache->arena != NULL); @@ -95,18 +95,18 @@ tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache, if (config_prof) { tcache->prof_accumbytes = 0; } - ret = tcache_alloc_easy(tbin, tcache_success); + ret = cache_bin_alloc_easy(tbin, tcache_success); return ret; } void -tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, +tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin, szind_t binind, unsigned rem) { bool merged_stats = false; assert(binind < NBINS); - assert(rem <= tbin->ncached); + assert((cache_bin_sz_t)rem <= tbin->ncached); arena_t *arena = tcache->arena; assert(arena != NULL); @@ -121,7 +121,7 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, /* Lock the arena bin associated with the first object. */ extent_t *extent = item_extent[0]; arena_t *bin_arena = extent_arena_get(extent); - arena_bin_t *bin = &bin_arena->bins[binind]; + bin_t *bin = &bin_arena->bins[binind]; if (config_prof && bin_arena == arena) { if (arena_prof_accum(tsd_tsdn(tsd), arena, @@ -169,7 +169,7 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, * The flush loop didn't happen to flush to this thread's * arena, so the stats didn't get merged. Manually do so now. */ - arena_bin_t *bin = &arena->bins[binind]; + bin_t *bin = &arena->bins[binind]; malloc_mutex_lock(tsd_tsdn(tsd), &bin->lock); bin->stats.nflushes++; bin->stats.nrequests += tbin->tstats.nrequests; @@ -180,18 +180,18 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, tcache_bin_t *tbin, memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * sizeof(void *)); tbin->ncached = rem; - if ((low_water_t)tbin->ncached < tbin->low_water) { + if (tbin->ncached < tbin->low_water) { tbin->low_water = tbin->ncached; } } void -tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, +tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind, unsigned rem, tcache_t *tcache) { bool merged_stats = false; assert(binind < nhbins); - assert(rem <= tbin->ncached); + assert((cache_bin_sz_t)rem <= tbin->ncached); arena_t *arena = tcache->arena; assert(arena != NULL); @@ -278,7 +278,7 @@ tcache_bin_flush_large(tsd_t *tsd, tcache_bin_t *tbin, szind_t binind, memmove(tbin->avail - rem, tbin->avail - tbin->ncached, rem * sizeof(void *)); tbin->ncached = rem; - if ((low_water_t)tbin->ncached < tbin->low_water) { + if (tbin->ncached < tbin->low_water) { tbin->low_water = tbin->ncached; } } @@ -291,8 +291,15 @@ tcache_arena_associate(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { if (config_stats) { /* Link into list of extant tcaches. */ malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx); + ql_elm_new(tcache, link); ql_tail_insert(&arena->tcache_ql, tcache, link); + cache_bin_array_descriptor_init( + &tcache->cache_bin_array_descriptor, tcache->bins_small, + tcache->bins_large); + ql_tail_insert(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); + malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx); } } @@ -316,6 +323,8 @@ tcache_arena_dissociate(tsdn_t *tsdn, tcache_t *tcache) { assert(in_ql); } ql_remove(&arena->tcache_ql, tcache, link); + ql_remove(&arena->cache_bin_array_descriptor_ql, + &tcache->cache_bin_array_descriptor, link); tcache_stats_merge(tsdn, tcache, arena); malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx); } @@ -354,8 +363,8 @@ tcache_init(tsd_t *tsd, tcache_t *tcache, void *avail_stack) { size_t stack_offset = 0; assert((TCACHE_NSLOTS_SMALL_MAX & 1U) == 0); - memset(tcache->tbins_small, 0, sizeof(tcache_bin_t) * NBINS); - memset(tcache->tbins_large, 0, sizeof(tcache_bin_t) * (nhbins - NBINS)); + memset(tcache->bins_small, 0, sizeof(cache_bin_t) * NBINS); + memset(tcache->bins_large, 0, sizeof(cache_bin_t) * (nhbins - NBINS)); unsigned i = 0; for (; i < NBINS; i++) { tcache->lg_fill_div[i] = 1; @@ -450,7 +459,7 @@ tcache_flush_cache(tsd_t *tsd, tcache_t *tcache) { assert(tcache->arena != NULL); for (unsigned i = 0; i < NBINS; i++) { - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + cache_bin_t *tbin = tcache_small_bin_get(tcache, i); tcache_bin_flush_small(tsd, tcache, tbin, i, 0); if (config_stats) { @@ -458,7 +467,7 @@ tcache_flush_cache(tsd_t *tsd, tcache_t *tcache) { } } for (unsigned i = NBINS; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = tcache_large_bin_get(tcache, i); tcache_bin_flush_large(tsd, tbin, i, 0, tcache); if (config_stats) { @@ -524,8 +533,8 @@ tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { /* Merge and reset tcache stats. */ for (i = 0; i < NBINS; i++) { - arena_bin_t *bin = &arena->bins[i]; - tcache_bin_t *tbin = tcache_small_bin_get(tcache, i); + bin_t *bin = &arena->bins[i]; + cache_bin_t *tbin = tcache_small_bin_get(tcache, i); malloc_mutex_lock(tsdn, &bin->lock); bin->stats.nrequests += tbin->tstats.nrequests; malloc_mutex_unlock(tsdn, &bin->lock); @@ -533,7 +542,7 @@ tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { } for (; i < nhbins; i++) { - tcache_bin_t *tbin = tcache_large_bin_get(tcache, i); + cache_bin_t *tbin = tcache_large_bin_get(tcache, i); arena_stats_large_nrequests_add(tsdn, &arena->stats, i, tbin->tstats.nrequests); tbin->tstats.nrequests = 0; @@ -657,21 +666,21 @@ tcache_boot(tsdn_t *tsdn) { nhbins = sz_size2index(tcache_maxclass) + 1; /* Initialize tcache_bin_info. */ - tcache_bin_info = (tcache_bin_info_t *)base_alloc(tsdn, b0get(), nhbins - * sizeof(tcache_bin_info_t), CACHELINE); + tcache_bin_info = (cache_bin_info_t *)base_alloc(tsdn, b0get(), nhbins + * sizeof(cache_bin_info_t), CACHELINE); if (tcache_bin_info == NULL) { return true; } stack_nelms = 0; unsigned i; for (i = 0; i < NBINS; i++) { - if ((arena_bin_info[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MIN) { + if ((bin_infos[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MIN) { tcache_bin_info[i].ncached_max = TCACHE_NSLOTS_SMALL_MIN; - } else if ((arena_bin_info[i].nregs << 1) <= + } else if ((bin_infos[i].nregs << 1) <= TCACHE_NSLOTS_SMALL_MAX) { tcache_bin_info[i].ncached_max = - (arena_bin_info[i].nregs << 1); + (bin_infos[i].nregs << 1); } else { tcache_bin_info[i].ncached_max = TCACHE_NSLOTS_SMALL_MAX; diff --git a/dep/jemalloc/src/tsd.c b/dep/jemalloc/src/tsd.c index f968992f2b5..c1430682dd5 100644 --- a/dep/jemalloc/src/tsd.c +++ b/dep/jemalloc/src/tsd.c @@ -71,6 +71,16 @@ tsd_data_init(tsd_t *tsd) { */ rtree_ctx_data_init(tsd_rtree_ctxp_get_unsafe(tsd)); + /* + * A nondeterministic seed based on the address of tsd reduces + * the likelihood of lockstep non-uniform cache index + * utilization among identical concurrent processes, but at the + * cost of test repeatability. For debug builds, instead use a + * deterministic seed. + */ + *tsd_offset_statep_get(tsd) = config_debug ? 0 : + (uint64_t)(uintptr_t)tsd; + return tsd_tcache_enabled_data_init(tsd); } diff --git a/dep/jemalloc/src/zone.c b/dep/jemalloc/src/zone.c index 9d3b7b49522..23dfdd04a91 100644 --- a/dep/jemalloc/src/zone.c +++ b/dep/jemalloc/src/zone.c @@ -89,6 +89,7 @@ JEMALLOC_ATTR(weak_import); static malloc_zone_t *default_zone, *purgeable_zone; static malloc_zone_t jemalloc_zone; static struct malloc_introspection_t jemalloc_zone_introspect; +static pid_t zone_force_lock_pid = -1; /******************************************************************************/ /* Function prototypes for non-inline static functions. */ @@ -270,6 +271,12 @@ zone_log(malloc_zone_t *zone, void *address) { static void zone_force_lock(malloc_zone_t *zone) { if (isthreaded) { + /* + * See the note in zone_force_unlock, below, to see why we need + * this. + */ + assert(zone_force_lock_pid == -1); + zone_force_lock_pid = getpid(); jemalloc_prefork(); } } @@ -277,14 +284,25 @@ zone_force_lock(malloc_zone_t *zone) { static void zone_force_unlock(malloc_zone_t *zone) { /* - * Call jemalloc_postfork_child() rather than - * jemalloc_postfork_parent(), because this function is executed by both - * parent and child. The parent can tolerate having state - * reinitialized, but the child cannot unlock mutexes that were locked - * by the parent. + * zone_force_lock and zone_force_unlock are the entry points to the + * forking machinery on OS X. The tricky thing is, the child is not + * allowed to unlock mutexes locked in the parent, even if owned by the + * forking thread (and the mutex type we use in OS X will fail an assert + * if we try). In the child, we can get away with reinitializing all + * the mutexes, which has the effect of unlocking them. In the parent, + * doing this would mean we wouldn't wake any waiters blocked on the + * mutexes we unlock. So, we record the pid of the current thread in + * zone_force_lock, and use that to detect if we're in the parent or + * child here, to decide which unlock logic we need. */ if (isthreaded) { - jemalloc_postfork_child(); + assert(zone_force_lock_pid != -1); + if (getpid() == zone_force_lock_pid) { + jemalloc_postfork_parent(); + } else { + jemalloc_postfork_child(); + } + zone_force_lock_pid = -1; } } diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 1a614510400..d1db25941f6 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -9,7 +9,7 @@ #define _SOURCE_DIRECTORY R"(@CMAKE_SOURCE_DIR@)" #define _BUILD_DIRECTORY R"(@BUILDDIR@)" #define _MYSQL_EXECUTABLE R"(@MYSQL_EXECUTABLE@)" - #define _FULL_DATABASE "TDB_full_world_434.29_2018_04_15.sql" + #define _FULL_DATABASE "TDB_full_world_434.30_2018_05_15.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2018 TrinityCore" #define VER_FILEVERSION 0,0,0 diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 5c14a5b6acc..44ccf4e29af 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -2009,7 +2009,8 @@ INSERT INTO `updates` VALUES ('2018_03_06_00_auth_from_335_was_2018_03_06_00_auth.sql','3F8EA885898CE0F9D47043A832602D77','ARCHIVED','2018-02-16 01:40:04',0), ('2018_03_16_00_auth.sql','E77AFBFE7C1DEC8839AECC40140ED1AF55B56A10','ARCHIVED','2018-03-16 01:40:04',0), ('2018_03_28_00_auth.sql','45A7C896BDF00B1C319C9F889893D3B95E45EF0A','ARCHIVED','2018-03-28 01:40:04',0), -('2018_04_15_00_auth.sql','2293BAA1DA754CFD780838FE99EDB98FD7C041E0','ARCHIVED','2018-04-15 01:40:04',0); +('2018_04_15_00_auth.sql','2293BAA1DA754CFD780838FE99EDB98FD7C041E0','ARCHIVED','2018-04-15 01:40:04',0), +('2018_05_15_00_auth.sql','9076B44013D5BE1E92A06BDE7CE4F9B6663272CC','ARCHIVED','2018-05-15 01:40:04',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 22c1766a9b4..48f8d4b3bb0 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2955,7 +2955,8 @@ INSERT INTO `updates` VALUES ('2018_02_16_00_characters.sql','F1254689CE8A0B0AF149E557830287FF583B8D91','ARCHIVED','2018-02-16 00:00:00',0), ('2018_03_16_00_characters.sql','722EAFB7F508882F584DCAE61F97F1A11EDE126E','ARCHIVED','2018-03-16 00:00:00',0), ('2018_03_25_00_characters.sql','4FE3C6866A6DCD4926D451F6009464D290C2EF1F','ARCHIVED','2018-03-25 00:00:00',0), -('2018_04_15_00_characters.sql','F7058DE71A2BD3B31088AE586ACB3ECB2EB5A268','ARCHIVED','2018-04-15 00:00:00',0); +('2018_04_15_00_characters.sql','F7058DE71A2BD3B31088AE586ACB3ECB2EB5A268','ARCHIVED','2018-04-15 00:00:00',0), +('2018_05_15_00_characters.sql','1FC906E4C7E86DCA67243F0768A94825A2C9E323','ARCHIVED','2018-05-15 00:00:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/4.3.4/2018_04_15_00_auth.sql b/sql/old/4.3.4/auth/29_2018_05_15/2018_04_15_00_auth.sql similarity index 100% rename from sql/updates/auth/4.3.4/2018_04_15_00_auth.sql rename to sql/old/4.3.4/auth/29_2018_05_15/2018_04_15_00_auth.sql diff --git a/sql/updates/characters/4.3.4/2018_04_15_00_characters.sql b/sql/old/4.3.4/characters/29_2018_05_15/2018_04_15_00_characters.sql similarity index 100% rename from sql/updates/characters/4.3.4/2018_04_15_00_characters.sql rename to sql/old/4.3.4/characters/29_2018_05_15/2018_04_15_00_characters.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_15_04_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_15_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_15_04_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_15_04_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_16_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_16_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_16_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_16_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_16_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_16_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_16_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_16_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_17_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_17_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_17_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_17_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_18_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_18_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_18_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_18_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_01_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_01_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_02_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_02_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_02_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_21_03_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_21_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_21_03_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_21_03_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_23_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_23_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_23_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_23_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_00_world_from_335_was_2018_04_17_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_01_world_from_335_was_2018_04_17_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_02_world_from_335_was_2018_04_17_02_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_03_world_from_335_was_2018_04_17_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_04_world_from_335_was_2018_04_22_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_25_05_world_from_335_was_2018_04_24_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2018_04_26_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_26_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2018_04_26_00_world.sql rename to sql/old/4.3.4/world/29_2018_05_15/2018_04_26_00_world.sql diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql new file mode 100644 index 00000000000..afa97a5c7af --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_04_29_00_world_from_335_was_2018_04_26_00_world.sql @@ -0,0 +1,14 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (17722,17801) AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(17722, 0, 0, 0, 0, 0, 100, 2, 1000, 1000, 2400, 3800, 0, 11, 12675, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - IC CMC - Cast 'Frostbolt' (Normal Dungeon)"), +(17722, 0, 1, 0, 0, 0, 100, 4, 1000, 1000, 2400, 3800, 0, 11, 37930, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - IC CMC - Cast 'Frostbolt' (Heroic Dungeon)"), +(17722, 0, 2, 0, 0, 0, 100, 2, 18000, 20000, 25000, 27000, 0, 11, 31581, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Blizzard' (No Repeat) (Normal Dungeon)"), +(17722, 0, 3, 0, 0, 0, 100, 4, 18000, 20000, 25000, 27000, 0, 11, 39416, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Blizzard' (Heroic Dungeon)"), +(17722, 0, 4, 0, 0, 0, 100, 2, 6000, 8000, 15000, 15000, 0, 11, 15063, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Frost Nova' (Normal Dungeon)"), +(17722, 0, 5, 0, 0, 0, 100, 4, 6000, 8000, 15000, 15000, 0, 11, 15531, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Coilfang Sorceress - In Combat - Cast 'Frost Nova' (Heroic Dungeon)"), +(17801, 0, 0, 0, 0, 0, 100, 2, 1000, 1000, 4400, 5800, 0, 11, 15234, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - IC CMC - Cast 'Lightning Bolt' (Normal Dungeon)"), +(17801, 0, 1, 0, 0, 0, 100, 4, 1000, 1000, 3400, 4800, 0, 11, 37664, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - IC CMC - Cast 'Lightning Bolt' (Heroic Dungeon)"), +(17801, 0, 2, 0, 0, 0, 100, 2, 12000, 15000, 15000, 19000, 0, 11, 35106, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Arcane Flare'(NormalDungeon)"), +(17801, 0, 3, 0, 0, 0, 100, 4, 9000, 12000, 15000, 17000, 0, 11, 37856, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Arcane Flare' (HeroicDungeon)"), +(17801, 0, 4, 0, 0, 0, 100, 6, 9000, 13000, 10000, 14000, 0, 11, 38660, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, "Coilfang Siren - In Combat - Cast 'Fear' (Dungeon)"); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_03_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_03_00_world.sql new file mode 100644 index 00000000000..021bd16ace9 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_03_00_world.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `spell_group` WHERE `id`=1122; +INSERT INTO `spell_group` (`id`, `spell_id`) VALUES +(1122,588), +(1122,73413); + +DELETE FROM `spell_group_stack_rules` WHERE `group_id`=1122; +INSERT INTO `spell_group_stack_rules` (`group_id`, `stack_rule`) VALUES +(1122,1); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_00_world.sql new file mode 100644 index 00000000000..1a12c20abc3 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_00_world.sql @@ -0,0 +1,2075 @@ +-- +DELETE FROM `quest_poi` WHERE (`QuestID`=28834 AND `id`=2) OR (`QuestID`=28834 AND `id`=1) OR (`QuestID`=28834 AND `id`=0) OR (`QuestID`=28836 AND `id`=2) OR (`QuestID`=28836 AND `id`=1) OR (`QuestID`=28836 AND `id`=0); +INSERT INTO `quest_poi` (`QuestID`, `id`, `ObjectiveIndex`, `MapID`, `WorldMapAreaId`, `Floor`, `Priority`, `Flags`, `VerifiedBuild`) VALUES +(28834, 2, 32, 643, 767, 1, 0, 0, 26365), -- Rescue the Earthspeaker! +(28834, 1, 0, 643, 767, 1, 0, 7, 26365), -- Rescue the Earthspeaker! +(28834, 0, -1, 643, 767, 1, 0, 1, 26365), -- Rescue the Earthspeaker! +(28836, 2, 32, 643, 767, 1, 0, 0, 26365), -- Sins of the Sea Witch +(28836, 1, 0, 643, 767, 2, 0, 7, 26365), -- Sins of the Sea Witch +(28836, 0, -1, 643, 767, 1, 0, 1, 26365); -- Sins of the Sea Witch + +DELETE FROM `quest_poi_points` WHERE (`QuestID`=28834 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=28836 AND `Idx1`=0 AND `Idx2`=0); +INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `VerifiedBuild`) VALUES +(28834, 2, 0, -617, 809, 26365), -- Rescue the Earthspeaker! +(28836, 2, 0, -617, 809, 26365), -- Sins of the Sea Witch +(28836, 1, 0, 193, 803, 26365), -- Sins of the Sea Witch +(28836, 0, 0, -617, 809, 26365); -- Sins of the Sea Witch + +UPDATE `quest_poi_points` SET `VerifiedBuild`=26365 WHERE (`QuestID`=28834 AND `Idx1`=1 AND `Idx2`=0); -- Rescue the Earthspeaker! +UPDATE `quest_poi_points` SET `VerifiedBuild`=26365 WHERE (`QuestID`=28834 AND `Idx1`=0 AND `Idx2`=0); -- Rescue the Earthspeaker! + +SET @CGUID:=254836; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+577; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -628.6702, 804.8403, 247.681, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+1, 50276, 643, 5004, 5004, 3, 169, 0, 0, 0, -616.7604, 803.3108, 245.253, 4.747295, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+2, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -618.2656, 819.7743, 245.4425, 1.134464, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+3, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -598.9757, 823.3489, 244.8928, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+4, 50276, 643, 5004, 5004, 3, 169, 0, 0, 0, -611.7274, 815.2101, 245.1277, 0.541052, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+5, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -610.4809, 796.3316, 245.1174, 4.153883, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+6, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -595.5052, 795.4861, 244.8928, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+7, 50278, 643, 5004, 5004, 3, 169, 0, 0, 0, -609.007, 807.0625, 244.6244, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 29266 - Permanent Feign Death) +(@CGUID+8, 53488, 643, 5004, 5004, 3, 169, 0, 0, 0, -567.1198, 810.2656, 244.9734, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Summon Enabler Stalker (Area: Throne of the Tides - Difficulty: 2) (Auras: 99201 - Summon Enabler) +(@CGUID+9, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -603.6129, 827.2743, 245.388, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+10, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -524.0555, 805.6702, 256.9915, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+11, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -438.9139, 769.7037, 270.5711, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+12, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -421.722, 830.59, 262.0083, 3.473205, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+13, 51391, 643, 5004, 5004, 3, 169, 0, 0, 0, -560.2465, 819.1996, 245.3967, 4.904375, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Throne of Tides Teleporter (Area: Throne of the Tides - Difficulty: 2) (Auras: 95293 - Teleporter Base Visual) +(@CGUID+14, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -500.5903, 804.8386, 257.168, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+15, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -479.9549, 803.1893, 253.4132, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+16, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -457.8351, 802.7327, 249.7082, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+17, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -548.1771, 807.5104, 246.4562, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+18, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -425.698, 829.125, 261.8723, 0.5934119, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+19, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -405.825, 769.054, 261.0923, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+20, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.3368, 802.3281, 248.7223, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+21, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -408.694, 838.417, 260.4864, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+22, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -383.538, 768.479, 267.6173, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+23, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -423.0002, 767.6939, 267.9297, 6.179363, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+24, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -586.0226, 808.3559, 245.4128, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+25, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -625.9271, 810.1198, 246.8475, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+26, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -399.1267, 806.4028, 248.1572, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+27, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -387.75, 768.861, 267.4823, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+28, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -609.2257, 790.7344, 245.3671, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+29, 45620, 643, 5004, 5004, 3, 169, 0, 0, 0, -404.481, 838.036, 260.6223, 3.089233, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+30, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -581.4739, 784.1632, 245.3917, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+31, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -580.9375, 826.7518, 245.4122, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+32, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -410.036, 769.436, 260.9573, 0.2094395, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+33, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -361.9618, 808.1545, 257.7555, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+34, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+35, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -320.656, 719.738, 281.1503, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+36, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.368, 723.863, 281.7914, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+37, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -318.366, 888.009, 253.0233, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+38, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -293.375, 981.314, 242.2833, 4.502949, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+39, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+40, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -311.526, 782.5868, 261.0339, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+41, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+42, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -253.316, 801.79, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+43, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.236, 813.972, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+44, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -317.2448, 809.434, 261.2558, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+45, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -317.957, 928.161, 248.3153, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+46, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.0642, 832.566, 259.9967, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+47, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.8594, 974.8472, 246.7041, 5.427974, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+48, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+49, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.714, 799.069, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+50, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.38, 818.372, 263.7803, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+51, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -342.7049, 809.5555, 259.3411, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+52, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.109, 887.832, 251.6793, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+53, 22517, 643, 5004, 5004, 3, 169, 0, 0, 0, -312.4514, 957.0226, 243.4756, 5.393067, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Large AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 76345 - Water Leak) +(@CGUID+54, 44581, 643, 5004, 5004, 3, 169, 0, 0, 0, -111.391, 933.094, 273.8753, 5.480334, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Vehicle (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+55, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+56, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 295.1404, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+57, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -134.991, 940.849, 293.6703, 0.03490658, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+58, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -157.358, 954.346, 302.8073, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+59, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+60, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.613, 980.859, 310.3224, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+61, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.722, 966.649, 306.3033, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+62, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -144.283, 983.316, 230.4773, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+63, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -171.681, 998.184, 304.9164, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+64, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.606, 1002.71, 310.8013, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+65, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.927, 1012.31, 304.4124, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+66, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -249.599, 805.063, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+67, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+68, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.576, 987.587, 314.3933, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+69, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -143.552, 963.455, 310.5244, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+70, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.424, 955.934, 306.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+71, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -159.903, 996.75, 310.6373, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+72, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.151, 835.866, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+73, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -152.712, 982.807, 313.7444, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+74, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -188.321, 805.252, 384.9963, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+75, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -154.003, 964.913, 310.2063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+76, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -219.061, 774.641, 476.5523, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) (Auras: 85170 - Shock Defense) +(@CGUID+77, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -105.349, 1015.8, 285.8954, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+78, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 245.5052, 749.3125, 807.6003, 2.391101, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+79, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 244.849, 855.1302, 807.5911, 3.909538, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+80, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, 51.1059, 802.1563, 846.4826, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +-- (@CGUID+81, 40655, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, 0, 0, 0, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat (Area: Throne of the Tides - Difficulty: 2) (Auras: ) - !!! on transport - transport template not found !!! +(@CGUID+82, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 138.0781, 749.1441, 807.5905, 0.7504916, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+83, 36171, 643, 5004, 5004, 3, 169, 0, 0, 0, -118.108, 954.753, 298.8474, 5.794493, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Infinite AOI) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+84, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 115.4983, 802.7986, 808.3495, 6.230825, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+85, 45030, 643, 5004, 5004, 3, 169, 0, 0, 0, -74.125, 852.818, 340.5083, 0.2792527, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Vehicle, Big (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+86, 48983, 643, 5004, 5004, 3, 169, 0, 0, 0, 137.7569, 855.8611, 807.7711, 5.51524, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Geyser (Area: Throne of the Tides - Difficulty: 2) (Auras: 91347 - Geyser) +(@CGUID+87, 50270, 643, 5004, 5004, 3, 169, 0, 0, 0, -616.7604, 808.7518, 245.6328, 3.263766, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Captain Taylor (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+88, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4493, 770.1429, 270.0137, 6.043383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+89, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+90, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+91, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+92, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.1181, 808.9722, 260.9349, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+93, 21252, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.347, 719.599, 276.0583, 1.53589, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Not Immune PC) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+94, 40577, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.9392, 808.0417, 260.1373, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Sentinel (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+95, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -272.7153, 807.8299, 258.9762, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+96, 21252, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.635, 922.342, 238.8223, 4.677482, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Not Immune PC) (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+97, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -256.5955, 808.0364, 259.165, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +-- (@CGUID+98, 40788, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, 0.3978609, 0, 2.68787, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Mindbender Ghur'sha (Area: Throne of the Tides - Difficulty: 2) (Auras: 76339 - Unrelenting Agony) - !!! on transport - transport template not found !!! +(@CGUID+99, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, -421.6042, 839.7882, 263.3889, 4.842506, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+100, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, -411.3646, 778.8055, 262.9503, 1.528872, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+101, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, -409.0035, 839.2552, 262.0498, 5.119945, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+102, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, -396.9653, 779.9288, 265.7069, 1.55391, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+103, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+104, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+105, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+106, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+107, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+108, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+109, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0012, 770.7614, 270.6093, 6.245494, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+110, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+111, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+112, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+113, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.066, 910.313, 263.1674, 2.164208, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+114, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9966, 769.9376, 271.0846, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+115, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+116, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0623, 770.7634, 270.6196, 6.253349, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+117, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+118, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6494, 769.0002, 269.2897, 6.077984, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+119, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.002, 769.9387, 271.0871, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+120, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -65.9722, 1031.8, 257.2863, 3.926991, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+121, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+122, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0165, 770.7618, 270.6118, 6.247449, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+123, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7867, 769.029, 269.309, 6.075617, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+124, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.006, 769.9396, 271.089, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+125, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+126, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+127, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7592, 769.0231, 269.3051, 6.076094, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+128, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+129, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+130, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.006, 769.9396, 271.089, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+131, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+132, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+133, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+134, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+135, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+136, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+137, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+138, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+139, 39959, 643, 5004, 5004, 3, 169, 0, 0, 0, -20.19097, 802.0608, 807.5371, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Lady Naz'jar (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+140, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+141, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+142, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 69.88738, 814.4952, 806.3171, 1.334788, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+143, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 65.4325, 817.1699, 806.3171, 1.551777, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+144, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.4774, 802.0746, 796.6592, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+145, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 71.21053, 815.938, 806.3171, 1.361175, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+146, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -54.44445, 803.0816, 797.1558, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+147, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -128.7379, 802.4809, 796.9691, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+148, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 66.10126, 815.2298, 806.3171, 1.459526, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+149, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -178.8802, 801.9913, 797.0841, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+150, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 71.26827, 818.0963, 806.3171, 1.426958, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+151, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.5156, 803.0816, 796.5791, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+152, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 61.37276, 823.2509, 806.3171, 2.426346, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+153, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 69.97628, 819.6906, 806.3171, 1.505136, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+154, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -81.20834, 801.6094, 797.083, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+155, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 67.80486, 813.8999, 806.3171, 1.369688, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+156, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 66.16724, 819.086, 806.3171, 1.59144, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+157, 40579, 643, 5004, 5004, 3, 169, 0, 0, 0, 67.96173, 820.0815, 806.3171, 1.568952, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+158, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.61806, 802.1458, 805.629, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+159, 51395, 643, 5004, 5004, 3, 169, 0, 0, 0, -14.53993, 796.316, 808.2356, 1.58825, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Throne of Tides Teleporter (Area: Throne of the Tides - Difficulty: 2) (Auras: 95296 - Teleporter Active Visual) +(@CGUID+160, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 38.71181, 801.5816, 805.5076, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+161, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 37.33333, 779.8646, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+162, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.43056, 801.8403, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+163, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.64236, 797.8368, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+164, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.59722, 810.2656, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+165, 40634, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.03993, 794.0677, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+166, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 36.8507, 825.9358, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+167, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 8.27257, 802.8143, 807.0149, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+168, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 33.52778, 806.1667, 806.4003, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+169, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 52.02951, 753.0799, 806.193, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+170, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 65.63021, 820.4844, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+171, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 52.17708, 854.7934, 806.0573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+172, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 60.61632, 781.7604, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+173, 40577, 643, 5004, 5004, 3, 169, 0, 0, 0, 53.11364, 824.3899, 806.3169, 0.01476906, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Sentinel (Area: Throne of the Tides - Difficulty: 2) (Auras: ) (possible waypoints or random movement) +(@CGUID+174, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 84.90799, 801.6302, 806.4003, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+175, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -135.0625, 772.4739, 810.089, 1.448623, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) (possible waypoints or random movement) +(@CGUID+176, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -135.5764, 831.9948, 808.1715, 4.39823, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) (possible waypoints or random movement) +(@CGUID+177, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.3125, 775.8559, 810.9689, 1.448623, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+178, 40584, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.8837, 832.8108, 808.739, 4.572762, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+179, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -70.23785, 774.9618, 810.3751, 1.712018, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+180, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 128.2726, 802.2448, 808.4679, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+181, 40586, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8125, 802.4305, 807.7212, 3.036873, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Lady Naz'jar (Area: Throne of the Tides - Difficulty: 2) (Auras: 90495 - Waterspout) +(@CGUID+182, 41139, 643, 5004, 5004, 3, 169, 0, 0, 0, -72.86459, 831.441, 809.7106, 4.86808, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (Auras: 74048 - Water Window Jump Through Visual) +(@CGUID+183, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.4965, 797.0886, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+184, 39616, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.4896, 806.0139, 808.4933, 3.228859, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Invader (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+185, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.809, 810.0139, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+186, 40634, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.6007, 801.75, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+187, 41096, 643, 5004, 5004, 3, 169, 0, 0, 0, 136.6458, 792.5677, 808.4933, 3.228859, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Naz'jar Spiritmender (Area: Throne of the Tides - Difficulty: 2) (possible waypoints or random movement) +(@CGUID+188, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 145.1441, 845.1511, 807.6957, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+189, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 148.4271, 757.5121, 807.6461, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+190, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+191, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+192, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+193, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+194, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+195, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+196, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+197, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+198, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+199, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+200, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 168.658, 802.467, 808.0177, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+201, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+202, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+203, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+204, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+205, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+206, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 193.908, 774.3281, 807.8459, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+207, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 190.8542, 830.8698, 807.873, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+208, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.75174, 799.0087, 805.7594, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+209, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.20486, 799.5851, 803.6364, 3.141593, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+210, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -30.29688, 794.8941, 803.2464, 3.106686, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+211, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.83854, 796.2708, 805.673, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+212, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -32.35243, 798.1597, 801.7277, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+213, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 196.4497, 802.3195, 807.7212, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+214, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 223.1389, 802.7222, 808.0499, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+215, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -25.79167, 809.467, 805.1479, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+216, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -27.95139, 805.7361, 804.0556, 3.159046, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+217, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -31.125, 807.9219, 802.3655, 3.176499, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+218, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -29.51736, 810.2552, 803.2809, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+219, 39960, 643, 5004, 5004, 3, 169, 0, 0, 0, -34.05556, 810.4774, 801.454, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Deep Murloc Drudge (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+220, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 231.8177, 843.3507, 807.885, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+221, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, 236.5851, 757.8958, 807.5884, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+222, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.1979, 745.6007, 830.6442, 1.532863, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+223, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8733, 859.5452, 831.4933, 4.705678, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+224, 40633, 643, 5004, 5004, 3, 169, 0, 0, 0, 249.9375, 802.25, 828.8116, 3.147335, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Honor Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+225, 40633, 643, 5004, 5004, 3, 169, 0, 0, 0, 249.9375, 802.25, 828.8116, 3.147335, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Honor Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+226, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.8733, 859.5452, 831.4933, 4.705678, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+227, 44404, 643, 5004, 5004, 3, 169, 0, 0, 0, 191.1979, 745.6007, 830.6442, 1.532863, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Tempest Witch (Area: Throne of the Tides - Difficulty: 2) (Auras: 75808 - Water Window Break Visual) +(@CGUID+228, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.477, 661.01, 281.4153, 2.23188, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+229, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.7917, 671.1694, 280.5178, 2.186387, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+230, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.0759, 668.8297, 280.8867, 2.188809, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+231, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.3462, 664.1631, 281.7034, 2.1634, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: 76604 - Void Rip) (possible waypoints or random movement) +(@CGUID+232, 40792, 643, 5004, 5004, 3, 169, 0, 0, 0, -146.8663, 981.5313, 230.4787, 2.949606, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Neptulon (Area: Throne of the Tides - Difficulty: 2) (Auras: 76952 - Purify) +(@CGUID+233, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -288.911, 667.142, 282.2543, 2.14487, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+234, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -296.523, 665.198, 281.0583, 2.25458, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+235, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.146, 662.971, 281.3593, 2.202956, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+236, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.938, 659.363, 281.7794, 2.262644, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+237, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.068, 665.408, 281.9814, 2.15424, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+238, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -224.863, 642.969, 287.3143, 3.490659, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+239, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+240, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -251.5156, 643.8108, 285.8642, 5.270895, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+241, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.4879, 646.2882, 285.6189, 3.193953, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+242, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+243, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.8264, 669.691, 279.9994, 2.753881, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+244, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -246.6615, 643.033, 286.2367, 3.735005, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+245, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -256.1823, 637.0452, 285.7028, 2.530727, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+246, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+247, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.9045, 667.1632, 280.3178, 1.095781, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+248, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+249, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -246.9601, 638.0521, 286.1168, 2.373648, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+250, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -294.703, 676.158, 280.9214, 3.804818, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+251, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.7465, 672.2882, 279.8831, 3.661204, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+252, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+253, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+254, 40936, 643, 5004, 5004, 3, 169, 0, 0, 0, -224.618, 634.016, 287.2314, 2.879793, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Watcher (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+255, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.5799, 675.059, 279.8106, 2.304396, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+256, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -252.1979, 638.9879, 285.7877, 0.715585, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76410 - Water Jet) +(@CGUID+257, 40935, 643, 5004, 5004, 3, 169, 0, 0, 0, -254.9913, 641.8264, 285.6591, 2.897247, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Hunter (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+258, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+259, 40943, 643, 5004, 5004, 3, 169, 0, 0, 0, -248.967, 640.9132, 286.041, 2.844887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Gilgoblin Aquamage (Area: Throne of the Tides - Difficulty: 2) (Auras: 76406 - Water Jet) +(@CGUID+260, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+261, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+262, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+263, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+264, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+265, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+266, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+267, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+268, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+269, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+270, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+271, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+272, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+273, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+274, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+275, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+276, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -358.7208, 764.5826, 275.9673, 6.031887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+277, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+278, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.75, 956.075, 253.9413, 5.707227, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+279, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.1018, 915.3441, 239.4511, 4.570662, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) (possible waypoints or random movement) +(@CGUID+280, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.8, 973.512, 252.4223, 5.707227, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+281, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -228.2951, 977.4132, 231.7018, 3.124139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) +(@CGUID+282, 22515, 643, 5004, 5004, 3, 169, 0, 0, 0, -280.476, 986.049, 251.8123, 5.078908, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- World Trigger (Area: Throne of the Tides - Difficulty: 2) (Auras: 82953 - Ozumat Ink) +(@CGUID+283, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -228.2483, 985.9496, 231.6591, 3.071779, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) +(@CGUID+284, 40925, 643, 5004, 5004, 3, 169, 0, 0, 0, -285.6053, 964.0278, 236.4931, 3.838374, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 26365), -- Tainted Sentry (Area: Throne of the Tides - Difficulty: 2) (Auras: 76625 - Summon Unstable Corruptions) (possible waypoints or random movement) +(@CGUID+285, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.9781, 770.7604, 270.6053, 6.242595, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+286, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+287, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+288, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+289, 40765, 643, 5004, 5004, 3, 169, 0, 0, 0, 51.9911, 802.6801, 888.0374, 6.198466, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Commander Ulthok (Area: Throne of the Tides - Difficulty: 2) (Auras: 76017 - Ulthok Intro Visual State) +(@CGUID+290, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+291, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -309.7928, 912.5019, 239.8704, 1.335766, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+292, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+293, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.2863, 909.6929, 240.4176, 4.069224, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+294, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+295, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+296, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -310.0808, 909.6741, 240.412, 3.994689, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+297, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+298, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.8094, 952.9477, 236.2822, 5.890752, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+299, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+300, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+301, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+302, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -378.2955, 767.4971, 270.2835, 0.01471755, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+303, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -270.484, 975.3795, 236.8476, 3.852387, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+304, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -272.441, 973.3168, 236.8856, 0.4456027, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+305, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+306, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -298.1781, 954.262, 235.8903, 1.001435, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+307, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+308, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+309, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -270.9366, 977.1397, 236.8224, 2.280367, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+310, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -436.6898, 769.2233, 269.5162, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+311, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+312, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+313, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+314, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4797, 770.1504, 270.0186, 6.043761, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+315, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+316, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+317, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+318, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+319, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+320, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +-- (@CGUID+321, 92870, 643, 5004, 5004, 3, 169, 0, 0, 0, -508.3617, 804.9224, 266.9508, 0.02312139, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Sindragosa's Fury (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+322, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+323, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+324, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+325, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+326, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+327, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+328, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+329, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+330, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+331, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+332, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+333, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+334, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+335, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+336, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+337, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+338, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+339, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+340, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9966, 769.9376, 271.0846, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+341, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6769, 769.006, 269.2936, 6.077507, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+342, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+343, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+344, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+345, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+346, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0471, 770.7629, 270.6171, 6.251368, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+347, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+348, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+349, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+350, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+351, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+352, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0073, 769.9399, 271.0896, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+353, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+354, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+355, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+356, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7181, 769.0146, 269.2993, 6.076792, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+357, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.002, 769.9387, 271.0871, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+358, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+359, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7592, 769.0231, 269.3051, 6.076094, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+360, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+361, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0087, 769.9402, 271.0903, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+362, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+363, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+364, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+365, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+366, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+367, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+368, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+369, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+370, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+371, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+372, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+373, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4998, 770.1552, 270.0219, 6.044028, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+374, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.548, 770.0566, 271.3461, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+375, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+376, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+377, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+378, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+379, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+380, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+381, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+382, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+383, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+384, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+385, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+386, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+387, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4897, 770.1528, 270.0203, 6.043887, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+388, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5413, 770.0552, 271.3429, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+389, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+390, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+391, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+392, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+393, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+394, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+395, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+396, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+397, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4695, 770.1479, 270.017, 6.043641, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+398, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.544, 770.0558, 271.3442, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+399, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+400, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+401, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+402, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+403, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+404, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+405, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+406, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6906, 769.0088, 269.2955, 6.077271, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+407, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+408, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.9993, 769.9382, 271.0858, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) (Auras: 85211 - Water Bolt) +(@CGUID+409, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+410, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+411, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+412, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+413, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+414, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.994, 769.937, 271.0833, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+415, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6355, 768.9974, 269.2878, 6.078218, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+416, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+417, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+418, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+419, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4695, 770.1479, 270.017, 6.043641, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+420, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5387, 770.0546, 271.3416, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+421, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+422, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+423, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+424, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+425, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.52, 770.1602, 270.0252, 6.044287, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+426, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5438, 770.0559, 271.3448, 6.070781, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+427, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+428, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+429, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+430, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+431, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0088, 770.7616, 270.6106, 6.246471, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+432, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+433, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+434, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+435, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+436, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+437, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+438, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+439, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7181, 769.0146, 269.2993, 6.076792, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+440, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -419.548, 767.3745, 268.4773, 6.166172, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+441, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+442, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+443, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+444, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+445, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+446, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -422.8674, 767.6801, 267.9077, 6.179697, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+447, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+448, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+449, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -406.9185, 767.0944, 269.2914, 6.261036, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+450, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+451, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+452, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+453, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+454, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.6722, 766.2968, 265.8526, 6.264995, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+455, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+456, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8545, 767.8329, 271.7672, 0.0006884783, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+457, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+458, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9276, 766.3483, 266.2505, 0.03699381, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+459, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.9358, 767.6356, 273.8051, 6.220333, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+460, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+461, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+462, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+463, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -418.0725, 767.2133, 267.123, 6.193002, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+464, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+465, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -406.2899, 767.5161, 269.9694, 6.276873, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+466, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+467, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+468, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+469, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+470, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+471, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+472, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.6597, 766.2965, 265.853, 6.265087, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+473, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+474, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -386.3977, 767.2345, 274.6118, 6.202915, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+475, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+476, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9276, 766.3483, 266.2505, 0.03699381, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+477, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+478, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+479, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -392.8012, 767.4155, 274.3909, 6.214547, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+480, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+481, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+482, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -402.7597, 766.2983, 265.8493, 6.264351, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+483, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+484, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8349, 767.8334, 273.5405, 6.223954, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+485, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+486, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+487, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+488, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+489, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+490, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+491, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+492, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -397.9156, 766.3488, 266.2519, 0.03709382, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+493, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -398.8584, 767.6307, 273.8154, 6.220333, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+494, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+495, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -413.1039, 766.8049, 266.4181, 6.210011, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+496, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -411.4561, 768.2091, 270.4888, 0.004991191, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+497, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+498, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+499, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+500, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -422.8785, 767.6812, 267.9095, 6.179667, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+501, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+502, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -425.83, 768.1109, 269.0852, 6.165987, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+503, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+504, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+505, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+506, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+507, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+508, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+509, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.536, 770.0541, 271.3404, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+510, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.429, 770.138, 270.0104, 6.043131, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+511, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+512, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+513, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+514, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+515, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -439.998, 769.9379, 271.0852, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+516, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+517, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.6769, 769.006, 269.2936, 6.077507, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+518, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+519, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+520, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+521, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.983, 951.62, 235.2573, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+522, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+523, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0395, 770.7627, 270.6158, 6.250383, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+524, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+525, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+526, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+527, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+528, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+529, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4797, 770.1504, 270.0186, 6.043761, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+530, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.54, 770.0549, 271.3423, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+531, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.736, 952.082, 236.1343, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+532, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.064, 942.363, 235.8433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+533, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+534, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+535, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -282.672, 973.602, 236.0653, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+536, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -297.773, 961.759, 235.5713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+537, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.304, 948.014, 235.4513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+538, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.55, 957.932, 236.0663, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+539, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.573, 959.401, 235.4883, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+540, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+541, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4998, 770.1552, 270.0219, 6.044028, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+542, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5427, 770.0555, 271.3435, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+543, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.705, 969.608, 235.7383, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+544, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -290.519, 966.533, 235.8633, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+545, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+546, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+547, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -292.42, 970.998, 235.9253, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+548, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -295.203, 961.87, 235.8903, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+549, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.5387, 770.0546, 271.3416, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+550, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -437.4594, 770.1454, 270.0154, 6.043514, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+551, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -304.451, 955.915, 235.4123, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+552, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.918, 948.363, 235.8583, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+553, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -302.899, 948.047, 235.7713, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+554, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.224, 941.321, 235.9063, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+555, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -291.816, 972.729, 235.9783, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+556, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -307.571, 947.88, 235.6393, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+557, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -308.24, 946.118, 235.7183, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+558, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -299.323, 957.382, 235.6283, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+559, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -301.661, 955.981, 235.4143, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+560, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -432.7455, 769.0203, 269.3032, 6.076324, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+561, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -440.0046, 769.9393, 271.0884, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+562, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.799, 951.611, 235.7513, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+563, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -300.198, 962.085, 235.5273, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+564, 40923, 643, 5004, 5004, 3, 169, 0, 0, 0, -306.339, 951.547, 235.4433, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unstable Corruption (Area: Throne of the Tides - Difficulty: 2) (Auras: 76362 - Unstable Corruption Growth) +(@CGUID+565, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.0241, 770.7621, 270.6132, 6.248422, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+566, 45621, 643, 5004, 5004, 3, 169, 0, 0, 0, -441.082, 770.172, 271.5993, 6.070463, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Elemental Guard (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+567, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -387.9229, 766.9808, 268.0077, 0.07349079, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) +(@CGUID+568, 44864, 643, 5004, 5004, 3, 169, 0, 0, 0, -153.333, 982.807, 229.5483, 2.792527, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Combat Trigger (Area: Throne of the Tides - Difficulty: 2) +-- (@CGUID+569, 44950, UNKNOWN, 5004, 5004, 3, 169, 0, 0, 0, -0.6934912, -3.64126, 1.543307, 0, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Unyielding Behemoth (Hand Visual) (Area: Throne of the Tides - Difficulty: 2) (Auras: 46598 - Ride Vehicle Hardcoded, 83976 - Shrink) - !!! on transport - transport template not found !!! +(@CGUID+570, 44566, 643, 5004, 5004, 3, 169, 0, 0, 0, -64.0677, 845.455, 310.6913, 2.181662, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat (Area: Throne of the Tides - Difficulty: 2) (Auras: 83126 - Ozumat Globe Impact Periodic) +(@CGUID+571, 44656, 643, 5004, 5004, 3, 169, 0, 0, 0, -103.066, 910.313, 263.1674, 2.164208, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Ozumat Add Spawner (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+572, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -165.0469, 1002.967, 230.5902, 5.393067, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+573, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -125.7309, 1004.01, 230.3206, 3.892084, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+574, 44752, 643, 5004, 5004, 3, 169, 0, 0, 0, -168.4375, 962.1979, 230.2837, 0.4886922, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Faceless Sapper (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+575, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -368.6192, 766.7662, 272.7951, 6.119343, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+576, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -354.9971, 763.6516, 277.2143, 6.063018, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365), -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) +(@CGUID+577, 45672, 643, 5004, 5004, 3, 169, 0, 0, 0, -358.6903, 764.5749, 275.9777, 6.031822, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 26365); -- Naz'jar Soldier (Area: Throne of the Tides - Difficulty: 2) (Auras: ) + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+577; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(@CGUID+0, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+1, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Spiritmender - 29266 - Permanent Feign Death +(@CGUID+2, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+3, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+4, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Spiritmender - 29266 - Permanent Feign Death +(@CGUID+5, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+6, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+7, 0, 0, 0, 1, 0, '29266'), -- Naz'jar Invader - 29266 - Permanent Feign Death +(@CGUID+8, 0, 0, 0, 1, 0, '99201'), -- Summon Enabler Stalker - 99201 - Summon Enabler +(@CGUID+9, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+10, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+11, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+12, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+13, 0, 0, 50331648, 1, 0, '95293'), -- Throne of Tides Teleporter - 95293 - Teleporter Base Visual +(@CGUID+14, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+15, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+16, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+17, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+18, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+19, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+20, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+21, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+22, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+23, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+24, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+25, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+26, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+27, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+28, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+29, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+30, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+31, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+32, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+33, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+34, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+35, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+36, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+37, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+38, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+39, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+40, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+41, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+42, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+43, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+44, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+45, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+46, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+47, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+48, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+49, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+50, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+51, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+52, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+53, 0, 0, 0, 1, 0, '76345'), -- World Trigger (Large AOI) - 76345 - Water Leak +(@CGUID+54, 0, 0, 50331648, 1, 0, ''), -- Ozumat Vehicle +(@CGUID+55, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+56, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+57, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+58, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+59, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+60, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+61, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+62, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+63, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+64, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+65, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+66, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+67, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+68, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+69, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+70, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+71, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+72, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+73, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+74, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+75, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+76, 0, 0, 0, 1, 0, '85170'), -- World Trigger (Infinite AOI) - 85170 - Shock Defense +(@CGUID+77, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+78, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+79, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+80, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +-- (@CGUID+81, 0, 0, 50331648, 1, 0, ''), -- Ozumat +(@CGUID+82, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+83, 0, 0, 0, 1, 0, ''), -- World Trigger (Infinite AOI) +(@CGUID+84, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+85, 0, 0, 50331648, 1, 0, ''), -- Ozumat Vehicle, Big +(@CGUID+86, 0, 0, 0, 1, 0, '91347'), -- Geyser - 91347 - Geyser +(@CGUID+87, 0, 0, 0, 1, 0, ''), -- Captain Taylor +(@CGUID+88, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+89, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+90, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+91, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+92, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+93, 0, 0, 0, 1, 0, ''), -- World Trigger (Not Immune PC) +(@CGUID+94, 0, 0, 0, 1, 0, ''), -- Naz'jar Sentinel +(@CGUID+95, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+96, 0, 0, 0, 1, 0, ''), -- World Trigger (Not Immune PC) +(@CGUID+97, 0, 0, 0, 1, 0, ''), -- World Trigger +-- (@CGUID+98, 0, 0, 0, 1, 0, '76339'), -- Mindbender Ghur'sha - 76339 - Unrelenting Agony +(@CGUID+99, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+100, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+101, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+102, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+103, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+104, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+105, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+106, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+107, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+108, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+109, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+110, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+111, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+112, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+113, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+114, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+115, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+116, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+117, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+118, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+119, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+120, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+121, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+122, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+123, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+124, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+125, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+126, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+127, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+128, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+129, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+130, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+131, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+132, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+133, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+134, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+135, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+136, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+137, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+138, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+139, 0, 0, 0, 1, 0, ''), -- Lady Naz'jar +(@CGUID+140, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+141, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+142, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+143, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+144, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+145, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+146, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+147, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+148, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+149, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+150, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+151, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+152, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+153, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+154, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+155, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+156, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+157, 0, 0, 0, 1, 0, ''), -- Deep Murloc Hunter +(@CGUID+158, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+159, 0, 0, 50331648, 1, 0, '95296'), -- Throne of Tides Teleporter - 95296 - Teleporter Active Visual +(@CGUID+160, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+161, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+162, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+163, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+164, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+165, 0, 0, 0, 1, 0, ''), -- Naz'jar Tempest Witch +(@CGUID+166, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+167, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+168, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+169, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+170, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+171, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+172, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+173, 0, 0, 0, 1, 0, ''), -- Naz'jar Sentinel +(@CGUID+174, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+175, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+176, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+177, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+178, 0, 0, 50331648, 1, 0, '74048'), -- Naz'jar Invader - 74048 - Water Window Jump Through Visual +(@CGUID+179, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+180, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+181, 0, 0, 0, 1, 0, '90495'), -- Lady Naz'jar - 90495 - Waterspout +(@CGUID+182, 0, 0, 0, 1, 0, '74048'), -- Naz'jar Spiritmender - 74048 - Water Window Jump Through Visual +(@CGUID+183, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+184, 0, 0, 0, 1, 0, ''), -- Naz'jar Invader +(@CGUID+185, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+186, 0, 0, 0, 1, 0, ''), -- Naz'jar Tempest Witch +(@CGUID+187, 0, 0, 0, 1, 0, ''), -- Naz'jar Spiritmender +(@CGUID+188, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+189, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+190, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+191, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+192, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+193, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+194, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+195, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+196, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+197, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+198, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+199, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+200, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+201, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+202, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+203, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+204, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+205, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+206, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+207, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+208, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+209, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+210, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+211, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+212, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+213, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+214, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+215, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+216, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+217, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+218, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+219, 0, 0, 0, 1, 0, ''), -- Deep Murloc Drudge +(@CGUID+220, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+221, 0, 0, 0, 1, 0, ''), -- World Trigger +(@CGUID+222, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+223, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+224, 0, 0, 50331648, 1, 0, '75808'), -- Naz'jar Honor Guard - 75808 - Water Window Break Visual +(@CGUID+225, 0, 0, 50331648, 1, 0, '75808'), -- Naz'jar Honor Guard - 75808 - Water Window Break Visual +(@CGUID+226, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+227, 0, 0, 0, 1, 0, '75808'), -- Naz'jar Tempest Witch - 75808 - Water Window Break Visual +(@CGUID+228, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+229, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+230, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+231, 0, 0, 0, 1, 0, '76604'), -- Faceless Watcher - 76604 - Void Rip +(@CGUID+232, 0, 0, 0, 1, 0, '76952'), -- Neptulon - 76952 - Purify +(@CGUID+233, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+234, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+235, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+236, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+237, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+238, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+239, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+240, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+241, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+242, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+243, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+244, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+245, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+246, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+247, 0, 0, 0, 1, 0, ''), -- Gilgoblin Aquamage +(@CGUID+248, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+249, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+250, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+251, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+252, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+253, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+254, 0, 0, 0, 1, 0, ''), -- Faceless Watcher +(@CGUID+255, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+256, 0, 0, 0, 0, 0, '76410'), -- Gilgoblin Aquamage - 76410 - Water Jet +(@CGUID+257, 0, 0, 0, 1, 0, ''), -- Gilgoblin Hunter +(@CGUID+258, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+259, 0, 0, 0, 1, 0, '76406'), -- Gilgoblin Aquamage - 76406 - Water Jet +(@CGUID+260, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+261, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+262, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+263, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+264, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+265, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+266, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+267, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+268, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+269, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+270, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+271, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+272, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+273, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+274, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+275, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+276, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+277, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+278, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+279, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+280, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+281, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+282, 0, 0, 0, 1, 0, '82953'), -- World Trigger - 82953 - Ozumat Ink +(@CGUID+283, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+284, 0, 0, 0, 1, 0, '76625'), -- Tainted Sentry - 76625 - Summon Unstable Corruptions +(@CGUID+285, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+286, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+287, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+288, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+289, 0, 0, 0, 1, 0, '76017'), -- Commander Ulthok - 76017 - Ulthok Intro Visual State +(@CGUID+290, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+291, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+292, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+293, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+294, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+295, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+296, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+297, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+298, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+299, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+300, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+301, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+302, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+303, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+304, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+305, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+306, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+307, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+308, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+309, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+310, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+311, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+312, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+313, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+314, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+315, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+316, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+317, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+318, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+319, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+320, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +-- (@CGUID+321, 0, 0, 50331648, 1, 0, ''), -- Sindragosa's Fury +(@CGUID+322, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+323, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+324, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+325, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+326, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+327, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+328, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+329, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+330, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+331, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+332, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+333, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+334, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+335, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+336, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+337, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+338, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+339, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+340, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+341, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+342, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+343, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+344, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+345, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+346, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+347, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+348, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+349, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+350, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+351, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+352, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+353, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+354, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+355, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+356, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+357, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+358, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+359, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+360, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+361, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+362, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+363, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+364, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+365, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+366, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+367, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+368, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+369, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+370, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+371, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+372, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+373, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+374, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+375, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+376, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+377, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+378, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+379, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+380, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+381, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+382, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+383, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+384, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+385, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+386, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+387, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+388, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+389, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+390, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+391, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+392, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+393, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+394, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+395, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+396, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+397, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+398, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+399, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+400, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+401, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+402, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+403, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+404, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+405, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+406, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+407, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+408, 0, 0, 50331648, 1, 0, '85211'), -- Elemental Guard - 85211 - Water Bolt +(@CGUID+409, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+410, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+411, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+412, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+413, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+414, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+415, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+416, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+417, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+418, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+419, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+420, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+421, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+422, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+423, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+424, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+425, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+426, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+427, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+428, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+429, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+430, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+431, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+432, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+433, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+434, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+435, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+436, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+437, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+438, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+439, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+440, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+441, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+442, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+443, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+444, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+445, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+446, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+447, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+448, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+449, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+450, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+451, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+452, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+453, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+454, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+455, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+456, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+457, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+458, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+459, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+460, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+461, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+462, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+463, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+464, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+465, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+466, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+467, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+468, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+469, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+470, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+471, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+472, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+473, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+474, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+475, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+476, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+477, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+478, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+479, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+480, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+481, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+482, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+483, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+484, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+485, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+486, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+487, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+488, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+489, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+490, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+491, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+492, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+493, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+494, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+495, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+496, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+497, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+498, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+499, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+500, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+501, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+502, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+503, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+504, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+505, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+506, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+507, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+508, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+509, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+510, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+511, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+512, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+513, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+514, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+515, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+516, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+517, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+518, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+519, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+520, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+521, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+522, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+523, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+524, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+525, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+526, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+527, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+528, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+529, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+530, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+531, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+532, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+533, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+534, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+535, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+536, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+537, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+538, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+539, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+540, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+541, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+542, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+543, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+544, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+545, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+546, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+547, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+548, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+549, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+550, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+551, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+552, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+553, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+554, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+555, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+556, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+557, 0, 0, 0, 1, 0, ''), -- Unstable Corruption +(@CGUID+558, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+559, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+560, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+561, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+562, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+563, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+564, 0, 0, 0, 1, 0, '76362'), -- Unstable Corruption - 76362 - Unstable Corruption Growth +(@CGUID+565, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+566, 0, 0, 50331648, 1, 0, ''), -- Elemental Guard +(@CGUID+567, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+568, 0, 0, 0, 1, 0, ''), -- Ozumat Combat Trigger +-- (@CGUID+569, 0, 0, 50331648, 1, 0, '83976'), -- Unyielding Behemoth (Hand Visual) - 46598 - Ride Vehicle Hardcoded, 83976 - Shrink +(@CGUID+570, 0, 0, 50331648, 1, 0, '83126'), -- Ozumat - 83126 - Ozumat Globe Impact Periodic +(@CGUID+571, 0, 0, 0, 1, 0, ''), -- Ozumat Add Spawner +(@CGUID+572, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+573, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+574, 0, 0, 0, 1, 0, ''), -- Faceless Sapper +(@CGUID+575, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+576, 0, 0, 50331648, 1, 0, ''), -- Naz'jar Soldier +(@CGUID+577, 0, 0, 50331648, 1, 0, ''); -- Naz'jar Soldier + +SET @OGUID:=235567; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+776; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+0, 204963, 643, 5004, 5004, 3, 169, 0, -647.283, 806.7465, 249.3488, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Instance Portal (Party + Heroic) (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+1, 207998, 643, 5004, 5004, 3, 169, 0, -319.7966, 857.6629, 271.2394, 1.570796, 0, 0, 0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_WG_Invisible_Door02 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+2, 208301, 643, 5004, 5004, 3, 169, 0, -311.465, 932.8975, 247.9267, 4.71239, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_Abyssal_Leviathan_Tentacle_fromBelow01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+3, 208302, 643, 5004, 5004, 3, 169, 0, -309.7529, 685.5665, 286.1978, 1.570796, 0, 0, 0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_Abyssal_Leviathan_Tentacle01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+4, 207997, 643, 5004, 5004, 3, 169, 0, -315.5558, 758.4044, 275.6646, 4.71239, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 26365), -- Doodad_WG_Invisible_Door01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+5, 204341, 643, 5004, 5004, 3, 169, 0, -211.6087, 981.8606, 229.7631, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 26365), -- Doodad_Abyssal_Maw_Door_04 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+6, 204340, 643, 5004, 5004, 3, 169, 0, -211.5925, 637.4172, 286.1444, 3.141593, 0, 0, -1, 0, 7200, 255, 0, 26365), -- Doodad_Abyssal_Maw_Door_03 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+7, 207209, 643, 5004, 5004, 3, 169, 0, -215.2937, 806.2046, 253.7109, 3.141593, 0, 0, -1, 0, 7200, 255, 24, 26365), -- 0 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+8, 204339, 643, 5004, 5004, 3, 169, 0, 108.324, 802.3706, 807.5527, 3.141593, 0, 0, -1, 0, 7200, 255, 0, 26365), -- Doodad_Abyssal_Maw_Door_02 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+9, 204338, 643, 5004, 5004, 3, 169, 0, -9.41391, 802.3706, 807.5527, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 26365), -- Doodad_Abyssal_Maw_Door_01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+10, 207406, 643, 5004, 5004, 3, 169, 0, -297.9132, 795.2726, 261.6193, 2.44346, 0, 0, 0.9396925, 0.3420205, 7200, 255, 1, 26365), -- Strange Fountain (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+11, 202742, 643, 5004, 5004, 3, 169, 0, -603.6129, 827.2743, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+12, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+13, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+14, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+15, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+16, 202742, 643, 5004, 5004, 3, 169, 0, -617.3641, 836.2683, 248.1258, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+17, 202742, 643, 5004, 5004, 3, 169, 0, -284.7762, 807.5505, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+18, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+19, 202742, 643, 5004, 5004, 3, 169, 0, -591.2202, 799.9266, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+20, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+21, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+22, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+23, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+24, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+25, 202742, 643, 5004, 5004, 3, 169, 0, -358.9077, 815.5439, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+26, 202742, 643, 5004, 5004, 3, 169, 0, -496.4043, 799.0345, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+27, 202742, 643, 5004, 5004, 3, 169, 0, -444.9424, 808.0842, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+28, 202742, 643, 5004, 5004, 3, 169, 0, -240.7071, 817.6274, 260.4027, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+29, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+30, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+31, 202742, 643, 5004, 5004, 3, 169, 0, -524.0555, 805.6702, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+32, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+33, 202742, 643, 5004, 5004, 3, 169, 0, -544.8745, 815.712, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+34, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+35, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+36, 202742, 643, 5004, 5004, 3, 169, 0, -235.1476, 800.8314, 261.5132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+37, 202742, 643, 5004, 5004, 3, 169, 0, -299.1781, 793.9689, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+38, 202742, 643, 5004, 5004, 3, 169, 0, -493.1612, 811.2871, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+39, 202742, 643, 5004, 5004, 3, 169, 0, -603.3486, 795.0095, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+40, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+41, 202742, 643, 5004, 5004, 3, 169, 0, -598.3884, 848.5992, 248.4784, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+42, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+43, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+44, 202742, 643, 5004, 5004, 3, 169, 0, -307.4474, 795.1099, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+45, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+46, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+47, 202742, 643, 5004, 5004, 3, 169, 0, -459.9038, 818.2845, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+48, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+49, 202742, 643, 5004, 5004, 3, 169, 0, -594.227, 818.4092, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+50, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+51, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+52, 202742, 643, 5004, 5004, 3, 169, 0, -369.568, 818.5821, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+53, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+54, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+55, 202742, 643, 5004, 5004, 3, 169, 0, -466.2964, 818.5667, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+56, 202742, 643, 5004, 5004, 3, 169, 0, -603.8947, 798.4953, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+57, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+58, 202742, 643, 5004, 5004, 3, 169, 0, -358.3351, 817.1099, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+59, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+60, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+61, 202742, 643, 5004, 5004, 3, 169, 0, -290.175, 814.1153, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+62, 202742, 643, 5004, 5004, 3, 169, 0, -556.7227, 821.95, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+63, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+64, 202742, 643, 5004, 5004, 3, 169, 0, -448.101, 799.924, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+65, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+66, 202742, 643, 5004, 5004, 3, 169, 0, -229.6048, 790.1569, 261.3102, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+67, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+68, 202742, 643, 5004, 5004, 3, 169, 0, -368.801, 818.1627, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+69, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+70, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+71, 202742, 643, 5004, 5004, 3, 169, 0, -572.4982, 788.6063, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+72, 202742, 643, 5004, 5004, 3, 169, 0, -290.5056, 806.1481, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+73, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+74, 202742, 643, 5004, 5004, 3, 169, 0, -585.6165, 824.773, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+75, 202742, 643, 5004, 5004, 3, 169, 0, -488.4996, 791.0689, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+76, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+77, 202742, 643, 5004, 5004, 3, 169, 0, -524.0555, 805.6702, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+78, 202742, 643, 5004, 5004, 3, 169, 0, -587.3433, 821.478, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+79, 202742, 643, 5004, 5004, 3, 169, 0, -425.3569, 800.3156, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+80, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+81, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+82, 202742, 643, 5004, 5004, 3, 169, 0, -391.1242, 796.3162, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+83, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+84, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+85, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+86, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+87, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+88, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+89, 202742, 643, 5004, 5004, 3, 169, 0, -226.2889, 808.7465, 262.4425, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+90, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+91, 202742, 643, 5004, 5004, 3, 169, 0, -335.619, 805.8668, 260.7825, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+92, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+93, 202742, 643, 5004, 5004, 3, 169, 0, -607.69, 836.9983, 246.2324, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+94, 202742, 643, 5004, 5004, 3, 169, 0, -299.9826, 801.5759, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+95, 202742, 643, 5004, 5004, 3, 169, 0, -621.425, 835.7364, 250.5735, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+96, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+97, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+98, 202742, 643, 5004, 5004, 3, 169, 0, -298.357, 853.6345, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+99, 202742, 643, 5004, 5004, 3, 169, 0, -457.8351, 802.7327, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+100, 202742, 643, 5004, 5004, 3, 169, 0, -605.7587, 822.4447, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+101, 202742, 643, 5004, 5004, 3, 169, 0, -311.526, 782.5868, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+102, 202742, 643, 5004, 5004, 3, 169, 0, -362.8908, 795.5602, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+103, 202742, 643, 5004, 5004, 3, 169, 0, -595.3865, 825.0136, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+104, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+105, 202742, 643, 5004, 5004, 3, 169, 0, -304.5349, 791.9608, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+106, 202742, 643, 5004, 5004, 3, 169, 0, -518.662, 809.2816, 257.7878, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+107, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+108, 202742, 643, 5004, 5004, 3, 169, 0, -588.5107, 794.9981, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+109, 202742, 643, 5004, 5004, 3, 169, 0, -342.7049, 809.5555, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+110, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+111, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+112, 202742, 643, 5004, 5004, 3, 169, 0, -225.7423, 822.6299, 261.5414, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+113, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+114, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+115, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+116, 202742, 643, 5004, 5004, 3, 169, 0, -462.7195, 816.3304, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+117, 202742, 643, 5004, 5004, 3, 169, 0, -576.1688, 820.5981, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+118, 202742, 643, 5004, 5004, 3, 169, 0, -386.6591, 810.1473, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+119, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+120, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+121, 202742, 643, 5004, 5004, 3, 169, 0, -472.6013, 814.3001, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+122, 202742, 643, 5004, 5004, 3, 169, 0, -236.5861, 804.4183, 261.4096, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+123, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+124, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+125, 202742, 643, 5004, 5004, 3, 169, 0, -616.9158, 788.9645, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+126, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+127, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+128, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+129, 202742, 643, 5004, 5004, 3, 169, 0, -427.9673, 799.2715, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+130, 202742, 643, 5004, 5004, 3, 169, 0, -142.5002, 807.4653, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+131, 202742, 643, 5004, 5004, 3, 169, 0, -359.4024, 816.0008, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+132, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+133, 202742, 643, 5004, 5004, 3, 169, 0, -545.8215, 803.1368, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+134, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+135, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+136, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+137, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+138, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+139, 202742, 643, 5004, 5004, 3, 169, 0, -304.8722, 803.3438, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+140, 202742, 643, 5004, 5004, 3, 169, 0, -595.9771, 834.451, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+141, 202742, 643, 5004, 5004, 3, 169, 0, -287.5294, 800.5106, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+142, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+143, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+144, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+145, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+146, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+147, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+148, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+149, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+150, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+151, 202742, 643, 5004, 5004, 3, 169, 0, -481.6059, 796.6169, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+152, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+153, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+154, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+155, 202742, 643, 5004, 5004, 3, 169, 0, -611.7615, 789.2568, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+156, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+157, 202742, 643, 5004, 5004, 3, 169, 0, -599.2275, 802.1318, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+158, 202742, 643, 5004, 5004, 3, 169, 0, -594.126, 850.4564, 248.2198, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+159, 202742, 643, 5004, 5004, 3, 169, 0, -557.9584, 809.366, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+160, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+161, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+162, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+163, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+164, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+165, 202742, 643, 5004, 5004, 3, 169, 0, -457.8351, 802.7327, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+166, 202742, 643, 5004, 5004, 3, 169, 0, -358.4568, 817.6851, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+167, 202742, 643, 5004, 5004, 3, 169, 0, -240.8974, 805.6653, 260.8077, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+168, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+169, 202742, 643, 5004, 5004, 3, 169, 0, -299.1329, 817.9169, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+170, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+171, 202742, 643, 5004, 5004, 3, 169, 0, -586.0226, 808.3559, 245.4128, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+172, 202742, 643, 5004, 5004, 3, 169, 0, -587.9221, 811.8238, 245.388, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+173, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+174, 202742, 643, 5004, 5004, 3, 169, 0, -560.1353, 808.0738, 256.9915, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+175, 202742, 643, 5004, 5004, 3, 169, 0, -310.2377, 796.3908, 261.6247, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+176, 202742, 643, 5004, 5004, 3, 169, 0, -588.1623, 789.9441, 245.4122, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+177, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+178, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+179, 202742, 643, 5004, 5004, 3, 169, 0, -433.7593, 809.1063, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+180, 202742, 643, 5004, 5004, 3, 169, 0, -244.1751, 805.7748, 260.2285, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+181, 202742, 643, 5004, 5004, 3, 169, 0, -382.1367, 808.9256, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+182, 202742, 643, 5004, 5004, 3, 169, 0, -371.249, 818.6626, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+183, 202742, 643, 5004, 5004, 3, 169, 0, -581.4739, 784.1632, 245.3917, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+184, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+185, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+186, 202742, 643, 5004, 5004, 3, 169, 0, -609.2257, 790.7344, 245.3671, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+187, 202742, 643, 5004, 5004, 3, 169, 0, -548.1771, 807.5104, 246.4562, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+188, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+189, 202742, 643, 5004, 5004, 3, 169, 0, -479.9549, 803.1893, 253.4132, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+190, 202742, 643, 5004, 5004, 3, 169, 0, -468.1788, 815.2173, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+191, 202742, 643, 5004, 5004, 3, 169, 0, -617.4396, 819.5039, 246.8475, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+192, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+193, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+194, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+195, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+196, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+197, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+198, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+199, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+200, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+201, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+202, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+203, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+204, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+205, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+206, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+207, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+208, 205542, 643, 5004, 5004, 3, 169, 0, 54.11389, 802.0451, 805.761, 3.188875, 0, 0, -0.9997206, 0.02363881, 7200, 255, 1, 26365), -- Doodad_Abyssal_Coral_Chunk_Ceiling01_Break01 (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+209, 202742, 643, 5004, 5004, 3, 169, 0, 23.34144, 822.1941, 807.1287, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+210, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+211, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+212, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+213, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+214, 202742, 643, 5004, 5004, 3, 169, 0, 67.83644, 808.8594, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+215, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+216, 202742, 643, 5004, 5004, 3, 169, 0, 152.8295, 807.125, 808.9501, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+217, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+218, 202742, 643, 5004, 5004, 3, 169, 0, 41.15274, 820.7129, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+219, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+220, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+221, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+222, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+223, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+224, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+225, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+226, 202742, 643, 5004, 5004, 3, 169, 0, 122.2837, 821.2411, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+227, 202742, 643, 5004, 5004, 3, 169, 0, 66.71084, 799.9061, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+228, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+229, 202742, 643, 5004, 5004, 3, 169, 0, 42.32461, 810.2007, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+230, 202742, 643, 5004, 5004, 3, 169, 0, 55.99442, 852.5627, 806.6016, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+231, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+232, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+233, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+234, 202742, 643, 5004, 5004, 3, 169, 0, 139.0025, 808.6485, 808.9529, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+235, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+236, 202742, 643, 5004, 5004, 3, 169, 0, 34.18035, 802.2026, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+237, 202742, 643, 5004, 5004, 3, 169, 0, 185.5, 823.4261, 808.7596, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+238, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+239, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+240, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+241, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+242, 202742, 643, 5004, 5004, 3, 169, 0, 54.4508, 786.307, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+243, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+244, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+245, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+246, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+247, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+248, 202742, 643, 5004, 5004, 3, 169, 0, 46.77086, 807.3769, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+249, 202742, 643, 5004, 5004, 3, 169, 0, 3.151752, 806.9824, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+250, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+251, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+252, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+253, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+254, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+255, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+256, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+257, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+258, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+259, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+260, 202742, 643, 5004, 5004, 3, 169, 0, -293.2812, 815.7661, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+261, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+262, 202742, 643, 5004, 5004, 3, 169, 0, -317.3369, 828.0981, 261.2295, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+263, 202742, 643, 5004, 5004, 3, 169, 0, 228.5578, 802.1016, 808.8599, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+264, 202742, 643, 5004, 5004, 3, 169, 0, -370.3526, 820.8972, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+265, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+266, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+267, 202742, 643, 5004, 5004, 3, 169, 0, -230.1498, 814.9638, 261.888, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+268, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+269, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+270, 202742, 643, 5004, 5004, 3, 169, 0, -289.2099, 804.3326, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+271, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+272, 202742, 643, 5004, 5004, 3, 169, 0, -225.7609, 791.6033, 261.6887, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+273, 202742, 643, 5004, 5004, 3, 169, 0, 229.2187, 751.057, 808.4615, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+274, 202742, 643, 5004, 5004, 3, 169, 0, -305.6156, 802.5328, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+275, 202742, 643, 5004, 5004, 3, 169, 0, -332.5158, 814.4702, 260.7189, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+276, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+277, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+278, 202742, 643, 5004, 5004, 3, 169, 0, -361.9618, 808.1545, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+279, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+280, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+281, 202742, 643, 5004, 5004, 3, 169, 0, -431.4555, 796.5049, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+282, 202742, 643, 5004, 5004, 3, 169, 0, -468.8807, 818.1053, 257.168, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+283, 202742, 643, 5004, 5004, 3, 169, 0, 27.38033, 819.5683, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+284, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+285, 202742, 643, 5004, 5004, 3, 169, 0, 25.24629, 805.5485, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+286, 202742, 643, 5004, 5004, 3, 169, 0, 33.70946, 772.0159, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+287, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+288, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+289, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+290, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+291, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+292, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+293, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+294, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+295, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+296, 202742, 643, 5004, 5004, 3, 169, 0, 163.3956, 826.3505, 808.8995, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+297, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+298, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+299, 202742, 643, 5004, 5004, 3, 169, 0, 49.03465, 764.1146, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+300, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+301, 202742, 643, 5004, 5004, 3, 169, 0, 40.07397, 810.2864, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+302, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+303, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+304, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+305, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+306, 202742, 643, 5004, 5004, 3, 169, 0, 49.85577, 783.4945, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+307, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+308, 202742, 643, 5004, 5004, 3, 169, 0, 117.859, 806.287, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+309, 202742, 643, 5004, 5004, 3, 169, 0, 71.9766, 790.4659, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+310, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+311, 202742, 643, 5004, 5004, 3, 169, 0, 56.07465, 822.0661, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+312, 202742, 643, 5004, 5004, 3, 169, 0, 187.6993, 818.705, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+313, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+314, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+315, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+316, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+317, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+318, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+319, 202742, 643, 5004, 5004, 3, 169, 0, 36.25398, 805.0674, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+320, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+321, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+322, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+323, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+324, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+325, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+326, 202742, 643, 5004, 5004, 3, 169, 0, -300.9183, 806.5731, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+327, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+328, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+329, 202742, 643, 5004, 5004, 3, 169, 0, -256.5955, 808.0364, 259.165, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+330, 202742, 643, 5004, 5004, 3, 169, 0, -256.5955, 808.0364, 259.165, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+331, 202742, 643, 5004, 5004, 3, 169, 0, -299.0084, 846.2816, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+332, 202742, 643, 5004, 5004, 3, 169, 0, -310.0642, 832.566, 259.9967, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+333, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+334, 202742, 643, 5004, 5004, 3, 169, 0, -309.8387, 789.3887, 261.0339, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+335, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+336, 202742, 643, 5004, 5004, 3, 169, 0, 236.8778, 835.5942, 808.5815, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+337, 202742, 643, 5004, 5004, 3, 169, 0, -317.2448, 809.434, 261.2558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+338, 202742, 643, 5004, 5004, 3, 169, 0, 219.9689, 785.3399, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+339, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+340, 202742, 643, 5004, 5004, 3, 169, 0, 219.8616, 745.4353, 808.9315, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+341, 202742, 643, 5004, 5004, 3, 169, 0, -373.566, 817.3975, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+342, 202742, 643, 5004, 5004, 3, 169, 0, -272.7153, 807.8299, 258.9762, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+343, 202742, 643, 5004, 5004, 3, 169, 0, -342.7049, 809.5555, 259.3411, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+344, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+345, 202742, 643, 5004, 5004, 3, 169, 0, -385.505, 803.7447, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+346, 202742, 643, 5004, 5004, 3, 169, 0, -295.1181, 808.9722, 260.9349, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+347, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+348, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+349, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+350, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+351, 202742, 643, 5004, 5004, 3, 169, 0, -423.7201, 799.1238, 249.7082, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+352, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+353, 202742, 643, 5004, 5004, 3, 169, 0, -387.2965, 814.9402, 257.7555, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+354, 202742, 643, 5004, 5004, 3, 169, 0, -432.3368, 802.3281, 248.7223, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+355, 202742, 643, 5004, 5004, 3, 169, 0, -399.1267, 806.4028, 248.1572, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+356, 203199, 643, 5004, 5004, 3, 169, 0, 118.4531, 798.9879, 809.069, 2.809975, 0, 0, 0.9862852, 0.1650499, 7200, 255, 0, 26365), -- Throne of Tides Defense System (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+357, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+358, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+359, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+360, 202742, 643, 5004, 5004, 3, 169, 0, 138.1355, 836.0701, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+361, 202742, 643, 5004, 5004, 3, 169, 0, 50.11511, 799.2448, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+362, 202742, 643, 5004, 5004, 3, 169, 0, 25.7226, 783.4463, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+363, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+364, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+365, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+366, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+367, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+368, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+369, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+370, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+371, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+372, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+373, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+374, 202742, 643, 5004, 5004, 3, 169, 0, 235.4976, 851.8138, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+375, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+376, 202742, 643, 5004, 5004, 3, 169, 0, 24.27828, 790.6388, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+377, 202742, 643, 5004, 5004, 3, 169, 0, 173.4377, 797.7512, 808.8982, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+378, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+379, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+380, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+381, 202742, 643, 5004, 5004, 3, 169, 0, 44.30289, 795.4138, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+382, 202742, 643, 5004, 5004, 3, 169, 0, -183.9505, 793.7863, 798.3094, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+383, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+384, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+385, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+386, 202742, 643, 5004, 5004, 3, 169, 0, 81.32465, 790.5443, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+387, 202742, 643, 5004, 5004, 3, 169, 0, 66.25199, 808.4076, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+388, 202742, 643, 5004, 5004, 3, 169, 0, 19.75219, 794.9404, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+389, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+390, 202742, 643, 5004, 5004, 3, 169, 0, 37.84798, 809.5364, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+391, 202742, 643, 5004, 5004, 3, 169, 0, 204.5055, 822.8646, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+392, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+393, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+394, 202742, 643, 5004, 5004, 3, 169, 0, 184.8169, 818.9229, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+395, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+396, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+397, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+398, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+399, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+400, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+401, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+402, 202742, 643, 5004, 5004, 3, 169, 0, 164.3785, 810.9473, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+403, 202742, 643, 5004, 5004, 3, 169, 0, 121.7077, 823.9096, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+404, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+405, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+406, 202742, 643, 5004, 5004, 3, 169, 0, -161.0122, 800.5391, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+407, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+408, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+409, 202742, 643, 5004, 5004, 3, 169, 0, 60.86016, 826.0198, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+410, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+411, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+412, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+413, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+414, 202742, 643, 5004, 5004, 3, 169, 0, 30.94499, 775.5549, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+415, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+416, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+417, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+418, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+419, 202742, 643, 5004, 5004, 3, 169, 0, 18.81054, 811.6598, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+420, 202742, 643, 5004, 5004, 3, 169, 0, -161.798, 806.3669, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+421, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+422, 202742, 643, 5004, 5004, 3, 169, 0, 37.51942, 808.0055, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+423, 202742, 643, 5004, 5004, 3, 169, 0, 32.40952, 816.1072, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+424, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+425, 202742, 643, 5004, 5004, 3, 169, 0, 48.45687, 833.707, 806.847, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+426, 202742, 643, 5004, 5004, 3, 169, 0, 101.3276, 803.9319, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+427, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+428, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+429, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+430, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+431, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+432, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+433, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+434, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+435, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+436, 202742, 643, 5004, 5004, 3, 169, 0, 56.23428, 852.5358, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+437, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+438, 202742, 643, 5004, 5004, 3, 169, 0, 220.2995, 784.8843, 808.6176, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+439, 202742, 643, 5004, 5004, 3, 169, 0, 204.1316, 789.7789, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+440, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+441, 202742, 643, 5004, 5004, 3, 169, 0, -154.8054, 807.1638, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+442, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+443, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+444, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+445, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+446, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+447, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+448, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+449, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+450, 202742, 643, 5004, 5004, 3, 169, 0, 95.39789, 807.9736, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+451, 202742, 643, 5004, 5004, 3, 169, 0, 49.11228, 810.8226, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+452, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+453, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+454, 202742, 643, 5004, 5004, 3, 169, 0, 53.19302, 825.8992, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+455, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+456, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+457, 202742, 643, 5004, 5004, 3, 169, 0, 45.14339, 798.1777, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+458, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+459, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+460, 202742, 643, 5004, 5004, 3, 169, 0, 252.7033, 837.0171, 808.6521, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+461, 202742, 643, 5004, 5004, 3, 169, 0, -233.4787, 794.2557, 261.3294, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+462, 202742, 643, 5004, 5004, 3, 169, 0, -232.4247, 817.0153, 261.5318, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+463, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+464, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+465, 202742, 643, 5004, 5004, 3, 169, 0, 15.64157, 794.6729, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+466, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+467, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+468, 202742, 643, 5004, 5004, 3, 169, 0, 163.592, 810.28, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+469, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+470, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+471, 202742, 643, 5004, 5004, 3, 169, 0, 70.80521, 825.8344, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+472, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+473, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+474, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+475, 202742, 643, 5004, 5004, 3, 169, 0, 134.3909, 783.0038, 808.9399, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+476, 202742, 643, 5004, 5004, 3, 169, 0, 224.4486, 868.4969, 808.9075, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+477, 202742, 643, 5004, 5004, 3, 169, 0, 35.29088, 789.2382, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+478, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+479, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+480, 202742, 643, 5004, 5004, 3, 169, 0, 144.6964, 800.9507, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+481, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+482, 202742, 643, 5004, 5004, 3, 169, 0, -144.5155, 802.4929, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+483, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+484, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+485, 202742, 643, 5004, 5004, 3, 169, 0, 63.66795, 812.6854, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+486, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+487, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+488, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+489, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+490, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+491, 202742, 643, 5004, 5004, 3, 169, 0, 176.6737, 798.1036, 808.8982, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+492, 202742, 643, 5004, 5004, 3, 169, 0, 49.45714, 849.3591, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+493, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+494, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+495, 202742, 643, 5004, 5004, 3, 169, 0, 138.7346, 793.4713, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+496, 202742, 643, 5004, 5004, 3, 169, 0, 46.89986, 803.9729, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+497, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+498, 202742, 643, 5004, 5004, 3, 169, 0, 158.7424, 764.696, 808.8522, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+499, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+500, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+501, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+502, 202742, 643, 5004, 5004, 3, 169, 0, 255.0835, 832.9749, 808.9399, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+503, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+504, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+505, 202742, 643, 5004, 5004, 3, 169, 0, 49.91712, 828.2465, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+506, 202742, 643, 5004, 5004, 3, 169, 0, 31.41403, 818.7122, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+507, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+508, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+509, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+510, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+511, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+512, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+513, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+514, 202742, 643, 5004, 5004, 3, 169, 0, -190.7427, 808.0786, 797.972, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+515, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+516, 202742, 643, 5004, 5004, 3, 169, 0, 153.3218, 807.6686, 808.9524, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+517, 202742, 643, 5004, 5004, 3, 169, 0, 41.92853, 810.147, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+518, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+519, 202742, 643, 5004, 5004, 3, 169, 0, 128.2265, 836.8654, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+520, 202742, 643, 5004, 5004, 3, 169, 0, 56.19157, 795.5731, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+521, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+522, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+523, 202742, 643, 5004, 5004, 3, 169, 0, 42.91511, 758.9261, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+524, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+525, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+526, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+527, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+528, 202742, 643, 5004, 5004, 3, 169, 0, 200.0507, 774.572, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+529, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+530, 202742, 643, 5004, 5004, 3, 169, 0, 173.7833, 813.332, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+531, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+532, 202742, 643, 5004, 5004, 3, 169, 0, 57.879, 835.134, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+533, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+534, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+535, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+536, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+537, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+538, 202742, 643, 5004, 5004, 3, 169, 0, 223.379, 772.0664, 808.9438, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+539, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+540, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+541, 202742, 643, 5004, 5004, 3, 169, 0, 76.34039, 802.842, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+542, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+543, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+544, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+545, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+546, 202742, 643, 5004, 5004, 3, 169, 0, 219.2139, 781.1704, 808.7433, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+547, 202742, 643, 5004, 5004, 3, 169, 0, 43.30576, 817.2437, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+548, 202742, 643, 5004, 5004, 3, 169, 0, 122.7969, 782.9244, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+549, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+550, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+551, 202742, 643, 5004, 5004, 3, 169, 0, -141.0634, 803.2926, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+552, 202742, 643, 5004, 5004, 3, 169, 0, 27.23885, 815.9766, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+553, 202742, 643, 5004, 5004, 3, 169, 0, 154.2409, 750.1065, 808.4761, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+554, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+555, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+556, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+557, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+558, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+559, 202742, 643, 5004, 5004, 3, 169, 0, 43.41222, 811.1862, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+560, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+561, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+562, 202742, 643, 5004, 5004, 3, 169, 0, 175.644, 815.9926, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+563, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+564, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+565, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+566, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+567, 202742, 643, 5004, 5004, 3, 169, 0, 133.4906, 785.5891, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+568, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+569, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+570, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+571, 202742, 643, 5004, 5004, 3, 169, 0, 226.2346, 743.9595, 808.7316, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+572, 202742, 643, 5004, 5004, 3, 169, 0, -141.6026, 793.4182, 797.7479, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+573, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+574, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+575, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+576, 202742, 643, 5004, 5004, 3, 169, 0, 242.5083, 840.6996, 808.42, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+577, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+578, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+579, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+580, 202742, 643, 5004, 5004, 3, 169, 0, 45.76748, 797.5413, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+581, 202742, 643, 5004, 5004, 3, 169, 0, 32.84404, 783.896, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+582, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+583, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+584, 202742, 643, 5004, 5004, 3, 169, 0, 35.69193, 797.364, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+585, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+586, 202742, 643, 5004, 5004, 3, 169, 0, 23.14739, 782.2534, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+587, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+588, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+589, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+590, 202742, 643, 5004, 5004, 3, 169, 0, 76.97551, 816.9681, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+591, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+592, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+593, 202742, 643, 5004, 5004, 3, 169, 0, 38.81, 808.1566, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+594, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+595, 202742, 643, 5004, 5004, 3, 169, 0, 58.84452, 792.6604, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+596, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+597, 202742, 643, 5004, 5004, 3, 169, 0, 220.7575, 837.2082, 808.9401, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+598, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+599, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+600, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+601, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+602, 202742, 643, 5004, 5004, 3, 169, 0, 215.1334, 794.4091, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+603, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+604, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+605, 202742, 643, 5004, 5004, 3, 169, 0, 81.4409, 806.8326, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+606, 202742, 643, 5004, 5004, 3, 169, 0, 70.75249, 823.026, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+607, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+608, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+609, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+610, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+611, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+612, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+613, 202742, 643, 5004, 5004, 3, 169, 0, 165.2305, 745.3442, 808.8819, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+614, 202742, 643, 5004, 5004, 3, 169, 0, 188.4053, 781.3583, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+615, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+616, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+617, 202742, 643, 5004, 5004, 3, 169, 0, 9.439528, 795.3918, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+618, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+619, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+620, 202742, 643, 5004, 5004, 3, 169, 0, 44.11723, 793.6713, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+621, 202742, 643, 5004, 5004, 3, 169, 0, 75.23912, 814.7702, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+622, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+623, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+624, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+625, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+626, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+627, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+628, 202742, 643, 5004, 5004, 3, 169, 0, 195.0128, 806.8054, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+629, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+630, 202742, 643, 5004, 5004, 3, 169, 0, 58.63293, 785.918, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+631, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+632, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+633, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+634, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+635, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+636, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+637, 202742, 643, 5004, 5004, 3, 169, 0, 48.32239, 803.2721, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+638, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+639, 202742, 643, 5004, 5004, 3, 169, 0, 200.4377, 826.8185, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+640, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+641, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+642, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+643, 202742, 643, 5004, 5004, 3, 169, 0, 234.6348, 750.9623, 808.2863, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+644, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+645, 202742, 643, 5004, 5004, 3, 169, 0, 200.4481, 773.2861, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+646, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+647, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+648, 202742, 643, 5004, 5004, 3, 169, 0, 132.0989, 774.636, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+649, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+650, 202742, 643, 5004, 5004, 3, 169, 0, 40.17184, 834.3758, 806.847, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+651, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+652, 202742, 643, 5004, 5004, 3, 169, 0, 37.45625, 803.8706, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+653, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+654, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+655, 202742, 643, 5004, 5004, 3, 169, 0, 39.93117, 791.3494, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+656, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+657, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+658, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+659, 202742, 643, 5004, 5004, 3, 169, 0, -151.5696, 811.7796, 797.6751, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+660, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+661, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+662, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+663, 202742, 643, 5004, 5004, 3, 169, 0, 42.51493, 804.5654, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+664, 202742, 643, 5004, 5004, 3, 169, 0, 40.60753, 805.2148, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+665, 202742, 643, 5004, 5004, 3, 169, 0, 223.5058, 835.8316, 808.9401, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+666, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+667, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+668, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+669, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+670, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+671, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+672, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+673, 202742, 643, 5004, 5004, 3, 169, 0, 46.42083, 790.2306, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+674, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+675, 202742, 643, 5004, 5004, 3, 169, 0, 35.415, 793.2467, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+676, 202742, 643, 5004, 5004, 3, 169, 0, 209.2919, 796.3069, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+677, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+678, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+679, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+680, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+681, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+682, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+683, 202742, 643, 5004, 5004, 3, 169, 0, 165.2075, 752.0398, 808.8794, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+684, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+685, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+686, 202742, 643, 5004, 5004, 3, 169, 0, -147.9583, 807.6516, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+687, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+688, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+689, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+690, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+691, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+692, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+693, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+694, 202742, 643, 5004, 5004, 3, 169, 0, 66.62801, 836.2322, 807.0526, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+695, 202742, 643, 5004, 5004, 3, 169, 0, 34.39502, 773.1477, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+696, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+697, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+698, 202742, 643, 5004, 5004, 3, 169, 0, 28.35011, 780.5449, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+699, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+700, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+701, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+702, 202742, 643, 5004, 5004, 3, 169, 0, 39.4081, 788.0806, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+703, 202742, 643, 5004, 5004, 3, 169, 0, 55.37197, 836.162, 806.848, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+704, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+705, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+706, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+707, 202742, 643, 5004, 5004, 3, 169, 0, -123.85, 802.1953, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+708, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+709, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+710, 202742, 643, 5004, 5004, 3, 169, 0, 168.658, 802.467, 808.0177, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+711, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+712, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+713, 202742, 643, 5004, 5004, 3, 169, 0, 43.07348, 821.6616, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+714, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+715, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+716, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+717, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+718, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+719, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+720, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+721, 202742, 643, 5004, 5004, 3, 169, 0, 91.35651, 792.2914, 807.1234, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+722, 202742, 643, 5004, 5004, 3, 169, 0, -178.8802, 801.9913, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+723, 202742, 643, 5004, 5004, 3, 169, 0, 196.4497, 802.3195, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+724, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+725, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+726, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+727, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+728, 202742, 643, 5004, 5004, 3, 169, 0, 235.7025, 831.2547, 808.7969, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+729, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+730, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+731, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+732, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+733, 202742, 643, 5004, 5004, 3, 169, 0, 61.52082, 805.3383, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+734, 202742, 643, 5004, 5004, 3, 169, 0, 34.08147, 821.5872, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+735, 202742, 643, 5004, 5004, 3, 169, 0, 41.34742, 768.7258, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+736, 202742, 643, 5004, 5004, 3, 169, 0, 223.1389, 802.7222, 808.0499, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+737, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+738, 202742, 643, 5004, 5004, 3, 169, 0, 236.5851, 757.8958, 807.5884, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+739, 202742, 643, 5004, 5004, 3, 169, 0, 171.5869, 808.459, 808.8981, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+740, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+741, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+742, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+743, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+744, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+745, 202742, 643, 5004, 5004, 3, 169, 0, 74.49322, 827.2534, 807.1271, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+746, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+747, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+748, 202742, 643, 5004, 5004, 3, 169, 0, -166.5038, 801.6523, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+749, 202742, 643, 5004, 5004, 3, 169, 0, 193.908, 774.3281, 807.8459, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+750, 202742, 643, 5004, 5004, 3, 169, 0, 190.8542, 830.8698, 807.873, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+751, 202742, 643, 5004, 5004, 3, 169, 0, -54.44445, 803.0816, 797.1558, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+752, 202742, 643, 5004, 5004, 3, 169, 0, 84.90799, 801.6302, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+753, 202742, 643, 5004, 5004, 3, 169, 0, 37.33333, 779.8646, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+754, 202742, 643, 5004, 5004, 3, 169, 0, 52.02951, 753.0799, 806.193, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+755, 202742, 643, 5004, 5004, 3, 169, 0, 157.9003, 807.3672, 808.6937, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+756, 202742, 643, 5004, 5004, 3, 169, 0, 31.56881, 779.1186, 807.0149, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+757, 202742, 643, 5004, 5004, 3, 169, 0, 148.4271, 757.5121, 807.6461, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+758, 202742, 643, 5004, 5004, 3, 169, 0, 52.17708, 854.7934, 806.0573, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+759, 202742, 643, 5004, 5004, 3, 169, 0, -103.4774, 802.0746, 796.6592, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+760, 202742, 643, 5004, 5004, 3, 169, 0, -81.20834, 801.6094, 797.083, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+761, 202742, 643, 5004, 5004, 3, 169, 0, 50.75718, 822.6475, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+762, 202742, 643, 5004, 5004, 3, 169, 0, 196.4739, 808.0817, 807.7212, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+763, 202742, 643, 5004, 5004, 3, 169, 0, -25.61806, 802.1458, 805.629, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+764, 202742, 643, 5004, 5004, 3, 169, 0, 34.17076, 800.0736, 806.4003, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+765, 202742, 643, 5004, 5004, 3, 169, 0, -128.7379, 802.4809, 796.9691, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+766, 202742, 643, 5004, 5004, 3, 169, 0, 221.8779, 757.4844, 808.7989, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+767, 202742, 643, 5004, 5004, 3, 169, 0, 217.8538, 830.1664, 808.9406, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+768, 202742, 643, 5004, 5004, 3, 169, 0, -152.0358, 802.0839, 797.0841, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+769, 202742, 643, 5004, 5004, 3, 169, 0, 38.71181, 801.5816, 805.5076, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+770, 202742, 643, 5004, 5004, 3, 169, 0, 231.8177, 843.3507, 807.885, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+771, 202742, 643, 5004, 5004, 3, 169, 0, 36.89356, 834.9725, 807.1595, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+772, 202742, 643, 5004, 5004, 3, 169, 0, 145.1441, 845.1511, 807.6957, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+773, 202742, 643, 5004, 5004, 3, 169, 0, 128.2726, 802.2448, 808.4679, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+774, 202742, 643, 5004, 5004, 3, 169, 0, -153.5156, 803.0816, 796.5791, 0, 0, 0, 0, 1, 7200, 255, 1, 26365), -- Temp Falling Rocks (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+775, 205216, 643, 5004, 5004, 3, 169, 0, -157.986, 982.238, 229.131, 2.984498, 0, 0, 0.9969168, 0.07846643, 7200, 255, 1, 26365), -- Neptulon's Cache (Area: Throne of the Tides - Difficulty: 2) +(@OGUID+776, 204964, 643, 5004, 5004, 3, 169, 0, -647.283, 806.7465, 249.3488, 0, 0, 0, 0, 1, 7200, 255, 1, 26365); -- Instance Portal (Party + Heroic) (Area: Throne of the Tides - Difficulty: 2) + + +DELETE FROM `gameobject_addon` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+775; +INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`) VALUES +(@OGUID+1, 0, 0, 1, -0.00000004371139), -- Doodad_WG_Invisible_Door02 +(@OGUID+2, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Leviathan_Tentacle_fromBelow01 +(@OGUID+3, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Leviathan_Tentacle01 +(@OGUID+4, 0, 0, 1, -0.00000004371139), -- Doodad_WG_Invisible_Door01 +(@OGUID+5, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_04 +(@OGUID+6, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_03 +(@OGUID+7, 0, 0, 1, -0.00000004371139), -- 0 +(@OGUID+8, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_02 +(@OGUID+9, 0, 0, 1, -0.00000004371139), -- Doodad_Abyssal_Maw_Door_01 +(@OGUID+208, 0, 0, 1, -0.00000004371139); -- Doodad_Abyssal_Coral_Chunk_Ceiling01_Break01 + +DELETE FROM `creature_template_addon` WHERE `entry` IN (44752 /*44752 (Faceless Sapper)*/, 44566 /*44566 (Ozumat) - Ozumat Globe Impact Periodic*/, 44950 /*44950 (Unyielding Behemoth (Hand Visual)) - Ride Vehicle Hardcoded, Shrink*/, 44864 /*44864 (Ozumat Combat Trigger)*/, 92870 /*92870 (Sindragosa's Fury)*/, 40765 /*40765 (Commander Ulthok) - Ulthok Intro Visual State*/, 40925 /*40925 (Tainted Sentry) - Summon Unstable Corruptions*/, 40923 /*40923 (Unstable Corruption) - Unstable Corruption Growth*/, 40943 /*40943 (Gilgoblin Aquamage)*/, 40792 /*40792 (Neptulon) - Purify*/, 40936 /*40936 (Faceless Watcher) - Void Rip*/, 40935 /*40935 (Gilgoblin Hunter)*/, 40633 /*40633 (Naz'jar Honor Guard) - Water Window Break Visual*/, 44404 /*44404 (Naz'jar Tempest Witch) - Water Window Break Visual*/, 40586 /*40586 (Lady Naz'jar) - Waterspout*/, 41139 /*41139 (Naz'jar Spiritmender) - Water Window Jump Through Visual*/, 40584 /*40584 (Naz'jar Invader) - Water Window Jump Through Visual*/, 40634 /*40634 (Naz'jar Tempest Witch)*/, 51395 /*51395 (Throne of Tides Teleporter) - Teleporter Active Visual*/, 40579 /*40579 (Deep Murloc Hunter)*/, 39959 /*39959 (Lady Naz'jar)*/, 39960 /*39960 (Deep Murloc Drudge)*/, 44656 /*44656 (Ozumat Add Spawner)*/, 41096 /*41096 (Naz'jar Spiritmender) - Water Window Jump Through Visual*/, 39616 /*39616 (Naz'jar Invader) - Water Window Jump Through Visual*/, 40825 /*40825 (Erunak Stonespeaker) - Enslave*/, 40788 /*40788 (Mindbender Ghur'sha) - Unrelenting Agony*/, 40577 /*40577 (Naz'jar Sentinel)*/, 50270 /*50270 (Captain Taylor)*/, 45030 /*45030 (Ozumat Vehicle, Big)*/, 40655 /*40655 (Ozumat)*/, 48983 /*48983 (Geyser) - Geyser*/, 44581 /*44581 (Ozumat Vehicle)*/, 45672 /*45672 (Naz'jar Soldier)*/, 51391 /*51391 (Throne of Tides Teleporter) - Teleporter Base Visual*/, 45620 /*45620 (Naz'jar Soldier)*/, 45621 /*45621 (Elemental Guard) - Water Bolt*/, 50278 /*50278 (Naz'jar Invader) - Permanent Feign Death*/, 50276 /*50276 (Naz'jar Spiritmender) - Permanent Feign Death*/); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(44752, 0, 0, 0, 1, 0, ''), -- 44752 (Faceless Sapper) +(44566, 0, 0, 50331648, 1, 0, '83126'), -- 44566 (Ozumat) - Ozumat Globe Impact Periodic +(44950, 0, 0, 50331648, 1, 0, '83976'), -- 44950 (Unyielding Behemoth (Hand Visual)) - Ride Vehicle Hardcoded, Shrink +(44864, 0, 0, 0, 1, 0, ''), -- 44864 (Ozumat Combat Trigger) +-- (92870, 0, 0, 50331648, 1, 0, ''), -- 92870 (Sindragosa's Fury) +(40765, 0, 0, 0, 1, 0, '76017'), -- 40765 (Commander Ulthok) - Ulthok Intro Visual State +(40925, 0, 0, 0, 1, 0, '76625'), -- 40925 (Tainted Sentry) - Summon Unstable Corruptions +(40923, 0, 0, 0, 1, 0, '76362'), -- 40923 (Unstable Corruption) - Unstable Corruption Growth +(40943, 0, 0, 0, 1, 0, ''), -- 40943 (Gilgoblin Aquamage) +(40792, 0, 0, 0, 1, 0, '76952'), -- 40792 (Neptulon) - Purify +(40936, 0, 0, 0, 1, 0, '76604'), -- 40936 (Faceless Watcher) - Void Rip +(40935, 0, 0, 0, 1, 0, ''), -- 40935 (Gilgoblin Hunter) +(40633, 0, 0, 50331648, 1, 0, '75808'), -- 40633 (Naz'jar Honor Guard) - Water Window Break Visual +(44404, 0, 0, 0, 1, 0, '75808'), -- 44404 (Naz'jar Tempest Witch) - Water Window Break Visual +(40586, 0, 0, 0, 1, 0, '90495'), -- 40586 (Lady Naz'jar) - Waterspout +(41139, 0, 0, 0, 1, 0, '74048'), -- 41139 (Naz'jar Spiritmender) - Water Window Jump Through Visual +(40584, 0, 0, 50331648, 1, 0, '74048'), -- 40584 (Naz'jar Invader) - Water Window Jump Through Visual +(40634, 0, 0, 0, 1, 0, ''), -- 40634 (Naz'jar Tempest Witch) +(51395, 0, 0, 50331648, 1, 0, '95296'), -- 51395 (Throne of Tides Teleporter) - Teleporter Active Visual +(40579, 0, 0, 0, 1, 0, ''), -- 40579 (Deep Murloc Hunter) +(39959, 0, 0, 0, 1, 0, ''), -- 39959 (Lady Naz'jar) +(39960, 0, 0, 0, 1, 0, ''), -- 39960 (Deep Murloc Drudge) +(44656, 0, 0, 0, 1, 0, ''), -- 44656 (Ozumat Add Spawner) +(41096, 0, 0, 50331648, 1, 0, '74048'), -- 41096 (Naz'jar Spiritmender) - Water Window Jump Through Visual +(39616, 0, 0, 50331648, 1, 0, '74048'), -- 39616 (Naz'jar Invader) - Water Window Jump Through Visual +(40825, 0, 0, 0, 1, 0, '76616'), -- 40825 (Erunak Stonespeaker) - Enslave +(40788, 0, 0, 0, 1, 0, '76339'), -- 40788 (Mindbender Ghur'sha) - Unrelenting Agony +(40577, 0, 0, 0, 1, 0, ''), -- 40577 (Naz'jar Sentinel) +(50270, 0, 0, 0, 1, 0, ''), -- 50270 (Captain Taylor) +(45030, 0, 0, 50331648, 1, 0, ''), -- 45030 (Ozumat Vehicle, Big) +(40655, 0, 0, 50331648, 1, 0, ''), -- 40655 (Ozumat) +(48983, 0, 0, 0, 1, 0, '91347'), -- 48983 (Geyser) - Geyser +(44581, 0, 0, 50331648, 1, 0, ''), -- 44581 (Ozumat Vehicle) +(45672, 0, 0, 50331648, 1, 0, ''), -- 45672 (Naz'jar Soldier) +(51391, 0, 0, 50331648, 1, 0, '95293'), -- 51391 (Throne of Tides Teleporter) - Teleporter Base Visual +(45620, 0, 0, 50331648, 1, 0, ''), -- 45620 (Naz'jar Soldier) +(45621, 0, 0, 50331648, 1, 0, '85211'), -- 45621 (Elemental Guard) - Water Bolt +(50278, 0, 0, 0, 1, 0, '29266'), -- 50278 (Naz'jar Invader) - Permanent Feign Death +(50276, 0, 0, 0, 1, 0, '29266'); -- 50276 (Naz'jar Spiritmender) - Permanent Feign Death + +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=21252; -- 21252 (World Trigger (Not Immune PC)) +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=22517; -- 22517 (World Trigger (Large AOI)) +UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=36171; -- 36171 (World Trigger (Infinite AOI)) + +UPDATE `creature_model_info` SET `BoundingRadius`=1.525103 WHERE `DisplayID`=32708; +UPDATE `creature_model_info` SET `BoundingRadius`=4.129169 WHERE `DisplayID`=33792; +UPDATE `creature_model_info` SET `BoundingRadius`=1.355182 WHERE `DisplayID`=33846; +UPDATE `creature_model_info` SET `BoundingRadius`=0.05212237, `CombatReach`=0.05 WHERE `DisplayID`=33845; +UPDATE `creature_model_info` SET `BoundingRadius`=2.752779 WHERE `DisplayID`=31674; +UPDATE `creature_model_info` SET `BoundingRadius`=0.8949282 WHERE `DisplayID`=37388; +UPDATE `creature_model_info` SET `BoundingRadius`=0.9946799, `CombatReach`=1 WHERE `DisplayID`=30408; +UPDATE `creature_model_info` SET `BoundingRadius`=1.649186 WHERE `DisplayID`=37386; +UPDATE `creature_model_info` SET `BoundingRadius`=1.198815 WHERE `DisplayID`=32578; +UPDATE `creature_model_info` SET `BoundingRadius`=1.649186 WHERE `DisplayID`=37370; +UPDATE `creature_model_info` SET `BoundingRadius`=0.8949282 WHERE `DisplayID`=37387; +UPDATE `creature_model_info` SET `BoundingRadius`=0.3 WHERE `DisplayID`=16925; + +DELETE FROM `gossip_menu` WHERE (`MenuId`=12568 AND `TextId`=17676); +INSERT INTO `gossip_menu` (`MenuId`, `TextId`) VALUES +(12568, 17676); -- 50270 (Captain Taylor) + +DELETE FROM `gossip_menu_option` WHERE (`MenuId`=11469 AND `OptionID`=0); +INSERT INTO `gossip_menu_option` (`MenuId`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextId`) VALUES +(11469, 0, 0, 'We are ready!', 41133); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (39959,40586,40765,40788,40792,40825); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +(39959, 0, 0, 'Armies of the depths, wash over our enemies as a tide of death!', 14, 0, 100, 0, 0, 18890, 50510, 'Lady Naz''jar to Player'), +(39959, 1, 0, 'Meddlesome gnats! You think us defeated so easily?', 14, 0, 100, 0, 0, 18891, 43121, 'Lady Naz''jar to Player'), +(40586, 0, 0, 'You have interfered with our plans for the last time, mortals!', 14, 0, 100, 0, 0, 18886, 50505, 'Lady Naz''jar to Player'), +(40586, 1, 0, 'Take arms, minions! Rise from the icy depths!', 14, 0, 100, 0, 0, 18892, 50513, 'Lady Naz''jar'), +(40586, 2, 0, 'Destroy these intruders! Leave them for the great dark beyond!', 14, 0, 100, 0, 0, 18893, 50514, 'Lady Naz''jar'), +(40586, 3, 0, 'Ulthok, stop them...', 14, 0, 100, 0, 0, 18889, 50509, 'Lady Naz''jar to Player'), +(40765, 0, 0, 'Iilth vwah, uhn''agth fhssh za.', 14, 0, 100, 0, 0, 18543, 50522, 'Commander Ulthok to Player'), +(40765, 1, 0, 'Where one falls, many shall take its place...', 15, 0, 100, 0, 0, 18543, 50523, 'Commander Ulthok to Player'), +(40765, 2, 0, 'Ywaq maq oou.', 14, 0, 100, 0, 0, 18542, 50529, 'Commander Ulthok to Player'), +(40788, 0, 0, 'A new host must be found.', 14, 0, 100, 0, 0, 18860, 50534, 'Mindbender Ghur''sha to Erunak Stonespeaker'), +(40788, 1, 0, 'Is. This. Reality?', 14, 0, 100, 0, 0, 18867, 50543, 'Mindbender Ghur''sha'), +(40788, 2, 0, 'They are outside the cycle...', 14, 0, 100, 0, 0, 18863, 50538, 'Mindbender Ghur''sha to Player'), +(40792, 0, 0, 'Ahh - my fearless assistants, I assume.', 14, 0, 100, 0, 0, 19469, 44263, 'Neptulon to Player'), +(40792, 1, 0, 'You may yet regret your presence here.', 14, 0, 100, 0, 0, 19470, 44264, 'Neptulon to Player'), +(40792, 2, 0, 'As I purify these waters, the servants of filth will surely be stirred. Beware!', 14, 0, 100, 0, 0, 19471, 44265, 'Neptulon to Player'), +(40792, 3, 0, 'Patience, guests. The waters are nearly cleansed.', 14, 0, 100, 0, 0, 19475, 44269, 'Neptulon to Player'), +(40792, 4, 0, 'The beast has returned! It must not pollute my waters!', 14, 0, 100, 0, 0, 19476, 44270, 'Neptulon to Player'), +(40792, 5, 0, 'Augh... Their filthiness stains me!', 14, 0, 100, 0, 0, 19472, 44266, 'Neptulon to Player'), +(40792, 6, 0, 'My waters are cleansed! Drink in their power!', 14, 0, 100, 0, 0, 19478, 44272, 'Neptulon to Player'), +(40792, 7, 0, 'Behold the power of pure water!', 14, 0, 100, 0, 0, 19477, 44271, 'Neptulon to Player'), +(40792, 8, 0, 'Ozumat is vulnerable, strike now!', 41, 0, 100, 0, 0, 19477, 50863, 'Neptulon to Player'), +(40825, 0, 0, 'I thank you, my friends. Forgive me. I... I have grown too weak to be of any assistance.', 14, 0, 100, 0, 0, 18662, 50533, 'Erunak Stonespeaker'), +(40825, 1, 0, 'I am... weary. You must carry on without me. I shall take my leave once my strength has returned.', 14, 0, 100, 0, 0, 18664, 50648, 'Erunak Stonespeaker to Player'); + +DELETE FROM `npc_spellclick_spells` WHERE (`npc_entry`=51391 AND `spell_id`=95284) OR (`npc_entry`=51395 AND `spell_id`=95285); +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(51391, 95284, 3, 0), +(51395, 95285, 3, 0); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql new file mode 100644 index 00000000000..66cd3d50ebc --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_01_world_from_335_was_2018_05_08_00_world_335.sql @@ -0,0 +1,19 @@ +/* +-- +-- Gaeriyan --> Fix Gossip Texts +DELETE FROM `gossip_menu` WHERE `MenuID`=1914 AND `TextID` IN (2567,2569); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(1914,2567,0), +(1914,2569,0); + +DELETE FROM `npc_text` WHERE `ID`=2569; +INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `Probability0`, `em0_1`) VALUES +(2569,"I have given you all the knowledge I have, $n. May luck be with you.","",4826,0,1,0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=1914; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14,1914,2567,0,0,14,0,3912,0,0,0,0,0,"","Show gossip text 2567 if quest 'Meet at the Grave' is not taken"), +(14,1914,2568,0,0,14,0,3912,0,0,1,0,0,"","Show gossip text 2568 if quest 'Meet at the Grave' is taken"), +(14,1914,2568,0,0,14,0,3913,0,0,0,0,0,"","Show gossip text 2568 if quest 'A Grave Situation' is not taken"), +(14,1914,2569,0,0,14,0,3913,0,0,1,0,0,"","Show gossip text 2569 if quest 'A Grave Situation' is taken"); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql new file mode 100644 index 00000000000..2441cd546d0 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_02_world_from_335_was_2018_05_08_01_world_335.sql @@ -0,0 +1,37 @@ +/* +-- Quest "The Videre Elixir" +-- Miblon's Bait +UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=164758; +DELETE FROM `smart_scripts` WHERE `entryorguid`=164758 AND `source_type`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(164758,1,0,0,1,0,100,1,0,0,0,1000,45,1,1,0,0,0,0,19,9467,50,0,0,0,0,0,"Miblon's Bait - Out of Combat - Set Data to Miblon Snarltooth (No Repeat)"); + +-- Miblon Snarltooth +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=9467; +DELETE FROM `smart_scripts` WHERE `entryorguid`=9467 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=946700 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(9467,0,0,0,11,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Respawn - Set Event Phase 1"), +(9467,0,1,0,38,1,100,0,1,1,0,0,80,946700,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Data Set - Run Script (Phase 1)"), +(946700,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 0"), +(946700,9,1,0,0,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Remove NPC Flag Gossip"), +(946700,9,2,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 0"), +(946700,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Orientation"), +(946700,9,4,0,0,0,100,0,1000,1000,0,0,41,0,115,0,0,0,0,14,17428,164729,0,0,0,0,0,"Miblon Snarltooth - On Script - Despawn Gameobject 'Miblon's Door'"), +(946700,9,5,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Run On"), +(946700,9,6,0,0,0,100,0,1000,1000,0,0,69,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Move to Closest Gameobject 'Miblon's Bait'"), +(946700,9,7,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 1"), +(946700,9,8,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 2"), +(946700,9,9,0,0,0,100,0,4000,4000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 3"), +(946700,9,10,0,0,0,100,0,105000,105000,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Evade"), +(946700,9,11,0,0,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Add NPC Flag Gossip"), +(946700,9,12,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 1"); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`=9467; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(9467,0,0,"%s abandons the block he was holding up in the doorway, and looks towards the bait.",16,0,100,0,0,0,4836,0,"Miblon Snarltooth"), +(9467,1,0,"%s sniffs the bait.",16,0,100,0,0,0,4768,0,"Miblon Snarltooth"), +(9467,2,0,"Grumble...",12,0,100,0,0,0,4766,0,"Miblon Snarltooth"), +(9467,3,0,"%s gnaws at the bait ravenously.",16,0,100,0,0,0,4771,0,"Miblon Snarltooth"); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql new file mode 100644 index 00000000000..f16bad2a2e6 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_03_world_from_335_was_2018_05_08_02_world_335.sql @@ -0,0 +1,21 @@ +/* +-- +-- Niby the Almighty --> Add gossip chatter +DELETE FROM `gossip_menu` WHERE `MenuID` IN (5841,5842,5843,5844); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(5844,7002,0), +(5843,7003,0), +(5842,7004,0), +(5841,7005,0); + +DELETE FROM `gossip_menu_option` WHERE `MenuID` IN (5845,5844,5843,5842); +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(5845,0,0,"I am in search of a great and powerful Warlock.",9625,1,1,5844,0,0,0,"",0,0), +(5844,0,0,"What task?",9627,1,1,5843,0,0,0,"",0,0), +(5843,0,0,"This is all very interesting but what is it that you want?",9629,1,1,5842,0,0,0,"",0,0), +(5842,0,0,"How do I do that?",9631,1,1,5841,0,0,0,"",0,0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=5845; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,5845,0,0,0,15,0,256,0,0,0,0,0,"","Show gossip option if player is a Warlock"); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql new file mode 100644 index 00000000000..171f1312b98 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_04_world_from_335_was_2018_05_08_03_world_335.sql @@ -0,0 +1,13 @@ +/* +-- +-- Ur'dan --> Add Gossip Text +UPDATE `creature_template` SET `gossip_menu_id`=5864 WHERE `entry`=14522; + +DELETE FROM `gossip_menu` WHERE `MenuID`=5864; +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(5864,7037,0); + +DELETE FROM `gossip_menu_option` WHERE `MenuID`=5864; +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(5864,0,1,"I wish to purchase from you.",9734,3,128,0,0,0,0,"",0,0); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql new file mode 100644 index 00000000000..f8c08c5517e --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_05_world_from_335_was_2018_05_08_04_world_335.sql @@ -0,0 +1,208 @@ +/* +-- +-- Quest "Forces of Jaedenar" +DELETE FROM `quest_details` WHERE `ID`=5155; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5155,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6 WHERE `ID`=5155; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1, `Emote3`=1 WHERE `ID`=5155; + +-- Quest "Collection of the Corrupt Water" +DELETE FROM `quest_details` WHERE `ID`=5157; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5157,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=5157; +UPDATE `quest_offer_reward` SET `Emote1`=2, `Emote2`=1 WHERE `ID`=5157; + +-- Quest "Seeking Spiritual Aid" +DELETE FROM `quest_details` WHERE `ID`=5158; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5158,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID`=5158; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID`=5158; + +-- Quest "Cleansed Water Returns to Felwood" +DELETE FROM `quest_details` WHERE `ID`=5159; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5159,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID`=5159; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1 WHERE `ID`=5159; + +-- Quest "Dousing the Flames of Protection" +DELETE FROM `quest_details` WHERE `ID`=5165; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5165,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5165; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID`=5165; + +-- Quest "A Final Blow" +DELETE FROM `quest_details` WHERE `ID`=5242; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5242,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5242; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=1, `Emote3`=2 WHERE `ID`=5242; + +-- Quest "Verifying the Corruption" +DELETE FROM `quest_details` WHERE `ID`=5156; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5156,1,1,1,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5156; + +-- Quest "Cleansing Felwood" +DELETE FROM `quest_details` WHERE `ID` IN (4101,4102); +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4101,1,0,0,0,0,0,0,0,0), +(4102,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5, `EmoteOnComplete`=5 WHERE `ID` IN (4101,4102); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID` IN (4101,4102); + +-- Quest "Salve via Hunting" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID` IN (4103,4108,5882,5887); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID` IN (4103,4108,5882,5887); + +-- Quest "A Strange One" +DELETE FROM `quest_details` WHERE `ID`=6605; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(6605,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=6 WHERE `ID`=6605; + +-- Quest "Well of Corruption" +DELETE FROM `quest_details` WHERE `ID`=4505; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4505,1,1,1,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5, `EmoteOnComplete`=5 WHERE `ID`=4505; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4505; + +-- Quest "Corrupted Sabers" +DELETE FROM `quest_details` WHERE `ID`=4506; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4506,1,11,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=5 WHERE `ID`=4506; +UPDATE `quest_offer_reward` SET `Emote1`=4, `Emote2`=11 WHERE `ID`=4506; + +-- Quest "A Husband's Last Battle" +DELETE FROM `quest_details` WHERE `ID`=6162; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(6162,1,1,5,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=6162; +UPDATE `quest_offer_reward` SET `Emote1`=2, `Emote2`=1 WHERE `ID`=6162; + +-- Quest "Timbermaw Ally" +DELETE FROM `quest_details` WHERE `ID`=8460; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8460,1,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8460; + +-- Quest "Speak to Nafien" +DELETE FROM `quest_details` WHERE `ID`=8462; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8462,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8462; + +-- Quest "Feathers for Grazle" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1, `EmoteOnComplete`=0 WHERE `ID`=8466; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=8466; + +-- Quest "Feathers for Nafien" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1, `EmoteOnComplete`=0 WHERE `ID`=8467; + +-- Quest "Wild Guardians" +DELETE FROM `quest_details` WHERE `ID`=4521; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4521,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=25 WHERE `ID`=4521; + +-- Quest "Wild Guardians (Part 2)" +DELETE FROM `quest_details` WHERE `ID`=4741; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4741,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4741; + +-- Quest "Wild Guardians (Part 3)" +DELETE FROM `quest_details` WHERE `ID`=4721; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4721,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=25 WHERE `ID`=4721; + +-- Quest "The Corruption of the Jadefire" +DELETE FROM `quest_details` WHERE `ID`=4421; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4421,1,2,1,0,0,0,0,0,0); + +-- Quest "Further Corruption" +DELETE FROM `quest_details` WHERE `ID`=4906; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4906,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=20 WHERE `ID`=4906; +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=2 WHERE `ID`=4906; + +-- Quest "Flute of Xavaric" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=939; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=939; + +-- Quest "Felbound Ancients" +DELETE FROM `quest_details` WHERE `ID`=4441; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4441,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=4441; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=4441; + +-- Quest "Purified!" +DELETE FROM `quest_details` WHERE `ID`=4442; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(4442,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=4442; + +-- Quest "Ancient Spirit" +UPDATE `quest_offer_reward` SET `Emote1`=2, `RewardText`="Yes, $N. Felwood has been through much hardship. Thank you for what you have done.$B$BOne day, we may be able to reclaim Felwood from the corruption; every kind deed helps." WHERE `ID`=4261; + +-- Quest "A Strange Red Key" +UPDATE `quest_request_items` SET `EmoteOnComplete`=6 WHERE `ID`=5202; +UPDATE `quest_offer_reward` SET `Emote1`=4 WHERE `ID`=5202; + +-- Quest "Rescue From Jaedenar" +DELETE FROM `quest_details` WHERE `ID`=5203; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5203,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=6, `Emote2`=1, `Emote3`=1 WHERE `ID`=5203; + +-- Quest "Retribution of the Light" +DELETE FROM `quest_details` WHERE `ID`=5204; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(5204,1,1,1,0,0,0,0,0,0); + +-- Quest "The Remains of Trey Lightforge" +UPDATE `quest_request_items` SET `EmoteOnComplete`=6 WHERE `ID`=5385; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=5385; + +-- Quest "An Imp's Request" +DELETE FROM `quest_details` WHERE `ID`=8419; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8419,1,0,0,0,0,0,0,0,0); + +-- Quest "What Niby Commands" +DELETE FROM `quest_details` WHERE `ID`=7601; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(7601,1,1,1,1,0,0,0,0,0); + +-- Quest "Kroshius' Infernal Core" +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6, `EmoteOnComplete`=6 WHERE `ID`=7603; +UPDATE `quest_offer_reward` SET `Emote1`=5 WHERE `ID`=7603; + +-- Quest "Sacred Cloth" +UPDATE `quest_request_items` SET `EmoteOnComplete`=0 WHERE `ID`=6032; + +-- Quest "The Root of All Evil" +DELETE FROM `quest_details` WHERE `ID`=8481; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8481,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=8481; + +-- Quest "The Brokering of Peace" +DELETE FROM `quest_details` WHERE `ID` IN (8484,8485); +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(8484,1,1,0,0,0,0,0,0,0), +(8485,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=2 WHERE `ID` IN (8484,8485); +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=1 WHERE `ID` IN (8484,8485); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql new file mode 100644 index 00000000000..65f4043ee59 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_06_world_from_335_was_2018_05_08_05_world_335.sql @@ -0,0 +1,11 @@ +/* +-- +-- Ulathek +DELETE FROM `smart_scripts` WHERE `entryorguid`=14523 AND `source_type`=0 AND `id`=6; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(14523,0,6,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ulathek - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=14523; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(14523,0,0,"You dog! Now I'll trap your soul into a shard and give you to my imp as a plaything!",12,0,100,0,0,0,9735,0,"Ulathek"); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql new file mode 100644 index 00000000000..b863e8d5e14 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_07_world_from_335_was_2018_05_08_06_world_335.sql @@ -0,0 +1,18 @@ +/* +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=946700 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(946700,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 0"), +(946700,9,1,0,0,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Remove NPC Flag Gossip"), +(946700,9,2,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 2"), +(946700,9,3,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 0"), +(946700,9,4,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Orientation"), +(946700,9,5,0,0,0,100,0,1000,1000,0,0,41,0,115,0,0,0,0,14,17428,164729,0,0,0,0,0,"Miblon Snarltooth - On Script - Despawn Gameobject 'Miblon's Door'"), +(946700,9,6,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Run On"), +(946700,9,7,0,0,0,100,0,1000,1000,0,0,69,0,0,0,0,0,0,20,164758,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Move to Closest Gameobject 'Miblon's Bait'"), +(946700,9,8,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 1"), +(946700,9,9,0,0,0,100,0,4000,4000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Say Line 3"), +(946700,9,10,0,0,0,100,0,108000,108000,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Evade"), +(946700,9,11,0,0,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Add NPC Flag Gossip"), +(946700,9,12,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Miblon Snarltooth - On Script - Set Event Phase 1"); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql new file mode 100644 index 00000000000..6d84c9ae787 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_08_world_from_335_was_2018_05_08_07_world_335.sql @@ -0,0 +1,81 @@ +/* +-- +-- World Invisible Trigger +SET @GUID := 64987; +DELETE FROM `creature` WHERE `guid`=@GUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(@GUID,12999,1,0,0,1,1,0,0,5416.44,-742.98,346.204,1.75579,300,0,0,7212,0,0,0,0,0,"",0); + +-- Niby the Almighty +DELETE FROM `smart_scripts` WHERE `entryorguid`=14469 AND `source_type`=0 AND `id` IN (1,2,3,4,5); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (1446900,1446901,1446902,1446903) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(14469,0,1,0,40,0,100,0,1,14469,0,0,0,80,1446901,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Waypoint 1 Reached - Run Script"), +(14469,0,2,0,40,0,100,0,2,14469,0,0,0,80,1446902,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Waypoint 2 Reached - Run Script"), +(14469,0,3,0,1,1,100,0,1000,15000,150000,180000,0,80,1446903,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - Out of Combat - Run Script"), +(14469,0,4,0,11,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Respawn - Set Event Phase 1"), +(14469,0,5,0,38,0,100,0,1,1,0,0,0,69,0,0,0,0,0,0,8,0,0,0,5413.9,-737.721,344.624,0,"Niby the Almighty - On Data Set - Move to Position"), +(1446900,9,0,0,0,0,100,0,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Event Phase 0"), +(1446900,9,1,0,0,0,100,0,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Remove Npc Flag Questgiver+Gossip"), +(1446900,9,2,0,0,0,100,0,0,0,0,0,0,53,0,14469,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Start Waypoint"), +(1446901,9,0,0,0,0,100,0,0,0,0,0,0,54,23000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Pause Waypoint"), +(1446901,9,1,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.2,"Niby the Almighty - On Script - Set Orientation"), +(1446901,9,2,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 0"), +(1446901,9,3,0,0,0,100,0,6000,6000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 1"), +(1446901,9,4,0,0,0,100,0,0,0,0,0,0,11,23056,0,0,0,0,0,19,12999,0,0,0,0,0,0,"Niby the Almighty - On Script - Cast 'Call Infernal Destroyer'"), +(1446901,9,5,0,0,0,100,0,6000,6000,0,0,0,1,0,0,0,0,0,0,19,14470,100,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 0"), +(1446901,9,6,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,19,14470,100,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 1"), +(1446901,9,7,0,0,0,100,0,4000,4000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 2"), +(1446902,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.653,"Niby the Almighty - On Script - Set Orientation"), +(1446902,9,1,0,0,0,100,0,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Add Npc Flag Questgiver+Gossip"), +(1446902,9,2,0,0,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Event Phase 1"), +(1446903,9,0,0,0,0,100,0,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 3"), +(1446903,9,1,0,0,0,100,0,5000,5000,0,0,0,11,23053,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Cast 'Infernal Conjure Dummy DND'"), +(1446903,9,2,0,0,0,100,0,3000,3000,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 4"), +(1446903,9,3,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 2 (Impsy)"), +(1446903,9,4,0,0,0,100,0,5000,5000,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 5"), +(1446903,9,5,0,0,0,100,0,0,0,0,0,0,45,1,1,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Set Data to Impsy"), +(1446903,9,6,0,0,0,100,0,0,0,0,0,0,29,1,180,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Start Follow"), +(1446903,9,7,0,0,0,100,0,3000,3000,0,0,0,1,3,0,0,0,0,0,19,14470,0,0,0,0,0,0,"Niby the Almighty - On Script - Say Line 3 (Impsy)"); + +-- Impsy +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=14470; +DELETE FROM `smart_scripts` WHERE `entryorguid`=14470 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(14470,0,0,0,38,0,100,0,1,1,0,0,0,89,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Data Set - Stop Random Movement"), +(14470,0,1,0,38,0,100,0,1,1,0,0,0,53,1,14470,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Data Set - Start Waypoint"), +(14470,0,2,0,40,0,100,0,11,14470,0,0,0,45,1,1,0,0,0,0,19,14469,0,0,0,0,0,0,"Impsy - On Waypoint 11 Reached - Set Data to Niby the Almighty"), +(14470,0,3,0,40,0,100,0,11,14470,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Waypoint 11 Reached - Start Random Movement"), +(14470,0,4,0,11,0,100,0,0,0,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Impsy - On Respawn - Start Random Movement"); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`=14469 AND `GroupID` IN (3,4,5); +DELETE FROM `creature_text` WHERE `CreatureID`=14470 AND `GroupID` IN (2,3); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(14469,3,0,"This is it, Impsy. I can feel it! This is the big one!",12,0,100,5,0,0,9615,0,"Niby the Almighty"), +(14469,3,1,"Brace yourself for the glorious impact, Impsy!",12,0,100,5,0,0,9616,0,"Niby the Almighty"), +(14469,3,2,"Kick me out, will they!? I'll show those uptight cone heads in Stormwind the true power of Niby! BEHOLD!",12,0,100,15,0,0,9617,0,"Niby the Almighty"), +(14469,4,0,"%s shakes his fist in frustration.",16,0,100,0,0,0,9618,0,"Niby the Almighty"), +(14469,5,0,"Why you little!",12,0,100,0,0,0,9622,0,"Niby the Almighty"), +(14470,2,0,"Niby, you are stupid.",12,0,100,0,0,0,9619,0,"Impsy"), +(14470,2,1,"Oh my, what a surprise! Another failure!? But how, oh great one??",12,0,100,0,0,0,9620,0,"Impsy"), +(14470,2,2,"Awe inspiring, master. Your ineptitude is awe inspiring.",12,0,100,0,0,0,9621,0,"Impsy"), +(14470,3,0,"Ack! Help! Crazed gnome trying to kill me!",12,0,100,0,0,0,9623,0,"Impsy"); + +-- Waypoints +DELETE FROM `waypoints` WHERE `entry` IN (14469,14470); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`) VALUES +(14469,1,5407.19,-753,350.82), +(14469,2,5413.9,-737.721,344.624), +(14470,1,5399.15,-735.454,343.567), +(14470,2,5386.63,-729.446,343.992), +(14470,3,5384.08,-722.534,345.173), +(14470,4,5396.26,-713.693,346.403), +(14470,5,5415.7,-722.556,344.598), +(14470,6,5434.85,-723.435,342.78), +(14470,7,5444.68,-732.313,342.527), +(14470,8,5440.93,-743.161,343.643), +(14470,9,5427.72,-750.631,347.609), +(14470,10,5416.55,-749.533,348.499), +(14470,11,5407.59,-736.618,344.249); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_09_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_09_world.sql new file mode 100644 index 00000000000..3619469a6ce --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_09_world.sql @@ -0,0 +1,107 @@ +-- +SET @GUID := 68274; + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7910.65,`position_y`=-1418.727,`position_z`=1534.705 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7910.65,-1418.727,1534.705,0,0,0,0,100,0), +(@PATH,2,7913.654,-1426.635,1534.705,0,0,0,0,100,0), +(@PATH,3,7920.053,-1414.188,1534.705,0,0,0,0,100,0), +(@PATH,4,7922.347,-1395.791,1534.705,0,0,0,0,100,0), +(@PATH,5,7920.222,-1386.216,1534.705,0,0,0,0,100,0), +(@PATH,6,7923.166,-1385.087,1534.705,0,0,0,0,100,0), +(@PATH,7,7916.864,-1385.485,1534.705,0,0,0,0,100,0), +(@PATH,8,7916.226,-1392.192,1534.705,0,0,0,0,100,0), +(@PATH,9,7911.995,-1404.557,1534.705,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+1; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7868.562,`position_y`=-1363.65,`position_z`=1534.059 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7868.562,-1363.65,1534.059,0,0,0,0,100,0), +(@PATH,2,7879.646,-1351.339,1534.705,0,0,0,0,100,0), +(@PATH,3,7868.222,-1355.34,1534.705,0,0,0,0,100,0), +(@PATH,4,7851.979,-1359.603,1534.705,0,0,0,0,100,0), +(@PATH,5,7840.327,-1375.057,1534.059,0,0,0,0,100,0), +(@PATH,6,7843.573,-1379.135,1534.059,0,0,0,0,100,0), +(@PATH,7,7830.217,-1389.011,1534.366,0,0,0,0,100,0), +(@PATH,8,7825.899,-1405.483,1534.705,0,0,0,0,100,0), +(@PATH,9,7846.697,-1416.326,1534.059,0,0,0,0,100,0), +(@PATH,10,7849.118,-1427.04,1534.059,0,0,0,0,100,0), +(@PATH,11,7848.421,-1411.426,1534.059,0,0,0,0,100,0), +(@PATH,12,7845.131,-1389.869,1534.059,0,0,0,0,100,0), +(@PATH,13,7859.611,-1375.139,1534.059,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+2; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7900.394,`position_y`=-1481.597,`position_z`=1532.27 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7900.394,-1481.597,1532.27,0,0,0,0,100,0), +(@PATH,2,7921.518,-1469.935,1532.267,0,0,0,0,100,0), +(@PATH,3,7939.954,-1444.368,1532.134,0,0,0,0,100,0), +(@PATH,4,7915.613,-1432.221,1535.256,0,0,0,0,100,0), +(@PATH,5,7939.954,-1444.368,1532.134,0,0,0,0,100,0), +(@PATH,6,7921.518,-1469.935,1532.267,0,0,0,0,100,0), +(@PATH,7,7900.394,-1481.597,1532.27,0,0,0,0,100,0), +(@PATH,8,7875.807,-1482.918,1532.255,0,0,0,0,100,0), +(@PATH,9,7872.38,-1464.144,1534.557,0,0,0,0,100,0), +(@PATH,10,7875.807,-1482.918,1532.255,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+3; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7857.495,`position_y`=-1330.407,`position_z`=1534.557 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7857.495,-1330.407,1534.557,0,0,0,0,100,0), +(@PATH,2,7853.63,-1310.692,1532.1,0,0,0,0,100,0), +(@PATH,3,7832.517,-1312.412,1532.386,0,0,0,0,100,0), +(@PATH,4,7814.14,-1322.234,1532.386,0,0,0,0,100,0), +(@PATH,5,7795.604,-1339.547,1532.251,0,0,0,0,100,0), +(@PATH,6,7817.405,-1356.497,1535.256,0,0,0,0,100,0), +(@PATH,7,7804.852,-1402.777,1535.256,0,0,0,0,100,0), +(@PATH,8,7782.151,-1408.093,1532.063,0,0,0,0,100,0), +(@PATH,9,7804.852,-1402.777,1535.256,0,0,0,0,100,0), +(@PATH,10,7817.405,-1356.497,1535.256,0,0,0,0,100,0), +(@PATH,11,7795.604,-1339.547,1532.251,0,0,0,0,100,0), +(@PATH,12,7814.14,-1322.234,1532.386,0,0,0,0,100,0), +(@PATH,13,7832.517,-1312.412,1532.386,0,0,0,0,100,0), +(@PATH,14,7853.63,-1310.692,1532.1,0,0,0,0,100,0); + +-- Pathing for Mechagnome Laborer Entry: 29389 +SET @NPC := @GUID+4; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7309.224,`position_y`=-666.5821,`position_z`=784.8982 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7309.224,-666.5821,784.8982,0,0,0,0,100,0), +(@PATH,2,7309.142,-656.5869,784.8982,0,0,0,0,100,0), +(@PATH,3,7309.335,-647.4516,784.8982,0,0,0,0,100,0), +(@PATH,4,7309.67,-640.1229,784.8982,0,0,0,0,100,0), +(@PATH,5,7309.579,-631.7067,785.1652,0,0,0,0,100,0), +(@PATH,6,7309.624,-623.5741,785.4073,0,0,0,0,100,0), +(@PATH,7,7309.579,-631.7067,785.1652,0,0,0,0,100,0), +(@PATH,8,7309.67,-640.1229,784.8982,0,0,0,0,100,0), +(@PATH,9,7309.335,-647.4516,784.8982,0,0,0,0,100,0), +(@PATH,10,7309.142,-656.5869,784.8982,0,0,0,0,100,0), +(@PATH,11,7309.224,-666.5821,784.8982,0,0,0,0,100,0), +(@PATH,12,7309.377,-678.6055,785.1129,0,0,0,0,100,0), +(@PATH,13,7309.483,-688.7038,785.1492,0,0,0,0,100,0), +(@PATH,14,7309.378,-678.7083,785.1492,0,0,0,0,100,0); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_10_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_10_world.sql new file mode 100644 index 00000000000..1209558e6fc --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_10_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `unit_flags`=32768 WHERE `entry`=29469; diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_11_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_11_world.sql new file mode 100644 index 00000000000..f3281027b6b --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_12_11_world.sql @@ -0,0 +1,11 @@ +-- +DELETE FROM `creature_formations` WHERE `leaderGUID` IN (120830,120831,120833,120832,120836,123124,120835,120834); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(120830, 120830, 0, 0, 515, 0, 0), +(120830, 120831, 10, 215, 515, 0, 0), +(120832, 120832, 0, 0, 515, 0, 0), +(120832, 120833, 10, 215, 515, 0, 0), +(120834, 120834, 0, 0, 515, 0, 0), +(120834, 120835, 10, 215, 515, 0, 0), +(120836, 120836, 0, 0, 515, 0, 0), +(120836, 123124, 10, 215, 515, 0, 0); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_00_world.sql new file mode 100644 index 00000000000..5ed66c36e4b --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_00_world.sql @@ -0,0 +1,7 @@ +-- +-- Delete duplicate Armory and Cathedral doors +DELETE FROM `gameobject` WHERE `guid` IN (200966,203104,212814,216444,220549,200965,203103,212815,216443,220550); + +-- UPDATE SAI target +UPDATE `smart_scripts` SET `target_param1`=200252 WHERE `entryorguid` IN (101852) AND `source_type`=1 AND `id`=0; +UPDATE `smart_scripts` SET `target_param1`=200251 WHERE `entryorguid` IN (101853) AND `source_type`=1 AND `id`=0; diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_01_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_01_world.sql new file mode 100644 index 00000000000..3a53b50b5be --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_13_01_world.sql @@ -0,0 +1,38 @@ +DELETE FROM `creature` WHERE `guid` IN (350034, 349936, 350035, 359090,203124,371716, 360264,363632,363631,362091,144796,144794,144792,144789,144785,75558 ,85190 ,85189 ,85187 ,85191 ,85188 ,88485 ,143705,143697,143713,143700,143708,143715,362067,362078,362077,362076,362079,362080,348390,348391,348437,348436,348387,348551,348388,348552,348386,348550,348389,348435,142710,143273,143263,143264,143271,143269,143268,143272,143231,143230,143232,409 ,408 ,411 ,410 ,412 ,413 ,414 ,415 ,100215,100213,131035,103543,307708,48255 ,144094,144009,143921,107837,123113,123149,123157,123151,123148,123111,106487,106483,106482,106486,142693,142695,142697,142694,142696,343027,347682,348200,348451,348780,343829,344111,344419,344965,345371,345735,346323,346391,346428,346496,346707,347026,344112,344416,344967,345370,345772,346321,346393,346434,346498,346709,347027,347684,348198,348452,348782,342533,343028,343030,347683,348199,348453,348781,343543,343810,344110,344418,344966,345372,346322,346392,346448,346497,346719,347028,342529,343029,343830,344109,344417,346324,346394,346534,346722,347029,347685,348197,348454,348767,369538,138471,138470,138469,138468,296 ,293 ,292 ,295 ,294 ,138492,138494,138493,376356,376375,376373,376374,376602,376452,376449,376451,376453,376454,376444,252238,252364,252354,252359,252352,252346,252347,252274,252615,252539,252524,252513,252530,252483,252652,252593,252577,252651,252561,252537,252585,252552,252650,252605,252550,252602,252553,252540,252614,252578,252536,252531,252517,252599,252580,252508,252604,252589,252575,252556,252654,252648,252621,252612,252586,252582,252562,252549,252541,252659,252643,252618,252660,252601,252570,252547,252610,252573,252424,252595,252546,252657,252571,252565,252521,252594,252532,252516,252505,252420,252653,252598,252658,252607,252534,252468,252646,252587,252408,252623,252603,252574,252620,252613,252545,252526,252518,252510,252400,252639,252569,252564,252649,252392,48308,48309); -- 434 +DELETE FROM `creature_addon` WHERE `guid` IN (350034, 349936, 350035, 359090,203124,371716, 360264,363632,363631,362091,144796,144794,144792,144789,144785,75558 ,85190 ,85189 ,85187 ,85191 ,85188 ,88485 ,143705,143697,143713,143700,143708,143715,362067,362078,362077,362076,362079,362080,348390,348391,348437,348436,348387,348551,348388,348552,348386,348550,348389,348435,142710,143273,143263,143264,143271,143269,143268,143272,143231,143230,143232,409 ,408 ,411 ,410 ,412 ,413 ,414 ,415 ,100215,100213,131035,103543,307708,48255 ,144094,144009,143921,107837,123113,123149,123157,123151,123148,123111,106487,106483,106482,106486,142693,142695,142697,142694,142696,343027,347682,348200,348451,348780,343829,344111,344419,344965,345371,345735,346323,346391,346428,346496,346707,347026,344112,344416,344967,345370,345772,346321,346393,346434,346498,346709,347027,347684,348198,348452,348782,342533,343028,343030,347683,348199,348453,348781,343543,343810,344110,344418,344966,345372,346322,346392,346448,346497,346719,347028,342529,343029,343830,344109,344417,346324,346394,346534,346722,347029,347685,348197,348454,348767,369538,138471,138470,138469,138468,296 ,293 ,292 ,295 ,294 ,138492,138494,138493,376356,376375,376373,376374,376602,376452,376449,376451,376453,376454,376444,252238,252364,252354,252359,252352,252346,252347,252274,252615,252539,252524,252513,252530,252483,252652,252593,252577,252651,252561,252537,252585,252552,252650,252605,252550,252602,252553,252540,252614,252578,252536,252531,252517,252599,252580,252508,252604,252589,252575,252556,252654,252648,252621,252612,252586,252582,252562,252549,252541,252659,252643,252618,252660,252601,252570,252547,252610,252573,252424,252595,252546,252657,252571,252565,252521,252594,252532,252516,252505,252420,252653,252598,252658,252607,252534,252468,252646,252587,252408,252623,252603,252574,252620,252613,252545,252526,252518,252510,252400,252639,252569,252564,252649,252392,48308,48309); -- 434 + +DELETE FROM `creature` WHERE `id`=31401 AND `guid` IN (111931, 111932, 111933, 111934, 111935); +DELETE FROM `creature_addon` WHERE `guid` IN (124089); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`) VALUES +(124089, 1240890, 0, 50331648, 0, 0); + +DELETE FROM `waypoint_data` WHERE `id`=1325600; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(1325600, 25, -4210.05, 3036.03, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 24, -4197.81, 3024.34, 366.188, 0, 0, 1, 0, 100, 0), +(1325600, 23, -4166.6, 3015.78, 353.327, 0, 0, 1, 0, 100, 0), +(1325600, 22, -4119.36, 3000.52, 350.383, 0, 0, 1, 0, 100, 0), +(1325600, 21, -4078.06, 3004.44, 346.771, 0, 0, 1, 0, 100, 0), +(1325600, 20, -4047.5, 3033.21, 346.827, 0, 0, 1, 0, 100, 0), +(1325600, 19, -4037.82, 3075.94, 350.938, 0, 0, 1, 0, 100, 0), +(1325600, 18, -4037.22, 3122.49, 345.133, 0, 0, 1, 0, 100, 0), +(1325600, 17, -4020.08, 3150.26, 329.883, 0, 0, 1, 0, 100, 0), +(1325600, 16, -3983.11, 3172.78, 330.133, 0, 0, 1, 0, 100, 0), +(1325600, 15, -3945.8, 3163.18, 338.493, 0, 0, 1, 0, 100, 0), +(1325600, 14, -3906.74, 3138.08, 347.049, 0, 0, 1, 0, 100, 0), +(1325600, 13, -3872.96, 3116.54, 357.438, 0, 0, 1, 0, 100, 0), +(1325600, 12, -3857.7, 3086.13, 367.605, 0, 0, 1, 0, 100, 0), +(1325600, 11, -3866.05, 3043.05, 372.104, 0, 0, 1, 0, 100, 0), +(1325600, 10, -3902.36, 3025, 374.716, 0, 0, 1, 0, 100, 0), +(1325600, 9, -3939.95, 3047.44, 368.138, 0, 0, 1, 0, 100, 0), +(1325600, 8, -3976.81, 3075.32, 357.966, 0, 0, 1, 0, 100, 0), +(1325600, 7, -4015.78, 3101.06, 352.327, 0, 0, 1, 0, 100, 0), +(1325600, 6, -4057.3, 3120.64, 344.022, 0, 0, 1, 0, 100, 0), +(1325600, 5, -4093.99, 3151.9, 340.022, 0, 0, 1, 0, 100, 0), +(1325600, 4, -4133.58, 3148.63, 338.077, 0, 0, 1, 0, 100, 0), +(1325600, 3, -4161.6, 3113.01, 348.633, 0, 0, 1, 0, 100, 0), +(1325600, 2, -4193.34, 3081.12, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 1, -4214.1, 3060.08, 359.272, 0, 0, 1, 0, 100, 0); + +DELETE FROM `gameobject_addon` WHERE `guid` IN (200965, 200966, 203103, 203104, 212814, 212815, 216443, 216444, 220549, 220550); +DELETE FROM `game_event_creature` WHERE `guid` IN (292,293,294,295,296,362067,362076,362077,362078,362079,362080,362091); diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql new file mode 100644 index 00000000000..d44756fc6dc --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_00_world_from_335_was_2018_05_13_00_world_335.sql @@ -0,0 +1,37 @@ +/* +-- +DELETE FROM `creature` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); +DELETE FROM `creature_addon` WHERE `guid` IN (48255, 75558,88485, 103543,106482, 106483,106486, 106487,107837, 142693,142694, 142695,142696, 142697,142710, 143230,143231, 143232,143263, 143264,143268, 143269,143271, 143272,143273, 143697,143700, 143705,143708, 143713,143715, 143921,144009, 144094,144785, 144789,144792, 144794,144796, 203124); +DELETE FROM `creature` WHERE `id`=31401 AND `guid` IN (111931, 111932, 111933, 111934, 111935); + +DELETE FROM `waypoint_data` WHERE `id`=1325600; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(1325600, 25, -4210.05, 3036.03, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 24, -4197.81, 3024.34, 366.188, 0, 0, 1, 0, 100, 0), +(1325600, 23, -4166.6, 3015.78, 353.327, 0, 0, 1, 0, 100, 0), +(1325600, 22, -4119.36, 3000.52, 350.383, 0, 0, 1, 0, 100, 0), +(1325600, 21, -4078.06, 3004.44, 346.771, 0, 0, 1, 0, 100, 0), +(1325600, 20, -4047.5, 3033.21, 346.827, 0, 0, 1, 0, 100, 0), +(1325600, 19, -4037.82, 3075.94, 350.938, 0, 0, 1, 0, 100, 0), +(1325600, 18, -4037.22, 3122.49, 345.133, 0, 0, 1, 0, 100, 0), +(1325600, 17, -4020.08, 3150.26, 329.883, 0, 0, 1, 0, 100, 0), +(1325600, 16, -3983.11, 3172.78, 330.133, 0, 0, 1, 0, 100, 0), +(1325600, 15, -3945.8, 3163.18, 338.493, 0, 0, 1, 0, 100, 0), +(1325600, 14, -3906.74, 3138.08, 347.049, 0, 0, 1, 0, 100, 0), +(1325600, 13, -3872.96, 3116.54, 357.438, 0, 0, 1, 0, 100, 0), +(1325600, 12, -3857.7, 3086.13, 367.605, 0, 0, 1, 0, 100, 0), +(1325600, 11, -3866.05, 3043.05, 372.104, 0, 0, 1, 0, 100, 0), +(1325600, 10, -3902.36, 3025, 374.716, 0, 0, 1, 0, 100, 0), +(1325600, 9, -3939.95, 3047.44, 368.138, 0, 0, 1, 0, 100, 0), +(1325600, 8, -3976.81, 3075.32, 357.966, 0, 0, 1, 0, 100, 0), +(1325600, 7, -4015.78, 3101.06, 352.327, 0, 0, 1, 0, 100, 0), +(1325600, 6, -4057.3, 3120.64, 344.022, 0, 0, 1, 0, 100, 0), +(1325600, 5, -4093.99, 3151.9, 340.022, 0, 0, 1, 0, 100, 0), +(1325600, 4, -4133.58, 3148.63, 338.077, 0, 0, 1, 0, 100, 0), +(1325600, 3, -4161.6, 3113.01, 348.633, 0, 0, 1, 0, 100, 0), +(1325600, 2, -4193.34, 3081.12, 359.272, 0, 0, 1, 0, 100, 0), +(1325600, 1, -4214.1, 3060.08, 359.272, 0, 0, 1, 0, 100, 0); + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-143921) AND `source_type`=0; +DELETE FROM `spawn_group` WHERE `spawnType`=0 AND `SpawnId` IN (48255,106482,106483,106486,106487,107837,111931,111932,111933,111934,111935,142710); +*/ diff --git a/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql new file mode 100644 index 00000000000..9a75cb233b3 --- /dev/null +++ b/sql/old/4.3.4/world/29_2018_05_15/2018_05_14_01_world_from_335_was_2018_05_14_00_world.sql @@ -0,0 +1,13 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (48255,64988,64989,64990,64991,64992,64993,75558,84444,84484); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(48255, 20038, 550, 0, 0, 1, 1, 0, 0, 310.438, 41.6756, -2.38937, 3.79216, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64988, 20038, 550, 0, 0, 1, 1, 0, 0, 313.605, 38.1466, -2.38937, 3.53769, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64989, 20037, 550, 0, 0, 1, 1, 0, 1, 319.51, 43.7734, -2.38937, 3.57472, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(64990, 20037, 550, 0, 0, 1, 1, 0, 1, 339.52, -50.6231, -2.38754, 0.416626, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(64991, 20038, 550, 0, 0, 1, 1, 0, 0, 348.485, -42.0046, -2.38833, 0.531368, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64992, 20038, 550, 0, 0, 1, 1, 0, 0, 352.302, -40.07, -2.38816, 0.492098, 300, 0, 0, 48902, 0, 0, 0, 0, 0, "", 0), +(64993, 20037, 550, 0, 0, 1, 1, 0, 1, 358.22, -39.9547, -2.38682, 0.465866, 300, 0, 0, 100520, 16155, 0, 0, 0, 0, "", 0), +(75558, 20052, 550, 0, 0, 1, 1, 0, 0, 433.013, 324.812, 15.4822, 1.68793, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0), +(84444, 20052, 550, 0, 0, 1, 1, 0, 0, 479.372, 376.597, 15.5883, 3.10479, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0), +(84484, 20042, 550, 0, 0, 1, 1, 0, 0, 401.508, 356.858, 14.8947, 3.68035, 300, 0, 0, 125668, 0, 0, 0, 0, 0, "", 0); diff --git a/sql/updates/auth/4.3.4/2018_05_15_00_auth.sql b/sql/updates/auth/4.3.4/2018_05_15_00_auth.sql new file mode 100644 index 00000000000..2f1965a664a --- /dev/null +++ b/sql/updates/auth/4.3.4/2018_05_15_00_auth.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-30 auth database +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/characters/4.3.4/2018_05_15_00_characters.sql b/sql/updates/characters/4.3.4/2018_05_15_00_characters.sql new file mode 100644 index 00000000000..f6c105d043c --- /dev/null +++ b/sql/updates/characters/4.3.4/2018_05_15_00_characters.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-30 characters database +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/4.3.4/2018_05_15_00_world.sql b/sql/updates/world/4.3.4/2018_05_15_00_world.sql new file mode 100644 index 00000000000..45908f53347 --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_15_00_world.sql @@ -0,0 +1,3 @@ +UPDATE `version` SET `db_version`='TDB 434.30', `cache_id`=30 LIMIT 1; + +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/4.3.4/2018_05_15_01_world.sql b/sql/updates/world/4.3.4/2018_05_15_01_world.sql new file mode 100644 index 00000000000..b814627f7ef --- /dev/null +++ b/sql/updates/world/4.3.4/2018_05_15_01_world.sql @@ -0,0 +1,95 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (280662,280655,280654,280659,280657,280658,280656,280661,280660); +DELETE FROM `creature_addon` WHERE `guid` IN (280662,280655,280654,280659,280657,280658,280656,280661,280660); +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-9119.9,`position_y`=390.402,`position_z`=91.8667 WHERE `guid`=280791; +UPDATE `creature` SET `spawndist`=0,`MovementType`=0,`position_x`=-9119.9,`position_y`=390.402,`position_z`=91.8667 WHERE `guid` IN (280796,280794,280795,280793,280792,280798,280799,280797); +DELETE FROM `creature_addon` WHERE `guid` IN (280791,280796,280794,280795,280793,280792,280798,280799,280797); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(280796,0,29284,0,1,0, '78855'), +(280794,0,29284,0,1,0, '78855'), +(280795,0,29284,0,1,0, '78855'), +(280793,0,29284,0,1,0, '78855'), +(280792,0,29284,0,1,0, '78855'), +(280798,0,29284,0,1,0, '78855'), +(280799,0,29284,0,1,0, '78855'), +(280797,0,29284,0,1,0, '78855'), +(280791,2807910,29284,0,1,0, '78855'); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=280791; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`,`point_1`,`point_2`) VALUES +(280791, 280791, 0, 0, 515, 0, 0), +(280791, 280796, 3, 90, 515, 0, 0), +(280791, 280794, 3, 270, 515, 0, 0), +(280791, 280795, 5, 45, 515, 0, 0), +(280791, 280793, 5, 315, 515, 0, 0), +(280791, 280792, 4, 360, 515, 0, 0), +(280791, 280798, 8, 360, 515, 0, 0), +(280791, 280799, 9, 22, 515, 0, 0), +(280791, 280797, 9, 344, 515, 0, 0); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=42218 AND `source_type`=0 AND `id`>0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(42218,0,1,0,4,0,100,0,0,0,0,0,28,78855,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stormwind Royal Guard - On aggro - Remove aura"), +(42218,0,2,0,34,0,100,0,2,58,0,0,41,0,0,0,0,0,0,11,42218,30,0,0,0,0,0,"Stormwind Royal Guard - On movement informer - despawn all guars"); + +DELETE FROM `waypoint_data` WHERE `id`=2807910; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(2807910, 1, -9119.9, 390.402, 91.8667, 0, 0, 0, 0, 100, 0), +(2807910, 2, -9120.68, 389.773, 91.8667, 0, 0, 0, 0, 100, 0), +(2807910, 3, -9136.41, 381.545, 90.6434, 0, 0, 0, 0, 100, 0), +(2807910, 4, -9157.69, 359.5, 89.305, 0, 0, 0, 0, 100, 0), +(2807910, 5, -9174.68, 339.597, 83.9513, 0, 0, 0, 0, 100, 0), +(2807910, 6, -9180.38, 319.033, 79.9367, 0, 0, 0, 0, 100, 0), +(2807910, 7, -9179.4, 282.561, 76.0222, 0, 0, 0, 0, 100, 0), +(2807910, 8, -9186.77, 238.557, 72.4619, 0, 0, 0, 0, 100, 0), +(2807910, 9, -9214.09, 208.528, 69.7846, 0, 0, 0, 0, 100, 0), +(2807910, 10, -9241.48, 173.536, 67.8369, 0, 0, 0, 0, 100, 0), +(2807910, 11, -9263.96, 154.547, 67.2846, 0, 0, 0, 0, 100, 0), +(2807910, 12, -9292.29, 148.413, 66.4168, 0, 0, 0, 0, 100, 0), +(2807910, 13, -9327.91, 130.203, 64.0227, 0, 0, 0, 0, 100, 0), +(2807910, 14, -9348.82, 117.773, 62.7116, 0, 0, 0, 0, 100, 0), +(2807910, 15, -9385.51, 104.726, 59.7012, 0, 0, 0, 0, 100, 0), +(2807910, 16, -9409.12, 92.467, 57.7331, 0, 0, 0, 0, 100, 0), +(2807910, 17, -9435.12, 72.3941, 56.0949, 0, 0, 0, 0, 100, 0), +(2807910, 18, -9454.01, 64.7517, 56.0216, 0, 0, 0, 0, 100, 0), +(2807910, 19, -9483.89, 65.4722, 56.1705, 0, 0, 0, 0, 100, 0), +(2807910, 20, -9491.36, 60.8906, 55.8921, 0, 0, 0, 0, 100, 0), +(2807910, 21, -9504.84, 33.474, 56.3795, 0, 0, 0, 0, 100, 0), +(2807910, 22, -9525.04, -5.62326, 55.8272, 0, 0, 0, 0, 100, 0), +(2807910, 23, -9539.8, -35.5156, 56.431, 0, 0, 0, 0, 100, 0), +(2807910, 24, -9546.57, -61.9184, 57.0113, 0, 0, 0, 0, 100, 0), +(2807910, 25, -9549.15, -101.922, 57.2853, 0, 0, 0, 0, 100, 0), +(2807910, 26, -9551.71, -131.13, 57.3982, 0, 0, 0, 0, 100, 0), +(2807910, 27, -9572.64, -156.448, 57.3927, 0, 0, 0, 0, 100, 0), +(2807910, 28, -9583.48, -186.366, 57.5604, 0, 0, 0, 0, 100, 0), +(2807910, 29, -9598.09, -223.769, 57.2399, 0, 0, 0, 0, 100, 0), +(2807910, 30, -9609.41, -258.146, 57.1602, 0, 0, 0, 0, 100, 0), +(2807910, 31, -9618.23, -294.892, 56.9496, 0, 0, 0, 0, 100, 0), +(2807910, 32, -9620.23, -324.826, 57.5732, 0, 0, 0, 0, 100, 0), +(2807910, 33, -9620.42, -359.37, 57.2582, 0, 0, 0, 0, 100, 0), +(2807910, 34, -9619.54, -392.205, 57.804, 0, 0, 0, 0, 100, 0), +(2807910, 35, -9611.05, -426.469, 57.3709, 0, 0, 0, 0, 100, 0), +(2807910, 36, -9598.08, -453.528, 57.6788, 0, 0, 0, 0, 100, 0), +(2807910, 37, -9588.98, -476.995, 57.7533, 0, 0, 0, 0, 100, 0), +(2807910, 38, -9593.1, -503.181, 57.3872, 0, 0, 0, 0, 100, 0), +(2807910, 39, -9599.22, -512.536, 57.3586, 0, 0, 0, 0, 100, 0), +(2807910, 40, -9610.61, -530.849, 54.8333, 0, 0, 0, 0, 100, 0), +(2807910, 41, -9616.64, -555.116, 54.4425, 0, 0, 0, 0, 100, 0), +(2807910, 42, -9621.07, -599.967, 52.7582, 0, 0, 0, 0, 100, 0), +(2807910, 43, -9623.73, -630.854, 51.541, 0, 0, 0, 0, 100, 0), +(2807910, 44, -9641.07, -661.401, 49.3346, 0, 0, 0, 0, 100, 0), +(2807910, 45, -9648.89, -693.67, 46.7381, 0, 0, 0, 0, 100, 0), +(2807910, 46, -9655.99, -725.42, 44.418, 0, 0, 0, 0, 100, 0), +(2807910, 47, -9653.45, -752.071, 44.5802, 0, 0, 0, 0, 100, 0), +(2807910, 48, -9651.89, -780.089, 44.3004, 0, 0, 0, 0, 100, 0), +(2807910, 49, -9647.31, -797.179, 43.5314, 0, 0, 0, 0, 100, 0), +(2807910, 50, -9631.43, -817.967, 43.8334, 0, 0, 0, 0, 100, 0), +(2807910, 51, -9606.31, -843.512, 43.7135, 0, 0, 0, 0, 100, 0), +(2807910, 52, -9586.62, -866.698, 43.743, 0, 0, 0, 0, 100, 0), +(2807910, 53, -9581.56, -898.13, 43.6025, 0, 0, 0, 0, 100, 0), +(2807910, 54, -9587.17, -930.189, 43.328, 0, 0, 0, 0, 100, 0), +(2807910, 55, -9611.5, -962.557, 43.7248, 0, 0, 0, 0, 100, 0), +(2807910, 56, -9618.83, -979.495, 43.7668, 0, 0, 0, 0, 100, 0), +(2807910, 57, -9621.49, -1000.79, 42.2443, 0, 0, 0, 0, 100, 0), +(2807910, 58, -9619.17, -1033.02, 39.6984, 0, 0, 0, 0, 100, 0), +(2807910, 59, -9619.17, -1033.02, 39.6984, 0, 0, 0, 0, 100, 0); diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h index 5106421ee5e..953913442c8 100644 --- a/src/common/Asio/Resolver.h +++ b/src/common/Asio/Resolver.h @@ -32,7 +32,7 @@ namespace Trinity boost::system::error_code ec; #if BOOST_VERSION >= 106600 boost::asio::ip::tcp::resolver::results_type results = resolver.resolve(protocol, host, service, ec); - if (results.empty() || ec) + if (results.begin() == results.end() || ec) return {}; return results.begin()->endpoint(); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index c3c8ed614d1..dbb4311d737 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -438,7 +438,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '', cinematic = 1 WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH); diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 6c56566ed44..9cbf062a63b 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -374,11 +374,6 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags } return false; case DISABLE_TYPE_QUEST: - if (!unit) - return true; - if (Player const* player = unit->ToPlayer()) - if (player->IsGameMaster()) - return false; return true; case DISABLE_TYPE_BATTLEGROUND: case DISABLE_TYPE_OUTDOORPVP: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cb28cfe8d45..13e88f6a495 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15351,7 +15351,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data) if (quest->GetRewSpellCast() > 0) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()); + SpellInfo const* spellInfo = ASSERT_NOTNULL(sSpellMgr->GetSpellInfo(quest->GetRewSpellCast())); if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_ON_COMPLETE)) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 505104d545e..af434deceb5 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1719,7 +1719,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sDest, uItem, false); if (msg == EQUIP_ERR_OK) { - if (_player->CanEquipItem(NULL_SLOT, dstpos, uItem, false) != EQUIP_ERR_OK) + if (_player->CanUnequipItem(dstpos, true) != EQUIP_ERR_OK) continue; _player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true); @@ -1734,7 +1734,7 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) if (item->GetPos() == dstpos) continue; - if (_player->CanUnequipItem(dstpos, true) != EQUIP_ERR_OK) + if (_player->CanEquipItem(i, dstpos, item, true) != EQUIP_ERR_OK) continue; _player->SwapItem(item->GetPos(), dstpos); diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index d4bd1d2129d..5f896b1a5c1 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "Chat.h" #include "DatabaseEnv.h" #include "DBCStores.h" +#include "DisableMgr.h" #include "ObjectMgr.h" #include "Player.h" #include "ReputationMgr.h" @@ -73,7 +74,7 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); - if (!quest) + if (!quest || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -185,7 +186,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE) + if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -289,7 +291,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE) + if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index c372c16446f..460b458bf44 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -997,7 +997,8 @@ class npc_saurfang_event : public CreatureScript void SetData(uint32 type, uint32 data) override { - ASSERT(!type && data && data < 6); + if (!(!type && data && data < 6)) + return; _index = data; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 5d1e43a7289..a975c8f912c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -281,7 +281,10 @@ class instance_ulduar : public InstanceMapScript case NPC_SALVAGED_DEMOLISHER: case NPC_SALVAGED_SIEGE_ENGINE: case NPC_SALVAGED_CHOPPER: - LeviathanVehicleGUIDs.push_back(creature->GetGUID()); + if (GetBossState(BOSS_LEVIATHAN) == DONE) + DespawnLeviatanVehicle(creature); + else + LeviathanVehicleGUIDs.push_back(creature->GetGUID()); break; // XT-002 Deconstructor @@ -1043,17 +1046,8 @@ class instance_ulduar : public InstanceMapScript // Eject all players from vehicles and make them untargetable. // They will be despawned after a while for (auto const& vehicleGuid : LeviathanVehicleGUIDs) - { if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid)) - { - if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) - { - vehicle->RemoveAllPassengers(); - vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); - } - } - } + DespawnLeviatanVehicle(vehicleCreature); break; case EVENT_LEVIATHAN_BREAK_DOOR: if (Creature* leviathan = GetCreature(BOSS_LEVIATHAN)) @@ -1065,6 +1059,16 @@ class instance_ulduar : public InstanceMapScript } } + void DespawnLeviatanVehicle(Creature* vehicleCreature) + { + if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) + { + vehicle->RemoveAllPassengers(); + vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); + } + } + void UpdateDoorState(GameObject* door) override { // Leviathan doors are set to DOOR_TYPE_ROOM except the one it uses to enter the room diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 99d074bd6f9..b4eee978873 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -91,7 +91,7 @@ class FreezeDetector { public: FreezeDetector(Trinity::Asio::IoContext& ioContext, uint32 maxCoreStuckTime) - : _timer(ioContext), _worldLoopCounter(0), _lastChangeMsTime(0), _maxCoreStuckTimeInMs(maxCoreStuckTime) { } + : _timer(ioContext), _worldLoopCounter(0), _lastChangeMsTime(getMSTime()), _maxCoreStuckTimeInMs(maxCoreStuckTime) { } static void Start(std::shared_ptr const& freezeDetector) {