From d7e1b6867fd276d71a33cc9c143135b796d4baa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 28 Mar 2024 09:45:48 +0100 Subject: [PATCH 1/5] Update LibDeflate --- .../Core/LibDeflate/LibDeflate.lua | 5261 +++++++++-------- 1 file changed, 2665 insertions(+), 2596 deletions(-) diff --git a/ElvUI_Libraries/Core/LibDeflate/LibDeflate.lua b/ElvUI_Libraries/Core/LibDeflate/LibDeflate.lua index cc00b096d4..02b36ab29a 100644 --- a/ElvUI_Libraries/Core/LibDeflate/LibDeflate.lua +++ b/ElvUI_Libraries/Core/LibDeflate/LibDeflate.lua @@ -5,7 +5,7 @@ DEFLATE/zlib format. @file LibDeflate.lua @author Haoqian He (Github: SafeteeWoW; World of Warcraft: Safetyy-Illidan(US)) -@copyright LibDeflate <2018-2020> Haoqian He +@copyright LibDeflate <2018-2021> Haoqian He @license zlib License This library is implemented according to the following specifications.
@@ -18,19 +18,15 @@ https://tools.ietf.org/html/rfc1950
This library requires Lua 5.1/5.2/5.3/5.4 interpreter or LuaJIT v2.0+.
This library does not have any dependencies.
-Note at the time of this release, Lua 5.4 final is not released yet.
-For Lua 5.4, This library is tested with its rc6 version.

This file "LibDeflate.lua" is the only source file of the library.
Submit suggestions or report bugs to https://github.com/safeteeWow/LibDeflate/issues -]] - ---[[ +]] --[[ zlib License -(C) 2018-2020 Haoqian He +(C) 2018-2021 Haoqian He This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -48,12 +44,17 @@ freely, subject to the following restrictions: misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +License History: +1. GNU General Public License Version 3 in v1.0.0 and earlier versions. +2. GNU Lesser General Public License Version 3 in v1.0.1 +3. the zlib License since v1.0.2 Credits and Disclaimer: -The following projects are used to the help to test the correctness -of this program. The code of this program (LibDeflate.lua) does not -use their code directly, but uses their ideas and algorithms. Their original -licenses shall be comply when used. +This library rewrites the code from the algorithm +and the ideas of the following projects, +and uses their code to help to test the correctness of this library, +but their code is not included directly in the library itself. +Their original licenses shall be comply when used. 1. zlib, by Jean-loup Gailly (compression) and Mark Adler (decompression). http://www.zlib.net/ @@ -71,64 +72,59 @@ licenses shall be comply when used. https://github.com/WeakAuras/WeakAuras2 Licensed under GPLv2. For the 6bit encoding and decoding. -]] - ---[[ +]] --[[ Curseforge auto-packaging replacements: - Project Date: 2020-06-26T15:11:26Z - Project Hash: c19f978f053ebd22950eb6f1df4445677a4b0160 - Project Version: 1.0.2-release ---]] - -local LibDeflate + Project Date: @project-date-iso@ + Project Hash: @project-hash@ + Project Version: @project-version@ +--]] local LibDeflate do - -- Semantic version. all lowercase. - -- Suffix can be alpha1, alpha2, beta1, beta2, rc1, rc2, etc. - -- NOTE: Two version numbers needs to modify. - -- 1. On the top of LibDeflate.lua - -- 2. _VERSION - -- 3. _MINOR - - -- version to store the official version of LibDeflate - local _VERSION = "1.0.2-release" - - -- When MAJOR is changed, I should name it as LibDeflate2 - local _MAJOR = "LibDeflate" - - -- Update this whenever a new version, for LibStub version registration. - -- 0 : v0.x - -- 1 : v1.0.0 - -- 2 : v1.0.1 - -- 3 : v1.0.2 - local _MINOR = 3 - - local _COPYRIGHT = - "LibDeflate ".._VERSION - .." Copyright (C) 2018-2020 Haoqian He." - .." Licensed under the zlib License" - - -- Register in the World of Warcraft library "LibStub" if detected. - if LibStub then - local lib, minor = LibStub:GetLibrary(_MAJOR, true) - if lib and minor and minor >= _MINOR then -- No need to update. - return lib - else -- Update or first time register - LibDeflate = LibStub:NewLibrary(_MAJOR, _MINOR) - -- NOTE: It is important that new version has implemented - -- all exported APIs and tables in the old version, - -- so the old library is fully garbage collected, - -- and we 100% ensure the backward compatibility. - end - else -- "LibStub" is not detected. - LibDeflate = {} - end - - LibDeflate._VERSION = _VERSION - LibDeflate._MAJOR = _MAJOR - LibDeflate._MINOR = _MINOR - LibDeflate._COPYRIGHT = _COPYRIGHT + -- Semantic version. all lowercase. + -- Suffix can be alpha1, alpha2, beta1, beta2, rc1, rc2, etc. + -- NOTE: Two version numbers needs to modify. + -- 1. On the top of LibDeflate.lua + -- 2. _VERSION + -- 3. _MINOR + + -- version to store the official version of LibDeflate + local _VERSION = "1.0.2-release" + + -- When MAJOR is changed, I should name it as LibDeflate2 + local _MAJOR = "LibDeflate" + + -- Update this whenever a new version, for LibStub version registration. + -- 0 : v0.x + -- 1 : v1.0.0 + -- 2 : v1.0.1 + -- 3 : v1.0.2 + local _MINOR = 3 + + local _COPYRIGHT = "LibDeflate " .. _VERSION .. + " Copyright (C) 2018-2021 Haoqian He." .. + " Licensed under the zlib License" + + -- Register in the World of Warcraft library "LibStub" if detected. + if LibStub then + local lib, minor = LibStub:GetLibrary(_MAJOR, true) + if lib and minor and minor >= _MINOR then -- No need to update. + return lib + else -- Update or first time register + LibDeflate = LibStub:NewLibrary(_MAJOR, _MINOR) + -- NOTE: It is important that new version has implemented + -- all exported APIs and tables in the old version, + -- so the old library is fully garbage collected, + -- and we 100% ensure the backward compatibility. + end + else -- "LibStub" is not detected. + LibDeflate = {} + end + + LibDeflate._VERSION = _VERSION + LibDeflate._MAJOR = _MAJOR + LibDeflate._MINOR = _MINOR + LibDeflate._COPYRIGHT = _COPYRIGHT end -- localize Lua api for faster access. @@ -189,35 +185,93 @@ local _dist256_to_deflate_extra_bitlen = {} -- Convert a literal/LZ77_length deflate code to LZ77 base length -- The key of the table is (code - 256), 257<=code<=285 -local _literal_deflate_code_to_base_len = { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, -} +local _literal_deflate_code_to_base_len = + { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, + 83, 99, 115, 131, 163, 195, 227, 258 + } -- Convert a literal/LZ77_length deflate code to base LZ77 length extra bits -- The key of the table is (code - 256), 257<=code<=285 -local _literal_deflate_code_to_extra_bitlen = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, -} +local _literal_deflate_code_to_extra_bitlen = + { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, + 5, 5, 5, 0 + } -- Convert a distance deflate code to base LZ77 distance. (0<=code<=29) local _dist_deflate_code_to_base_dist = { - [0] = 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, + [0] = 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577 } -- Convert a distance deflate code to LZ77 bits length. (0<=code<=29) -local _dist_deflate_code_to_extra_bitlen = { - [0] = 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, -} +local _dist_deflate_code_to_extra_bitlen = + { + [0] = 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 5, + 6, + 6, + 7, + 7, + 8, + 8, + 9, + 9, + 10, + 10, + 11, + 11, + 12, + 12, + 13, + 13 + } -- The code order of the first huffman header in the dynamic deflate block. -- See the page 12 of RFC1951 -local _rle_codes_huffman_bitlen_order = {16, 17, 18, - 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, +local _rle_codes_huffman_bitlen_order = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 } -- The following tables are used by fixed deflate block. @@ -256,88 +310,86 @@ local _fix_block_dist_huffman_bitlen -- in fixed deflate block. local _fix_block_dist_huffman_bitlen_count -for i = 0, 255 do - _byte_to_char[i] = string_char(i) -end +for i = 0, 255 do _byte_to_char[i] = string_char(i) end do - local pow = 1 - for i = 0, 32 do - _pow2[i] = pow - pow = pow * 2 - end + local pow = 1 + for i = 0, 32 do + _pow2[i] = pow + pow = pow * 2 + end end for i = 1, 9 do - _reverse_bits_tbl[i] = {} - for j=0, _pow2[i+1]-1 do - local reverse = 0 - local value = j - for _ = 1, i do - -- The following line is equivalent to "res | (code %2)" in C. - reverse = reverse - reverse%2 - + (((reverse%2==1) or (value % 2) == 1) and 1 or 0) - value = (value-value%2)/2 - reverse = reverse * 2 - end - _reverse_bits_tbl[i][j] = (reverse-reverse%2)/2 - end + _reverse_bits_tbl[i] = {} + for j = 0, _pow2[i + 1] - 1 do + local reverse = 0 + local value = j + for _ = 1, i do + -- The following line is equivalent to "res | (code %2)" in C. + reverse = reverse - reverse % 2 + + (((reverse % 2 == 1) or (value % 2) == 1) and 1 or 0) + value = (value - value % 2) / 2 + reverse = reverse * 2 + end + _reverse_bits_tbl[i][j] = (reverse - reverse % 2) / 2 + end end -- The source code is written according to the pattern in the numbers -- in RFC1951 Page10. do - local a = 18 - local b = 16 - local c = 265 - local bitlen = 1 - for len = 3, 258 do - if len <= 10 then - _length_to_deflate_code[len] = len + 254 - _length_to_deflate_extra_bitlen[len] = 0 - elseif len == 258 then - _length_to_deflate_code[len] = 285 - _length_to_deflate_extra_bitlen[len] = 0 - else - if len > a then - a = a + b - b = b * 2 - c = c + 4 - bitlen = bitlen + 1 - end - local t = len-a-1+b/2 - _length_to_deflate_code[len] = (t-(t%(b/8)))/(b/8) + c - _length_to_deflate_extra_bitlen[len] = bitlen - _length_to_deflate_extra_bits[len] = t % (b/8) - end - end + local a = 18 + local b = 16 + local c = 265 + local bitlen = 1 + for len = 3, 258 do + if len <= 10 then + _length_to_deflate_code[len] = len + 254 + _length_to_deflate_extra_bitlen[len] = 0 + elseif len == 258 then + _length_to_deflate_code[len] = 285 + _length_to_deflate_extra_bitlen[len] = 0 + else + if len > a then + a = a + b + b = b * 2 + c = c + 4 + bitlen = bitlen + 1 + end + local t = len - a - 1 + b / 2 + _length_to_deflate_code[len] = (t - (t % (b / 8))) / (b / 8) + c + _length_to_deflate_extra_bitlen[len] = bitlen + _length_to_deflate_extra_bits[len] = t % (b / 8) + end + end end -- The source code is written according to the pattern in the numbers -- in RFC1951 Page11. do - _dist256_to_deflate_code[1] = 0 - _dist256_to_deflate_code[2] = 1 - _dist256_to_deflate_extra_bitlen[1] = 0 - _dist256_to_deflate_extra_bitlen[2] = 0 - - local a = 3 - local b = 4 - local code = 2 - local bitlen = 0 - for dist = 3, 256 do - if dist > b then - a = a * 2 - b = b * 2 - code = code + 2 - bitlen = bitlen + 1 - end - _dist256_to_deflate_code[dist] = (dist <= a) and code or (code+1) - _dist256_to_deflate_extra_bitlen[dist] = (bitlen < 0) and 0 or bitlen - if b >= 8 then - _dist256_to_deflate_extra_bits[dist] = (dist-b/2-1) % (b/4) - end - end + _dist256_to_deflate_code[1] = 0 + _dist256_to_deflate_code[2] = 1 + _dist256_to_deflate_extra_bitlen[1] = 0 + _dist256_to_deflate_extra_bitlen[2] = 0 + + local a = 3 + local b = 4 + local code = 2 + local bitlen = 0 + for dist = 3, 256 do + if dist > b then + a = a * 2 + b = b * 2 + code = code + 2 + bitlen = bitlen + 1 + end + _dist256_to_deflate_code[dist] = (dist <= a) and code or (code + 1) + _dist256_to_deflate_extra_bitlen[dist] = (bitlen < 0) and 0 or bitlen + if b >= 8 then + _dist256_to_deflate_extra_bits[dist] = (dist - b / 2 - 1) % (b / 4) + end + end end --- Calculate the Adler-32 checksum of the string.
@@ -347,49 +399,53 @@ end -- @return [integer] The Adler-32 checksum, which is greater or equal to 0, -- and less than 2^32 (4294967296). function LibDeflate:Adler32(str) - -- This function is loop unrolled by better performance. - -- - -- Here is the minimum code: - -- - -- local a = 1 - -- local b = 0 - -- for i=1, #str do - -- local s = string.byte(str, i, i) - -- a = (a+s)%65521 - -- b = (b+a)%65521 - -- end - -- return b*65536+a - if type(str) ~= "string" then - error(("Usage: LibDeflate:Adler32(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - local strlen = #str - - local i = 1 - local a = 1 - local b = 0 - while i <= strlen - 15 do - local x1, x2, x3, x4, x5, x6, x7, x8, - x9, x10, x11, x12, x13, x14, x15, x16 = string_byte(str, i, i+15) - b = (b+16*a+16*x1+15*x2+14*x3+13*x4+12*x5+11*x6+10*x7+9*x8+8*x9 - +7*x10+6*x11+5*x12+4*x13+3*x14+2*x15+x16)%65521 - a = (a+x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14+x15+x16)%65521 - i = i + 16 - end - while (i <= strlen) do - local x = string_byte(str, i, i) - a = (a + x) % 65521 - b = (b + a) % 65521 - i = i + 1 - end - return (b*65536+a) % 4294967296 + -- This function is loop unrolled by better performance. + -- + -- Here is the minimum code: + -- + -- local a = 1 + -- local b = 0 + -- for i=1, #str do + -- local s = string.byte(str, i, i) + -- a = (a+s)%65521 + -- b = (b+a)%65521 + -- end + -- return b*65536+a + if type(str) ~= "string" then + error(("Usage: LibDeflate:Adler32(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + local strlen = #str + + local i = 1 + local a = 1 + local b = 0 + while i <= strlen - 15 do + local x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16 = + string_byte(str, i, i + 15) + b = + (b + 16 * a + 16 * x1 + 15 * x2 + 14 * x3 + 13 * x4 + 12 * x5 + 11 * x6 + + 10 * x7 + 9 * x8 + 8 * x9 + 7 * x10 + 6 * x11 + 5 * x12 + 4 * x13 + 3 * + x14 + 2 * x15 + x16) % 65521 + a = + (a + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + + x14 + x15 + x16) % 65521 + i = i + 16 + end + while (i <= strlen) do + local x = string_byte(str, i, i) + a = (a + x) % 65521 + b = (b + a) % 65521 + i = i + 1 + end + return (b * 65536 + a) % 4294967296 end -- Compare adler32 checksum. -- adler32 should be compared with a mod to avoid sign problem -- 4072834167 (unsigned) is the same adler32 as -222133129 local function IsEqualAdler32(actual, expected) - return (actual % 4294967296) == (expected % 4294967296) + return (actual % 4294967296) == (expected % 4294967296) end --- Create a preset dictionary. @@ -435,95 +491,108 @@ end -- @raise error if 'strlen' does not match the length of 'str', -- or if 'adler32' does not match the Adler-32 checksum of 'str'. function LibDeflate:CreateDictionary(str, strlen, adler32) - if type(str) ~= "string" then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if type(strlen) ~= "number" then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'strlen' - number expected got '%s'."):format( - type(strlen)), 2) - end - if type(adler32) ~= "number" then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'adler32' - number expected got '%s'."):format( - type(adler32)), 2) - end - if strlen ~= #str then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'strlen' does not match the actual length of 'str'." - .." 'strlen': %u, '#str': %u ." - .." Please check if 'str' is modified unintentionally.") - :format(strlen, #str)) - end - if strlen == 0 then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'str' - Empty string is not allowed."), 2) - end - if strlen > 32768 then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'str' - string longer than 32768 bytes is not allowed." - .." Got %d bytes."):format(strlen), 2) - end - local actual_adler32 = self:Adler32(str) - if not IsEqualAdler32(adler32, actual_adler32) then - error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" - .." 'adler32' does not match the actual adler32 of 'str'." - .." 'adler32': %u, 'Adler32(str)': %u ." - .." Please check if 'str' is modified unintentionally.") - :format(adler32, actual_adler32)) - end - - local dictionary = {} - dictionary.adler32 = adler32 - dictionary.hash_tables = {} - dictionary.string_table = {} - dictionary.strlen = strlen - local string_table = dictionary.string_table - local hash_tables = dictionary.hash_tables - string_table[1] = string_byte(str, 1, 1) - string_table[2] = string_byte(str, 2, 2) - if strlen >= 3 then - local i = 1 - local hash = string_table[1]*256+string_table[2] - while i <= strlen - 2 - 3 do - local x1, x2, x3, x4 = string_byte(str, i+2, i+5) - string_table[i+2] = x1 - string_table[i+3] = x2 - string_table[i+4] = x3 - string_table[i+5] = x4 - hash = (hash*256+x1)%16777216 - local t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = i-strlen - i = i + 1 - hash = (hash*256+x2)%16777216 - t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = i-strlen - i = i + 1 - hash = (hash*256+x3)%16777216 - t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = i-strlen - i = i + 1 - hash = (hash*256+x4)%16777216 - t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = i-strlen - i = i + 1 - end - while i <= strlen - 2 do - local x = string_byte(str, i+2) - string_table[i+2] = x - hash = (hash*256+x)%16777216 - local t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = i-strlen - i = i + 1 - end - end - return dictionary + if type(str) ~= "string" then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + if type(strlen) ~= "number" then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'strlen' - number expected got '%s'."):format(type(strlen)), 2) + end + if type(adler32) ~= "number" then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'adler32' - number expected got '%s'."):format(type(adler32)), 2) + end + if strlen ~= #str then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'strlen' does not match the actual length of 'str'." .. + " 'strlen': %u, '#str': %u ." .. + " Please check if 'str' is modified unintentionally."):format( + strlen, #str)) + end + if strlen == 0 then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'str' - Empty string is not allowed."), 2) + end + if strlen > 32768 then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'str' - string longer than 32768 bytes is not allowed." .. + " Got %d bytes."):format(strlen), 2) + end + local actual_adler32 = self:Adler32(str) + if not IsEqualAdler32(adler32, actual_adler32) then + error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):" .. + " 'adler32' does not match the actual adler32 of 'str'." .. + " 'adler32': %u, 'Adler32(str)': %u ." .. + " Please check if 'str' is modified unintentionally."):format( + adler32, actual_adler32)) + end + + local dictionary = {} + dictionary.adler32 = adler32 + dictionary.hash_tables = {} + dictionary.string_table = {} + dictionary.strlen = strlen + local string_table = dictionary.string_table + local hash_tables = dictionary.hash_tables + string_table[1] = string_byte(str, 1, 1) + string_table[2] = string_byte(str, 2, 2) + if strlen >= 3 then + local i = 1 + local hash = string_table[1] * 256 + string_table[2] + while i <= strlen - 2 - 3 do + local x1, x2, x3, x4 = string_byte(str, i + 2, i + 5) + string_table[i + 2] = x1 + string_table[i + 3] = x2 + string_table[i + 4] = x3 + string_table[i + 5] = x4 + hash = (hash * 256 + x1) % 16777216 + local t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = i - strlen + i = i + 1 + hash = (hash * 256 + x2) % 16777216 + t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = i - strlen + i = i + 1 + hash = (hash * 256 + x3) % 16777216 + t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = i - strlen + i = i + 1 + hash = (hash * 256 + x4) % 16777216 + t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = i - strlen + i = i + 1 + end + while i <= strlen - 2 do + local x = string_byte(str, i + 2) + string_table[i + 2] = x + hash = (hash * 256 + x) % 16777216 + local t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = i - strlen + i = i + 1 + end + end + return dictionary end -- Check if the dictionary is valid. @@ -531,22 +600,18 @@ end -- @return true if valid, false if not valid. -- @return if not valid, the error message. local function IsValidDictionary(dictionary) - if type(dictionary) ~= "table" then - return false, ("'dictionary' - table expected got '%s'.") - :format(type(dictionary)) - end - if type(dictionary.adler32) ~= "number" - or type(dictionary.string_table) ~= "table" - or type(dictionary.strlen) ~= "number" - or dictionary.strlen <= 0 - or dictionary.strlen > 32768 - or dictionary.strlen ~= #dictionary.string_table - or type(dictionary.hash_tables) ~= "table" - then - return false, ("'dictionary' - corrupted dictionary.") - :format(type(dictionary)) - end - return true, "" + if type(dictionary) ~= "table" then + return false, + ("'dictionary' - table expected got '%s'."):format(type(dictionary)) + end + if type(dictionary.adler32) ~= "number" or type(dictionary.string_table) ~= + "table" or type(dictionary.strlen) ~= "number" or dictionary.strlen <= 0 or + dictionary.strlen > 32768 or dictionary.strlen ~= #dictionary.string_table or + type(dictionary.hash_tables) ~= "table" then + return false, + ("'dictionary' - corrupted dictionary."):format(type(dictionary)) + end + return true, "" end --[[ @@ -590,17 +655,17 @@ end Number. The maximum number of hash chains we look. --]] local _compression_level_configs = { - [0] = {false, nil, 0, 0, 0}, -- level 0, no compression - [1] = {false, nil, 4, 8, 4}, -- level 1, similar to zlib level 1 - [2] = {false, nil, 5, 18, 8}, -- level 2, similar to zlib level 2 - [3] = {false, nil, 6, 32, 32}, -- level 3, similar to zlib level 3 - [4] = {true, 4, 4, 16, 16}, -- level 4, similar to zlib level 4 - [5] = {true, 8, 16, 32, 32}, -- level 5, similar to zlib level 5 - [6] = {true, 8, 16, 128, 128}, -- level 6, similar to zlib level 6 - [7] = {true, 8, 32, 128, 256}, -- (SLOW) level 7, similar to zlib level 7 - [8] = {true, 32, 128, 258, 1024} , --(SLOW) level 8,similar to zlib level 8 - [9] = {true, 32, 258, 258, 4096}, - -- (VERY SLOW) level 9, similar to zlib level 9 + [0] = {false, nil, 0, 0, 0}, -- level 0, no compression + [1] = {false, nil, 4, 8, 4}, -- level 1, similar to zlib level 1 + [2] = {false, nil, 5, 18, 8}, -- level 2, similar to zlib level 2 + [3] = {false, nil, 6, 32, 32}, -- level 3, similar to zlib level 3 + [4] = {true, 4, 4, 16, 16}, -- level 4, similar to zlib level 4 + [5] = {true, 8, 16, 32, 32}, -- level 5, similar to zlib level 5 + [6] = {true, 8, 16, 128, 128}, -- level 6, similar to zlib level 6 + [7] = {true, 8, 32, 128, 256}, -- (SLOW) level 7, similar to zlib level 7 + [8] = {true, 32, 128, 258, 1024}, -- (SLOW) level 8,similar to zlib level 8 + [9] = {true, 32, 258, 258, 4096} + -- (VERY SLOW) level 9, similar to zlib level 9 } -- Check if the compression/decompression arguments is valid @@ -611,50 +676,43 @@ local _compression_level_configs = { -- @param configs The compression configuration table -- @return true if valid, false if not valid. -- @return if not valid, the error message. -local function IsValidArguments(str, - check_dictionary, dictionary, - check_configs, configs) - - if type(str) ~= "string" then - return false, - ("'str' - string expected got '%s'."):format(type(str)) - end - if check_dictionary then - local dict_valid, dict_err = IsValidDictionary(dictionary) - if not dict_valid then - return false, dict_err - end - end - if check_configs then - local type_configs = type(configs) - if type_configs ~= "nil" and type_configs ~= "table" then - return false, - ("'configs' - nil or table expected got '%s'.") - :format(type(configs)) - end - if type_configs == "table" then - for k, v in pairs(configs) do - if k ~= "level" and k ~= "strategy" then - return false, - ("'configs' - unsupported table key in the configs: '%s'.") - :format(k) - elseif k == "level" and not _compression_level_configs[v] then - return false, - ("'configs' - unsupported 'level': %s."):format(tostring(v)) - elseif k == "strategy" and v ~= "fixed" and v ~= "huffman_only" - and v ~= "dynamic" then - -- random_block_type is for testing purpose - return false, ("'configs' - unsupported 'strategy': '%s'.") - :format(tostring(v)) - end - end - end - end - return true, "" +local function IsValidArguments(str, check_dictionary, dictionary, + check_configs, configs) + + if type(str) ~= "string" then + return false, ("'str' - string expected got '%s'."):format(type(str)) + end + if check_dictionary then + local dict_valid, dict_err = IsValidDictionary(dictionary) + if not dict_valid then return false, dict_err end + end + if check_configs then + local type_configs = type(configs) + if type_configs ~= "nil" and type_configs ~= "table" then + return false, ("'configs' - nil or table expected got '%s'."):format( + type(configs)) + end + if type_configs == "table" then + for k, v in pairs(configs) do + if k ~= "level" and k ~= "strategy" then + return false, + ("'configs' - unsupported table key in the configs: '%s'."):format( + k) + elseif k == "level" and not _compression_level_configs[v] then + return false, + ("'configs' - unsupported 'level': %s."):format(tostring(v)) + elseif k == "strategy" and v ~= "fixed" and v ~= "huffman_only" and v ~= + "dynamic" then + -- random_block_type is for testing purpose + return false, ("'configs' - unsupported 'strategy': '%s'."):format( + tostring(v)) + end + end + end + end + return true, "" end - - --[[ -------------------------------------------------------------------------- Compress code --]] -------------------------------------------------------------------------- @@ -676,103 +734,101 @@ local _FLUSH_MODE_NO_FLUSH = 3 3. Flush(mode): --]] local function CreateWriter() - local buffer_size = 0 - local cache = 0 - local cache_bitlen = 0 - local total_bitlen = 0 - local buffer = {} - -- When buffer is big enough, flush into result_buffer to save memory. - local result_buffer = {} - - -- Write bits with value "value" and bit length of "bitlen" into writer. - -- @param value: The value being written - -- @param bitlen: The bit length of "value" - -- @return nil - local function WriteBits(value, bitlen) - cache = cache + value * _pow2[cache_bitlen] - cache_bitlen = cache_bitlen + bitlen - total_bitlen = total_bitlen + bitlen - -- Only bulk to buffer every 4 bytes. This is quicker. - if cache_bitlen >= 32 then - buffer_size = buffer_size + 1 - buffer[buffer_size] = - _byte_to_char[cache % 256] - .._byte_to_char[((cache-cache%256)/256 % 256)] - .._byte_to_char[((cache-cache%65536)/65536 % 256)] - .._byte_to_char[((cache-cache%16777216)/16777216 % 256)] - local rshift_mask = _pow2[32 - cache_bitlen + bitlen] - cache = (value - value%rshift_mask)/rshift_mask - cache_bitlen = cache_bitlen - 32 - end - end - - -- Write the entire string into the writer. - -- @param str The string being written - -- @return nil - local function WriteString(str) - for _ = 1, cache_bitlen, 8 do - buffer_size = buffer_size + 1 - buffer[buffer_size] = string_char(cache % 256) - cache = (cache-cache%256)/256 - end - cache_bitlen = 0 - buffer_size = buffer_size + 1 - buffer[buffer_size] = str - total_bitlen = total_bitlen + #str*8 - end - - -- Flush current stuffs in the writer and return it. - -- This operation will free most of the memory. - -- @param mode See the descrtion of the constant and the source code. - -- @return The total number of bits stored in the writer right now. - -- for byte boundary mode, it includes the padding bits. - -- for output mode, it does not include padding bits. - -- @return Return the outputs if mode is output. - local function FlushWriter(mode) - if mode == _FLUSH_MODE_NO_FLUSH then - return total_bitlen - end - - if mode == _FLUSH_MODE_OUTPUT - or mode == _FLUSH_MODE_BYTE_BOUNDARY then - -- Full flush, also output cache. - -- Need to pad some bits if cache_bitlen is not multiple of 8. - local padding_bitlen = (8 - cache_bitlen % 8) % 8 - - if cache_bitlen > 0 then - -- padding with all 1 bits, mainly because "\000" is not - -- good to be tranmitted. I do this so "\000" is a little bit - -- less frequent. - cache = cache - _pow2[cache_bitlen] - + _pow2[cache_bitlen+padding_bitlen] - for _ = 1, cache_bitlen, 8 do - buffer_size = buffer_size + 1 - buffer[buffer_size] = _byte_to_char[cache % 256] - cache = (cache-cache%256)/256 - end - - cache = 0 - cache_bitlen = 0 - end - if mode == _FLUSH_MODE_BYTE_BOUNDARY then - total_bitlen = total_bitlen + padding_bitlen - return total_bitlen - end - end - - local flushed = table_concat(buffer) - buffer = {} - buffer_size = 0 - result_buffer[#result_buffer+1] = flushed - - if mode == _FLUSH_MODE_MEMORY_CLEANUP then - return total_bitlen - else - return total_bitlen, table_concat(result_buffer) - end - end - - return WriteBits, WriteString, FlushWriter + local buffer_size = 0 + local cache = 0 + local cache_bitlen = 0 + local total_bitlen = 0 + local buffer = {} + -- When buffer is big enough, flush into result_buffer to save memory. + local result_buffer = {} + + -- Write bits with value "value" and bit length of "bitlen" into writer. + -- @param value: The value being written + -- @param bitlen: The bit length of "value" + -- @return nil + local function WriteBits(value, bitlen) + cache = cache + value * _pow2[cache_bitlen] + cache_bitlen = cache_bitlen + bitlen + total_bitlen = total_bitlen + bitlen + -- Only bulk to buffer every 4 bytes. This is quicker. + if cache_bitlen >= 32 then + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_char[cache % 256] .. + _byte_to_char[((cache - cache % 256) / 256 % 256)] .. + _byte_to_char[((cache - cache % 65536) / 65536 % + 256)] .. + _byte_to_char[((cache - cache % 16777216) / + 16777216 % 256)] + local rshift_mask = _pow2[32 - cache_bitlen + bitlen] + cache = (value - value % rshift_mask) / rshift_mask + cache_bitlen = cache_bitlen - 32 + end + end + + -- Write the entire string into the writer. + -- @param str The string being written + -- @return nil + local function WriteString(str) + for _ = 1, cache_bitlen, 8 do + buffer_size = buffer_size + 1 + buffer[buffer_size] = string_char(cache % 256) + cache = (cache - cache % 256) / 256 + end + cache_bitlen = 0 + buffer_size = buffer_size + 1 + buffer[buffer_size] = str + total_bitlen = total_bitlen + #str * 8 + end + + -- Flush current stuffs in the writer and return it. + -- This operation will free most of the memory. + -- @param mode See the descrtion of the constant and the source code. + -- @return The total number of bits stored in the writer right now. + -- for byte boundary mode, it includes the padding bits. + -- for output mode, it does not include padding bits. + -- @return Return the outputs if mode is output. + local function FlushWriter(mode) + if mode == _FLUSH_MODE_NO_FLUSH then return total_bitlen end + + if mode == _FLUSH_MODE_OUTPUT or mode == _FLUSH_MODE_BYTE_BOUNDARY then + -- Full flush, also output cache. + -- Need to pad some bits if cache_bitlen is not multiple of 8. + local padding_bitlen = (8 - cache_bitlen % 8) % 8 + + if cache_bitlen > 0 then + -- padding with all 1 bits, mainly because "\000" is not + -- good to be tranmitted. I do this so "\000" is a little bit + -- less frequent. + cache = cache - _pow2[cache_bitlen] + + _pow2[cache_bitlen + padding_bitlen] + for _ = 1, cache_bitlen, 8 do + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_char[cache % 256] + cache = (cache - cache % 256) / 256 + end + + cache = 0 + cache_bitlen = 0 + end + if mode == _FLUSH_MODE_BYTE_BOUNDARY then + total_bitlen = total_bitlen + padding_bitlen + return total_bitlen + end + end + + local flushed = table_concat(buffer) + buffer = {} + buffer_size = 0 + result_buffer[#result_buffer + 1] = flushed + + if mode == _FLUSH_MODE_MEMORY_CLEANUP then + return total_bitlen + else + return total_bitlen, table_concat(result_buffer) + end + end + + return WriteBits, WriteString, FlushWriter end -- Push an element into a max heap @@ -784,19 +840,19 @@ end -- heap[heap_size+1], heap[heap_size+2], etc.. -- @return nil local function MinHeapPush(heap, e, heap_size) - heap_size = heap_size + 1 - heap[heap_size] = e - local value = e[1] - local pos = heap_size - local parent_pos = (pos-pos%2)/2 - - while (parent_pos >= 1 and heap[parent_pos][1] > value) do - local t = heap[parent_pos] - heap[parent_pos] = e - heap[pos] = t - pos = parent_pos - parent_pos = (parent_pos-parent_pos%2)/2 - end + heap_size = heap_size + 1 + heap[heap_size] = e + local value = e[1] + local pos = heap_size + local parent_pos = (pos - pos % 2) / 2 + + while (parent_pos >= 1 and heap[parent_pos][1] > value) do + local t = heap[parent_pos] + heap[parent_pos] = e + heap[pos] = t + pos = parent_pos + parent_pos = (parent_pos - parent_pos % 2) / 2 + end end -- Pop an element from a max heap @@ -805,45 +861,45 @@ end -- @return the poped element -- Note: This function does not change table size of "heap" to save CPU time. local function MinHeapPop(heap, heap_size) - local top = heap[1] - local e = heap[heap_size] - local value = e[1] - heap[1] = e - heap[heap_size] = top - heap_size = heap_size - 1 - - local pos = 1 - local left_child_pos = pos * 2 - local right_child_pos = left_child_pos + 1 - - while (left_child_pos <= heap_size) do - local left_child = heap[left_child_pos] - if (right_child_pos <= heap_size - and heap[right_child_pos][1] < left_child[1]) then - local right_child = heap[right_child_pos] - if right_child[1] < value then - heap[right_child_pos] = e - heap[pos] = right_child - pos = right_child_pos - left_child_pos = pos * 2 - right_child_pos = left_child_pos + 1 - else - break - end - else - if left_child[1] < value then - heap[left_child_pos] = e - heap[pos] = left_child - pos = left_child_pos - left_child_pos = pos * 2 - right_child_pos = left_child_pos + 1 - else - break - end - end - end - - return top + local top = heap[1] + local e = heap[heap_size] + local value = e[1] + heap[1] = e + heap[heap_size] = top + heap_size = heap_size - 1 + + local pos = 1 + local left_child_pos = pos * 2 + local right_child_pos = left_child_pos + 1 + + while (left_child_pos <= heap_size) do + local left_child = heap[left_child_pos] + if (right_child_pos <= heap_size and heap[right_child_pos][1] < + left_child[1]) then + local right_child = heap[right_child_pos] + if right_child[1] < value then + heap[right_child_pos] = e + heap[pos] = right_child + pos = right_child_pos + left_child_pos = pos * 2 + right_child_pos = left_child_pos + 1 + else + break + end + else + if left_child[1] < value then + heap[left_child_pos] = e + heap[pos] = left_child + pos = left_child_pos + left_child_pos = pos * 2 + right_child_pos = left_child_pos + 1 + else + break + end + end + end + + return top end -- Deflate defines a special huffman tree, which is unique once the bit length @@ -854,50 +910,48 @@ end -- which is (number of symbols - 1) -- @param max_bitlen The max huffman bit length among all symbols. -- @return The huffman code of all symbols. -local function GetHuffmanCodeFromBitlen(bitlen_counts, symbol_bitlens - , max_symbol, max_bitlen) - local huffman_code = 0 - local next_codes = {} - local symbol_huffman_codes = {} - for bitlen = 1, max_bitlen do - huffman_code = (huffman_code+(bitlen_counts[bitlen-1] or 0))*2 - next_codes[bitlen] = huffman_code - end - for symbol = 0, max_symbol do - local bitlen = symbol_bitlens[symbol] - if bitlen then - huffman_code = next_codes[bitlen] - next_codes[bitlen] = huffman_code + 1 - - -- Reverse the bits of huffman code, - -- because most signifant bits of huffman code - -- is stored first into the compressed data. - -- @see RFC1951 Page5 Section 3.1.1 - if bitlen <= 9 then -- Have cached reverse for small bitlen. - symbol_huffman_codes[symbol] = - _reverse_bits_tbl[bitlen][huffman_code] - else - local reverse = 0 - for _ = 1, bitlen do - reverse = reverse - reverse%2 - + (((reverse%2==1) - or (huffman_code % 2) == 1) and 1 or 0) - huffman_code = (huffman_code-huffman_code%2)/2 - reverse = reverse*2 - end - symbol_huffman_codes[symbol] = (reverse-reverse%2)/2 - end - end - end - return symbol_huffman_codes +local function GetHuffmanCodeFromBitlen(bitlen_counts, symbol_bitlens, + max_symbol, max_bitlen) + local huffman_code = 0 + local next_codes = {} + local symbol_huffman_codes = {} + for bitlen = 1, max_bitlen do + huffman_code = (huffman_code + (bitlen_counts[bitlen - 1] or 0)) * 2 + next_codes[bitlen] = huffman_code + end + for symbol = 0, max_symbol do + local bitlen = symbol_bitlens[symbol] + if bitlen then + huffman_code = next_codes[bitlen] + next_codes[bitlen] = huffman_code + 1 + + -- Reverse the bits of huffman code, + -- because most signifant bits of huffman code + -- is stored first into the compressed data. + -- @see RFC1951 Page5 Section 3.1.1 + if bitlen <= 9 then -- Have cached reverse for small bitlen. + symbol_huffman_codes[symbol] = _reverse_bits_tbl[bitlen][huffman_code] + else + local reverse = 0 + for _ = 1, bitlen do + reverse = reverse - reverse % 2 + + (((reverse % 2 == 1) or (huffman_code % 2) == 1) and 1 or + 0) + huffman_code = (huffman_code - huffman_code % 2) / 2 + reverse = reverse * 2 + end + symbol_huffman_codes[symbol] = (reverse - reverse % 2) / 2 + end + end + end + return symbol_huffman_codes end -- A helper function to sort heap elements -- a[1], b[1] is the huffman frequency -- a[2], b[2] is the symbol value. local function SortByFirstThenSecond(a, b) - return a[1] < b[1] or - (a[1] == b[1] and a[2] < b[2]) + return a[1] < b[1] or (a[1] == b[1] and a[2] < b[2]) end -- Calculate the huffman bit length and huffman code. @@ -912,128 +966,122 @@ end -- @return a table whose key is the symbol, and the value is the huffman code. -- @return a number indicating the maximum symbol whose bitlen is not 0. local function GetHuffmanBitlenAndCode(symbol_counts, max_bitlen, max_symbol) - local heap_size - local max_non_zero_bitlen_symbol = -1 - local leafs = {} - local heap = {} - local symbol_bitlens = {} - local symbol_codes = {} - local bitlen_counts = {} - - --[[ + local heap_size + local max_non_zero_bitlen_symbol = -1 + local leafs = {} + local heap = {} + local symbol_bitlens = {} + local symbol_codes = {} + local bitlen_counts = {} + + --[[ tree[1]: weight, temporarily used as parent and bitLengths tree[2]: symbol tree[3]: left child tree[4]: right child --]] - local number_unique_symbols = 0 - for symbol, count in pairs(symbol_counts) do - number_unique_symbols = number_unique_symbols + 1 - leafs[number_unique_symbols] = {count, symbol} - end - - if (number_unique_symbols == 0) then - -- no code. - return {}, {}, -1 - elseif (number_unique_symbols == 1) then - -- Only one code. In this case, its huffman code - -- needs to be assigned as 0, and bit length is 1. - -- This is the only case that the return result - -- represents an imcomplete huffman tree. - local symbol = leafs[1][2] - symbol_bitlens[symbol] = 1 - symbol_codes[symbol] = 0 - return symbol_bitlens, symbol_codes, symbol - else - table_sort(leafs, SortByFirstThenSecond) - heap_size = number_unique_symbols - for i = 1, heap_size do - heap[i] = leafs[i] - end - - while (heap_size > 1) do - -- Note: pop does not change table size of heap - local leftChild = MinHeapPop(heap, heap_size) - heap_size = heap_size - 1 - local rightChild = MinHeapPop(heap, heap_size) - heap_size = heap_size - 1 - local newNode = - {leftChild[1]+rightChild[1], -1, leftChild, rightChild} - MinHeapPush(heap, newNode, heap_size) - heap_size = heap_size + 1 - end - - -- Number of leafs whose bit length is greater than max_len. - local number_bitlen_overflow = 0 - - -- Calculate bit length of all nodes - local fifo = {heap[1], 0, 0, 0} -- preallocate some spaces. - local fifo_size = 1 - local index = 1 - heap[1][1] = 0 - while (index <= fifo_size) do -- Breath first search - local e = fifo[index] - local bitlen = e[1] - local symbol = e[2] - local left_child = e[3] - local right_child = e[4] - if left_child then - fifo_size = fifo_size + 1 - fifo[fifo_size] = left_child - left_child[1] = bitlen + 1 - end - if right_child then - fifo_size = fifo_size + 1 - fifo[fifo_size] = right_child - right_child[1] = bitlen + 1 - end - index = index + 1 - - if (bitlen > max_bitlen) then - number_bitlen_overflow = number_bitlen_overflow + 1 - bitlen = max_bitlen - end - if symbol >= 0 then - symbol_bitlens[symbol] = bitlen - max_non_zero_bitlen_symbol = - (symbol > max_non_zero_bitlen_symbol) - and symbol or max_non_zero_bitlen_symbol - bitlen_counts[bitlen] = (bitlen_counts[bitlen] or 0) + 1 - end - end - - -- Resolve bit length overflow - -- @see ZLib/trees.c:gen_bitlen(s, desc), for reference - if (number_bitlen_overflow > 0) then - repeat - local bitlen = max_bitlen - 1 - while ((bitlen_counts[bitlen] or 0) == 0) do - bitlen = bitlen - 1 - end - -- move one leaf down the tree - bitlen_counts[bitlen] = bitlen_counts[bitlen] - 1 - -- move one overflow item as its brother - bitlen_counts[bitlen+1] = (bitlen_counts[bitlen+1] or 0) + 2 - bitlen_counts[max_bitlen] = bitlen_counts[max_bitlen] - 1 - number_bitlen_overflow = number_bitlen_overflow - 2 - until (number_bitlen_overflow <= 0) - - index = 1 - for bitlen = max_bitlen, 1, -1 do - local n = bitlen_counts[bitlen] or 0 - while (n > 0) do - local symbol = leafs[index][2] - symbol_bitlens[symbol] = bitlen - n = n - 1 - index = index + 1 - end - end - end - - symbol_codes = GetHuffmanCodeFromBitlen(bitlen_counts, symbol_bitlens, - max_symbol, max_bitlen) - return symbol_bitlens, symbol_codes, max_non_zero_bitlen_symbol - end + local number_unique_symbols = 0 + for symbol, count in pairs(symbol_counts) do + number_unique_symbols = number_unique_symbols + 1 + leafs[number_unique_symbols] = {count, symbol} + end + + if (number_unique_symbols == 0) then + -- no code. + return {}, {}, -1 + elseif (number_unique_symbols == 1) then + -- Only one code. In this case, its huffman code + -- needs to be assigned as 0, and bit length is 1. + -- This is the only case that the return result + -- represents an imcomplete huffman tree. + local symbol = leafs[1][2] + symbol_bitlens[symbol] = 1 + symbol_codes[symbol] = 0 + return symbol_bitlens, symbol_codes, symbol + else + table_sort(leafs, SortByFirstThenSecond) + heap_size = number_unique_symbols + for i = 1, heap_size do heap[i] = leafs[i] end + + while (heap_size > 1) do + -- Note: pop does not change table size of heap + local leftChild = MinHeapPop(heap, heap_size) + heap_size = heap_size - 1 + local rightChild = MinHeapPop(heap, heap_size) + heap_size = heap_size - 1 + local newNode = {leftChild[1] + rightChild[1], -1, leftChild, rightChild} + MinHeapPush(heap, newNode, heap_size) + heap_size = heap_size + 1 + end + + -- Number of leafs whose bit length is greater than max_len. + local number_bitlen_overflow = 0 + + -- Calculate bit length of all nodes + local fifo = {heap[1], 0, 0, 0} -- preallocate some spaces. + local fifo_size = 1 + local index = 1 + heap[1][1] = 0 + while (index <= fifo_size) do -- Breath first search + local e = fifo[index] + local bitlen = e[1] + local symbol = e[2] + local left_child = e[3] + local right_child = e[4] + if left_child then + fifo_size = fifo_size + 1 + fifo[fifo_size] = left_child + left_child[1] = bitlen + 1 + end + if right_child then + fifo_size = fifo_size + 1 + fifo[fifo_size] = right_child + right_child[1] = bitlen + 1 + end + index = index + 1 + + if (bitlen > max_bitlen) then + number_bitlen_overflow = number_bitlen_overflow + 1 + bitlen = max_bitlen + end + if symbol >= 0 then + symbol_bitlens[symbol] = bitlen + max_non_zero_bitlen_symbol = (symbol > max_non_zero_bitlen_symbol) and + symbol or max_non_zero_bitlen_symbol + bitlen_counts[bitlen] = (bitlen_counts[bitlen] or 0) + 1 + end + end + + -- Resolve bit length overflow + -- @see ZLib/trees.c:gen_bitlen(s, desc), for reference + if (number_bitlen_overflow > 0) then + repeat + local bitlen = max_bitlen - 1 + while ((bitlen_counts[bitlen] or 0) == 0) do bitlen = bitlen - 1 end + -- move one leaf down the tree + bitlen_counts[bitlen] = bitlen_counts[bitlen] - 1 + -- move one overflow item as its brother + bitlen_counts[bitlen + 1] = (bitlen_counts[bitlen + 1] or 0) + 2 + bitlen_counts[max_bitlen] = bitlen_counts[max_bitlen] - 1 + number_bitlen_overflow = number_bitlen_overflow - 2 + until (number_bitlen_overflow <= 0) + + index = 1 + for bitlen = max_bitlen, 1, -1 do + local n = bitlen_counts[bitlen] or 0 + while (n > 0) do + local symbol = leafs[index][2] + symbol_bitlens[symbol] = bitlen + n = n - 1 + index = index + 1 + end + end + end + + symbol_codes = GetHuffmanCodeFromBitlen(bitlen_counts, symbol_bitlens, + max_symbol, max_bitlen) + return symbol_bitlens, symbol_codes, max_non_zero_bitlen_symbol + end end -- Calculate the first huffman header in the dynamic huffman block @@ -1048,82 +1096,81 @@ end -- @return The extra bits. One entry for each rle code that needs extra bits. -- (code == 16 or 17 or 18). -- @return The count of appearance of each rle codes. -local function RunLengthEncodeHuffmanBitlen( - lcode_bitlens, - max_non_zero_bitlen_lcode, - dcode_bitlens, - max_non_zero_bitlen_dcode) - local rle_code_tblsize = 0 - local rle_codes = {} - local rle_code_counts = {} - local rle_extra_bits_tblsize = 0 - local rle_extra_bits = {} - local prev = nil - local count = 0 - - -- If there is no distance code, assume one distance code of bit length 0. - -- RFC1951: One distance code of zero bits means that - -- there are no distance codes used at all (the data is all literals). - max_non_zero_bitlen_dcode = (max_non_zero_bitlen_dcode < 0) - and 0 or max_non_zero_bitlen_dcode - local max_code = max_non_zero_bitlen_lcode+max_non_zero_bitlen_dcode+1 - - for code = 0, max_code+1 do - local len = (code <= max_non_zero_bitlen_lcode) - and (lcode_bitlens[code] or 0) - or ((code <= max_code) - and (dcode_bitlens[code-max_non_zero_bitlen_lcode-1] or 0) or nil) - if len == prev then - count = count + 1 - if len ~= 0 and count == 6 then - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = 16 - rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 - rle_extra_bits[rle_extra_bits_tblsize] = 3 - rle_code_counts[16] = (rle_code_counts[16] or 0) + 1 - count = 0 - elseif len == 0 and count == 138 then - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = 18 - rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 - rle_extra_bits[rle_extra_bits_tblsize] = 127 - rle_code_counts[18] = (rle_code_counts[18] or 0) + 1 - count = 0 - end - else - if count == 1 then - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = prev - rle_code_counts[prev] = (rle_code_counts[prev] or 0) + 1 - elseif count == 2 then - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = prev - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = prev - rle_code_counts[prev] = (rle_code_counts[prev] or 0) + 2 - elseif count >= 3 then - rle_code_tblsize = rle_code_tblsize + 1 - local rleCode = (prev ~= 0) and 16 or (count <= 10 and 17 or 18) - rle_codes[rle_code_tblsize] = rleCode - rle_code_counts[rleCode] = (rle_code_counts[rleCode] or 0) + 1 - rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 - rle_extra_bits[rle_extra_bits_tblsize] = - (count <= 10) and (count - 3) or (count - 11) - end - - prev = len - if len and len ~= 0 then - rle_code_tblsize = rle_code_tblsize + 1 - rle_codes[rle_code_tblsize] = len - rle_code_counts[len] = (rle_code_counts[len] or 0) + 1 - count = 0 - else - count = 1 - end - end - end - - return rle_codes, rle_extra_bits, rle_code_counts +local function RunLengthEncodeHuffmanBitlen(lcode_bitlens, + max_non_zero_bitlen_lcode, + dcode_bitlens, + max_non_zero_bitlen_dcode) + local rle_code_tblsize = 0 + local rle_codes = {} + local rle_code_counts = {} + local rle_extra_bits_tblsize = 0 + local rle_extra_bits = {} + local prev = nil + local count = 0 + + -- If there is no distance code, assume one distance code of bit length 0. + -- RFC1951: One distance code of zero bits means that + -- there are no distance codes used at all (the data is all literals). + max_non_zero_bitlen_dcode = (max_non_zero_bitlen_dcode < 0) and 0 or + max_non_zero_bitlen_dcode + local max_code = max_non_zero_bitlen_lcode + max_non_zero_bitlen_dcode + 1 + + for code = 0, max_code + 1 do + local len = (code <= max_non_zero_bitlen_lcode) and + (lcode_bitlens[code] or 0) or ((code <= max_code) and + (dcode_bitlens[code - max_non_zero_bitlen_lcode - 1] or 0) or + nil) + if len == prev then + count = count + 1 + if len ~= 0 and count == 6 then + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = 16 + rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 + rle_extra_bits[rle_extra_bits_tblsize] = 3 + rle_code_counts[16] = (rle_code_counts[16] or 0) + 1 + count = 0 + elseif len == 0 and count == 138 then + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = 18 + rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 + rle_extra_bits[rle_extra_bits_tblsize] = 127 + rle_code_counts[18] = (rle_code_counts[18] or 0) + 1 + count = 0 + end + else + if count == 1 then + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = prev + rle_code_counts[prev] = (rle_code_counts[prev] or 0) + 1 + elseif count == 2 then + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = prev + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = prev + rle_code_counts[prev] = (rle_code_counts[prev] or 0) + 2 + elseif count >= 3 then + rle_code_tblsize = rle_code_tblsize + 1 + local rleCode = (prev ~= 0) and 16 or (count <= 10 and 17 or 18) + rle_codes[rle_code_tblsize] = rleCode + rle_code_counts[rleCode] = (rle_code_counts[rleCode] or 0) + 1 + rle_extra_bits_tblsize = rle_extra_bits_tblsize + 1 + rle_extra_bits[rle_extra_bits_tblsize] = + (count <= 10) and (count - 3) or (count - 11) + end + + prev = len + if len and len ~= 0 then + rle_code_tblsize = rle_code_tblsize + 1 + rle_codes[rle_code_tblsize] = len + rle_code_counts[len] = (rle_code_counts[len] or 0) + 1 + count = 0 + else + count = 1 + end + end + end + + return rle_codes, rle_extra_bits, rle_code_counts end -- Load the string into a table, in order to speed up LZ77. @@ -1135,18 +1182,18 @@ end -- @param offset str[index] will be loaded into t[index-offset] -- @return t local function LoadStringToTable(str, t, start, stop, offset) - local i = start - offset - while i <= stop - 15 - offset do - t[i], t[i+1], t[i+2], t[i+3], t[i+4], t[i+5], t[i+6], t[i+7], t[i+8], - t[i+9], t[i+10], t[i+11], t[i+12], t[i+13], t[i+14], t[i+15] = - string_byte(str, i + offset, i + 15 + offset) - i = i + 16 - end - while (i <= stop - offset) do - t[i] = string_byte(str, i + offset, i + offset) - i = i + 1 - end - return t + local i = start - offset + while i <= stop - 15 - offset do + t[i], t[i + 1], t[i + 2], t[i + 3], t[i + 4], t[i + 5], t[i + 6], t[i + 7], t[i + + 8], t[i + 9], t[i + 10], t[i + 11], t[i + 12], t[i + 13], t[i + 14], t[i + + 15] = string_byte(str, i + offset, i + 15 + offset) + i = i + 16 + end + while (i <= stop - offset) do + t[i] = string_byte(str, i + offset, i + offset) + i = i + 1 + end + return t end -- Do LZ77 process. This function uses the majority of the CPU time. @@ -1192,255 +1239,248 @@ end -- @return the extra bits of LZ77 distance deflate codes. -- @return the count of each LZ77 distance deflate code. local function GetBlockLZ77Result(level, string_table, hash_tables, block_start, - block_end, offset, dictionary) - local config = _compression_level_configs[level] - local config_use_lazy - , config_good_prev_length - , config_max_lazy_match - , config_nice_length - , config_max_hash_chain = - config[1], config[2], config[3], config[4], config[5] - - local config_max_insert_length = (not config_use_lazy) - and config_max_lazy_match or 2147483646 - local config_good_hash_chain = - (config_max_hash_chain-config_max_hash_chain%4/4) - - local hash - - local dict_hash_tables - local dict_string_table - local dict_string_len = 0 - - if dictionary then - dict_hash_tables = dictionary.hash_tables - dict_string_table = dictionary.string_table - dict_string_len = dictionary.strlen - assert(block_start == 1) - if block_end >= block_start and dict_string_len >= 2 then - hash = dict_string_table[dict_string_len-1]*65536 - + dict_string_table[dict_string_len]*256 + string_table[1] - local t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = -1 - end - if block_end >= block_start+1 and dict_string_len >= 1 then - hash = dict_string_table[dict_string_len]*65536 - + string_table[1]*256 + string_table[2] - local t = hash_tables[hash] - if not t then t = {}; hash_tables[hash] = t end - t[#t+1] = 0 - end - end - - local dict_string_len_plus3 = dict_string_len + 3 - - hash = (string_table[block_start-offset] or 0)*256 - + (string_table[block_start+1-offset] or 0) - - local lcodes = {} - local lcode_tblsize = 0 - local lcodes_counts = {} - local dcodes = {} - local dcodes_tblsize = 0 - local dcodes_counts = {} - - local lextra_bits = {} - local lextra_bits_tblsize = 0 - local dextra_bits = {} - local dextra_bits_tblsize = 0 - - local match_available = false - local prev_len - local prev_dist - local cur_len = 0 - local cur_dist = 0 - - local index = block_start - local index_end = block_end + (config_use_lazy and 1 or 0) - - -- the zlib source code writes separate code for lazy evaluation and - -- not lazy evaluation, which is easier to understand. - -- I put them together, so it is a bit harder to understand. - -- because I think this is easier for me to maintain it. - while (index <= index_end) do - local string_table_index = index - offset - local offset_minus_three = offset - 3 - prev_len = cur_len - prev_dist = cur_dist - cur_len = 0 - - hash = (hash*256+(string_table[string_table_index+2] or 0))%16777216 - - local chain_index - local cur_chain - local hash_chain = hash_tables[hash] - local chain_old_size - if not hash_chain then - chain_old_size = 0 - hash_chain = {} - hash_tables[hash] = hash_chain - if dict_hash_tables then - cur_chain = dict_hash_tables[hash] - chain_index = cur_chain and #cur_chain or 0 - else - chain_index = 0 - end - else - chain_old_size = #hash_chain - cur_chain = hash_chain - chain_index = chain_old_size - end - - if index <= block_end then - hash_chain[chain_old_size+1] = index - end - - if (chain_index > 0 and index + 2 <= block_end - and (not config_use_lazy or prev_len < config_max_lazy_match)) then - - local depth = - (config_use_lazy and prev_len >= config_good_prev_length) - and config_good_hash_chain or config_max_hash_chain - - local max_len_minus_one = block_end - index - max_len_minus_one = (max_len_minus_one >= 257) and 257 or max_len_minus_one - max_len_minus_one = max_len_minus_one + string_table_index - local string_table_index_plus_three = string_table_index + 3 - - while chain_index >= 1 and depth > 0 do - local prev = cur_chain[chain_index] - - if index - prev > 32768 then - break - end - if prev < index then - local sj = string_table_index_plus_three - - if prev >= -257 then - local pj = prev - offset_minus_three - while (sj <= max_len_minus_one - and string_table[pj] - == string_table[sj]) do - sj = sj + 1 - pj = pj + 1 - end - else - local pj = dict_string_len_plus3 + prev - while (sj <= max_len_minus_one - and dict_string_table[pj] - == string_table[sj]) do - sj = sj + 1 - pj = pj + 1 - end - end - local j = sj - string_table_index - if j > cur_len then - cur_len = j - cur_dist = index - prev - end - if cur_len >= config_nice_length then - break - end - end - - chain_index = chain_index - 1 - depth = depth - 1 - if chain_index == 0 and prev > 0 and dict_hash_tables then - cur_chain = dict_hash_tables[hash] - chain_index = cur_chain and #cur_chain or 0 - end - end - end - - if not config_use_lazy then - prev_len, prev_dist = cur_len, cur_dist - end - if ((not config_use_lazy or match_available) - and (prev_len > 3 or (prev_len == 3 and prev_dist < 4096)) - and cur_len <= prev_len )then - local code = _length_to_deflate_code[prev_len] - local length_extra_bits_bitlen = - _length_to_deflate_extra_bitlen[prev_len] - local dist_code, dist_extra_bits_bitlen, dist_extra_bits - if prev_dist <= 256 then -- have cached code for small distance. - dist_code = _dist256_to_deflate_code[prev_dist] - dist_extra_bits = _dist256_to_deflate_extra_bits[prev_dist] - dist_extra_bits_bitlen = - _dist256_to_deflate_extra_bitlen[prev_dist] - else - dist_code = 16 - dist_extra_bits_bitlen = 7 - local a = 384 - local b = 512 - - while true do - if prev_dist <= a then - dist_extra_bits = (prev_dist-(b/2)-1) % (b/4) - break - elseif prev_dist <= b then - dist_extra_bits = (prev_dist-(b/2)-1) % (b/4) - dist_code = dist_code + 1 - break - else - dist_code = dist_code + 2 - dist_extra_bits_bitlen = dist_extra_bits_bitlen + 1 - a = a*2 - b = b*2 - end - end - end - lcode_tblsize = lcode_tblsize + 1 - lcodes[lcode_tblsize] = code - lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 - - dcodes_tblsize = dcodes_tblsize + 1 - dcodes[dcodes_tblsize] = dist_code - dcodes_counts[dist_code] = (dcodes_counts[dist_code] or 0) + 1 - - if length_extra_bits_bitlen > 0 then - local lenExtraBits = _length_to_deflate_extra_bits[prev_len] - lextra_bits_tblsize = lextra_bits_tblsize + 1 - lextra_bits[lextra_bits_tblsize] = lenExtraBits - end - if dist_extra_bits_bitlen > 0 then - dextra_bits_tblsize = dextra_bits_tblsize + 1 - dextra_bits[dextra_bits_tblsize] = dist_extra_bits - end - - for i=index+1, index+prev_len-(config_use_lazy and 2 or 1) do - hash = (hash*256+(string_table[i-offset+2] or 0))%16777216 - if prev_len <= config_max_insert_length then - hash_chain = hash_tables[hash] - if not hash_chain then - hash_chain = {} - hash_tables[hash] = hash_chain - end - hash_chain[#hash_chain+1] = i - end - end - index = index + prev_len - (config_use_lazy and 1 or 0) - match_available = false - elseif (not config_use_lazy) or match_available then - local code = string_table[config_use_lazy - and (string_table_index-1) or string_table_index] - lcode_tblsize = lcode_tblsize + 1 - lcodes[lcode_tblsize] = code - lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 - index = index + 1 - else - match_available = true - index = index + 1 - end - end - - -- Write "end of block" symbol - lcode_tblsize = lcode_tblsize + 1 - lcodes[lcode_tblsize] = 256 - lcodes_counts[256] = (lcodes_counts[256] or 0) + 1 - - return lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits - , dcodes_counts + block_end, offset, dictionary) + local config = _compression_level_configs[level] + local config_use_lazy, config_good_prev_length, config_max_lazy_match, + config_nice_length, config_max_hash_chain = config[1], config[2], + config[3], config[4], + config[5] + + local config_max_insert_length = (not config_use_lazy) and + config_max_lazy_match or 2147483646 + local config_good_hash_chain = + (config_max_hash_chain - config_max_hash_chain % 4 / 4) + + local hash + + local dict_hash_tables + local dict_string_table + local dict_string_len = 0 + + if dictionary then + dict_hash_tables = dictionary.hash_tables + dict_string_table = dictionary.string_table + dict_string_len = dictionary.strlen + assert(block_start == 1) + if block_end >= block_start and dict_string_len >= 2 then + hash = dict_string_table[dict_string_len - 1] * 65536 + + dict_string_table[dict_string_len] * 256 + string_table[1] + local t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = -1 + end + if block_end >= block_start + 1 and dict_string_len >= 1 then + hash = + dict_string_table[dict_string_len] * 65536 + string_table[1] * 256 + + string_table[2] + local t = hash_tables[hash] + if not t then + t = {}; + hash_tables[hash] = t + end + t[#t + 1] = 0 + end + end + + local dict_string_len_plus3 = dict_string_len + 3 + + hash = (string_table[block_start - offset] or 0) * 256 + + (string_table[block_start + 1 - offset] or 0) + + local lcodes = {} + local lcode_tblsize = 0 + local lcodes_counts = {} + local dcodes = {} + local dcodes_tblsize = 0 + local dcodes_counts = {} + + local lextra_bits = {} + local lextra_bits_tblsize = 0 + local dextra_bits = {} + local dextra_bits_tblsize = 0 + + local match_available = false + local prev_len + local prev_dist + local cur_len = 0 + local cur_dist = 0 + + local index = block_start + local index_end = block_end + (config_use_lazy and 1 or 0) + + -- the zlib source code writes separate code for lazy evaluation and + -- not lazy evaluation, which is easier to understand. + -- I put them together, so it is a bit harder to understand. + -- because I think this is easier for me to maintain it. + while (index <= index_end) do + local string_table_index = index - offset + local offset_minus_three = offset - 3 + prev_len = cur_len + prev_dist = cur_dist + cur_len = 0 + + hash = (hash * 256 + (string_table[string_table_index + 2] or 0)) % 16777216 + + local chain_index + local cur_chain + local hash_chain = hash_tables[hash] + local chain_old_size + if not hash_chain then + chain_old_size = 0 + hash_chain = {} + hash_tables[hash] = hash_chain + if dict_hash_tables then + cur_chain = dict_hash_tables[hash] + chain_index = cur_chain and #cur_chain or 0 + else + chain_index = 0 + end + else + chain_old_size = #hash_chain + cur_chain = hash_chain + chain_index = chain_old_size + end + + if index <= block_end then hash_chain[chain_old_size + 1] = index end + + if (chain_index > 0 and index + 2 <= block_end and + (not config_use_lazy or prev_len < config_max_lazy_match)) then + + local depth = + (config_use_lazy and prev_len >= config_good_prev_length) and + config_good_hash_chain or config_max_hash_chain + + local max_len_minus_one = block_end - index + max_len_minus_one = (max_len_minus_one >= 257) and 257 or + max_len_minus_one + max_len_minus_one = max_len_minus_one + string_table_index + local string_table_index_plus_three = string_table_index + 3 + + while chain_index >= 1 and depth > 0 do + local prev = cur_chain[chain_index] + + if index - prev > 32768 then break end + if prev < index then + local sj = string_table_index_plus_three + + if prev >= -257 then + local pj = prev - offset_minus_three + while (sj <= max_len_minus_one and string_table[pj] == + string_table[sj]) do + sj = sj + 1 + pj = pj + 1 + end + else + local pj = dict_string_len_plus3 + prev + while (sj <= max_len_minus_one and dict_string_table[pj] == + string_table[sj]) do + sj = sj + 1 + pj = pj + 1 + end + end + local j = sj - string_table_index + if j > cur_len then + cur_len = j + cur_dist = index - prev + end + if cur_len >= config_nice_length then break end + end + + chain_index = chain_index - 1 + depth = depth - 1 + if chain_index == 0 and prev > 0 and dict_hash_tables then + cur_chain = dict_hash_tables[hash] + chain_index = cur_chain and #cur_chain or 0 + end + end + end + + if not config_use_lazy then prev_len, prev_dist = cur_len, cur_dist end + if ((not config_use_lazy or match_available) and + (prev_len > 3 or (prev_len == 3 and prev_dist < 4096)) and cur_len <= + prev_len) then + local code = _length_to_deflate_code[prev_len] + local length_extra_bits_bitlen = _length_to_deflate_extra_bitlen[prev_len] + local dist_code, dist_extra_bits_bitlen, dist_extra_bits + if prev_dist <= 256 then -- have cached code for small distance. + dist_code = _dist256_to_deflate_code[prev_dist] + dist_extra_bits = _dist256_to_deflate_extra_bits[prev_dist] + dist_extra_bits_bitlen = _dist256_to_deflate_extra_bitlen[prev_dist] + else + dist_code = 16 + dist_extra_bits_bitlen = 7 + local a = 384 + local b = 512 + + while true do + if prev_dist <= a then + dist_extra_bits = (prev_dist - (b / 2) - 1) % (b / 4) + break + elseif prev_dist <= b then + dist_extra_bits = (prev_dist - (b / 2) - 1) % (b / 4) + dist_code = dist_code + 1 + break + else + dist_code = dist_code + 2 + dist_extra_bits_bitlen = dist_extra_bits_bitlen + 1 + a = a * 2 + b = b * 2 + end + end + end + lcode_tblsize = lcode_tblsize + 1 + lcodes[lcode_tblsize] = code + lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 + + dcodes_tblsize = dcodes_tblsize + 1 + dcodes[dcodes_tblsize] = dist_code + dcodes_counts[dist_code] = (dcodes_counts[dist_code] or 0) + 1 + + if length_extra_bits_bitlen > 0 then + local lenExtraBits = _length_to_deflate_extra_bits[prev_len] + lextra_bits_tblsize = lextra_bits_tblsize + 1 + lextra_bits[lextra_bits_tblsize] = lenExtraBits + end + if dist_extra_bits_bitlen > 0 then + dextra_bits_tblsize = dextra_bits_tblsize + 1 + dextra_bits[dextra_bits_tblsize] = dist_extra_bits + end + + for i = index + 1, index + prev_len - (config_use_lazy and 2 or 1) do + hash = (hash * 256 + (string_table[i - offset + 2] or 0)) % 16777216 + if prev_len <= config_max_insert_length then + hash_chain = hash_tables[hash] + if not hash_chain then + hash_chain = {} + hash_tables[hash] = hash_chain + end + hash_chain[#hash_chain + 1] = i + end + end + index = index + prev_len - (config_use_lazy and 1 or 0) + match_available = false + elseif (not config_use_lazy) or match_available then + local code = string_table[config_use_lazy and (string_table_index - 1) or + string_table_index] + lcode_tblsize = lcode_tblsize + 1 + lcodes[lcode_tblsize] = code + lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 + index = index + 1 + else + match_available = true + index = index + 1 + end + end + + -- Write "end of block" symbol + lcode_tblsize = lcode_tblsize + 1 + lcodes[lcode_tblsize] = 256 + lcodes_counts[256] = (lcodes_counts[256] or 0) + 1 + + return lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits, dcodes_counts end -- Get the header data of dynamic block. @@ -1449,154 +1489,154 @@ end -- @return a lots of stuffs. -- @see RFC1951 Page 12 local function GetBlockDynamicHuffmanHeader(lcodes_counts, dcodes_counts) - local lcodes_huffman_bitlens, lcodes_huffman_codes - , max_non_zero_bitlen_lcode = - GetHuffmanBitlenAndCode(lcodes_counts, 15, 285) - local dcodes_huffman_bitlens, dcodes_huffman_codes - , max_non_zero_bitlen_dcode = - GetHuffmanBitlenAndCode(dcodes_counts, 15, 29) - - local rle_deflate_codes, rle_extra_bits, rle_codes_counts = - RunLengthEncodeHuffmanBitlen(lcodes_huffman_bitlens - ,max_non_zero_bitlen_lcode, dcodes_huffman_bitlens - , max_non_zero_bitlen_dcode) - - local rle_codes_huffman_bitlens, rle_codes_huffman_codes = - GetHuffmanBitlenAndCode(rle_codes_counts, 7, 18) - - local HCLEN = 0 - for i = 1, 19 do - local symbol = _rle_codes_huffman_bitlen_order[i] - local length = rle_codes_huffman_bitlens[symbol] or 0 - if length ~= 0 then - HCLEN = i - end - end - - HCLEN = HCLEN - 4 - local HLIT = max_non_zero_bitlen_lcode + 1 - 257 - local HDIST = max_non_zero_bitlen_dcode + 1 - 1 - if HDIST < 0 then HDIST = 0 end - - return HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens - , rle_codes_huffman_codes, rle_deflate_codes, rle_extra_bits - , lcodes_huffman_bitlens, lcodes_huffman_codes - , dcodes_huffman_bitlens, dcodes_huffman_codes + local lcodes_huffman_bitlens, lcodes_huffman_codes, max_non_zero_bitlen_lcode = + GetHuffmanBitlenAndCode(lcodes_counts, 15, 285) + local dcodes_huffman_bitlens, dcodes_huffman_codes, max_non_zero_bitlen_dcode = + GetHuffmanBitlenAndCode(dcodes_counts, 15, 29) + + local rle_deflate_codes, rle_extra_bits, rle_codes_counts = + RunLengthEncodeHuffmanBitlen(lcodes_huffman_bitlens, + max_non_zero_bitlen_lcode, + dcodes_huffman_bitlens, + max_non_zero_bitlen_dcode) + + local rle_codes_huffman_bitlens, rle_codes_huffman_codes = + GetHuffmanBitlenAndCode(rle_codes_counts, 7, 18) + + local HCLEN = 0 + for i = 1, 19 do + local symbol = _rle_codes_huffman_bitlen_order[i] + local length = rle_codes_huffman_bitlens[symbol] or 0 + if length ~= 0 then HCLEN = i end + end + + HCLEN = HCLEN - 4 + local HLIT = max_non_zero_bitlen_lcode + 1 - 257 + local HDIST = max_non_zero_bitlen_dcode + 1 - 1 + if HDIST < 0 then HDIST = 0 end + + return HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens, rle_codes_huffman_codes, + rle_deflate_codes, rle_extra_bits, lcodes_huffman_bitlens, + lcodes_huffman_codes, dcodes_huffman_bitlens, dcodes_huffman_codes end -- Get the size of dynamic block without writing any bits into the writer. -- @param ... Read the source code of GetBlockDynamicHuffmanHeader() -- @return the bit length of the dynamic block -local function GetDynamicHuffmanBlockSize(lcodes, dcodes, HCLEN - , rle_codes_huffman_bitlens, rle_deflate_codes - , lcodes_huffman_bitlens, dcodes_huffman_bitlens) - - local block_bitlen = 17 -- 1+2+5+5+4 - block_bitlen = block_bitlen + (HCLEN+4)*3 - - for i = 1, #rle_deflate_codes do - local code = rle_deflate_codes[i] - block_bitlen = block_bitlen + rle_codes_huffman_bitlens[code] - if code >= 16 then - block_bitlen = block_bitlen + - ((code == 16) and 2 or (code == 17 and 3 or 7)) - end - end - - local length_code_count = 0 - for i = 1, #lcodes do - local code = lcodes[i] - local huffman_bitlen = lcodes_huffman_bitlens[code] - block_bitlen = block_bitlen + huffman_bitlen - if code > 256 then -- Length code - length_code_count = length_code_count + 1 - if code > 264 and code < 285 then -- Length code with extra bits - local extra_bits_bitlen = - _literal_deflate_code_to_extra_bitlen[code-256] - block_bitlen = block_bitlen + extra_bits_bitlen - end - local dist_code = dcodes[length_code_count] - local dist_huffman_bitlen = dcodes_huffman_bitlens[dist_code] - block_bitlen = block_bitlen + dist_huffman_bitlen - - if dist_code > 3 then -- dist code with extra bits - local dist_extra_bits_bitlen = (dist_code-dist_code%2)/2 - 1 - block_bitlen = block_bitlen + dist_extra_bits_bitlen - end - end - end - return block_bitlen +local function GetDynamicHuffmanBlockSize(lcodes, dcodes, HCLEN, + rle_codes_huffman_bitlens, + rle_deflate_codes, + lcodes_huffman_bitlens, + dcodes_huffman_bitlens) + + local block_bitlen = 17 -- 1+2+5+5+4 + block_bitlen = block_bitlen + (HCLEN + 4) * 3 + + for i = 1, #rle_deflate_codes do + local code = rle_deflate_codes[i] + block_bitlen = block_bitlen + rle_codes_huffman_bitlens[code] + if code >= 16 then + block_bitlen = block_bitlen + + ((code == 16) and 2 or (code == 17 and 3 or 7)) + end + end + + local length_code_count = 0 + for i = 1, #lcodes do + local code = lcodes[i] + local huffman_bitlen = lcodes_huffman_bitlens[code] + block_bitlen = block_bitlen + huffman_bitlen + if code > 256 then -- Length code + length_code_count = length_code_count + 1 + if code > 264 and code < 285 then -- Length code with extra bits + local extra_bits_bitlen = _literal_deflate_code_to_extra_bitlen[code - + 256] + block_bitlen = block_bitlen + extra_bits_bitlen + end + local dist_code = dcodes[length_code_count] + local dist_huffman_bitlen = dcodes_huffman_bitlens[dist_code] + block_bitlen = block_bitlen + dist_huffman_bitlen + + if dist_code > 3 then -- dist code with extra bits + local dist_extra_bits_bitlen = (dist_code - dist_code % 2) / 2 - 1 + block_bitlen = block_bitlen + dist_extra_bits_bitlen + end + end + end + return block_bitlen end -- Write dynamic block. -- @param ... Read the source code of GetBlockDynamicHuffmanHeader() -local function CompressDynamicHuffmanBlock(WriteBits, is_last_block - , lcodes, lextra_bits, dcodes, dextra_bits, HLIT, HDIST, HCLEN - , rle_codes_huffman_bitlens, rle_codes_huffman_codes - , rle_deflate_codes, rle_extra_bits - , lcodes_huffman_bitlens, lcodes_huffman_codes - , dcodes_huffman_bitlens, dcodes_huffman_codes) - - WriteBits(is_last_block and 1 or 0, 1) -- Last block identifier - WriteBits(2, 2) -- Dynamic Huffman block identifier - - WriteBits(HLIT, 5) - WriteBits(HDIST, 5) - WriteBits(HCLEN, 4) - - for i = 1, HCLEN+4 do - local symbol = _rle_codes_huffman_bitlen_order[i] - local length = rle_codes_huffman_bitlens[symbol] or 0 - WriteBits(length, 3) - end - - local rleExtraBitsIndex = 1 - for i=1, #rle_deflate_codes do - local code = rle_deflate_codes[i] - WriteBits(rle_codes_huffman_codes[code] - , rle_codes_huffman_bitlens[code]) - if code >= 16 then - local extraBits = rle_extra_bits[rleExtraBitsIndex] - WriteBits(extraBits, (code == 16) and 2 or (code == 17 and 3 or 7)) - rleExtraBitsIndex = rleExtraBitsIndex + 1 - end - end - - local length_code_count = 0 - local length_code_with_extra_count = 0 - local dist_code_with_extra_count = 0 - - for i=1, #lcodes do - local deflate_codee = lcodes[i] - local huffman_code = lcodes_huffman_codes[deflate_codee] - local huffman_bitlen = lcodes_huffman_bitlens[deflate_codee] - WriteBits(huffman_code, huffman_bitlen) - if deflate_codee > 256 then -- Length code - length_code_count = length_code_count + 1 - if deflate_codee > 264 and deflate_codee < 285 then - -- Length code with extra bits - length_code_with_extra_count = length_code_with_extra_count + 1 - local extra_bits = lextra_bits[length_code_with_extra_count] - local extra_bits_bitlen = - _literal_deflate_code_to_extra_bitlen[deflate_codee-256] - WriteBits(extra_bits, extra_bits_bitlen) - end - -- Write distance code - local dist_deflate_code = dcodes[length_code_count] - local dist_huffman_code = dcodes_huffman_codes[dist_deflate_code] - local dist_huffman_bitlen = - dcodes_huffman_bitlens[dist_deflate_code] - WriteBits(dist_huffman_code, dist_huffman_bitlen) - - if dist_deflate_code > 3 then -- dist code with extra bits - dist_code_with_extra_count = dist_code_with_extra_count + 1 - local dist_extra_bits = dextra_bits[dist_code_with_extra_count] - local dist_extra_bits_bitlen = - (dist_deflate_code-dist_deflate_code%2)/2 - 1 - WriteBits(dist_extra_bits, dist_extra_bits_bitlen) - end - end - end +local function CompressDynamicHuffmanBlock(WriteBits, is_last_block, lcodes, + lextra_bits, dcodes, dextra_bits, + HLIT, HDIST, HCLEN, + rle_codes_huffman_bitlens, + rle_codes_huffman_codes, + rle_deflate_codes, rle_extra_bits, + lcodes_huffman_bitlens, + lcodes_huffman_codes, + dcodes_huffman_bitlens, + dcodes_huffman_codes) + + WriteBits(is_last_block and 1 or 0, 1) -- Last block identifier + WriteBits(2, 2) -- Dynamic Huffman block identifier + + WriteBits(HLIT, 5) + WriteBits(HDIST, 5) + WriteBits(HCLEN, 4) + + for i = 1, HCLEN + 4 do + local symbol = _rle_codes_huffman_bitlen_order[i] + local length = rle_codes_huffman_bitlens[symbol] or 0 + WriteBits(length, 3) + end + + local rleExtraBitsIndex = 1 + for i = 1, #rle_deflate_codes do + local code = rle_deflate_codes[i] + WriteBits(rle_codes_huffman_codes[code], rle_codes_huffman_bitlens[code]) + if code >= 16 then + local extraBits = rle_extra_bits[rleExtraBitsIndex] + WriteBits(extraBits, (code == 16) and 2 or (code == 17 and 3 or 7)) + rleExtraBitsIndex = rleExtraBitsIndex + 1 + end + end + + local length_code_count = 0 + local length_code_with_extra_count = 0 + local dist_code_with_extra_count = 0 + + for i = 1, #lcodes do + local deflate_codee = lcodes[i] + local huffman_code = lcodes_huffman_codes[deflate_codee] + local huffman_bitlen = lcodes_huffman_bitlens[deflate_codee] + WriteBits(huffman_code, huffman_bitlen) + if deflate_codee > 256 then -- Length code + length_code_count = length_code_count + 1 + if deflate_codee > 264 and deflate_codee < 285 then + -- Length code with extra bits + length_code_with_extra_count = length_code_with_extra_count + 1 + local extra_bits = lextra_bits[length_code_with_extra_count] + local extra_bits_bitlen = + _literal_deflate_code_to_extra_bitlen[deflate_codee - 256] + WriteBits(extra_bits, extra_bits_bitlen) + end + -- Write distance code + local dist_deflate_code = dcodes[length_code_count] + local dist_huffman_code = dcodes_huffman_codes[dist_deflate_code] + local dist_huffman_bitlen = dcodes_huffman_bitlens[dist_deflate_code] + WriteBits(dist_huffman_code, dist_huffman_bitlen) + + if dist_deflate_code > 3 then -- dist code with extra bits + dist_code_with_extra_count = dist_code_with_extra_count + 1 + local dist_extra_bits = dextra_bits[dist_code_with_extra_count] + local dist_extra_bits_bitlen = (dist_deflate_code - dist_deflate_code % + 2) / 2 - 1 + WriteBits(dist_extra_bits, dist_extra_bits_bitlen) + end + end + end end -- Get the size of fixed block without writing any bits into the writer. @@ -1604,70 +1644,69 @@ end -- @param decodes LZ77 distance deflate codes -- @return the bit length of the fixed block local function GetFixedHuffmanBlockSize(lcodes, dcodes) - local block_bitlen = 3 - local length_code_count = 0 - for i=1, #lcodes do - local code = lcodes[i] - local huffman_bitlen = _fix_block_literal_huffman_bitlen[code] - block_bitlen = block_bitlen + huffman_bitlen - if code > 256 then -- Length code - length_code_count = length_code_count + 1 - if code > 264 and code < 285 then -- Length code with extra bits - local extra_bits_bitlen = - _literal_deflate_code_to_extra_bitlen[code-256] - block_bitlen = block_bitlen + extra_bits_bitlen - end - local dist_code = dcodes[length_code_count] - block_bitlen = block_bitlen + 5 - - if dist_code > 3 then -- dist code with extra bits - local dist_extra_bits_bitlen = - (dist_code-dist_code%2)/2 - 1 - block_bitlen = block_bitlen + dist_extra_bits_bitlen - end - end - end - return block_bitlen + local block_bitlen = 3 + local length_code_count = 0 + for i = 1, #lcodes do + local code = lcodes[i] + local huffman_bitlen = _fix_block_literal_huffman_bitlen[code] + block_bitlen = block_bitlen + huffman_bitlen + if code > 256 then -- Length code + length_code_count = length_code_count + 1 + if code > 264 and code < 285 then -- Length code with extra bits + local extra_bits_bitlen = _literal_deflate_code_to_extra_bitlen[code - + 256] + block_bitlen = block_bitlen + extra_bits_bitlen + end + local dist_code = dcodes[length_code_count] + block_bitlen = block_bitlen + 5 + + if dist_code > 3 then -- dist code with extra bits + local dist_extra_bits_bitlen = (dist_code - dist_code % 2) / 2 - 1 + block_bitlen = block_bitlen + dist_extra_bits_bitlen + end + end + end + return block_bitlen end -- Write fixed block. -- @param lcodes literal/LZ77_length deflate codes -- @param decodes LZ77 distance deflate codes -local function CompressFixedHuffmanBlock(WriteBits, is_last_block, - lcodes, lextra_bits, dcodes, dextra_bits) - WriteBits(is_last_block and 1 or 0, 1) -- Last block identifier - WriteBits(1, 2) -- Fixed Huffman block identifier - local length_code_count = 0 - local length_code_with_extra_count = 0 - local dist_code_with_extra_count = 0 - for i=1, #lcodes do - local deflate_code = lcodes[i] - local huffman_code = _fix_block_literal_huffman_code[deflate_code] - local huffman_bitlen = _fix_block_literal_huffman_bitlen[deflate_code] - WriteBits(huffman_code, huffman_bitlen) - if deflate_code > 256 then -- Length code - length_code_count = length_code_count + 1 - if deflate_code > 264 and deflate_code < 285 then - -- Length code with extra bits - length_code_with_extra_count = length_code_with_extra_count + 1 - local extra_bits = lextra_bits[length_code_with_extra_count] - local extra_bits_bitlen = - _literal_deflate_code_to_extra_bitlen[deflate_code-256] - WriteBits(extra_bits, extra_bits_bitlen) - end - -- Write distance code - local dist_code = dcodes[length_code_count] - local dist_huffman_code = _fix_block_dist_huffman_code[dist_code] - WriteBits(dist_huffman_code, 5) - - if dist_code > 3 then -- dist code with extra bits - dist_code_with_extra_count = dist_code_with_extra_count + 1 - local dist_extra_bits = dextra_bits[dist_code_with_extra_count] - local dist_extra_bits_bitlen = (dist_code-dist_code%2)/2 - 1 - WriteBits(dist_extra_bits, dist_extra_bits_bitlen) - end - end - end +local function CompressFixedHuffmanBlock(WriteBits, is_last_block, lcodes, + lextra_bits, dcodes, dextra_bits) + WriteBits(is_last_block and 1 or 0, 1) -- Last block identifier + WriteBits(1, 2) -- Fixed Huffman block identifier + local length_code_count = 0 + local length_code_with_extra_count = 0 + local dist_code_with_extra_count = 0 + for i = 1, #lcodes do + local deflate_code = lcodes[i] + local huffman_code = _fix_block_literal_huffman_code[deflate_code] + local huffman_bitlen = _fix_block_literal_huffman_bitlen[deflate_code] + WriteBits(huffman_code, huffman_bitlen) + if deflate_code > 256 then -- Length code + length_code_count = length_code_count + 1 + if deflate_code > 264 and deflate_code < 285 then + -- Length code with extra bits + length_code_with_extra_count = length_code_with_extra_count + 1 + local extra_bits = lextra_bits[length_code_with_extra_count] + local extra_bits_bitlen = + _literal_deflate_code_to_extra_bitlen[deflate_code - 256] + WriteBits(extra_bits, extra_bits_bitlen) + end + -- Write distance code + local dist_code = dcodes[length_code_count] + local dist_huffman_code = _fix_block_dist_huffman_code[dist_code] + WriteBits(dist_huffman_code, 5) + + if dist_code > 3 then -- dist code with extra bits + dist_code_with_extra_count = dist_code_with_extra_count + 1 + local dist_extra_bits = dextra_bits[dist_code_with_extra_count] + local dist_extra_bits_bitlen = (dist_code - dist_code % 2) / 2 - 1 + WriteBits(dist_extra_bits, dist_extra_bits_bitlen) + end + end + end end -- Get the size of store block without writing any bits into the writer. @@ -1677,37 +1716,37 @@ end -- because store block needs to shift to byte boundary. -- @return the bit length of the fixed block local function GetStoreBlockSize(block_start, block_end, total_bitlen) - assert(block_end-block_start+1 <= 65535) - local block_bitlen = 3 - total_bitlen = total_bitlen + 3 - local padding_bitlen = (8-total_bitlen%8)%8 - block_bitlen = block_bitlen + padding_bitlen - block_bitlen = block_bitlen + 32 - block_bitlen = block_bitlen + (block_end - block_start + 1) * 8 - return block_bitlen + assert(block_end - block_start + 1 <= 65535) + local block_bitlen = 3 + total_bitlen = total_bitlen + 3 + local padding_bitlen = (8 - total_bitlen % 8) % 8 + block_bitlen = block_bitlen + padding_bitlen + block_bitlen = block_bitlen + 32 + block_bitlen = block_bitlen + (block_end - block_start + 1) * 8 + return block_bitlen end -- Write the store block. -- @param ... lots of stuffs -- @return nil -local function CompressStoreBlock(WriteBits, WriteString, is_last_block, str - , block_start, block_end, total_bitlen) - assert(block_end-block_start+1 <= 65535) - WriteBits(is_last_block and 1 or 0, 1) -- Last block identifer. - WriteBits(0, 2) -- Store block identifier. - total_bitlen = total_bitlen + 3 - local padding_bitlen = (8-total_bitlen%8)%8 - if padding_bitlen > 0 then - WriteBits(_pow2[padding_bitlen]-1, padding_bitlen) - end - local size = block_end - block_start + 1 - WriteBits(size, 16) - - -- Write size's one's complement - local comp = (255 - size % 256) + (255 - (size-size%256)/256)*256 - WriteBits(comp, 16) - - WriteString(str:sub(block_start, block_end)) +local function CompressStoreBlock(WriteBits, WriteString, is_last_block, str, + block_start, block_end, total_bitlen) + assert(block_end - block_start + 1 <= 65535) + WriteBits(is_last_block and 1 or 0, 1) -- Last block identifer. + WriteBits(0, 2) -- Store block identifier. + total_bitlen = total_bitlen + 3 + local padding_bitlen = (8 - total_bitlen % 8) % 8 + if padding_bitlen > 0 then + WriteBits(_pow2[padding_bitlen] - 1, padding_bitlen) + end + local size = block_end - block_start + 1 + WriteBits(size, 16) + + -- Write size's one's complement + local comp = (255 - size % 256) + (255 - (size - size % 256) / 256) * 256 + WriteBits(comp, 16) + + WriteString(str:sub(block_start, block_end)) end -- Do the deflate @@ -1721,195 +1760,188 @@ end -- 64KB, then memory cleanup won't happen. -- This function determines whether to use store/fixed/dynamic blocks by -- calculating the block size of each block type and chooses the smallest one. -local function Deflate(configs, WriteBits, WriteString, FlushWriter, str - , dictionary) - local string_table = {} - local hash_tables = {} - local is_last_block = nil - local block_start - local block_end - local bitlen_written - local total_bitlen = FlushWriter(_FLUSH_MODE_NO_FLUSH) - local strlen = #str - local offset - - local level - local strategy - if configs then - if configs.level then - level = configs.level - end - if configs.strategy then - strategy = configs.strategy - end - end - - if not level then - if strlen < 2048 then - level = 7 - elseif strlen > 65536 then - level = 3 - else - level = 5 - end - end - - while not is_last_block do - if not block_start then - block_start = 1 - block_end = 64*1024 - 1 - offset = 0 - else - block_start = block_end + 1 - block_end = block_end + 32*1024 - offset = block_start - 32*1024 - 1 - end - - if block_end >= strlen then - block_end = strlen - is_last_block = true - else - is_last_block = false - end - - local lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits - , dcodes_counts - - local HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens - , rle_codes_huffman_codes, rle_deflate_codes - , rle_extra_bits, lcodes_huffman_bitlens, lcodes_huffman_codes - , dcodes_huffman_bitlens, dcodes_huffman_codes - - local dynamic_block_bitlen - local fixed_block_bitlen - local store_block_bitlen - - if level ~= 0 then - - -- GetBlockLZ77 needs block_start to block_end+3 to be loaded. - LoadStringToTable(str, string_table, block_start, block_end + 3 - , offset) - if block_start == 1 and dictionary then - local dict_string_table = dictionary.string_table - local dict_strlen = dictionary.strlen - for i=0, (-dict_strlen+1)<-257 - and -257 or (-dict_strlen+1), -1 do - string_table[i] = dict_string_table[dict_strlen+i] - end - end - - if strategy == "huffman_only" then - lcodes = {} - LoadStringToTable(str, lcodes, block_start, block_end - , block_start-1) - lextra_bits = {} - lcodes_counts = {} - lcodes[block_end - block_start+2] = 256 -- end of block - for i=1, block_end - block_start+2 do - local code = lcodes[i] - lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 - end - dcodes = {} - dextra_bits = {} - dcodes_counts = {} - else - lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits - , dcodes_counts = GetBlockLZ77Result(level, string_table - , hash_tables, block_start, block_end, offset, dictionary - ) - end - - HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens - , rle_codes_huffman_codes, rle_deflate_codes - , rle_extra_bits, lcodes_huffman_bitlens, lcodes_huffman_codes - , dcodes_huffman_bitlens, dcodes_huffman_codes = - GetBlockDynamicHuffmanHeader(lcodes_counts, dcodes_counts) - dynamic_block_bitlen = GetDynamicHuffmanBlockSize( - lcodes, dcodes, HCLEN, rle_codes_huffman_bitlens - , rle_deflate_codes, lcodes_huffman_bitlens - , dcodes_huffman_bitlens) - fixed_block_bitlen = GetFixedHuffmanBlockSize(lcodes, dcodes) - end - - store_block_bitlen = GetStoreBlockSize(block_start, block_end - , total_bitlen) - - local min_bitlen = store_block_bitlen - min_bitlen = (fixed_block_bitlen and fixed_block_bitlen < min_bitlen) - and fixed_block_bitlen or min_bitlen - min_bitlen = (dynamic_block_bitlen - and dynamic_block_bitlen < min_bitlen) - and dynamic_block_bitlen or min_bitlen - - if level == 0 or (strategy ~= "fixed" and strategy ~= "dynamic" and - store_block_bitlen == min_bitlen) then - CompressStoreBlock(WriteBits, WriteString, is_last_block - , str, block_start, block_end, total_bitlen) - total_bitlen = total_bitlen + store_block_bitlen - elseif strategy ~= "dynamic" and ( - strategy == "fixed" or fixed_block_bitlen == min_bitlen) then - CompressFixedHuffmanBlock(WriteBits, is_last_block, - lcodes, lextra_bits, dcodes, dextra_bits) - total_bitlen = total_bitlen + fixed_block_bitlen - elseif strategy == "dynamic" or dynamic_block_bitlen == min_bitlen then - CompressDynamicHuffmanBlock(WriteBits, is_last_block, lcodes - , lextra_bits, dcodes, dextra_bits, HLIT, HDIST, HCLEN - , rle_codes_huffman_bitlens, rle_codes_huffman_codes - , rle_deflate_codes, rle_extra_bits - , lcodes_huffman_bitlens, lcodes_huffman_codes - , dcodes_huffman_bitlens, dcodes_huffman_codes) - total_bitlen = total_bitlen + dynamic_block_bitlen - end - - if is_last_block then - bitlen_written = FlushWriter(_FLUSH_MODE_NO_FLUSH) - else - bitlen_written = FlushWriter(_FLUSH_MODE_MEMORY_CLEANUP) - end - - assert(bitlen_written == total_bitlen) - - -- Memory clean up, so memory consumption does not always grow linearly - -- , even if input string is > 64K. - -- Not a very efficient operation, but this operation won't happen - -- when the input data size is less than 64K. - if not is_last_block then - local j - if dictionary and block_start == 1 then - j = 0 - while (string_table[j]) do - string_table[j] = nil - j = j - 1 - end - end - dictionary = nil - j = 1 - for i = block_end-32767, block_end do - string_table[j] = string_table[i-offset] - j = j + 1 - end - - for k, t in pairs(hash_tables) do - local tSize = #t - if tSize > 0 and block_end+1 - t[1] > 32768 then - if tSize == 1 then - hash_tables[k] = nil - else - local new = {} - local newSize = 0 - for i = 2, tSize do - j = t[i] - if block_end+1 - j <= 32768 then - newSize = newSize + 1 - new[newSize] = j - end - end - hash_tables[k] = new - end - end - end - end - end +local function Deflate(configs, WriteBits, WriteString, FlushWriter, str, + dictionary) + local string_table = {} + local hash_tables = {} + local is_last_block = nil + local block_start + local block_end + local bitlen_written + local total_bitlen = FlushWriter(_FLUSH_MODE_NO_FLUSH) + local strlen = #str + local offset + + local level + local strategy + if configs then + if configs.level then level = configs.level end + if configs.strategy then strategy = configs.strategy end + end + + if not level then + if strlen < 2048 then + level = 7 + elseif strlen > 65536 then + level = 3 + else + level = 5 + end + end + + while not is_last_block do + if not block_start then + block_start = 1 + block_end = 64 * 1024 - 1 + offset = 0 + else + block_start = block_end + 1 + block_end = block_end + 32 * 1024 + offset = block_start - 32 * 1024 - 1 + end + + if block_end >= strlen then + block_end = strlen + is_last_block = true + else + is_last_block = false + end + + local lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits, dcodes_counts + + local HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens, + rle_codes_huffman_codes, rle_deflate_codes, rle_extra_bits, + lcodes_huffman_bitlens, lcodes_huffman_codes, dcodes_huffman_bitlens, + dcodes_huffman_codes + + local dynamic_block_bitlen + local fixed_block_bitlen + local store_block_bitlen + + if level ~= 0 then + + -- GetBlockLZ77 needs block_start to block_end+3 to be loaded. + LoadStringToTable(str, string_table, block_start, block_end + 3, offset) + if block_start == 1 and dictionary then + local dict_string_table = dictionary.string_table + local dict_strlen = dictionary.strlen + for i = 0, (-dict_strlen + 1) < -257 and -257 or (-dict_strlen + 1), -1 do + string_table[i] = dict_string_table[dict_strlen + i] + end + end + + if strategy == "huffman_only" then + lcodes = {} + LoadStringToTable(str, lcodes, block_start, block_end, block_start - 1) + lextra_bits = {} + lcodes_counts = {} + lcodes[block_end - block_start + 2] = 256 -- end of block + for i = 1, block_end - block_start + 2 do + local code = lcodes[i] + lcodes_counts[code] = (lcodes_counts[code] or 0) + 1 + end + dcodes = {} + dextra_bits = {} + dcodes_counts = {} + else + lcodes, lextra_bits, lcodes_counts, dcodes, dextra_bits, dcodes_counts = + GetBlockLZ77Result(level, string_table, hash_tables, block_start, + block_end, offset, dictionary) + end + + -- LuaFormatter off + HLIT, HDIST, HCLEN, rle_codes_huffman_bitlens, rle_codes_huffman_codes, rle_deflate_codes, + rle_extra_bits, lcodes_huffman_bitlens, lcodes_huffman_codes, dcodes_huffman_bitlens, dcodes_huffman_codes = + -- LuaFormatter on + GetBlockDynamicHuffmanHeader(lcodes_counts, dcodes_counts) + dynamic_block_bitlen = GetDynamicHuffmanBlockSize(lcodes, dcodes, HCLEN, + rle_codes_huffman_bitlens, + rle_deflate_codes, + lcodes_huffman_bitlens, + dcodes_huffman_bitlens) + fixed_block_bitlen = GetFixedHuffmanBlockSize(lcodes, dcodes) + end + + store_block_bitlen = GetStoreBlockSize(block_start, block_end, total_bitlen) + + local min_bitlen = store_block_bitlen + min_bitlen = (fixed_block_bitlen and fixed_block_bitlen < min_bitlen) and + fixed_block_bitlen or min_bitlen + min_bitlen = + (dynamic_block_bitlen and dynamic_block_bitlen < min_bitlen) and + dynamic_block_bitlen or min_bitlen + + if level == 0 or + (strategy ~= "fixed" and strategy ~= "dynamic" and store_block_bitlen == + min_bitlen) then + CompressStoreBlock(WriteBits, WriteString, is_last_block, str, + block_start, block_end, total_bitlen) + total_bitlen = total_bitlen + store_block_bitlen + elseif strategy ~= "dynamic" and + (strategy == "fixed" or fixed_block_bitlen == min_bitlen) then + CompressFixedHuffmanBlock(WriteBits, is_last_block, lcodes, lextra_bits, + dcodes, dextra_bits) + total_bitlen = total_bitlen + fixed_block_bitlen + elseif strategy == "dynamic" or dynamic_block_bitlen == min_bitlen then + CompressDynamicHuffmanBlock(WriteBits, is_last_block, lcodes, lextra_bits, + dcodes, dextra_bits, HLIT, HDIST, HCLEN, + rle_codes_huffman_bitlens, + rle_codes_huffman_codes, rle_deflate_codes, + rle_extra_bits, lcodes_huffman_bitlens, + lcodes_huffman_codes, dcodes_huffman_bitlens, + dcodes_huffman_codes) + total_bitlen = total_bitlen + dynamic_block_bitlen + end + + if is_last_block then + bitlen_written = FlushWriter(_FLUSH_MODE_NO_FLUSH) + else + bitlen_written = FlushWriter(_FLUSH_MODE_MEMORY_CLEANUP) + end + + assert(bitlen_written == total_bitlen) + + -- Memory clean up, so memory consumption does not always grow linearly + -- , even if input string is > 64K. + -- Not a very efficient operation, but this operation won't happen + -- when the input data size is less than 64K. + if not is_last_block then + local j + if dictionary and block_start == 1 then + j = 0 + while (string_table[j]) do + string_table[j] = nil + j = j - 1 + end + end + dictionary = nil + j = 1 + for i = block_end - 32767, block_end do + string_table[j] = string_table[i - offset] + j = j + 1 + end + + for k, t in pairs(hash_tables) do + local tSize = #t + if tSize > 0 and block_end + 1 - t[1] > 32768 then + if tSize == 1 then + hash_tables[k] = nil + else + local new = {} + local newSize = 0 + for i = 2, tSize do + j = t[i] + if block_end + 1 - j <= 32768 then + newSize = newSize + 1 + new[newSize] = j + end + end + hash_tables[k] = new + end + end + end + end + end end --- The description to compression configuration table.
@@ -1923,73 +1955,72 @@ end -- compression block. "dynamic" to only use dynamic block. "huffman_only" to -- do no LZ77 compression. Only do huffman compression. - -- @see LibDeflate:CompressDeflate(str, configs) -- @see LibDeflate:CompressDeflateWithDict(str, dictionary, configs) local function CompressDeflateInternal(str, dictionary, configs) - local WriteBits, WriteString, FlushWriter = CreateWriter() - Deflate(configs, WriteBits, WriteString, FlushWriter, str, dictionary) - local total_bitlen, result = FlushWriter(_FLUSH_MODE_OUTPUT) - local padding_bitlen = (8-total_bitlen%8)%8 - return result, padding_bitlen + local WriteBits, WriteString, FlushWriter = CreateWriter() + Deflate(configs, WriteBits, WriteString, FlushWriter, str, dictionary) + local total_bitlen, result = FlushWriter(_FLUSH_MODE_OUTPUT) + local padding_bitlen = (8 - total_bitlen % 8) % 8 + return result, padding_bitlen end -- @see LibDeflate:CompressZlib -- @see LibDeflate:CompressZlibWithDict local function CompressZlibInternal(str, dictionary, configs) - local WriteBits, WriteString, FlushWriter = CreateWriter() - - local CM = 8 -- Compression method - local CINFO = 7 --Window Size = 32K - local CMF = CINFO*16+CM - WriteBits(CMF, 8) - - local FDIST = dictionary and 1 or 0 - local FLEVEL = 2 -- Default compression - local FLG = FLEVEL*64+FDIST*32 - local FCHECK = (31-(CMF*256+FLG)%31) - -- The FCHECK value must be such that CMF and FLG, - -- when viewed as a 16-bit unsigned integer stored - -- in MSB order (CMF*256 + FLG), is a multiple of 31. - FLG = FLG + FCHECK - WriteBits(FLG, 8) - - if FDIST == 1 then - local adler32 = dictionary.adler32 - local byte0 = adler32 % 256 - adler32 = (adler32 - byte0) / 256 - local byte1 = adler32 % 256 - adler32 = (adler32 - byte1) / 256 - local byte2 = adler32 % 256 - adler32 = (adler32 - byte2) / 256 - local byte3 = adler32 % 256 - WriteBits(byte3, 8) - WriteBits(byte2, 8) - WriteBits(byte1, 8) - WriteBits(byte0, 8) - end - - Deflate(configs, WriteBits, WriteString, FlushWriter, str, dictionary) - FlushWriter(_FLUSH_MODE_BYTE_BOUNDARY) - - local adler32 = LibDeflate:Adler32(str) - - -- Most significant byte first - local byte3 = adler32%256 - adler32 = (adler32 - byte3) / 256 - local byte2 = adler32%256 - adler32 = (adler32 - byte2) / 256 - local byte1 = adler32%256 - adler32 = (adler32 - byte1) / 256 - local byte0 = adler32%256 - - WriteBits(byte0, 8) - WriteBits(byte1, 8) - WriteBits(byte2, 8) - WriteBits(byte3, 8) - local total_bitlen, result = FlushWriter(_FLUSH_MODE_OUTPUT) - local padding_bitlen = (8-total_bitlen%8)%8 - return result, padding_bitlen + local WriteBits, WriteString, FlushWriter = CreateWriter() + + local CM = 8 -- Compression method + local CINFO = 7 -- Window Size = 32K + local CMF = CINFO * 16 + CM + WriteBits(CMF, 8) + + local FDIST = dictionary and 1 or 0 + local FLEVEL = 2 -- Default compression + local FLG = FLEVEL * 64 + FDIST * 32 + local FCHECK = (31 - (CMF * 256 + FLG) % 31) + -- The FCHECK value must be such that CMF and FLG, + -- when viewed as a 16-bit unsigned integer stored + -- in MSB order (CMF*256 + FLG), is a multiple of 31. + FLG = FLG + FCHECK + WriteBits(FLG, 8) + + if FDIST == 1 then + local adler32 = dictionary.adler32 + local byte0 = adler32 % 256 + adler32 = (adler32 - byte0) / 256 + local byte1 = adler32 % 256 + adler32 = (adler32 - byte1) / 256 + local byte2 = adler32 % 256 + adler32 = (adler32 - byte2) / 256 + local byte3 = adler32 % 256 + WriteBits(byte3, 8) + WriteBits(byte2, 8) + WriteBits(byte1, 8) + WriteBits(byte0, 8) + end + + Deflate(configs, WriteBits, WriteString, FlushWriter, str, dictionary) + FlushWriter(_FLUSH_MODE_BYTE_BOUNDARY) + + local adler32 = LibDeflate:Adler32(str) + + -- Most significant byte first + local byte3 = adler32 % 256 + adler32 = (adler32 - byte3) / 256 + local byte2 = adler32 % 256 + adler32 = (adler32 - byte2) / 256 + local byte1 = adler32 % 256 + adler32 = (adler32 - byte1) / 256 + local byte0 = adler32 % 256 + + WriteBits(byte0, 8) + WriteBits(byte1, 8) + WriteBits(byte2, 8) + WriteBits(byte3, 8) + local total_bitlen, result = FlushWriter(_FLUSH_MODE_OUTPUT) + local padding_bitlen = (8 - total_bitlen % 8) % 8 + return result, padding_bitlen end --- Compress using the raw deflate format. @@ -2006,12 +2037,11 @@ end -- @see compression_configs -- @see LibDeflate:DecompressDeflate function LibDeflate:CompressDeflate(str, configs) - local arg_valid, arg_err = IsValidArguments(str, false, nil, true, configs) - if not arg_valid then - error(("Usage: LibDeflate:CompressDeflate(str, configs): " - ..arg_err), 2) - end - return CompressDeflateInternal(str, nil, configs) + local arg_valid, arg_err = IsValidArguments(str, false, nil, true, configs) + if not arg_valid then + error(("Usage: LibDeflate:CompressDeflate(str, configs): " .. arg_err), 2) + end + return CompressDeflateInternal(str, nil, configs) end --- Compress using the raw deflate format with a preset dictionary. @@ -2031,14 +2061,13 @@ end -- @see LibDeflate:CreateDictionary -- @see LibDeflate:DecompressDeflateWithDict function LibDeflate:CompressDeflateWithDict(str, dictionary, configs) - local arg_valid, arg_err = IsValidArguments(str, true, dictionary - , true, configs) - if not arg_valid then - error(("Usage: LibDeflate:CompressDeflateWithDict" - .."(str, dictionary, configs): " - ..arg_err), 2) - end - return CompressDeflateInternal(str, dictionary, configs) + local arg_valid, arg_err = IsValidArguments(str, true, dictionary, true, + configs) + if not arg_valid then + error(("Usage: LibDeflate:CompressDeflateWithDict" .. + "(str, dictionary, configs): " .. arg_err), 2) + end + return CompressDeflateInternal(str, dictionary, configs) end --- Compress using the zlib format. @@ -2052,12 +2081,11 @@ end -- @see compression_configs -- @see LibDeflate:DecompressZlib function LibDeflate:CompressZlib(str, configs) - local arg_valid, arg_err = IsValidArguments(str, false, nil, true, configs) - if not arg_valid then - error(("Usage: LibDeflate:CompressZlib(str, configs): " - ..arg_err), 2) - end - return CompressZlibInternal(str, nil, configs) + local arg_valid, arg_err = IsValidArguments(str, false, nil, true, configs) + if not arg_valid then + error(("Usage: LibDeflate:CompressZlib(str, configs): " .. arg_err), 2) + end + return CompressZlibInternal(str, nil, configs) end --- Compress using the zlib format with a preset dictionary. @@ -2074,14 +2102,13 @@ end -- @see LibDeflate:CreateDictionary -- @see LibDeflate:DecompressZlibWithDict function LibDeflate:CompressZlibWithDict(str, dictionary, configs) - local arg_valid, arg_err = IsValidArguments(str, true, dictionary - , true, configs) - if not arg_valid then - error(("Usage: LibDeflate:CompressZlibWithDict" - .."(str, dictionary, configs): " - ..arg_err), 2) - end - return CompressZlibInternal(str, dictionary, configs) + local arg_valid, arg_err = IsValidArguments(str, true, dictionary, true, + configs) + if not arg_valid then + error(("Usage: LibDeflate:CompressZlibWithDict" .. + "(str, dictionary, configs): " .. arg_err), 2) + end + return CompressZlibInternal(str, dictionary, configs) end --[[ -------------------------------------------------------------------------- @@ -2098,152 +2125,148 @@ end 5. SkipToByteBoundary() --]] local function CreateReader(input_string) - local input = input_string - local input_strlen = #input_string - local input_next_byte_pos = 1 - local cache_bitlen = 0 - local cache = 0 - - -- Read some bits. - -- To improve speed, this function does not - -- check if the input has been exhausted. - -- Use ReaderBitlenLeft() < 0 to check it. - -- @param bitlen the number of bits to read - -- @return the data is read. - local function ReadBits(bitlen) - local rshift_mask = _pow2[bitlen] - local code - if bitlen <= cache_bitlen then - code = cache % rshift_mask - cache = (cache - code) / rshift_mask - cache_bitlen = cache_bitlen - bitlen - else -- Whether input has been exhausted is not checked. - local lshift_mask = _pow2[cache_bitlen] - local byte1, byte2, byte3, byte4 = string_byte(input - , input_next_byte_pos, input_next_byte_pos+3) - -- This requires lua number to be at least double () - cache = cache + ((byte1 or 0)+(byte2 or 0)*256 - + (byte3 or 0)*65536+(byte4 or 0)*16777216)*lshift_mask - input_next_byte_pos = input_next_byte_pos + 4 - cache_bitlen = cache_bitlen + 32 - bitlen - code = cache % rshift_mask - cache = (cache - code) / rshift_mask - end - return code - end - - -- Read some bytes from the reader. - -- Assume reader is on the byte boundary. - -- @param bytelen The number of bytes to be read. - -- @param buffer The byte read will be stored into this buffer. - -- @param buffer_size The buffer will be modified starting from - -- buffer[buffer_size+1], ending at buffer[buffer_size+bytelen-1] - -- @return the new buffer_size - local function ReadBytes(bytelen, buffer, buffer_size) - assert(cache_bitlen % 8 == 0) - - local byte_from_cache = (cache_bitlen/8 < bytelen) - and (cache_bitlen/8) or bytelen - for _=1, byte_from_cache do - local byte = cache % 256 - buffer_size = buffer_size + 1 - buffer[buffer_size] = string_char(byte) - cache = (cache - byte) / 256 - end - cache_bitlen = cache_bitlen - byte_from_cache*8 - bytelen = bytelen - byte_from_cache - if (input_strlen - input_next_byte_pos - bytelen + 1) * 8 - + cache_bitlen < 0 then - return -1 -- out of input - end - for i=input_next_byte_pos, input_next_byte_pos+bytelen-1 do - buffer_size = buffer_size + 1 - buffer[buffer_size] = string_sub(input, i, i) - end - - input_next_byte_pos = input_next_byte_pos + bytelen - return buffer_size - end - - -- Decode huffman code - -- To improve speed, this function does not check - -- if the input has been exhausted. - -- Use ReaderBitlenLeft() < 0 to check it. - -- Credits for Mark Adler. This code is from puff:Decode() - -- @see puff:Decode(...) - -- @param huffman_bitlen_count - -- @param huffman_symbol - -- @param min_bitlen The minimum huffman bit length of all symbols - -- @return The decoded deflate code. - -- Negative value is returned if decoding fails. - local function Decode(huffman_bitlen_counts, huffman_symbols, min_bitlen) - local code = 0 - local first = 0 - local index = 0 - local count - if min_bitlen > 0 then - if cache_bitlen < 15 and input then - local lshift_mask = _pow2[cache_bitlen] - local byte1, byte2, byte3, byte4 = - string_byte(input, input_next_byte_pos - , input_next_byte_pos+3) - -- This requires lua number to be at least double () - cache = cache + ((byte1 or 0)+(byte2 or 0)*256 - +(byte3 or 0)*65536+(byte4 or 0)*16777216)*lshift_mask - input_next_byte_pos = input_next_byte_pos + 4 - cache_bitlen = cache_bitlen + 32 - end - - local rshift_mask = _pow2[min_bitlen] - cache_bitlen = cache_bitlen - min_bitlen - code = cache % rshift_mask - cache = (cache - code) / rshift_mask - -- Reverse the bits - code = _reverse_bits_tbl[min_bitlen][code] - - count = huffman_bitlen_counts[min_bitlen] - if code < count then - return huffman_symbols[code] - end - index = count - first = count * 2 - code = code * 2 - end - - for bitlen = min_bitlen+1, 15 do - local bit - bit = cache % 2 - cache = (cache - bit) / 2 - cache_bitlen = cache_bitlen - 1 - - code = (bit==1) and (code + 1 - code % 2) or code - count = huffman_bitlen_counts[bitlen] or 0 - local diff = code - first - if diff < count then - return huffman_symbols[index + diff] - end - index = index + count - first = first + count - first = first * 2 - code = code * 2 - end - -- invalid literal/length or distance code - -- in fixed or dynamic block (run out of code) - return -10 - end - - local function ReaderBitlenLeft() - return (input_strlen - input_next_byte_pos + 1) * 8 + cache_bitlen - end - - local function SkipToByteBoundary() - local skipped_bitlen = cache_bitlen%8 - local rshift_mask = _pow2[skipped_bitlen] - cache_bitlen = cache_bitlen - skipped_bitlen - cache = (cache - cache % rshift_mask) / rshift_mask - end - - return ReadBits, ReadBytes, Decode, ReaderBitlenLeft, SkipToByteBoundary + local input = input_string + local input_strlen = #input_string + local input_next_byte_pos = 1 + local cache_bitlen = 0 + local cache = 0 + + -- Read some bits. + -- To improve speed, this function does not + -- check if the input has been exhausted. + -- Use ReaderBitlenLeft() < 0 to check it. + -- @param bitlen the number of bits to read + -- @return the data is read. + local function ReadBits(bitlen) + local rshift_mask = _pow2[bitlen] + local code + if bitlen <= cache_bitlen then + code = cache % rshift_mask + cache = (cache - code) / rshift_mask + cache_bitlen = cache_bitlen - bitlen + else -- Whether input has been exhausted is not checked. + local lshift_mask = _pow2[cache_bitlen] + local byte1, byte2, byte3, byte4 = + string_byte(input, input_next_byte_pos, input_next_byte_pos + 3) + -- This requires lua number to be at least double () + cache = cache + + ((byte1 or 0) + (byte2 or 0) * 256 + (byte3 or 0) * 65536 + + (byte4 or 0) * 16777216) * lshift_mask + input_next_byte_pos = input_next_byte_pos + 4 + cache_bitlen = cache_bitlen + 32 - bitlen + code = cache % rshift_mask + cache = (cache - code) / rshift_mask + end + return code + end + + -- Read some bytes from the reader. + -- Assume reader is on the byte boundary. + -- @param bytelen The number of bytes to be read. + -- @param buffer The byte read will be stored into this buffer. + -- @param buffer_size The buffer will be modified starting from + -- buffer[buffer_size+1], ending at buffer[buffer_size+bytelen-1] + -- @return the new buffer_size + local function ReadBytes(bytelen, buffer, buffer_size) + assert(cache_bitlen % 8 == 0) + + local byte_from_cache = + (cache_bitlen / 8 < bytelen) and (cache_bitlen / 8) or bytelen + for _ = 1, byte_from_cache do + local byte = cache % 256 + buffer_size = buffer_size + 1 + buffer[buffer_size] = string_char(byte) + cache = (cache - byte) / 256 + end + cache_bitlen = cache_bitlen - byte_from_cache * 8 + bytelen = bytelen - byte_from_cache + if (input_strlen - input_next_byte_pos - bytelen + 1) * 8 + cache_bitlen < 0 then + return -1 -- out of input + end + for i = input_next_byte_pos, input_next_byte_pos + bytelen - 1 do + buffer_size = buffer_size + 1 + buffer[buffer_size] = string_sub(input, i, i) + end + + input_next_byte_pos = input_next_byte_pos + bytelen + return buffer_size + end + + -- Decode huffman code + -- To improve speed, this function does not check + -- if the input has been exhausted. + -- Use ReaderBitlenLeft() < 0 to check it. + -- Credits for Mark Adler. This code is from puff:Decode() + -- @see puff:Decode(...) + -- @param huffman_bitlen_count + -- @param huffman_symbol + -- @param min_bitlen The minimum huffman bit length of all symbols + -- @return The decoded deflate code. + -- Negative value is returned if decoding fails. + local function Decode(huffman_bitlen_counts, huffman_symbols, min_bitlen) + local code = 0 + local first = 0 + local index = 0 + local count + if min_bitlen > 0 then + if cache_bitlen < 15 and input then + local lshift_mask = _pow2[cache_bitlen] + local byte1, byte2, byte3, byte4 = + string_byte(input, input_next_byte_pos, input_next_byte_pos + 3) + -- This requires lua number to be at least double () + cache = cache + + ((byte1 or 0) + (byte2 or 0) * 256 + (byte3 or 0) * 65536 + + (byte4 or 0) * 16777216) * lshift_mask + input_next_byte_pos = input_next_byte_pos + 4 + cache_bitlen = cache_bitlen + 32 + end + + local rshift_mask = _pow2[min_bitlen] + cache_bitlen = cache_bitlen - min_bitlen + code = cache % rshift_mask + cache = (cache - code) / rshift_mask + -- Reverse the bits + code = _reverse_bits_tbl[min_bitlen][code] + + count = huffman_bitlen_counts[min_bitlen] + if code < count then return huffman_symbols[code] end + index = count + first = count * 2 + code = code * 2 + end + + for bitlen = min_bitlen + 1, 15 do + local bit + bit = cache % 2 + cache = (cache - bit) / 2 + cache_bitlen = cache_bitlen - 1 + + code = (bit == 1) and (code + 1 - code % 2) or code + count = huffman_bitlen_counts[bitlen] or 0 + local diff = code - first + if diff < count then return huffman_symbols[index + diff] end + index = index + count + first = first + count + first = first * 2 + code = code * 2 + end + -- invalid literal/length or distance code + -- in fixed or dynamic block (run out of code) + return -10 + end + + local function ReaderBitlenLeft() + return (input_strlen - input_next_byte_pos + 1) * 8 + cache_bitlen + end + + local function SkipToByteBoundary() + local skipped_bitlen = cache_bitlen % 8 + local rshift_mask = _pow2[skipped_bitlen] + cache_bitlen = cache_bitlen - skipped_bitlen + cache = (cache - cache % rshift_mask) / rshift_mask + end + + return ReadBits, ReadBytes, Decode, ReaderBitlenLeft, SkipToByteBoundary end -- Create a deflate state, so I can pass in less arguments to functions. @@ -2252,21 +2275,20 @@ end -- This dictionary should be produced by LibDeflate:CreateDictionary(str) -- @return The decomrpess state. local function CreateDecompressState(str, dictionary) - local ReadBits, ReadBytes, Decode, ReaderBitlenLeft - , SkipToByteBoundary = CreateReader(str) - local state = - { - ReadBits = ReadBits, - ReadBytes = ReadBytes, - Decode = Decode, - ReaderBitlenLeft = ReaderBitlenLeft, - SkipToByteBoundary = SkipToByteBoundary, - buffer_size = 0, - buffer = {}, - result_buffer = {}, - dictionary = dictionary, - } - return state + local ReadBits, ReadBytes, Decode, ReaderBitlenLeft, SkipToByteBoundary = + CreateReader(str) + local state = { + ReadBits = ReadBits, + ReadBytes = ReadBytes, + Decode = Decode, + ReaderBitlenLeft = ReaderBitlenLeft, + SkipToByteBoundary = SkipToByteBoundary, + buffer_size = 0, + buffer = {}, + result_buffer = {}, + dictionary = dictionary + } + return state end -- Get the stuffs needed to decode huffman codes @@ -2279,47 +2301,46 @@ end -- @return A table to convert huffman codes to deflate codes. -- @return The minimum huffman bit length. local function GetHuffmanForDecode(huffman_bitlens, max_symbol, max_bitlen) - local huffman_bitlen_counts = {} - local min_bitlen = max_bitlen - for symbol = 0, max_symbol do - local bitlen = huffman_bitlens[symbol] or 0 - min_bitlen = (bitlen > 0 and bitlen < min_bitlen) - and bitlen or min_bitlen - huffman_bitlen_counts[bitlen] = (huffman_bitlen_counts[bitlen] or 0)+1 - end - - if huffman_bitlen_counts[0] == max_symbol+1 then -- No Codes - return 0, huffman_bitlen_counts, {}, 0 -- Complete, but decode will fail - end - - local left = 1 - for len = 1, max_bitlen do - left = left * 2 - left = left - (huffman_bitlen_counts[len] or 0) - if left < 0 then - return left -- Over-subscribed, return negative - end - end - - -- Generate offsets info symbol table for each length for sorting - local offsets = {} - offsets[1] = 0 - for len = 1, max_bitlen-1 do - offsets[len + 1] = offsets[len] + (huffman_bitlen_counts[len] or 0) - end - - local huffman_symbols = {} - for symbol = 0, max_symbol do - local bitlen = huffman_bitlens[symbol] or 0 - if bitlen ~= 0 then - local offset = offsets[bitlen] - huffman_symbols[offset] = symbol - offsets[bitlen] = offsets[bitlen] + 1 - end - end - - -- Return zero for complete set, positive for incomplete set. - return left, huffman_bitlen_counts, huffman_symbols, min_bitlen + local huffman_bitlen_counts = {} + local min_bitlen = max_bitlen + for symbol = 0, max_symbol do + local bitlen = huffman_bitlens[symbol] or 0 + min_bitlen = (bitlen > 0 and bitlen < min_bitlen) and bitlen or min_bitlen + huffman_bitlen_counts[bitlen] = (huffman_bitlen_counts[bitlen] or 0) + 1 + end + + if huffman_bitlen_counts[0] == max_symbol + 1 then -- No Codes + return 0, huffman_bitlen_counts, {}, 0 -- Complete, but decode will fail + end + + local left = 1 + for len = 1, max_bitlen do + left = left * 2 + left = left - (huffman_bitlen_counts[len] or 0) + if left < 0 then + return left -- Over-subscribed, return negative + end + end + + -- Generate offsets info symbol table for each length for sorting + local offsets = {} + offsets[1] = 0 + for len = 1, max_bitlen - 1 do + offsets[len + 1] = offsets[len] + (huffman_bitlen_counts[len] or 0) + end + + local huffman_symbols = {} + for symbol = 0, max_symbol do + local bitlen = huffman_bitlens[symbol] or 0 + if bitlen ~= 0 then + local offset = offsets[bitlen] + huffman_symbols[offset] = symbol + offsets[bitlen] = offsets[bitlen] + 1 + end + end + + -- Return zero for complete set, positive for incomplete set. + return left, huffman_bitlen_counts, huffman_symbols, min_bitlen end -- Decode a fixed or dynamic huffman blocks, excluding last block identifier @@ -2329,391 +2350,380 @@ end -- @see CreateDecompressState -- @param ... Read the source code -- @return 0 on success, other value on failure. -local function DecodeUntilEndOfBlock(state, lcodes_huffman_bitlens - , lcodes_huffman_symbols, lcodes_huffman_min_bitlen - , dcodes_huffman_bitlens, dcodes_huffman_symbols - , dcodes_huffman_min_bitlen) - local buffer, buffer_size, ReadBits, Decode, ReaderBitlenLeft - , result_buffer = - state.buffer, state.buffer_size, state.ReadBits, state.Decode - , state.ReaderBitlenLeft, state.result_buffer - local dictionary = state.dictionary - local dict_string_table - local dict_strlen - - local buffer_end = 1 - if dictionary and not buffer[0] then - -- If there is a dictionary, copy the last 258 bytes into - -- the string_table to make the copy in the main loop quicker. - -- This is done only once per decompression. - dict_string_table = dictionary.string_table - dict_strlen = dictionary.strlen - buffer_end = -dict_strlen + 1 - for i=0, (-dict_strlen+1)<-257 and -257 or (-dict_strlen+1), -1 do - buffer[i] = _byte_to_char[dict_string_table[dict_strlen+i]] - end - end - - repeat - local symbol = Decode(lcodes_huffman_bitlens - , lcodes_huffman_symbols, lcodes_huffman_min_bitlen) - if symbol < 0 or symbol > 285 then - -- invalid literal/length or distance code in fixed or dynamic block - return -10 - elseif symbol < 256 then -- Literal - buffer_size = buffer_size + 1 - buffer[buffer_size] = _byte_to_char[symbol] - elseif symbol > 256 then -- Length code - symbol = symbol - 256 - local bitlen = _literal_deflate_code_to_base_len[symbol] - bitlen = (symbol >= 8) - and (bitlen - + ReadBits(_literal_deflate_code_to_extra_bitlen[symbol])) - or bitlen - symbol = Decode(dcodes_huffman_bitlens, dcodes_huffman_symbols - , dcodes_huffman_min_bitlen) - if symbol < 0 or symbol > 29 then - -- invalid literal/length or distance code in fixed or dynamic block - return -10 - end - local dist = _dist_deflate_code_to_base_dist[symbol] - dist = (dist > 4) and (dist - + ReadBits(_dist_deflate_code_to_extra_bitlen[symbol])) or dist - - local char_buffer_index = buffer_size-dist+1 - if char_buffer_index < buffer_end then - -- distance is too far back in fixed or dynamic block - return -11 - end - if char_buffer_index >= -257 then - for _=1, bitlen do - buffer_size = buffer_size + 1 - buffer[buffer_size] = buffer[char_buffer_index] - char_buffer_index = char_buffer_index + 1 - end - else - char_buffer_index = dict_strlen + char_buffer_index - for _=1, bitlen do - buffer_size = buffer_size + 1 - buffer[buffer_size] = - _byte_to_char[dict_string_table[char_buffer_index]] - char_buffer_index = char_buffer_index + 1 - end - end - end - - if ReaderBitlenLeft() < 0 then - return 2 -- available inflate data did not terminate - end - - if buffer_size >= 65536 then - result_buffer[#result_buffer+1] = - table_concat(buffer, "", 1, 32768) - for i=32769, buffer_size do - buffer[i-32768] = buffer[i] - end - buffer_size = buffer_size - 32768 - buffer[buffer_size+1] = nil - -- NOTE: buffer[32769..end] and buffer[-257..0] are not cleared. - -- This is why "buffer_size" variable is needed. - end - until symbol == 256 - - state.buffer_size = buffer_size - - return 0 +local function DecodeUntilEndOfBlock(state, lcodes_huffman_bitlens, + lcodes_huffman_symbols, + lcodes_huffman_min_bitlen, + dcodes_huffman_bitlens, + dcodes_huffman_symbols, + dcodes_huffman_min_bitlen) + local buffer, buffer_size, ReadBits, Decode, ReaderBitlenLeft, result_buffer = + state.buffer, state.buffer_size, state.ReadBits, state.Decode, + state.ReaderBitlenLeft, state.result_buffer + local dictionary = state.dictionary + local dict_string_table + local dict_strlen + + local buffer_end = 1 + if dictionary and not buffer[0] then + -- If there is a dictionary, copy the last 258 bytes into + -- the string_table to make the copy in the main loop quicker. + -- This is done only once per decompression. + dict_string_table = dictionary.string_table + dict_strlen = dictionary.strlen + buffer_end = -dict_strlen + 1 + for i = 0, (-dict_strlen + 1) < -257 and -257 or (-dict_strlen + 1), -1 do + buffer[i] = _byte_to_char[dict_string_table[dict_strlen + i]] + end + end + + repeat + local symbol = Decode(lcodes_huffman_bitlens, lcodes_huffman_symbols, + lcodes_huffman_min_bitlen) + if symbol < 0 or symbol > 285 then + -- invalid literal/length or distance code in fixed or dynamic block + return -10 + elseif symbol < 256 then -- Literal + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_char[symbol] + elseif symbol > 256 then -- Length code + symbol = symbol - 256 + local bitlen = _literal_deflate_code_to_base_len[symbol] + bitlen = (symbol >= 8) and + (bitlen + + ReadBits(_literal_deflate_code_to_extra_bitlen[symbol])) or + bitlen + symbol = Decode(dcodes_huffman_bitlens, dcodes_huffman_symbols, + dcodes_huffman_min_bitlen) + if symbol < 0 or symbol > 29 then + -- invalid literal/length or distance code in fixed or dynamic block + return -10 + end + local dist = _dist_deflate_code_to_base_dist[symbol] + dist = (dist > 4) and + (dist + ReadBits(_dist_deflate_code_to_extra_bitlen[symbol])) or + dist + + local char_buffer_index = buffer_size - dist + 1 + if char_buffer_index < buffer_end then + -- distance is too far back in fixed or dynamic block + return -11 + end + if char_buffer_index >= -257 then + for _ = 1, bitlen do + buffer_size = buffer_size + 1 + buffer[buffer_size] = buffer[char_buffer_index] + char_buffer_index = char_buffer_index + 1 + end + else + char_buffer_index = dict_strlen + char_buffer_index + for _ = 1, bitlen do + buffer_size = buffer_size + 1 + buffer[buffer_size] = + _byte_to_char[dict_string_table[char_buffer_index]] + char_buffer_index = char_buffer_index + 1 + end + end + end + + if ReaderBitlenLeft() < 0 then + return 2 -- available inflate data did not terminate + end + + if buffer_size >= 65536 then + result_buffer[#result_buffer + 1] = table_concat(buffer, "", 1, 32768) + for i = 32769, buffer_size do buffer[i - 32768] = buffer[i] end + buffer_size = buffer_size - 32768 + buffer[buffer_size + 1] = nil + -- NOTE: buffer[32769..end] and buffer[-257..0] are not cleared. + -- This is why "buffer_size" variable is needed. + end + until symbol == 256 + + state.buffer_size = buffer_size + + return 0 end -- Decompress a store block -- @param state decompression state that will be modified by this function. -- @return 0 if succeeds, other value if fails. local function DecompressStoreBlock(state) - local buffer, buffer_size, ReadBits, ReadBytes, ReaderBitlenLeft - , SkipToByteBoundary, result_buffer = - state.buffer, state.buffer_size, state.ReadBits, state.ReadBytes - , state.ReaderBitlenLeft, state.SkipToByteBoundary, state.result_buffer - - SkipToByteBoundary() - local bytelen = ReadBits(16) - if ReaderBitlenLeft() < 0 then - return 2 -- available inflate data did not terminate - end - local bytelenComp = ReadBits(16) - if ReaderBitlenLeft() < 0 then - return 2 -- available inflate data did not terminate - end - - if bytelen % 256 + bytelenComp % 256 ~= 255 then - return -2 -- Not one's complement - end - if (bytelen-bytelen % 256)/256 - + (bytelenComp-bytelenComp % 256)/256 ~= 255 then - return -2 -- Not one's complement - end - - -- Note that ReadBytes will skip to the next byte boundary first. - buffer_size = ReadBytes(bytelen, buffer, buffer_size) - if buffer_size < 0 then - return 2 -- available inflate data did not terminate - end - - -- memory clean up when there are enough bytes in the buffer. - if buffer_size >= 65536 then - result_buffer[#result_buffer+1] = table_concat(buffer, "", 1, 32768) - for i=32769, buffer_size do - buffer[i-32768] = buffer[i] - end - buffer_size = buffer_size - 32768 - buffer[buffer_size+1] = nil - end - state.buffer_size = buffer_size - return 0 + local buffer, buffer_size, ReadBits, ReadBytes, ReaderBitlenLeft, + SkipToByteBoundary, result_buffer = state.buffer, state.buffer_size, + state.ReadBits, state.ReadBytes, + state.ReaderBitlenLeft, + state.SkipToByteBoundary, + state.result_buffer + + SkipToByteBoundary() + local bytelen = ReadBits(16) + if ReaderBitlenLeft() < 0 then + return 2 -- available inflate data did not terminate + end + local bytelenComp = ReadBits(16) + if ReaderBitlenLeft() < 0 then + return 2 -- available inflate data did not terminate + end + + if bytelen % 256 + bytelenComp % 256 ~= 255 then + return -2 -- Not one's complement + end + if (bytelen - bytelen % 256) / 256 + (bytelenComp - bytelenComp % 256) / 256 ~= + 255 then + return -2 -- Not one's complement + end + + -- Note that ReadBytes will skip to the next byte boundary first. + buffer_size = ReadBytes(bytelen, buffer, buffer_size) + if buffer_size < 0 then + return 2 -- available inflate data did not terminate + end + + -- memory clean up when there are enough bytes in the buffer. + if buffer_size >= 65536 then + result_buffer[#result_buffer + 1] = table_concat(buffer, "", 1, 32768) + for i = 32769, buffer_size do buffer[i - 32768] = buffer[i] end + buffer_size = buffer_size - 32768 + buffer[buffer_size + 1] = nil + end + state.buffer_size = buffer_size + return 0 end -- Decompress a fixed block -- @param state decompression state that will be modified by this function. -- @return 0 if succeeds other value if fails. local function DecompressFixBlock(state) - return DecodeUntilEndOfBlock(state - , _fix_block_literal_huffman_bitlen_count - , _fix_block_literal_huffman_to_deflate_code, 7 - , _fix_block_dist_huffman_bitlen_count - , _fix_block_dist_huffman_to_deflate_code, 5) + return DecodeUntilEndOfBlock(state, _fix_block_literal_huffman_bitlen_count, + _fix_block_literal_huffman_to_deflate_code, 7, + _fix_block_dist_huffman_bitlen_count, + _fix_block_dist_huffman_to_deflate_code, 5) end -- Decompress a dynamic block -- @param state decompression state that will be modified by this function. -- @return 0 if success, other value if fails. local function DecompressDynamicBlock(state) - local ReadBits, Decode = state.ReadBits, state.Decode - local nlen = ReadBits(5) + 257 - local ndist = ReadBits(5) + 1 - local ncode = ReadBits(4) + 4 - if nlen > 286 or ndist > 30 then - -- dynamic block code description: too many length or distance codes - return -3 - end - - local rle_codes_huffman_bitlens = {} - - for i = 1, ncode do - rle_codes_huffman_bitlens[_rle_codes_huffman_bitlen_order[i]] = - ReadBits(3) - end - - local rle_codes_err, rle_codes_huffman_bitlen_counts, - rle_codes_huffman_symbols, rle_codes_huffman_min_bitlen = - GetHuffmanForDecode(rle_codes_huffman_bitlens, 18, 7) - if rle_codes_err ~= 0 then -- Require complete code set here - -- dynamic block code description: code lengths codes incomplete - return -4 - end - - local lcodes_huffman_bitlens = {} - local dcodes_huffman_bitlens = {} - -- Read length/literal and distance code length tables - local index = 0 - while index < nlen + ndist do - local symbol -- Decoded value - local bitlen -- Last length to repeat - - symbol = Decode(rle_codes_huffman_bitlen_counts - , rle_codes_huffman_symbols, rle_codes_huffman_min_bitlen) - - if symbol < 0 then - return symbol -- Invalid symbol - elseif symbol < 16 then - if index < nlen then - lcodes_huffman_bitlens[index] = symbol - else - dcodes_huffman_bitlens[index-nlen] = symbol - end - index = index + 1 - else - bitlen = 0 - if symbol == 16 then - if index == 0 then - -- dynamic block code description: repeat lengths - -- with no first length - return -5 - end - if index-1 < nlen then - bitlen = lcodes_huffman_bitlens[index-1] - else - bitlen = dcodes_huffman_bitlens[index-nlen-1] - end - symbol = 3 + ReadBits(2) - elseif symbol == 17 then -- Repeat zero 3..10 times - symbol = 3 + ReadBits(3) - else -- == 18, repeat zero 11.138 times - symbol = 11 + ReadBits(7) - end - if index + symbol > nlen + ndist then - -- dynamic block code description: - -- repeat more than specified lengths - return -6 - end - while symbol > 0 do -- Repeat last or zero symbol times - symbol = symbol - 1 - if index < nlen then - lcodes_huffman_bitlens[index] = bitlen - else - dcodes_huffman_bitlens[index-nlen] = bitlen - end - index = index + 1 - end - end - end - - if (lcodes_huffman_bitlens[256] or 0) == 0 then - -- dynamic block code description: missing end-of-block code - return -9 - end - - local lcodes_err, lcodes_huffman_bitlen_counts - , lcodes_huffman_symbols, lcodes_huffman_min_bitlen = - GetHuffmanForDecode(lcodes_huffman_bitlens, nlen-1, 15) - --dynamic block code description: invalid literal/length code lengths, - -- Incomplete code ok only for single length 1 code - if (lcodes_err ~=0 and (lcodes_err < 0 - or nlen ~= (lcodes_huffman_bitlen_counts[0] or 0) - +(lcodes_huffman_bitlen_counts[1] or 0))) then - return -7 - end - - local dcodes_err, dcodes_huffman_bitlen_counts - , dcodes_huffman_symbols, dcodes_huffman_min_bitlen = - GetHuffmanForDecode(dcodes_huffman_bitlens, ndist-1, 15) - -- dynamic block code description: invalid distance code lengths, - -- Incomplete code ok only for single length 1 code - if (dcodes_err ~=0 and (dcodes_err < 0 - or ndist ~= (dcodes_huffman_bitlen_counts[0] or 0) - + (dcodes_huffman_bitlen_counts[1] or 0))) then - return -8 - end - - -- Build buffman table for literal/length codes - return DecodeUntilEndOfBlock(state, lcodes_huffman_bitlen_counts - , lcodes_huffman_symbols, lcodes_huffman_min_bitlen - , dcodes_huffman_bitlen_counts, dcodes_huffman_symbols - , dcodes_huffman_min_bitlen) + local ReadBits, Decode = state.ReadBits, state.Decode + local nlen = ReadBits(5) + 257 + local ndist = ReadBits(5) + 1 + local ncode = ReadBits(4) + 4 + if nlen > 286 or ndist > 30 then + -- dynamic block code description: too many length or distance codes + return -3 + end + + local rle_codes_huffman_bitlens = {} + + for i = 1, ncode do + rle_codes_huffman_bitlens[_rle_codes_huffman_bitlen_order[i]] = ReadBits(3) + end + + local rle_codes_err, rle_codes_huffman_bitlen_counts, + rle_codes_huffman_symbols, rle_codes_huffman_min_bitlen = + GetHuffmanForDecode(rle_codes_huffman_bitlens, 18, 7) + if rle_codes_err ~= 0 then -- Require complete code set here + -- dynamic block code description: code lengths codes incomplete + return -4 + end + + local lcodes_huffman_bitlens = {} + local dcodes_huffman_bitlens = {} + -- Read length/literal and distance code length tables + local index = 0 + while index < nlen + ndist do + local symbol -- Decoded value + local bitlen -- Last length to repeat + + symbol = Decode(rle_codes_huffman_bitlen_counts, rle_codes_huffman_symbols, + rle_codes_huffman_min_bitlen) + + if symbol < 0 then + return symbol -- Invalid symbol + elseif symbol < 16 then + if index < nlen then + lcodes_huffman_bitlens[index] = symbol + else + dcodes_huffman_bitlens[index - nlen] = symbol + end + index = index + 1 + else + bitlen = 0 + if symbol == 16 then + if index == 0 then + -- dynamic block code description: repeat lengths + -- with no first length + return -5 + end + if index - 1 < nlen then + bitlen = lcodes_huffman_bitlens[index - 1] + else + bitlen = dcodes_huffman_bitlens[index - nlen - 1] + end + symbol = 3 + ReadBits(2) + elseif symbol == 17 then -- Repeat zero 3..10 times + symbol = 3 + ReadBits(3) + else -- == 18, repeat zero 11.138 times + symbol = 11 + ReadBits(7) + end + if index + symbol > nlen + ndist then + -- dynamic block code description: + -- repeat more than specified lengths + return -6 + end + while symbol > 0 do -- Repeat last or zero symbol times + symbol = symbol - 1 + if index < nlen then + lcodes_huffman_bitlens[index] = bitlen + else + dcodes_huffman_bitlens[index - nlen] = bitlen + end + index = index + 1 + end + end + end + + if (lcodes_huffman_bitlens[256] or 0) == 0 then + -- dynamic block code description: missing end-of-block code + return -9 + end + + local lcodes_err, lcodes_huffman_bitlen_counts, lcodes_huffman_symbols, + lcodes_huffman_min_bitlen = GetHuffmanForDecode(lcodes_huffman_bitlens, + nlen - 1, 15) + -- dynamic block code description: invalid literal/length code lengths, + -- Incomplete code ok only for single length 1 code + if (lcodes_err ~= 0 and + (lcodes_err < 0 or nlen ~= (lcodes_huffman_bitlen_counts[0] or 0) + + (lcodes_huffman_bitlen_counts[1] or 0))) then return -7 end + + local dcodes_err, dcodes_huffman_bitlen_counts, dcodes_huffman_symbols, + dcodes_huffman_min_bitlen = GetHuffmanForDecode(dcodes_huffman_bitlens, + ndist - 1, 15) + -- dynamic block code description: invalid distance code lengths, + -- Incomplete code ok only for single length 1 code + if (dcodes_err ~= 0 and + (dcodes_err < 0 or ndist ~= (dcodes_huffman_bitlen_counts[0] or 0) + + (dcodes_huffman_bitlen_counts[1] or 0))) then return -8 end + + -- Build buffman table for literal/length codes + return DecodeUntilEndOfBlock(state, lcodes_huffman_bitlen_counts, + lcodes_huffman_symbols, + lcodes_huffman_min_bitlen, + dcodes_huffman_bitlen_counts, + dcodes_huffman_symbols, dcodes_huffman_min_bitlen) end -- Decompress a deflate stream -- @param state: a decompression state -- @return the decompressed string if succeeds. nil if fails. local function Inflate(state) - local ReadBits = state.ReadBits - - local is_last_block - while not is_last_block do - is_last_block = (ReadBits(1) == 1) - local block_type = ReadBits(2) - local status - if block_type == 0 then - status = DecompressStoreBlock(state) - elseif block_type == 1 then - status = DecompressFixBlock(state) - elseif block_type == 2 then - status = DecompressDynamicBlock(state) - else - return nil, -1 -- invalid block type (type == 3) - end - if status ~= 0 then - return nil, status - end - end - - state.result_buffer[#state.result_buffer+1] = - table_concat(state.buffer, "", 1, state.buffer_size) - local result = table_concat(state.result_buffer) - return result + local ReadBits = state.ReadBits + + local is_last_block + while not is_last_block do + is_last_block = (ReadBits(1) == 1) + local block_type = ReadBits(2) + local status + if block_type == 0 then + status = DecompressStoreBlock(state) + elseif block_type == 1 then + status = DecompressFixBlock(state) + elseif block_type == 2 then + status = DecompressDynamicBlock(state) + else + return nil, -1 -- invalid block type (type == 3) + end + if status ~= 0 then return nil, status end + end + + state.result_buffer[#state.result_buffer + 1] = + table_concat(state.buffer, "", 1, state.buffer_size) + local result = table_concat(state.result_buffer) + return result end -- @see LibDeflate:DecompressDeflate(str) -- @see LibDeflate:DecompressDeflateWithDict(str, dictionary) local function DecompressDeflateInternal(str, dictionary) - local state = CreateDecompressState(str, dictionary) - local result, status = Inflate(state) - if not result then - return nil, status - end - - local bitlen_left = state.ReaderBitlenLeft() - local bytelen_left = (bitlen_left - bitlen_left % 8) / 8 - return result, bytelen_left + local state = CreateDecompressState(str, dictionary) + local result, status = Inflate(state) + if not result then return nil, status end + + local bitlen_left = state.ReaderBitlenLeft() + local bytelen_left = (bitlen_left - bitlen_left % 8) / 8 + return result, bytelen_left end -- @see LibDeflate:DecompressZlib(str) -- @see LibDeflate:DecompressZlibWithDict(str) local function DecompressZlibInternal(str, dictionary) - local state = CreateDecompressState(str, dictionary) - local ReadBits = state.ReadBits - - local CMF = ReadBits(8) - if state.ReaderBitlenLeft() < 0 then - return nil, 2 -- available inflate data did not terminate - end - local CM = CMF % 16 - local CINFO = (CMF - CM) / 16 - if CM ~= 8 then - return nil, -12 -- invalid compression method - end - if CINFO > 7 then - return nil, -13 -- invalid window size - end - - local FLG = ReadBits(8) - if state.ReaderBitlenLeft() < 0 then - return nil, 2 -- available inflate data did not terminate - end - if (CMF*256+FLG)%31 ~= 0 then - return nil, -14 -- invalid header checksum - end - - local FDIST = ((FLG-FLG%32)/32 % 2) - local FLEVEL = ((FLG-FLG%64)/64 % 4) -- luacheck: ignore FLEVEL - - if FDIST == 1 then - if not dictionary then - return nil, -16 -- need dictonary, but dictionary is not provided. - end - local byte3 = ReadBits(8) - local byte2 = ReadBits(8) - local byte1 = ReadBits(8) - local byte0 = ReadBits(8) - local actual_adler32 = byte3*16777216+byte2*65536+byte1*256+byte0 - if state.ReaderBitlenLeft() < 0 then - return nil, 2 -- available inflate data did not terminate - end - if not IsEqualAdler32(actual_adler32, dictionary.adler32) then - return nil, -17 -- dictionary adler32 does not match - end - end - local result, status = Inflate(state) - if not result then - return nil, status - end - state.SkipToByteBoundary() - - local adler_byte0 = ReadBits(8) - local adler_byte1 = ReadBits(8) - local adler_byte2 = ReadBits(8) - local adler_byte3 = ReadBits(8) - if state.ReaderBitlenLeft() < 0 then - return nil, 2 -- available inflate data did not terminate - end - - local adler32_expected = adler_byte0*16777216 - + adler_byte1*65536 + adler_byte2*256 + adler_byte3 - local adler32_actual = LibDeflate:Adler32(result) - if not IsEqualAdler32(adler32_expected, adler32_actual) then - return nil, -15 -- Adler32 checksum does not match - end - - local bitlen_left = state.ReaderBitlenLeft() - local bytelen_left = (bitlen_left - bitlen_left % 8) / 8 - return result, bytelen_left + local state = CreateDecompressState(str, dictionary) + local ReadBits = state.ReadBits + + local CMF = ReadBits(8) + if state.ReaderBitlenLeft() < 0 then + return nil, 2 -- available inflate data did not terminate + end + local CM = CMF % 16 + local CINFO = (CMF - CM) / 16 + if CM ~= 8 then + return nil, -12 -- invalid compression method + end + if CINFO > 7 then + return nil, -13 -- invalid window size + end + + local FLG = ReadBits(8) + if state.ReaderBitlenLeft() < 0 then + return nil, 2 -- available inflate data did not terminate + end + if (CMF * 256 + FLG) % 31 ~= 0 then + return nil, -14 -- invalid header checksum + end + + local FDIST = ((FLG - FLG % 32) / 32 % 2) + local FLEVEL = ((FLG - FLG % 64) / 64 % 4) -- luacheck: ignore FLEVEL + + if FDIST == 1 then + if not dictionary then + return nil, -16 -- need dictonary, but dictionary is not provided. + end + local byte3 = ReadBits(8) + local byte2 = ReadBits(8) + local byte1 = ReadBits(8) + local byte0 = ReadBits(8) + local actual_adler32 = byte3 * 16777216 + byte2 * 65536 + byte1 * 256 + + byte0 + if state.ReaderBitlenLeft() < 0 then + return nil, 2 -- available inflate data did not terminate + end + if not IsEqualAdler32(actual_adler32, dictionary.adler32) then + return nil, -17 -- dictionary adler32 does not match + end + end + local result, status = Inflate(state) + if not result then return nil, status end + state.SkipToByteBoundary() + + local adler_byte0 = ReadBits(8) + local adler_byte1 = ReadBits(8) + local adler_byte2 = ReadBits(8) + local adler_byte3 = ReadBits(8) + if state.ReaderBitlenLeft() < 0 then + return nil, 2 -- available inflate data did not terminate + end + + local adler32_expected = adler_byte0 * 16777216 + adler_byte1 * 65536 + + adler_byte2 * 256 + adler_byte3 + local adler32_actual = LibDeflate:Adler32(result) + if not IsEqualAdler32(adler32_expected, adler32_actual) then + return nil, -15 -- Adler32 checksum does not match + end + + local bitlen_left = state.ReaderBitlenLeft() + local bytelen_left = (bitlen_left - bitlen_left % 8) / 8 + return result, bytelen_left end --- Decompress a raw deflate compressed data. @@ -2730,12 +2740,11 @@ end -- this return value is undefined. -- @see LibDeflate:CompressDeflate function LibDeflate:DecompressDeflate(str) - local arg_valid, arg_err = IsValidArguments(str) - if not arg_valid then - error(("Usage: LibDeflate:DecompressDeflate(str): " - ..arg_err), 2) - end - return DecompressDeflateInternal(str) + local arg_valid, arg_err = IsValidArguments(str) + if not arg_valid then + error(("Usage: LibDeflate:DecompressDeflate(str): " .. arg_err), 2) + end + return DecompressDeflateInternal(str) end --- Decompress a raw deflate compressed data with a preset dictionary. @@ -2757,12 +2766,12 @@ end -- this return value is undefined. -- @see LibDeflate:CompressDeflateWithDict function LibDeflate:DecompressDeflateWithDict(str, dictionary) - local arg_valid, arg_err = IsValidArguments(str, true, dictionary) - if not arg_valid then - error(("Usage: LibDeflate:DecompressDeflateWithDict(str, dictionary): " - ..arg_err), 2) - end - return DecompressDeflateInternal(str, dictionary) + local arg_valid, arg_err = IsValidArguments(str, true, dictionary) + if not arg_valid then + error(("Usage: LibDeflate:DecompressDeflateWithDict(str, dictionary): " .. + arg_err), 2) + end + return DecompressDeflateInternal(str, dictionary) end --- Decompress a zlib compressed data. @@ -2779,12 +2788,11 @@ end -- this return value is undefined. -- @see LibDeflate:CompressZlib function LibDeflate:DecompressZlib(str) - local arg_valid, arg_err = IsValidArguments(str) - if not arg_valid then - error(("Usage: LibDeflate:DecompressZlib(str): " - ..arg_err), 2) - end - return DecompressZlibInternal(str) + local arg_valid, arg_err = IsValidArguments(str) + if not arg_valid then + error(("Usage: LibDeflate:DecompressZlib(str): " .. arg_err), 2) + end + return DecompressZlibInternal(str) end --- Decompress a zlib compressed data with a preset dictionary. @@ -2806,58 +2814,43 @@ end -- this return value is undefined. -- @see LibDeflate:CompressZlibWithDict function LibDeflate:DecompressZlibWithDict(str, dictionary) - local arg_valid, arg_err = IsValidArguments(str, true, dictionary) - if not arg_valid then - error(("Usage: LibDeflate:DecompressZlibWithDict(str, dictionary): " - ..arg_err), 2) - end - return DecompressZlibInternal(str, dictionary) + local arg_valid, arg_err = IsValidArguments(str, true, dictionary) + if not arg_valid then + error(("Usage: LibDeflate:DecompressZlibWithDict(str, dictionary): " .. + arg_err), 2) + end + return DecompressZlibInternal(str, dictionary) end -- Calculate the huffman code of fixed block do - _fix_block_literal_huffman_bitlen = {} - for sym=0, 143 do - _fix_block_literal_huffman_bitlen[sym] = 8 - end - for sym=144, 255 do - _fix_block_literal_huffman_bitlen[sym] = 9 - end - for sym=256, 279 do - _fix_block_literal_huffman_bitlen[sym] = 7 - end - for sym=280, 287 do - _fix_block_literal_huffman_bitlen[sym] = 8 - end - - _fix_block_dist_huffman_bitlen = {} - for dist=0, 31 do - _fix_block_dist_huffman_bitlen[dist] = 5 - end - local status - status, _fix_block_literal_huffman_bitlen_count - , _fix_block_literal_huffman_to_deflate_code = - GetHuffmanForDecode(_fix_block_literal_huffman_bitlen, 287, 9) - assert(status == 0) - status, _fix_block_dist_huffman_bitlen_count, - _fix_block_dist_huffman_to_deflate_code = - GetHuffmanForDecode(_fix_block_dist_huffman_bitlen, 31, 5) - assert(status == 0) - - _fix_block_literal_huffman_code = - GetHuffmanCodeFromBitlen(_fix_block_literal_huffman_bitlen_count - , _fix_block_literal_huffman_bitlen, 287, 9) - _fix_block_dist_huffman_code = - GetHuffmanCodeFromBitlen(_fix_block_dist_huffman_bitlen_count - , _fix_block_dist_huffman_bitlen, 31, 5) + _fix_block_literal_huffman_bitlen = {} + for sym = 0, 143 do _fix_block_literal_huffman_bitlen[sym] = 8 end + for sym = 144, 255 do _fix_block_literal_huffman_bitlen[sym] = 9 end + for sym = 256, 279 do _fix_block_literal_huffman_bitlen[sym] = 7 end + for sym = 280, 287 do _fix_block_literal_huffman_bitlen[sym] = 8 end + + _fix_block_dist_huffman_bitlen = {} + for dist = 0, 31 do _fix_block_dist_huffman_bitlen[dist] = 5 end + local status + status, _fix_block_literal_huffman_bitlen_count, _fix_block_literal_huffman_to_deflate_code = + GetHuffmanForDecode(_fix_block_literal_huffman_bitlen, 287, 9) + assert(status == 0) + status, _fix_block_dist_huffman_bitlen_count, _fix_block_dist_huffman_to_deflate_code = + GetHuffmanForDecode(_fix_block_dist_huffman_bitlen, 31, 5) + assert(status == 0) + + _fix_block_literal_huffman_code = GetHuffmanCodeFromBitlen( + _fix_block_literal_huffman_bitlen_count, + _fix_block_literal_huffman_bitlen, 287, 9) + _fix_block_dist_huffman_code = GetHuffmanCodeFromBitlen( + _fix_block_dist_huffman_bitlen_count, + _fix_block_dist_huffman_bitlen, 31, 5) end --- Encoding algorithms -- Prefix encoding algorithm --- implemented by Galmok of European Stormrage (Horde), galmok@gmail.com --- From LibCompress , --- which is licensed under GPLv2 --- The code has been modified by the author of LibDeflate. +-- Credits to LibCompress. +-- The code has been rewritten by the author of LibDeflate. ------------------------------------------------------------------------------ -- to be able to match any requested byte value, the search @@ -2866,14 +2859,23 @@ end -- "illegal" byte values: -- 0 is replaces %z local _gsub_escape_table = { - ["\000"] = "%z", ["("] = "%(", [")"] = "%)", ["."] = "%.", - ["%"] = "%%", ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", - ["?"] = "%?", ["["] = "%[", ["]"] = "%]", ["^"] = "%^", - ["$"] = "%$", + ["\000"] = "%z", + ["("] = "%(", + [")"] = "%)", + ["."] = "%.", + ["%"] = "%%", + ["+"] = "%+", + ["-"] = "%-", + ["*"] = "%*", + ["?"] = "%?", + ["["] = "%[", + ["]"] = "%]", + ["^"] = "%^", + ["$"] = "%$" } local function escape_for_gsub(str) - return str:gsub("([%z%(%)%.%%%+%-%*%?%[%]%^%$])", _gsub_escape_table) + return str:gsub("([%z%(%)%.%%%+%-%*%?%[%]%^%$])", _gsub_escape_table) end --- Create a custom codec with encoder and decoder.
@@ -2883,6 +2885,7 @@ end -- localization into account. One byte (0-255) in the string is exactly one -- character (0-255). -- Credits to LibCompress. +-- The code has been rewritten by the author of LibDeflate.
-- @param reserved_chars [string] The created encoder will ensure encoded -- data does not contain any single character in reserved_chars. This parameter -- should be non-empty. @@ -2915,168 +2918,147 @@ end -- -- "encoded" does not contain "\000" or "\001" -- local decoded = codec:Decode(encoded) -- -- assert(decoded == SOME_STRING) -function LibDeflate:CreateCodec(reserved_chars, escape_chars - , map_chars) - -- select a default escape character - if type(reserved_chars) ~= "string" - or type(escape_chars) ~= "string" - or type(map_chars) ~= "string" then - error( - "Usage: LibDeflate:CreateCodec(reserved_chars," - .." escape_chars, map_chars):" - .." All arguments must be string.", 2) - end - - if escape_chars == "" then - return nil, "No escape characters supplied." - end - if #reserved_chars < #map_chars then - return nil, "The number of reserved characters must be" - .." at least as many as the number of mapped chars." - end - if reserved_chars == "" then - return nil, "No characters to encode." - end - - local encode_bytes = reserved_chars..escape_chars..map_chars - -- build list of bytes not available as a suffix to a prefix byte - local taken = {} - for i = 1, #encode_bytes do - local byte = string_byte(encode_bytes, i, i) - if taken[byte] then -- Modified by LibDeflate: - return nil, "There must be no duplicate characters in the" - .." concatenation of reserved_chars, escape_chars and" - .." map_chars." - end - taken[byte] = true - end - - -- Modified by LibDeflate: - -- Store the patterns and replacement in tables for later use. - -- This function is modified that loadstring() lua api is no longer used. - local decode_patterns = {} - local decode_repls = {} - - -- the encoding can be a single gsub - -- , but the decoding can require multiple gsubs - local encode_search = {} - local encode_translate = {} - - -- map single byte to single byte - if #map_chars > 0 then - local decode_search = {} - local decode_translate = {} - for i = 1, #map_chars do - local from = string_sub(reserved_chars, i, i) - local to = string_sub(map_chars, i, i) - encode_translate[from] = to - encode_search[#encode_search+1] = from - decode_translate[to] = from - decode_search[#decode_search+1] = to - end - decode_patterns[#decode_patterns+1] = - "([".. escape_for_gsub(table_concat(decode_search)).."])" - decode_repls[#decode_repls+1] = decode_translate - end - - local escape_char_index = 1 - local escape_char = string_sub(escape_chars - , escape_char_index, escape_char_index) - -- map single byte to double-byte - local r = 0 -- suffix char value to the escapeChar - - local decode_search = {} - local decode_translate = {} - for i = 1, #encode_bytes do - local c = string_sub(encode_bytes, i, i) - if not encode_translate[c] then - -- this loop will update escapeChar and r - while r >= 256 or taken[r] do - -- Bug in LibCompress r81 - -- while r < 256 and taken[r] do - r = r + 1 - if r > 255 then -- switch to next escapeChar - decode_patterns[#decode_patterns+1] = - escape_for_gsub(escape_char) - .."([" - .. escape_for_gsub(table_concat(decode_search)).."])" - decode_repls[#decode_repls+1] = decode_translate - - escape_char_index = escape_char_index + 1 - escape_char = string_sub(escape_chars, escape_char_index - , escape_char_index) - r = 0 - decode_search = {} - decode_translate = {} - - -- Fixes Another bug in LibCompress r82. - -- LibCompress checks this error condition - -- right after "if r > 255 then" - -- This is why error case should also be tested. - if not escape_char or escape_char == "" then - -- actually I don't need to check - -- "not ecape_char", but what if Lua changes - -- the behavior of string.sub() in the future? - -- we are out of escape chars and we need more! - return nil, "Out of escape characters." - end - end - end - - local char_r = _byte_to_char[r] - encode_translate[c] = escape_char..char_r - encode_search[#encode_search+1] = c - decode_translate[char_r] = c - decode_search[#decode_search+1] = char_r - r = r + 1 - end - if i == #encode_bytes then - decode_patterns[#decode_patterns+1] = - escape_for_gsub(escape_char).."([" - .. escape_for_gsub(table_concat(decode_search)).."])" - decode_repls[#decode_repls+1] = decode_translate - end - end - - local codec = {} - - local encode_pattern = "([" - .. escape_for_gsub(table_concat(encode_search)).."])" - local encode_repl = encode_translate - - function codec:Encode(str) - if type(str) ~= "string" then - error(("Usage: codec:Encode(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - return string_gsub(str, encode_pattern, encode_repl) - end - - local decode_tblsize = #decode_patterns - local decode_fail_pattern = "([" - .. escape_for_gsub(reserved_chars).."])" - - function codec:Decode(str) - if type(str) ~= "string" then - error(("Usage: codec:Decode(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if string_find(str, decode_fail_pattern) then - return nil - end - for i = 1, decode_tblsize do - str = string_gsub(str, decode_patterns[i], decode_repls[i]) - end - return str - end - - return codec +function LibDeflate:CreateCodec(reserved_chars, escape_chars, map_chars) + if type(reserved_chars) ~= "string" or type(escape_chars) ~= "string" or + type(map_chars) ~= "string" then + error("Usage: LibDeflate:CreateCodec(reserved_chars," .. + " escape_chars, map_chars):" .. " All arguments must be string.", 2) + end + + if escape_chars == "" then return nil, "No escape characters supplied." end + if #reserved_chars < #map_chars then + return nil, "The number of reserved characters must be" .. + " at least as many as the number of mapped chars." + end + if reserved_chars == "" then return nil, "No characters to encode." end + + local encode_bytes = reserved_chars .. escape_chars .. map_chars + -- build list of bytes not available as a suffix to a prefix byte + local taken = {} + for i = 1, #encode_bytes do + local byte = string_byte(encode_bytes, i, i) + if taken[byte] then + return nil, "There must be no duplicate characters in the" .. + " concatenation of reserved_chars, escape_chars and" .. + " map_chars." + end + taken[byte] = true + end + + local decode_patterns = {} + local decode_repls = {} + + -- the encoding can be a single gsub + -- , but the decoding can require multiple gsubs + local encode_search = {} + local encode_translate = {} + + -- map single byte to single byte + if #map_chars > 0 then + local decode_search = {} + local decode_translate = {} + for i = 1, #map_chars do + local from = string_sub(reserved_chars, i, i) + local to = string_sub(map_chars, i, i) + encode_translate[from] = to + encode_search[#encode_search + 1] = from + decode_translate[to] = from + decode_search[#decode_search + 1] = to + end + decode_patterns[#decode_patterns + 1] = + "([" .. escape_for_gsub(table_concat(decode_search)) .. "])" + decode_repls[#decode_repls + 1] = decode_translate + end + + local escape_char_index = 1 + local escape_char = string_sub(escape_chars, escape_char_index, + escape_char_index) + -- map single byte to double-byte + local r = 0 -- suffix char value to the escapeChar + + local decode_search = {} + local decode_translate = {} + for i = 1, #encode_bytes do + local c = string_sub(encode_bytes, i, i) + if not encode_translate[c] then + while r >= 256 or taken[r] do + r = r + 1 + if r > 255 then -- switch to next escapeChar + decode_patterns[#decode_patterns + 1] = + escape_for_gsub(escape_char) .. "([" .. + escape_for_gsub(table_concat(decode_search)) .. "])" + decode_repls[#decode_repls + 1] = decode_translate + + escape_char_index = escape_char_index + 1 + escape_char = string_sub(escape_chars, escape_char_index, + escape_char_index) + r = 0 + decode_search = {} + decode_translate = {} + + if not escape_char or escape_char == "" then + -- actually I don't need to check + -- "not ecape_char", but what if Lua changes + -- the behavior of string.sub() in the future? + -- we are out of escape chars and we need more! + return nil, "Out of escape characters." + end + end + end + + local char_r = _byte_to_char[r] + encode_translate[c] = escape_char .. char_r + encode_search[#encode_search + 1] = c + decode_translate[char_r] = c + decode_search[#decode_search + 1] = char_r + r = r + 1 + end + if i == #encode_bytes then + decode_patterns[#decode_patterns + 1] = + escape_for_gsub(escape_char) .. "([" .. + escape_for_gsub(table_concat(decode_search)) .. "])" + decode_repls[#decode_repls + 1] = decode_translate + end + end + + local codec = {} + + local encode_pattern = "([" .. escape_for_gsub(table_concat(encode_search)) .. + "])" + local encode_repl = encode_translate + + function codec:Encode(str) + if type(str) ~= "string" then + error( + ("Usage: codec:Encode(str):" .. " 'str' - string expected got '%s'."):format( + type(str)), 2) + end + return string_gsub(str, encode_pattern, encode_repl) + end + + local decode_tblsize = #decode_patterns + local decode_fail_pattern = "([" .. escape_for_gsub(reserved_chars) .. "])" + + function codec:Decode(str) + if type(str) ~= "string" then + error( + ("Usage: codec:Decode(str):" .. " 'str' - string expected got '%s'."):format( + type(str)), 2) + end + if string_find(str, decode_fail_pattern) then return nil end + for i = 1, decode_tblsize do + str = string_gsub(str, decode_patterns[i], decode_repls[i]) + end + return str + end + + return codec end local _addon_channel_codec local function GenerateWoWAddonChannelCodec() - return LibDeflate:CreateCodec("\000", "\001", "") + return LibDeflate:CreateCodec("\000", "\001", "") end --- Encode the string to make it ready to be transmitted in World of @@ -3086,14 +3068,14 @@ end -- @return The encoded string. -- @see LibDeflate:DecodeForWoWAddonChannel function LibDeflate:EncodeForWoWAddonChannel(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:EncodeForWoWAddonChannel(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if not _addon_channel_codec then - _addon_channel_codec = GenerateWoWAddonChannelCodec() - end - return _addon_channel_codec:Encode(str) + if type(str) ~= "string" then + error(("Usage: LibDeflate:EncodeForWoWAddonChannel(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + if not _addon_channel_codec then + _addon_channel_codec = GenerateWoWAddonChannelCodec() + end + return _addon_channel_codec:Encode(str) end --- Decode the string produced by LibDeflate:EncodeForWoWAddonChannel @@ -3101,21 +3083,19 @@ end -- @return [string/nil] The decoded string if succeeds. nil if fails. -- @see LibDeflate:EncodeForWoWAddonChannel function LibDeflate:DecodeForWoWAddonChannel(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:DecodeForWoWAddonChannel(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if not _addon_channel_codec then - _addon_channel_codec = GenerateWoWAddonChannelCodec() - end - return _addon_channel_codec:Decode(str) + if type(str) ~= "string" then + error(("Usage: LibDeflate:DecodeForWoWAddonChannel(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + if not _addon_channel_codec then + _addon_channel_codec = GenerateWoWAddonChannelCodec() + end + return _addon_channel_codec:Decode(str) end -- For World of Warcraft Chat Channel Encoding --- implemented by Galmok of European Stormrage (Horde), galmok@gmail.com --- From LibCompress , --- which is licensed under GPLv2 --- The code has been modified by the author of LibDeflate. +-- Credits to LibCompress. +-- The code has been rewritten by the author of LibDeflate.
-- Following byte values are not allowed: -- \000, s, S, \010, \013, \124, % -- Because SendChatMessage will error @@ -3136,14 +3116,11 @@ end -- 53.5% (average with random data valued zero to 255) -- 100% (only encoding data that encodes to two bytes) local function GenerateWoWChatChannelCodec() - local r = {} - for i = 128, 255 do - r[#r+1] = _byte_to_char[i] - end - - local reserved_chars = "sS\000\010\013\124%"..table_concat(r) - return LibDeflate:CreateCodec(reserved_chars - , "\029\031", "\015\020") + local r = {} + for i = 128, 255 do r[#r + 1] = _byte_to_char[i] end + + local reserved_chars = "sS\000\010\013\124%" .. table_concat(r) + return LibDeflate:CreateCodec(reserved_chars, "\029\031", "\015\020") end local _chat_channel_codec @@ -3155,14 +3132,14 @@ local _chat_channel_codec -- @return [string] The encoded string. -- @see LibDeflate:DecodeForWoWChatChannel function LibDeflate:EncodeForWoWChatChannel(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:EncodeForWoWChatChannel(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if not _chat_channel_codec then - _chat_channel_codec = GenerateWoWChatChannelCodec() - end - return _chat_channel_codec:Encode(str) + if type(str) ~= "string" then + error(("Usage: LibDeflate:EncodeForWoWChatChannel(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + if not _chat_channel_codec then + _chat_channel_codec = GenerateWoWChatChannelCodec() + end + return _chat_channel_codec:Encode(str) end --- Decode the string produced by LibDeflate:EncodeForWoWChatChannel. @@ -3170,47 +3147,160 @@ end -- @return [string/nil] The decoded string if succeeds. nil if fails. -- @see LibDeflate:EncodeForWoWChatChannel function LibDeflate:DecodeForWoWChatChannel(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:DecodeForWoWChatChannel(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - if not _chat_channel_codec then - _chat_channel_codec = GenerateWoWChatChannelCodec() - end - return _chat_channel_codec:Decode(str) + if type(str) ~= "string" then + error(("Usage: LibDeflate:DecodeForWoWChatChannel(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + if not _chat_channel_codec then + _chat_channel_codec = GenerateWoWChatChannelCodec() + end + return _chat_channel_codec:Decode(str) end --- Credits to WeakAuras , --- and Galmok (galmok@gmail.com) for the 6 bit encoding algorithm. +-- Credits to WeakAuras2 and Galmok for the 6 bit encoding algorithm. +-- The code has been rewritten by the author of LibDeflate. -- The result of encoding will be 25% larger than the -- origin string, but every single byte of the encoding result will be -- printable characters as the following. local _byte_to_6bit_char = { - [0]="a", "b", "c", "d", "e", "f", "g", "h", - "i", "j", "k", "l", "m", "n", "o", "p", - "q", "r", "s", "t", "u", "v", "w", "x", - "y", "z", "A", "B", "C", "D", "E", "F", - "G", "H", "I", "J", "K", "L", "M", "N", - "O", "P", "Q", "R", "S", "T", "U", "V", - "W", "X", "Y", "Z", "0", "1", "2", "3", - "4", "5", "6", "7", "8", "9", "(", ")", + [0] = "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "(", + ")" } local _6bit_to_byte = { - [97]=0,[98]=1,[99]=2,[100]=3,[101]=4,[102]=5,[103]=6,[104]=7, - [105]=8,[106]=9,[107]=10,[108]=11,[109]=12,[110]=13,[111]=14,[112]=15, - [113]=16,[114]=17,[115]=18,[116]=19,[117]=20,[118]=21,[119]=22,[120]=23, - [121]=24,[122]=25,[65]=26,[66]=27,[67]=28,[68]=29,[69]=30,[70]=31, - [71]=32,[72]=33,[73]=34,[74]=35,[75]=36,[76]=37,[77]=38,[78]=39, - [79]=40,[80]=41,[81]=42,[82]=43,[83]=44,[84]=45,[85]=46,[86]=47, - [87]=48,[88]=49,[89]=50,[90]=51,[48]=52,[49]=53,[50]=54,[51]=55, - [52]=56,[53]=57,[54]=58,[55]=59,[56]=60,[57]=61,[40]=62,[41]=63, + [97] = 0, + [98] = 1, + [99] = 2, + [100] = 3, + [101] = 4, + [102] = 5, + [103] = 6, + [104] = 7, + [105] = 8, + [106] = 9, + [107] = 10, + [108] = 11, + [109] = 12, + [110] = 13, + [111] = 14, + [112] = 15, + [113] = 16, + [114] = 17, + [115] = 18, + [116] = 19, + [117] = 20, + [118] = 21, + [119] = 22, + [120] = 23, + [121] = 24, + [122] = 25, + [65] = 26, + [66] = 27, + [67] = 28, + [68] = 29, + [69] = 30, + [70] = 31, + [71] = 32, + [72] = 33, + [73] = 34, + [74] = 35, + [75] = 36, + [76] = 37, + [77] = 38, + [78] = 39, + [79] = 40, + [80] = 41, + [81] = 42, + [82] = 43, + [83] = 44, + [84] = 45, + [85] = 46, + [86] = 47, + [87] = 48, + [88] = 49, + [89] = 50, + [90] = 51, + [48] = 52, + [49] = 53, + [50] = 54, + [51] = 55, + [52] = 56, + [53] = 57, + [54] = 58, + [55] = 59, + [56] = 60, + [57] = 61, + [40] = 62, + [41] = 63 } --- Encode the string to make it printable.
-- --- Credis to WeakAuras2, this function is equivalant to the implementation +-- Credit to WeakAuras2, this function is equivalant to the implementation -- it is using right now.
+-- The code has been rewritten by the author of LibDeflate.
-- The encoded string will be 25% larger than the origin string. However, every -- single byte of the encoded string will be one of 64 printable ASCII -- characters, which are can be easier copied, pasted and displayed. @@ -3219,48 +3309,47 @@ local _6bit_to_byte = { -- @param str [string] The string to be encoded. -- @return [string] The encoded string. function LibDeflate:EncodeForPrint(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:EncodeForPrint(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - local strlen = #str - local strlenMinus2 = strlen - 2 - local i = 1 - local buffer = {} - local buffer_size = 0 - while i <= strlenMinus2 do - local x1, x2, x3 = string_byte(str, i, i+2) - i = i + 3 - local cache = x1+x2*256+x3*65536 - local b1 = cache % 64 - cache = (cache - b1) / 64 - local b2 = cache % 64 - cache = (cache - b2) / 64 - local b3 = cache % 64 - local b4 = (cache - b3) / 64 - buffer_size = buffer_size + 1 - buffer[buffer_size] = - _byte_to_6bit_char[b1].._byte_to_6bit_char[b2] - .._byte_to_6bit_char[b3].._byte_to_6bit_char[b4] - end - - local cache = 0 - local cache_bitlen = 0 - while i <= strlen do - local x = string_byte(str, i, i) - cache = cache + x * _pow2[cache_bitlen] - cache_bitlen = cache_bitlen + 8 - i = i + 1 - end - while cache_bitlen > 0 do - local bit6 = cache % 64 - buffer_size = buffer_size + 1 - buffer[buffer_size] = _byte_to_6bit_char[bit6] - cache = (cache - bit6) / 64 - cache_bitlen = cache_bitlen - 6 - end - - return table_concat(buffer) + if type(str) ~= "string" then + error(("Usage: LibDeflate:EncodeForPrint(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + local strlen = #str + local strlenMinus2 = strlen - 2 + local i = 1 + local buffer = {} + local buffer_size = 0 + while i <= strlenMinus2 do + local x1, x2, x3 = string_byte(str, i, i + 2) + i = i + 3 + local cache = x1 + x2 * 256 + x3 * 65536 + local b1 = cache % 64 + cache = (cache - b1) / 64 + local b2 = cache % 64 + cache = (cache - b2) / 64 + local b3 = cache % 64 + local b4 = (cache - b3) / 64 + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_6bit_char[b1] .. _byte_to_6bit_char[b2] .. + _byte_to_6bit_char[b3] .. _byte_to_6bit_char[b4] + end + + local cache = 0 + local cache_bitlen = 0 + while i <= strlen do + local x = string_byte(str, i, i) + cache = cache + x * _pow2[cache_bitlen] + cache_bitlen = cache_bitlen + 8 + i = i + 1 + end + while cache_bitlen > 0 do + local bit6 = cache % 64 + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_6bit_char[bit6] + cache = (cache - bit6) / 64 + cache_bitlen = cache_bitlen - 6 + end + + return table_concat(buffer) end --- Decode the printable string produced by LibDeflate:EncodeForPrint. @@ -3274,79 +3363,73 @@ end -- @param str [string] The string to be decoded -- @return [string/nil] The decoded string if succeeds. nil if fails. function LibDeflate:DecodeForPrint(str) - if type(str) ~= "string" then - error(("Usage: LibDeflate:DecodeForPrint(str):" - .." 'str' - string expected got '%s'."):format(type(str)), 2) - end - str = str:gsub("^[%c ]+", "") - str = str:gsub("[%c ]+$", "") - - local strlen = #str - if strlen == 1 then - return nil - end - local strlenMinus3 = strlen - 3 - local i = 1 - local buffer = {} - local buffer_size = 0 - while i <= strlenMinus3 do - local x1, x2, x3, x4 = string_byte(str, i, i+3) - x1 = _6bit_to_byte[x1] - x2 = _6bit_to_byte[x2] - x3 = _6bit_to_byte[x3] - x4 = _6bit_to_byte[x4] - if not (x1 and x2 and x3 and x4) then - return nil - end - i = i + 4 - local cache = x1+x2*64+x3*4096+x4*262144 - local b1 = cache % 256 - cache = (cache - b1) / 256 - local b2 = cache % 256 - local b3 = (cache - b2) / 256 - buffer_size = buffer_size + 1 - buffer[buffer_size] = - _byte_to_char[b1].._byte_to_char[b2].._byte_to_char[b3] - end - - local cache = 0 - local cache_bitlen = 0 - while i <= strlen do - local x = string_byte(str, i, i) - x = _6bit_to_byte[x] - if not x then - return nil - end - cache = cache + x * _pow2[cache_bitlen] - cache_bitlen = cache_bitlen + 6 - i = i + 1 - end - - while cache_bitlen >= 8 do - local byte = cache % 256 - buffer_size = buffer_size + 1 - buffer[buffer_size] = _byte_to_char[byte] - cache = (cache - byte) / 256 - cache_bitlen = cache_bitlen - 8 - end - - return table_concat(buffer) + if type(str) ~= "string" then + error(("Usage: LibDeflate:DecodeForPrint(str):" .. + " 'str' - string expected got '%s'."):format(type(str)), 2) + end + str = str:gsub("^[%c ]+", "") + str = str:gsub("[%c ]+$", "") + + local strlen = #str + if strlen == 1 then return nil end + local strlenMinus3 = strlen - 3 + local i = 1 + local buffer = {} + local buffer_size = 0 + while i <= strlenMinus3 do + local x1, x2, x3, x4 = string_byte(str, i, i + 3) + x1 = _6bit_to_byte[x1] + x2 = _6bit_to_byte[x2] + x3 = _6bit_to_byte[x3] + x4 = _6bit_to_byte[x4] + if not (x1 and x2 and x3 and x4) then return nil end + i = i + 4 + local cache = x1 + x2 * 64 + x3 * 4096 + x4 * 262144 + local b1 = cache % 256 + cache = (cache - b1) / 256 + local b2 = cache % 256 + local b3 = (cache - b2) / 256 + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_char[b1] .. _byte_to_char[b2] .. + _byte_to_char[b3] + end + + local cache = 0 + local cache_bitlen = 0 + while i <= strlen do + local x = string_byte(str, i, i) + x = _6bit_to_byte[x] + if not x then return nil end + cache = cache + x * _pow2[cache_bitlen] + cache_bitlen = cache_bitlen + 6 + i = i + 1 + end + + while cache_bitlen >= 8 do + local byte = cache % 256 + buffer_size = buffer_size + 1 + buffer[buffer_size] = _byte_to_char[byte] + cache = (cache - byte) / 256 + cache_bitlen = cache_bitlen - 8 + end + + return table_concat(buffer) end local function InternalClearCache() - _chat_channel_codec = nil - _addon_channel_codec = nil + _chat_channel_codec = nil + _addon_channel_codec = nil end -- For test. Don't use the functions in this table for real application. -- Stuffs in this table is subject to change. LibDeflate.internals = { - LoadStringToTable = LoadStringToTable, - IsValidDictionary = IsValidDictionary, - IsEqualAdler32 = IsEqualAdler32, - _byte_to_6bit_char = _byte_to_6bit_char, - _6bit_to_byte = _6bit_to_byte, - InternalClearCache = InternalClearCache, + LoadStringToTable = LoadStringToTable, + IsValidDictionary = IsValidDictionary, + IsEqualAdler32 = IsEqualAdler32, + _byte_to_6bit_char = _byte_to_6bit_char, + _6bit_to_byte = _6bit_to_byte, + InternalClearCache = InternalClearCache } --[[-- Commandline options @@ -3368,169 +3451,155 @@ the entire preset dictionary. -- currently no plan to support stdin and stdout. -- Because Lua in Windows does not set stdout with binary mode. if io and os and debug and _G.arg then - local io = io - local os = os - local debug = debug - local arg = _G.arg - local debug_info = debug.getinfo(1) - if debug_info.source == arg[0] - or debug_info.short_src == arg[0] then - -- We are indeed runnning THIS file from the commandline. - local input - local output - local i = 1 - local status - local is_zlib = false - local is_decompress = false - local level - local strategy - local dictionary - while (arg[i]) do - local a = arg[i] - if a == "-h" then - print(LibDeflate._COPYRIGHT - .."\nUsage: lua LibDeflate.lua [OPTION] [INPUT] [OUTPUT]\n" - .." -0 store only. no compression.\n" - .." -1 fastest compression.\n" - .." -9 slowest and best compression.\n" - .." -d do decompression instead of compression.\n" - .." --dict specify the file that contains" - .." the entire preset dictionary.\n" - .." -h give this help.\n" - .." --strategy " - .." specify a special compression strategy.\n" - .." -v print the version and copyright info.\n" - .." --zlib use zlib format instead of raw deflate.\n") - os.exit(0) - elseif a == "-v" then - print(LibDeflate._COPYRIGHT) - os.exit(0) - elseif a:find("^%-[0-9]$") then - level = tonumber(a:sub(2, 2)) - elseif a == "-d" then - is_decompress = true - elseif a == "--dict" then - i = i + 1 - local dict_filename = arg[i] - if not dict_filename then - io.stderr:write("You must speicify the dict filename") - os.exit(1) - end - local dict_file, dict_status = io.open(dict_filename, "rb") - if not dict_file then - io.stderr:write( - ("LibDeflate: Cannot read the dictionary file '%s': %s") - :format(dict_filename, dict_status)) - os.exit(1) - end - local dict_str = dict_file:read("*all") - dict_file:close() - -- In your lua program, you should pass in adler32 as a CONSTANT - -- , so it actually prevent you from modifying dictionary - -- unintentionally during the program development. I do this - -- here just because no convenient way to verify in commandline. - dictionary = LibDeflate:CreateDictionary(dict_str, - #dict_str, LibDeflate:Adler32(dict_str)) - elseif a == "--strategy" then - -- Not sure if I should check error here - -- If I do, redudant code. - i = i + 1 - strategy = arg[i] - elseif a == "--zlib" then - is_zlib = true - elseif a:find("^%-") then - io.stderr:write(("LibDeflate: Invalid argument: %s") - :format(a)) - os.exit(1) - else - if not input then - input, status = io.open(a, "rb") - if not input then - io.stderr:write( - ("LibDeflate: Cannot read the file '%s': %s") - :format(a, tostring(status))) - os.exit(1) - end - elseif not output then - output, status = io.open(a, "wb") - if not output then - io.stderr:write( - ("LibDeflate: Cannot write the file '%s': %s") - :format(a, tostring(status))) - os.exit(1) - end - end - end - i = i + 1 - end -- while (arg[i]) - - if not input or not output then - io.stderr:write("LibDeflate:" - .." You must specify both input and output files.") - os.exit(1) - end - - local input_data = input:read("*all") - local configs = { - level = level, - strategy = strategy, - } - local output_data - if not is_decompress then - if not is_zlib then - if not dictionary then - output_data = - LibDeflate:CompressDeflate(input_data, configs) - else - output_data = - LibDeflate:CompressDeflateWithDict(input_data, dictionary - , configs) - end - else - if not dictionary then - output_data = - LibDeflate:CompressZlib(input_data, configs) - else - output_data = - LibDeflate:CompressZlibWithDict(input_data, dictionary - , configs) - end - end - else - if not is_zlib then - if not dictionary then - output_data = LibDeflate:DecompressDeflate(input_data) - else - output_data = LibDeflate:DecompressDeflateWithDict( - input_data, dictionary) - end - else - if not dictionary then - output_data = LibDeflate:DecompressZlib(input_data) - else - output_data = LibDeflate:DecompressZlibWithDict( - input_data, dictionary) - end - end - end - - if not output_data then - io.stderr:write("LibDeflate: Decompress fails.") - os.exit(1) - end - - output:write(output_data) - if input and input ~= io.stdin then - input:close() - end - if output and output ~= io.stdout then - output:close() - end - - io.stderr:write(("Successfully writes %d bytes"):format( - output_data:len())) - os.exit(0) - end + local io = io + local os = os + local debug = debug + local arg = _G.arg + local debug_info = debug.getinfo(1) + if debug_info.source == arg[0] or debug_info.short_src == arg[0] then + -- We are indeed runnning THIS file from the commandline. + local input + local output + local i = 1 + local status + local is_zlib = false + local is_decompress = false + local level + local strategy + local dictionary + while (arg[i]) do + local a = arg[i] + if a == "-h" then + print(LibDeflate._COPYRIGHT .. + "\nUsage: lua LibDeflate.lua [OPTION] [INPUT] [OUTPUT]\n" .. + " -0 store only. no compression.\n" .. + " -1 fastest compression.\n" .. + " -9 slowest and best compression.\n" .. + " -d do decompression instead of compression.\n" .. + " --dict specify the file that contains" .. + " the entire preset dictionary.\n" .. + " -h give this help.\n" .. + " --strategy " .. + " specify a special compression strategy.\n" .. + " -v print the version and copyright info.\n" .. + " --zlib use zlib format instead of raw deflate.\n") + os.exit(0) + elseif a == "-v" then + print(LibDeflate._COPYRIGHT) + os.exit(0) + elseif a:find("^%-[0-9]$") then + level = tonumber(a:sub(2, 2)) + elseif a == "-d" then + is_decompress = true + elseif a == "--dict" then + i = i + 1 + local dict_filename = arg[i] + if not dict_filename then + io.stderr:write("You must speicify the dict filename") + os.exit(1) + end + local dict_file, dict_status = io.open(dict_filename, "rb") + if not dict_file then + io.stderr:write( + ("LibDeflate: Cannot read the dictionary file '%s': %s"):format( + dict_filename, dict_status)) + os.exit(1) + end + local dict_str = dict_file:read("*all") + dict_file:close() + -- In your lua program, you should pass in adler32 as a CONSTANT + -- , so it actually prevent you from modifying dictionary + -- unintentionally during the program development. I do this + -- here just because no convenient way to verify in commandline. + dictionary = LibDeflate:CreateDictionary(dict_str, #dict_str, + LibDeflate:Adler32(dict_str)) + elseif a == "--strategy" then + -- Not sure if I should check error here + -- If I do, redudant code. + i = i + 1 + strategy = arg[i] + elseif a == "--zlib" then + is_zlib = true + elseif a:find("^%-") then + io.stderr:write(("LibDeflate: Invalid argument: %s"):format(a)) + os.exit(1) + else + if not input then + input, status = io.open(a, "rb") + if not input then + io.stderr:write( + ("LibDeflate: Cannot read the file '%s': %s"):format(a, tostring( + status))) + os.exit(1) + end + elseif not output then + output, status = io.open(a, "wb") + if not output then + io.stderr:write( + ("LibDeflate: Cannot write the file '%s': %s"):format(a, tostring( + status))) + os.exit(1) + end + end + end + i = i + 1 + end -- while (arg[i]) + + if not input or not output then + io.stderr:write("LibDeflate:" .. + " You must specify both input and output files.") + os.exit(1) + end + + local input_data = input:read("*all") + local configs = {level = level, strategy = strategy} + local output_data + if not is_decompress then + if not is_zlib then + if not dictionary then + output_data = LibDeflate:CompressDeflate(input_data, configs) + else + output_data = LibDeflate:CompressDeflateWithDict(input_data, + dictionary, configs) + end + else + if not dictionary then + output_data = LibDeflate:CompressZlib(input_data, configs) + else + output_data = LibDeflate:CompressZlibWithDict(input_data, dictionary, + configs) + end + end + else + if not is_zlib then + if not dictionary then + output_data = LibDeflate:DecompressDeflate(input_data) + else + output_data = LibDeflate:DecompressDeflateWithDict(input_data, + dictionary) + end + else + if not dictionary then + output_data = LibDeflate:DecompressZlib(input_data) + else + output_data = + LibDeflate:DecompressZlibWithDict(input_data, dictionary) + end + end + end + + if not output_data then + io.stderr:write("LibDeflate: Decompress fails.") + os.exit(1) + end + + output:write(output_data) + if input and input ~= io.stdin then input:close() end + if output and output ~= io.stdout then output:close() end + + io.stderr:write(("Successfully writes %d bytes"):format(output_data:len())) + os.exit(0) + end end return LibDeflate From 2765b2e1fdf83e51b4e2d21a697de28646ee5e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 28 Mar 2024 09:48:53 +0100 Subject: [PATCH 2/5] Libraries cleanup --- .gitignore | 21 + .../Classic/LibQuestXP/LibQuestXP.lua | 92 - .../Classic/LibQuestXP/LibQuestXP.xml | 5 - .../Classic/LibQuestXP/LibQuestXPDB.lua | 3847 ----------------- ElvUI_Libraries/Classic/Libs.xml | 7 +- .../Core/Ace3/AceAddon-3.0/AceAddon-3.0.lua | 649 --- .../Core/Ace3/AceAddon-3.0/AceAddon-3.0.xml | 4 - .../Core/Ace3/AceComm-3.0/AceComm-3.0.lua | 301 -- .../Core/Ace3/AceComm-3.0/AceComm-3.0.xml | 5 - .../Core/Ace3/AceComm-3.0/ChatThrottleLib.lua | 534 --- .../Ace3/AceConsole-3.0/AceConsole-3.0.lua | 246 -- .../Ace3/AceConsole-3.0/AceConsole-3.0.xml | 4 - .../Core/Ace3/AceDB-3.0/AceDB-3.0.lua | 740 ---- .../Core/Ace3/AceDB-3.0/AceDB-3.0.xml | 4 - .../AceDBOptions-3.0/AceDBOptions-3.0.lua | 456 -- .../AceDBOptions-3.0/AceDBOptions-3.0.xml | 4 - .../Core/Ace3/AceEvent-3.0/AceEvent-3.0.lua | 126 - .../Core/Ace3/AceEvent-3.0/AceEvent-3.0.xml | 4 - .../Core/Ace3/AceHook-3.0/AceHook-3.0.lua | 510 --- .../Core/Ace3/AceHook-3.0/AceHook-3.0.xml | 4 - .../AceSerializer-3.0/AceSerializer-3.0.lua | 287 -- .../AceSerializer-3.0/AceSerializer-3.0.xml | 4 - .../Core/Ace3/AceTimer-3.0/AceTimer-3.0.lua | 278 -- .../Core/Ace3/AceTimer-3.0/AceTimer-3.0.xml | 4 - .../BackgroundWidget.lua | 235 - .../BorderWidget.lua | 230 - .../FontWidget.lua | 216 - .../SoundWidget.lua | 264 -- .../StatusbarWidget.lua | 233 - .../prototypes.lua | 266 -- .../AceGUI-3.0-SharedMediaWidgets/widget.xml | 9 - .../CallbackHandler-1.0.lua | 202 - .../Core/CallbackHandler-1.0/LICENSE.txt | 23 - .../Core/LibCustomGlow-1.0/LICENSE.txt | 21 - .../LibCustomGlow-1.0/LibCustomGlow-1.0.lua | 901 ---- .../Core/LibDataBroker/LibDataBroker-1.1.lua | 90 - .../Core/LibDualSpec-1.0/LICENSE.txt | 30 - .../Core/LibDualSpec-1.0/LibDualSpec-1.0.lua | 466 -- .../Core/LibSharedMedia-3.0/LICENSE.txt | 458 -- .../LibSharedMedia-3.0/LibSharedMedia-3.0.lua | 300 -- ElvUI_Libraries/Core/LibStub/LibStub.lua | 51 - .../Core/LibTranslit-1.0/LICENSE.txt | 165 - .../Core/LibTranslit-1.0/LibTranslit-1.0.lua | 129 - ElvUI_Libraries/Core/Taintless/Taintless.xml | 167 - ElvUI_Libraries/Core/UTF8/LICENSE.txt | 25 - ElvUI_Libraries/Core/UTF8/UTF8.xml | 5 - ElvUI_Libraries/Core/UTF8/utf8.lua | 292 -- ElvUI_Libraries/Core/UTF8/utf8data.lua | 1858 -------- ElvUI_Libraries/Core/oUF/ouf.lua | 5 +- ElvUI_Libraries/Mainline/Libs.xml | 4 +- ElvUI_Libraries/Wrath/Libs.xml | 4 +- ThirdPartyNotices.md | 4 +- 52 files changed, 32 insertions(+), 14757 deletions(-) delete mode 100644 ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.lua delete mode 100644 ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.xml delete mode 100644 ElvUI_Libraries/Classic/LibQuestXP/LibQuestXPDB.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceAddon-3.0/AceAddon-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceAddon-3.0/AceAddon-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceComm-3.0/AceComm-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceComm-3.0/AceComm-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceComm-3.0/ChatThrottleLib.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceConsole-3.0/AceConsole-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceConsole-3.0/AceConsole-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceDB-3.0/AceDB-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceDB-3.0/AceDB-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceEvent-3.0/AceEvent-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceEvent-3.0/AceEvent-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceHook-3.0/AceHook-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceHook-3.0/AceHook-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceSerializer-3.0/AceSerializer-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceSerializer-3.0/AceSerializer-3.0.xml delete mode 100644 ElvUI_Libraries/Core/Ace3/AceTimer-3.0/AceTimer-3.0.lua delete mode 100644 ElvUI_Libraries/Core/Ace3/AceTimer-3.0/AceTimer-3.0.xml delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/prototypes.lua delete mode 100644 ElvUI_Libraries/Core/AceGUI-3.0-SharedMediaWidgets/widget.xml delete mode 100644 ElvUI_Libraries/Core/CallbackHandler-1.0/CallbackHandler-1.0.lua delete mode 100644 ElvUI_Libraries/Core/CallbackHandler-1.0/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/LibCustomGlow-1.0/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/LibCustomGlow-1.0/LibCustomGlow-1.0.lua delete mode 100644 ElvUI_Libraries/Core/LibDataBroker/LibDataBroker-1.1.lua delete mode 100644 ElvUI_Libraries/Core/LibDualSpec-1.0/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/LibDualSpec-1.0/LibDualSpec-1.0.lua delete mode 100644 ElvUI_Libraries/Core/LibSharedMedia-3.0/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/LibSharedMedia-3.0/LibSharedMedia-3.0.lua delete mode 100644 ElvUI_Libraries/Core/LibStub/LibStub.lua delete mode 100644 ElvUI_Libraries/Core/LibTranslit-1.0/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/LibTranslit-1.0/LibTranslit-1.0.lua delete mode 100644 ElvUI_Libraries/Core/Taintless/Taintless.xml delete mode 100644 ElvUI_Libraries/Core/UTF8/LICENSE.txt delete mode 100644 ElvUI_Libraries/Core/UTF8/UTF8.xml delete mode 100644 ElvUI_Libraries/Core/UTF8/utf8.lua delete mode 100644 ElvUI_Libraries/Core/UTF8/utf8data.lua diff --git a/.gitignore b/.gitignore index 9c802fbc3b..3de293f604 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,24 @@ $RECYCLE.BIN/ # Jetbrains local config .idea + +# Libraries +ElvUI_Libraries/Classic/LibQuestXP +ElvUI_Libraries/Core/* +!ElvUI_Libraries/Core/Ace3/AceConfig-3.0 +!ElvUI_Libraries/Core/Ace3/AceGUI-3.0 +!ElvUI_Libraries/Core/Ace3/AceLocale-3.0 +!ElvUI_Libraries/Core/Ace3/LICENSE.txt +!ElvUI_Libraries/Core/LibAceConfigHelper +!ElvUI_Libraries/Core/LibActionButton-1.0 +!ElvUI_Libraries/Core/LibAnim +!ElvUI_Libraries/Core/LibDispel +!ElvUI_Libraries/Core/LibDeflate +!ElvUI_Libraries/Core/LibElvUIPlugin-1.0 +!ElvUI_Libraries/Core/LibRangeCheck-3.0 +!ElvUI_Libraries/Core/LibSimpleSticky +!ElvUI_Libraries/Core/oUF +!ElvUI_Libraries/Core/oUF_Plugins + +# Pipelines +.release \ No newline at end of file diff --git a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.lua b/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.lua deleted file mode 100644 index df0a9b8b50..0000000000 --- a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.lua +++ /dev/null @@ -1,92 +0,0 @@ ---[[ - ## Interface: 11401 - ## Title: LibQuestXP - ## Author: MrFox - ## Email: gyussz@live.com - ## Version: 1.0.9 - ## Notes: Library that re-implements GetQuestLogRewardXP for Classic WoW and provides XP reward information for all quests -]] - -local MAJOR, MINOR = "LibQuestXP-1.0", 9 -local LibQuestXP = LibStub:NewLibrary(MAJOR, MINOR) - -if _G.WOW_PROJECT_ID == _G.WOW_PROJECT_MAINLINE then - return -- Don't load for Retail -end - -if not LibQuestXP then - return -- already loaded and no upgrade necessary -end - -local selectedQuestLogIndex = nil - -local function hookSelectQuestLogEntry(questLogIndex) - selectedQuestLogIndex = questLogIndex -end -hooksecurefunc("SelectQuestLogEntry", hookSelectQuestLogEntry) - -function LibQuestXP:GetQuestInfo(questID) - if LibQuestXPDB[questID] ~= nil then - return LibQuestXPDB[questID]['xp'], LibQuestXPDB[questID]['level'] - end - - return 0, nil -end - -function LibQuestXP:GetAdjustedXP(xp, qLevel) - local charLevel = UnitLevel("player"); - if (charLevel == 60) then - return 0; - end - - local diffFactor = 2 * (qLevel - charLevel) + 20; - if (diffFactor < 1) then - diffFactor = 1; - elseif (diffFactor > 10) then - diffFactor = 10; - end - - xp = xp * diffFactor / 10; - if (xp <= 100) then - xp = 5 * floor((xp + 2) / 5); - elseif (xp <= 500) then - xp = 10 * floor((xp + 5) / 10); - elseif (xp <= 1000) then - xp = 25 * floor((xp + 12) / 25); - else - xp = 50 * floor((xp + 25) / 50); - end - - if C_Seasons ~= nil and C_Seasons.HasActiveSeason() and (C_Seasons.GetActiveSeason() == Enum.SeasonID.SeasonOfMastery) then - local roundFactor = 50; - if xp < 1000 then - roundFactor = 10; - end - - xp = floor(xp / roundFactor + 0.5) * roundFactor * 2.0; - end - - return xp; -end - -function GetQuestLogRewardXP(questID) - local title, qLevel, xp, _ - - -- Try getting the quest from the quest log if no questID was provided - if questID == nil and selectedQuestLogIndex ~= nil then - title, qLevel, _, _, _, _, _, questID = GetQuestLogTitle(selectedQuestLogIndex) - end - - -- Return 0 if quest ID is not found for some reason - if (questID == nil) then return 0 end - - -- Get stored quest XP and quest level - xp, qLevel = LibQuestXP:GetQuestInfo(questID) - - -- Return base XP if level information is not available - if qLevel == nil then return xp end - - -- Return adjusted XP if all information are available - -- print(questID, title, xp, LibQuestXP:GetAdjustedXP(xp, qLevel)); -- Debug - return LibQuestXP:GetAdjustedXP(xp, qLevel) -end diff --git a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.xml b/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.xml deleted file mode 100644 index 483af454e2..0000000000 --- a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXP.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXPDB.lua b/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXPDB.lua deleted file mode 100644 index 92d4d704ab..0000000000 --- a/ElvUI_Libraries/Classic/LibQuestXP/LibQuestXPDB.lua +++ /dev/null @@ -1,3847 +0,0 @@ -if _G.WOW_PROJECT_ID == _G.WOW_PROJECT_MAINLINE then - return -- Don't load for Retail -end - -LibQuestXPDB = { - [1] = {["xp"] = 540, ["level"] = 4}, - [2] = {["xp"] = 2450, ["level"] = 30}, - [5] = {["xp"] = 390, ["level"] = 20}, - [6] = {["xp"] = 335, ["level"] = 5}, - [7] = {["xp"] = 170, ["level"] = 2}, - [8] = {["xp"] = 110, ["level"] = 5}, - [9] = {["xp"] = 1050, ["level"] = 15}, - [10] = {["xp"] = 4400, ["level"] = 48}, - [11] = {["xp"] = 840, ["level"] = 10}, - [12] = {["xp"] = 910, ["level"] = 12}, - [13] = {["xp"] = 980, ["level"] = 14}, - [14] = {["xp"] = 1600, ["level"] = 17}, - [15] = {["xp"] = 250, ["level"] = 3}, - [16] = {["xp"] = 0, ["level"] = nil}, - [17] = {["xp"] = 3450, ["level"] = 42}, - [18] = {["xp"] = 355, ["level"] = 4}, - [19] = {["xp"] = 2550, ["level"] = 25}, - [20] = {["xp"] = 1650, ["level"] = 21}, - [21] = {["xp"] = 450, ["level"] = 5}, - [22] = {["xp"] = 910, ["level"] = 12}, - [23] = {["xp"] = 1950, ["level"] = 24}, - [24] = {["xp"] = 2200, ["level"] = 27}, - [25] = {["xp"] = 2000, ["level"] = 25}, - [26] = {["xp"] = 115, ["level"] = 16}, - [27] = {["xp"] = 115, ["level"] = 16}, - [28] = {["xp"] = 880, ["level"] = 16}, - [29] = {["xp"] = 880, ["level"] = 16}, - [30] = {["xp"] = 880, ["level"] = 16}, - [31] = {["xp"] = 1150, ["level"] = 16}, - [32] = {["xp"] = 5450, ["level"] = 48}, - [33] = {["xp"] = 170, ["level"] = 2}, - [34] = {["xp"] = 1950, ["level"] = 24}, - [35] = {["xp"] = 420, ["level"] = 10}, - [36] = {["xp"] = 420, ["level"] = 10}, - [37] = {["xp"] = 210, ["level"] = 10}, - [38] = {["xp"] = 910, ["level"] = 13}, - [39] = {["xp"] = 1050, ["level"] = 10}, - [40] = {["xp"] = 85, ["level"] = 10}, - [45] = {["xp"] = 420, ["level"] = 10}, - [46] = {["xp"] = 840, ["level"] = 10}, - [47] = {["xp"] = 630, ["level"] = 7}, - [48] = {["xp"] = 3750, ["level"] = 44}, - [49] = {["xp"] = 4650, ["level"] = 44}, - [50] = {["xp"] = 4650, ["level"] = 44}, - [51] = {["xp"] = 4650, ["level"] = 44}, - [52] = {["xp"] = 630, ["level"] = 10}, - [53] = {["xp"] = 5600, ["level"] = 44}, - [54] = {["xp"] = 225, ["level"] = 5}, - [55] = {["xp"] = 3850, ["level"] = 32}, - [56] = {["xp"] = 1450, ["level"] = 24}, - [57] = {["xp"] = 2100, ["level"] = 26}, - [58] = {["xp"] = 2450, ["level"] = 30}, - [59] = {["xp"] = 210, ["level"] = 10}, - [60] = {["xp"] = 475, ["level"] = 7}, - [61] = {["xp"] = 790, ["level"] = 7}, - [62] = {["xp"] = 475, ["level"] = 7}, - [63] = {["xp"] = 1400, ["level"] = 23}, - [64] = {["xp"] = 910, ["level"] = 12}, - [65] = {["xp"] = 1350, ["level"] = 18}, - [66] = {["xp"] = 230, ["level"] = 28}, - [67] = {["xp"] = 1150, ["level"] = 28}, - [68] = {["xp"] = 1700, ["level"] = 28}, - [69] = {["xp"] = 570, ["level"] = 28}, - [70] = {["xp"] = 1700, ["level"] = 28}, - [71] = {["xp"] = 210, ["level"] = 10}, - [72] = {["xp"] = 230, ["level"] = 28}, - [74] = {["xp"] = 1150, ["level"] = 28}, - [75] = {["xp"] = 1150, ["level"] = 28}, - [76] = {["xp"] = 840, ["level"] = 10}, - [77] = {["xp"] = 4400, ["level"] = 48}, - [78] = {["xp"] = 570, ["level"] = 28}, - [79] = {["xp"] = 230, ["level"] = 28}, - [80] = {["xp"] = 230, ["level"] = 28}, - [81] = {["xp"] = 4400, ["level"] = 48}, - [82] = {["xp"] = 3150, ["level"] = 47}, - [83] = {["xp"] = 780, ["level"] = 9}, - [84] = {["xp"] = 135, ["level"] = 6}, - [85] = {["xp"] = 135, ["level"] = 6}, - [86] = {["xp"] = 405, ["level"] = 6}, - [87] = {["xp"] = 880, ["level"] = 8}, - [88] = {["xp"] = 780, ["level"] = 9}, - [89] = {["xp"] = 1550, ["level"] = 20}, - [90] = {["xp"] = 2000, ["level"] = 25}, - [91] = {["xp"] = 1850, ["level"] = 23}, - [92] = {["xp"] = 1350, ["level"] = 18}, - [93] = {["xp"] = 780, ["level"] = 20}, - [94] = {["xp"] = 1250, ["level"] = 21}, - [95] = {["xp"] = 1000, ["level"] = 25}, - [96] = {["xp"] = 2750, ["level"] = 23}, - [97] = {["xp"] = 230, ["level"] = 28}, - [98] = {["xp"] = 4100, ["level"] = 35}, - [99] = {["xp"] = 1350, ["level"] = 15}, - [100] = {["xp"] = 0, ["level"] = nil}, - [101] = {["xp"] = 2550, ["level"] = 25}, - [102] = {["xp"] = 980, ["level"] = 14}, - [103] = {["xp"] = 1150, ["level"] = 16}, - [104] = {["xp"] = 1550, ["level"] = 20}, - [105] = {["xp"] = 8300, ["level"] = 60}, - [106] = {["xp"] = 135, ["level"] = 6}, - [107] = {["xp"] = 135, ["level"] = 6}, - [109] = {["xp"] = 630, ["level"] = 10}, - [110] = {["xp"] = 440, ["level"] = 48}, - [111] = {["xp"] = 135, ["level"] = 6}, - [112] = {["xp"] = 315, ["level"] = 7}, - [113] = {["xp"] = 440, ["level"] = 48}, - [114] = {["xp"] = 790, ["level"] = 7}, - [115] = {["xp"] = 2300, ["level"] = 23}, - [116] = {["xp"] = 1050, ["level"] = 15}, - [117] = {["xp"] = 0, ["level"] = nil}, - [118] = {["xp"] = 340, ["level"] = 18}, - [119] = {["xp"] = 680, ["level"] = 18}, - [120] = {["xp"] = 490, ["level"] = 14}, - [121] = {["xp"] = 245, ["level"] = 14}, - [122] = {["xp"] = 1700, ["level"] = 18}, - [123] = {["xp"] = 210, ["level"] = 10}, - [124] = {["xp"] = 1150, ["level"] = 20}, - [125] = {["xp"] = 880, ["level"] = 16}, - [126] = {["xp"] = 2000, ["level"] = 25}, - [127] = {["xp"] = 1250, ["level"] = 21}, - [128] = {["xp"] = 2000, ["level"] = 25}, - [129] = {["xp"] = 540, ["level"] = 15}, - [130] = {["xp"] = 270, ["level"] = 15}, - [131] = {["xp"] = 270, ["level"] = 15}, - [132] = {["xp"] = 680, ["level"] = 18}, - [133] = {["xp"] = 1650, ["level"] = 27}, - [134] = {["xp"] = 1200, ["level"] = 30}, - [135] = {["xp"] = 680, ["level"] = 18}, - [136] = {["xp"] = 580, ["level"] = 16}, - [138] = {["xp"] = 580, ["level"] = 16}, - [139] = {["xp"] = 580, ["level"] = 16}, - [140] = {["xp"] = 1150, ["level"] = 16}, - [141] = {["xp"] = 340, ["level"] = 18}, - [142] = {["xp"] = 1350, ["level"] = 18}, - [143] = {["xp"] = 490, ["level"] = 14}, - [144] = {["xp"] = 245, ["level"] = 14}, - [145] = {["xp"] = 1000, ["level"] = 18}, - [146] = {["xp"] = 340, ["level"] = 18}, - [147] = {["xp"] = 840, ["level"] = 10}, - [148] = {["xp"] = 485, ["level"] = 24}, - [149] = {["xp"] = 485, ["level"] = 24}, - [150] = {["xp"] = 1550, ["level"] = 20}, - [151] = {["xp"] = 1250, ["level"] = 14}, - [152] = {["xp"] = 1450, ["level"] = 19}, - [153] = {["xp"] = 1050, ["level"] = 15}, - [154] = {["xp"] = 195, ["level"] = 24}, - [155] = {["xp"] = 1700, ["level"] = 18}, - [156] = {["xp"] = 970, ["level"] = 24}, - [157] = {["xp"] = 1450, ["level"] = 24}, - [158] = {["xp"] = 485, ["level"] = 24}, - [159] = {["xp"] = 970, ["level"] = 24}, - [160] = {["xp"] = 610, ["level"] = 30}, - [161] = {["xp"] = 1350, ["level"] = 18}, - [162] = {["xp"] = 5700, ["level"] = 49}, - [163] = {["xp"] = 390, ["level"] = 20}, - [164] = {["xp"] = 920, ["level"] = 23}, - [165] = {["xp"] = 1000, ["level"] = 25}, - [166] = {["xp"] = 2600, ["level"] = 22}, - [167] = {["xp"] = 1550, ["level"] = 20}, - [168] = {["xp"] = 1350, ["level"] = 18}, - [169] = {["xp"] = 2650, ["level"] = 26}, - [170] = {["xp"] = 170, ["level"] = 2}, - [171] = {["xp"] = 390, ["level"] = nil}, - [173] = {["xp"] = 1150, ["level"] = 28}, - [174] = {["xp"] = 2000, ["level"] = 25}, - [175] = {["xp"] = 1000, ["level"] = 25}, - [176] = {["xp"] = 880, ["level"] = 11}, - [177] = {["xp"] = 1500, ["level"] = 25}, - [178] = {["xp"] = 1400, ["level"] = 23}, - [179] = {["xp"] = 80, ["level"] = 1}, - [180] = {["xp"] = 2650, ["level"] = 26}, - [181] = {["xp"] = 2450, ["level"] = 30}, - [182] = {["xp"] = 355, ["level"] = 4}, - [183] = {["xp"] = 250, ["level"] = 3}, - [184] = {["xp"] = 590, ["level"] = 9}, - [185] = {["xp"] = 1250, ["level"] = 31}, - [186] = {["xp"] = 1300, ["level"] = 33}, - [187] = {["xp"] = 2050, ["level"] = 35}, - [188] = {["xp"] = 2850, ["level"] = 37}, - [189] = {["xp"] = 2050, ["level"] = 35}, - [190] = {["xp"] = 1250, ["level"] = 31}, - [191] = {["xp"] = 1300, ["level"] = 33}, - [192] = {["xp"] = 2150, ["level"] = 38}, - [193] = {["xp"] = 3150, ["level"] = 40}, - [194] = {["xp"] = 1350, ["level"] = 34}, - [195] = {["xp"] = 1400, ["level"] = 36}, - [196] = {["xp"] = 2450, ["level"] = 41}, - [197] = {["xp"] = 3600, ["level"] = 43}, - [198] = {["xp"] = 640, ["level"] = 32}, - [199] = {["xp"] = 1350, ["level"] = 18}, - [200] = {["xp"] = 1350, ["level"] = 35}, - [201] = {["xp"] = 255, ["level"] = 32}, - [202] = {["xp"] = 3150, ["level"] = 40}, - [203] = {["xp"] = 1950, ["level"] = 33}, - [204] = {["xp"] = 2700, ["level"] = 34}, - [205] = {["xp"] = 3150, ["level"] = 40}, - [206] = {["xp"] = 5050, ["level"] = 46}, - [207] = {["xp"] = 3550, ["level"] = 38}, - [208] = {["xp"] = 5350, ["level"] = 43}, - [209] = {["xp"] = 3450, ["level"] = 42}, - [210] = {["xp"] = 1400, ["level"] = 37}, - [211] = {["xp"] = 8300, ["level"] = 60}, - [212] = {["xp"] = 4700, ["level"] = 40}, - [213] = {["xp"] = 2800, ["level"] = 36}, - [214] = {["xp"] = 1250, ["level"] = 17}, - [215] = {["xp"] = 1300, ["level"] = 33}, - [216] = {["xp"] = 1950, ["level"] = 24}, - [217] = {["xp"] = 1600, ["level"] = 17}, - [218] = {["xp"] = 560, ["level"] = 5}, - [219] = {["xp"] = 2550, ["level"] = 25}, - [220] = {["xp"] = 460, ["level"] = 23}, - [221] = {["xp"] = 1750, ["level"] = 29}, - [222] = {["xp"] = 1900, ["level"] = 31}, - [223] = {["xp"] = 3150, ["level"] = 31}, - [224] = {["xp"] = 910, ["level"] = 12}, - [225] = {["xp"] = 690, ["level"] = 35}, - [226] = {["xp"] = 1250, ["level"] = 21}, - [227] = {["xp"] = 275, ["level"] = 35}, - [228] = {["xp"] = 2050, ["level"] = 35}, - [229] = {["xp"] = 275, ["level"] = 35}, - [230] = {["xp"] = 1000, ["level"] = 25}, - [231] = {["xp"] = 1350, ["level"] = 35}, - [232] = {["xp"] = 390, ["level"] = 45}, - [233] = {["xp"] = 190, ["level"] = 3}, - [234] = {["xp"] = 270, ["level"] = 4}, - [235] = {["xp"] = 155, ["level"] = 20}, - [236] = {["xp"] = 12190, ["level"] = 80}, - [237] = {["xp"] = 1050, ["level"] = 15}, - [238] = {["xp"] = 390, ["level"] = 45}, - [239] = {["xp"] = 210, ["level"] = 10}, - [240] = {["xp"] = 780, ["level"] = 20}, - [242] = {["xp"] = 0, ["level"] = nil}, - [243] = {["xp"] = 2000, ["level"] = 46}, - [244] = {["xp"] = 290, ["level"] = 16}, - [245] = {["xp"] = 1250, ["level"] = 21}, - [246] = {["xp"] = 950, ["level"] = 17}, - [247] = {["xp"] = 3050, ["level"] = 30}, - [248] = {["xp"] = 1300, ["level"] = 22}, - [249] = {["xp"] = 2750, ["level"] = 27}, - [250] = {["xp"] = 680, ["level"] = 18}, - [251] = {["xp"] = 245, ["level"] = 30}, - [252] = {["xp"] = 245, ["level"] = 30}, - [253] = {["xp"] = 3650, ["level"] = 30}, - [254] = {["xp"] = 0, ["level"] = nil}, - [255] = {["xp"] = 1800, ["level"] = 19}, - [256] = {["xp"] = 1750, ["level"] = 22}, - [257] = {["xp"] = 880, ["level"] = 16}, - [258] = {["xp"] = 950, ["level"] = 17}, - [261] = {["xp"] = 3000, ["level"] = 39}, - [262] = {["xp"] = 510, ["level"] = 25}, - [263] = {["xp"] = 1050, ["level"] = 15}, - [264] = {["xp"] = 540, ["level"] = 15}, - [265] = {["xp"] = 200, ["level"] = 25}, - [266] = {["xp"] = 200, ["level"] = 25}, - [267] = {["xp"] = 910, ["level"] = 12}, - [268] = {["xp"] = 510, ["level"] = 25}, - [269] = {["xp"] = 590, ["level"] = 29}, - [270] = {["xp"] = 1200, ["level"] = 29}, - [271] = {["xp"] = 780, ["level"] = 20}, - [272] = {["xp"] = 880, ["level"] = 16}, - [273] = {["xp"] = 270, ["level"] = 15}, - [274] = {["xp"] = 340, ["level"] = 18}, - [275] = {["xp"] = 2650, ["level"] = 26}, - [276] = {["xp"] = 1250, ["level"] = 21}, - [277] = {["xp"] = 1850, ["level"] = 23}, - [278] = {["xp"] = 1350, ["level"] = 18}, - [279] = {["xp"] = 1750, ["level"] = 22}, - [280] = {["xp"] = 680, ["level"] = 18}, - [281] = {["xp"] = 510, ["level"] = 25}, - [282] = {["xp"] = 335, ["level"] = 5}, - [283] = {["xp"] = 1950, ["level"] = 20}, - [284] = {["xp"] = 510, ["level"] = 25}, - [285] = {["xp"] = 1000, ["level"] = 25}, - [286] = {["xp"] = 1500, ["level"] = 25}, - [287] = {["xp"] = 590, ["level"] = 9}, - [288] = {["xp"] = 220, ["level"] = 27}, - [289] = {["xp"] = 1750, ["level"] = 29}, - [290] = {["xp"] = 1200, ["level"] = 30}, - [291] = {["xp"] = 420, ["level"] = 10}, - [292] = {["xp"] = 1200, ["level"] = 30}, - [293] = {["xp"] = 2450, ["level"] = 30}, - [294] = {["xp"] = 1950, ["level"] = 24}, - [295] = {["xp"] = 2200, ["level"] = 27}, - [296] = {["xp"] = 2950, ["level"] = 29}, - [297] = {["xp"] = 1350, ["level"] = 18}, - [298] = {["xp"] = 270, ["level"] = 15}, - [299] = {["xp"] = 2300, ["level"] = 28}, - [301] = {["xp"] = 540, ["level"] = 15}, - [302] = {["xp"] = 270, ["level"] = 15}, - [303] = {["xp"] = 2450, ["level"] = 30}, - [304] = {["xp"] = 3350, ["level"] = 34}, - [305] = {["xp"] = 970, ["level"] = 24}, - [306] = {["xp"] = 485, ["level"] = 24}, - [307] = {["xp"] = 1350, ["level"] = 15}, - [308] = {["xp"] = 0, ["level"] = nil}, - [309] = {["xp"] = 1050, ["level"] = 15}, - [310] = {["xp"] = 135, ["level"] = 6}, - [311] = {["xp"] = 630, ["level"] = 7}, - [312] = {["xp"] = 910, ["level"] = 12}, - [313] = {["xp"] = 630, ["level"] = 7}, - [314] = {["xp"] = 910, ["level"] = 12}, - [315] = {["xp"] = 780, ["level"] = 9}, - [317] = {["xp"] = 680, ["level"] = 6}, - [318] = {["xp"] = 160, ["level"] = 7}, - [319] = {["xp"] = 530, ["level"] = 8}, - [320] = {["xp"] = 880, ["level"] = 8}, - [321] = {["xp"] = 590, ["level"] = 29}, - [322] = {["xp"] = 1200, ["level"] = 29}, - [323] = {["xp"] = 2300, ["level"] = 28}, - [324] = {["xp"] = 1750, ["level"] = 29}, - [325] = {["xp"] = 590, ["level"] = 29}, - [326] = {["xp"] = 0, ["level"] = nil}, - [328] = {["xp"] = 1400, ["level"] = 37}, - [329] = {["xp"] = 1400, ["level"] = 37}, - [330] = {["xp"] = 285, ["level"] = 37}, - [331] = {["xp"] = 2850, ["level"] = 37}, - [332] = {["xp"] = 130, ["level"] = 2}, - [333] = {["xp"] = 85, ["level"] = 2}, - [334] = {["xp"] = 130, ["level"] = 2}, - [335] = {["xp"] = 2450, ["level"] = 30}, - [336] = {["xp"] = 2450, ["level"] = 30}, - [337] = {["xp"] = 1500, ["level"] = 25}, - [338] = {["xp"] = 4700, ["level"] = 40}, - [339] = {["xp"] = 780, ["level"] = 40}, - [340] = {["xp"] = 780, ["level"] = 40}, - [341] = {["xp"] = 780, ["level"] = 40}, - [342] = {["xp"] = 780, ["level"] = 40}, - [343] = {["xp"] = 195, ["level"] = 24}, - [344] = {["xp"] = 485, ["level"] = 24}, - [345] = {["xp"] = 485, ["level"] = 24}, - [346] = {["xp"] = 1950, ["level"] = 24}, - [347] = {["xp"] = 970, ["level"] = 24}, - [348] = {["xp"] = 5850, ["level"] = 45}, - [349] = {["xp"] = 0, ["level"] = nil}, - [350] = {["xp"] = 250, ["level"] = 31}, - [351] = {["xp"] = 4400, ["level"] = 48}, - [353] = {["xp"] = 1050, ["level"] = 15}, - [354] = {["xp"] = 880, ["level"] = 11}, - [355] = {["xp"] = 85, ["level"] = 10}, - [356] = {["xp"] = 660, ["level"] = 11}, - [357] = {["xp"] = 530, ["level"] = 8}, - [358] = {["xp"] = 700, ["level"] = 8}, - [359] = {["xp"] = 195, ["level"] = 9}, - [360] = {["xp"] = 390, ["level"] = 9}, - [361] = {["xp"] = 475, ["level"] = 7}, - [362] = {["xp"] = 420, ["level"] = 10}, - [363] = {["xp"] = 40, ["level"] = 1}, - [364] = {["xp"] = 170, ["level"] = 2}, - [365] = {["xp"] = 630, ["level"] = 7}, - [366] = {["xp"] = 350, ["level"] = 8}, - [367] = {["xp"] = 540, ["level"] = 6}, - [368] = {["xp"] = 780, ["level"] = 9}, - [369] = {["xp"] = 220, ["level"] = 11}, - [370] = {["xp"] = 780, ["level"] = 9}, - [371] = {["xp"] = 840, ["level"] = 10}, - [372] = {["xp"] = 910, ["level"] = 12}, - [373] = {["xp"] = 870, ["level"] = 22}, - [374] = {["xp"] = 630, ["level"] = 7}, - [375] = {["xp"] = 700, ["level"] = 8}, - [376] = {["xp"] = 170, ["level"] = 2}, - [377] = {["xp"] = 2100, ["level"] = 26}, - [378] = {["xp"] = 2750, ["level"] = 27}, - [379] = {["xp"] = 3050, ["level"] = 46}, - [380] = {["xp"] = 355, ["level"] = 4}, - [381] = {["xp"] = 355, ["level"] = 4}, - [382] = {["xp"] = 670, ["level"] = 5}, - [383] = {["xp"] = 335, ["level"] = 5}, - [384] = {["xp"] = 630, ["level"] = 7}, - [385] = {["xp"] = 1050, ["level"] = 15}, - [386] = {["xp"] = 2000, ["level"] = 25}, - [387] = {["xp"] = 2650, ["level"] = 26}, - [388] = {["xp"] = 2650, ["level"] = 26}, - [389] = {["xp"] = 435, ["level"] = 22}, - [391] = {["xp"] = 2350, ["level"] = 29}, - [392] = {["xp"] = 590, ["level"] = 29}, - [393] = {["xp"] = 590, ["level"] = 29}, - [394] = {["xp"] = 250, ["level"] = 31}, - [395] = {["xp"] = 630, ["level"] = 31}, - [396] = {["xp"] = 3750, ["level"] = 31}, - [397] = {["xp"] = 245, ["level"] = 30}, - [398] = {["xp"] = 840, ["level"] = 10}, - [399] = {["xp"] = 1050, ["level"] = 15}, - [400] = {["xp"] = 110, ["level"] = 5}, - [401] = {["xp"] = 1850, ["level"] = 30}, - [403] = {["xp"] = 0, ["level"] = nil}, - [404] = {["xp"] = 405, ["level"] = 6}, - [405] = {["xp"] = 175, ["level"] = 8}, - [407] = {["xp"] = 160, ["level"] = 7}, - [408] = {["xp"] = 910, ["level"] = 13}, - [409] = {["xp"] = 680, ["level"] = 12}, - [410] = {["xp"] = 0, ["level"] = nil}, - [411] = {["xp"] = 910, ["level"] = 12}, - [412] = {["xp"] = 840, ["level"] = 10}, - [413] = {["xp"] = 420, ["level"] = 10}, - [414] = {["xp"] = 630, ["level"] = 10}, - [415] = {["xp"] = 85, ["level"] = 10}, - [416] = {["xp"] = 880, ["level"] = 11}, - [417] = {["xp"] = 660, ["level"] = 11}, - [418] = {["xp"] = 880, ["level"] = 11}, - [419] = {["xp"] = 420, ["level"] = 10}, - [420] = {["xp"] = 335, ["level"] = 5}, - [421] = {["xp"] = 840, ["level"] = 10}, - [422] = {["xp"] = 880, ["level"] = 11}, - [423] = {["xp"] = 980, ["level"] = 14}, - [424] = {["xp"] = 1050, ["level"] = 15}, - [425] = {["xp"] = 680, ["level"] = 12}, - [426] = {["xp"] = 880, ["level"] = 8}, - [427] = {["xp"] = 700, ["level"] = 8}, - [428] = {["xp"] = 225, ["level"] = 12}, - [429] = {["xp"] = 440, ["level"] = 11}, - [430] = {["xp"] = 660, ["level"] = 11}, - [431] = {["xp"] = 0, ["level"] = nil}, - [432] = {["xp"] = 590, ["level"] = 9}, - [433] = {["xp"] = 660, ["level"] = 11}, - [434] = {["xp"] = 1900, ["level"] = 31}, - [435] = {["xp"] = 880, ["level"] = 11}, - [436] = {["xp"] = 340, ["level"] = 18}, - [437] = {["xp"] = 980, ["level"] = 14}, - [438] = {["xp"] = 880, ["level"] = 16}, - [439] = {["xp"] = 290, ["level"] = 16}, - [440] = {["xp"] = 580, ["level"] = 16}, - [441] = {["xp"] = 580, ["level"] = 16}, - [442] = {["xp"] = 1950, ["level"] = 24}, - [443] = {["xp"] = 1250, ["level"] = 17}, - [444] = {["xp"] = 315, ["level"] = 17}, - [445] = {["xp"] = 630, ["level"] = 10}, - [446] = {["xp"] = 290, ["level"] = 16}, - [447] = {["xp"] = 910, ["level"] = 12}, - [448] = {["xp"] = 580, ["level"] = 16}, - [449] = {["xp"] = 440, ["level"] = 11}, - [450] = {["xp"] = 1350, ["level"] = 15}, - [451] = {["xp"] = 2050, ["level"] = 18}, - [452] = {["xp"] = 1350, ["level"] = 15}, - [453] = {["xp"] = 1000, ["level"] = 25}, - [454] = {["xp"] = 105, ["level"] = 15}, - [455] = {["xp"] = 1250, ["level"] = 21}, - [456] = {["xp"] = 170, ["level"] = 2}, - [457] = {["xp"] = 250, ["level"] = 3}, - [458] = {["xp"] = 40, ["level"] = 1}, - [459] = {["xp"] = 250, ["level"] = 3}, - [460] = {["xp"] = 630, ["level"] = 17}, - [461] = {["xp"] = 680, ["level"] = 18}, - [462] = {["xp"] = 0, ["level"] = nil}, - [463] = {["xp"] = 830, ["level"] = 21}, - [464] = {["xp"] = 2300, ["level"] = 28}, - [465] = {["xp"] = 1900, ["level"] = 31}, - [466] = {["xp"] = 1750, ["level"] = 22}, - [467] = {["xp"] = 460, ["level"] = 23}, - [468] = {["xp"] = 165, ["level"] = 21}, - [469] = {["xp"] = 830, ["level"] = 21}, - [470] = {["xp"] = 2400, ["level"] = 24}, - [471] = {["xp"] = 2100, ["level"] = 26}, - [472] = {["xp"] = 1000, ["level"] = 25}, - [473] = {["xp"] = 230, ["level"] = 28}, - [474] = {["xp"] = 2550, ["level"] = 32}, - [475] = {["xp"] = 270, ["level"] = 6}, - [476] = {["xp"] = 540, ["level"] = 6}, - [477] = {["xp"] = 980, ["level"] = 14}, - [478] = {["xp"] = 740, ["level"] = 14}, - [479] = {["xp"] = 1150, ["level"] = 16}, - [480] = {["xp"] = 1750, ["level"] = 22}, - [481] = {["xp"] = 100, ["level"] = 14}, - [482] = {["xp"] = 100, ["level"] = 14}, - [483] = {["xp"] = 780, ["level"] = 9}, - [484] = {["xp"] = 1750, ["level"] = 22}, - [485] = {["xp"] = 4400, ["level"] = 48}, - [486] = {["xp"] = 1150, ["level"] = 12}, - [487] = {["xp"] = 700, ["level"] = 8}, - [488] = {["xp"] = 450, ["level"] = 5}, - [489] = {["xp"] = 630, ["level"] = 7}, - [490] = {["xp"] = 630, ["level"] = 7}, - [491] = {["xp"] = 1700, ["level"] = 18}, - [492] = {["xp"] = 880, ["level"] = 11}, - [493] = {["xp"] = 1150, ["level"] = 20}, - [494] = {["xp"] = 780, ["level"] = 20}, - [495] = {["xp"] = 300, ["level"] = 39}, - [496] = {["xp"] = 175, ["level"] = 22}, - [497] = {["xp"] = 435, ["level"] = 22}, - [498] = {["xp"] = 2200, ["level"] = 22}, - [499] = {["xp"] = 1750, ["level"] = 22}, - [500] = {["xp"] = 3500, ["level"] = 36}, - [501] = {["xp"] = 1950, ["level"] = 24}, - [502] = {["xp"] = 1450, ["level"] = 24}, - [503] = {["xp"] = 2800, ["level"] = 36}, - [504] = {["xp"] = 4700, ["level"] = 40}, - [505] = {["xp"] = 1950, ["level"] = 33}, - [506] = {["xp"] = 2100, ["level"] = 36}, - [507] = {["xp"] = 4300, ["level"] = 42}, - [508] = {["xp"] = 3900, ["level"] = 40}, - [509] = {["xp"] = 2300, ["level"] = 28}, - [510] = {["xp"] = 1350, ["level"] = 34}, - [511] = {["xp"] = 1350, ["level"] = 34}, - [512] = {["xp"] = 2800, ["level"] = 36}, - [513] = {["xp"] = 1150, ["level"] = 28}, - [514] = {["xp"] = 1350, ["level"] = 34}, - [515] = {["xp"] = 3050, ["level"] = 30}, - [516] = {["xp"] = 1250, ["level"] = 21}, - [517] = {["xp"] = 1200, ["level"] = 30}, - [518] = {["xp"] = 2250, ["level"] = 39}, - [519] = {["xp"] = 3300, ["level"] = 41}, - [520] = {["xp"] = 4450, ["level"] = 43}, - [521] = {["xp"] = 3600, ["level"] = 43}, - [522] = {["xp"] = 710, ["level"] = 38}, - [523] = {["xp"] = 3900, ["level"] = 40}, - [524] = {["xp"] = 3650, ["level"] = 30}, - [525] = {["xp"] = 1350, ["level"] = 34}, - [526] = {["xp"] = 1750, ["level"] = 29}, - [527] = {["xp"] = 1950, ["level"] = 24}, - [528] = {["xp"] = 2000, ["level"] = 25}, - [529] = {["xp"] = 2100, ["level"] = 26}, - [530] = {["xp"] = 1550, ["level"] = 20}, - [531] = {["xp"] = 1550, ["level"] = 20}, - [532] = {["xp"] = 2100, ["level"] = 26}, - [533] = {["xp"] = 2700, ["level"] = 34}, - [535] = {["xp"] = 270, ["level"] = 34}, - [536] = {["xp"] = 1850, ["level"] = 30}, - [537] = {["xp"] = 3150, ["level"] = 40}, - [538] = {["xp"] = 710, ["level"] = 38}, - [539] = {["xp"] = 2300, ["level"] = 28}, - [540] = {["xp"] = 3550, ["level"] = 38}, - [541] = {["xp"] = 2450, ["level"] = 30}, - [542] = {["xp"] = 3550, ["level"] = 38}, - [543] = {["xp"] = 4700, ["level"] = 40}, - [544] = {["xp"] = 3350, ["level"] = 34}, - [545] = {["xp"] = 2050, ["level"] = 35}, - [546] = {["xp"] = 2550, ["level"] = 25}, - [547] = {["xp"] = 3050, ["level"] = 30}, - [549] = {["xp"] = 1750, ["level"] = 22}, - [550] = {["xp"] = 2550, ["level"] = 32}, - [551] = {["xp"] = 780, ["level"] = 40}, - [552] = {["xp"] = 2650, ["level"] = 33}, - [553] = {["xp"] = 3300, ["level"] = 33}, - [554] = {["xp"] = 1550, ["level"] = 40}, - [555] = {["xp"] = 2500, ["level"] = 31}, - [556] = {["xp"] = 2550, ["level"] = 32}, - [557] = {["xp"] = 2700, ["level"] = 34}, - [558] = {["xp"] = 155, ["level"] = nil}, - [559] = {["xp"] = 2550, ["level"] = 32}, - [560] = {["xp"] = 255, ["level"] = 32}, - [561] = {["xp"] = 255, ["level"] = 32}, - [562] = {["xp"] = 1950, ["level"] = 32}, - [563] = {["xp"] = 3200, ["level"] = 32}, - [564] = {["xp"] = 2700, ["level"] = 34}, - [565] = {["xp"] = 2700, ["level"] = 34}, - [566] = {["xp"] = 3150, ["level"] = 40}, - [567] = {["xp"] = 2300, ["level"] = 28}, - [568] = {["xp"] = 2800, ["level"] = 36}, - [569] = {["xp"] = 2850, ["level"] = 37}, - [570] = {["xp"] = 2150, ["level"] = 38}, - [571] = {["xp"] = 2450, ["level"] = 41}, - [572] = {["xp"] = 2450, ["level"] = 41}, - [573] = {["xp"] = 4650, ["level"] = 44}, - [574] = {["xp"] = 2850, ["level"] = 38}, - [575] = {["xp"] = 1250, ["level"] = 31}, - [576] = {["xp"] = 2550, ["level"] = 42}, - [577] = {["xp"] = 1400, ["level"] = 36}, - [578] = {["xp"] = 2850, ["level"] = 37}, - [579] = {["xp"] = 0, ["level"] = nil}, - [580] = {["xp"] = 4700, ["level"] = 50}, - [581] = {["xp"] = 2000, ["level"] = 34}, - [582] = {["xp"] = 2100, ["level"] = 37}, - [583] = {["xp"] = 245, ["level"] = 30}, - [584] = {["xp"] = 3300, ["level"] = 41}, - [585] = {["xp"] = 2350, ["level"] = 40}, - [586] = {["xp"] = 4050, ["level"] = 46}, - [587] = {["xp"] = 1650, ["level"] = 41}, - [588] = {["xp"] = 390, ["level"] = 45}, - [589] = {["xp"] = 3900, ["level"] = 45}, - [590] = {["xp"] = 110, ["level"] = 5}, - [591] = {["xp"] = 5050, ["level"] = 46}, - [592] = {["xp"] = 5050, ["level"] = 46}, - [593] = {["xp"] = 0, ["level"] = nil}, - [594] = {["xp"] = 2900, ["level"] = 45}, - [595] = {["xp"] = 2450, ["level"] = 41}, - [596] = {["xp"] = 2100, ["level"] = 37}, - [597] = {["xp"] = 2450, ["level"] = 41}, - [598] = {["xp"] = 3450, ["level"] = 42}, - [599] = {["xp"] = 820, ["level"] = 41}, - [600] = {["xp"] = 3300, ["level"] = 41}, - [601] = {["xp"] = 2850, ["level"] = 37}, - [602] = {["xp"] = 1400, ["level"] = 37}, - [603] = {["xp"] = 1400, ["level"] = 37}, - [604] = {["xp"] = 3600, ["level"] = 43}, - [605] = {["xp"] = 2750, ["level"] = 35}, - [606] = {["xp"] = 820, ["level"] = 41}, - [607] = {["xp"] = 2450, ["level"] = 41}, - [608] = {["xp"] = 4850, ["level"] = 45}, - [609] = {["xp"] = 3750, ["level"] = 44}, - [610] = {["xp"] = 2250, ["level"] = 39}, - [611] = {["xp"] = 3150, ["level"] = 40}, - [612] = {["xp"] = 5020, ["level"] = 40}, - [613] = {["xp"] = 4650, ["level"] = 44}, - [614] = {["xp"] = 3150, ["level"] = 47}, - [615] = {["xp"] = 695, ["level"] = 42}, - [616] = {["xp"] = 285, ["level"] = 37}, - [617] = {["xp"] = 3600, ["level"] = 43}, - [618] = {["xp"] = 7100, ["level"] = 50}, - [620] = {["xp"] = 2350, ["level"] = 50}, - [621] = {["xp"] = 3750, ["level"] = 44}, - [622] = {["xp"] = 2850, ["level"] = 37}, - [623] = {["xp"] = 2700, ["level"] = 43}, - [624] = {["xp"] = 3600, ["level"] = 43}, - [625] = {["xp"] = 3600, ["level"] = 43}, - [626] = {["xp"] = 6100, ["level"] = 51}, - [627] = {["xp"] = 2100, ["level"] = 37}, - [628] = {["xp"] = 2850, ["level"] = 38}, - [629] = {["xp"] = 2850, ["level"] = 37}, - [630] = {["xp"] = 7350, ["level"] = 51}, - [631] = {["xp"] = 2500, ["level"] = 31}, - [632] = {["xp"] = 2500, ["level"] = 31}, - [633] = {["xp"] = 2500, ["level"] = 31}, - [634] = {["xp"] = 1250, ["level"] = 31}, - [635] = {["xp"] = 275, ["level"] = 35}, - [636] = {["xp"] = 275, ["level"] = 35}, - [637] = {["xp"] = 2450, ["level"] = 30}, - [638] = {["xp"] = 710, ["level"] = 37}, - [639] = {["xp"] = 2850, ["level"] = 37}, - [640] = {["xp"] = 3150, ["level"] = 40}, - [641] = {["xp"] = 315, ["level"] = 40}, - [642] = {["xp"] = 2850, ["level"] = 37}, - [643] = {["xp"] = 3300, ["level"] = 41}, - [644] = {["xp"] = 3450, ["level"] = 42}, - [645] = {["xp"] = 860, ["level"] = 42}, - [646] = {["xp"] = 4300, ["level"] = 42}, - [647] = {["xp"] = 3050, ["level"] = 30}, - [648] = {["xp"] = 5450, ["level"] = 48}, - [649] = {["xp"] = 440, ["level"] = 48}, - [650] = {["xp"] = 4400, ["level"] = 48}, - [651] = {["xp"] = 2850, ["level"] = 38}, - [652] = {["xp"] = 3450, ["level"] = 42}, - [653] = {["xp"] = 2350, ["level"] = 40}, - [654] = {["xp"] = 4050, ["level"] = 46}, - [655] = {["xp"] = 270, ["level"] = 34}, - [656] = {["xp"] = 7100, ["level"] = 50}, - [657] = {["xp"] = 0, ["level"] = nil}, - [658] = {["xp"] = 2800, ["level"] = 36}, - [659] = {["xp"] = 1300, ["level"] = 33}, - [660] = {["xp"] = 2850, ["level"] = 37}, - [661] = {["xp"] = 3550, ["level"] = 37}, - [662] = {["xp"] = 3150, ["level"] = 40}, - [663] = {["xp"] = 690, ["level"] = 35}, - [664] = {["xp"] = 3150, ["level"] = 40}, - [665] = {["xp"] = 3150, ["level"] = 40}, - [666] = {["xp"] = 3900, ["level"] = 40}, - [667] = {["xp"] = 4650, ["level"] = 44}, - [668] = {["xp"] = 1550, ["level"] = 40}, - [669] = {["xp"] = 3150, ["level"] = 40}, - [670] = {["xp"] = 3150, ["level"] = 40}, - [671] = {["xp"] = 2650, ["level"] = 33}, - [672] = {["xp"] = 2700, ["level"] = 34}, - [673] = {["xp"] = 3150, ["level"] = 40}, - [674] = {["xp"] = 270, ["level"] = 34}, - [675] = {["xp"] = 270, ["level"] = 34}, - [676] = {["xp"] = 2550, ["level"] = 32}, - [677] = {["xp"] = 2550, ["level"] = 32}, - [678] = {["xp"] = 2850, ["level"] = 38}, - [679] = {["xp"] = 3150, ["level"] = 40}, - [680] = {["xp"] = 3900, ["level"] = 40}, - [681] = {["xp"] = 2500, ["level"] = 31}, - [682] = {["xp"] = 3550, ["level"] = 37}, - [683] = {["xp"] = 1200, ["level"] = 30}, - [684] = {["xp"] = 3750, ["level"] = 39}, - [685] = {["xp"] = 3900, ["level"] = 40}, - [686] = {["xp"] = 1200, ["level"] = 30}, - [687] = {["xp"] = 1550, ["level"] = 40}, - [688] = {["xp"] = 2350, ["level"] = 40}, - [689] = {["xp"] = 2500, ["level"] = 31}, - [690] = {["xp"] = 1950, ["level"] = 32}, - [691] = {["xp"] = 3500, ["level"] = 36}, - [692] = {["xp"] = 3300, ["level"] = 41}, - [693] = {["xp"] = 3000, ["level"] = 39}, - [694] = {["xp"] = 3000, ["level"] = 39}, - [695] = {["xp"] = 300, ["level"] = 39}, - [696] = {["xp"] = 3000, ["level"] = 39}, - [697] = {["xp"] = 3750, ["level"] = 39}, - [698] = {["xp"] = 3150, ["level"] = 40}, - [699] = {["xp"] = 3450, ["level"] = 42}, - [700] = {["xp"] = 2500, ["level"] = 31}, - [701] = {["xp"] = 2850, ["level"] = 37}, - [702] = {["xp"] = 285, ["level"] = 37}, - [703] = {["xp"] = 2350, ["level"] = 40}, - [704] = {["xp"] = 2850, ["level"] = 38}, - [705] = {["xp"] = 3550, ["level"] = 37}, - [706] = {["xp"] = 3900, ["level"] = 45}, - [707] = {["xp"] = 710, ["level"] = 37}, - [708] = {["xp"] = 2350, ["level"] = 40}, - [709] = {["xp"] = 3150, ["level"] = 40}, - [710] = {["xp"] = 2850, ["level"] = 37}, - [711] = {["xp"] = 3000, ["level"] = 39}, - [712] = {["xp"] = 3450, ["level"] = 42}, - [713] = {["xp"] = 2850, ["level"] = 37}, - [714] = {["xp"] = 2850, ["level"] = 37}, - [715] = {["xp"] = 2100, ["level"] = 37}, - [716] = {["xp"] = 2550, ["level"] = 42}, - [717] = {["xp"] = 5900, ["level"] = 50}, - [718] = {["xp"] = 2150, ["level"] = 38}, - [719] = {["xp"] = 2750, ["level"] = 35}, - [720] = {["xp"] = 1350, ["level"] = 35}, - [721] = {["xp"] = 2750, ["level"] = 35}, - [722] = {["xp"] = 3150, ["level"] = 40}, - [723] = {["xp"] = 2350, ["level"] = 40}, - [724] = {["xp"] = 3150, ["level"] = 40}, - [725] = {["xp"] = 1550, ["level"] = 40}, - [726] = {["xp"] = 2350, ["level"] = 40}, - [727] = {["xp"] = 780, ["level"] = 40}, - [728] = {["xp"] = 780, ["level"] = 40}, - [729] = {["xp"] = 1150, ["level"] = 20}, - [730] = {["xp"] = 490, ["level"] = 14}, - [731] = {["xp"] = 1950, ["level"] = 20}, - [732] = {["xp"] = 3600, ["level"] = 43}, - [733] = {["xp"] = 3150, ["level"] = 40}, - [734] = {["xp"] = 0, ["level"] = nil}, - [735] = {["xp"] = 5600, ["level"] = 44}, - [736] = {["xp"] = 5600, ["level"] = 44}, - [737] = {["xp"] = 2350, ["level"] = 40}, - [738] = {["xp"] = 1450, ["level"] = 38}, - [739] = {["xp"] = 3450, ["level"] = 42}, - [741] = {["xp"] = 1150, ["level"] = 20}, - [742] = {["xp"] = 155, ["level"] = 20}, - [743] = {["xp"] = 700, ["level"] = 8}, - [744] = {["xp"] = 880, ["level"] = 11}, - [745] = {["xp"] = 540, ["level"] = 6}, - [746] = {["xp"] = 700, ["level"] = 8}, - [747] = {["xp"] = 170, ["level"] = 2}, - [748] = {["xp"] = 450, ["level"] = 5}, - [749] = {["xp"] = 530, ["level"] = 8}, - [750] = {["xp"] = 250, ["level"] = 3}, - [751] = {["xp"] = 530, ["level"] = 8}, - [752] = {["xp"] = 85, ["level"] = 2}, - [753] = {["xp"] = 250, ["level"] = 3}, - [754] = {["xp"] = 540, ["level"] = 6}, - [755] = {["xp"] = 250, ["level"] = 3}, - [756] = {["xp"] = 630, ["level"] = 7}, - [757] = {["xp"] = 445, ["level"] = 4}, - [758] = {["xp"] = 700, ["level"] = 8}, - [759] = {["xp"] = 840, ["level"] = 10}, - [760] = {["xp"] = 1050, ["level"] = 10}, - [761] = {["xp"] = 680, ["level"] = 6}, - [762] = {["xp"] = 4650, ["level"] = 44}, - [763] = {["xp"] = 335, ["level"] = 5}, - [764] = {["xp"] = 630, ["level"] = 10}, - [765] = {["xp"] = 910, ["level"] = 12}, - [766] = {["xp"] = 700, ["level"] = 8}, - [767] = {["xp"] = 55, ["level"] = 6}, - [768] = {["xp"] = 880, ["level"] = 8}, - [769] = {["xp"] = 420, ["level"] = 10}, - [770] = {["xp"] = 910, ["level"] = 12}, - [771] = {["xp"] = 630, ["level"] = 7}, - [772] = {["xp"] = 475, ["level"] = 7}, - [773] = {["xp"] = 840, ["level"] = 10}, - [775] = {["xp"] = 420, ["level"] = 10}, - [776] = {["xp"] = 1250, ["level"] = 14}, - [777] = {["xp"] = 0, ["level"] = nil}, - [778] = {["xp"] = 4850, ["level"] = 45}, - [779] = {["xp"] = 0, ["level"] = nil}, - [780] = {["xp"] = 445, ["level"] = 4}, - [781] = {["xp"] = 355, ["level"] = 4}, - [782] = {["xp"] = 3600, ["level"] = 43}, - [783] = {["xp"] = 40, ["level"] = 1}, - [784] = {["xp"] = 630, ["level"] = 7}, - [785] = {["xp"] = 350, ["level"] = 8}, - [786] = {["xp"] = 700, ["level"] = 8}, - [787] = {["xp"] = 40, ["level"] = 1}, - [788] = {["xp"] = 170, ["level"] = 2}, - [789] = {["xp"] = 250, ["level"] = 3}, - [790] = {["xp"] = 450, ["level"] = 5}, - [791] = {["xp"] = 630, ["level"] = 7}, - [792] = {["xp"] = 445, ["level"] = 4}, - [793] = {["xp"] = 5900, ["level"] = 50}, - [794] = {["xp"] = 670, ["level"] = 5}, - [795] = {["xp"] = 0, ["level"] = nil}, - [804] = {["xp"] = 110, ["level"] = 5}, - [805] = {["xp"] = 225, ["level"] = 5}, - [806] = {["xp"] = 910, ["level"] = 12}, - [807] = {["xp"] = 2300, ["level"] = 11}, - [808] = {["xp"] = 780, ["level"] = 9}, - [809] = {["xp"] = 455, ["level"] = 13}, - [810] = {["xp"] = 450, ["level"] = 5}, - [811] = {["xp"] = 830, ["level"] = 7}, - [812] = {["xp"] = 980, ["level"] = 9}, - [813] = {["xp"] = 0, ["level"] = nil}, - [814] = {["xp"] = 540, ["level"] = 6}, - [815] = {["xp"] = 700, ["level"] = 8}, - [816] = {["xp"] = 880, ["level"] = 11}, - [817] = {["xp"] = 700, ["level"] = 8}, - [818] = {["xp"] = 630, ["level"] = 7}, - [819] = {["xp"] = 1050, ["level"] = 15}, - [820] = {["xp"] = 1300, ["level"] = 9}, - [821] = {["xp"] = 1350, ["level"] = 15}, - [822] = {["xp"] = 970, ["level"] = 24}, - [823] = {["xp"] = 315, ["level"] = 7}, - [824] = {["xp"] = 2200, ["level"] = 27}, - [825] = {["xp"] = 700, ["level"] = 8}, - [826] = {["xp"] = 840, ["level"] = 10}, - [827] = {["xp"] = 910, ["level"] = 12}, - [828] = {["xp"] = 90, ["level"] = 12}, - [829] = {["xp"] = 455, ["level"] = 12}, - [830] = {["xp"] = 630, ["level"] = 7}, - [831] = {["xp"] = 630, ["level"] = 7}, - [832] = {["xp"] = 680, ["level"] = 12}, - [833] = {["xp"] = 630, ["level"] = 10}, - [834] = {["xp"] = 780, ["level"] = 9}, - [835] = {["xp"] = 880, ["level"] = 11}, - [836] = {["xp"] = 5450, ["level"] = 48}, - [837] = {["xp"] = 630, ["level"] = 10}, - [838] = {["xp"] = 560, ["level"] = 55}, - [839] = {["xp"] = 10, ["level"] = 1}, - [840] = {["xp"] = 455, ["level"] = 12}, - [841] = {["xp"] = 0, ["level"] = nil}, - [842] = {["xp"] = 910, ["level"] = 12}, - [843] = {["xp"] = 1850, ["level"] = 23}, - [844] = {["xp"] = 910, ["level"] = 12}, - [845] = {["xp"] = 910, ["level"] = 13}, - [846] = {["xp"] = 2100, ["level"] = 26}, - [847] = {["xp"] = 2850, ["level"] = 37}, - [848] = {["xp"] = 1050, ["level"] = 15}, - [849] = {["xp"] = 2100, ["level"] = 26}, - [850] = {["xp"] = 880, ["level"] = 16}, - [851] = {["xp"] = 1000, ["level"] = 18}, - [852] = {["xp"] = 1100, ["level"] = 19}, - [853] = {["xp"] = 800, ["level"] = 15}, - [854] = {["xp"] = 225, ["level"] = 12}, - [855] = {["xp"] = 1250, ["level"] = 14}, - [856] = {["xp"] = 2150, ["level"] = 12}, - [857] = {["xp"] = 2450, ["level"] = 30}, - [858] = {["xp"] = 1350, ["level"] = 18}, - [860] = {["xp"] = 85, ["level"] = 10}, - [861] = {["xp"] = 840, ["level"] = 10}, - [862] = {["xp"] = 1850, ["level"] = 23}, - [863] = {["xp"] = 1700, ["level"] = 18}, - [864] = {["xp"] = 5050, ["level"] = 46}, - [865] = {["xp"] = 1350, ["level"] = 18}, - [866] = {["xp"] = 1150, ["level"] = 16}, - [867] = {["xp"] = 1050, ["level"] = 15}, - [868] = {["xp"] = 1750, ["level"] = 22}, - [869] = {["xp"] = 910, ["level"] = 13}, - [870] = {["xp"] = 680, ["level"] = 13}, - [871] = {["xp"] = 910, ["level"] = 12}, - [872] = {["xp"] = 1050, ["level"] = 15}, - [873] = {["xp"] = 2750, ["level"] = 27}, - [874] = {["xp"] = 550, ["level"] = 27}, - [875] = {["xp"] = 1150, ["level"] = 16}, - [876] = {["xp"] = 1950, ["level"] = 20}, - [877] = {["xp"] = 1150, ["level"] = 16}, - [878] = {["xp"] = 1650, ["level"] = 21}, - [879] = {["xp"] = 1500, ["level"] = 25}, - [880] = {["xp"] = 1150, ["level"] = 16}, - [881] = {["xp"] = 1450, ["level"] = 16}, - [882] = {["xp"] = 1800, ["level"] = 19}, - [883] = {["xp"] = 1300, ["level"] = 22}, - [884] = {["xp"] = 1450, ["level"] = 24}, - [885] = {["xp"] = 1500, ["level"] = 25}, - [886] = {["xp"] = 85, ["level"] = 10}, - [887] = {["xp"] = 740, ["level"] = 14}, - [888] = {["xp"] = 1150, ["level"] = 16}, - [889] = {["xp"] = 0, ["level"] = nil}, - [890] = {["xp"] = 100, ["level"] = 14}, - [891] = {["xp"] = 1550, ["level"] = 20}, - [892] = {["xp"] = 100, ["level"] = 14}, - [893] = {["xp"] = 1950, ["level"] = 24}, - [894] = {["xp"] = 740, ["level"] = 14}, - [895] = {["xp"] = 1150, ["level"] = 16}, - [896] = {["xp"] = 1700, ["level"] = 18}, - [897] = {["xp"] = 2400, ["level"] = 24}, - [898] = {["xp"] = 1950, ["level"] = 20}, - [899] = {["xp"] = 1950, ["level"] = 20}, - [900] = {["xp"] = 490, ["level"] = 14}, - [901] = {["xp"] = 740, ["level"] = 14}, - [902] = {["xp"] = 1150, ["level"] = 16}, - [903] = {["xp"] = 1050, ["level"] = 15}, - [905] = {["xp"] = 1250, ["level"] = 17}, - [906] = {["xp"] = 3050, ["level"] = 25}, - [907] = {["xp"] = 1700, ["level"] = 18}, - [908] = {["xp"] = 2750, ["level"] = 27}, - [909] = {["xp"] = 3050, ["level"] = 30}, - [910] = {["xp"] = 155, ["level"] = 1}, - [911] = {["xp"] = 155, ["level"] = 1}, - [912] = {["xp"] = 225, ["level"] = 12}, - [913] = {["xp"] = 1950, ["level"] = 20}, - [914] = {["xp"] = 2200, ["level"] = 22}, - [915] = {["xp"] = 155, ["level"] = nil}, - [916] = {["xp"] = 355, ["level"] = 4}, - [917] = {["xp"] = 560, ["level"] = 5}, - [918] = {["xp"] = 630, ["level"] = 7}, - [919] = {["xp"] = 790, ["level"] = 7}, - [920] = {["xp"] = 45, ["level"] = 5}, - [921] = {["xp"] = 335, ["level"] = 5}, - [922] = {["xp"] = 315, ["level"] = 7}, - [923] = {["xp"] = 980, ["level"] = 9}, - [924] = {["xp"] = 1250, ["level"] = 14}, - [925] = {["xp"] = 155, ["level"] = nil}, - [926] = {["xp"] = 0, ["level"] = nil}, - [927] = {["xp"] = 455, ["level"] = 12}, - [928] = {["xp"] = 225, ["level"] = 5}, - [929] = {["xp"] = 335, ["level"] = 5}, - [930] = {["xp"] = 840, ["level"] = 10}, - [931] = {["xp"] = 840, ["level"] = 10}, - [932] = {["xp"] = 630, ["level"] = 7}, - [933] = {["xp"] = 780, ["level"] = 9}, - [934] = {["xp"] = 660, ["level"] = 11}, - [935] = {["xp"] = 1100, ["level"] = 11}, - [936] = {["xp"] = 470, ["level"] = 50}, - [937] = {["xp"] = 440, ["level"] = 11}, - [938] = {["xp"] = 910, ["level"] = 12}, - [939] = {["xp"] = 5450, ["level"] = 54}, - [940] = {["xp"] = 440, ["level"] = 11}, - [941] = {["xp"] = 910, ["level"] = 12}, - [942] = {["xp"] = 1550, ["level"] = 20}, - [943] = {["xp"] = 2400, ["level"] = 24}, - [944] = {["xp"] = 630, ["level"] = 17}, - [945] = {["xp"] = 1350, ["level"] = 18}, - [947] = {["xp"] = 1250, ["level"] = 17}, - [948] = {["xp"] = 630, ["level"] = 17}, - [949] = {["xp"] = 1250, ["level"] = 17}, - [950] = {["xp"] = 950, ["level"] = 17}, - [951] = {["xp"] = 1950, ["level"] = 20}, - [952] = {["xp"] = 880, ["level"] = 11}, - [953] = {["xp"] = 910, ["level"] = 12}, - [954] = {["xp"] = 680, ["level"] = 12}, - [955] = {["xp"] = 910, ["level"] = 12}, - [956] = {["xp"] = 910, ["level"] = 13}, - [957] = {["xp"] = 680, ["level"] = 13}, - [958] = {["xp"] = 910, ["level"] = 12}, - [959] = {["xp"] = 1350, ["level"] = 18}, - [960] = {["xp"] = 0, ["level"] = nil}, - [961] = {["xp"] = 0, ["level"] = nil}, - [962] = {["xp"] = 1700, ["level"] = 18}, - [963] = {["xp"] = 880, ["level"] = 16}, - [964] = {["xp"] = 4500, ["level"] = 57}, - [965] = {["xp"] = 680, ["level"] = 18}, - [966] = {["xp"] = 1350, ["level"] = 18}, - [967] = {["xp"] = 1000, ["level"] = 18}, - [968] = {["xp"] = 1950, ["level"] = 20}, - [969] = {["xp"] = 6600, ["level"] = 60}, - [970] = {["xp"] = 1650, ["level"] = 21}, - [971] = {["xp"] = 2750, ["level"] = 23}, - [972] = {["xp"] = 0, ["level"] = nil}, - [973] = {["xp"] = 1950, ["level"] = 24}, - [974] = {["xp"] = 5650, ["level"] = 55}, - [975] = {["xp"] = 0, ["level"] = nil}, - [976] = {["xp"] = 2900, ["level"] = 24}, - [977] = {["xp"] = 4650, ["level"] = 58}, - [978] = {["xp"] = 5650, ["level"] = 55}, - [979] = {["xp"] = 3000, ["level"] = 57}, - [980] = {["xp"] = 2800, ["level"] = 55}, - [981] = {["xp"] = 2500, ["level"] = 31}, - [982] = {["xp"] = 1250, ["level"] = 17}, - [983] = {["xp"] = 840, ["level"] = 10}, - [984] = {["xp"] = 740, ["level"] = 14}, - [985] = {["xp"] = 980, ["level"] = 14}, - [986] = {["xp"] = 1550, ["level"] = 20}, - [990] = {["xp"] = 365, ["level"] = 19}, - [991] = {["xp"] = 1450, ["level"] = 19}, - [992] = {["xp"] = 3050, ["level"] = 46}, - [993] = {["xp"] = 780, ["level"] = 20}, - [994] = {["xp"] = 1750, ["level"] = 22}, - [995] = {["xp"] = 780, ["level"] = 20}, - [996] = {["xp"] = 560, ["level"] = 55}, - [997] = {["xp"] = 225, ["level"] = 5}, - [998] = {["xp"] = 560, ["level"] = 55}, - [1000] = {["xp"] = 560, ["level"] = 55}, - [1001] = {["xp"] = 1150, ["level"] = 12}, - [1002] = {["xp"] = 980, ["level"] = 14}, - [1003] = {["xp"] = 1150, ["level"] = 16}, - [1004] = {["xp"] = 560, ["level"] = 55}, - [1007] = {["xp"] = 1150, ["level"] = 20}, - [1008] = {["xp"] = 1450, ["level"] = 19}, - [1009] = {["xp"] = 2550, ["level"] = 25}, - [1010] = {["xp"] = 780, ["level"] = 20}, - [1011] = {["xp"] = 2350, ["level"] = 29}, - [1012] = {["xp"] = 3200, ["level"] = 32}, - [1013] = {["xp"] = 2100, ["level"] = 26}, - [1014] = {["xp"] = 3300, ["level"] = 27}, - [1015] = {["xp"] = 560, ["level"] = 55}, - [1016] = {["xp"] = 1950, ["level"] = 24}, - [1017] = {["xp"] = 2550, ["level"] = 25}, - [1018] = {["xp"] = 560, ["level"] = 55}, - [1019] = {["xp"] = 560, ["level"] = 55}, - [1020] = {["xp"] = 1950, ["level"] = 20}, - [1021] = {["xp"] = 2550, ["level"] = 32}, - [1022] = {["xp"] = 2450, ["level"] = 30}, - [1023] = {["xp"] = 1250, ["level"] = 21}, - [1024] = {["xp"] = 830, ["level"] = 21}, - [1025] = {["xp"] = 1950, ["level"] = 24}, - [1026] = {["xp"] = 2200, ["level"] = 27}, - [1027] = {["xp"] = 2300, ["level"] = 28}, - [1028] = {["xp"] = 1700, ["level"] = 28}, - [1029] = {["xp"] = 230, ["level"] = 28}, - [1030] = {["xp"] = 1700, ["level"] = 28}, - [1031] = {["xp"] = 2550, ["level"] = 32}, - [1032] = {["xp"] = 2550, ["level"] = 32}, - [1033] = {["xp"] = 1750, ["level"] = 22}, - [1034] = {["xp"] = 1850, ["level"] = 23}, - [1035] = {["xp"] = 3050, ["level"] = 30}, - [1036] = {["xp"] = 530, ["level"] = nil}, - [1037] = {["xp"] = 610, ["level"] = 30}, - [1038] = {["xp"] = 610, ["level"] = 30}, - [1039] = {["xp"] = 1200, ["level"] = 30}, - [1040] = {["xp"] = 610, ["level"] = 30}, - [1041] = {["xp"] = 1200, ["level"] = 30}, - [1042] = {["xp"] = 245, ["level"] = 30}, - [1043] = {["xp"] = 2450, ["level"] = 30}, - [1044] = {["xp"] = 3050, ["level"] = 30}, - [1045] = {["xp"] = 2450, ["level"] = 30}, - [1046] = {["xp"] = 3050, ["level"] = 30}, - [1047] = {["xp"] = 560, ["level"] = 55}, - [1048] = {["xp"] = 5150, ["level"] = 42}, - [1049] = {["xp"] = 3550, ["level"] = 38}, - [1050] = {["xp"] = 3550, ["level"] = 38}, - [1051] = {["xp"] = 3300, ["level"] = 33}, - [1052] = {["xp"] = 1550, ["level"] = 40}, - [1053] = {["xp"] = 4700, ["level"] = 40}, - [1054] = {["xp"] = 2000, ["level"] = 25}, - [1055] = {["xp"] = 230, ["level"] = 28}, - [1056] = {["xp"] = 680, ["level"] = 18}, - [1057] = {["xp"] = 2200, ["level"] = 27}, - [1058] = {["xp"] = 2100, ["level"] = 26}, - [1059] = {["xp"] = 2200, ["level"] = 27}, - [1060] = {["xp"] = 1550, ["level"] = 20}, - [1061] = {["xp"] = 315, ["level"] = 17}, - [1062] = {["xp"] = 1450, ["level"] = 19}, - [1063] = {["xp"] = 680, ["level"] = 18}, - [1064] = {["xp"] = 340, ["level"] = 18}, - [1065] = {["xp"] = 1350, ["level"] = 18}, - [1066] = {["xp"] = 1850, ["level"] = 23}, - [1067] = {["xp"] = 1400, ["level"] = 23}, - [1068] = {["xp"] = 1850, ["level"] = 23}, - [1069] = {["xp"] = 1950, ["level"] = 20}, - [1070] = {["xp"] = 830, ["level"] = 21}, - [1071] = {["xp"] = 1650, ["level"] = 21}, - [1072] = {["xp"] = 830, ["level"] = 21}, - [1073] = {["xp"] = 1650, ["level"] = 21}, - [1074] = {["xp"] = 830, ["level"] = 21}, - [1075] = {["xp"] = 830, ["level"] = 21}, - [1076] = {["xp"] = 1650, ["level"] = 21}, - [1077] = {["xp"] = 830, ["level"] = 21}, - [1078] = {["xp"] = 2100, ["level"] = 26}, - [1079] = {["xp"] = 2200, ["level"] = 22}, - [1080] = {["xp"] = 2200, ["level"] = 22}, - [1081] = {["xp"] = 3400, ["level"] = 28}, - [1082] = {["xp"] = 870, ["level"] = 22}, - [1083] = {["xp"] = 2100, ["level"] = 26}, - [1084] = {["xp"] = 2300, ["level"] = 28}, - [1085] = {["xp"] = 165, ["level"] = 21}, - [1086] = {["xp"] = 2300, ["level"] = 23}, - [1087] = {["xp"] = 1500, ["level"] = 25}, - [1088] = {["xp"] = 2350, ["level"] = 29}, - [1089] = {["xp"] = 2950, ["level"] = 29}, - [1090] = {["xp"] = 2200, ["level"] = 22}, - [1091] = {["xp"] = 175, ["level"] = 22}, - [1092] = {["xp"] = 1300, ["level"] = 22}, - [1093] = {["xp"] = 1650, ["level"] = 21}, - [1094] = {["xp"] = 830, ["level"] = 21}, - [1095] = {["xp"] = 1100, ["level"] = 27}, - [1096] = {["xp"] = 2200, ["level"] = 27}, - [1097] = {["xp"] = 105, ["level"] = 15}, - [1098] = {["xp"] = 2000, ["level"] = 25}, - [1100] = {["xp"] = 1350, ["level"] = 34}, - [1101] = {["xp"] = 3350, ["level"] = 34}, - [1102] = {["xp"] = 4050, ["level"] = 34}, - [1103] = {["xp"] = 0, ["level"] = nil}, - [1104] = {["xp"] = 1850, ["level"] = 30}, - [1105] = {["xp"] = 2450, ["level"] = 30}, - [1106] = {["xp"] = 1350, ["level"] = 35}, - [1107] = {["xp"] = 3450, ["level"] = 35}, - [1108] = {["xp"] = 3000, ["level"] = 39}, - [1109] = {["xp"] = 3300, ["level"] = 33}, - [1110] = {["xp"] = 2500, ["level"] = 31}, - [1111] = {["xp"] = 1400, ["level"] = 36}, - [1112] = {["xp"] = 1400, ["level"] = 36}, - [1113] = {["xp"] = 3300, ["level"] = 33}, - [1114] = {["xp"] = 700, ["level"] = 36}, - [1115] = {["xp"] = 1400, ["level"] = 36}, - [1116] = {["xp"] = 3500, ["level"] = 36}, - [1117] = {["xp"] = 3500, ["level"] = 36}, - [1118] = {["xp"] = 890, ["level"] = 43}, - [1119] = {["xp"] = 3750, ["level"] = 44}, - [1120] = {["xp"] = 375, ["level"] = 44}, - [1121] = {["xp"] = 375, ["level"] = 44}, - [1122] = {["xp"] = 1850, ["level"] = 44}, - [1123] = {["xp"] = 1400, ["level"] = 55}, - [1124] = {["xp"] = 2800, ["level"] = 55}, - [1125] = {["xp"] = 5650, ["level"] = 55}, - [1126] = {["xp"] = 6000, ["level"] = 57}, - [1130] = {["xp"] = 0, ["level"] = nil}, - [1131] = {["xp"] = 2450, ["level"] = 30}, - [1132] = {["xp"] = 780, ["level"] = 20}, - [1133] = {["xp"] = 0, ["level"] = nil}, - [1134] = {["xp"] = 1650, ["level"] = 21}, - [1135] = {["xp"] = 3650, ["level"] = 30}, - [1136] = {["xp"] = 4250, ["level"] = 37}, - [1137] = {["xp"] = 1450, ["level"] = 38}, - [1138] = {["xp"] = 1250, ["level"] = 17}, - [1139] = {["xp"] = 5850, ["level"] = 45}, - [1140] = {["xp"] = 2300, ["level"] = 28}, - [1141] = {["xp"] = 980, ["level"] = 14}, - [1142] = {["xp"] = 3050, ["level"] = 30}, - [1143] = {["xp"] = 2500, ["level"] = 31}, - [1144] = {["xp"] = 3050, ["level"] = 30}, - [1145] = {["xp"] = 1300, ["level"] = 33}, - [1146] = {["xp"] = 1950, ["level"] = 33}, - [1147] = {["xp"] = 2750, ["level"] = 35}, - [1148] = {["xp"] = 2750, ["level"] = 35}, - [1149] = {["xp"] = 1050, ["level"] = 26}, - [1150] = {["xp"] = 2450, ["level"] = 30}, - [1151] = {["xp"] = 3050, ["level"] = 30}, - [1152] = {["xp"] = 1200, ["level"] = 30}, - [1153] = {["xp"] = 2350, ["level"] = 29}, - [1154] = {["xp"] = 1850, ["level"] = 30}, - [1159] = {["xp"] = 1200, ["level"] = 30}, - [1160] = {["xp"] = 2100, ["level"] = 36}, - [1164] = {["xp"] = 2800, ["level"] = 36}, - [1166] = {["xp"] = 4450, ["level"] = 43}, - [1167] = {["xp"] = 570, ["level"] = 28}, - [1168] = {["xp"] = 3600, ["level"] = 43}, - [1169] = {["xp"] = 5350, ["level"] = 43}, - [1170] = {["xp"] = 360, ["level"] = 43}, - [1171] = {["xp"] = 360, ["level"] = 43}, - [1172] = {["xp"] = 4850, ["level"] = 45}, - [1173] = {["xp"] = 4850, ["level"] = 45}, - [1175] = {["xp"] = 2650, ["level"] = 33}, - [1176] = {["xp"] = 1850, ["level"] = 30}, - [1177] = {["xp"] = 2800, ["level"] = 36}, - [1178] = {["xp"] = 710, ["level"] = 37}, - [1179] = {["xp"] = 2450, ["level"] = 30}, - [1180] = {["xp"] = 710, ["level"] = 37}, - [1181] = {["xp"] = 285, ["level"] = 37}, - [1182] = {["xp"] = 2850, ["level"] = 37}, - [1183] = {["xp"] = 710, ["level"] = 37}, - [1184] = {["xp"] = 1350, ["level"] = 35}, - [1185] = {["xp"] = 3000, ["level"] = 57}, - [1186] = {["xp"] = 285, ["level"] = 37}, - [1187] = {["xp"] = 3300, ["level"] = 41}, - [1188] = {["xp"] = 820, ["level"] = 41}, - [1189] = {["xp"] = 820, ["level"] = 41}, - [1190] = {["xp"] = 1650, ["level"] = 41}, - [1191] = {["xp"] = 0, ["level"] = nil}, - [1192] = {["xp"] = 0, ["level"] = nil}, - [1193] = {["xp"] = 0, ["level"] = nil}, - [1194] = {["xp"] = 1650, ["level"] = 41}, - [1195] = {["xp"] = 2550, ["level"] = 25}, - [1196] = {["xp"] = 590, ["level"] = 29}, - [1197] = {["xp"] = 2350, ["level"] = 29}, - [1198] = {["xp"] = 2400, ["level"] = 24}, - [1199] = {["xp"] = 2550, ["level"] = 25}, - [1200] = {["xp"] = 3300, ["level"] = 27}, - [1201] = {["xp"] = 2750, ["level"] = 35}, - [1202] = {["xp"] = 2750, ["level"] = 35}, - [1203] = {["xp"] = 3450, ["level"] = 35}, - [1204] = {["xp"] = 2850, ["level"] = 38}, - [1205] = {["xp"] = 3900, ["level"] = 45}, - [1206] = {["xp"] = 2750, ["level"] = 35}, - [1218] = {["xp"] = 1350, ["level"] = 35}, - [1219] = {["xp"] = 690, ["level"] = 35}, - [1220] = {["xp"] = 2750, ["level"] = 35}, - [1221] = {["xp"] = 2100, ["level"] = 26}, - [1222] = {["xp"] = 2850, ["level"] = 37}, - [1238] = {["xp"] = 2050, ["level"] = 35}, - [1239] = {["xp"] = 2050, ["level"] = 35}, - [1240] = {["xp"] = 2750, ["level"] = 35}, - [1241] = {["xp"] = 230, ["level"] = 28}, - [1242] = {["xp"] = 230, ["level"] = 28}, - [1243] = {["xp"] = 230, ["level"] = 28}, - [1244] = {["xp"] = 2450, ["level"] = 30}, - [1245] = {["xp"] = 245, ["level"] = 30}, - [1246] = {["xp"] = 250, ["level"] = 31}, - [1247] = {["xp"] = 250, ["level"] = 31}, - [1248] = {["xp"] = 660, ["level"] = 33}, - [1249] = {["xp"] = 1300, ["level"] = 33}, - [1250] = {["xp"] = 265, ["level"] = 33}, - [1251] = {["xp"] = 690, ["level"] = 35}, - [1252] = {["xp"] = 780, ["level"] = 40}, - [1253] = {["xp"] = 690, ["level"] = 35}, - [1258] = {["xp"] = 3150, ["level"] = 40}, - [1259] = {["xp"] = 315, ["level"] = 40}, - [1260] = {["xp"] = 710, ["level"] = 38}, - [1261] = {["xp"] = 3150, ["level"] = 40}, - [1262] = {["xp"] = 3150, ["level"] = 40}, - [1264] = {["xp"] = 1300, ["level"] = 33}, - [1265] = {["xp"] = 275, ["level"] = 35}, - [1266] = {["xp"] = 700, ["level"] = 36}, - [1267] = {["xp"] = 4300, ["level"] = 38}, - [1268] = {["xp"] = 1350, ["level"] = 35}, - [1269] = {["xp"] = 710, ["level"] = 37}, - [1270] = {["xp"] = 2850, ["level"] = 37}, - [1271] = {["xp"] = 0, ["level"] = nil}, - [1273] = {["xp"] = 3550, ["level"] = 37}, - [1274] = {["xp"] = 230, ["level"] = 28}, - [1275] = {["xp"] = 2400, ["level"] = 24}, - [1276] = {["xp"] = 1400, ["level"] = 37}, - [1282] = {["xp"] = 275, ["level"] = 35}, - [1284] = {["xp"] = 1350, ["level"] = 35}, - [1285] = {["xp"] = 285, ["level"] = 38}, - [1286] = {["xp"] = 2850, ["level"] = 38}, - [1287] = {["xp"] = 2850, ["level"] = 38}, - [1288] = {["xp"] = 285, ["level"] = 38}, - [1289] = {["xp"] = 640, ["level"] = 38}, - [1301] = {["xp"] = 690, ["level"] = 35}, - [1302] = {["xp"] = 690, ["level"] = 35}, - [1318] = {["xp"] = 8300, ["level"] = 60}, - [1319] = {["xp"] = 275, ["level"] = 35}, - [1320] = {["xp"] = 1350, ["level"] = 35}, - [1321] = {["xp"] = 275, ["level"] = 35}, - [1322] = {["xp"] = 2850, ["level"] = 37}, - [1323] = {["xp"] = 1400, ["level"] = 37}, - [1324] = {["xp"] = 2150, ["level"] = 38}, - [1338] = {["xp"] = 980, ["level"] = 14}, - [1339] = {["xp"] = 540, ["level"] = 15}, - [1358] = {["xp"] = 1050, ["level"] = 15}, - [1359] = {["xp"] = 105, ["level"] = 15}, - [1360] = {["xp"] = 3600, ["level"] = 43}, - [1361] = {["xp"] = 640, ["level"] = 32}, - [1362] = {["xp"] = 640, ["level"] = 32}, - [1363] = {["xp"] = 330, ["level"] = 41}, - [1364] = {["xp"] = 3300, ["level"] = 41}, - [1365] = {["xp"] = 3450, ["level"] = 35}, - [1366] = {["xp"] = 3750, ["level"] = 31}, - [1367] = {["xp"] = 660, ["level"] = 33}, - [1368] = {["xp"] = 660, ["level"] = 33}, - [1369] = {["xp"] = 2650, ["level"] = 33}, - [1370] = {["xp"] = 1350, ["level"] = 35}, - [1371] = {["xp"] = 2050, ["level"] = 35}, - [1372] = {["xp"] = 345, ["level"] = 42}, - [1373] = {["xp"] = 2850, ["level"] = 37}, - [1374] = {["xp"] = 2850, ["level"] = 37}, - [1375] = {["xp"] = 2850, ["level"] = 37}, - [1380] = {["xp"] = 4300, ["level"] = 42}, - [1381] = {["xp"] = 4300, ["level"] = 42}, - [1382] = {["xp"] = 2050, ["level"] = 35}, - [1383] = {["xp"] = 4300, ["level"] = 42}, - [1384] = {["xp"] = 2550, ["level"] = 32}, - [1385] = {["xp"] = 2050, ["level"] = 35}, - [1386] = {["xp"] = 2550, ["level"] = 32}, - [1387] = {["xp"] = 3750, ["level"] = 31}, - [1388] = {["xp"] = 345, ["level"] = 42}, - [1389] = {["xp"] = 2750, ["level"] = 35}, - [1390] = {["xp"] = 80, ["level"] = 1}, - [1391] = {["xp"] = 2550, ["level"] = 42}, - [1392] = {["xp"] = 2250, ["level"] = 39}, - [1393] = {["xp"] = 2850, ["level"] = 38}, - [1394] = {["xp"] = 4200, ["level"] = 36}, - [1395] = {["xp"] = 2900, ["level"] = 45}, - [1396] = {["xp"] = 2850, ["level"] = 37}, - [1398] = {["xp"] = 3450, ["level"] = 42}, - [1418] = {["xp"] = 1350, ["level"] = 35}, - [1419] = {["xp"] = 3150, ["level"] = 40}, - [1420] = {["xp"] = 2350, ["level"] = 40}, - [1421] = {["xp"] = 2750, ["level"] = 35}, - [1422] = {["xp"] = 0, ["level"] = nil}, - [1423] = {["xp"] = 0, ["level"] = nil}, - [1424] = {["xp"] = 4450, ["level"] = 43}, - [1425] = {["xp"] = 2550, ["level"] = 42}, - [1426] = {["xp"] = 4450, ["level"] = 43}, - [1427] = {["xp"] = 3600, ["level"] = 43}, - [1428] = {["xp"] = 3900, ["level"] = 45}, - [1429] = {["xp"] = 3750, ["level"] = 44}, - [1430] = {["xp"] = 3750, ["level"] = 44}, - [1431] = {["xp"] = 610, ["level"] = 30}, - [1432] = {["xp"] = 1200, ["level"] = 30}, - [1433] = {["xp"] = 265, ["level"] = 33}, - [1434] = {["xp"] = 2650, ["level"] = 33}, - [1435] = {["xp"] = 2650, ["level"] = 33}, - [1436] = {["xp"] = 2650, ["level"] = 33}, - [1437] = {["xp"] = 1950, ["level"] = 33}, - [1438] = {["xp"] = 2650, ["level"] = 33}, - [1439] = {["xp"] = 2650, ["level"] = 33}, - [1440] = {["xp"] = 3300, ["level"] = 33}, - [1441] = {["xp"] = 3300, ["level"] = 33}, - [1442] = {["xp"] = 435, ["level"] = 22}, - [1444] = {["xp"] = 3750, ["level"] = 44}, - [1445] = {["xp"] = 5900, ["level"] = 50}, - [1446] = {["xp"] = 6550, ["level"] = 53}, - [1447] = {["xp"] = 1250, ["level"] = 31}, - [1448] = {["xp"] = 3600, ["level"] = 43}, - [1449] = {["xp"] = 1800, ["level"] = 43}, - [1450] = {["xp"] = 890, ["level"] = 43}, - [1451] = {["xp"] = 1800, ["level"] = 43}, - [1452] = {["xp"] = 3600, ["level"] = 43}, - [1453] = {["xp"] = 1300, ["level"] = 33}, - [1454] = {["xp"] = 3000, ["level"] = 39}, - [1455] = {["xp"] = 1500, ["level"] = 39}, - [1456] = {["xp"] = 3000, ["level"] = 39}, - [1457] = {["xp"] = 2250, ["level"] = 39}, - [1458] = {["xp"] = 2650, ["level"] = 33}, - [1459] = {["xp"] = 2750, ["level"] = 35}, - [1462] = {["xp"] = 0, ["level"] = nil}, - [1463] = {["xp"] = 0, ["level"] = nil}, - [1464] = {["xp"] = 0, ["level"] = nil}, - [1465] = {["xp"] = 1950, ["level"] = 33}, - [1466] = {["xp"] = 3150, ["level"] = 40}, - [1467] = {["xp"] = 3150, ["level"] = 40}, - [1469] = {["xp"] = 2700, ["level"] = 43}, - [1470] = {["xp"] = 190, ["level"] = 3}, - [1471] = {["xp"] = 630, ["level"] = 10}, - [1472] = {["xp"] = 155, ["level"] = 20}, - [1473] = {["xp"] = 630, ["level"] = 10}, - [1474] = {["xp"] = 1550, ["level"] = 20}, - [1475] = {["xp"] = 7100, ["level"] = 50}, - [1476] = {["xp"] = 1550, ["level"] = 20}, - [1477] = {["xp"] = 970, ["level"] = 45}, - [1478] = {["xp"] = 210, ["level"] = 10}, - [1479] = {["xp"] = 155, ["level"] = 1}, - [1480] = {["xp"] = 1300, ["level"] = 33}, - [1481] = {["xp"] = 2650, ["level"] = 33}, - [1482] = {["xp"] = 2750, ["level"] = 35}, - [1483] = {["xp"] = 415, ["level"] = 21}, - [1484] = {["xp"] = 265, ["level"] = 33}, - [1485] = {["xp"] = 355, ["level"] = 4}, - [1486] = {["xp"] = 1600, ["level"] = 17}, - [1487] = {["xp"] = 2050, ["level"] = 21}, - [1488] = {["xp"] = 3900, ["level"] = 40}, - [1489] = {["xp"] = 290, ["level"] = 16}, - [1490] = {["xp"] = 115, ["level"] = 16}, - [1491] = {["xp"] = 1350, ["level"] = 18}, - [1492] = {["xp"] = 440, ["level"] = 11}, - [1498] = {["xp"] = 630, ["level"] = 10}, - [1499] = {["xp"] = 35, ["level"] = 4}, - [1501] = {["xp"] = 880, ["level"] = 11}, - [1502] = {["xp"] = 210, ["level"] = 10}, - [1503] = {["xp"] = 840, ["level"] = 10}, - [1504] = {["xp"] = 660, ["level"] = 11}, - [1505] = {["xp"] = 85, ["level"] = 10}, - [1506] = {["xp"] = 210, ["level"] = 10}, - [1507] = {["xp"] = 155, ["level"] = 20}, - [1508] = {["xp"] = 390, ["level"] = 20}, - [1509] = {["xp"] = 390, ["level"] = 20}, - [1510] = {["xp"] = 780, ["level"] = 20}, - [1511] = {["xp"] = 1550, ["level"] = 20}, - [1512] = {["xp"] = 390, ["level"] = 20}, - [1513] = {["xp"] = 1150, ["level"] = 20}, - [1514] = {["xp"] = 560, ["level"] = 55}, - [1515] = {["xp"] = 1150, ["level"] = 20}, - [1516] = {["xp"] = 270, ["level"] = 4}, - [1517] = {["xp"] = 270, ["level"] = 4}, - [1518] = {["xp"] = 445, ["level"] = 4}, - [1519] = {["xp"] = 270, ["level"] = 4}, - [1520] = {["xp"] = 180, ["level"] = 4}, - [1521] = {["xp"] = 445, ["level"] = 4}, - [1522] = {["xp"] = 420, ["level"] = 10}, - [1523] = {["xp"] = 420, ["level"] = 10}, - [1524] = {["xp"] = 660, ["level"] = 11}, - [1525] = {["xp"] = 910, ["level"] = 12}, - [1526] = {["xp"] = 1150, ["level"] = 13}, - [1527] = {["xp"] = 1150, ["level"] = 13}, - [1528] = {["xp"] = 780, ["level"] = 20}, - [1529] = {["xp"] = 780, ["level"] = 20}, - [1530] = {["xp"] = 435, ["level"] = 22}, - [1531] = {["xp"] = 2450, ["level"] = 30}, - [1532] = {["xp"] = 2450, ["level"] = 30}, - [1534] = {["xp"] = 1400, ["level"] = 23}, - [1535] = {["xp"] = 870, ["level"] = 22}, - [1536] = {["xp"] = 1300, ["level"] = 22}, - [1558] = {["xp"] = 155, ["level"] = 1}, - [1559] = {["xp"] = 0, ["level"] = nil}, - [1560] = {["xp"] = 5900, ["level"] = 50}, - [1578] = {["xp"] = 910, ["level"] = 12}, - [1579] = {["xp"] = 455, ["level"] = 12}, - [1580] = {["xp"] = 910, ["level"] = 12}, - [1581] = {["xp"] = 700, ["level"] = 8}, - [1582] = {["xp"] = 1350, ["level"] = 18}, - [1598] = {["xp"] = 355, ["level"] = 4}, - [1599] = {["xp"] = 355, ["level"] = 4}, - [1618] = {["xp"] = 1150, ["level"] = 16}, - [1638] = {["xp"] = 85, ["level"] = 10}, - [1639] = {["xp"] = 85, ["level"] = 10}, - [1640] = {["xp"] = 210, ["level"] = 10}, - [1641] = {["xp"] = 0, ["level"] = nil}, - [1642] = {["xp"] = 90, ["level"] = 12}, - [1643] = {["xp"] = 455, ["level"] = 12}, - [1644] = {["xp"] = 910, ["level"] = 13}, - [1645] = {["xp"] = 0, ["level"] = nil}, - [1646] = {["xp"] = 90, ["level"] = 12}, - [1647] = {["xp"] = 455, ["level"] = 12}, - [1648] = {["xp"] = 910, ["level"] = 13}, - [1649] = {["xp"] = 390, ["level"] = 20}, - [1650] = {["xp"] = 1850, ["level"] = 23}, - [1651] = {["xp"] = 1000, ["level"] = 25}, - [1652] = {["xp"] = 2550, ["level"] = 25}, - [1653] = {["xp"] = 830, ["level"] = 21}, - [1654] = {["xp"] = 870, ["level"] = 22}, - [1655] = {["xp"] = 435, ["level"] = 22}, - [1656] = {["xp"] = 110, ["level"] = 5}, - [1657] = {["xp"] = 1650, ["level"] = 60}, - [1658] = {["xp"] = 6600, ["level"] = 60}, - [1661] = {["xp"] = 0, ["level"] = nil}, - [1665] = {["xp"] = 420, ["level"] = 10}, - [1666] = {["xp"] = 420, ["level"] = 10}, - [1667] = {["xp"] = 840, ["level"] = 10}, - [1678] = {["xp"] = 1100, ["level"] = 11}, - [1679] = {["xp"] = 85, ["level"] = 10}, - [1680] = {["xp"] = 90, ["level"] = 11}, - [1681] = {["xp"] = 660, ["level"] = 11}, - [1682] = {["xp"] = 630, ["level"] = 10}, - [1683] = {["xp"] = 840, ["level"] = 10}, - [1684] = {["xp"] = 85, ["level"] = 10}, - [1685] = {["xp"] = 420, ["level"] = 10}, - [1686] = {["xp"] = 840, ["level"] = 10}, - [1687] = {["xp"] = 155, ["level"] = 1}, - [1688] = {["xp"] = 630, ["level"] = 10}, - [1689] = {["xp"] = 630, ["level"] = 10}, - [1690] = {["xp"] = 3600, ["level"] = 43}, - [1691] = {["xp"] = 3750, ["level"] = 44}, - [1692] = {["xp"] = 420, ["level"] = 10}, - [1693] = {["xp"] = 630, ["level"] = 10}, - [1698] = {["xp"] = 155, ["level"] = 20}, - [1699] = {["xp"] = 1300, ["level"] = 22}, - [1700] = {["xp"] = 570, ["level"] = 28}, - [1701] = {["xp"] = 2300, ["level"] = 28}, - [1702] = {["xp"] = 435, ["level"] = 22}, - [1703] = {["xp"] = 1150, ["level"] = 28}, - [1704] = {["xp"] = 570, ["level"] = 28}, - [1705] = {["xp"] = 2300, ["level"] = 28}, - [1706] = {["xp"] = 3050, ["level"] = 30}, - [1707] = {["xp"] = 2800, ["level"] = 44}, - [1708] = {["xp"] = 1750, ["level"] = 29}, - [1709] = {["xp"] = 3050, ["level"] = 30}, - [1710] = {["xp"] = 1850, ["level"] = 30}, - [1711] = {["xp"] = 3050, ["level"] = 30}, - [1712] = {["xp"] = 2350, ["level"] = 40}, - [1713] = {["xp"] = 2350, ["level"] = 40}, - [1714] = {["xp"] = 0, ["level"] = nil}, - [1715] = {["xp"] = 420, ["level"] = 10}, - [1716] = {["xp"] = 780, ["level"] = 20}, - [1717] = {["xp"] = 390, ["level"] = 20}, - [1718] = {["xp"] = 610, ["level"] = 30}, - [1719] = {["xp"] = 2450, ["level"] = 30}, - [1738] = {["xp"] = 1550, ["level"] = 20}, - [1739] = {["xp"] = 1150, ["level"] = 20}, - [1740] = {["xp"] = 2550, ["level"] = 25}, - [1758] = {["xp"] = 610, ["level"] = 30}, - [1778] = {["xp"] = 230, ["level"] = 13}, - [1779] = {["xp"] = 0, ["level"] = nil}, - [1780] = {["xp"] = 230, ["level"] = 13}, - [1781] = {["xp"] = 0, ["level"] = nil}, - [1782] = {["xp"] = 3400, ["level"] = 28}, - [1783] = {["xp"] = 680, ["level"] = 13}, - [1784] = {["xp"] = 680, ["level"] = 13}, - [1785] = {["xp"] = 1150, ["level"] = 13}, - [1786] = {["xp"] = 680, ["level"] = 13}, - [1787] = {["xp"] = 680, ["level"] = 13}, - [1788] = {["xp"] = 1150, ["level"] = 13}, - [1789] = {["xp"] = 0, ["level"] = nil}, - [1790] = {["xp"] = 0, ["level"] = nil}, - [1791] = {["xp"] = 245, ["level"] = 30}, - [1792] = {["xp"] = 3900, ["level"] = 40}, - [1793] = {["xp"] = 0, ["level"] = nil}, - [1794] = {["xp"] = 0, ["level"] = nil}, - [1795] = {["xp"] = 2450, ["level"] = 30}, - [1796] = {["xp"] = 2500, ["level"] = 31}, - [1798] = {["xp"] = 610, ["level"] = 30}, - [1799] = {["xp"] = 3150, ["level"] = 40}, - [1800] = {["xp"] = 155, ["level"] = 1}, - [1801] = {["xp"] = 610, ["level"] = 30}, - [1802] = {["xp"] = 2450, ["level"] = 30}, - [1803] = {["xp"] = 610, ["level"] = 30}, - [1804] = {["xp"] = 2450, ["level"] = 30}, - [1805] = {["xp"] = 2450, ["level"] = 30}, - [1806] = {["xp"] = 2200, ["level"] = 22}, - [1818] = {["xp"] = 85, ["level"] = 10}, - [1819] = {["xp"] = 840, ["level"] = 10}, - [1820] = {["xp"] = 210, ["level"] = 10}, - [1821] = {["xp"] = 660, ["level"] = 11}, - [1822] = {["xp"] = 880, ["level"] = 11}, - [1823] = {["xp"] = 155, ["level"] = 20}, - [1824] = {["xp"] = 1550, ["level"] = 20}, - [1825] = {["xp"] = 780, ["level"] = 20}, - [1838] = {["xp"] = 3650, ["level"] = 30}, - [1839] = {["xp"] = 1200, ["level"] = 30}, - [1840] = {["xp"] = 1200, ["level"] = 30}, - [1841] = {["xp"] = 1200, ["level"] = 30}, - [1842] = {["xp"] = 1200, ["level"] = 30}, - [1843] = {["xp"] = 1850, ["level"] = 30}, - [1844] = {["xp"] = 1200, ["level"] = 30}, - [1845] = {["xp"] = 1850, ["level"] = 30}, - [1846] = {["xp"] = 1200, ["level"] = 30}, - [1847] = {["xp"] = 1850, ["level"] = 30}, - [1848] = {["xp"] = 3050, ["level"] = 30}, - [1858] = {["xp"] = 455, ["level"] = 13}, - [1859] = {["xp"] = 210, ["level"] = 10}, - [1860] = {["xp"] = 420, ["level"] = 10}, - [1861] = {["xp"] = 840, ["level"] = 10}, - [1878] = {["xp"] = 375, ["level"] = 44}, - [1879] = {["xp"] = 85, ["level"] = 10}, - [1880] = {["xp"] = 840, ["level"] = 10}, - [1881] = {["xp"] = 85, ["level"] = 10}, - [1882] = {["xp"] = 840, ["level"] = 10}, - [1883] = {["xp"] = 85, ["level"] = 10}, - [1884] = {["xp"] = 840, ["level"] = 10}, - [1885] = {["xp"] = 210, ["level"] = 10}, - [1886] = {["xp"] = 680, ["level"] = 13}, - [1898] = {["xp"] = 230, ["level"] = 13}, - [1899] = {["xp"] = 230, ["level"] = 13}, - [1918] = {["xp"] = 550, ["level"] = 27}, - [1919] = {["xp"] = 105, ["level"] = 15}, - [1920] = {["xp"] = 1150, ["level"] = 16}, - [1921] = {["xp"] = 800, ["level"] = 15}, - [1938] = {["xp"] = 2300, ["level"] = 28}, - [1939] = {["xp"] = 1050, ["level"] = 26}, - [1940] = {["xp"] = 1600, ["level"] = 26}, - [1941] = {["xp"] = 1050, ["level"] = 15}, - [1942] = {["xp"] = 2100, ["level"] = 26}, - [1943] = {["xp"] = 210, ["level"] = 26}, - [1944] = {["xp"] = 2100, ["level"] = 26}, - [1945] = {["xp"] = 1600, ["level"] = 26}, - [1946] = {["xp"] = 2100, ["level"] = 26}, - [1947] = {["xp"] = 285, ["level"] = 38}, - [1948] = {["xp"] = 3150, ["level"] = 40}, - [1949] = {["xp"] = 1450, ["level"] = 38}, - [1950] = {["xp"] = 1850, ["level"] = 30}, - [1951] = {["xp"] = 3150, ["level"] = 40}, - [1952] = {["xp"] = 3150, ["level"] = 40}, - [1953] = {["xp"] = 315, ["level"] = 40}, - [1954] = {["xp"] = 2350, ["level"] = 40}, - [1955] = {["xp"] = 2350, ["level"] = 40}, - [1956] = {["xp"] = 3900, ["level"] = 40}, - [1957] = {["xp"] = 2350, ["level"] = 40}, - [1958] = {["xp"] = 3150, ["level"] = 40}, - [1959] = {["xp"] = 105, ["level"] = 15}, - [1960] = {["xp"] = 1150, ["level"] = 16}, - [1961] = {["xp"] = 800, ["level"] = 15}, - [1962] = {["xp"] = 1050, ["level"] = 15}, - [1963] = {["xp"] = 680, ["level"] = 13}, - [1978] = {["xp"] = 910, ["level"] = 13}, - [1998] = {["xp"] = 880, ["level"] = 16}, - [1999] = {["xp"] = 1550, ["level"] = 20}, - [2000] = {["xp"] = 855, ["level"] = 16}, - [2018] = {["xp"] = 2560, ["level"] = 16}, - [2019] = {["xp"] = 855, ["level"] = 16}, - [2038] = {["xp"] = 1050, ["level"] = 15}, - [2039] = {["xp"] = 270, ["level"] = 15}, - [2040] = {["xp"] = 1550, ["level"] = 20}, - [2041] = {["xp"] = 270, ["level"] = 15}, - [2078] = {["xp"] = 1150, ["level"] = 20}, - [2098] = {["xp"] = 1550, ["level"] = 20}, - [2118] = {["xp"] = 980, ["level"] = 14}, - [2138] = {["xp"] = 1150, ["level"] = 16}, - [2139] = {["xp"] = 1350, ["level"] = 18}, - [2158] = {["xp"] = 110, ["level"] = 5}, - [2159] = {["xp"] = 110, ["level"] = 5}, - [2160] = {["xp"] = 110, ["level"] = 5}, - [2161] = {["xp"] = 110, ["level"] = 5}, - [2178] = {["xp"] = 910, ["level"] = 12}, - [2198] = {["xp"] = 3300, ["level"] = 41}, - [2199] = {["xp"] = 2450, ["level"] = 41}, - [2200] = {["xp"] = 2550, ["level"] = 42}, - [2201] = {["xp"] = 3600, ["level"] = 43}, - [2202] = {["xp"] = 3450, ["level"] = 42}, - [2203] = {["xp"] = 3750, ["level"] = 44}, - [2204] = {["xp"] = 930, ["level"] = 44}, - [2205] = {["xp"] = 210, ["level"] = 10}, - [2206] = {["xp"] = 840, ["level"] = 10}, - [2218] = {["xp"] = 420, ["level"] = 10}, - [2238] = {["xp"] = 840, ["level"] = 10}, - [2239] = {["xp"] = 840, ["level"] = 10}, - [2240] = {["xp"] = 3900, ["level"] = 40}, - [2241] = {["xp"] = 420, ["level"] = 10}, - [2242] = {["xp"] = 840, ["level"] = 10}, - [2258] = {["xp"] = 3000, ["level"] = 39}, - [2259] = {["xp"] = 115, ["level"] = 16}, - [2260] = {["xp"] = 580, ["level"] = 16}, - [2278] = {["xp"] = 4200, ["level"] = 47}, - [2279] = {["xp"] = 5250, ["level"] = 47}, - [2280] = {["xp"] = 5250, ["level"] = 47}, - [2281] = {["xp"] = 115, ["level"] = 16}, - [2282] = {["xp"] = 1550, ["level"] = 20}, - [2283] = {["xp"] = 2450, ["level"] = 41}, - [2284] = {["xp"] = 2450, ["level"] = 41}, - [2298] = {["xp"] = 115, ["level"] = 16}, - [2299] = {["xp"] = 115, ["level"] = 16}, - [2300] = {["xp"] = 115, ["level"] = 16}, - [2318] = {["xp"] = 3450, ["level"] = 42}, - [2338] = {["xp"] = 345, ["level"] = 42}, - [2339] = {["xp"] = 3750, ["level"] = 44}, - [2340] = {["xp"] = 1850, ["level"] = 44}, - [2341] = {["xp"] = 5600, ["level"] = 44}, - [2342] = {["xp"] = 3600, ["level"] = 43}, - [2358] = {["xp"] = 4230, ["level"] = 22}, - [2359] = {["xp"] = 1950, ["level"] = 24}, - [2360] = {["xp"] = 390, ["level"] = 20}, - [2361] = {["xp"] = 5600, ["level"] = 44}, - [2378] = {["xp"] = 115, ["level"] = 16}, - [2379] = {["xp"] = 0, ["level"] = nil}, - [2380] = {["xp"] = 115, ["level"] = 16}, - [2381] = {["xp"] = 1350, ["level"] = 18}, - [2382] = {["xp"] = 115, ["level"] = 16}, - [2383] = {["xp"] = 40, ["level"] = 1}, - [2398] = {["xp"] = 315, ["level"] = 40}, - [2399] = {["xp"] = 85, ["level"] = 10}, - [2418] = {["xp"] = 3500, ["level"] = 36}, - [2438] = {["xp"] = 405, ["level"] = 6}, - [2439] = {["xp"] = 420, ["level"] = 47}, - [2440] = {["xp"] = 420, ["level"] = 47}, - [2458] = {["xp"] = 1150, ["level"] = 20}, - [2459] = {["xp"] = 880, ["level"] = 8}, - [2460] = {["xp"] = 155, ["level"] = 20}, - [2478] = {["xp"] = 1950, ["level"] = 24}, - [2479] = {["xp"] = 1050, ["level"] = 26}, - [2480] = {["xp"] = 155, ["level"] = 20}, - [2498] = {["xp"] = 80, ["level"] = 9}, - [2499] = {["xp"] = 980, ["level"] = 9}, - [2500] = {["xp"] = 3000, ["level"] = 39}, - [2501] = {["xp"] = 3750, ["level"] = 44}, - [2518] = {["xp"] = 1150, ["level"] = 12}, - [2519] = {["xp"] = 85, ["level"] = 10}, - [2520] = {["xp"] = 910, ["level"] = 12}, - [2521] = {["xp"] = 8450, ["level"] = 55}, - [2522] = {["xp"] = 5650, ["level"] = 55}, - [2523] = {["xp"] = 560, ["level"] = 55}, - [2541] = {["xp"] = 700, ["level"] = 8}, - [2561] = {["xp"] = 1050, ["level"] = 10}, - [2581] = {["xp"] = 4700, ["level"] = 50}, - [2582] = {["xp"] = 0, ["level"] = nil}, - [2583] = {["xp"] = 4700, ["level"] = 50}, - [2584] = {["xp"] = 0, ["level"] = nil}, - [2585] = {["xp"] = 4700, ["level"] = 50}, - [2586] = {["xp"] = 0, ["level"] = nil}, - [2601] = {["xp"] = 4700, ["level"] = 50}, - [2603] = {["xp"] = 4700, ["level"] = 50}, - [2605] = {["xp"] = 4550, ["level"] = 49}, - [2606] = {["xp"] = 455, ["level"] = 49}, - [2607] = {["xp"] = 0, ["level"] = nil}, - [2608] = {["xp"] = 155, ["level"] = 20}, - [2609] = {["xp"] = 1150, ["level"] = 20}, - [2621] = {["xp"] = 1200, ["level"] = 50}, - [2622] = {["xp"] = 1200, ["level"] = 50}, - [2623] = {["xp"] = 5650, ["level"] = 55}, - [2641] = {["xp"] = 4550, ["level"] = 49}, - [2661] = {["xp"] = 455, ["level"] = 49}, - [2662] = {["xp"] = 0, ["level"] = nil}, - [2681] = {["xp"] = 7550, ["level"] = 57}, - [2701] = {["xp"] = 6000, ["level"] = 57}, - [2702] = {["xp"] = 3000, ["level"] = 57}, - [2721] = {["xp"] = 6200, ["level"] = 58}, - [2741] = {["xp"] = 4200, ["level"] = 47}, - [2742] = {["xp"] = 4200, ["level"] = 47}, - [2743] = {["xp"] = 3300, ["level"] = 60}, - [2744] = {["xp"] = 6600, ["level"] = 60}, - [2745] = {["xp"] = 250, ["level"] = 31}, - [2746] = {["xp"] = 630, ["level"] = 31}, - [2747] = {["xp"] = 0, ["level"] = nil}, - [2748] = {["xp"] = 0, ["level"] = nil}, - [2749] = {["xp"] = 0, ["level"] = nil}, - [2750] = {["xp"] = 0, ["level"] = nil}, - [2751] = {["xp"] = 2550, ["level"] = 32}, - [2752] = {["xp"] = 2550, ["level"] = 32}, - [2753] = {["xp"] = 2800, ["level"] = 36}, - [2754] = {["xp"] = 2800, ["level"] = 36}, - [2755] = {["xp"] = 280, ["level"] = 36}, - [2756] = {["xp"] = 3150, ["level"] = 40}, - [2757] = {["xp"] = 1550, ["level"] = 40}, - [2758] = {["xp"] = 3150, ["level"] = 40}, - [2759] = {["xp"] = 1550, ["level"] = 40}, - [2760] = {["xp"] = 3150, ["level"] = 40}, - [2761] = {["xp"] = 3900, ["level"] = 45}, - [2762] = {["xp"] = 3900, ["level"] = 45}, - [2763] = {["xp"] = 3900, ["level"] = 45}, - [2764] = {["xp"] = 2900, ["level"] = 45}, - [2765] = {["xp"] = 3900, ["level"] = 45}, - [2766] = {["xp"] = 3900, ["level"] = 45}, - [2767] = {["xp"] = 4850, ["level"] = 45}, - [2768] = {["xp"] = 6300, ["level"] = 47}, - [2769] = {["xp"] = 405, ["level"] = 46}, - [2770] = {["xp"] = 7100, ["level"] = 50}, - [2771] = {["xp"] = 3900, ["level"] = 45}, - [2772] = {["xp"] = 3900, ["level"] = 45}, - [2773] = {["xp"] = 3900, ["level"] = 45}, - [2781] = {["xp"] = 5050, ["level"] = 46}, - [2782] = {["xp"] = 2100, ["level"] = 47}, - [2783] = {["xp"] = 4500, ["level"] = 57}, - [2784] = {["xp"] = 470, ["level"] = 50}, - [2801] = {["xp"] = 600, ["level"] = 57}, - [2821] = {["xp"] = 4050, ["level"] = 46}, - [2822] = {["xp"] = 4050, ["level"] = 46}, - [2841] = {["xp"] = 2750, ["level"] = 35}, - [2842] = {["xp"] = 275, ["level"] = 35}, - [2843] = {["xp"] = 0, ["level"] = nil}, - [2844] = {["xp"] = 3400, ["level"] = 49}, - [2845] = {["xp"] = 4550, ["level"] = 49}, - [2846] = {["xp"] = 6050, ["level"] = 46}, - [2847] = {["xp"] = 1950, ["level"] = 45}, - [2848] = {["xp"] = 2900, ["level"] = 45}, - [2849] = {["xp"] = 2900, ["level"] = 45}, - [2850] = {["xp"] = 2900, ["level"] = 45}, - [2851] = {["xp"] = 2900, ["level"] = 45}, - [2852] = {["xp"] = 2900, ["level"] = 45}, - [2853] = {["xp"] = 3900, ["level"] = 45}, - [2854] = {["xp"] = 1950, ["level"] = 45}, - [2855] = {["xp"] = 2900, ["level"] = 45}, - [2856] = {["xp"] = 2900, ["level"] = 45}, - [2857] = {["xp"] = 2900, ["level"] = 45}, - [2858] = {["xp"] = 2900, ["level"] = 45}, - [2859] = {["xp"] = 2900, ["level"] = 45}, - [2860] = {["xp"] = 3900, ["level"] = 45}, - [2861] = {["xp"] = 405, ["level"] = 46}, - [2862] = {["xp"] = 2550, ["level"] = 42}, - [2863] = {["xp"] = 2700, ["level"] = 43}, - [2864] = {["xp"] = 390, ["level"] = 45}, - [2865] = {["xp"] = 3900, ["level"] = 45}, - [2866] = {["xp"] = 2700, ["level"] = 43}, - [2867] = {["xp"] = 1800, ["level"] = 43}, - [2869] = {["xp"] = 2700, ["level"] = 43}, - [2870] = {["xp"] = 2900, ["level"] = 45}, - [2871] = {["xp"] = 3900, ["level"] = 45}, - [2872] = {["xp"] = 390, ["level"] = 45}, - [2873] = {["xp"] = 3900, ["level"] = 45}, - [2874] = {["xp"] = 3900, ["level"] = 45}, - [2875] = {["xp"] = 3900, ["level"] = 45}, - [2876] = {["xp"] = 4850, ["level"] = 45}, - [2877] = {["xp"] = 4400, ["level"] = 48}, - [2878] = {["xp"] = 560, ["level"] = 55}, - [2879] = {["xp"] = 4700, ["level"] = 50}, - [2880] = {["xp"] = 3900, ["level"] = 45}, - [2881] = {["xp"] = 390, ["level"] = 45}, - [2882] = {["xp"] = 0, ["level"] = nil}, - [2902] = {["xp"] = 1800, ["level"] = 43}, - [2903] = {["xp"] = 3600, ["level"] = 43}, - [2904] = {["xp"] = 2450, ["level"] = 30}, - [2922] = {["xp"] = 2650, ["level"] = 26}, - [2923] = {["xp"] = 210, ["level"] = 26}, - [2924] = {["xp"] = 3050, ["level"] = 30}, - [2925] = {["xp"] = 245, ["level"] = 30}, - [2926] = {["xp"] = 2200, ["level"] = 27}, - [2927] = {["xp"] = 220, ["level"] = 27}, - [2928] = {["xp"] = 2450, ["level"] = 30}, - [2929] = {["xp"] = 2750, ["level"] = 35}, - [2930] = {["xp"] = 3650, ["level"] = 30}, - [2931] = {["xp"] = 230, ["level"] = 28}, - [2932] = {["xp"] = 3450, ["level"] = 42}, - [2933] = {["xp"] = 3600, ["level"] = 43}, - [2934] = {["xp"] = 3900, ["level"] = 45}, - [2935] = {["xp"] = 2900, ["level"] = 45}, - [2936] = {["xp"] = 4850, ["level"] = 45}, - [2937] = {["xp"] = 8450, ["level"] = 55}, - [2938] = {["xp"] = 8450, ["level"] = 55}, - [2939] = {["xp"] = 420, ["level"] = 47}, - [2940] = {["xp"] = 420, ["level"] = 47}, - [2941] = {["xp"] = 1100, ["level"] = 48}, - [2942] = {["xp"] = 4700, ["level"] = 50}, - [2943] = {["xp"] = 3300, ["level"] = 48}, - [2944] = {["xp"] = 4400, ["level"] = 48}, - [2945] = {["xp"] = 2700, ["level"] = 34}, - [2946] = {["xp"] = 4700, ["level"] = 50}, - [2947] = {["xp"] = 2700, ["level"] = 34}, - [2948] = {["xp"] = 2750, ["level"] = 35}, - [2949] = {["xp"] = 2700, ["level"] = 34}, - [2950] = {["xp"] = 2750, ["level"] = 35}, - [2952] = {["xp"] = 2450, ["level"] = 30}, - [2954] = {["xp"] = 4700, ["level"] = 50}, - [2962] = {["xp"] = 2450, ["level"] = 30}, - [2963] = {["xp"] = 470, ["level"] = 50}, - [2964] = {["xp"] = 4700, ["level"] = 50}, - [2965] = {["xp"] = 470, ["level"] = 50}, - [2966] = {["xp"] = 4700, ["level"] = 50}, - [2967] = {["xp"] = 470, ["level"] = 50}, - [2968] = {["xp"] = 4700, ["level"] = 50}, - [2969] = {["xp"] = 3150, ["level"] = 47}, - [2970] = {["xp"] = 3150, ["level"] = 47}, - [2971] = {["xp"] = 3200, ["level"] = 32}, - [2972] = {["xp"] = 5250, ["level"] = 47}, - [2973] = {["xp"] = 3900, ["level"] = 45}, - [2974] = {["xp"] = 3900, ["level"] = 45}, - [2975] = {["xp"] = 2700, ["level"] = 43}, - [2976] = {["xp"] = 4850, ["level"] = 45}, - [2977] = {["xp"] = 470, ["level"] = 50}, - [2978] = {["xp"] = 1800, ["level"] = 43}, - [2979] = {["xp"] = 4050, ["level"] = 46}, - [2980] = {["xp"] = 3750, ["level"] = 44}, - [2981] = {["xp"] = 890, ["level"] = 43}, - [2982] = {["xp"] = 3750, ["level"] = 44}, - [2983] = {["xp"] = 420, ["level"] = 10}, - [2984] = {["xp"] = 420, ["level"] = 10}, - [2985] = {["xp"] = 780, ["level"] = 20}, - [2986] = {["xp"] = 780, ["level"] = 20}, - [2987] = {["xp"] = 3600, ["level"] = 43}, - [2988] = {["xp"] = 3900, ["level"] = 45}, - [2989] = {["xp"] = 4400, ["level"] = 48}, - [2990] = {["xp"] = 2100, ["level"] = 47}, - [2991] = {["xp"] = 5250, ["level"] = 47}, - [2992] = {["xp"] = 1050, ["level"] = 47}, - [2993] = {["xp"] = 2100, ["level"] = 47}, - [2994] = {["xp"] = 7350, ["level"] = 51}, - [2995] = {["xp"] = 3150, ["level"] = 47}, - [2996] = {["xp"] = 610, ["level"] = 30}, - [2997] = {["xp"] = 90, ["level"] = 12}, - [2998] = {["xp"] = 225, ["level"] = 12}, - [2999] = {["xp"] = 90, ["level"] = 12}, - [3000] = {["xp"] = 225, ["level"] = 12}, - [3001] = {["xp"] = 610, ["level"] = 30}, - [3002] = {["xp"] = 2100, ["level"] = 47}, - [3022] = {["xp"] = 2100, ["level"] = 47}, - [3042] = {["xp"] = 3900, ["level"] = 45}, - [3062] = {["xp"] = 5900, ["level"] = 50}, - [3063] = {["xp"] = 3550, ["level"] = 50}, - [3065] = {["xp"] = 40, ["level"] = 1}, - [3082] = {["xp"] = 40, ["level"] = 1}, - [3083] = {["xp"] = 40, ["level"] = 1}, - [3084] = {["xp"] = 40, ["level"] = 1}, - [3085] = {["xp"] = 40, ["level"] = 1}, - [3086] = {["xp"] = 40, ["level"] = 1}, - [3087] = {["xp"] = 40, ["level"] = 1}, - [3088] = {["xp"] = 40, ["level"] = 1}, - [3089] = {["xp"] = 40, ["level"] = 1}, - [3090] = {["xp"] = 40, ["level"] = 1}, - [3091] = {["xp"] = 40, ["level"] = 1}, - [3092] = {["xp"] = 40, ["level"] = 1}, - [3093] = {["xp"] = 40, ["level"] = 1}, - [3094] = {["xp"] = 40, ["level"] = 1}, - [3095] = {["xp"] = 40, ["level"] = 1}, - [3096] = {["xp"] = 40, ["level"] = 1}, - [3097] = {["xp"] = 40, ["level"] = 1}, - [3098] = {["xp"] = 40, ["level"] = 1}, - [3099] = {["xp"] = 40, ["level"] = 1}, - [3100] = {["xp"] = 40, ["level"] = 1}, - [3101] = {["xp"] = 40, ["level"] = 1}, - [3102] = {["xp"] = 40, ["level"] = 1}, - [3103] = {["xp"] = 40, ["level"] = 1}, - [3104] = {["xp"] = 40, ["level"] = 1}, - [3105] = {["xp"] = 40, ["level"] = 1}, - [3106] = {["xp"] = 40, ["level"] = 1}, - [3107] = {["xp"] = 40, ["level"] = 1}, - [3108] = {["xp"] = 40, ["level"] = 1}, - [3109] = {["xp"] = 40, ["level"] = 1}, - [3110] = {["xp"] = 40, ["level"] = 1}, - [3111] = {["xp"] = 40, ["level"] = 1}, - [3112] = {["xp"] = 40, ["level"] = 1}, - [3113] = {["xp"] = 40, ["level"] = 1}, - [3114] = {["xp"] = 40, ["level"] = 1}, - [3115] = {["xp"] = 40, ["level"] = 1}, - [3116] = {["xp"] = 40, ["level"] = 1}, - [3117] = {["xp"] = 40, ["level"] = 1}, - [3118] = {["xp"] = 40, ["level"] = 1}, - [3119] = {["xp"] = 40, ["level"] = 1}, - [3120] = {["xp"] = 40, ["level"] = 1}, - [3121] = {["xp"] = 1950, ["level"] = 45}, - [3122] = {["xp"] = 970, ["level"] = 45}, - [3123] = {["xp"] = 4200, ["level"] = 47}, - [3124] = {["xp"] = 4200, ["level"] = 47}, - [3125] = {["xp"] = 3900, ["level"] = 45}, - [3126] = {["xp"] = 4700, ["level"] = 50}, - [3127] = {["xp"] = 4700, ["level"] = 50}, - [3128] = {["xp"] = 4700, ["level"] = 50}, - [3129] = {["xp"] = 4700, ["level"] = 50}, - [3130] = {["xp"] = 360, ["level"] = 43}, - [3141] = {["xp"] = 600, ["level"] = 57}, - [3161] = {["xp"] = 4400, ["level"] = 48}, - [3181] = {["xp"] = 5450, ["level"] = 48}, - [3182] = {["xp"] = 4400, ["level"] = 48}, - [3201] = {["xp"] = 4400, ["level"] = 48}, - [3221] = {["xp"] = 90, ["level"] = 12}, - [3261] = {["xp"] = 135, ["level"] = 18}, - [3281] = {["xp"] = 1350, ["level"] = 18}, - [3301] = {["xp"] = 1050, ["level"] = 15}, - [3321] = {["xp"] = 7100, ["level"] = 50}, - [3341] = {["xp"] = 4300, ["level"] = 42}, - [3361] = {["xp"] = 250, ["level"] = 3}, - [3362] = {["xp"] = 4700, ["level"] = 50}, - [3363] = {["xp"] = 560, ["level"] = 55}, - [3364] = {["xp"] = 225, ["level"] = 5}, - [3365] = {["xp"] = 450, ["level"] = 5}, - [3366] = {["xp"] = 2550, ["level"] = 25}, - [3367] = {["xp"] = 4400, ["level"] = 48}, - [3368] = {["xp"] = 4400, ["level"] = 48}, - [3369] = {["xp"] = 2000, ["level"] = 25}, - [3370] = {["xp"] = 2000, ["level"] = 25}, - [3371] = {["xp"] = 5650, ["level"] = 55}, - [3372] = {["xp"] = 5100, ["level"] = 52}, - [3373] = {["xp"] = 2800, ["level"] = 55}, - [3374] = {["xp"] = 560, ["level"] = 55}, - [3375] = {["xp"] = 0, ["level"] = nil}, - [3376] = {["xp"] = 670, ["level"] = 5}, - [3377] = {["xp"] = 470, ["level"] = 50}, - [3378] = {["xp"] = 5900, ["level"] = 50}, - [3379] = {["xp"] = 4700, ["level"] = 50}, - [3380] = {["xp"] = 3650, ["level"] = 51}, - [3381] = {["xp"] = 2200, ["level"] = 48}, - [3382] = {["xp"] = 600, ["level"] = 57}, - [3383] = {["xp"] = 5650, ["level"] = 55}, - [3384] = {["xp"] = 560, ["level"] = 55}, - [3385] = {["xp"] = 4700, ["level"] = 50}, - [3402] = {["xp"] = 4700, ["level"] = 50}, - [3421] = {["xp"] = 0, ["level"] = nil}, - [3441] = {["xp"] = 440, ["level"] = 48}, - [3442] = {["xp"] = 4400, ["level"] = 48}, - [3443] = {["xp"] = 4400, ["level"] = 48}, - [3444] = {["xp"] = 4900, ["level"] = 51}, - [3445] = {["xp"] = 3650, ["level"] = 51}, - [3446] = {["xp"] = 4900, ["level"] = 51}, - [3447] = {["xp"] = 6100, ["level"] = 51}, - [3448] = {["xp"] = 510, ["level"] = 52}, - [3449] = {["xp"] = 2550, ["level"] = 52}, - [3450] = {["xp"] = 510, ["level"] = 52}, - [3451] = {["xp"] = 510, ["level"] = 52}, - [3452] = {["xp"] = 4700, ["level"] = 50}, - [3453] = {["xp"] = 470, ["level"] = 50}, - [3454] = {["xp"] = 4700, ["level"] = 50}, - [3461] = {["xp"] = 7600, ["level"] = 52}, - [3462] = {["xp"] = 470, ["level"] = 50}, - [3463] = {["xp"] = 7600, ["level"] = 52}, - [3481] = {["xp"] = 470, ["level"] = 50}, - [3482] = {["xp"] = 275, ["level"] = 35}, - [3483] = {["xp"] = 0, ["level"] = nil}, - [3501] = {["xp"] = 5650, ["level"] = 55}, - [3502] = {["xp"] = 0, ["level"] = nil}, - [3503] = {["xp"] = 0, ["level"] = nil}, - [3504] = {["xp"] = 2650, ["level"] = 53}, - [3505] = {["xp"] = 3950, ["level"] = 53}, - [3506] = {["xp"] = 4350, ["level"] = 56}, - [3507] = {["xp"] = 7300, ["level"] = 56}, - [3508] = {["xp"] = 3100, ["level"] = 58}, - [3509] = {["xp"] = 6200, ["level"] = 58}, - [3510] = {["xp"] = 6200, ["level"] = 58}, - [3511] = {["xp"] = 3100, ["level"] = 58}, - [3512] = {["xp"] = 4200, ["level"] = 55}, - [3513] = {["xp"] = 2550, ["level"] = 25}, - [3514] = {["xp"] = 2950, ["level"] = 29}, - [3515] = {["xp"] = 3450, ["level"] = 42}, - [3516] = {["xp"] = 6960, ["level"] = 42}, - [3517] = {["xp"] = 5100, ["level"] = 52}, - [3518] = {["xp"] = 2550, ["level"] = 52}, - [3519] = {["xp"] = 90, ["level"] = 4}, - [3520] = {["xp"] = 3750, ["level"] = 44}, - [3521] = {["xp"] = 355, ["level"] = 4}, - [3522] = {["xp"] = 445, ["level"] = 4}, - [3523] = {["xp"] = 285, ["level"] = 37}, - [3524] = {["xp"] = 680, ["level"] = 13}, - [3525] = {["xp"] = 4250, ["level"] = 37}, - [3526] = {["xp"] = 420, ["level"] = 47}, - [3527] = {["xp"] = 5250, ["level"] = 47}, - [3528] = {["xp"] = 7900, ["level"] = 53}, - [3541] = {["xp"] = 2550, ["level"] = 52}, - [3542] = {["xp"] = 2550, ["level"] = 52}, - [3561] = {["xp"] = 2550, ["level"] = 52}, - [3562] = {["xp"] = 3800, ["level"] = 52}, - [3563] = {["xp"] = 3800, ["level"] = 52}, - [3564] = {["xp"] = 3800, ["level"] = 52}, - [3565] = {["xp"] = 3800, ["level"] = 52}, - [3566] = {["xp"] = 7600, ["level"] = 52}, - [3567] = {["xp"] = 0, ["level"] = nil}, - [3568] = {["xp"] = 2550, ["level"] = 52}, - [3569] = {["xp"] = 510, ["level"] = 52}, - [3570] = {["xp"] = 5100, ["level"] = 52}, - [3601] = {["xp"] = 6550, ["level"] = 53}, - [3602] = {["xp"] = 7750, ["level"] = 58}, - [3621] = {["xp"] = 4650, ["level"] = 58}, - [3625] = {["xp"] = 620, ["level"] = 58}, - [3626] = {["xp"] = 1550, ["level"] = 58}, - [3627] = {["xp"] = 8300, ["level"] = 60}, - [3628] = {["xp"] = 9950, ["level"] = 60}, - [3629] = {["xp"] = 420, ["level"] = 47}, - [3630] = {["xp"] = 420, ["level"] = 47}, - [3631] = {["xp"] = 315, ["level"] = 40}, - [3632] = {["xp"] = 420, ["level"] = 47}, - [3633] = {["xp"] = 420, ["level"] = 47}, - [3634] = {["xp"] = 420, ["level"] = 47}, - [3635] = {["xp"] = 420, ["level"] = 47}, - [3636] = {["xp"] = 4300, ["level"] = 42}, - [3637] = {["xp"] = 420, ["level"] = 47}, - [3638] = {["xp"] = 420, ["level"] = 47}, - [3639] = {["xp"] = 3150, ["level"] = 47}, - [3640] = {["xp"] = 420, ["level"] = 47}, - [3641] = {["xp"] = 3150, ["level"] = 47}, - [3642] = {["xp"] = 420, ["level"] = 47}, - [3643] = {["xp"] = 3150, ["level"] = 47}, - [3644] = {["xp"] = 0, ["level"] = nil}, - [3661] = {["xp"] = 4200, ["level"] = 47}, - [3681] = {["xp"] = 225, ["level"] = 12}, - [3701] = {["xp"] = 5450, ["level"] = 54}, - [3702] = {["xp"] = 540, ["level"] = 54}, - [3721] = {["xp"] = 7100, ["level"] = 50}, - [3741] = {["xp"] = 1350, ["level"] = 15}, - [3761] = {["xp"] = 4700, ["level"] = 50}, - [3762] = {["xp"] = 470, ["level"] = 50}, - [3763] = {["xp"] = 470, ["level"] = 50}, - [3764] = {["xp"] = 4700, ["level"] = 50}, - [3765] = {["xp"] = 1450, ["level"] = 24}, - [3781] = {["xp"] = 470, ["level"] = 50}, - [3782] = {["xp"] = 470, ["level"] = 50}, - [3783] = {["xp"] = 4350, ["level"] = 56}, - [3784] = {["xp"] = 470, ["level"] = 50}, - [3785] = {["xp"] = 4700, ["level"] = 50}, - [3786] = {["xp"] = 4700, ["level"] = 50}, - [3787] = {["xp"] = 1200, ["level"] = 50}, - [3788] = {["xp"] = 470, ["level"] = 50}, - [3789] = {["xp"] = 470, ["level"] = 50}, - [3790] = {["xp"] = 470, ["level"] = 50}, - [3791] = {["xp"] = 4700, ["level"] = 50}, - [3792] = {["xp"] = 560, ["level"] = 55}, - [3801] = {["xp"] = 510, ["level"] = 52}, - [3802] = {["xp"] = 5100, ["level"] = 52}, - [3803] = {["xp"] = 560, ["level"] = 55}, - [3804] = {["xp"] = 560, ["level"] = 55}, - [3821] = {["xp"] = 5100, ["level"] = 52}, - [3822] = {["xp"] = 5250, ["level"] = 53}, - [3823] = {["xp"] = 5100, ["level"] = 52}, - [3824] = {["xp"] = 5250, ["level"] = 53}, - [3825] = {["xp"] = 5250, ["level"] = 53}, - [3841] = {["xp"] = 1050, ["level"] = 47}, - [3842] = {["xp"] = 2100, ["level"] = 47}, - [3843] = {["xp"] = 4200, ["level"] = 47}, - [3844] = {["xp"] = 1250, ["level"] = 52}, - [3845] = {["xp"] = 5100, ["level"] = 52}, - [3861] = {["xp"] = 10, ["level"] = 1}, - [3881] = {["xp"] = 5250, ["level"] = 53}, - [3882] = {["xp"] = 4900, ["level"] = 51}, - [3883] = {["xp"] = 5100, ["level"] = 52}, - [3884] = {["xp"] = 3550, ["level"] = 50}, - [3885] = {["xp"] = 13110, ["level"] = 55}, - [3901] = {["xp"] = 250, ["level"] = 3}, - [3902] = {["xp"] = 315, ["level"] = 3}, - [3903] = {["xp"] = 35, ["level"] = 4}, - [3904] = {["xp"] = 180, ["level"] = 4}, - [3905] = {["xp"] = 355, ["level"] = 4}, - [3906] = {["xp"] = 5100, ["level"] = 52}, - [3907] = {["xp"] = 7300, ["level"] = 56}, - [3908] = {["xp"] = 5100, ["level"] = 52}, - [3909] = {["xp"] = 5100, ["level"] = 52}, - [3910] = {["xp"] = 13110, ["level"] = 55}, - [3911] = {["xp"] = 8600, ["level"] = 54}, - [3912] = {["xp"] = 5100, ["level"] = 52}, - [3913] = {["xp"] = 2550, ["level"] = 52}, - [3914] = {["xp"] = 5100, ["level"] = 52}, - [3921] = {["xp"] = 490, ["level"] = 14}, - [3922] = {["xp"] = 1050, ["level"] = 15}, - [3923] = {["xp"] = 340, ["level"] = 18}, - [3924] = {["xp"] = 1800, ["level"] = 19}, - [3941] = {["xp"] = 1250, ["level"] = 52}, - [3942] = {["xp"] = 5450, ["level"] = 54}, - [3961] = {["xp"] = 2700, ["level"] = 54}, - [3962] = {["xp"] = 7300, ["level"] = 56}, - [3981] = {["xp"] = 5100, ["level"] = 52}, - [3982] = {["xp"] = 5450, ["level"] = 54}, - [4001] = {["xp"] = 6800, ["level"] = 54}, - [4002] = {["xp"] = 540, ["level"] = 54}, - [4003] = {["xp"] = 8050, ["level"] = 59}, - [4004] = {["xp"] = 9950, ["level"] = 60}, - [4005] = {["xp"] = 5450, ["level"] = 54}, - [4021] = {["xp"] = 1950, ["level"] = 20}, - [4022] = {["xp"] = 5450, ["level"] = 54}, - [4023] = {["xp"] = 5450, ["level"] = 54}, - [4024] = {["xp"] = 6200, ["level"] = 58}, - [4041] = {["xp"] = 0, ["level"] = nil}, - [4061] = {["xp"] = 5450, ["level"] = 54}, - [4062] = {["xp"] = 1350, ["level"] = 54}, - [4063] = {["xp"] = 6200, ["level"] = 58}, - [4081] = {["xp"] = 5100, ["level"] = 52}, - [4082] = {["xp"] = 5450, ["level"] = 54}, - [4083] = {["xp"] = 5650, ["level"] = 55}, - [4084] = {["xp"] = 5450, ["level"] = 54}, - [4101] = {["xp"] = 5650, ["level"] = 55}, - [4102] = {["xp"] = 5650, ["level"] = 55}, - [4103] = {["xp"] = 0, ["level"] = nil}, - [4104] = {["xp"] = 0, ["level"] = nil}, - [4105] = {["xp"] = 0, ["level"] = nil}, - [4106] = {["xp"] = 0, ["level"] = nil}, - [4108] = {["xp"] = 0, ["level"] = nil}, - [4109] = {["xp"] = 0, ["level"] = nil}, - [4110] = {["xp"] = 0, ["level"] = nil}, - [4111] = {["xp"] = 0, ["level"] = nil}, - [4113] = {["xp"] = 560, ["level"] = 55}, - [4114] = {["xp"] = 560, ["level"] = 55}, - [4115] = {["xp"] = 560, ["level"] = 55}, - [4116] = {["xp"] = 560, ["level"] = 55}, - [4117] = {["xp"] = 560, ["level"] = 55}, - [4118] = {["xp"] = 560, ["level"] = 55}, - [4119] = {["xp"] = 560, ["level"] = 55}, - [4120] = {["xp"] = 5100, ["level"] = 52}, - [4121] = {["xp"] = 7750, ["level"] = 58}, - [4122] = {["xp"] = 6200, ["level"] = 58}, - [4123] = {["xp"] = 5650, ["level"] = 55}, - [4124] = {["xp"] = 360, ["level"] = 43}, - [4125] = {["xp"] = 2700, ["level"] = 43}, - [4126] = {["xp"] = 7050, ["level"] = 55}, - [4127] = {["xp"] = 375, ["level"] = 44}, - [4128] = {["xp"] = 560, ["level"] = 55}, - [4129] = {["xp"] = 375, ["level"] = 44}, - [4130] = {["xp"] = 375, ["level"] = 44}, - [4131] = {["xp"] = 2800, ["level"] = 44}, - [4132] = {["xp"] = 7750, ["level"] = 58}, - [4133] = {["xp"] = 560, ["level"] = 55}, - [4134] = {["xp"] = 5650, ["level"] = 55}, - [4135] = {["xp"] = 3050, ["level"] = 46}, - [4136] = {["xp"] = 2650, ["level"] = 53}, - [4141] = {["xp"] = 5100, ["level"] = 52}, - [4142] = {["xp"] = 3800, ["level"] = 52}, - [4143] = {["xp"] = 5100, ["level"] = 52}, - [4144] = {["xp"] = 3950, ["level"] = 53}, - [4145] = {["xp"] = 5100, ["level"] = 52}, - [4146] = {["xp"] = 5100, ["level"] = 52}, - [4147] = {["xp"] = 2550, ["level"] = 52}, - [4148] = {["xp"] = 3950, ["level"] = 53}, - [4161] = {["xp"] = 630, ["level"] = 7}, - [4181] = {["xp"] = 420, ["level"] = 47}, - [4182] = {["xp"] = 5450, ["level"] = 54}, - [4183] = {["xp"] = 4100, ["level"] = 54}, - [4184] = {["xp"] = 4100, ["level"] = 54}, - [4185] = {["xp"] = 540, ["level"] = 54}, - [4186] = {["xp"] = 5450, ["level"] = 54}, - [4201] = {["xp"] = 5450, ["level"] = 54}, - [4221] = {["xp"] = 560, ["level"] = 55}, - [4222] = {["xp"] = 560, ["level"] = 55}, - [4223] = {["xp"] = 540, ["level"] = 54}, - [4224] = {["xp"] = 540, ["level"] = 54}, - [4241] = {["xp"] = 5450, ["level"] = 54}, - [4242] = {["xp"] = 5450, ["level"] = 54}, - [4243] = {["xp"] = 2650, ["level"] = 53}, - [4244] = {["xp"] = 3950, ["level"] = 53}, - [4245] = {["xp"] = 6550, ["level"] = 53}, - [4261] = {["xp"] = 7300, ["level"] = 56}, - [4262] = {["xp"] = 5100, ["level"] = 52}, - [4263] = {["xp"] = 5800, ["level"] = 56}, - [4264] = {["xp"] = 6200, ["level"] = 58}, - [4265] = {["xp"] = 4050, ["level"] = 46}, - [4266] = {["xp"] = 6050, ["level"] = 46}, - [4267] = {["xp"] = 405, ["level"] = 46}, - [4281] = {["xp"] = 2800, ["level"] = 44}, - [4282] = {["xp"] = 6200, ["level"] = 58}, - [4283] = {["xp"] = 5800, ["level"] = 56}, - [4284] = {["xp"] = 5250, ["level"] = 53}, - [4285] = {["xp"] = 3950, ["level"] = 53}, - [4286] = {["xp"] = 5800, ["level"] = 56}, - [4287] = {["xp"] = 3950, ["level"] = 53}, - [4288] = {["xp"] = 3950, ["level"] = 53}, - [4289] = {["xp"] = 5650, ["level"] = 55}, - [4290] = {["xp"] = 5250, ["level"] = 53}, - [4291] = {["xp"] = 5250, ["level"] = 53}, - [4292] = {["xp"] = 7300, ["level"] = 56}, - [4293] = {["xp"] = 5100, ["level"] = 52}, - [4294] = {["xp"] = 5800, ["level"] = 56}, - [4296] = {["xp"] = 2350, ["level"] = 50}, - [4297] = {["xp"] = 4200, ["level"] = 47}, - [4298] = {["xp"] = 440, ["level"] = 48}, - [4299] = {["xp"] = 8050, ["level"] = 50}, - [4300] = {["xp"] = 5100, ["level"] = 52}, - [4301] = {["xp"] = 5650, ["level"] = 55}, - [4321] = {["xp"] = 530, ["level"] = 53}, - [4322] = {["xp"] = 7750, ["level"] = 58}, - [4323] = {["xp"] = 2100, ["level"] = 26}, - [4324] = {["xp"] = 0, ["level"] = nil}, - [4341] = {["xp"] = 6400, ["level"] = 59}, - [4342] = {["xp"] = 1600, ["level"] = 59}, - [4343] = {["xp"] = 560, ["level"] = 55}, - [4361] = {["xp"] = 6400, ["level"] = 59}, - [4362] = {["xp"] = 8050, ["level"] = 59}, - [4363] = {["xp"] = 9650, ["level"] = 59}, - [4381] = {["xp"] = 0, ["level"] = nil}, - [4382] = {["xp"] = 0, ["level"] = nil}, - [4383] = {["xp"] = 0, ["level"] = nil}, - [4384] = {["xp"] = 0, ["level"] = nil}, - [4385] = {["xp"] = 0, ["level"] = nil}, - [4386] = {["xp"] = 0, ["level"] = nil}, - [4401] = {["xp"] = 560, ["level"] = 55}, - [4402] = {["xp"] = 380, ["level"] = 3}, - [4403] = {["xp"] = 560, ["level"] = 55}, - [4421] = {["xp"] = 5450, ["level"] = 54}, - [4441] = {["xp"] = 5450, ["level"] = 54}, - [4442] = {["xp"] = 5450, ["level"] = 54}, - [4443] = {["xp"] = 560, ["level"] = 55}, - [4444] = {["xp"] = 560, ["level"] = 55}, - [4445] = {["xp"] = 560, ["level"] = 55}, - [4446] = {["xp"] = 560, ["level"] = 55}, - [4447] = {["xp"] = 560, ["level"] = 55}, - [4448] = {["xp"] = 560, ["level"] = 55}, - [4449] = {["xp"] = 3900, ["level"] = 45}, - [4450] = {["xp"] = 5050, ["level"] = 46}, - [4451] = {["xp"] = 5250, ["level"] = 47}, - [4461] = {["xp"] = 560, ["level"] = 55}, - [4462] = {["xp"] = 560, ["level"] = 55}, - [4464] = {["xp"] = 560, ["level"] = 55}, - [4465] = {["xp"] = 560, ["level"] = 55}, - [4466] = {["xp"] = 560, ["level"] = 55}, - [4485] = {["xp"] = 315, ["level"] = 40}, - [4486] = {["xp"] = 315, ["level"] = 40}, - [4487] = {["xp"] = 315, ["level"] = 40}, - [4488] = {["xp"] = 315, ["level"] = 40}, - [4489] = {["xp"] = 315, ["level"] = 40}, - [4490] = {["xp"] = 315, ["level"] = 40}, - [4491] = {["xp"] = 5650, ["level"] = 55}, - [4492] = {["xp"] = 2800, ["level"] = 55}, - [4493] = {["xp"] = 530, ["level"] = 53}, - [4494] = {["xp"] = 530, ["level"] = 53}, - [4495] = {["xp"] = 270, ["level"] = 4}, - [4496] = {["xp"] = 5250, ["level"] = 53}, - [4501] = {["xp"] = 5650, ["level"] = 55}, - [4502] = {["xp"] = 5650, ["level"] = 55}, - [4503] = {["xp"] = 4900, ["level"] = 51}, - [4504] = {["xp"] = 5450, ["level"] = 54}, - [4505] = {["xp"] = 5450, ["level"] = 54}, - [4506] = {["xp"] = 5450, ["level"] = 54}, - [4507] = {["xp"] = 5450, ["level"] = 54}, - [4508] = {["xp"] = 540, ["level"] = 54}, - [4509] = {["xp"] = 540, ["level"] = 54}, - [4510] = {["xp"] = 8150, ["level"] = 54}, - [4511] = {["xp"] = 8150, ["level"] = 54}, - [4512] = {["xp"] = 6350, ["level"] = 52}, - [4513] = {["xp"] = 6800, ["level"] = 54}, - [4521] = {["xp"] = 5800, ["level"] = 56}, - [4542] = {["xp"] = 510, ["level"] = 25}, - [4561] = {["xp"] = 0, ["level"] = nil}, - [4581] = {["xp"] = 590, ["level"] = 29}, - [4605] = {["xp"] = 2450, ["level"] = 30}, - [4606] = {["xp"] = 2450, ["level"] = 30}, - [4621] = {["xp"] = 7980, ["level"] = nil}, - [4641] = {["xp"] = 40, ["level"] = 1}, - [4642] = {["xp"] = 7050, ["level"] = 55}, - [4661] = {["xp"] = 0, ["level"] = nil}, - [4681] = {["xp"] = 980, ["level"] = 14}, - [4701] = {["xp"] = 6400, ["level"] = 59}, - [4721] = {["xp"] = 6400, ["level"] = 59}, - [4722] = {["xp"] = 455, ["level"] = 13}, - [4723] = {["xp"] = 455, ["level"] = 13}, - [4724] = {["xp"] = 6400, ["level"] = 59}, - [4725] = {["xp"] = 540, ["level"] = 15}, - [4726] = {["xp"] = 5100, ["level"] = 52}, - [4727] = {["xp"] = 540, ["level"] = 15}, - [4728] = {["xp"] = 490, ["level"] = 14}, - [4729] = {["xp"] = 6400, ["level"] = 59}, - [4730] = {["xp"] = 580, ["level"] = 16}, - [4731] = {["xp"] = 730, ["level"] = 19}, - [4732] = {["xp"] = 730, ["level"] = 19}, - [4733] = {["xp"] = 730, ["level"] = 19}, - [4734] = {["xp"] = 8300, ["level"] = 60}, - [4735] = {["xp"] = 9950, ["level"] = 60}, - [4736] = {["xp"] = 630, ["level"] = 31}, - [4737] = {["xp"] = 630, ["level"] = 31}, - [4738] = {["xp"] = 630, ["level"] = 31}, - [4739] = {["xp"] = 630, ["level"] = 31}, - [4740] = {["xp"] = 1700, ["level"] = 18}, - [4741] = {["xp"] = 6200, ["level"] = 58}, - [4742] = {["xp"] = 8300, ["level"] = 60}, - [4743] = {["xp"] = 9950, ["level"] = 60}, - [4761] = {["xp"] = 105, ["level"] = 15}, - [4762] = {["xp"] = 800, ["level"] = 15}, - [4763] = {["xp"] = 1700, ["level"] = 18}, - [4764] = {["xp"] = 1650, ["level"] = 60}, - [4765] = {["xp"] = 6600, ["level"] = 60}, - [4766] = {["xp"] = 660, ["level"] = 60}, - [4767] = {["xp"] = 1750, ["level"] = 29}, - [4768] = {["xp"] = 8300, ["level"] = 60}, - [4769] = {["xp"] = 660, ["level"] = 60}, - [4770] = {["xp"] = 2350, ["level"] = 29}, - [4771] = {["xp"] = 9950, ["level"] = 60}, - [4781] = {["xp"] = 2000, ["level"] = 34}, - [4782] = {["xp"] = 1350, ["level"] = 34}, - [4783] = {["xp"] = 2850, ["level"] = 37}, - [4784] = {["xp"] = 2100, ["level"] = 37}, - [4785] = {["xp"] = 0, ["level"] = nil}, - [4786] = {["xp"] = 3550, ["level"] = 38}, - [4787] = {["xp"] = 5900, ["level"] = 50}, - [4788] = {["xp"] = 7750, ["level"] = 58}, - [4801] = {["xp"] = 0, ["level"] = nil}, - [4802] = {["xp"] = 0, ["level"] = nil}, - [4803] = {["xp"] = 0, ["level"] = nil}, - [4804] = {["xp"] = 0, ["level"] = nil}, - [4805] = {["xp"] = 0, ["level"] = nil}, - [4806] = {["xp"] = 0, ["level"] = nil}, - [4807] = {["xp"] = 0, ["level"] = nil}, - [4808] = {["xp"] = 2700, ["level"] = 54}, - [4809] = {["xp"] = 5450, ["level"] = 54}, - [4810] = {["xp"] = 2700, ["level"] = 54}, - [4811] = {["xp"] = 490, ["level"] = 14}, - [4812] = {["xp"] = 490, ["level"] = 14}, - [4813] = {["xp"] = 980, ["level"] = 14}, - [4821] = {["xp"] = 2100, ["level"] = 26}, - [4841] = {["xp"] = 2000, ["level"] = 25}, - [4842] = {["xp"] = 5800, ["level"] = 56}, - [4861] = {["xp"] = 3200, ["level"] = 59}, - [4862] = {["xp"] = 6400, ["level"] = 59}, - [4863] = {["xp"] = 3200, ["level"] = 59}, - [4864] = {["xp"] = 6400, ["level"] = 59}, - [4865] = {["xp"] = 1050, ["level"] = 26}, - [4866] = {["xp"] = 9950, ["level"] = 60}, - [4867] = {["xp"] = 9950, ["level"] = 60}, - [4881] = {["xp"] = 2300, ["level"] = 28}, - [4882] = {["xp"] = 3200, ["level"] = 59}, - [4883] = {["xp"] = 6400, ["level"] = 59}, - [4901] = {["xp"] = 4800, ["level"] = 59}, - [4902] = {["xp"] = 6000, ["level"] = 57}, - [4903] = {["xp"] = 8300, ["level"] = 60}, - [4904] = {["xp"] = 2350, ["level"] = 29}, - [4906] = {["xp"] = 5450, ["level"] = 54}, - [4907] = {["xp"] = 660, ["level"] = 60}, - [4921] = {["xp"] = 1150, ["level"] = 20}, - [4941] = {["xp"] = 6600, ["level"] = 60}, - [4961] = {["xp"] = 2350, ["level"] = 40}, - [4962] = {["xp"] = 2350, ["level"] = 40}, - [4963] = {["xp"] = 2350, ["level"] = 40}, - [4964] = {["xp"] = 3900, ["level"] = 40}, - [4965] = {["xp"] = 1350, ["level"] = 35}, - [4966] = {["xp"] = 2300, ["level"] = 28}, - [4967] = {["xp"] = 1350, ["level"] = 35}, - [4968] = {["xp"] = 1350, ["level"] = 35}, - [4969] = {["xp"] = 1350, ["level"] = 35}, - [4970] = {["xp"] = 0, ["level"] = nil}, - [4971] = {["xp"] = 5800, ["level"] = 56}, - [4972] = {["xp"] = 5800, ["level"] = 56}, - [4973] = {["xp"] = 580, ["level"] = 56}, - [4974] = {["xp"] = 9950, ["level"] = 60}, - [4975] = {["xp"] = 3900, ["level"] = 40}, - [4976] = {["xp"] = 1550, ["level"] = 40}, - [4981] = {["xp"] = 6400, ["level"] = 59}, - [4982] = {["xp"] = 6400, ["level"] = 59}, - [4983] = {["xp"] = 6400, ["level"] = 59}, - [4984] = {["xp"] = 4100, ["level"] = 54}, - [4985] = {["xp"] = 4350, ["level"] = 56}, - [4986] = {["xp"] = 5800, ["level"] = 56}, - [4987] = {["xp"] = 5800, ["level"] = 56}, - [5001] = {["xp"] = 6400, ["level"] = 59}, - [5002] = {["xp"] = 6400, ["level"] = 59}, - [5021] = {["xp"] = 2550, ["level"] = 52}, - [5022] = {["xp"] = 2550, ["level"] = 52}, - [5023] = {["xp"] = 2550, ["level"] = 52}, - [5041] = {["xp"] = 980, ["level"] = 14}, - [5042] = {["xp"] = 0, ["level"] = nil}, - [5043] = {["xp"] = 0, ["level"] = nil}, - [5044] = {["xp"] = 0, ["level"] = nil}, - [5045] = {["xp"] = 0, ["level"] = nil}, - [5046] = {["xp"] = 0, ["level"] = nil}, - [5047] = {["xp"] = 6600, ["level"] = 60}, - [5048] = {["xp"] = 5100, ["level"] = 52}, - [5049] = {["xp"] = 5100, ["level"] = 52}, - [5050] = {["xp"] = 2550, ["level"] = 52}, - [5051] = {["xp"] = 5450, ["level"] = 54}, - [5052] = {["xp"] = 1250, ["level"] = 21}, - [5054] = {["xp"] = 5800, ["level"] = 56}, - [5055] = {["xp"] = 6200, ["level"] = 58}, - [5056] = {["xp"] = 8300, ["level"] = 60}, - [5057] = {["xp"] = 3300, ["level"] = 60}, - [5058] = {["xp"] = 0, ["level"] = nil}, - [5059] = {["xp"] = 0, ["level"] = nil}, - [5060] = {["xp"] = 7050, ["level"] = 55}, - [5061] = {["xp"] = 1150, ["level"] = 16}, - [5062] = {["xp"] = 2200, ["level"] = 27}, - [5064] = {["xp"] = 2300, ["level"] = 28}, - [5065] = {["xp"] = 7750, ["level"] = 58}, - [5066] = {["xp"] = 470, ["level"] = 50}, - [5081] = {["xp"] = 8300, ["level"] = 60}, - [5082] = {["xp"] = 5800, ["level"] = 56}, - [5083] = {["xp"] = 2900, ["level"] = 56}, - [5084] = {["xp"] = 4350, ["level"] = 56}, - [5085] = {["xp"] = 4350, ["level"] = 56}, - [5086] = {["xp"] = 5800, ["level"] = 56}, - [5087] = {["xp"] = 6000, ["level"] = 57}, - [5088] = {["xp"] = 2300, ["level"] = 28}, - [5089] = {["xp"] = 6600, ["level"] = 60}, - [5090] = {["xp"] = 470, ["level"] = 50}, - [5091] = {["xp"] = 470, ["level"] = 50}, - [5092] = {["xp"] = 5100, ["level"] = 52}, - [5093] = {["xp"] = 470, ["level"] = 50}, - [5094] = {["xp"] = 470, ["level"] = 50}, - [5095] = {["xp"] = 470, ["level"] = 50}, - [5096] = {["xp"] = 5250, ["level"] = 53}, - [5097] = {["xp"] = 5800, ["level"] = 56}, - [5098] = {["xp"] = 5800, ["level"] = 56}, - [5101] = {["xp"] = 450, ["level"] = 5}, - [5102] = {["xp"] = 9950, ["level"] = 60}, - [5103] = {["xp"] = 9450, ["level"] = 60}, - [5121] = {["xp"] = 6400, ["level"] = 59}, - [5123] = {["xp"] = 3200, ["level"] = 59}, - [5124] = {["xp"] = 8300, ["level"] = 60}, - [5125] = {["xp"] = 9950, ["level"] = 60}, - [5126] = {["xp"] = 945, ["level"] = 60}, - [5127] = {["xp"] = 8300, ["level"] = 60}, - [5128] = {["xp"] = 6400, ["level"] = 59}, - [5141] = {["xp"] = 4200, ["level"] = 55}, - [5142] = {["xp"] = 2800, ["level"] = 55}, - [5143] = {["xp"] = 4200, ["level"] = 55}, - [5144] = {["xp"] = 4200, ["level"] = 55}, - [5145] = {["xp"] = 4200, ["level"] = 55}, - [5146] = {["xp"] = 4200, ["level"] = 55}, - [5147] = {["xp"] = 2350, ["level"] = 29}, - [5148] = {["xp"] = 4200, ["level"] = 55}, - [5149] = {["xp"] = 2800, ["level"] = 55}, - [5150] = {["xp"] = 0, ["level"] = nil}, - [5151] = {["xp"] = 3050, ["level"] = 30}, - [5152] = {["xp"] = 2900, ["level"] = 56}, - [5153] = {["xp"] = 4350, ["level"] = 56}, - [5154] = {["xp"] = 5800, ["level"] = 56}, - [5155] = {["xp"] = 4900, ["level"] = 51}, - [5156] = {["xp"] = 6800, ["level"] = 54}, - [5157] = {["xp"] = 3800, ["level"] = 52}, - [5158] = {["xp"] = 2550, ["level"] = 52}, - [5159] = {["xp"] = 2700, ["level"] = 54}, - [5160] = {["xp"] = 6600, ["level"] = 60}, - [5161] = {["xp"] = 660, ["level"] = 60}, - [5162] = {["xp"] = 6600, ["level"] = 60}, - [5163] = {["xp"] = 7750, ["level"] = 58}, - [5164] = {["xp"] = 660, ["level"] = 60}, - [5165] = {["xp"] = 5650, ["level"] = 55}, - [5166] = {["xp"] = 9950, ["level"] = 60}, - [5167] = {["xp"] = 9950, ["level"] = 60}, - [5168] = {["xp"] = 5800, ["level"] = 56}, - [5181] = {["xp"] = 6000, ["level"] = 57}, - [5201] = {["xp"] = 0, ["level"] = nil}, - [5202] = {["xp"] = 5650, ["level"] = 55}, - [5203] = {["xp"] = 5650, ["level"] = 55}, - [5204] = {["xp"] = 4500, ["level"] = 57}, - [5206] = {["xp"] = 6600, ["level"] = 60}, - [5210] = {["xp"] = 2900, ["level"] = 56}, - [5211] = {["xp"] = 5650, ["level"] = 55}, - [5212] = {["xp"] = 6600, ["level"] = 60}, - [5213] = {["xp"] = 6600, ["level"] = 60}, - [5214] = {["xp"] = 8300, ["level"] = 60}, - [5215] = {["xp"] = 530, ["level"] = 53}, - [5216] = {["xp"] = 5250, ["level"] = 53}, - [5217] = {["xp"] = 2650, ["level"] = 53}, - [5218] = {["xp"] = 530, ["level"] = 53}, - [5219] = {["xp"] = 5650, ["level"] = 55}, - [5220] = {["xp"] = 2800, ["level"] = 55}, - [5221] = {["xp"] = 560, ["level"] = 55}, - [5222] = {["xp"] = 5650, ["level"] = 55}, - [5223] = {["xp"] = 2800, ["level"] = 55}, - [5224] = {["xp"] = 560, ["level"] = 55}, - [5225] = {["xp"] = 6200, ["level"] = 58}, - [5226] = {["xp"] = 3100, ["level"] = 58}, - [5227] = {["xp"] = 620, ["level"] = 58}, - [5228] = {["xp"] = 530, ["level"] = 53}, - [5229] = {["xp"] = 5250, ["level"] = 53}, - [5230] = {["xp"] = 2650, ["level"] = 53}, - [5231] = {["xp"] = 5650, ["level"] = 55}, - [5232] = {["xp"] = 2800, ["level"] = 55}, - [5233] = {["xp"] = 5650, ["level"] = 55}, - [5234] = {["xp"] = 2800, ["level"] = 55}, - [5235] = {["xp"] = 6200, ["level"] = 58}, - [5236] = {["xp"] = 3100, ["level"] = 58}, - [5237] = {["xp"] = 9300, ["level"] = 58}, - [5238] = {["xp"] = 9300, ["level"] = 58}, - [5241] = {["xp"] = 2900, ["level"] = 56}, - [5242] = {["xp"] = 9300, ["level"] = 58}, - [5243] = {["xp"] = 6600, ["level"] = 60}, - [5244] = {["xp"] = 580, ["level"] = 56}, - [5245] = {["xp"] = 5800, ["level"] = 56}, - [5246] = {["xp"] = 5800, ["level"] = 56}, - [5247] = {["xp"] = 6000, ["level"] = 57}, - [5248] = {["xp"] = 4650, ["level"] = 58}, - [5249] = {["xp"] = 580, ["level"] = 56}, - [5250] = {["xp"] = 580, ["level"] = 56}, - [5251] = {["xp"] = 8300, ["level"] = 60}, - [5252] = {["xp"] = 4650, ["level"] = 58}, - [5253] = {["xp"] = 6200, ["level"] = 58}, - [5261] = {["xp"] = 85, ["level"] = 2}, - [5262] = {["xp"] = 8300, ["level"] = 60}, - [5263] = {["xp"] = 8300, ["level"] = 60}, - [5264] = {["xp"] = 6600, ["level"] = 60}, - [5265] = {["xp"] = 9950, ["level"] = 60}, - [5281] = {["xp"] = 6600, ["level"] = 60}, - [5282] = {["xp"] = 8300, ["level"] = 60}, - [5283] = {["xp"] = 3150, ["level"] = 40}, - [5284] = {["xp"] = 3150, ["level"] = 40}, - [5301] = {["xp"] = 3150, ["level"] = 40}, - [5302] = {["xp"] = 3150, ["level"] = 40}, - [5305] = {["xp"] = 14175, ["level"] = 60}, - [5306] = {["xp"] = 8300, ["level"] = 60}, - [5307] = {["xp"] = 14175, ["level"] = 60}, - [5321] = {["xp"] = 1550, ["level"] = 20}, - [5341] = {["xp"] = 6600, ["level"] = 60}, - [5342] = {["xp"] = 8300, ["level"] = 60}, - [5343] = {["xp"] = 6600, ["level"] = 60}, - [5344] = {["xp"] = 8300, ["level"] = 60}, - [5361] = {["xp"] = 2050, ["level"] = 35}, - [5381] = {["xp"] = 2850, ["level"] = 38}, - [5382] = {["xp"] = 6600, ["level"] = 60}, - [5383] = {["xp"] = 9450, ["level"] = 60}, - [5384] = {["xp"] = 8300, ["level"] = 60}, - [5385] = {["xp"] = 7550, ["level"] = 57}, - [5386] = {["xp"] = 2100, ["level"] = 37}, - [5401] = {["xp"] = 560, ["level"] = 55}, - [5402] = {["xp"] = 560, ["level"] = 55}, - [5403] = {["xp"] = 560, ["level"] = 55}, - [5404] = {["xp"] = 560, ["level"] = 55}, - [5405] = {["xp"] = 560, ["level"] = 55}, - [5406] = {["xp"] = 560, ["level"] = 55}, - [5407] = {["xp"] = 560, ["level"] = 55}, - [5408] = {["xp"] = 560, ["level"] = 55}, - [5421] = {["xp"] = 0, ["level"] = nil}, - [5441] = {["xp"] = 445, ["level"] = 4}, - [5461] = {["xp"] = 6600, ["level"] = 60}, - [5462] = {["xp"] = 4950, ["level"] = 60}, - [5463] = {["xp"] = 6600, ["level"] = 60}, - [5464] = {["xp"] = 8300, ["level"] = 60}, - [5465] = {["xp"] = 4950, ["level"] = 60}, - [5466] = {["xp"] = 9950, ["level"] = 60}, - [5481] = {["xp"] = 225, ["level"] = 5}, - [5482] = {["xp"] = 540, ["level"] = 6}, - [5501] = {["xp"] = 2250, ["level"] = 39}, - [5502] = {["xp"] = 390, ["level"] = nil}, - [5503] = {["xp"] = 560, ["level"] = 55}, - [5504] = {["xp"] = 9450, ["level"] = 60}, - [5505] = {["xp"] = 9950, ["level"] = 60}, - [5507] = {["xp"] = 6600, ["level"] = 60}, - [5508] = {["xp"] = 560, ["level"] = 55}, - [5509] = {["xp"] = 560, ["level"] = 55}, - [5510] = {["xp"] = 560, ["level"] = 55}, - [5511] = {["xp"] = 9950, ["level"] = 60}, - [5513] = {["xp"] = 6600, ["level"] = 60}, - [5514] = {["xp"] = 600, ["level"] = 57}, - [5515] = {["xp"] = 6600, ["level"] = 60}, - [5517] = {["xp"] = 11815, ["level"] = 60}, - [5518] = {["xp"] = 6600, ["level"] = 60}, - [5519] = {["xp"] = 0, ["level"] = nil}, - [5521] = {["xp"] = 11815, ["level"] = 60}, - [5522] = {["xp"] = 4950, ["level"] = 60}, - [5524] = {["xp"] = 11815, ["level"] = 60}, - [5525] = {["xp"] = 6600, ["level"] = 60}, - [5526] = {["xp"] = 8300, ["level"] = 60}, - [5527] = {["xp"] = 6600, ["level"] = 60}, - [5529] = {["xp"] = 6200, ["level"] = 58}, - [5531] = {["xp"] = 1650, ["level"] = 60}, - [5533] = {["xp"] = 560, ["level"] = 55}, - [5534] = {["xp"] = 6550, ["level"] = 53}, - [5535] = {["xp"] = 4200, ["level"] = 47}, - [5536] = {["xp"] = 4200, ["level"] = 47}, - [5537] = {["xp"] = 4500, ["level"] = 57}, - [5538] = {["xp"] = 600, ["level"] = 57}, - [5541] = {["xp"] = 540, ["level"] = 6}, - [5542] = {["xp"] = 5800, ["level"] = 56}, - [5543] = {["xp"] = 5800, ["level"] = 56}, - [5544] = {["xp"] = 5800, ["level"] = 56}, - [5545] = {["xp"] = 780, ["level"] = 9}, - [5561] = {["xp"] = 2000, ["level"] = 34}, - [5581] = {["xp"] = 3550, ["level"] = 38}, - [5582] = {["xp"] = 0, ["level"] = nil}, - [5601] = {["xp"] = 560, ["level"] = 55}, - [5621] = {["xp"] = 270, ["level"] = 4}, - [5622] = {["xp"] = 90, ["level"] = 4}, - [5623] = {["xp"] = 90, ["level"] = 4}, - [5624] = {["xp"] = 270, ["level"] = 4}, - [5625] = {["xp"] = 270, ["level"] = 4}, - [5626] = {["xp"] = 90, ["level"] = 4}, - [5628] = {["xp"] = 210, ["level"] = 10}, - [5629] = {["xp"] = 210, ["level"] = 10}, - [5630] = {["xp"] = 210, ["level"] = 10}, - [5631] = {["xp"] = 210, ["level"] = 10}, - [5632] = {["xp"] = 210, ["level"] = 10}, - [5633] = {["xp"] = 210, ["level"] = 10}, - [5634] = {["xp"] = 0, ["level"] = nil}, - [5635] = {["xp"] = 210, ["level"] = 10}, - [5636] = {["xp"] = 210, ["level"] = 10}, - [5637] = {["xp"] = 210, ["level"] = 10}, - [5638] = {["xp"] = 210, ["level"] = 10}, - [5639] = {["xp"] = 0, ["level"] = nil}, - [5640] = {["xp"] = 210, ["level"] = 10}, - [5641] = {["xp"] = 0, ["level"] = nil}, - [5642] = {["xp"] = 390, ["level"] = 20}, - [5643] = {["xp"] = 390, ["level"] = 20}, - [5644] = {["xp"] = 390, ["level"] = 20}, - [5645] = {["xp"] = 390, ["level"] = 20}, - [5646] = {["xp"] = 390, ["level"] = 20}, - [5647] = {["xp"] = 390, ["level"] = 20}, - [5648] = {["xp"] = 270, ["level"] = 4}, - [5649] = {["xp"] = 90, ["level"] = 4}, - [5650] = {["xp"] = 270, ["level"] = 4}, - [5651] = {["xp"] = 90, ["level"] = 4}, - [5652] = {["xp"] = 0, ["level"] = nil}, - [5653] = {["xp"] = 390, ["level"] = nil}, - [5654] = {["xp"] = 210, ["level"] = 10}, - [5655] = {["xp"] = 210, ["level"] = 10}, - [5656] = {["xp"] = 390, ["level"] = nil}, - [5657] = {["xp"] = 210, ["level"] = 10}, - [5658] = {["xp"] = 0, ["level"] = nil}, - [5659] = {["xp"] = 390, ["level"] = nil}, - [5660] = {["xp"] = 210, ["level"] = 10}, - [5661] = {["xp"] = 210, ["level"] = 10}, - [5662] = {["xp"] = 210, ["level"] = 10}, - [5663] = {["xp"] = 210, ["level"] = 10}, - [5665] = {["xp"] = 795, ["level"] = 15}, - [5666] = {["xp"] = 795, ["level"] = 15}, - [5667] = {["xp"] = 795, ["level"] = 15}, - [5669] = {["xp"] = 795, ["level"] = 15}, - [5670] = {["xp"] = 795, ["level"] = 15}, - [5671] = {["xp"] = 795, ["level"] = 15}, - [5672] = {["xp"] = 0, ["level"] = nil}, - [5673] = {["xp"] = 390, ["level"] = 20}, - [5674] = {["xp"] = 390, ["level"] = 20}, - [5675] = {["xp"] = 390, ["level"] = 20}, - [5676] = {["xp"] = 0, ["level"] = nil}, - [5677] = {["xp"] = 390, ["level"] = 20}, - [5678] = {["xp"] = 390, ["level"] = 20}, - [5679] = {["xp"] = 0, ["level"] = nil}, - [5680] = {["xp"] = 0, ["level"] = nil}, - [5682] = {["xp"] = 1160, ["level"] = 25}, - [5683] = {["xp"] = 1160, ["level"] = 25}, - [5684] = {["xp"] = 1160, ["level"] = 25}, - [5686] = {["xp"] = 1160, ["level"] = 25}, - [5687] = {["xp"] = 1160, ["level"] = 25}, - [5689] = {["xp"] = 795, ["level"] = 15}, - [5690] = {["xp"] = 795, ["level"] = 15}, - [5692] = {["xp"] = 795, ["level"] = 15}, - [5693] = {["xp"] = 795, ["level"] = 15}, - [5695] = {["xp"] = 1505, ["level"] = 35}, - [5696] = {["xp"] = 1505, ["level"] = 35}, - [5697] = {["xp"] = 1505, ["level"] = 35}, - [5699] = {["xp"] = 1505, ["level"] = 35}, - [5700] = {["xp"] = 1505, ["level"] = 35}, - [5702] = {["xp"] = 1160, ["level"] = 25}, - [5703] = {["xp"] = 1160, ["level"] = 25}, - [5705] = {["xp"] = 1160, ["level"] = 25}, - [5706] = {["xp"] = 1160, ["level"] = 25}, - [5708] = {["xp"] = 1505, ["level"] = 35}, - [5709] = {["xp"] = 1505, ["level"] = 35}, - [5711] = {["xp"] = 1505, ["level"] = 35}, - [5712] = {["xp"] = 1505, ["level"] = 35}, - [5713] = {["xp"] = 1050, ["level"] = 15}, - [5721] = {["xp"] = 8300, ["level"] = 60}, - [5722] = {["xp"] = 880, ["level"] = 16}, - [5723] = {["xp"] = 1050, ["level"] = 15}, - [5724] = {["xp"] = 1450, ["level"] = 16}, - [5725] = {["xp"] = 1450, ["level"] = 16}, - [5726] = {["xp"] = 910, ["level"] = 12}, - [5727] = {["xp"] = 455, ["level"] = 12}, - [5728] = {["xp"] = 1150, ["level"] = 16}, - [5729] = {["xp"] = 105, ["level"] = 15}, - [5730] = {["xp"] = 1450, ["level"] = 16}, - [5741] = {["xp"] = 2650, ["level"] = 33}, - [5742] = {["xp"] = 580, ["level"] = 56}, - [5761] = {["xp"] = 1150, ["level"] = 16}, - [5762] = {["xp"] = 1250, ["level"] = 31}, - [5763] = {["xp"] = 1250, ["level"] = 31}, - [5781] = {["xp"] = 6000, ["level"] = 57}, - [5801] = {["xp"] = 4500, ["level"] = 57}, - [5802] = {["xp"] = 4500, ["level"] = 57}, - [5803] = {["xp"] = 4950, ["level"] = 60}, - [5804] = {["xp"] = 4950, ["level"] = 60}, - [5805] = {["xp"] = 0, ["level"] = nil}, - [5821] = {["xp"] = 2750, ["level"] = 35}, - [5841] = {["xp"] = 0, ["level"] = nil}, - [5842] = {["xp"] = 0, ["level"] = nil}, - [5843] = {["xp"] = 0, ["level"] = nil}, - [5844] = {["xp"] = 0, ["level"] = nil}, - [5845] = {["xp"] = 6200, ["level"] = 58}, - [5846] = {["xp"] = 6200, ["level"] = 58}, - [5848] = {["xp"] = 6600, ["level"] = 60}, - [5861] = {["xp"] = 4950, ["level"] = 60}, - [5862] = {["xp"] = 6600, ["level"] = 60}, - [5863] = {["xp"] = 4550, ["level"] = 49}, - [5881] = {["xp"] = 1150, ["level"] = 28}, - [5882] = {["xp"] = 4200, ["level"] = 55}, - [5883] = {["xp"] = 4200, ["level"] = 55}, - [5884] = {["xp"] = 4200, ["level"] = 55}, - [5885] = {["xp"] = 4200, ["level"] = 55}, - [5886] = {["xp"] = 4200, ["level"] = 55}, - [5887] = {["xp"] = 4200, ["level"] = 55}, - [5888] = {["xp"] = 4200, ["level"] = 55}, - [5889] = {["xp"] = 4200, ["level"] = 55}, - [5890] = {["xp"] = 4200, ["level"] = 55}, - [5891] = {["xp"] = 4200, ["level"] = 55}, - [5892] = {["xp"] = 0, ["level"] = nil}, - [5901] = {["xp"] = 5650, ["level"] = 55}, - [5902] = {["xp"] = 2800, ["level"] = 55}, - [5903] = {["xp"] = 5650, ["level"] = 55}, - [5904] = {["xp"] = 2800, ["level"] = 55}, - [5921] = {["xp"] = 210, ["level"] = 10}, - [5922] = {["xp"] = 210, ["level"] = 10}, - [5923] = {["xp"] = 85, ["level"] = 10}, - [5924] = {["xp"] = 85, ["level"] = 10}, - [5925] = {["xp"] = 85, ["level"] = 10}, - [5926] = {["xp"] = 85, ["level"] = 10}, - [5927] = {["xp"] = 85, ["level"] = 10}, - [5928] = {["xp"] = 85, ["level"] = 10}, - [5929] = {["xp"] = 420, ["level"] = 10}, - [5930] = {["xp"] = 420, ["level"] = 10}, - [5931] = {["xp"] = 85, ["level"] = 10}, - [5932] = {["xp"] = 85, ["level"] = 10}, - [5941] = {["xp"] = 3300, ["level"] = 60}, - [5942] = {["xp"] = 9950, ["level"] = 60}, - [5943] = {["xp"] = 2850, ["level"] = 38}, - [5944] = {["xp"] = 9950, ["level"] = 60}, - [5961] = {["xp"] = 1450, ["level"] = 56}, - [5981] = {["xp"] = 0, ["level"] = nil}, - [6001] = {["xp"] = 840, ["level"] = 10}, - [6002] = {["xp"] = 840, ["level"] = 10}, - [6003] = {["xp"] = 8190, ["level"] = 39}, - [6004] = {["xp"] = 5800, ["level"] = 56}, - [6021] = {["xp"] = 4200, ["level"] = 55}, - [6022] = {["xp"] = 6200, ["level"] = 58}, - [6023] = {["xp"] = 6000, ["level"] = 57}, - [6024] = {["xp"] = 6600, ["level"] = 60}, - [6025] = {["xp"] = 6200, ["level"] = 58}, - [6026] = {["xp"] = 6200, ["level"] = 58}, - [6027] = {["xp"] = 3550, ["level"] = 38}, - [6028] = {["xp"] = 2550, ["level"] = 52}, - [6029] = {["xp"] = 2550, ["level"] = 52}, - [6030] = {["xp"] = 2550, ["level"] = 52}, - [6031] = {["xp"] = 5650, ["level"] = 55}, - [6032] = {["xp"] = 5650, ["level"] = 55}, - [6041] = {["xp"] = 6200, ["level"] = 58}, - [6042] = {["xp"] = 6200, ["level"] = 58}, - [6061] = {["xp"] = 840, ["level"] = 10}, - [6062] = {["xp"] = 840, ["level"] = 10}, - [6063] = {["xp"] = 840, ["level"] = 10}, - [6064] = {["xp"] = 840, ["level"] = 10}, - [6065] = {["xp"] = 85, ["level"] = 10}, - [6066] = {["xp"] = 85, ["level"] = 10}, - [6067] = {["xp"] = 85, ["level"] = 10}, - [6068] = {["xp"] = 85, ["level"] = 10}, - [6069] = {["xp"] = 85, ["level"] = 10}, - [6070] = {["xp"] = 85, ["level"] = 10}, - [6071] = {["xp"] = 85, ["level"] = 10}, - [6072] = {["xp"] = 85, ["level"] = 10}, - [6073] = {["xp"] = 85, ["level"] = 10}, - [6074] = {["xp"] = 85, ["level"] = 10}, - [6075] = {["xp"] = 85, ["level"] = 10}, - [6076] = {["xp"] = 85, ["level"] = 10}, - [6081] = {["xp"] = 420, ["level"] = 10}, - [6082] = {["xp"] = 840, ["level"] = 10}, - [6083] = {["xp"] = 840, ["level"] = 10}, - [6084] = {["xp"] = 840, ["level"] = 10}, - [6085] = {["xp"] = 840, ["level"] = 10}, - [6086] = {["xp"] = 420, ["level"] = 10}, - [6087] = {["xp"] = 840, ["level"] = 10}, - [6088] = {["xp"] = 840, ["level"] = 10}, - [6089] = {["xp"] = 420, ["level"] = 10}, - [6101] = {["xp"] = 840, ["level"] = 10}, - [6102] = {["xp"] = 840, ["level"] = 10}, - [6103] = {["xp"] = 420, ["level"] = 10}, - [6121] = {["xp"] = 100, ["level"] = 14}, - [6122] = {["xp"] = 740, ["level"] = 14}, - [6123] = {["xp"] = 740, ["level"] = 14}, - [6124] = {["xp"] = 740, ["level"] = 14}, - [6125] = {["xp"] = 980, ["level"] = 14}, - [6126] = {["xp"] = 100, ["level"] = 14}, - [6127] = {["xp"] = 740, ["level"] = 14}, - [6128] = {["xp"] = 740, ["level"] = 14}, - [6129] = {["xp"] = 740, ["level"] = 14}, - [6130] = {["xp"] = 980, ["level"] = 14}, - [6131] = {["xp"] = 0, ["level"] = nil}, - [6132] = {["xp"] = 2250, ["level"] = 39}, - [6133] = {["xp"] = 6600, ["level"] = 60}, - [6134] = {["xp"] = 2250, ["level"] = 39}, - [6135] = {["xp"] = 6600, ["level"] = 60}, - [6136] = {["xp"] = 6600, ["level"] = 60}, - [6141] = {["xp"] = 300, ["level"] = 39}, - [6142] = {["xp"] = 2750, ["level"] = 35}, - [6143] = {["xp"] = 2800, ["level"] = 36}, - [6144] = {["xp"] = 660, ["level"] = 60}, - [6145] = {["xp"] = 6600, ["level"] = 60}, - [6146] = {["xp"] = 6600, ["level"] = 60}, - [6147] = {["xp"] = 3300, ["level"] = 60}, - [6148] = {["xp"] = 8300, ["level"] = 60}, - [6161] = {["xp"] = 2800, ["level"] = 36}, - [6162] = {["xp"] = 4900, ["level"] = 51}, - [6163] = {["xp"] = 6600, ["level"] = 60}, - [6164] = {["xp"] = 1400, ["level"] = 55}, - [6181] = {["xp"] = 210, ["level"] = 10}, - [6182] = {["xp"] = 660, ["level"] = 60}, - [6183] = {["xp"] = 660, ["level"] = 60}, - [6184] = {["xp"] = 4950, ["level"] = 60}, - [6185] = {["xp"] = 8300, ["level"] = 60}, - [6186] = {["xp"] = 6600, ["level"] = 60}, - [6187] = {["xp"] = 9950, ["level"] = 60}, - [6221] = {["xp"] = 0, ["level"] = nil}, - [6241] = {["xp"] = 0, ["level"] = nil}, - [6261] = {["xp"] = 210, ["level"] = 10}, - [6281] = {["xp"] = 420, ["level"] = 10}, - [6282] = {["xp"] = 2100, ["level"] = 26}, - [6283] = {["xp"] = 2100, ["level"] = 26}, - [6284] = {["xp"] = 1650, ["level"] = 21}, - [6285] = {["xp"] = 1050, ["level"] = 10}, - [6301] = {["xp"] = 1400, ["level"] = 23}, - [6321] = {["xp"] = 210, ["level"] = 10}, - [6322] = {["xp"] = 210, ["level"] = 10}, - [6323] = {["xp"] = 420, ["level"] = 10}, - [6324] = {["xp"] = 1050, ["level"] = 10}, - [6341] = {["xp"] = 210, ["level"] = 10}, - [6342] = {["xp"] = 420, ["level"] = 10}, - [6343] = {["xp"] = 1050, ["level"] = 10}, - [6344] = {["xp"] = 210, ["level"] = 10}, - [6361] = {["xp"] = 210, ["level"] = 10}, - [6362] = {["xp"] = 420, ["level"] = 10}, - [6363] = {["xp"] = 210, ["level"] = 10}, - [6364] = {["xp"] = 1050, ["level"] = 10}, - [6365] = {["xp"] = 210, ["level"] = 10}, - [6381] = {["xp"] = 2000, ["level"] = 25}, - [6382] = {["xp"] = 390, ["level"] = 20}, - [6383] = {["xp"] = 0, ["level"] = nil}, - [6384] = {["xp"] = 420, ["level"] = 10}, - [6385] = {["xp"] = 210, ["level"] = 10}, - [6386] = {["xp"] = 1050, ["level"] = 10}, - [6387] = {["xp"] = 210, ["level"] = 10}, - [6388] = {["xp"] = 210, ["level"] = 10}, - [6389] = {["xp"] = 5650, ["level"] = 55}, - [6390] = {["xp"] = 5650, ["level"] = 55}, - [6391] = {["xp"] = 420, ["level"] = 10}, - [6392] = {["xp"] = 1050, ["level"] = 10}, - [6393] = {["xp"] = 2000, ["level"] = 25}, - [6394] = {["xp"] = 445, ["level"] = 4}, - [6395] = {["xp"] = 450, ["level"] = 5}, - [6401] = {["xp"] = 1000, ["level"] = 18}, - [6402] = {["xp"] = 660, ["level"] = 60}, - [6403] = {["xp"] = 9950, ["level"] = 60}, - [6421] = {["xp"] = 1350, ["level"] = 18}, - [6441] = {["xp"] = 2100, ["level"] = 26}, - [6442] = {["xp"] = 1450, ["level"] = 19}, - [6461] = {["xp"] = 1450, ["level"] = 19}, - [6462] = {["xp"] = 1950, ["level"] = 24}, - [6481] = {["xp"] = 1550, ["level"] = 20}, - [6482] = {["xp"] = 2400, ["level"] = 24}, - [6501] = {["xp"] = 6600, ["level"] = 60}, - [6502] = {["xp"] = 8300, ["level"] = 60}, - [6503] = {["xp"] = 1950, ["level"] = 24}, - [6504] = {["xp"] = 3650, ["level"] = 30}, - [6521] = {["xp"] = 3500, ["level"] = 36}, - [6522] = {["xp"] = 2800, ["level"] = 36}, - [6523] = {["xp"] = 1350, ["level"] = 18}, - [6541] = {["xp"] = 145, ["level"] = 19}, - [6542] = {["xp"] = 145, ["level"] = 19}, - [6543] = {["xp"] = 1800, ["level"] = 19}, - [6544] = {["xp"] = 2400, ["level"] = 24}, - [6545] = {["xp"] = 0, ["level"] = nil}, - [6546] = {["xp"] = 0, ["level"] = nil}, - [6547] = {["xp"] = 0, ["level"] = nil}, - [6548] = {["xp"] = 1350, ["level"] = 18}, - [6561] = {["xp"] = 3300, ["level"] = 27}, - [6562] = {["xp"] = 435, ["level"] = 22}, - [6563] = {["xp"] = 1750, ["level"] = 22}, - [6564] = {["xp"] = 1300, ["level"] = 22}, - [6565] = {["xp"] = 2650, ["level"] = 26}, - [6566] = {["xp"] = 660, ["level"] = 60}, - [6567] = {["xp"] = 3300, ["level"] = 60}, - [6568] = {["xp"] = 4950, ["level"] = 60}, - [6569] = {["xp"] = 6600, ["level"] = 60}, - [6570] = {["xp"] = 4950, ["level"] = 60}, - [6571] = {["xp"] = 2750, ["level"] = 27}, - [6581] = {["xp"] = 0, ["level"] = nil}, - [6582] = {["xp"] = 6600, ["level"] = 60}, - [6583] = {["xp"] = 6600, ["level"] = 60}, - [6584] = {["xp"] = 6600, ["level"] = 60}, - [6585] = {["xp"] = 6600, ["level"] = 60}, - [6601] = {["xp"] = 4950, ["level"] = 60}, - [6602] = {["xp"] = 9950, ["level"] = 60}, - [6603] = {["xp"] = 580, ["level"] = 56}, - [6604] = {["xp"] = 640, ["level"] = 59}, - [6605] = {["xp"] = 540, ["level"] = 54}, - [6606] = {["xp"] = 660, ["level"] = 60}, - [6607] = {["xp"] = 3900, ["level"] = 45}, - [6608] = {["xp"] = 970, ["level"] = 45}, - [6609] = {["xp"] = 970, ["level"] = 45}, - [6610] = {["xp"] = 3900, ["level"] = 45}, - [6611] = {["xp"] = 970, ["level"] = 45}, - [6612] = {["xp"] = 970, ["level"] = 45}, - [6621] = {["xp"] = 2650, ["level"] = 26}, - [6622] = {["xp"] = 3900, ["level"] = 45}, - [6623] = {["xp"] = 970, ["level"] = 45}, - [6624] = {["xp"] = 3900, ["level"] = 45}, - [6625] = {["xp"] = 970, ["level"] = 45}, - [6626] = {["xp"] = 3450, ["level"] = 35}, - [6627] = {["xp"] = 245, ["level"] = 30}, - [6628] = {["xp"] = 245, ["level"] = 30}, - [6629] = {["xp"] = 1350, ["level"] = 18}, - [6641] = {["xp"] = 2300, ["level"] = 23}, - [6661] = {["xp"] = 910, ["level"] = 12}, - [6662] = {["xp"] = 90, ["level"] = 12}, - [6681] = {["xp"] = 1950, ["level"] = 24}, - [6701] = {["xp"] = 0, ["level"] = nil}, - [6702] = {["xp"] = 5730, ["level"] = 33}, - [6704] = {["xp"] = 7370, ["level"] = 45}, - [6706] = {["xp"] = 8330, ["level"] = 52}, - [6708] = {["xp"] = 9450, ["level"] = 60}, - [6710] = {["xp"] = 80, ["level"] = 1}, - [6721] = {["xp"] = 85, ["level"] = 10}, - [6722] = {["xp"] = 85, ["level"] = 10}, - [6741] = {["xp"] = 0, ["level"] = nil}, - [6761] = {["xp"] = 560, ["level"] = 55}, - [6762] = {["xp"] = 1400, ["level"] = 55}, - [6781] = {["xp"] = 0, ["level"] = nil}, - [6801] = {["xp"] = 0, ["level"] = nil}, - [6804] = {["xp"] = 4350, ["level"] = 56}, - [6805] = {["xp"] = 6000, ["level"] = 57}, - [6821] = {["xp"] = 8300, ["level"] = 60}, - [6822] = {["xp"] = 9950, ["level"] = 60}, - [6823] = {["xp"] = 9950, ["level"] = 60}, - [6824] = {["xp"] = 9950, ["level"] = 60}, - [6825] = {["xp"] = 0, ["level"] = nil}, - [6826] = {["xp"] = 0, ["level"] = nil}, - [6841] = {["xp"] = 2800, ["level"] = 55}, - [6844] = {["xp"] = 3000, ["level"] = 57}, - [6845] = {["xp"] = 7550, ["level"] = 57}, - [6881] = {["xp"] = 0, ["level"] = nil}, - [6921] = {["xp"] = 2750, ["level"] = 27}, - [6922] = {["xp"] = 3050, ["level"] = 30}, - [6941] = {["xp"] = 0, ["level"] = nil}, - [6942] = {["xp"] = 0, ["level"] = nil}, - [6943] = {["xp"] = 0, ["level"] = nil}, - [6961] = {["xp"] = 155, ["level"] = nil}, - [6962] = {["xp"] = 390, ["level"] = nil}, - [6963] = {["xp"] = 1330, ["level"] = 1}, - [6964] = {["xp"] = 660, ["level"] = 60}, - [6981] = {["xp"] = 2650, ["level"] = 26}, - [6982] = {["xp"] = 0, ["level"] = nil}, - [6983] = {["xp"] = 18900, ["level"] = nil}, - [6984] = {["xp"] = 3990, ["level"] = nil}, - [6985] = {["xp"] = 0, ["level"] = nil}, - [7003] = {["xp"] = 4400, ["level"] = 48}, - [7021] = {["xp"] = 155, ["level"] = nil}, - [7022] = {["xp"] = 660, ["level"] = 60}, - [7023] = {["xp"] = 660, ["level"] = 60}, - [7024] = {["xp"] = 155, ["level"] = nil}, - [7025] = {["xp"] = 1650, ["level"] = 60}, - [7027] = {["xp"] = 0, ["level"] = nil}, - [7028] = {["xp"] = 5250, ["level"] = 47}, - [7029] = {["xp"] = 5250, ["level"] = 47}, - [7041] = {["xp"] = 5250, ["level"] = 47}, - [7042] = {["xp"] = 1650, ["level"] = 60}, - [7043] = {["xp"] = 18900, ["level"] = nil}, - [7044] = {["xp"] = 3400, ["level"] = 49}, - [7045] = {["xp"] = 3990, ["level"] = nil}, - [7046] = {["xp"] = 5700, ["level"] = 49}, - [7061] = {["xp"] = 155, ["level"] = nil}, - [7062] = {["xp"] = 660, ["level"] = 60}, - [7063] = {["xp"] = 155, ["level"] = nil}, - [7064] = {["xp"] = 6100, ["level"] = 51}, - [7065] = {["xp"] = 6100, ["level"] = 51}, - [7066] = {["xp"] = 6100, ["level"] = 51}, - [7067] = {["xp"] = 5450, ["level"] = 48}, - [7068] = {["xp"] = 3450, ["level"] = 42}, - [7070] = {["xp"] = 3450, ["level"] = 42}, - [7081] = {["xp"] = 6600, ["level"] = 60}, - [7082] = {["xp"] = 6600, ["level"] = 60}, - [7101] = {["xp"] = 6600, ["level"] = 60}, - [7102] = {["xp"] = 6600, ["level"] = 60}, - [7121] = {["xp"] = 660, ["level"] = 60}, - [7122] = {["xp"] = 6600, ["level"] = 60}, - [7123] = {["xp"] = 660, ["level"] = 60}, - [7124] = {["xp"] = 6600, ["level"] = 60}, - [7141] = {["xp"] = 9950, ["level"] = 60}, - [7142] = {["xp"] = 9950, ["level"] = 60}, - [7161] = {["xp"] = 6600, ["level"] = 60}, - [7162] = {["xp"] = 6600, ["level"] = 60}, - [7163] = {["xp"] = 6600, ["level"] = 60}, - [7164] = {["xp"] = 6600, ["level"] = 60}, - [7165] = {["xp"] = 10240, ["level"] = nil}, - [7166] = {["xp"] = 12285, ["level"] = nil}, - [7167] = {["xp"] = 12285, ["level"] = nil}, - [7168] = {["xp"] = 6600, ["level"] = 60}, - [7169] = {["xp"] = 6600, ["level"] = 60}, - [7170] = {["xp"] = 10240, ["level"] = nil}, - [7171] = {["xp"] = 12285, ["level"] = nil}, - [7172] = {["xp"] = 12285, ["level"] = nil}, - [7181] = {["xp"] = 9950, ["level"] = 60}, - [7201] = {["xp"] = 5450, ["level"] = 54}, - [7202] = {["xp"] = 9950, ["level"] = 60}, - [7221] = {["xp"] = 660, ["level"] = 60}, - [7222] = {["xp"] = 660, ["level"] = 60}, - [7223] = {["xp"] = 6600, ["level"] = 60}, - [7224] = {["xp"] = 6600, ["level"] = 60}, - [7241] = {["xp"] = 6600, ["level"] = 60}, - [7261] = {["xp"] = 6600, ["level"] = 60}, - [7281] = {["xp"] = 6600, ["level"] = 60}, - [7282] = {["xp"] = 6600, ["level"] = 60}, - [7301] = {["xp"] = 6600, ["level"] = 60}, - [7302] = {["xp"] = 6600, ["level"] = 60}, - [7321] = {["xp"] = 2500, ["level"] = 31}, - [7342] = {["xp"] = 0, ["level"] = nil}, - [7361] = {["xp"] = 9450, ["level"] = 60}, - [7362] = {["xp"] = 9450, ["level"] = 60}, - [7363] = {["xp"] = 9450, ["level"] = 60}, - [7364] = {["xp"] = 9450, ["level"] = 60}, - [7365] = {["xp"] = 9450, ["level"] = 60}, - [7366] = {["xp"] = 9450, ["level"] = 60}, - [7367] = {["xp"] = 6600, ["level"] = 60}, - [7368] = {["xp"] = 6600, ["level"] = 60}, - [7383] = {["xp"] = 660, ["level"] = 11}, - [7385] = {["xp"] = 0, ["level"] = nil}, - [7386] = {["xp"] = 0, ["level"] = nil}, - [7401] = {["xp"] = 9450, ["level"] = 60}, - [7402] = {["xp"] = 9450, ["level"] = 60}, - [7423] = {["xp"] = 0, ["level"] = nil}, - [7424] = {["xp"] = 0, ["level"] = nil}, - [7441] = {["xp"] = 7750, ["level"] = 58}, - [7461] = {["xp"] = 9950, ["level"] = 60}, - [7462] = {["xp"] = 945, ["level"] = 60}, - [7463] = {["xp"] = 14175, ["level"] = nil}, - [7481] = {["xp"] = 14175, ["level"] = 60}, - [7482] = {["xp"] = 14175, ["level"] = 60}, - [7483] = {["xp"] = 0, ["level"] = nil}, - [7486] = {["xp"] = 9950, ["level"] = 60}, - [7487] = {["xp"] = 6600, ["level"] = 60}, - [7488] = {["xp"] = 13515, ["level"] = 57}, - [7489] = {["xp"] = 13515, ["level"] = 57}, - [7490] = {["xp"] = 9950, ["level"] = 60}, - [7491] = {["xp"] = 9950, ["level"] = 60}, - [7492] = {["xp"] = 2255, ["level"] = 57}, - [7493] = {["xp"] = 0, ["level"] = nil}, - [7494] = {["xp"] = 2255, ["level"] = 57}, - [7495] = {["xp"] = 9950, ["level"] = 60}, - [7496] = {["xp"] = 9950, ["level"] = 60}, - [7497] = {["xp"] = 0, ["level"] = nil}, - [7498] = {["xp"] = 14175, ["level"] = 60}, - [7499] = {["xp"] = 14175, ["level"] = 60}, - [7500] = {["xp"] = 14175, ["level"] = 60}, - [7501] = {["xp"] = 6600, ["level"] = 60}, - [7502] = {["xp"] = 14175, ["level"] = 60}, - [7503] = {["xp"] = 14175, ["level"] = 60}, - [7504] = {["xp"] = 14175, ["level"] = 60}, - [7505] = {["xp"] = 14175, ["level"] = 60}, - [7506] = {["xp"] = 14175, ["level"] = 60}, - [7507] = {["xp"] = 9950, ["level"] = 60}, - [7509] = {["xp"] = 14175, ["level"] = 60}, - [7521] = {["xp"] = 120, ["level"] = 1}, - [7541] = {["xp"] = 1550, ["level"] = 40}, - [7561] = {["xp"] = 14175, ["level"] = 60}, - [7562] = {["xp"] = 945, ["level"] = 1}, - [7563] = {["xp"] = 11815, ["level"] = 1}, - [7564] = {["xp"] = 4725, ["level"] = nil}, - [7581] = {["xp"] = 6600, ["level"] = 60}, - [7582] = {["xp"] = 6600, ["level"] = 60}, - [7583] = {["xp"] = 9450, ["level"] = 1}, - [7601] = {["xp"] = 0, ["level"] = nil}, - [7602] = {["xp"] = 5650, ["level"] = 55}, - [7603] = {["xp"] = 7050, ["level"] = 55}, - [7604] = {["xp"] = 6600, ["level"] = 60}, - [7622] = {["xp"] = 14175, ["level"] = 60}, - [7623] = {["xp"] = 9450, ["level"] = 1}, - [7624] = {["xp"] = 9450, ["level"] = nil}, - [7625] = {["xp"] = 9450, ["level"] = 1}, - [7626] = {["xp"] = 9450, ["level"] = nil}, - [7627] = {["xp"] = 9450, ["level"] = nil}, - [7628] = {["xp"] = 9450, ["level"] = nil}, - [7629] = {["xp"] = 14175, ["level"] = 1}, - [7630] = {["xp"] = 9450, ["level"] = nil}, - [7631] = {["xp"] = 14175, ["level"] = 1}, - [7632] = {["xp"] = 9950, ["level"] = 60}, - [7634] = {["xp"] = 9950, ["level"] = 60}, - [7635] = {["xp"] = 9950, ["level"] = 60}, - [7636] = {["xp"] = 9950, ["level"] = 60}, - [7637] = {["xp"] = 945, ["level"] = 1}, - [7638] = {["xp"] = 660, ["level"] = 60}, - [7639] = {["xp"] = 945, ["level"] = nil}, - [7640] = {["xp"] = 9450, ["level"] = 1}, - [7641] = {["xp"] = 945, ["level"] = 1}, - [7642] = {["xp"] = 14175, ["level"] = 1}, - [7643] = {["xp"] = 14175, ["level"] = nil}, - [7644] = {["xp"] = 11815, ["level"] = nil}, - [7645] = {["xp"] = 945, ["level"] = nil}, - [7646] = {["xp"] = 4725, ["level"] = nil}, - [7647] = {["xp"] = 14175, ["level"] = 1}, - [7648] = {["xp"] = 9450, ["level"] = nil}, - [7667] = {["xp"] = 7090, ["level"] = 60}, - [7668] = {["xp"] = 14175, ["level"] = 60}, - [7670] = {["xp"] = 660, ["level"] = 60}, - [7681] = {["xp"] = 210, ["level"] = 10}, - [7682] = {["xp"] = 210, ["level"] = 10}, - [7701] = {["xp"] = 4700, ["level"] = 50}, - [7702] = {["xp"] = 7920, ["level"] = 49}, - [7703] = {["xp"] = 8300, ["level"] = 60}, - [7704] = {["xp"] = 4700, ["level"] = 50}, - [7721] = {["xp"] = 4400, ["level"] = 48}, - [7722] = {["xp"] = 4700, ["level"] = 50}, - [7723] = {["xp"] = 4550, ["level"] = 49}, - [7724] = {["xp"] = 4550, ["level"] = 49}, - [7725] = {["xp"] = 560, ["level"] = 55}, - [7726] = {["xp"] = 560, ["level"] = 55}, - [7727] = {["xp"] = 4550, ["level"] = 49}, - [7728] = {["xp"] = 4400, ["level"] = 48}, - [7729] = {["xp"] = 4400, ["level"] = 48}, - [7730] = {["xp"] = 3900, ["level"] = 45}, - [7731] = {["xp"] = 4200, ["level"] = 47}, - [7732] = {["xp"] = 4400, ["level"] = 48}, - [7733] = {["xp"] = 4400, ["level"] = 48}, - [7734] = {["xp"] = 4400, ["level"] = 48}, - [7735] = {["xp"] = 2200, ["level"] = 48}, - [7736] = {["xp"] = 0, ["level"] = nil}, - [7737] = {["xp"] = 0, ["level"] = nil}, - [7738] = {["xp"] = 440, ["level"] = 48}, - [7741] = {["xp"] = 9280, ["level"] = 59}, - [7761] = {["xp"] = 6600, ["level"] = 60}, - [7781] = {["xp"] = 9950, ["level"] = 60}, - [7782] = {["xp"] = 14175, ["level"] = 60}, - [7783] = {["xp"] = 9950, ["level"] = 60}, - [7784] = {["xp"] = 14175, ["level"] = 60}, - [7786] = {["xp"] = 9950, ["level"] = 60}, - [7787] = {["xp"] = 14175, ["level"] = 60}, - [7788] = {["xp"] = 2000, ["level"] = 25}, - [7789] = {["xp"] = 2000, ["level"] = 25}, - [7791] = {["xp"] = 660, ["level"] = 60}, - [7792] = {["xp"] = 660, ["level"] = 60}, - [7793] = {["xp"] = 1650, ["level"] = 60}, - [7794] = {["xp"] = 3300, ["level"] = 60}, - [7795] = {["xp"] = 6600, ["level"] = 60}, - [7798] = {["xp"] = 1650, ["level"] = 60}, - [7799] = {["xp"] = 3300, ["level"] = 60}, - [7800] = {["xp"] = 6600, ["level"] = 60}, - [7801] = {["xp"] = 0, ["level"] = nil}, - [7802] = {["xp"] = 660, ["level"] = 60}, - [7803] = {["xp"] = 1650, ["level"] = 60}, - [7804] = {["xp"] = 3300, ["level"] = 60}, - [7805] = {["xp"] = 6600, ["level"] = 60}, - [7807] = {["xp"] = 660, ["level"] = 60}, - [7808] = {["xp"] = 1650, ["level"] = 60}, - [7809] = {["xp"] = 3300, ["level"] = 60}, - [7810] = {["xp"] = 560, ["level"] = 55}, - [7811] = {["xp"] = 6600, ["level"] = 60}, - [7813] = {["xp"] = 660, ["level"] = 60}, - [7814] = {["xp"] = 1650, ["level"] = 60}, - [7815] = {["xp"] = 4700, ["level"] = 50}, - [7816] = {["xp"] = 4400, ["level"] = 48}, - [7817] = {["xp"] = 3300, ["level"] = 60}, - [7818] = {["xp"] = 6600, ["level"] = 60}, - [7819] = {["xp"] = 0, ["level"] = nil}, - [7820] = {["xp"] = 660, ["level"] = 60}, - [7821] = {["xp"] = 1650, ["level"] = 60}, - [7822] = {["xp"] = 3300, ["level"] = 60}, - [7823] = {["xp"] = 6600, ["level"] = 60}, - [7824] = {["xp"] = 6600, ["level"] = 60}, - [7825] = {["xp"] = 0, ["level"] = nil}, - [7826] = {["xp"] = 660, ["level"] = 60}, - [7827] = {["xp"] = 1650, ["level"] = 60}, - [7828] = {["xp"] = 4400, ["level"] = 48}, - [7829] = {["xp"] = 4400, ["level"] = 48}, - [7830] = {["xp"] = 4400, ["level"] = 48}, - [7831] = {["xp"] = 3300, ["level"] = 60}, - [7833] = {["xp"] = 660, ["level"] = 60}, - [7834] = {["xp"] = 1650, ["level"] = 60}, - [7835] = {["xp"] = 3300, ["level"] = 60}, - [7836] = {["xp"] = 6600, ["level"] = 60}, - [7838] = {["xp"] = 0, ["level"] = nil}, - [7839] = {["xp"] = 4400, ["level"] = 48}, - [7840] = {["xp"] = 4550, ["level"] = 49}, - [7841] = {["xp"] = 4400, ["level"] = 48}, - [7842] = {["xp"] = 5450, ["level"] = 48}, - [7843] = {["xp"] = 5900, ["level"] = 50}, - [7844] = {["xp"] = 4400, ["level"] = 48}, - [7845] = {["xp"] = 4900, ["level"] = 51}, - [7846] = {["xp"] = 6100, ["level"] = 51}, - [7847] = {["xp"] = 4900, ["level"] = 51}, - [7848] = {["xp"] = 6600, ["level"] = 60}, - [7849] = {["xp"] = 5900, ["level"] = 50}, - [7850] = {["xp"] = 5900, ["level"] = 50}, - [7861] = {["xp"] = 6100, ["level"] = 51}, - [7862] = {["xp"] = 6100, ["level"] = 51}, - [7863] = {["xp"] = 585, ["level"] = 34}, - [7864] = {["xp"] = 725, ["level"] = 44}, - [7865] = {["xp"] = 1080, ["level"] = 70}, - [7866] = {["xp"] = 585, ["level"] = 34}, - [7867] = {["xp"] = 725, ["level"] = 44}, - [7868] = {["xp"] = 1080, ["level"] = 70}, - [7871] = {["xp"] = 2750, ["level"] = 35}, - [7872] = {["xp"] = 3900, ["level"] = 45}, - [7873] = {["xp"] = 5650, ["level"] = 55}, - [7874] = {["xp"] = 2750, ["level"] = 35}, - [7875] = {["xp"] = 3900, ["level"] = 45}, - [7876] = {["xp"] = 5650, ["level"] = 55}, - [7877] = {["xp"] = 945, ["level"] = 60}, - [7886] = {["xp"] = 4370, ["level"] = 55}, - [7887] = {["xp"] = 3005, ["level"] = 35}, - [7888] = {["xp"] = 3685, ["level"] = 45}, - [7894] = {["xp"] = 0, ["level"] = nil}, - [7905] = {["xp"] = 660, ["level"] = 60}, - [7907] = {["xp"] = 560, ["level"] = 55}, - [7908] = {["xp"] = 560, ["level"] = 55}, - [7921] = {["xp"] = 2320, ["level"] = 25}, - [7922] = {["xp"] = 4370, ["level"] = 55}, - [7923] = {["xp"] = 3685, ["level"] = 45}, - [7924] = {["xp"] = 3005, ["level"] = 35}, - [7925] = {["xp"] = 2320, ["level"] = 25}, - [7926] = {["xp"] = 660, ["level"] = 60}, - [7927] = {["xp"] = 560, ["level"] = 55}, - [7928] = {["xp"] = 560, ["level"] = 55}, - [7929] = {["xp"] = 560, ["level"] = 55}, - [7937] = {["xp"] = 660, ["level"] = 60}, - [7938] = {["xp"] = 660, ["level"] = 60}, - [7944] = {["xp"] = 660, ["level"] = 60}, - [7945] = {["xp"] = 660, ["level"] = 60}, - [7961] = {["xp"] = 20, ["level"] = 1}, - [7962] = {["xp"] = 100, ["level"] = 1}, - [8041] = {["xp"] = 9450, ["level"] = 60}, - [8042] = {["xp"] = 9450, ["level"] = 60}, - [8043] = {["xp"] = 9450, ["level"] = 60}, - [8044] = {["xp"] = 9450, ["level"] = 60}, - [8045] = {["xp"] = 9450, ["level"] = 60}, - [8046] = {["xp"] = 9450, ["level"] = 60}, - [8047] = {["xp"] = 9450, ["level"] = 60}, - [8048] = {["xp"] = 9450, ["level"] = 60}, - [8049] = {["xp"] = 9450, ["level"] = 60}, - [8050] = {["xp"] = 9450, ["level"] = 60}, - [8051] = {["xp"] = 9450, ["level"] = 60}, - [8052] = {["xp"] = 9450, ["level"] = 60}, - [8053] = {["xp"] = 6600, ["level"] = 60}, - [8054] = {["xp"] = 6600, ["level"] = 60}, - [8055] = {["xp"] = 6600, ["level"] = 60}, - [8056] = {["xp"] = 9450, ["level"] = 60}, - [8057] = {["xp"] = 9450, ["level"] = 60}, - [8058] = {["xp"] = 9450, ["level"] = 60}, - [8059] = {["xp"] = 9450, ["level"] = 60}, - [8060] = {["xp"] = 9450, ["level"] = 60}, - [8061] = {["xp"] = 9450, ["level"] = 60}, - [8062] = {["xp"] = 9450, ["level"] = 60}, - [8063] = {["xp"] = 9450, ["level"] = 60}, - [8064] = {["xp"] = 9450, ["level"] = 60}, - [8065] = {["xp"] = 9450, ["level"] = 60}, - [8066] = {["xp"] = 9450, ["level"] = 60}, - [8067] = {["xp"] = 9450, ["level"] = 60}, - [8068] = {["xp"] = 9450, ["level"] = 60}, - [8069] = {["xp"] = 9450, ["level"] = 60}, - [8070] = {["xp"] = 9450, ["level"] = 60}, - [8071] = {["xp"] = 9450, ["level"] = 60}, - [8072] = {["xp"] = 9450, ["level"] = 60}, - [8073] = {["xp"] = 9450, ["level"] = 60}, - [8074] = {["xp"] = 9450, ["level"] = 60}, - [8075] = {["xp"] = 9450, ["level"] = 60}, - [8076] = {["xp"] = 9450, ["level"] = 60}, - [8077] = {["xp"] = 9450, ["level"] = 60}, - [8078] = {["xp"] = 9450, ["level"] = 60}, - [8079] = {["xp"] = 9450, ["level"] = 60}, - [8080] = {["xp"] = 5650, ["level"] = 55}, - [8081] = {["xp"] = 4370, ["level"] = 55}, - [8101] = {["xp"] = 9450, ["level"] = 60}, - [8102] = {["xp"] = 9450, ["level"] = 60}, - [8103] = {["xp"] = 9450, ["level"] = 60}, - [8104] = {["xp"] = 9450, ["level"] = 60}, - [8105] = {["xp"] = 8740, ["level"] = 55}, - [8106] = {["xp"] = 9450, ["level"] = 60}, - [8107] = {["xp"] = 9450, ["level"] = 60}, - [8108] = {["xp"] = 9450, ["level"] = 60}, - [8109] = {["xp"] = 9450, ["level"] = 60}, - [8110] = {["xp"] = 9450, ["level"] = 60}, - [8111] = {["xp"] = 9450, ["level"] = 60}, - [8112] = {["xp"] = 9450, ["level"] = 60}, - [8113] = {["xp"] = 9450, ["level"] = 60}, - [8114] = {["xp"] = 14175, ["level"] = 60}, - [8115] = {["xp"] = 14175, ["level"] = 60}, - [8116] = {["xp"] = 9450, ["level"] = 60}, - [8117] = {["xp"] = 9450, ["level"] = 60}, - [8118] = {["xp"] = 9450, ["level"] = 60}, - [8119] = {["xp"] = 9450, ["level"] = 60}, - [8120] = {["xp"] = 8740, ["level"] = 55}, - [8121] = {["xp"] = 14175, ["level"] = 60}, - [8122] = {["xp"] = 14175, ["level"] = 60}, - [8123] = {["xp"] = 5650, ["level"] = 55}, - [8124] = {["xp"] = 4370, ["level"] = 55}, - [8141] = {["xp"] = 9450, ["level"] = 60}, - [8142] = {["xp"] = 9450, ["level"] = 60}, - [8143] = {["xp"] = 9450, ["level"] = 60}, - [8144] = {["xp"] = 9450, ["level"] = 60}, - [8145] = {["xp"] = 9450, ["level"] = 60}, - [8146] = {["xp"] = 9450, ["level"] = 60}, - [8147] = {["xp"] = 9450, ["level"] = 60}, - [8148] = {["xp"] = 9450, ["level"] = 60}, - [8149] = {["xp"] = 6600, ["level"] = 60}, - [8150] = {["xp"] = 6600, ["level"] = 60}, - [8151] = {["xp"] = 835, ["level"] = 52}, - [8152] = {["xp"] = 8330, ["level"] = 52}, - [8153] = {["xp"] = 8330, ["level"] = 52}, - [8154] = {["xp"] = 3900, ["level"] = 45}, - [8155] = {["xp"] = 2000, ["level"] = 25}, - [8156] = {["xp"] = 2750, ["level"] = 35}, - [8157] = {["xp"] = 3685, ["level"] = 45}, - [8158] = {["xp"] = 2320, ["level"] = 25}, - [8159] = {["xp"] = 3005, ["level"] = 35}, - [8160] = {["xp"] = 3900, ["level"] = 45}, - [8161] = {["xp"] = 2750, ["level"] = 35}, - [8162] = {["xp"] = 2000, ["level"] = 25}, - [8163] = {["xp"] = 3685, ["level"] = 45}, - [8164] = {["xp"] = 3005, ["level"] = 35}, - [8165] = {["xp"] = 2320, ["level"] = 25}, - [8166] = {["xp"] = 3900, ["level"] = 45}, - [8167] = {["xp"] = 2750, ["level"] = 35}, - [8168] = {["xp"] = 2000, ["level"] = 25}, - [8169] = {["xp"] = 3900, ["level"] = 45}, - [8170] = {["xp"] = 2750, ["level"] = 35}, - [8171] = {["xp"] = 2000, ["level"] = 25}, - [8181] = {["xp"] = 6200, ["level"] = 58}, - [8182] = {["xp"] = 9300, ["level"] = 58}, - [8183] = {["xp"] = 9950, ["level"] = 60}, - [8195] = {["xp"] = 660, ["level"] = 60}, - [8201] = {["xp"] = 14175, ["level"] = 60}, - [8227] = {["xp"] = 660, ["level"] = 60}, - [8231] = {["xp"] = 8330, ["level"] = 52}, - [8232] = {["xp"] = 12495, ["level"] = 52}, - [8233] = {["xp"] = 835, ["level"] = 52}, - [8234] = {["xp"] = 8330, ["level"] = 52}, - [8235] = {["xp"] = 8330, ["level"] = 52}, - [8236] = {["xp"] = 12495, ["level"] = 52}, - [8238] = {["xp"] = 660, ["level"] = 60}, - [8239] = {["xp"] = 660, ["level"] = 60}, - [8240] = {["xp"] = 6600, ["level"] = 60}, - [8241] = {["xp"] = 0, ["level"] = nil}, - [8242] = {["xp"] = 0, ["level"] = nil}, - [8250] = {["xp"] = 835, ["level"] = 52}, - [8251] = {["xp"] = 8330, ["level"] = 52}, - [8252] = {["xp"] = 8330, ["level"] = 52}, - [8253] = {["xp"] = 12495, ["level"] = 52}, - [8254] = {["xp"] = 835, ["level"] = 52}, - [8255] = {["xp"] = 8330, ["level"] = 52}, - [8256] = {["xp"] = 8330, ["level"] = 52}, - [8257] = {["xp"] = 12495, ["level"] = 52}, - [8258] = {["xp"] = 14175, ["level"] = 60}, - [8260] = {["xp"] = 585, ["level"] = 34}, - [8261] = {["xp"] = 375, ["level"] = 44}, - [8262] = {["xp"] = 1080, ["level"] = 70}, - [8263] = {["xp"] = 585, ["level"] = 34}, - [8264] = {["xp"] = 375, ["level"] = 44}, - [8265] = {["xp"] = 1080, ["level"] = 70}, - [8266] = {["xp"] = 660, ["level"] = 60}, - [8268] = {["xp"] = 660, ["level"] = 60}, - [8271] = {["xp"] = 660, ["level"] = 60}, - [8272] = {["xp"] = 820, ["level"] = nil}, - [8273] = {["xp"] = 4200, ["level"] = 47}, - [8274] = {["xp"] = 0, ["level"] = nil}, - [8275] = {["xp"] = 2800, ["level"] = 55}, - [8276] = {["xp"] = 2800, ["level"] = 55}, - [8277] = {["xp"] = 5650, ["level"] = 55}, - [8278] = {["xp"] = 6690, ["level"] = nil}, - [8279] = {["xp"] = 8360, ["level"] = nil}, - [8280] = {["xp"] = 5650, ["level"] = 55}, - [8281] = {["xp"] = 6690, ["level"] = nil}, - [8282] = {["xp"] = 6690, ["level"] = nil}, - [8283] = {["xp"] = 8050, ["level"] = 59}, - [8284] = {["xp"] = 6200, ["level"] = 58}, - [8285] = {["xp"] = 5020, ["level"] = nil}, - [8286] = {["xp"] = 9450, ["level"] = 60}, - [8287] = {["xp"] = 6690, ["level"] = nil}, - [8288] = {["xp"] = 9450, ["level"] = 60}, - [8289] = {["xp"] = 1585, ["level"] = 15}, - [8290] = {["xp"] = 1050, ["level"] = 15}, - [8291] = {["xp"] = 6600, ["level"] = 60}, - [8292] = {["xp"] = 4725, ["level"] = 60}, - [8293] = {["xp"] = 4725, ["level"] = 60}, - [8294] = {["xp"] = 6600, ["level"] = 60}, - [8295] = {["xp"] = 1050, ["level"] = 15}, - [8296] = {["xp"] = 1585, ["level"] = 15}, - [8297] = {["xp"] = 6600, ["level"] = 60}, - [8298] = {["xp"] = 4725, ["level"] = 60}, - [8299] = {["xp"] = 6600, ["level"] = 60}, - [8300] = {["xp"] = 4725, ["level"] = 60}, - [8301] = {["xp"] = 9450, ["level"] = 60}, - [8304] = {["xp"] = 6690, ["level"] = nil}, - [8305] = {["xp"] = 9450, ["level"] = 60}, - [8306] = {["xp"] = 8360, ["level"] = nil}, - [8307] = {["xp"] = 3345, ["level"] = nil}, - [8308] = {["xp"] = 8300, ["level"] = 60}, - [8309] = {["xp"] = 6690, ["level"] = nil}, - [8310] = {["xp"] = 8360, ["level"] = nil}, - [8311] = {["xp"] = 1650, ["level"] = 60}, - [8312] = {["xp"] = 1650, ["level"] = 60}, - [8313] = {["xp"] = 6690, ["level"] = nil}, - [8314] = {["xp"] = 5020, ["level"] = nil}, - [8315] = {["xp"] = 11090, ["level"] = 56}, - [8316] = {["xp"] = 6690, ["level"] = nil}, - [8317] = {["xp"] = 3345, ["level"] = nil}, - [8318] = {["xp"] = 6600, ["level"] = 60}, - [8320] = {["xp"] = 6600, ["level"] = 60}, - [8321] = {["xp"] = 8360, ["level"] = nil}, - [8322] = {["xp"] = 1650, ["level"] = 60}, - [8323] = {["xp"] = 6690, ["level"] = nil}, - [8324] = {["xp"] = 0, ["level"] = nil}, - [8325] = {["xp"] = 120, ["level"] = 1}, - [8326] = {["xp"] = 500, ["level"] = 3}, - [8327] = {["xp"] = 25, ["level"] = 3}, - [8328] = {["xp"] = 125, ["level"] = 3}, - [8329] = {["xp"] = 65, ["level"] = 3}, - [8330] = {["xp"] = 355, ["level"] = 4}, - [8331] = {["xp"] = 885, ["level"] = 56}, - [8332] = {["xp"] = 8870, ["level"] = 56}, - [8334] = {["xp"] = 355, ["level"] = 4}, - [8335] = {["xp"] = 560, ["level"] = 5}, - [8336] = {["xp"] = 355, ["level"] = 4}, - [8338] = {["xp"] = 355, ["level"] = 4}, - [8341] = {["xp"] = 8870, ["level"] = 56}, - [8343] = {["xp"] = 885, ["level"] = 56}, - [8344] = {["xp"] = 80, ["level"] = 1}, - [8345] = {["xp"] = 355, ["level"] = 4}, - [8346] = {["xp"] = 250, ["level"] = 3}, - [8347] = {["xp"] = 45, ["level"] = 5}, - [8348] = {["xp"] = 11090, ["level"] = 56}, - [8349] = {["xp"] = 885, ["level"] = 56}, - [8350] = {["xp"] = 110, ["level"] = 5}, - [8351] = {["xp"] = 885, ["level"] = 56}, - [8352] = {["xp"] = 13305, ["level"] = 56}, - [8353] = {["xp"] = 0, ["level"] = nil}, - [8354] = {["xp"] = 0, ["level"] = nil}, - [8355] = {["xp"] = 0, ["level"] = nil}, - [8356] = {["xp"] = 0, ["level"] = nil}, - [8357] = {["xp"] = 0, ["level"] = nil}, - [8358] = {["xp"] = 0, ["level"] = nil}, - [8359] = {["xp"] = 0, ["level"] = nil}, - [8360] = {["xp"] = 0, ["level"] = nil}, - [8361] = {["xp"] = 6600, ["level"] = 60}, - [8365] = {["xp"] = 3900, ["level"] = 45}, - [8366] = {["xp"] = 3900, ["level"] = 45}, - [8367] = {["xp"] = 9580, ["level"] = 1}, - [8368] = {["xp"] = 1450, ["level"] = 19}, - [8369] = {["xp"] = 8300, ["level"] = 60}, - [8370] = {["xp"] = 2350, ["level"] = 29}, - [8371] = {["xp"] = 9580, ["level"] = 1}, - [8372] = {["xp"] = 1450, ["level"] = 19}, - [8373] = {["xp"] = 1650, ["level"] = 60}, - [8374] = {["xp"] = 2350, ["level"] = 29}, - [8375] = {["xp"] = 8300, ["level"] = 60}, - [8376] = {["xp"] = 6690, ["level"] = nil}, - [8377] = {["xp"] = 6690, ["level"] = nil}, - [8378] = {["xp"] = 8870, ["level"] = 56}, - [8379] = {["xp"] = 8870, ["level"] = 56}, - [8380] = {["xp"] = 8870, ["level"] = 56}, - [8381] = {["xp"] = 6690, ["level"] = nil}, - [8382] = {["xp"] = 8870, ["level"] = 56}, - [8383] = {["xp"] = 3300, ["level"] = 60}, - [8384] = {["xp"] = 2595, ["level"] = 29}, - [8386] = {["xp"] = 730, ["level"] = 19}, - [8387] = {["xp"] = 3300, ["level"] = 60}, - [8389] = {["xp"] = 1910, ["level"] = 19}, - [8390] = {["xp"] = 2595, ["level"] = 29}, - [8391] = {["xp"] = 1500, ["level"] = 39}, - [8392] = {["xp"] = 2250, ["level"] = 49}, - [8393] = {["xp"] = 3000, ["level"] = 39}, - [8394] = {["xp"] = 4550, ["level"] = 49}, - [8395] = {["xp"] = 9280, ["level"] = 59}, - [8396] = {["xp"] = 9450, ["level"] = 60}, - [8397] = {["xp"] = 4640, ["level"] = 59}, - [8398] = {["xp"] = 4725, ["level"] = 60}, - [8399] = {["xp"] = 2350, ["level"] = 29}, - [8400] = {["xp"] = 3000, ["level"] = 39}, - [8401] = {["xp"] = 4550, ["level"] = 49}, - [8402] = {["xp"] = 9280, ["level"] = 59}, - [8403] = {["xp"] = 9450, ["level"] = 60}, - [8404] = {["xp"] = 2595, ["level"] = 29}, - [8405] = {["xp"] = 1500, ["level"] = 39}, - [8406] = {["xp"] = 2250, ["level"] = 49}, - [8407] = {["xp"] = 4640, ["level"] = 59}, - [8408] = {["xp"] = 4725, ["level"] = 60}, - [8409] = {["xp"] = 1330, ["level"] = 1}, - [8410] = {["xp"] = 6250, ["level"] = 52}, - [8411] = {["xp"] = 6250, ["level"] = 52}, - [8412] = {["xp"] = 8330, ["level"] = 52}, - [8413] = {["xp"] = 12495, ["level"] = 52}, - [8414] = {["xp"] = 8330, ["level"] = 52}, - [8415] = {["xp"] = 835, ["level"] = 52}, - [8416] = {["xp"] = 4165, ["level"] = 52}, - [8417] = {["xp"] = 835, ["level"] = 52}, - [8418] = {["xp"] = 12495, ["level"] = 52}, - [8419] = {["xp"] = 6250, ["level"] = 52}, - [8420] = {["xp"] = 6250, ["level"] = 52}, - [8421] = {["xp"] = 8330, ["level"] = 52}, - [8422] = {["xp"] = 12495, ["level"] = 52}, - [8423] = {["xp"] = 8330, ["level"] = 52}, - [8424] = {["xp"] = 8330, ["level"] = 52}, - [8425] = {["xp"] = 12495, ["level"] = 52}, - [8426] = {["xp"] = 2350, ["level"] = 29}, - [8427] = {["xp"] = 3000, ["level"] = 39}, - [8428] = {["xp"] = 4550, ["level"] = 49}, - [8429] = {["xp"] = 9280, ["level"] = 59}, - [8430] = {["xp"] = 9450, ["level"] = 60}, - [8431] = {["xp"] = 2595, ["level"] = 29}, - [8432] = {["xp"] = 1500, ["level"] = 39}, - [8433] = {["xp"] = 2250, ["level"] = 49}, - [8434] = {["xp"] = 4640, ["level"] = 59}, - [8435] = {["xp"] = 4725, ["level"] = 60}, - [8436] = {["xp"] = 3000, ["level"] = 39}, - [8437] = {["xp"] = 4550, ["level"] = 49}, - [8438] = {["xp"] = 9280, ["level"] = 59}, - [8439] = {["xp"] = 9450, ["level"] = 60}, - [8440] = {["xp"] = 3275, ["level"] = 39}, - [8441] = {["xp"] = 2250, ["level"] = 49}, - [8442] = {["xp"] = 4640, ["level"] = 59}, - [8443] = {["xp"] = 4725, ["level"] = 60}, - [8446] = {["xp"] = 9950, ["level"] = 60}, - [8447] = {["xp"] = 0, ["level"] = nil}, - [8458] = {["xp"] = 5730, ["level"] = 33}, - [8460] = {["xp"] = 4400, ["level"] = 48}, - [8461] = {["xp"] = 5650, ["level"] = 55}, - [8462] = {["xp"] = 560, ["level"] = 55}, - [8463] = {["xp"] = 450, ["level"] = nil}, - [8464] = {["xp"] = 6200, ["level"] = 58}, - [8465] = {["xp"] = 560, ["level"] = 55}, - [8466] = {["xp"] = 560, ["level"] = 55}, - [8467] = {["xp"] = 560, ["level"] = 55}, - [8468] = {["xp"] = 450, ["level"] = nil}, - [8469] = {["xp"] = 580, ["level"] = 56}, - [8470] = {["xp"] = 5650, ["level"] = 55}, - [8471] = {["xp"] = 5800, ["level"] = 56}, - [8472] = {["xp"] = 450, ["level"] = nil}, - [8473] = {["xp"] = 450, ["level"] = nil}, - [8474] = {["xp"] = 450, ["level"] = nil}, - [8475] = {["xp"] = 450, ["level"] = nil}, - [8476] = {["xp"] = 450, ["level"] = nil}, - [8477] = {["xp"] = 450, ["level"] = nil}, - [8478] = {["xp"] = 650, ["level"] = 9}, - [8479] = {["xp"] = 450, ["level"] = nil}, - [8480] = {["xp"] = 450, ["level"] = nil}, - [8481] = {["xp"] = 6690, ["level"] = nil}, - [8482] = {["xp"] = 560, ["level"] = nil}, - [8483] = {["xp"] = 560, ["level"] = nil}, - [8484] = {["xp"] = 14175, ["level"] = 60}, - [8485] = {["xp"] = 9950, ["level"] = 60}, - [8486] = {["xp"] = 450, ["level"] = nil}, - [8487] = {["xp"] = 450, ["level"] = nil}, - [8488] = {["xp"] = 450, ["level"] = nil}, - [8489] = {["xp"] = 630, ["level"] = 6}, - [8490] = {["xp"] = 450, ["level"] = nil}, - [8491] = {["xp"] = 450, ["level"] = nil}, - [8496] = {["xp"] = 660, ["level"] = 60}, - [8497] = {["xp"] = 660, ["level"] = 60}, - [8498] = {["xp"] = 660, ["level"] = 60}, - [8501] = {["xp"] = 660, ["level"] = 60}, - [8502] = {["xp"] = 660, ["level"] = 60}, - [8505] = {["xp"] = 0, ["level"] = nil}, - [8506] = {["xp"] = 0, ["level"] = nil}, - [8515] = {["xp"] = 0, ["level"] = nil}, - [8516] = {["xp"] = 0, ["level"] = nil}, - [8519] = {["xp"] = 9450, ["level"] = 60}, - [8528] = {["xp"] = 0, ["level"] = nil}, - [8529] = {["xp"] = 0, ["level"] = nil}, - [8534] = {["xp"] = 660, ["level"] = 60}, - [8535] = {["xp"] = 660, ["level"] = 60}, - [8536] = {["xp"] = 660, ["level"] = 60}, - [8537] = {["xp"] = 660, ["level"] = 60}, - [8538] = {["xp"] = 660, ["level"] = 60}, - [8539] = {["xp"] = 660, ["level"] = 60}, - [8540] = {["xp"] = 660, ["level"] = 60}, - [8541] = {["xp"] = 660, ["level"] = 60}, - [8548] = {["xp"] = 4435, ["level"] = 56}, - [8549] = {["xp"] = 0, ["level"] = nil}, - [8550] = {["xp"] = 0, ["level"] = nil}, - [8551] = {["xp"] = 3150, ["level"] = 47}, - [8552] = {["xp"] = 2350, ["level"] = 50}, - [8553] = {["xp"] = 470, ["level"] = 50}, - [8554] = {["xp"] = 7100, ["level"] = 50}, - [8555] = {["xp"] = 945, ["level"] = 60}, - [8556] = {["xp"] = 9450, ["level"] = 60}, - [8557] = {["xp"] = 9450, ["level"] = 60}, - [8558] = {["xp"] = 9450, ["level"] = 60}, - [8563] = {["xp"] = 125, ["level"] = 3}, - [8564] = {["xp"] = 125, ["level"] = 3}, - [8572] = {["xp"] = 4435, ["level"] = 56}, - [8573] = {["xp"] = 4435, ["level"] = 56}, - [8574] = {["xp"] = 4435, ["level"] = 56}, - [8575] = {["xp"] = 9450, ["level"] = 60}, - [8576] = {["xp"] = 945, ["level"] = 60}, - [8577] = {["xp"] = 9450, ["level"] = 60}, - [8578] = {["xp"] = 11815, ["level"] = 60}, - [8579] = {["xp"] = 6600, ["level"] = 60}, - [8580] = {["xp"] = 0, ["level"] = nil}, - [8581] = {["xp"] = 0, ["level"] = nil}, - [8582] = {["xp"] = 0, ["level"] = nil}, - [8583] = {["xp"] = 0, ["level"] = nil}, - [8584] = {["xp"] = 945, ["level"] = 60}, - [8585] = {["xp"] = 9450, ["level"] = 60}, - [8586] = {["xp"] = 9450, ["level"] = 60}, - [8587] = {["xp"] = 9450, ["level"] = 60}, - [8590] = {["xp"] = 0, ["level"] = nil}, - [8591] = {["xp"] = 0, ["level"] = nil}, - [8597] = {["xp"] = 9450, ["level"] = 60}, - [8598] = {["xp"] = 4725, ["level"] = 60}, - [8599] = {["xp"] = 4725, ["level"] = 60}, - [8606] = {["xp"] = 9450, ["level"] = 60}, - [8613] = {["xp"] = 0, ["level"] = nil}, - [8614] = {["xp"] = 0, ["level"] = nil}, - [8620] = {["xp"] = 9450, ["level"] = 60}, - [8687] = {["xp"] = 660, ["level"] = 60}, - [8689] = {["xp"] = 9450, ["level"] = 60}, - [8690] = {["xp"] = 9450, ["level"] = 60}, - [8691] = {["xp"] = 9450, ["level"] = 60}, - [8692] = {["xp"] = 9450, ["level"] = 60}, - [8693] = {["xp"] = 9450, ["level"] = 60}, - [8694] = {["xp"] = 9450, ["level"] = 60}, - [8695] = {["xp"] = 6600, ["level"] = 60}, - [8696] = {["xp"] = 9450, ["level"] = 60}, - [8697] = {["xp"] = 9450, ["level"] = 60}, - [8698] = {["xp"] = 9450, ["level"] = 60}, - [8699] = {["xp"] = 9450, ["level"] = 60}, - [8700] = {["xp"] = 9450, ["level"] = 60}, - [8701] = {["xp"] = 9450, ["level"] = 60}, - [8702] = {["xp"] = 9450, ["level"] = 60}, - [8703] = {["xp"] = 6600, ["level"] = 60}, - [8704] = {["xp"] = 9450, ["level"] = 60}, - [8705] = {["xp"] = 9450, ["level"] = 60}, - [8706] = {["xp"] = 9450, ["level"] = 60}, - [8707] = {["xp"] = 9450, ["level"] = 60}, - [8708] = {["xp"] = 9450, ["level"] = 60}, - [8709] = {["xp"] = 9450, ["level"] = 60}, - [8710] = {["xp"] = 9450, ["level"] = 60}, - [8711] = {["xp"] = 6600, ["level"] = 60}, - [8712] = {["xp"] = 9450, ["level"] = 60}, - [8728] = {["xp"] = 9450, ["level"] = 60}, - [8729] = {["xp"] = 14175, ["level"] = 60}, - [8730] = {["xp"] = 14175, ["level"] = 60}, - [8733] = {["xp"] = 9450, ["level"] = 60}, - [8734] = {["xp"] = 2365, ["level"] = 60}, - [8735] = {["xp"] = 9450, ["level"] = 60}, - [8736] = {["xp"] = 14175, ["level"] = 60}, - [8737] = {["xp"] = 660, ["level"] = 60}, - [8738] = {["xp"] = 660, ["level"] = 60}, - [8739] = {["xp"] = 660, ["level"] = 60}, - [8740] = {["xp"] = 660, ["level"] = 60}, - [8741] = {["xp"] = 9450, ["level"] = 60}, - [8742] = {["xp"] = 14175, ["level"] = 60}, - [8745] = {["xp"] = 9450, ["level"] = 60}, - [8746] = {["xp"] = 4950, ["level"] = 60}, - [8747] = {["xp"] = 9450, ["level"] = 60}, - [8748] = {["xp"] = 9450, ["level"] = 60}, - [8749] = {["xp"] = 9450, ["level"] = 60}, - [8750] = {["xp"] = 9450, ["level"] = 60}, - [8751] = {["xp"] = 14175, ["level"] = 60}, - [8752] = {["xp"] = 9450, ["level"] = 60}, - [8753] = {["xp"] = 9450, ["level"] = 60}, - [8754] = {["xp"] = 9450, ["level"] = 60}, - [8755] = {["xp"] = 9450, ["level"] = 60}, - [8756] = {["xp"] = 14175, ["level"] = 60}, - [8757] = {["xp"] = 9450, ["level"] = 60}, - [8758] = {["xp"] = 9450, ["level"] = 60}, - [8759] = {["xp"] = 9450, ["level"] = 60}, - [8760] = {["xp"] = 9450, ["level"] = 60}, - [8761] = {["xp"] = 14175, ["level"] = 60}, - [8762] = {["xp"] = 4950, ["level"] = 60}, - [8770] = {["xp"] = 660, ["level"] = 60}, - [8771] = {["xp"] = 660, ["level"] = 60}, - [8772] = {["xp"] = 660, ["level"] = 60}, - [8773] = {["xp"] = 660, ["level"] = 60}, - [8774] = {["xp"] = 660, ["level"] = 60}, - [8775] = {["xp"] = 660, ["level"] = 60}, - [8776] = {["xp"] = 660, ["level"] = 60}, - [8777] = {["xp"] = 660, ["level"] = 60}, - [8778] = {["xp"] = 660, ["level"] = 60}, - [8779] = {["xp"] = 660, ["level"] = 60}, - [8780] = {["xp"] = 660, ["level"] = 60}, - [8781] = {["xp"] = 660, ["level"] = 60}, - [8782] = {["xp"] = 660, ["level"] = 60}, - [8783] = {["xp"] = 660, ["level"] = 60}, - [8784] = {["xp"] = 6600, ["level"] = 60}, - [8785] = {["xp"] = 660, ["level"] = 60}, - [8786] = {["xp"] = 660, ["level"] = 60}, - [8787] = {["xp"] = 660, ["level"] = 60}, - [8789] = {["xp"] = 6600, ["level"] = 60}, - [8790] = {["xp"] = 6600, ["level"] = 60}, - [8791] = {["xp"] = 9950, ["level"] = 60}, - [8792] = {["xp"] = 660, ["level"] = 60}, - [8793] = {["xp"] = 660, ["level"] = 60}, - [8794] = {["xp"] = 660, ["level"] = 60}, - [8795] = {["xp"] = 660, ["level"] = 60}, - [8796] = {["xp"] = 660, ["level"] = 60}, - [8797] = {["xp"] = 660, ["level"] = 60}, - [8801] = {["xp"] = 9950, ["level"] = 60}, - [8802] = {["xp"] = 14175, ["level"] = 60}, - [8804] = {["xp"] = 660, ["level"] = 60}, - [8805] = {["xp"] = 660, ["level"] = 60}, - [8806] = {["xp"] = 660, ["level"] = 60}, - [8807] = {["xp"] = 660, ["level"] = 60}, - [8808] = {["xp"] = 660, ["level"] = 60}, - [8809] = {["xp"] = 660, ["level"] = 60}, - [8810] = {["xp"] = 660, ["level"] = 60}, - [8827] = {["xp"] = 10, ["level"] = 1}, - [8828] = {["xp"] = 10, ["level"] = nil}, - [8829] = {["xp"] = 660, ["level"] = 60}, - [8857] = {["xp"] = 9950, ["level"] = 60}, - [8858] = {["xp"] = 9950, ["level"] = 60}, - [8859] = {["xp"] = 9950, ["level"] = 60}, - [8861] = {["xp"] = 0, ["level"] = nil}, - [8868] = {["xp"] = 6600, ["level"] = 60}, - [8869] = {["xp"] = 11815, ["level"] = 60}, - [8883] = {["xp"] = 10, ["level"] = nil}, - [8884] = {["xp"] = 450, ["level"] = nil}, - [8885] = {["xp"] = 560, ["level"] = nil}, - [8886] = {["xp"] = 450, ["level"] = nil}, - [8887] = {["xp"] = 450, ["level"] = nil}, - [8888] = {["xp"] = 45, ["level"] = nil}, - [8889] = {["xp"] = 335, ["level"] = nil}, - [8890] = {["xp"] = 450, ["level"] = nil}, - [8891] = {["xp"] = 450, ["level"] = nil}, - [8892] = {["xp"] = 450, ["level"] = nil}, - [8893] = {["xp"] = 0, ["level"] = nil}, - [8894] = {["xp"] = 450, ["level"] = nil}, - [8895] = {["xp"] = 110, ["level"] = nil}, - [8903] = {["xp"] = 0, ["level"] = nil}, - [8905] = {["xp"] = 9450, ["level"] = 60}, - [8906] = {["xp"] = 9450, ["level"] = 60}, - [8907] = {["xp"] = 6600, ["level"] = 60}, - [8908] = {["xp"] = 6600, ["level"] = 60}, - [8909] = {["xp"] = 6600, ["level"] = 60}, - [8910] = {["xp"] = 9450, ["level"] = 60}, - [8911] = {["xp"] = 9450, ["level"] = 60}, - [8912] = {["xp"] = 6600, ["level"] = 60}, - [8913] = {["xp"] = 9450, ["level"] = 60}, - [8914] = {["xp"] = 9450, ["level"] = 60}, - [8915] = {["xp"] = 9450, ["level"] = 60}, - [8916] = {["xp"] = 9450, ["level"] = 60}, - [8917] = {["xp"] = 9450, ["level"] = 60}, - [8918] = {["xp"] = 9450, ["level"] = 60}, - [8919] = {["xp"] = 9450, ["level"] = 60}, - [8920] = {["xp"] = 9450, ["level"] = 60}, - [8921] = {["xp"] = 9450, ["level"] = 60}, - [8922] = {["xp"] = 9450, ["level"] = 60}, - [8923] = {["xp"] = 9450, ["level"] = 60}, - [8924] = {["xp"] = 9450, ["level"] = 60}, - [8925] = {["xp"] = 9450, ["level"] = 60}, - [8926] = {["xp"] = 14175, ["level"] = 60}, - [8927] = {["xp"] = 14175, ["level"] = 60}, - [8928] = {["xp"] = 4725, ["level"] = 60}, - [8929] = {["xp"] = 9450, ["level"] = 60}, - [8930] = {["xp"] = 9450, ["level"] = 60}, - [8931] = {["xp"] = 14175, ["level"] = 60}, - [8932] = {["xp"] = 14175, ["level"] = 60}, - [8933] = {["xp"] = 14175, ["level"] = 60}, - [8934] = {["xp"] = 14175, ["level"] = 60}, - [8935] = {["xp"] = 14175, ["level"] = 60}, - [8936] = {["xp"] = 14175, ["level"] = 60}, - [8937] = {["xp"] = 14175, ["level"] = 60}, - [8938] = {["xp"] = 14175, ["level"] = 60}, - [8939] = {["xp"] = 14175, ["level"] = 60}, - [8940] = {["xp"] = 14175, ["level"] = 60}, - [8941] = {["xp"] = 14175, ["level"] = 60}, - [8942] = {["xp"] = 14175, ["level"] = 60}, - [8943] = {["xp"] = 14175, ["level"] = 60}, - [8944] = {["xp"] = 14175, ["level"] = 60}, - [8945] = {["xp"] = 11815, ["level"] = 60}, - [8946] = {["xp"] = 9450, ["level"] = 60}, - [8947] = {["xp"] = 9450, ["level"] = 60}, - [8948] = {["xp"] = 9450, ["level"] = 60}, - [8949] = {["xp"] = 9450, ["level"] = 60}, - [8950] = {["xp"] = 9450, ["level"] = 60}, - [8951] = {["xp"] = 14175, ["level"] = 60}, - [8952] = {["xp"] = 14175, ["level"] = 60}, - [8953] = {["xp"] = 14175, ["level"] = 60}, - [8954] = {["xp"] = 14175, ["level"] = 60}, - [8955] = {["xp"] = 14175, ["level"] = 60}, - [8956] = {["xp"] = 14175, ["level"] = 60}, - [8957] = {["xp"] = 14175, ["level"] = 60}, - [8958] = {["xp"] = 14175, ["level"] = 60}, - [8959] = {["xp"] = 14175, ["level"] = 60}, - [8960] = {["xp"] = 2365, ["level"] = 60}, - [8961] = {["xp"] = 9450, ["level"] = 60}, - [8962] = {["xp"] = 9450, ["level"] = 60}, - [8963] = {["xp"] = 9450, ["level"] = 60}, - [8964] = {["xp"] = 9450, ["level"] = 60}, - [8965] = {["xp"] = 9450, ["level"] = 60}, - [8966] = {["xp"] = 11815, ["level"] = 60}, - [8967] = {["xp"] = 11815, ["level"] = 60}, - [8968] = {["xp"] = 11815, ["level"] = 60}, - [8969] = {["xp"] = 11815, ["level"] = 60}, - [8970] = {["xp"] = 9450, ["level"] = 60}, - [8971] = {["xp"] = 0, ["level"] = nil}, - [8973] = {["xp"] = 0, ["level"] = nil}, - [8976] = {["xp"] = 0, ["level"] = nil}, - [8977] = {["xp"] = 9450, ["level"] = 60}, - [8978] = {["xp"] = 9450, ["level"] = 60}, - [8985] = {["xp"] = 9450, ["level"] = 60}, - [8986] = {["xp"] = 9450, ["level"] = 60}, - [8987] = {["xp"] = 9450, ["level"] = 60}, - [8988] = {["xp"] = 9450, ["level"] = 60}, - [8989] = {["xp"] = 11815, ["level"] = 60}, - [8990] = {["xp"] = 11815, ["level"] = 60}, - [8991] = {["xp"] = 11815, ["level"] = 60}, - [8992] = {["xp"] = 11815, ["level"] = 60}, - [8994] = {["xp"] = 9450, ["level"] = 60}, - [8995] = {["xp"] = 14175, ["level"] = 60}, - [8996] = {["xp"] = 945, ["level"] = 60}, - [8997] = {["xp"] = 945, ["level"] = 60}, - [8998] = {["xp"] = 945, ["level"] = 60}, - [8999] = {["xp"] = 2365, ["level"] = 60}, - [9000] = {["xp"] = 2365, ["level"] = 60}, - [9001] = {["xp"] = 2365, ["level"] = 60}, - [9002] = {["xp"] = 2365, ["level"] = 60}, - [9003] = {["xp"] = 2365, ["level"] = 60}, - [9004] = {["xp"] = 2365, ["level"] = 60}, - [9005] = {["xp"] = 2365, ["level"] = 60}, - [9006] = {["xp"] = 2365, ["level"] = 60}, - [9007] = {["xp"] = 2365, ["level"] = 60}, - [9008] = {["xp"] = 2365, ["level"] = 60}, - [9009] = {["xp"] = 2365, ["level"] = 60}, - [9010] = {["xp"] = 2365, ["level"] = 60}, - [9011] = {["xp"] = 2365, ["level"] = 60}, - [9012] = {["xp"] = 2365, ["level"] = 60}, - [9013] = {["xp"] = 2365, ["level"] = 60}, - [9014] = {["xp"] = 2365, ["level"] = 60}, - [9015] = {["xp"] = 9450, ["level"] = 60}, - [9016] = {["xp"] = 14175, ["level"] = 60}, - [9017] = {["xp"] = 14175, ["level"] = 60}, - [9018] = {["xp"] = 14175, ["level"] = 60}, - [9019] = {["xp"] = 14175, ["level"] = 60}, - [9020] = {["xp"] = 14175, ["level"] = 60}, - [9021] = {["xp"] = 14175, ["level"] = 60}, - [9022] = {["xp"] = 14175, ["level"] = 60}, - [9023] = {["xp"] = 6600, ["level"] = 60}, - [9030] = {["xp"] = 9450, ["level"] = 60}, - [9031] = {["xp"] = 9450, ["level"] = 60}, - [9032] = {["xp"] = 2365, ["level"] = 60}, - [9033] = {["xp"] = 9450, ["level"] = 60}, - [9051] = {["xp"] = 8330, ["level"] = 52}, - [9052] = {["xp"] = 8330, ["level"] = 52}, - [9053] = {["xp"] = 12495, ["level"] = 52}, - [9063] = {["xp"] = 835, ["level"] = 52}, - [9065] = {["xp"] = 540, ["level"] = 4}, - [9120] = {["xp"] = 9950, ["level"] = 60}, - [9124] = {["xp"] = 6600, ["level"] = 60}, - [9126] = {["xp"] = 6600, ["level"] = 60}, - [9128] = {["xp"] = 6600, ["level"] = 60}, - [9131] = {["xp"] = 6600, ["level"] = 60}, - [9136] = {["xp"] = 6600, ["level"] = 60}, - [9141] = {["xp"] = 3300, ["level"] = 60}, - [9222] = {["xp"] = 0, ["level"] = nil}, - [9224] = {["xp"] = 0, ["level"] = nil}, - [9228] = {["xp"] = 0, ["level"] = nil}, - [9229] = {["xp"] = 9450, ["level"] = 60}, - [9230] = {["xp"] = 9450, ["level"] = 60}, - [9232] = {["xp"] = 9450, ["level"] = 60}, - [9237] = {["xp"] = 0, ["level"] = nil}, - [9238] = {["xp"] = 0, ["level"] = nil}, - [9239] = {["xp"] = 0, ["level"] = nil}, - [9240] = {["xp"] = 0, ["level"] = nil}, - [9244] = {["xp"] = 0, ["level"] = nil}, - [9245] = {["xp"] = 0, ["level"] = nil}, - [9246] = {["xp"] = 0, ["level"] = nil}, - [9247] = {["xp"] = 660, ["level"] = 60}, - [9248] = {["xp"] = 8870, ["level"] = 56}, - [9250] = {["xp"] = 9450, ["level"] = 60}, - [9251] = {["xp"] = 9450, ["level"] = 60}, - [9259] = {["xp"] = 0, ["level"] = nil}, - [9260] = {["xp"] = 405, ["level"] = 6}, - [9261] = {["xp"] = 630, ["level"] = 10}, - [9262] = {["xp"] = 630, ["level"] = 10}, - [9263] = {["xp"] = 1170, ["level"] = 10}, - [9264] = {["xp"] = 1170, ["level"] = 10}, - [9265] = {["xp"] = 795, ["level"] = 8}, - [9267] = {["xp"] = 0, ["level"] = nil}, - [9268] = {["xp"] = 0, ["level"] = nil}, - [9272] = {["xp"] = 0, ["level"] = nil}, - [9295] = {["xp"] = 3300, ["level"] = 60}, - [9299] = {["xp"] = 3300, ["level"] = 60}, - [9300] = {["xp"] = 3300, ["level"] = 60}, - [9301] = {["xp"] = 3300, ["level"] = 60}, - [9302] = {["xp"] = 3300, ["level"] = 60}, - [9304] = {["xp"] = 3300, ["level"] = 60}, - [9319] = {["xp"] = 4950, ["level"] = 60}, - [9322] = {["xp"] = 3300, ["level"] = 60}, - [9323] = {["xp"] = 3300, ["level"] = 60}, - [9324] = {["xp"] = 4950, ["level"] = 60}, - [9325] = {["xp"] = 4950, ["level"] = 60}, - [9326] = {["xp"] = 4950, ["level"] = 60}, - [9330] = {["xp"] = 60, ["level"] = nil}, - [9331] = {["xp"] = 60, ["level"] = nil}, - [9332] = {["xp"] = 60, ["level"] = nil}, - [9339] = {["xp"] = 60, ["level"] = nil}, - [9362] = {["xp"] = 6600, ["level"] = 60}, - [9364] = {["xp"] = 6600, ["level"] = 60}, - [9365] = {["xp"] = 60, ["level"] = nil}, - [9367] = {["xp"] = 660, ["level"] = 60}, - [9368] = {["xp"] = 660, ["level"] = 60}, - [9388] = {["xp"] = 1500, ["level"] = 25}, - [9389] = {["xp"] = 1500, ["level"] = 25}, - [9419] = {["xp"] = 6600, ["level"] = 60}, - [9422] = {["xp"] = 6600, ["level"] = 60}, - [9556] = {["xp"] = 4950, ["level"] = 60}, - [9664] = {["xp"] = 6600, ["level"] = 60}, - [9665] = {["xp"] = 9450, ["level"] = 60} -} diff --git a/ElvUI_Libraries/Classic/Libs.xml b/ElvUI_Libraries/Classic/Libs.xml index e4cb526c50..4af66b76a7 100644 --- a/ElvUI_Libraries/Classic/Libs.xml +++ b/ElvUI_Libraries/Classic/Libs.xml @@ -19,10 +19,11 @@ \ No newline at end of file diff --git a/ElvUI_Libraries/Core/UTF8/LICENSE.txt b/ElvUI_Libraries/Core/UTF8/LICENSE.txt deleted file mode 100644 index 0a4711c8e9..0000000000 --- a/ElvUI_Libraries/Core/UTF8/LICENSE.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2006-2007, Kyle Smith -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * 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. - * Neither the name of the author nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. diff --git a/ElvUI_Libraries/Core/UTF8/UTF8.xml b/ElvUI_Libraries/Core/UTF8/UTF8.xml deleted file mode 100644 index 04aec2bbf4..0000000000 --- a/ElvUI_Libraries/Core/UTF8/UTF8.xml +++ /dev/null @@ -1,5 +0,0 @@ - -