diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1cd0c2526f..849c10d62e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -254,7 +254,7 @@ jobs: runs-on: windows steps: - name: Sign and package Windows viewer - uses: secondlife/viewer-build-util/sign-pkg-windows@main + uses: secondlife/viewer-build-util/sign-pkg-windows@v1 with: vault_uri: "${{ secrets.AZURE_KEY_VAULT_URI }}" cert_name: "${{ secrets.AZURE_CERT_NAME }}" @@ -286,7 +286,7 @@ jobs: [[ -n "$USERNAME" && -n "$PASSWORD" && -n "$TEAM_ID" ]] - name: Sign and package Mac viewer - uses: secondlife/viewer-build-util/sign-pkg-mac@main + uses: secondlife/viewer-build-util/sign-pkg-mac@v1 with: channel: ${{ needs.build.outputs.viewer_channel }} imagename: ${{ needs.build.outputs.imagename }} @@ -302,7 +302,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Post Windows symbols - uses: secondlife/viewer-build-util/post-bugsplat-windows@main + uses: secondlife/viewer-build-util/post-bugsplat-windows@v1 with: username: ${{ secrets.BUGSPLAT_USER }} password: ${{ secrets.BUGSPLAT_PASS }} @@ -315,7 +315,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Post Mac symbols - uses: secondlife/viewer-build-util/post-bugsplat-mac@main + uses: secondlife/viewer-build-util/post-bugsplat-mac@v1 with: username: ${{ secrets.BUGSPLAT_USER }} password: ${{ secrets.BUGSPLAT_PASS }} @@ -330,29 +330,29 @@ jobs: steps: - uses: actions/download-artifact@v3 with: - path: artifacts + name: Windows-installer - - name: Reshuffle artifact files - uses: secondlife/viewer-build-util/release-artifacts@main + - uses: actions/download-artifact@v3 with: - input-path: artifacts - output-path: assets - # The *-app artifacts are for use only by the signing and - # packaging steps. Once we've generated signed installers, we no - # longer need them, and we CERTAINLY don't want to publish - # thousands of individual files as separate URLs. - exclude: |- - Windows-app - macOS-app - # Use just "Windows" or "macOS" prefix because these are the only - # artifacts in which we expect files from both platforms with - # colliding names (e.g. autobuild-package.xml). release-artifacts - # normally resolves collisions by prepending the artifact name, so - # when we anticipate collisions, it's good to keep the prefix - # short and sweet. - prefix: |- - Windows-metadata=Windows - macOS-metadata=macOS + name: macOS-installer + + - uses: actions/download-artifact@v3 + with: + name: Windows-metadata + + - name: Rename windows metadata + run: | + mv autobuild-package.xml Windows-autobuild-package.xml + mv newview/viewer_version.txt Windows-viewer_version.txt + + - uses: actions/download-artifact@v3 + with: + name: macOS-metadata + + - name: Rename macOS metadata + run: | + mv autobuild-package.xml macOS-autobuild-package.xml + mv newview/viewer_version.txt macOS-viewer_version.txt # forked from softprops/action-gh-release - uses: secondlife-3p/action-gh-release@v1 @@ -364,4 +364,8 @@ jobs: generate_release_notes: true # the only reason we generate a GH release is to post build products fail_on_unmatched_files: true - files: "assets/*" + files: | + *.dmg + *.exe + *-autobuild-package.xml + *-viewer_version.txt diff --git a/.gitignore b/.gitignore index 11266fdeaa..3b3666af84 100755 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,4 @@ web/locale.* web/secondlife.com.* .env +.vscode diff --git a/autobuild.xml b/autobuild.xml index 8d8ffe0084..effafa31d3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2731,11 +2731,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - d8bc8720846cfa31e23e7e1008e32ba6ad4a8322 + eb1316584188dafb591f80b46b357c737f90d1a7 hash_algorithm sha1 url - https://github.com/secondlife/viewer-manager/releases/download/v3.0.cc7ea1e/viewer_manager-3.0.cc7ea1e-darwin64-cc7ea1e.tar.zst + https://github.com/secondlife/viewer-manager/releases/download/v3.0-08bf5ee/viewer_manager-3.0-08bf5ee-darwin64-08bf5ee.tar.zst name darwin64 @@ -2745,11 +2745,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 228fae4ee0ce12b9d1d1b0a8ebb0bdf58ee521eb + f4677b0ebd9880f29c118af51ada50883dd0a1e4 hash_algorithm sha1 url - https://github.com/secondlife/viewer-manager/releases/download/v3.0.cc7ea1e/viewer_manager-3.0.cc7ea1e-linux64-cc7ea1e.tar.zst + https://github.com/secondlife/viewer-manager/releases/download/v3.0-08bf5ee/viewer_manager-3.0-08bf5ee-linux64-08bf5ee.tar.zst name linux64 @@ -2759,11 +2759,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - ca6999b64d96d45952fe872b381db9b2abc0248c + 7426c5a1d7eb231b476625637a1f2daba0a6bc55 hash_algorithm sha1 url - https://github.com/secondlife/viewer-manager/releases/download/v3.0.cc7ea1e/viewer_manager-3.0.cc7ea1e-windows64-cc7ea1e.tar.zst + https://github.com/secondlife/viewer-manager/releases/download/v3.0-08bf5ee/viewer_manager-3.0-08bf5ee-windows64-08bf5ee.tar.zst name windows64 @@ -2776,7 +2776,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors copyright Copyright (c) 2000-2012, Linden Research, Inc. version - 3.0.cc7ea1e + 3.0-08bf5ee name viewer-manager description diff --git a/doc/contributions.txt b/doc/contributions.txt index e6c2e7cb70..ceb7aac600 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -242,6 +242,7 @@ Ansariel Hiller SL-19575 SL-19623 SL-4126 + SL-20224 Aralara Rajal Arare Chantilly CHUIBUG-191 @@ -931,6 +932,8 @@ LSL Scientist Lamorna Proctor Lares Carter Larry Pixel +Lars Næsbye Christensen + SL-20054 Laurent Bechir Leal Choche Lenae Munz diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 205ce402a0..500ffa3e8b 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -29,15 +29,6 @@ else() set( USE_AUTOBUILD_3P ON ) endif() -# The viewer code base can now be successfully compiled with -std=c++14. But -# turning that on in the generic viewer-build-variables/variables file would -# potentially require tweaking each of our ~50 third-party library builds. -# Until we decide to set -std=c++14 in viewer-build-variables/variables, set -# it locally here: we want to at least prevent inadvertently reintroducing -# viewer code that would fail with C++14. -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - include(Variables) include(BuildVersion) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index def0c5d6bc..9f79c13a97 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -95,7 +95,8 @@ if(WINDOWS) endif (USE_BUGSPLAT) if (TARGET ll::fmodstudio) - set(debug_files ${debug_files} fmodL.dll) + # fmodL is included for logging, only one should be picked by manifest + set(release_files ${release_files} fmodL.dll) set(release_files ${release_files} fmod.dll) endif () diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index f9259f6c2b..da5d2ef22c 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -13,7 +13,7 @@ elseif (WINDOWS) foreach(hive HKEY_CURRENT_USER HKEY_LOCAL_MACHINE) # prefer more recent Python versions to older ones, if multiple versions # are installed - foreach(pyver 3.11 3.10 3.9 3.8 3.7) + foreach(pyver 3.12 3.11 3.10 3.9 3.8 3.7) list(APPEND regpaths "[${hive}\\SOFTWARE\\Python\\PythonCore\\${pyver}\\InstallPath]") endforeach() endforeach() @@ -40,7 +40,7 @@ elseif (WINDOWS) ${regpaths} ${pymaybe} ) - include(FindPythonInterp) + find_package(Python3 COMPONENTS Interpreter) else() find_program(python python3) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 7ba937a909..c947184dc8 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -17,8 +17,10 @@ include(Tracy) set(llcommon_SOURCE_FILES + apply.cpp commoncontrol.cpp indra_constants.cpp + lazyeventapi.cpp llallocator.cpp llallocator_heap_profile.cpp llapp.cpp @@ -116,12 +118,16 @@ set(llcommon_SOURCE_FILES set(llcommon_HEADER_FILES CMakeLists.txt + always_return.h + apply.h chrono.h classic_callback.h commoncontrol.h ctype_workaround.h fix_macros.h + function_types.h indra_constants.h + lazyeventapi.h linden_common.h llalignedarray.h llallocator.h @@ -294,9 +300,11 @@ if (LL_TESTS) #set(TEST_DEBUG on) set(test_libs llcommon) + LL_ADD_INTEGRATION_TEST(apply "" "${test_libs}") LL_ADD_INTEGRATION_TEST(bitpack "" "${test_libs}") LL_ADD_INTEGRATION_TEST(classic_callback "" "${test_libs}") LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lazyeventapi "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llbase64 "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llcond "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}") diff --git a/indra/llcommon/always_return.h b/indra/llcommon/always_return.h new file mode 100644 index 0000000000..6b9f1fdeaf --- /dev/null +++ b/indra/llcommon/always_return.h @@ -0,0 +1,124 @@ +/** + * @file always_return.h + * @author Nat Goodspeed + * @date 2023-01-20 + * @brief Call specified callable with arbitrary arguments, but always return + * specified type. + * + * $LicenseInfo:firstyear=2023&license=viewerlgpl$ + * Copyright (c) 2023, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_ALWAYS_RETURN_H) +#define LL_ALWAYS_RETURN_H + +#include // std::enable_if, std::is_convertible + +namespace LL +{ + +#if __cpp_lib_is_invocable >= 201703L // C++17 + template + using invoke_result = std::invoke_result; +#else // C++14 + template + using invoke_result = std::result_of; +#endif // C++14 + + /** + * AlwaysReturn()(some_function, some_args...) calls + * some_function(some_args...). It is guaranteed to return a value of type + * T, regardless of the return type of some_function(). If some_function() + * returns a type convertible to T, it will convert and return that value. + * Otherwise (notably if some_function() is void), AlwaysReturn returns + * T(). + * + * When some_function() returns a type not convertible to T, if + * you want AlwaysReturn to return some T value other than + * default-constructed T(), pass that value to AlwaysReturn's constructor. + */ + template + class AlwaysReturn + { + public: + /// pass explicit default value if other than default-constructed type + AlwaysReturn(const DESIRED& dft=DESIRED()): mDefault(dft) {} + + // callable returns a type not convertible to DESIRED, return default + template ::type, + DESIRED + >::value, + bool + >::type=true> + DESIRED operator()(CALLABLE&& callable, ARGS&&... args) + { + // discard whatever callable(args) returns + std::forward(callable)(std::forward(args)...); + return mDefault; + } + + // callable returns a type convertible to DESIRED + template ::type, + DESIRED + >::value, + bool + >::type=true> + DESIRED operator()(CALLABLE&& callable, ARGS&&... args) + { + return { std::forward(callable)(std::forward(args)...) }; + } + + private: + DESIRED mDefault; + }; + + /** + * always_return(some_function, some_args...) calls + * some_function(some_args...). It is guaranteed to return a value of type + * T, regardless of the return type of some_function(). If some_function() + * returns a type convertible to T, it will convert and return that value. + * Otherwise (notably if some_function() is void), always_return() returns + * T(). + */ + template + DESIRED always_return(CALLABLE&& callable, ARGS&&... args) + { + return AlwaysReturn()(std::forward(callable), + std::forward(args)...); + } + + /** + * make_always_return(some_function) returns a callable which, when + * called with appropriate some_function() arguments, always returns a + * value of type T, regardless of the return type of some_function(). If + * some_function() returns a type convertible to T, the returned callable + * will convert and return that value. Otherwise (notably if + * some_function() is void), the returned callable returns T(). + * + * When some_function() returns a type not convertible to T, if + * you want the returned callable to return some T value other than + * default-constructed T(), pass that value to make_always_return() as its + * optional second argument. + */ + template + auto make_always_return(CALLABLE&& callable, const DESIRED& dft=DESIRED()) + { + return + [dft, callable = std::forward(callable)] + (auto&&... args) + { + return AlwaysReturn(dft)(callable, + std::forward(args)...); + }; + } + +} // namespace LL + +#endif /* ! defined(LL_ALWAYS_RETURN_H) */ diff --git a/indra/llcommon/apply.cpp b/indra/llcommon/apply.cpp new file mode 100644 index 0000000000..417e23d3b4 --- /dev/null +++ b/indra/llcommon/apply.cpp @@ -0,0 +1,29 @@ +/** + * @file apply.cpp + * @author Nat Goodspeed + * @date 2022-12-21 + * @brief Implementation for apply. + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "apply.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "stringize.h" + +void LL::apply_validate_size(size_t size, size_t arity) +{ + if (size != arity) + { + LLTHROW(apply_error(stringize("LL::apply(func(", arity, " args), " + "std::vector(", size, " elements))"))); + } +} diff --git a/indra/llcommon/apply.h b/indra/llcommon/apply.h index 7c58d63bc0..cf6161ed50 100644 --- a/indra/llcommon/apply.h +++ b/indra/llcommon/apply.h @@ -12,8 +12,11 @@ #if ! defined(LL_APPLY_H) #define LL_APPLY_H +#include "llexception.h" #include +#include // std::mem_fn() #include +#include // std::is_member_pointer namespace LL { @@ -54,20 +57,67 @@ namespace LL }, \ (ARGS)) -#if __cplusplus >= 201703L +/***************************************************************************** +* invoke() +*****************************************************************************/ +#if __cpp_lib_invoke >= 201411L // C++17 implementation -using std::apply; +using std::invoke; + +#else // no std::invoke + +// Use invoke() to handle pointer-to-method: +// derived from https://stackoverflow.com/a/38288251 +template::type>::value, + int>::type = 0 > +auto invoke(Fn&& f, Args&&... args) +{ + return std::mem_fn(std::forward(f))(std::forward(args)...); +} + +template::type>::value, + int>::type = 0 > +auto invoke(Fn&& f, Args&&... args) +{ + return std::forward(f)(std::forward(args)...); +} + +#endif // no std::invoke + +/***************************************************************************** +* apply(function, tuple); apply(function, array) +*****************************************************************************/ +#if __cpp_lib_apply >= 201603L + +// C++17 implementation +// We don't just say 'using std::apply;' because that template is too general: +// it also picks up the apply(function, vector) case, which we want to handle +// below. +template +auto apply(CALLABLE&& func, const std::tuple& args) +{ + return std::apply(std::forward(func), args); +} #else // C++14 // Derived from https://stackoverflow.com/a/20441189 // and https://en.cppreference.com/w/cpp/utility/apply -template -auto apply_impl(CALLABLE&& func, TUPLE&& args, std::index_sequence) +template +auto apply_impl(CALLABLE&& func, const std::tuple& args, std::index_sequence) { + // We accept const std::tuple& so a caller can construct an tuple on the + // fly. But std::get(const tuple) adds a const qualifier to everything + // it extracts. Get a non-const ref to this tuple so we can extract + // without the extraneous const. + auto& non_const_args{ const_cast&>(args) }; + // call func(unpacked args) - return std::forward(func)(std::move(std::get(args))...); + return invoke(std::forward(func), + std::forward(std::get(non_const_args))...); } template @@ -81,6 +131,8 @@ auto apply(CALLABLE&& func, const std::tuple& args) std::index_sequence_for{}); } +#endif // C++14 + // per https://stackoverflow.com/a/57510428/5533635 template auto apply(CALLABLE&& func, const std::array& args) @@ -88,28 +140,92 @@ auto apply(CALLABLE&& func, const std::array& args) return apply(std::forward(func), std::tuple_cat(args)); } +/***************************************************************************** +* bind_front() +*****************************************************************************/ +// To invoke a non-static member function with a tuple, you need a callable +// that binds your member function with an instance pointer or reference. +// std::bind_front() is perfect: std::bind_front(&cls::method, instance). +// Unfortunately bind_front() only enters the standard library in C++20. +#if __cpp_lib_bind_front >= 201907L + +// C++20 implementation +using std::bind_front; + +#else // no std::bind_front() + +template::type>::value, + int>::type = 0 > +auto bind_front(Fn&& f, Args&&... args) +{ + // Don't use perfect forwarding for f or args: we must bind them for later. + return [f, pfx_args=std::make_tuple(args...)] + (auto&&... sfx_args) + { + // Use perfect forwarding for sfx_args because we use them as soon as + // we receive them. + return apply( + f, + std::tuple_cat(pfx_args, + std::make_tuple(std::forward(sfx_args)...))); + }; +} + +template::type>::value, + int>::type = 0 > +auto bind_front(Fn&& f, Args&&... args) +{ + return bind_front(std::mem_fn(std::forward(f)), std::forward(args)...); +} + +#endif // C++20 with std::bind_front() + +/***************************************************************************** +* apply(function, std::vector) +*****************************************************************************/ // per https://stackoverflow.com/a/28411055/5533635 template auto apply_impl(CALLABLE&& func, const std::vector& args, std::index_sequence) { - return apply_impl(std::forward(func), - std::make_tuple(std::forward(args[I])...), - I...); + return apply(std::forward(func), + std::make_tuple(args[I]...)); } -// this goes beyond C++17 std::apply() +// produce suitable error if apply(func, vector) is the wrong size for func() +void apply_validate_size(size_t size, size_t arity); + +/// possible exception from apply() validation +struct apply_error: public LLException +{ + apply_error(const std::string& what): LLException(what) {} +}; + +template +auto apply_n(CALLABLE&& func, const std::vector& args) +{ + apply_validate_size(args.size(), ARITY); + return apply_impl(std::forward(func), + args, + std::make_index_sequence()); +} + +/** + * apply(function, std::vector) goes beyond C++17 std::apply(). For this case + * @a function @emph cannot be variadic: the compiler must know at compile + * time how many arguments to pass. This isn't Python. (But see apply_n() to + * pass a specific number of args to a variadic function.) + */ template auto apply(CALLABLE&& func, const std::vector& args) { + // infer arity from the definition of func constexpr auto arity = boost::function_traits::arity; - assert(args.size() == arity); - return apply_impl(std::forward(func), - args, - std::make_index_sequence()); + // now that we have a compile-time arity, apply_n() works + return apply_n(std::forward(func), args); } -#endif // C++14 - } // namespace LL #endif /* ! defined(LL_APPLY_H) */ diff --git a/indra/llcommon/function_types.h b/indra/llcommon/function_types.h new file mode 100644 index 0000000000..3f42f6d640 --- /dev/null +++ b/indra/llcommon/function_types.h @@ -0,0 +1,49 @@ +/** + * @file function_types.h + * @author Nat Goodspeed + * @date 2023-01-20 + * @brief Extend boost::function_types to examine boost::function and + * std::function + * + * $LicenseInfo:firstyear=2023&license=viewerlgpl$ + * Copyright (c) 2023, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_FUNCTION_TYPES_H) +#define LL_FUNCTION_TYPES_H + +#include +#include +#include + +namespace LL +{ + + template + struct function_arity_impl + { + static constexpr auto value = boost::function_types::function_arity::value; + }; + + template + struct function_arity_impl> + { + static constexpr auto value = function_arity_impl::value; + }; + + template + struct function_arity_impl> + { + static constexpr auto value = function_arity_impl::value; + }; + + template + struct function_arity + { + static constexpr auto value = function_arity_impl::type>::value; + }; + +} // namespace LL + +#endif /* ! defined(LL_FUNCTION_TYPES_H) */ diff --git a/indra/llcommon/lazyeventapi.cpp b/indra/llcommon/lazyeventapi.cpp new file mode 100644 index 0000000000..028af9f33f --- /dev/null +++ b/indra/llcommon/lazyeventapi.cpp @@ -0,0 +1,72 @@ +/** + * @file lazyeventapi.cpp + * @author Nat Goodspeed + * @date 2022-06-17 + * @brief Implementation for lazyeventapi. + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lazyeventapi.h" +// STL headers +// std headers +#include // std::find_if +// external library headers +// other Linden headers +#include "llevents.h" +#include "llsdutil.h" + +LL::LazyEventAPIBase::LazyEventAPIBase( + const std::string& name, const std::string& desc, const std::string& field) +{ + // populate embedded LazyEventAPIParams instance + mParams.name = name; + mParams.desc = desc; + mParams.field = field; + // mParams.init and mOperations are populated by subsequent add() calls. + + // Our raison d'etre: register as an LLEventPumps::PumpFactory + // so obtain() will notice any request for this name and call us. + // Of course, our subclass constructor must finish running (making add() + // calls) before mParams will be fully populated, but we expect that to + // happen well before the first LLEventPumps::obtain(name) call. + mRegistered = LLEventPumps::instance().registerPumpFactory( + name, + [this](const std::string& name){ return construct(name); }); +} + +LL::LazyEventAPIBase::~LazyEventAPIBase() +{ + // If our constructor's registerPumpFactory() call was unsuccessful, that + // probably means somebody else claimed the name first. If that's the + // case, do NOT unregister their name out from under them! + // If this is a static instance being destroyed at process shutdown, + // LLEventPumps will probably have been cleaned up already. + if (mRegistered && ! LLEventPumps::wasDeleted()) + { + // unregister the callback to this doomed instance + LLEventPumps::instance().unregisterPumpFactory(mParams.name); + } +} + +LLSD LL::LazyEventAPIBase::getMetadata(const std::string& name) const +{ + // Since mOperations is a vector rather than a map, just search. + auto found = std::find_if(mOperations.begin(), mOperations.end(), + [&name](const auto& namedesc) + { return (namedesc.first == name); }); + if (found == mOperations.end()) + return {}; + + // LLEventDispatcher() supplements the returned metadata in different + // ways, depending on metadata provided to the specific add() method. + // Don't try to emulate all that. At some point we might consider more + // closely unifying LLEventDispatcher machinery with LazyEventAPI, but for + // now this will have to do. + return llsd::map("name", found->first, "desc", found->second); +} diff --git a/indra/llcommon/lazyeventapi.h b/indra/llcommon/lazyeventapi.h new file mode 100644 index 0000000000..e36831270b --- /dev/null +++ b/indra/llcommon/lazyeventapi.h @@ -0,0 +1,205 @@ +/** + * @file lazyeventapi.h + * @author Nat Goodspeed + * @date 2022-06-16 + * @brief Declaring a static module-scope LazyEventAPI registers a specific + * LLEventAPI for future on-demand instantiation. + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LAZYEVENTAPI_H) +#define LL_LAZYEVENTAPI_H + +#include "apply.h" +#include "lleventapi.h" +#include "llinstancetracker.h" +#include +#include +#include +#include // std::pair +#include + +namespace LL +{ + /** + * Bundle params we want to pass to LLEventAPI's protected constructor. We + * package them this way so a subclass constructor can simply forward an + * opaque reference to the LLEventAPI constructor. + */ + // This is a class instead of a plain struct mostly so when we forward- + // declare it we don't have to remember the distinction. + class LazyEventAPIParams + { + public: + // package the parameters used by the normal LLEventAPI constructor + std::string name, desc, field; + // bundle LLEventAPI::add() calls collected by LazyEventAPI::add(), so + // the special LLEventAPI constructor we engage can "play back" those + // add() calls + boost::signals2::signal init; + }; + + /** + * LazyEventAPIBase implements most of the functionality of LazyEventAPI + * (q.v.), but we need the LazyEventAPI template subclass so we can accept + * the specific LLEventAPI subclass type. + */ + // No LLInstanceTracker key: we don't need to find a specific instance, + // LLLeapListener just needs to be able to enumerate all instances. + class LazyEventAPIBase: public LLInstanceTracker + { + public: + LazyEventAPIBase(const std::string& name, const std::string& desc, + const std::string& field); + virtual ~LazyEventAPIBase(); + + // Do not copy or move: once constructed, LazyEventAPIBase must stay + // put: we bind its instance pointer into a callback. + LazyEventAPIBase(const LazyEventAPIBase&) = delete; + LazyEventAPIBase(LazyEventAPIBase&&) = delete; + LazyEventAPIBase& operator=(const LazyEventAPIBase&) = delete; + LazyEventAPIBase& operator=(LazyEventAPIBase&&) = delete; + + // capture add() calls we want to play back on LLEventAPI construction + template + void add(const std::string& name, const std::string& desc, ARGS&&... rest) + { + // capture the metadata separately + mOperations.push_back(std::make_pair(name, desc)); + // Use connect_extended() so the lambda is passed its own + // connection. + + // apply() can't accept a template per se; it needs a particular + // specialization. Specialize out here to work around a clang bug: + // https://github.com/llvm/llvm-project/issues/41999 + auto func{ &LazyEventAPIBase::add_trampoline + }; + // We can't bind an unexpanded parameter pack into a lambda -- + // shame really. Instead, capture all our args as a std::tuple and + // then, in the lambda, use apply() to pass to add_trampoline(). + auto args{ std::make_tuple(name, desc, std::forward(rest)...) }; + + mParams.init.connect_extended( + [func, args] + (const boost::signals2::connection& conn, LLEventAPI* instance) + { + // we only need this connection once + conn.disconnect(); + // apply() expects a tuple specifying ALL the arguments, + // so prepend instance. + apply(func, std::tuple_cat(std::make_tuple(instance), args)); + }); + } + + // The following queries mimic the LLEventAPI / LLEventDispatcher + // query API. + + // Get the string name of the subject LLEventAPI + std::string getName() const { return mParams.name; } + // Get the documentation string + std::string getDesc() const { return mParams.desc; } + // Retrieve the LLSD key we use for dispatching + std::string getDispatchKey() const { return mParams.field; } + + // operations + using NameDesc = std::pair; + + private: + // metadata that might be queried by LLLeapListener + std::vector mOperations; + + public: + using const_iterator = decltype(mOperations)::const_iterator; + const_iterator begin() const { return mOperations.begin(); } + const_iterator end() const { return mOperations.end(); } + LLSD getMetadata(const std::string& name) const; + + protected: + // Params with which to instantiate the companion LLEventAPI subclass + LazyEventAPIParams mParams; + + private: + // true if we successfully registered our LLEventAPI on construction + bool mRegistered; + + // actually instantiate the companion LLEventAPI subclass + virtual LLEventPump* construct(const std::string& name) = 0; + + // Passing an overloaded function to any function that accepts an + // arbitrary callable is a PITB because you have to specify the + // correct overload. What we want is for the compiler to select the + // correct overload, based on the carefully-wrought enable_ifs in + // LLEventDispatcher. This (one and only) add_trampoline() method + // exists solely to pass to LL::apply(). Once add_trampoline() is + // called with the expanded arguments, we hope the compiler will Do + // The Right Thing in selecting the correct LLEventAPI::add() + // overload. + template + static + void add_trampoline(LLEventAPI* instance, ARGS&&... args) + { + instance->add(std::forward(args)...); + } + }; + + /** + * LazyEventAPI provides a way to register a particular LLEventAPI to be + * instantiated on demand, that is, when its name is passed to + * LLEventPumps::obtain(). + * + * Derive your listener from LLEventAPI as usual, with its various + * operation methods, but code your constructor to accept + * (const LL::LazyEventAPIParams& params) + * and forward that reference to (the protected) + * LLEventAPI(const LL::LazyEventAPIParams&) constructor. + * + * Then derive your listener registrar from + * LazyEventAPI. The constructor should + * look very like a traditional LLEventAPI constructor: + * + * * pass (name, desc [, field]) to LazyEventAPI's constructor + * * in the body, make a series of add() calls referencing your LLEventAPI + * subclass methods. + * + * You may use any LLEventAPI::add() methods, that is, any + * LLEventDispatcher::add() methods. But the target methods you pass to + * add() must belong to your LLEventAPI subclass, not the LazyEventAPI + * subclass. + * + * Declare a static instance of your LazyEventAPI listener registrar + * class. When it's constructed at static initialization time, it will + * register your LLEventAPI subclass with LLEventPumps. It will also + * collect metadata for the LLEventAPI and its operations to provide to + * LLLeapListener's introspection queries. + * + * When someone later calls LLEventPumps::obtain() to post an event to + * your LLEventAPI subclass, obtain() will instantiate it using + * LazyEventAPI's name, desc, field and add() calls. + */ + template + class LazyEventAPI: public LazyEventAPIBase + { + public: + // for subclass constructor to reference handler methods + using listener = EVENTAPI; + + LazyEventAPI(const std::string& name, const std::string& desc, + const std::string& field="op"): + // Forward ctor params to LazyEventAPIBase + LazyEventAPIBase(name, desc, field) + {} + + private: + LLEventPump* construct(const std::string& /*name*/) override + { + // base class has carefully assembled LazyEventAPIParams embedded + // in this instance, just pass to LLEventAPI subclass constructor + return new EVENTAPI(mParams); + } + }; +} // namespace LL + +#endif /* ! defined(LL_LAZYEVENTAPI_H) */ diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index e49f72722b..575c524219 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -38,6 +38,12 @@ const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAP bool gAPRInitialized = false; +int abortfunc(int retcode) +{ + LL_WARNS("APR") << "Allocation failure in apr pool with code " << (S32)retcode << LL_ENDL; + return 0; +} + void ll_init_apr() { // Initialize APR and create the global pool @@ -45,7 +51,7 @@ void ll_init_apr() if (!gAPRPoolp) { - apr_pool_create(&gAPRPoolp, NULL); + apr_pool_create_ex(&gAPRPoolp, NULL, abortfunc, NULL); } if(!LLAPRFile::sAPRFilePoolp) diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index cfaf3415e7..3ab97b557f 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -278,6 +278,7 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl catch (std::bad_alloc&) { // Out of memory on stack allocation? + printActiveCoroutines(); LL_ERRS("LLCoros") << "Bad memory allocation in LLCoros::launch(" << prefix << ")!" << LL_ENDL; } diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp index ff5459c1eb..3d46ef1034 100644 --- a/indra/llcommon/lleventapi.cpp +++ b/indra/llcommon/lleventapi.cpp @@ -35,6 +35,7 @@ // external library headers // other Linden headers #include "llerror.h" +#include "lazyeventapi.h" LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field): lbase(name, field), @@ -43,6 +44,13 @@ LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const s { } +LLEventAPI::LLEventAPI(const LL::LazyEventAPIParams& params): + LLEventAPI(params.name, params.desc, params.field) +{ + // call initialization functions with our brand-new instance pointer + params.init(this); +} + LLEventAPI::~LLEventAPI() { } diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h index 5991fe8fd5..25f6becd8b 100644 --- a/indra/llcommon/lleventapi.h +++ b/indra/llcommon/lleventapi.h @@ -35,6 +35,11 @@ #include "llinstancetracker.h" #include +namespace LL +{ + class LazyEventAPIParams; +} + /** * LLEventAPI not only provides operation dispatch functionality, inherited * from LLDispatchListener -- it also gives us event API introspection. @@ -64,19 +69,6 @@ public: /// Get the documentation string std::string getDesc() const { return mDesc; } - /** - * Publish only selected add() methods from LLEventDispatcher. - * Every LLEventAPI add() @em must have a description string. - */ - template - void add(const std::string& name, - const std::string& desc, - CALLABLE callable, - const LLSD& required=LLSD()) - { - LLEventDispatcher::add(name, desc, callable, required); - } - /** * Instantiate a Response object in any LLEventAPI subclass method that * wants to guarantee a reply (if requested) will be sent on exit from the @@ -150,16 +142,20 @@ public: * @endcode */ LLSD& operator[](const LLSD::String& key) { return mResp[key]; } - - /** - * set the response to the given data - */ - void setResponse(LLSD const & response){ mResp = response; } + + /** + * set the response to the given data + */ + void setResponse(LLSD const & response){ mResp = response; } LLSD mResp, mReq; LLSD::String mKey; }; +protected: + // constructor used only by subclasses registered by LazyEventAPI + LLEventAPI(const LL::LazyEventAPIParams&); + private: std::string mDesc; }; diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp index cd0ab6bc29..da96de18f7 100644 --- a/indra/llcommon/lleventdispatcher.cpp +++ b/indra/llcommon/lleventdispatcher.cpp @@ -40,70 +40,12 @@ // other Linden headers #include "llevents.h" #include "llerror.h" +#include "llexception.h" #include "llsdutil.h" #include "stringize.h" +#include // std::quoted() #include // std::auto_ptr -/***************************************************************************** -* LLSDArgsSource -*****************************************************************************/ -/** - * Store an LLSD array, producing its elements one at a time. Die with LL_ERRS - * if the consumer requests more elements than the array contains. - */ -class LL_COMMON_API LLSDArgsSource -{ -public: - LLSDArgsSource(const std::string function, const LLSD& args); - ~LLSDArgsSource(); - - LLSD next(); - - void done() const; - -private: - std::string _function; - LLSD _args; - LLSD::Integer _index; -}; - -LLSDArgsSource::LLSDArgsSource(const std::string function, const LLSD& args): - _function(function), - _args(args), - _index(0) -{ - if (! (_args.isUndefined() || _args.isArray())) - { - LL_ERRS("LLSDArgsSource") << _function << " needs an args array instead of " - << _args << LL_ENDL; - } -} - -LLSDArgsSource::~LLSDArgsSource() -{ - done(); -} - -LLSD LLSDArgsSource::next() -{ - if (_index >= _args.size()) - { - LL_ERRS("LLSDArgsSource") << _function << " requires more arguments than the " - << _args.size() << " provided: " << _args << LL_ENDL; - } - return _args[_index++]; -} - -void LLSDArgsSource::done() const -{ - if (_index < _args.size()) - { - LL_WARNS("LLSDArgsSource") << _function << " only consumed " << _index - << " of the " << _args.size() << " arguments provided: " - << _args << LL_ENDL; - } -} - /***************************************************************************** * LLSDArgsMapper *****************************************************************************/ @@ -156,19 +98,26 @@ void LLSDArgsSource::done() const * - Holes are filled with the default values. * - Any remaining holes constitute an error. */ -class LL_COMMON_API LLSDArgsMapper +class LL_COMMON_API LLEventDispatcher::LLSDArgsMapper { public: /// Accept description of function: function name, param names, param /// default values - LLSDArgsMapper(const std::string& function, const LLSD& names, const LLSD& defaults); + LLSDArgsMapper(LLEventDispatcher* parent, const std::string& function, + const LLSD& names, const LLSD& defaults); - /// Given arguments map, return LLSD::Array of parameter values, or LL_ERRS. + /// Given arguments map, return LLSD::Array of parameter values, or + /// trigger error. LLSD map(const LLSD& argsmap) const; private: static std::string formatlist(const LLSD&); + template + [[noreturn]] void callFail(ARGS&&... args) const; + // store a plain dumb back-pointer because we don't have to manage the + // parent LLEventDispatcher's lifespan + LLEventDispatcher* _parent; // The function-name string is purely descriptive. We want error messages // to be able to indicate which function's LLSDArgsMapper has the problem. std::string _function; @@ -187,15 +136,18 @@ private: FilledVector _has_dft; }; -LLSDArgsMapper::LLSDArgsMapper(const std::string& function, - const LLSD& names, const LLSD& defaults): +LLEventDispatcher::LLSDArgsMapper::LLSDArgsMapper(LLEventDispatcher* parent, + const std::string& function, + const LLSD& names, + const LLSD& defaults): + _parent(parent), _function(function), _names(names), _has_dft(names.size()) { if (! (_names.isUndefined() || _names.isArray())) { - LL_ERRS("LLSDArgsMapper") << function << " names must be an array, not " << names << LL_ENDL; + callFail(" names must be an array, not ", names); } auto nparams(_names.size()); // From _names generate _indexes. @@ -218,8 +170,7 @@ LLSDArgsMapper::LLSDArgsMapper(const std::string& function, // defaults is a (possibly empty) array. Right-align it with names. if (ndefaults > nparams) { - LL_ERRS("LLSDArgsMapper") << function << " names array " << names - << " shorter than defaults array " << defaults << LL_ENDL; + callFail(" names array ", names, " shorter than defaults array ", defaults); } // Offset by which we slide defaults array right to right-align with @@ -256,23 +207,20 @@ LLSDArgsMapper::LLSDArgsMapper(const std::string& function, } if (bogus.size()) { - LL_ERRS("LLSDArgsMapper") << function << " defaults specified for nonexistent params " - << formatlist(bogus) << LL_ENDL; + callFail(" defaults specified for nonexistent params ", formatlist(bogus)); } } else { - LL_ERRS("LLSDArgsMapper") << function << " defaults must be a map or an array, not " - << defaults << LL_ENDL; + callFail(" defaults must be a map or an array, not ", defaults); } } -LLSD LLSDArgsMapper::map(const LLSD& argsmap) const +LLSD LLEventDispatcher::LLSDArgsMapper::map(const LLSD& argsmap) const { if (! (argsmap.isUndefined() || argsmap.isMap() || argsmap.isArray())) { - LL_ERRS("LLSDArgsMapper") << _function << " map() needs a map or array, not " - << argsmap << LL_ENDL; + callFail(" map() needs a map or array, not ", argsmap); } // Initialize the args array. Indexing a non-const LLSD array grows it // to appropriate size, but we don't want to resize this one on each @@ -369,15 +317,14 @@ LLSD LLSDArgsMapper::map(const LLSD& argsmap) const // by argsmap, that's a problem. if (unfilled.size()) { - LL_ERRS("LLSDArgsMapper") << _function << " missing required arguments " - << formatlist(unfilled) << " from " << argsmap << LL_ENDL; + callFail(" missing required arguments ", formatlist(unfilled), " from ", argsmap); } // done return args; } -std::string LLSDArgsMapper::formatlist(const LLSD& list) +std::string LLEventDispatcher::LLSDArgsMapper::formatlist(const LLSD& list) { std::ostringstream out; const char* delim = ""; @@ -390,23 +337,44 @@ std::string LLSDArgsMapper::formatlist(const LLSD& list) return out.str(); } -LLEventDispatcher::LLEventDispatcher(const std::string& desc, const std::string& key): - mDesc(desc), - mKey(key) +template +[[noreturn]] void LLEventDispatcher::LLSDArgsMapper::callFail(ARGS&&... args) const { + _parent->callFail + (_function, std::forward(args)...); } +/***************************************************************************** +* LLEventDispatcher +*****************************************************************************/ +LLEventDispatcher::LLEventDispatcher(const std::string& desc, const std::string& key): + LLEventDispatcher(desc, key, "args") +{} + +LLEventDispatcher::LLEventDispatcher(const std::string& desc, const std::string& key, + const std::string& argskey): + mDesc(desc), + mKey(key), + mArgskey(argskey) +{} + LLEventDispatcher::~LLEventDispatcher() { } +LLEventDispatcher::DispatchEntry::DispatchEntry(LLEventDispatcher* parent, const std::string& desc): + mParent(parent), + mDesc(desc) +{} + /** * DispatchEntry subclass used for callables accepting(const LLSD&) */ struct LLEventDispatcher::LLSDDispatchEntry: public LLEventDispatcher::DispatchEntry { - LLSDDispatchEntry(const std::string& desc, const Callable& func, const LLSD& required): - DispatchEntry(desc), + LLSDDispatchEntry(LLEventDispatcher* parent, const std::string& desc, + const Callable& func, const LLSD& required): + DispatchEntry(parent, desc), mFunc(func), mRequired(required) {} @@ -414,22 +382,21 @@ struct LLEventDispatcher::LLSDDispatchEntry: public LLEventDispatcher::DispatchE Callable mFunc; LLSD mRequired; - virtual void call(const std::string& desc, const LLSD& event) const + LLSD call(const std::string& desc, const LLSD& event, bool, const std::string&) const override { // Validate the syntax of the event itself. std::string mismatch(llsd_matches(mRequired, event)); if (! mismatch.empty()) { - LL_ERRS("LLEventDispatcher") << desc << ": bad request: " << mismatch << LL_ENDL; + callFail(desc, ": bad request: ", mismatch); } // Event syntax looks good, go for it! - mFunc(event); + return mFunc(event); } - virtual LLSD addMetadata(LLSD meta) const + LLSD getMetadata() const override { - meta["required"] = mRequired; - return meta; + return llsd::map("required", mRequired); } }; @@ -439,17 +406,27 @@ struct LLEventDispatcher::LLSDDispatchEntry: public LLEventDispatcher::DispatchE */ struct LLEventDispatcher::ParamsDispatchEntry: public LLEventDispatcher::DispatchEntry { - ParamsDispatchEntry(const std::string& desc, const invoker_function& func): - DispatchEntry(desc), + ParamsDispatchEntry(LLEventDispatcher* parent, const std::string& name, + const std::string& desc, const invoker_function& func): + DispatchEntry(parent, desc), + mName(name), mInvoker(func) {} + std::string mName; invoker_function mInvoker; - virtual void call(const std::string& desc, const LLSD& event) const + LLSD call(const std::string&, const LLSD& event, bool, const std::string&) const override { - LLSDArgsSource src(desc, event); - mInvoker(boost::bind(&LLSDArgsSource::next, boost::ref(src))); + try + { + return mInvoker(event); + } + catch (const LL::apply_error& err) + { + // could hit runtime errors with LL::apply() + callFail(err.what()); + } } }; @@ -459,23 +436,62 @@ struct LLEventDispatcher::ParamsDispatchEntry: public LLEventDispatcher::Dispatc */ struct LLEventDispatcher::ArrayParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry { - ArrayParamsDispatchEntry(const std::string& desc, const invoker_function& func, + ArrayParamsDispatchEntry(LLEventDispatcher* parent, const std::string& name, + const std::string& desc, const invoker_function& func, LLSD::Integer arity): - ParamsDispatchEntry(desc, func), + ParamsDispatchEntry(parent, name, desc, func), mArity(arity) {} LLSD::Integer mArity; - virtual LLSD addMetadata(LLSD meta) const + LLSD call(const std::string& desc, const LLSD& event, bool fromMap, const std::string& argskey) const override + { +// std::string context { stringize(desc, "(", event, ") with argskey ", std::quoted(argskey), ": ") }; + // Whether we try to extract arguments from 'event' depends on whether + // the LLEventDispatcher consumer called one of the (name, event) + // methods (! fromMap) or one of the (event) methods (fromMap). If we + // were called with (name, event), the passed event must itself be + // suitable to pass to the registered callable, no args extraction + // required or even attempted. Only if called with plain (event) do we + // consider extracting args from that event. Initially assume 'event' + // itself contains the arguments. + LLSD args{ event }; + if (fromMap) + { + if (! mArity) + { + // When the target function is nullary, and we're called from + // an (event) method, just ignore the rest of the map entries. + args.clear(); + } + else + { + // We only require/retrieve argskey if the target function + // isn't nullary. For all others, since we require an LLSD + // array, we must have an argskey. + if (argskey.empty()) + { + callFail("LLEventDispatcher has no args key"); + } + if ((! event.has(argskey))) + { + callFail("missing required key ", std::quoted(argskey)); + } + args = event[argskey]; + } + } + return ParamsDispatchEntry::call(desc, args, fromMap, argskey); + } + + LLSD getMetadata() const override { LLSD array(LLSD::emptyArray()); // Resize to number of arguments required if (mArity) array[mArity - 1] = LLSD(); llassert_always(array.size() == mArity); - meta["required"] = array; - return meta; + return llsd::map("required", array); } }; @@ -485,11 +501,11 @@ struct LLEventDispatcher::ArrayParamsDispatchEntry: public LLEventDispatcher::Pa */ struct LLEventDispatcher::MapParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry { - MapParamsDispatchEntry(const std::string& name, const std::string& desc, - const invoker_function& func, + MapParamsDispatchEntry(LLEventDispatcher* parent, const std::string& name, + const std::string& desc, const invoker_function& func, const LLSD& params, const LLSD& defaults): - ParamsDispatchEntry(desc, func), - mMapper(name, params, defaults), + ParamsDispatchEntry(parent, name, desc, func), + mMapper(parent, name, params, defaults), mRequired(LLSD::emptyMap()) { // Build the set of all param keys, then delete the ones that are @@ -532,18 +548,27 @@ struct LLEventDispatcher::MapParamsDispatchEntry: public LLEventDispatcher::Para LLSD mRequired; LLSD mOptional; - virtual void call(const std::string& desc, const LLSD& event) const + LLSD call(const std::string& desc, const LLSD& event, bool fromMap, const std::string& argskey) const override { - // Just convert from LLSD::Map to LLSD::Array using mMapper, then pass - // to base-class call() method. - ParamsDispatchEntry::call(desc, mMapper.map(event)); + // by default, pass the whole event as the arguments map + LLSD args{ event }; + // Were we called by one of the (event) methods (instead of the (name, + // event) methods), do we have an argskey, and does the incoming event + // have that key? + if (fromMap && (! argskey.empty()) && event.has(argskey)) + { + // if so, extract the value of argskey from the incoming event, + // and use that as the arguments map + args = event[argskey]; + } + // Now convert args from LLSD map to LLSD array using mMapper, then + // pass to base-class call() method. + return ParamsDispatchEntry::call(desc, mMapper.map(args), fromMap, argskey); } - virtual LLSD addMetadata(LLSD meta) const + LLSD getMetadata() const override { - meta["required"] = mRequired; - meta["optional"] = mOptional; - return meta; + return llsd::map("required", mRequired, "optional", mOptional); } }; @@ -552,9 +577,9 @@ void LLEventDispatcher::addArrayParamsDispatchEntry(const std::string& name, const invoker_function& invoker, LLSD::Integer arity) { - mDispatch.insert( - DispatchMap::value_type(name, DispatchMap::mapped_type( - new ArrayParamsDispatchEntry(desc, invoker, arity)))); + mDispatch.emplace( + name, + new ArrayParamsDispatchEntry(this, "", desc, invoker, arity)); } void LLEventDispatcher::addMapParamsDispatchEntry(const std::string& name, @@ -563,25 +588,25 @@ void LLEventDispatcher::addMapParamsDispatchEntry(const std::string& name, const LLSD& params, const LLSD& defaults) { - mDispatch.insert( - DispatchMap::value_type(name, DispatchMap::mapped_type( - new MapParamsDispatchEntry(name, desc, invoker, params, defaults)))); + // Pass instance info as well as this entry name for error messages. + mDispatch.emplace( + name, + new MapParamsDispatchEntry(this, "", desc, invoker, params, defaults)); } /// Register a callable by name -void LLEventDispatcher::add(const std::string& name, const std::string& desc, - const Callable& callable, const LLSD& required) +void LLEventDispatcher::addLLSD(const std::string& name, const std::string& desc, + const Callable& callable, const LLSD& required) { - mDispatch.insert( - DispatchMap::value_type(name, DispatchMap::mapped_type( - new LLSDDispatchEntry(desc, callable, required)))); + mDispatch.emplace(name, new LLSDDispatchEntry(this, desc, callable, required)); } -void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const +void LLEventDispatcher::addFail(const std::string& name, const char* classname) const { LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ")::add(" << name - << "): " << classname << " is not a subclass " - << "of LLEventDispatcher" << LL_ENDL; + << "): " << LLError::Log::demangle(classname) + << " is not a subclass of LLEventDispatcher" + << LL_ENDL; } /// Unregister a callable @@ -596,48 +621,105 @@ bool LLEventDispatcher::remove(const std::string& name) return true; } -/// Call a registered callable with an explicitly-specified name. If no -/// such callable exists, die with LL_ERRS. -void LLEventDispatcher::operator()(const std::string& name, const LLSD& event) const +/// Call a registered callable with an explicitly-specified name. It is an +/// error if no such callable exists. +LLSD LLEventDispatcher::operator()(const std::string& name, const LLSD& event) const { - if (! try_call(name, event)) - { - LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): '" << name - << "' not found" << LL_ENDL; - } -} - -/// Extract the @a key value from the incoming @a event, and call the -/// callable whose name is specified by that map @a key. If no such -/// callable exists, die with LL_ERRS. -void LLEventDispatcher::operator()(const LLSD& event) const -{ - // This could/should be implemented in terms of the two-arg overload. - // However -- we can produce a more informative error message. - std::string name(event[mKey]); - if (! try_call(name, event)) - { - LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): bad " << mKey - << " value '" << name << "'" << LL_ENDL; - } -} - -bool LLEventDispatcher::try_call(const LLSD& event) const -{ - return try_call(event[mKey], event); + return try_call(std::string(), name, event); } bool LLEventDispatcher::try_call(const std::string& name, const LLSD& event) const { - DispatchMap::const_iterator found = mDispatch.find(name); - if (found == mDispatch.end()) + try + { + try_call(std::string(), name, event); + return true; + } + // Note that we don't catch the generic DispatchError, only the specific + // DispatchMissing. try_call() only promises to return false if the + // specified callable name isn't found -- not for general errors. + catch (const DispatchMissing&) { return false; } +} + +/// Extract the @a key value from the incoming @a event, and call the callable +/// whose name is specified by that map @a key. It is an error if no such +/// callable exists. +LLSD LLEventDispatcher::operator()(const LLSD& event) const +{ + return try_call(mKey, event[mKey], event); +} + +bool LLEventDispatcher::try_call(const LLSD& event) const +{ + try + { + try_call(mKey, event[mKey], event); + return true; + } + catch (const DispatchMissing&) + { + return false; + } +} + +LLSD LLEventDispatcher::try_call(const std::string& key, const std::string& name, + const LLSD& event) const +{ + if (name.empty()) + { + if (key.empty()) + { + callFail("attempting to call with no name"); + } + else + { + callFail("no ", key); + } + } + + DispatchMap::const_iterator found = mDispatch.find(name); + if (found == mDispatch.end()) + { + // Here we were passed a non-empty name, but there's no registered + // callable with that name. This is the one case in which we throw + // DispatchMissing instead of the generic DispatchError. + // Distinguish the public method by which our caller reached here: + // key.empty() means the name was passed explicitly, non-empty means + // we extracted the name from the incoming event using that key. + if (key.empty()) + { + callFail(std::quoted(name), " not found"); + } + else + { + callFail("bad ", key, " value ", std::quoted(name)); + } + } + // Found the name, so it's plausible to even attempt the call. - found->second->call(STRINGIZE("LLEventDispatcher(" << mDesc << ") calling '" << name << "'"), - event); - return true; // tell caller we were able to call + const char* delim = (key.empty()? "" : "="); + // append either "[key=name]" or just "[name]" + SetState transient(this, '[', key, delim, name, ']'); + return found->second->call("", event, (! key.empty()), mArgskey); +} + +template +//static +[[noreturn]] void LLEventDispatcher::sCallFail(ARGS&&... args) +{ + auto error = stringize(std::forward(args)...); + LL_WARNS("LLEventDispatcher") << error << LL_ENDL; + LLTHROW(EXCEPTION(error)); +} + +template +[[noreturn]] void LLEventDispatcher::callFail(ARGS&&... args) const +{ + // Describe this instance in addition to the error itself. + sCallFail(*this, ": ", std::forward(args)...); } LLSD LLEventDispatcher::getMetadata(const std::string& name) const @@ -647,26 +729,243 @@ LLSD LLEventDispatcher::getMetadata(const std::string& name) const { return LLSD(); } - LLSD meta; + LLSD meta{ found->second->getMetadata() }; meta["name"] = name; meta["desc"] = found->second->mDesc; - return found->second->addMetadata(meta); + return meta; } -LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key): - LLEventDispatcher(pumpname, key), - mPump(pumpname, true), // allow tweaking for uniqueness - mBoundListener(mPump.listen("self", boost::bind(&LLDispatchListener::process, this, _1))) +std::ostream& operator<<(std::ostream& out, const LLEventDispatcher& self) { + // If we're a subclass of LLEventDispatcher, e.g. LLEventAPI, report that. + // Also report whatever transient state is active. + return out << LLError::Log::classname(self) << '(' << self.mDesc << ')' + << self.getState(); } -bool LLDispatchListener::process(const LLSD& event) +std::string LLEventDispatcher::getState() const { - (*this)(event); + // default value of fiber_specific_ptr is nullptr, and ~SetState() reverts + // to that; infer empty string + if (! mState.get()) + return {}; + else + return *mState; +} + +bool LLEventDispatcher::setState(SetState&, const std::string& state) const +{ + // If SetState is instantiated at multiple levels of function call, ignore + // the lower-level call because the outer call presumably provides more + // context. + if (mState.get()) + return false; + + // Pass us empty string (a la ~SetState()) to reset to nullptr, else take + // a heap copy of the passed state string so we can delete it on + // subsequent reset(). + mState.reset(state.empty()? nullptr : new std::string(state)); + return true; +} + +/***************************************************************************** +* LLDispatchListener +*****************************************************************************/ +std::string LLDispatchListener::mReplyKey{ "reply" }; + +bool LLDispatchListener::process(const LLSD& event) const +{ + // Decide what to do based on the incoming value of the specified dispatch + // key. + LLSD name{ event[getDispatchKey()] }; + if (name.isMap()) + { + call_map(name, event); + } + else if (name.isArray()) + { + call_array(name, event); + } + else + { + call_one(name, event); + } return false; } -LLEventDispatcher::DispatchEntry::DispatchEntry(const std::string& desc): - mDesc(desc) -{} +void LLDispatchListener::call_one(const LLSD& name, const LLSD& event) const +{ + LLSD result; + try + { + result = (*this)(event); + } + catch (const DispatchError& err) + { + if (! event.has(mReplyKey)) + { + // Without a reply key, let the exception propagate. + throw; + } + // Here there was an error and the incoming event has mReplyKey. Reply + // with a map containing an "error" key explaining the problem. + return reply(llsd::map("error", err.what()), event); + } + + // We seem to have gotten a valid result. But we don't know whether the + // registered callable is void or non-void. If it's void, + // LLEventDispatcher returned isUndefined(). Otherwise, try to send it + // back to our invoker. + if (result.isDefined()) + { + if (! result.isMap()) + { + // wrap the result in a map as the "data" key + result = llsd::map("data", result); + } + reply(result, event); + } +} + +void LLDispatchListener::call_map(const LLSD& reqmap, const LLSD& event) const +{ + // LLSD map containing returned values + LLSD result; + // cache dispatch key + std::string key{ getDispatchKey() }; + // collect any error messages here + std::ostringstream errors; + const char* delim = ""; + + for (const auto& pair : llsd::inMap(reqmap)) + { + const LLSD::String& name{ pair.first }; + const LLSD& args{ pair.second }; + try + { + // in case of errors, tell user the dispatch key, the fact that + // we're processing a request map and the current key in that map + SetState(this, '[', key, '[', name, "]]"); + // With this form, capture return value even if undefined: + // presence of the key in the response map can be used to detect + // which request keys succeeded. + result[name] = (*this)(name, args); + } + catch (const std::exception& err) + { + // Catch not only DispatchError, but any C++ exception thrown by + // the target callable. Collect exception name and message in + // 'errors'. + errors << delim << LLError::Log::classname(err) << ": " << err.what(); + delim = "\n"; + } + } + + // so, were there any errors? + std::string error = errors.str(); + if (! error.empty()) + { + if (! event.has(mReplyKey)) + { + // can't send reply, throw + sCallFail(error); + } + else + { + // reply key present + result["error"] = error; + } + } + + reply(result, event); +} + +void LLDispatchListener::call_array(const LLSD& reqarray, const LLSD& event) const +{ + // LLSD array containing returned values + LLSD results; + // cache the dispatch key + std::string key{ getDispatchKey() }; + // arguments array, if present -- const because, if it's shorter than + // reqarray, we don't want to grow it + const LLSD argsarray{ event[getArgsKey()] }; + // error message, if any + std::string error; + + // classic index loop because we need the index + for (size_t i = 0, size = reqarray.size(); i < size; ++i) + { + const auto& reqentry{ reqarray[i] }; + std::string name; + LLSD args; + if (reqentry.isString()) + { + name = reqentry.asString(); + args = argsarray[i]; + } + else if (reqentry.isArray() && reqentry.size() == 2 && reqentry[0].isString()) + { + name = reqentry[0].asString(); + args = reqentry[1]; + } + else + { + // reqentry isn't in either of the documented forms + error = stringize(*this, ": ", getDispatchKey(), '[', i, "] ", + reqentry, " unsupported"); + break; + } + + // reqentry is one of the valid forms, got name and args + try + { + // in case of errors, tell user the dispatch key, the fact that + // we're processing a request array, the current entry in that + // array and the corresponding callable name + SetState(this, '[', key, '[', i, "]=", name, ']'); + // With this form, capture return value even if undefined + results.append((*this)(name, args)); + } + catch (const std::exception& err) + { + // Catch not only DispatchError, but any C++ exception thrown by + // the target callable. Report the exception class as well as the + // error string. + error = stringize(LLError::Log::classname(err), ": ", err.what()); + break; + } + } + + LLSD result; + // was there an error? + if (! error.empty()) + { + if (! event.has(mReplyKey)) + { + // can't send reply, throw + sCallFail(error); + } + else + { + // reply key present + result["error"] = error; + } + } + + // wrap the results array as response map "data" key, as promised + if (results.isDefined()) + { + result["data"] = results; + } + + reply(result, event); +} + +void LLDispatchListener::reply(const LLSD& reply, const LLSD& request) const +{ + // Call sendReply() unconditionally: sendReply() itself tests whether the + // specified reply key is present in the incoming request, and does + // nothing if there's no such key. + sendReply(reply, request, mReplyKey); +} diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h index 9e1244ef5b..a82bc7a69b 100644 --- a/indra/llcommon/lleventdispatcher.h +++ b/indra/llcommon/lleventdispatcher.h @@ -27,55 +27,26 @@ * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - * - * The invoker machinery that constructs a boost::fusion argument list for use - * with boost::fusion::invoke() is derived from - * http://www.boost.org/doc/libs/1_45_0/libs/function_types/example/interpreter.hpp - * whose license information is copied below: - * - * "(C) Copyright Tobias Schwinger - * - * Use modification and distribution are subject to the boost Software License, - * Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)." */ #if ! defined(LL_LLEVENTDISPATCHER_H) #define LL_LLEVENTDISPATCHER_H -// nil is too generic a term to be allowed to be a global macro. In -// particular, boost::fusion defines a 'class nil' (properly encapsulated in a -// namespace) that a global 'nil' macro breaks badly. -#if defined(nil) -// Capture the value of the macro 'nil', hoping int is an appropriate type. -static const auto nil_(nil); -// Now forget the macro. -#undef nil -// Finally, reintroduce 'nil' as a properly-scoped alias for the previously- -// defined const 'nil_'. Make it static since otherwise it produces duplicate- -// symbol link errors later. -static const auto& nil(nil_); -#endif - -#include -#include -#include -#include -#include -#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include // until C++17, when we get std::is_invocable +#include +#include // std::function +#include // std::unique_ptr +#include #include +#include +#include // std::pair +#include "always_return.h" +#include "function_types.h" // LL::function_arity #include "llevents.h" +#include "llptrto.h" #include "llsdutil.h" class LLSD; @@ -89,15 +60,27 @@ class LLSD; class LL_COMMON_API LLEventDispatcher { public: + /** + * Pass description and the LLSD key used by try_call(const LLSD&) and + * operator()(const LLSD&) to extract the name of the registered callable + * to invoke. + */ LLEventDispatcher(const std::string& desc, const std::string& key); + /** + * Pass description, the LLSD key used by try_call(const LLSD&) and + * operator()(const LLSD&) to extract the name of the registered callable + * to invoke, and the LLSD key used by try_call(const LLSD&) and + * operator()(const LLSD&) to extract arguments LLSD. + */ + LLEventDispatcher(const std::string& desc, const std::string& key, + const std::string& argskey); virtual ~LLEventDispatcher(); /// @name Register functions accepting(const LLSD&) //@{ - /// Accept any C++ callable with the right signature, typically a - /// boost::bind() expression - typedef boost::function Callable; + /// Accept any C++ callable with the right signature + typedef std::function Callable; /** * Register a @a callable by @a name. The passed @a callable accepts a @@ -109,27 +92,54 @@ public: void add(const std::string& name, const std::string& desc, const Callable& callable, - const LLSD& required=LLSD()); - - /** - * The case of a free function (or static method) accepting(const LLSD&) - * could also be intercepted by the arbitrary-args overload below. Ensure - * that it's directed to the Callable overload above instead. - */ - void add(const std::string& name, - const std::string& desc, - void (*f)(const LLSD&), const LLSD& required=LLSD()) { - add(name, desc, Callable(f), required); + addLLSD(name, desc, callable, required); + } + + template ::value + >::type> + void add(const std::string& name, + const std::string& desc, + CALLABLE&& callable, + const LLSD& required=LLSD()) + { + addLLSD( + name, + desc, + Callable(LL::make_always_return(std::forward(callable))), + required); } /** * Special case: a subclass of this class can pass an unbound member * function pointer (of an LLEventDispatcher subclass) without explicitly - * specifying the boost::bind() expression. The passed @a method + * specifying a std::bind() expression. The passed @a method * accepts a single LLSD value, presumably containing other parameters. */ + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(const LLSD&), + const LLSD& required=LLSD()) + { + addMethod(name, desc, method, required); + } + + /// Overload for both const and non-const methods. The passed @a method + /// accepts a single LLSD value, presumably containing other parameters. + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(const LLSD&) const, + const LLSD& required=LLSD()) + { + addMethod(name, desc, method, required); + } + + // because the compiler can't match a method returning void to the above template void add(const std::string& name, const std::string& desc, @@ -150,6 +160,128 @@ public: addMethod(name, desc, method, required); } + // non-const nullary method + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)()) + { + addVMethod(name, desc, method); + } + + // const nullary method + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)() const) + { + addVMethod(name, desc, method); + } + + // non-const nullary method returning void + template + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)()) + { + addVMethod(name, desc, method); + } + + // const nullary method returning void + template + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)() const) + { + addVMethod(name, desc, method); + } + + // non-const unary method (but method accepting LLSD should use the other add()) + // enable_if usage per https://stackoverflow.com/a/39913395/5533635 + template ::type, LLSD>::value + >::type> + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(ARG)) + { + addVMethod(name, desc, method); + } + + // const unary method (but method accepting LLSD should use the other add()) + template ::type, LLSD>::value + >::type> + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(ARG) const) + { + addVMethod(name, desc, method); + } + + // non-const unary method returning void + // enable_if usage per https://stackoverflow.com/a/39913395/5533635 + template ::type, LLSD>::value + >::type> + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(ARG)) + { + addVMethod(name, desc, method); + } + + // const unary method returning void + template ::type, LLSD>::value + >::type> + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(ARG) const) + { + addVMethod(name, desc, method); + } + + // non-const binary (or more) method + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(ARG0, ARG1, ARGS...)) + { + addVMethod(name, desc, method); + } + + // const binary (or more) method + template + void add(const std::string& name, + const std::string& desc, + R (CLASS::*method)(ARG0, ARG1, ARGS...) const) + { + addVMethod(name, desc, method); + } + + // non-const binary (or more) method returning void + template + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(ARG0, ARG1, ARGS...)) + { + addVMethod(name, desc, method); + } + + // const binary (or more) method returning void + template + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(ARG0, ARG1, ARGS...) const) + { + addVMethod(name, desc, method); + } + //@} /// @name Register functions with arbitrary param lists @@ -159,51 +291,43 @@ public: * Register a free function with arbitrary parameters. (This also works * for static class methods.) * - * @note This supports functions with up to about 6 parameters -- after - * that you start getting dismaying compile errors in which - * boost::fusion::joint_view is mentioned a surprising number of times. - * * When calling this name, pass an LLSD::Array. Each entry in turn will be * converted to the corresponding parameter type using LLSDParam. */ - template - typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin - >::type add(const std::string& name, - const std::string& desc, - Function f); + template () + >::type> + void add(const std::string& name, + const std::string& desc, + CALLABLE&& f) + { + addV(name, desc, f); + } /** * Register a nonstatic class method with arbitrary parameters. * - * @note This supports functions with up to about 6 parameters -- after - * that you start getting dismaying compile errors in which - * boost::fusion::joint_view is mentioned a surprising number of times. - * * To cover cases such as a method on an LLSingleton we don't yet want to * instantiate, instead of directly storing an instance pointer, accept a * nullary callable returning a pointer/reference to the desired class - * instance. If you already have an instance in hand, - * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr) - * produce suitable callables. + * instance. * * When calling this name, pass an LLSD::Array. Each entry in turn will be * converted to the corresponding parameter type using LLSDParam. */ - template - typename boost::enable_if< boost::function_types::is_member_function_pointer - >::type add(const std::string& name, - const std::string& desc, - Method f, - const InstanceGetter& getter); + template::value && + ! std::is_convertible::value + >::type> + void add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter); /** * Register a free function with arbitrary parameters. (This also works * for static class methods.) * - * @note This supports functions with up to about 6 parameters -- after - * that you start getting dismaying compile errors in which - * boost::fusion::joint_view is mentioned a surprising number of times. - * * Pass an LLSD::Array of parameter names, and optionally another * LLSD::Array of default parameter values, a la LLSDArgsMapper. * @@ -211,21 +335,17 @@ public: * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn * to the corresponding parameter type using LLSDParam. */ - template - typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin - >::type add(const std::string& name, - const std::string& desc, - Function f, - const LLSD& params, - const LLSD& defaults=LLSD()); + template::value && + ! boost::hof::is_invocable::value + >::type> + void add(const std::string& name, const std::string& desc, Function f, + const LLSD& params, const LLSD& defaults=LLSD()); /** * Register a nonstatic class method with arbitrary parameters. * - * @note This supports functions with up to about 6 parameters -- after - * that you start getting dismaying compile errors in which - * boost::fusion::joint_view is mentioned a surprising number of times. - * * To cover cases such as a method on an LLSingleton we don't yet want to * instantiate, instead of directly storing an instance pointer, accept a * nullary callable returning a pointer/reference to the desired class @@ -233,6 +353,8 @@ public: * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr) * produce suitable callables. * + * TODO: variant accepting a method of the containing class, no getter. + * * Pass an LLSD::Array of parameter names, and optionally another * LLSD::Array of default parameter values, a la LLSDArgsMapper. * @@ -240,42 +362,96 @@ public: * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn * to the corresponding parameter type using LLSDParam. */ - template - typename boost::enable_if< boost::function_types::is_member_function_pointer - >::type add(const std::string& name, - const std::string& desc, - Method f, - const InstanceGetter& getter, - const LLSD& params, - const LLSD& defaults=LLSD()); + template::value && + ! std::is_convertible::value + >::type> + void add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter, const LLSD& params, + const LLSD& defaults=LLSD()); //@} /// Unregister a callable bool remove(const std::string& name); - /// Call a registered callable with an explicitly-specified name. If no - /// such callable exists, die with LL_ERRS. If the @a event fails to match - /// the @a required prototype specified at add() time, die with LL_ERRS. - void operator()(const std::string& name, const LLSD& event) const; + /// Exception if an attempted call fails for any reason + struct DispatchError: public LLException + { + DispatchError(const std::string& what): LLException(what) {} + }; - /// Call a registered callable with an explicitly-specified name and - /// return true. If no such callable exists, return - /// false. If the @a event fails to match the @a required - /// prototype specified at add() time, die with LL_ERRS. + /// Specific exception for an attempt to call a nonexistent name + struct DispatchMissing: public DispatchError + { + DispatchMissing(const std::string& what): DispatchError(what) {} + }; + + /** + * Call a registered callable with an explicitly-specified name, + * converting its return value to LLSD (undefined for a void callable). + * It is an error if no such callable exists. It is an error if the @a + * event fails to match the @a required prototype specified at add() + * time. + * + * @a event must be an LLSD array for a callable registered to accept its + * arguments from such an array. It must be an LLSD map for a callable + * registered to accept its arguments from such a map. + */ + LLSD operator()(const std::string& name, const LLSD& event) const; + + /** + * Call a registered callable with an explicitly-specified name and + * return true. If no such callable exists, return + * false. It is an error if the @a event fails to match the @a + * required prototype specified at add() time. + * + * @a event must be an LLSD array for a callable registered to accept its + * arguments from such an array. It must be an LLSD map for a callable + * registered to accept its arguments from such a map. + */ bool try_call(const std::string& name, const LLSD& event) const; - /// Extract the @a key value from the incoming @a event, and call the - /// callable whose name is specified by that map @a key. If no such - /// callable exists, die with LL_ERRS. If the @a event fails to match the - /// @a required prototype specified at add() time, die with LL_ERRS. - void operator()(const LLSD& event) const; + /** + * Extract the @a key specified to our constructor from the incoming LLSD + * map @a event, and call the callable whose name is specified by that @a + * key's value, converting its return value to LLSD (undefined for a void + * callable). It is an error if no such callable exists. It is an error if + * the @a event fails to match the @a required prototype specified at + * add() time. + * + * For a (non-nullary) callable registered to accept its arguments from an + * LLSD array, the @a event map must contain the key @a argskey specified to + * our constructor. The value of the @a argskey key must be an LLSD array + * containing the arguments to pass to the callable named by @a key. + * + * For a callable registered to accept its arguments from an LLSD map, if + * the @a event map contains the key @a argskey specified our constructor, + * extract the value of the @a argskey key and use it as the arguments map. + * If @a event contains no @a argskey key, use the whole @a event as the + * arguments map. + */ + LLSD operator()(const LLSD& event) const; - /// Extract the @a key value from the incoming @a event, call the callable - /// whose name is specified by that map @a key and return true. - /// If no such callable exists, return false. If the @a event - /// fails to match the @a required prototype specified at add() time, die - /// with LL_ERRS. + /** + * Extract the @a key specified to our constructor from the incoming LLSD + * map @a event, call the callable whose name is specified by that @a + * key's value and return true. If no such callable exists, + * return false. It is an error if the @a event fails to match + * the @a required prototype specified at add() time. + * + * For a (non-nullary) callable registered to accept its arguments from an + * LLSD array, the @a event map must contain the key @a argskey specified to + * our constructor. The value of the @a argskey key must be an LLSD array + * containing the arguments to pass to the callable named by @a key. + * + * For a callable registered to accept its arguments from an LLSD map, if + * the @a event map contains the key @a argskey specified our constructor, + * extract the value of the @a argskey key and use it as the arguments map. + * If @a event contains no @a argskey key, use the whole @a event as the + * arguments map. + */ bool try_call(const LLSD& event) const; /// @name Iterate over defined names @@ -285,22 +461,26 @@ public: private: struct DispatchEntry { - DispatchEntry(const std::string& desc); + DispatchEntry(LLEventDispatcher* parent, const std::string& desc); virtual ~DispatchEntry() {} // suppress MSVC warning, sigh + // store a plain dumb back-pointer because the parent + // LLEventDispatcher manages the lifespan of each DispatchEntry + // subclass instance -- not the other way around + LLEventDispatcher* mParent; std::string mDesc; - virtual void call(const std::string& desc, const LLSD& event) const = 0; - virtual LLSD addMetadata(LLSD) const = 0; + virtual LLSD call(const std::string& desc, const LLSD& event, + bool fromMap, const std::string& argskey) const = 0; + virtual LLSD getMetadata() const = 0; + + template + [[noreturn]] void callFail(ARGS&&... args) const + { + mParent->callFail(std::forward(args)...); + } }; - // Tried using boost::ptr_map, but ptr_map<> - // wants its value type to be "clonable," even just to dereference an - // iterator. I don't want to clone entries -- if I have to copy an entry - // around, I want it to continue pointing to the same DispatchEntry - // subclass object. However, I definitely want DispatchMap to destroy - // DispatchEntry if no references are outstanding at the time an entry is - // removed. This looks like a job for boost::shared_ptr. - typedef std::map > DispatchMap; + typedef std::map > DispatchMap; public: /// We want the flexibility to redefine what data we store per name, @@ -323,11 +503,57 @@ public: /// Retrieve the LLSD key we use for one-arg operator() method std::string getDispatchKey() const { return mKey; } + /// Retrieve the LLSD key we use for non-map arguments + std::string getArgsKey() const { return mArgskey; } + + /// description of this instance's leaf class and description + friend std::ostream& operator<<(std::ostream&, const LLEventDispatcher&); private: - template + void addLLSD(const std::string& name, + const std::string& desc, + const Callable& callable, + const LLSD& required); + + template ::value, + bool + >::type=true> void addMethod(const std::string& name, const std::string& desc, const METHOD& method, const LLSD& required) + { + // Why two overloaded addMethod() methods, discriminated with + // std::is_base_of? It might seem simpler to use dynamic_cast and test + // for nullptr. The trouble is that it doesn't work for LazyEventAPI + // deferred registration: we get nullptr even for a method of an + // LLEventAPI subclass. + CLASS* downcast = static_cast(this); + add(name, + desc, + Callable(LL::make_always_return( + [downcast, method] + (const LLSD& args) + { + return (downcast->*method)(args); + })), + required); + } + + template ::value, + bool + >::type=true> + void addMethod(const std::string& name, const std::string& desc, + const METHOD&, const LLSD&) + { + addFail(name, typeid(CLASS).name()); + } + + template + void addVMethod(const std::string& name, const std::string& desc, + const METHOD& method) { CLASS* downcast = dynamic_cast(this); if (! downcast) @@ -336,38 +562,85 @@ private: } else { - add(name, desc, boost::bind(method, downcast, _1), required); + // add() arbitrary method plus InstanceGetter, where the + // InstanceGetter in this case returns 'this'. We don't need to + // worry about binding 'this' because, once this LLEventDispatcher + // is destroyed, the DispatchEntry goes away too. + add(name, desc, method, [downcast](){ return downcast; }); } } - void addFail(const std::string& name, const std::string& classname) const; - std::string mDesc, mKey; + template + void addV(const std::string& name, const std::string& desc, Function f); + + void addFail(const std::string& name, const char* classname) const; + LLSD try_call(const std::string& key, const std::string& name, + const LLSD& event) const; + +protected: + // raise specified EXCEPTION with specified stringize(ARGS) + template + [[noreturn]] void callFail(ARGS&&... args) const; + template + [[noreturn]] static + void sCallFail(ARGS&&... args); + + // Manage transient state, e.g. which registered callable we're attempting + // to call, for error reporting + class SetState + { + public: + template + SetState(const LLEventDispatcher* self, ARGS&&... args): + mSelf(self) + { + mSet = mSelf->setState(*this, stringize(std::forward(args)...)); + } + // RAII class: forbid both copy and move + SetState(const SetState&) = delete; + SetState(SetState&&) = delete; + SetState& operator=(const SetState&) = delete; + SetState& operator=(SetState&&) = delete; + virtual ~SetState() + { + // if we're the ones who succeeded in setting state, clear it + if (mSet) + { + mSelf->setState(*this, {}); + } + } + + private: + const LLEventDispatcher* mSelf; + bool mSet; + }; + +private: + std::string mDesc, mKey, mArgskey; DispatchMap mDispatch; + // transient state: must be fiber_specific since multiple threads and/or + // multiple fibers may be calling concurrently. Make it mutable so we can + // use SetState even within const methods. + mutable boost::fibers::fiber_specific_ptr mState; + + std::string getState() const; + // setState() requires SetState& because only the SetState class should + // call it. Make it const so we can use SetState even within const methods. + bool setState(SetState&, const std::string& state) const; static NameDesc makeNameDesc(const DispatchMap::value_type& item) { return NameDesc(item.first, item.second->mDesc); } + class LLSDArgsMapper; struct LLSDDispatchEntry; struct ParamsDispatchEntry; struct ArrayParamsDispatchEntry; struct MapParamsDispatchEntry; - // Step 2 of parameter analysis. Instantiating invoker - // implicitly sets its From and To parameters to the (compile time) begin - // and end iterators over that function's parameter types. - template< typename Function - , class From = typename boost::mpl::begin< boost::function_types::parameter_types >::type - , class To = typename boost::mpl::end< boost::function_types::parameter_types >::type - > - struct invoker; - - // deliver LLSD arguments one at a time - typedef boost::function args_source; - // obtain args from an args_source to build param list and call target - // function - typedef boost::function invoker_function; + // call target function with args from LLSD array + typedef std::function invoker_function; template invoker_function make_invoker(Function f); @@ -387,101 +660,38 @@ private: /***************************************************************************** * LLEventDispatcher template implementation details *****************************************************************************/ -// Step 3 of parameter analysis, the recursive case. -template -struct LLEventDispatcher::invoker +template +void LLEventDispatcher::addV(const std::string& name, const std::string& desc, Function f) { - template - struct remove_cv_ref - : boost::remove_cv< typename boost::remove_reference::type > - { }; - - // apply() accepts an arbitrary boost::fusion sequence as args. It - // examines the next parameter type in the parameter-types sequence - // bounded by From and To, obtains the next LLSD object from the passed - // args_source and constructs an LLSDParam of appropriate type to try - // to convert the value. It then recurs with the next parameter-types - // iterator, passing the args sequence thus far. - template - static inline - void apply(Function func, const args_source& argsrc, Args const & args) - { - typedef typename boost::mpl::deref::type arg_type; - typedef typename boost::mpl::next::type next_iter_type; - typedef typename remove_cv_ref::type plain_arg_type; - - invoker::apply - ( func, argsrc, boost::fusion::push_back(args, LLSDParam(argsrc()))); - } - - // Special treatment for instance (first) parameter of a non-static member - // function. Accept the instance-getter callable, calling that to produce - // the first args value. Since we know we're at the top of the recursion - // chain, we need not also require a partial args sequence from our caller. - template - static inline - void method_apply(Function func, const args_source& argsrc, const InstanceGetter& getter) - { - typedef typename boost::mpl::next::type next_iter_type; - - // Instead of grabbing the first item from argsrc and making an - // LLSDParam of it, call getter() and pass that as the instance param. - invoker::apply - ( func, argsrc, boost::fusion::push_back(boost::fusion::nil(), boost::ref(getter()))); - } -}; - -// Step 4 of parameter analysis, the leaf case. When the general -// invoker logic has advanced From until it matches To, -// the compiler will pick this template specialization. -template -struct LLEventDispatcher::invoker -{ - // the argument list is complete, now call the function - template - static inline - void apply(Function func, const args_source&, Args const & args) - { - boost::fusion::invoke(func, args); - } -}; - -template -typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin >::type -LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f) -{ - // Construct an invoker_function, a callable accepting const args_source&. + // Construct an invoker_function, a callable accepting const LLSD&. // Add to DispatchMap an ArrayParamsDispatchEntry that will handle the // caller's LLSD::Array. addArrayParamsDispatchEntry(name, desc, make_invoker(f), - boost::function_types::function_arity::value); + LL::function_arity::value); } -template -typename boost::enable_if< boost::function_types::is_member_function_pointer >::type -LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, - const InstanceGetter& getter) +template +void LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter) { // Subtract 1 from the compile-time arity because the getter takes care of // the first parameter. We only need (arity - 1) additional arguments. addArrayParamsDispatchEntry(name, desc, make_invoker(f, getter), - boost::function_types::function_arity::value - 1); + LL::function_arity::value - 1); } -template -typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin >::type -LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f, - const LLSD& params, const LLSD& defaults) +template +void LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f, + const LLSD& params, const LLSD& defaults) { // See comments for previous is_nonmember_callable_builtin add(). addMapParamsDispatchEntry(name, desc, make_invoker(f), params, defaults); } -template -typename boost::enable_if< boost::function_types::is_member_function_pointer >::type -LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, - const InstanceGetter& getter, - const LLSD& params, const LLSD& defaults) +template +void LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter, + const LLSD& params, const LLSD& defaults) { addMapParamsDispatchEntry(name, desc, make_invoker(f, getter), params, defaults); } @@ -490,29 +700,45 @@ template LLEventDispatcher::invoker_function LLEventDispatcher::make_invoker(Function f) { - // Step 1 of parameter analysis, the top of the recursion. Passing a - // suitable f (see add()'s enable_if condition) to this method causes it - // to infer the function type; specifying that function type to invoker<> - // causes it to fill in the begin/end MPL iterators over the function's - // list of parameter types. - // While normally invoker::apply() could infer its template type from the - // boost::fusion::nil parameter value, here we must be explicit since - // we're boost::bind()ing it rather than calling it directly. - return boost::bind(&invoker::template apply, - f, - _1, - boost::fusion::nil()); + // Return an invoker_function that accepts (const LLSD& args). + return [f](const LLSD& args) + { + // When called, call always_return, directing it to call + // f(expanded args). always_return guarantees we'll get an LLSD + // value back, even if it's undefined because 'f' doesn't return a + // type convertible to LLSD. + return LL::always_return( + [f, args] + () + { + return LL::apply(f, args); + }); + }; } template LLEventDispatcher::invoker_function LLEventDispatcher::make_invoker(Method f, const InstanceGetter& getter) { - // Use invoker::method_apply() to treat the instance (first) arg specially. - return boost::bind(&invoker::template method_apply, - f, - _1, - getter); + return [f, getter](const LLSD& args) + { + // always_return() immediately calls the lambda we pass, and + // returns LLSD whether our passed lambda returns void or non-void. + return LL::always_return( + [f, getter, args] + () + { + // function_arity includes its implicit 'this' pointer + constexpr auto arity = LL::function_arity< + typename std::remove_reference::type>::value - 1; + + // Use bind_front() to bind the method to (a pointer to) the object + // returned by getter(). It's okay to capture and bind a pointer + // because this bind_front() object will last only as long as this + // lambda call. + return LL::apply_n(LL::bind_front(f, LL::get_ptr(getter())), args); + }); + }; } /***************************************************************************** @@ -521,21 +747,138 @@ LLEventDispatcher::make_invoker(Method f, const InstanceGetter& getter) /** * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class * that contains (or derives from) LLDispatchListener need only specify the - * LLEventPump name and dispatch key, and add() its methods. Incoming events - * will automatically be dispatched. + * LLEventPump name and dispatch key, and add() its methods. Each incoming + * event ("request") will automatically be dispatched. + * + * If the request contains a "reply" key specifying the LLSD::String name of + * an LLEventPump to which to respond, LLDispatchListener will attempt to send + * a response to that LLEventPump. + * + * If some error occurs (e.g. nonexistent callable name, wrong params) and + * "reply" is present, LLDispatchListener will send a response map to the + * specified LLEventPump containing an "error" key whose value is the relevant + * error message. If "reply" is not present, the DispatchError exception will + * propagate. Since LLDispatchListener bundles an LLEventStream, which + * attempts the call immediately on receiving the post() call, there's a + * reasonable chance that the exception will highlight the post() call that + * triggered the error. + * + * If LLDispatchListener successfully calls the target callable, but no + * "reply" key is present, any value returned by that callable is discarded. + * If a "reply" key is present, but the target callable is void -- or it + * returns LLSD::isUndefined() -- no response is sent. If a void callable + * wants to send a response, it must do so explicitly. + * + * If the target callable returns a type convertible to LLSD (and, if it + * directly returns LLSD, the return value isDefined()), and if a "reply" key + * is present in the request, LLDispatchListener will post the returned value + * to the "reply" LLEventPump. If the returned value is an LLSD map, it will + * merge the echoed "reqid" key into the map and send that. Otherwise, it will + * send an LLSD map containing "reqid" and a "data" key whose value is the + * value returned by the target callable. + * + * (It is inadvisable for a target callable to return an LLSD map containing + * keys "data", "reqid" or "error", as that will confuse the invoker.) + * + * Normally the request will specify the value of the dispatch key as an + * LLSD::String naming the target callable. Alternatively, several such calls + * may be "batched" as described below. + * + * If the value of the dispatch key is itself an LLSD map (a "request map"), + * each map key must name a target callable, and the value of that key must + * contain the parameters to pass to that callable. If a "reply" key is + * present in the request, the response map will contain a key for each of the + * keys in the request map. The value of every such key is the value returned + * by the target callable. + * + * (Avoid naming any target callable in the LLDispatchListener "data", "reqid" + * or "error" to avoid confusion.) + * + * Since LLDispatchListener calls the target callables specified by a request + * map in arbitrary order, this form assumes that the batched operations are + * independent of each other. LLDispatchListener will attempt every call, even + * if some attempts produce errors. If any keys in the request map produce + * errors, LLDispatchListener builds a composite error message string + * collecting the relevant messages. The corresponding keys will be missing + * from the response map. As in the single-callable case, absent a "reply" key + * in the request, this error message will be thrown as a DispatchError. With + * a "reply" key, it will be returned as the value of the "error" key. This + * form can indicate partial success: some request keys might have + * return-value keys in the response, others might have message text in the + * "error" key. + * + * If a specific call sequence is required, the value of the dispatch key may + * instead be an LLSD array (a "request array"). Each entry in the request + * array ("request entry") names a target callable, to be called in + * array-index sequence. Arguments for that callable may be specified in + * either of two ways. + * + * The request entry may itself be a two-element array, whose [0] is an + * LLSD::String naming the target callable and whose [1] contains the + * arguments to pass to that callable. + * + * Alternatively, the request entry may be an LLSD::String naming the target + * callable, in which case the request must contain an arguments key (optional + * third constructor argument) whose value is an array matching the request + * array. The arguments for the request entry's target callable are found at + * the same index in the arguments key array. + * + * If a "reply" key is present in the request, the response map will contain a + * "data" key whose value is an array. Each entry in that response array will + * contain the result from the corresponding request entry. + * + * This form assumes that any of the batched operations might depend on the + * success of a previous operation in the same batch. The @emph first error + * encountered will terminate the sequence. The error message might either be + * thrown as DispatchError or, given a "reply" key, returned as the "error" + * key in the response map. This form can indicate partial success: the first + * few request entries might have return-value entries in the "data" response + * array, along with an "error" key whose value is the error message that + * stopped the sequence. */ -class LL_COMMON_API LLDispatchListener: public LLEventDispatcher +// Instead of containing an LLEventStream, LLDispatchListener derives from it. +// This allows an LLEventPumps::PumpFactory to return a pointer to an +// LLDispatchListener (subclass) instance, and still have ~LLEventPumps() +// properly clean it up. +class LL_COMMON_API LLDispatchListener: + public LLEventDispatcher, + public LLEventStream { public: - LLDispatchListener(const std::string& pumpname, const std::string& key); - - std::string getPumpName() const { return mPump.getName(); } + /// LLEventPump name, dispatch key [, arguments key (see LLEventDispatcher)] + template + LLDispatchListener(const std::string& pumpname, const std::string& key, + ARGS&&... args); + virtual ~LLDispatchListener() {} private: - bool process(const LLSD& event); + bool process(const LLSD& event) const; + void call_one(const LLSD& name, const LLSD& event) const; + void call_map(const LLSD& reqmap, const LLSD& event) const; + void call_array(const LLSD& reqarray, const LLSD& event) const; + void reply(const LLSD& reply, const LLSD& request) const; - LLEventStream mPump; LLTempBoundListener mBoundListener; + static std::string mReplyKey; }; +template +LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key, + ARGS&&... args): + // pass through any additional arguments to LLEventDispatcher ctor + LLEventDispatcher(pumpname, key, std::forward(args)...), + // Do NOT tweak the passed pumpname. In practice, when someone + // instantiates a subclass of our LLEventAPI subclass, they intend to + // claim that LLEventPump name in the global LLEventPumps namespace. It + // would be mysterious and distressing if we allowed name tweaking, and + // someone else claimed pumpname first for a completely unrelated + // LLEventPump. Posted events would never reach our subclass listener + // because we would have silently changed its name; meanwhile listeners + // (if any) on that other LLEventPump would be confused by the events + // intended for our subclass. + LLEventStream(pumpname, false), + mBoundListener(listen("self", [this](const LLSD& event){ return process(event); })) +{ +} + #endif /* ! defined(LL_LLEVENTDISPATCHER_H) */ diff --git a/indra/llcommon/lleventfilter.h b/indra/llcommon/lleventfilter.h index 7613850fb2..1fb41e0297 100644 --- a/indra/llcommon/lleventfilter.h +++ b/indra/llcommon/lleventfilter.h @@ -435,16 +435,61 @@ public: // generic type-appropriate store through mTarget, construct an // LLSDParam and store that, thus engaging LLSDParam's custom // conversions. - mTarget = LLSDParam(llsd::drill(event, mPath)); + storeTarget(LLSDParam(llsd::drill(event, mPath))); return mConsume; } private: + // This method disambiguates LLStoreListener. Directly assigning + // some_LLSD_var = LLSDParam(some_LLSD_value); + // is problematic because the compiler has too many choices: LLSD has + // multiple assignment operator overloads, and LLSDParam has a + // templated conversion operator. But LLSDParam can convert to a + // (const LLSD&) parameter, and LLSD::operator=(const LLSD&) works. + void storeTarget(const T& value) + { + mTarget = value; + } + T& mTarget; const LLSD mPath; const bool mConsume; }; +/** + * LLVarHolder bundles a target variable of the specified type. We use it as a + * base class so the target variable will be fully constructed by the time a + * subclass constructor tries to pass a reference to some other base class. + */ +template +struct LLVarHolder +{ + T mVar; +}; + +/** + * LLCaptureListener isa LLStoreListener that bundles the target variable of + * interest. + */ +template +class LLCaptureListener: public LLVarHolder, + public LLStoreListener +{ +private: + using holder = LLVarHolder; + using super = LLStoreListener; + +public: + LLCaptureListener(const LLSD& path=LLSD(), bool consume=false): + super(*this, holder::mVar, path, consume) + {} + + void set(T&& newval=T()) { holder::mVar = std::forward(newval); } + + const T& get() const { return holder::mVar; } + operator const T&() { return holder::mVar; } +}; + /***************************************************************************** * LLEventLogProxy *****************************************************************************/ diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 0a213bddef..1a305ec3dc 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -68,19 +68,78 @@ LLEventPumps::LLEventPumps(): mFactories { - { "LLEventStream", [](const std::string& name, bool tweak) + { "LLEventStream", [](const std::string& name, bool tweak, const std::string& /*type*/) { return new LLEventStream(name, tweak); } }, - { "LLEventMailDrop", [](const std::string& name, bool tweak) + { "LLEventMailDrop", [](const std::string& name, bool tweak, const std::string& /*type*/) { return new LLEventMailDrop(name, tweak); } } }, mTypes { - // LLEventStream is the default for obtain(), so even if somebody DOES - // call obtain("placeholder"), this sample entry won't break anything. - { "placeholder", "LLEventStream" } +// { "placeholder", "LLEventStream" } } {} +bool LLEventPumps::registerTypeFactory(const std::string& type, const TypeFactory& factory) +{ + auto found = mFactories.find(type); + // can't re-register a TypeFactory for a type name that's already registered + if (found != mFactories.end()) + return false; + // doesn't already exist, go ahead and register + mFactories[type] = factory; + return true; +} + +void LLEventPumps::unregisterTypeFactory(const std::string& type) +{ + auto found = mFactories.find(type); + if (found != mFactories.end()) + mFactories.erase(found); +} + +bool LLEventPumps::registerPumpFactory(const std::string& name, const PumpFactory& factory) +{ + // Do we already have a pump by this name? + if (mPumpMap.find(name) != mPumpMap.end()) + return false; + // Do we already have an override for this pump name? + if (mTypes.find(name) != mTypes.end()) + return false; + // Leverage the two-level lookup implemented by mTypes (pump name -> type + // name) and mFactories (type name -> factory). We could instead create a + // whole separate (pump name -> factory) map, and look in both; or we + // could change mTypes to (pump name -> factory) and, for typical type- + // based lookups, use a "factory" that looks up the real factory in + // mFactories. But this works, and we don't expect many calls to make() - + // either explicit or implicit via obtain(). + // Create a bogus type name extremely unlikely to collide with an actual type. + static std::string nul(1, '\0'); + std::string type_name{ nul + name }; + mTypes[name] = type_name; + // TypeFactory is called with (name, tweak, type), whereas PumpFactory + // accepts only name. We could adapt with std::bind(), but this lambda + // does the trick. + mFactories[type_name] = + [factory] + (const std::string& name, bool /*tweak*/, const std::string& /*type*/) + { return factory(name); }; + return true; +} + +void LLEventPumps::unregisterPumpFactory(const std::string& name) +{ + auto tfound = mTypes.find(name); + if (tfound != mTypes.end()) + { + auto ffound = mFactories.find(tfound->second); + if (ffound != mFactories.end()) + { + mFactories.erase(ffound); + } + mTypes.erase(tfound); + } +} + LLEventPump& LLEventPumps::obtain(const std::string& name) { PumpMap::iterator found = mPumpMap.find(name); @@ -114,7 +173,7 @@ LLEventPump& LLEventPumps::make(const std::string& name, bool tweak, // Passing an unrecognized type name is a no-no LLTHROW(BadType(type)); } - auto newInstance = (found->second)(name, tweak); + auto newInstance = (found->second)(name, tweak, type); // LLEventPump's constructor implicitly registers each new instance in // mPumpMap. But remember that we instantiated it (in mOurPumps) so we'll // delete it later. diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index ae6e5aabc9..c1dbf4392f 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -268,6 +268,45 @@ public: LLEventPump& make(const std::string& name, bool tweak=false, const std::string& type=std::string()); + /// function passed to registerTypeFactory() + typedef std::function TypeFactory; + + /** + * Register a TypeFactory for use with make(). When make() is called with + * the specified @a type string, call @a factory(name, tweak, type) to + * instantiate it. + * + * Returns true if successfully registered, false if there already exists + * a TypeFactory for the specified @a type name. + */ + bool registerTypeFactory(const std::string& type, const TypeFactory& factory); + void unregisterTypeFactory(const std::string& type); + + /// function passed to registerPumpFactory() + typedef std::function PumpFactory; + + /** + * Register a PumpFactory for use with obtain(). When obtain() is called + * with the specified @a name string, if an LLEventPump with the specified + * @a name doesn't already exist, call @a factory(name) to instantiate it. + * + * Returns true if successfully registered, false if there already exists + * a factory override for the specified @a name. + * + * PumpFactory does not support @a tweak because it's only called when + * that particular @a name is passed to obtain(). Bear in mind that + * obtain(name) might still bypass the caller's PumpFactory for a + * couple different reasons: + * + * * registerPumpFactory() returns false because there's already a factory + * override for the specified @name + * * between a successful registerPumpFactory(name) call (returns + * true) and a call to obtain(name), someone explicitly + * instantiated an LLEventPump(name), so obtain(name) returned that. + */ + bool registerPumpFactory(const std::string& name, const PumpFactory& factory); + void unregisterPumpFactory(const std::string& name); + /** * Find the named LLEventPump instance. If it exists post the message to it. * If the pump does not exist, do nothing. @@ -325,13 +364,13 @@ testable: typedef std::set PumpSet; PumpSet mOurPumps; // for make(), map string type name to LLEventPump subclass factory function - typedef std::map> PumpFactories; + typedef std::map TypeFactories; // Data used by make(). // One might think mFactories and mTypes could reasonably be static. So // they could -- if not for the fact that make() or obtain() might be // called before this module's static variables have been initialized. // This is why we use singletons in the first place. - PumpFactories mFactories; + TypeFactories mFactories; // for obtain(), map desired string instance name to string type when // obtain() must create the instance diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index 5b5bf97cef..8f88e728ce 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -340,11 +340,28 @@ public: } else { - // The LLSD object we got from our stream contains the keys we - // need. - LLEventPumps::instance().obtain(data["pump"]).post(data["data"]); - // Block calls to this method; resetting mBlocker unblocks calls - // to the other method. + try + { + // The LLSD object we got from our stream contains the + // keys we need. + LLEventPumps::instance().obtain(data["pump"]).post(data["data"]); + } + catch (const std::exception& err) + { + // No plugin should be allowed to crash the viewer by + // driving an exception -- intentionally or not. + LOG_UNHANDLED_EXCEPTION(stringize("handling request ", data)); + // Whether or not the plugin added a "reply" key to the + // request, send a reply. We happen to know who originated + // this request, and the reply LLEventPump of interest. + // Not our problem if the plugin ignores the reply event. + data["reply"] = mReplyPump.getName(); + sendReply(llsd::map("error", + stringize(LLError::Log::classname(err), ": ", err.what())), + data); + } + // Block calls to this method; resetting mBlocker unblocks + // calls to the other method. mBlocker.reset(new LLEventPump::Blocker(mStdoutDataConnection)); // Go check for any more pending events in the buffer. if (childout.size()) diff --git a/indra/llcommon/llleaplistener.cpp b/indra/llcommon/llleaplistener.cpp index 11bfec1b31..471f52e91c 100644 --- a/indra/llcommon/llleaplistener.cpp +++ b/indra/llcommon/llleaplistener.cpp @@ -14,14 +14,16 @@ // associated header #include "llleaplistener.h" // STL headers -#include +#include // std::find_if #include +#include +#include // std headers // external library headers -#include // other Linden headers -#include "lluuid.h" +#include "lazyeventapi.h" #include "llsdutil.h" +#include "lluuid.h" #include "stringize.h" /***************************************************************************** @@ -110,7 +112,7 @@ LLLeapListener::~LLLeapListener() // value_type, and Bad Things would happen if you copied an // LLTempBoundListener. (Destruction of the original would disconnect the // listener, invalidating every stored connection.) - BOOST_FOREACH(ListenersMap::value_type& pair, mListeners) + for (ListenersMap::value_type& pair : mListeners) { pair.second.disconnect(); } @@ -208,31 +210,65 @@ void LLLeapListener::getAPIs(const LLSD& request) const { Response reply(LLSD(), request); + // first, traverse existing LLEventAPI instances + std::set instances; for (auto& ea : LLEventAPI::instance_snapshot()) { - LLSD info; - info["desc"] = ea.getDesc(); - reply[ea.getName()] = info; + // remember which APIs are actually instantiated + instances.insert(ea.getName()); + reply[ea.getName()] = llsd::map("desc", ea.getDesc()); } + // supplement that with *potential* instances: that is, instances of + // LazyEventAPI that can each instantiate an LLEventAPI on demand + for (const auto& lea : LL::LazyEventAPIBase::instance_snapshot()) + { + // skip any LazyEventAPI that's already instantiated its LLEventAPI + if (instances.find(lea.getName()) == instances.end()) + { + reply[lea.getName()] = llsd::map("desc", lea.getDesc()); + } + } +} + +// Because LazyEventAPI deliberately mimics LLEventAPI's query API, this +// function can be passed either -- even though they're unrelated types. +template +void reportAPI(LLEventAPI::Response& reply, const API& api) +{ + reply["name"] = api.getName(); + reply["desc"] = api.getDesc(); + reply["key"] = api.getDispatchKey(); + LLSD ops; + for (const auto& namedesc : api) + { + ops.append(api.getMetadata(namedesc.first)); + } + reply["ops"] = ops; } void LLLeapListener::getAPI(const LLSD& request) const { Response reply(LLSD(), request); - auto found = LLEventAPI::getInstance(request["api"]); - if (found) + // check first among existing LLEventAPI instances + auto foundea = LLEventAPI::getInstance(request["api"]); + if (foundea) { - reply["name"] = found->getName(); - reply["desc"] = found->getDesc(); - reply["key"] = found->getDispatchKey(); - LLSD ops; - for (LLEventAPI::const_iterator oi(found->begin()), oend(found->end()); - oi != oend; ++oi) + reportAPI(reply, *foundea); + } + else + { + // Here the requested LLEventAPI doesn't yet exist, but do we have a + // registered LazyEventAPI for it? + LL::LazyEventAPIBase::instance_snapshot snap; + auto foundlea = std::find_if(snap.begin(), snap.end(), + [api = request["api"].asString()] + (const auto& lea) + { return (lea.getName() == api); }); + if (foundlea != snap.end()) { - ops.append(found->getMetadata(oi->first)); + reportAPI(reply, *foundlea); } - reply["ops"] = ops; } } diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index 97a38ea992..0d65762284 100644 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -529,6 +529,7 @@ LLProcess::LLProcess(const LLSDOrParams& params): // preserve existing semantics, we promise that mAttached defaults to the // same setting as mAutokill. mAttached(params.attached.isProvided()? params.attached : params.autokill), + mPool(NULL), mPipes(NSLOTS) { // Hmm, when you construct a ptr_vector with a size, it merely reserves @@ -549,8 +550,14 @@ LLProcess::LLProcess(const LLSDOrParams& params): mPostend = params.postend; + apr_pool_create(&mPool, gAPRPoolp); + if (!mPool) + { + LLTHROW(LLProcessError(STRINGIZE("failed to create apr pool"))); + } + apr_procattr_t *procattr = NULL; - chkapr(apr_procattr_create(&procattr, gAPRPoolp)); + chkapr(apr_procattr_create(&procattr, mPool)); // IQA-490, CHOP-900: On Windows, ask APR to jump through hoops to // constrain the set of handles passed to the child process. Before we @@ -689,14 +696,14 @@ LLProcess::LLProcess(const LLSDOrParams& params): // one. Hand-expand chkapr() macro so we can fill in the actual command // string instead of the variable names. if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], NULL, procattr, - gAPRPoolp))) + mPool))) { LLTHROW(LLProcessError(STRINGIZE(params << " failed"))); } // arrange to call status_callback() apr_proc_other_child_register(&mProcess, &LLProcess::status_callback, this, mProcess.in, - gAPRPoolp); + mPool); // and make sure we poll it once per "mainloop" tick sProcessListener.addPoll(*this); mStatus.mState = RUNNING; @@ -815,6 +822,12 @@ LLProcess::~LLProcess() { kill("destructor"); } + + if (mPool) + { + apr_pool_destroy(mPool); + mPool = NULL; + } } bool LLProcess::kill(const std::string& who) diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h index e3386ad88e..0842f2eb07 100644 --- a/indra/llcommon/llprocess.h +++ b/indra/llcommon/llprocess.h @@ -568,6 +568,7 @@ private: // explicitly want this ptr_vector to be able to store NULLs typedef boost::ptr_vector< boost::nullable > PipeVector; PipeVector mPipes; + apr_pool_t* mPool; }; /// for logging diff --git a/indra/llcommon/llptrto.h b/indra/llcommon/llptrto.h index 4082e30de6..9ef279fdbf 100644 --- a/indra/llcommon/llptrto.h +++ b/indra/llcommon/llptrto.h @@ -33,9 +33,12 @@ #include "llpointer.h" #include "llrefcount.h" // LLRefCount +#include +#include #include #include -#include +#include // std::shared_ptr, std::unique_ptr +#include /** * LLPtrTo::type is either of two things: @@ -55,14 +58,14 @@ struct LLPtrTo /// specialize for subclasses of LLRefCount template -struct LLPtrTo >::type> +struct LLPtrTo::value >::type> { typedef LLPointer type; }; /// specialize for subclasses of LLThreadSafeRefCount template -struct LLPtrTo >::type> +struct LLPtrTo::value >::type> { typedef LLPointer type; }; @@ -83,4 +86,83 @@ struct LLRemovePointer< LLPointer > typedef SOMECLASS type; }; +namespace LL +{ + +/***************************************************************************** +* get_ref() +*****************************************************************************/ + template + struct GetRef + { + // return const ref or non-const ref, depending on whether we can bind + // a non-const lvalue ref to the argument + const auto& operator()(const T& obj) const { return obj; } + auto& operator()(T& obj) const { return obj; } + }; + + template + struct GetRef + { + const auto& operator()(const T* ptr) const { return *ptr; } + }; + + template + struct GetRef + { + auto& operator()(T* ptr) const { return *ptr; } + }; + + template + struct GetRef< LLPointer > + { + auto& operator()(LLPointer ptr) const { return *ptr; } + }; + + /// whether we're passed a pointer or a reference, return a reference + template + auto& get_ref(T& ptr_or_ref) + { + return GetRef::type>()(ptr_or_ref); + } + + template + const auto& get_ref(const T& ptr_or_ref) + { + return GetRef::type>()(ptr_or_ref); + } + +/***************************************************************************** +* get_ptr() +*****************************************************************************/ + // if T is any pointer type we recognize, return it unchanged + template + const T* get_ptr(const T* ptr) { return ptr; } + + template + T* get_ptr(T* ptr) { return ptr; } + + template + const std::shared_ptr& get_ptr(const std::shared_ptr& ptr) { return ptr; } + + template + const std::unique_ptr& get_ptr(const std::unique_ptr& ptr) { return ptr; } + + template + const boost::shared_ptr& get_ptr(const boost::shared_ptr& ptr) { return ptr; } + + template + const boost::intrusive_ptr& get_ptr(const boost::intrusive_ptr& ptr) { return ptr; } + + template + const LLPointer& get_ptr(const LLPointer& ptr) { return ptr; } + + // T is not any pointer type we recognize, take a pointer to the parameter + template + const T* get_ptr(const T& obj) { return &obj; } + + template + T* get_ptr(T& obj) { return &obj; } +} // namespace LL + #endif /* ! defined(LL_LLPTRTO_H) */ diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp index f70bee9903..e98fc0285a 100644 --- a/indra/llcommon/llsdutil.cpp +++ b/indra/llcommon/llsdutil.cpp @@ -1046,3 +1046,38 @@ LLSD llsd_shallow(LLSD value, LLSD filter) return shallow; } + +LLSD LL::apply_llsd_fix(size_t arity, const LLSD& args) +{ + // LLSD supports a number of types, two of which are aggregates: Map and + // Array. We don't try to support Map: supporting Map would seem to + // promise that we could somehow match the string key to 'func's parameter + // names. Uh sorry, maybe in some future version of C++ with reflection. + if (args.isMap()) + { + LLTHROW(LL::apply_error("LL::apply(function, Map LLSD) unsupported")); + } + // We expect an LLSD array, but what the heck, treat isUndefined() as a + // zero-length array for calling a nullary 'func'. + if (args.isUndefined() || args.isArray()) + { + // this works because LLSD().size() == 0 + if (args.size() != arity) + { + LLTHROW(LL::apply_error(stringize("LL::apply(function(", arity, " args), ", + args.size(), "-entry LLSD array)"))); + } + return args; + } + + // args is one of the scalar types + // scalar_LLSD.size() == 0, so don't test that here. + // You can pass a scalar LLSD only to a unary 'func'. + if (arity != 1) + { + LLTHROW(LL::apply_error(stringize("LL::apply(function(", arity, " args), " + "LLSD ", LLSD::typeString(args.type()), ")"))); + } + // make an array of it + return llsd::array(args); +} diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 372278c51a..ad54d1b0be 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -29,8 +29,14 @@ #ifndef LL_LLSDUTIL_H #define LL_LLSDUTIL_H +#include "apply.h" // LL::invoke() +#include "function_types.h" // LL::function_arity #include "llsd.h" #include +#include +#include // std::shared_ptr +#include +#include // U32 LL_COMMON_API LLSD ll_sd_from_U32(const U32); @@ -298,6 +304,11 @@ LLSD map(Ts&&... vs) /***************************************************************************** * LLSDParam *****************************************************************************/ +struct LLSDParamBase +{ + virtual ~LLSDParamBase() {} +}; + /** * LLSDParam is a customization point for passing LLSD values to function * parameters of more or less arbitrary type. LLSD provides a small set of @@ -315,7 +326,7 @@ LLSD map(Ts&&... vs) * @endcode */ template -class LLSDParam +class LLSDParam: public LLSDParamBase { public: /** @@ -323,13 +334,66 @@ public: * value for later retrieval */ LLSDParam(const LLSD& value): - _value(value) + value_(value) {} - operator T() const { return _value; } + operator T() const { return value_; } private: - T _value; + T value_; +}; + +/** + * LLSDParam is for when you don't already have the target parameter + * type in hand. Instantiate LLSDParam(your LLSD object), and the + * templated conversion operator will try to select a more specific LLSDParam + * specialization. + */ +template <> +class LLSDParam: public LLSDParamBase +{ +private: + LLSD value_; + // LLSDParam::operator T() works by instantiating an LLSDParam on + // demand. Returning that engages LLSDParam::operator T(), producing + // the desired result. But LLSDParam owns a std::string whose + // c_str() is returned by its operator const char*(). If we return a temp + // LLSDParam, the compiler can destroy it right away, as soon + // as we've called operator const char*(). That's a problem! That + // invalidates the const char* we've just passed to the subject function. + // This LLSDParam is presumably guaranteed to survive until the + // subject function has returned, so we must ensure that any constructed + // LLSDParam lives just as long as this LLSDParam does. Putting + // each LLSDParam on the heap and capturing a smart pointer in a vector + // works. We would have liked to use std::unique_ptr, but vector entries + // must be copyable. + // (Alternatively we could assume that every instance of LLSDParam + // will be asked for at most ONE conversion. We could store a scalar + // std::unique_ptr and, when constructing an new LLSDParam, assert that + // the unique_ptr is empty. But some future change in usage patterns, and + // consequent failure of that assertion, would be very mysterious. Instead + // of explaining how to fix it, just fix it now.) + mutable std::vector> converters_; + +public: + LLSDParam(const LLSD& value): value_(value) {} + + /// if we're literally being asked for an LLSD parameter, avoid infinite + /// recursion + operator LLSD() const { return value_; } + + /// otherwise, instantiate a more specific LLSDParam to convert; that + /// preserves the existing customization mechanism + template + operator T() const + { + // capture 'ptr' with the specific subclass type because converters_ + // only stores LLSDParamBase pointers + auto ptr{ std::make_shared>>(value_) }; + // keep the new converter alive until we ourselves are destroyed + converters_.push_back(ptr); + return *ptr; + } }; /** @@ -346,17 +410,17 @@ private: */ #define LLSDParam_for(T, AS) \ template <> \ -class LLSDParam \ +class LLSDParam: public LLSDParamBase \ { \ public: \ LLSDParam(const LLSD& value): \ - _value((T)value.AS()) \ + value_((T)value.AS()) \ {} \ \ - operator T() const { return _value; } \ + operator T() const { return value_; } \ \ private: \ - T _value; \ + T value_; \ } LLSDParam_for(float, asReal); @@ -372,31 +436,31 @@ LLSDParam_for(LLSD::Binary, asBinary); * safely pass an LLSDParam(yourLLSD). */ template <> -class LLSDParam +class LLSDParam: public LLSDParamBase { private: // The difference here is that we store a std::string rather than a const // char*. It's important that the LLSDParam object own the std::string. - std::string _value; + std::string value_; // We don't bother storing the incoming LLSD object, but we do have to - // distinguish whether _value is an empty string because the LLSD object + // distinguish whether value_ is an empty string because the LLSD object // contains an empty string or because it's isUndefined(). - bool _undefined; + bool undefined_; public: LLSDParam(const LLSD& value): - _value(value), - _undefined(value.isUndefined()) + value_(value), + undefined_(value.isUndefined()) {} - // The const char* we retrieve is for storage owned by our _value member. + // The const char* we retrieve is for storage owned by our value_ member. // That's how we guarantee that the const char* is valid for the lifetime // of this LLSDParam object. Constructing your LLSDParam in the argument // list should ensure that the LLSDParam object will persist for the // duration of the function call. operator const char*() const { - if (_undefined) + if (undefined_) { // By default, an isUndefined() LLSD object's asString() method // will produce an empty string. But for a function accepting @@ -406,7 +470,7 @@ public: // case, though, no LLSD value could pass NULL. return NULL; } - return _value.c_str(); + return value_.c_str(); } }; @@ -555,4 +619,56 @@ struct hash } }; } + +namespace LL +{ + +/***************************************************************************** +* apply(function, LLSD array) +*****************************************************************************/ +// validate incoming LLSD blob, and return an LLSD array suitable to pass to +// the function of interest +LLSD apply_llsd_fix(size_t arity, const LLSD& args); + +// Derived from https://stackoverflow.com/a/20441189 +// and https://en.cppreference.com/w/cpp/utility/apply . +// We can't simply make a tuple from the LLSD array and then apply() that +// tuple to the function -- how would make_tuple() deduce the correct +// parameter type for each entry? We must go directly to the target function. +template +auto apply_impl(CALLABLE&& func, const LLSD& array, std::index_sequence) +{ + // call func(unpacked args), using generic LLSDParam to convert each + // entry in 'array' to the target parameter type + return std::forward(func)(LLSDParam(array[I])...); +} + +// use apply_n(function, LLSD) to call a specific arity of a variadic +// function with (that many) items from the passed LLSD array +template +auto apply_n(CALLABLE&& func, const LLSD& args) +{ + return apply_impl(std::forward(func), + apply_llsd_fix(ARITY, args), + std::make_index_sequence()); +} + +/** + * apply(function, LLSD) goes beyond C++17 std::apply(). For this case + * @a function @emph cannot be variadic: the compiler must know at compile + * time how many arguments to pass. This isn't Python. (But see apply_n() to + * pass a specific number of args to a variadic function.) + */ +template +auto apply(CALLABLE&& func, const LLSD& args) +{ + // infer arity from the definition of func + constexpr auto arity = function_arity< + typename std::remove_reference::type>::value; + // now that we have a compile-time arity, apply_n() works + return apply_n(std::forward(func), args); +} + +} // namespace LL + #endif // LL_LLSDUTIL_H diff --git a/indra/llcommon/tests/apply_test.cpp b/indra/llcommon/tests/apply_test.cpp new file mode 100644 index 0000000000..56b497e0c8 --- /dev/null +++ b/indra/llcommon/tests/apply_test.cpp @@ -0,0 +1,240 @@ +/** + * @file apply_test.cpp + * @author Nat Goodspeed + * @date 2022-12-19 + * @brief Test for apply. + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "apply.h" +// STL headers +// std headers +#include +// external library headers +// other Linden headers +#include "llsd.h" +#include "llsdutil.h" +#include +#include +#include + +// for ensure_equals +std::ostream& operator<<(std::ostream& out, const std::vector& stringvec) +{ + const char* delim = "["; + for (const auto& str : stringvec) + { + out << delim << std::quoted(str); + delim = ", "; + } + return out << ']'; +} + +// the above must be declared BEFORE ensure_equals(std::vector) +#include "../test/lltut.h" + +/***************************************************************************** +* TUT +*****************************************************************************/ +namespace tut +{ + namespace statics + { + /*------------------------------ data ------------------------------*/ + // Although we're using types from the LLSD namespace, we're not + // constructing LLSD values, but rather instances of the C++ types + // supported by LLSD. + static LLSD::Boolean b{true}; + static LLSD::Integer i{17}; + static LLSD::Real f{3.14}; + static LLSD::String s{ "hello" }; + static LLSD::UUID uu{ "baadf00d-dead-beef-baad-feedb0ef" }; + static LLSD::Date dt{ "2022-12-19" }; + static LLSD::URI uri{ "http://secondlife.com" }; + static LLSD::Binary bin{ 0x01, 0x02, 0x03, 0x04, 0x05 }; + + static std::vector quick + { + "The", "quick", "brown", "fox", "etc." + }; + + static std::array fibs + { + 0, 1, 1, 2, 3 + }; + + // ensure that apply() actually reaches the target method -- + // lack of ensure_equals() failure could be due to no-op apply() + bool called{ false }; + // capture calls from collect() + std::vector collected; + + /*------------------------- test functions -------------------------*/ + void various(LLSD::Boolean b, LLSD::Integer i, LLSD::Real f, const LLSD::String& s, + const LLSD::UUID& uu, const LLSD::Date& dt, + const LLSD::URI& uri, const LLSD::Binary& bin) + { + called = true; + ensure_equals( "b mismatch", b, statics::b); + ensure_equals( "i mismatch", i, statics::i); + ensure_equals( "f mismatch", f, statics::f); + ensure_equals( "s mismatch", s, statics::s); + ensure_equals( "uu mismatch", uu, statics::uu); + ensure_equals( "dt mismatch", dt, statics::dt); + ensure_equals("uri mismatch", uri, statics::uri); + ensure_equals("bin mismatch", bin, statics::bin); + } + + void strings(std::string s0, std::string s1, std::string s2, std::string s3, std::string s4) + { + called = true; + ensure_equals("s0 mismatch", s0, statics::quick[0]); + ensure_equals("s1 mismatch", s1, statics::quick[1]); + ensure_equals("s2 mismatch", s2, statics::quick[2]); + ensure_equals("s3 mismatch", s3, statics::quick[3]); + ensure_equals("s4 mismatch", s4, statics::quick[4]); + } + + void ints(int i0, int i1, int i2, int i3, int i4) + { + called = true; + ensure_equals("i0 mismatch", i0, statics::fibs[0]); + ensure_equals("i1 mismatch", i1, statics::fibs[1]); + ensure_equals("i2 mismatch", i2, statics::fibs[2]); + ensure_equals("i3 mismatch", i3, statics::fibs[3]); + ensure_equals("i4 mismatch", i4, statics::fibs[4]); + } + + void sdfunc(const LLSD& sd) + { + called = true; + ensure_equals("sd mismatch", sd.asInteger(), statics::i); + } + + void intfunc(int i) + { + called = true; + ensure_equals("i mismatch", i, statics::i); + } + + void voidfunc() + { + called = true; + } + + // recursion tail + void collect() + { + called = true; + } + + // collect(arbitrary) + template + void collect(const std::string& first, ARGS&&... rest) + { + statics::collected.push_back(first); + collect(std::forward(rest)...); + } + } // namespace statics + + struct apply_data + { + apply_data() + { + // reset called before each test + statics::called = false; + statics::collected.clear(); + } + }; + typedef test_group apply_group; + typedef apply_group::object object; + apply_group applygrp("apply"); + + template<> template<> + void object::test<1>() + { + set_test_name("apply(tuple)"); + LL::apply(statics::various, + std::make_tuple(statics::b, statics::i, statics::f, statics::s, + statics::uu, statics::dt, statics::uri, statics::bin)); + ensure("apply(tuple) failed", statics::called); + } + + template<> template<> + void object::test<2>() + { + set_test_name("apply(array)"); + LL::apply(statics::ints, statics::fibs); + ensure("apply(array) failed", statics::called); + } + + template<> template<> + void object::test<3>() + { + set_test_name("apply(vector)"); + LL::apply(statics::strings, statics::quick); + ensure("apply(vector) failed", statics::called); + } + + // The various apply(LLSD) tests exercise only the success cases because + // the failure cases trigger assert() fail, which is hard to catch. + template<> template<> + void object::test<4>() + { + set_test_name("apply(LLSD())"); + LL::apply(statics::voidfunc, LLSD()); + ensure("apply(LLSD()) failed", statics::called); + } + + template<> template<> + void object::test<5>() + { + set_test_name("apply(fn(int), LLSD scalar)"); + LL::apply(statics::intfunc, LLSD(statics::i)); + ensure("apply(fn(int), LLSD scalar) failed", statics::called); + } + + template<> template<> + void object::test<6>() + { + set_test_name("apply(fn(LLSD), LLSD scalar)"); + // This test verifies that LLSDParam doesn't send the compiler + // into infinite recursion when the target is itself LLSD. + LL::apply(statics::sdfunc, LLSD(statics::i)); + ensure("apply(fn(LLSD), LLSD scalar) failed", statics::called); + } + + template<> template<> + void object::test<7>() + { + set_test_name("apply(LLSD array)"); + LL::apply(statics::various, + llsd::array(statics::b, statics::i, statics::f, statics::s, + statics::uu, statics::dt, statics::uri, statics::bin)); + ensure("apply(LLSD array) failed", statics::called); + } + + template<> template<> + void object::test<8>() + { + set_test_name("VAPPLY()"); + // Make a std::array from statics::quick. We can't call a + // variadic function with a data structure of dynamic length. + std::array strray; + for (size_t i = 0; i < strray.size(); ++i) + strray[i] = statics::quick[i]; + // This doesn't work: the compiler doesn't know which overload of + // collect() to pass to LL::apply(). + // LL::apply(statics::collect, strray); + // That's what VAPPLY() is for. + VAPPLY(statics::collect, strray); + ensure("VAPPLY() failed", statics::called); + ensure_equals("collected mismatch", statics::collected, statics::quick); + } +} // namespace tut diff --git a/indra/llcommon/tests/lazyeventapi_test.cpp b/indra/llcommon/tests/lazyeventapi_test.cpp new file mode 100644 index 0000000000..31b2d6d17f --- /dev/null +++ b/indra/llcommon/tests/lazyeventapi_test.cpp @@ -0,0 +1,136 @@ +/** + * @file lazyeventapi_test.cpp + * @author Nat Goodspeed + * @date 2022-06-18 + * @brief Test for lazyeventapi. + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lazyeventapi.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "../test/lltut.h" +#include "llevents.h" +#include "llsdutil.h" + +// observable side effect, solely for testing +static LLSD data; + +// LLEventAPI listener subclass +class MyListener: public LLEventAPI +{ +public: + // need this trivial forwarding constructor + // (of course do any other initialization your subclass requires) + MyListener(const LL::LazyEventAPIParams& params): + LLEventAPI(params) + {} + + // example operation, registered by LazyEventAPI subclass below + void set_data(const LLSD& event) + { + data = event["data"]; + } +}; + +// LazyEventAPI registrar subclass +class MyRegistrar: public LL::LazyEventAPI +{ + using super = LL::LazyEventAPI; + using super::listener; +public: + // LazyEventAPI subclass initializes like a classic LLEventAPI subclass + // constructor, with API name and desc plus add() calls for the defined + // operations + MyRegistrar(): + super("Test", "This is a test LLEventAPI") + { + add("set", "This is a set operation", &listener::set_data); + } +}; +// Normally we'd declare a static instance of MyRegistrar -- but because we +// want to test both with and without, defer declaration to individual test +// methods. + +/***************************************************************************** +* TUT +*****************************************************************************/ +namespace tut +{ + struct lazyeventapi_data + { + lazyeventapi_data() + { + // before every test, reset 'data' + data.clear(); + } + ~lazyeventapi_data() + { + // after every test, reset LLEventPumps + LLEventPumps::deleteSingleton(); + } + }; + typedef test_group lazyeventapi_group; + typedef lazyeventapi_group::object object; + lazyeventapi_group lazyeventapigrp("lazyeventapi"); + + template<> template<> + void object::test<1>() + { + set_test_name("LazyEventAPI"); + // this is where the magic (should) happen + // 'register' still a keyword until C++17 + MyRegistrar regster; + LLEventPumps::instance().obtain("Test").post(llsd::map("op", "set", "data", "hey")); + ensure_equals("failed to set data", data.asString(), "hey"); + } + + template<> template<> + void object::test<2>() + { + set_test_name("No LazyEventAPI"); + // Because the MyRegistrar declaration in test<1>() is local, because + // it has been destroyed, we fully expect NOT to reach a MyListener + // instance with this post. + LLEventPumps::instance().obtain("Test").post(llsd::map("op", "set", "data", "moot")); + ensure("accidentally set data", ! data.isDefined()); + } + + template<> template<> + void object::test<3>() + { + set_test_name("LazyEventAPI metadata"); + MyRegistrar regster; + // Of course we have 'regster' in hand; we don't need to search for + // it. But this next test verifies that we can find (all) LazyEventAPI + // instances using LazyEventAPIBase::instance_snapshot. Normally we + // wouldn't search; normally we'd just look at each instance in the + // loop body. + const MyRegistrar* found = nullptr; + for (const auto& registrar : LL::LazyEventAPIBase::instance_snapshot()) + if ((found = dynamic_cast(®istrar))) + break; + ensure("Failed to find MyRegistrar via LLInstanceTracker", found); + + ensure_equals("wrong API name", found->getName(), "Test"); + ensure_contains("wrong API desc", found->getDesc(), "test LLEventAPI"); + ensure_equals("wrong API field", found->getDispatchKey(), "op"); + // Normally we'd just iterate over *found. But for test purposes, + // actually capture the range of NameDesc pairs in a vector. + std::vector ops{ found->begin(), found->end() }; + ensure_equals("failed to find operations", ops.size(), 1); + ensure_equals("wrong operation name", ops[0].first, "set"); + ensure_contains("wrong operation desc", ops[0].second, "set operation"); + LLSD metadata{ found->getMetadata(ops[0].first) }; + ensure_equals("bad metadata name", metadata["name"].asString(), ops[0].first); + ensure_equals("bad metadata desc", metadata["desc"].asString(), ops[0].second); + } +} // namespace tut diff --git a/indra/llcommon/tests/lleventdispatcher_test.cpp b/indra/llcommon/tests/lleventdispatcher_test.cpp index 466f11f52a..b0c532887c 100644 --- a/indra/llcommon/tests/lleventdispatcher_test.cpp +++ b/indra/llcommon/tests/lleventdispatcher_test.cpp @@ -18,9 +18,12 @@ // external library headers // other Linden headers #include "../test/lltut.h" +#include "lleventfilter.h" #include "llsd.h" #include "llsdutil.h" +#include "llevents.h" #include "stringize.h" +#include "StringVec.h" #include "tests/wrapllerrs.h" #include "../test/catch_and_store_what_in.h" #include "../test/debug.h" @@ -32,8 +35,6 @@ #include #include #include -#include -#define foreach BOOST_FOREACH #include @@ -177,6 +178,7 @@ struct Vars /*-------- Arbitrary-params (non-const, const, static) methods ---------*/ void methodna(NPARAMSa) { + DEBUG; // Because our const char* param cp might be NULL, and because we // intend to capture the value in a std::string, have to distinguish // between the NULL value and any non-NULL value. Use a convention @@ -188,7 +190,7 @@ struct Vars else vcp = std::string("'") + cp + "'"; - debug()("methodna(", b, + this->debug()("methodna(", b, ", ", i, ", ", f, ", ", d, @@ -205,7 +207,7 @@ struct Vars void methodnb(NPARAMSb) { std::ostringstream vbin; - foreach(U8 byte, bin) + for (U8 byte: bin) { vbin << std::hex << std::setfill('0') << std::setw(2) << unsigned(byte); } @@ -226,7 +228,8 @@ struct Vars void cmethodna(NPARAMSa) const { - debug()('c', NONL); + DEBUG; + this->debug()('c', NONL); const_cast(this)->methodna(NARGSa); } @@ -315,6 +318,31 @@ void freenb(NPARAMSb) *****************************************************************************/ namespace tut { + void ensure_has(const std::string& outer, const std::string& inner) + { + ensure(stringize("'", outer, "' does not contain '", inner, "'"), + outer.find(inner) != std::string::npos); + } + + template + std::string call_exc(CALLABLE&& func, const std::string& exc_frag) + { + std::string what = + catch_what(std::forward(func)); + ensure_has(what, exc_frag); + return what; + } + + template + void call_logerr(CALLABLE&& func, const std::string& frag) + { + CaptureLog capture; + // the error should be logged; we just need to stop the exception + // propagating + catch_what(std::forward(func)); + capture.messageWith(frag); + } + struct lleventdispatcher_data { Debug debug{"test"}; @@ -397,9 +425,9 @@ namespace tut work.add(name, desc, &Dispatcher::cmethod1, required); // Non-subclass method with/out required params addf("method1", "method1", &v); - work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1)); + work.add(name, desc, [this](const LLSD& args){ return v.method1(args); }); addf("method1_req", "method1", &v); - work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1), required); + work.add(name, desc, [this](const LLSD& args){ return v.method1(args); }, required); /*--------------- Arbitrary params, array style ----------------*/ @@ -461,7 +489,7 @@ namespace tut debug("dft_array_full:\n", dft_array_full); // Partial defaults arrays. - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { LLSD::Integer partition(std::min(partial_offset, dft_array_full[a].size())); dft_array_partial[a] = @@ -471,7 +499,7 @@ namespace tut debug("dft_array_partial:\n", dft_array_partial); - foreach(LLSD::String a, ab) + for(LLSD::String a: ab) { // Generate full defaults maps by zipping (params, dft_array_full). dft_map_full[a] = zipmap(params[a], dft_array_full[a]); @@ -583,6 +611,7 @@ namespace tut void addf(const std::string& n, const std::string& d, Vars* v) { + debug("addf('", n, "', '", d, "')"); // This method is to capture in our own DescMap the name and // description of every registered function, for metadata query // testing. @@ -598,19 +627,14 @@ namespace tut { // Copy descs to a temp map of same type. DescMap forgotten(descs.begin(), descs.end()); - // LLEventDispatcher intentionally provides only const_iterator: - // since dereferencing that iterator generates values on the fly, - // it's meaningless to have a modifiable iterator. But since our - // 'work' object isn't const, by default BOOST_FOREACH() wants to - // use non-const iterators. Persuade it to use the const_iterator. - foreach(LLEventDispatcher::NameDesc nd, const_cast(work)) + for (LLEventDispatcher::NameDesc nd: work) { DescMap::iterator found = forgotten.find(nd.first); - ensure(STRINGIZE("LLEventDispatcher records function '" << nd.first - << "' we didn't enter"), + ensure(stringize("LLEventDispatcher records function '", nd.first, + "' we didn't enter"), found != forgotten.end()); - ensure_equals(STRINGIZE("LLEventDispatcher desc '" << nd.second << - "' doesn't match what we entered: '" << found->second << "'"), + ensure_equals(stringize("LLEventDispatcher desc '", nd.second, + "' doesn't match what we entered: '", found->second, "'"), nd.second, found->second); // found in our map the name from LLEventDispatcher, good, erase // our map entry @@ -621,41 +645,49 @@ namespace tut std::ostringstream out; out << "LLEventDispatcher failed to report"; const char* delim = ": "; - foreach(const DescMap::value_type& fme, forgotten) + for (const DescMap::value_type& fme: forgotten) { out << delim << fme.first; delim = ", "; } - ensure(out.str(), false); + throw failure(out.str()); } } Vars* varsfor(const std::string& name) { VarsMap::const_iterator found = funcvars.find(name); - ensure(STRINGIZE("No Vars* for " << name), found != funcvars.end()); - ensure(STRINGIZE("NULL Vars* for " << name), found->second); + ensure(stringize("No Vars* for ", name), found != funcvars.end()); + ensure(stringize("NULL Vars* for ", name), found->second); return found->second; } - void ensure_has(const std::string& outer, const std::string& inner) + std::string call_exc(const std::string& func, const LLSD& args, const std::string& exc_frag) { - ensure(STRINGIZE("'" << outer << "' does not contain '" << inner << "'").c_str(), - outer.find(inner) != std::string::npos); + return tut::call_exc( + [this, func, args]() + { + if (func.empty()) + { + work(args); + } + else + { + work(func, args); + } + }, + exc_frag); } - void call_exc(const std::string& func, const LLSD& args, const std::string& exc_frag) + void call_logerr(const std::string& func, const LLSD& args, const std::string& frag) { - std::string threw = catch_what([this, &func, &args](){ - work(func, args); - }); - ensure_has(threw, exc_frag); + tut::call_logerr([this, func, args](){ work(func, args); }, frag); } LLSD getMetadata(const std::string& name) { LLSD meta(work.getMetadata(name)); - ensure(STRINGIZE("No metadata for " << name), meta.isDefined()); + ensure(stringize("No metadata for ", name), meta.isDefined()); return meta; } @@ -724,7 +756,7 @@ namespace tut set_test_name("map-style registration with non-array params"); // Pass "param names" as scalar or as map LLSD attempts(llsd::array(17, LLSDMap("pi", 3.14)("two", 2))); - foreach(LLSD ae, inArray(attempts)) + for (LLSD ae: inArray(attempts)) { std::string threw = catch_what([this, &ae](){ work.add("freena_err", "freena", freena, ae); @@ -799,7 +831,7 @@ namespace tut { set_test_name("query Callables with/out required params"); LLSD names(llsd::array("free1", "Dmethod1", "Dcmethod1", "method1")); - foreach(LLSD nm, inArray(names)) + for (LLSD nm: inArray(names)) { LLSD metadata(getMetadata(nm)); ensure_equals("name mismatch", metadata["name"], nm); @@ -828,19 +860,19 @@ namespace tut (5, llsd::array("freena_array", "smethodna_array", "methodna_array")), llsd::array (5, llsd::array("freenb_array", "smethodnb_array", "methodnb_array")))); - foreach(LLSD ae, inArray(expected)) + for (LLSD ae: inArray(expected)) { LLSD::Integer arity(ae[0].asInteger()); LLSD names(ae[1]); LLSD req(LLSD::emptyArray()); if (arity) req[arity - 1] = LLSD(); - foreach(LLSD nm, inArray(names)) + for (LLSD nm: inArray(names)) { LLSD metadata(getMetadata(nm)); ensure_equals("name mismatch", metadata["name"], nm); ensure_equals(metadata["desc"].asString(), descs[nm]); - ensure_equals(STRINGIZE("mismatched required for " << nm.asString()), + ensure_equals(stringize("mismatched required for ", nm.asString()), metadata["required"], req); ensure("should not have optional", metadata["optional"].isUndefined()); } @@ -854,7 +886,7 @@ namespace tut // - (Free function | non-static method), map style, no params (ergo // no defaults) LLSD names(llsd::array("free0_map", "smethod0_map", "method0_map")); - foreach(LLSD nm, inArray(names)) + for (LLSD nm: inArray(names)) { LLSD metadata(getMetadata(nm)); ensure_equals("name mismatch", metadata["name"], nm); @@ -884,7 +916,7 @@ namespace tut llsd::array("smethodnb_map_adft", "smethodnb_map_mdft"), llsd::array("methodna_map_adft", "methodna_map_mdft"), llsd::array("methodnb_map_adft", "methodnb_map_mdft"))); - foreach(LLSD eq, inArray(equivalences)) + for (LLSD eq: inArray(equivalences)) { LLSD adft(eq[0]); LLSD mdft(eq[1]); @@ -898,8 +930,8 @@ namespace tut ensure_equals("mdft name", mdft, mmeta["name"]); ameta.erase("name"); mmeta.erase("name"); - ensure_equals(STRINGIZE("metadata for " << adft.asString() - << " vs. " << mdft.asString()), + ensure_equals(stringize("metadata for ", adft.asString(), + " vs. ", mdft.asString()), ameta, mmeta); } } @@ -915,7 +947,7 @@ namespace tut // params are required. Also maps containing left requirements for // partial defaults arrays. Also defaults maps from defaults arrays. LLSD allreq, leftreq, rightdft; - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { // The map in which all params are required uses params[a] as // keys, with all isUndefined() as values. We can accomplish that @@ -943,9 +975,9 @@ namespace tut // Generate maps containing parameter names not provided by the // dft_map_partial maps. LLSD skipreq(allreq); - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { - foreach(const MapEntry& me, inMap(dft_map_partial[a])) + for (const MapEntry& me: inMap(dft_map_partial[a])) { skipreq[a].erase(me.first); } @@ -990,7 +1022,7 @@ namespace tut (llsd::array("freenb_map_mdft", "smethodnb_map_mdft", "methodnb_map_mdft"), llsd::array(LLSD::emptyMap(), dft_map_full["b"])))); // required, optional - foreach(LLSD grp, inArray(groups)) + for (LLSD grp: inArray(groups)) { // Internal structure of each group in 'groups': LLSD names(grp[0]); @@ -1003,14 +1035,14 @@ namespace tut optional); // Loop through 'names' - foreach(LLSD nm, inArray(names)) + for (LLSD nm: inArray(names)) { LLSD metadata(getMetadata(nm)); ensure_equals("name mismatch", metadata["name"], nm); ensure_equals(nm.asString(), metadata["desc"].asString(), descs[nm]); - ensure_equals(STRINGIZE(nm << " required mismatch"), + ensure_equals(stringize(nm, " required mismatch"), metadata["required"], required); - ensure_equals(STRINGIZE(nm << " optional mismatch"), + ensure_equals(stringize(nm, " optional mismatch"), metadata["optional"], optional); } } @@ -1031,13 +1063,7 @@ namespace tut { set_test_name("call with bad name"); call_exc("freek", LLSD(), "not found"); - // We don't have a comparable helper function for the one-arg - // operator() method, and it's not worth building one just for this - // case. Write it out. - std::string threw = catch_what([this](){ - work(LLSDMap("op", "freek")); - }); - ensure_has(threw, "bad"); + std::string threw = call_exc("", LLSDMap("op", "freek"), "bad"); ensure_has(threw, "op"); ensure_has(threw, "freek"); } @@ -1079,7 +1105,7 @@ namespace tut // LLSD value matching 'required' according to llsd_matches() rules. LLSD matching(LLSDMap("d", 3.14)("array", llsd::array("answer", true, answer))); // Okay, walk through 'tests'. - foreach(const CallablesTriple& tr, tests) + for (const CallablesTriple& tr: tests) { // Should be able to pass 'answer' to Callables registered // without 'required'. @@ -1087,7 +1113,7 @@ namespace tut ensure_equals("answer mismatch", tr.llsd, answer); // Should NOT be able to pass 'answer' to Callables registered // with 'required'. - call_exc(tr.name_req, answer, "bad request"); + call_logerr(tr.name_req, answer, "bad request"); // But SHOULD be able to pass 'matching' to Callables registered // with 'required'. work(tr.name_req, matching); @@ -1101,17 +1127,20 @@ namespace tut set_test_name("passing wrong args to (map | array)-style registrations"); // Pass scalar/map to array-style functions, scalar/array to map-style - // functions. As that validation happens well before we engage the - // argument magic, it seems pointless to repeat this with every - // variation: (free function | non-static method), (no | arbitrary) - // args. We should only need to engage it for one map-style - // registration and one array-style registration. - std::string array_exc("needs an args array"); - call_exc("free0_array", 17, array_exc); - call_exc("free0_array", LLSDMap("pi", 3.14), array_exc); + // functions. It seems pointless to repeat this with every variation: + // (free function | non-static method), (no | arbitrary) args. We + // should only need to engage it for one map-style registration and + // one array-style registration. + // Now that LLEventDispatcher has been extended to treat an LLSD + // scalar as a single-entry array, the error we expect in this case is + // that apply() is trying to pass that non-empty array to a nullary + // function. + call_logerr("free0_array", 17, "LL::apply"); + // similarly, apply() doesn't accept an LLSD Map + call_logerr("free0_array", LLSDMap("pi", 3.14), "unsupported"); std::string map_exc("needs a map"); - call_exc("free0_map", 17, map_exc); + call_logerr("free0_map", 17, map_exc); // Passing an array to a map-style function works now! No longer an // error case! // call_exc("free0_map", llsd::array("a", "b"), map_exc); @@ -1125,7 +1154,7 @@ namespace tut ("free0_array", "free0_map", "smethod0_array", "smethod0_map", "method0_array", "method0_map")); - foreach(LLSD name, inArray(names)) + for (LLSD name: inArray(names)) { // Look up the Vars instance for this function. Vars* vars(varsfor(name)); @@ -1150,15 +1179,21 @@ namespace tut template<> template<> void object::test<19>() { - set_test_name("call array-style functions with too-short arrays"); - // Could have two different too-short arrays, one for *na and one for - // *nb, but since they both take 5 params... + set_test_name("call array-style functions with wrong-length arrays"); + // Could have different wrong-length arrays for *na and for *nb, but + // since they both take 5 params... LLSD tooshort(llsd::array("this", "array", "too", "short")); - foreach(const LLSD& funcsab, inArray(array_funcs)) + LLSD toolong (llsd::array("this", "array", "is", "one", "too", "long")); + LLSD badargs (llsd::array(tooshort, toolong)); + for (const LLSD& toosomething: inArray(badargs)) { - foreach(const llsd::MapEntry& e, inMap(funcsab)) + for (const LLSD& funcsab: inArray(array_funcs)) { - call_exc(e.second, tooshort, "requires more arguments"); + for (const llsd::MapEntry& e: inMap(funcsab)) + { + // apply() complains about wrong number of array entries + call_logerr(e.second, toosomething, "LL::apply"); + } } } } @@ -1166,7 +1201,7 @@ namespace tut template<> template<> void object::test<20>() { - set_test_name("call array-style functions with (just right | too long) arrays"); + set_test_name("call array-style functions with right-size arrays"); std::vector binary; for (size_t h(0x01), i(0); i < 5; h+= 0x22, ++i) { @@ -1178,40 +1213,25 @@ namespace tut LLDate("2011-02-03T15:07:00Z"), LLURI("http://secondlife.com"), binary))); - LLSD argsplus(args); - argsplus["a"].append("bogus"); - argsplus["b"].append("bogus"); LLSD expect; - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { expect[a] = zipmap(params[a], args[a]); } // Adjust expect["a"]["cp"] for special Vars::cp treatment. - expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'"; + expect["a"]["cp"] = stringize("'", expect["a"]["cp"].asString(), "'"); debug("expect: ", expect); - // Use substantially the same logic for args and argsplus - LLSD argsarrays(llsd::array(args, argsplus)); - // So i==0 selects 'args', i==1 selects argsplus - for (LLSD::Integer i(0), iend(argsarrays.size()); i < iend; ++i) + for (const LLSD& funcsab: inArray(array_funcs)) { - foreach(const LLSD& funcsab, inArray(array_funcs)) + for (LLSD::String a: ab) { - foreach(LLSD::String a, ab) - { - // Reset the Vars instance before each call - Vars* vars(varsfor(funcsab[a])); - *vars = Vars(); - work(funcsab[a], argsarrays[i][a]); - ensure_llsd(STRINGIZE(funcsab[a].asString() << - ": expect[\"" << a << "\"] mismatch"), - vars->inspect(), expect[a], 7); // 7 bits ~= 2 decimal digits - - // TODO: in the i==1 or argsplus case, intercept LL_WARNS - // output? Even without that, using argsplus verifies that - // passing too many args isn't fatal; it works -- but - // would be nice to notice the warning too. - } + // Reset the Vars instance before each call + Vars* vars(varsfor(funcsab[a])); + *vars = Vars(); + work(funcsab[a], args[a]); + ensure_llsd(stringize(funcsab[a].asString(), ": expect[\"", a, "\"] mismatch"), + vars->inspect(), expect[a], 7); // 7 bits ~= 2 decimal digits } } } @@ -1239,7 +1259,7 @@ namespace tut ("a", llsd::array(false, 255, 98.6, 1024.5, "pointer")) ("b", llsd::array("object", LLUUID::generateNewID(), LLDate::now(), LLURI("http://wiki.lindenlab.com/wiki"), LLSD::Binary(boost::begin(binary), boost::end(binary))))); LLSD array_overfull(array_full); - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { array_overfull[a].append("bogus"); } @@ -1253,7 +1273,7 @@ namespace tut ensure_not_equals("UUID collision", array_full["b"][1].asUUID(), dft_array_full["b"][1].asUUID()); LLSD map_full, map_overfull; - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { map_full[a] = zipmap(params[a], array_full[a]); map_overfull[a] = map_full[a]; @@ -1294,21 +1314,360 @@ namespace tut "freenb_map_mdft", "smethodnb_map_mdft", "methodnb_map_mdft"))); // Treat (full | overfull) (array | map) the same. LLSD argssets(llsd::array(array_full, array_overfull, map_full, map_overfull)); - foreach(const LLSD& args, inArray(argssets)) + for (const LLSD& args: inArray(argssets)) { - foreach(LLSD::String a, ab) + for (LLSD::String a: ab) { - foreach(LLSD::String name, inArray(names[a])) + for (LLSD::String name: inArray(names[a])) { // Reset the Vars instance Vars* vars(varsfor(name)); *vars = Vars(); work(name, args[a]); - ensure_llsd(STRINGIZE(name << ": expect[\"" << a << "\"] mismatch"), + ensure_llsd(stringize(name, ": expect[\"", a, "\"] mismatch"), vars->inspect(), expect[a], 7); // 7 bits, 2 decimal digits // intercept LL_WARNS for the two overfull cases? } } } } + + struct DispatchResult: public LLDispatchListener + { + using DR = DispatchResult; + + DispatchResult(): LLDispatchListener("results", "op") + { + add("strfunc", "return string", &DR::strfunc); + add("voidfunc", "void function", &DR::voidfunc); + add("emptyfunc", "return empty LLSD", &DR::emptyfunc); + add("intfunc", "return Integer LLSD", &DR::intfunc); + add("llsdfunc", "return passed LLSD", &DR::llsdfunc); + add("mapfunc", "return map LLSD", &DR::mapfunc); + add("arrayfunc", "return array LLSD", &DR::arrayfunc); + } + + std::string strfunc(const std::string& str) const { return "got " + str; } + void voidfunc() const {} + LLSD emptyfunc() const { return {}; } + int intfunc(int i) const { return -i; } + LLSD llsdfunc(const LLSD& event) const + { + LLSD result{ event }; + result["with"] = "string"; + return result; + } + LLSD mapfunc(int i, const std::string& str) const + { + return llsd::map("i", intfunc(i), "str", strfunc(str)); + } + LLSD arrayfunc(int i, const std::string& str) const + { + return llsd::array(intfunc(i), strfunc(str)); + } + }; + + template<> template<> + void object::test<23>() + { + set_test_name("string result"); + DispatchResult service; + LLSD result{ service("strfunc", "a string") }; + ensure_equals("strfunc() mismatch", result.asString(), "got a string"); + } + + template<> template<> + void object::test<24>() + { + set_test_name("void result"); + DispatchResult service; + LLSD result{ service("voidfunc", LLSD()) }; + ensure("voidfunc() returned defined", result.isUndefined()); + } + + template<> template<> + void object::test<25>() + { + set_test_name("Integer result"); + DispatchResult service; + LLSD result{ service("intfunc", -17) }; + ensure_equals("intfunc() mismatch", result.asInteger(), 17); + } + + template<> template<> + void object::test<26>() + { + set_test_name("LLSD echo"); + DispatchResult service; + LLSD result{ service("llsdfunc", llsd::map("op", "llsdfunc", "reqid", 17)) }; + ensure_equals("llsdfunc() mismatch", result, + llsd::map("op", "llsdfunc", "reqid", 17, "with", "string")); + } + + template<> template<> + void object::test<27>() + { + set_test_name("map LLSD result"); + DispatchResult service; + LLSD result{ service("mapfunc", llsd::array(-12, "value")) }; + ensure_equals("mapfunc() mismatch", result, llsd::map("i", 12, "str", "got value")); + } + + template<> template<> + void object::test<28>() + { + set_test_name("array LLSD result"); + DispatchResult service; + LLSD result{ service("arrayfunc", llsd::array(-8, "word")) }; + ensure_equals("arrayfunc() mismatch", result, llsd::array(8, "got word")); + } + + template<> template<> + void object::test<29>() + { + set_test_name("listener error, no reply"); + DispatchResult service; + tut::call_exc( + [&service]() + { service.post(llsd::map("op", "nosuchfunc", "reqid", 17)); }, + "nosuchfunc"); + } + + template<> template<> + void object::test<30>() + { + set_test_name("listener error with reply"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map("op", "nosuchfunc", "reqid", 17, "reply", result.getName())); + LLSD reply{ result.get() }; + ensure("no reply", reply.isDefined()); + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + ensure_has(reply["error"].asString(), "nosuchfunc"); + } + + template<> template<> + void object::test<31>() + { + set_test_name("listener call to void function"); + DispatchResult service; + LLCaptureListener result; + result.set("non-empty"); + for (const auto& func: StringVec{ "voidfunc", "emptyfunc" }) + { + service.post(llsd::map( + "op", func, + "reqid", 17, + "reply", result.getName())); + ensure_equals("reply from " + func, result.get().asString(), "non-empty"); + } + } + + template<> template<> + void object::test<32>() + { + set_test_name("listener call to string function"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", "strfunc", + "args", llsd::array("a string"), + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + ensure_equals("bad reply from strfunc", reply["data"].asString(), "got a string"); + } + + template<> template<> + void object::test<33>() + { + set_test_name("listener call to map function"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", "mapfunc", + "args", llsd::array(-7, "value"), + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + ensure_equals("bad i from mapfunc", reply["i"].asInteger(), 7); + ensure_equals("bad str from mapfunc", reply["str"], "got value"); + } + + template<> template<> + void object::test<34>() + { + set_test_name("batched map success"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", llsd::map( + "strfunc", "some string", + "intfunc", 2, + "voidfunc", LLSD(), + "arrayfunc", llsd::array(-5, "other string")), + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + reply.erase("reqid"); + ensure_equals( + "bad map batch", + reply, + llsd::map( + "strfunc", "got some string", + "intfunc", -2, + "voidfunc", LLSD(), + "arrayfunc", llsd::array(5, "got other string"))); + } + + template<> template<> + void object::test<35>() + { + set_test_name("batched map error"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", llsd::map( + "badfunc", 34, // ! + "strfunc", "some string", + "intfunc", 2, + "missing", LLSD(), // ! + "voidfunc", LLSD(), + "arrayfunc", llsd::array(-5, "other string")), + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + reply.erase("reqid"); + auto error{ reply["error"].asString() }; + reply.erase("error"); + ensure_has(error, "badfunc"); + ensure_has(error, "missing"); + ensure_equals( + "bad partial batch", + reply, + llsd::map( + "strfunc", "got some string", + "intfunc", -2, + "voidfunc", LLSD(), + "arrayfunc", llsd::array(5, "got other string"))); + } + + template<> template<> + void object::test<36>() + { + set_test_name("batched map exception"); + DispatchResult service; + auto error = tut::call_exc( + [&service]() + { + service.post(llsd::map( + "op", llsd::map( + "badfunc", 34, // ! + "strfunc", "some string", + "intfunc", 2, + "missing", LLSD(), // ! + "voidfunc", LLSD(), + "arrayfunc", llsd::array(-5, "other string")), + "reqid", 17)); + // no "reply" + }, + "badfunc"); + ensure_has(error, "missing"); + } + + template<> template<> + void object::test<37>() + { + set_test_name("batched array success"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", llsd::array( + llsd::array("strfunc", "some string"), + llsd::array("intfunc", 2), + "arrayfunc", + "voidfunc"), + "args", llsd::array( + LLSD(), + LLSD(), + llsd::array(-5, "other string")), + // args array deliberately short, since the default + // [3] is undefined, which should work for voidfunc + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + reply.erase("reqid"); + ensure_equals( + "bad array batch", + reply, + llsd::map( + "data", llsd::array( + "got some string", + -2, + llsd::array(5, "got other string"), + LLSD()))); + } + + template<> template<> + void object::test<38>() + { + set_test_name("batched array error"); + DispatchResult service; + LLCaptureListener result; + service.post(llsd::map( + "op", llsd::array( + llsd::array("strfunc", "some string"), + llsd::array("intfunc", 2, "whoops"), // bad form + "arrayfunc", + "voidfunc"), + "args", llsd::array( + LLSD(), + LLSD(), + llsd::array(-5, "other string")), + // args array deliberately short, since the default + // [3] is undefined, which should work for voidfunc + "reqid", 17, + "reply", result.getName())); + LLSD reply{ result.get() }; + ensure_equals("reqid not echoed", reply["reqid"].asInteger(), 17); + reply.erase("reqid"); + auto error{ reply["error"] }; + reply.erase("error"); + ensure_has(error, "[1]"); + ensure_has(error, "unsupported"); + ensure_equals("bad array batch", reply, + llsd::map("data", llsd::array("got some string"))); + } + + template<> template<> + void object::test<39>() + { + set_test_name("batched array exception"); + DispatchResult service; + auto error = tut::call_exc( + [&service]() + { + service.post(llsd::map( + "op", llsd::array( + llsd::array("strfunc", "some string"), + llsd::array("intfunc", 2, "whoops"), // bad form + "arrayfunc", + "voidfunc"), + "args", llsd::array( + LLSD(), + LLSD(), + llsd::array(-5, "other string")), + // args array deliberately short, since the default + // [3] is undefined, which should work for voidfunc + "reqid", 17)); + // no "reply" + }, + "[1]"); + ensure_has(error, "unsupported"); + } } // namespace tut diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h index 3779fb41bc..d657b329bb 100644 --- a/indra/llcommon/tests/wrapllerrs.h +++ b/indra/llcommon/tests/wrapllerrs.h @@ -226,6 +226,11 @@ public: return boost::dynamic_pointer_cast(mRecorder)->streamto(out); } + friend inline std::ostream& operator<<(std::ostream& out, const CaptureLog& self) + { + return self.streamto(out); + } + private: LLError::FatalFunction mFatalFunction; LLError::SettingsStoragePtr mOldSettings; diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm index a5ab1d95c8..68ff196eaf 100644 --- a/indra/llplugin/slplugin/slplugin-objc.mm +++ b/indra/llplugin/slplugin/slplugin-objc.mm @@ -95,7 +95,7 @@ void LLCocoaPlugin::processEvents() { // Some plugins (webkit at least) will want an event loop. This qualifies. NSEvent * event; - event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; + event = [NSApp nextEventMatchingMask:NSEventMaskAny untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; [NSApp sendEvent: event]; } diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp index 7fdef4a3b7..b616002b49 100644 --- a/indra/llrender/llgltexture.cpp +++ b/indra/llrender/llgltexture.cpp @@ -94,7 +94,8 @@ void LLGLTexture::setBoostLevel(S32 level) { mBoostLevel = level ; if(mBoostLevel != LLGLTexture::BOOST_NONE - && mBoostLevel != LLGLTexture::BOOST_ICON) + && mBoostLevel != LLGLTexture::BOOST_ICON + && mBoostLevel != LLGLTexture::BOOST_THUMBNAIL) { setNoDelete() ; } diff --git a/indra/llrender/llgltexture.h b/indra/llrender/llgltexture.h index 5c693fc93c..24849d1d1b 100644 --- a/indra/llrender/llgltexture.h +++ b/indra/llrender/llgltexture.h @@ -62,6 +62,7 @@ public: BOOST_SUPER_HIGH , //textures higher than this need to be downloaded at the required resolution without delay. BOOST_HUD , BOOST_ICON , + BOOST_THUMBNAIL , BOOST_UI , BOOST_PREVIEW , BOOST_MAP , diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 7d13d731e2..bd6fd5b79e 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -166,7 +166,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mHighlightColor(p.highlight_color()), mPreeditBgColor(p.preedit_bg_color()), mGLFont(p.font), - mContextMenuHandle() + mContextMenuHandle(), + mShowContextMenu(true) { llassert( mMaxLengthBytes > 0 ); @@ -827,7 +828,7 @@ BOOL LLLineEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask) BOOL LLLineEditor::handleRightMouseDown(S32 x, S32 y, MASK mask) { setFocus(TRUE); - if (!LLUICtrl::handleRightMouseDown(x, y, mask)) + if (!LLUICtrl::handleRightMouseDown(x, y, mask) && getShowContextMenu()) { showContextMenu(x, y); } diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 624371ebda..69eb0792e1 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -287,7 +287,10 @@ public: void setBgImage(LLPointer image) { mBgImage = image; } void setBgImageFocused(LLPointer image) { mBgImageFocused = image; } -private: + void setShowContextMenu(bool show) { mShowContextMenu = show; } + bool getShowContextMenu() const { return mShowContextMenu; } + + private: // private helper methods void pasteHelper(bool is_primary); @@ -407,6 +410,8 @@ protected: LLHandle mContextMenuHandle; + bool mShowContextMenu; + private: // Instances that by default point to the statics but can be overidden in XML. LLPointer mBgImage; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 76b9e448a1..cb36f72f6e 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -2149,14 +2149,19 @@ void LLTabContainer::commitHoveredButton(S32 x, S32 y) { if (!getTabsHidden() && hasMouseCapture()) { - for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) + for (tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { - LLTabTuple* tuple = *iter; - S32 local_x = x - tuple->mButton->getRect().mLeft; - S32 local_y = y - tuple->mButton->getRect().mBottom; - if (tuple->mButton->pointInView(local_x, local_y) && tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible()) + LLButton* button = (*iter)->mButton; + LLPanel* panel = (*iter)->mTabPanel; + if (button->getEnabled() && button->getVisible() && !panel->getVisible()) { - tuple->mButton->onCommit(); + S32 local_x = x - button->getRect().mLeft; + S32 local_y = y - button->getRect().mBottom; + if (button->pointInView(local_x, local_y)) + { + button->onCommit(); + break; + } } } } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 4ca1879be6..1b83ee401c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1578,7 +1578,13 @@ S32 LLTextBase::getLeftOffset(S32 width) case LLFontGL::HCENTER: return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2); case LLFontGL::RIGHT: - return mVisibleTextRect.getWidth() - width; + { + // Font's rendering rounds string size, if value gets rounded + // down last symbol might not have enough space to render, + // compensate by adding an extra pixel as padding + const S32 right_padding = 1; + return llmax(mHPad, mVisibleTextRect.getWidth() - width - right_padding); + } default: return mHPad; } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 6a9070634c..77e9edf5e5 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -35,7 +35,9 @@ #include "llavatarnamecache.h" #include "llcachename.h" +#include "llkeyboard.h" #include "llregex.h" +#include "llscrolllistctrl.h" // for LLUrlEntryKeybinding file parsing #include "lltrans.h" #include "lluicolortable.h" #include "message.h" @@ -1609,3 +1611,122 @@ std::string LLUrlEntryIPv6::getUrl(const std::string &string) const { return string; } + + +// +// LLUrlEntryKeybinding Displays currently assigned key +// +LLUrlEntryKeybinding::LLUrlEntryKeybinding() + : LLUrlEntryBase() + , pHandler(NULL) +{ + mPattern = boost::regex(APP_HEADER_REGEX "/keybinding/\\w+(\\?mode=\\w+)?$", + boost::regex::perl | boost::regex::icase); + mMenuName = "menu_url_experience.xml"; + + initLocalization(); +} + +std::string LLUrlEntryKeybinding::getLabel(const std::string& url, const LLUrlLabelCallback& cb) +{ + std::string control = getControlName(url); + + std::map::iterator iter = mLocalizations.find(control); + + std::string keybind; + if (pHandler) + { + keybind = pHandler->getKeyBindingAsString(getMode(url), control); + } + + if (iter != mLocalizations.end()) + { + return iter->second.mLocalization + ": " + keybind; + } + + return control + ": " + keybind; +} + +std::string LLUrlEntryKeybinding::getTooltip(const std::string& url) const +{ + std::string control = getControlName(url); + + std::map::const_iterator iter = mLocalizations.find(control); + if (iter != mLocalizations.end()) + { + return iter->second.mTooltip; + } + return url; +} + +std::string LLUrlEntryKeybinding::getControlName(const std::string& url) const +{ + std::string search = "/keybinding/"; + size_t pos_start = url.find(search); + if (pos_start == std::string::npos) + { + return std::string(); + } + pos_start += search.size(); + + size_t pos_end = url.find("?mode="); + if (pos_end == std::string::npos) + { + pos_end = url.size(); + } + return url.substr(pos_start, pos_end - pos_start); +} + +std::string LLUrlEntryKeybinding::getMode(const std::string& url) const +{ + std::string search = "?mode="; + size_t pos_start = url.find(search); + if (pos_start == std::string::npos) + { + return std::string(); + } + pos_start += search.size(); + return url.substr(pos_start, url.size() - pos_start); +} + +void LLUrlEntryKeybinding::initLocalization() +{ + initLocalizationFromFile("control_table_contents_movement.xml"); + initLocalizationFromFile("control_table_contents_camera.xml"); + initLocalizationFromFile("control_table_contents_editing.xml"); + initLocalizationFromFile("control_table_contents_media.xml"); +} + +void LLUrlEntryKeybinding::initLocalizationFromFile(const std::string& filename) +{ + LLXMLNodePtr xmlNode; + LLScrollListCtrl::Contents contents; + if (!LLUICtrlFactory::getLayeredXMLNode(filename, xmlNode)) + { + LL_WARNS() << "Failed to load " << filename << LL_ENDL; + return; + } + LLXUIParser parser; + parser.readXUI(xmlNode, contents, filename); + + if (!contents.validateBlock()) + { + LL_WARNS() << "Failed to validate " << filename << LL_ENDL; + return; + } + + for (LLInitParam::ParamIterator::const_iterator row_it = contents.rows.begin(); + row_it != contents.rows.end(); + ++row_it) + { + std::string control = row_it->value.getValue().asString(); + if (!control.empty() && control != "menu_separator") + { + mLocalizations[control] = + LLLocalizationData( + row_it->columns.begin()->value.getValue().asString(), + row_it->columns.begin()->tool_tip.getValue() + ); + } + } +} diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 63a1506731..5d0f5479f6 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -550,4 +550,37 @@ public: std::string mHostPath; }; +class LLKeyBindingToStringHandler; + +/// +/// LLUrlEntryKeybinding A way to access keybindings and show currently used one in text. +/// secondlife:///app/keybinding/control_name +class LLUrlEntryKeybinding: public LLUrlEntryBase +{ +public: + LLUrlEntryKeybinding(); + /*virtual*/ std::string getLabel(const std::string& url, const LLUrlLabelCallback& cb); + /*virtual*/ std::string getTooltip(const std::string& url) const; + void setHandler(LLKeyBindingToStringHandler* handler) {pHandler = handler;} +private: + std::string getControlName(const std::string& url) const; + std::string getMode(const std::string& url) const; + void initLocalization(); + void initLocalizationFromFile(const std::string& filename); + + struct LLLocalizationData + { + LLLocalizationData() {} + LLLocalizationData(const std::string& localization, const std::string& tooltip) + : mLocalization(localization) + , mTooltip(tooltip) + {} + std::string mLocalization; + std::string mTooltip; + }; + + std::map mLocalizations; + LLKeyBindingToStringHandler* pHandler; +}; + #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 23f3dca3fb..3bd7321777 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -73,6 +73,8 @@ LLUrlRegistry::LLUrlRegistry() registerUrl(new LLUrlEntryPlace()); registerUrl(new LLUrlEntryInventory()); registerUrl(new LLUrlEntryExperienceProfile()); + mUrlEntryKeybinding = new LLUrlEntryKeybinding(); + registerUrl(mUrlEntryKeybinding); //LLUrlEntrySL and LLUrlEntrySLLabel have more common pattern, //so it should be registered in the end of list registerUrl(new LLUrlEntrySL()); @@ -307,3 +309,9 @@ bool LLUrlRegistry::isUrl(const LLWString &text) } return false; } + +void LLUrlRegistry::setKeybindingHandler(LLKeyBindingToStringHandler* handler) +{ + LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding; + entry->setHandler(handler); +} diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index efafe543ab..186447c0be 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -36,6 +36,8 @@ #include #include +class LLKeyBindingToStringHandler; + /// This default callback for findUrl() simply ignores any label updates void LLUrlRegistryNullCallback(const std::string &url, const std::string &label, @@ -88,6 +90,9 @@ public: bool isUrl(const std::string &text); bool isUrl(const LLWString &text); + // Set handler for url registry to be capable of parsing and populating keybindings + void setKeybindingHandler(LLKeyBindingToStringHandler* handler); + private: std::vector mUrlEntry; LLUrlEntryBase* mUrlEntryTrusted; @@ -96,6 +101,7 @@ private: LLUrlEntryBase* mUrlEntryHTTPLabel; LLUrlEntryBase* mUrlEntrySLLabel; LLUrlEntryBase* mUrlEntryNoLink; + LLUrlEntryBase* mUrlEntryKeybinding; }; #endif diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp index e65cc7563e..34720ff64e 100644 --- a/indra/llwindow/llkeyboard.cpp +++ b/indra/llwindow/llkeyboard.cpp @@ -366,6 +366,45 @@ std::string LLKeyboard::stringFromKey(KEY key, bool translate) return res; } +//static +std::string LLKeyboard::stringFromMouse(EMouseClickType click, bool translate) +{ + std::string res; + switch (click) + { + case CLICK_LEFT: + res = "LMB"; + break; + case CLICK_MIDDLE: + res = "MMB"; + break; + case CLICK_RIGHT: + res = "RMB"; + break; + case CLICK_BUTTON4: + res = "MB4"; + break; + case CLICK_BUTTON5: + res = "MB5"; + break; + case CLICK_DOUBLELEFT: + res = "Double LMB"; + break; + default: + break; + } + + if (translate && !res.empty()) + { + LLKeyStringTranslatorFunc* trans = gKeyboard->mStringTranslator; + if (trans != NULL) + { + res = trans(res.c_str()); + } + } + return res; +} + //static std::string LLKeyboard::stringFromAccelerator(MASK accel_mask) { @@ -433,6 +472,18 @@ std::string LLKeyboard::stringFromAccelerator( MASK accel_mask, KEY key ) return res; } +//static +std::string LLKeyboard::stringFromAccelerator(MASK accel_mask, EMouseClickType click) +{ + std::string res; + if (CLICK_NONE == click) + { + return res; + } + res.append(stringFromAccelerator(accel_mask)); + res.append(stringFromMouse(click)); + return res; +} //static BOOL LLKeyboard::maskFromString(const std::string& str, MASK *mask) diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index fb1ae10f50..dad150e3c1 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -96,8 +96,10 @@ public: static BOOL maskFromString(const std::string& str, MASK *mask); // False on failure static BOOL keyFromString(const std::string& str, KEY *key); // False on failure static std::string stringFromKey(KEY key, bool translate = true); + static std::string stringFromMouse(EMouseClickType click, bool translate = true); static std::string stringFromAccelerator( MASK accel_mask ); // separated for convinience, returns with "+": "Shift+" or "Shift+Alt+"... static std::string stringFromAccelerator( MASK accel_mask, KEY key ); + static std::string stringFromAccelerator(MASK accel_mask, EMouseClickType click); void setCallbacks(LLWindowCallbacks *cbs) { mCallbacks = cbs; } F32 getKeyElapsedTime( KEY key ); // Returns time in seconds since key was pressed. @@ -130,6 +132,13 @@ protected: static std::map sNamesToKeys; }; +// Interface to get key from assigned command +class LLKeyBindingToStringHandler +{ +public: + virtual std::string getKeyBindingAsString(const std::string& mode, const std::string& control) const = 0; +}; + extern LLKeyboard *gKeyboard; #endif diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c16e75dd1f..355f35c558 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1761,7 +1761,7 @@ if (WINDOWS) if (TARGET ll::fmodstudio) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/fmod.dll - ${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll + ${SHARED_LIB_STAGING_DIR}/fmodL.dll ) endif () diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 21c8c7b46b..0e7b60da8a 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.1 +7.1.2 \ No newline at end of file diff --git a/indra/newview/installers/darwin/release-dmg/Applications-alias.r b/indra/newview/installers/darwin/release-dmg/Applications-alias.r index aa3cfb87d8..f9be0536c6 100755 --- a/indra/newview/installers/darwin/release-dmg/Applications-alias.r +++ b/indra/newview/installers/darwin/release-dmg/Applications-alias.r @@ -1,6996 +1,21 @@ data 'alis' (0) { $"0000 0000 0112 0002 0001 036D 6277 0000" /* ...........mbw.. */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 C135 A717 482B 0000 0000" /* ......5.H+.... */ + $"0000 0000 0000 C135 A717 482B 0000 0000" /* ......�5�.H+.... */ $"0002 0C41 7070 6C69 6361 7469 6F6E 7300" /* ...Applications. */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 00E2 4F18 C2E8 9FB0 0000 0000 0000" /* ...O.蟰...... */ - $"0000 FFFF FFFF 0000 0920 0000 0000 0000" /* .... ...... */ + $"0000 00E2 4F18 C2E8 9FB0 0000 0000 0000" /* ...�O.�蟰...... */ + $"0000 FFFF FFFF 0000 0920 0000 0000 0000" /* ..����..� ...... */ $"0000 0000 0000 0000 0003 6D62 7700 0010" /* ..........mbw... */ - $"0008 0000 C136 0987 0000 0011 0008 0000" /* ....6Ƈ........ */ - $"C2E9 0220 0000 0001 0000 0002 0010 6D62" /* . ..........mb */ + $"0008 0000 C136 0987 0000 0011 0008 0000" /* ....�6Ƈ........ */ + $"C2E9 0220 0000 0001 0000 0002 0010 6D62" /* ��. ..........mb */ $"773A 4170 706C 6963 6174 696F 6E73 000E" /* w:Applications.. */ $"001A 000C 0041 0070 0070 006C 0069 0063" /* .....A.p.p.l.i.c */ $"0061 0074 0069 006F 006E 0073 000F 0008" /* .a.t.i.o.n.s.... */ $"0003 006D 0062 0077 0012 000C 4170 706C" /* ...m.b.w....Appl */ - $"6963 6174 696F 6E73 0013 0001 2F00 FFFF" /* ications..../. */ + $"6963 6174 696F 6E73 0013 0001 2F00 FFFF" /* ications..../.�� */ $"0000" /* .. */ }; - -data 'icns' (-16455) { - $"6963 6E73 0001 B3AC 6973 3332 0000 0224" /* icns..is32...$ */ - $"9F00 005F 8061 005D 8700 055D 9AA2 A0A4" /* .._a.]..] */ - $"8986 0008 557D B3B2 B1B3 A881 8081 8104" /* ..U}. */ - $"826F 577E AF82 A801 B3AE 82AD 03AF 7B7A" /* oW~..{z */ - $"A781 A203 9EB7 C89D 81A2 03A6 776E 9A80" /* .ȝ.wn */ - $"9705 959F D3DC A295 8097 5899 6C67 8F8D" /* .ܢXlg */ - $"8E89 85C9 BCA9 C883 898D 8D8E 6561 8585" /* ɼȃea */ - $"83A8 B7F3 BAB4 DFB6 AA84 8585 605E 7B7D" /* ߶`^{} */ - $"79D0 F9E0 F0F2 DAE1 D87C 7D7B 5D5B 7476" /* y|}{][tv */ - $"7099 D876 7373 76CA 8A72 7673 5B5A 6D70" /* pvssvʊrvs[Zmp */ - $"6B9B 816C 6F6F 67B3 C567 706C 5A59 686B" /* klooggplZYhk */ - $"6B67 686B 806A 056B 6F6A 6B67 5A88 5900" /* kghkj.kojkgZY. */ - $"5882 598A 5801 0059 9F00 0482 8383 8480" /* XYX..Y.. */ - $"8700 057F B7BE BDC0 A786 0008 799E D0CE" /* .....y */ - $"CECF C5A1 A081 A105 A390 7AA0 D0CA 80C9" /* š.zʀ */ - $"01CA D183 CE03 D09C 9ECD 81C9 03C7 D4DE" /* .у.М́. */ - $"C681 C903 CD9A 94C5 80C2 05C1 C6E3 E9C8" /* Ɓ.͚ŀ. */ - $"C180 C20D C491 8DBD BBBC B9B6 DDD7 CCDD" /* .đ */ - $"B5B9 80BC 468B 87B4 B4B3 C8D1 F7D3 CFEA" /* F */ - $"D0C9 B4B4 B385 83AA ABA9 E0FB EAF5 F6E5" /* ɴ */ - $"EAE5 AAAB A981 80A0 A39E BAE4 A2A0 A1A2" /* 媫䢠 */ - $"DAAF 9FA3 9F7F 7E97 9B97 B8A6 979A 9A94" /* گ.~ */ - $"CAD6 949B 977D 7D90 9493 9091 8293 0496" /* ֔}}. */ - $"9294 907D 8E7C 8A7B 0100 7C9F 0000 7A80" /* }|{..|..z */ - $"7C00 7887 0005 77B1 B8B7 BBA0 8600 0871" /* |.x..w..q */ - $"97CB C9C8 CAC0 9B99 819A 049C 8972 99CA" /* .r */ - $"82C3 00CB 83C8 03CA 9596 C681 C203 BFCF" /* .˃.ʕƁ. */ - $"DABF 81C2 03C6 938C BD80 BA05 B9BF E0E7" /* ڿ.Ɠ. */ - $"C1B9 80BA 57BC 8985 B5B3 B3B0 ADD9 D2C6" /* W */ - $"D9AC B0B3 B3B4 827F ACAB AAC2 CCF6 CECA" /* ٬. */ - $"E8CB C3AB ACAA 7D7B A1A3 A0DD FAE9 F4F5" /* ë}{ */ - $"E3E8 E3A2 A3A0 7A78 989B 96B3 E29A 9898" /* 㢣zx⚘ */ - $"9AD7 A897 9B97 7776 8F93 8FB2 9F8F 9292" /* רwv */ - $"8BC5 D28C 938F 7575 888C 8B89 8982 8B04" /* Ҍuu. */ - $"8F8A 8C88 758E 748A 7301 0074 7338 6D6B" /* uts..ts8mk */ - $"0000 0108 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ - $"0000 0000 0000 1E24 2424 1600 0000 0000" /* .......$$$...... */ - $"0000 0000 0011 BDC8 C8C8 9600 0000 0000" /* ......Ȗ..... */ - $"0000 0000 048C FFFF FFFF F5A7 9C9E 9E9E" /* ..... */ - $"9E9E 6003 8AFF FCFC FCFC FEFF FFFF FFFF" /* `. */ - $"FFFF FF7A 89FF FFFF FFFF FFFF FFFF FFFF" /* z */ - $"FFFF FF7A 73FF FFFF FFFF FFFF FFFF FFFF" /* zs */ - $"FFFF FF64 62FF FFFF FFFF FFFF FFFF FFFF" /* db */ - $"FFFF FF53 53FF FFFF FFFF FFFF FFFF FFFF" /* SS */ - $"FFFF FF45 48FF FFFF FFFF FFFF FFFF FFFF" /* EH */ - $"FFFF FF3C 41FF FFFF FFFF FFFF FFFF FFFF" /* dYJ */ - $"5CF9 2D3F 6F47 4854 7085 62C1 C65D C07C" /* \-?oGHTpb]| */ - $"86A0 3E43 500F 90D0 4787 8CE8 726C 5109" /* >CP.GrlQ */ - $"FD68 8099 E8FE 2A66 2F02 78F5 C78B 6A34" /* h*f/.xNjj4 */ - $"0A9E 25FE 0DE3 E3C8 BD7B 3530 98D5 CF03" /* ž%.Ƚ{50. */ - $"CE64 A57D 620C 87C5 65B4 7BE1 34BC 3058" /* d}b.e{40X */ - $"572A 9EBF 5E0C 5A01 80A3 B334 DF5A E1B8" /* W*^.Z.4Z */ - $"08C3 5C30 2CC4 C1F5 1341 F516 40FA 8A00" /* .\0,.A.@. */ - $"477D B516 AD2F 4DD3 BE8C 58F0 7C77 A236" /* G}./MӾX|w6 */ - $"DD43 6611 D582 F050 DC31 59D0 194D A6FD" /* Cf.ՂP1Y.M */ - $"652E FA16 4BA7 25FE 0DE3 E3D9 B950 06E2" /* e..K%.ٹP. */ - $"3A8A DA86 827A 4C68 5798 55FC FD46 A583" /* :چzLhWUF */ - $"064D 8FB0 29D9 8DAD 53CC 5229 B675 ACAB" /* .M)ٍSR)u */ - $"8EED 34BC 2F12 142E 446C 0DF7 0BC3 D6E7" /* 4/...Dl.. */ - $"A086 8D72 6AE7 9270 B97C D981 C7F1 C38A" /* rjp|فÊ */ - $"47EE E585 FC19 FCE3 668C C7E0 471F 813C" /* G.fG.< */ - $"3F02 0005 B422 0345 FC66 9A91 446D DDCA" /* ?...".EfDm */ - $"449B CCDB 8E8F A0B8 3942 A8FC 6409 F7F3" /* Dێ9Bd */ - $"ED01 353A 2B01 1B0C 2939 619B 9890 94E7" /* .5:+...)9a */ - $"5FDA 75F2 7323 BF3A 7AED 757E 42D6 C336" /* _us#:zu~B6 */ - $"E74E 6B5F 2D43 4780 CA1C C462 6507 4801" /* Nk_-CG.be.H. */ - $"EDEF 5B2A 7297 8FC6 1E13 E7FA 56B5 4279" /* [*r..VBy */ - $"5BB4 B307 F4DE E273 4FC3 E9B1 72C3 EDA2" /* [.sOr */ - $"A3F0 A9E0 FB5D C018 B35C 8B45 CD63 99FE" /* ].\Ec */ - $"11FB 8993 21D1 BA8B 69EB 5CB9 F258 468F" /* .!Ѻi\XF */ - $"73D4 6804 C6E6 045E AE54 954C D0E5 D836" /* sh..^TL6 */ - $"EA0D DB9A 2806 36FA B3E9 5973 789D 6591" /* .ۚ(.6Ysxe */ - $"1EC2 F271 E9E2 5681 C542 A2FC F4EF 8111" /* .qVB. */ - $"59D5 FC91 9749 52A3 EA37 B239 4939 8625" /* YIR79I9% */ - $"F248 18D2 075A 80A1 8005 9ED2 437F C705" /* H..Z.C.. */ - $"2BFD 308C F1F0 E1BC 8FDA F5D5 50D9 9770" /* +0ἏPٗp */ - $"7EF5 213F 91F6 5B8B 189D EE67 70EF F40A" /* ~!?[.gp */ - $"2E24 C54B F37D 4941 FCD2 7779 5C8B 59CC" /* .$K}IAwy\Y */ - $"F284 3377 A496 0399 6F17 47AC B5EA 3A84" /* 3w.o.G: */ - $"844E DC13 D058 BE9F 1BBE 8CE0 E615 D2E1" /* N.X.. */ - $"88A5 9DA6 9FB4 4EDE B804 ED14 A7EA 54E0" /* N޸..T */ - $"5A87 311B 5E69 70F5 EDA3 2E78 8862 7603" /* Z1.^ip.xbv. */ - $"7761 094D 4A69 5AB0 A9BB 3F4F 92BE 205B" /* waMJiZ?O [ */ - $"A226 24D5 C8B2 CCF7 E064 31C7 E727 6E2C" /* &$Ȳd1'n, */ - $"D6A1 347F 41CD 5F70 E1C0 1AFC 4FBC 81A9" /* ֡4.A_p.O */ - $"A884 F03A CD84 B581 1F03 A523 838B 8038" /* :̈́..#8 */ - $"02F4 6DE8 98FC EDD6 B331 21F7 4AC5 A31E" /* .mֳ1!Jţ. */ - $"9EB4 E770 D465 386E 18A6 D1BE EF6D B008" /* pe8n.Ѿm. */ - $"63E6 1066 1374 4D10 3270 8C7F F297 F91D" /* c.f.tM.2p.. */ - $"DA61 677B 29FD A878 B122 E33C 17E3 8ED1" /* ag{)x"<. */ - $"FB8E 4407 8B82 32AD 1B50 09DF BDA8 C80E" /* D.2.P߽. */ - $"7E28 ED9D A005 4297 B9C1 8D66 CA77 C41D" /* ~(흠.Bfw. */ - $"41C5 E3B3 F94D 96E5 1308 7C59 1EB8 0871" /* AM..|Y..q */ - $"C7A4 FED7 47F2 F800 6889 A21D 1FF4 9E93" /* ǤG.h.. */ - $"1321 7377 D96E 86F5 A0CB EB17 C77A 81C0" /* .!swn.z */ - $"7C8D A01F 0E91 00F9 1D00 94FD 4D32 E5DB" /* |.....M2 */ - $"0482 DEB8 CF1C 792A EA3B DECA 4470 4898" /* .޸.y*;DpH */ - $"81C0 5457 FE66 63DD CAF3 0B98 08E1 DC3F" /* TWfc..? */ - $"CF68 7F31 9BEE 73EF A3A5 8D57 8969 EEC3" /* h.1sWi */ - $"0F13 3ED9 390D FC4C B37F C4F7 01E4 B115" /* ..>9.L... */ - $"E9F9 9526 00FA 10D0 0D64 4CC5 8481 D231" /* &...dLń1 */ - $"DE6D 483E 8046 7F58 5BD3 1FFC CF82 297A" /* mH>F.X[.ς)z */ - $"88A1 7E78 0668 3222 9E8B A287 30A3 DB10" /* ~x.h2"0. */ - $"A77F A842 87FC 164E 92B8 96DF 4920 EEC2" /* .B.NI */ - $"47B6 83F1 F68F 9309 63CE FAAC 3C8F 9FCF" /* Gc< */ - $"A166 9621 ADC0 0ABB 7F1A 7E3C A4AD 3755" /* f!»..~<7U */ - $"E2D8 E26D CAD1 6F24 F808 BC0D E94B EEBC" /* mo$..K */ - $"D601 C1F5 30C1 F53B C0FA 97C0 90E6 901B" /* .0;. */ - $"71C2 1EAB 8A4C 52A4 4431 058C DFB9 4148" /* q.LRD1.߹AH */ - $"185C 1E93 01C6 82D3 C81B 6398 8173 189D" /* .\..Ƃ.cs. */ - $"F73C 4887 5155 0C95 0088 4C69 0A27 3F39" /* j */ - $"A227 4F09 072C 4682 9B0F 995C 7551 94E7" /* 'O.,F.\uQ */ - $"419A 0098 0283 19E8 0489 687B 4F66 B74C" /* A....h{OfL */ - $"7F59 C07A A552 B04D 628F E401 E55C A4ED" /* .YzRMb.\ */ - $"390F C34D 81BB 9F88 0C50 F50F 9FBD A377" /* 9.M.P.w */ - $"F538 3F9C E243 FF47 D346 87F2 444B C479" /* 8?CGFDKy */ - $"F6B3 1C76 5125 F487 0FAF 294A DA20 EC56" /* .vQ%.)J V */ - $"07AB DE07 14C2 1721 F3E0 D687 1F67 039D" /* ....!և.g. */ - $"461F 0D82 9CAA B2D4 DFC6 6AA5 D31E 4D01" /* F..j.M. */ - $"5AC2 B2BD FD97 7D6E 00D1 7ADF 377C 15A7" /* Z²}n.z7|. */ - $"9681 C7B2 8168 D706 425B 35EF 7298 C053" /* Dzh.B[5rS */ - $"E198 B5E2 B835 712B 1AD8 BA77 CF86 83A3" /* ᘵ5q+.غwφ */ - $"B0B9 C5E6 F37A A3DE D93B 8EC8 132F A52A" /* z;./* */ - $"AB20 E166 F719 7130 6482 5BE2 605B D78E" /* f.q0d[`[׎ */ - $"672D 7AE6 3906 DA75 0E3D 1962 8A60 9294" /* g-z9.u.=.b` */ - $"1FC8 C0F3 216D 815D 4DDE 5DDE D8AB 3F9C" /* .!m]M]ث? */ - $"7F9F 24B3 7BBF CCB9 2F80 19B6 70AE 1B3D" /* .${̹/.p.= */ - $"C71A 1F7C 81D2 639F 0D03 24EA D4B1 D351" /* ..|c..$ԱQ */ - $"DD10 FBD5 EA3F 4957 A7ED 04C6 384D C10F" /* .?IW.8M. */ - $"8A55 0C03 694F 0D18 70D8 0AC3 33C0 17D1" /* U..iO..p3. */ - $"73BB E85F 5204 090F FDFE 8AC5 9AD6 22D5" /* s_R..Ś" */ - $"CA31 A6DE EF44 D910 B34A 0E59 7866 536F" /* 1D.J.YxfSo */ - $"9B0B A341 3AB8 C06C C64F 3F86 8160 DFB9" /* .A:lO?`߹ */ - $"A709 59D8 88C3 3316 9FFA F83F 5120 E40E" /* Y؈3.?Q . */ - $"4DEA C88F C418 37F6 4C0B 7606 9632 EEC5" /* Mȏ.7L.v.2 */ - $"6380 FB25 A69F AAE2 0888 B722 008F 35CB" /* c%.".5 */ - $"F6A7 90BF D0DB 6367 A14B 5A86 EE98 FD18" /* cgKZ. */ - $"A629 1BAB 3BE2 920D E99D BEC2 88B4 F909" /* ).;.靾ˆ */ - $"66B1 535D 3940 AF78 8200 0C46 142A EA2A" /* fS]9@x..F.** */ - $"A991 95E8 FD2B D30B 0E4A 76E2 A97B FAA7" /* +..Jv{ */ - $"97E2 9B30 54FA 5E97 962A 7E83 5711 A707" /* 0T^*~W.. */ - $"2A21 3729 2046 9C41 8282 A161 E5F6 AB24" /* *!7) FAa$ */ - $"3324 74CF 1AF6 C935 D884 0008 DC18 663C" /* 3$t.5؄...f< */ - $"3A00 25E4 92D7 8F23 4C07 3C63 DB6E 4924" /* :.%׏#L.X>q.㣷* */ - $"A998 FE5A 74DB 537A CE3D CD46 49B6 DB6D" /* ZtSz=FIm */ - $"B6DB 6DB2 8EE9 1D6F 6480 8613 D8D2 7D8F" /* m.od.} */ - $"5615 3EAB B25B 722D ECB8 ED12 70F2 BA06" /* V.>[r-.p. */ - $"E5A2 45C1 547C F861 A7D5 8E1C 08BC 346B" /* ET|aՎ..4k */ - $"2730 C670 2FD8 F159 6ABE 2092 ED98 AC34" /* '0p/Yj 혬4 */ - $"B4CA 8565 90CF 0034 6E68 F777 9672 F29D" /* ʅe.4nhwr */ - $"4621 6E73 9C90 5C3D A8DB F5B0 CACF A63E" /* F!ns\=Ϧ> */ - $"861E 8B9E F490 8E15 69BC A01D EF59 E898" /* ..i.Y */ - $"7040 B817 5AA9 BFB1 09A0 FE74 D2F7 BEA8" /* p@.ZƠt */ - $"A4F3 FEAC 38A4 409E B504 9CC9 EAA3 533B" /* 8@.S; */ - $"153D F710 FC9E 2055 A395 C374 2AF9 E7C5" /* .=. Ut* */ - $"E1E8 7F74 3CDB D568 B606 A9D5 B7AE E207" /* .t. */ - $"4D96 66A3 B736 F802 D67A 309F 04E6 AFD8" /* Mf6.z0. */ - $"888E A8A5 4461 F1F0 1B6B 2DC4 0DFE C676" /* Da.k-.v */ - $"8D4E 3750 C3E6 C233 EFC5 368B 6113 5B53" /* N7P36a.[S */ - $"08E0 C259 1B88 AA0C 74B0 862E 1024 BB3F" /* .Y..t..$? */ - $"2816 B320 715C 5DFA 9FF0 CBC3 6A85 777A" /* (. q\]jwz */ - $"23CB F89B D813 6706 313E 2CF5 A163 0848" /* #.g.1>,c.H */ - $"94C9 3288 B556 53DD 2A45 2302 F28E 7ED1" /* 2VS*E#.~ */ - $"B5A0 67C8 53BB 4CE4 45D9 317F 92AB B13B" /* gSLE1.; */ - $"7246 F6DE 5348 49C9 42A1 CA62 64B0 209E" /* rFSHIBbd */ - $"43F2 DF7C 9BBC 097F C94A EA52 8D01 ADEF" /* C|.JR. */ - $"5241 7C9B 2876 75F4 D748 AF9D 6FBB 3306" /* RA|(vuHo3. */ - $"0AD1 3953 6C99 5BB7 F1F5 1C1F BCE7 CA83" /* 9Sl[..ʃ */ - $"08C1 6811 FBC5 AE18 343C C6F5 E515 F9CF" /* .h.Ů.4<. */ - $"FE48 C6E9 956E 6712 DDCA D62C 7F37 6DFE" /* Hng.,.7m */ - $"2465 A8EE 1BAF E106 CA62 101F 0144 31DC" /* $e..b...D1 */ - $"029E ED0F 9E47 F22E 0C17 0D31 E60B 1662" /* ..G....1..b */ - $"C1F5 5C90 7D5A 6D03 EAB6 C0C8 1653 E821" /* \}Zm..S! */ - $"5860 ED0B C711 39E5 E5C8 268D 2246 E3FB" /* X`..9&"F */ - $"68A4 3B12 A487 350D FE94 3722 65AC 949B" /* h;.5.7"e */ - $"2526 7CD5 0E28 E093 CFE8 314C BE18 5B60" /* %&|.(1L.[` */ - $"827E 154B 9609 2536 F890 A361 BA29 8211" /* ~.K%6a). */ - $"AF42 BEC6 1BCB CE6D 2910 8083 C890 D7FF" /* B.m).Ȑ */ - $"6F04 CEF4 F47C 0D92 00BD D90F 4095 0A48" /* o.|...@H */ - $"4DC6 210C 351D 34A5 5FDA E576 1E1B 1684" /* M!.5.4_v... */ - $"F2A0 B30A 589C 1DBC 4831 E906 0D67 0CDD" /* X.H1..g. */ - $"876B 994F 6D66 47DD AF40 7158 4385 738E" /* kOmfGݯ@qXCs */ - $"82F8 E637 9B5C 7389 0AA5 2A04 D105 5E88" /* 7\s¥*..^ */ - $"C2A2 2943 E125 6C2F 0AD1 1E5C AF1F CFF6" /* ¢)C%l/.\. */ - $"B39B C799 0F39 6151 6625 BB66 C3C3 418B" /* Ǚ.9aQf%fA */ - $"90A4 F6F7 BD30 7A04 88E6 0F8A 3F0B FF2C" /* 0z..?., */ - $"D18B 1D88 1442 EB54 A6FC D226 251A 015D" /* ы..BT&%..] */ - $"4DA8 32CA 371B 86EB 4E89 1415 9A41 6AD2" /* M27.N..Aj */ - $"1F0F 7656 41E5 B874 72E7 5F88 ABDA 28D7" /* ..vVAtr_( */ - $"37D5 EE40 567F F751 2591 01A3 03B9 EFCD" /* 7@V.Q%.. */ - $"E0A8 8CC8 8C8E 0945 3036 453A 1787 59C4" /* ਌ȌE06E:.Y */ - $"B99C 02D2 D5F6 1B5E E34C 551E 8C43 9A20" /* ..^LU.C */ - $"981D 0B44 C6D1 E6AA 2B92 5F33 8016 C4F1" /* ..D+_3. */ - $"7AA6 E605 4676 A533 1D38 6ADA 9BC6 2C13" /* z.Fv3.8jڛ,. */ - $"385A 3DCE 7E2E B9A1 81BB 27C6 AFF8 FF5D" /* 8Z=~.'Ư] */ - $"A511 4C25 DC70 082C B597 3EC4 004C D4B8" /* .L%p.,>.LԸ */ - $"BE6A B79D EF70 2610 B57B FEFE 6ACC 9EEE" /* jp&.{j̞ */ - $"B94A 73A8 4B30 C207 7391 789E C0FE 6992" /* JsK0.sxi */ - $"AB13 E2AA FF53 4B22 A338 0EA3 B476 D732" /* .SK"8.v2 */ - $"EDA3 2009 3422 B4AA 64DE 26C3 5894 D6DD" /* 4"d&X */ - $"F7A9 5A3B 6F31 5D2C EC22 1FAC 928B 647F" /* Z;o1],".d. */ - $"1600 A961 11C3 FD11 E594 81F9 E0AC 20D4" /* ..a..唁 */ - $"0DCA 9CE0 FF14 3BE3 3010 00E1 9DFE F0C8" /* .ʜ.;0.. */ - $"70E7 D3A5 A7F9 884E 6941 CBCB FEBE 0C27" /* pӥNiA.' */ - $"B3F5 BAA4 3068 BFC1 DB20 1E5F 9E83 BF7D" /* 0h ._} */ - $"8EA3 8FB0 F355 FF02 DED2 5CC8 2B4D 4DA5" /* U.\+MM */ - $"8122 C96A CDAB B130 2D35 B73E 2EE9 0AA9" /* "jͫ0-5>.© */ - $"7DB8 B81D 7B0A 776B DFF3 2B02 1F6A EF5B" /* }.{wk+..j[ */ - $"E6A6 177F D8C0 1C3B A88C 2154 18F3 BFB3" /* ...;!T. */ - $"F7EF 1249 860B F87F 60D6 AE06 B5B2 7824" /* .I..`֮.x$ */ - $"E601 91D7 1436 80CF 054C 9691 1321 B299" /* ..6.L.! */ - $"11F3 2BA3 51F6 447E 1BC0 28CB 666B 9BA0" /* .+QD~.(fk */ - $"425A E39B 066C 1B7C 340B 950A BDCC E05D" /* BZ.l.|4.½] */ - $"C8DC 568C BDC6 54E9 0AA2 2D89 6E22 37E4" /* VT¢-n"7 */ - $"3508 39CC EE8F 8EE6 F926 626B E33F 4A06" /* 5.9&bk?J. */ - $"4CD1 AE16 9063 3119 5554 58CA BB53 4A73" /* LѮ.c1.UTXʻSJs */ - $"AA2B 2A71 B86B 3E95 BED6 D9D2 9D59 3E60" /* +*qk>ҝY>` */ - $"C5D1 FA4C E6A7 880F 30D8 A679 6467 697E" /* L槈.0ئydgi~ */ - $"F327 EAA4 E0D1 01F9 9B74 AAA1 6CDD 7DA7" /* '.tl} */ - $"D2AB C9CB 63D6 D3DF C778 C6ED 71A5 0571" /* ҫcxq.q */ - $"C7E1 4EC7 E16C 43F0 75B1 3C9E 91EA AAAC" /* NlCu<ꪬ */ - $"9A2E A47E 8DF0 873E 2275 3F71 F986 DF3D" /* .~>"u?q= */ - $"DBE5 1F4C 0D83 C3F5 F2D4 5A7C 0BFB E4FC" /* .L.Z|. */ - $"C83E D8A4 FAF4 F589 09F2 4909 40AA 2AA8" /* >ؤI@* */ - $"C190 BE4D D484 1408 6EAD 722F 6BA6 7502" /* MԄ..nr/ku. */ - $"A53F 1B9A BE86 841A FC60 53F3 8AE9 2E4C" /* ?..`S.L */ - $"4B8E 1D09 F47C 3BAA CFB7 80DE 6A41 F007" /* K.|;ϷjA. */ - $"80A3 413A C568 5C02 6166 E8AF 9B6C EF86" /* A:h\.af诛l */ - $"F178 273B A803 89E9 520A ACFC 0E98 6198" /* x';.R¬.a */ - $"6ECE D094 76D1 8AF8 1035 D0C8 B9E5 ECC9" /* nДvъ.5ȹ */ - $"08E6 748A F28B B0E0 F9AB 71B4 7971 9626" /* .tqyq& */ - $"5397 5D5A 31CB 5F9E 7C98 8300 72B1 2C67" /* S]Z1_|.r,g */ - $"A38D 0C02 C603 C0C2 2000 E528 0CAA 9472" /* ... .(.r */ - $"3115 8C05 0EE6 3F33 3F6D B6DB 64C7 AAB2" /* 1...?3?mdǪ */ - $"94EA DD85 D3DF F14E FF3F D3A2 778B 3749" /* ݅N?Ӣw7I */ - $"B31B 6DB6 C5B6 5311 C782 3FCF 2880 6695" /* .mŶS.ǂ?(f */ - $"085A 35C2 3938 420E 8705 50BD 51C3 BD21" /* .Z598B..PQý! */ - $"41B9 C3ED 3A76 367F 40F5 DA53 3618 DF7A" /* A:v6.@S6.z */ - $"EE11 B2D6 D9AD 4351 7D8F BC5A 7217 9352" /* .٭CQ}Zr.R */ - $"D43F 54B9 F618 3E0E 5FF8 1599 CD00 5489" /* ?T.>._..T */ - $"459D 1B65 0538 7A92 D8EC 6AD5 E756 776E" /* E.e.8zjVwn */ - $"5B66 A07C 36D6 A4B0 2E00 21E0 ABFC 2AB8" /* [f|6֤..!* */ - $"F387 5784 0DB9 1978 67FE DEFF 0CCC CCCC" /* W..xg. */ - $"CCCC CCCC CCCC CCD3 5F84 850A F245 C370" /* _Ep */ - $"786E 76C5 56A5 8C9B FC7F 6869 3085 EB26" /* xnvV.hi0& */ - $"6162 A234 8BF4 868D 0BA5 77FA 56D2 31FD" /* ab4.wV1 */ - $"7436 0147 944C 2AAE C8C1 DE46 2A3A 2449" /* t6.GL*F*:$I */ - $"EAD0 8E9E FF0B 129F 7F9C 1436 A6BC 10E6" /* Ў....6. */ - $"3116 7A98 5FF6 97E9 FC84 7136 FEA5 C122" /* 1.z_q6" */ - $"E58F 44D6 D7A4 0AD3 E9B4 7C91 B833 1F91" /* Dפ|3. */ - $"5F0F D8F7 8A80 6560 B332 081A C68D 0FF9" /* _.e`2..ƍ. */ - $"899F 2CC7 E1D6 FC7E 1DEB C3ED EA04 F55D" /* ,~..] */ - $"017D B775 48A1 A844 EAB2 8E3A 5FF2 20AF" /* .}uHD겎:_ */ - $"6231 D1B0 D4D9 D308 999B 09F2 95B1 7071" /* b1Ѱ.pq */ - $"F57C 1F1E 7960 4639 6A62 5BC6 9E5A D45D" /* |..y`F9jb[ƞZ] */ - $"F339 9597 BF1B 62EB D128 B3D8 9BD3 52BF" /* 9.b(؛R */ - $"0703 43F9 E1C7 940E EA41 F4B1 75E4 891F" /* ..Cǔ.Au. */ - $"09A4 D439 7DFF 6AB7 EB4F 1253 A9C0 8BBE" /* Ƥ9}jO.S */ - $"40A0 3CE6 965D F886 A9EF 7E69 712D 41C2" /* @<]~iq-A */ - $"0062 6917 5D06 6548 9FD6 1470 4A0C 8545" /* .bi.].eH.pJ.E */ - $"8417 6C73 0C2D DF44 0E4A D5F9 7443 D629" /* .ls.-D.JtC) */ - $"E62D DE53 CCFA EAEA E08A F0E1 9D37 9616" /* -S7. */ - $"C0DA 1FD4 6A42 6CE6 1D10 AB6A 911A 19D2" /* .jBl..j.. */ - $"47A0 4AC5 6A3C 12FF 0FE8 3AFB 7DFD 3D27" /* GJj<..:}=' */ - $"42C6 E2BA 6DDE D1ED 21CE 1EA0 F444 055B" /* Bm!.D.[ */ - $"122A 41EE D8C1 144C B39C 0EEA 014E 7448" /* .*A.L..NtH */ - $"0B72 7C2C 92B6 0CAC 3CB5 ADA7 8BF8 0C56" /* .r|,.<.V */ - $"1DD5 B763 907F 6B60 8A85 ED4A F87D FBDC" /* .շc.k`J} */ - $"391D 822B CBF5 7266 0E6B B2D4 32DE 606C" /* 9.+rf.k2`l */ - $"014E 64BF F969 E3A5 C8E4 09EC B205 6391" /* .Ndi.c */ - $"3081 96F5 9A80 0599 50D2 38FF 635B 9C35" /* 0.P8c[5 */ - $"97CF A325 D94F B8E1 A794 EABC DA8A 7CC3" /* ϣ%O᧔ڊ| */ - $"8713 2EBB 1EA6 69B0 9A72 A93D 874A 1F30" /* ...ir=J.0 */ - $"4C7B B341 B8CF F61E 7CEE 60CC E9B0 6D85" /* L{A.|`m */ - $"4F96 977D F85D F85A 08AF 46EF F259 FD70" /* O}]Z.FYp */ - $"E364 C54D 1F3D C951 B1DD 2CB4 8B94 9350" /* dM.=Q,P */ - $"8FFC CD4E D39E 2FF5 DC65 9DB7 2133 6E97" /* NӞ/e!3n */ - $"9705 2AA6 2625 534E B2A2 D775 FCFA 60E0" /* .*&%SNu` */ - $"4929 3681 2E72 5087 F3CD FB3A 6386 36A2" /* I)6.rP:c6 */ - $"5E62 8705 57E4 8441 1986 1487 E88F C834" /* ^b.WA..4 */ - $"C59D D57C CCA2 D56F 3889 44AC 0E4D 0E88" /* ŝ|̢o8D.M. */ - $"2592 A50A F98D DF1D 17F2 78BD D4AB FDB4" /* %..xԫ */ - $"4249 FBDE 3E56 BE58 B587 88B4 8D75 299F" /* BI>VXu) */ - $"4C92 6D9A 6B17 6153 9A65 4770 E0EC BBEF" /* Lmk.aSeGp */ - $"2F91 8C35 8FFA 04AF 880C D9B6 204A D65E" /* /5..ٶ J^ */ - $"68DD DBE7 63BC E1C5 CCDD E994 3796 10EF" /* hc7. */ - $"354D C0E7 7A72 E57E EFAC 7C75 E4CE F47F" /* 5Mzr~|u. */ - $"2E82 A8D0 6401 3CC4 1ACC 4513 1211 DCC9" /* .d.<.E... */ - $"BD7A 47CA F093 83C7 38EB 866D 1ED5 AC6C" /* zG8m.լl */ - $"FF01 C348 CFA1 2532 DAD5 2BDD 8CCC 71C1" /* .Hϡ%2+݌q */ - $"1208 75AA 308B 4796 A89E 0EAF AB67 422A" /* ..u0G.gB* */ - $"AA43 8162 68BC 9878 8578 419C AB2E 9518" /* CbhxxA.. */ - $"A9E0 4298 DB46 36D7 ADD0 DE21 DC41 AEA7" /* BF6׭!A */ - $"A05D 795D AB14 E247 6750 3EA8 0A31 5A06" /* ]y].GgP>1Z. */ - $"FAEC AD07 ECF7 C636 A068 22AA E179 7613" /* .6h"yv. */ - $"30F9 831C 0AFA 38C0 E20B 96A9 464E B57A" /* 0.8.FNz */ - $"5AF3 D612 DC70 2A8D 1D09 C7C9 967F 7F7B" /* Z.p*.ɖ..{ */ - $"F47F 4017 A722 9853 37C2 DE55 34CF 104E" /* .@."S7U4.N */ - $"9DD3 35DF DEE2 589C FAF1 07DE 1803 86B1" /* 5X... */ - $"2DE6 6B46 FC45 F24E 8718 3B6E D557 8008" /* -kFEN.;nW. */ - $"FF3B 8EC2 28BD 6146 3EF6 A0FB 0BCA 37C1" /* ;(aF>.7 */ - $"749B 49F2 F419 9EC5 DC0A A6DE 0CFC 1BD2" /* tI.¦.. */ - $"AAF5 4920 1AB3 842A 1813 606E 97CD 0EC2" /* I .*..`n. */ - $"50D4 84CD F427 569F 776D 940A A6F7 68D7" /* PԄ'Vwm¦h */ - $"2A18 4C6D 2056 D254 1226 7F3C 1ED0 7AB8" /* *.Lm VT.&.<.z */ - $"BEFE 2050 50E6 C5FB 173C 1857 FF7F 86D9" /* PP.<.W. */ - $"6CE3 E235 1AFA CBB4 D2BE 4E64 9713 B880" /* l5.˴ҾNd. */ - $"0C41 2E14 401B D14F 5BA4 AD20 7060 C05E" /* .A..@.O[ p`^ */ - $"2011 000E C557 2951 009C A584 6178 50E8" /* ...W)Q.axP */ - $"6E0D 922F BFF7 EC41 A907 0D2B EF09 3CE0" /* n./A..+< */ - $"6344 B3D6 742A 0448 042D 44C3 390B 089B" /* cDt*.H.-D9.. */ - $"B0FF 2877 1C62 BE1E AC48 09B0 4667 19BC" /* (w.b.HưFg. */ - $"319D 1FEA ABB5 1EE9 02D8 C845 A20C 2E3F" /* 1.ꫵ..E..? */ - $"7010 FA38 E2A0 1F01 2933 0557 19BD 9DCD" /* p.8..)3.W. */ - $"5486 F044 5838 C953 CC32 2DF8 6A04 30ED" /* TDX8S2-j.0 */ - $"2C42 0A7D 1B38 7F94 4936 5908 39F1 424F" /* ,B}.8.I6Y.9BO */ - $"2BFF 7F46 F53E 11D3 DA1E 41B4 67AB 296E" /* +.F>..Ag)n */ - $"0B59 6213 9E16 1568 8787 ED75 8822 A102" /* .Yb...hu". */ - $"DAAC D7D6 FA63 ED91 52D2 E98C 6EEB ABBB" /* ڬcRn뫻 */ - $"5465 7C7C 0CEB 3016 0CC6 5793 D7FF 7FFB" /* Te||.0..W. */ - $"34E7 7BDE 794E 6D8C 392D 051A 478B 4AD7" /* 4{yNm9-..GJ */ - $"028C 3119 EDCA 833C 2F1B A23A 5C69 908F" /* .1.ʃ.u%. */ - $"5EF0 4C11 ACE0 90D2 6568 EB55 75AB FF24" /* ^L.ehUu$ */ - $"54B8 0E77 3110 5C67 3138 8369 5BEA 3458" /* T.w1.\g18i[4X */ - $"7FFE 6000 9940 0044 18C6 1A34 14B6 9CD2" /* .`.@.D..4. */ - $"C039 2A00 00CC 8F27 9EFE FF80 1CAA 8000" /* 9*..̏'.. */ - $"0000 0000 D9B1 C1D0 BFE1 D01D 2DD4 E3DF" /* ....ٱп.- */ - $"949B 6DB6 DB6D B83D 6B98 82BC 446D 0CB3" /* mm=kDm. */ - $"55A5 C140 D9E5 5E98 37AF 0E38 4474 B8DC" /* U@^7.8Dt */ - $"FCFA B14E BD14 730B DAA0 4B18 1B4D 81E7" /* N.s.ڠK..M */ - $"B8A8 26E7 EFB0 8272 4619 2A00 0000 0000" /* &ﰂrF.*..... */ - $"0000 0000 0000 060D CD91 05BE 3A07 80DE" /* ........͑.:. */ - $"29D6 2680 7867 5359 9411 F430 48D9 A22D" /* )&xgSY.0H٢- */ - $"DF74 0855 C0C4 C5AA D3F4 FC40 5815 C5FC" /* t.UŪ@X. */ - $"B741 3001 FF7F FDC6 00B8 F1BA FEC9 B662" /* A0...ɶb */ - $"4973 2EE9 5029 E237 296D D4A4 04DE 4DB9" /* Is.P)7)mԤ.M */ - $"5305 FD42 9A82 6842 EF09 9DA2 201D C6EF" /* S.BhBƝ . */ - $"4078 4FC3 038C B201 A1C0 0791 7B09 CF18" /* @xO...{. */ - $"D61B DABD 0409 372B F69D 3CF8 E2E1 31A1" /* .ڽ.7+<1 */ - $"023B B0FD 60B3 3933 16F2 C716 9259 82F8" /* .;`93..Y */ - $"77BB 3A47 46D2 D998 7AA1 01E1 DF78 8000" /* w:GF٘z.x. */ - $"0000 0001 D8FD 4FB2 C620 0000 005A CD78" /* ....O ...Zx */ - $"B755 53CD E910 3B50 96A8 4000 0000 0003" /* US.;P@..... */ - $"FD6F 5DD1 31D8 A087 6BC5 09F3 E81E B49F" /* o]1ؠk. */ - $"5A88 0DB9 2492 4924 9234 EE49 0E46 EE5B" /* Z.$I$4I.F[ */ - $"8D2A E866 7AD0 1F3C 936D 50EF 6EF5 FDE7" /* *fz.ɺ9ů.C-d 9 */ - $"A6C9 6079 72D6 0BC7 C501 A3A4 5EF4 A060" /* `yr..^` */ - $"C46E FCB9 1958 AD83 1176 0776 81C2 13C2" /* n.X.v.v. */ - $"DF08 4A76 137F DC5C 4867 0493 EE96 8373" /* .Jv..\Hg.s */ - $"4644 13A4 F789 39FF 813B D226 575A 5A18" /* FD.9;&WZZ. */ - $"3AF5 4B88 2747 3D47 681F 9670 0069 DD02" /* :K'G=Gh.p.i. */ - $"4252 ADB0 D6FB F1F1 1432 C24B D920 7290" /* BR.2K r */ - $"3709 3D60 15D9 0C49 23EC 77F8 F791 F132" /* 7=`..I#w2 */ - $"046E 0D05 9AFA 210A 9992 29D9 7AA6 F18E" /* .n..!™)z */ - $"E245 75E0 018F BCEB 8D1B C2D0 083E 985F" /* Eu...>_ */ - $"B791 554D F5F5 AD71 E064 75E6 1F3A D463" /* UMqdu.:c */ - $"9A59 0A43 3457 BD7C 44A7 5C5E 9D19 C5D8" /* YC4W|D\^. */ - $"5880 C2CC 5DF0 2964 C0FD ABA1 004B 008D" /* X])d.K. */ - $"5205 7F2E 0843 E484 2D37 9C34 2425 7AFF" /* R....C-74$%z */ - $"7021 D907 B6E1 F5E5 02C3 F3DD 44C8 2252" /* p!..D"R */ - $"0649 3C1A 1A80 449A 64D1 1720 76D6 4987" /* .I<..Dd. vI */ - $"B4B1 E749 E899 BF69 5B35 F925 2EE6 6CE6" /* I虿i[5%.l */ - $"B4FD CEB3 54C0 7C9D 4380 F93B 5701 F274" /* γT|C;W.t */ - $"C4F3 CC20 F972 1FD1 56B3 911D 2995 5FC9" /* r.V.)_ */ - $"1F35 BAE0 9AC7 3082 1372 C1D5 4B23 D79E" /* .50.rK#מ */ - $"EF63 A93F 8E74 26FB AC68 CDBE BD3E 9720" /* c?t&h;> */ - $"DF71 956D 5D26 559E 2795 2F1B F798 7821" /* qm]&U'/.x! */ - $"F3CB 1E6F 2351 11BD 0EFF 19B2 40A2 1C7F" /* .o#Q...@.. */ - $"267D D302 F6AE 5410 1E96 40DC 386E CB7B" /* &}.T..@8n{ */ - $"7EA3 5CF7 46BA 8758 D0EE 12B3 34DF 46FE" /* ~\FX.4F */ - $"517B E0F8 7E28 83A5 E93A C06D 7C3F 254B" /* Q{~(:m|?%K */ - $"53DF 91ED F6AB FD0A 53A0 5257 F9B8 E8B7" /* SߑSRW */ - $"5A14 6036 C6DA E3FE C29D 799F 8B43 46D6" /* Z.`6yCF */ - $"94DF 1954 073C 7C30 40F4 A00D 93D4 AADF" /* .T.<|0@.Ԫ */ - $"4839 EF36 F92A 3758 97CE 955A 3521 3CB5" /* H96*7XΕZ5!< */ - $"8269 30A7 2A93 6A40 07BE DCC3 50B6 C86B" /* i0*j@.Pk */ - $"CE9A AF28 3B80 4FE6 873C DB8E A29C 15DC" /* Κ(;O<ێ. */ - $"81A8 F841 4F77 6237 7267 55C4 1289 2DA1" /* AOwb7rgU.- */ - $"8392 424A 398F 9FA7 8DBE 2CC6 44E9 A005" /* BJ9,D. */ - $"0E57 6638 ADDD 9F15 D32E 13A9 F752 67BA" /* .Wf8ݟ...Rg */ - $"9F1D 753C 0023 2BC1 2C48 19AF FF28 66E6" /* .u<.#+,H.(f */ - $"0A05 1D62 536F C372 7DEC 5069 B44D AFD4" /* ..bSor}PiM */ - $"BE3C 9C16 161E 95B4 89E7 B034 4524 E373" /* <...4E$s */ - $"D4A2 2F82 F1BB 8F20 7861 0F95 7CDF C184" /* Ԣ/ xa.| */ - $"5B65 6015 001B F6BD 5D52 D4BC 3A42 FD56" /* [e`...]RԼ:BV */ - $"D48F 3358 7432 09BD FF19 625D 3A11 13DA" /* ԏ3Xt2ƽ.b]:.. */ - $"F222 12E8 5A1B 12BF 9B3B A234 A367 8FB6" /* ".Z..;4g */ - $"4BF2 EE99 DB11 5D13 7021 71B4 2280 A1BC" /* K.].p!q" */ - $"2AEF ECB5 D7EC 047C 0860 9676 78B1 CA76" /* *.|.`vxv */ - $"9AFB C995 D4EB 900A AD98 6423 E572 B68C" /* ɕ­d#r */ - $"A271 A30B D157 8E95 8250 29BB 0323 E26C" /* q.WP).#l */ - $"9223 91C7 0CD4 F0B0 442E 1BD3 1473 C699" /* #.D...sƙ */ - $"2D1C 8791 C699 920E 72C0 0D3E F6E9 9E2B" /* -.ƙ.r.>+ */ - $"60B6 A87F 6CBE 146C 1224 90FC BF7B C6A9" /* `.l.l.${Ʃ */ - $"090E 3EAD C89D 5065 414B 3A1C F271 9327" /* .>ȝPeAK:.q' */ - $"D490 CD2B FBB3 BEFF 768D 4601 635B A746" /* Ԑ+vF.c[F */ - $"8A4B 0981 8B8F EA85 D255 2113 8792 CC76" /* KƁU!.v */ - $"DE84 B950 C5F4 A4C1 D4EF 7D52 CC74 CCEE" /* ބP}Rt */ - $"B40E B94F 9467 15CA 1DE0 3557 BF09 D787" /* .Og..5Wׇ */ - $"ED66 345A E153 B4DC EF7C 2952 3161 5A99" /* f4ZS|)R1aZ */ - $"A193 D5EB 40F5 1300 65FA 8DFD 621A AE94" /* @..eb. */ - $"30CD 6D25 A0FC 942E 37AC 52C8 CEAD 2D1F" /* 0m%.7Rέ-. */ - $"87D5 D078 F173 F5AD 7A56 DD1B 10C3 F9BF" /* xszV.. */ - $"69C1 9E6B E021 A0C7 84BF D87A 8AA8 327C" /* ik!DŽz2| */ - $"7D48 0D97 E584 FF7F AE07 2001 BF6C 2691" /* }H... .l& */ - $"3032 E118 8741 42AD 7709 3086 8488 F9D3" /* 02.ABw0 */ - $"0353 D79E 2E21 8F21 46CC 005C DA8A 0229" /* .Sמ.!!F.\ڊ.) */ - $"A56B A72A C69E FCF7 7558 5D72 0050 2BDE" /* k*ƞuX]r.P+ */ - $"0F36 E4F0 C744 89FC 37F0 7ECA F488 FE8C" /* .6D7~ */ - $"1B6B 0158 B34D 1EA6 9B1F 154E FF79 01D4" /* .k.XM...Ny. */ - $"725F D9CF D9BF CCFF 439D 8F5C A92D D20D" /* r_ٿC\-. */ - $"0613 88F8 5C1C B6BD 07B9 9078 151D 8353" /* ..\..x..S */ - $"0E68 8495 D521 92D8 E92D CF9B 10E6 ABDC" /* .h!-ϛ. */ - $"53D9 DFB2 F2AF F964 14E3 74D6 3D64 01E2" /* S߲d.t=d. */ - $"FAFB 2D0B D303 DCF7 7718 E6CF 30DB 3FAE" /* -..w.0? */ - $"2873 3339 54A3 1E48 04D2 FDF2 E863 6201" /* (s39T.H.cb. */ - $"01D1 182C 4C2A D85D AE26 DE15 9796 494C" /* ..,L*]&.IL */ - $"82EA B4C0 2D3C 3D3E 1732 2ACA AC27 B7DB" /* -<=>.2*ʬ' */ - $"5CED 6F9D 3EDB FF04 5E83 BE60 1636 AE2C" /* \o>.^`.6, */ - $"754D 2928 7128 ACFD 15E8 C1A0 30A5 1063" /* uM)(q(.0.c */ - $"1E6F 10F7 A946 B9B4 D921 5DB3 113F 332E" /* .o.F!].?3. */ - $"61B8 AB3D 2F87 E081 C9D9 32B7 1060 785A" /* a=/2.`xZ */ - $"EFDD F472 0283 E235 4D42 E903 A06B 51CB" /* r.5MB.kQ */ - $"39DC A412 A492 918E 235E F57C E4CE 4E0F" /* 9ܤ.#^|N. */ - $"6BE6 7036 FA8A 7B2C 21FE 60B1 6FCA 7654" /* kp6{,!`ovT */ - $"C9FD DCDF E497 B2A6 D6D5 87ED 9D3B 5B86" /* 䗲Շ;[ */ - $"DA51 6B5B AE3E 520B 1DB3 5A6B 2B4D A777" /* Qk[>R..Zk+Mw */ - $"4F13 A04C 7D4F 819B 1FEB 086D 5F34 6643" /* O.L}O..m_4fC */ - $"0208 693A D70C 55B2 7A07 BC27 3A41 B739" /* ..i:.Uz.':A9 */ - $"C1F5 7425 07D5 D74C 1F56 F680 F1C4 B0CB" /* t%.L.Vİ */ - $"F3E0 DE80 53FC 256D EFD0 6B64 028C EC70" /* ހS%mkd.p */ - $"4973 06D4 242C DAAA 8373 DFAC B0C9 14A1" /* Is.$,ڪs߬. */ - $"BFBC 0BB4 E250 919E 3D2B B388 3A89 FB02" /* .P=+:. */ - $"9796 86E6 20F8 C26C 8120 349C 757A 6875" /* l 4uzhu */ - $"F63E AE68 84C3 03A3 6F64 F9EE F892 2CF8" /* >h.od, */ - $"61C1 B13A E941 0D67 DA36 4C05 9565 DC85" /* a:A.g6L.e܅ */ - $"D7F8 6EB9 D903 D428 F59A 3EBF C73E 5E95" /* n.(>>^ */ - $"764D 15FB 98F2 BECE 0FC8 EA3C 4E51 E1DD" /* vM..w' */ - $"DDEE 0A95 231F 04AC B6EF D134 C09D 1540" /* •#..4.@ */ - $"0E94 57E2 8418 C208 1F26 7396 96A0 D08F" /* .W...&sЏ */ - $"0CC0 40C8 C596 39BA 0CAE A6ED F8E8 7D6B" /* .@Ŗ9.}k */ - $"A76C 391B 6113 555F 62E0 6E14 5D27 E7BC" /* l9.a.U_bn.]' */ - $"EDB7 D038 DED2 7BEE FC9D 6211 241E 0795" /* 8{b.$.. */ - $"9CDE 1607 B4C7 828E 24D2 4E9F FCA0 36EA" /* ..ǂ$N6 */ - $"004C C960 1680 01CE 7FF6 A201 EDAB 1ADF" /* .L`..... */ - $"80D8 4524 390C 23DD EA8E 062C 5DDB 3C57" /* E$9.#.,]6 */ - $"00C2 0E05 134F 4802 3846 3575 1902 676D" /* ....OH.8F5u..gm */ - $"1006 D8AE 0D5F 1934 78F6 0721 F3C4 1000" /* ..خ._.4x.!.. */ - $"8991 FA85 45B5 37A9 5A0C 54EE 014B 297B" /* E7Z.T.K){ */ - $"52F2 5ADD 7422 C97B EAA9 D291 45A7 A44A" /* RZt"{ґEJ */ - $"40FE AE73 5086 C7D3 85FD D734 67F2 8909" /* @sPӅ4g */ - $"506D 36D8 2361 990C 802F A59E B603 9C94" /* Pm6#a./. */ - $"F7BD AED9 8518 8651 DFFE 3D0E E920 E874" /* م.Q=. t */ - $"FEB0 EE3C 3242 C249 4704 EEA8 9EFA DC61" /* <2BIG.a */ - $"49C6 929E 2A9D 51CD FE0A FF02 3DDB 01EC" /* Iƒ*Q.=. */ - $"80E8 630A B0C8 C9FC 7693 C60B 07E8 5D2F" /* c°v..]/ */ - $"B97A 9F04 444E C836 DD68 FF12 EC9C 7E4F" /* z.DN6h.~O */ - $"3CE9 83A8 191A 1E61 05F8 90FF 67E8 011A" /* <部...a.g.. */ - $"71EA 3EE8 AFBD 6328 ED84 9807 788D F3BC" /* q>诽c(턘.x */ - $"2FA0 A210 7FFF 1D02 2519 4EC7 2A80 7FD0" /* /....%.N*. */ - $"2064 A8F4 CC78 5EC8 88AF F1AB 868B 9F8D" /* dx^Ȉ񫆋 */ - $"883E 3FDA D188 FBB7 3AFC 0C72 E01A CEF3" /* >?ш:.r. */ - $"21E1 1718 4FDB 9A43 3767 424A 639B DFFE" /* !..OۚC7gBJc */ - $"CA5F 7BA9 8F82 3EA6 6D4E 6986 6945 80DE" /* _{>mNiiE */ - $"8274 4927 166A 6062 DF1D 0A72 F23B FA5A" /* tI'.j`b.r;Z */ - $"4DE4 5D19 54FC 488B 5237 FF5F 7B81 62C5" /* M].THR7_{b */ - $"F6B7 B580 3016 11B6 22CF 63B8 428A D39A" /* 0.."cBӚ */ - $"5AC3 80FF 7310 8386 FF54 F361 304F 3BB5" /* ZÀs.Ta0O; */ - $"A7EB 0419 7DFB 6E56 20A8 3670 9018 9CB3" /* ..}nV 6p. */ - $"4B35 7082 32A7 E917 9CF8 FF7F FF80 0A6C" /* K5p2..l */ - $"A48C 447E 3ECF 411D 89E4 F923 373B DCBE" /* D~>A.#7;ܾ */ - $"2CE8 6580 0F87 1A23 1D93 62AE 48EF DEB8" /* ,e..#.bH޸ */ - $"5DE8 DB68 1CA3 8D4B D3FE A476 7B3D ACAA" /* ]h.Kv{= */ - $"284F 83EB 428F A201 D122 CB1A CCB2 C1FE" /* (OB.".̲ */ - $"367F 60D3 155D 8C00 22D8 ED33 D56B 1DE2" /* 6.`.]."3k. */ - $"98B0 A4A9 E041 2BF1 AA58 E78D 47E5 929F" /* A+XG咟 */ - $"85DA 699E C45A 0064 B931 CF2B 4169 44F0" /* iZ.d1+AiD */ - $"4B4F 083B 3D7C B2B2 D87B 785E 91A8 C614" /* KO.;=|{x^. */ - $"6EE6 A63C C8A7 B9E3 839D E245 4128 3BF9" /* n<ȧポEA(; */ - $"98CD 0C23 72EB E3A9 D21F 1BC2 4E13 274B" /* .#r..N.'K */ - $"19C8 CB39 5E7A D218 FBDB 0C42 51A1 1203" /* .9^z..BQ.. */ - $"C0EB CDC2 9249 E461 1DE4 3DB6 FDFE 1334" /* ’Ia.=.4 */ - $"1952 8231 CD71 A170 C55B 1FD0 6706 57F0" /* .R1qp[.g.W */ - $"282D 09A2 0893 A5BA 0314 43DD 32AF 3478" /* (-Ƣ...C24x */ - $"EF6C 15F0 55C9 6A47 ECFE 3F3F 4DB4 5ED8" /* l.UjG??M^ */ - $"EFF8 8CA5 71F9 6669 078C 550C 943A 7046" /* qfi.U.:pF */ - $"C031 6CE2 4681 4177 2913 CFE7 D857 C62A" /* 1lFAw).W* */ - $"4652 88E2 8830 DF42 9C3D 2D76 E710 A8F1" /* FR0B=-v. */ - $"3626 45F2 55CC 008C EAB8 B891 A5F3 1AD2" /* 6&EU.길. */ - $"AB11 6C48 3F18 40C0 51F0 DB88 0BD1 168C" /* .lH?.@Qۈ.. */ - $"2E54 2DA6 CC60 BB05 4700 2C4E 179B 271B" /* .T-`.G.,N.'. */ - $"688C 1EE9 4D9A C781 8108 296B FE4F 028A" /* h.Mǁ.)kO. */ - $"63D6 6EDF 6FEB FC17 BDFE 7A70 B48E D94E" /* cno.zpN */ - $"D985 3384 1BD2 B4C9 5213 B0D1 041B 876C" /* م3.ҴR...l */ - $"131C 4A9C 947B A79C A466 9779 E7C9 D2E1" /* ..J{fy */ - $"4E9F 0509 30E0 1115 E5C7 CAED 197B 818A" /* N.0...{ */ - $"324D 8F8E ED44 BF44 5340 D647 1776 B983" /* 2MDDS@G.v */ - $"6D8C 88B1 6976 F7EB AFDB 6638 CAD3 F275" /* mivf8u */ - $"D93A 6CD3 9D6E C617 3969 D8E5 3059 947B" /* :lӝn.9i0Y{ */ - $"6AFA 0E9B A19C 24C9 E1DC 089D 3545 89E4" /* j.$.5E */ - $"E860 FB54 068C B464 EE9B 66B7 F267 34CF" /* `T.dfg4 */ - $"1276 C6B2 47E6 8284 300B D1A9 1409 0C93" /* .vƲG悄0.ѩ.. */ - $"E36A 8095 409A 7352 FF7A 0F50 A5E2 E678" /* j@sRz.Px */ - $"C195 0898 E51E EB15 8D7A E918 29A6 D5CE" /* ...z.) */ - $"4DBC 978B 2CAA 9BA7 8727 EA1C 1C7A 6CC2" /* M,'..zl */ - $"D172 DDF5 4BD4 9C69 607B 609F AEC8 FD84" /* rKԜi`{` */ - $"1DDA A076 C7E1 A7B1 F86C BC7E 1720 EB83" /* .ڠv᧱l~. */ - $"095B F1C8 7239 10FD 6A26 D10E 534B E257" /* [r9.j&.SKW */ - $"B691 5D92 6949 E7D8 7470 AA8C 421F F945" /* ]iItpB.E */ - $"99F6 9492 B806 E264 47B0 4EF5 6206 734E" /* .dGNb.sN */ - $"944B 102F A688 23A4 EAB0 CCEA 0017 0156" /* K./#...V */ - $"A8C9 2A3F FF49 4137 E23A 09D0 97BB 0E5F" /* *?IA7:З._ */ - $"E2A2 2247 4980 6A20 B443 3E0B 0465 B9EF" /* "GIj C>..e */ - $"C490 B954 3AEA ABB7 3D53 111D 8897 551C" /* ĐT:꫷=S..U. */ - $"B865 1EA2 33F2 AD50 D488 1D6D 9733 27F3" /* e.3PԈ.m3' */ - $"78AC C946 FB3C 4D2F 6580 1B3A 3368 3D54" /* xF1̻wqO */ - $"1679 23F1 DE12 5574 68E3 60A1 9C00 CBEC" /* .y#.Uth`. */ - $"9C44 9009 0000 08DE 28C3 2776 AAA2 829A" /* D...('v */ - $"05E0 47E9 0001 48A9 672C 0775 EE58 F075" /* .G..Hg,.uXu */ - $"7458 B48A 5455 DB33 3524 BE73 1D7C E223" /* tXTU35$s.|# */ - $"4EC4 732C EC4B 128D 341C 790C 00A2 1309" /* Ns,K.4.y... */ - $"2D0B 5EA7 B07B C82C 976B 68C2 642A F095" /* -.^{,khd* */ - $"A1C4 010E C94E D8A9 34BB FD3E 2B2F 92EC" /* ..Nة4>+/ */ - $"30E1 A7B3 040B C920 3FFF 7FA1 317B 90F7" /* 0᧳.. ?.1{ */ - $"C744 40B8 8325 4036 82FB 0C6C D800 19C4" /* D@%@6.l.. */ - $"2631 C4B8 3160 8649 2492 4924 9248 A747" /* &1ĸ1`I$I$HG */ - $"3D41 A17D 23A6 9AC7 9000 0000 0000 0000" /* =A}#ǐ....... */ - $"0000 0019 1A70 8823 BB21 7C62 4556 F257" /* .....p#!|bEVW */ - $"62C0 CF0B 72EE F37E 64EC 43C2 AE04 9F58" /* b.r~dC®.X */ - $"94DC E128 91EC BAA2 DADD 57A7 D5F7 1972" /* (캢W.r */ - $"7543 9A9A 0DB3 C3FD 42E0 19A3 8F45 7FDF" /* uC.B.E. */ - $"CEB1 A7E5 8A09 5B4A F9E6 294B C5DC 80C9" /* α[J)K܀ */ - $"9AEE 0729 374F 04FD 79D6 7170 D940 14F0" /* .)7O.yqp@. */ - $"830F 0B71 50E7 3C76 97AF 0F71 A32D DC5A" /* ..qPF2 */ - $"57A3 0EC0 B3A3 969D 9DF0 6ACC 859F FF7F" /* W.j̅. */ - $"FF27 DAA0 AF8E 216C E5D8 874A 530F 555E" /* 'ڠ!l؇JS.U^ */ - $"AF3F E231 5BAF F7B6 8E73 5742 2717 4031" /* ?1[sWB'.@1 */ - $"175D 5FDA F402 B756 AEAE 7E7E BFEE CE68" /* .]_.V~~h */ - $"7878 870D 01C2 C2A4 61D5 64E3 E195 B914" /* xx..¤adᕹ. */ - $"A45F FF52 DC14 F5E9 E037 65E3 5477 62A5" /* _R.7eTwb */ - $"3EEC CA32 6558 5965 8B6E 3F13 9DB2 1361" /* >2eXYen?..a */ - $"8426 9FD7 B329 4E75 FF1D 9B78 9735 4B1B" /* &׳)Nu.x5K. */ - $"D80E 1781 192F 6777 8F94 F6A2 5016 726D" /* .../gwP.rm */ - $"1E0D D2CB 6F87 B3C6 09A2 1FE3 915E 8943" /* ..oƢ.^C */ - $"FE6C 6743 4733 D5BC A9DD 5338 C9E1 AF50" /* lgCG3ռS8P */ - $"3634 C26C 0C1F 94E7 50B2 4310 DD62 4F09" /* 64l..PC.bO */ - $"ABCD 7821 8B7B 7B87 2EEA 25A1 9D3C 55CC" /* x!{{.%q%۱... */ - $"93B3 4206 45ED 7238 3F80 1441 50CA CCBA" /* B.Er8?.AP̺ */ - $"EF59 3BC5 4236 2ABF 9150 7335 49C5 0216" /* Y;B6*Ps5I.. */ - $"F97B D5A5 1EF5 A69D 8B34 C25B 73E1 DA52" /* {ե.4[sR */ - $"79E5 9EB1 9CB1 0952 B3F5 E221 D426 4759" /* y垱R!&GY */ - $"D5CF 2D18 CC2A 270A 859D F10C 8108 52FF" /* -.*'…..R */ - $"2A7D D39E EFFD 568C 2DB3 7BD5 62D0 2403" /* *}ӞV-{b$. */ - $"69D1 A4B6 2D24 E485 973D F6A5 E6DC 1DB5" /* iѤ-$䅗=. */ - $"BF0B E185 5592 E3A0 6046 E050 5151 9546" /* .U`FPQQF */ - $"17F7 0CF6 222F 17E0 40E5 3EF5 74EE BAB6" /* .."/.@>t */ - $"55BD 76C1 DD80 39C8 BAE0 37B8 398A B370" /* Uv݀9Ⱥ79p */ - $"D400 0C29 5DC9 94FF 069B 36E2 CD79 195F" /* ..)]ɔ.6y._ */ - $"5B9B 1237 1F18 C560 C901 F9A4 184B 7570" /* [.7..`..Kup */ - $"433E 75BE 0297 C641 7D9B 7092 8D64 96F5" /* C>u.A}pd */ - $"D70C 9B66 71D3 09B1 F635 0FC3 0B49 7D6E" /* .fqƱ5..I}n */ - $"660C 8E1D 0257 672B 97EE C2A5 7B84 729E" /* f...Wg+¥{r */ - $"6516 585E 354F 2E22 88A7 A515 B945 3745" /* e.X^5O.".E7E */ - $"F6A5 5CB2 E212 10AD AB6F 07F5 FDA3 09EB" /* \..o. */ - $"A053 313B 9A8E 757D E132 D483 DC78 0882" /* S1;u}2ԃx. */ - $"A63C 95E0 036C 4626 F66B 5F6C 39A1 9401" /* <.lF&k_l9. */ - $"7276 4DCE 4487 7D8C 12A3 B713 9139 AC0A" /* rvMD}..9 */ - $"18AD 4DFD 2A3D 69E7 E76E 593C 8DAB FD56" /* .M*=inYg */ - $"AF2C 323F 0FD0 6752 4973 55BD CC10 05B4" /* ,2?.gRIsU.. */ - $"AB3F 9302 00C3 EE70 1BA4 B650 FAB2 5821" /* ?..p.PX! */ - $"3856 3872 1B02 7D70 F1F9 0B28 A9DC CAE7" /* 8V8r..}p.( */ - $"D9E7 6252 A768 A7DE 0FB1 FCB1 F54B 98C4" /* bRh.K */ - $"7B6E 5E24 BC53 F945 741F 66A0 A51E EE5A" /* {n^$SEt.f.Z */ - $"2A0D B951 4EEE A88B 4F2F C326 F326 1D12" /* *.QNO/&&.. */ - $"524A 9E48 CC53 44EF C54F 1737 8505 46CF" /* RJHSDO.7.F */ - $"351E 4354 05C7 C832 2A7D 8899 D009 E617" /* 5.CT.2*}. */ - $"0334 305D 9497 D845 E6D3 2CD2 178F 1316" /* .40]E,... */ - $"65AD 239E 2ED5 ECCB 402A E728 09B5 E847" /* e#.@*(ƵG */ - $"65BD 3F31 CAC5 F9D8 6606 B8AF 4F84 89FE" /* e?1f.O */ - $"9004 4730 30BC E58F 5FB3 38CF 36B9 38FC" /* .G00_868 */ - $"FB9D 07EA D13F 9DB9 7185 0E88 0E3B 06E5" /* .?q..;. */ - $"D476 CFCA 1587 3067 9257 B5DF 1E83 E7FF" /* v.0gW. */ - $"7FFF 7FFF 0E68 E181 AC15 B980 2AFB 1D80" /* ...hၬ.*. */ - $"C5BB A88D E36A 4DC5 94CF 6DB2 0694 F977" /* ŻjMŔm.w */ - $"D708 02D1 F380 6773 016A CA84 3B1C 6A33" /* ..gs.jʄ;.j3 */ - $"5AAC BA2D FEC5 7542 51FC 68D0 CDDD EA44" /* Z-uBQhD */ - $"788E 2F96 D80C F159 FF45 3316 1494 A7F5" /* x/.YE3.. */ - $"98B4 FC39 0062 D59B 52A6 32CB F97C ABD6" /* 9.b՛R2| */ - $"42AE AE46 6AA7 D986 0A4E DCDD 717E 8B7C" /* BFjنNq~| */ - $"8FB8 B396 65A6 83FF 6A4A A5C1 597F 70AF" /* ejJY.p */ - $"DC96 E2EC 0C1D 7A00 3428 2C60 DE32 8DB8" /* ܖ..z.4(,`2 */ - $"1604 C249 5E82 1F5B 6C23 E562 B2D4 754E" /* ..I^.[l#buN */ - $"7F73 442A 25D3 C42A 6A6D 5D09 0E8C 2E67" /* .sD*%*jm]..g */ - $"95EC 08FE B505 8B5A A4A8 0000 0000 0000" /* ..Z...... */ - $"0000 0000 6121 26B3 27C3 AEC0 FF52 2FEE" /* ....a!&'îR/ */ - $"D4F3 92BB 06E2 ABE4 35DC A278 9084 B2F0" /* .5ܢx */ - $"EE1A ADB2 F770 3D4E 120A FD01 B042 CD00" /* .p=N..B. */ - $"B9C2 B661 40B0 E5FC DC59 59F0 61C5 53A7" /* ¶a@YYaS */ - $"7AC1 7EDC 77B7 1C84 0F9A E321 389C E693" /* z~w..!8 */ - $"AC98 5160 DDD0 C9A9 BE17 ED52 A10A 300C" /* Q`ɩ.R0. */ - $"88ED BB5A 80DA C23B 1196 0C7C 6BA8 D4EA" /* Z;..|k */ - $"4FAB 08A9 EBE3 1CC9 6782 F6A9 85A4 1829" /* O..g.) */ - $"48BB D188 41E8 65BA 28BB 8AC1 8368 DC2F" /* HшAe(h/ */ - $"B2DE 61FE 95C0 BD88 C027 9CD9 3819 8A81" /* a'8. */ - $"20FF 616C DEAE C6EA 15A3 D12F 764A B4E2" /* alޮ./vJ */ - $"ECA3 AF32 36FF 29B0 E3CD 5046 527E 39B7" /* 죯26)PFR~9 */ - $"921A ABF8 F0CB 7040 5FCD A182 4C57 986D" /* .p@_͡LWm */ - $"1115 DD94 687C 3663 7CFB 6C40 642D C8CA" /* ..ݔh|6c|l@d- */ - $"1117 B5A9 8025 123D 9406 58F9 96B5 321E" /* ..%.=.X2. */ - $"7646 4BFD 48DE 0B9B DBEF B79F B6C7 031E" /* vFKH.﷟.. */ - $"1D3B 1D18 B35D 2813 5601 3924 6AE1 FC21" /* .;..](.V.9$j! */ - $"60B9 0B9F 6B4B AFB9 15D8 C57A 5345 7461" /* `.kK.zSEta */ - $"0EF9 4B6B 88D1 7833 02DF 4FB8 DBEC 836A" /* .Kkx3.Oj */ - $"BEA7 3972 93C0 F973 37B5 C84F 1655 031C" /* 9rs7O.U.. */ - $"674D 741E 308E E3BA 6684 5BB0 4506 AB40" /* gMt.0f[E.@ */ - $"14DE BFF2 9B38 4026 C5C2 3A44 FDFF 25CB" /* .޿8@&:D% */ - $"072E 1D99 62E3 22B8 DE8D 9CF1 79FA 1D38" /* ...b"ލy.8 */ - $"8900 17CB A72B 8124 7EAF CF2F FC8D 34D6" /* ..˧+$~/4 */ - $"E0AC 58ED 8BC1 0DAA 7964 FB91 BF08 EFA6" /* X.yd. */ - $"42FF 7FFF 7FE3 AF13 7C4B 1CF4 D643 3CD3" /* B...|K.C< */ - $"5F1A 08BB 7C56 5CFB 6D27 04DE C66A 9AF1" /* _..|V\m'.j */ - $"2053 D4B2 EE60 44FF 2A89 1FFC DFCC 57C1" /* SԲ`D*.W */ - $"3800 1290 7854 7902 FF7A 9A36 D71E F8D1" /* 8..xTy.z6. */ - $"D439 471B D02F 4A39 E5BC D25F FDF0 8B54" /* 9G./J9_T */ - $"AE0A 3677 2625 B286 7DEC 8FF7 2457 2B25" /* 6w&%}$W+% */ - $"C066 2A4E A605 EE16 7244 CCFD D3D3 FDA1" /* f*N..rD */ - $"F3B8 76C3 1C5F 491C 0165 8735 D71D 19AD" /* v._I..e5.. */ - $"9BB1 A40D E5BA 9D1C E34B B71C 9CF0 EC7A" /* .庝.K.z */ - $"5E87 C4F0 A326 0913 9E2C 6517 50A3 E72B" /* ^&.,e.P+ */ - $"87FE D348 2E5D 0A00 0000 0000 0000 0000" /* H.]......... */ - $"0002 2C86 A73D 4030 2FE4 D32C 2B56 C74C" /* ..,=@0/,+VL */ - $"0869 A5C9 151A 69B9 9390 DA50 4411 8FFF" /* .i..iPD. */ - $"4938 4E36 F9DD 09FB E4A0 C339 2431 ED8B" /* I8N69$1 */ - $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.y} */ - $"2366 FF4F E2A2 F01A C90F 02E3 51CD B477" /* #fO...Qʹw */ - $"2230 690A B47C E28B 463C 2E88 7579 7943" /* "0i´|F<.uyyC */ - $"5055 6D0A EEC5 F3BF 2404 37D8 EFE1 71AC" /* PUm$.7q */ - $"6AFE A3E4 A7EB 28BF BFFE 4373 E5FF 7E4A" /* j(Cs~J */ - $"2D5D 1ED3 6D78 1657 9914 A061 7958 972C" /* -].mx.W.ayX, */ - $"56FB D5B0 1FFD A18B 7A29 0C81 295B DF7C" /* Vհ.z).)[| */ - $"83E3 CD36 0E66 7E2B D8FA 3096 AA44 7F9B" /* 6.f~+0D. */ - $"F0B9 EA48 8CC7 0FFF 7E1C F394 CC5B 6A25" /* H.~.[j% */ - $"FD4C CECC 630B 38B7 D621 F081 73EE 9D40" /* Lc.8!s@ */ - $"7FAD FADD 8111 6492 599E DD2C 3600 FF6C" /* .݁.dY,6.l */ - $"5A8D B0B8 2AE7 668D C5A0 826B FA0D C5B1" /* Z*fŠk.ű */ - $"6873 D749 B533 9627 C2F6 4922 63F7 8944" /* hsI3'I"cD */ - $"15C5 A1F9 8539 A21A 1CEB 1C2D 7D1B 0516" /* .š9...-}... */ - $"FD6C 5D4F 92A3 14D9 126F C5FC 4116 B499" /* l]O..oA. */ - $"D878 D889 9123 D3C8 4637 36E3 8644 6F0B" /* x؉#F76Do. */ - $"D2C6 A599 B793 1367 B548 23BD 8836 11E5" /* ƥ.gH#6. */ - $"C323 7AD5 0534 3D05 A4E6 70B3 0376 2B0C" /* #z.4=.p.v+. */ - $"A964 173B F0BC 2A52 7FE4 2A53 85C2 22B2" /* d.;*R.*S" */ - $"B83F 7185 FB4C 3769 5B3E 4A24 E7E1 D0FD" /* ?qL7i[>J$ */ - $"9B17 8737 FE8B E4C7 9FC1 0E30 D904 D0C5" /* .7ǟ.0. */ - $"D2F5 05E4 3CD6 5FA7 B9AF FB98 755E 0BAF" /* .<_u^. */ - $"E4EE 408D A8BE 5E58 07A6 059D 1B33 37F3" /* @^X...37 */ - $"8D14 871A 7FC6 43ED 6A6F 8F41 9681 095E" /* ...CjoA^ */ - $"EE46 5BA4 1E15 F5F2 3063 E524 A62A 7C7F" /* F[..0c$*|. */ - $"0E38 5D00 A378 8F6D 3861 2088 EDD7 AC24" /* .8].xm8a ׬$ */ - $"D3B6 B052 DE10 357D B65A 1414 4596 8E3D" /* ӶR.5}Z..E= */ - $"97E3 D838 9ACC 3C84 AF82 EA8D 8BD3 0180" /* 8<ꍋ. */ - $"1582 0654 BB61 1047 ACA1 29D3 7CFA 00C8" /* ..Ta.G)|. */ - $"BABC 146B 250C 8D19 8A4E A8B3 50D6 B986" /* .k%..NPֹ */ - $"2AD6 CEFA 02D6 AE11 FF7C B0A2 E6E0 30E9" /* *.֮.|0 */ - $"D904 4C03 3BC1 8B68 5892 30B8 7D69 C2D6" /* .L.;hX0}i */ - $"A9F8 56A2 7417 1E31 186F 09A1 4C11 6DCA" /* Vt..1.oơL.m */ - $"A62E 5FCC F59A CCE8 6A29 B0DF E2BC E8BF" /* ._j) */ - $"92DF 70C1 8B09 21DF 1440 1684 4413 2A60" /* p!.@.D.*` */ - $"E033 6D92 8573 E63C 2746 6F40 D8F0 D0C9" /* 3ms<'Fo@ */ - $"10AF 85A2 CFBF 373B B250 85E4 C1D3 85D2" /* .Ͽ7;PӅ */ - $"E167 1222 DF4A 67D9 B3D6 55B4 B047 8675" /* g."JgٳUGu */ - $"C803 6AE5 E5AE AF92 C4B7 591A A040 98AC" /* .j宯ķY.@ */ - $"4412 45F8 BBC8 6482 F7BD 81B2 98FE 9D0B" /* D.Ed. */ - $"DAB1 2959 952C 9115 3504 9A24 BBA4 A04C" /* ڱ)Y,.5.$L */ - $"4125 5810 54F5 C268 63C2 1DB9 11CF 85BB" /* A%X.Thc..υ */ - $"D941 F5A1 0239 DED3 856D BBE5 7CF3 49C3" /* A.9Ӆm|I */ - $"C9CF 1BD1 A953 F58A F9AF E704 E70E 43B7" /* .ѩS..C */ - $"2B51 BE14 4FF3 262C 914B 90AF F2A9 E060" /* +Q.O&,K` */ - $"6A24 6553 B776 C48D 19AD ECD3 2DD3 8ECF" /* j$eSvč.-ӎ */ - $"9EC7 8A0D 97F4 3C69 6E56 0881 1136 C147" /* NJ..yzSz */ - $"6926 DAD2 72F9 5D4B 1014 8BD5 A4FA 68EA" /* i&r]K..դh */ - $"D9F9 F684 BFD5 F2ED FB9E 4C18 91C3 FF17" /* L.. */ - $"2D17 D99A DE29 FE6E 63A4 C901 8642 9357" /* -.ٚ)nc.BW */ - $"3120 4386 1938 E7D2 572D 0C59 E3C9 7FED" /* 1 C.8W-.Y. */ - $"30FA E54A CEF8 A94C F92D AF19 76EA 3372" /* 0JL-.v3r */ - $"B4E1 E7C5 8239 A4AC A247 4838 55E8 EB9B" /* ł9GH8U */ - $"DE7D 94E9 DBD7 07FB D488 1672 E61D 9E4C" /* }.Ԉ.r.L */ - $"6DF2 97D5 4936 F89A 5CBC D37A 8C2C F7ED" /* mI6\z, */ - $"9755 19F2 0350 AB2E D851 F0B7 78B5 9770" /* U..P.Qxp */ - $"4DF3 4212 9C9C CA3B 403A BA7B D497 9410" /* MB.;@:{ԗ. */ - $"04C6 288B 5058 5DC9 EB79 AB85 622C 9A55" /* .(PX]yb,U */ - $"2DA7 C113 9315 7CAE D84E 6B50 4062 AE94" /* -..|NkP@b */ - $"8F5E 7969 4BA5 56B2 E881 8C02 ED3B 5259" /* ^yiKV职.;RY */ - $"24CE C98A 4348 12B1 314F E3E3 B6A3 4E61" /* $ɊCH.1O㶣Na */ - $"A426 6350 E380 B0B5 DEFF 64CF 72D6 D4B9" /* &cP〰drԹ */ - $"907C 9BE0 7E4D 39F9 2BB7 C3DE D7C3 DCD8" /* |~M9+ */ - $"1F93 775F 0F44 DF0F A717 C3E9 D603 F269" /* .w_.D...i */ - $"FBE1 D36F 87B3 6F87 B280 E8AB DECC AF0D" /* oo̯. */ - $"6C8A C695 8734 87EB A75F 5130 05EC 9BA8" /* lƕ4_Q0.웨 */ - $"78DB 85A2 680C 75A0 EDD1 4AA2 7E1B BAFF" /* xۅh.uJ~. */ - $"5AFC FD6C 3E36 A6D9 923A 2DCE 24BC 35EF" /* Zl>6ْ:-$5 */ - $"27F4 8813 7CC4 0141 3CD9 9568 BFE6 BBB3" /* '.|.A<ٕh滳 */ - $"219B 0442 5227 3796 635D 0DE7 499A A701" /* !.BR'7c].I. */ - $"7F74 FB13 F9DF E737 08AB 0A91 3D9E B77D" /* .t.7.‘=} */ - $"E616 57BB 8BAF 7A0D 1B28 42E6 D653 6BD3" /* .Wz..(BSk */ - $"D7A8 9A2B 0905 6198 8809 E5D0 D0A4 F589" /* ר+.aФ */ - $"3D04 8161 C4CB 7BC9 96E2 9DA4 1C59 C982" /* =.a{ɖ❤.Yɂ */ - $"4705 B1BE 1E05 E391 5E89 43FE 6C67 4342" /* G...^ClgCB */ - $"636F 80C5 6A98 16E6 6B80 27C8 D0D9 B28C" /* coj.k'ٲ */ - $"6FD4 E109 61AB 8FCB D4CB 19ED 2BE7 B510" /* oa.+. */ - $"C0E8 5883 0642 92A1 6094 7E45 5D3F 819A" /* X.B`~E]? */ - $"4B6F AE8E ED0B 4B30 ABB1 2789 5C58 EEFD" /* Ko.K0'\X */ - $"06C9 EF2B 2A12 1731 7581 4428 C72D 2501" /* .+*..1uD(-%. */ - $"2C14 0DA4 2C98 035F FEA8 51A2 0E61 4C50" /* ,..,._Q.aLP */ - $"4A65 60DE FA1C F36C 62D9 A3FA 93A6 4CAC" /* Je`.lb٣L */ - $"C1D0 079D 912F A133 724B 13CC AFF4 1382" /* ./3rK.̯. */ - $"D61F 8AF2 A48B CCA6 5D66 4F61 E6BE 657B" /* .̦]fOae{ */ - $"7F5B 6F20 397A BBC2 3F23 86DF 2355 4A18" /* .[o 9z?##UJ. */ - $"15DB CB3E 201F FF7C 4AC9 C764 B098 CA46" /* .> .|JdF */ - $"C2CF 44C6 42E7 D30A FD05 380F 6BD3 24C1" /* DB.8.k$ */ - $"3998 C5C1 E7D5 0E2C 8D50 7FBB 7A11 6CB7" /* 9.,P.z.l */ - $"B80F 5A84 44BE E746 C43C 6B5D F055 7A3B" /* .ZDF=..' */ - $"F936 55E0 D0CE BF1A 50D8 51CE 6253 0293" /* 6Uο.PQbS. */ - $"1958 3FA2 BF6C 54A5 B158 4236 7F88 7DE4" /* .X?lTXB6.} */ - $"C231 6D0B 62F1 2C6C 1A1D F8AA 0317 C52D" /* 1m.b,l....- */ - $"D9D5 0B61 312B A074 B2B8 1905 FCF9 A102" /* .a1+t... */ - $"6188 616D 74E6 8232 245D 9C8A 4FD8 E2FD" /* aamt2$]O */ - $"0C6C 8F2E 5C82 5724 C542 3AE5 BA0A EE0B" /* .l.\W$B:. */ - $"2A14 BCDE 8005 4446 25B1 CF8A 6744 9F5C" /* *.ހ.DF%ϊgD\ */ - $"9B09 6571 3003 9F52 A42A 7669 CCAA 7A75" /* eq0.R*vi̪zu */ - $"F807 2530 7BA9 1474 F318 5A7B E64A 5DD7" /* .%0{.t.Z{J] */ - $"A6F2 13B0 AFA5 7BF8 46DC CABF 4D80 CC26" /* .{FʿM& */ - $"5838 4016 3C05 4550 C62F 1504 5B79 0816" /* X8@.<.EP/..[y.. */ - $"556C 8524 5DDA E914 92F1 3124 5C5B 3213" /* Ul$].1$\[2. */ - $"7851 D9B8 EE79 46CF 3F06 1EAB 662A FD9E" /* xQٸyF?..f* */ - $"E7D8 2E8C 938F 43FA B1B1 34B0 9207 34EC" /* .C4.4 */ - $"7A09 46BF 201E 311F EEEE 88EF C6C1 C10D" /* zF .1.. */ - $"E238 50C9 7F01 DFF0 2170 EDD1 7471 8C14" /* 8P..!ptq. */ - $"FB17 6678 A8B9 6611 9713 D8BB 8840 427C" /* .fxf..ػ@B| */ - $"8E5E 1608 D5E6 79B6 0BD7 3592 5D97 3864" /* ^..y.5]8d */ - $"71DF 6137 C0E6 2EB0 F71D 466C CFFF 50EF" /* qa7..FlP */ - $"FE99 2E4D 0DBB 537F 32F1 DECB D5D4 39DF" /* .M.S.29 */ - $"4FCC 2FC2 C399 8EB9 FC8B 2806 3FB7 F227" /* O/Ù(.?' */ - $"BA12 A288 9858 9159 B6ED 0DBF 3DCC 8FA1" /* .XY.=̏ */ - $"9CF5 836D 499F B9E7 DB4E 497F D3A4 57BF" /* mINI.ӤW */ - $"9F0A EECE 8E29 127A 82FF 4222 75AC 32D4" /* Ύ).zB"u2 */ - $"6540 8040 4137 9EB4 EFFF 7FEC 9D37 60B4" /* e@@A7.7` */ - $"184A 9567 71E4 F5FE 1C55 BB95 9FD8 BE6D" /* .Jgq.Uؾm */ - $"037F 052C 035B 91D7 903B 6EEC 1642 3D18" /* ...,.[א;n.B=. */ - $"0B05 FEC5 4C0C 9ED3 BFA5 94AF CBB1 E725" /* ..L.ӿ˱% */ - $"DFC3 AF74 2485 D5A2 7F79 1275 C7DD ADE1" /* ït$բ.y.uݭ */ - $"3BD5 AD19 74E6 EE9F 6846 7900 C09D 090B" /* ;խ.thFy.. */ - $"C17C FB0F 2C9F 4DEB B9FE 7152 A47E B1CB" /* |.,MqR~ */ - $"FB0E 7108 21C7 EFAB 8FA3 8AF0 2FDC 17A9" /* .q.!𢡊/. */ - $"2565 5082 BEBF 4DDD 0699 3265 82AE D421" /* %ePM.2e! */ - $"3776 341F C56C ECDA B302 0306 AE5F 37FF" /* 7v4.lڳ..._7 */ - $"7FB7 1192 8D68 5475 EE0B 4D80 6149 DEBB" /* ..hTu.MaI޻ */ - $"F9A7 D7E7 A35D 9515 8000 4F04 C4D6 670C" /* ]..O.g. */ - $"54B7 93BB D264 43E0 E8D4 2D4D D3E2 AEB0" /* TdC-M⮰ */ - $"FBAE F5BD A155 A8F2 07B4 AAA6 CE0A 84CC" /* U.„ */ - $"907F D5C4 9900 8FE2 0E0D F385 55A0 CDFF" /* .ę...U */ - $"7FFE D776 193F A5C4 0334 DD15 7A6A 0890" /* .v.?.4.zj. */ - $"DE98 5707 7799 9A5B D638 31B9 982B 5623" /* ޘW.w[81+V# */ - $"3AFA A84A 20E7 417C F56E 7776 0C54 0765" /* :J A|nwv.T.e */ - $"91DE A19E 3DD2 4D8B F9F9 0D61 6343 0746" /* ޡ=M.acC.F */ - $"7D72 600B 4E15 FC8F 60FA A273 4348 A86E" /* }r`.N.`sCHn */ - $"E11A CD6B 3FFF 7ED1 E486 AAAA A380 045A" /* .k?~䆪.Z */ - $"70E5 3753 4FFF 7FC6 ADBE 8E71 66FF 8165" /* p7SO.ƭqfe */ - $"D782 24E8 7399 0C15 03BF 29B5 5685 FDA1" /* ׂ$s...)V */ - $"5BAD 5751 6D53 799A A7C6 572E 6A37 B46A" /* [WQmSyW.j7j */ - $"B9BF 05BF 3131 F7DB E3B8 8F11 EE2F 13D6" /* .11㸏./. */ - $"7DE9 D552 0B25 FEAF AEFE F0A7 FBE9 487F" /* }R.%H. */ - $"9085 0FFA 23FE A9DB 0494 B0E1 FEFD 1D50" /* .#..P */ - $"15B4 6548 AAA0 0182 C5FF 7D24 05C8 B15E" /* .eH.}$.ȱ^ */ - $"E45F A508 3C68 CA73 3A57 A35E 462D 9213" /* _.^Fl.H.}n. */ - $"05B3 2AD0 EF87 EFB1 6D03 06E4 85AB 36C6" /* .*m..䅫6 */ - $"9BF6 8382 74F2 F321 62DF 269C 8D95 8FBD" /* t!b& */ - $"C4CA 7278 FDBA C51B A4FC C224 BD43 5F76" /* rx.$C_v */ - $"F9D9 0970 5EAA 5F05 FDCB 50DE 35E7 A82E" /* p^_.P5. */ - $"1E7E 584D 33D8 EF90 B221 622F 778E 460D" /* .~XM3!b/wF. */ - $"6DC9 383F CF41 7B89 7414 97EF EFE2 CC75" /* m8?A{t.u */ - $"8895 6AFD C6E8 610E 5E29 7AE1 FAAF 9FD5" /* ja.^)z */ - $"435F 3F61 6F9F AC78 7EAD 62BE 7DF7 7CFD" /* C_?aox~b}| */ - $"D3FD 5BAF 83F5 5B37 CF6D BE7E 9DDF 3F4D" /* [[7m~?M */ - $"80E8 ABDE CCAF 0D6C 8AC6 9587 348A 7A5A" /* ̯.lƕ4zZ */ - $"21F6 5D05 F6A4 1727 AC99 8E36 4607 A805" /* !]..'6F.. */ - $"1CA8 FB12 6979 4216 6FCF DF65 6135 AFF9" /* ..iyB.oea5 */ - $"5A1E 01C1 15A0 4F38 E547 6F65 858D 0788" /* Z...O8Goe. */ - $"49E3 07A2 D476 B767 EC21 FF65 559D 3B3F" /* I.vg!eU;? */ - $"B8A5 C1A8 6496 5183 24E6 93A6 DF2F 52F1" /* dQ$擦/R */ - $"19CA BFD7 1479 8040 2F9C 0DB9 00F0 49C5" /* .ʿ.y@/..I */ - $"3D32 5B0C 9453 8D1F 452F D9E7 75FD CD61" /* =2[.S.E/ua */ - $"44A9 62C3 F0C8 BAF0 6A66 A4D4 AA8B 73B0" /* DbȺjfԪs */ - $"C942 686A 4A1E E3A7 2343 A0ED D595 9AFC" /* BhjJ.#CՕ */ - $"5546 0ACB FD23 6F2E DCEE ABBD 70E7 FA93" /* UF#o.p */ - $"3FFF 7FC5 7D31 FA1C D910 1C70 6CDC 3362" /* ?.}1...pl3b */ - $"B0A1 C6F3 16D1 BE51 73D2 4697 37CA 8197" /* .ѾQsF7ʁ */ - $"A8C6 89C1 FF78 99EB 31B8 5F88 7B08 C557" /* Ɖx1_{.W */ - $"5483 A35C 0713 94D5 D2DF B84C 36CA D9EC" /* T\..߸L6 */ - $"8FC7 A305 814F 8B04 07D2 E391 5E89 43FE" /* ǣ.O..^C */ - $"6C67 4343 91DB DD56 C1D2 FEA6 9F1F 346F" /* lgCCV.4o */ - $"714B 79E1 7AC7 53A1 9934 69F4 E886 5A9C" /* qKyzS4iZ */ - $"6F9A D26F DD48 5F60 A72A 7E20 77F8 1BE8" /* ooH_`*~ w. */ - $"91B9 9018 8124 7694 3664 4202 7B94 1007" /* .$v6dB.{.. */ - $"4234 15FC 04A2 6DE0 DC6B 5EDE 4332 F592" /* B4..mk^C2 */ - $"779A A3BD 8E84 5464 DE08 6BAE AE2F 6EEF" /* wTd.k/n */ - $"CB75 5862 59D8 1362 5D60 79D2 137C 7606" /* uXbY.b]`y.|v. */ - $"F2B1 06DE 8A2F B76A A7D9 84DB 8F52 1107" /* .ފ/jلۏR.. */ - $"A42C 9803 2476 0448 42C9 A9E5 D0F5 9110" /* ,.$v.HBɩ. */ - $"2FAB AAF4 0752 81C9 6064 B8F7 6CEB 438E" /* /.R`dlC */ - $"DC4B 916C 21F0 1C8F 2A6A 1919 9E26 2B36" /* Kl!.*j..&+6 */ - $"3E51 F543 F7C5 2549 66D0 2F14 D18F 42F1" /* >QC%If/.яB */ - $"397B BA52 99ED 853C E07D 629B 92A1 2589" /* 9{R<}b% */ - $"B3A9 B812 DC8D A368 3204 F8AA 7549 AF2B" /* .܍h2.uI+ */ - $"2DE7 529C 1ECB 9747 A4B8 F6EC 8DDC 0AC4" /* -R.˗G */ - $"2C31 F042 C407 3F18 FD32 9280 60E4 60D8" /* ,1B.?.2`` */ - $"77B5 C019 A5FF 6E0D 8E35 A78E C7AA E95B" /* w.n.5Ǫ[ */ - $"D37C D883 5DD2 756B 385A 08BB 7708 AA5E" /* |؃]uk8Z.w.^ */ - $"5B89 0628 F831 7775 3555 A523 BF2F 721A" /* [.(1wu5U#/r. */ - $"099B E6B4 5128 9EA6 41E1 9B8B 18C1 928C" /* ƛQ(Aᛋ. */ - $"72A0 BD1E 84D6 836A C947 0982 284A 9238" /* r.փjGƂ(J8 */ - $"A06F E390 1BD5 BBFD 323F BA86 2091 BAD5" /* o.ջ2? */ - $"351D 16C5 1D44 E8C7 66C7 D469 047D 5548" /* 5...Dfi.}UH */ - $"7049 7B42 B682 DF4C 68DE B5D2 2EDC C105" /* pI{BLh޵.. */ - $"4047 9A7E 0403 F48B 6215 C3ED 8DBA 12E9" /* @G~..b.퍺. */ - $"EEFB B61B 906E F6F6 DDFD D030 CD1C 47FD" /* .n0.G */ - $"7C37 E7C7 DC08 213E 3C33 08E6 74A0 F400" /* |7.!><3.t. */ - $"7CFC 3B85 1A2E 5ACA 573F F24C 7D2C 0E3B" /* |;..ZW?L},.; */ - $"2A6D CEDC 6C9C 6E97 A572 915F A892 3833" /* *mlnr_83 */ - $"A08F 0070 A602 FB49 0EA6 62FC 4237 C568" /* .p.I.bB7h */ - $"E937 1DC1 1FC2 C3F1 AA30 AC4D DDB8 E747" /* 7..0MݸG */ - $"5EE4 FD73 8124 56EB ADBE 6DB3 F27B 80C0" /* ^s$V뭾m{ */ - $"E536 971B 511B C76B AB20 8BA4 4DCD BFCB" /* 6.Q.k MͿ */ - $"4A0C 34DC 3DDC 9BEF 5122 89D0 99D1 9BE7" /* J.4=ܛQ"Йћ */ - $"8840 002A A77A 25E2 9C2C F9BC 78F9 FB0E" /* @.*z%,x. */ - $"0DB7 4F14 B07A 12F6 65D3 ABE1 660D A84A" /* .O.z.eӫf.J */ - $"EFF9 A799 1852 8ED0 9582 B79A D812 1BE6" /* .RЕ.. */ - $"F3D0 D5FA 9C76 5EBD DBFD 42A9 F7B3 885E" /* v^B^ */ - $"4A68 DBE7 9663 FB7F 1AC4 5004 197F 97F0" /* Jhc..P... */ - $"F57B 135D 19ED E0E0 1C84 139C BA3B 2493" /* {.]...;$ */ - $"D997 333D B6A7 9E83 619C FCE9 9875 134D" /* ٗ3=au.M */ - $"4B31 FCB3 5808 B917 C8BB 0B67 4564 488E" /* K1X..Ȼ.gEdH */ - $"3554 8125 C3A4 DB4A 0BB2 E501 244C 1F49" /* 5T%äJ..$L.I */ - $"C6A7 51E4 6C51 A134 3DF4 CE21 2993 FF3B" /* ƧQlQ4=!); */ - $"80F6 AE0B B9F8 D1D5 8853 4531 6806 4F3E" /* .ՈSE1h.O> */ - $"D2B6 5F62 796A 683C D3C9 A22B 6D56 C497" /* Ҷ_byjh<ɢ+mVė */ - $"D854 2E14 C281 0F94 0220 BEE7 3754 D077" /* T.... 7Tw */ - $"EDB0 0F0E 95C1 A40B 55C9 B5AE 4DA8 A8A6" /* ...UɵM */ - $"ADD6 4A11 DE81 B148 70D3 FA4F 795C 9171" /* J.ށHpOy\q */ - $"C72E 7EF2 454C 0336 BE4A EE68 960E 25BA" /* .~EL.6Jh.% */ - $"E686 01F4 6FF5 3C7C 8B33 60D8 24D3 70A1" /* .o<|3`$p */ - $"06C6 E616 29D4 63D6 3334 379F 743E 745D" /* ..)c347t>t] */ - $"4EF5 ECB5 072E 9F62 0750 F7BA 6FDE B6B0" /* N..b.Po޶ */ - $"0BD0 4FCC 8F59 9B13 0C77 0A30 9BAE DF36" /* .ȌY..w06 */ - $"B13D D861 E92A 12C7 EC7A 0946 BF20 1E31" /* =a*.zF .1 */ - $"1FEE EE88 EFC6 C1C1 0DE2 3850 C97F 01DF" /* ..8P.. */ - $"F021 605A D52A 570D 7089 0C1B B3FE 8B4D" /* !`Z*W.p..M */ - $"E441 70AC 5F71 3FCE 527F EBF4 048A A307" /* Ap_q?R... */ - $"CEFD 4EB0 87ED BFE2 A36C 51B9 EAD3 37C6" /* NlQ7 */ - $"E8F0 9A3D 8F78 8747 81D4 33F0 9EEB 5EA0" /* =xG3^ */ - $"6FE0 A580 6B6B C126 1CE3 F1B2 DC9C CFCE" /* oीkk&.ܜ */ - $"42EE 7E91 EF2F 0DDF CFDE 75EB 554D 6941" /* B~/.uUMiA */ - $"07A5 21BE AD52 7CC1 49B5 FE74 AE40 F70F" /* .!R|It@. */ - $"AB3B 0C16 98F5 7742 3DCE 842D 0B2B 2FEB" /* ;..wB=΄-.+/ */ - $"5E90 DEBC 8BA9 81AC 40CC 0030 2853 FE9C" /* ^޼@.0(S */ - $"6FC2 569B 2CD1 6200 2881 802D 7697 8442" /* oV,b.(-vB */ - $"92C8 666B BC90 3252 F4D3 9BD2 AD14 0027" /* fk2Rӛҭ..' */ - $"CE11 F5A4 437B 3F80 B250 AA4C 23B6 AD83" /* .C{?PL# */ - $"277E 5EF0 8132 6331 9325 D1A3 CFB6 6F73" /* '~^2c1%ѣ϶os */ - $"D37D 780F 91CC CD40 6234 2FE2 F097 1681" /* }x.@b4/. */ - $"6097 88BD BFFF 18F5 2CBB FF67 FDBC 2F07" /* `.,g/. */ - $"67FF 7FFF 1946 84C7 A551 03FF 7F52 A7C2" /* g..FǥQ..R */ - $"8AC8 1080 56FF 0C48 1804 A884 A5A2 08FF" /* .V.H... */ - $"7FF5 3220 8043 9005 C25D DE15 02FB 7F2B" /* .2 C.]...+ */ - $"8205 5CA8 40BE EFB1 78F0 2656 2AD4 14FF" /* .\@x&V*. */ - $"7505 20CD 8BE2 8B15 47BB 9E26 105E 15DD" /* u. ͋.G&.^. */ - $"21A7 82AE E19D FE27 5D8B DDAD E13B D5AD" /* !']ݭ;խ */ - $"1974 E6EE 9F68 4679 00C0 9D09 0BC1 7CFB" /* .thFy..| */ - $"0F2C 9F4E 082C 2CB4 569B A7B0 0009 E098" /* .,N.,,V. */ - $"9AB0 9892 B1FF 6957 1D78 2613 4289 24C6" /* iW.x&.B$ */ - $"12BC E2EF C9AE E6D9 784F C157 77AB 3470" /* .ɮxOWw4p */ - $"D8C7 C746 1978 322D D4E9 FA24 B8B2 5054" /* F.x2-$PT */ - $"D643 8270 9090 D6D8 0C24 16E5 1146 421C" /* Cp.$..FB. */ - $"D6A2 40D9 1864 A800 0000 0000 0001 4554" /* ֢@.d.......ET */ - $"031E 793B 33D3 FD4A CE0A 3D8A 9D46 37B0" /* ..y;3J=F7 */ - $"4D2C 6F04 2BFF 071C 023F E153 6688 1815" /* M,o.+...?Sf.. */ - $"BA20 BF61 DDDF 2979 84E3 3348 50F6 E9B8" /* a)y3HP */ - $"634A 8937 FF7F F1AE E84B C95A 771F 4C9C" /* cJ7.KZw.L */ - $"3FFE 0734 7D7F 6E35 4A2E 21E0 E52F FF7E" /* ?.4}.n5J.!/~ */ - $"8532 8513 7869 A6E6 495D 3E58 F349 1EF5" /* 2.xiI]>XI. */ - $"886C 6441 9091 82E8 0C24 1507 0E02 A105" /* ldA.$..... */ - $"95C5 1409 096C 9A37 F758 F13A 5ABF 149E" /* .l7X:Z. */ - $"DA31 52E9 0DA9 0BFF 45EB 20C7 1A1C E54C" /* 1R..E ..L */ - $"29D1 6C8E D1EC 9D59 F945 4303 373F FF7F" /* )lYEC.7?. */ - $"CE95 B027 88F7 AB06 28B9 92E7 D540 BC2B" /* Ε'.(@+ */ - $"7167 8C6C C87E 32B0 C904 7D7D 278E E519" /* qgl~2.}}'. */ - $"707D 2C42 1714 C425 F9D0 DC01 D910 23DB" /* p},B..%..# */ - $"E7F3 391C A4E6 FAE1 C850 5A1F 456A 6690" /* 9.PZ.Ejf */ - $"3F37 F970 3841 73D3 1095 39CF 10A3 40F8" /* ?7p8As.9.@ */ - $"4CCC 4985 E3D5 127F 7CF4 92BC DCE9 2335" /* LI..|#5 */ - $"43FB 7460 8D5C C121 CFF2 1165 1CCE BBB2" /* Ct`\!.e.λ */ - $"5EA8 0279 2C97 E45B A43D 328C 7A6C 5EBC" /* ^.y,[=2zl^ */ - $"61DD BB2C E34E 25E4 1725 3C6B EC12 BFEF" /* aݻ,N%.%^vmNx*8uZ */ - $"CBDD 8421 F74E 9A07 A070 16ED 100C 769A" /* ݄!N.p...v */ - $"6571 1FA0 4D62 8ADC A3F1 0AAA 2253 1A39" /* eq.Mbܣª"S.9 */ - $"0006 DF51 B09A 2267 BA13 3AD9 0120 8520" /* ..Q"g.:. */ - $"7375 BB11 0715 9FFF 7FFF 276F 9A44 4D02" /* su....'oDM. */ - $"9DF2 BE32 729A 8C71 FBC9 4C73 FA4B 1D24" /* 2rqLsK.$ */ - $"4115 B69E 4FFF 7FFF 45B5 7091 9925 CEBD" /* A.O.Ep%ν */ - $"6A4E 1AA3 BFFF 7FFD AA3B 4043 EE5A 76B0" /* jN..;@CZv */ - $"A073 CF17 7A58 3A06 649C B972 3CB8 897B" /* s.zX:.dr<{ */ - $"31E2 637A 05AC 83FA B94C 0F75 7113 FF7B" /* 1cz.L.uq.{ */ - $"E690 225A FB16 A961 626A B7FE 22EF 864B" /* "Z.abj"K */ - $"F464 1D62 4127 02B3 DB08 1C01 3ECE 1326" /* d.bA'....>.& */ - $"CF03 BF05 5771 4992 75FE 29FC 5FFF 60D5" /* ..WqIu)_` */ - $"DCC3 1B1F 40FF 6990 DC69 3E47 D09A 6E6A" /* ..@ii>GКnj */ - $"2866 9BA8 D74C BAAA 204E 05F9 DBFE E679" /* (fL N.y */ - $"E76C 383D 9F92 BB32 1E14 2CA1 CBD5 E93C" /* l8=2..,< */ - $"6C00 DFA2 B04F D650 3F14 60FF 7F73 29C3" /* l.ߢOP?.`.s) */ - $"E20E 5672 C31B 6D72 FDCF 8097 B8B0 1482" /* .Vr.mrπ. */ - $"C37E 4C4A 28FA 6E67 F061 E00C 371B 8655" /* ~LJ(nga.7.U */ - $"BDCB 2942 6AB1 0E31 38D3 6948 0D3F 6FEF" /* )Bj.18iH.?o */ - $"C2AB 669A E502 2490 C158 FC07 05F0 348A" /* «f.$X..4 */ - $"0505 F0B2 E7E3 F934 19DA 2DB9 9686 603E" /* ..4.-`> */ - $"C2C3 4B2F EB95 FB4E 62D2 F085 4364 9DCA" /* K/NbCd */ - $"A6E8 94F8 CC41 2603 5BFC 4E90 C05F 068D" /* A&.[N_. */ - $"414C 618C 8860 58B1 7059 0B4C 39E8 FB58" /* ALa`XpY.L9X */ - $"C413 43C6 BF39 CC12 6E5B F65C F671 DD29" /* .Cƿ9.n[\q) */ - $"8A03 BC15 FF06 2028 49E4 BF04 E6FC D4FD" /* ... (I. */ - $"401A CB9C 5F7F EFE7 8F41 E707 7803 9F1A" /* @.˜_.A.x.. */ - $"715F 951E E63A 9B4C 1404 32AA B5B7 98B0" /* q_.:L..2 */ - $"D5F4 CD69 DD15 9E81 D2FD 09F7 462D AF3E" /* i.F-> */ - $"31DA 85C4 5053 8460 C06C 7018 908C 4821" /* 1څPS`lp.H! */ - $"D8AB AC44 7666 44D1 EA04 8979 3A4A A0FE" /* ثDvfD.y:J */ - $"27D7 B0C3 DBAA 5233 F376 3CA8 4968 DF8A" /* 'װ۪R3vcc. */ - $"D577 8B5D 7957 D24D 7D64 A2B5 1107 4625" /* w]yWM}d..F% */ - $"E1EB 2460 41A2 E878 5967 CEAE AE16 D8D5" /* $`AxYgή. */ - $"F960 B484 0B49 7253 26F2 714E 6A13 03E4" /* `.IrS&qNj.. */ - $"A0C3 3924 31ED 8B79 3D63 5412 C097 F9C3" /* 9$1y=cT. */ - $"79AD A97D EEE5 EF23 66FF 15BD C854 5DFB" /* y}#f.T] */ - $"5921 E05C 6A39 B68E 6444 6D55 3B7D 6DDA" /* Y!\j9dDmU;}m */ - $"9003 8F53 5C49 D978 31CD 41C5 DD62 7DE4" /* .S\Ix1Ab} */ - $"2F24 5932 A14F 9C9C 97B6 2652 5988 7970" /* /$Y2O&RYyp */ - $"F890 8A5C 9614 EBF4 DAC8 15D1 6F3C 07E4" /* \..o<. */ - $"7B8B F763 6803 394F 2291 8D88 EB1B 3136" /* {ch.9O".16 */ - $"10C9 5077 060A 7DB0 A890 CB7B 947F AD8B" /* .Pw.}{. */ - $"0AAF 67FF 5D78 615A E459 013B 6923 5E0E" /* ¯g]xaZY.;i#^. */ - $"900D BA9C DFF2 37D0 0508 B5F3 EA48 FADE" /* .7..H */ - $"D348 3F2F 8E71 E6CD B6BE 8941 8773 0E17" /* H?/qͶAs.. */ - $"E97A B699 5A4F 21C1 0766 538B B29A B8CA" /* zZO!.fS */ - $"FBAE 21FA 76A0 B197 C613 E523 B127 1FE4" /* !v.#'. */ - $"0AA8 798D 688E 8F27 E386 446F 0BD2 C6A5" /* ¨yh'Do.ƥ */ - $"99B7 9313 67B5 4823 BD88 3611 E5A8 8054" /* .gH#6.娀T */ - $"3C15 C120 1B02 5B2A 2195 DD25 F90A 48A6" /* <. ..[*!%H */ - $"BF92 56B9 4639 F2BD AC5F 3350 9699 14A7" /* VF9_3P. */ - $"30A2 4B91 C33D 3175 F806 15AA 4B01 558F" /* 0K=1u..K.U */ - $"400B 8148 DAF5 29FD 0561 1CA8 7239 51F4" /* @.H).a.r9Q */ - $"A169 A92B EE2F 4F3D 2F96 029B 186B 7219" /* i+/O=/..kr. */ - $"C673 0E85 6FAC 9889 C64A 90AE DBAF E8E3" /* s.oJۯ */ - $"6607 DF2A C332 C690 840A 817A ABFF 3302" /* f.*2Ɛz3. */ - $"1464 A65F E1B3 04B0 90C6 51E5 6A2E 7EA2" /* .d_.Qj.~ */ - $"9222 EABA 0632 2F13 B1A3 2337 85B4 E390" /* ".2/.#7 */ - $"766A 98DB BDDD 9813 F7BD 8AEA 1AB2 BEEC" /* vj۽ݘ.. */ - $"BEE3 F4B7 EE35 6BB8 ADE1 E772 AEB0 7E66" /* 5kr~f */ - $"3F99 05C1 3339 69B2 C1D5 4CC7 DB0B 3C67" /* ?.39iL.v.h._ƍ */ - $"A1BE 16D4 3BF4 91C9 6CF1 DBE0 E0CA 0DAA" /* .;l. */ - $"EFCB 2A06 908B 7BAC CCF3 4CF8 179A 615E" /* *.{L.a^ */ - $"590D AB18 CB49 E032 B8ED 2A8E 584A ACDC" /* Y..I2*XJ */ - $"4797 F732 B8C9 24A4 0E5C 85A0 FED8 E30A" /* G2$.\ */ - $"ECBF 08FB CDC1 E09D 9556 837A E086 95AC" /* .Vz */ - $"BA2C E411 756E F132 9CE6 EDC4 6C90 B09E" /* ,.un2l */ - $"3C59 DE78 44D0 E445 BCA0 3AE0 05D9 7440" /* Gi */ - $"289C 5523 9792 EFAC 19A6 A945 B504 9446" /* (U#.E.F */ - $"A4DF BAA6 B5EB BAEF 7B92 3E08 6D17 870F" /* ߺ{>.m.. */ - $"9E0A 487E 8A60 90B5 E555 CD4F D2F1 FE67" /* H~`UOg */ - $"88DE BB6A E653 A2B6 F9C7 B226 2544 A167" /* ޻jSDz&%Dg */ - $"5DF7 5F35 F38B DB99 30F8 C210 AF41 C7A4" /* ]_5ۙ0.AǤ */ - $"167B 30B4 8B8D 0821 4ADB EFC6 5728 A86D" /* .{0.!JW(m */ - $"99A8 2A1D 51E2 4CE5 AEA5 7ECC 23CB 628B" /* *.QL宥~#b */ - $"E438 F41A A280 CF2E 8E51 5004 A9BA 64AB" /* 8..QP.d */ - $"B0AA 608C 8C19 38F7 567B 0C45 B7C5 0E2D" /* `.8V{.E.- */ - $"0F3D A192 B0F5 A567 4EE1 9FF5 F085 979A" /* .=gN */ - $"13DA 6FC3 89D0 0370 C986 5F44 AADD CAB9" /* .oÉ.pɆ_Dʹ */ - $"FBD0 8CDE 18D9 8FED 715E 264F 0D69 2CEF" /* Ќ.ُq^&O.i, */ - $"63F0 7A64 D65B 094A 6976 E6D4 E3DC 1583" /* czd[Jiv. */ - $"FE8C BD22 992E 3FDB AF18 03A7 0A74 8333" /* ".?ۯ..t3 */ - $"76E3 5195 C7FA A180 5123 7E0C 544B 9C8C" /* vQQ#~.TK */ - $"928D 3DF6 F330 4D6E 8049 11AF 064E 4E3B" /* =0MnI..NN; */ - $"B937 EE03 A4D2 F530 4513 47F0 5E98 E060" /* 7.0E.G^` */ - $"72C6 46EC B761 FAB4 B0FA 9A80 FF78 5408" /* rFaxT. */ - $"9152 452E 0111 2383 5E5F 6C4F FC53 0EDE" /* RE...#^_lOS. */ - $"1092 66D3 5F38 1AC8 1412 561A 4017 9110" /* .f_8...V.@.. */ - $"CA19 3E6F 8803 0908 5F57 A2E2 4744 E3C4" /* .>o.._WGD */ - $"F1BF 49F6 836F E294 610B 4098 2761 1502" /* Ioa.@'a.. */ - $"CCB2 0C11 81DD 05B4 ACD8 8F28 C5DD 1DD8" /* ̲...؏(. */ - $"58E0 C1E1 70A8 42BF 456F FE20 1261 1F81" /* XpBEo .a. */ - $"08AC FEB1 F89C 3576 EF94 A20C 255F 3B3F" /* .5v.%_;? */ - $"5E6B B0C0 4B3F EADC 8536 55E9 8144 C946" /* ^kK?܅6UDF */ - $"7613 8662 DCB1 C761 2BDA 412D C7D6 2D5C" /* v.bܱa+A--\ */ - $"BCC0 F84E 54E4 9B0B BDF7 4F45 FCA6 D6AE" /* NT.OE֮ */ - $"1754 31D1 E6CB 94F4 D163 2B1D 017D 4171" /* .T1˔c+..}Aq */ - $"ABE0 0285 395D 3D23 42D7 E641 348A 0C2E" /* .9]=#BA4.. */ - $"9C16 42C9 8E99 B654 8046 C365 EA71 CE64" /* .BɎTFeqd */ - $"B762 0E4D 7C48 617B CDB9 6264 2C81 4A9F" /* b.M|Ha{͹bd,J */ - $"8600 50B2 B985 EB73 DB96 82EA FF7D 1E50" /* .Psۖ}.P */ - $"6A49 AEA3 78E3 2DFD 0D59 3013 F257 AAA9" /* jIx-.Y0.W */ - $"0E5D 81DA E983 8D48 41BE DF0B FB34 AEA5" /* .]郍HA.4 */ - $"07B6 B0AA 1E53 1D9F B9C7 4CE5 8D46 6151" /* ..S.LFaQ */ - $"8000 0C24 1D66 1946 1073 4456 2361 E486" /* ..$.f.F.sDV#a */ - $"120F 29F0 6121 2D6A AF51 0C82 F68C B571" /* ..)a!-jQ.q */ - $"77AD BE59 9145 D105 DE8C 9500 0000 0000" /* wYE.ތ..... */ - $"0000 0032 BC9A BD52 00B4 6C6F 3753 1A96" /* ...2R.lo7S. */ - $"9B00 FCD3 F055 A11A AFB1 FB95 1610 88D0" /* .U... */ - $"8D32 9653 FC10 55FD B965 C1A9 B6BD 2245" /* 2S.Ue"E */ - $"D48B 8230 2EF5 56F1 6618 9F91 FEC4 4106" /* ԋ0.Vf.A. */ - $"F23B 7C8A 0320 79EA D7A0 D75F 09BD B985" /* ;|. yנ_ƽ */ - $"C22B E2F0 0508 64BA AA2F 2414 19D7 311D" /* +..d/$..1. */ - $"F709 E05C 809B 9E62 83F8 FF13 2DE3 01D6" /* \b.-. */ - $"8ADC F118 5A80 77C8 DABC 2FB5 CEF6 FCFB" /* .Zwڼ/ */ - $"7A94 2773 6CEC FAE2 7865 753C E612 E4AF" /* z'slxeu<. */ - $"657C 5C67 8FB3 1E56 A319 1ED1 FE48 0D8D" /* e|\g.V..H. */ - $"2431 B10B 8E15 0A4B FF7F 7EB8 D068 5015" /* $1..K.~hP. */ - $"151E C37C 0390 F6CC 64A8 0000 0000 0000" /* ..|.d...... */ - $"0000 0002 5991 79E8 2B17 082C ABCB DA90" /* ....Yy+..,ڐ */ - $"CE92 8CB0 E992 0710 2B8F CAAB D217 C4E9" /* Β..+ʫ. */ - $"E55E 11D2 6200 B530 5EF4 6932 1CBF EA6C" /* ^.b.0^i2.l */ - $"E58D 2AA9 68C2 89FF 7903 A6ED D674 F1FC" /* *h‰y.t */ - $"A256 3564 F7E0 4DDF CDA1 2729 F7FF 6EB2" /* V5dM͡')n */ - $"9D35 70A9 5447 924B B8E1 71D3 4A8A DECB" /* 5pTGKqJ */ - $"93E1 8FA0 140E C9B7 6124 8020 D660 3D22" /* Ꮰ..ɷa$ `=" */ - $"C708 222E 7289 B890 0002 00E1 2BC6 84B9" /* .".r...+Ƅ */ - $"25DF 442F 97FF 7FEF 68EC 7325 B92C A150" /* %D/.hs%,P */ - $"EE19 48C3 2540 0000 0000 0000 0000 0749" /* .H%@.........I */ - $"DD4A 9891 375B B0E0 C176 A698 672E F295" /* J7[vg. */ - $"0311 7B3E 2B87 B4B8 7FB3 5DF7 9C67 CBEA" /* ..{>+.]g */ - $"6A19 4107 C9F4 2B19 6829 179A 3FFF 7E8C" /* j.A.+.h).?~ */ - $"44A2 15E8 8E37 B422 F825 1862 58FF 7FFE" /* D.7"%.bX. */ - $"8EA1 D38C 727A 3071 1FF0 541F 6AB4 EA83" /* ӌrz0q.T.j */ - $"44A0 086A BAD7 6966 FC5D 0E72 A66C C301" /* D.jif].rl. */ - $"3E1F B82C 9192 20D5 0322 858F 224C 87F5" /* >., .""L */ - $"E940 85ED 7B36 EC96 D05C 21FF 7B10 59E1" /* @{6\!{.Y */ - $"E125 6C79 7852 2031 F3BA 34FB 6E57 BC3B" /* %lyxR 14nW; */ - $"69F0 C303 3A2A A573 D1E0 9836 C703 D02C" /* i.:*s6., */ - $"58CC 3DA7 FF0D 4301 F607 07C1 31FA 7F66" /* X=.C...1.f */ - $"89BD A759 90CD 107A E5BD 6398 D7BE F7BB" /* Y.zc׾ */ - $"E273 D09A F8EE D21B 1015 A513 18F5 5C7D" /* sК.....\} */ - $"FD20 E7C9 C6BE 3105 7A4B 831D 251B 4C36" /* ƾ1.zK.%.L6 */ - $"2A49 3EAC 1A86 9F87 09CC 0B00 2CF4 643C" /* *I>...,d< */ - $"7012 8574 D28F 952D E959 1093 FE7E F021" /* p.tҏ-Y.~! */ - $"028C 74ED 0E90 8DCD 5F06 B4BE EA1A 4C53" /* .t._..LS */ - $"A47F 3706 93CB 8FAB 7864 D123 4A39 B6BA" /* .7.ˏxd#J9 */ - $"CDCB 8AA9 2128 54FA CFB5 C4E1 F470 AD6E" /* ˊ!(Tϵpn */ - $"6A05 07C9 72AA 562E F22F C922 BCF9 7DDF" /* j..rV./"} */ - $"3565 1AD4 F707 7DC0 1038 129E 4EA0 297E" /* 5e..}.8.N)~ */ - $"1037 3516 64BB FF75 539A 5C03 F7A3 C14D" /* .75.duS\.M */ - $"C617 50C8 14F1 7C95 0372 1443 C3F0 7ED4" /* .P.|.r.C~ */ - $"EFDA FA88 BDD2 E947 7A43 A4A3 2339 CD58" /* GzC#9X */ - $"526C 8407 8211 1949 6431 DB89 390B EB27" /* Rl...Id1ۉ9.' */ - $"9975 F04F D507 AC80 5D51 95B0 992A 1AC6" /* uO.]Q*. */ - $"8699 86CC E64E 441C 2EFD 4F8C 70C1 DB2A" /* ND..Op* */ - $"5395 8DF7 E279 AA65 BA32 2FD1 48C9 F400" /* Sye2/H. */ - $"D0EA 663D 92FF 053E 130C A1A9 491B E583" /* f=.>..I. */ - $"6133 2EE1 AFBE 86B8 D218 B698 906D A5B9" /* a3.᯾.m */ - $"ACD3 9DC7 8720 C668 E134 1A1C 9C71 EA49" /* ӝLJ h4..qI */ - $"7AE9 9276 56E9 78BB 5679 18E2 6044 2763" /* zvVxVy.`D'c */ - $"2342 64F4 3952 2712 F704 B2E8 C1D2 35CC" /* #Bd9R'..5 */ - $"F0AB 5ABD 61A0 1CD5 5316 0E78 22E6 B807" /* Za.S..x". */ - $"8774 CA36 91EF 0BFF D969 6330 3900 00D1" /* t6.ic09.. */ - $"2300 0000 0C6A 5020 200D 0A87 0A00 0000" /* #....jP .‡... */ - $"1466 7479 706A 7032 2000 0000 006A 7032" /* .ftypjp2 ....jp2 */ - $"2000 0000 4F6A 7032 6800 0000 1669 6864" /* ...Ojp2h....ihd */ - $"7200 0002 0000 0002 0000 0407 0701 0000" /* r............... */ - $"0000 0F63 6F6C 7201 0000 0000 0010 0000" /* ...colr......... */ - $"0022 6364 6566 0004 0000 0000 0001 0003" /* ."cdef.......... */ - $"0001 0000 0001 0000 0002 0002 0000 0003" /* ................ */ - $"0000 0000 6A70 3263 FF4F FF51 0032 0000" /* ....jp2cOQ.2.. */ - $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */ - $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */ - $"0004 0701 0107 0101 0701 0107 0101 FF52" /* ..............R */ - $"000C 0000 0001 0105 0404 0001 FF5C 0013" /* ............\.. */ - $"2050 5858 6058 5860 5858 6058 5858 5050" /* PXX`XX`XX`XXXPP */ - $"58FF 6400 1100 014B 616B 6164 752D 7635" /* Xd....Kakadu-v5 */ - $"2E32 2E31 FF90 000A 0000 0000 D036 0001" /* .2.1.....6.. */ - $"FF93 CFC2 DC03 54F9 36EC A8DC 2A8C 3701" /* .T6*7. */ - $"118B 95C3 F2B2 5A7A 0428 C30A 2C64 B704" /* .Zz.(,d. */ - $"5C3C 6DED 8696 4890 6404 5638 430C 59C5" /* \VFK)D. */ - $"CB0C F4C7 E144 47E1 47C1 F6BD 8089 21DB" /* .DGG! */ - $"8279 4533 01BF B9CC C444 AD53 5F75 D706" /* yE3.DS_u. */ - $"3FDD CA27 5D6C 9F54 1CCF F838 38E4 B2E4" /* ?']lT.88 */ - $"F9FF 429F 59FE D27B 4A5E A69F 2C21 38F6" /* BY{J^,!8 */ - $"5A74 D405 2FEE 50B8 E5F1 C489 2693 5B33" /* Zt./Pĉ&[3 */ - $"D2C2 9DEC 68ED F55C 1FAC 1401 8D66 795A" /* h\...fyZ */ - $"F5F3 27A3 5874 6681 9AC6 F41D A4E6 40DA" /* 'Xtf.@ */ - $"3EE5 CCEE 340C AF72 87FD 6B2A EB94 88EC" /* >4.rk*딈 */ - $"A61D A536 7AC2 C6B8 85D9 CEBD 146C 83B5" /* .6zƸν.l */ - $"F5E0 A3C7 B524 BC64 B6B5 91A6 BF91 C547" /* ǵ$dG */ - $"BD87 811F D58E 8E51 BB89 FA6C 5257 33D9" /* .ՎQlRW3 */ - $"A964 A4AB 3BB9 9608 BECC 0D9C D6B9 3D3A" /* d;..ֹ=: */ - $"CB64 28BE 3B07 6318 DF9D C134 9F16 567A" /* d(;.c.ߝ4.Vz */ - $"8127 5FFD F396 BA0C B86F AA17 2301 022A" /* '_.o.#..* */ - $"3742 CE95 B1AF F858 C503 8156 35E0 8F2C" /* 7BΕX.V5, */ - $"67D7 2D41 1F0B 5284 1535 AF16 6540 FB65" /* g-A..R.5.e@e */ - $"65BC 5F6B 136D 73A5 1C5D 3D92 FF5F 8494" /* e_k.ms.]=_ */ - $"FDBF E0C5 821F 072A 0EEB B855 6B42 CEE8" /* ł..*.UkB */ - $"ABEE 381E 894E DF1E 29DD 4B78 3F0A F5EB" /* 8.N.)Kx? */ - $"B9F8 61B8 8266 3BD8 A2AC 5BC1 38F4 5098" /* af;آ[8P */ - $"3951 2437 1798 7BF9 EA00 12BF CF3E 9166" /* 9Q$7.{..>f */ - $"8253 6FF0 B942 70D7 C729 0866 33F7 3484" /* SoBp).f34 */ - $"ADF8 C3D2 4EF6 1DF4 0E6F 8E64 B470 1D5E" /* N..odp.^ */ - $"F311 9BD1 EDE1 BA5D 7601 2053 D70A FDCD" /* .]v. S */ - $"82C0 1BDA A35C FAD2 67AD E569 7851 10A7" /* .ڣ\gixQ. */ - $"EF9A 3533 EC03 E813 08B6 D984 1A1D 3DC0" /* 53...ل..= */ - $"7C8E E03E 4A44 03E4 7894 FF1F 080E 2BFD" /* |>JD.x...+ */ - $"EEB4 E64A C757 389B 5780 3AF8 248C 580D" /* JW8W:$X. */ - $"461B D417 66BA CEB2 2042 3C84 DAF9 C127" /* F..fβ B<' */ - $"63E9 168C A9E3 D418 61E8 C46C CF01 F59B" /* c..al. */ - $"4518 8833 3E62 5B14 BFD1 41A8 45D6 D311" /* E.3>b[.AE. */ - $"8431 80DB 1FD5 5839 DE81 BCD9 EAFB EE26" /* 1.X9ށ& */ - $"33DD 9E73 0B6F F957 26EE E7BA E0DA FF22" /* 3ݞs.oW&" */ - $"EA50 24BF A182 089D 749A 6AAF BFF2 224D" /* P$.tj"M */ - $"30D4 11D0 E07A A012 587A 0633 92B4 CBFC" /* 0.z.Xz.3 */ - $"8E1B E5AC 9025 A74D 2819 3F9D 8132 B795" /* .嬐%M(.?2 */ - $"458E 4651 1589 158D D24C A5B0 CBFA 359E" /* EFQ..L5 */ - $"BDB0 E4FB BFE3 5854 3E88 A646 71B1 9CB2" /* XT>Fq */ - $"BB4E BA8E E170 8CBF C1F5 3141 F537 C0FA" /* Np1A7 */ - $"9780 6448 BA3B 94D6 3E8B 7AF0 0B5A C7A2" /* dH;>z.ZǢ */ - $"4D05 C6BB 7F47 7102 F66E E4E8 3681 1C97" /* M.ƻ.Gq.n6. */ - $"0996 4491 F713 2A24 3756 2715 4B55 762F" /* ƖD.*$7V'.KUv/ */ - $"78CB 2608 0563 73F7 5626 9F35 0C54 6822" /* x&..csV&5.Th" */ - $"F061 792A 4AFC 163A 9F83 8F82 638B 524D" /* ay*J.:cRM */ - $"C21C 3735 DB76 6F4B 01F2 3E7E 5755 5945" /* .75voK.>~WUYE */ - $"6149 AAEE 1A88 7748 DC47 79E4 0660 318C" /* aI.wHGy.`1 */ - $"AA94 E92D 9879 C9C1 AC17 C828 7BBB 997A" /* -y.({z */ - $"315E 858F F31D 3522 A6D2 B3BD E548 DBA2" /* 1^.5"ҳHۢ */ - $"3274 749B 11C1 9570 D715 0350 4CC4 6820" /* 2tt.p..PLh */ - $"560A 8542 A38D 913B 3863 FF5C 97F2 9BA5" /* V…B;8c\ */ - $"893F 6C9B 15A2 EE40 BCD6 2676 80A9 AC89" /* ?l.@&v */ - $"9054 849D 859C 8DCD 181B 64F4 6D7B 71B4" /* T..dm{q */ - $"FBD3 0C84 21D4 CC6C CF84 F40A A3CD C958" /* .!lτ£X */ - $"928E 97E5 346C 6497 2888 7903 5B0B 3277" /* 4ld(y.[.2w */ - $"B4D6 9AA4 86C3 C691 CA1A 3C92 FCFB 02DE" /* ֚Ƒ.<. */ - $"A25E 5C5C C6A8 1CE2 F5B5 88AB 3673 F912" /* ^\\ƨ.6s. */ - $"96AF E6BC 67FF 40CC 068D C6E3 8435 48AF" /* g@.5H */ - $"B929 F509 0F59 3410 A9A6 1087 8352 11EC" /* ).Y4..R. */ - $"23CF CD2E 3F05 487E 0740 9BE7 236F 56FB" /* #.?.H~.@#oV */ - $"D0F4 677F 9514 C6E9 50BB A61A 6135 73FB" /* g..P.a5s */ - $"37AA FA5C 0967 671C 8485 5326 6EB5 4955" /* 7\gg.S&nIU */ - $"1AAE 5FCE C271 D992 9E8C B0DF 7795 E0F2" /* ._qْw */ - $"A17A B50F E53A FE12 756F D1A1 5CE1 7C9B" /* z.:.uoѡ\| */ - $"D185 2C1A 9224 BC62 5C98 FA35 1649 6EA7" /* х,.$b\5.In */ - $"4C7C C191 DF92 9D7A 6FE9 71D9 9A11 5A19" /* L|ߒzoqٚ.Z. */ - $"214D F951 38FA C459 E39A 6DAE 1253 31DF" /* !MQ8Ym.S1 */ - $"B335 3337 39D2 7591 BFC1 31E6 887A 8BAB" /* 5379u1z */ - $"ECCD 7A58 8E4A AD65 A7E1 5FC6 8EB0 DA82" /* zXJe_Ǝڂ */ - $"0F81 6849 5CE5 AB32 B763 1227 3F4C 5691" /* .hI\2c.'?LV */ - $"43C7 DD24 E8D9 C4F3 7BB0 4666 7A24 1C5B" /* C${Ffz$.[ */ - $"F57D 719F 2BDB 3794 66BA BBB6 9D8D A662" /* }q+7fb */ - $"CF99 4DDC E533 96D6 EEE0 3FC7 BFB8 B1B7" /* ϙM3?ǿ */ - $"9AE3 57C7 E1A8 B1F8 6C5C 3F0D 19C1 812D" /* Wᨱl\?..- */ - $"8D31 C88B C396 B5E7 3CE0 4E2C AE73 7876" /* 1ȋÖe3~ */ - $"7BE9 0CA7 8B28 9ADA AF4F 45A5 99BD E21D" /* {.(گOE. */ - $"D4B1 BB33 2508 C8D1 31E5 E9FB F917 A8E1" /* Ա3%.1. */ - $"2955 9008 F531 9010 575A 3AFB 59F4 CD63" /* )U.1.WZ:Yc */ - $"3EEE 2409 BCD4 E5F1 1418 6155 B6D7 A94B" /* >$Ƽ..aUשK */ - $"1D48 79A8 2F32 0770 476B CE28 023A DC86" /* .Hy/2.pGk(.:܆ */ - $"E008 813B E64A 39F5 58CE 3E75 DAA6 BD7A" /* .;J9X>uڦz */ - $"1528 FF50 0738 C132 5569 3C99 C4BC A20F" /* .(P.82Ui<ļ. */ - $"6DED 9310 6FE1 8BE4 BF4D D0B1 993E 0FD3" /* m.oMб>. */ - $"4938 1302 E4A8 FDA2 A7D2 4615 CD89 1E52" /* I8..F.͉.R */ - $"4160 51F8 BABB FEED 4281 0E0C 31CD 91D7" /* A`QB..1͑ */ - $"C7CF E302 E155 4188 0F06 097F 6906 2EC9" /* .UA...i.. */ - $"BE00 A1FB 0D99 8FB1 3B3D E3D3 70B8 4296" /* ..;=pB */ - $"F199 E066 15B5 920C 38A2 695F F2E8 81E1" /* f..8i_ */ - $"E0EC 34E5 97B3 9580 459F A2D9 E267 B847" /* 4嗳EgG */ - $"E302 3AA0 8631 8C61 5F8E 88DE 2FBB 394B" /* .:1a_/9K */ - $"B9EC 234B 6515 BDF3 BA80 AA30 3D50 2F90" /* #Ke.󺀪0=P/ */ - $"C26A D743 2198 707A 2DC1 9C64 1647 1FA3" /* jC!pz-d.G. */ - $"43A2 B1C7 C95D 1E19 9650 E616 F24B C118" /* C]..P.K. */ - $"FB68 CE23 485E BF50 ACF8 F669 B5A3 92AA" /* h#H^Pi */ - $"5625 BF48 8584 A6E7 DAC0 E203 2AF0 89A0" /* V%H.* */ - $"DB92 4924 9249 1BF5 D855 0470 51D0 AAE2" /* ےI$I.U.pQЪ */ - $"A1E5 FBC9 CB80 1798 2EB3 EB1E 9FD4 46E7" /* ˀ...F */ - $"63DB F02E 204B D35F 54DE 0FD3 2F81 FB63" /* c. K_T./c */ - $"9CEC 37F1 C9FF 5B63 B13D BFBD 1169 0415" /* 7[c=.i.. */ - $"0E97 DA89 25E3 92C7 01F5 50E6 2181 A536" /* .ډ%.P!6 */ - $"4020 C49B 1977 1BF5 5226 FD7D 668A D76F" /* @ ě.w.R&}fo */ - $"2954 58F1 F44F 2935 F136 18BD C844 05FD" /* )TXO)56.D. */ - $"E325 9012 9E92 6EC3 E822 D06F A958 C54C" /* %.n"oXL */ - $"6A4D 0A98 093C 481D 1424 7964 E810 7A60" /* jM˜ */ - $"C450 03B7 E8DE 17B3 9CE7 02E1 BE72 100B" /* P...r.. */ - $"2EF5 787D 0D12 FC3B 855A 3F97 1850 05EF" /* .x}..;Z?.P. */ - $"A05D 7CC2 405B BA6D 9175 7C99 BE1C 2370" /* ]|@[mu|.#p */ - $"1F57 2085 13F8 B672 728D 1152 8232 1EE4" /* .W .rr.R2. */ - $"A666 BFD0 06A8 6CFF 3D73 D895 5968 A54A" /* f.l=sؕYhJ */ - $"3219 63AB D4CD 8E7D 52F3 D260 CE4D E329" /* 2.c͎}R`M) */ - $"F554 C837 34CC 2866 FA1E 1F34 B209 B8C3" /* T74(f..4Ƹ */ - $"097B 8DBC 8788 F621 2A57 5468 5FD8 852B" /* {!*WTh_؅+ */ - $"08A9 45F3 71A8 A26B F63C 2DB1 750F A833" /* .Eqk<-u.3 */ - $"4767 6D8A B551 FF10 9E54 AD5D EE2E 2207" /* GgmQ.T].". */ - $"44EA 0D21 75D4 779D E96D 49FF 47CE D775" /* D.!uwmIGu */ - $"D7B0 2380 5F1C 4185 EF0B BECB 1A55 9696" /* װ#_.A..U */ - $"81B8 94F2 4F5B 07D8 D5EC 9E2A 049D 5E87" /* O[.*.^ */ - $"2601 FB44 4AD5 C57B A7B0 8088 B723 134E" /* &.DJ{#.N */ - $"0B8A 375E B972 F34F F25A 2B68 3F15 4496" /* .7^rOZ+h?.D */ - $"5734 FE10 D742 67F9 9FFF 639C FAFD 23DB" /* W4.Bgc# */ - $"B90C F402 17F0 81C6 2656 EFD0 E011 C866" /* ...&V.f */ - $"15C8 4927 3415 BEC1 7876 E693 74CB DBEA" /* .I'4.xvt */ - $"7206 2246 23EC DCCA 51CD 72C1 8C41 1B85" /* r."F#QrA. */ - $"AE9B 6FA5 4286 03FB 7000 D94F 5A8B 8A85" /* oB.p.OZ */ - $"2F34 7575 E7AB 08FF 3CBD 328D D95D BDF5" /* /4uu.<2] */ - $"8070 0FAD B573 A91E 5F83 D32D 3337 A5B7" /* p.s._-37 */ - $"C6A7 3048 8D7C 3F01 F6BF 1BAB D684 0585" /* Ƨ0H|?..ք. */ - $"798A A28D 68A6 4993 22BC F35C E3A7 BABE" /* yhI"\㧺 */ - $"0D5B 7E43 2B91 5DA6 6821 0495 4B22 33C0" /* .[~C+]h!.K"3 */ - $"1217 1302 A7EB 1093 C8BD 3622 F0FD 14C3" /* .....Ƚ6". */ - $"EDBA 60FA B4C2 07D5 6D80 C177 9C23 24FE" /* `.mw#$ */ - $"C9E7 77A7 1945 4C1A 8945 129A 2581 498D" /* w.EL.E.%I */ - $"F2BD 5AD6 EF89 4D80 3EC2 DA29 E093 A726" /* ZM>)& */ - $"88F1 0796 E9F0 8F36 D342 7AD3 DEC2 2CCA" /* .6Bz, */ - $"45B9 35A0 DE31 D18B 2954 C38C 4B3A EEA2" /* E51ы)TÌK: */ - $"5CD5 333D 6C59 23C7 17B3 C98C 65EE 8117" /* \3=lY#.Ɍe. */ - $"22A2 574D D223 581B D09B 6473 3F85 6E2A" /* "WM#X.Лds?n* */ - $"81B5 F600 CAB6 1A02 3B24 D726 4344 536F" /* .ʶ..;$&CDSo */ - $"99AB 09C8 96EA B41B 01C9 7AC8 9478 B8AB" /* Ȗ..zȔx */ - $"69E3 1BF1 1100 AFF3 C59C 01FB 8EF9 047D" /* i...Ŝ..} */ - $"21EF 11DE D2CA BEE2 8372 5DDB C39C DE6E" /* !.ʾr]Ün */ - $"B652 35FE FDFB F1E8 2E91 778A 86C3 3117" /* R5.w1. */ - $"87D8 A7D5 7862 68B7 30C1 3B32 D209 0256" /* اxbh0;2.V */ - $"2BF7 DFEF 17C3 FC30 EF1D 9327 7041 FC3C" /* +.0.'pA< */ - $"674F 3069 DAB2 0EA5 BB48 DC2C DC66 F660" /* gO0iڲ.H,f` */ - $"9C9B C7C8 3734 C68B 7D5A 60A1 DF3D D3A8" /* 74Ƌ}Z`=Ө */ - $"E60C D15A 11C7 FB3B F75A 358E A7F7 16CB" /* .Z.;Z5. */ - $"67B5 097E E2A2 DE6C E40A FD52 8F75 43EF" /* g~lRuC */ - $"F5DF 5A51 BBF5 A074 791F F54F 9724 23C3" /* ZQty.O$# */ - $"F5E6 C4A3 E22C 1E06 3B71 A9A2 1C17 0109" /* ģ,..;q... */ - $"1B59 2742 AB03 0497 3E5A AD73 7FD3 DA51" /* .Y'B..>Zs.Q */ - $"9F17 A10E B9CF 7503 3395 8788 9D9D 4A58" /* ..u.3JX */ - $"F9B8 4A61 3DDA 7489 8086 9EAC 4D7D 62DD" /* Ja=tM}b */ - $"BF8B 9462 1CC0 6912 69BE 3BFE FED7 3174" /* b.i.i;1t */ - $"CAA6 A806 FF59 B963 ABEE 508B F428 D15C" /* ʦ.YcP(\ */ - $"82FC BA30 6907 C572 F2BD C0DB E9A2 44AF" /* 0i.rD */ - $"EED6 81F7 C602 F802 0374 CD1D 0F41 5E2E" /* ց...t..A^. */ - $"F54F E7AB C492 54F8 C570 48A6 1603 35D3" /* OĒTpH..5 */ - $"EA1A 6A6D FD79 27E3 F928 4E16 3A2D 43FE" /* .jmy'(N.:-C */ - $"6C3D AFC6 FA1C 578C 7BA9 7343 5B2C 7BB9" /* l=.W{sC[,{ */ - $"0614 915A 24C4 CAC1 A2D3 0EAF EAE8 7257" /* ..Z$.rW */ - $"EA2D 1ED2 3FFE 26A7 3E28 28D0 1AE1 D790" /* -.?&>((.א */ - $"A25D 1C6C BA20 E196 1EEC 9720 92EE 6E62" /* ].l . nb */ - $"E218 5609 944E 9A2E 9228 117A 6065 93FF" /* .VƔN.(.z`e */ - $"2B32 B2C1 7876 E657 E39E 8641 F202 62B4" /* +2xvW㞆A.b */ - $"20C5 99D9 F9E5 7D83 D807 EDB7 9A34 475B" /* ř}.4G[ */ - $"4F45 9AE8 ACD6 3098 A0C2 8D14 CBDB 9A2B" /* OE0.ۚ+ */ - $"0EF7 CB30 8B49 169F 1ECD 6F33 F063 65DA" /* .0I..o3ce */ - $"2A2F F0B0 EE29 91F7 CA11 748C 5E4E A447" /* *.).t^NG */ - $"0F7F 4B32 DB7A 366C 27C4 F178 33B7 5E9B" /* ..K2z6l'x3^ */ - $"BAAF 29CD A3EF 39BB 5FAD AD2B 5DCA 09E8" /* )ͣ9_+] */ - $"DB9A DD07 84DD 870E 2A4C 850B BD04 7F9A" /* ۚ.݇.*L... */ - $"1354 1DAA 0819 F583 1F47 5905 6597 5F07" /* .T....GY.e_. */ - $"7ED6 DFFA BA65 FA6C D01D F65F F833 D479" /* ~el._3y */ - $"BFD3 F3D8 57BB 3718 EBC8 5A2D 732E 464E" /* W7.Z-s.FN */ - $"6B46 9512 778B 8066 D5DA D21A 819D 5384" /* kF.wf.S */ - $"A84C AE56 92E2 2E9A 4D27 8A21 E02D 67FC" /* LV.M'!-g */ - $"EAA4 B3D5 9306 1D06 CC9A 84C8 D6C4 C7E1" /* ꤳՓ...̚ */ - $"4F47 E168 43F0 6EB1 9276 ED11 2C29 F1CB" /* OGhCnv.,) */ - $"90AB 1975 3405 422B 78EC 7776 FA5C 0A2C" /* .u4.B+xwv\, */ - $"F4B1 4F40 32CE D338 8911 EAB4 4CFC 7765" /* O@28.Lwe */ - $"D9ED C10E 114B 0909 1122 6832 A41E 3365" /* ..K."h2.3e */ - $"96EF FC81 A398 2FE8 0464 5D18 0C9F C1AF" /* /.d].. */ - $"8E6F 42CA BDC9 1DC4 770E 1C2E 01BD 62DB" /* oBʽ.w....b */ - $"7798 4167 FC4F B27D D7E6 32CE 7F95 954F" /* wAgO}2.O */ - $"653C 833E B4F1 C6C2 307E 0796 686E 6F5C" /* e<>0~.hno\ */ - $"6EE2 6260 4C0B 5329 36D8 839E 5F08 319C" /* nb`L.S)6؃_.1 */ - $"4CAE 85DE 6B64 F427 1358 C9FF 57B9 AF78" /* Lkd'.XWx */ - $"332B 82A6 0EBF 0F83 7A3C 8004 1402 6A12" /* 3+..z<...j. */ - $"FEE8 1612 2D8A 47FE 5BDE 2714 B393 E32F" /* ..-G['./ */ - $"013E BD7E 14FA 285D BF61 7CDA 3A92 734A" /* .>~.(]a|:sJ */ - $"520E 978D 8736 6AA9 847B 05C9 F28B 3D9A" /* R.6j{.= */ - $"9B2E 721C 9082 3EC1 362C D516 D306 1EB9" /* .r.>6,... */ - $"A95C EC63 3111 4ED2 054A EFF8 F26A 0E36" /* \c1.N.Jj.6 */ - $"7445 26A0 464F CEDC 924D B183 FAEF 28F7" /* tE&FOܒM( */ - $"AF76 2DBA F15C 4F45 4BFD E003 CDC1 A878" /* v-\OEK.x */ - $"6FB4 207C 2A45 1ED9 CE49 2495 F6A9 77E8" /* o |*E.I$w */ - $"E7FF 7FFF 7FFF 7FFF 70EC F373 E872 28BA" /* ...psr( */ - $"A0BB 38E4 AC79 94DA 6562 832A 9A7B EEA8" /* 8yeb*{ */ - $"6B09 FEA7 9249 2005 E7D1 D721 4761 B6DB" /* kI .!Ga */ - $"6DB6 DB6D 98C5 C208 FD98 41AA F430 3EAE" /* mm.A0> */ - $"7118 7229 50B1 07D8 C5CA 010D 4AB4 DE82" /* q.r)P...Jނ */ - $"53D3 E184 6561 DE5F 7236 BBF5 550D 4A83" /* Sea_r6U.J */ - $"555B 5C0F 9C0E F052 0080 F4AC 3912 DD30" /* U[\..R.9.0 */ - $"47C9 B77E C632 15D7 8EB6 CD51 0454 A805" /* Gɷ~2.׎Q.T. */ - $"2DAD F687 6CB7 B37F 2289 759F F7D5 8839" /* -l."uՈ9 */ - $"B3E6 BCA5 AA89 9D9D 599A 5BDD 54B9 7F7D" /* 漥Y[T.} */ - $"2770 11ED 2217 C539 0204 16FF 728A C52A" /* 'p.".9...r* */ - $"2D24 5FC7 E1D7 C47E 1DE8 C3F0 EA38 E730" /* -$_~.80 */ - $"2D9D 0AC5 991A F5DD 38EC 007B A963 8B4D" /* -ř.8.{cM */ - $"51BA A9FC AE25 908A 1B70 9145 EBA2 38C4" /* Q%.pE8 */ - $"168F 70BB 10A5 CAA5 A249 1974 03F3 AB57" /* .p.ʥI.t.W */ - $"3611 30C5 1F14 529F 040A A8EC EBDF F2FF" /* 6.0..R.¨ */ - $"232B 83FE C2D0 59D9 93C2 2A8A F86A 997F" /* #+Yٓ*j. */ - $"3207 03A7 C406 E96C C96F 23F1 1490 95DF" /* 2...lo#. */ - $"4024 67DC 3DE6 E1B1 EB60 1026 8786 531C" /* @$g=`.&S. */ - $"9A51 378D EE86 881F 496C 8854 9459 7799" /* Q7.IlTYw */ - $"11EC 4196 0C22 0F05 3762 D8F4 C348 7299" /* .A."..7bHr */ - $"793E 0718 14D3 D09C C192 80E1 9F7C 5CFA" /* y>...М|\ */ - $"429C 7960 2F8B 9063 C7E1 1447 7F52 D850" /* By`/c.G.RP */ - $"B80A F1D8 BE98 DC3C 9C44 3AB7 3DA7 E08C" /* ؾB>AM */ - $"7544 D5B4 8367 3256 6D8C CB66 6DE7 E99C" /* uDմg2Vmfm */ - $"88E9 FCDC EB55 F67B 20E7 F44D 7616 6B29" /* U{ Mv.k) */ - $"124A C9AB 95C7 E9A8 209D EDA5 499F 2D2F" /* .Jɫ I-/ */ - $"20E5 DE8C 2EEE 92AF 4BD6 484B 7E18 2D81" /* ތ.KHK~.- */ - $"0502 F439 C742 BA21 693B 43C5 60DF 8BA0" /* ..9B!i;C`ߋ */ - $"9EAC 0A98 DFE4 DB4B 0BE1 E526 9B74 5982" /* ˜K.&tY */ - $"1817 EA6B 067A D3E4 8786 883D 26DB D361" /* ..k.z䇆=&a */ - $"C40F 89F4 B31F 2AF3 1369 FDA9 889A 5620" /* ..*.iV */ - $"9AE7 4384 7184 9D7F 6C37 F79B 9422 ADF3" /* Cq.l7" */ - $"2BEA A620 14CF 0267 110E AB20 594B F1DA" /* + ..g.. YK */ - $"9D7F DB53 3723 1A4E 0DEC DF68 3A10 078F" /* .S7#.N.h:.. */ - $"8CA5 471B 4400 0975 92AA A351 8C66 5DDA" /* G.D.uQf] */ - $"0E4E C7B1 286F 2F7C E0EB 24CC 0A8B CAF8" /* .NDZ(o/|$‹ */ - $"4F0F 75E5 CACF 26F5 0FFE 86A8 1E77 5F03" /* O.u&..w_. */ - $"A8B5 A544 F04B A521 B3FA 854A 64FA 70CD" /* DK!Jdp */ - $"526F 97AE 807A 05FC 3F67 2471 61E5 2715" /* Roz.?g$qa'. */ - $"5774 E452 7E4A CDDA 6E48 0DA2 04B3 3A29" /* WtR~JnH..:) */ - $"DE10 8F75 3A3A 559D A881 B948 74F3 AB92" /* .u::UHt */ - $"B154 0F88 A11B A00B 25ED 9A59 B894 618E" /* T...%Ya */ - $"AD45 3D59 9C08 49EA 076C CD63 8F49 B714" /* E=Y.I.lcI. */ - $"32B3 8743 2506 F55A C011 CBEF C94A 8606" /* 2C%.Z.J. */ - $"EDE4 BE7D 2DC9 8830 6C23 91E0 0209 440C" /* }-Ɉ0l#.D. */ - $"9409 1457 6CA0 2201 8FF4 7573 54F8 CCEC" /* .Wl".usT */ - $"D201 4A3A 66A6 B191 4E14 4CB1 08B4 2100" /* .J:fN.L.!. */ - $"BCF2 3A0D 696F 4582 F8B0 3A60 2D09 E9A7" /* :.ioE:`- */ - $"8E83 CF44 A16A 6516 31C1 B51E 2DFE BDAC" /* Dje.1.- */ - $"356B F402 856C BEA0 109C A125 A759 E580" /* 5k.l.%Y */ - $"3501 F500 F252 9533 F180 6E7D 30A8 FD62" /* 5..R3n}0b */ - $"7FD6 B4EB 9120 8504 493A DD87 D79A 0CB1" /* .ִ .I:݇ך. */ - $"B674 7010 830D 8A38 5B44 B11D 3632 3FA5" /* tp..8[D.62? */ - $"CE31 CE9A 1670 AF20 16F6 BDA6 4980 002E" /* 1Κ.p .I.. */ - $"3E9E 8AB0 8B1F 63C5 28C3 7914 2833 137F" /* >.c(y.(3.. */ - $"0915 DD39 7D38 49A3 6054 B5DC 2509 EE11" /* .9}8I`T%. */ - $"D68A 5C2A C75B 5B9F 7A9A FF3A D06F 3331" /* ֊\*[[z:o31 */ - $"29E6 A9F4 8AD5 E0D9 7FB9 84B1 F403 8910" /* )... */ - $"1168 1270 19E2 E385 0353 0FFF 697F 96BE" /* .h.p..S.i. */ - $"EF55 21CA 25A1 CE5E 0CD7 03A9 094F 51FE" /* U!%^..OQ */ - $"5314 E59F 90EB 907A E37A DD9D 182A E41C" /* S.埐zzݝ.*. */ - $"CFFB 7262 0D9E B904 8D95 2DE3 E02B F5CB" /* rb..-+ */ - $"BF61 6012 924E 50D3 2D8D 6C25 FC60 8D19" /* a`.NP-l%`. */ - $"9855 8BF2 5400 0000 04E3 7684 B40E 9EE7" /* UT....v. */ - $"21F8 CB76 250B 7CE0 2605 7C84 7E9F F226" /* !v%.|&.|~& */ - $"6B94 0DB5 02AA 61E7 A9FF 5D9F A9F2 B546" /* k..a]F */ - $"2417 2E4D B238 ADDF 9233 5911 1D61 D35A" /* $..M8ߒ3Y..aZ */ - $"8788 DF34 284A 9664 B91E 7A11 4568 B395" /* 4(Jd.z.Eh */ - $"7C74 C891 2A46 C056 EE92 0459 D81C A41F" /* |tȑ*FV.Y.. */ - $"CA5E 4752 3ADE 89AB 995B 2BF2 D070 41B1" /* ^GR:މ[+pA */ - $"EBFE 65BF FF61 55F5 5460 A4E0 33CF 7F1E" /* eaUT`3.. */ - $"691A 0DA4 9372 4DCD 4A7C FF30 7DA5 4AD0" /* i..rMJ|0}J */ - $"1236 3C90 00C2 4517 FF78 771E DA05 952D" /* .6<.E.xw..- */ - $"1085 D433 FD50 1E6F D583 2585 CBD6 5CFC" /* .3P.oՃ%\ */ - $"9EF2 539B BE7A CCA1 ABF6 5AED 484B FF78" /* Sz̡ZHKx */ - $"D6BD 435E E56E 5510 3047 49DE C511 72CF" /* ֽC^nU.0GI.r */ - $"72A0 B2CE 5E4D E2DA 0AFA FEDE BDFD 3167" /* r^M޽1g */ - $"02FE 3FBE A1B9 7A5F 205B 7D60 1BA3 C975" /* .?z_ [}`.u */ - $"5949 A641 5A3E 5AF2 F237 53BE FCAC 71F1" /* YIAZ>Z7Sq */ - $"E3E3 6AEB 35B9 41BD C4B6 3400 DBA0 4B7F" /* j5AĶ4.۠K. */ - $"FF79 17FD 23F9 918D E532 F6BD F949 B633" /* y.#2I3 */ - $"6A36 7600 17D8 C912 DB72 6F48 869C 0D66" /* j6v...roH.f */ - $"1410 074A 8F5B 629C 5B8B F293 6DB6 DB6D" /* ...J[b[mm */ - $"B6DB 6740 B8F8 BF85 2938 ECDA 6390 6537" /* g@)8ce7 */ - $"5986 A2A6 B52C A20D F057 C41F 660A C203" /* Y,.W.f. */ - $"E5C1 68B0 9D56 DAD8 F20C 665C 5D04 4BA2" /* hV.f\].K */ - $"46FF 7DB5 4880 6121 2EA3 5D2A 82F4 B18A" /* F}Ha!.]* */ - $"50FC 2D12 DEFE 1F4D 01BF 3315 10D3 5D94" /* P-..M.3..] */ - $"11B1 0221 28B8 56D9 4CED 012D D9C9 4005" /* ..!(VL.-@. */ - $"316F E887 29A8 3E83 9E25 FF1F A4C1 5D25" /* 1o)>%.]% */ - $"8893 36E0 73BE DE25 456A 4678 B7C5 AD7A" /* 6s%EjFxŭz */ - $"90C9 3950 942F 1459 C737 31EF 991F 241B" /* 9P/.Y71.$. */ - $"C294 7CFB 9461 B43A 8D37 8A6D BBC8 D7F6" /* ”|a:7m */ - $"A128 281D DF2B EAC5 A154 E6D9 FF53 984D" /* ((.+šTSM */ - $"550E 9C70 3F64 0E0E 0940 0AFC 5CC9 CF43" /* U.p?d..@\C */ - $"7184 3D0F 9FDE 08DF EC31 B86E 0D38 AF71" /* q=..1n.8q */ - $"29F1 A21D 7847 7150 6DCA 9211 C778 F1A4" /* ).xGqPmʒ.x */ - $"26AA B90D 1A39 DB92 4924 9249 2493 36D2" /* &..9ےI$I$6 */ - $"4924 9249 2492 49FE 069C E7B9 CB0D 4E87" /* I$I$I..N */ - $"7D9E 9D29 FC64 8A6F 6185 2BD9 806F 760B" /* })doa+ـov. */ - $"464D 4732 BD90 0E7D CABF 2B6F 2A78 8608" /* FMG2.}ʿ+o*x. */ - $"DEF5 406F D401 3FD4 AE82 058D D6C8 B980" /* @o.?Ԯ.ȹ */ - $"FECA D9B9 E7B6 3982 9FD3 81EA 544B 30BD" /* ٹ9ӁTK0 */ - $"7E56 FD78 66FD 5A41 D0BD 7714 5FAF 2A1E" /* ~VxfZAнw._*. */ - $"8FDA B705 EAAE F6F2 D69C 9812 7194 A56E" /* ڷ.֜.qn */ - $"DB55 BF75 C4E4 BDCD 9FC2 ACAD C428 829F" /* Uu͟¬( */ - $"2409 3BB2 A894 8020 A8E7 FC16 F4FF 4E84" /* $; .N */ - $"C06E 889C 1C74 96AD 5420 F825 1A2B 015C" /* n.tT %.+.\ */ - $"6BC2 31EE 64AB 7A44 15E5 3458 8040 AEEF" /* k1dzD.4X@ */ - $"F6BD 7D58 6478 8344 018F D3C6 2E33 69A4" /* }XdxD..3i */ - $"E5E8 721A 5B2F 777B C0D8 0A05 2CE7 EEC8" /* r.[/w{., */ - $"69EF 417B A960 D320 842E 84DE D442 AB2F" /* iA{` .B/ */ - $"3B31 84FE DCFC A608 2E09 AA42 60F6 DB2E" /* ;1..ƪB`. */ - $"DA5B C95D D10A 77BE AD48 B5FF 0557 A5AC" /* []wH.W */ - $"327B F763 FDA1 32BF 7308 3EFC 0C2B 2D22" /* 2{c2s.>.+-" */ - $"584A F9CA BFB4 78FF 6E67 42CC B491 492B" /* XJʿxngB̴I+ */ - $"17C3 C746 9966 5780 BA6C 2798 472E 1CFF" /* .FfWl'G.. */ - $"6A32 69A0 86E0 44C6 1679 08F9 9928 48D9" /* j2iD.y.(H */ - $"3DA0 CBA0 1E5E 2618 7162 51C9 DEF0 56A0" /* =ˠ.^&.qbQV */ - $"1924 F126 CAAD F248 A1A4 2816 13A7 FE76" /* .$&ʭH(..v */ - $"594E 647C 36C4 C014 CDC7 5C89 DBAB 9854" /* YNd|6.\۫T */ - $"9094 FC96 5FED 7476 AA3C DF0B B47B C123" /* _tv<.{# */ - $"BE6D CD5A BA07 CC19 94FC DC37 B85C 0FD2" /* mZ..7\. */ - $"9FED 62E6 F910 2F49 529E CE10 9738 D296" /* b./IR.8Җ */ - $"A81C 1A0D 0FBF 7CAE DB93 40C0 3BC9 5A0C" /* ....|ۓ@;Z. */ - $"B23D FBD4 3863 C520 03A0 D966 5327 A0A2" /* =8c .fS' */ - $"DD06 B7A1 942B 0A75 CB23 8664 4159 8647" /* .+u#dAYG */ - $"2725 DAF6 693A 58D7 7A7D B34A 393D FE7A" /* '%i:Xz}J9=z */ - $"C105 C374 193C 123C 130E 062C 8AB2 32FD" /* .t.<.<...,2 */ - $"80E0 72E3 6AEA 2078 5D7C D3E5 4E20 D927" /* rj x]|N ' */ - $"157E 9DC5 1A29 2F0F C326 AFE3 3ACF C361" /* .~.)/.&:a */ - $"8C45 D79C EB27 7441 E4C7 8BFD 5832 DB93" /* Eל'tANjX2ۓ */ - $"78F5 B9DB BA4E 329E A262 C467 88DC C540" /* xۺN2bg@ */ - $"78E0 4E55 34F3 806E 2DEA B371 E9B5 D8DF" /* xNU4n-q */ - $"5EDA B5B9 1C48 5A11 ECAB E4F8 67B7 C76E" /* ^ڵ.HZ.gn */ - $"460F 8E6A C7BA B5F8 75F2 9105 1480 FD1A" /* F.jǺu... */ - $"80EB DB48 6115 AA6E 9AEA A07C 57B0 1A7F" /* Ha.n|W.. */ - $"0CBF D5DE 47A7 89BE 4CAE 19FE 7B79 5839" /* .GL.{yX9 */ - $"232D 495E 476C E267 D9D2 5257 F0E6 3EB5" /* #-I^GlgRW> */ - $"F140 AAAF 1E36 BA04 086A EEC5 3232 7958" /* @.6..j22yX */ - $"72E3 FCC3 9488 B44C 0C15 EF6B 811B CF97" /* rÔL..k.ϗ */ - $"0532 2B88 663D 8675 6050 AB94 A435 C0FC" /* .2+f=u`P5 */ - $"9E08 9873 92AF 6859 F7F5 64B0 0BA5 FA68" /* .shYd.h */ - $"3557 0898 9E0D 5795 BF67 2866 5FB6 63C6" /* 5W..Wg(f_c */ - $"4F82 42CE A682 DC8D CB18 D4FE 6252 95D1" /* OBΦ܍.bR */ - $"C85C 6B2C 0FC0 7C9D 5A80 F93B 8900 F93A" /* \k,.|Z;.: */ - $"8EE6 7513 4AFA 1609 3CEE D5EB B420 A1CE" /* u.J.< */ - $"318D 6F67 720A 7F84 4127 C0F2 9193 35CE" /* 1ogr.A'5 */ - $"6D97 9682 5E5D B9FC 5A97 3B71 AB1F 64AA" /* m^]Z;q.d */ - $"3383 1F0E C0E9 26BE E6EB 24CD 499F F2BA" /* 3..&$I */ - $"997D E886 6FF8 C6B5 0607 1259 7715 7539" /* }oƵ...Yw.u9 */ - $"4B57 F7A9 56A7 A04B 031F 0786 6C02 E7BC" /* KWVK...l. */ - $"8256 7F27 A39A B66D 6B95 6C11 CDE4 C580" /* V.'mkl.ŀ */ - $"54DE 7E26 129C EB67 ABC8 455E 6CC3 453E" /* T~&.gE^lE> */ - $"F9A8 3ED5 9B43 4EB8 384E 0F7B 28E0 16FF" /* >՛CN8N.{(. */ - $"1342 18B1 31B6 EAEF 4C40 36F7 0CFF 6AFF" /* .B.1L@6.j */ - $"8059 5D1C 275B 4F7D B392 4DB0 5E5D 4304" /* Y].'[O}M^]C. */ - $"4848 2A3A C93F BAD6 638D 315A 8771 1150" /* HH*:?c1Zq.P */ - $"1D41 B6A7 C9B8 782E 19D8 F8E7 07EB ED20" /* .Aɸx... */ - $"7D4E AFFF 5FD2 4FA0 2B48 B549 6A50 AD81" /* }N_O+HIjP */ - $"F11D 357F 7CB2 4B8B F28B 6C97 2C23 58A3" /* .5.|Kl,#X */ - $"92E8 2BFB 77F2 1ECE 7A2A C437 47E3 A833" /* +w.z*7G3 */ - $"D60C C3CA 168A 85B8 620C 109C 4134 35BF" /* ..b..A45 */ - $"ECCB 3629 944F AD29 444A C4B6 F019 F19B" /* 6)O)DJĶ. */ - $"4189 B1D3 8F28 65B9 85D8 C715 2E1A 267D" /* Aӏ(e...&} */ - $"A7DB 4C90 9829 BC86 E14C 9F44 757D 5436" /* L)LDu}T6 */ - $"9C38 979D 3654 9A63 E572 7864 E513 A083" /* 86Tcrxd. */ - $"C943 97C5 A88B 23A2 4ECC E4F1 AEED F3EC" /* CŨ#N */ - $"C57D F254 B087 7E1F 81B3 59E6 E2A0 E5CB" /* }T~.Y */ - $"B710 EF71 0598 01BF 1400 3814 0759 EDA8" /* .q....8..Y */ - $"386C 3DF0 F1C5 CA93 612F C58D 71BA 6ED6" /* 8l=ʓa/ōqn */ - $"FE35 90B4 9C10 A938 33B6 6987 E407 AE7B" /* 5.83i.{ */ - $"5B1A 8E0E BE53 1C94 D747 9303 2ED9 13FA" /* [..S.G... */ - $"226C F38A 7134 3CF6 1923 B85F A254 0048" /* "lq4<.#_T.H */ - $"A765 B678 FC9C 1E2C E183 FC80 CA83 9572" /* ex.,ʃr */ - $"E573 B224 9894 7316 C931 4A49 C28F 6E33" /* s$s.1JIn3 */ - $"B579 EE14 84BC 61CC 351B 41FB 7095 5F8C" /* y.a5.Ap_ */ - $"1B15 6DAF FF7F F8EA 5A11 5453 6ECA 1C02" /* ..m.Z.TSn.. */ - $"C8A4 F40F AD00 7BC9 EDFD AC3A 28E4 546F" /* Ȥ..{:(To */ - $"1E36 BE45 897E F5D5 BE25 E84B 57C6 9080" /* .6E~վ%KWƐ */ - $"B6C4 79B8 153B 110F D90B 215D 401C 0453" /* y.;...!]@..S */ - $"8243 BF4A CDAE 9270 0658 462F E0C7 82A8" /* CJͮp.XF/ǂ */ - $"E155 C547 D144 EBAD 74EC EAFF 7799 6D50" /* UGDtwmP */ - $"D0F9 6BA4 D8B3 0FBB B75B BC48 D5BA 8EAB" /* kس.[Hպ */ - $"FF7F 3A2A 820F D817 FB8B 7590 ED4A 3D7B" /* .:*..uJ={ */ - $"DAF8 C05F BDCF 1B7C 8862 53A8 95D6 C0DF" /* _.|bS */ - $"4069 36DA 0739 783C C432 1E0C 7DA6 2D70" /* @i6.9x<2..}-p */ - $"B33A C5AD 810A FBBD E9BB B776 6463 9FDC" /* :ŭ黷vdc */ - $"B401 211D 81BA A9FA 8761 ED36 A1EF 439D" /* .!.a6C */ - $"9880 BE88 E045 3068 F59F 7AD7 EFFF 7FFC" /* E0hz. */ - $"5562 1F00 0818 22D6 5002 F762 7A20 0DC0" /* Ub...."P.bz . */ - $"3ADD FF5D 1851 D391 F011 0000 0000 0000" /* :].Qӑ....... */ - $"0000 0000 0138 5715 ED61 F2C5 2C28 30C0" /* .....8W.a,(0 */ - $"F669 9389 6153 3A95 E010 CCA0 2FEF B36F" /* iaS:.̠/o */ - $"9576 F8C0 F17B 27F6 F6FA 412C 70C7 CF14" /* v{'A,p. */ - $"7625 6871 7FE2 16C9 B6E9 5BF1 1A16 E2F0" /* v%hq..ɶ[.. */ - $"945D E51E CCF9 0970 E586 517C 475F 8856" /* ].pQ|G_V */ - $"CA0C 1DD9 E001 D7BC 1876 745C 8077 672D" /* ...׼.vt\wg- */ - $"CECA FF0B 01D1 76FA 32F5 C047 26FB 451F" /* ..v2G&E. */ - $"5261 79B6 5990 79C9 4DF7 5B69 D548 E894" /* RayYyM[iH */ - $"F249 0C84 D3F0 9555 7B99 EA27 FA38 184E" /* I.U{'8.N */ - $"F863 AFA1 CE80 AEBC CB89 DD99 B8E2 0BEC" /* c΀ˉݙ. */ - $"2F74 E534 3FF4 B50A 4B04 02B1 C178 B189" /* /t4?K..x */ - $"D30F 77DC 8A15 8C9E AF87 1DCD D545 AC6B" /* .w܊..Ek */ - $"CAFB 832B E240 6752 8EF2 9BDF 76E8 621D" /* +@gRvb. */ - $"892E 384C 7BF0 4DE8 F910 7689 C3F0 E7E9" /* .8L{M.v */ - $"E401 C781 F341 A84F 6922 E97B FC22 E259" /* .ǁAOi"{"Y */ - $"6B26 9B03 14A7 DFA1 B7BD CBED 9539 5DE3" /* k&..ߡ9] */ - $"2041 2F5F A37A 2F23 00FC 6424 D7F8 902E" /* A/_z/#.d$. */ - $"7261 227B B4EC F4D1 9C18 22C3 8CA5 EFF8" /* ra"{ќ."Ì */ - $"5701 6734 9110 8B4E D9E0 EE8F 7FEA 202F" /* W.g4.N. / */ - $"CFF7 5CC7 6107 0B22 B0BE A87B 32EF 0FA8" /* \a.."{2. */ - $"3D2D 794E 556E 6089 ACBA D46C 17EC A9DC" /* =-yNUn`l. */ - $"0F4E D57D B8C8 EED1 F9D4 F96A 7BEE 3794" /* .N}j{7 */ - $"49DE 3AA7 EE2E 0B25 A47C 966A D90D C792" /* I:..%|j.ǒ */ - $"6304 7C05 C6EB A26D 83B8 3E0C AAF5 AFFE" /* c.|.m>. */ - $"FDC3 F7C4 C0A3 C3ED E8D2 0FAB AC58 1F56" /* .X.V */ - $"FF40 F44B 4289 C6D7 CC17 A019 AD4A C889" /* @KB..Jȉ */ - $"67AD 0673 32A0 B6BA 087E 7279 19C2 025F" /* g.s2.~ry.._ */ - $"DB0E 0E97 02D9 2268 5BCA CDE6 B94E 8D9B" /* ..."h[N */ - $"03EB D786 1698 2D8A 2ECD 432E D615 931F" /* .׆.-.C... */ - $"452B 5D40 0950 5BBE A70F BD95 9F0E 8B95" /* E+]@P[.. */ - $"86B7 47DE 0757 BFE4 9775 3082 9D22 863A" /* G.Wu0": */ - $"E404 B84C 5E88 8424 31DD 689A D234 88E2" /* .L^$1h4 */ - $"971F 9E59 429C 6C7E 3670 8F7C 8F86 A80D" /* .YBl~6p|. */ - $"848E E78B 5331 058E E444 FEC2 269A 7E23" /* S1.D&~# */ - $"608D 0502 E075 F7A4 DACF 515F AA08 31C1" /* `..uQ_.1 */ - $"1275 02C0 F37E F465 ADE9 1918 F1F0 0E4F" /* .u.~e...O */ - $"E5A4 41A5 F655 22D9 946A 7FEC 0720 3D3A" /* AU"ٔj.. =: */ - $"4961 05B2 F02D 51D2 1212 084B B3EA 5DC9" /* Ia.-Q...K] */ - $"F986 5763 A2AC E2AC 1144 5DC3 E6A5 D092" /* Wc.D]В */ - $"3654 3737 A598 21C2 34FF 097C B8B8 5934" /* 6T77!4|Y4 */ - $"C947 05C9 B4BA F52B 99FF 3AFE 6B15 2CAE" /* G.ɴ+:k., */ - $"06CF D962 CCDE D937 D4AE B3D9 7E92 E2AF" /* .b7Ԯ~ */ - $"8F4E 31CE 06E7 0AD8 71DB 4456 7101 E221" /* N1.qDVq.! */ - $"74AC 1159 9EDF 9841 CFA3 E04F DECF 6FD3" /* t.YߘAϣOo */ - $"90CC C22F 63B0 45CC C98B 3125 33C0 CFBA" /* /cEɋ1%3Ϻ */ - $"4CE7 3FAD F2E4 85E7 0C74 35A5 97E9 8672" /* L?.t5r */ - $"9180 E059 EF0F C416 E25F 0E83 095A 36AA" /* Y.._.Z6 */ - $"8E74 F1F7 11A8 49DD C47E 5098 D576 DC41" /* t.I~PvA */ - $"D6FC 7C37 E307 A2DB 997E A046 C114 CF04" /* |7.ۙ~F.. */ - $"FD8E 32D1 2AC6 3A81 C8B6 C680 6E60 7826" /* 2*:ȶƀn`x& */ - $"9A40 9C80 BA1B 4DE8 854B 09D9 33B3 95BE" /* @.MK3 */ - $"7CE5 CCA3 C463 5D1C 1F2B A160 E208 AA0A" /* |̣c]..+`. */ - $"D00F 1933 5FB5 2705 4E9C 3733 0FD0 2AA0" /* ..3_'.N73.* */ - $"D116 F240 05EA 53BB 5A5A 0A4B 3D9E FCB7" /* .@.SZZK= */ - $"FE35 1D0B 1E56 C4AA 9B6C 8CE6 10CA DAA5" /* 5...VĪl.ڥ */ - $"6DF1 6F74 C332 BD93 556E 89F5 A94A 232D" /* mot2UnJ#- */ - $"E9EF C950 666C 7D3E D1BA C98F 4489 3C5D" /* Pfl}>ѺɏD<] */ - $"F7FC 88D4 C90E EE9D 7691 C976 2CFE 6BA0" /* .vv,k */ - $"B53E 5C59 749E FEBC 4AB4 490C A3B6 5187" /* >\YtJI.Q */ - $"4A10 1076 6348 AEC1 054B 0A98 9196 29C3" /* J..vcH.K˜) */ - $"F995 50E4 E003 F099 9495 7ECC 1C78 C536" /* P.𙔕~.x6 */ - $"AA8D 7305 BE7F FF72 99F7 25ED 4C38 0896" /* s..r%L8. */ - $"A1BE F2D4 016E B744 CBB7 9CEE 1C88 5E3D" /* .nD˷.^= */ - $"1B9E E3CB 29D2 AAA7 C3F6 41F4 B6C0 5861" /* .)ҪAXa */ - $"93D3 4773 858E 3470 E670 4F94 E206 FBA3" /* Gs4ppO. */ - $"7050 2A3D 6DC0 004E 32D7 6043 4E5E C44F" /* pP*=m.N2`CN^O */ - $"284A 3214 97B7 19DE 41C4 6204 56CB 1695" /* (J2..Ab.V. */ - $"BAD8 C308 0FFE BEB7 FE14 C6AC CEE8 5022" /* ...ƬP" */ - $"C27A 2CCA 4714 4C52 3975 615D A1C8 62BF" /* z,G.LR9ua]b */ - $"C477 FF7E 2637 3B89 8C43 6E09 285B 2D1A" /* w~&7;Cn([-. */ - $"8E9E 4110 CE7B E30A E21C A140 02C8 D0AD" /* A.{.@.Э */ - $"630B 5488 7CE7 B884 393A 6FDD 5A68 7FB9" /* c.T|縄9:oZh. */ - $"60EC C73B 143E 3F61 3E31 1A3E 8438 7944" /* `;.>?a>1.>8yD */ - $"B652 14AE 63CA 803C 9B67 C6FE 2F5D 4CD0" /* R.cʀ */ - $"18E2 7982 7DDC A444 1306 4546 61B2 A710" /* .y}ܤD..EFa. */ - $"CCED 529C 92CB D547 22F5 0DB0 B10F 8450" /* RG"..P */ - $"E5AC 253A 6937 BFBD D0C6 8AED 14C7 787E" /* %:i7Ɗ.x~ */ - $"21E7 860D 8567 633D A9E6 0466 93A5 6789" /* !.gc=.fg */ - $"D643 2EEE 7542 7B02 086A 83C4 AD3C 785C" /* C.uB{..jĭE.ߎ */ - $"750C 2E52 4F3F 5960 B3B7 3DEB CFE3 4EC3" /* u..RO?Y`=N */ - $"676F D76A F8C3 67EB 383B 042A C000 1CF5" /* gojg8;.*.. */ - $"FB57 51DF 4E0F 9709 4A58 F371 8A53 79CD" /* WQN.JXqSy */ - $"B935 29C8 5953 BBFB B216 24F0 FF5C F1BE" /* 5)YS.$\ */ - $"1649 C9BE 754A CC45 62C3 44A2 3E12 A872" /* .IɾuJEbD>.r */ - $"736B 05DD F77C C7C6 F33D 8224 147E D163" /* sk.|=$.~c */ - $"02B4 0BC6 297A FA75 03A7 BFDD 709A A878" /* ..)zu.px */ - $"734A 7236 791A BFF6 9F21 CC67 268D 160D" /* sJr6y.!g&.. */ - $"A6D0 7988 72CF 6475 146C 81EB 8249 518A" /* yrdu.lIQ */ - $"49B7 0389 FDB6 9CEB DCA2 41ED 085D 4E85" /* I.ܢA.]N */ - $"03E4 3F4E D8CF 25E1 658D 38F6 8F88 A499" /* .?N%e8 */ - $"B64A DD79 FDF2 39FB 5CEC F29B 714A 733B" /* Jy9\qJs; */ - $"76E4 94E5 F567 3A71 28F0 13A6 7A74 CD91" /* vg:q(.zt͑ */ - $"5804 065E D3C7 09B7 ED19 51E5 0913 4436" /* X..^Ʒ.Q.D6 */ - $"9791 BB58 10F3 7183 5DB6 4874 65D2 AAD2" /* X.q]HteҪ */ - $"DBA2 C761 A70F 3EEE 9256 2EF0 945D E52D" /* ۢa.>V.]- */ - $"34CF 10DF B2AF 8E14 A5A4 E24F 0051 F63E" /* 4.߲.O.Q> */ - $"F11C 5DAC 6D8D DEDD A585 96FC A2AB A5FF" /* .]mݥ */ - $"5298 6349 DB41 9276 C1C6 F1E2 9ABF 822B" /* RcIAv⚿+ */ - $"346F 8679 726C 666A 9638 246A EABE 54A9" /* 4oyrlfj8$jT */ - $"49DD F22A BC62 5867 51F2 FDBD B33B 40E0" /* I*bXgQ;@ */ - $"220F 075D 031C EAAE 3CDE 67CF 2269 E26D" /* "..]...OO. */ - $"69FF 1E4A 1925 DDE6 B473 84B5 6F53 75DD" /* i.J.%soSu */ - $"CF71 C4C0 72DC 5403 7E7B 1A9B 6F16 BA87" /* qrT.~{.o. */ - $"A44D D4A2 8029 E15A 8C17 BE55 A30B 87B3" /* MԢ)Z.U. */ - $"DC5B CED9 2E4C A8F3 939B 6F82 8885 9BD5" /* [.Lo */ - $"905B 6EE2 E3C9 D45E DE91 DD46 7EDD 23BB" /* [n^ޑF~# */ - $"6852 2BD3 3D31 2755 2D1B 7431 35EB 6CBD" /* hR+=1'U-.t15l */ - $"638C 9E5D F0EB 9AE0 49BC D327 7536 BCB3" /* c]I'u6 */ - $"65F1 992B E073 9D25 980D A244 7F9E 749F" /* e+s%.D.t */ - $"53BD D08A C5EF 64A2 D672 7A55 9146 5CAD" /* SЊdrzUF\ */ - $"7839 E1B6 7543 4556 146E C347 33E3 2798" /* x9uCEV.nG3' */ - $"4752 6F78 AAA5 AE5E 7B02 CD92 D5F1 FD30" /* GRox^{.͒0 */ - $"F78A 7BFB 03AB CF34 58BF 3810 B8A7 CDAB" /* {.4X8.ͫ */ - $"A573 658E 260A 7C50 000F 00AC D13F 618E" /* se&|P...?a */ - $"A241 9458 3945 9D59 3F9B 13C5 04CC 600E" /* AX9EY?..`. */ - $"FC51 8C8D FBA0 4150 5832 4539 730B 4631" /* QAPX2E9s.F1 */ - $"0598 EE14 817C B560 97C5 B953 64D4 980D" /* ..|`ŹSdԘ. */ - $"C379 6FFF 3E63 6746 7BE8 D3AB 5215 B47F" /* yo>cgF{ӫR.. */ - $"3CAE 42E4 D4BF B7BF 6580 3319 6A71 C2E9" /* e.~. */ - $"B5FC 403A AAA2 25CE 5AC1 B658 1EE9 9A53" /* @:%ZX.S */ - $"4000 51DF 95E8 C605 97AC C7E1 A8B1 F86C" /* @.Qߕ.ᨱl */ - $"7C3F 0BCC E410 8FA7 78C0 7964 BDD0 E341" /* |?..xydA */ - $"5DC5 D977 EF99 460C FC48 A51A B5CD DE47" /* ]wF.H.G */ - $"F9E2 194D 1F2D B2B6 556B 0F68 BD1B 5BEA" /* .M.-Uk.h.[ */ - $"9FDD 1280 92A3 EF96 132C 22F6 CA8A 1C20" /* ..,"ʊ. */ - $"54DA F163 6119 BC02 7AE6 10CA A16B 993A" /* Tca..z.ʡk: */ - $"E22B CC58 D181 40E6 EA99 0897 5166 4C1F" /* +Xс@.QfL. */ - $"6D58 D092 5119 1AF5 0C2B 1DC6 029D F0E8" /* mXВQ...+.. */ - $"1F6F 9F5C 17D8 68A0 F600 5C68 5C16 4269" /* .o\.h.\h\.Bi */ - $"F5A9 4D97 32DE 3A9C 6609 86C2 1D0F BA56" /* M2:fƆ..V */ - $"3C8C 1046 E0DC 2ECB 9BDB D61E 6955 CE38" /* <.F.˛.iU8 */ - $"DB97 859B 9E73 78BF FDEB ED74 0C4E 4203" /* ۗsxt.NB. */ - $"431D 69C4 635D D1EA 1A9A 6462 BE48 DDB9" /* C.ic].dbHݹ */ - $"6E63 C4D8 8886 51CB 19E6 A7C9 5941 8443" /* nc؈Q.YAC */ - $"57E5 8C3B B907 FF17 4B41 08DA 7AFC 1B8B" /* W;..KA.z. */ - $"9B05 622E 1F81 91D8 2C60 9C6A 3B23 608B" /* .b..,`j;#` */ - $"F2EC E527 70F9 D963 D302 D7AC 18E2 2692" /* 'pc.׬.& */ - $"AE0C D915 7E30 5B09 305C 8F5D 1346 3FF2" /* ..~0[0\].F? */ - $"8635 ECEC 1CB7 962D 0846 3FA9 5920 C1B0" /* 5.-.F?Y */ - $"5582 FF3A 24E0 FAAE 8FAE 3843 DFCF B74F" /* U:$8CϷO */ - $"CAEC 5602 D1C5 1760 5ECD 92C8 1DD1 4ABE" /* V..`^͒.J */ - $"2336 8A90 E444 6753 D3E0 0F02 8E99 7393" /* #6DgS..s */ - $"8B26 6C9F BFB4 64DE 7867 73F7 10F0 477A" /* &ldxgs.Gz */ - $"8383 ADA5 49C3 722B 1FD7 0BB5 4118 4714" /* Ir+..A.G. */ - $"D5F9 6C20 CDD0 8151 EAB4 457F FF4E 314C" /* l ЁQE.N1L */ - $"6E7F 04DB DE0C 611B 62AC 2A4E 869C 06FB" /* n...a.b*N. */ - $"DB81 F238 C4FC 149E 8176 3F0C 4B83 0DFF" /* ہ8.v?.K. */ - $"7FB4 A5F5 80C7 E4F0 47AD 8D3F 5426 B12A" /* .G?T&* */ - $"8678 11E1 A0EF 5439 31D8 E97E 3AE9 E4DD" /* x.T91~: */ - $"3DB7 4A94 7FFF 7135 0C02 ACE2 70F5 626B" /* =J.q5..pbk */ - $"271A 4401 DF00 AE70 E43B D3F8 75AD 0DAB" /* '.D..p;u. */ - $"794A C0C7 928F 8621 BE61 DA60 A89F 8E95" /* yJǒ!a` */ - $"64E1 4B82 9CA5 D1CB 26FA 3B49 2FDF 8007" /* dK&;I/߀. */ - $"60B1 1C23 B192 973E 87DD 9323 E697 CA76" /* `.#>ݓ#v */ - $"03D6 B09A 33FA 5CEC 856D 1D12 5249 2492" /* .ְ3\m..RI$ */ - $"4924 9249 2492 4924 9231 8B0A C6C2 C882" /* I$I$I$1Ȃ */ - $"FC66 E59C E646 38B0 B26F A097 FEA2 30FE" /* fF8o0 */ - $"F5B9 90DC 3FEF 3116 73C4 7B20 6C09 EA40" /* ?1.s{ l@ */ - $"AB90 6257 8BAD 951C 002E 138D 7274 121D" /* bW....rt.. */ - $"B91E 66F5 6038 8257 FD9A 18C9 0155 522C" /* .f`8W..UR, */ - $"D6CC 0F6A 6A4A 09F3 0C4A B702 47FF 7FFC" /* .jjJ.J.G. */ - $"B504 0034 6682 CE19 CA7C 50BE F8B0 9DCB" /* ..4f.|P */ - $"0092 4924 9248 F298 B4D2 A612 6CEE 878F" /* .I$HҦ.l */ - $"FF7F FF5F 8F59 B3E0 FE9F A74E 506D C924" /* ._YNPm$ */ - $"9249 2492 4924 9249 2492 4924 924D 57A2" /* I$I$I$I$MW */ - $"2CC8 426C 393A 96E4 50FB 0ACE 8874 7A86" /* ,Bl9:PΈtz */ - $"2B20 84D4 0F34 1532 DFF0 D633 0231 0F65" /* + .4.23.1.e */ - $"91D1 8E19 A917 CD2A 8D35 89BE F64E D1A8" /* ю..*5NѨ */ - $"926C AE06 3A49 80F9 C1FE 0E81 52D8 5A8C" /* l.:I.RZ */ - $"7A00 5EF2 9F04 3659 74EC D695 94B6 5B90" /* z.^.6Yt֕[ */ - $"89C0 E661 DFC4 5E69 965B 4D1D 4B76 7C0E" /* a^i[M.Kv|. */ - $"89D2 C1E8 B1EF CF9E 5E96 3977 AEA6 532B" /* Ϟ^9wS+ */ - $"68B1 BD73 2BE6 BB5B 766E FA91 5C36 628C" /* hs+[vn\6b */ - $"F45F FEEA C7DF 49F0 278F F459 E9B6 BDAC" /* _I'Y鶽 */ - $"1A28 F485 45C5 2761 DC37 C72A 8A17 2D08" /* .(E'a7*.-. */ - $"5130 E9D5 E1BD 2D59 07B5 2290 00F9 F737" /* Q0-Y.".7 */ - $"C1F4 5C78 1058 C4C6 13AB AE5C 45DE ACB4" /* \x.X.\Eެ */ - $"7DC9 03C4 0F82 7850 6F9E 5FD3 9223 36FE" /* }..xPo_Ӓ#6 */ - $"8A1D 1D99 FBB3 646B 206B FC7E 668E 4730" /* ..dk k~fG0 */ - $"7C8C 79D9 A37A 427B 1E91 E7A1 DED2 E57D" /* |y٣zB{.} */ - $"E167 967A 8B9F A6C0 A36F 68E8 D03C 84C6" /* gzoh< */ - $"E952 3CAF 039F 18CD 236C 4AE1 FB74 D7F6" /* R<..#lJt */ - $"DFBF B7A4 AFDB D27E 2FB7 7BBF 86F0 DF6F" /* ߿~/{o */ - $"4F9F C3A7 EC7F 0D0F BEDB 1EFB 77AA FB77" /* Oç....ww */ - $"2CED 1CDE F39E A2F3 567D 91E9 4703 B8A2" /* ,.V}G. */ - $"5006 2494 6271 81F3 3B95 0B89 EDD5 7FE8" /* P.$bq;.. */ - $"B864 3D84 75CD 7478 A5D6 28C8 D483 39EF" /* d=utx(ԃ9 */ - $"86CA 5763 87CA 97CF A9D4 AFA9 0450 6744" /* Wcʗϩԯ.PgD */ - $"16E3 8C0B 0015 88DA 5244 1AB2 9790 35B0" /* ....RD.5 */ - $"0489 B911 D871 2BB4 6576 C185 22B7 1F86" /* ..q+ev". */ - $"230A 3CD3 ECB5 20A6 23BA A068 A53E 8EAD" /* #< #h> */ - $"3793 46B5 BA07 96A8 DF28 6A66 CE05 73CE" /* 7F.(jf.s */ - $"1938 F9A6 9CBC 0D7F F193 E0D5 09CC 3426" /* .8..4& */ - $"4BB1 52B9 F337 0537 FA01 B010 5471 B015" /* KR7.7..Tq. */ - $"754C A1A6 E071 800C 1A26 243D 172B 1497" /* uLq..&$=.+. */ - $"E5DF 1EB1 6A6C 6761 3BA6 52C0 C0B4 69BD" /* .jlga;Ri */ - $"E6B4 275E EB6E 42BF D693 8928 15A4 9DB2" /* '^nB֓(. */ - $"D8FA E273 6C04 CBB5 06A9 8096 5E97 5D11" /* sl.˵.^]. */ - $"0B1B 8E93 BDCC 1AE8 4CBA 9413 A729 F6A7" /* ...L.) */ - $"F24D 467F 0316 BF60 F777 C2E3 7FAA DC07" /* MF...`w.. */ - $"148F 5C26 91C3 20B8 F3A0 9088 F893 6D47" /* .\& 󠐈mG */ - $"7AC1 A0D9 5483 8281 5B98 28AE 9EAB 94F0" /* zT[( */ - $"9B68 08E3 E3DA 7E3A AA84 9EED F083 117F" /* h.~:.. */ - $"FE75 781E E394 EEEC F9AC 21D6 FF5E DD57" /* ux.!^W */ - $"96CF A7DF 3C0D 7E2F F9E7 F212 83EE E629" /* ϧ<.~/.) */ - $"9543 AA61 C10A 4B12 1DD8 6835 405A D739" /* CaK..h5@Z9 */ - $"DBD7 1628 2816 909D 1DEB 81F2 16AF 8953" /* .((...S */ - $"9239 B79D A64A 3275 E506 BFD3 0198 776C" /* 9J2u..wl */ - $"F4C2 39CD 4CF8 2482 D781 526A 7D82 0B83" /* 9L$ׁRj}. */ - $"120C B2AB 1FC0 2DAA 4A72 ACD9 B4C7 926A" /* ...-Jrٴǒj */ - $"CE69 46FA C67E 904D 12D4 D6EC 2F77 AC43" /* iF~M./wC */ - $"0A82 A09A 8FAC 59F0 D192 4F8F E6D1 A8B3" /* ‚YђOѨ */ - $"26FD EAD1 7727 E253 F826 580D 8786 8EAD" /* &w'S&X. */ - $"4561 33FC 6C93 72E4 3F53 3E92 5E78 9597" /* Ea3lr?S>^x */ - $"895F 61B9 D382 514D 839E D4E8 A40B 6F99" /* _aӂQM.o */ - $"0BEC 889F F976 6F24 AEAC 2A18 479B 9CD0" /* .숟vo$*.G */ - $"A58D E4A8 4940 D7A9 26A7 8649 C387 22EB" /* I@ש&IÇ" */ - $"10F3 AB7F 805D 57F4 6918 508A 429D FC32" /* ..]Wi.PB2 */ - $"0E49 3480 E5A6 0267 54A6 D677 422D 1B62" /* .I4.gTwB-.b */ - $"4DFB C3A4 2E01 8C0D 029D D238 87B0 230E" /* Mä....8#. */ - $"AB6E AEFD 64F3 F7AE 7BD7 DA13 2BCC DCFB" /* nd{.+ */ - $"13EC E7EE A36F 86C6 A2D8 DD70 6174 04FA" /* .oƢpat. */ - $"B7F7 A3BF 9C4C F99C C177 9B27 9148 3998" /* Lw'H9 */ - $"013A 4B0C E3A5 6905 6ADC 739C 3586 7009" /* .:K.i.js5p */ - $"38DA 0496 C25E DFB2 F2AB 34C0 F138 4F81" /* 8.^߲48O */ - $"7240 2774 4588 B153 267B DBBE DFDE AEAD" /* r@'tES&{۾ޮ */ - $"1D90 BA71 2B83 D108 1CDB 8B36 7837 8AAA" /* .q+..ۋ6x7 */ - $"299C 2916 D66C CC2E 2FCF B0E3 228A 88C1" /* )).l./ϰ" */ - $"568F 12D8 D599 AB3F 29DE 1FA6 9336 132F" /* V.ՙ?).6./ */ - $"521E 8EB9 9BD4 30E4 362E 349E 209A 6EB6" /* R.06.4 n */ - $"D5CC 985B E51E 8A74 B9A0 1718 2753 A1E0" /* ̘[.t..'S */ - $"BDCC 77CC 5697 641D B916 AB08 C12F 102F" /* wVd..././ */ - $"59A0 4283 27A8 9F9E 1980 381A 4785 E896" /* YB'.8.G */ - $"B9C8 A383 0C1E EBDE A8DC D1A0 00FB 61C2" /* ȣ..ިѠ.a */ - $"70F1 84C8 8368 337E DA6C 7A1A 014F 77C3" /* pȃh3~lz..Ow */ - $"EFFF 0CCC F88E E539 B4FF 3187 54EA 4B2E" /* .91TK. */ - $"27BF 1121 0DCD 456F 5AB4 E115 9E30 8B1C" /* '.!.EoZ.0. */ - $"FCFB 8634 E35F E3F0 2A65 8EC0 775F C0EE" /* 4_*ew_ */ - $"37B2 6C5A AA44 2B7C 889A 5854 FBB4 DC29" /* 7lZD+|XT) */ - $"E875 94AB D4F4 19C2 5989 594D 6B55 CB5E" /* u.YYMkU^ */ - $"012C A350 BF1C 322E 6DC6 6CFB 052A B48D" /* .,P.2.ml.* */ - $"2FFE D908 D443 2FB2 706F 13A8 B2BF 2E97" /* /.C/po.. */ - $"D7EF 6FE2 7D0B 4D6C 89E6 24BB D547 A266" /* o}.Ml$Gf */ - $"3B92 FF58 BE83 0D95 D587 B51D B83A B360" /* ;X.Շ.:` */ - $"DF16 A55F 5D17 5ED7 C7D7 88FD D24B 89C4" /* ._].^׈K */ - $"17FF 1CE0 2FC5 E332 79FF 6532 D599 2C36" /* ../2ye2ՙ,6 */ - $"7360 56F2 6017 1165 F8CD AC09 6435 530F" /* s`V`..eͬd5S. */ - $"8E48 0152 06AE 7F31 9D5A A12E EC4A 26BD" /* H.R..1Z.J& */ - $"1D28 2D81 EBF2 625A 03C8 8240 FAB0 343C" /* .(-bZ.Ȃ@4< */ - $"3460 4650 A369 CBAF D533 EC55 DB4D 46F7" /* 4`FPi˯3UMF */ - $"45C4 1B75 581D CC26 9E29 8B0F C424 5512" /* E.uX.&).$U. */ - $"9417 F11C 77C1 F3FD 57B1 487F D8F8 A086" /* ..wWH. */ - $"E60E 2356 E9E1 F3EC 7F31 52E1 E3DB C75E" /* .#V.1R^ */ - $"7A4B 2D19 8F06 AB86 5A88 F23D C312 C565" /* zK-..Z=.e */ - $"1AF0 4B35 F0D9 D100 6634 A377 90C1 A69A" /* .K5.f4w */ - $"1C64 495A BEF2 5A5C 1714 0504 2639 71A2" /* .dIZZ\....&9q */ - $"5989 FF6E F887 5ADD 9843 A719 60CC 5185" /* YnZݘC.`Q */ - $"B308 2551 F63A 7543 2A92 3949 FCC5 5023" /* .%Q:uC*9IP# */ - $"5A92 FE32 A26E FF00 9CFC 0CFF 4A08 60C7" /* Z2n..J.` */ - $"F76C 480A E682 3C58 66B8 7045 CDBA 616C" /* lH. */ - $"6428 F517 1201 C3F1 1B80 0DD2 DCD9 CA31" /* d(.....1 */ - $"B022 DAFB D990 A8B1 6FF1 004E 4847 E5C8" /* "ِo.NHG */ - $"0580 DA86 704F E2FF 7E83 5167 5C3F ADB2" /* .چpO~Qg\? */ - $"4C44 A9D9 DB84 C360 68ED 1BF0 068E 04BF" /* LDۄ`h... */ - $"D16E B55F 0701 3739 42FA E15C 0EA2 BF81" /* n_..79B\. */ - $"31C1 F1A3 A766 CAB8 C82E C96B 4868 D491" /* 1fʸ.kHhԑ */ - $"5ACB 6EED 4027 0C73 AACA 730C ECA6 DE42" /* Zn@'.ss.B */ - $"38DA E07E CE64 BC49 7FDD FCCB 07B3 45BF" /* 8~dI..E */ - $"B9DC FF13 039F D40E 43BB ACE4 B8F8 31F5" /* ...C1 */ - $"6743 9390 0B87 C9B1 194A 0200 FB53 29CD" /* gC.ɱ.J..S) */ - $"3141 15F5 3C38 9F70 2B7E 0E46 B5A7 5C94" /* 1A.<8p+~.F\ */ - $"AED4 E415 1639 7B49 20DA 1541 9742 A3A6" /* ..9{I .AB */ - $"B873 4C7C 9112 1322 7D7F 5F6E 14AB 57FC" /* sL|.."}._n.W */ - $"A01D 94EC BC05 F45B C4C4 1FC3 D61B F5D3" /* ..[.. */ - $"0E62 9C2F CAE6 C609 B0D2 803B AF5F CC7F" /* .b/ưҀ;_. */ - $"4085 5B49 F81B 0AB3 DB0C 27C1 7A95 45D6" /* @[I.³.'zE */ - $"CDDD 4F06 1A20 A7FE 22F6 EA13 EB6E C723" /* O.. ".n# */ - $"87B9 A058 CAF9 9F59 C9C9 6AAD 8358 5147" /* XYjXQG */ - $"2B3E 2FD8 506F A48B 305C 97C7 5D25 5C75" /* +>/Po0\]%\u */ - $"C5B1 E7B4 CBC7 C76A 2FE5 1669 302C 2318" /* űj/.i0,#. */ - $"CB1D BB38 5B47 3563 F041 0F00 C23A B1E9" /* .8[G5cA..: */ - $"1972 D9C9 2F2F 4013 F8EF A6CA 7E8E 705C" /* .r//@.~p\ */ - $"0CB6 1301 5ED4 25E6 F7D9 999D AB8F 4CAC" /* ...^%ٙL */ - $"6FF2 04C8 8307 016C 6E46 645B 5488 79C0" /* o.ȃ..lnFd[Ty */ - $"C0E5 8A2A 46EB DB4C 65A0 27FC 6230 781C" /* *FLe'b0x. */ - $"EDB8 4666 1604 1937 9603 A2AA D8C3 43A6" /* Ff...7.C */ - $"E254 D745 866F D24A DD91 397E C575 F187" /* TEoJݑ9~u */ - $"193B F5F5 819B 7D57 EC83 0871 ED1B 64F6" /* .;}W.q.d */ - $"E47A E1B0 65F9 67DF 5680 3642 52AA BB4B" /* zegV6BRK */ - $"BA52 D8BA 8AF7 0A96 412A 92B2 045F 9739" /* Rغ–A*._9 */ - $"3A52 D961 6BC6 1D2E D90D 29A7 E9DE 2651" /* :Rak...)&Q */ - $"CE3F 9921 03BC 7A7A CBFD 63E2 4C7C 9025" /* ?!.zzcL|% */ - $"BCC3 D509 745E 9AE4 1675 0242 26EE E4F6" /* t^.u.B& */ - $"B04B CFB3 E37F EADB 2840 E47E 0209 C8C5" /* Kϳ.(@~. */ - $"56FC 6228 BB57 F43A BE32 0753 73FB EAE2" /* Vb(W:2.Ss */ - $"55B4 D581 42C8 10B8 AEA9 67C4 F685 982C" /* UՁB.g, */ - $"3104 095F DCBD 3701 8749 9CBA A7A5 B714" /* 1._ܽ7.I. */ - $"FDED FAA3 F034 54D8 728F 8640 4A61 560C" /* 4Tr@JaV. */ - $"50D4 B224 A5F1 6715 6C8B 7EC6 BF5C 120D" /* PԲ$g.l~ƿ\.. */ - $"8797 B25E B0E1 C57E 69AF 1FF2 99C3 44B5" /* ^~i.D */ - $"0508 0061 1F44 795F 27C0 511E 0796 9740" /* ...a.Dy_'Q..@ */ - $"14FF 4C51 5651 34F3 658D 4CA8 3FBF 43CC" /* .LQVQ4eL?C */ - $"8813 D372 1723 7DB5 6D44 4524 4E91 B644" /* .r.#}mDE$ND */ - $"4B7D CDEC E0E0 8468 622D 87FE 80E3 E097" /* K}hb- */ - $"303D 8894 1FFF 7FA6 9AAB C6E0 0B83 3EDD" /* 0=...> */ - $"86A5 43D3 C650 0008 D364 A800 0000 0000" /* CP..d..... */ - $"0000 07D7 8F92 61B9 E6E0 BCBF CD4A AB76" /* ...׏a༿Jv */ - $"5B6E 246A 8DFB D274 41F9 3583 773D 5165" /* [n$jtA5w=Qe */ - $"2139 B773 476E DF91 33F0 8CDA F420 613F" /* !9sGnߑ3 a? */ - $"9B35 33C9 8298 A661 A5DB 2CEF 1A1C BC3E" /* 53ɂa,..> */ - $"09B4 5415 8511 4FE5 3FF8 B88C 339D C169" /* ƴT..O?3i */ - $"9608 FF62 B2D6 285A 80A2 22C9 E4AA 5A99" /* .b(Z"Z */ - $"B3F5 E9D4 7FFF 7FF4 7D5C 4CC0 788F 0EB6" /* ..}\Lx. */ - $"8024 0000 0A1E 1F40 0000 0000 0000 0000" /* $....@........ */ - $"CA54 CF6A 897B B6D7 9C90 87E9 FF6A 22A0" /* Tj{לj" */ - $"0765 4AE8 B827 B7A1 C412 4000 0000 0000" /* .eJ'.@..... */ - $"0000 2222 DAB7 AEED C4EB AFCB FF79 6610" /* ..""ڷyf. */ - $"A362 D5F2 1401 DA9F 8978 3FC3 FF60 341C" /* b..ڟx?`4. */ - $"524C CBF3 AF64 9BA4 637F F217 CA8C A4CE" /* RLdc..ʌ */ - $"A881 46DE C63F CB0B 4C86 F71C CDFF 6CDC" /* F?.L.l */ - $"3C86 AFD6 02EF 25B3 E392 0238 14ED F9FF" /* <.%.8. */ - $"71EA 1A7B 7848 281D C18D 83C1 F0D1 C115" /* q.{xH(.. */ - $"C525 7E38 9E60 32A4 CED2 A5DE 8006 1212" /* %~8`2ҥހ... */ - $"7136 14A1 74D1 9C7D F74C 708E 43DE 4154" /* q6.tќ}LpCAT */ - $"2939 179A 87BB 2AAF 7401 4404 CB30 458F" /* )9.*t.D.0E */ - $"F1B7 EE42 3E46 458F B220 6F30 EE24 7D86" /* B>FE o0$} */ - $"2D28 3CA7 C184 60D3 4EBC 9C79 C402 02FC" /* -(<`Ny.. */ - $"553C C62D DDC0 3D0C F12B C1FF 546D A4FF" /* U<-=.+Tm */ - $"5885 6B1B 9EF6 2206 8FB5 1CB0 2D3D B922" /* Xk."..-=" */ - $"644F D104 0152 70F8 BF41 4D6E 4F05 B928" /* dO..RpAMnO.( */ - $"396A 4A92 9B1B 24AB 4611 6D95 87D6 2D7C" /* 9jJ.$F.m-| */ - $"7546 B839 A3B1 C612 0F2A 796E 7911 5FF9" /* uF9..*yny._ */ - $"03C4 D13E EF00 2DEF 9CFE FDDE 3A2C FF3E" /* .>.-:,> */ - $"4567 F432 3673 3F84 8787 B65C 7A4F 2007" /* Eg26s?\zO . */ - $"FF7C D894 A762 3872 8FA4 9563 D178 5039" /* |ؔb8rcxP9 */ - $"C4BD 2EB4 0491 2A80 0000 0000 0000 0001" /* Ľ..*........ */ - $"F172 6FA1 09F2 9F35 F3BC 2E0B 8E46 2557" /* ro5..F%W */ - $"67C5 4F12 D1CF F08C BC61 0F89 E4A4 9249" /* gO.a.䤒I */ - $"2492 4924 9249 221B 4708 65ED 84CA FDD2" /* $I$I".G.e */ - $"D193 7C69 0CA3 95EF DDF2 33FF 556E D976" /* ѓ|i.3Unv */ - $"2E4D FDCE E0FC 8669 83FF 768E 3CBB 179B" /* .Miv<. */ - $"DBB9 253D BFFF 79F1 5006 27BF 5548 40B9" /* ۹%=yP.'UH@ */ - $"BADC F963 10BA 8BD9 367F E03A 6E29 5908" /* c.6.:n)Y. */ - $"0000 0000 0000 0000 0028 8080 0000 000A" /* .........(... */ - $"6370 D000 0142 83C0 0000 0011 CD3F D940" /* cp..B....?@ */ - $"0022 C990 C912 501C 14FC 1926 5412 0E88" /* ."ɐ.P...&T.. */ - $"C32F B2ED E7A4 9249 2492 4924 9249 247E" /* /礒I$I$I$~ */ - $"FB2C 999E D2ED 6DFF 783B 4C3A 3DB7 14A5" /* ,mx;L:=. */ - $"872C 2B85 8FC2 72EA 3412 FCA8 32E0 7A2E" /* ,+r4.2z. */ - $"B109 F66C 3F99 7C32 2761 1522 7B9C 1851" /* l?|2'a."{.Q */ - $"B3CB 5373 0652 CE79 D8C5 B721 03D7 CD81" /* Ss.Ryŷ!.́ */ - $"A03A CD5F CECF B58A 4122 7ED2 9FFF 7FFF" /* :_ϵA"~ҟ. */ - $"1575 DF0B 430B 0A6C 6108 B421 B33F E9FA" /* .u.C.la.!? */ - $"AC06 391C EB01 17F4 3BF4 4CDA 87DA 516F" /* .9...;LڇQo */ - $"EFA3 E7F9 651A 6902 C269 AF79 2EA4 D861" /* e.i.iy.a */ - $"CBC1 7F37 146D 4163 38BB B16B AAD4 9AC2" /* .7.mAc8kԚ */ - $"424A B3CE 1368 78EF B4B0 FE68 2FBA 0CB2" /* BJ.hxﴰh/. */ - $"E672 A89D 999E 64CD 417A 98A3 8458 0603" /* rdAzX.. */ - $"C03D 9F9E B15E 8418 0FC6 F3E0 BA39 A3C1" /* =^..9 */ - $"9929 0547 9C29 FC76 57CA B1E5 F887 AE73" /* ).G)vWʱs */ - $"78AA BA9F FF7F C07C 00F0 28E9 7533 0FC1" /* x.|.(u3. */ - $"097C 4ABC F3CB 6604 EEC2 5194 A1F2 A201" /* |Jf.Q. */ - $"D6B0 C5F3 4AA3 8FD8 34DC A382 0CD4 134E" /* ְJ4ܣ..N */ - $"8275 37F5 2388 74C6 1A6C F889 1037 A348" /* u7#t.l.7H */ - $"ACB4 EFF5 B446 564C C6DC 75F7 8445 013F" /* FVLuE.? */ - $"79FF 407B 05EE 9C66 8A53 FF7A 367A 6D06" /* y@{.fSz6zm. */ - $"9ADF CBDD 25B5 0629 78A0 A071 35BA EE49" /* %.)xq5I */ - $"64E9 3EA3 9A07 917A 66E3 090C B916 3BF5" /* d>.zf..; */ - $"10D7 77D5 7281 248E 3F09 0C0F 319E 7F71" /* .wr$?..1.q */ - $"98DA A34A C823 06A4 6BFD 8EA1 8C71 EB25" /* ڣJ#.kq% */ - $"E5FC 0BA1 DB35 9514 A229 56F0 7E42 9FD0" /* .5.)V~B */ - $"5435 3CB7 AED9 0A4F 625B A493 D1B2 C654" /* T51|4`% */ - $"9BC1 A348 628D 34AE 751A F8F7 7521 7F48" /* Hb4u.u!.H */ - $"68A4 6B9C F66F 252D 6021 9C97 39AB B637" /* hko%-`!97 */ - $"3B5D E8FB 56EE 824A F65D C84D E23C 7BF2" /* ;]VJ]M<{ */ - $"5400 0000 0000 0000 0000 0000 0014 080D" /* T............... */ - $"B05B 4688 1F60 376D 2209 1DE1 7E75 CD30" /* [F.`7m".~u0 */ - $"5D2F 627B A077 8D86 2001 62AF 1031 6853" /* ]/b{w .b.1hS */ - $"2A8E 0308 16F6 C4EC E5B6 814A 1DF2 23EB" /* *...嶁J.# */ - $"8C16 64F9 A1ED 8A1F 346E 2E1C 5ACB 4376" /* .d.4n..ZCv */ - $"5014 B885 5212 5294 8F4F DF56 7339 8A5D" /* P.R.ROVs9] */ - $"03C0 A05F D60B 5D58 2677 CD67 A4EE 3803" /* ._.]X&wg8. */ - $"B2B1 9AD5 A41A C3EF 3281 3FFF 780A A5BD" /* դ.2?x¥ */ - $"861B 62F7 456F 1021 93CD A115 BD61 7E4C" /* .bEo.!͡.a~L */ - $"2306 D6BF D5D9 18AF 12BB 22D9 E32E 6976" /* #.ֿ..".iv */ - $"9282 5E47 A842 7983 2C87 64C5 6215 A0D9" /* ^GBy,db. */ - $"E45A EFAE 74F3 E5E5 7679 A7C0 D366 649C" /* Ztvyfd */ - $"9EF3 D763 2D6C D0AD 48E5 7A2A 9454 8B34" /* c-lЭHz*T4 */ - $"B7FF 7FCD F604 90E4 2716 1C40 DD8A 8B1A" /* ..'..@݊. */ - $"24C8 2F0C 06AC 999A 58B7 C15E E6B1 431B" /* $/..X^C. */ - $"73D1 FEC5 5182 4A2D 33CB E920 AFBE 9F5A" /* sQJ-3 Z */ - $"0478 C2F3 80D7 241A 2E07 8BF3 FD3F 471A" /* .x$...?G. */ - $"7C53 1C79 2F17 C32F D5C6 B977 E2F9 9D80" /* |S.y/./ƹw */ - $"558B 7336 75BC 5945 3986 BD1C CE95 EA07" /* Us6uYE9.Ε. */ - $"7152 C778 65AD 73E9 F1B7 24D4 BDB0 7F24" /* qRxes$Խ.$ */ - $"BACD 3C51 D344 33D7 21C7 BE9A 915D 2808" /* h?.C0.g.x */ - $"08D8 E1D9 3F1A E50B EB7C E564 6F4C 57F3" /* .?..|doLW */ - $"9E60 5F9B 244E 83A9 33C9 668A 3951 7E33" /* `_$N3f9Q~3 */ - $"31D7 01E7 0342 6BC0 7FD1 7488 2BE1 9AD1" /* 1..Bk.t+ */ - $"1938 BBD8 7710 BAD3 BB92 2C80 A162 B2EF" /* .8w.ӻ,b */ - $"3FEA 6FC2 47D2 0D0E 28AB 03DA 4B34 4027" /* ?oG..(.K4@' */ - $"7FFD 87BC 9D96 E076 3C00 0000 0000 0000" /* .v<....... */ - $"0000 0000 0000 136C 1721 95F0 1991 3F80" /* .......l.!.? */ - $"65DC 1F3F AEA0 BE5C 71D2 94CE C7FF 7FFF" /* e.?\qҔ. */ - $"7917 BEAD D458 935A 563C CC9C 6C0D CFFF" /* y.XZV<̜l. */ - $"55DA 93C2 F199 3D1E C4C2 3C5F A7BC D48E" /* Uړ=.<_Ԏ */ - $"4980 037B 9FCC F7BC 6E1E 78CD 2838 DC58" /* I.{n.x(8X */ - $"F156 C827 88EA BFF7 BD95 BBD6 FE11 C305" /* V'.. */ - $"A1D2 FA2A EA0B E56B 285B 91FE 551E F5E2" /* *.k([U. */ - $"687C 5A51 1A67 64D3 BD76 4937 F455 4C94" /* h|ZQ.gdӽvI7UL */ - $"6A7E B888 CB40 7AA3 DDEE 8BD8 2D9F 1EB6" /* j~@z-. */ - $"48DF 9C66 6BF3 A26A 3CC4 2D4D E47A 6D9A" /* Hߜfkj<-Mzm */ - $"DAB1 1DA4 083A D994 4416 C0D2 2E63 539E" /* ڱ..:ٔD..cS */ - $"7274 3C04 85F4 D7B5 EDEF 507A B2B7 1832" /* rt<.׵Pz.2 */ - $"6615 A186 4A80 0000 0000 0000 0000 0000" /* f.J.......... */ - $"07CF BF6C 3626 7453 BF7D 8B57 26C9 F556" /* .Ͽl6&tS}W&V */ - $"1F12 0BB9 5DC4 797D 3C69 7DB2 2FFF 7F33" /* ...]y}LJ */ - $"3161 5289 3A6A FC0B E254 CAFA 6A32 2F8C" /* 1aR:j.Tj2/ */ - $"8B76 FA87 DADD 0333 2250 0058 F5C6 21CD" /* v.3"P.X! */ - $"D094 5CD5 10DD 2FA0 B74B 06FB AA9B 2B62" /* Д\./K.+b */ - $"E36D 708E B8F5 0739 3097 7F03 47BE 48F5" /* mp.90..GH */ - $"D079 1641 CA5D DF28 C92B 0EFA B18F CE6F" /* y.A](+.o */ - $"6648 DB26 DE5C 1D17 2BD3 28AF DD89 801C" /* fH&\..+(݉. */ - $"AB0D 40D1 9016 D542 63A0 8222 9D7A F0F5" /* .@ѐ.Bc"z */ - $"A171 2D28 3D2C C22E 09AB 3AA9 C50B 7545" /* q-(=,.ƫ:.uE */ - $"4C64 18E8 8E67 3A7D DDBE 36CE 2F97 5AD0" /* Ld.g:}ݾ6/Z */ - $"E4F0 8AFB 6071 6268 E5F6 09EA 245F 9F87" /* `qbh$_ */ - $"E304 242C 234C 9FF7 1D0A 11C7 4FE7 20BC" /* .$,#L..O */ - $"EC58 1A4B 5A8E DE45 0E5F 4A03 4C8A 5051" /* X.KZE._J.LPQ */ - $"E410 4405 321B BD82 AC69 94F7 AA5E 5C65" /* .D.2.i^\e */ - $"436F 861A C95F 1AB0 2E2B 9689 AA43 B247" /* Co._..+CG */ - $"6DE3 4E9E F205 F221 D175 86BB 4434 C0EE" /* mN.!uD4 */ - $"C472 EA2B 499D 63FA B4C8 FAB3 91F3 060D" /* r+Ic.. */ - $"C203 A636 1D98 6B00 D678 0D3C BE92 309E" /* .6.k.x.<0 */ - $"759A 11D4 B514 24FB E4D2 7089 76DE 42DD" /* u.Ե.$pvB */ - $"5338 4798 5943 4A6B 500A 472E 77BE AEBD" /* S8GYCJkPG.w */ - $"93B0 117A 0E2D A8E4 DFED 5A76 1775 2BFF" /* .z.-Zv.u+ */ - $"1A84 CBE1 B007 D3EA 11B0 9BB8 4B3F BB56" /* ...K?V */ - $"33F6 B242 4C5C A63D 638F 1BA5 0AC5 698D" /* 3BL\=c.i */ - $"45B3 D343 D769 FEEE C45D 50B0 9AAA 4146" /* ECi]PAF */ - $"0BFA F8CC 694B A42D FC1E C3F1 54F0 D3F9" /* .iK-.T */ - $"F051 5182 D373 5210 38AA F9B0 D3F3 6B07" /* QQsR.8k. */ - $"C944 7FCA 2126 D17A 01B1 7763 CDE8 D5FF" /* D.!&z.wc */ - $"00F4 08D7 4060 339C D8E2 7EA4 B00D 3171" /* ..@`3~.1q */ - $"ABB0 7F47 D146 13B9 398E 14B3 C55D 10AF" /* .GF.9.]. */ - $"8D0A 2444 26A0 EFEA 6CB2 51FD EA28 0FD7" /* $D&lQ(. */ - $"4E2F F54F 0066 62F2 66F3 334C 5D9D 77ED" /* N/O.fbf3L]w */ - $"F3D0 12ED 7A95 89A1 B928 8429 DCFB 8C68" /* .z()h */ - $"C35C 3C77 5D7D 5180 A012 ADA3 AE60 AAE0" /* \r`u&i". */ - $"E140 D538 7CD4 5763 D708 6D5E 45C0 AE61" /* @8|Wc.m^Ea */ - $"EC8B E180 1D9C 712C 4DB9 F177 6733 0F76" /* .q,Mwg3.v */ - $"9A72 7AD0 D18D 2BE6 9DCE 6294 4092 CE8E" /* rzэ+b@Ύ */ - $"ACED 8B00 B050 AE53 C09C 98D6 CFD1 4208" /* .PSB. */ - $"DEB2 AF01 5ED7 E1F4 4EAA 0B09 2263 FE09" /* ޲.^N."c */ - $"2771 6EB7 9181 1DFE A5DD 9A12 4592 02FD" /* 'qn.ݚ.E. */ - $"5F2D D4D6 5C15 B454 B07C 9B6A B9F9 AEC2" /* _-\.T|j */ - $"D883 1F5F B9B1 8258 6732 C7E3 5C90 DB16" /* ؃._Xg2\. */ - $"42EC D875 2B9D FEAF 1FED BD80 261D BAAE" /* Bu+.&. */ - $"3799 FDC7 DBE5 E769 A11C 3304 5D3B 419C" /* 7i.3.];A */ - $"5844 E615 EE7A 5DCE 272E D055 121D 1F84" /* XD.z]'.U... */ - $"2EC6 E6B1 A7DA D03A D600 6D58 4FF0 9196" /* .汧:.mXO */ - $"FBCA CDDC 1B8D 9D1A BB7B 3782 0F3F 626C" /* ..{7.?bl */ - $"26AA AF34 6A20 8210 1E96 ED21 5A26 EF04" /* &4j ..!Z&. */ - $"5F66 5C2D A8A4 F3BC 1871 AD1D FE4D 8C8B" /* _f\-.q.M */ - $"F1E5 A382 654B 08C7 EFC4 BFBA C29B 5C73" /* 壂eK.Ŀ›\s */ - $"2420 9390 3B75 6DE6 0208 6F4F BB53 B2AA" /* $ ;um..oOS */ - $"AD28 4360 1A8A 4301 088C 6F17 68CC 9180" /* (C`.C..o.h̑ */ - $"D757 7012 3BE3 C4AB DF05 97B9 4B57 B6FC" /* Wp.;ī.KW */ - $"7693 36DE 89E8 E2AB 4352 A782 4520 DA28" /* v6މCRE ( */ - $"F1F2 34D6 2EAE E401 ED61 1E2E 4E74 D4EB" /* 4..a..Nt */ - $"98A9 94AD F856 8EE1 E3D0 06FC AA37 31E5" /* V.71 */ - $"1047 113E C151 CE86 B6A4 0F82 E5D9 CE50" /* .G.>QΆ.P */ - $"57A8 8F86 AFAD 21D1 2C4C F181 8BD7 106C" /* W!,L.l */ - $"3C77 649E 038E 3C63 66F4 EE1A 2906 755C" /* 1d>Ta */ - $"4BD0 139E 6390 0E05 4793 56B8 5080 CBF6" /* K.c..GVP */ - $"9E70 BEA1 FB26 DD1E AEE1 E78D 0D32 FA02" /* p&..2. */ - $"43FC FBC6 7464 2C9A 14AD 2C7C 0969 995F" /* Ctd,.,|i_ */ - $"6363 3037 9C34 C5F8 42DF B339 D2B0 5C45" /* cc074B߳9Ұ\E */ - $"6130 509D 28E7 D3A7 9308 74ED 9265 B7F9" /* a0P(ӧ.te */ - $"0F54 D265 33D9 EB57 07C4 852B E3C8 771F" /* .Te3W.ą+w. */ - $"21F8 ADA3 D807 625C 513A E395 604B 0D6A" /* !.b\Q:`K.j */ - $"A9FC 297E 63AF 7622 23B6 63E1 EF25 F572" /* )~cv"#c%r */ - $"01B0 400D 18C6 C9FA 6AF5 3E26 4199 6E68" /* .@..j>&Anh */ - $"99B5 B3A9 F861 3419 C6C7 B65C D0F6 353B" /* a4.Ƕ\5; */ - $"6551 1B0A 9D82 1F07 4185 8C46 5867 DC22" /* eQ...AFXg" */ - $"BD38 AFF7 27BA 1114 9266 5EF4 1EA9 89B4" /* 8'..f^. */ - $"A634 E917 65E5 502E 8028 D24E 725F 0C22" /* 4.eP.(Nr_." */ - $"1513 7B38 5FEA 3150 520B 6D8A 03D8 F796" /* ..{8_1PR.m. */ - $"D183 D8FA 82E2 C147 B662 593B 9FC8 A2A0" /* уGbY;Ȣ */ - $"C63B D151 D905 072C 02E5 919B 0BE9 6D76" /* ;Q..,.呛.mv */ - $"4BEF 7D51 FF67 C2F2 BB61 DDD2 7981 0B7E" /* K}Qgay.~ */ - $"D406 3679 DFA4 FAE3 A33C 28AC 06C6 93C1" /* .6yߤ<(.Ɠ */ - $"B82F 53DB 1EB8 A6F3 5A24 A44A 1A76 9204" /* /S.Z$J.v. */ - $"6543 FC80 18DA 3C5D 395B 01DC D7E8 C21E" /* eC.<]9[.. */ - $"A66C 9AE3 08D6 DBFC EE95 9E73 F71D 7CCA" /* l.s.| */ - $"2A6A F6D2 11D9 AC28 BEDE 8E1B 65EF A995" /* *j.٬(ގ.e突 */ - $"F7B5 B19D 5F63 F42B D0AD D69A BD47 1EED" /* _c+Э֚G. */ - $"2E5C 0276 3AEA F6D9 6E3F 314C 7F5F 52C3" /* .\.v:n?1L._R */ - $"093D C8A9 23E4 C154 5587 294A 98A9 0643" /* =ȩ#TU)J.C */ - $"AF18 0D20 51A4 6FE1 F326 11E7 5A91 2919" /* .. Qo&.Z). */ - $"DD53 B13B 2CB3 DE77 FAB9 420E BAFB 305B" /* S;,wB.0[ */ - $"E9AB 7A2B 623B 78FE 346D 8BB6 BA40 AE40" /* z+b;x4m@@ */ - $"5B6D 6D53 81A1 076D 7058 E792 E410 3FA7" /* [mmS.mpX.? */ - $"AD06 7E2E 5158 D129 9233 6E1D 6B7C C701" /* .~.QX)3n.k|. */ - $"D61D 42D8 472F D5E2 2710 0B6C 828A 2352" /* .BG/'..l#R */ - $"D400 65FA E227 A938 1832 18CC 2BCE 19A8" /* .e'8.2.+. */ - $"773C 3CB1 C6BD D722 8EE1 8AE2 4D4B 97D4" /* w<<ƽ"MK */ - $"1763 37E4 2F93 8578 534E 0BA9 B493 3B80" /* .c7/xSN.; */ - $"F018 28BE 2A52 15B2 8499 08A8 005F F028" /* .(*R..._( */ - $"ADFD ACEB 238F 922A 75E4 1C65 F2C3 F14B" /* #*u.eK */ - $"213D 7263 4A9A 1C80 12BD 5895 0EC8 B955" /* !=rcJ..X.ȹU */ - $"8CD0 FB81 63CF FF7F B545 85DF E201 36A9" /* c.E.6 */ - $"E524 1BD6 EDDA 7C33 8CD2 E114 BA93 51E0" /* $.|3.Q */ - $"A113 A12A FBEA 8570 B5FE E1B6 7963 5B31" /* .*pyc[1 */ - $"512A 99B1 3A59 E50E C584 DD7F FF7F FF7E" /* Q*:Y.ń..~ */ - $"D3C9 019B 1FBC DB70 2C2A 14A6 E7F1 0147" /* ..p,*..G */ - $"5F3A A36C 6F8A 9038 ABD8 EB8F FF7F FE79" /* _:lo8.y */ - $"6C12 2D6F FD6D F9A0 0392 0E82 0296 3C14" /* l.-om...<. */ - $"FEFA 803C A3D4 1049 CF30 E22F 6542 7ABF" /* <.I0/eBz */ - $"378E 66B2 9091 D396 B953 DCF5 66D3 C5B5" /* 7fӖSfŵ */ - $"7719 028C 5C0F F898 00A1 0C1D E181 F9C7" /* w..\.... */ - $"2E46 06D4 D623 1256 EFAE 89E3 4FFF 7FDD" /* .F.#.VﮉO. */ - $"F00D 4E11 65D5 B8F9 7C0B A045 AC4A 1E42" /* .N.eո|.EJ.B */ - $"221C B512 5480 EF2D CB80 A089 3603 2CA1" /* "..T-ˀ6., */ - $"391C 7925 C817 92E3 8438 C438 08D1 0637" /* 9.y%.88..7 */ - $"9FCD F4C2 C04C 40BB A484 5043 0C1E 7C85" /* L@PC..| */ - $"D7F6 1F6D BFC7 60AA 4D18 A399 9A13 CCD0" /* .m`M.. */ - $"26DA 3F97 24CB E902 0668 67F7 FE63 7A2E" /* &?$..hgcz. */ - $"16D6 987F FF7F AFC1 5C35 E63D BA36 6227" /* .֘..\5=6b' */ - $"FF7C FD39 8B8B 1A5F 6026 831B 0764 8805" /* |9._`&..d. */ - $"E40B 0F19 7FFF 7FFC DEBC DD5B 9008 0000" /* .....޼[... */ - $"0C24 1D44 4641 3BC8 4248 E229 62D2 088D" /* .$.DFA;BH)b. */ - $"117F DE8D 0B52 C3FD 1DD9 3823 F138 4C98" /* ..ލ.R.8#8L */ - $"58A8 2683 519C F914 4961 5226 891F F863" /* X&Q.IaR&.c */ - $"3FF2 B19F 113D BFEF 9D12 30C6 66BD E2A6" /* ?.=.0f */ - $"5D8C BE7E BE19 3D8F 03F2 5D26 FF7F FF7E" /* ]~.=.]&.~ */ - $"A82B 5E03 E7A8 E8F1 8C4D B6F1 F0E2 FC36" /* +^.M6 */ - $"DE7A 2F55 38B1 B436 2E50 7D25 E3F0 82C8" /* z/U86.P}% */ - $"580F 0D19 C280 415C 2A7F FCD9 C720 E649" /* X...€A\*. I */ - $"4064 2624 04AC 0B71 41FD 3937 8359 4137" /* @d&$..qA97YA7 */ - $"8CA9 B642 C318 BD37 82D3 B786 8217 3252" /* B.7ӷ.2R */ - $"44EA 4598 57D2 2F66 957F 39FE D712 F449" /* DEW/f.9.I */ - $"213A BEBB B6CC F551 FF7F EB0A AE45 8497" /* !:Q.®E */ - $"0F4C FD34 4090 01FE CFC8 51AA C32A 7D95" /* .L4@.Q*} */ - $"D414 2609 E22F 1B7D E10E 97BB 05D1 9D04" /* .&/.}..ѝ. */ - $"0592 9271 0D39 AB59 F165 0D09 549C B4E3" /* .q.9Ye.T */ - $"AEE5 555F 00A3 5E0A E4D3 BAFE 1EC6 2FCE" /* U_.^Ӻ./ */ - $"FB04 C9BC 71D8 A42D 2F70 9FE1 EC17 C31D" /* .ɼqؤ-/p.. */ - $"ECB2 0A82 EFB1 914C F6D2 E54C 5316 B6C4" /* ‚ﱑLLS. */ - $"4FFF 653B FD6E 27A6 9959 244B F458 B35C" /* Oe;n'Y$KX\ */ - $"865C EB94 2CD7 7343 B74C C211 8A4D 2A99" /* \,sCL.M* */ - $"732E 3B43 CEAC C300 A520 924D 6F1F 8295" /* s.;Cά. Mo. */ - $"DF36 1FD4 E8F0 9221 6313 1B33 0C98 2721" /* 6.!c..3.'! */ - $"8F55 5BA1 0E46 A755 1D7F A914 458D 9FFF" /* U[.FU...E */ - $"33CF 4CE3 AFC6 3383 BC4D A7E9 F546 FDCB" /* 3L3MF */ - $"8276 7778 2BBA EF7C 3677 6251 58C0 9EFF" /* vwx+|6wbQX */ - $"526C C883 6CFF 7FFF 7D4C 3F9F BD74 6BE9" /* Rlȃl.}L?tk */ - $"B6EB 9003 823B 235D 6AD9 B382 FC45 F10C" /* .;#]jٳE. */ - $"8282 90ED 9D47 E949 FADC 7B04 1C1C 9EF1" /* GI{... */ - $"1ABB 270D 07BE 1943 4E14 70E0 48FF 81EE" /* .'...CN.pH */ - $"CE8A 5AAD 3CE9 090D 3126 F96A AEBA 5853" /* ΊZ<.1&jXS */ - $"D02E ADE8 4614 E2B7 2E7E 3DB6 DE6A 77A8" /* .F..~=jw */ - $"48D0 2DBB BAF4 E94C 735D 27D6 87FF 7F80" /* H-Ls]'և. */ - $"5BCC 3CA6 1168 D9E0 38B4 22B2 2154 02AA" /* [<.h8"!T. */ - $"A1FF 6D87 EB2B F3EB 3814 9F74 DEF3 4D86" /* m+8.tM */ - $"ED68 7E75 9E81 1FD9 170B E013 7E4D 97B3" /* h~u....~M */ - $"51B0 6B2A 42AF EEB4 899B D2A2 6AC9 8EBF" /* Qk*BҢjɎ */ - $"2858 9FFC 5050 3364 8F2D 313E 94A9 5ED5" /* (XPP3d-1>^ */ - $"6213 E9DD 6FF6 5813 72DA FE40 0F70 06C4" /* b.oX.r@.p. */ - $"FF7D 053C 3E69 C976 DDFF 02D9 4688 D8D7" /* }.<>iv.F */ - $"8DEF 5187 FCA3 40EE 3167 B6DD 7EE6 42AB" /* Q@1g~B */ - $"B07A DB20 DC1D 7016 631F 8FB0 C83A 9CC2" /* z .p.c.: */ - $"66B9 304B 74F5 03F7 217C D3E3 6000 ECE6" /* f0Kt.!|`. */ - $"A319 FD9E 4131 7E74 59C6 FB3F 1B51 FE89" /* .A1~tY?.Q */ - $"52D3 C845 1BF0 4BFE 3BAE 4940 9830 8E9C" /* RE.K;I@0 */ - $"F843 F6A2 218E B2E2 8092 8E0E 3889 8137" /* C!‒.87 */ - $"583C 394F CCE6 3D1B 37B8 C9A4 D805 B9E4" /* X<9O=.7ɤ. */ - $"A037 E45D 1167 9627 81E0 538C 1B6D EA0E" /* 7].g'S.m. */ - $"18CD 8E3C EE0C 5E0C B048 8DD2 C804 CA38" /* .͎<.^.H.8 */ - $"8678 CAA9 5EE1 8B6C E7D9 FDE1 5C14 D52A" /* xʩ^l\.* */ - $"67F3 8A12 F698 857A 5692 1FB3 FF27 FE1B" /* g.zV.'. */ - $"7E31 5D25 B4A2 3647 FF07 064A 4D7B F160" /* ~1]%6G..JM{` */ - $"62D7 81CE 0940 AE5F CAEB F1A6 10C4 CB0E" /* bׁ@_.. */ - $"3D77 2C40 0146 8C72 B765 F6A9 3047 E748" /* =w,@.Fre0GH */ - $"0239 A725 8B4C 56F0 7E86 9A24 53D7 4832" /* .9%LV~$SH2 */ - $"7924 73CB 4431 4977 0487 03FC F1B3 A21C" /* y$sD1Iw... */ - $"2792 0B05 8183 8348 8EC0 2635 47D9 B51D" /* '..H&5Gٵ. */ - $"CE40 1FA4 20C5 93A8 BEB4 B8CD 93D8 A79E" /* @. œ͓ا */ - $"62C5 846C 964D 0404 BE21 3AA5 9EC3 4450" /* bńlM..!:DP */ - $"FAEE 938A A428 E4D0 7F1B 46A8 7AEC 97FB" /* (..Fz */ - $"1AFF 71DA F26D B5B1 E6F2 66B4 865E 1F12" /* .qmf^.. */ - $"CE0F 3A8A EDF1 6321 BC5A 22D5 D3D6 BE19" /* .:c!Z"־. */ - $"671A 38C3 11E8 FC9D 93AC 895A 1B84 7C9B" /* g.8.Z.| */ - $"979F 5DC5 BBE6 19A8 5D03 BE83 6FA4 B8F2" /* ]Ż.].o */ - $"AFCD 8115 B21B C1D5 80B4 5E20 3B19 9E48" /* ́..Հ^ ;.H */ - $"29C0 68DA F799 EC0D 56B3 7049 5EC1 11CB" /* )h.VpI^. */ - $"CBAF FA0A 5AF1 22F1 3A4C 6F13 635A C681" /* ˯Z":Lo.cZƁ */ - $"06DA 8B44 A35B CF31 9B6F 57E6 AEC2 8D59" /* .ڋD[1oWY */ - $"1556 A43E A289 74DC C398 B209 31B9 8CD0" /* .V>tØ1 */ - $"07BE D253 76AB 7D79 4F26 D099 7AE8 E52C" /* .Sv}yO&Йz, */ - $"EA35 D7BB E968 CAA0 5F61 EAE5 E9A1 E903" /* 5׻hʠ_a. */ - $"100E ED2C 5A66 21E2 1426 BE74 7A19 8C98" /* ..,Zf!.&tz. */ - $"3D67 A4D2 370F C95D 7131 2D31 0971 6022" /* =g7.]q1-1q`" */ - $"F4F2 359E 1FBD D23A CD94 4467 205E F7B1" /* 5.:͔Dg ^ */ - $"5D18 EE91 9078 176B ADC2 65EB EECF D1A8" /* ].x.keѨ */ - $"F1B3 B999 E7CC 3079 BD9C 82D8 DF6E 29E0" /* 񳹙0yn) */ - $"9502 EC8D 5C13 629B 109E A7C0 F438 6674" /* .\.b.8ft */ - $"C48B E75A 7CAC 28AE 3E9C 0ECF 9ADF F7BF" /* ċZ|(>.Ϛ */ - $"C51A E20D 64F1 B1DD C986 0C6F 6BFF 5102" /* ..dɆ.okQ. */ - $"B233 B826 EBC9 35E2 9799 0A0F E81D 0816" /* 3&5◙.... */ - $"E01C B1A8 E4D9 1CCF 7F2E 4DB3 371B 83C0" /* ....M7. */ - $"9DFD A603 83D6 4412 7DCF 2E2F 85D8 8259" /* .D.}./؂Y */ - $"DC97 798F 2E8A 09F5 C1A7 1E56 55F3 BFD0" /* ܗy..VU */ - $"34CE 311A 98BE C87C 8CCE 6EDF C85C A788" /* 41.|n\ */ - $"AA7E 47D5 72AF 1842 5C5F 9D6A C586 CA4C" /* ~Gr.B\_jņL */ - $"34D3 6315 D6CA 0D6D 5B75 6C85 551B E270" /* 4c..m[ulU.p */ - $"E9DD 6127 C363 1F5A 0AA4 8F55 114F 9ED3" /* a'c.Z¤U.O */ - $"034E A968 1BF1 513A 2F0D 3E61 612A 15E6" /* .Nh.Q:/.>aa*. */ - $"B89F 1877 F38E 8C96 20C3 1952 A559 62AE" /* .w󎌖 .RYb */ - $"20E0 BE7D BF7C FAA3 F56C FF75 6D5E 07E7" /* }|lum^. */ - $"EB87 E7E9 BFE7 EE37 E7EE B60B E7DA F7CF" /* 7. */ - $"A6FF 2B5C 2F9F AC00 ED1C BCF0 084D B6D5" /* +\/...M */ - $"A3F8 3A1B 179B 5659 AE02 A536 8D65 B1A0" /* :..VY.6e */ - $"F806 81C6 9453 B9E5 1E84 EF36 3D8C 9922" /* .ƔS.6=" */ - $"A841 EBC7 584D 175D A8CF 5AE5 52F4 364A" /* AXM.]ZR6J */ - $"CACB F4FA 59D1 6C18 1FE0 5F96 0F70 465A" /* Yl.._.pFZ */ - $"7CFD 0C37 59FF 6248 10C6 4872 8573 D54E" /* |.7YbH.HrsN */ - $"7839 337E D900 4336 CF58 B59C BCC4 602F" /* x93~.C6X`/ */ - $"EA1A 205F CD8D 635B AE0D 5750 3316 72C7" /* . _͍c[.WP3.r */ - $"A765 C2F2 CF8C 52FB 1892 F55E B7A5 6D85" /* eόR.^m */ - $"5782 FAB6 FBB5 CDF3 2DC2 0256 2927 4F4F" /* W-.V)'OO */ - $"1F92 5F99 B540 87DD 7A80 991B 0677 AB00" /* ._@z..w. */ - $"2D82 C5F6 11F7 F21B 2652 B798 75D5 42A6" /* -..&RuB */ - $"7757 E0E7 3C3F DBA5 6106 9F44 1800 E044" /* wW */ - $"B79B E645 6FD3 A5EE ECE2 C9A7 53C7 B2E3" /* EoӥɧSDz */ - $"C659 D5C5 0FBD 7C88 93C3 D3D9 D81F 0AEB" /* Y.|. */ - $"5784 8BF9 DAD7 993D 0C8B 9873 08A4 254B" /* Wי=.s.%K */ - $"2452 F95D 29CA 8B3E D48D 18FB C813 4ECB" /* $R])ʋ>ԍ..N */ - $"D118 E3FA 926C 7A5F E5CC F774 D1DB B5C1" /* .lz_t۵ */ - $"579A 2647 619A 67A0 423D 6C64 B3A6 9357" /* W&GagB=ldW */ - $"B8C6 8FBE A3AC E380 E548 5ED3 D83D 7DB9" /* ƏH^=} */ - $"93E8 9071 F6E0 168F 6BEC F674 6D08 F4DA" /* q.ktm. */ - $"C1F7 11FD DEF8 2420 30DA 71E2 C605 81EB" /* .$ 0q. */ - $"565B D461 AF6E 3127 34AC BA64 C660 14E1" /* V[an1'4d`. */ - $"F6AB DA92 386B 3E7B BD42 90E9 ABA2 6EE7" /* ڒ8k>{B髢n */ - $"8D0D 373C D280 46EC 6746 310C EA41 862B" /* .7<ҀFgF1.A+ */ - $"6D1B 7BE9 93AF 17F6 1D3A E7AB CA55 8A4B" /* m.{铯..:UK */ - $"E867 6EF3 29DF FF5F B839 75E1 FA04 DD81" /* gn)_9u.݁ */ - $"B6C9 DA44 D268 3B1A FF63 60F5 37A5 DDCB" /* Dh;.c`7 */ - $"1AB3 5275 7692 7F15 F8E8 6A96 CEB4 D9E5" /* .Ruv..jδ */ - $"3E5A 0E16 B1D0 B056 D0D2 0360 0900 5773" /* >Z..аV.`.Ws */ - $"BB3F C215 FD55 C9BF E3FC 48A1 CFAB BD39" /* ?.UɿHϫ9 */ - $"CD3D 906E 21CB C3DD E4D3 548C 4731 E777" /* =n!TG1w */ - $"EE15 C0DE CEBC 0F2F 85A6 9822 F1FF 7B2F" /* .μ./"{/ */ - $"2530 48C7 0C39 3659 CD03 06C5 7C8E 3D49" /* %0H.96Y..|=I */ - $"FED5 7B72 4652 772C 39C7 8F1B 63E8 2DC1" /* {rFRw,9Ǐ.c- */ - $"1242 CA35 E396 6103 15DF D939 0597 B8D4" /* .B5a..9. */ - $"8858 ACE3 3C32 6EE5 69A3 8512 3447 2B3B" /* X<2ni.4G+; */ - $"0647 8C1F 2D31 4E57 0D03 BE26 5235 5275" /* .G.-1NW..&R5Ru */ - $"74E8 B8F6 CF32 E077 8C51 41DB ED67 EE30" /* t2wQAg0 */ - $"AD97 7956 D279 B0A8 768D 00E3 F604 A240" /* yVyv..@ */ - $"9656 5BCD B309 D0CD 3ECE C477 31EC F88D" /* V[ͳ>w1 */ - $"782F 8B9E 37FA A741 C636 7B55 D047 64A4" /* x/7A6{UGd */ - $"E2EC C69D F609 F38F 821E 8D20 8709 87FF" /* Ɲ. Ƈ */ - $"3C3A B1ED C420 1F0B 52E3 8999 C684 30F3" /* <: ..R㉙Ƅ0 */ - $"C4ED 7FA9 3A2C D0E7 AE48 1AC2 7196 9347" /* .:,H.qG */ - $"6BC9 BEE1 4112 4209 93CA 307A 7FF7 8B12" /* kɾA.BƓ0z.. */ - $"EE76 8890 A529 33CC F435 A84F 9414 A719" /* v)35O.. */ - $"BFB2 6305 201F 372D 567F 30DF 2E47 D0B9" /* c. .7-V.0.Gй */ - $"C68F 5126 7EAA D95A 12D0 DA8A 8CF4 8A2A" /* ƏQ&~Z.ڊ* */ - $"CBAE 0509 B614 A9E1 2CA2 D0E0 F017 E395" /* ˮ.ƶ.,. */ - $"AF82 85B5 4509 E75C 8E4D 5465 7DF2 CF39" /* E\MTe}9 */ - $"ACFB DD5B C683 62C0 0B1C B7B9 EAEC 049C" /* [ƃb... */ - $"8045 0178 6757 E317 872D ABC2 B077 6EF6" /* E.xgW.-°wn */ - $"3612 4132 3DD7 D39B B49A 04A8 207D 6135" /* 6.A2=ӛ. }a5 */ - $"C64F 3A0F 5028 7B6B 953E 8F19 920A 718F" /* O:.P({k>.q */ - $"08E9 A079 EC51 A08F 4A77 5130 C807 9BC2" /* .yQJwQ0. */ - $"B37B 4C7B 9BAA 40F3 4E94 BE51 C027 32B5" /* {L{@NQ'2 */ - $"751F 4793 7271 226E 82F3 CF14 8BC3 F927" /* u.Grq"n.' */ - $"4C81 7F29 AB70 8B3B E948 86D6 569F FEC2" /* L.)p;HV */ - $"BF6C 92F9 1011 3BE3 9E91 6458 1634 34A3" /* l..;㞑dX.44 */ - $"3042 520F 5D64 6429 32CE 04FD 1B98 0698" /* 0BR.]dd)2... */ - $"3A36 655C 86C7 C272 4B02 E259 0537 4DB8" /* :6e\rK.Y.7M */ - $"C6C2 6980 ECFB 0FC1 C6D9 0A2C D00F 282A" /* i.,.(* */ - $"7A0B D91F 08CA 762C A629 048E 9BCC CFD2" /* z...v,). */ - $"1EBC 8F60 2F64 F24D F1FB 81C6 8AEC CFDB" /* .`/dMƊ */ - $"623A 01A9 35D2 B5E1 B80A 2D32 084E 3857" /* b:.5ҵ-2.N8W */ - $"C025 BCDA 4728 F3AD 35AD 9AAA E054 21B7" /* %G(5T! */ - $"A47E 62C5 9921 02C0 09E3 440D 063A 3789" /* ~bř!.D..:7 */ - $"5072 E54A 4654 E148 AC2E 4A99 C6A5 3923" /* PrJFTH.Jƥ9# */ - $"49B5 6906 6531 FD5E 7CCE 1C4B EEDE 7482" /* Ii.e1^|.Kt */ - $"9E3F 73AE C777 0214 C921 3131 C5CB 9F61" /* ?sw..!11˟a */ - $"64A4 4E70 57C2 5C04 E25B 266E 6887 7477" /* dNpW\.[&nhtw */ - $"FCCB 1F0C 89F2 6CF6 713E 4D08 8AC8 9B0C" /* ..lq>M.ț. */ - $"00AC D9D7 A28A C219 B52B B46A D704 F919" /* .ע.+j.. */ - $"2050 6CCA 215A 299B 9129 9739 DA6F 3A67" /* Pl!Z))9o:g */ - $"FE12 2BF1 4F8B 26ED D21F F727 5B59 22F3" /* .+O&.'[Y" */ - $"2E05 F4A0 9754 F431 9AED 1B65 038C CD7F" /* ..T1.e.. */ - $"8254 E3AE 035C 18D7 0E28 6300 0DF0 998D" /* T.\..(c.. */ - $"0191 85AF C71B B3CF F0D6 3A8F B1AA 5E99" /* ..:^ */ - $"BAB8 7C7F 0214 F864 4744 E747 7248 3C94" /* |...dGDGrH< */ - $"3AC8 CE04 1019 11ED 4BCC 76E9 FE4E 5728" /* :....KvNW( */ - $"5BB0 986C D763 A3C7 AF8A 14E9 D24A AD17" /* [lcǯ.J. */ - $"FF66 611F B77C 0830 9093 A560 06FA E9CF" /* fa.|.0`. */ - $"054B 5846 1681 5DBF 34F9 49A9 45E0 8F20" /* .KXF.]4IE */ - $"7FFD 6264 2193 031D A60F A111 B0B7 CFEE" /* .bd!.... */ - $"DE49 EC80 C0F1 D7F6 A495 900B 4126 40BE" /* I.A&@ */ - $"185B DFFE C7B0 12AC C143 AA85 70E5 81EF" /* .[ǰ.Cp */ - $"79CE 1662 08E4 203F 1706 40FB CC39 CA8F" /* y.b. ?..@9ʏ */ - $"8002 1CFA 3BCC 6B79 5C83 A4D2 7147 E38F" /* ..;ky\qG */ - $"C93B F2E8 6A15 6D30 C314 E898 81E3 FF7B" /* ;j.m0.蘁{ */ - $"5FC5 EE13 0449 1985 2CBC 73C7 C569 DCB1" /* _..I.,siܱ */ - $"8024 F7CA CC7A FE3B CC15 4BCE 5B92 1BBB" /* $z;.K[. */ - $"0048 F291 579F FD20 F11A 1934 CC11 9C3F" /* .HW ..4.? */ - $"CE49 027A 9763 9E57 A2FF 7FFD 53E4 E50B" /* I.zcW.S. */ - $"C747 02FF 7869 0537 1482 221E 0220 79D5" /* G.xi.7.".. y */ - $"45B1 2E48 6A6C 8486 571F E1F1 BF39 0797" /* E.HjlW.9. */ - $"5D21 6964 EA9B 13F1 E6B7 C4B5 A2B7 E2BD" /* ]!id.ĵ */ - $"09C2 B200 0000 0000 003E A392 6527 69B6" /* ²......>e'i */ - $"B189 8365 F55D 7A2B 0398 4196 BB60 D4F0" /* e]z+.A` */ - $"06B6 100C 5B60 D76F 8FEE EFFB D525 0E2B" /* ...[`o%.+ */ - $"3535 B765 22E7 F77C CF5C 8907 7626 62C0" /* 55e"|\.v&b */ - $"3B04 A170 EEA6 A399 F26B CD7E 92BC 9E13" /* ;.pk~. */ - $"9D2D 6907 B06F 6B9A 957D 3C57 DC9F 06E6" /* -i.ok}*.㏟: */ - $"0D69 7E9D 5B07 1396 ED52 69BC 3971 5630" /* .i~[..Ri9qV0 */ - $"7C63 8DA9 7A40 F364 CC6A FCAC DC7C 59DC" /* |cz@dj|Y */ - $"278A 92E3 6FBF F936 7157 2583 232E E558" /* 'o6qW%#.X */ - $"0000 C241 6B90 4DCB 6421 F85A B681 4812" /* ..AkMd!ZH. */ - $"9165 5C06 0195 F213 DB9F 5E2F 4BDE A075" /* e\...۟^/Kޠu */ - $"BD9A 741B 971B 3411 1F73 7FF8 D719 BA55" /* t..4..s..U */ - $"8048 404F FEEA FC74 AEB1 84FD 03F9 5D43" /* H@Ot.]C */ - $"BE42 E61F FF7F F4CA BA56 9654 B757 FF60" /* B..ʺVTW` */ - $"CA39 3290 054C E785 0EA7 F04D AF3E B342" /* 92.L.M>B */ - $"A80A 815D 3954 73F2 871A 51FF 7488 20CD" /* ]9Ts.Qt */ - $"90F3 23B8 80FE C6BF 726C 5426 83F2 5400" /* #ƿrlT&T. */ - $"0000 0000 0000 0000 BFA5 D802 777C F954" /* .........w|T */ - $"286B A586 76CF 26CE 72CA 6FE7 BD43 DB36" /* (kv&roC6 */ - $"A826 870E 2EEF E2C4 2E22 E63C FF7F AF51" /* &..."<.Q */ - $"40C1 B727 22F3 9ACC 894D 0C49 EC7A D998" /* @'"̉M.Iz٘ */ - $"64A9 DD22 2545 B85C D621 0609 B73A 9D9F" /* d"%E\!.Ʒ: */ - $"FF7F FF7F C0F7 00E1 B069 1D76 3BA1 E98C" /* ...i.v; */ - $"5F1B 1E11 B6F6 EB6D 6316 9DBC D1B2 DC90" /* _...mc.Ѳܐ */ - $"5E1D 5EE0 3C65 57D0 B69C 3782 D1BE 3A77" /* ^.^ۮ#S.. */ - $"74AA 7920 6233 E3BF B281 AFAA 957D FDFB" /* ty b3㿲} */ - $"216A 3ECE 3139 37DF 8885 620B 5D55 D0FD" /* !j>197߈b.]U */ - $"F796 6A70 CEFD 33D8 B369 178E 99C0 9FFF" /* jp3سi. */ - $"7FD2 27D4 D615 4840 B836 A0B5 1D6F 2A5A" /* .'.H@6.o*Z */ - $"1338 2369 83A0 D409 0FA7 77EF 19B9 21E6" /* .8#i.w.! */ - $"3E21 0CB0 D4D3 362A EA6F 6340 8D73 27FB" /* >!.6*oc@s' */ - $"C3EF 7823 33DF 7A8C 5C69 20C4 5816 72E4" /* x#3z\i X.r */ - $"712C 3345 6755 76F3 FEAF 494B D0B4 3C8F" /* q,3EgUvIKд< */ - $"B83F A050 C3E9 4CA2 6A6E 7AD0 D7FF 5860" /* ?PLjnzX` */ - $"548E 54E7 C3B9 6DDF 462C 54BE 5EF9 1A41" /* TTùmF,T^.A */ - $"6A46 A4FB 1C36 1CA4 77EC 2899 F147 3422" /* jF.6.w(G4" */ - $"843C 7FAE 123E 6894 9B7F 3125 EB0F 3129" /* <..>h.1%.1) */ - $"9DC1 8469 CE90 BB6E 4F2C 385A 0FD1 9AC7" /* iΐnO,8Z.њ */ - $"3318 3BF0 B1AA A51A 9022 A143 29FF 7FC1" /* 3.;𱪥."C). */ - $"0F0F 6570 67C4 7FA7 9906 DE4E 5439 A278" /* ..epg..NT9x */ - $"34E1 3D57 BB0E 086E 4C71 4406 DA9D CA56" /* 4=W..nLqD.ڝV */ - $"3EFD D077 5DA5 CD7D C244 9128 F408 1F03" /* >w]}D(... */ - $"0C8F FF4B 9274 2EC6 E208 13C5 EE1B 3CEA" /* .Kt....< */ - $"C5C0 06F5 0FA1 11FF 7FE3 A446 32E6 F4DA" /* ....F2 */ - $"23EC 5108 3AE0 CD16 AFFF 3965 8196 56E2" /* #Q.:.9eV */ - $"2881 4EB9 CA14 5C4A 8091 B176 8823 BF09" /* (N.\Jv# */ - $"CED5 0D88 E6BB DD95 1B72 36E8 809C D432" /* .ݕ.r6耜2 */ - $"872D C08C 7DCB B30E 548B AE16 0D85 6B49" /* -}˳.T..kI */ - $"9B28 D491 ECD6 F598 691A 0891 135A 63A0" /* (ԑi...Zc */ - $"593C 1FFD 8A54 4FB9 F2AB 20FC 5CF3 1B88" /* Y<.TO \. */ - $"EE7E 8355 45D6 87C8 28CE 7B33 92A2 D8D6" /* ~UEև({3 */ - $"E8DF EF94 500A 0D78 DE9F 8657 F7BD 7F40" /* P.xޟW.@ */ - $"5E07 0789 EDC7 F3A5 A0BF 3929 6B19 A460" /* ^..󥠿9)k.` */ - $"7A50 91FF 42EA 5F12 DFA5 E0A0 84CC E869" /* zPB_.ߥࠄi */ - $"BB1F 6EDA 2238 5DB0 7F22 3521 F04B FF6B" /* .n"8]."5!Kk */ - $"6827 722A DD5F 3C9D D3F4 2BE3 614D 0A3F" /* h'r*_<+aM? */ - $"62C4 E6AC 95CA 5946 37E8 BC76 97FD 5167" /* b欕YF7vQg */ - $"C970 D4C7 0655 C470 5913 DBBD AA8C 87A4" /* p.UpY.۽ */ - $"3C63 0B7F 54CD 391E 574D F2D5 C728 20B7" /* .O..ZS.8 */ - $"3615 80D7 428E 90F6 4620 02EA 4590 DF22" /* 6.BF .E" */ - $"4B70 2FB2 CADA A529 F7FA E7C6 BC99 DFCD" /* Kp/ڥ)Ƽ */ - $"5EE7 D677 B5BE F819 6A55 6070 E1A9 DF53" /* ^w.jU`pS */ - $"3F82 0229 B6B7 D247 1967 8313 056F 9D27" /* ?.)G.g..o' */ - $"753E E4DD EB7F 1372 C0F7 D72E 349B 2F9B" /* u>..r.4/ */ - $"686C C9AF 0896 0865 7A3A 5A9D 807F 292A" /* hlɯ..ez:Z.)* */ - $"8DDA A776 4B3C 0993 532D D682 A41B 9DC2" /* ڧvK<ƓS-ւ. */ - $"5113 9D60 934B 2055 D671 C6C4 1252 3CEF" /* Q.`K Uq.R< */ - $"C72F AC19 4BED 185D BC60 5957 F81B 8278" /* /.K.]`YW.x */ - $"20B5 9173 4A1B FDC9 295D 54B7 8AFE 6938" /* sJ.)]Ti8 */ - $"FE49 BA78 3225 49A1 4243 823C 52B9 8489" /* Ix2%IBCO- */ - $"B640 95E8 70A5 B577 8C1D 99D5 797D D482" /* @pw.y}Ԃ */ - $"E23A 56DD 644D 9623 FEE2 63D2 A3DB E146" /* :VdM#cңF */ - $"FC39 35A7 6C28 63D8 5240 0C80 0000 0000" /* 95l(cR@..... */ - $"0001 4095 99D3 7A7A 0A05 B673 69BC DA9C" /* ..@zz.siڜ */ - $"A108 DDEA EE48 6385 0790 FEA1 1AFC 2CED" /* .Hc.., */ - $"2225 BE73 2ED7 00BB 2301 80FE 09DF E78E" /* "%s..#. */ - $"6FE6 4743 A0EE 0A03 4C9E F046 CDD8 E7F1" /* oGC.LF */ - $"DB3F 1B67 F6E1 1F31 8096 90DF 5110 40B0" /* ?.g.1Q.@ */ - $"0000 0000 0000 0000 C0B9 E0FC 41FB A11C" /* ........A. */ - $"4696 89A0 DE42 F8C7 27D0 3F03 AA51 70FD" /* FB'?.Qp */ - $"DC5F D7B9 AFD3 A0F3 7BAA A910 9E5C 259E" /* _׹Ӡ{.\% */ - $"E4FB 8F8E 01C1 96E2 0768 FE5A 0A43 E2F8" /* ..hZC */ - $"DA74 9500 C241 D1F6 3EFF 3F06 586F A511" /* t.A>?.Xo. */ - $"CCFE 8FE7 61E1 C392 D001 3F52 1CA8 CC23" /* aÒ.?R.# */ - $"93F0 27DF 893F 4AC1 06C3 34DA 8953 BBC0" /* '߉?J.4ډS */ - $"84C0 4843 27E0 067E 5EBF FF7A 1540 4C0E" /* HC'.~^z.@L. */ - $"FA6C 44A1 A7BC DB24 6AD7 C367 EC93 33BF" /* lD$jg3 */ - $"FECB C1DF 83CC 5BF7 A7C0 DF62 2EFA 4283" /* ߃[b.B */ - $"6E49 2492 4924 9249 2492 4924 9246 A4A5" /* nI$I$I$I$F */ - $"7754 9685 B091 D8FF 1549 CF90 2079 3AFB" /* wT.Iϐ y: */ - $"E925 85CC 62A2 E49B 476B 47B9 319B 630F" /* %bGkG1c. */ - $"A6B8 182C E282 D1CD 920A 4EB3 21BF 943C" /* .,͒N!< */ - $"27BF CCDE BD6E 481A 188C F70B C257 8118" /* '޽nH...W. */ - $"FBF7 FF78 F422 A3DB AE81 4980 0000 0000" /* x"ۮI.... */ - $"0000 0000 0000 1EE1 BFBB C300 0000 0000" /* .......Ώ..... */ - $"0000 0000 0000 14FB 3FE1 1B7A D142 E13F" /* .......?.zB? */ - $"5B6F 704A 61CF 957D 258E F744 FB26 8356" /* [opJaϕ}%D&V */ - $"74AD 1DDB 02F2 CF85 7AEB 3A06 6F12 084E" /* t..υz:.o..N */ - $"8E93 D6DA E4FE 9FBE 2D16 1C87 701F 55C3" /* -..p.U */ - $"9966 3E8F 36CB 6D9F F3F6 F8D3 B3B9 E2C1" /* f>6mӳ */ - $"1019 C6E6 8FFF 7FDC 6948 D3AB C944 C64A" /* ...iHӫDJ */ - $"8000 0000 0000 0000 000A B0CB 3806 445C" /* ........°8.D\ */ - $"7110 4CDE 3651 AC94 777C 8AB0 5382 04AF" /* q.L6Qw|S. */ - $"32E5 68C2 122F 8A5B 12A8 FF39 CF5E 72FB" /* 2h./[.9^r */ - $"EFD4 1669 47C6 525E 88EF 0AAC 1EE1 98B6" /* .iGR^¬.ᘶ */ - $"0BFF 7FAF 8A4B 7158 F7D7 1707 DE93 841E" /* ..KqX..ޓ. */ - $"3C82 3260 1FFF 1C8B 6A6E 8C66 0000 0000" /* <2`..jnf.... */ - $"0000 0000 0000 0121 EF03 234C 3124 0000" /* .......!.#L1$.. */ - $"0000 0000 0000 0000 077C 5957 204B A2ED" /* .........|YW K */ - $"59B8 F3C4 CC60 8A58 7E23 0B9F A0FD 1DC8" /* Y`X~#.. */ - $"8E0F FE2B 5F9F 12D8 09B3 57BB 7818 3CF5" /* .+_.ƳWx.< */ - $"D579 D427 5198 BD86 E2FC 8775 915B 37A5" /* y'Qu[7 */ - $"B2E6 6BD8 8404 31D9 4C54 3621 6561 5C3E" /* k؄.1LT6!ea\> */ - $"4A80 0000 0000 0000 0000 0014 D22D 6758" /* J..........-gX */ - $"336C 63A1 C13F 3E94 9877 8E90 4E5D 0C70" /* 3lc?>wN].p */ - $"F80A 4262 C2CC C7E4 DAE8 526F 393F 4558" /* BbRo9?EX */ - $"5CC9 5DDA B2FF 7ED5 F809 3A02 F1EE 2760" /* \]ڲ~:.'` */ - $"FF7E 5037 F054 4A1B 9602 92EA 8D26 A198" /* ~P7TJ..& */ - $"9C4F 8238 A60E 7734 20F8 18FE 478F 5403" /* O8.w4 .GT. */ - $"1658 618B A80F 879F 4A98 E809 DEB2 7CE9" /* .Xa.J޲| */ - $"9724 407B B8C8 A48D 4F33 9126 751B 9FC2" /* $@{ȤO3&u. */ - $"0283 44C3 5AFD 9546 FCE2 4212 4F5B 01D4" /* .DZFB.O[. */ - $"6E53 A032 DA91 40F4 4BDE 0C23 FF1E D5DE" /* nS2ڑ@K.#. */ - $"B543 59DC C0DC 759A 6043 5883 A5FE C785" /* CYu`CXDž */ - $"BA68 9F46 C21A 4C50 20E3 0488 FB34 1043" /* hF.LP .4.C */ - $"FC68 562B 635A EE8D E334 0C6F 25A9 E4C9" /* hV+cZ4.o% */ - $"3484 2AC2 6188 7242 E3F6 AEAC 6F86 2DE2" /* 4*arBo- */ - $"C377 BD02 CB1C 9553 5485 6A5B E118 9BBD" /* w..STj[. */ - $"DC6B 2C92 C6CC C866 6E7F FE63 AB01 FE7D" /* k,fn.c.} */ - $"FF7F BB81 EA94 87BE B101 F468 0E30 F111" /* .ꔇ.h.0. */ - $"7BC9 FA0D F87F BDD0 811B 8588 1AE7 8387" /* {..Ё..烇 */ - $"5C06 B3A9 E2ED 6E5B B524 35AA CBFF 50D6" /* \.n[$5P */ - $"49D9 6918 3837 59BD E7CC 8796 B0AF 2729" /* Ii.87Ẏ') */ - $"0512 5A97 66FF 1A85 E004 1882 0108 EA41" /* ..Zf.....A */ - $"BBCC 15E0 254C 59AF 877D 0722 15FB ADA1" /* .%LY}.". */ - $"84C2 9B83 DD5B C6B1 EE29 084C 08F7 06C8" /* ›[Ʊ).L.. */ - $"4F07 9818 6BF2 66E2 582B 2F7D 29AD BAFA" /* O..kfX+/}) */ - $"8F9E 0AC8 60AE D10E 3E49 17BF E015 0C5E" /* `.>I...^ */ - $"5C51 5D5B 5BC1 6C83 C428 4505 E9BB 61CB" /* \Q][[l(E.a */ - $"D7C2 F3C6 C102 73F5 409E D0CF B43E E497" /* .s@ϴ> */ - $"C1E0 707B 3F6F EAA8 2F10 9285 7D9D 9F81" /* p{?o/.} */ - $"303D 3A70 2B3F 4A45 558D 63F6 EEB9 CF21" /* 0=:p+?JEUc! */ - $"52C1 27C2 8439 0BE2 BE1F A553 A1C7 E44C" /* R'„9..SL */ - $"5422 9BC0 356D 1B40 E53B 3064 AA69 F464" /* T"5m.@;0did */ - $"7AA7 4E56 F7E2 7AE5 CB6E E538 8582 1927" /* zNVzn8.' */ - $"019D B4B0 E6D9 0F0E 9670 7723 62CF C422" /* ...pw#b" */ - $"DD53 ED12 92AE 20B0 6B63 6CB3 C596 4F4E" /* S. kclŖON */ - $"18B6 FD06 93B2 6F73 A740 770D C39F B873" /* ..os@w.ßs */ - $"598F 3667 6F7A 29E9 9E6F 9D04 48DD A175" /* Y6goz)o.Hݡu */ - $"2AFC 61BD D706 2A8E 9789 F513 B8AF B8EA" /* *a.*. */ - $"2426 7EDF 1EFA 1D19 7A50 D22F D15E 76FE" /* $&~...zP/^v */ - $"CD34 19AD 8126 775C A5FB B209 9658 F850" /* 4.&w\ƖXP */ - $"F2FD A65F B487 9F50 7FF0 12FD BA8B FB6E" /* _P..n */ - $"49F5 50DF C349 B4F9 F4D7 EDEB 53BE DEB0" /* IPISް */ - $"7F85 29FB 5DFF 36B9 BEDA 9BF8 3CF2 FDAE" /* .)]6ڛ< */ - $"DFB5 ABBE D3DB ED2B FDBA CFFB 7606 FB74" /* ߵ+v.t */ - $"D3F8 6B96 83BA F7ED EB3F 7EDE AFE0 EECD" /* k?~ޯ */ - $"FB5E 7F6E 807E DB9B F6BD F0FE D32B EA21" /* ^.n~ۛ+! */ - $"EFA8 1EFA 823F 6DCF FB6C 8BEA 6CFD B5AF" /* .?mll */ - $"0774 CFDB D337 FB7A 3F83 BA5D F51F DF55" /* .t7z?].U */ - $"47FB 690F DA86 F791 DDD6 2CCB E6B8 C536" /* Gi.چ,6 */ - $"D512 AD5E 1B08 0B8A 8D03 2F75 60E5 6BF8" /* .^..../u`k */ - $"447B C66A 7EC2 7912 B45F 8E48 277C D8E1" /* D{j~y._H'| */ - $"809C 5755 D718 BAAC F891 2AE5 F97C 3F5E" /* WU.*|?^ */ - $"0116 3A00 99F4 5896 E0EA B189 F5A5 7929" /* ..:.X걉y) */ - $"C491 B57F 2232 B0C2 52F8 89B1 DB2F B284" /* đ."2R/ */ - $"C1EE 0C43 EF76 FD94 F871 4077 7E19 EC36" /* .Cvq@w~.6 */ - $"BBFA 6DFF 3C0B 5A98 89B4 84BB 56DB 5FC2" /* m<.ZV_ */ - $"16C2 351A B46E AF45 AAC7 DD2E 97ED 970C" /* .5.nE.. */ - $"76D8 F8D0 42EB E639 28E8 BE33 A530 3B58" /* vB9(30;X */ - $"2374 6B1C 97B0 1CD5 ACD5 615F FD30 62C6" /* #tk..լa_0b */ - $"899A 977D 4B74 CAB1 E9EE 6588 4E67 8733" /* }KtʱeNg3 */ - $"B359 BCC7 DC7B 9884 E4A8 78CB 77E7 675D" /* Y{xwg] */ - $"FF2D FCE4 7744 BDD1 A833 6BEC C481 2DA8" /* -wDѨ3kā- */ - $"3D1C 5D57 7595 1DEB 2278 31AE 4188 B1F2" /* =.]Wu."x1A */ - $"54E1 113D DA75 96ED 71FF 1577 7820 4D22" /* T.=uq.wx M" */ - $"2BD9 3841 A416 96A4 2549 1A9D 3A55 8E39" /* +8A.%I.:U9 */ - $"A929 4B4E E11F 0F88 8BB6 7E08 2210 9D21" /* )KN..~.".! */ - $"92BF 623B B974 D371 0208 1489 5713 0F66" /* b;tq...W..f */ - $"3C4C 8394 72A6 08A1 3D86 BA0C 198B CE8B" /* 8.Ę!m1pW */ - $"0B3D 429A 6CFB 0819 EB4D B9D2 549F 6601" /* .=Bl..MTf. */ - $"2436 5BEA 9DAC BBDA AB3A AB4F ABFF 768D" /* $6[Ꝭګ:Ov */ - $"E220 E451 7E45 49C5 21FD B2E6 DEFD 2505" /* Q~EI!%. */ - $"836B 3500 54D8 50B8 7538 C5BF B951 7FB2" /* k5.TPu8ſQ. */ - $"F927 CBB1 7AA1 D0BD 51E2 D7F7 C440 5DA0" /* '˱zнQ@] */ - $"89EF FEEE BF2E A5E4 F98A B652 F25A D1DC" /* .RZ */ - $"482A 40CB A288 250A 22CA BCB4 815D 077E" /* H*@ˢ%"ʼ].~ */ - $"229E 59B2 8249 D336 A3C1 5D5B FAE5 483C" /* "YI6][H< */ - $"67F3 255E 1530 AFB1 D900 48FE 254B C54E" /* g%^.0.H%KN */ - $"42DC EE54 066B CE83 B1C9 F021 2031 8DF1" /* BT.k΃! 1 */ - $"FE58 9315 B761 79CA 409A 6CD6 337A 14A9" /* X.ay@l3z. */ - $"8622 90BC 3474 727C 66CE 09C5 61B4 A386" /* "4tr|fa */ - $"7509 819F 6EEB 5FCC C0A7 084A 7742 A6E3" /* uƁn_.JwB */ - $"F69A 90CA 24AD EB53 60AB 5FD0 FD6F 3DE6" /* $S`_o= */ - $"44CF 80FB A400 B71F 1DD4 C690 A3DB 54CF" /* Dπ...ƐT */ - $"F492 7EC7 540C 048F 3D35 FD63 7593 751B" /* ~T..=5cuu. */ - $"F88F 4B7D E355 6685 FD5F 2743 8DF3 D839" /* K}Uf_'C9 */ - $"0894 99DB 1FAA 22B2 8800 8C9F D91F E60B" /* .."... */ - $"0EEE 2870 2932 2AE5 F401 11F0 8B2B 53DB" /* .(p)2*..+S */ - $"8028 E39D 744F E70B 11F3 A220 ABF4 FCD5" /* (tO.. */ - $"37C9 0AC8 8749 215E 1D89 4022 96D0 04FF" /* 7ȇI!^.@". */ - $"0C57 AC3D 351A 8582 EBA4 EA2B B65B A14B" /* .W=5.+[K */ - $"048B E031 DE15 251C 669F 8457 FF38 D131" /* .1.%.fW81 */ - $"0027 BB20 9721 6636 A375 AFBA AF7B BDBA" /* .' !f6u{ */ - $"05F3 3114 E55E DAA9 219F 9516 F3DF 12B4" /* .1.^ک!.. */ - $"DA3F 83DF 13A0 9900 3FA6 17E9 B014 E404" /* ?..?... */ - $"434D 02D4 4283 D73D F4D1 5D95 8B25 6A6A" /* CM.B=]%jj */ - $"CD5E BA93 82DF 1A30 4B0D 0E21 65A1 0001" /* ^.0K..!e.. */ - $"2869 F06A 8949 311F DB03 39EB E8E1 5BFB" /* (ijI1..9[ */ - $"F11C 05C6 2469 BAEA 4516 4CC4 DAF5 927A" /* ..$iE.Lz */ - $"2CEB 3150 DB6F 4DE2 8EED 59C0 604F 9AE5" /* ,1PoMY`O */ - $"E136 83B0 F348 3D1A B44D 3A8E D77A B0DE" /* 6H=.M:z */ - $"5267 1055 24F7 3C3D EB3E 08EF 97F9 4B29" /* Rg.U$<=>.K) */ - $"454F 1B5D 4A6E 56E1 0F90 00A1 4467 7454" /* EO.]JnV..DgtT */ - $"B556 362A 9A19 9E35 19E9 BFDF E2AD 91D6" /* V6*.5.⭑ */ - $"7FB6 95B9 F19D 8D07 2FAF 3162 D880 0AA7" /* ../1b؀§ */ - $"C9C4 94AD C49A 1231 2D9F 780F 6E3E 57D2" /* ĔĚ.1-x.n>W */ - $"8C1C 582C 179A 721C 7063 F056 F938 4EA1" /* .X,.r.pcV8N */ - $"F3E4 E458 D254 280F 92CA ABDC 4ECF 3EB7" /* XT(.ʫN> */ - $"95DF A3B8 45C0 1427 BA54 B2E2 D1BC B67D" /* ߣE.'TѼ} */ - $"5A0F EE12 37D4 BE1C 5785 A90D 2E62 B301" /* Z..7Ծ.W..b. */ - $"F66D A637 374B 17DA 7446 C318 3B11 4F50" /* m77K.tF.;.OP */ - $"ED27 AEB2 D8F6 C3E4 AB48 5E7C 1D46 9463" /* 'H^|.Fc */ - $"E7BA 9296 7BFA FDBB 39F2 7E86 1A5D 8FFA" /* 纒{9~.] */ - $"7E06 FC92 3472 7950 8B67 8329 FA9F 47AA" /* ~.4ryPg)G */ - $"51F3 01AD A6DA 224F E711 AF6F BA8F FA86" /* Q."O.o */ - $"FF61 EBD1 5613 B076 3543 3515 FF1B 1E9C" /* aV.v5C5... */ - $"CE78 6A36 7CCF FD63 E9E3 00E6 EA60 1DBE" /* xj6|c.`. */ - $"42FB 3E66 D69D 8BA6 A0E6 13E1 2087 20D7" /* B>f֝. */ - $"7941 E3C4 C7C6 67FF 2C9C A486 253A C206" /* yAg,%:. */ - $"F961 4A0E D9DD D32A 6D67 A012 B1A2 B549" /* aJ.*mg.I */ - $"3F58 8BA1 CA98 94EB 6099 570C D139 09AA" /* ?Xʘ`W.9ƪ */ - $"8DEB C31A 0812 5DAD 2926 6846 D789 4430" /* ...])&hF׉D0 */ - $"4931 16B5 0804 52F1 040D B0A7 DDD7 7052" /* I1...R..pR */ - $"4269 C765 98AA 3941 F9EE 987A 2EAD 46BE" /* Bie9Az.F */ - $"AA2B DD79 D9F9 7AF7 9318 B633 97CC DB93" /* +yz.3ۓ */ - $"5AF7 23D4 08E5 1FD7 EA45 85E9 4C98 77B6" /* Z#..ELw */ - $"0038 8756 6C8F 1A76 8D36 D67C 0BBD 248F" /* .8Vl.v6|.$ */ - $"8465 4CC4 7B7A C1B7 6348 F763 66A7 F04E" /* eL{zcHcfN */ - $"FF4E 1C72 1053 323F 9E55 F75D 4097 9C24" /* N.r.S2?U]@$ */ - $"AD5D 3C1B 766A 50A8 7252 6563 2687 8251" /* ]<.vjPrRec&Q */ - $"8AE2 2EAE 6AA9 6439 2831 281E 034D 7999" /* .jd9(1(..My */ - $"F46F 47C1 911D 553A D887 0E8F 6E83 1B48" /* oG.U:؇.n.H */ - $"F0D9 C566 C0FF 0F02 5E68 EA76 7381 25B1" /* f..^hvs% */ - $"D388 A375 370B A655 625B B71A 191C CD9D" /* ӈu7.Ub[...͝ */ - $"F3CA 83B2 88D6 3712 B3E3 6CEA 19DC 3295" /* ʃ7.l.2 */ - $"3398 DF4F 1279 B346 1DD8 ED24 186F BEE1" /* 3O.yF.$.o */ - $"8FD4 5FAD EAFF 6960 DE17 A0A4 B89E 7CF3" /* _i`.| */ - $"C360 9DA8 91BF 470F ECC0 C0AA E260 3430" /* `G.`40 */ - $"EF4E CAD6 F964 05B0 8E27 C1F6 7516 4350" /* Nd.'u.CP */ - $"B87D 7D16 703E 7972 1232 2E0F 6577 664C" /* }}.p>yr.2..ewfL */ - $"8FA6 1414 7FB2 A33D A69E FD2F CF21 FC8F" /* ...=/! */ - $"23A5 6AED 3E28 34A0 F73F F7D6 7F7C 5B6B" /* #j>(4?.|[k */ - $"0596 8B6D BACA 52DF 8E72 CDBA E221 7092" /* .mRߎrͺ!p */ - $"A3AB B99D 1EE3 3F21 1AD2 0F0B DC5A 8BE1" /* .?!...Z */ - $"9E35 D891 9A60 EF28 5934 FA3B 8009 DC42" /* 5ؑ`(Y4;B */ - $"11BE 487F D776 AF26 0EBD BF3E 8DCC B940" /* .H.v&.>̹@ */ - $"2523 D6E1 447F EA8A 5F66 DE0B 0962 249E" /* %#D._f.b$ */ - $"165D BB6D 1EBD 1237 021B F903 DEEF 78FE" /* .]m..7...x */ - $"B3F3 76B7 429F 336D 0EFA FF47 5CBC E3DF" /* vB3m.G\ */ - $"FC44 41BA BC9D 67AE 0B43 D817 FBCE 4F36" /* DAg.C.O6 */ - $"8209 CCB5 38F6 712E 7DEA 4E9E 4B38 3B80" /* ̵8q.}NK8; */ - $"7B16 28E3 AB59 340E 93F0 4C65 C281 A4F1" /* {.(Y4.Le */ - $"08E4 26A6 31AA B6A4 F784 BA8E C7FA 8919" /* .&1. */ - $"4B19 FA98 09C8 3C79 27DA CB39 881C 3B0E" /* K.oNs^)J */ - $"782D E8F2 91C9 E628 322C F20C 2D0C 73DD" /* x-(2,.-.s */ - $"F093 4ED7 63DF E121 E7B9 DB7E 530D E3BD" /* Nc!~S. */ - $"3469 29CE 5768 BE0F 1E91 46B7 00A0 CC2E" /* 4i)Wh..F.. */ - $"183D 7D57 762C 062D 0707 EBA4 177D 73E8" /* .=}Wv,.-...}s */ - $"FA30 83A6 479B AA9A 702E B8FD 9B54 0FF3" /* 0Gp.T. */ - $"8222 1EB0 4CDD 4CF7 F0AB 8972 B655 9426" /* ".LLrU& */ - $"4EEE 3B88 A6D2 F8B9 6845 0467 D606 9DDD" /* N;hE.g. */ - $"C547 A61F 71E7 5A8E 6B83 51FD B2C1 A732" /* G.qZkQ2 */ - $"A6EA A0AA 6D13 E80B 0EC4 5DF4 348F FF6E" /* ꠪m...]4n */ - $"2289 CFB4 1AE2 18D1 340F B29B E1FF 16B1" /* "ϴ..4.. */ - $"0F0F B5AD 260A 7FD9 B1F2 3D0C 404F 75A8" /* ..&.ٱ=.@Ou */ - $"E4DB 52EE 259B D762 E5E5 4FFD 22AC 4856" /* R%bO"HV */ - $"9C62 8DDB F5D8 58F8 4EC7 1110 30EC E0D8" /* bXN..0 */ - $"7FED 0176 FEF2 53B3 75C6 34E1 A3A7 79DA" /* ..vSu4ᣧy */ - $"1FDC 42EC 83B2 F3EB 056C E41B 4E65 3699" /* .B샲.l.Ne6 */ - $"4BD6 1AE3 85A9 DBF6 89D4 39B0 79F9 8877" /* K.ㅩ9yw */ - $"161C 2CB5 3F3C 294B 8CA3 A6F6 556C 4CAD" /* ..,?<)KUlL */ - $"A752 918D 7E61 BA54 02D2 CF5C AEBE 1A0B" /* R~aT.\.. */ - $"B75C A9CA 9876 AB0B 6028 4D8E D46C E479" /* \ʘv.`(Mly */ - $"A186 EA09 496E 0935 04E2 4C25 FA18 270B" /* In5.L%.'. */ - $"A054 DE1C 1BD8 A089 9D95 1335 E93C 7C21" /* T..ؠ.5<|! */ - $"435E A570 3C42 AA88 0075 BB20 20AF 90EC" /* C^pFF|S.+F */ - $"5BD9 2BFF 5F26 72DB 523D D0FC CE49 47B0" /* [+_&rR=IG */ - $"D98B 4D36 1B60 7C3A 0707 F46A 8565 4CCB" /* ًM6.`|:..jeL */ - $"5DC1 A50D C039 BF24 7418 78A7 6D4F DE55" /* ].9$t.xmOU */ - $"1CB8 B787 158C 6C4D D840 920F 3130 7A92" /* ..lM@.10z */ - $"1CF4 1B74 BC2B 8954 0A80 9636 BFC3 6330" /* ..t+T€6c0 */ - $"3E7F 7E4E A811 39F2 3D56 10D3 6A76 4E20" /* >.~N.9=V.jvN */ - $"F646 5CD3 9166 D2D6 046F E398 A934 2D04" /* F\ӑf.o㘩4-. */ - $"2E01 C602 1332 8274 6AE2 D5C9 6226 30B3" /* ....2tjb&0 */ - $"07DB FDF3 B3BB 6C31 B162 FF63 0639 8E6F" /* .l1bc.9o */ - $"3501 A54C 1AA6 42EB EDE7 885E EE2F A6D9" /* 5.L.B^/ */ - $"B74A AE20 8FFB 6FCF A537 642D F17F A45E" /* J oϥ7d-.^ */ - $"EE37 DE05 7569 A81E F464 A35B 603B 4F40" /* 7.ui.d[`;O@ */ - $"D00F C3D2 D04A F943 AC3C 37E2 1B2B A1D3" /* .JC<7.+ */ - $"09D6 A92B F7CB B2FA 9FF7 97F2 83F9 BABC" /* ֩+˲ */ - $"E4BE F015 E804 97FC A16F 6E8B 9004 8424" /* ..on.$ */ - $"04F7 1295 0A15 3C1A AA5D 6A75 372A 0BB4" /* ...<.]ju7*. */ - $"4849 DD4A 012F D969 23A9 FBA7 C3EB D29F" /* HIJ./i#ҟ */ - $"5CE0 BD6F 8436 26BB 1B52 3BCB DCAA 0791" /* \o6&.R;ܪ. */ - $"02B3 8EC7 5A89 D402 C9FF 058E E2C8 AD72" /* .Z..ȭr */ - $"01BF D9B3 FA52 B000 0000 3090 8B4E 8809" /* .ٳR...0N */ - $"9E4F 59A7 8021 D030 169B 78E6 55B4 9FB8" /* OY!0.xU */ - $"48A1 D2F4 BE8E A948 A89E 5E3E BE56 AE8C" /* HH^>V */ - $"BF6C 6485 F435 4906 BE37 4D88 589A 85C0" /* ld5I.7MX */ - $"5278 59EC 1FED 3652 3FE0 5229 0524 D686" /* RxY.6R?R).$ֆ */ - $"1E5E 14D9 8C56 8742 9625 36BB 4674 0391" /* .^.ٌVB%6Ft. */ - $"9647 FCC9 30C4 6D0D 5812 1271 E9C8 E89D" /* G0m.X..q */ - $"7F9B 3420 0269 5F58 4554 F964 BDDA E9F3" /* .4 .i_XETd */ - $"973A 5B5F 4C59 107B 2D9E 87CB D896 1F13" /* :[_LY.{-ؖ.. */ - $"AC52 F00D 3600 9104 3FF2 399A 0158 5153" /* R.6..?9.XQS */ - $"139A A5C2 51CC D2C7 D082 C2A0 E35B FE05" /* .QЂ [. */ - $"06C9 DBB4 7036 39DB 80AF 4642 9F53 170C" /* .۴p69ۀFBS.. */ - $"2856 38D5 0FA7 B562 4ED8 3BB5 B48A B1C8" /* (V8.bN; */ - $"B20B 4B42 4499 C5C1 242B A1BA CB74 D8F1" /* .KBD$+t */ - $"1CF1 241E 7A2A B847 111D 13DC CD3C 05A3" /* .$.z*G...<. */ - $"024F 25B5 41E2 0A15 E1C4 1A0E A5D8 0742" /* .O%A....B */ - $"A359 2372 FD88 7447 1DB7 F766 5B7F E63E" /* Y#rtG.f[.> */ - $"26B8 BC6E 7B72 E331 2BE1 73BD 04A0 E941" /* &n{r1+s.A */ - $"45EC 9039 8769 8BFF 1624 8D43 CA24 9D0D" /* E9i.$C$. */ - $"A05B F467 7401 E777 0608 C4A6 A698 9A9B" /* [gt.w..Ħ */ - $"7066 11D3 606F 857E 18D8 D9D3 E226 38C0" /* pf.`o~.&8 */ - $"D89B 09D9 A2F1 0171 BAC9 D7BF AB2E BD58" /* ؛٢.q׿.X */ - $"7178 6CC2 608D 447D D92A 621C 1A82 B764" /* qxl`D}*b..d */ - $"2ABE CBE8 07C0 E2A6 9B83 46A8 1109 FC87" /* *.⦛F. */ - $"F083 9598 26AE 8847 7E22 278D 9311 59FC" /* &G~"'.Y */ - $"2995 1D44 BA58 24BC 2A99 3946 0E00 9144" /* ).DX$*9F..D */ - $"9113 0297 29E3 A7B5 B937 2D23 8405 86ED" /* ..)㧵7-#. */ - $"29F1 5254 6A8C 0FB8 4B13 F6C3 6028 2C14" /* )RTj.K.`(,. */ - $"3B80 E317 225C 7A9B 405C 7E95 A2E4 311B" /* ;."\z@\~1. */ - $"076A D7B8 A4B5 225A 1F29 FAA2 8239 D98F" /* .j׸"Z.)9ُ */ - $"071A F302 DA24 AE80 2AC0 D108 035D EA76" /* ...$*..]v */ - $"2F7E 850F 9E87 6B19 B2F1 F1E5 F5B3 A5AF" /* /~.k. */ - $"35BB D867 8257 8A48 5E4F 6983 E22E 6DAD" /* 5gWH^Oi.m */ - $"D361 1505 ECF2 3F3C DB84 1861 E5AB 6793" /* a..?<ۄ.ag */ - $"910D 8F56 6BB5 FD17 29DB 242A 6946 8022" /* .Vk.)$*iF" */ - $"7DAF 8120 02EB C840 3765 69EC BB8B F2FF" /* } .@7ei컋 */ - $"6031 7BE4 EFC4 BECD 7BD7 CB0A 8B8C 75C2" /* `1{ľ{‹u */ - $"E63A F4E4 B05B 1442 0CB1 BEBD E078 84F5" /* :[.B.x */ - $"3D95 24FA 952F 949B AD72 01B7 1CC7 4CA6" /* =$/r..L */ - $"78C2 BA05 B757 517A 5CB1 A380 0C23 0680" /* xº.WQz\.#. */ - $"3113 0CBA 23B8 AA48 F832 B74F 997E 6E03" /* 1..#H2O~n. */ - $"D16C 577F 968F E9A4 73CA DA79 07B3 A5F1" /* lW.sy. */ - $"2D20 C13D F821 62F9 41A0 A7AA 472A 368A" /* - =!bAG*6 */ - $"28EE 7686 F7B4 D5CF 225E 004E 709F C4E8" /* (v"^.Np */ - $"FCBC B778 C976 A1E0 1968 1EF9 E998 2DC2" /* xv.h.- */ - $"1693 C645 A4F5 787A 5B10 45C0 F010 8596" /* .Exz[.E. */ - $"A0F6 E8AA 1BAC C958 C0F6 101E 0C4D 2E61" /* .X...M.a */ - $"B76E 4019 58DD 3058 000C 2375 6EBC 6599" /* n@.X0X..#une */ - $"BEA3 9ADC 0002 F98F 24B3 B036 EA0D F2FD" /* ..$6. */ - $"6823 E10A 59D7 5D0B F6C0 EFB2 7D9D A684" /* h#Y].} */ - $"3084 4AD6 92F2 BFB2 57CA 7294 FF2D 53C8" /* 0J֒Wr-S */ - $"8D05 254E 2360 582F CE0C E209 240D FAB4" /* .%N#`X/.$. */ - $"C638 2103 7462 2AF1 5461 2036 09B4 294F" /* 8!.tb*Ta 6ƴ)O */ - $"52A6 6553 F6B7 85F6 E77F A8B7 058C F201" /* ReS... */ - $"19BA D75B 6612 0013 CFA6 F54F 8855 C000" /* .[f...ϦOU. */ - $"00BE 57DE C13B 77B0 AF81 F95D 8E88 7224" /* .W;w]r$ */ - $"002F C7BE 1D06 F540 58EF 1909 1D8F 037F" /* ./Ǿ..@X.... */ - $"E973 290F 641E 8849 F996 EA66 D15C CA23" /* s).d.If\# */ - $"C620 3090 94D8 F95F C58C 720B 7FFE 206C" /* 0_Ōr.. l */ - $"A3E0 EE49 AE89 4586 6617 FE87 4D7B D300" /* IEf.M{. */ - $"4CF6 E77F A882 E041 362F 710E AC03 D573" /* L.A6/q..s */ - $"69FF 7480 0018 484B 0D10 C800 0000 0C24" /* it..HK......$ */ - $"183F ADBF D900 0184 8481 E82C C758 1848" /* .?..,X.H */ - $"4840 6806 1212 B020 EA50 0818 484B F6E7" /* H@h... P..HK */ - $"7FA5 E774 6249 2F3D 5FF9 2FC0 0C24 1656" /* .tbI/=_/.$.V */ - $"1B91 8000 1846 D5F4 CA01 40C2 3F26 3D84" /* ...F.@?&= */ - $"7B4A 811F 08D6 B47D 05C2 4402 D57B C1FC" /* {J..ִ}.D.{ */ - $"7D32 E6FE 8125 F24E 514B 2820 7323 F96F" /* }2%NQK( s#o */ - $"B1F9 CDBD 94E4 C9BF 81D6 5A26 1C08 2131" /* ͽɿZ&..!1 */ - $"FF58 608E A4BB BEFD 703F C3EA B596 2AEA" /* X`p?굖* */ - $"48B2 2319 2F7A B9BC A14D EAB4 49CF 89E9" /* H#./zMIω */ - $"D312 5979 1910 6519 C45E 4B88 F709 D65D" /* .Yy..e.^K] */ - $"BF0F 86DC C883 8469 9757 7FC7 FB91 A851" /* .ȃiW.Q */ - $"7834 0232 03F5 F552 B022 E799 431E 3FE8" /* x4.2.R"C.? */ - $"BE7C A37B AAE1 D04F 9795 EA98 CAB0 6816" /* |{Oʰh. */ - $"047F 244A 2BD3 E0CF B862 B172 B1B3 F027" /* ..$J+ϸbr' */ - $"6505 A5AA 6AB2 5F8E B98F 85CB D487 2603" /* e.j_ԇ&. */ - $"BDA4 4C6D 4B74 0A12 117F 6137 6A30 37CE" /* LmKt...a7j07 */ - $"0441 188C 63FC 46ED 5C9A B6A0 9012 6450" /* .A.cF\.dP */ - $"A042 C4D3 8E69 8930 0797 25B3 B70D 5C62" /* Bӎi0.%.\b */ - $"6A83 3964 5EF1 4A28 508D FF7F E847 17D0" /* j9d^J(P.G. */ - $"7C91 F4BC AA82 5462 99EF FF79 5A7A E45E" /* |TbyZz^ */ - $"98FF 5B1E 90FE 7F80 9453 7AD1 4A63 8FFC" /* [..SzJc */ - $"1B61 796C 4B90 7FE9 1959 752B 8579 95F8" /* .aylK..Yu+y */ - $"C5B9 7EC6 2D24 5185 1BCE 12D6 B418 B42C" /* Ź~-$Q..ִ., */ - $"D40F 7AF7 657E 5184 9CAA 8834 B65C 4785" /* .ze~Q4\G */ - $"B934 7C3A 8000 0000 99F5 3F06 3790 6AF7" /* 4|:...?.7j */ - $"0769 9D8E F19F 4FF3 EDE6 D059 B97C A1F0" /* .iOY| */ - $"0CE2 4FAF B846 8CCE 52E4 E898 D2E0 00A3" /* .OFR. */ - $"CB3D F2B1 E7F7 0C30 FF13 DB29 474C C00D" /* =.0.)GL. */ - $"C6B7 6A2D 2F89 8E2F BDE7 F2BA C3DD 591B" /* Ʒj-//Y. */ - $"CEDE C7DD 35BA 492C BB53 2AF6 7315 AC30" /* 5I,S*s.0 */ - $"17D7 1C05 3AE4 4AB3 8D31 0DC9 7A9F 0A76" /* ...:J1.zv */ - $"B4EE 95EE 6CB5 1C6A FE4F D27E 0966 CE51" /* l.jO~fQ */ - $"8607 E144 F4AD E999 5480 05FF 7FC2 C645" /* .DT..E */ - $"D136 BB6E 89FA 9A2D F827 338F FEB9 B248" /* 6n-'3H */ - $"23A6 377D 0E53 BBF3 D290 3AD8 F58B CE4C" /* #7}.SҐ:L */ - $"24CA 8E49 76ED DA48 8856 904D C31F 305F" /* $ʎIvHVM.0_ */ - $"C441 7DAA 86D8 3FE1 5EA7 E20A CDBC 5F2A" /* A}?^ͼ_* */ - $"35DC 107F DDE2 D88C 7B38 D700 4C54 9C81" /* 5..،{8.LT */ - $"B8FD F39D 0F47 DE2B 6E17 7D4F E30F F60C" /* .G+n.}O.. */ - $"0895 5694 3006 1211 EFEC D7F8 F743 3D43" /* .V0...C=C */ - $"6BA5 7C06 9025 9188 E369 0FC8 94CB F38E" /* k|.%i.Ȕ */ - $"DF76 CA67 91C4 D786 F34F 1E56 332B 1404" /* vg׆O.V3+.. */ - $"B66B 2702 B13D 47B8 1FBD 38D7 A2DF 54EF" /* k'.=G.8עT */ - $"FD1C 00CC 5D05 5B28 3EBF 2FC7 7263 5880" /* ..].[(>/rcX */ - $"0364 4A0B 982F 4A13 A55F 5D64 61D2 110C" /* .dJ./J._]da.. */ - $"4319 318A 5BD6 94B7 DBA9 92F0 379B 0E87" /* C.1[֔۩7. */ - $"4561 92A0 0000 0000 0000 12FE B897 0ABD" /* Ea.......½ */ - $"B3C7 FEA8 AE43 B177 DA3F 2BA3 2D59 3358" /* Cw?+-Y3X */ - $"9FAE 567F E53B 2877 9FFF 7FFF 7FFB 4B90" /* V.;(w..K */ - $"C00D FEA3 7DF6 39C4 C825 2952 2C65 8FFF" /* .}9%)R,e */ - $"7E91 DB49 1333 7DEC 6471 1E2E 394E A080" /* ~I.3}dq..9N */ - $"C1C9 0DD4 62C4 4FC9 E332 BC0D F9DD FEAB" /* .bO2. */ - $"9D33 8271 2A01 8484 B009 6058 624E 2736" /* 3q*.`XbN'6 */ - $"529C A0F4 BCBB 846D 32FD 407C FA84 2D52" /* Rm2@|-R */ - $"21DC 1623 210B 0410 4061 212D 0386 04FF" /* !.#!...@a!-.. */ - $"7F72 1DFF 6F83 6A31 2B6E 0A6B D1F1 9A43" /* .r.oj1+nkC */ - $"F340 2C47 D413 DFAC FF76 46AC 4BDD 55F0" /* @,G.߬vFKU */ - $"2F9A 3BC6 613E 2F69 F45C 08F3 3FCB F83F" /* /;a>/i\.?? */ - $"F7D8 DC38 0F99 4764 0309 0948 41C6 1212" /* 8.Gd.HA.. */ - $"293B 5EA3 BE56 F760 BAEF 61FF 43D4 2891" /* );^V`aC( */ - $"A380 672E FF7E 4B98 FBFB 1ACD 90F6 4A7E" /* g.~K.͐J~ */ - $"3B14 E9F4 B1B4 4120 E600 AF42 0056 B131" /* ;.A .B.V1 */ - $"0310 EF4F EA97 E030 9090 A298 F514 CEFA" /* ..O0. */ - $"B200 0061 211A A495 FD76 5850 B8F7 1CF1" /* ..a!.vXP. */ - $"A979 F478 5BFF 7FFB E6D6 F6D8 03FF 7FFD" /* yx[... */ - $"2A36 38D4 BA43 6280 D508 C4BD 735D 1C6F" /* *68ԺCb.Ľs].o */ - $"2444 63E9 1C9A 969F 90A6 F34E D24D 94F2" /* $Dc.NM */ - $"1A09 F86A 2762 886F FBA0 96EA 1DC7 0364" /* .j'bo..d */ - $"6192 A000 0000 0000 0000 0000 0061 BE9F" /* a..........a */ - $"2C25 5C25 4958 1428 AA60 5ABF 5551 6084" /* ,%\%IX.(`ZUQ` */ - $"D319 B739 1DC3 F92F 03A7 CF66 39CC 13BE" /* .9./.f9. */ - $"100A 204E 9A06 CBD9 A8ED 9E4D CEED AE53" /* . N.٨MS */ - $"023D B3BF AC07 F70E F7DD 2601 E2B4 B214" /* .=..&.ⴲ. */ - $"3B1D 74CD 0F60 7063 EFC5 24B8 3B0F DF21" /* ;.t.`pc$;.! */ - $"2929 3755 A800 7D09 63D9 1548 5D89 6D22" /* ))7U.}c.H]m" */ - $"FAEF 37DC EB96 FF52 0018 EBDF 464C 8B34" /* 7R..FL4 */ - $"DF85 2990 1CF1 7C84 CEDC D384 5003 D5A1" /* ߅).|ӄP.ա */ - $"2797 DBDC FDFB 0E8C 3703 470D 1FD5 B974" /* '.7.G..չt */ - $"5A32 CF32 3D2A 0213 FDC8 8A0C B595 4840" /* Z22=*..Ȋ.H@ */ - $"C240 6E40 D585 AF4C 004A F98F FC90 E5BB" /* @n@ՅL.J */ - $"D6AD 2A34 0A6E 1D4D 933D 2221 80B7 C8EF" /* ֭*4n.M="! */ - $"7C61 2953 2991 F91A 61A3 B54E 56D2 77E1" /* |a)S).aNVw */ - $"1DB8 8B5F 5E9C 7D32 80A0 C23F BBE6 A2B2" /* ._^}2?梲 */ - $"D49F C777 4BE6 FDA6 7B0F 2983 E19B 84FF" /* ԟwK{.)ᛄ */ - $"4B7B 0DD6 A35E 60AD 632D D6D7 7030 0A9F" /* K{.֣^`c-p0Ÿ */ - $"0FA2 0820 8451 9624 D0FF 1FB4 9B81 61CC" /* .. Q$.a */ - $"591F 6D98 E1AF 16E4 AF42 1FE0 B7C7 30DF" /* Y.m.B.0 */ - $"CFFC EC14 15A1 B07A 4E11 ED5F BDB3 FD2A" /* ..zN._* */ - $"84B1 6901 4333 27BB 2E8C 3329 2064 A800" /* i.C3'.3) d. */ - $"0001 2FDE 803E 817B C369 A30F FCF0 FF1D" /* ../ހ>{i.. */ - $"89A1 2FD7 FF71 B63D 19EC 98DE DFE2 D9B8" /* /q=.ٸ */ - $"9D39 1737 4722 2A89 D291 623B 279F BF0B" /* 9.7G"*ґb;'. */ - $"E8C0 8AF8 CBE4 0011 5D58 29AB 34B0 335C" /* ..]X)43\ */ - $"36B2 1383 D820 11B8 22DF 56E1 27EF 932D" /* 6. ."V'- */ - $"30DE CC72 58E3 9BDD A88C 229A CBC8 A466" /* 0rXݨ"Ȥf */ - $"7C29 FDE8 E789 F28F 3258 A2DD 897B 1C6A" /* |)2X݉{.j */ - $"C048 306A EEA7 3DF0 F8D4 BECC CDBD 9E43" /* H0j=ԾͽC */ - $"A29D 8052 478B 6470 79B7 B38A 5743 CAE7" /* RGdpyWC */ - $"0BD4 0F4A 23E1 4C85 39C9 DEB0 75AF 151E" /* ..J#L9ްu.. */ - $"45D5 1681 2BA4 74C9 13B5 746A E399 9467" /* E.+t.tj㙔g */ - $"E6B9 D503 7F7C D57D 4D5F 7FC8 DD43 7D9B" /* ..|}M_.C} */ - $"3CDC F9AD 167C 162B 4E6C 2110 DB2C DF34" /* <.|.+Nl!.,4 */ - $"AEED CCE4 05AC 4057 9829 B161 9CA0 8159" /* .@W)aY */ - $"A64F FD15 EC5A 4A51 CA6C FD10 9A25 4291" /* O.ZJQl.%B */ - $"1E90 1FC2 3530 E0DB E4E6 232E CB64 AF95" /* ..50#.d */ - $"9494 656D D395 3D62 9EDA 2EC1 DB02 1FAA" /* emӕ=b... */ - $"6778 0FC0 C4A2 CCA8 EDC0 4DA8 F889 162F" /* gx.Ģ̨M./ */ - $"03F9 A9C1 C635 1DAD 2E22 580B 0B2B 83E3" /* .5.."X..+ */ - $"EC02 5552 3AA8 91BA 45AF 5439 4265 71F6" /* .UR:ET9Beq */ - $"3E7A 4412 5DE5 1863 50E6 C0ED C470 3ED9" /* >zD.].cPp> */ - $"0E3F 48BA 54C5 915E 03F0 D836 6429 2A67" /* .?HTő^.6d)*g */ - $"B7FA 6AF9 069E 8E67 2848 B570 C3AC 7746" /* j.g(HpìwF */ - $"EB48 0A2F 4BE4 8EB3 3F8F 791F 0646 DEDF" /* H/K䎳?y..F */ - $"316B EFDF 6FD8 C0B9 7319 CE94 8930 C6F6" /* 1kos.Δ0 */ - $"6399 C4A9 79AD E967 4783 3F8D C538 3C15" /* cĩygG?8<. */ - $"E5B7 CE98 22B7 5333 A938 B26F 0E1E EF2E" /* Θ"S38o... */ - $"74B9 72EF 9D8A 80B7 FDC1 8334 A5F9 DCFB" /* tr4 */ - $"B891 BB38 373C 9BE8 59F4 6018 6E63 DA65" /* 87!^ */ - $"CBB9 E3F6 B62E DC26 001A 408F D7E2 07C3" /* ˹.&..@. */ - $"C1A4 AD97 4235 8863 A088 1980 C505 6E1F" /* B5c..n. */ - $"F392 0B24 B500 20DC 8295 5703 F9B9 FF70" /* .$. ܂W.p */ - $"355C 9B8D BB49 898F 1AAB F65F 7D7E E28F" /* 5\I._}~ */ - $"4300 BDCC FB20 4F67 CA07 0CAE 3BAD AA36" /* C. Og..;6 */ - $"A4D8 3358 4176 1AD6 01FA 0450 0000 0042" /* 3XAv...P...B */ - $"7B49 E0E8 A7D8 4EA9 E1A5 597B DB80 BA6D" /* {INY{ۀm */ - $"8010 25EA 0A26 833F DE77 DBF7 78B9 564B" /* .%&?wxVK */ - $"57B2 AF8C BC92 97D7 46A1 23C1 B595 A2EE" /* WF# */ - $"F8A9 29FA 42C2 3557 6345 80B1 FCFD F322" /* )B5WcE" */ - $"E992 9262 A83F E43D B059 CB12 D425 FEF2" /* 钒b?=Y.% */ - $"9932 1BD8 C65C ED82 D05E E15C 5E9C 76B7" /* 2.\^\^v */ - $"7C64 FCDB A247 D388 3CCB 86B5 C486 2261" /* |dۢGӈ<ˆĆ"a */ - $"BFD1 7213 39C3 0D69 6AF0 2476 B711 7E91" /* r.9.ij$v.~ */ - $"6B53 6A04 4F3C 2781 A090 3118 6C3F 49BA" /* kSj.O<'1.l?I */ - $"B81A 3FEB D686 EFCE F487 8315 E33F 84DB" /* .?ֆ.? */ - $"E2C9 F35F 28C5 10C4 FF7F FA4F E953 89FC" /* _(..OS */ - $"8B32 23C6 0D04 5E49 DADA F0FE BCA7 D2C9" /* 2#..^I */ - $"5869 EAD4 F153 9BF5 A5EA 3298 CC8B 8721" /* XiS2̋! */ - $"F919 680B 3F8C 304A 2849 4970 41CF 0F60" /* .h.?0J(IIpA.` */ - $"76D9 5820 EF21 CD4A 205A 632F 7CC4 EFDF" /* vX !J Zc/| */ - $"33F3 CCA8 EDAF 405B 78E1 8F79 0F66 6573" /* 3̨@[xy.fes */ - $"35A2 AD75 1E18 6018 AF23 7C9D A008 1A01" /* 5u..`.#|... */ - $"C5FE 69AA 2C8E D97E 244D D075 F213 0CC6" /* i,~$Mu.. */ - $"738F 4395 BBC0 5CB6 3ADC 3DA8 ACB8 E018" /* sC\:=. */ - $"BA5B 13DB 0F6A CB18 DEAC 9749 F5B5 361D" /* [..j.ެI6. */ - $"CF3A C107 9606 179F F4C7 F3DE CB0B 1F53" /* :.....S */ - $"F27E 5D3C 11AB 66B4 8037 0644 AE98 19BF" /* ~]<.f7.D. */ - $"D564 973A 0CF2 C96F 56D4 5CB8 666F C68C" /* d:.oV\foƌ */ - $"1E73 E515 8B33 75D2 D3B4 B3A3 8CDE DE0C" /* .s.3uӴ. */ - $"DA37 A3DF 44D2 B57E 2DB2 E891 D36F CC23" /* 7Dҵ~-o# */ - $"ADE8 45BC BB30 78D7 77BD D4A8 087F C83F" /* E0xwԨ..? */ - $"E49A 6873 FAC4 C12B 0056 5E18 C3CB C2E9" /* hs+.V^. */ - $"DCAE F0E8 A75F 18DD B8DD 1DCD B0F5 3A1C" /* ܮ_.ݸ.Ͱ:. */ - $"3816 51A8 0D93 00D0 6FF6 8F07 E4BE EDF9" /* 8.Q..o. */ - $"BF0E 6CAA 5384 5DF0 DF12 4CF4 E3B3 5D6C" /* .lS].L]l */ - $"602A B6F1 C0E0 E520 B0D6 71FB 7996 4930" /* `* qyI0 */ - $"23DD 3601 3653 C40D 1A64 DC2B D5C2 01C9" /* #6.6S..d+. */ - $"5002 6BBE 7338 81EE F87D 7687 0FE6 7CF9" /* P.ks8}v.| */ - $"BAB6 5B35 1A25 421C 5BBA 4D82 4E1F B1D4" /* [5.%B.[MN. */ - $"1907 FF78 F534 4A16 7BB6 B598 51F6 E4D3" /* ..x4J.{Q */ - $"A04B 1198 B926 CFAE FC03 22E3 8360 E696" /* K.&Ϯ."` */ - $"F546 62F9 7178 F327 E245 4520 8D17 41C4" /* Fbqx'EE .A */ - $"9EC6 EF8D 0924 9416 7901 CE87 5EBB 286D" /* $.y.·^(m */ - $"53BF 09FA 41F6 5FBA 8F4C 79A8 75BA 277A" /* SA_Lyu'z */ - $"7D42 642B 38EE 9A49 DEDB F1B3 80D0 E5D0" /* }Bd+8I */ - $"2980 F797 E7D0 F90D 4B2F AFDD 4A69 3389" /* ).K/Ji3 */ - $"1418 EBD0 6DF0 E38D 6E2F D546 C1A8 C8DD" /* ..mn/F */ - $"8977 E053 9C26 053A CF69 97F9 7FB4 9000" /* wS&.:i.. */ - $"0000 0115 0E67 B64C 0015 DD82 643D 6476" /* .....gL..݂d=dv */ - $"ED28 6324 AD72 8124 1AF6 FB1B 21C9 0605" /* (c$r$..!.. */ - $"FAE6 04A6 31BF 6D67 FF7B B889 831A 4FFD" /* .1mg{.O */ - $"6BF5 F098 23AB A490 39F7 6AFC 3832 E2E1" /* k#9j82 */ - $"11B2 ADB0 ECCA 83DE B4FF 3685 5106 75DE" /* .ʃ޴6Q.u */ - $"3047 28A0 EDBE AD29 17CD DA62 698B CE64" /* 0G().bid */ - $"5999 2B8E BB7D C74F F009 A25D B2B5 BDD9" /* Y+}OƢ] */ - $"B852 BFFE 0B74 9C05 22D7 B0A3 2139 0979" /* R.t."װ!9y */ - $"5C29 BAE8 43DA F9E5 5383 AFD2 14EC 64AA" /* \)CS.d */ - $"442C CE71 74ED 5C27 4331 9374 AC77 47EE" /* D,qt\'C1twG */ - $"31AC 4C74 97BC 753C D5DC 3D8B F7D2 C612" /* 1Ltu<=. */ - $"2399 F431 07A1 76CA DAE6 772B 309A C800" /* #1.vw+0. */ - $"9F2F D6DF A44C 48EB 853E 4140 A123 BCA3" /* /ߤLH>A@# */ - $"D096 00DA 0822 DFB3 6887 B31F A18F 59BE" /* Ж.."߳h.Y */ - $"6B25 B5CF CFA3 8806 85B7 ED84 B20B CDA2" /* k%ϣ.턲.͢ */ - $"A0C8 404B 3FFF 7FF3 3816 5BF0 A16B 85D0" /* @K?.8.[k */ - $"B87F E4BB 21F9 A3BB 9103 2944 434A 5789" /* .!.)DCJW */ - $"E3EC B1E3 6F3E 154A 37E4 ACA6 4B02 6C5B" /* o>.J7䬦K.l[ */ - $"D23A D4D4 83CE F291 CD7F 114F 5935 8EE0" /* :ԃ..OY5 */ - $"17EA F0B3 1D93 BC5F 2CF8 511C E99F 21D8" /* .._,Q.! */ - $"E286 EB17 6FC2 C34B 1110 6398 03BF CB08" /* .oK..c.. */ - $"0018 4848 E24D 90A5 63F9 B1F8 6E20 EF6E" /* ..HHMcn n */ - $"25D5 858B 0AE4 2235 581B D4DA E01C B006" /* %Յ"5X... */ - $"E5EB DE78 855B 19E7 4D80 DAC2 1E8F CB2B" /* x[.M.+ */ - $"0EC8 3FFF 7759 B569 0861 20CC 1D71 2121" /* .?wYi.a .q!! */ - $"71A7 FA20 B34B EAB3 4260 A827 6E91 2B3C" /* q KB`'n+< */ - $"5479 449A 3161 D24E 8489 C00A 18A6 3FEC" /* TyD1aN.? */ - $"61F2 4C86 23C1 85DB 6ECA 221D BCC2 C25F" /* aL#n"._ */ - $"EFFF 7891 F475 0E20 DC0A 8F85 8208 4541" /* xu. .EA */ - $"579B 5EE2 24C4 5C60 39B7 D9F1 ECFD 0F0C" /* W^$\`9.. */ - $"3719 72A8 A543 8BF5 94BF BF6C E6F7 E45A" /* 7.rClZ */ - $"C5CF 1FD7 32F5 2D70 041E 3641 2C46 E23D" /* .2-p..6A,F= */ - $"E072 6889 A892 A27F 44A8 564A 74A3 B421" /* rh.DVJt! */ - $"E1CC A0F3 50E2 2711 6919 76BE D84B D2FE" /* ̠P'.i.vK */ - $"AAED 2D64 7C8F 4C55 7FFF 7EFC 2CBF 05DE" /* -d|LU.~,. */ - $"25B2 001C 00EC 6D17 ED17 E559 9DFA F731" /* %...m..Y1 */ - $"B21A 7394 8B35 5948 BA4F 5858 020F FF7C" /* .s5YHOXX..| */ - $"C89D 1CFA F89B 9F9C 841F 19EF D626 E6DE" /* ȝ...& */ - $"DCC3 3148 38A0 C32F 898F BEC3 0AF3 318C" /* 1H8/1 */ - $"5E09 119B 43C8 9FE6 73B2 F4B9 9789 4BFC" /* ^.CȟsK */ - $"99A2 FF7F FF7A 4FD0 8C64 F459 410C 013C" /* .zOЌdYA..< */ - $"1C6C 85B5 1C8F D078 995D 714E 1C60 3090" /* .l.x]qN.`0 */ - $"9058 77C4 BB80 5F57 1871 CA72 B2FD 0016" /* XwĻ_W.qr.. */ - $"BAA7 F84F F4E9 ACDF F766 8CB4 475D 2F0B" /* OfG]/. */ - $"37BC 18C8 6162 79C2 BDD7 8753 204B A536" /* 7.aby½ׇS K6 */ - $"9CBE 4972 316A BCB1 9442 4238 B88F 2F48" /* Ir1jBB8/H */ - $"7A45 5CD1 A306 3A23 5A78 354F CDB6 C0A5" /* zE\ѣ.:#Zx5OͶ */ - $"2A5C 19DA 0B0C CD84 8D85 D2B8 1DC9 059C" /* *\...̈́Ҹ.. */ - $"A8C4 8118 4848 9372 9372 566C 21E5 2665" /* ā.HHrrVl!&e */ - $"D16C 6601 48A8 35CE 7FFF 7F19 B54E 7F04" /* lf.H5...N.. */ - $"10EC 1AA3 13FF 4588 9722 A7AA B011 863C" /* ...E".< */ - $"E4B1 717B 7C2D 21E6 267B 4B48 E790 FF76" /* q{|-!&{KHv */ - $"40CC F425 41CB 289F 809D 8170 A529 2EDA" /* @%A(p). */ - $"A105 B3AF FB44 7951 B87A 0091 5B53 5979" /* .DyQz.[SYy */ - $"CDC6 5976 6393 34F2 21FF 7FFF 7FFF 7D43" /* Yvc4!..}C */ - $"4F4B C77F 73C7 0454 BE9C BE9C 282E 440E" /* OK.s.T(.D. */ - $"0608 A380 6121 2103 DBD2 250B 5D57 9159" /* ..a!!.%.]WY */ - $"B69A 28CF E66A 154F F84F F4E9 99ED 48C4" /* (j.OOH */ - $"CA7E BE76 FC67 A7CD DC26 1C00 0184 8463" /* ~vg&...c */ - $"69A8 C0A9 127C 5830 CC3A 380A C742 E4DE" /* i.|X0:8B */ - $"06F5 7999 556D FD9F 268B 895F FF4B 7BB9" /* .yUm&_K{ */ - $"C201 52B7 B483 0906 65EC 1848 4750 6F27" /* .R.e.HGPo' */ - $"C86C 1F27 9108 6253 0416 4CD3 30E4 7F77" /* l.'.bS..L0.w */ - $"0705 8420 83B6 BCB6 29DE B71E 8DC5 851A" /* .. )޷.Ņ. */ - $"ABB0 83D8 F2E2 5113 55D2 AAF6 B3AB 7679" /* Q.UҪvy */ - $"49FE A1F8 6F30 0EC0 7D91 534C C78C DC5D" /* Io0.}SLnj] */ - $"5A42 CA06 37D8 E0ED 27FA 3E31 C849 D2BE" /* ZB.7'>1IҾ */ - $"847C 0CCF 676F ACFE 91A3 0F62 B711 1897" /* |.go.b.. */ - $"9DC3 8E37 3AF8 907E 0B69 1577 2856 AA36" /* Î7:~.i.w(V6 */ - $"FAC0 D56C 6686 0443 CA96 FDCD 051B 23A7" /* lf.Cʖ..# */ - $"7DAC 8229 C5FC F840 103A 6407 49F7 6B32" /* })@.:d.Ik2 */ - $"254F 2B32 7FC1 F460 D5C0 5EE1 3046 612A" /* %O+2.`^0Fa* */ - $"1BC1 C143 7B76 B9EF ECCB 5EE9 8F0C 3F71" /* .C{v^.?q */ - $"E805 8B9B 17B7 9ECE C237 AF5C 0062 E61E" /* ..7\.b. */ - $"DF6C C1F7 904E 4379 2A9C 92FC 1B04 00A8" /* lNCy*... */ - $"F9D5 DB1B C4C6 9485 ABC2 1199 CCF2 0A47" /* .Ɣ.G */ - $"9693 C097 7AD0 449A FC53 DEC5 6EE8 6BF7" /* zDSnk */ - $"0D7D 4ED8 3426 DA7E ECF9 57ED 9252 9A6A" /* .}N4&~WRj */ - $"2B94 2614 1B6E A495 8261 4D5E DAEF 03FA" /* +&..naM^. */ - $"8A63 9496 E8AB A1A6 5B5C B03E E73E 2889" /* c諡[\>>( */ - $"D257 6C28 080A 68DC 226C 950F F55B E7CC" /* Wl(.h"l.[ */ - $"95AD FDA7 43EA 7489 A545 C0FC E9B0 2A25" /* CtE*% */ - $"719C EE06 9E5A 8FC0 D3B0 0C81 1EB0 C8C6" /* q.ZӰ.. */ - $"25BD B383 33BD B80D D9A9 48F3 7539 D7D5" /* %3.٩Hu9 */ - $"8021 5EBA 94A7 83A3 69FE 8179 9106 BC56" /* !^iy.V */ - $"14A4 427B 8C09 BACB 2FC9 B8F3 CAFA E51C" /* .B{ƺ/ɸ. */ - $"9C07 9A69 033C 6159 163E 6ED8 259D 7AAB" /* .i.n%z */ - $"D316 475C F6C7 BD0E 7972 4C59 DF3A D5B4" /* .G\ǽ.yrLY:մ */ - $"44ED 7D01 B0FB 34D4 4C9C BC2D B8A6 5B65" /* D}.4L-[e */ - $"134F 0C96 5CA1 21CC A249 F17D 4660 9835" /* .O.\!̢I}F`5 */ - $"957C 7392 53A9 DE42 E650 604B 10E2 FF12" /* |sSBP`K.. */ - $"B47A 044A 524A B8D3 60B5 A258 CEAB 55E8" /* z.JRJ`XΫU */ - $"5219 EC3E A9F6 0813 A2B4 930C EDE4 3BBE" /* R.>...; */ - $"C0E3 7F93 1A3F 38EB 2DE3 492D A3BD FD00" /* ..?8-I-. */ - $"811C 530E 2FB8 9D68 2466 D288 EC29 9094" /* .S./h$f҈) */ - $"A3C7 2D32 0A25 BA73 2023 08CA C360 2C72" /* -2%s #.`,r */ - $"8BA9 516A 7081 F2FF 1E84 E1C2 F841 77CE" /* Qjp.Aw */ - $"ABDF 6476 30A4 3018 F7F4 F3EE 1A5E 5DF0" /* dv00..^] */ - $"CAAA AA77 C90D 52C4 6AA9 5755 33B9 1814" /* ʪw.RjWU3.. */ - $"3528 E205 C379 648A E627 A23E D5DB 1CAE" /* 5(.yd'>. */ - $"4868 B7D4 F381 2534 1F48 2BCC 5211 3B0F" /* Hh%4.H+R.;. */ - $"9692 B002 4CFB 1F83 3628 D1EB 5416 0648" /* .L.6(T..H */ - $"F0F0 B0F8 C7C7 6E92 8C54 6859 791B 7890" /* nThYy.x */ - $"EBA3 BC74 5F3F C4AD 7C9D 6954 2D0C 15BF" /* 룼t_?ĭ|iT-.. */ - $"F699 82A6 4170 D2F1 02A5 7EF3 6061 C9CF" /* Ap.~`a */ - $"C370 E129 F805 8CC8 C670 CBDC 2D44 D349" /* p).p-DI */ - $"F3E5 C5F9 357E 3DF2 CDF3 DC8A 1F13 5B2D" /* 5~=܊..[- */ - $"C544 448D 1038 8293 4EEA 75A4 0738 7D9F" /* DD.8Nu.8} */ - $"C002 3D68 26D8 7B06 FB10 CCDF C4F3 5364" /* .=h&{..Sd */ - $"2342 154B F8FB 01ED 8893 9160 A3A0 B81D" /* #B.K.툓`. */ - $"47A0 6C82 1CBA FAED 931D E025 BDFF 1535" /* Gl..%.5 */ - $"CADF 68C5 41FD 3896 1AC9 F979 A885 F5AE" /* hA8.y */ - $"EFBE C674 ED92 5FE9 E9AF FF52 D573 A6DD" /* t_Rs */ - $"631B 27E4 62CB B76E 7020 EC65 75E2 DB6F" /* c.'b˷np euo */ - $"0E10 980A 0EA3 2287 4CF8 D402 52B8 1491" /* ..."L.R. */ - $"21C9 BC2B 48BC CBD4 464A C539 6CD5 28F1" /* !ɼ+HFJ9l( */ - $"CAE4 CA43 9CB8 B181 BF06 522B 4D19 8295" /* C.R+M. */ - $"05C8 D7CD 8CFA D3E7 7BC9 630C DCDD 7C7E" /* .͌{c.|~ */ - $"E4C6 D7DC 5E38 67CC 5934 9E8D 9552 B837" /* ^8gY4R7 */ - $"53AE 6D39 FAB1 2EB6 886C 1855 26ED AD08" /* Sm9.l.U&. */ - $"1EBE 9570 EA2F DFFF 06F4 ABF3 4534 2831" /* .p/.E4(1 */ - $"1AE2 0A99 2956 2A90 C2A4 58AC E49E F047" /* .™)V*¤XG */ - $"A9BA C394 E8F4 6427 7966 A79C 4269 9ADD" /* Ôd'yfBi */ - $"AD1D 1A7E 375C D3FB 8C25 0B6B 0460 5EB9" /* ..~7\%.k.`^ */ - $"416C AE82 DFC3 09DA 1F69 8796 6897 8CD0" /* Al.ih */ - $"3E1B FF7D 9AE9 7F6D 4E84 967C 674F CA41" /* >.}.mN|gOA */ - $"44C1 0575 93A9 2599 66D0 AB7B 6260 D32C" /* D.u%fЫ{b`, */ - $"94AF 7FC8 82FD F692 92FE B6ED A660 750F" /* .Ȃ`u. */ - $"80A2 A8AA E6F6 7B9F E894 ED71 D223 6F4B" /* {q#oK */ - $"A203 F64C 7560 DBB1 6F9E EE9F 2945 C994" /* .Lu`۱o)Eɔ */ - $"BA00 D3D1 6414 A300 4296 670B 2350 CDD1" /* .d..Bg.#P */ - $"DF61 29E8 EC17 87B6 BC62 B6BD 5F31 13B2" /* a).b_1. */ - $"48A2 F723 53C7 6955 969B ED83 6A9B 1B06" /* H#SiUj.. */ - $"C7D0 2584 430B 8C52 D00A 736B D6FB AEDB" /* %C.Rsk */ - $"2BA1 5095 759B 0AFF 5138 58EF 3DC2 B14D" /* +PuQ8X=±M */ - $"3B7D 62D0 DE12 CFEF 17A3 32C4 C79A C2DA" /* ;}b..2ǚ */ - $"6BA1 6478 B1D3 2278 3787 6C30 08FD 6095" /* kdx"x7l0.` */ - $"FF65 1DF4 7606 34C3 B4EE E609 A3BF 7085" /* e.v.4ôƣp */ - $"8B3B 2C80 D860 6043 10A4 24B1 2D80 880D" /* ;,``C.$-. */ - $"671A 9A76 E1D4 2304 B4E0 9E47 129D 6316" /* g.v#.G.c. */ - $"33DF C88C 3BB6 5232 475C D19D FA9B 3303" /* 3Ȍ;R2G\ѝ3. */ - $"2956 D8B1 08A5 2735 CD4D F130 C700 DA0D" /* )Vر.'5M0.. */ - $"7BAE 21FA FB1B 35A5 957E 0211 955B 25D0" /* {!.5~..[% */ - $"A3DD B72F 5BCD 8792 418E BCB6 C727 DD0F" /* ݷ/[͇A'. */ - $"2D42 F031 2A73 C1F9 7964 B937 1E77 A757" /* -B1*syd7.wW */ - $"D158 CB02 80D3 C310 E1C5 709C 5C69 7F04" /* X..p\i.. */ - $"4476 F017 3FF2 B891 0160 D681 AEBC F8C9" /* Dv.?.`ց */ - $"8F46 7922 4414 5CEE 0CA8 417B 33BB 5926" /* Fy"D.\.A{3Y& */ - $"B7A6 7094 6363 C5F2 9AD7 1751 2456 3B83" /* pcc.Q$V; */ - $"9BB0 0ECD 1420 6141 A097 DBF4 802A 2377" /* .. aA*#w */ - $"CDAC EFE9 4A16 4B3C 5058 A5DC 1C40 169E" /* ͬJ.K.K */ - $"89CE 81FD AC96 C691 FDE5 F993 B9CB 6302" /* ΁Ƒc. */ - $"B8EE 86B4 A2F7 19EA DAFD D511 B59F BBD2" /* .. */ - $"5D4E F6A3 BC58 51D5 273F 2E2E 2B6A 2755" /* ]NXQ'?..+j'U */ - $"38A3 CA29 BFAB D31D CD53 B29C 7418 40DB" /* 8).St.@ */ - $"FD56 1BF6 9350 5411 CF5C 8D26 B1FA 754F" /* V.PT.\&uO */ - $"E584 8277 6221 6866 257C 9FC9 65A5 6D93" /* 儂wb!hf%|em */ - $"C524 B971 3F1D 34A0 BBF4 6B83 9722 CFAD" /* $q?.4k"ϭ */ - $"8296 103F 53BB 1B22 8A84 2FAC 94DE 4994" /* .?S."/I */ - $"2D31 56A5 DBCD B661 81D7 B360 4958 8FF5" /* -1VͶa׳`IX */ - $"EB02 25A9 6386 8241 D936 A3CB AA88 9936" /* .%cA6˪6 */ - $"1698 4F59 765B 34EA 3741 D2D3 2DAC 854D" /* .OYv[47A-M */ - $"366B C9A0 15F8 D2E6 7CCF 99EF A794 460C" /* 6kɠ.|ϙ倫F. */ - $"934E C88B 2BF5 91F7 7BD1 3DC9 6ED3 91FE" /* Nȋ+{=nӑ */ - $"E63B EDCC 3D4A CC1B AE5D 88D0 B241 20D1" /* ;=J.]вA */ - $"AB6C 9FE2 E494 395E 8E3C 0EB0 1796 58CC" /* l9^<..X */ - $"9791 D931 DB33 473E 003E 10CD B736 7295" /* 13G>.>.ͷ6r */ - $"DD81 B481 9A0A ED27 3C1E 6298 FD0D BDE0" /* ݁'<.b. */ - $"11D6 8A21 79C1 DBB7 FEDC 6E48 8080 5ADB" /* .֊!y۷nHZ */ - $"E61D 9E0E E6A3 6D38 A028 4016 464D F534" /* ..m8(@.FM4 */ - $"D764 3AD7 55DF 3CAB 7B3D 12F5 9A8D DDCF" /* d:U<{=. */ - $"6CCD 0387 C982 0FE9 D431 0FE3 E064 1700" /* l.ɂ.1.d.. */ - $"1AAD F49E D6DE A939 8010 C91B 605B 4E0A" /* .ީ9..`[N */ - $"FCBE ADE9 C17A EC1F 3990 9EB2 E6BF 92AA" /* z.9濒 */ - $"951C D27F A984 10A9 22DC 996E FF6E 12AE" /* ..."ܙnn. */ - $"DC03 5AB3 2CA0 8291 4174 C69E AE28 DBA8" /* .Z,Atƞ(ۨ */ - $"38A8 FF12 67D3 F8A3 00D6 2A2E A564 CEFA" /* 8.g.*.d */ - $"0F00 4B44 62A7 CA9F F072 2821 DD3C 6A34" /* ..KDbʟr(!Ce.O1 */ - $"F51A 9108 7912 32B0 52A6 A901 CADB A758" /* ..y.2R.ۧX */ - $"C00A D516 E462 35B4 C071 131A 0F01 9A95" /* .b5q.... */ - $"9739 F131 0E5F 7FBA D8AD 925F 992C 0187" /* 91._.ح_,. */ - $"D97C 832B 847E 1148 0402 0449 FB25 D0F1" /* |+~.H...I% */ - $"C1F8 2B8E CE97 D5A4 BEFE 7F0D E420 E43E" /* +Ηդ.. > */ - $"801A 448D 9D61 D23C 5956 3DEB A1A6 0858" /* .Da */ - $"A177 C3EA 4FE4 AFFE 1BFF 61D3 2F87 4BFC" /* wO.a/K */ - $"946E 03F8 6CFF 06A3 FC28 FE13 BF0F 6B7E" /* n.l.(..k~ */ - $"1EB8 FC3B 47E1 ECEE EEDF F87D 51FF 07D5" /* .;G}Q. */ - $"0BBB 87E1 D3FF 0779 FC3B 6FE1 D378 0DF0" /* ..y;ox. */ - $"BD7C 29EB A2DD 17F2 6ADB E1DB 7F0D 97E1" /* |).j.. */ - $"E84D 7750 FC3E 906F C3E8 35DD 42ED AFE1" /* MwP>o5B */ - $"D33F 0E8D F86E 00F7 91DD 3D8B A94D D83C" /* ?.n.=M< */ - $"B51B 129C 103F 899D B929 4724 C188 2C29" /* ...?)G$,) */ - $"CE89 11F8 9065 1C37 E234 DFEF 60D7 3221" /* Ή.e.74`2! */ - $"5343 F889 DCDB AFB3 6F20 F76A 31D9 986E" /* SCۯo j1٘n */ - $"A745 547E 6F18 076D A675 BA1A 1AAF 6558" /* ET~o..mu..eX */ - $"338A FF71 4707 0776 1B62 BCCC 89E5 4726" /* 3qG..v.b̉G& */ - $"A7CB 8885 E07C DADC D741 3B1D D81F AB03" /* ˈ|A;... */ - $"2F84 F52D DFD5 7384 4649 7BA2 5AB1 14C8" /* /-sFI{Z. */ - $"3D8D B951 8183 C33A B08E 82CC EF1A F046" /* =Q:.F */ - $"5B62 C9E0 A926 F330 0A61 A30C 6194 7E1E" /* [b&0a.a~. */ - $"1EE9 3D0D 1ABE 5536 A026 8B32 830F C02F" /* .=..U6&2./ */ - $"3041 04B7 2C65 024D AC81 D2CC 03CA A08A" /* 0A.,e.M.ʠ */ - $"B105 F3F1 C365 6BCE 9876 A867 7DBA 63AF" /* .ekΘvg}c */ - $"0973 495F DCC1 3552 54BA 5BDB 618D C6C0" /* sI_5RT[a */ - $"91B8 4489 141B A7D3 F188 8A97 DAB0 8942" /* D..񈊗ڰB */ - $"EA67 F235 E18A 871B 4B0C DAC6 9050 BA9C" /* g5ኇ.K.ƐP */ - $"C432 95CE 13CA 93ED 4FD5 9495 377D C920" /* 2.ʓOՔ7} */ - $"C8A2 F997 5348 8890 91D5 0A23 50BF 3C37" /* ȢSH#P<7 */ - $"8372 7C96 32AA 1CD2 46BE 8220 C983 2A71" /* r|2.F Ƀ*q */ - $"7961 BF33 9590 C086 CCE9 578B 322E FB50" /* ya3W2.P */ - $"CB68 6459 C127 EB9B E974 EF02 59F4 FF4D" /* hdY't.YM */ - $"4525 1874 6A9F 99EB DFCC C1B1 72EA 9FA0" /* E%.tjr꟠ */ - $"DE00 BBB9 D95F 36B9 406E 3CE0 3BCF 32B6" /* ._6@n<;2 */ - $"8DC0 55D6 C6DA 3622 8A6E 63F6 28AE 08AC" /* U6"nc(. */ - $"03AC 288D 069A 750E CBBD 97D9 E42D BA93" /* .(.u.˽- */ - $"E82A 4EB3 C008 CC7C B6A7 6F70 F1BC FDAA" /* *N.|op */ - $"1DF4 D2E4 3ECB 9702 444E 278F 6B50 F00E" /* .>˗.DN'kP. */ - $"C228 C132 E5E0 B4DE 93BF DBBD 2C85 ABF9" /* (2ޓ۽, */ - $"7FAD EC28 1D40 D390 5A2F 9B14 D348 8C76" /* .(.@ӐZ/.Hv */ - $"C04B 1173 BF19 8F50 7E3D 8311 BB79 FDA8" /* K.s.P~=.y */ - $"1FD4 24A9 5F59 8B76 709E 5C84 1902 8690" /* .$_Yvp\.. */ - $"AD49 334F 5AE8 E376 288C BDE7 EE13 FBDE" /* I3OZv(. */ - $"7606 0135 6DB2 DCD9 F5B3 E7E2 B2B8 8BE1" /* v..5mⲸ */ - $"1985 85D2 0EC1 5CCD BC74 D88B 7206 5075" /* ..\ͼt؋r.Pu */ - $"FB92 BF92 C5CB B6E3 024D EB71 D909 AF79" /* ˶.MqƯy */ - $"DD82 BBF2 37F1 1193 74D0 373D 4043 C292" /* ݂7.t7=@C’ */ - $"0B1D 4E8F 04F4 A035 451A 7DCB 02DB D77E" /* ..N.5E.}.~ */ - $"DD1C 3667 1BA7 2584 C128 3835 4454 5C15" /* .6g.%(85DT\. */ - $"5846 C7D1 4689 3D2A 1172 9BA8 9830 F037" /* XFF=*.r07 */ - $"0053 8FD6 4023 68C6 7122 CAC6 0325 5AF3" /* .S@#hq".%Z */ - $"E104 A423 C5AE F551 6DF6 7B11 D5EB FD34" /* .#ŮQm{.4 */ - $"DF67 C50C 737D 74D5 D5EC 7027 A2D8 C79A" /* g.s}tp'ǚ */ - $"200D A972 A30A 509A C3DE 483F 8B53 D69C" /* .rPH?S֜ */ - $"001F 47E9 BD2C 84EC DB83 B493 0326 DE6E" /* ..G,ۃ.&n */ - $"336A 7C76 3225 8351 7B2D 37B5 D645 9866" /* 3j|v2%Q{-7Ef */ - $"019E 6472 40C4 5853 3376 9D90 D3EA A727" /* .dr@XS3v' */ - $"07A1 A4B8 A32F 475A 22A2 059C AB5B F13E" /* ./GZ".[> */ - $"E2DF 5B3E E6B5 B27F 28AF A15F 400C 7D9F" /* [>浲.(_@.} */ - $"43ED 33D4 9B4D CB64 E550 5FED FC2F E485" /* C3ԛMdP_/ */ - $"271E 2DB1 6AE5 6793 EFE8 FCC5 A784 4C95" /* '.-jgŧL */ - $"E488 B5AC A528 BACB 10FF 4ABD D554 E56B" /* 䈵(.JTk */ - $"F72E 8ED7 5E48 60A4 82D0 381F A2D4 625C" /* .^H`8.b\ */ - $"9F80 2A63 5FD3 DD0C EDA8 3DE3 281E A65C" /* *c_.=(.\ */ - $"88EA 1A96 626D DC03 79BE C4ED EA60 4FC5" /* .bm.y`O */ - $"BB10 D9D5 99AF 0534 65C2 05AE 8D23 82B0" /* .ՙ.4e.# */ - $"6FB7 881A 7BC5 0316 7A28 4B27 2763 A6C3" /* o.{..z(K''c */ - $"8FC7 073A 1391 81BB 707F 625D 355F B1DF" /* .:.p.b]5_ */ - $"A749 C3EE A157 EC1F 0F6C 70AB 1A36 5711" /* IW..lp.6W. */ - $"C49B 1CA8 54A0 0FB9 6A2E 0F86 2E57 BC2F" /* ě.T.j...W/ */ - $"8CDD B76A F6DB 83F9 EEFF 4BF1 DE60 660E" /* ݷjۃK`f. */ - $"BCBA 7D68 D5DE 8663 DF06 3F65 A981 38D7" /* }hކc.?e8 */ - $"CC20 EBAE 6143 C79E D2F3 DCF4 FA0F 433E" /* aCǞ.C> */ - $"6DFE 4C5F 032A F6DD DD11 F85F 5003 22CD" /* mL_.*._P." */ - $"C07E F1CC 40B9 8D61 825D 77C7 91A6 BD49" /* ~@a]wǑI */ - $"2590 4BCD EB13 37A2 D5FA 2931 F311 9028" /* %K.7)1.( */ - $"6C02 96FC ACF5 1EA4 8E51 4BC9 FDE8 DFEF" /* l..QK */ - $"C5A0 8082 7E0D C127 3A80 A65B 7989 CCEE" /* Š~.':[y */ - $"6F6A 8DDF FB5B 46A5 3757 7FC3 3EFD BC0A" /* oj[F7W.> */ - $"8567 1CB0 3BE7 A153 D7CE 8F63 D2DC 8840" /* g.;SΏc܈@ */ - $"D993 E028 0E86 AA99 3ADE CC55 A789 CFC8" /* ٓ(.:U */ - $"D92B 9613 3850 B7B3 467A FA09 7D45 E174" /* +.8PFz}Et */ - $"D351 3254 64A3 7FC5 0D8D 1EDB FEC9 3F05" /* Q2Td...?. */ - $"C3C2 264B ACB8 F3C3 1BFF 04A5 12CF C191" /* &K... */ - $"8CA0 5985 E34C E583 A230 CD43 8602 BAAF" /* YL僢0C. */ - $"1475 FCA7 B274 1314 051F AF06 089D 13B1" /* .ut....... */ - $"5C06 815E FAA5 6864 CECE D56A 127C 058B" /* \.^hdj.|. */ - $"1859 E9E8 7A98 4299 3CFF 70CE C2DD 8676" /* .YzBQ.GN.=} */ - $"818F 28A2 2AC0 AD00 7F03 5781 2882 A44A" /* (*...W(J */ - $"6728 D9F6 E77F A883 C794 71AC 55E9 8112" /* g(.ǔqU. */ - $"BF6F ECDA 9BD1 96B8 79AA A397 A6F2 C93F" /* oڛіy? */ - $"3792 B8C4 8667 AAF4 659D 59F6 E77F A870" /* 7ĆgeY.p */ - $"24F1 5461 DB69 0F4C F8B3 F02A F6E7 7FA6" /* $Tai.L*. */ - $"26C9 5EDE 9BB6 A1C6 9467 854A 5327 BA38" /* &^ޛƔgJS'8 */ - $"F535 A01A B90A 9580 95A0 FE5C A623 DE0D" /* 5.•\#. */ - $"6C3E BF23 66F2 9312 9490 EB88 1D63 7AF4" /* l>#f..cz */ - $"9F5B 7F45 9078 3A5F CC36 7702 EAD5 FA4D" /* [.Ex:_6w.M */ - $"5F9D 258B 14A8 A235 6490 6B7D 2B05 42C3" /* _%.5dk}+.B */ - $"2A5A 791E 92C3 B1E8 B323 FF74 81FC B063" /* *Zy.ñ#tc */ - $"4A31 CBBC 91E2 A64A F935 FE79 4C07 1376" /* J1˼J5yL..v */ - $"002A 4795 5221 70B2 005C 41F9 D631 126F" /* .*GR!p.\A1.o */ - $"FF7F DF03 06BD 7214 71AB 4EF3 8EEA 0261" /* ...r.qN.a */ - $"D054 C087 EA15 CBD2 4645 2F9F 3600 4144" /* T.FE/6.AD */ - $"5671 C61E D3CB 8B84 A60D B58E FB69 C71F" /* Vq.ˋ.i. */ - $"B09A EDD9 AAC0 6FBA D7FE 8C4D 8262 6C73" /* ٪oMbls */ - $"9F69 0E81 7581 1D52 FB27 C979 1597 69EA" /* i.u.R'y.i */ - $"F1DF E906 0B77 2E21 D31A 5CCD 9474 95A2" /* ..w.!.\͔t */ - $"CB48 AB27 5F53 B82F 1638 16A4 87CD ED1F" /* H'_S/.8.. */ - $"20BC 2894 5EE1 C84C 1AC1 1158 0293 024E" /* (^L..X..N */ - $"1023 0E4F 9BD8 FA73 6E62 FF7F FD08 5797" /* .#.Osnb..W */ - $"0788 A951 6DDA 2448 21D2 7FCA 20B4 E1BF" /* .Qm$H!. */ - $"3262 89C7 5386 ACB1 8B89 6AC3 F907 1355" /* 2bSj..U */ - $"66D9 1E5A 5B54 19E9 2737 FF7C B8DF 1F5E" /* f.Z[T.'7|.^ */ - $"3592 B16D 6089 DE73 8F19 479D 626B 977D" /* 5m`s.Gbk} */ - $"185E F7A3 AF62 AD92 E5AC 2F74 B991 F96F" /* .^b/to */ - $"211F 5AE0 4C27 344F A9E1 C731 DB20 A0FF" /* !.ZL'4O1 */ - $"7FFF 7F2E 356F CC55 C6B8 C2C9 2AEF 2D31" /* ...5oUƸ*-1 */ - $"EFEB D878 C16F B1B1 3D47 240C 489C 7153" /* xo=G$.HqS */ - $"E5F8 A5C8 6E2C 7650 AED0 C4B7 43EA 67B6" /* n,vPķCg */ - $"94E4 7274 CFEB 4CF3 FD3E 8065 B9CC 35A5" /* rtL>e5 */ - $"21B1 3804 AD98 4F8A 6FFC 50DA 014C 442B" /* !8.OoP.LD+ */ - $"AA41 1455 BD94 B366 A37D CA82 7FFC DE57" /* A.Uf}ʂ.W */ - $"2EA9 98C2 5510 E51E 24CC 0428 4C83 1BBE" /* .U..$.(L. */ - $"0A46 A6DD 6963 D4CB 24E8 748B ED10 7B6D" /* Fic$t.{m */ - $"E61C 86C3 C80E 3030 FCE9 2263 C956 95A1" /* ..00"cV */ - $"AED0 C4B1 D07C F701 9DA0 ED2C C401 BC1A" /* ı|.,.. */ - $"9421 2D43 EF12 7494 8D46 CB82 3FE2 6439" /* !-C.tF˂?d9 */ - $"6BDE C8CE 23B7 9D2E B6F9 DF4B C1A9 A145" /* k#.KE */ - $"1512 85E6 30E6 98D1 AC22 EEBC 459C D841" /* ..0Ѭ"EA */ - $"0A0F 1F31 2F75 7937 220F 7271 FE79 44A6" /* ..1/uy7".rqyD */ - $"777E 1645 E0BA D980 0FFF 7D9F EC83 A930" /* w~.Eـ.}샩0 */ - $"D12B 216D 4D3F 4AD0 5EE9 DBC7 53D7 0A21" /* +!mM?J^S! */ - $"2372 C608 6701 8AFA 8E33 4125 2B7E 38DA" /* #r.g.3A%+~8 */ - $"5990 99EE B1D0 B07C 9F9D 97DD D658 2C2A" /* Yа|X,* */ - $"C7D6 4556 2AA7 297F ACBE 4802 B472 E76F" /* EV*).H.ro */ - $"644F 2F11 17FF 7F9D CE1C 2989 7199 03B1" /* dO/....)q. */ - $"E719 2B3B 1131 C4CC 808B BC7A 26A4 479F" /* .+;.1̀z&G */ - $"4824 6486 E338 DB65 A502 454C C415 B8D0" /* H$d8e.EL. */ - $"7C77 7323 E381 5958 F415 95B9 142E 85F8" /* |ws#YX... */ - $"1742 E22F FF17 567B A195 DFF1 7EE0 8E40" /* .B/.V{~@ */ - $"431A B629 DDCE AED1 A925 9FCD 56B5 7945" /* C.)ήѩ%VyE */ - $"B8B9 77DF 732C CD1E 8137 2645 1135 9593" /* ws,.7&E.5 */ - $"E31C 333B 30E2 518D E202 A1E0 FEA6 C40E" /* .3;0Q.. */ - $"BB50 0174 C21D 0BFB 34C1 1A8D 8E5D FF77" /* P.t..4.]w */ - $"909A 8111 3123 8200 AFC2 0525 13A1 C383" /* .1#..%.à */ - $"5472 BA45 8D58 8818 E5CD 6FEA D858 47C5" /* TrEX.oXG */ - $"F5A0 7773 3C86 1CE8 9A67 FAA7 5726 643B" /* ws<.gW&d; */ - $"1BF8 C2C1 E7AD D3CE E89B 97C4 0210 1FAE" /* .蛗... */ - $"9319 1F1F 7F89 0B76 5918 7EF8 9947 CF44" /* .....vY.~GD */ - $"6B5C 4B5D 5067 58A7 F35E CF39 7D01 C555" /* k\K]PgX^9}.U */ - $"FCD3 E0F6 C1A4 9C8A 0B34 2D33 A20D F664" /* .4-3.d */ - $"C174 CCE8 CAA1 C45F 2974 101B 86E7 68FD" /* tʡ_)t..h */ - $"D6FE 8FE9 AC95 5D3D DE38 1829 E3B9 37FE" /* 鬕]=8.)7 */ - $"5008 F383 21C4 4D57 AE92 9F94 A9BB 3A76" /* P.!MW:v */ - $"705F 8D2D 889C EB93 FD2B 05C5 89F2 500E" /* p_-+.ʼnP. */ - $"4220 A486 F348 D466 4D62 E368 540A 1D25" /* B HfMbhT.% */ - $"AF7C A9EF 43CC E423 16FC 6EE5 C407 DDAE" /* |C#.n.ݮ */ - $"EB28 23D2 3FDE 40EF 2ED1 D53A B87B 9C40" /* (#?@.:{@ */ - $"80A2 77EF CC8F D34E C33F 7BB4 4748 E4A6" /* w̏N?{GH */ - $"B177 05FF 085F CBF9 F1A0 8CA7 4200 32AC" /* w.._񠌧B.2 */ - $"7B87 A517 EA04 C96C F9A3 C6ED 5FFF 7FED" /* {..l_. */ - $"D5EB F835 3E15 6882 AED1 72BF B42C 87DE" /* 5>.hr, */ - $"8111 0F7A 5DA6 CFEA 79A7 9174 89E8 E637" /* ..z]yt7 */ - $"7E56 B53E 9987 2013 8F1A 06A5 07A2 1856" /* ~V> .....V */ - $"FE30 E259 128A 968B 881F E88D 8566 98D7" /* 0Y..荅f */ - $"C815 C397 64E8 9FAC 059A 5922 C863 F220" /* .×d蟬.Y"c */ - $"EC2A 4AF8 5DB2 A77D FC6A 3AC1 357E D5CC" /* *J]}j:5~ */ - $"142B 85B0 FEE0 2579 D845 CDFD F507 4C58" /* .+%yE.LX */ - $"D86A F299 0BBC A0A8 39A4 03D9 2144 6B3E" /* j.9.!Dk> */ - $"6D67 242B 0FEB B6F4 79CB 58ED 2338 DB9F" /* mg$+.yX#8۟ */ - $"6EC7 1626 0FDD 0C77 1E00 2AE4 8B46 F39C" /* n.&..w..*F */ - $"6268 EE5F FF49 B5C8 30E7 9859 E163 A9D4" /* bh_I0Yc */ - $"C50F BC0C 46BB BBC7 9FFF 7D54 E81B 8936" /* ..Fǟ}T.6 */ - $"A032 72E8 6576 5FEA 9A3F A5A9 9E58 B9C2" /* 2rev_?X */ - $"A089 A039 5695 766F 3295 A1FF 7F5F FBDB" /* 9Vvo2._ */ - $"A3FD 1F1F 76AD 6787 B4D0 D1A5 E4EA 72F8" /* ..vgѥr */ - $"0276 0C35 EC34 65A8 000A CA35 6AAE 1800" /* .v.54e.5j.. */ - $"99CA 1B65 F56D 6C3B DF33 AB08 94A3 15CF" /* .eml;3.. */ - $"C9B8 D32E 35D7 D32D 57E6 86D2 A5BE 2B3A" /* ɸ.5-Wҥ+: */ - $"4535 2C10 41FE FDA9 E202 3927 BC4F 5F90" /* E5,.A.9'O_ */ - $"E637 311C DB00 E394 09F3 005B 7DB3 0DFE" /* 71...[}. */ - $"9F1F CAA4 DD03 B381 8330 AB38 E13B 2F9C" /* .ʤ.08;/ */ - $"3DB5 01C5 100A 5D16 5C8D 792C FA0E 1A85" /* =..].\y,.. */ - $"E3FF 467A 6333 E4F1 F27C 9E2B 161E 18F0" /* Fzc3|+... */ - $"3F30 9C2C 631D BE74 4B7F 6E21 3FBC 404E" /* ?0,c.tK.n!?@N */ - $"E063 4152 D02D 68E4 869C E7E9 E4E6 4E95" /* cAR-h䆜N */ - $"3A66 1FDA 1145 DFB4 0796 9F97 503C E2C9" /* :f..Eߴ.P< */ - $"7F49 D644 1290 98BD 8EA0 2FA1 CF00 E383" /* .ID./. */ - $"C003 7BFE D79B FF62 A38E 2C39 A64D 19FF" /* .{כb,9M. */ - $"6A9D 976A 994B 6626 4F4D 7DC8 F0CA EDB7" /* jjKf&OM} */ - $"F99E 21E2 36B4 3AAB E787 C6A2 1783 F623" /* !6:Ƣ.# */ - $"8755 1F66 AFBC 2959 6E6E 2E61 AC85 2198" /* U.f)Ynn.a! */ - $"9978 EDFD 334C F0D6 7F76 9AF2 47AF 5E4B" /* x3L.vG^K */ - $"805C 54D3 5F2A 16C5 6675 C288 B44F F851" /* \T_*.fuˆOQ */ - $"1CE9 9F21 BF10 92B9 2366 5D69 AE8E 9989" /* .!.#f]i */ - $"36A6 F9E6 75A7 0D47 C8B5 8727 0138 2BFA" /* 6u.Gȵ'.8+ */ - $"5C4A 649C 123C 225E 2CEC 2007 5016 3F11" /* \Jd.<"^, .P.?. */ - $"B8FF 60CB 7150 EBFD DFED 147E 0A98 E096" /* `qP.~˜ */ - $"6B76 3AF0 39A5 5BF2 880C E857 174C 8735" /* kv:9[.W.L5 */ - $"ACF6 E4B7 3477 6293 FF7C 8515 A8DE 4E73" /* 4wb|.Ns */ - $"8E37 8A0C 4384 0CF3 FA01 15F5 9639 ED05" /* 7.C...9. */ - $"C86B 28A0 C331 14BC 2817 FE9B F96A D60D" /* k(1.(.j. */ - $"EBCB 14DA FF7F FF47 8A61 A2C7 F01F 10B7" /* ..Ga.. */ - $"3DAF B01C B484 F55D 457E E3EC CC41 95DE" /* =.]E~A */ - $"097E 8117 F77F FEFB A490 8B96 1300 2B37" /* ~....+7 */ - $"19FA E04C 4188 E9F6 8950 0668 B082 8FD8" /* .LAP.h */ - $"0B7D 6C32 4DBF F84F F4E9 ACAF 719A DC43" /* .}l2MO鬯qC */ - $"9F8D A53E DF1A BDB0 AAA7 3267 9C2D 357A" /* >.2g-5z */ - $"9CA7 1AE1 59C4 F467 83D3 308B 004A 42C2" /* .Yg0.JB */ - $"909B F979 41CE AB25 C6D1 9FE9 46E1 E837" /* yAΫ%џF7 */ - $"7ADF FF72 225E 4472 D323 F55C BE19 1E50" /* zr"^Dr#\..P */ - $"BF94 6787 CADB F576 300A 054B 0A2D E9B2" /* gv0.K- */ - $"5C15 DB84 E735 F76D 5477 D8A7 28AF FF7A" /* \.ۄ5mTwا(z */ - $"7EB8 06F8 4FF4 E999 ED48 02C4 F111 F61D" /* ~.OH... */ - $"8A6C 1CC6 AE54 94E4 8C5D 7655 4ECC 205F" /* l.ƮT]vUN _ */ - $"DBF9 1BA7 83CC 52E9 E9C9 52A4 1151 7DE4" /* .RR.Q} */ - $"051B E140 3FC0 D60B 0C11 663F 98A9 8B53" /* ..@?...f?S */ - $"776E BD8D 7678 AD62 ACEE 033F D134 B61E" /* wnvxb.?4. */ - $"F86D 3384 AAE7 9074 F7CF 4509 F9B3 4F30" /* m3tEO0 */ - $"F32D 840F 1DDA E6B1 BDD4 951F 2379 F890" /* -..汽ԕ.#y */ - $"530A E915 A228 D3D8 B188 C692 2767 D628" /* S.(رƒ'g( */ - $"12F8 3FFA BA23 F76B 1D92 1FC1 EA73 30FC" /* .?#k..s0 */ - $"CE72 0CA5 6695 6326 F93B B52F B9D4 F6F0" /* r.fc&;/ */ - $"FF07 727B 80F9 EBFC 2176 788C 333F 4137" /* .r{!vx3?A7 */ - $"E82C D066 6088 A8EA 168F 40EA F1EE BDE8" /* ,f`.@ */ - $"C023 75BA 66F2 335A 98C0 31A8 2137 7A7B" /* #uf3Z1!7z{ */ - $"DA0F 3962 D4B3 3E6E A5A1 3A19 5EED 48A7" /* .9bԳ>n:.^H */ - $"7617 DE46 D178 BC48 D85D 7821 DFEC B30D" /* v.FxH]x!. */ - $"F84F B7CD 80ED 55C7 9E1A F58D 7085 F625" /* ÒUǞ.p% */ - $"F564 3BF5 A09E B353 4E45 2F0B FC02 ECFD" /* d;SNE/.. */ - $"539F 529C A652 34F1 C0CC BC04 FCE0 2C7D" /* SRR4̼.,} */ - $"A8A9 9E67 79E9 ADE4 ABEE BFF6 4793 1B91" /* gyG. */ - $"413A 4302 7FB5 190C CB09 0DC9 3B33 E18D" /* A:C.....;3 */ - $"DDAB 23C5 FABA 5DC1 554F C940 B964 7F6A" /* ݫ#]UO@d.j */ - $"A781 2032 BF9E 0262 7C99 CD96 9251 9FB6" /* 2.b|͖Q */ - $"1C69 9141 7A13 3022 DE48 DA68 C959 A0B5" /* .iAz.0"HhY */ - $"0F3A F19A 9301 5051 5855 9D7B 5173 EE47" /* .:.PQXU{QsG */ - $"2B0D DB30 28CC 5E41 46F1 E79F 90B3 AB2A" /* +.0(^AF矐* */ - $"CAEA 6128 10E1 2CC0 DDC2 EBF1 26F1 E1DC" /* a(.,& */ - $"EB87 87ED 55F3 827C A066 D932 FCF7 B134" /* 뇇U|f24 */ - $"8BC9 CC70 B38C B019 8372 EA60 7C36 4D38" /* p.r`|6M8 */ - $"F82F 16C2 2390 A91B 203A 8EBE D0EC E278" /* /.#. :x */ - $"7AC4 8493 A217 6AC3 B85A 470D D74A B91D" /* zĄ.jøZG.J. */ - $"0180 7BAB 4088 5671 6268 5B4A 54FE C179" /* .{@Vqbh[JTy */ - $"1600 7677 830B 0E81 EEB2 6124 33F8 DBBD" /* ..vw..a$3۽ */ - $"1B35 D1F9 0568 3891 0ECB A836 5A86 9636" /* .5.h8.˨6Z6 */ - $"9F87 052F 0D66 8AA3 3362 1651 9B33 9057" /* ./.f3b.Q3W */ - $"5B98 05EB 23CE 099F 2358 444E 0D64 A9F9" /* [.#Ɵ#XDN.d */ - $"A569 7D56 A50D 6256 69AF BDD9 7847 D651" /* i}V.bVixGQ */ - $"73E2 F76E F277 58DC BFB9 7B8E 593C 0E97" /* snwXܿ{Y<. */ - $"3C4E 507D FA6C 7984 FAC8 6C42 6882 78AC" /* jXL..Τ */ - $"884B 2DB6 09F4 F51B 546F CD71 F4D3 6452" /* K-.ToqdR */ - $"B6E5 3EFF 66F8 0D60 D916 F755 1348 E250" /* >f.`.U.HP */ - $"D8E2 6858 B424 B84B D59A 6885 24D3 D845" /* hX$K՚h$E */ - $"692F 4313 B616 584F 7419 0661 0064 C281" /* i/C..XOt..a.d */ - $"A873 131C 5296 042B 1FD5 3EED BFC2 659E" /* s..R.+.>e */ - $"C4C7 2720 8002 28DD 141A BBE7 99F8 028F" /* ' .(... */ - $"8262 0577 5240 EB9A F866 2901 B75B 3FED" /* b.wR@f).[? */ - $"9E78 9071 83FD 02BC FCDE 2135 42D1 F184" /* xq.!5B */ - $"309D F47E DF10 F797 4268 120A D377 04A4" /* 0~.Bh.w. */ - $"2998 099E CA35 66AD FB20 8C14 1E0E 714E" /* )ƞ5f ...qN */ - $"B9A7 70EE 5BA0 7A18 FC16 97EB 1A98 CB6C" /* p[z...l */ - $"4B5D AC5B 3DC2 2062 E74A 18F2 0A76 6085" /* K][= bJ.v` */ - $"EF50 1C2F FE23 117A ED22 7BE8 0231 BC71" /* P./#.z"{.1q */ - $"707C 6736 BC3C 38AA 81C2 66B6 DCE5 13E9" /* p|g6<8f. */ - $"3076 C7AD 8C4B A962 C37E 4605 CDC0 8247" /* 0vǭKb~F.G */ - $"190C 41CD 6923 8D00 BC94 5B5F E2AB 443B" /* ..Ai#.[_D; */ - $"3C5A 7FF6 213C 9E2D 9224 70B1 EA9B 7D36" /* .[.j,f */ - $"BE8E C996 696D 58EC 6CFE 40AD 3C95 EAF1" /* ɖimXl@< */ - $"4591 1D62 836E D2E3 4CD8 E4A6 F4F4 C456" /* E.bnLV */ - $"A70C B3BE AA22 A188 DAB5 D3F7 4B7B 865D" /* ."ڵK{] */ - $"4D89 77E6 99A6 46C9 14BA 25E1 55C5 ADBD" /* Mw晦F.%Uŭ */ - $"4379 96AF 26DA A399 F009 AE75 248B 0285" /* Cy&ڣƮu$. */ - $"B370 5704 6429 C8AF 0BD3 A332 90B2 8351" /* pW.d)ȯ.ӣ2Q */ - $"F715 32C9 347B EADE 2EBB 9D97 BF95 0C5A" /* .24{..Z */ - $"9203 1EC5 7A8E CF46 C28C 39A2 DE74 C656" /* ..zFŒ9tV */ - $"F0BF 3ABF CE5F BE71 B7CE 2FF3 F41B F3EA" /* :_q/. */ - $"8BE7 B07E AB17 4F87 74FC FDE8 EF9F BF3F" /* ~.Ot? */ - $"A9EB F3D5 3F3E 83BE 7BAF EA5F E0FE 7ADF" /* ?>{_z */ - $"E7A7 7F9D 3FE7 3BF9 FA77 F9FA 3FF9 F7C7" /* .?;w? */ - $"E7E9 871D E84F CFE8 83FC FE85 E3BB E7E7" /* .O */ - $"AFFE 7D7F F9F5 57E7 AF70 6F9D 2DF3 9ED7" /* }.Wpo- */ - $"C81E F903 FEAB 8EF9 F50D F254 3F3E A4D1" /* ...T?> */ - $"DD53 F3F6 F37E 7EC9 4775 1BE4 77F9 EEBF" /* S~~Gu.w */ - $"9ED1 F9DC 00F7 91DD 3D8B A94D D83C 797F" /* .=M.i.L.. */ - $"F1D0 53DE 91D8 6723 A047 11C7 57B3 C46C" /* Sޑg#G.Wl */ - $"84A7 C2E1 C7CC 185C 9F21 7E2B 0F2E 64B1" /* .\!~+..d */ - $"D734 4142 C65E A2FB 9ABE B62D 076B 2B65" /* 4AB^-.k+e */ - $"9D6E 63F1 4825 79A9 3936 C7A7 531F EF6A" /* ncH%y96ǧS.j */ - $"F859 3084 0421 88A9 A648 8641 ACEB 95DE" /* Y0.!HA */ - $"2E94 E3C9 442C 13AF CF63 0404 C5C6 5CE2" /* .D,.c..\ */ - $"CE90 F9CC A1B6 5713 031E C239 174F CC40" /* ΐ̡W...9.O@ */ - $"BCA4 EA9A EB6A 1D24 7962 F735 AF5A B937" /* j.$yb5Z7 */ - $"AC3B A12E 10A8 D332 6FE3 8ED1 6F01 B198" /* ;..2oo. */ - $"1543 A6A1 367E E226 5D76 B860 E0E1 8963" /* .C6~&]v`c */ - $"AA7A F9EE DABF DB52 28F6 69F9 273F 8729" /* zڿR(i'?) */ - $"1D00 C7D2 20B9 3483 2125 88FC 94C0 54A6" /* .. 4!%T */ - $"42FE F4E5 DA50 F495 F88B 5986 21CB 22E8" /* BPY!" */ - $"EE5E 0622 2CB0 BCC8 0C6B 2B2B 23EB 0506" /* ^.",.k++#.. */ - $"A40F 09C2 726F 0C1F B8D4 55D3 2FE4 D629" /* .ro..U/) */ - $"94C2 C913 BB28 4394 A9D2 8684 9E47 0445" /* .(C҆G.E */ - $"B6CF 3E21 7072 B435 310C D7A3 063D 942B" /* >!pr51.ף.=+ */ - $"6AE9 350C 9442 C76E 1E6B A8C1 18A3 4309" /* j5.Bn.k.C */ - $"6D55 E62F FC4E C4E9 6CF8 241D FAC5 2CC9" /* mU/Nl$., */ - $"E020 6B12 31A6 9B11 710B 8850 FABE 5D63" /* k.1.q.P]c */ - $"068A 4018 2A90 93A5 9715 531E 8E7B AD7A" /* .@.*.S.{z */ - $"2921 115F 19CE 2B6A F643 DE89 2E76 890B" /* )!._.+jCމ.v. */ - $"5A69 1668 6A02 061F 4832 24EB FC82 6B4D" /* Zi.hj...H2$kM */ - $"9B08 D22F CBBF D348 D18F 8B0C C684 6851" /* ./˿Hя.ƄhQ */ - $"6CA9 E2FA 43CE 8A9A 7A58 FB28 0208 A6E0" /* lCΊzX(.. */ - $"1ACF CE23 C624 5A38 C640 72C0 26F1 2818" /* .#$Z8@r&(. */ - $"07FD 74D9 F3D6 ED38 CA01 6485 CE8C 41A3" /* .t8.dΌA */ - $"02C6 18E5 E4D2 2043 FA62 8768 3E14 7E80" /* .. Cbh>.~ */ - $"F2EB 67AD F743 75A0 2DDF 8724 1468 F88D" /* gCu-߇$.h */ - $"9BF3 11EB 4D4C B372 D210 9B58 BAA0 646A" /* .MLr.Xdj */ - $"222F 5E5A C781 1D86 5652 1B57 07AF C8FA" /* "/^Zǁ.VR.W. */ - $"9E77 DD7B FCB9 1D4C 8573 7B03 95AC D2DA" /* w{.Ls{. */ - $"3314 4FFC CAF4 39B5 EAF4 9617 2CC5 9258" /* 3.O9.,ŒX */ - $"8F99 8C44 8D44 DA10 F1A5 51F7 5533 F13B" /* DD.QU3; */ - $"CDDC B6D6 BE71 3C92 2628 3B69 DC32 C623" /* ܶ־q<&(;i2# */ - $"F497 3959 034A 67C3 10A8 26E2 572F B4B1" /* 9Y.Jg.&W/ */ - $"6C5C 3E47 FB9F AA7D D9A4 7A08 4BBA E854" /* l\>G}٤z.KT */ - $"4370 CE77 C69A 11EB 1BD8 B9AF 8225 BC8E" /* Cpwƚ..ع% */ - $"A261 1CAA A74D B531 A0B9 D462 35DF 9C21" /* a.M1b5ߜ! */ - $"73F1 EAC1 A13C E0BC AF6C 8111 03DF AF1F" /* s<༯l..߯. */ - $"4748 1866 322C 535A 7C5E D2BC 4304 3541" /* GH.f2,SZ|^ҼC.5A */ - $"F14E 8412 296B 2C37 B642 9B4A 6417 EABB" /* N.)k,7BJd. */ - $"9034 1260 1B81 AFCC F903 4FAA A3F2 339E" /* 4.`..O3 */ - $"F332 B080 8C32 31D7 4DEA B260 F190 43F1" /* 221M`C */ - $"CCD5 A584 5C1C 343F FB87 CEA5 F246 8EAC" /* ե\.4?ΥF */ - $"C407 302C FEE7 3F59 F4B8 74ED ED62 D373" /* .0,?Ytbs */ - $"A4BA B53A 0554 5403 9C2C E745 1087 5546" /* :.TT.,E.UF */ - $"2671 7BA6 3A33 703E BEF5 CD28 10A5 462B" /* &q{:3p>(.F+ */ - $"D902 9493 B2FC 176F 34BA 5A2D D2BC 0CBB" /* ..o4Z-Ҽ. */ - $"5AB7 B854 08D3 CD79 3C71 1A89 E643 2FBC" /* ZT.y */ - $"6757 09A3 C49E A9AD 7201 BFD9 B3FA 52B0" /* gWƣĞr.ٳR */ - $"0000 0030 908B 4E52 45F1 3CBE F04A D2E4" /* ...0NRE..Sb'. */ - $"5AE1 DA5A 8A02 140E 5275 5433 BCDF 8038" /* ZZ...RuT3߀8 */ - $"0050 856F A747 857B 8376 255A 9185 28CC" /* .PoG{v%Z( */ - $"301A EC7C B5D3 89CC A695 1C87 8266 7CA8" /* 0.|Ӊ̦.f| */ - $"A203 7467 426E 9507 3DB3 1F90 F66B DC9F" /* .tgBn.=.kܟ */ - $"ACF6 CDB2 4FCC 5AE4 2F94 F555 CB9E D8AC" /* ͲOZ/U˞ج */ - $"950B FF38 0FE4 5056 E5E8 F371 9A98 5697" /* .8.PVqV */ - $"6319 5197 B545 E594 AADD B2F2 CA27 260D" /* c.QE唪ݲ'&. */ - $"9BAF 0E45 0846 5573 F96B 7AC1 CC89 E86E" /* .E.FUskz̉n */ - $"61E6 72E2 05E3 9F8D 26D8 F178 BCC0 0B18" /* ar.㟍&x.. */ - $"967C EA80 F7C1 45AE 8FAE A41C 41B6 438E" /* |E.AC */ - $"46EF 1094 D558 01A8 BBAD 7380 DA27 2772" /* F.X.s''r */ - $"9D67 1330 A48C 62EA 0643 14EC 3E22 A055" /* g.0b.C.>"U */ - $"4E39 4E23 853D C587 99C8 CFD2 AEBB 9843" /* N9N#=ŇҮC */ - $"ECC9 0241 3253 8CF1 E068 1936 3BB2 56D3" /* .A2Sh.6;V */ - $"46F7 6A71 98D1 A300 1337 B3B0 7ABB 5752" /* Fjqѣ..7zWR */ - $"DB7A 7F85 5CFE 59DE A852 6987 DC11 C6B5" /* z.\YިRi.Ƶ */ - $"E45B 7DD1 1F3A D566 C16D 3FBF 7BAD 7201" /* [}.:fm?{r. */ - $"B71C C74C A678 C2BB 10FD 534A 5E5D 79C0" /* .Lx».SJ^]y */ - $"000C 2336 9113 B9C5 5D4A 1756 1C8B 0CD6" /* ..#6.]J.V.. */ - $"AA8B DFF5 6CE3 CDAB B9B4 D85C 93FF 76AA" /* lͫ\v */ - $"15CF CF39 A864 B236 A172 03A1 65A1 9F76" /* .9d6r.ev */ - $"FF55 00DE C7D0 C767 2787 9EB3 7CE5 C5BC" /* U.g'|ż */ - $"8E08 6085 37A2 229C 73D3 2CC5 F6E8 AA1B" /* .`7"s,. */ - $"AF13 15FD EB95 2609 6006 23C6 7910 8FFE" /* ..&`.#y. */ - $"8C5E 60A6 A558 E899 0A05 0F37 EC94 8E51" /* ^`X..7씎Q */ - $"7838 9A11 8483 88B0 E284 B88D CDEA 9D56" /* x8.ℸV */ - $"5C7E CFA2 8001 847E ABC9 360E 17EA 2D34" /* \~Ϣ.~6..-4 */ - $"8314 96C0 3810 D88F A54E 6E7C 6030 76FA" /* .8.؏Nn|`0v */ - $"18A4 A549 37FC 11F6 E77F A883 C794 71AC" /* .I7..ǔq */ - $"55F1 7F88 664A FEE4 01C4 5576 1BE6 9C41" /* U.fJ.Uv.A */ - $"D800 6121 2FC0 E681 A16E 21AF D5FE 0E80" /* .a!/恡n!. */ - $"A800 0000 3090 8C40 9184 82DA 7187 51C6" /* ...0@qQ */ - $"44DC C420 FF13 98AD D100 2C07 132C 8D6C" /* D ..,..,l */ - $"5D16 A089 D8F6 E77F A870 24F1 5461 DB69" /* ]..p$Tai */ - $"0F41 5029 7A41 B55F 0000 0184 846A 850C" /* .AP)zA_...j. */ - $"241E E628 EDA6 4000 3090 6AA2 F6E7 7FA6" /* $.(@.0j. */ - $"26C9 5EDE 9BB6 A1B1 51E6 8D5D F800 0061" /* &^ޛQ]..a */ - $"19B3 E47D 6F6F DB03 0885 4A53 27BA 38F5" /* .}oo..JS'8 */ - $"35A0 1AB9 0A95 8FAE 85E3 F528 5A8B E645" /* 5.•(ZE */ - $"8419 0456 6A38 D0DA 4948 8987 2323 1216" /* ..Vj8IH##.. */ - $"A4F8 FD1A C374 D30C BF43 CD86 B984 F23C" /* .t.C͆< */ - $"5487 B47F E217 F15A D8CF A66A 96A9 EAF3" /* T..ZϦj */ - $"F966 0205 D320 1556 5C3C 073A 8E66 1E3F" /* f.. .V\<.:f.? */ - $"A74E FF2C BC45 E9DB 3B25 FF7F 46AD 13A9" /* N,E;%.F. */ - $"5C21 458B 6AD4 829C 1DFB 54BA E5F2 3C76" /* \!EjԂ.TF...! */ - $"2CFF 4F5F FD2E 999E B77D A47D 61B4 2C01" /* ,O_.}}a,. */ - $"D397 493D CB48 AB27 EB4A 13A7 8C89 7F64" /* ӗI=H'J..d */ - $"6C08 FF21 9696 98C7 6248 1615 541F EC81" /* l.!bH..T. */ - $"8E18 FAED 5257 3D01 2CBB 74C1 DA64 81A0" /* .RW=.,td */ - $"39BF B272 4068 15E8 A44A 007C 732C D9DC" /* 9r@h.J.|s, */ - $"1CF8 4612 8611 A36D 67BC 6E6A EA14 9D87" /* .F..mgnj. */ - $"2962 C4B4 5442 9564 BFAA D0FB 991F 4288" /* )bĴTBd.B */ - $"7CB2 2A41 333E 7827 5070 F3A6 67FF 7FFF" /* |*A3>x'Ppg. */ - $"7601 CFFE E44B 4413 809B 3877 B59D BC19" /* v.KD.8w. */ - $"548F 0A5B C1E9 A8D7 6B5D 8EC8 8A1A BB3D" /* T[k]Ȋ.= */ - $"3CD1 3139 57CF 9E94 00E9 CF6E 3830 3561" /* <19WϞ.n805a */ - $"8DE4 A59F FD1B 45CF C608 D0FD 5D48 485E" /* 䥟.E.]HH^ */ - $"D5A3 30A5 F9EE 5D55 B9C2 E552 3A9F B087" /* գ0]UR: */ - $"FE87 5DBC 5E73 0F16 9221 2B0D F399 AB6F" /* ]^s..!+.o */ - $"9950 0000 0000 0000 0008 2444 88CE 3BBD" /* P........$D; */ - $"CC78 4932 9C47 DEFA 74E7 91BF 9827 FF7B" /* xI2Gt瑿'{ */ - $"77EB 9B1B 9F7F FDAB 6552 35A1 0C22 E9C6" /* w..eR5." */ - $"42E3 FF7F FF7F E9FD A23B 2F7D 3ADD FC90" /* B..;/}: */ - $"E4A1 F8B9 0560 0F86 D7FE 3F46 C953 2A03" /* .`.?FS*. */ - $"F1C7 F5AE D0C4 B743 EA67 B694 E47D 45CD" /* ķCg}E */ - $"6F92 178A E383 8B71 800E D9AF A55A F149" /* o.ニq.ٯZI */ - $"A838 5671 4C9A 8915 447A CDA9 C6B7 DD68" /* 8VqL.DzͩƷh */ - $"A5FB F404 CF63 A62E CC5E 89D3 FDB2 C841" /* .c.^A */ - $"7A37 5B5D 5958 4B46 20B1 D389 5188 F9FE" /* z7[]YXKF ӉQ */ - $"8FF1 D718 6C8C 3254 0000 0000 0000 0000" /* .l2T........ */ - $"0000 00A1 EBEC C33A 8622 D0FF 7FFF 7FFF" /* ...:".. */ - $"705D C7FE 49E7 01B7 A65D D5BC 2041 80B0" /* p]I.]ռ A */ - $"89ED F68A A000 F438 EBD0 C908 0B67 414F" /* .8..gAO */ - $"C8F1 4312 2EC8 05E6 CA19 184F FF5B BA24" /* C.....O[$ */ - $"57E8 A6B4 FBD3 FF79 4D8E FF44 BC50 6938" /* W覴yMDPi8 */ - $"137F FF7D 6251 8D1A 9B33 CF7E 0BCB EAD7" /* ..}bQ.3~. */ - $"2E0D EAE0 0003 0906 AA2B 66A8 C950 0000" /* .....+fP.. */ - $"0000 0000 0000 0000 0001 1E1F F600 1848" /* ..............H */ - $"4BF6 7A7C F92D 3E7A 437E 2254 51EB 4AF5" /* Kz|->zC~"TQJ */ - $"C6BF 442A 12CD 51FF 7FFE B8AE D0C4 B1D0" /* ƿD*.Q.ı */ - $"7CF7 019D A0ED 2CC4 01BC 1A94 212D 43EF" /* |.,..!-C */ - $"1274 9B67 94D5 062D 5FCC E23C 4816 416B" /* .tg.-_ށ01*uO5. */ - $"7FFD A983 95A9 71E7 A7A3 7D3F F944 0A7E" /* .q秣}?D~ */ - $"24D9 966F 6B6A 0FD0 23AC 7000 0000 0000" /* $ٖokj.#p..... */ - $"0009 D4AF 9196 E5A4 B8AC 407F F9EE C709" /* .ԯ夸@. */ - $"F927 08C3 CA6C 3A3A D90F E306 BCC4 6D6C" /* '.l::..ml */ - $"C7A9 F042 6F4C FDC9 60AB A087 6338 8F12" /* ǩBoL`c8. */ - $"4D29 D00C C575 C7B5 9FA4 E96C 1FA0 AAFB" /* M).uǵl. */ - $"09E9 8DF9 1BE0 C62D 3C1D F55B DD77 A0FD" /* .-<.[w */ - $"5C16 D959 BA08 0000 0000 0000 0145 AE01" /* \.Y........E. */ - $"712A 0E06 1212 70CD 94A8 0A2C 18F5 1E3B" /* q*....p͔,..; */ - $"52FA C8F6 56F3 F7E4 69E6 54A0 3FF6 2487" /* RViT?$ */ - $"C65F 0EFF 7F4F 8D07 C817 FE78 727D 3C75" /* _..O..xr}~bR.JP */ - $"DADA 8602 5949 900F D2B6 D10D 2661 3014" /* چ.YI.Ҷ.&a0. */ - $"4541 17FF 2106 00DF AC82 0046 09BB A5AF" /* EA.!..߬.Fƻ */ - $"CE51 0EBF F9AD 787A 907F 9F9A 628F E16B" /* Q.xz.bk */ - $"C015 137E 9C68 FCFA A817 FF7F DD6B FDB6" /* ..~h..k */ - $"3DA3 7C9D 3309 0B8A B551 C370 4401 CD7F" /* =|3.QpD.. */ - $"7503 8425 E297 1B3F FF49 4FF8 3583 685A" /* u.%.?IO5hZ */ - $"B273 A7F7 CEBF F27E D78C 3E35 5332 152B" /* sο~׌>5S2.+ */ - $"033C C7FF 7B97 1AF0 F2A4 3C88 CC7B B96E" /* .<{.<{n */ - $"65B3 533C F2F8 5E4B 6DBF 7D78 A316 310F" /* eS<^Km}x.1. */ - $"6B09 FD62 88D7 77FF 7447 524E C235 00A3" /* kbwtGRN5. */ - $"8F5A 4BEE D240 6154 C17C 2CC2 68F0 A959" /* ZK@aT|,hY */ - $"2F12 9B74 7E8E 423F BB1D BC9A C75B C618" /* /.t~B?.[. */ - $"19D1 C6CB 0A15 BD77 99BD 96D3 CC07 F5AC" /* ..w. */ - $"D2ED DE5E F19D 5CFC B2B0 5407 0386 32C6" /* ^\T..2 */ - $"5F49 7BAD 3270 BF81 CF97 C934 7E23 7237" /* _I{2pϗ4~#r7 */ - $"727B 0FA2 6DB0 D717 8C73 B109 E089 AAC5" /* r{.m.s */ - $"7D98 9061 2956 EA75 0135 E870 3430 4E9B" /* }a)Vu.5p40N */ - $"C76C D3D6 7EEB 83DB 9EEB C9A0 983D 1327" /* l~۞ɠ=.' */ - $"62D8 FD62 CA51 7135 80B0 ABFF 431B 9843" /* bbQq5C.C */ - $"68B4 A929 44E4 1F3E E3A1 22AA 5E87 579C" /* h)D.>"^W */ - $"745B 9CA4 438C BFC2 9A1B 17BE BA75 06E4" /* t[Cš..u. */ - $"0108 698C E4F2 341C 24CC 7913 6237 ED48" /* ..i4.$y.b7H */ - $"E797 4D7A 0D5A D1EA ACDF F974 4F9F 9139" /* Mz.ZtO9 */ - $"6A87 3972 A1C8 0A2B 1E8B 6DB7 B811 4AB0" /* j9r+.m.J */ - $"EEE8 BB23 959C 239D 4165 DBED ACE4 F133" /* ##Ae3 */ - $"8276 40BB C447 29FE 3EB6 5BA4 A6D0 2441" /* v@G)>[$A */ - $"1431 8B2D 8BFD 96B7 C8C2 9F9B DFB9 2B06" /* .1-Ÿ߹+. */ - $"E191 00FF 7E4B 8281 D609 D163 B8CB AF9A" /* .~Kc˯ */ - $"0995 7385 27FC 3C6A 5310 024D BAD1 8013" /* ƕs'x.(.e> */ - $"4161 0037 E0AA D0CC 3AED 4E56 04E8 4456" /* Aa.7:NV.DV */ - $"6E50 4626 C7E0 0790 014E 329B 0DDB D87D" /* nPF&..N2.} */ - $"4532 6482 3F51 D651 3F62 D6EB 3BCA 75EB" /* E2d?QQ?b;u */ - $"5444 A42F 3CFB 4146 19FB 5376 876F 6BC1" /* TD/U@.. */ - $"3E83 51D4 9D13 DE0D F86D 3384 AAE7 9074" /* >Qԝ..m3t */ - $"F7CF 4509 F99A 70B2 2E74 43C3 1363 021F" /* Ep.tC.c.. */ - $"6482 E471 22FA 6265 2DF9 C302 43F8 9053" /* dq"be-.CS */ - $"0AE9 15A2 28D4 FD7C 05AF C7B8 26D5 7C0F" /* .(|.Ǹ&|. */ - $"22E0 4735 518D BE4B 4E83 1EF8 3FFA BA23" /* "G5QKN.?# */ - $"3AE8 F76B 1D92 2038 64C1 EA73 30FC CE72" /* :k. 8ds0r */ - $"0CA5 6697 157E 55C4 8BAE E703 6FF5 F743" /* .f.~Uċ.oC */ - $"B456 C85F 3BFF 2629 95B7 02F4 F580 A49B" /* V_;&). */ - $"1587 2316 D131 66C1 C6DB F3DC C409 D801" /* .#.1f. */ - $"E2DA 30B6 73FD 99EF AA26 25D7 DF07 FBEB" /* 0s&%. */ - $"094E 2E8E BD11 3C49 81BA E6BE 7666 ECBE" /* N..sW.6<%1 */ - $"2C25 ACE4 F084 E842 60E8 355D 22BE 6FEE" /* ,%B`5]"o */ - $"93F9 DDE6 DAED 4E44 545A FE4E 5EA4 0487" /* NDTZN^. */ - $"36F1 52AF 8683 2DE8 F30B 72DE E807 2068" /* 6R-.r. h */ - $"742B 7262 BF7E 516C D41F CA56 9DE1 E3B8" /* t+rb~Ql.V */ - $"8D72 2993 C073 516D A343 DDE0 984D F06A" /* r)sQmCMj */ - $"CD83 D22D C161 30D7 2E9A FED4 4E85 5D2E" /* ̓-a0.N]. */ - $"CF72 2181 7F23 BC37 FF83 C30D 43E0 DBC7" /* r!.#7.C */ - $"A277 B4D9 4E68 1FB1 AF7B 6D8B 8F43 2A1B" /* wNh.{mC*. */ - $"9FE4 6CCC E826 C4AA 96C9 98A9 4D3B 981F" /* l&ĪɘM;. */ - $"8786 8633 89B0 2B42 4266 BC27 0098 D2B3" /* 3+BBf'.ҳ */ - $"E8E4 0D2C 6E14 D34D 3613 4568 4A1E 8E5E" /* .,n.M6.EhJ.^ */ - $"E328 D89C 85D3 D8C2 C15B 3533 989F F015" /* (؜[53. */ - $"1B49 871D 031B 2DBE D49E 880D A557 0694" /* .I...-Ԟ.W. */ - $"60C3 47A1 CD2A 961B F73C 94A3 6B17 4268" /* `G*. */ - $"8743 EB0E ED13 7955 DB28 2874 8065 2078" /* C..yU((te x */ - $"97A7 6C13 2283 729A CCF9 E449 A627 7652" /* l."rI'vR */ - $"E821 2F1F 574E 6887 1830 6E01 5A8D 02FB" /* !/.WNh.0n.Z. */ - $"DB61 8EEF 4E08 B607 26FA 2B4C FF47 38FE" /* aN..&+LG8 */ - $"9B7C A3E4 DB46 F898 CFE9 8F3C 8717 2975" /* |F<.)u */ - $"9BA2 582E 86D1 D882 C127 EFD7 E71A B5DD" /* X.؂'. */ - $"7772 6391 2722 2884 AA0F 9C72 9A96 F4F8" /* wrc'"(.r */ - $"BFF8 869A FD00 3B41 A8C7 DCD0 2834 270C" /* .;A(4'. */ - $"B93C 8702 5B16 8A32 0289 979B 0A35 3A7B" /* <.[.2.5:{ */ - $"5870 6189 03C2 DD00 FAB2 B137 AB93 3EF5" /* Xpa..7> */ - $"24E3 1FE1 A206 963E 1344 FE12 285A 5C52" /* $..>.D.(Z\R */ - $"692E D315 6C73 2CBE 7ADC 81BC EBC8 13EA" /* i..ls,z܁. */ - $"796B 6056 E9E7 D971 6E09 7086 252C 6A19" /* yk`Vqnp%,j. */ - $"7351 153D F4C4 FE01 6235 917F B203 171A" /* sQ.=.b5.... */ - $"1822 B42B 9226 D163 5572 7E7E C508 BEBA" /* ."+&cUr~~. */ - $"D0D2 1C24 8D62 565D C183 F78D 4726 0541" /* .$bV]G&.A */ - $"F829 10C7 1B21 E59C C4E5 7688 6268 FABC" /* )..!vbh */ - $"C0B9 6C02 8820 3F44 54A7 8C83 F14F 61B8" /* l. ?DTOa */ - $"707C AB32 9D59 F01E D18A 37FC 40F9 5C59" /* p|2Y.ъ7@\Y */ - $"EEA8 E442 FDC8 CA73 970F 6EE0 1348 AC8E" /* Bs.n.H */ - $"9D65 4DA9 2820 AEDB A7F3 C1B4 8E3F 8780" /* eM( ۧ? */ - $"8DA9 F7D9 F116 DD30 778E 4FB6 49D3 AFE8" /* .0wOIӯ */ - $"74B1 EB63 92B8 4210 3B22 3613 6784 41A2" /* tcB.;"6.gA */ - $"5953 1EFF 16A9 1769 9852 73D0 B6C2 3523" /* YS...iRsж5# */ - $"854B 1247 531D 47C5 7AFC 1B6B F0C4 2E2F" /* K.GS.Gz.k./ */ - $"6C60 82C9 9C4D 2FAD 25A5 BEC6 8590 7388" /* l`ɜM/%ƅs */ - $"5D15 9A65 E013 D48B 7D9C 34B2 A617 75A8" /* ].e.ԋ}4.u */ - $"8E8E 2D91 1AEC 26D5 8B9C D03C A02A A829" /* -.&Ջ<*) */ - $"738D 9A4E 8F31 82A9 39B7 7CFE D412 810E" /* sN19|.. */ - $"1372 6D79 8D49 BAC1 9FFB 5D52 56AD 488F" /* .rmyI]RVH */ - $"4E1D A232 7348 1FE2 483F AB9F A23C 0997" /* N.2sH.H?<Ɨ */ - $"678D 1AB7 7F66 8927 7DED 2A66 E03B 05C9" /* g..f'}*f;. */ - $"0420 66A2 E0AE E1B9 259E 64C9 FF0E A7C7" /* . f%d. */ - $"5E9D 69F4 DD50 394C 344E 9DA9 6BCA 3D9F" /* ^iP9L4Nk= */ - $"8FA9 C156 3248 2310 8AB9 6131 B94F FF36" /* V2H#.a1O6 */ - $"DF00 9E80 5713 E9AD 3B07 879E C876 E063" /* .W.;.vc */ - $"38D8 2776 3081 5810 1760 927C D93C EE88" /* 8'v0X..`|< */ - $"518B 755A EBF1 B276 C65B 98DD 1421 8AA1" /* QuZv[.! */ - $"27D2 A8B2 5E3E B7B7 8F73 CDCB 9896 D80F" /* 'Ҩ^>s˘. */ - $"1D50 2E28 4F54 26A9 E68F 822C 3031 0A5B" /* .P.(OT&揂,01[ */ - $"213A 8ED8 B1B8 C32C F5EF 6784 3641 A888" /* !:ر,g6A */ - $"1AF9 941B E9B2 42C0 D9BE AAD7 2727 9E13" /* ..Bپ''. */ - $"284F A530 1F62 679B 7860 E677 9E24 3663" /* (O0.bgx`w$6c */ - $"E7D1 E4B5 D37B C274 9ECB CFA2 CC95 8A75" /* {tϢ̕u */ - $"0C3A FB7D F074 1433 5EC7 1FC4 330E F221" /* .:}t.3^.3.! */ - $"AE39 4A04 097F 4B21 27CD C193 39CB 3AB2" /* 9J..K!'9: */ - $"0B6E D8E0 54EA 0F75 15F9 D75D 0D82 624D" /* .nT.u.].bM */ - $"7D19 8E11 1AD0 764F CEA8 F0FE 2913 6841" /* }...vOΨ).hA */ - $"89B8 CA62 C997 34B9 5950 4842 4F13 1ACD" /* bɗ4YPHBO.. */ - $"39AD 30CA 4ED2 A17D 0B09 206B 9426 EF50" /* 90Nҡ}. k&P */ - $"63C6 386E 74BB BDE0 420F 6154 5260 E1A2" /* c8ntB.aTR` */ - $"8546 3192 76D1 1F38 268E 7AC6 049F 321D" /* F1v.8&z.2. */ - $"CB51 35C7 067C 961B DA2F 4BCB E065 A8DB" /* Q5.|./Ke */ - $"16C9 1F05 ABAF 93FF 333A F049 3161 6838" /* ...3:I1ah8 */ - $"6E1A FEF2 564C 3F48 3800 BC9C F009 AF34" /* n.VL?H8.Ư4 */ - $"2241 15D4 764F 4764 CEDF 6D7D 2E9C 8141" /* "A.vOGdm}.A */ - $"1E00 E109 D827 DDAA A47C 2854 9229 8998" /* ..'ݪ|(T) */ - $"9175 1FFB 496B 36C7 3695 3631 390B 06E6" /* u.Ik66619.. */ - $"EB0D 3BA7 F1BE A2FF 6D3A 9FB6 FCFD ADEF" /* .;m: */ - $"EDBA 3FDB 632F EDB1 BF6D BE7E DB9F 97ED" /* ?c/m~۟ */ - $"45FD AB93 F6E8 7FED A7F7 DAC3 FC34 6F43" /* E.4oC */ - $"E1DB 5507 762F DB7E 5F51 DDF5 1DFE DD07" /* U.v/~_Q.. */ - $"E1FD A67F B4E6 7EDB 8BF6 AE3F B6BC D3E4" /* .~ۋ? */ - $"D00B 0F87 A0FF 2AC3 3F6D 84F8 7475 99F2" /* ..*?mtu */ - $"F382 BE95 100F 8FEE C1C8 D086 E345 E973" /* 󂾕..ІEs */ - $"0FE4 06B6 7813 7115 B8D0 D91B C698 D10D" /* ..x.q..Ƙ. */ - $"A370 844F 9330 E047 0201 F880 D146 6522" /* pO0G..Fe" */ - $"8E52 12DE 3D1A 9231 5315 682E 4706 8685" /* R.=.1S.h.G. */ - $"DA39 C538 9828 7ED0 714F 3E27 532A 3840" /* 98(~qO>'S*8@ */ - $"C912 3E46 8205 3243 7835 7284 12D6 CCF5" /* .>F.2Cx5r. */ - $"36AF 0975 8A27 4F44 3857 B5A3 160D 1391" /* 6u'OD8W... */ - $"8005 2453 86CB 51B3 E493 EA9C 707F 7047" /* .$SQp.pG */ - $"1DA8 1386 91D1 6105 7D84 1563 FC52 D5D3" /* ..a.}.cR */ - $"EDA7 D4A0 4AC1 BB4E 49D6 62F4 CA92 CE8E" /* ԠJNIbʒΎ */ - $"8DE0 84DC 418D ACE2 71AD 9206 3C98 3281" /* Aq.<2 */ - $"104E A1F2 8982 6ED6 223E B67B BE6A C51F" /* .Nn">{j. */ - $"4BF8 6C35 B6A4 5EC8 87BB 4834 7CF3 16AC" /* Kl5^ȇH4|. */ - $"2453 B3DA 3503 94D6 2E70 2B6F 975E 21DB" /* $S5..p+o^! */ - $"F409 0368 9A2E DFB2 7A4B 9A6F 4165 1173" /* .h.߲zKoAe.s */ - $"A53E 329A 7925 FB80 9664 2C09 A9E5 715C" /* >2y%d,Ʃq\ */ - $"E42F 8E14 EC68 05A8 D565 53C2 9C98 86A2" /* /.h.eSœ */ - $"2C2D 6443 A1D0 A619 2320 6CD3 FE48 8006" /* ,-dCЦ.# lH. */ - $"FC0F 3690 DF76 1FD8 2E16 0705 D91F EEBE" /* .6v...... */ - $"E961 32B9 E252 4F0E EE4A 6F73 AEBB 014A" /* a2RO.Jos.J */ - $"8F45 1551 9123 7C3A 13F8 1B57 EB6A 0AFB" /* E.Q#|:..Wj */ - $"9AE9 65F5 9FDE 5F1C 7C23 84F1 6DCD CC52" /* e_.|#mR */ - $"97DD 03E6 C571 0C23 F06B 9F21 2E2C 79D5" /* .q.#k!.,y */ - $"1827 1436 E6FB C5FB BA11 617B 9B32 3DCD" /* .'.6.a{2= */ - $"B0AD AA8F 53D0 2F20 849C D667 9436 A677" /* S/ g6w */ - $"38C9 1B5A 26E2 B4D4 29BB 2D9E 56D4 652D" /* 8.Z&)-Ve- */ - $"9A12 FC7E FBD5 0075 3EC9 64FE D0CE 06A2" /* .~.u>d. */ - $"B63F 8731 DB8A 6917 26EA CCFC C1E6 10AA" /* ?1ۊi.&. */ - $"704E 20EA 7518 0416 6BBE 2867 9470 9FE6" /* pN u...k(gp */ - $"3D2A D178 6CD1 0B7D E518 4682 FC48 EA03" /* =*xl.}.FH. */ - $"EFA0 ADEE B643 CDFD 796D C309 E13B 9DD3" /* Cym; */ - $"82CC 1237 8D6B 9CB9 0438 AF1A 6190 136E" /* .7k.8.a.n */ - $"A170 6109 4BA8 FD0B 4C10 DE61 71A9 A5FF" /* paK.L.aq */ - $"5AD1 3895 15D0 912A BC62 5344 A7FD 7B9B" /* Z8.Б*bSD{ */ - $"0360 8C71 DD04 20C7 4685 E6B7 7941 7BD7" /* .`q. FyA{ */ - $"DBBB 3F61 742B D692 AD3D B778 6442 3DD1" /* ۻ?at+֒=xdB= */ - $"A97E 1312 9AF4 05C1 7B33 9FE2 B3F5 D16C" /* ~...{3l */ - $"875D 7109 13EC BB96 0664 DF60 1958 8DE5" /* ]q.컖.d`.X */ - $"5B3F 3E75 9D21 0415 CE9C 3172 87C7 FF05" /* [?>u!..Μ1r. */ - $"F787 4F14 E63B 4DCE 247D B3A3 475C 5336" /* O.;M$}G\S6 */ - $"C794 AF23 6415 68C6 B893 1B16 8C81 3F43" /* ǔ#d.hƸ..?C */ - $"C455 6EB8 8D5A 6919 4C3A D980 BFB1 3699" /* UnZi.L:ـ6 */ - $"C790 C7D1 7B05 12AA 803A 172B DEF2 00CC" /* ǐ{..:.+. */ - $"FF38 62C8 1815 1D3A F60D 2B9B 87A0 05C5" /* 8b...:.+. */ - $"3587 0181 8754 06D7 2CFC 78B8 0C65 D5BC" /* 5.T.,x.eռ */ - $"2903 C07C 0631 A0B9 E94E 192F DE4B 4924" /* ).|.1N./KI$ */ - $"A4F0 BB9A 49C5 B751 38EB 7289 9806 FC5C" /* IŷQ8r.\ */ - $"D822 ED93 CA92 14B6 5056 017F 7826 CDE1" /* "ʒ.PV..x& */ - $"8401 9F6C A7F7 4AD5 E86F FDC3 05AF 6AE3" /* .lJo.j */ - $"5EED 07E3 E5ED 7EE7 FB97 0B99 E191 605B" /* ^.~.`[ */ - $"955A 6A3C 33C6 2BB8 9562 0E38 09C1 1ED9" /* Zj<3+b.8. */ - $"8914 73AF E9AA 7B2F 214E 7EEA 98E8 B976" /* .s{/!N~v */ - $"E058 E0B5 6DB4 5B1C F212 2C8E 0AE5 7100" /* Xm[..,q. */ - $"BC1E 84CD 0598 7CF9 EA4E 1E96 2B4A DE9E" /* ..|N.+Jޞ */ - $"6CE9 E79B 0336 9059 E109 DF83 A2AE 9E74" /* l.6Y߃t */ - $"5BB1 0236 590C 66CD 0658 ECE5 50A2 EDDD" /* [.6Y.f.XP */ - $"D7BB DAF7 548B 7F21 2A40 7821 FDA2 62B6" /* ׻T.!*@x!b */ - $"C862 B0B2 96CF 27D5 EC9D F5C8 42D8 F42A" /* b'B* */ - $"5962 F21A D191 6744 1AE2 64B4 6744 A1B2" /* Yb.ёgD.dgD */ - $"7625 FF0D F0CF A1F8 3273 C4B8 FCCE C2BC" /* v%.ϡ2sĸ¼ */ - $"EDD5 F0C6 765F 2446 5EF5 2195 04EE C94B" /* v_$F^!.K */ - $"C9C2 4F82 0D0F 6034 3560 64A8 C372 4E17" /* O..`45`drN. */ - $"D4F6 B2DC 2162 A6DC 9B35 5F36 628E EA58" /* !bܛ5_6bX */ - $"B2EF D0B8 79FF 3F60 39DC 34C9 8DD1 C7DA" /* иy?`94ɍ */ - $"BFFD 9220 B977 42CD 1F4E 00C7 1A7B F29F" /* wB.N..{ */ - $"9738 8D5E 3E5F BA1F D4BD 0592 2006 1216" /* 8^>_.Խ. ... */ - $"D478 DE72 171A A49D 9C4A 0691 CD59 6FB3" /* xr..J.Yo */ - $"F3C5 B3CD DCC8 5794 133C 85B3 176A 0C6A" /* ųW.<.j.j */ - $"323E C74F 7CE3 4042 38AB E9CA 5700 E39B" /* 2>O|@B8W. */ - $"26D3 62B7 59F8 966D A789 35AA C72D 9943" /* &bYm5-C */ - $"C884 2E53 30B3 D351 EFCC 6BF8 9889 8AB6" /* Ȅ.S0Qk */ - $"E284 F5A4 64BD F89F 98A4 8082 6292 48EB" /* dbH */ - $"2039 4A80 D5D7 BEFC 2DC1 69A9 F484 9B4E" /* 9J׾-iN */ - $"94C9 6E87 31A6 6D4E 23DB 77A9 37D5 CEE9" /* n1mN#w7 */ - $"10B5 22DB 58B2 3DFB 973A E321 F02A 2985" /* ."X=:!*) */ - $"AE7E F964 9A23 4B8D 90FD 75F4 9944 3CEB" /* ~d#KuD< */ - $"C5C5 B0BA DA1C AA0A B59A EFCA 903A 972B" /* Ű.µʐ:+ */ - $"10E9 2A66 2BAB 3E63 8312 E494 A82C AEE8" /* .*f+>c.䔨, */ - $"DE3B 902F 4DE5 A934 7FA5 59D8 B355 75C7" /* ;/M4.YسUu */ - $"DC51 6208 6D60 DE89 F04A F698 FC35 5341" /* Qb.m`މJ5SA */ - $"A8C7 894B 5E8F 0638 0F21 36AB 23FF 37BF" /* ljK^.8.!6#7 */ - $"CA6E C0CE 1C93 9BB1 FEA7 49E8 9BA5 7F32" /* n.I蛥.2 */ - $"4C9D C8BA 821C 1E07 F277 BE63 241C D5F6" /* LȺ...wc$. */ - $"07CB 7A98 E51E B0FC B312 223C 21BF 5DEE" /* .z..".5" */ - $"1088 A628 490C 5F8D 64C4 7E17 CBD3 290D" /* .(I._d~.). */ - $"91B1 B073 AD4A BF5B A1E9 6306 3E9A F87E" /* sJ[c.>~ */ - $"2DEC 7390 2CF5 3305 93C2 15DA 7FFF 7FC6" /* -s,3.... */ - $"0578 C93E BF93 5B69 25D4 E0F9 5726 0D7E" /* .x>[i%W&.~ */ - $"9C06 C76B 1BF5 3206 F26C 4F57 6A13 7488" /* .k.2.lOWj.t */ - $"07F4 1787 316E 19B5 2CB4 D7B8 23EE BF15" /* ..1n.,׸#. */ - $"84F7 C141 CE7E 358F F83B 081D 2680 C5CB" /* A~5;..& */ - $"2002 0FFB D329 10E3 1880 E0F6 29FF 14F6" /* ..)..). */ - $"1447 24FF 4BDD 371B 00F3 0334 6FE5 D217" /* .G$K7...4o. */ - $"8E7D 3CCB EC04 D019 0583 0792 D4F4 59E5" /* }<....Y */ - $"0914 52FB CE7A 2EFD B899 ED16 38FB E1D4" /* .Rz..8 */ - $"3312 BAAE 3EF3 45B7 2A77 62F3 4787 8900" /* 3.>E*wbG. */ - $"050D 5A64 92D3 64E7 7950 4234 FCC0 0EC6" /* ..ZddyPB4. */ - $"004C 8652 616B B5FF 87F6 72D0 400B 9574" /* .LRakr@.t */ - $"7ADD 2EE6 F979 EE70 393F 5E65 09EC 561B" /* z.yp9?^eV. */ - $"2FF4 F6FA 9226 2AA7 C2D2 4517 2258 15C7" /* /&*E."X. */ - $"D27E DE80 0000 0009 BB69 0154 3C66 FD24" /* ~ހ...ƻi.TEijf' */ - $"7A8A 6368 2F2C 3F2F 5D43 59ED 5E40 9E4F" /* zch/,?/]CY^@O */ - $"59BB 6A03 B7F8 083A 021D F8F0 79AF 43B0" /* Yj..:..yC */ - $"2270 F775 B8D8 FB59 371A 8B22 9F0B 55FA" /* "puY7.".U */ - $"C9B1 5565 0914 AA67 2D9E 81B2 60FC 1333" /* ɱUe.g-`.3 */ - $"318F 21E9 97E4 1400 F69E F709 7AE3 82A5" /* 1!..zゥ */ - $"C9DE 7D16 1DF8 EDF8 FC5E DB3E FC2A F822" /* }..^>*" */ - $"886E F247 9BC1 250E 905C 4AF7 4B22 3595" /* nG%.\JK"5 */ - $"0835 2567 EEC1 C4C8 B70D D782 6A22 C9DA" /* .5%gȷ.ׂj" */ - $"ADA3 0370 EED9 E428 E163 963A E6F0 5D4A" /* .p(c:]J */ - $"F42A D11F B46D 7FBC 2D87 4274 4756 896E" /* *.m.-BtGVn */ - $"C489 80C0 62F6 88A8 184A 79BE 3068 A9AF" /* ĉb.Jy0h */ - $"D703 390B 1A76 3136 B799 726A AAA8 C23D" /* .9..v16rj= */ - $"EEB0 E0F1 49E1 A6B7 204F 7BF3 6E44 F25E" /* Iᦷ O{nD^ */ - $"7E0A 5125 CA89 B477 15CD 83CC CD21 C6BE" /* ~Q%ʉw.̓!ƾ */ - $"F20B 99F3 C30C 5113 2E0A FF7E 1034 1BFF" /* ..Q..~.4. */ - $"0378 72CF B0EE D132 2A2D 14A9 E37F 6B10" /* .xrϰ2*-..k. */ - $"B5CE 0500 0000 0000 0000 0160 A7E3 A715" /* .........`. */ - $"0C13 DE44 025B 9720 0000 0000 0000 0001" /* ..D.[ ........ */ - $"E0F5 5A21 77FB C1F6 EAF0 244A EE78 B6FA" /* Z!w$Jx */ - $"1769 3D98 AA28 2EB6 9826 A16B D6B8 BA89" /* .i=(.&kָ */ - $"26C6 25C9 9E66 FD9C 6D2D FCDA FCB9 6AB2" /* &%ɞfm-j */ - $"B42A 7008 5069 CB61 D530 B47A FCFF 7F95" /* *p.Pia0z. */ - $"FA58 2D11 111A 53BF FB17 59E1 63E7 0FAD" /* X-...S.Yc. */ - $"B016 A862 3107 8DF0 7112 DD6A B6E3 2477" /* .b1.q.j$w */ - $"3162 94F0 6826 75B0 D0B8 4C13 21C7 E4BC" /* 1bh&uиL.! */ - $"FB86 7A83 DF1C A4D9 C3B4 E3DE C334 1633" /* z.ô4.3 */ - $"DC27 76B9 7ADF 50CA F95E C7C9 D5EB 402C" /* 'vzP^@, */ - $"276F A0B0 D88B CF4A 0FD2 380A E3E7 2BA5" /* 'o؋J.8+ */ - $"DD24 A247 B631 75B1 6D3A 4C60 9BAB E4C5" /* $G1um:L` */ - $"BBCB 2972 36B9 AC74 5FF5 B5DB 231B 95F3" /* )r6t_#. */ - $"7CFF 8E5F 86E9 1906 B3DF 75C7 0364 6192" /* |_..u.da */ - $"A000 0000 0000 0000 0000 003B B1A0 0000" /* ..........;.. */ - $"0000 0000 0000 0000 0000 0016 D51B CEEA" /* ............. */ - $"0406 C003 4E50 C0B8 8DB2 F37C FF8E 5F86" /* ...NP|_ */ - $"E919 06B3 DF75 C703 6461 92A0 0000 0000" /* ..u.da.... */ - $"0000 0000 0000 3BB1 A000 0000 0000 0000" /* ......;....... */ - $"0000 0000 0000 16D5 1BCE EA04 06C0 034E" /* ...........N */ - $"50C0 B88D B2F4 4BED 0C57 2F64 38E7 DFE6" /* PK.W/d8 */ - $"95DB 93EF B9ED 1250 6A6A A6E3 4478 1E7E" /* ۓ.PjjDx.~ */ - $"F105 8E1B 961B 230C 9500 0000 0000 0C18" /* ...#........ */ - $"0EA3 5F13 6306 E1B5 4B22 3D26 79A1 06E4" /* ._.c.K"=&y. */ - $"228F F320 0B74 8820 0000 0000 0000 0007" /* " .t ........ */ - $"9F62 443B 9A51 EAB0 7C1A A374 E7F1 52F3" /* bD;Q|.tR */ - $"3BB8 C1E0 5919 6C04 A2E2 1032 6917 1394" /* ;Y.l..2i.. */ - $"CCBE 472A 0652 C144 6D1E 755C ECF9 9725" /* ̾G*.RDm.u\% */ - $"A84A 55AE 7A0E 6730 FCA7 B6E0 FF31 08C0" /* JUz.g01. */ - $"3E76 4DDC 9E24 A60B C4A7 4CDD C221 1941" /* >vMܞ$.ħL!.A */ - $"0810 2DE3 206F C551 4910 77AA 762A 1FF2" /* ..- oQI.wv*. */ - $"D39A 0ADC 1089 90F8 D098 1E77 BDD1 AF74" /* Ӛ.И.wѯt */ - $"4DEF D00D 0B2C CA2F 9EDC 27C4 35F9 F924" /* M..,/'5$ */ - $"67FF 74E5 A746 B627 6267 F6D0 9B94 22D4" /* gtF'bgЛ" */ - $"5FFE DF67 A7A9 E3CA 02A5 44D1 E926 DCA4" /* _g.D&ܤ */ - $"7490 4AB8 E094 7037 FF7C 8CF7 2A9B B784" /* tJp7|* */ - $"794E 9026 D48F FF7F F013 AABF F874 63DA" /* yN&ԏ..tc */ - $"0302 FBFA AA6A 31D5 E2DF 85F7 2ACD D98C" /* ..j1߅*ٌ */ - $"175D 1243 F1C0 CEA2 344C B6FC ADCF C6AA" /* .].C΢4Lƪ */ - $"5CAE FA82 783F 58DD 754D 5C63 A018 19F8" /* \x?XuM\c.. */ - $"7EFE 8953 AE16 22B9 4ED7 43D2 8A0B FA52" /* ~S."NCҊ.R */ - $"5703 08CA 555B E51E 307B 0565 E165 22F3" /* W..U[.0{.ee" */ - $"7130 0CEC CA23 576D 8D58 BED1 FEB6 9A2F" /* q0.#WmX/ */ - $"DCEA 3288 3EEC B12A D43C B191 2627 7723" /* 2>*<&'w# */ - $"F40F 1B7A F1E3 9A7E 366D 7490 EE80 3570" /* ..z~6mt5p */ - $"CB59 D05D F384 AA96 71FE 68E8 4D32 F9D2" /* Y]󄪖qhM2 */ - $"48BC 7B03 EA3B 879E 2E96 671F 8098 CE76" /* H{.;.g.v */ - $"87D8 0336 5C88 91F4 3C69 D76B 4DEF 29DA" /* .6\`H {. */ - $"BCA8 E157 DFD5 E879 C14C 1B1A 3431 2856" /* WyL..41(V */ - $"0E74 D87F 7691 A923 632A 5EBC 6E95 6A46" /* .t.v#c*^njF */ - $"8E68 7118 3704 6E41 37CB C9AC 7F84 1005" /* hq.7.nA7ɬ... */ - $"C308 7C90 C6E0 B56C 8CF8 3C33 A97E C46C" /* .|l<3~l */ - $"E373 91A9 4A3F 7331 481D 843F 0472 59DC" /* sJ?s1H.?.rY */ - $"0837 85BA 4867 C202 6BFC 7433 F093 530F" /* .7Hg.kt3S. */ - $"D721 8927 26CF AA6B B4E1 7981 FCE4 9F4E" /* !'&ϪkyN */ - $"1105 9E7B 7F68 1CE7 D811 E270 FCA3 9CDE" /* ..{.h..p */ - $"BFE6 48BA AC07 B55E 4E7F 5946 115B B1DC" /* H.^N.YF.[ */ - $"F694 3A9B EADD 7971 E0F1 B6E1 C6FF 4337" /* :yqC7 */ - $"F543 A074 FC74 AD1F 45BF 7867 C472 7605" /* Ctt.Exgrv. */ - $"1786 E496 2D22 22BE 5760 9ACE A5C9 22B9" /* .-""W`Υ" */ - $"9A14 4136 93E4 3E4A 715C 6F69 8447 5764" /* .A6>Jq\oiGWd */ - $"D761 77A8 2C3F E200 ACAD 8331 11D0 ABE6" /* aw,?.1.Ы */ - $"EA7B 5A22 58CF 097E 732F 894B E99C 6BAF" /* {Z"X~s/Kk */ - $"B36C 68AA 5668 EF92 66E9 DDF9 FF78 DB89" /* lhVhfxۉ */ - $"FC78 2032 99D9 62F0 1380 3FE8 41DF F341" /* x 2b.?AA */ - $"F1FD 7F08 CE2E F09A 9335 6735 0FAD 8093" /* ...5g5. */ - $"B6B1 53A2 964F EA7E 72A2 9A29 794D 98F0" /* SO~r)yM */ - $"DD57 AE65 C61E DDEC BDB4 35C2 D050 E063" /* We.콴5Pc */ - $"5F54 BCA5 928D 786D CAE3 8F96 BFEB 027E" /* _Txm㏖.~ */ - $"6BBC 8795 7C88 1A2C 9908 36A1 6CAB 9268" /* k|.,.6lh */ - $"EB0D 816F F34D 55F5 B562 BCFF 4190 EE42" /* .oMUbAB */ - $"F195 E7F3 E220 7E51 74A2 FA23 23F7 20F0" /* ~Qt## */ - $"985F 011C 34B8 C988 C519 C623 81BC D026" /* _..4Ɉ.#& */ - $"A8C5 B82C 7A7F 86F7 E60E 44F2 CD53 6FAB" /* Ÿ,z..DSo */ - $"2D69 1FD4 75B7 A011 80E7 09B3 B9CF 4503" /* -i.u.ƳE. */ - $"F4A5 1DE3 AE8A 96F7 E245 0DF9 3859 24FA" /* .㮊E.8Y$ */ - $"7B43 665F B15E D4D3 FB2A 666E FB6A 6CA8" /* {Cf_^*fnjl */ - $"9CAF C052 D658 6DC3 BDD1 C752 21FA 6426" /* RXmýR!d& */ - $"857C D05D 41C2 0241 306C 6FD4 81E3 69F7" /* |]A.A0loԁi */ - $"A6F5 227F 39F9 780E 829A 17A9 C649 2BF5" /* ".9x..I+ */ - $"01DD E500 A973 E599 890C A548 CE34 2877" /* ..s噉.H4(w */ - $"D160 A2EE 4B3B CC7A 0C87 6723 51FD C222" /* `K;z.g#Q" */ - $"9BFB E72D 2769 6250 2054 22C9 ABB2 3125" /* -'ibP T"ɫ1% */ - $"7DA0 73A3 C083 1AAD 90F2 F0A8 C22D 9DF5" /* }s.- */ - $"3FFB 6B56 18BE 61A6 B198 F1BC 1E4E 0CFE" /* ?kV.a.N. */ - $"B323 8275 A644 CAC4 D36B 9AF9 FCC8 5DEC" /* #uDk] */ - $"292B CC9B A0B6 9148 09DF E46D 1B2C 4EDF" /* )+̛Hm.,N */ - $"EDB9 2DB4 BAD5 C50B 2115 C476 E09A F407" /* -.!.v. */ - $"5EE8 2E9F 870F A319 32D4 EBEC CB7B FDE9" /* ^...2{ */ - $"FB5C 0D41 61F3 BA97 0F9E 558F 6E39 C213" /* \.Aa.Un9. */ - $"3101 A5E8 ECEC 15E5 4F29 F69A 58CD D82D" /* 1..O)X- */ - $"986E E8E0 6898 17CC 98C4 C851 AC75 9306" /* nh.̘Qu. */ - $"5241 0350 E2EB 38CA 1682 6132 FF45 578A" /* RA.P8.a2EW */ - $"FA7F 7557 AC2C 9A18 3835 A62B 7D09 0992" /* .uW,.85+}ƒ */ - $"EF78 BD49 5317 373A B07D 6420 DC30 5067" /* xIS.7:}d 0Pg */ - $"A659 F316 4436 8E8E 9786 1163 A6A5 B841" /* Y.D6.cA */ - $"99AA 4E1C 6163 309A 3C23 0208 FF4B 2967" /* N.ac0<#..K)g */ - $"B7F7 37E4 A337 D0DC C48A A742 FB2D C529" /* 77ĊB-) */ - $"BC6C 5BBE BC5C 03B1 F87F D7EA F5AC B94B" /* l[\..K */ - $"5A88 84AB E44E BE6A F337 96B0 7CB6 1140" /* ZNj7|.@ */ - $"25CB 45D6 BE02 A9D4 7868 1EDD F660 7963" /* %E־.xh.`yc */ - $"B438 C030 3EA5 51FA F451 FA84 A6FF 2E5A" /* 80>QQ.Z */ - $"EA95 2300 C0F4 39AA 42BA 4120 4EEC AFDD" /* #.9BA N */ - $"20B4 6C42 0552 1177 6F1A AC6D FE8B 98E1" /* lB.R.wo.m */ - $"D3FB F52E BCE3 5BB1 7235 F597 3E0D 8C46" /* .[r5>.F */ - $"7361 1E2A C081 CA97 C8EA CD3F E91D 823F" /* sa.*ʗ?.? */ - $"73A7 5EA1 F641 9CBD 219D D7E4 EE0D 270E" /* s^A!.'. */ - $"14DF F756 B4E5 062C 8251 4AD0 B090 A0AF" /* .V.,QJа */ - $"CD2A 3C80 6068 C9CD C3D7 3D7F 258B 365A" /* *<`h=.%6Z */ - $"5E1A 90DC D058 4ED9 DF50 6F40 07A9 2BDE" /* ^.XNPo@.+ */ - $"8486 5404 AB9C E323 0C4E D3DB 8352 0C0F" /* T.#.NۃR.. */ - $"CD59 A5F5 56CC 0BB2 B603 85C3 C709 7D6E" /* YV..}n */ - $"A10E 33C2 AE0F D52F 5AD7 2279 E6EB 7E6C" /* .3®./Z"y~l */ - $"1757 589D C6DC B4FD 470C FFD9" /* .WXܴG. */ -}; - diff --git a/indra/newview/installers/darwin/release-dmg/_VolumeIcon.icns b/indra/newview/installers/darwin/release-dmg/_VolumeIcon.icns index da5307e389..272b496e7d 100644 Binary files a/indra/newview/installers/darwin/release-dmg/_VolumeIcon.icns and b/indra/newview/installers/darwin/release-dmg/_VolumeIcon.icns differ diff --git a/indra/newview/installers/darwin/release-dmg/background.jpg b/indra/newview/installers/darwin/release-dmg/background.jpg index 55294dcc9a..e7064d9545 100644 Binary files a/indra/newview/installers/darwin/release-dmg/background.jpg and b/indra/newview/installers/darwin/release-dmg/background.jpg differ diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index a273afab52..3853aaa8fd 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -486,7 +486,11 @@ void LLAgent::init() // *Note: this is where LLViewerCamera::getInstance() used to be constructed. - setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); + bool is_flying = gSavedSettings.getBOOL("FlyingAtExit"); + if(is_flying) + { + setFlying(is_flying); + } *mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); @@ -2628,12 +2632,6 @@ void LLAgent::setStartPosition( U32 location_id ) if (!requestPostCapability("HomeLocation", body, boost::bind(&LLAgent::setStartPositionSuccess, this, _1))) LL_WARNS() << "Unable to post to HomeLocation capability." << LL_ENDL; - - const U32 HOME_INDEX = 1; - if( HOME_INDEX == location_id ) - { - setHomePosRegion( mRegionp->getHandle(), getPositionAgent() ); - } } void LLAgent::setStartPositionSuccess(const LLSD &result) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 29642d3f45..8977b145d1 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -100,6 +100,12 @@ const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f; const F32 OBJECT_EXTENTS_PADDING = 0.5f; +static bool isDisableCameraConstraints() +{ + static LLCachedControl sDisableCameraConstraints(gSavedSettings, "DisableCameraConstraints", false); + return sDisableCameraConstraints; +} + // The agent instance. LLAgentCamera gAgentCamera; @@ -570,9 +576,9 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance) { BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars) - if (!mFocusObject || mFocusObject->isDead() || + if (!mFocusObject || mFocusObject->isDead() || mFocusObject->isMesh() || - gSavedSettings.getBOOL("DisableCameraConstraints")) + isDisableCameraConstraints()) { obj_min_distance = 0.f; return TRUE; @@ -742,39 +748,44 @@ F32 LLAgentCamera::getCameraZoomFraction(bool get_third_person) // already [0,1] return mHUDTargetZoom; } - else if (get_third_person || (mFocusOnAvatar && cameraThirdPerson())) + + if (isDisableCameraConstraints()) + { + return mCameraZoomFraction; + } + + if (get_third_person || (mFocusOnAvatar && cameraThirdPerson())) { return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f); } - else if (cameraCustomizeAvatar()) + + if (cameraCustomizeAvatar()) { F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); return clamp_rescale(distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM, 1.f, 0.f ); } - else - { - F32 min_zoom; - F32 max_zoom = getCameraMaxZoomDistance(); - F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); - if (mFocusObject.notNull()) + F32 min_zoom; + F32 max_zoom = getCameraMaxZoomDistance(); + + F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); + if (mFocusObject.notNull()) + { + if (mFocusObject->isAvatar()) { - if (mFocusObject->isAvatar()) - { - min_zoom = AVATAR_MIN_ZOOM; - } - else - { - min_zoom = OBJECT_MIN_ZOOM; - } + min_zoom = AVATAR_MIN_ZOOM; } else { - min_zoom = LAND_MIN_ZOOM; + min_zoom = OBJECT_MIN_ZOOM; } - - return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f); } + else + { + min_zoom = LAND_MIN_ZOOM; + } + + return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f); } void LLAgentCamera::setCameraZoomFraction(F32 fraction) @@ -787,6 +798,10 @@ void LLAgentCamera::setCameraZoomFraction(F32 fraction) { mHUDTargetZoom = fraction; } + else if (isDisableCameraConstraints()) + { + mCameraZoomFraction = fraction; + } else if (mFocusOnAvatar && cameraThirdPerson()) { mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION); @@ -821,6 +836,7 @@ void LLAgentCamera::setCameraZoomFraction(F32 fraction) camera_offset_dir.normalize(); mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom); } + startCameraAnimation(); } @@ -925,51 +941,42 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction) return; } - - LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); - F32 min_zoom = LAND_MIN_ZOOM; + LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); F32 current_distance = (F32)camera_offset_unit.normalize(); F32 new_distance = current_distance * fraction; - // Don't move through focus point - if (mFocusObject) + // Unless camera is unlocked + if (!isDisableCameraConstraints()) { - LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]); + F32 min_zoom = LAND_MIN_ZOOM; - if (mFocusObject->isAvatar()) + // Don't move through focus point + if (mFocusObject) { - calcCameraMinDistance(min_zoom); + LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]); + + if (mFocusObject->isAvatar()) + { + calcCameraMinDistance(min_zoom); + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } } - else + + new_distance = llmax(new_distance, min_zoom); + + F32 max_distance = getCameraMaxZoomDistance(); + max_distance = llmin(max_distance, current_distance * 4.f); //Scaled max relative to current distance. MAINT-3154 + new_distance = llmin(new_distance, max_distance); + + if (cameraCustomizeAvatar()) { - min_zoom = OBJECT_MIN_ZOOM; + new_distance = llclamp(new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM); } } - new_distance = llmax(new_distance, min_zoom); - - F32 max_distance = getCameraMaxZoomDistance(); - - max_distance = llmin(max_distance, current_distance * 4.f); //Scaled max relative to current distance. MAINT-3154 - - if (new_distance > max_distance) - { - new_distance = max_distance; - - /* - // Unless camera is unlocked - if (!LLViewerCamera::sDisableCameraConstraints) - { - return; - } - */ - } - - if(cameraCustomizeAvatar()) - { - new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); - } - mCameraFocusOffsetTarget = new_distance * camera_offset_unit; } @@ -990,53 +997,52 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters) changeCameraToMouselook(FALSE); } - mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION); + if (!isDisableCameraConstraints()) + { + mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION); + } } else { LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); F32 current_distance = (F32)camera_offset_unit.normalize(); F32 new_distance = current_distance - meters; - F32 min_zoom = LAND_MIN_ZOOM; - - // Don't move through focus point - if (mFocusObject.notNull()) + + // Unless camera is unlocked + if (!isDisableCameraConstraints()) { - if (mFocusObject->isAvatar()) + F32 min_zoom = LAND_MIN_ZOOM; + + // Don't move through focus point + if (mFocusObject.notNull()) { - min_zoom = AVATAR_MIN_ZOOM; + if (mFocusObject->isAvatar()) + { + min_zoom = AVATAR_MIN_ZOOM; + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } } - else + + new_distance = llmax(new_distance, min_zoom); + + F32 max_distance = getCameraMaxZoomDistance(); + new_distance = llmin(new_distance, max_distance); + + if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode()) { - min_zoom = OBJECT_MIN_ZOOM; + new_distance = llclamp(new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM); } } - new_distance = llmax(new_distance, min_zoom); - - F32 max_distance = getCameraMaxZoomDistance(); - - if (new_distance > max_distance) - { - // Unless camera is unlocked - if (!gSavedSettings.getBOOL("DisableCameraConstraints")) - { - return; - } - } - - if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() ) - { - new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); - } - // Compute new camera offset mCameraFocusOffsetTarget = new_distance * camera_offset_unit; cameraZoomIn(1.f); } } - //----------------------------------------------------------------------------- // cameraPanIn() //----------------------------------------------------------------------------- @@ -1841,7 +1847,8 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) local_camera_offset = gAgent.getFrameAgent().rotateToAbsolute( local_camera_offset ); } - if (!mCameraCollidePlane.isExactlyZero() && (!isAgentAvatarValid() || !gAgentAvatarp->isSitting())) + if (!isDisableCameraConstraints() && !mCameraCollidePlane.isExactlyZero() && + (!isAgentAvatarValid() || !gAgentAvatarp->isSitting())) { LLVector3 plane_normal; plane_normal.setVec(mCameraCollidePlane.mV); @@ -1960,7 +1967,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) camera_position_global = focusPosGlobal + mCameraFocusOffset; } - if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike()) + if (!isDisableCameraConstraints() && !gAgent.isGodlike()) { LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); bool constrain = true; @@ -1995,16 +2002,14 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) // Don't let camera go underground F32 camera_min_off_ground = getCameraMinOffGround(); - camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); - - if (camera_position_global.mdV[VZ] < camera_land_height + camera_min_off_ground) + F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground); + if (camera_position_global.mdV[VZ] < minZ) { - camera_position_global.mdV[VZ] = camera_land_height + camera_min_off_ground; + camera_position_global.mdV[VZ] = minZ; isConstrained = TRUE; } - if (hit_limit) { *hit_limit = isConstrained; @@ -2131,17 +2136,13 @@ F32 LLAgentCamera::getCameraMinOffGround() { return 0.f; } - else + + if (isDisableCameraConstraints()) { - if (gSavedSettings.getBOOL("DisableCameraConstraints")) - { - return -1000.f; - } - else - { - return 0.5f; - } + return -1000.f; } + + return 0.5f; } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8010b84c20..4c3a9229d2 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2776,9 +2776,23 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool else { selfStartPhase("wear_inventory_category_fetch"); - callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal, - &LLAppearanceMgr::instance(), - category->getUUID(), copy, append)); + if (AISAPI::isAvailable() && category->getPreferredType() == LLFolderType::FT_OUTFIT) + { + // for reliability just fetch it whole, linked items included + LLUUID cat_id = category->getUUID(); + LLInventoryModelBackgroundFetch::getInstance()->fetchFolderAndLinks( + cat_id, + [cat_id, copy, append] + { + LLAppearanceMgr::instance().wearCategoryFinal(cat_id, copy, append); + }); + } + else + { + callAfterCategoryFetch(category->getUUID(), boost::bind(&LLAppearanceMgr::wearCategoryFinal, + &LLAppearanceMgr::instance(), + category->getUUID(), copy, append)); + } } } @@ -2787,7 +2801,7 @@ S32 LLAppearanceMgr::getActiveCopyOperations() const return LLCallAfterInventoryCopyMgr::getInstanceCount(); } -void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) +void LLAppearanceMgr::wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append) { LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL; @@ -4571,30 +4585,20 @@ protected: void callAfterCOFFetch(nullary_func_t cb) { - LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); - LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); - if (AISAPI::isAvailable()) { - // Mark cof (update timer) so that background fetch won't request it - cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); // For reliability assume that we have no relevant cache, so // fetch cof along with items cof's links point to. - AISAPI::FetchCOF([cb](const LLUUID& id) - { - cb(); - LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); - LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); - if (cat) - { - cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); - } - }); + LLInventoryModelBackgroundFetch::getInstance()->fetchCOF(cb); } else { LL_INFOS() << "AIS API v3 not available, using callAfterCategoryFetch" << LL_ENDL; - // startup should have marked folder as fetching, remove that + LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + + // Special case, startup should have marked cof as FETCH_RECURSIVE + // to prevent dupplicate request, remove that cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); callAfterCategoryFetch(cat_id, cb); } @@ -4616,30 +4620,16 @@ void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb) void callAfterCategoryLinksFetch(const LLUUID &cat_id, nullary_func_t cb) { - LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (AISAPI::isAvailable()) { - // Mark folder (update timer) so that background fetch won't request it - cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); // Assume that we have no relevant cache. Fetch folder, and items folder's links point to. - AISAPI::FetchCategoryLinks(cat_id, - [cb, cat_id](const LLUUID &id) - { - cb(); - LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); - if (cat) - { - cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); - } - }); - } - else - { - LL_WARNS() << "AIS API v3 not available, can't use AISAPI::FetchCOF" << LL_ENDL; - // startup should have marked folder as fetching, remove that - cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); - callAfterCategoryFetch(cat_id, cb); - } + LLInventoryModelBackgroundFetch::getInstance()->fetchFolderAndLinks(cat_id, cb); + } + else + { + LL_WARNS() << "AIS API v3 not available, can't use AISAPI::FetchCOF" << LL_ENDL; + callAfterCategoryFetch(cat_id, cb); + } } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 43839e47a6..da29ceee3a 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -58,7 +58,7 @@ public: void updateCOF(const LLUUID& category, bool append = false); void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); - void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append); + void wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append); void wearOutfitByName(const std::string& name); void changeOutfit(bool proceed, const LLUUID& category, bool append); void replaceCurrentOutfit(const LLUUID& new_outfit); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1fc4a8532d..4a43133ff6 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -196,6 +196,7 @@ #include "llhudeffecttrail.h" #include "llvectorperfoptions.h" #include "llslurl.h" +#include "llurlregistry.h" #include "llwatchdog.h" // Included so that constants/settings might be initialized @@ -4312,6 +4313,7 @@ void LLAppViewer::loadKeyBindings() LL_ERRS("InitInfo") << "Unable to open default key bindings from " << key_bindings_file << LL_ENDL; } } + LLUrlRegistry::instance().setKeybindingHandler(&gViewerInput); } void LLAppViewer::purgeCache() diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index c131dc641b..44bf698caa 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -247,6 +247,11 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) app->addObserver(mAvatarId, this); app->sendAvatarPropertiesRequest(mAvatarId); } + else if (gAgentID == mAvatarId) + { + // Always track any changes to our own icon id + app->addObserver(mAvatarId, this); + } } } else diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index 293c9d60a1..a6c9a41fa4 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -79,8 +79,14 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro(std::string url, U64 LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AvatarRenderInfoAccountant", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + // Going to request each 15 seconds either way, so don't wait + // too long and don't repeat + httpOpts->setRetries(0); + httpOpts->setTimeout(SECS_BETWEEN_REGION_REQUEST); + + LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts); LLWorld *world_inst = LLWorld::getInstance(); if (!world_inst) @@ -190,6 +196,11 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AvatarRenderInfoAccountant", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + + // Going to request each 60+ seconds, timeout is 30s. + // Don't repeat too often, will be sending newer data soon + httpOpts->setRetries(1); LLWorld *world_inst = LLWorld::getInstance(); if (!world_inst) @@ -256,7 +267,7 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U regionp = NULL; world_inst = NULL; - LLSD result = httpAdapter->postAndSuspend(httpRequest, url, report); + LLSD result = httpAdapter->postAndSuspend(httpRequest, url, report, httpOpts); world_inst = LLWorld::getInstance(); if (!world_inst) diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 3f607d434e..0cbfad8b73 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -40,7 +40,7 @@ class LLConversationItem; class LLConversationItemSession; class LLConversationItemParticipant; -typedef std::map conversations_items_map; +typedef std::map > conversations_items_map; typedef std::map conversations_widgets_map; typedef std::vector menuentry_vec_t; diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index ac80f1f73b..710bbf8f52 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -760,19 +760,6 @@ void LLDrawable::movePartition() if (part) { part->move(this, getSpatialGroup()); - - // SL-18251 "On-screen animesh characters using pelvis offset animations - // disappear when root goes off-screen" - // - // Update extents of the root node when Control Avatar changes it's bounds - if (mRenderType == LLPipeline::RENDER_TYPE_CONTROL_AV && isRoot()) - { - LLControlAvatar* controlAvatar = dynamic_cast(getVObj().get()); - if (controlAvatar && controlAvatar->mControlAVBridge) - { - ((LLSpatialGroup*)controlAvatar->mControlAVBridge->mOctree->getListener(0))->setState(LLViewerOctreeGroup::DIRTY); - } - } } } diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 011ad67011..f997dc9910 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -155,6 +155,20 @@ void LLFloaterIMContainer::sessionIDUpdated(const LLUUID& old_session_id, const LLFloaterIMSessionTab::addToHost(new_session_id); } + +LLConversationItem* LLFloaterIMContainer::getSessionModel(const LLUUID& session_id) +{ + conversations_items_map::iterator iter = mConversationsItems.find(session_id); + if (iter == mConversationsItems.end()) + { + return NULL; + } + else + { + return iter->second.get(); + } +} + void LLFloaterIMContainer::sessionRemoved(const LLUUID& session_id) { removeConversationListItem(session_id); @@ -611,7 +625,8 @@ void LLFloaterIMContainer::handleConversationModelEvent(const LLSD& event) } else if (type == "add_participant") { - LLConversationItemSession* session_model = dynamic_cast(mConversationsItems[session_id]); + LLConversationItem* item = getSessionModel(session_id); + LLConversationItemSession* session_model = dynamic_cast(item); LLConversationItemParticipant* participant_model = (session_model ? session_model->findParticipant(participant_id) : NULL); LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id); if (!participant_view && session_model && participant_model) @@ -1752,10 +1767,9 @@ BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool void LLFloaterIMContainer::setTimeNow(const LLUUID& session_id, const LLUUID& participant_id) { - LLConversationItemSession* item = dynamic_cast(get_ptr_in_map(mConversationsItems,session_id)); + LLConversationItemSession* item = dynamic_cast(getSessionModel(session_id)); if (item) { - item->setTimeNow(participant_id); mConversationViewModel.requestSortAll(); mConversationsRoot->arrangeAll(); } @@ -1764,7 +1778,7 @@ void LLFloaterIMContainer::setTimeNow(const LLUUID& session_id, const LLUUID& pa void LLFloaterIMContainer::setNearbyDistances() { // Get the nearby chat session: that's the one with uuid nul - LLConversationItemSession* item = dynamic_cast(get_ptr_in_map(mConversationsItems,LLUUID())); + LLConversationItemSession* item = dynamic_cast(getSessionModel(LLUUID())); if (item) { // Get the positions of the nearby avatars and their ids diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index b4a9d377ab..82f3b00ebc 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -106,7 +106,7 @@ public: LLConversationViewModel& getRootViewModel() { return mConversationViewModel; } LLUUID getSelectedSession() { return mSelectedSession; } void setSelectedSession(LLUUID sessionID) { mSelectedSession = sessionID; } - LLConversationItem* getSessionModel(const LLUUID& session_id) { return get_ptr_in_map(mConversationsItems,session_id); } + LLConversationItem* getSessionModel(const LLUUID& session_id); LLConversationSort& getSortOrder() { return mConversationViewModel.getSorter(); } // Handling of lists of participants is public so to be common with llfloatersessiontab diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d4e40ff103..aa723eb3a8 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -250,11 +250,49 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator) } } } -// static -std::string LLFloaterPreference::sSkin = ""; + +// handle secondlife:///app/worldmap/{NAME}/{COORDS} URLs +// Also see LLUrlEntryKeybinding, the value of this command type +// is ability to show up to date value in chat +class LLKeybindingHandler: public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLKeybindingHandler(): LLCommandHandler("keybinding", UNTRUSTED_CLICK_ONLY) + { + } + + bool handle(const LLSD& params, const LLSD& query_map, + const std::string& grid, LLMediaCtrl* web) + { + if (params.size() < 1) return false; + + LLFloaterPreference* prefsfloater = dynamic_cast + (LLFloaterReg::showInstance("preferences")); + + if (prefsfloater) + { + // find 'controls' panel and bring it the front + LLTabContainer* tabcontainer = prefsfloater->getChild("pref core"); + LLPanel* panel = prefsfloater->getChild("controls"); + if (tabcontainer && panel) + { + tabcontainer->selectTabPanel(panel); + } + } + + return true; + } +}; +LLKeybindingHandler gKeybindHandler; + + ////////////////////////////////////////////// // LLFloaterPreference +// static +std::string LLFloaterPreference::sSkin = ""; + LLFloaterPreference::LLFloaterPreference(const LLSD& key) : LLFloater(key), mGotPersonalInfo(false), diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 917d6dfcd0..48d6e01d32 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -175,10 +175,9 @@ void LLFloaterURLEntry::onBtnOK( void* userdata ) // We assume that an empty scheme is an http url, as this is how we will treat it. if(scheme == "") { - scheme = "http"; + scheme = "https"; } - // Discover the MIME type only for "http" scheme. if(!media_url.empty() && (scheme == "http" || scheme == "https")) { @@ -204,13 +203,18 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle pa LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMediaTypeCoro", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpOpts->setFollowRedirects(true); httpOpts->setHeadersOnly(true); + httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, "*/*"); + httpHeaders->append(HTTP_OUT_HEADER_COOKIE, ""); + LL_INFOS("HttpCoroutineAdapter", "genericPostCoro") << "Generic POST for " << url << LL_ENDL; - LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts); + LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts, httpHeaders); LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -226,12 +230,6 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle pa // which have no mime type set. std::string resolvedMimeType = LLMIMETypes::getDefaultMimeType(); - if (!status) - { - floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType); - return; - } - LLSD resultHeaders = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; if (resultHeaders.has(HTTP_IN_HEADER_CONTENT_TYPE)) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 8f3ec8af05..c8559fc9d3 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -121,10 +121,27 @@ static const F32 ZOOM_MAX = 128.f; class LLWorldMapHandler : public LLCommandHandler { public: - // requires trusted browser to trigger - LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_CLICK_ONLY ) { } - - bool handle(const LLSD& params, + LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) + { + } + + virtual bool canHandleUntrusted( + const LLSD& params, + const LLSD& query_map, + LLMediaCtrl* web, + const std::string& nav_type) + { + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) + { + // NAV_TYPE_EXTERNAL will be throttled + return true; + } + + return false; + } + + bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) @@ -160,12 +177,32 @@ LLWorldMapHandler gWorldMapHandler; class LLMapTrackAvatarHandler : public LLCommandHandler { public: - // requires trusted browser to trigger - LLMapTrackAvatarHandler() : LLCommandHandler("maptrackavatar", UNTRUSTED_CLICK_ONLY) + LLMapTrackAvatarHandler() : LLCommandHandler("maptrackavatar", UNTRUSTED_THROTTLE) { } - - bool handle(const LLSD& params, + + virtual bool canHandleUntrusted( + const LLSD& params, + const LLSD& query_map, + LLMediaCtrl* web, + const std::string& nav_type) + { + if (params.size() < 1) + { + return true; // don't block, will fail later + } + + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) + { + // NAV_TYPE_EXTERNAL will be throttled + return true; + } + + return false; + } + + bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index ce28915d93..142177010f 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -549,20 +549,7 @@ void LLFriendCardsManager::syncFriendsFolder() // Create own calling card if it was not found in Friends/All folder if (!collector.isAgentCallingCardFound()) { - LLAvatarName av_name; - LLAvatarNameCache::get( gAgentID, &av_name ); - - create_inventory_item(gAgentID, - gAgent.getSessionID(), - calling_cards_folder_id, - LLTransactionID::tnull, - av_name.getCompleteName(), - gAgentID.asString(), - LLAssetType::AT_CALLINGCARD, - LLInventoryType::IT_CALLINGCARD, - NO_INV_SUBTYPE, - PERM_MOVE | PERM_TRANSFER, - NULL); + create_inventory_callingcard(gAgentID, calling_cards_folder_id); } // All folders created and updated. diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 043316ccca..380e49c320 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -65,7 +65,8 @@ public: return true; // don't block, will fail later } - if (nav_type == NAV_TYPE_CLICKED) + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) { return true; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index cb5316ddf4..932a0316dd 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4336,7 +4336,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items || is_recent_panel || !trash || trash->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN - || trash->getDescendentCount() == LLViewerInventoryCategory::VERSION_UNKNOWN) + || trash->getDescendentCount() == LLViewerInventoryCategory::VERSION_UNKNOWN + || gAgentAvatarp->hasAttachmentsInTrash()) { disabled_items.push_back(std::string("Empty Trash")); } @@ -6510,6 +6511,7 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { items.push_back(std::string("Activate")); } + items.push_back(std::string("PlayGesture")); } addLinkReplaceMenuOption(items, disabled_items); hide_context_entries(menu, items, disabled_items); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 845ea01f56..72ef6e5bb6 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -58,6 +58,7 @@ static LLPanelInjector t_inventory_gallery("inventory_gallery"); const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; +const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately // Helper dnd functions BOOL dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, BOOL drop, std::string& tooltip_msg, BOOL is_link); @@ -106,6 +107,7 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p) mGalleryWidthFactor(p.gallery_width_factor), mIsInitialized(false), mRootDirty(false), + mLoadThumbnailsImmediately(true), mNeedsArrange(false), mSearchType(LLInventoryFilter::SEARCHTYPE_NAME), mSortOrder(LLInventoryFilter::SO_DATE) @@ -540,6 +542,12 @@ void LLInventoryGallery::addToGallery(LLInventoryGalleryItem* item) int n_prev = n - 1; int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1; + // Avoid loading too many items. + // Intent is for small folders to display all content fast + // and for large folders to load content mostly as needed + // Todo: ideally needs to unload images outside visible area + mLoadThumbnailsImmediately = mItemsAddedCount < FAST_LOAD_THUMBNAIL_TRSHOLD; + bool add_row = row_count != row_count_prev; int pos = 0; if (add_row) @@ -573,6 +581,8 @@ void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item, boo mItemsAddedCount--; mIndexToItemMap.erase(mItemsAddedCount); + mLoadThumbnailsImmediately = mItemsAddedCount < FAST_LOAD_THUMBNAIL_TRSHOLD; + bool remove_row = row_count != row_count_prev; removeFromLastRow(mItems[mItemsAddedCount]); mItems.pop_back(); @@ -636,6 +646,7 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L gitem->setUUID(item_id); gitem->setGallery(this); gitem->setType(type, inventory_type, flags, is_link); + gitem->setLoadImmediately(mLoadThumbnailsImmediately); gitem->setThumbnail(thumbnail_id); gitem->setWorn(is_worn); gitem->setCreatorName(get_searchable_creator_name(&gInventory, item_id)); @@ -997,6 +1008,7 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id) if (mItemMap[item_id]) { + mItemMap[item_id]->setLoadImmediately(mLoadThumbnailsImmediately); mItemMap[item_id]->setThumbnail(thumbnail_id); bool passes_filter = checkAgainstFilters(mItemMap[item_id], mFilterSubString); @@ -2570,6 +2582,7 @@ BOOL LLInventoryGalleryItem::postBuild() { mNameText = getChild("item_name"); mTextBgPanel = getChild("text_bg_panel"); + mThumbnailCtrl = getChild("preview_thumbnail"); return TRUE; } @@ -2645,14 +2658,19 @@ void LLInventoryGalleryItem::setThumbnail(LLUUID id) mDefaultImage = id.isNull(); if(mDefaultImage) { - getChild("preview_thumbnail")->clearTexture(); + mThumbnailCtrl->clearTexture(); } else { - getChild("preview_thumbnail")->setValue(id); + mThumbnailCtrl->setValue(id); } } +void LLInventoryGalleryItem::setLoadImmediately(bool val) +{ + mThumbnailCtrl->setInitImmediately(val); +} + void LLInventoryGalleryItem::draw() { if (isFadeItem()) @@ -2667,7 +2685,7 @@ void LLInventoryGalleryItem::draw() // Draw border LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "MenuItemHighlightBgColor" : "TextFgTentativeColor", LLColor4::white); - LLRect border = getChildView("preview_thumbnail")->getRect(); + LLRect border = mThumbnailCtrl->getRect(); border.mRight = border.mRight + 1; border.mTop = border.mTop + 1; gl_rect_2d(border, border_color.get(), FALSE); @@ -2889,7 +2907,7 @@ void LLInventoryGalleryItem::updateNameText() mNameText->setFont(getTextFont()); mNameText->setText(mItemName + mPermSuffix + mWornSuffix); mNameText->setToolTip(mItemName + mPermSuffix + mWornSuffix); - getChild("preview_thumbnail")->setToolTip(mItemName + mPermSuffix + mWornSuffix); + mThumbnailCtrl->setToolTip(mItemName + mPermSuffix + mWornSuffix); } bool LLInventoryGalleryItem::isFadeItem() diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 9b3f12701f..0c52e7b713 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -39,6 +39,7 @@ class LLInventoryGalleryItem; class LLScrollContainer; class LLTextBox; class LLThumbnailsObserver; +class LLThumbnailCtrl; class LLGalleryGestureObserver; class LLInventoryGalleryContextMenu; @@ -246,6 +247,7 @@ private: int mRowCount; int mItemsAddedCount; bool mGalleryCreated; + bool mLoadThumbnailsImmediately; bool mNeedsArrange; /* Params */ @@ -342,6 +344,7 @@ public: LLAssetType::EType getAssetType() { return mType; } void setThumbnail(LLUUID id); void setGallery(LLInventoryGallery* gallery) { mGallery = gallery; } + void setLoadImmediately(bool val); bool isFolder() { return mIsFolder; } bool isLink() { return mIsLink; } EInventorySortGroup getSortGroup() { return mSortGroup; } @@ -354,6 +357,7 @@ private: LLUUID mUUID; LLTextBox* mNameText; LLPanel* mTextBgPanel; + LLThumbnailCtrl* mThumbnailCtrl; bool mSelected; bool mWorn; bool mDefaultImage; diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 91adef8047..1f410bea10 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -357,6 +357,7 @@ void LLInventoryModelBackgroundFetch::scheduleFolderFetch(const LLUUID& cat_id, if (mFetchFolderQueue.empty() || mFetchFolderQueue.front().mUUID != cat_id) { mBackgroundFetchActive = true; + mFolderFetchActive = true; // Specific folder requests go to front of queue. mFetchFolderQueue.push_front(FetchQueueInfo(cat_id, forced ? FT_FORCED : FT_DEFAULT)); @@ -375,6 +376,61 @@ void LLInventoryModelBackgroundFetch::scheduleItemFetch(const LLUUID& item_id, b } } +void LLInventoryModelBackgroundFetch::fetchFolderAndLinks(const LLUUID& cat_id, nullary_func_t callback) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (cat) + { + // Mark folder (update timer) so that background fetch won't request it + cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + } + incrFetchFolderCount(1); + mExpectedFolderIds.push_back(cat_id); + + // Assume that we have no relevant cache. Fetch folder, and items folder's links point to. + AISAPI::FetchCategoryLinks(cat_id, + [callback, cat_id](const LLUUID& id) + { + callback(); + if (id.isNull()) + { + LL_WARNS() << "Failed to fetch category links " << cat_id << LL_ENDL; + } + LLInventoryModelBackgroundFetch::getInstance()->onAISFolderCalback(cat_id, id, FT_DEFAULT); + }); + + // start idle loop to track completion + mBackgroundFetchActive = true; + mFolderFetchActive = true; + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +} + +void LLInventoryModelBackgroundFetch::fetchCOF(nullary_func_t callback) +{ + LLUUID cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (cat) + { + // Mark cof (update timer) so that background fetch won't request it + cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + } + incrFetchFolderCount(1); + mExpectedFolderIds.push_back(cat_id); + // For reliability assume that we have no relevant cache, so + // fetch cof along with items cof's links point to. + AISAPI::FetchCOF([callback](const LLUUID& id) + { + callback(); + LLUUID cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + LLInventoryModelBackgroundFetch::getInstance()->onAISFolderCalback(cat_id, id, FT_DEFAULT); + }); + + // start idle loop to track completion + mBackgroundFetchActive = true; + mFolderFetchActive = true; + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +} + void LLInventoryModelBackgroundFetch::findLostItems() { mBackgroundFetchActive = true; diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index e7be265a3d..a712fc7604 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -53,6 +53,13 @@ public: void scheduleFolderFetch(const LLUUID& cat_id, bool forced = false); void scheduleItemFetch(const LLUUID& item_id, bool forced = false); + typedef boost::function nullary_func_t; + // AIS3 only, Fetches folder and everithing links inside the folder point to + // Intended for outfits + void fetchFolderAndLinks(const LLUUID& cat_id, nullary_func_t callback); + // AIS3 only + void fetchCOF(nullary_func_t callback); + BOOL folderFetchActive() const; bool isEverythingFetched() const; // completing the fetch once per session should be sufficient diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 281a8bc789..fe067b621a 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -337,52 +337,49 @@ void LLInventoryFetchItemsObserver::startFetch() { for (requests_by_folders_t::value_type &folder : requests) { - if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS) + LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first); + if (cat) { - // requesting one by one will take a while - // do whole folder - LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); - } - else - { - LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first); - if (cat) + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { - if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) - { - // start fetching whole folder since it's not ready either way - cat->fetch(); - } - else if (cat->getViewerDescendentCount() <= folder.second.size() - || cat->getDescendentCount() <= folder.second.size()) - { - // Start fetching whole folder since we need all items - LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); + // start fetching whole folder since it's not ready either way + cat->fetch(); + } + else if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS) + { + // requesting one by one will take a while + // do whole folder + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); + } + else if (cat->getViewerDescendentCount() <= folder.second.size() + || cat->getDescendentCount() <= folder.second.size()) + { + // Start fetching whole folder since we need all items + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); - } - else - { - // get items one by one - for (LLUUID &item_id : folder.second) - { - LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); - } - } } else { - // Isn't supposed to happen? We should have all folders - // and if item exists, folder is supposed to exist as well. - llassert(false); - LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL; - // get items one by one - for (LLUUID &item_id : folder.second) + for (LLUUID& item_id : folder.second) { LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); } } } + else + { + // Isn't supposed to happen? We should have all folders + // and if item exists, folder is supposed to exist as well. + llassert(false); + LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL; + + // get items one by one + for (LLUUID& item_id : folder.second) + { + LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); + } + } } } else @@ -421,10 +418,22 @@ void LLInventoryFetchDescendentsObserver::changed(U32 mask) } ++it; } - if (mIncomplete.empty()) - { - done(); - } + + if (mIncomplete.empty()) + { + done(); + } + else + { + LLInventoryModelBackgroundFetch* fetcher = LLInventoryModelBackgroundFetch::getInstance(); + if (fetcher->isEverythingFetched() + && !fetcher->folderFetchActive()) + { + // If fetcher is done with folders yet we are waiting, fetch either + // failed or version is somehow stuck at -1 + done(); + } + } } void LLInventoryFetchDescendentsObserver::startFetch() @@ -435,12 +444,8 @@ void LLInventoryFetchDescendentsObserver::startFetch() if (!cat) continue; if (!isCategoryComplete(cat)) { - // CHECK IT: isCategoryComplete() checks both version and descendant count but - // fetch() only works for Unknown version and doesn't care about descentants, - // as result fetch won't start and folder will potentially get stuck as - // incomplete in observer. - // Likely either both should use only version or both should check descendants. - cat->fetch(); //blindly fetch it without seeing if anything else is fetching it. + //blindly fetch it without seeing if anything else is fetching it. + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(*it, true); mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer. } else diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp index 60f8aca94c..4a0ee8fd0c 100644 --- a/indra/newview/llkeyconflict.cpp +++ b/indra/newview/llkeyconflict.cpp @@ -74,40 +74,6 @@ std::string string_from_mask(MASK mask) return res; } -std::string string_from_mouse(EMouseClickType click, bool translate) -{ - std::string res; - switch (click) - { - case CLICK_LEFT: - res = "LMB"; - break; - case CLICK_MIDDLE: - res = "MMB"; - break; - case CLICK_RIGHT: - res = "RMB"; - break; - case CLICK_BUTTON4: - res = "MB4"; - break; - case CLICK_BUTTON5: - res = "MB5"; - break; - case CLICK_DOUBLELEFT: - res = "Double LMB"; - break; - default: - break; - } - - if (translate && !res.empty()) - { - res = LLTrans::getString(res); - } - return res; -} - // LLKeyConflictHandler S32 LLKeyConflictHandler::sTemporaryFileUseCount = 0; @@ -270,7 +236,7 @@ std::string LLKeyConflictHandler::getStringFromKeyData(const LLKeyData& keydata) result = LLKeyboard::stringFromAccelerator(keydata.mMask); } - result += string_from_mouse(keydata.mMouse, true); + result += LLKeyboard::stringFromMouse(keydata.mMouse); return result; } @@ -545,7 +511,7 @@ void LLKeyConflictHandler::saveToSettings(bool temporary) { // set() because 'optional', for compatibility purposes // just copy old keys.xml and rename to key_bindings.xml, it should work - binding.mouse.set(string_from_mouse(data.mMouse, false), true); + binding.mouse.set(LLKeyboard::stringFromMouse(data.mMouse, false), true); } binding.command = iter->first; mode.bindings.add(binding); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index d6f3068610..9fa35e3bd9 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -391,7 +391,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) LL_WARNS() << "Error loading navigation bar context menu" << LL_ENDL; } - getTextEntry()->setRightMouseUpCallback(boost::bind(&LLLocationInputCtrl::onTextEditorRightClicked,this,_2,_3,_4)); + //don't show default context menu + getTextEntry()->setShowContextMenu(false); + getTextEntry()->setRightMouseDownCallback(boost::bind(&LLLocationInputCtrl::onTextEditorRightClicked, this, _2, _3, _4)); updateWidgetlayout(); // Connecting signal for updating location on "Show Coordinates" setting change. diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index a2e136bd5a..f276d6d785 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -1077,7 +1077,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg, msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_CurrentInterval, current_interval ); msg->getStringFast(_PREHASH_MoneyData, _PREHASH_StartDate, start_date); - std::string time_str = LLTrans::getString("GroupMoneyDate"); + std::string time_str = LLTrans::getString("GroupMoneyStartDate"); LLSD substitution; // We don't do time zone corrections of the calculated number of seconds @@ -1232,7 +1232,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg, // Start with the date. if (text == mImplementationp->mLoadingText) { - std::string time_str = LLTrans::getString("GroupMoneyDate"); + std::string time_str = LLTrans::getString("GroupMoneyStartDate"); LLSD substitution; // We don't do time zone corrections of the calculated number of seconds diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index c2c9139c19..ffbed778c1 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -277,9 +277,9 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id) //TODO: changes take two minutes to propagate! // Add some storage that holds updated data for two minutes // for new instances to reuse the data -// Profile data is only relevant to won avatar, but notes -// are for everybody -void put_avatar_properties_coro(std::string cap_url, LLUUID agent_id, LLSD data) +// Profile data is only relevant to own avatar, but notes +// are for everybody (no onger an issue?) +void put_avatar_properties_coro(std::string cap_url, LLUUID agent_id, LLSD data, std::function callback) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t @@ -300,10 +300,16 @@ void put_avatar_properties_coro(std::string cap_url, LLUUID agent_id, LLSD data) if (!status) { LL_WARNS("AvatarProperties") << "Failed to put agent information " << data << " for id " << agent_id << LL_ENDL; - return; + } + else + { + LL_DEBUGS("AvatarProperties") << "Agent id: " << agent_id << " Data: " << data << " Result: " << httpResults << LL_ENDL; } - LL_DEBUGS("AvatarProperties") << "Agent id: " << agent_id << " Data: " << data << " Result: " << httpResults << LL_ENDL; + if (callback) + { + callback(status); + } } LLUUID post_profile_image(std::string cap_url, const LLSD &first_data, std::string path_to_image, LLHandle *handle) @@ -448,6 +454,13 @@ void post_profile_image_coro(std::string cap_url, EProfileImageType type, std::s } } + if (type == PROFILE_IMAGE_SL && result.notNull()) + { + LLAvatarIconIDCache::getInstance()->add(gAgentID, result); + // Should trigger callbacks in icon controls + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(gAgentID); + } + // Cleanup LLFile::remove(path_to_image); delete handle; @@ -499,7 +512,8 @@ public: return true; // don't block, will fail later } - if (nav_type == NAV_TYPE_CLICKED) + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) { return true; } @@ -1832,7 +1846,7 @@ void LLPanelProfileSecondLife::onShowInSearchCallback() LLSD data; data["allow_publish"] = mAllowPublish; LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), data)); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), data, nullptr)); } else { @@ -1847,7 +1861,7 @@ void LLPanelProfileSecondLife::onSaveDescriptionChanges() if (!cap_url.empty()) { LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("sl_about_text", mDescriptionText))); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("sl_about_text", mDescriptionText), nullptr)); } else { @@ -1993,10 +2007,19 @@ void LLPanelProfileSecondLife::onCommitProfileImage(const LLUUID& id) std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP); if (!cap_url.empty()) { + std::function callback = [id](bool result) + { + if (result) + { + LLAvatarIconIDCache::getInstance()->add(gAgentID, id); + // Should trigger callbacks in icon controls + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(gAgentID); + } + }; LLSD params; params["sl_image_id"] = id; LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params)); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params, callback)); mImageId = id; if (mImageId == LLUUID::null) @@ -2332,7 +2355,7 @@ void LLPanelProfileFirstLife::onCommitPhoto(const LLUUID& id) LLSD params; params["fl_image_id"] = id; LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params)); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params, nullptr)); mImageId = id; if (mImageId.notNull()) @@ -2376,7 +2399,7 @@ void LLPanelProfileFirstLife::onSaveDescriptionChanges() if (!cap_url.empty()) { LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("fl_about_text", mCurrentDescription))); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("fl_about_text", mCurrentDescription), nullptr)); } else { @@ -2519,7 +2542,7 @@ void LLPanelProfileNotes::onSaveNotesChanges() if (!cap_url.empty()) { LLCoros::instance().launch("putAgentUserInfoCoro", - boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("notes", mCurrentNotes))); + boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), LLSD().with("notes", mCurrentNotes), nullptr)); } else { diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index dec6cfd83b..3fbaad4dee 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -93,7 +93,8 @@ public: return true; // don't block, will fail later } - if (nav_type == NAV_TYPE_CLICKED) + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) { return true; } diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index 0535036cb0..ff3f654d0e 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -74,7 +74,8 @@ public: return true; // don't block, will fail later } - if (nav_type == NAV_TYPE_CLICKED) + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) { return true; } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index a63d46f502..c650513ab8 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -830,8 +830,44 @@ void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* c assert_states_valid(this); } +//virtual +void LLSpatialGroup::rebound() +{ + if (!isDirty()) + return; -void LLSpatialGroup::destroyGLState(bool keep_occlusion) + super::rebound(); + + if (mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_CONTROL_AV) + { + llassert(mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_CONTROL_AV); + + LLSpatialBridge* bridge = getSpatialPartition()->asBridge(); + if (bridge && + bridge->mDrawable && + bridge->mDrawable->getVObj() && + bridge->mDrawable->getVObj()->isRoot()) + { + LLControlAvatar* controlAvatar = bridge->mDrawable->getVObj()->getControlAvatar(); + if (controlAvatar && + controlAvatar->mDrawable && + controlAvatar->mControlAVBridge) + { + llassert(controlAvatar->mControlAVBridge->mOctree); + + LLSpatialGroup* root = (LLSpatialGroup*)controlAvatar->mControlAVBridge->mOctree->getListener(0); + if (this == root) + { + const LLVector4a* addingExtents = controlAvatar->mDrawable->getSpatialExtents(); + const LLXformMatrix* currentTransform = bridge->mDrawable->getXform(); + expandExtents(addingExtents, *currentTransform); + } + } + } + } +} + +void LLSpatialGroup::destroyGLState(bool keep_occlusion) { setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::IMAGE_DIRTY); diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 4214c26391..758e716c00 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -201,6 +201,7 @@ public: LL_ALIGN_PREFIX(16) class LLSpatialGroup : public LLOcclusionCullingGroup { + using super = LLOcclusionCullingGroup; friend class LLSpatialPartition; friend class LLOctreeStateCheck; public: @@ -333,6 +334,9 @@ public: virtual void handleDestruction(const TreeNode* node); virtual void handleChildAddition(const OctreeNode* parent, OctreeNode* child); + // LLViewerOctreeGroup + virtual void rebound(); + public: LL_ALIGN_16(LLVector4a mViewAngle); LL_ALIGN_16(LLVector4a mLastUpdateViewAngle); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 430679943f..d0b76848f7 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2904,8 +2904,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, // Need to fetch cof contents before we can wear. if (do_copy) { - callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), - boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append)); + callAfterCOFFetch(boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append)); } else { diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp index 04130fc724..b558c249cb 100644 --- a/indra/newview/llthumbnailctrl.cpp +++ b/indra/newview/llthumbnailctrl.cpp @@ -57,7 +57,8 @@ LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p) , mFallbackImagep(p.fallback_image) , mInteractable(p.interactable()) , mShowLoadingPlaceholder(p.show_loading()) -, mPriority(LLGLTexture::BOOST_PREVIEW) +, mInited(false) +, mInitImmediately(true) { mLoadingPlaceholderString = LLTrans::getString("texture_loading"); @@ -84,6 +85,10 @@ LLThumbnailCtrl::~LLThumbnailCtrl() void LLThumbnailCtrl::draw() { + if (!mInited) + { + initImage(); + } LLRect draw_rect = getLocalRect(); if (mBorderVisible) @@ -171,11 +176,19 @@ void LLThumbnailCtrl::draw() LLUICtrl::draw(); } +void LLThumbnailCtrl::setVisible(BOOL visible) +{ + if (!visible && mInited) + { + unloadImage(); + } + LLUICtrl::setVisible(visible); +} + void LLThumbnailCtrl::clearTexture() { - mImageAssetID = LLUUID::null; - mTexturep = nullptr; - mImagep = nullptr; + setValue(LLSD()); + mInited = true; // nothing to do } // virtual @@ -191,38 +204,11 @@ void LLThumbnailCtrl::setValue(const LLSD& value) LLUICtrl::setValue(tvalue); - mImageAssetID = LLUUID::null; - mTexturep = nullptr; - mImagep = nullptr; - - if (tvalue.isUUID()) - { - mImageAssetID = tvalue.asUUID(); - if (mImageAssetID.notNull()) - { - // Should it support baked textures? - mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - - mTexturep->setBoostLevel(mPriority); - mTexturep->forceToSaveRawImage(0); - - S32 desired_draw_width = mTexturep->getWidth(); - S32 desired_draw_height = mTexturep->getHeight(); - - mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height); - } - } - else if (tvalue.isString()) + unloadImage(); + + if (mInitImmediately) { - mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI); - if (mImagep) - { - LLViewerFetchedTexture* texture = dynamic_cast(mImagep->getImage().get()); - if(texture) - { - mImageAssetID = texture->getID(); - } - } + initImage(); } } @@ -236,4 +222,50 @@ BOOL LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask) return LLUICtrl::handleHover(x, y, mask); } +void LLThumbnailCtrl::initImage() +{ + if (mInited) + { + return; + } + mInited = true; + LLSD tvalue = getValue(); + + if (tvalue.isUUID()) + { + mImageAssetID = tvalue.asUUID(); + if (mImageAssetID.notNull()) + { + // Should it support baked textures? + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL); + + mTexturep->forceToSaveRawImage(0); + + S32 desired_draw_width = MAX_IMAGE_SIZE; + S32 desired_draw_height = MAX_IMAGE_SIZE; + mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height); + } + } + else if (tvalue.isString()) + { + mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI); + if (mImagep) + { + LLViewerFetchedTexture* texture = dynamic_cast(mImagep->getImage().get()); + if (texture) + { + mImageAssetID = texture->getID(); + } + } + } +} + +void LLThumbnailCtrl::unloadImage() +{ + mImageAssetID = LLUUID::null; + mTexturep = nullptr; + mImagep = nullptr; + mInited = false; +} + diff --git a/indra/newview/llthumbnailctrl.h b/indra/newview/llthumbnailctrl.h index 686603b373..f84a583271 100644 --- a/indra/newview/llthumbnailctrl.h +++ b/indra/newview/llthumbnailctrl.h @@ -64,17 +64,24 @@ public: virtual ~LLThumbnailCtrl(); virtual void draw() override; + void setVisible(BOOL visible) override; virtual void setValue(const LLSD& value ) override; + void setInitImmediately(bool val) { mInitImmediately = val; } void clearTexture(); virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + +protected: + void initImage(); + void unloadImage(); private: - S32 mPriority; bool mBorderVisible; bool mInteractable; bool mShowLoadingPlaceholder; + bool mInited; + bool mInitImmediately; std::string mLoadingPlaceholderString; LLUUID mImageAssetID; LLViewBorder* mBorder; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 74e0fe056e..8353d4d1d7 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -195,7 +195,11 @@ public: std::string fl_name = params[0].asString(); - if (nav_type == NAV_TYPE_CLICKED) + // External browsers explicitly ask user about opening links + // so treat "external" same as "clicked" in this case, + // despite it being treated as untrusted. + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) { const std::list blacklist_clicked = { "camera_presets", diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp index 7207d6c6ba..97e180df71 100644 --- a/indra/newview/llviewerinput.cpp +++ b/indra/newview/llviewerinput.cpp @@ -991,34 +991,50 @@ LLViewerInput::LLViewerInput() } } -// static -BOOL LLViewerInput::modeFromString(const std::string& string, S32 *mode) +LLViewerInput::~LLViewerInput() { - if (string == "FIRST_PERSON") + +} + +// static +bool LLViewerInput::modeFromString(const std::string& string, S32 *mode) +{ + if (string.empty()) + { + return false; + } + + std::string cmp_string = string; + LLStringUtil::toLower(cmp_string); + if (cmp_string == "first_person") { *mode = MODE_FIRST_PERSON; - return TRUE; + return true; } - else if (string == "THIRD_PERSON") + else if (cmp_string == "third_person") { *mode = MODE_THIRD_PERSON; - return TRUE; + return true; } - else if (string == "EDIT_AVATAR") + else if (cmp_string == "edit_avatar") { *mode = MODE_EDIT_AVATAR; - return TRUE; + return true; } - else if (string == "SITTING") + else if (cmp_string == "sitting") { *mode = MODE_SITTING; - return TRUE; - } - else - { - *mode = MODE_THIRD_PERSON; - return FALSE; + return true; } + + S32 val = atoi(string.c_str()); + if (val >= 0 && val < MODE_COUNT) + { + *mode = val; + return true; + } + + return false; } // static @@ -1222,6 +1238,7 @@ BOOL LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, cons bind.mKey = key; bind.mMask = mask; bind.mFunction = function; + bind.mFunctionName = function_name; if (result->mIsGlobal) { @@ -1303,6 +1320,7 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const bind.mMouse = mouse; bind.mMask = mask; bind.mFunction = function; + bind.mFunctionName = function_name; if (result->mIsGlobal) { @@ -1801,3 +1819,49 @@ bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask } return false; } + +std::string LLViewerInput::getKeyBindingAsString(const std::string& mode, const std::string& control) const +{ + S32 keyboard_mode; + if (!modeFromString(mode, &keyboard_mode)) + { + keyboard_mode = getMode(); + } + + std::string res; + bool needs_separator = false; + + // keybindings are sorted from having most mask to no mask (from restrictive to less restrictive), + // but it's visually better to present this data in reverse + std::vector::const_reverse_iterator iter_key = mKeyBindings[keyboard_mode].rbegin(); + while (iter_key != mKeyBindings[keyboard_mode].rend()) + { + if (iter_key->mFunctionName == control) + { + if (needs_separator) + { + res.append(" | "); + } + res.append(LLKeyboard::stringFromAccelerator(iter_key->mMask, iter_key->mKey)); + needs_separator = true; + } + iter_key++; + } + + std::vector::const_reverse_iterator iter_mouse = mMouseBindings[keyboard_mode].rbegin(); + while (iter_mouse != mMouseBindings[keyboard_mode].rend()) + { + if (iter_mouse->mFunctionName == control) + { + if (needs_separator) + { + res.append(" | "); + } + res.append(LLKeyboard::stringFromAccelerator(iter_mouse->mMask, iter_mouse->mMouse)); + needs_separator = true; + } + iter_mouse++; + } + + return res; +} diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index 52e95e2168..41e289ac1d 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -28,12 +28,13 @@ #define LL_LLVIEWERINPUT_H #include "llkeyboard.h" // For EKeystate -#include "llinitparam.h" const S32 MAX_KEY_BINDINGS = 128; // was 60 const S32 keybindings_xml_version = 1; const std::string script_mouse_handler_name = "script_trigger_lbutton"; +class LLWindow; + class LLNamedFunction { public: @@ -51,6 +52,7 @@ public: MASK mMask; LLKeyFunc mFunction; + std::string mFunctionName; }; class LLMouseBinding @@ -60,6 +62,7 @@ public: MASK mMask; LLKeyFunc mFunction; + std::string mFunctionName; }; @@ -72,11 +75,7 @@ typedef enum e_keyboard_mode MODE_COUNT } EKeyboardMode; -class LLWindow; - -void bind_keyboard_functions(); - -class LLViewerInput +class LLViewerInput : public LLKeyBindingToStringHandler { public: struct KeyBinding : public LLInitParam::Block @@ -107,6 +106,7 @@ public: }; LLViewerInput(); + virtual ~LLViewerInput(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); BOOL handleKeyUp(KEY key, MASK mask); @@ -121,7 +121,7 @@ public: S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error EKeyboardMode getMode() const; - static BOOL modeFromString(const std::string& string, S32 *mode); // False on failure + static bool modeFromString(const std::string& string, S32 *mode); // False on failure static BOOL mouseFromString(const std::string& string, EMouseClickType *mode);// False on failure bool scanKey(KEY key, @@ -136,6 +136,9 @@ public: bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const; bool isLMouseHandlingDefault(const S32 mode) const { return mLMouseDefaultHandling[mode]; } + // inherited from LLKeyBindingToStringHandler + virtual std::string getKeyBindingAsString(const std::string& mode, const std::string& control) const override; + private: bool scanKey(const std::vector &binding, S32 binding_count, diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 5ee613d49d..3e3a574988 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -232,9 +232,29 @@ LLLocalizedInventoryItemsDictionary::LLLocalizedInventoryItemsDictionary() class LLInventoryHandler : public LLCommandHandler { public: - // requires trusted browser to trigger - LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_CLICK_ONLY) { } - + LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_THROTTLE) { } + + virtual bool canHandleUntrusted( + const LLSD& params, + const LLSD& query_map, + LLMediaCtrl* web, + const std::string& nav_type) + { + if (params.size() < 1) + { + return true; // don't block, will fail later + } + + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) + { + // NAV_TYPE_EXTERNAL will be throttled + return true; + } + + return false; + } + bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, @@ -1151,14 +1171,29 @@ void create_inventory_item( gAgent.sendReliableMessage(); } +void create_inventory_callingcard_callback(LLPointer cb, + const LLUUID &parent, + const LLUUID &avatar_id, + const LLAvatarName &av_name) +{ + std::string item_desc = avatar_id.asString(); + create_inventory_item(gAgent.getID(), + gAgent.getSessionID(), + parent, + LLTransactionID::tnull, + av_name.getUserName(), + item_desc, + LLAssetType::AT_CALLINGCARD, + LLInventoryType::IT_CALLINGCARD, + NO_INV_SUBTYPE, + PERM_MOVE | PERM_TRANSFER, + cb); +} + void create_inventory_callingcard(const LLUUID& avatar_id, const LLUUID& parent /*= LLUUID::null*/, LLPointer cb/*=NULL*/) { - std::string item_desc = avatar_id.asString(); LLAvatarName av_name; - LLAvatarNameCache::get(avatar_id, &av_name); - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - parent, LLTransactionID::tnull, av_name.getUserName(), item_desc, LLAssetType::AT_CALLINGCARD, - LLInventoryType::IT_CALLINGCARD, NO_INV_SUBTYPE, PERM_MOVE | PERM_TRANSFER, cb); + LLAvatarNameCache::get(avatar_id, boost::bind(&create_inventory_callingcard_callback, cb, parent, _1, _2)); } void create_inventory_wearable(const LLUUID& agent_id, const LLUUID& session_id, diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 2bcd0858d3..d4346ee2d9 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3485,6 +3485,12 @@ void LLViewerObject::doInventoryCallback() void LLViewerObject::removeInventory(const LLUUID& item_id) { + // close associated floater properties + LLSD params; + params["id"] = item_id; + params["object"] = mID; + LLFloaterReg::hideInstance("item_properties", params); + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_RemoveTaskInventory); msg->nextBlockFast(_PREHASH_AgentData); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 4a1cf0109e..ec6f2c848f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -93,7 +93,8 @@ S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64; const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez; const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128; -const S32 DEFAULT_ICON_DIMENTIONS = 32; +const S32 DEFAULT_ICON_DIMENSIONS = 32; +const S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256; U32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256. U32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA; bool LLViewerTexture::sFreezeImageUpdates = false; @@ -665,7 +666,8 @@ void LLViewerTexture::setBoostLevel(S32 level) mBoostLevel = level; if(mBoostLevel != LLViewerTexture::BOOST_NONE && mBoostLevel != LLViewerTexture::BOOST_SELECTED && - mBoostLevel != LLViewerTexture::BOOST_ICON) + mBoostLevel != LLViewerTexture::BOOST_ICON && + mBoostLevel != LLViewerTexture::BOOST_THUMBNAIL) { setNoDelete(); } @@ -1180,8 +1182,19 @@ void LLViewerFetchedTexture::loadFromFastCache() { // Shouldn't do anything usefull since texures in fast cache are 16x16, // it is here in case fast cache changes. - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; + if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) + { + // scale oversized icon, no need to give more work to gl + mRawImage->scale(expected_width, expected_height); + } + } + + if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) + { + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) { // scale oversized icon, no need to give more work to gl @@ -1682,7 +1695,7 @@ void LLViewerFetchedTexture::processTextureStats() { mDesiredDiscardLevel = 0; } - else if (mDontDiscard && mBoostLevel == LLGLTexture::BOOST_ICON) + else if (mDontDiscard && (mBoostLevel == LLGLTexture::BOOST_ICON || mBoostLevel == LLGLTexture::BOOST_THUMBNAIL)) { if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) { @@ -1916,8 +1929,20 @@ bool LLViewerFetchedTexture::updateFetch() if (mBoostLevel == LLGLTexture::BOOST_ICON) { - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; + if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) + { + // scale oversized icon, no need to give more work to gl + // since we got mRawImage from thread worker and image may be in use (ex: writing cache), make a copy + mRawImage = mRawImage->scaled(expected_width, expected_height); + } + } + + if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) + { + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) { // scale oversized icon, no need to give more work to gl @@ -2652,7 +2677,9 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) { - if (mSavedRawDiscardLevel != discard_level && mBoostLevel != BOOST_ICON) + if (mSavedRawDiscardLevel != discard_level + && mBoostLevel != BOOST_ICON + && mBoostLevel != BOOST_THUMBNAIL) { mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()); mRawImage->copy(getSavedRawImage()); @@ -2759,8 +2786,22 @@ void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* im { if (mBoostLevel == LLGLTexture::BOOST_ICON) { - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; + if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) + { + mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents()); + mCachedRawImage->copyScaled(imageraw); + } + else + { + mCachedRawImage = imageraw; + } + } + else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) + { + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) { mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents()); @@ -2867,8 +2908,22 @@ void LLViewerFetchedTexture::saveRawImage() mSavedRawDiscardLevel = mRawDiscardLevel; if (mBoostLevel == LLGLTexture::BOOST_ICON) { - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; + if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) + { + mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); + mSavedRawImage->copyScaled(mRawImage); + } + else + { + mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()); + } + } + else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) + { + S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; + S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) { mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 9ee6f88183..f898fb7142 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -72,7 +72,7 @@ LLViewerTextureList gTextureList; ETexListType get_element_type(S32 priority) { - return (priority == LLViewerFetchedTexture::BOOST_ICON) ? TEX_LIST_SCALE : TEX_LIST_STANDARD; + return (priority == LLViewerFetchedTexture::BOOST_ICON || priority == LLViewerFetchedTexture::BOOST_THUMBNAIL) ? TEX_LIST_SCALE : TEX_LIST_STANDARD; } /////////////////////////////////////////////////////////////////////////////// @@ -492,7 +492,8 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& { imagep->dontDiscard(); } - if (boost_priority == LLViewerFetchedTexture::BOOST_ICON) + if (boost_priority == LLViewerFetchedTexture::BOOST_ICON + || boost_priority == LLViewerFetchedTexture::BOOST_THUMBNAIL) { // Agent and group Icons are downloadable content, nothing manages // icon deletion yet, so they should not persist @@ -604,7 +605,8 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, { imagep->dontDiscard(); } - if (boost_priority == LLViewerFetchedTexture::BOOST_ICON) + if (boost_priority == LLViewerFetchedTexture::BOOST_ICON + || boost_priority == LLViewerFetchedTexture::BOOST_THUMBNAIL) { // Agent and group Icons are downloadable content, nothing manages // icon deletion yet, so they should not persist. @@ -1510,8 +1512,9 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st LLUIImagePtr new_imagep = new LLUIImage(name, imagep); new_imagep->setScaleStyle(scale_style); - if (imagep->getBoostLevel() != LLGLTexture::BOOST_ICON && - imagep->getBoostLevel() != LLGLTexture::BOOST_PREVIEW) + if (imagep->getBoostLevel() != LLGLTexture::BOOST_ICON + && imagep->getBoostLevel() != LLGLTexture::BOOST_THUMBNAIL + && imagep->getBoostLevel() != LLGLTexture::BOOST_PREVIEW) { // Don't add downloadable content into this list // all UI images are non-deletable and list does not support deletion diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 35e45c6cd9..fee00eb6f4 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5233,6 +5233,9 @@ U32 LLVOAvatar::renderRigid() return 0; } + bool should_alpha_mask = shouldAlphaMask(); + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + if (isTextureVisible(TEX_EYES_BAKED) || (getOverallAppearance() == AOA_JELLYDOLL && !isControlAvatar()) || isUIAvatar()) { LLViewerJoint* eyeball_left = getViewerJoint(MESH_ID_EYEBALL_LEFT); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 6e5b387b36..7b24b9ee02 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -960,7 +960,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) } //-------------------------------------------------------------------- -// draw tractor beam when editing objects +// draw tractor (selection) beam when editing objects //-------------------------------------------------------------------- //virtual void LLVOAvatarSelf::idleUpdateTractorBeam() @@ -1248,6 +1248,27 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) return FALSE; } +bool LLVOAvatarSelf::hasAttachmentsInTrash() +{ + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + + for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) + { + LLViewerJointAttachment *attachment = iter->second; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject *attached_object = attachment_iter->get(); + if (attached_object && gInventory.isObjectDescendentOf(attached_object->getAttachmentItemID(), trash_id)) + { + return true; + } + } + } + return false; +} + // static BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id) { @@ -2799,12 +2820,14 @@ BOOL LLVOAvatarSelf::needsRenderBeam() LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing()); - if (LLToolGrab::getInstance()->getEditingObject() && - LLToolGrab::getInstance()->getEditingObject()->isAttachment()) - { - // don't render selection beam on hud objects - is_touching_or_grabbing = FALSE; - } + LLViewerObject* objp = LLToolGrab::getInstance()->getEditingObject(); + if (objp // might need to be "!objp ||" instead of "objp &&". + && (objp->isAttachment() || objp->isAvatar())) + { + // don't render grab tool's selection beam on hud objects, + // attachments or avatars + is_touching_or_grabbing = FALSE; + } return is_touching_or_grabbing || (getAttachmentState() & AGENT_STATE_EDITING && LLSelectMgr::getInstance()->shouldShowSelection()); } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 279dbd61a6..6384e2b844 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -289,6 +289,8 @@ public: /*virtual*/ BOOL detachObject(LLViewerObject *viewer_object); static BOOL detachAttachmentIntoInventory(const LLUUID& item_id); + bool hasAttachmentsInTrash(); + //-------------------------------------------------------------------- // HUDs //-------------------------------------------------------------------- diff --git a/indra/newview/skins/default/xui/da/panel_main_inventory.xml b/indra/newview/skins/default/xui/da/panel_main_inventory.xml index d6406939c1..37a17f4bd6 100644 --- a/indra/newview/skins/default/xui/da/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml @@ -9,20 +9,17 @@ Genstande: - - - - - - - -