Repository navigation
ccdb.NightlyBuild.AppImage.dd4c738d
Pre-release
Pre-release
·
131 commits
to main
since this release
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4409512a..555b6b9e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -77,6 +77,7 @@ generate_from_resource_file(langJSON "${CMAKE_BINARY_DIR}/lang.json" lang.json.c
generate_from_resource_file(LICENSE "${CMAKE_SOURCE_DIR}/../LICENSE" LICENSE.cpp LICENSE.h LICENSE false)
generate_from_resource_file(img_8f87efc1c0d8fc8c "${CMAKE_SOURCE_DIR}/../img/8f87efc1c0d8fc8c.png" img_8f87efc1c0d8fc8c.cpp img_8f87efc1c0d8fc8c.h img_8f87efc1c0d8fc8c false)
generate_from_resource_file(ccdbrc "${CMAKE_SOURCE_DIR}/../ccdbrc.example" ccdbrc.cpp ccdbrc.h ccdbrc false)
+generate_from_resource_file(default_color_scheme_txt "${CMAKE_SOURCE_DIR}/default_color_scheme.txt" default_color_scheme.cpp default_color_scheme.h default_color_scheme false)
add_custom_command(
OUTPUT "${CMAKE_BINARY_DIR}/lang.json"
@@ -183,7 +184,7 @@ add_library(ccdb SHARED
target_include_directories(ccdb PRIVATE ./include ${READLINE_INCLUDE_DIR} ${CMAKE_BINARY_DIR})
target_compile_definitions(ccdb PRIVATE CCDB_VERSION="${CCDB_VERSION}" CPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(ccdb PRIVATE
- AddiHelp langJSON commandReadline LICENSE Zterminfotar tar.exe ccdbrc
+ AddiHelp langJSON commandReadline LICENSE Zterminfotar tar.exe ccdbrc default_color_scheme_txt
openssl::openssl libpsl::libpsl icu4c::icu4c
re2::re2 maxmind::libmaxmind
)
diff --git a/src/ccdb/main.cpp b/src/ccdb/main.cpp
index 49cbd585..3d9c394b 100644
--- a/src/ccdb/main.cpp
+++ b/src/ccdb/main.cpp
@@ -40,6 +40,7 @@
#include "LICENSE.h"
#include "Readline.h"
#include "versions.h"
+#include "default_color_scheme.h"
extern unsigned char debugInfo[] ;
extern unsigned int debugInfo_len ;
@@ -426,6 +427,14 @@ extern "C"
__attribute__((visibility("default")))
int main_(int argc, char ** argv)
{
+ if (const auto dest = utils::getenv("HOME") + "/.ccdbrc"; !std::filesystem::exists(dest)) {
+ if (std::ofstream ofile(dest, std::ios::trunc); ofile.good()) {
+ const auto result = utils::decompress({default_color_scheme, default_color_scheme + default_color_scheme_len});
+ ofile.write(reinterpret_cast<const char*>(result.data()), static_cast<std::streamsize>(result.size()));
+ ofile.close();
+ }
+ }
+
try
{
std::string token;
diff --git a/src/default_color_scheme.txt b/src/default_color_scheme.txt
index e69de29b..d429c1e6 100644
--- a/src/default_color_scheme.txt
+++ b/src/default_color_scheme.txt
@@ -0,0 +1,420 @@
+[ColorScheme]
+DefaultColorScheme = MonoColor
+MonoColor = ```
+----------------- START OF THE DATA STRUCTURE -----------------
+DATA SET SIZE: 12968
+CRC64: b44e1be61dca782d
+iijnkMiii@ilipiaiJiyjmi9jsi1kpj8ieiIiwjgkmkejtilj9ieiKivjmkmj_j
+tkFi*jTiLiwiIk2jki9k8i*ifjsiyjCkMj_ijk8ioifiKizjgk0iAi9i$jmigjU
+iqjakEkXiIiDjZi-iIi!j6iciNi_j<j_kFj^i)jvi5i&kgj<j=kHj-i}j^iGiYk
+ekFj8kIj[i>j,jek1kgj.j[kLj\i-j=kKj|icj>j{kNj,jckHj+kJi5jykqkOj/
+jCk8kgj`k`jGi1igjZisjEkEjskYisi(jiiLitjCimioiJi$jBjqjWiti?kGi9j
+WiHjajUkpixjEk4i!jKi$i6igjVjZizk7jKiXk8i8k1kDj#i$i(jhiQj'j<kSkH
+j_kpkgj_jXj'j.kUkLjFi-kpj!i[j&kVi<j&iTiGjJj}irk8jnkaiIitigiWkCk
+Uj:jajljWiriGktj7j$kwi*k4iIjzi8kkkAidi$jkiek4iajnj{j>kBkjjNi;kN
+k2kpjSktigj0kikYkxj=khj^jjkDj0iTjAkmiDjBi2iXi/j^jokuj~iRixjakKj
+fi`k6iej9iyk9kEi/joi3iFiuiljkiqiFk9iMiejNkYjwjjjNiAj!j)jij7iEi<
+kekJj7iGjaj_j$i;iIjAkRk6jZi%iSjwj6i,ijiVi9jvi^kbizjKkMj3iKiziHi
+Bi=iwi)i<k3i)iairixjvjpkmkBi}i$jjisi!kQiJj5i!jykJjljsi%i?iyjojt
+i)j>jJjojui+jXi8j%idiViFjGiNifknjljwkLjej4j]jwkFjoihkJj|i/igiWj
+9kIiIjliDi6jJi$i=kEinkKi/j2iAjhkLk9jYi+iSibkQj~j<kfi-kQj`j]kNjQ
+kQj!j(iYkSjtj2i8j]jGi\jEkij`iJk8i=i1i-jai$jjinijinj~i*jZkcjoiPi
+^iUjlj7ili}jxjdkWi0j@jJkTkfkSj-jEjLickTj_jejQi_kTj=jpiYjLjvjzis
+kJiAkGi{jQj3kIi|i#ijk2kIi|i%jui,jJj~i%i3j3j=jYi=iOi[imjwi]jgj9j
+<iZj+i^jXjRkqj:jgj]iwiGj,kEj}j(jgj<kIiwj(i!jmigjHkci'i%kjj`jwkE
+jniBjhiGkpjTiyi&kgi0jjiJkBj#j^i_i2iniIi>jiiVj`jwjvj)kJioizjhkjk
+XiKjHjBkkk!ioj.jBklk!jiiLiljwjziBkWiIi#jvkBkUi|jBj3j]jXiIi#ikji
+kdj#jjkCkfj|jYi_iGi6jbj;j'jui\kYi3kmiFk#idjEkji2jri+jhkfi7i$iQj
+|idjzkzjyiAjoiuk4jzkEj%kOkzkciMjVkVi^imjBi)kTkVivi|j\iwi+k5jzkb
+j2jpkQjakgi_iVkUiGkGi+idj8jEkHj-i~ifkzj_kLiwj*jni{iri_ioi'i@iIk
+Zi:i3jVibjUkUj+jbjVi6i*kFi+j0jPj"jci+jii~kIkPkFi;j@i8jHk0j~kCi[
+kWj!jIk3jPjbkJiTk0iEj~jIihi^kcjYi_kLi1kVi|i*kki,iHiMjBkkkgi4kNi
+[jNj`j=kLjmkmivkQk8j;jMjFjzjJk5jCjAkCjLjvj!j1j!k9j.itj?j|k8jAiV
+i~kai0i$j1j:krkLi%iii*i7kMi(jWj)jdkNj%iVj1kaj#i*k8iKiQj'jJj$k$i
+{jokukoili-jOkviPjii=j6i$kzk@jZjWi(iWkBj<jXjjipi?iRj#i_k$krjVkF
+i*iAkJi.jVi*jSi,iukqjqiqkzkRi0kwjHi5jUi~kkkdj\j@jlk`ksi.j_kiidj
+Sk2kii9i=ixj#j*jzi=ipi]joiCjGivj"i+jDk#kxjtkSkSjojliZijj~jaiykx
+j;kXi-i)jPigj7iGk!i2jViukKi}jCi/kLjMiGi(iVi;jviIjhjoiVkIj$kejpj
+mkcj|knjKi%i'iQj"i\jli5kpiAjLjWiQi;jCj&jkjdi7i9i$j"i@j|j9j*j%i1
+igkbjvknk0jGj{jbiWkGkejlj)kajYiTi\joi^ikjlkCi^jik7iCiojDj9i1j0j
+"j!kbiTjmkkioksiqiwixkijmk1j:j_i^kijDj;jSjNkHi\k3j~jvj~k9imkcj1
+kzijkgkPi<itiTjXj{imjnkLjdjWi-kij<iDjbkYi)isjvi-i)iekniaiHiNkwi
+rjPiGk!jnj-kki9kei7i&khioj"iBi+jHj5jFi`iKi%jai6iDjti)i%j?ioiMkm
+jTkajgi~jQkei*iRkpj;knj`j7jEkQiQk9i"k!i9kgiXiBj:jwkfiVi6i5j6jGj
+]iLi>j8j2iPj<kejXj+iDi0jviRi{i2k8koj!jAj7i,jVk~iaiojiinj4iai}ki
+kai!kAj]kwiQj*iXk5iei,j=i+ihi6j,jWj#jdi6k@kMj?iKjukqi7juiEi@iIi
+#j|jwjVjVj]imi3jcjNjTi=i|i#itkQj*k9i7j?jGkJiOj$kNj{i!j:kHjKkAjO
+jbkek7iZkDiai&kUiTiviribjkigkIjujUkIi4jMjbj:iai^k#j,j_jVkYi6i*i
+Oizi}jojkkGisjBkgj*i!iwj"jaiYj/kwkAjQjqjuj!iGi&i]i^itjXjyjfjUkR
+jbjskAjQi]iAj:jYiqiYi(i6j@k9iFi%jciCjvkwjHj7i|jqimi+jXjRkfkFj{j
+gj<j)jaj"iZi{knj%kHj`jMi^ijirjFkek$i7j,j^kikXjojJjQj3iBkKkyj4j~
+kqkaj;j#iritj^i*j:iEjWkokXkZjEi~iNifi*j,i_j!j]jEkJiwiYk@jei<j2i
+cilkHk@jditi4jpkMj|k#i;jui=ibioi7iGjWk7jTkIi4jtjAj"i_iWjMk6j5j[
+kTkQiWj;kckfj[j0j8i[i>ilj[i,jJiCjyjZi@k1kAj(j4i;i0ijjdifi3iVick
+CjojIj4i9k`jkimjgiAkZjQjzi0jujujVj+kHjVjZi6kgjki$k`iNkmjukVj3j9
+iYj]jhj2iViqi(jai7jakBj&iQjFiii(j(kji4k5j>kMknj@jkigk9iYkfkyjai
+UiBiJkQj"i#j=kOj$jTj>j?i)iziTjEkzjpkOkZj0ioj_ifi-i{jhkUjviHkdk5
+imi+j"juiai=i~j4iBkmjCkaj+kijNjqiKixkxi2jJjDj*i@i<i:j]jEj`jfk0k
+5j:ixi:ksjPiUi'j#khisi.kbjgi4k~ibi'jPiKj*iJjWjOjFjVk2kgiajBkTiD
+iukri:jHj:iVi\k7kikKjLkOkzkgiHioigjyjBj7k3idkIkGj8i%iWj7kOkOjij
+titjWk3iyisj)kBj=i,i]iwi2iBi6j}iAiVikj:i/jVj5j&k0ibj,kLkbkCj8kv
+jEj3j'kii_jhj)i"iGkPi-j0iVjYiAi5jpkaj.iOj<i>jWjAjGjijVkXixi&iMi
+{iUjEjpkik9kXi~j?i:i{j0isi?j2iVjyj!kjiQi6iLjYjQi!k9j(jti5jxkSi4
+jaj+jqj%jOj:kZkAkei=i7joj!j5i%jjiMjpiZkQj<kBjAk5iZj~k8k!kHkjiyi
+4i.irj&kNiUj.jxirjti%k5i1i}k0jki-jIiCi(juiyjui6i"jui&iOkSkzjii7
+iHkLkFkTj`itj`j"iki:i.j>joi=kJj.jxjpk$kxi<kdiiiHiVk8j+kTksiOj6i
+2jHi&j+i4kkk7k1jbi6iRkSi-j/kxi/j}jijajejnkriOi(i#ibi3iqkFiBi)iT
+jmjtk~jKiQjai&ici?ipilkykcjYiai9kLiok5jujRi!j:jei<kDjXkKjDj3jGj
+6i"ifkrj_i:j'jBi)iYj`j[i{iCjWksiSi_j8i4k2jQj%i!kGj[i]i*ioi+j`jL
+jnjTjukHi7kEi*k~kNkJjyiGj.k8kBj$jLkHjYiZi!kji=i@iCjEi7i)ivi8i8j
+Qibi-i_k~izi"i1j}k5jTjujOkejmiAj,jpjuj'jUkFjUj>kWkjjxi2jhkGi<iX
+j<i!k@jcjCjoi#j~kCi}j=jniFkvkGkEj+ili/jjjfkcj>kaj=iejxiAj:iHj5j
+*jVj)iBjZkWkak3iRkxjWkhj"k5iwk$iZi=i'jkiCkji4jti6jyi5kIjakmiej@
+kUi>iekli9kSi+kikmjwi`i.j]j}i\kRjHkWj&jlj`jFi9k8kikTiEjxiykKjZj
+%j2jTj?k4iVi^kxj5jPj>kJjYj6jmi.j2j?idi?j$jKkpj]kdiIk5iVj8ibjTjb
+k`kTjgj+jBj`k5jIklk`kBkxj}jJj`ihjgitj:iCjyjsiJjRkTi"kvjIiVi;j8i
+Rj&jCiJi0j|iWicj\k8j'jAj&jnkCkWkkjji)kUjPklkXjlj&jAj.jZkIiCiqkn
+injQjoj~k8iMj~iBj+isiRiRi5kHk@i#i6j5imj-j6irkfj@jFiXi7kzkEjej!j
+|j/ihjgksk@kgjLk~j]j=i2kmj3j~kxi0j:j_iZj+jfi7i8koi+i^jmj:jAjQiE
+iRi!iMjWiFkaiPkijNj;i<k$j[kLkQjekLi=kdj#ilknjIirkJj]iMi\kBj=jti
+AkVi9irkOj;j5i(i{i2k9kgkZktjIkBj^iYkZjzjakYj}joi`j[kWkWjdkLjzkd
+kSjqkEicj&jqi:jIk0i;iQi_i%jki'kxi/iqkFi%j/kGiYj}ixjJieiwjhi.i.j
+1i]jtj1iWi^j3iykJjHjni@i6iOiBiujWi2i{iri#jii6kvi9iLkFiQipiFiRki
+kbiCi2kaj3iTi@i/jvi8jpiGi>i;iUkei\irjVi\iIkejFkIjwiMj]ikjCj>k8i
+5j&kzi`iOj*jGkmj/iYiOi\iyjfitiQipikiziSkejaiBi9j3j(j.j7i+j?iEit
+jci\i&jZi)k5kpi0jzi*i&jtkxi<k#ijj0i1iBiujqkZi=kDj3iBkdk6irj4k6i
+5iUi8i0i_iwjHkykWj7i>iBj8iDkZj9kziuj8kHimiUi~j$jniMj-iVi*kLi[kC
+iDjJiHi\jOjZj3irj2jKiBjGiEiDjejyj9jrj9jLjMipjZkwj*j5ktkIjHj}jGi
+Bi5ijjOj!jlj9ipi;j4kCk6iSjRjpi=j.jujZjokMjnirisiCiQi@jJkxkdj9jz
+kQj7j*jKiEjTkei{i&jJiHiVi\i|iti6joj6iwjki&kMiJi"jniDi7j;iJkQkoi
+Silj-iDibkpiBjvjwj7irj9j5jJjzjRkEi%jTkBj<jRjPkxiBk!iui-k0iFiDkf
+jtiqj?k8iCiyjDiDjximjIkikni%jhimiNirjviqjBi;jNiAi>jLj-iyj3koj?j
+Hkcj_i+i&ixi2i6jtiDini1i9ijj<iHjNiBjNjKjHiCkJk8i)j`j.i]ini@i&iR
+jwiYiQi9jCiFi1jRiSiwjqi>i.jqkdi4jsj[jGjqj)i3iNirj:i3iZi2jrjsjni
+rj4jtiAj|i3i~jsini7i9jEiJj>kei:ikjtivi,k9jUj?ipjsi,i(jsj_imjuj(
+j*iiiCknjFkki4iJj2jaiMkKiri"iMkyi]iFiBj4kMkviAk3j<iIk5k7iYj?i)i
++jckejtjZi6juj%kajvj8k9jvj4i%juifj$jkjzkoiBkbjDi7kii*i}kikKiCj_
+ixiDj,jJjljzj3j6j"i9jJiZi1jMkiirjPk$jcjRk6i9i?iOjWjFi!kYi(i#ibi
+6i2ipi9jUj4i|k!jyjtiukFjdjSiDizjxj^i7jfjziIimi)jrikk5jri[j)jxi"
+kSiui&jdjFjjkfi(jljWiZjsi:j8k2j<iTj'iGi}ktiyi9ilj)i]iTisi}jxiBj
+NkxkFiWihi>jzk4jKjzi}jVjzitj/jzjki%juj(ili3icjZj4kWk6itiTk7iwkw
+kejgk2i#jAiLi\iIj2j>i`iLkejhkDi9j1j^i9jWj8iFjWj}jWi'jwizjDi4j"i
+Xk4k8iCj2jui-j2iBjxi\j7iWj2jEiNj3jtiBkQixiJkYjFi6jgkai5i)i)jzkn
+jcjzj}jdjWi&k9j~i?i:jYi}iCiBjmj/i0ipi|j9iLj?i2kpiEiDiFj$j3koi\j
+XkPkXjqk#ivi%i~j>jmj9jcjNj,jLjBkEjLi^kUj"i$i4kYiRkUkwiYi=i4i7j1
+i*i=kHitiyj)kKjPi3jKiqkai4jgjyknjGiJj3jAi>ibjWjfiIjYiEjzj!kykKj
+!iyi%juj5iEiujai;i`iei\jIkmj.i|kjjDi7i3j$iJkYi4jgkNi3iNi|jwiZi9
+ibi_kQjQj!kAiZjWici?i$i6i5i$i4kSi_j<j6jekaj*i{iSj,j0iojHiyikiri
+0j?iJi-jxj<i3kJj;j4ini;iPkjkfjmi/ibjYioiViFiaiKjBi8jMi@iZjeiVk3
+i6i(kNk6i6i%j8i*iUjHiJiFijj5jcjni9ilkciriVjmj!iVjdjDi$i?jhi^i_i
+@i&iKi@i4jLiHiDijjGjpkMjEj~jDiZiQjtiyk2i%i&k1ixiui&iDiMj]j?i"kI
+kpirjEjwj(j0kzj(igj7j-kvj^j-ksiDj)j"jDjlk@jpi[j<k8i"jfi;iJjekyi
+Bi#itiIkpkniPkMjliIi#j^jekgj=j9i@i?jBi3jMjzjOj'i~icjCi7imj,i`i9
+isiCjxjGiJiZi1jEk8kaiAjNkvi]i9kViIk3j:iBkSi2j@iGi3i&i.kYjVi2icj
+*jvjRjzjxj'jxjzjRi~jWiViqjMj;iLiwi@iPiUj;iviBiDi^jxj*iVktkdjnjr
+ikjPk1iDiQiOjDi3i1j+j(j.iKjqj/jRiXkFi?iXjWiKi&i[i4jvkEi$itiei,i
+Ji.i3iCkqjIjAi@j^iCiokziskOi1jIj[i2jLjtjMj5kDjMjRkHi5iXkrk~iWkJ
+jXi)iOjFj$i!kFiIjYkGjZj'jEjniFj6i<kEkpivi`kxiTiQi@iBiIi<j5jIjRj
+Pi"icjhkti5iVibk`izkvkTiHi@i4i}irjEi*iwj^i*k6iKiCj:j-iDilj(iVi4
+jxj2jkjyi.j8j;iViYkFj{j'jJj|j<j>j|j~jnj:jWjvj=iGi<iNjXkIiDk7i_j
+kkfiriziVi;i:i'kpi"isisiCilipj;k0kgi%ivkFjgj]izj[ipj'j}j*j5j:jM
+jvj=khitj)i3iuiTiYk7iQj]iKjRi^kpj0ickbj:i#joi-kRkaiMiAj=iMjziCj
+Hi]i*j<jJkpj.jGk8j.jDjnj<iXkWjQj?j(iNjRiuj.j\kxiPi2kIi#j3iBiRj.
+j*j0jkk7jOkni8i|kAijjFi_i9j[i!idjli4iLjfjkiWivjWi?jpj(j/iWkoi#j
+ijSiFj$kTjuj\j$jIi3jZi1iRj_j+iHkAjtjfj&jvi[i>i,jJinjXj/kri6j<jg
+kMj/i}kxj/iXi(i6iIiGi~jgkpj?kuj3j0ikjliCi|iCiui&kpiJjMjti6jSk6i
+Sili_jPjNkUjejXkPiuj,khiujWjRi)iPi\i*j=jni~jdj<i!k@iGiZjRj8iZkm
+ijiCj#kWi5kTkwi5kYk9j'j|kTj{jKidj<j.jSiukDjYisj/jYiLivkHi<kii*j
+ejxjoiBiAiji.jUkwiAi)kXjninjDi}jei"j`jpj-iTjIj&j~kBiWj[kFjfiskU
+iWisjWk~j5k$i5iBjBj'jAksjVi(i[j7jjiIiWi!kCk8iMjTj.iKibi2jJkAjyj
+}jujej"j:jQj"i]kMkki0jvj=jJjti%j.jEj7ixknklkMi3iBijjwi]jUi2i0k6
+j-kjjliai3kijDiQj"kUj^kRi"j"imieiEiaieiqi3k0iUici+kjjwiCi}iakGi
+CkdkciYjBjGiZkCjKiTjxkvjQj`j(i%idj8jmjskzj'iPiMkoj_iIj&jvi<koij
+i;iJiRi$iYj_kKj`k@kyiVjaj<i%j8irj\i0iHiui4j/i|i&iliwjgi4j#khiLj
+[i0iMkoi!j~iUi/jTiUjWiVi2jfkaiAj8jljtiCj{j+ickGiviek7i)j4j6i7kX
+kRi]jakMiqj]jciMkAi?j|i'j.kbi4k8kpjGi*kdkJj%iijzjmiFivj;iVj=jvj
+tj!kQi@i'i)iBi2kdjBi3iaiMjHj[i)iYisj^jqiLi~iMi9kdjFjgkdjDj9kdi8
+i3kfjAj)kdjpi6j}kpi:i*i.k7iYjtjJjcj#j-jCj?i;i"iai#iYkdi7i0j4kGj
+Ri2khkii.i+kmjwiMiSj\j{isibjDjsjjkwj;iYi2jEk4iliNiziriUiei$iykX
+ibi-kki1iCj|i;iMkcjIi,iOj{j}kSiWj=j;kAiRkhjTi@jvjtiLiVikiNj8i2i
+Rj.kJj+jvkviPk$jDjQipiGiCiTixj^jqi4jxiVknjfiuiCjRi,iXj:iokAj7kB
+jTiRkSjTi5jMkAjPkUjIi7iHj^i3jSj;j{iPjYi#ipjJiykFjOi2kCi)j~kLjHi
+3iGkPj^j[jgjPjykqj4ilkjj.ink@jkkrjgiVihkpiCj`knj_isk6jyi2kLitk5
+ikjCi$i)j~iXkgjOj,iDiyi6kniykmkXj^j]jgj"kUiMivipiSjjibiYjCkeiji
+!jajmjci~jDiIi.j(iQicj:iri{k9i%iai\i{jVi|i/kbi|kCjJiVkGi`khkpjz
+jYkAi@j+kdj>kSjGj<joj>kSj<iYkFi+i|jAkZiLjViniEiukxiyiGkgi:iHkhj
+XjwkhkHi#jMkCiCiIkGj*ikkIi}jmj_kxk!iCkAkFjfj;iCj(iQi'jXiukvi&kW
+i1kikti#i&jijuiIkGjZkHizjhkJkzjZkJj^i2kLj#j%kdj5kIivkli2kDjci7i
+Pi=j7j+j:kpiCiZkni<iCjTjakoj%iTjCk~i6kMjniujskqi;jGk@iZjUkji^jC
+jhjLjMj{jBjYiFi~j<jnjoitj$jqkni1iMikkUjDjfkBitj4i@jAjuj4iBj@imi
+7j8itj"jJk`kFjLk`kMjOkokOjNiskNkyjnkDkaj[iIj.jHiMk9imjtkAj-kjj]
+iCjPi{kAiQi*kYiHi7jDi6i1j&kMiFj_kHj=i[kJi'iJkNjPipkPi.kbirj4iki
+yjhidiJjJj8iYkLjliIjDj.jYj7kwi<k~jHi!k7jFiPikjgkbkek1kHj+krkikc
+kri'jMjTjqiKjKj?kNj^i.itkxjTkPjEjrjEi(i|jtjzi`i\jMjOjkixi9j*k1k
+KkajUi;j}jUi8k@iYi)kgj]jJkQiNkPkciriNi?k5iDkCjniIj}i6iAiZk5kmjP
+kRi&jXkaj^jxjwi#iti\j,ijjhj|iji~jTkZkrkFk6iSiEici}iBjKj;i`i-jGj
+Ajbi"i%kYi$i9igj'jEjgkLiLknj%iLimi,i~jai3iUk1iaj&iJi{jqiLi{j#iN
+iOiEiPjii<jrj;i6jriji!j!khi#i=idjci.i/i,kykBkBiSi|iDkTkGi@iUi\i
+=iSjzjviukskHiok~k3jGi#kZjFkwk6iljFi&kfjSj)j&inj+ijjSi2j^iQi~kP
+kIiCjZj[j6jRkyjZjCjMjijriXkJizj}j/iviOjsixjii'iPk2iAkIjti`jbj{i
+]iEk1jBjWjDj7j:kQi=kJj"i/jekPjGiAizi9iKjQkOiWk0k5i<k2izjDj}i?jF
+kCiskoj8iyjWkajGkSj)jhkki|iNk@kfitjgjPkIiGj$i0jLkZjSjOkZkKiIiTk
+Zj;jWkRjBi#kTj9i4i0igj3i.k1j*jsj~jIj0kij.iBj3kvjsi0j;j]j/kZi0jh
+i"k6j2kwiqj,j/jakdjUkRjSk#jUk8iYj[iPjijniqieiEkskXiIkgj/iqikkLi
+<kPi<jiizj)iIi?ioj}j/kAjUiVjTk8kkk#k5iPkYkUj*kzk6i,iojIi,koi"iT
+kokBiZkFjKjli;jwk`i,i(jDjbkkipiliRi]kYiYk2imkTjtjTkrjij=krk4k1k
+5k0i~i[jlj^irj8iMjmjzi7iYksjVirj&iojakPiWi(k$kvi@kmi.itkpjHk6kv
+iTkTkBi-ktiWkSkuj7kzk6j5j*i(jejfjXk2imiWjvkakGkai"iAj*kTj=k6iDj
+Qi^i%i+kGinj:jfiOkZknj}kAiAjBkCieiUjWiPksi_iXkHkdkIi$iQj4kojgi2
+kbiIkQj*iDi9i7izjBjpj'jti;iNiDjvj.i6klkHk6jhkTi+i#kyj^jFiIjPkpj
+>iCifi3kNj'i[ipj.kGjukoi]k9kHk8kBj;jyi~ihiEjZi@kCk`kBk3iZk$kKiQ
+jBj=i&iUi<iPjqjqikjSi|kOiQiYj?jui[jZj9kxj<k9j8j5i*iNi=jWjfi}ibk
+dj9j0kRizjAkyi)j4kWi^j%iiiyjDjsiHk8kGi4kajEk7kajGj'kGi3jskPiqi^
+j8iNiLj_j@i\k~jCkukkkui8iPj*jMi`iXjlk$i,jOihiEiwi9jgi{iRk7i]kPj
+Gjrk`i]jSj4k4ikkPjhi2kvk8ikj[iMi{jZj(jgj0kWjxihkYjhigiljzj@kZko
+iJjEkjkxiyj7jgi=kzj+i9iBk@kYkajzi7i@jniRkziDjQkqkVk1kzkCk~kwj}j
+zj]j@i,jzk3iAj5iti0jDi(i3i;i,iDiQjmjwjDi:j!jfj,jpiqiXiTjmkXkxib
+klkzkbjPk!jxjWk!jTiSk#iWjHkYk0ixi7ihjAj9izjeiTjHi>iJjbjIj(iLiHi
+%kakhi6j)ioi~jskMk@j[k3k6jvjBiUk9j1j3i&i7jyiijlkpi*igiIivjakAj|
+irilj9jTiIiwjekmkmijj6j9koiMiyjmkEj#jDkpi0jUiKixjAjCiujKj^jliei
+MisjAi!k!j?jCkci%jUiqi'kkj7iJi;k5i+jXivjhk2kajWi;kQi{j!iYjPk#j<
+ibi#i*jUiKiTj2iOi^jXi:kSi|j)i[j`i~kjiZjwj_i\j_i,j]jikbjXi,j[i|j
+=i^j/j0iniLi<kqkMj@icjmkmjVk6k7j^ifiMitjekaj_i1i$jmigj/iqjAk9i)
+jVj6j}ifiJimjhjsj<jliHi*jTiLiwiXjXkiiri$j9kpj>iykXi5j*knj>i6i/k
+gjxiSilkri_kzkwjakCj`iYkLkAk!i/kyjckGjni$jzi*j`i?kzi|j,iCi&i%kq
+j_ixi*i$kbiFirkCkui"kwjBk3jUiljpk4j|kRjVkuk4kmiOi6iwiMjXj^jCifk
+kihi.i`jZkkkxjGjGkTkJj$i]j/j!i&k`jbkqkPkjj1iPkPj'kRifiJjAifilih
+kNjzi*igj6jRjDjokij5j|j\kPkNizjckei>iPizkuk3iKiziIiTiRkeiTjSj9i
+kj\kmkFj'itiqi@injWi#jCi@ipiPk9j=i@iai8j*i}j)kKjgj#kTixk4iRjMke
+i2jtiEjviji`kbjCjSjlj9iIk!jfj_j9kzjcjnkUi~iKjCkukti~j%jaiAibioj
+'i7j[iqkdj+i4kIj;kdinjLkyiri)kuj2iEj:kekqiTjGi1iTj3k4i2j+i4iMjV
+kUj5j|k#iCjRj$iXkpiCjvjfi9jqi'jmjBi3kbi2k8i)j\kmjAjGkCi)iti3iMk
+gj[itkLkIjqi)iwk3iXiqi[kBk4j*itj.kKjAj#kTiYjTjsi$khiYk0iojSkUj$
+kzkgj,jtj9j4iejnkekaj,jXk`jciokdj)iuieiUiMjCj{iDi{ixiQkbjwj{i=i
+tkZkyj[i[iWinkzj+iWjjjFjcj$j>kmi+kqj$iUi]j%idiwkdksk7kUi2kkkqi;
+jckaj>jEi0j=j|iAinitjtkmi}kBk!kyi.jliJjwjFi>jnj/ickVi>jpjNjeifi
+piHiki"jdi<k4kgj^jykck3jijTiaj}j.icjukUkkkwi)jmjBi1kViqjeidj]iA
+iHjnkCkLjpjFi+jIi&jJj6i5kVi&jLjtjejJjijNjljckKinj'iVj+k6i-k8kgj
+&idi2j<igkHkRi2jqksi3jQi4iIk#i_i+kgjqigjMi\iUj4kgjnj=kAjNiFj{kW
+k7jJitkKjKi&jqiWi<j>j.iMi'kmjBkfjqiejhjVj}iAi8j%kUi~kjj?jGkFioj
+gk`i_jxkpi!idi?kDi%jWiHi<iHk9i1k8kzizkRjzi~iGk~i.j%jSioi,k9kLja
+j,j_j#kcjcjGj5iqiKi{j{kti0jSiTj4kziYj3jCi$jckjjqi2j:kti^k!iIjXk
+Ijmj*j,iWk~kqi+kHi<j&i|j>kPj)kHj{j,juj~k~i-k0i#jOkDklj8i1kojxj/
+jvkqjXi?ktjdi=k!keklkkiaj'idkcjZi{iuj_i_j,k6j0ksjhkekNjwjOkwiti
+Qj/k0i)j"jnjCijiTkVi_jXjKj|k3iMjxjci|j3kTjqiajgkPj0j^kwjli'i,k9
+kEiqi(j1jFiXkxkRiqj/iYi)k0jFktjDjJk2jFk0k!i/iIiHkcjIjej6i0jMiri
++j3i8jei=kTjSk2jMkzkfkmkqjIibi3j%jVkPj"j"k3i;kxjPk`ibj&kWk#i@ku
+kpjji}jAiJiVkDkei~k$kMisiRiskbiijji+kmi8i[i2kRkfj9ioj:j1j#j4iEk
+wjci0jriekwi=kDkekLjWkvifkEi!iniuk4kDj)jui!jljWjrjAkVjdi>i@i_jo
+j^i8kni9i\iyjNjTjQisjujtkTiFi*iziTkOkEjji0j4jYkWkEkRjDiej{ieiki
+\kMi7j#j]jCjhiSjGjlj(iMi)iAiDikjbi2icjnjxkyioilirk0kMkQiUktjQke
+i&i#iujskNiRiei<jSiji;ibiZiFi$i[knjsjQjyjEk7iDiZiHi^iZj!i-jAjdj
+=kei_iMiDiBkpi+i]iTjKjlidi\i0koiMjziXkSi1kziLiMj[k4ikj]j7jKj|jD
+ikj{j%j-j_iIkdi2j=jsjqk0jYk8iNjPi4ixiKj?jkjIjBirkAkoi<juiBi6k7j
+8i=iwiVkNkmk0koiOj9jQimiTiIi@idk`k7j:iCiDkTiriRjIj<joj~iGjVi-jk
+kZjtjviEk7j^i?iajFiCjuiqi%iUkdiDiIkSj9i2itj7j?j*i_i4jDjwjEi{i%j
+!keiAiniTi6isi+j}i{kXi-j_jkjujzj~kvkZiUiUiDi+jli<i*jAjeiki\i^i{
+j(iBiKk1ifi1iykai,k6kXkJiHkoimioi&i6iBkfifiEkWiAjhkKj}jViWkwk9i
+xiDi%i+jDjRj8j~kZimkhiri-jyj,jriEkci}j1jDkeknj~kyjzi\kGioiTk#iK
+kgjgkOjWi~k5jHitiri{kwi7iVj"iCi{j3jMkQj~inkBkgi@iBi5j+kNiEkbjPi
+Ki1kei^jkkyj%jZkjjRiSiei-kIi(iei,iAk`iai_jTiwj'iBkUj#kcj!jikrjE
+j$iVi\kRi-jNi-i}jxi|i8j(iSjhjRk0j~kJjtkwi9i4jekgj$i|joi0i#iti-j
+diDi*jfirjnkMjCkxiAjZkujrjlj'j7iZkji>jXkIkJkijwj=i-jDkTi;jrjmjy
+iAj$iUi~iHkSkKjlj{j-isj<jCkajjiBk6iai"iAjuj]j8j7iai.j|j7i]j*i4j
+ni|j=kgi4j+jhkzkfi"k6jRj)i[kCkJiVi:i[khi)j*j>iOjtk4i5jHkXkYk4iI
+jbkfj+k`i%i%i1idk`idjRiGkQizj3jojhjQjIjHkUi|i1kUiJj"i{iwi5juj.k
+qjakuk~iRjTk!jZj5isjEi-jSj)jIi%iDi~j*iYiFkSjai>kWj/i_jpiokTi]kO
+khjgi+i5iLkPjWkAjyj>j:kbkqjhkfi#kJi~k7kdi*idkFj=i(j_j>iHj-i6kdi
+Sjhiziak3kEiki*jsj+i4iyjKi\igj'jkj[i"iIkMjyj'kJkBkrjHknjmi&kTkw
+iwi-kqi1jQi^jwkfiAi<j0j=jyi4iKjoj>i2jMiBj)k1kHi$kIi+kCjEj)j[i"k
+skGixj&kOi^kKjPkvjYiFktjRi-i4jEjDidjmkyi2juk`iMk9iSkUibjsi%kcj5
+iBiKkckgiTkAjoj)i!k#i$j)kUkKkWj>iGj)iSj9jni=i,jZjiihiUj3j&khj?i
+>j:j|i-knj5i*jtjtkhi&i{j*jVj,jViFiri2kyiajCkci)jlkTjeiyj,iwj>iR
+jqi8khjljPiYi-i!j9i?j;jEkCjMiOk2k9icj1jiiLk1i}kej6j~i"iOi%i0ili
+@i\kNj<j[jnkei|kNj}i<j!iQi,irjokBi0iVj+j5iQj=kGjPiXjKj%iTk~jGiw
+jljyiJkmi~jJj%k3iekbi%k$j*iNiMjBj{k3k@jiinkhjCkjjFi"j=jRj-j6k!j
+9jYjEjWkBjMiKi"iyiLi@khi~jCiZi]i'kajfkgjBinj9i9iuj,jjj'kMiVkNiX
+i=j.kGi]kjiui;kWk!jXjRi)j7i9ibkNiFk`i+j%i1kwiyj+i\jjjnjqj$iGjFi
+xiriZi5i.iKkjiakDi7iYkLi+i8j.kKiqkjjHi=j=iVkHj=j`j_jLiui^idkCj}
+j)i`k~kFiUj%iTjQjUjvk@k0j@kNjcjdi?iljXivj]kSi'jbjCkKjxkOkmj~kVj
+.j`i#kJjtkFihkIkqjdjbk3j)j<kgiBjdjFjBi1kcidi0k@iDkakVj$kqjFj>j=
+joj8j,j]jhjmi/jYk2iZj~kWkjjvjmiGj8jGi{i~j7jliUj}kViFiIj&kXinixk
+WjljSi%iXjEiAj'j#i%j"iej^kFk2i:j<kKiZkQi"k3i(kfj.i_itj0i|j0kpk4
+i/ick8kei(j|kQkljAibjujIj1k7kNjsi6k8iPj7k4ihiTj4kAj5i$k5jfjjjNj
+jk0j~iGj/jLi'jDj!jFj!kujYjFkqkJkTj9i>kbiSi?kni)i<iDj$jtjnj>k5iL
+jTj7jxjXkki{jTi%i9jikvjXkxiXkli,j/jMi#jJj!jHj~kXk0iniaj,iBjVk@j
+8iHi>iFkci?j.jDj.jkjekTjVjfj`k9j-kri3k8kaj(iRjBj{jFk1i5iLjji9k2
+iBkgktkxi/jUkri*igjti(j)jyk0iIkQj+j[kji~jikAjligi3i'iNi'i2jPjWj
+MjUj/jAjJkEi+j!kwj.j.k!kZjnkoktj<k4i*jYjSj"i6ifiHi$j|jbjuj?i6j<
+j*kFi/iVk7jujakgjTiYj:i:kUk0kSj}i7kBjni^ktinkjkji!kYk1kdj7j?j-k
+Li5kNjji$kyj,jukokakgjAkgi%i=jvk9kokFk#kNiEkFjwjOjgjgjFjrkCkSjz
+j,k~k7k9jJi\jEi,i%iLiYiCiUj[iMiejYj^jAiHkojfj7iXjTjlkAi#k0jdknj
+\injGkVjFj+jPj.jdiPj1kYkpj@k#kPiTi\i\kki7jHiji1j*i.kmjQiKkRj"i1
+kwjsj5k9j4jQjCiJiai$jLjrj9kXiaj|jRiXjXjYklk`jFjRkUk`i7iciRi7j0k
+pjsj|jSiyj@jEj,j`ijitkni!jSi-jliJjWjtiejsj|iOi^idj>j$k7i7jckpiU
+idiEi7iHk!i6iIk9i6iek!iVkoiyjxk!jKiBickTihiEjSidjojnj,i)jmj|kPj
+2j`jcisigi(iziJj:jQi~kSkhiXk~jvkni]jei#i{k7ixiXjLihiFjdkmkniiig
+i'iciBkokEi2i$i1kkkSjLkij8kSihiti5i3kdi\j5j/iqi`iGjOi`ibj{i`ivi
+'j=j'jni$j#k4j/jAkhi#k~i1icjTi0iyi(i@ihifk6iQk5i9iejtkRiHk0j5j-
+iEitj[kljsjtjAjuj,iei"kokXjNkoi+i?i%i=jRkpi4jlj5jUi2j`iCi1j$ihi
+Biziridi4kLjtjukcj+iakki)jTkZjkigi!i+j!jKjviXixjOi$j`itkbi;j*j[
+iai:kbj=i5jtjtkSkajPi/jTkkiAj\jak7j@jwjFiPjskoj=kmj3jrjAkYjUiri
+|ieiki;j%jckpj,i%j{kji*kIi3jokii3j,iqiEi`iKiBiGjfj_kxjEiai!iKjQ
+iKijj/j8i>j^k6j3i6kfkXjriBjEibi$i4kcjmi+kbi<kAibjpj*i3jFjTi3jak
+yj?j)jDiNiQjgiRjWi3jri}i+j5j4i)jTiQi1kli3j[j@j0iBiAjzkRidkejvkj
+i|joi^jEi%kbj2iEkei,j<klj4kqizkVjMjUk9i2iLkNkFi7j:j[iCj&jCj5jBk
+Ni2itjTiVj9i\iMkwi9ihidjmiaj+jLj-i$kAirjnkIiXjGj{i2jujwi2jaiXj@
+j]iZjTiBkOiHi&j3i0kei"jqj5koiLj/kej5kIkTi`jRkMjSi-j+jVk@iskfi8k
+Ti-i7k~kfiIjmi*iRjMitj8keiLi;j'idjtiqj{jtkejWj%jeihiCkGkokoj;kp
+iSj4iBjWiJkciGiEkfkhidi_iHkOkgiFjmkck2koiPk5i0ibkRj3jTifjeiVj3j
+2iBk9i5jrkjkEj-ijjtifj{iKivkzi@kojCjgj[j}i%i1j&joi0kii+j#j\jOif
+j6iIiOkSj"jYj0k9i7j>jkkmi>jRiKj/iyj{kckfj%kGkgiJk6jvivj!kAi_kgk
+Hi=iljXkAijjmi*k@j^koiUkYi1j*i=i=iukpi5jqiiiYj4i0j&kpjtj5knidiB
+kbjKisi!jWiziaiXi)j7i%j=kej<j&kgi4iPjakaiAkJk8jXi|i"iek$iAj^jQi
+}j<j7idjvjRj2j`k8j|jtjAkTj<ili;iCj7i}kgi4iekfjDjGi[kAjnkCk5kaj]
+kQj7kCjzj#i[jPj"j(j+jOiYiFj;iKi(i/j*ifiziEj1i1jqj7jCiuj+j*ifkxk
+`juj"kai_kSj~i{kqi|kDkSjwkBkujli*iXiBiLj=itiNk9j+i_iki;j^kFjNi8
+jUi+jVjVjYi)kkiyjzkkjkkjiij%i=i=j6i[j}jNi]kti-kEkrjQi]jPiJiei;i
+rjQi.iXjQjTkMi@i0iKj+k!k`jSkNi/j?i~j6j<knjsi6k2jwiWkZj*j<ilkBj'
+ink@iNiDkZiNjajGjykHjoj;j_iZjzj;j$iGi%i|jViVj<i6i'i-itkZi0ihkZj
+|j=jFkpiFkJimkfiBjhi]kRi%kFk0iJi|kPi\kFj\jNi)i8jYiaj"jCiCi?juj@
+jykNj$j>kukhj_kUj{i-jmi4i?imj_iPj`j,i0jhkCi2kBiMiUj.j~i3jpj@iPj
+EiEkkiAjzj0jtiCi6jYjrjxj7iXjYj%j=i8k6j5kuj%j$kIkSihi|i+kpkzjwig
+iCj.iViqj`iMj,jKj5jbj;ihj2jligi0kgj5i\j6kHkmkhjSjRkmi9jUjVkok6k
+mi*jMj{juk6i/i[j2jgi[iXjHi{j4j<kIkek7i|kLkykHkxiZkkiPjEiakIj:iC
+kri'j?j/kmi\iQjOi8i#i'iCkwj+iJiCkOi-jek8i;kejQi,j?jWkJj>kSkIiOj
+NiEkzizjSiIijj%i)iYiJkjj2kck9jsiBi%idiWkoi)iri6i,isiuj*kIi+iSi(
+iYkZj"i?i,iLi`i[idi#j~iKiLknjrk8ibjYkVjWihjRjVidj!j;jyi|ijiUj{i
+Zj?kekuj5kajKkJiWjpi<jKkNi:j7j7kKj,kvkHi~i2iRj5i_iTj;jDiej4iyiO
+ikjWjXj.j*iBkZiijqioiEiykik4kCi8kHidkyj*iVi+i[i.jzjci.j*i-kMj%k
+vi;krkpjriZiej~j3k6jSi-kYj5j.iXi[jKjMjujRjCiOiZiZiairjEiEkEjwj_
+jFi&kKj6j]kijHiSkej8iFjXj9jPjyi<i_kmknj?jSkIjYiEiLiNkjisj*kfkFj
+niwiBiCi3iJi"kGi)i6i}keiui/j3i%kNj#ibi?j@kvi;iekYi^jWi$igj3jKi}
+iTkOjUjki3iMj9kAi-iiiCi3jCj<j"j$iniJj[kriIj{kJiIi`kbiDj)kYi1kuk
+Gj)j`i\kIkiiiigiUj^iCk6i0jRjKiujQiijti6kPjCiekWjCi`kKi4kNjuivkM
+j6kJkOjSk6kOj8iEjtiOj8iNj(i,iVj(kUjvj,i>jQj8i@iuj|jXj`kQirjwiHi
+/i3iyi;i<j"j`kPi=j]i:jukjkPjNkvkHiFj`j*j6iqiBjXj{kpj2kSiGjaj6jx
+itiVjQjkkAiCi#i1i2kFiejVkZjMi+jGjPi'jVjVi'jNjdk1jLj=i'j.kmihikj
+^iJjMkGjXj/jVi0kUjtjWj'jLjtjRi,iBjvi9kPj/jpj|i#jSiYiBj]isjbkBj"
+kLjxiHkZjPjzkMkBj%koi>iriTiXj!i)kri5k~iikpiMiXkBk8jKkji^irj~jSi
+)j/jui!jSj?i^kaj@i6i(k5jHiHkxi&iHi`iNjWi-jlj,i!irj'i9ibj[jEj$j!
+iDjSi;iajEjTj=kNiCi$jLidi7iFj<j|itk2k8i6k3i<i%k3jpiJk4jsjdiajrk
+piCkAi[iPiDk8jri>jQjTj3kZkakZiyjtkCj%ifjwjQj5j$kuiAkVkzk3ikjpj+
+iki~iGihiwiGiAiOiGj,iaiejPknjujXkyiAjhkzi`kkjDjtk9j5kai(j=kMjOi
+sjQj3j2isk7jHiRigksjkk9j]i?iNkkiyiBjAj#jtkXiVi!j=kai_kyi=j-joie
+i7k@iGkbi}jui5j;jriniRi~j/j_i>j*j+itiPiwiKiOkKixi5igiFiCk5iMk8i
+qklibi<j'i7j!j_i/kIi[i&iJj(ifj%j#jjj<jSizjoj<kNjdk0idj,k7jNkpjm
+i}jQk8i{i1k6kkiQiMj~i'ieiKiTj(kaifibk5jLidi,i\i+j{i5kmk#kmiJi9j
+DjWipjGk0kJjpk1ixj)j/izk5iEiCi{jSkGkvjsi"kTjmjukok1j0kYi^i!i|j5
+iliojzjXi2i!j8kmjkiLj<i*iWjHk8iii<i^i(j0i1i;i~i^i)j)jYkpkTjvigi
+jiLiQkYkaiFj$iGigkSjukpj;i1j3ijkmkWkMj=kukJi|i0j]kPjGi^jpi+iJja
+iJiCi~jujdk3j,iAjTkQjtiskui_j'j,kei7j`jRidici6kniCiBj\i5kYiGkUi
+Zj=j4jUi'j&jpjojhiQk5iVi1jlk2k8isk@jHj)j9jViPk~kMjvi{jNiti*iFig
+k$j5j)jukMkLjzjNj]jjiok4jkjakKjCj)iDjPj9jvjDiwjlk7i1j!jZkJjXj/j
+Pjrihi/iEjgi{kkj;j"j(kejkiXiGj`jlk9jwk7jti,k9j$kYk5jfk8kQixi1jl
+iekFiai;jhirkNjWj_i6ivi1i*koj+jEkjidj6j?i0jIiti"k9kTjjiKjvkRjQj
+ai]jOkCkIjSjaiDiCiOjWj"kMifkzjQiGk3imj*j6jtj(jBiMiUkoiYjSjQi_iy
+jxi>j;i^i2kZi|j9jdi=jxkSivi/jeiQjej5jtkSiHiaiKiai^i@kCi<iCjTj(i
+diIiCkYiUi9iriyj\kTj{jxjNiwkvi,i#i,j0kpj)ksi4j:jai$jXkKiHjrioj?
+kciAj:i/i\j.iDi/kAj?iakTj,i9i6jKiciujKjEkii$k#i(j*ksjajlj}jci>i
+fkqiVitidjtj_i@j|iki2iQjWjUi[i~j`k5kXkKi#i1klkzj?jpjNi6icjuiCj:
+i@jQkRi%jIjdj,iwiCkCiTjukoi~j@j#j0ihj9j?idimj[jSjBjgiOkkk6jpj2j
+djSjviqi,kwiii5imi3j?j0j=kHk$jxiwj<i<i$kDiGiCk1igiCkEi<idjFj^j_
+jXiBj,i?j3k4iRkgi2i(i$jbj5i5jQjfi\jtj_kki_knkcjhibk9jhiPjWksiOi
+Zkqi)ksj$k~j5i;j>i;iFj3j5jUjri5jVi[i*j>i7j9iIjxiBi&kLiGiAj;k2kG
+j*kckHkTkKiBkWioiOiSi'kNiZjTiEj-jvjXj|j6j5kciqiFj^i"kmkcjdjVkuj
+%jWiai6jri)jYkIkzk#kUjOiOjgj@jpktkziRkqi~i?k6i2kgkMk~j#idkGiZjQ
+j_iokpjPk@ksi`i7iej2ivjwi!jpjnkziOk3injJkDimi]i]iBjZkCkokVjRk5i
+aj%i?i?i6kPiukokki\igkzjvj#k8iIj[j$k~iSknkzjik!i[k1jyj!jckXj}iA
+iPipj(jekwj^jcj%iCk7kmiFi#iViFkjiai2jji1jQk`iiiMj;kijjkojDiYj6k
+ekEiykpjli'i3jDjAjIjdjRjqksk`iQjgiZjgjwi5jQjXiGjLkTjMivigj8j=ju
+kGjAi6i,i;iqi>i|iBk8irj;iVi%k9iAi`kujVkCjEkJj`kRkojii\jviyj{kii
+9kLi@i"jQixi_j5jXieknipi,jQjUk4j=iLjMi~jtkZjDi^iokwktj"kxksj:kn
+kLiyj*j)iYjojzi6j^j|j"jCi?kNkejQiii$kLjSkEkuidiqiikOjDkBkskvi)i
+xjHi^iTkqjAk8i0jyiAi~kpkFkbkEkpj-kEiRj{ijkhkMk8kGj)iajFiqjyjAky
+kJjPjGiakYkzipi/jHi{kUihi(k~ifiPj%iFkIiCk0kmjki_k#jLjWk8irj]k#i
+rkQi@iVi`i-kHkwiSj1kSiVi.jei:kliSj,j5iai)iukKi,kOi)iFibi@jRiVj?
+kbkVjyj)jvjSi8jYk1k@i!jTi?ikk3jhkkkViSihjIipj=kWkwi\iIjPkfjnj"j
+2iNkMksj_i!jLjSkni^j(kPiIi>jJiEjvk3iMjvj^j!kWkBk5jIiVkdjIjOi-jV
+iKj<kqj>kMi&j'iakTj.j{kdiqi_iqickBjnjzkzkEiojwiei>k`keiQjBj=jNk
+djVj9iPjfiDjBi{jBk3jmk9kFkBkHi:jtj9iQj+jbitiBi0i5j[jxjwjbj7jVjV
+kBkqjpjLiUjDjhjBjBjwixkujZkWkVkxj;iajei[iOjkiNjQjsk#iai/kvjAjhi
+bjTi#i,igi~jok7k!iQiBixkQjHklj0jKjviPi8j$j/iRjBi]jSjGj}idjYj+i.
+kpj]jCi6i"kjkLjljxi7jakmjAjtj!i-i-jvi"j/krkPi<jLkLk9k~ilkwk~iNj
+fkwkCjLkEiEj6j-jUkuj;j)kPi9ihkNiZjGi~iuk`jDkrjiiJkuiQjwkGj{jJjK
+jgklk`ikjQjOkukukVi~jujbj,jfiRjvkeiJj8iLj%i|iCkBi!jLiYk4i4kiisj
+eiEkKiZiBiQk$kYj]kDk`jNiojMioiPi=jujWjwkjijisjWjDj-iLk1k9j_iDkr
+i7i8i.i!j'iFi@knjribiwiqkdj1jOjMjjk@iQiQk#iRiliej^iIiNk~i9i~jyi
+Biyk@j#kMi"iJi2jUk1juj6i}j;i,jhigj7igi&iAipk5kKiPkviTjbkok8jZiQ
+jBkdiAi3kii<ixkhjrksjfj(jViFkDj6kniLiTjNi4k4iHj^i&jPi"kIjjkXi;i
+pj1i^iEj1iYkhjxi0jijrj:inj5iJiqjokmkmjljnkcieiLirjAiIkai1i$i0i@
+j7iyjck4jCjKk8ioieiKiejBkej_i@ilk6ieiKizjgkmkeirk8i*ifiIi5i.j:j
+gkSkwi6kAjVisjbkGj{jdkxi7kCj~iVjJkGimkFj;j9idj!i#jZiCiSjekyi9kG
+j*i_jbk~j{ijjGiZkIj_i|j-i|j]jej<kSi;j[i?j/jEkrkTi,j-j4iIiFi&kAk
+ui)i3j^jTiMiykakGkRiak8k7jTiMiqjgkIi!jVkpjokejTidi;j+i,kUiBjlif
+j9i2jnkej5i\kwjokgj\jRiHitiGjRivjck8kejui8i;jykYj?isk5kAjXkjjik
+2kqkYitjcj^jlkdkGj.iriyi*igjTiyj~jqjTi\kWj9kUjZiwjAkMj|j;kOiwi#
+koigjfj{jij`i3iSigjTi4iYkOi*iJk~iykwj~j`jvitjBjqjOj"kxkRkGiQi$j
+@jAk@j'kLkFizi'keiyi"j^jnkpj<iEi`kgiFkekvi3kajZirkRkGkXi{iBkcjT
+kzkUidiPiwjqk@k#kvkTkXkWkxi`j+kli`j2ijk7kyj@j2iniKkRjujIiTk0jCk
+LjMiHkfjCiBjli8kSiGi$i#iHiJjoiCi^idj!j(kFi]jFkfj.iAifj9iYj5kpie
+iBiBjykMj3iZi#i^j#jRiSkVkdj%jSirjmipj^jTivi*iHjyi'i@kNjsj6i*i4j
+aiui\jjiEj]iFiPi@iyjOi9iljuipkJj|kEjqj)iJiGi2i_ivkAjaj6ieiWkKjH
+j%jUi/i5kWiDjoi?jMiJiNjUjjjRjWi/jVjnjXiZiJjqiqj?iqi\jhj8iFiGi2i
+@iNkZi0kKi%jdjHj<k2juinkNk5kOi/i5jQi:iCjOj[jPj7i\ieidjQjpk3jWjb
+jyjWi9j^j~jDkNi9j*jwiSiKiZj(i|k6iIkpjXi2ici<jVi#i{iBjIi}igi{kbi
+xiAi_i4i~i)kpi/igjPi:kpi)j%k7iqkEj@ihifjRjmj(i/i{i?iQj}k#iYjXiQ
+j\i,k1kOiQj|izk6i9iljJipkFiGjmjhkvkBkSiEjOi5izkajii^khjXiokpjOi
+kjhjKkGjqi4jXkKiBi$i>iokUk7j\k3jRjfkNj}k8jXkUi>j"kQj+jSkHj|iTkq
+j_i<i@j}kfi.i9jujei,j7jsiej\iGiujui-kYkwkRkEi)i4j;ixkLj4i7j]jJi
+Gjxj<j}khjjj?idjYkPj|kpk7i#iMjDj|iykCk4kojJi1kFiqjYi'i2j;j'i4i#
+iOkCj.iOjOihjlkaj+jtiok1j2jei^imi;jdi6jtici;jTk3kaitkxi?j,kBj?k
+7j~jFj(iykGkmi&i^iNj`injBjOiFjdkai\i$jFiji?i"kfiJibiwi8i^i=kGi-
+i.kmidiGi8itkDkCkrj~ivj*i"jFkBj_kLjjj@kSj,j&iZi&kNk1i-imjvkei\i
+'kIjqj'j!kkjdjWkVi"jCiLi3j=jDjejBknkQj]kMkHj8k1j/jVj1ilksj(k4j6
+jbjQjni<jNjvj<j:kPj{kKiLkGj4kuini<iBj,jhiLj7i?kkjIj[i,kMi^ixj7j
+7jVk6i?j-iLj'kaj^jviOjgk6j-j&j5j?j&jFkljHi8j[jGi,jQkTj9j[kjjHj_
+kliXjIkaiZj.khjykbjnk2iIkbj{jMj0j)iDj@jfkTkdiPjVkikwink7jcilkck
+DkGiwkEi'jDi\i/i}i$j<iFibk6j[j]jLkyi0jxjfjPk!iAj.ilkJi6i.kokBjB
+kckik~iij:k3i~kpkckpk3kRkxjfkskMk8kyj]kwiGjLjNi,j/kZjliekCi2iAi
+OjDj{i}iMi1kJk#jTiuiHj/kAihitktjfk4jTk9ipi@itiYjCj4kHknkFifi'ii
+i6jejPkTiWk1kSjqj=i_i<iMkIj#kciWj,ibi+jxiyiIiHjrjVj8jkitjCkei?i
+Ijci@kci:jCj9j%jFi_jzjgj_i9ibkTkujCj_knj3idiGiCj~i}iZkai)i9kYke
+i#jii)iLkIkmj#iTj)izjmiDizi<jsjriekQiTi=jmiajuj+i4i6iJkVj|iQivk
+qjmkvjCiai*ickwjCjTj[k`k6jXiTi|iCifjxi)i3jpi1jwi*j_iEi!kOi\kai?
+iqkqkei@jgjnj{iZjqj*i~i>itj^j\kgiakeiEjPjDjsjXiZj*i1irj6j^kriRi
+Zi:ibjQi.jkj#iakoklkAi-i~ibkUigj+icjniui9kJi^jQkrirk4j$k#jVi)j(
+i0jEjwjviZj(iZi3j6kgi:isi*ijimi\iDkjj~koi5jeinkcjAjZiBi0jBi#iuj
+-kNj;kTixj7i@kJjxiTi:iBiPi-jdi?kSjnkZjRimjQkAk@j{jEjWjqiCj^iti;
+k9i_jxj<ksjkj)i?i/jej}j"jujwj{iqj8iLj+j*i$k2kXiViPkjiCivjbiDjpi
+ukFinkBjGiGj_jWkqj<jRiWk3i-jxjdjmkgi}jUiuiajBiXiFkmktjsj5jQjFic
+kJi&kqjoiIickjkEjgiQiDi-jiiMj:ixiTkgjFi9kvjgjci:iOickFj(i)jGj%i
+-j$j-j&kqiwi2jtkIjdjzi1i5idj=i{j4jzj*jdkai3iDibiekii'kpi5jyjPiq
+jwiGkZi-i^jjjMiFjpkgiujTjQj[j=jHj)i-j{jPkZkhi0i1i-i/jtk!ikiQk2i
+}kej6ipj;khj4j}j5j*jPiGi4jRkcjoi9i{jfiCkHj_kojwj)i:i&j@i,j\jXiJ
+j`jmiei~kdi?i[jOi}koiwkOj{iRi~j8jujui>iCiCj.j6j<ipj(iljQjlj_iTj
+ui(kMimipj`i?i,kfi:ktjMjvkikTi,j+i/kriQjXk7j<j)k3i0k9i0jBi/i=i-
+kKjFkjjnjxjoi_j-k~kZk0kgj4iUi8kskejFknj3iJk3iikPiCkkjeiwi7j~krk
+qi=i~idkOjyi+kxjbk9kpjai-jMjLkNi5kNj[j|i)i$jljLjei;jYkVkyjGjnjT
+k8j5iGjrizkOkBk#jHj/kDkij=jBkfkIkPk4jAj(j<ickGk1j~i_k9i[j?jQi^j
+5j?j=jzj{i>iFiCjrj{jTi%kkjgj%j5kCj/i!j&kVi,j<knkzj}jBknj&kPjdik
+jpjMibjtjsjli{j)isjTiEi7j{iOi\jSjfi+i;iBiAj$jCj1jAkpjokXkEipkJk
+CjRjJj<k@inkrj1iWiWi[kRiSimi6kviji-i#imi?iBkYjMjqjkjXk0iIjQiyk~
+iLkHiRj}iSj$kgi)i'kOitkiktigjzj?kukqj|jZj=iCjkkBigkMinjEiBj[jhi
+[j9i5kri,jQiwi4kYkHj[joi.i~kYi>kMiukQiSkfi?j2j"jligj\itkajuikj;
+jri3ick9i0iUjpjXiJi%kGiAi]iCj%kxiBjZjIj9iJjui!igi7j~jxjlj}iTk#j
+Mjzi;jcipiIjvi0jej/i3iokqjzj&iWjoi2jjjwi0iJk!i{i&k4i$iHkLkijCjU
+iajxjukQk5joj*j:iEkSj-i{kvi'jXi\iljYi,iBj-j}i1igj,jiijjPi.i@jfk
+Jkekdi,idi(i[i3iCj0i,jdjhjDjWihj8iDi#j$i8j)j7j7i|kTjzjriAkPkQiT
+k`jJkAjokKi,jri`kjiIi#jjjHjXi!jgjmjrj*k9kOiai"kXi>idjMisjPjXj7k
+Piwj\jpi(jek@kBi`jPkSjbk7jujXj+kjjqkTj\jDjejekskXkGjMjKkakrkYi#
+j9jujZj*i7iSjZj(j!i'j0kajsj&iqi4j*j,icjEj|jfjXjhjWjAk`j(kpiokNj
+gi:kGk0j&iIi-jijAkgkLjgiqj%iWi4kti[jnj|iBi2j+j&iHjVj8jEi.j[k1j>
+kRkji8jXjBj5igk`j2jEjQj$kQjii)ivj8j_i4kpkYiciej8jaj/j&j&k!j_iSk
+Mi|ifj%i@kWjbi]jSjXi9k`jAkRkbkZizkqjpj$j)j#iLkPj%j9iDjmj|i*iGi[
+i_jgi2kei/iOkIkfiQkFjdi4k8jtiyjrj3i"kvk3k5jCk5iuj/kYjmj)j"j`ivj
+mimkoiXi_jgi'i:k#kckJiEjVj.jRjyitkFj,iMiHjgkziDkJi.k8ivkbjDj}jv
+jTkljvkTkqjGjpiii[k0k5i6j`kbivj<joi'jXj6jGi9kwkmj"i:j7j%j:jxiwk
+IkaipjPjqkHiijqj'kIipimkWj?kPkakTkSi:i!i!ii
+------------------ END OF THE DATA STRUCTURE ------------------
+```
\ No newline at end of file
diff --git a/src/include/utils.h b/src/include/utils.h
index 502fafea..febc190c 100644
--- a/src/include/utils.h
+++ b/src/include/utils.h
@@ -201,11 +201,20 @@ namespace ccdb::utils
template < typename charType > requires (std::is_same_v<charType, char> || std::is_same_v<charType, char32_t>)
static int get_width(const std::basic_string<charType> & str)
{
+ thread_local tsl::hopscotch_map < std::basic_string<charType>, int > cache_;
+ if (const auto it = cache_.find(str); it != cache_.end()) {
+ return it->second;
+ }
+
+ int result;
if constexpr (std::is_same_v<charType, char>) {
- return get_width_utf8(str);
+ result = get_width_utf8(str);
} else {
- return get_width_utf32(str);
+ result = get_width_utf32(str);
}
+ if (cache_.size() > 16 * 1024) cache_.clear();
+ cache_.emplace(str, result);
+ return result;
}
static int get_width(const char32_t c) {
diff --git a/src/misc/utils.string.cpp b/src/misc/utils.string.cpp
index b9266230..dfafb040 100644
--- a/src/misc/utils.string.cpp
+++ b/src/misc/utils.string.cpp
@@ -286,7 +286,7 @@ std::string ccdb::utils::second_to_human_readable(unsigned long long value)
std::u32string ccdb::utils::utf8_to_u32(const std::string &s)
{
- static thread_local tsl::hopscotch_map <std::string, std::u32string> cache;
+ thread_local tsl::hopscotch_map <std::string, std::u32string> cache;
if (const auto it = cache.find(s); it != cache.end()) {
return it->second;
}