From 8802582af1bd90352a7bc28e20ef87d249f27f3f Mon Sep 17 00:00:00 2001 From: Max Qian Date: Fri, 5 Apr 2024 13:15:58 +0800 Subject: [PATCH 01/28] update -- add many things -- remove heal-web --- .../client/atom-hydrogen/hydrogencamera.cpp | 10 + src/atom/algorithm/base.cpp | 3 +- src/atom/algorithm/base.hpp | 2 +- src/atom/algorithm/hash.hpp | 3 +- src/atom/experiment/anyutils.hpp | 29 +- src/atom/experiment/callable.hpp | 4 +- src/atom/experiment/decorate.hpp | 63 +- src/atom/experiment/flatmap.hpp | 177 + src/atom/experiment/func_traits.hpp | 89 + src/atom/experiment/invoke.hpp | 58 +- src/atom/experiment/memory.hpp | 142 + src/atom/experiment/object.hpp | 75 + src/atom/experiment/short_alloc.hpp | 2 +- src/atom/experiment/sstring.hpp | 85 + src/atom/experiment/stack_vector.hpp | 99 + src/atom/experiment/stringutils.hpp | 253 +- src/atom/experiment/svector.cpp | 112 + src/atom/experiment/type_info.hpp | 17 - src/atom/script/_json.hpp | 191 + src/atom/system/_component.cpp | 214 + src/atom/system/_component.hpp | 35 + src/atom/system/_constant.hpp | 25 + src/atom/system/module/gpu.cpp | 79 + src/atom/system/module/gpu.hpp | 28 + src/atom/type/abi.hpp | 51 + src/atom/type/args.hpp | 66 + src/atom/type/enum_flag.hpp | 144 + src/atom/type/enum_flag.inl | 40 + src/atom/type/pointer.hpp | 103 + src/atom/utils/hash_util.cpp | 30 + src/atom/utils/hash_util.hpp | 13 +- src/atom/utils/leak.hpp | 33 + src/atom/utils/utf.cpp | 137 + src/atom/utils/utf.hpp | 86 + src/config/_component.cpp | 183 +- src/config/configor.hpp | 46 +- tests/all.cpp | 7 + tests/atom/algorithm/base.cpp | 186 + tests/atom/algorithm/base32.cpp | 17 - tests/atom/algorithm/base64.cpp | 26 - tests/atom/algorithm/hash.cpp | 62 + tests/atom/experiment/memory.cpp | 80 + tests/atom/experiment/object.cpp | 76 + websrc/heal-web/.gitignore | 92 - websrc/heal-web/forge.config.js | 63 - websrc/heal-web/package.json | 40 - websrc/heal-web/src/index.css | 7 - websrc/heal-web/src/index.html | 12 - websrc/heal-web/src/main.js | 49 - websrc/heal-web/src/preload.js | 2 - websrc/heal-web/src/renderer.js | 31 - websrc/heal-web/webpack.main.config.js | 11 - websrc/heal-web/webpack.renderer.config.js | 13 - websrc/heal-web/webpack.rules.js | 35 - websrc/heal-web/yarn.lock | 8737 ----------------- 55 files changed, 3007 insertions(+), 9266 deletions(-) create mode 100644 src/atom/experiment/flatmap.hpp create mode 100644 src/atom/experiment/func_traits.hpp create mode 100644 src/atom/experiment/memory.hpp create mode 100644 src/atom/experiment/object.hpp create mode 100644 src/atom/experiment/sstring.hpp create mode 100644 src/atom/experiment/stack_vector.hpp create mode 100644 src/atom/experiment/svector.cpp create mode 100644 src/atom/script/_json.hpp create mode 100644 src/atom/system/_component.hpp create mode 100644 src/atom/system/_constant.hpp create mode 100644 src/atom/system/module/gpu.cpp create mode 100644 src/atom/system/module/gpu.hpp create mode 100644 src/atom/type/abi.hpp create mode 100644 src/atom/type/enum_flag.hpp create mode 100644 src/atom/type/enum_flag.inl create mode 100644 src/atom/type/pointer.hpp create mode 100644 src/atom/utils/leak.hpp create mode 100644 src/atom/utils/utf.cpp create mode 100644 src/atom/utils/utf.hpp create mode 100644 tests/all.cpp create mode 100644 tests/atom/algorithm/base.cpp delete mode 100644 tests/atom/algorithm/base32.cpp delete mode 100644 tests/atom/algorithm/base64.cpp create mode 100644 tests/atom/algorithm/hash.cpp create mode 100644 tests/atom/experiment/memory.cpp create mode 100644 tests/atom/experiment/object.cpp delete mode 100644 websrc/heal-web/.gitignore delete mode 100644 websrc/heal-web/forge.config.js delete mode 100644 websrc/heal-web/package.json delete mode 100644 websrc/heal-web/src/index.css delete mode 100644 websrc/heal-web/src/index.html delete mode 100644 websrc/heal-web/src/main.js delete mode 100644 websrc/heal-web/src/preload.js delete mode 100644 websrc/heal-web/src/renderer.js delete mode 100644 websrc/heal-web/webpack.main.config.js delete mode 100644 websrc/heal-web/webpack.renderer.config.js delete mode 100644 websrc/heal-web/webpack.rules.js delete mode 100644 websrc/heal-web/yarn.lock diff --git a/driver/client/atom-hydrogen/hydrogencamera.cpp b/driver/client/atom-hydrogen/hydrogencamera.cpp index 897c2426..00f5be27 100644 --- a/driver/client/atom-hydrogen/hydrogencamera.cpp +++ b/driver/client/atom-hydrogen/hydrogencamera.cpp @@ -26,6 +26,16 @@ HydrogenCamera::HydrogenCamera(const std::string &name) : Camera(name) { Atom::Utils::StringSwitch>(); m_text_switch = std::make_unique< Atom::Utils::StringSwitch>(); + + registerFunc("connect", &HydrogenCamera::connect, this); + registerFunc("disconnect", &HydrogenCamera::disconnect, this); + registerFunc("reconnect", &HydrogenCamera::reconnect, this); + registerFunc("isConnected", &HydrogenCamera::isConnected, this); + registerFunc("startExposure", &HydrogenCamera::startExposure, this); + registerFunc("abortExposure", &HydrogenCamera::abortExposure, this); + registerFunc("getExposureStatus", &HydrogenCamera::getExposureStatus, this); + registerFunc("getExposureResult", &HydrogenCamera::getExposureResult, this); + } HydrogenCamera::~HydrogenCamera() {} diff --git a/src/atom/algorithm/base.cpp b/src/atom/algorithm/base.cpp index 7a379509..a9ba4a3d 100644 --- a/src/atom/algorithm/base.cpp +++ b/src/atom/algorithm/base.cpp @@ -12,13 +12,12 @@ Description: A collection of algorithms for C++ **************************************************/ -#include "base16.hpp" +#include "base.hpp" #include #include #include #include -#include #include diff --git a/src/atom/algorithm/base.hpp b/src/atom/algorithm/base.hpp index aa0b15d8..f1237705 100644 --- a/src/atom/algorithm/base.hpp +++ b/src/atom/algorithm/base.hpp @@ -18,7 +18,7 @@ Description: A collection of algorithms for C++ #include #include #include - +#include namespace Atom::Algorithm { /** diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index d33e2683..3a81e9aa 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -21,7 +21,7 @@ Description: A collection of hash algorithms #include #include - +namespace Atom::Algorithm { template concept Hashable = requires(T a) { { std::hash{}(a) } -> std::convertible_to; @@ -64,5 +64,6 @@ std::size_t computeHash(const std::array& array) { } return result; } +} // namespace Atom::Algorithm #endif diff --git a/src/atom/experiment/anyutils.hpp b/src/atom/experiment/anyutils.hpp index 865191ee..1028967d 100644 --- a/src/atom/experiment/anyutils.hpp +++ b/src/atom/experiment/anyutils.hpp @@ -34,19 +34,35 @@ template concept CanBeStringifiedToJson = requires(T t) { { toJson(t) } -> std::convertible_to; }; + +template +concept IsBuiltIn = + std::is_fundamental_v || std::is_same_v || + std::is_same_v || std::is_same_v; + +template +concept ContainerLike = requires(const Container &c) { + { c.begin() } -> std::input_iterator; + { c.end() } -> std::input_iterator; +}; + #endif template [[nodiscard]] std::string toString(const T &value, bool prettyPrint = false); -template -[[nodiscard]] std::string toString(const std::vector &vec, +template +[[nodiscard]] std::string toString(const Container &container, bool prettyPrint = false) { std::string result = "["; - for (const auto &item : vec) { - result += toString(item, prettyPrint) + ", "; + for (const auto &item : container) { + if constexpr (IsBuiltIn) { + result += toString(item, prettyPrint) + ", "; + } else { + result += "\"" + toString(item, prettyPrint) + "\", "; + } } - if (!vec.empty()) { + if (!container.empty()) { result.erase(result.length() - 2, 2); } result += "]"; @@ -78,6 +94,7 @@ template template [[nodiscard]] std::string toString(const T &value, bool prettyPrint) { if constexpr (std::is_same_v || + std::is_same_v || std::is_same_v || std::is_same_v) { return value; @@ -282,4 +299,4 @@ template return result; } -#endif +#endif \ No newline at end of file diff --git a/src/atom/experiment/callable.hpp b/src/atom/experiment/callable.hpp index 7b5c471c..92c1c80c 100644 --- a/src/atom/experiment/callable.hpp +++ b/src/atom/experiment/callable.hpp @@ -62,13 +62,13 @@ struct Function_Signature {}; template struct Function_Signature { using Return_Type = Ret; - using Signature = Ret (*)(Params...); // 修改成这样 + using Signature = Ret (*)(Params...); }; template struct Function_Signature { using Return_Type = Ret; - using Signature = Ret (*)(Params...); // 修改成这样 + using Signature = Ret (*)(Params...); }; template diff --git a/src/atom/experiment/decorate.hpp b/src/atom/experiment/decorate.hpp index 85179419..3b4686d8 100644 --- a/src/atom/experiment/decorate.hpp +++ b/src/atom/experiment/decorate.hpp @@ -24,6 +24,22 @@ decorator. #include #include +template +class Switchable { +public: + Switchable(std::function f) : f(f) {} + + template + void switch_to(F new_f) { + f = new_f; + } + + auto operator()(Args... args) const -> R { return f(args...); } + +private: + std::function f; +}; + template struct decorator; @@ -46,25 +62,26 @@ struct decorator> { template > decorator with_hooks( - Before b, Callback c = Callback(), After a = [](long long) {}) const { - decorator copy(func); - copy.before = b; - copy.callback = c; - copy.after = a; + Before &&b, Callback &&c = CallbackType(), + After &&a = [](long long) {}) const { + decorator copy(std::move(func)); + copy.before = std::forward(b); + copy.callback = std::forward(c); + copy.after = std::forward(a); return copy; } template - auto operator()(TArgs&&... args) const -> decltype(func(args...)) { + auto operator()(TArgs &&...args) const { if (before) before(); auto start = std::chrono::high_resolution_clock::now(); - if constexpr (std::is_void::value) { - func(std::forward(args)...); + if constexpr (std::is_void_v) { + std::invoke(func, std::forward(args)...); if (callback) callback(); } else { - auto result = func(std::forward(args)...); + auto result = std::invoke(func, std::forward(args)...); if (callback) callback(result); auto end = std::chrono::high_resolution_clock::now(); @@ -82,11 +99,11 @@ struct decorator> { } template - auto operator()(T& obj, TArgs&&... args) const { + auto operator()(T &obj, TArgs &&...args) const { if (before) before(); auto start = std::chrono::high_resolution_clock::now(); - if constexpr (std::is_void::value) { + if constexpr (std::is_void_v) { std::invoke(func, obj, std::forward(args)...); if (callback) callback(); @@ -120,8 +137,8 @@ struct LoopDecorator : public decorator { using Base::Base; template - auto operator()(int loopCount, TArgs&&... args) const - -> decltype(this->func(args...)) { + auto operator()(int loopCount, + TArgs &&...args) const -> decltype(this->func(args...)) { decltype(this->func(args...)) result; for (int i = 0; i < loopCount; ++i) { result = Base::operator()(std::forward(args)...); @@ -130,7 +147,7 @@ struct LoopDecorator : public decorator { } template - auto operator()(T& obj, int loopCount, TArgs&&... args) const { + auto operator()(T &obj, int loopCount, TArgs &&...args) const { for (int i = 0; i < loopCount; ++i) { std::invoke(this->func, obj, std::forward(args)...); } @@ -148,8 +165,8 @@ struct ConditionCheckDecorator : public decorator { using Base::Base; // Inherit constructor template - auto operator()(ConditionFunc condition, TArgs&&... args) const - -> decltype(this->func(args...)) { + auto operator()(ConditionFunc condition, + TArgs &&...args) const -> decltype(this->func(args...)) { if (condition()) { return Base::operator()(std::forward(args)...); } else { @@ -166,15 +183,15 @@ ConditionCheckDecorator make_condition_check_decorator(FuncType f) { struct DecoratorError : public std::exception { std::string message; - explicit DecoratorError(const std::string& msg) : message(msg) {} - const char* what() const noexcept override { return message.c_str(); } + explicit DecoratorError(const std::string &msg) : message(msg) {} + const char *what() const noexcept override { return message.c_str(); } }; template class BaseDecorator { public: using FuncType = std::function; - virtual R operator()(FuncType func, Args&&... args) = 0; + virtual R operator()(FuncType func, Args &&...args) = 0; }; template @@ -190,7 +207,7 @@ class DecorateStepper { // 添加装饰器 template - void addDecorator(DArgs&&... args) { + void addDecorator(DArgs &&...args) { decorators.emplace_back( std::make_unique(std::forward(args)...)); } @@ -199,7 +216,7 @@ class DecorateStepper { try { FuncType currentFunction = baseFunction; - for (auto& decorator : decorators) { + for (auto &decorator : decorators) { currentFunction = [&, nextFunction = std::move(currentFunction)]( Args... innerArgs) -> R { @@ -209,10 +226,10 @@ class DecorateStepper { } return currentFunction(std::forward(args)...); - } catch (const DecoratorError& e) { + } catch (const DecoratorError &e) { return R(); // 返回默认值 } } }; -#endif +#endif \ No newline at end of file diff --git a/src/atom/experiment/flatmap.hpp b/src/atom/experiment/flatmap.hpp new file mode 100644 index 00000000..08e39323 --- /dev/null +++ b/src/atom/experiment/flatmap.hpp @@ -0,0 +1,177 @@ +/* + * flatmap.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-2 + +Description: QuickFlatMap for C++20 + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_FLATMAP_HPP +#define ATOM_EXPERIMENT_FLATMAP_HPP + +#include +#include +#include +#include +#include + +template > +struct QuickFlatMap { + Comparator comparator; + + template + auto find(const Lookup &s) noexcept { + return std::find_if( + std::begin(data), std::end(data), + [&s, this](const auto &d) { return comparator(d.first, s); }); + } + + template + auto find(const Lookup &s) const noexcept { + return std::find_if( + std::cbegin(data), std::cend(data), + [&s, this](const auto &d) { return comparator(d.first, s); }); + } + + template + auto find(const Lookup &s, const std::size_t t_hint) const noexcept { + if constexpr (std::is_invocable_v) { + if (data.size() > t_hint && comparator(data[t_hint].first, s)) { + const auto begin = std::cbegin(data); + return std::next( + begin, static_cast>::difference_type>( + t_hint)); + } else { + return find(s); + } + } else { + // Fallback to the original implementation if Comparator is not + // invocable with const Key & and const Lookup & + if (data.size() > t_hint && comparator(s, data[t_hint].first)) { + const auto begin = std::cbegin(data); + return std::next( + begin, static_cast>::difference_type>( + t_hint)); + } else { + return find(s); + } + } + } + + auto size() const noexcept { return data.size(); } + + auto begin() const noexcept { return data.begin(); } + + auto end() const noexcept { return data.end(); } + + auto begin() noexcept { return data.begin(); } + + auto end() noexcept { return data.end(); } + + auto &back() noexcept { return data.back(); } + + const auto &back() const noexcept { return data.back(); } + + Value &operator[](const Key &s) { + const auto itr = find(s); + if (itr != data.end()) { + return itr->second; + } else { + grow(); + return data.emplace_back(s, Value()).second; + } + } + + Value &at_index(const std::size_t idx) noexcept { return data[idx].second; } + + const Value &at_index(const std::size_t idx) const noexcept { + return data[idx].second; + } + + bool empty() const noexcept { return data.empty(); } + + template + void assign(Itr begin, Itr end) { + data.assign(begin, end); + } + + Value &at(const Key &s) { + const auto itr = find(s); + if (itr != data.end()) { + return itr->second; + } else { + throw std::out_of_range("Unknown key: " + s); + } + } + + template + auto insert_or_assign(Key &&key, M &&m) { + if (auto itr = find(key); itr != data.end()) { + itr->second = std::forward(m); + return std::pair{itr, false}; + } else { + grow(); + return std::pair{ + data.emplace(data.end(), std::move(key), std::forward(m)), + true}; + } + } + + template + auto insert_or_assign(const Key &key, M &&m) { + if (auto itr = find(key); itr != data.end()) { + itr->second = std::forward(m); + return std::pair{itr, false}; + } else { + grow(); + return std::pair{data.emplace(data.end(), key, std::forward(m)), + true}; + } + } + + const Value &at(const Key &s) const { + const auto itr = find(s); + if (itr != data.end()) { + return itr->second; + } else { + throw std::out_of_range("Unknown key: " + s); + } + } + + template + size_t count(const Lookup &s) const noexcept { + return (find(s) != data.end()) ? 1 : 0; + } + + std::vector> data; + + using value_type = std::pair; + using iterator = typename decltype(data)::iterator; + using const_iterator = typename decltype(data)::const_iterator; + + std::pair insert(value_type &&value) { + if (const auto itr = find(value.first); itr != data.end()) { + return std::pair{itr, false}; + } else { + grow(); + return std::pair{data.insert(data.end(), std::move(value)), true}; + } + } + + void grow() { + if ((data.capacity() - data.size()) == 0) { + data.reserve(data.size() + 2); + } + } +}; + +#endif \ No newline at end of file diff --git a/src/atom/experiment/func_traits.hpp b/src/atom/experiment/func_traits.hpp new file mode 100644 index 00000000..4b93d134 --- /dev/null +++ b/src/atom/experiment/func_traits.hpp @@ -0,0 +1,89 @@ +/* + * func_traits.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-2 + +Description: Func Traits for C++20 + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_FUNC_TRAITS_HPP +#define ATOM_EXPERIMENT_FUNC_TRAITS_HPP + +#include + +template +struct FunctionTraits; + +template +struct FunctionTraits { + using return_type = Return; + using argument_types = std::tuple; + + static constexpr std::size_t arity = sizeof...(Args); + + template + struct argument { + static_assert(N < arity, "Invalid argument index."); + using type = typename std::tuple_element::type; + }; + + template + using argument_t = typename argument::type; + + static constexpr bool is_member_function = false; + static constexpr bool is_const_member_function = false; + static constexpr bool is_volatile_member_function = false; + static constexpr bool is_noexcept = false; +}; + +template +struct FunctionTraits : FunctionTraits {}; + +template +struct FunctionTraits + : FunctionTraits { + static constexpr bool is_member_function = true; + using class_type = Class; +}; + +template +struct FunctionTraits + : FunctionTraits { + static constexpr bool is_member_function = true; + static constexpr bool is_const_member_function = true; + using class_type = Class; +}; + +template +struct FunctionTraits + : FunctionTraits { + static constexpr bool is_member_function = true; + static constexpr bool is_volatile_member_function = true; + using class_type = Class; +}; + +template +struct FunctionTraits + : FunctionTraits { + static constexpr bool is_member_function = true; + static constexpr bool is_const_member_function = true; + static constexpr bool is_volatile_member_function = true; + using class_type = Class; +}; + +template +struct FunctionTraits + : FunctionTraits { + static constexpr bool is_noexcept = true; +}; + +template +struct FunctionTraits : FunctionTraits {}; + +#endif diff --git a/src/atom/experiment/invoke.hpp b/src/atom/experiment/invoke.hpp index 8804a858..f7a39a7f 100644 --- a/src/atom/experiment/invoke.hpp +++ b/src/atom/experiment/invoke.hpp @@ -15,27 +15,75 @@ Description: An implementation of invoke function. Support C++11 and C++17. #ifndef ATOM_EXPERIMENTAL_INVOKE_HPP #define ATOM_EXPERIMENTAL_INVOKE_HPP +#include #include +#include #include #include + #if __cplusplus >= 201703L #include template -using is_invocable_with_args = std::is_invocable; +concept Invocable = std::is_invocable_v, std::decay_t...>; -template +template auto delay_invoke(F &&f, Args &&...args) { - static_assert(is_invocable_with_args::value, - "F must be callable with Args..."); + static_assert(Invocable, "F must be callable with Args..."); return [f = std::forward(f), args = std::make_tuple(std::forward(args)...)]() mutable { - return std::apply(f, args); + return std::apply(std::move(f), std::move(args)); }; } + +template +std::invoke_result_t, std::decay_t...> safe_call( + Func &&func, Args &&...args) { + try { + return std::invoke(std::forward(func), + std::forward(args)...); + } catch (...) { + using ReturnType = + std::invoke_result_t, std::decay_t...>; + if constexpr (std::is_default_constructible_v) { + return ReturnType{}; + } else { + throw std::runtime_error("An exception occurred in safe_call"); + } + } +} + +template +auto safe_try_catch(Func &&func, Args &&...args) { + try { + return std::invoke(std::forward(func), + std::forward(args)...); + } catch (...) { + if constexpr (std::is_void_v, std::decay_t...>>) { + std::rethrow_exception(std::current_exception()); + } else + return std::make_tuple(std::current_exception()); + } +} + +template +auto safe_try_catch_or_default( + Func &&func, + std::invoke_result_t, std::decay_t...> + default_value, + Args &&...args) { + try { + return std::invoke(std::forward(func), + std::forward(args)...); + } catch (...) { + return default_value; + } +} + #else template struct index_sequence {}; diff --git a/src/atom/experiment/memory.hpp b/src/atom/experiment/memory.hpp new file mode 100644 index 00000000..90458107 --- /dev/null +++ b/src/atom/experiment/memory.hpp @@ -0,0 +1,142 @@ +/* + * memory.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-3-29 + +Description: A simple implementation of memory pool + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_MEMORY_POOL_HPP +#define ATOM_EXPERIMENT_MEMORY_POOL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "noncopyable.hpp" + +template +class MemoryPool : public std::pmr::memory_resource, NonCopyable { +public: + T *allocate(size_t n) { + if (n > max_size()) { + throw std::bad_alloc(); + } + std::lock_guard lock(mutex_); + if (auto p = allocate_from_pool(n)) { + return p; + } + size_t chunk_size = (n + chunk_space_ - 1) / chunk_space_ * chunk_space_; + return allocate_from_chunk(chunk_size); + } + + void deallocate(T *p, size_t n) { + std::lock_guard lock(mutex_); + if (is_from_pool(p)) { + deallocate_to_pool(p, n); + } else { + deallocate_to_chunk(p, n); + } + } + + bool is_equal(const memory_resource &other) const noexcept { + return this == &other; + } + + size_t block_size() const { return BlockSize; } + +private: + struct Chunk { + size_t size; + size_t used; + std::unique_ptr> memory; + Chunk(size_t s) + : size(s), used(0), memory(static_cast(::operator new(s)), + [](uint8_t *p) { ::operator delete(p); }) {} + }; + + size_t max_size() const { return BlockSize - sizeof(T); } + size_t chunk_space() const { return BlockSize - sizeof(Chunk); } + + T *allocate_from_pool(size_t n) { + if (pool_.empty() || pool_.back().used + n > pool_.back().size) { + return nullptr; + } + auto &chunk = pool_.back(); + auto p = reinterpret_cast(chunk.memory.get() + chunk.used); + chunk.used += n; + return p; + } + + void deallocate_to_pool(T *p, size_t n) { + auto it = std::find_if(pool_.begin(), pool_.end(), [p](const Chunk &chunk) { + return chunk.memory.get() <= reinterpret_cast(p) && + reinterpret_cast(p) < chunk.memory.get() + chunk.size; + }); + assert(it != pool_.end()); + if (reinterpret_cast(p) + n == it->memory.get() + it->used) { + it->used -= n; + } + } + + T *allocate_from_chunk(size_t chunk_size) { + pool_.emplace_back(chunk_size); + auto &chunk = pool_.back(); + auto p = reinterpret_cast(chunk.memory.get()); + chunk.used += chunk_size; + return p; + } + + void deallocate_to_chunk(T *p, [[maybe_unused]] size_t n) { + auto it = std::find_if(pool_.begin(), pool_.end(), [p](const Chunk &chunk) { + return chunk.memory.get() <= reinterpret_cast(p) && + reinterpret_cast(p) < chunk.memory.get() + chunk.size; + }); + assert(it != pool_.end()); + if (it->used == it->size) { + pool_.erase(it); + } + } + + bool is_from_pool(T *p) { + for (const auto &chunk : pool_) { + if (chunk.memory.get() <= reinterpret_cast(p) && + reinterpret_cast(p) < chunk.memory.get() + chunk.size) { + return true; + } + } + return false; + } + + void *do_allocate(size_t bytes, size_t alignment) override { + size_t space = (bytes + alignment - 1) / alignment * alignment; + return allocate(space); + } + + void do_deallocate(void *p, size_t bytes, size_t alignment) override { + size_t space = (bytes + alignment - 1) / alignment * alignment; + deallocate(static_cast(p), space); + } + + bool do_is_equal(const memory_resource &other) const noexcept override { + return this == &other; + } + + size_t chunk_space_ = chunk_space(); + std::vector pool_; + std::mutex mutex_; +}; + +#endif \ No newline at end of file diff --git a/src/atom/experiment/object.hpp b/src/atom/experiment/object.hpp new file mode 100644 index 00000000..9da72403 --- /dev/null +++ b/src/atom/experiment/object.hpp @@ -0,0 +1,75 @@ +/* + * object.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-5 + +Description: A simple implementation of object pool + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_OBJECT_HPP +#define ATOM_EXPERIMENT_OBJECT_HPP + +#include +#include +#include +#include +#include +#include + +template +concept Resettable = requires(T &obj) { obj.reset(); }; + +template class ObjectPool { +public: + ObjectPool(size_t max_size) : max_size_(max_size), available_(max_size) {} + + std::shared_ptr acquire() { + std::unique_lock lock(mutex_); + cv_.wait(lock, [this] { return !pool_.empty() || available_ > 0; }); + if (!pool_.empty()) { + auto obj = std::move(pool_.back()); + pool_.pop_back(); + return obj; + } + assert(available_ > 0); + --available_; + return std::make_shared(); + } + + void release(std::shared_ptr obj) { + std::unique_lock lock(mutex_); + if (pool_.size() < max_size_) { + obj->reset(); + pool_.push_back(std::move(obj)); + cv_.notify_one(); + } else { + ++available_; + cv_.notify_one(); + } + } + + size_t available() const { + std::unique_lock lock(mutex_); + return available_ + pool_.size(); + } + + size_t size() const { + std::unique_lock lock(mutex_); + return max_size_ - available_; + } + +private: + size_t max_size_; + size_t available_; + std::vector> pool_; + mutable std::mutex mutex_; + std::condition_variable cv_; +}; + +#endif diff --git a/src/atom/experiment/short_alloc.hpp b/src/atom/experiment/short_alloc.hpp index dce05e3d..79072dc9 100644 --- a/src/atom/experiment/short_alloc.hpp +++ b/src/atom/experiment/short_alloc.hpp @@ -40,7 +40,7 @@ class arena { void reset() noexcept { ptr_ = buf_; } private: - static std::size_t align_up(std::size_t n) noexcept { + static constexpr std::size_t align_up(std::size_t n) noexcept { return (n + (alignment - 1)) & ~(alignment - 1); } diff --git a/src/atom/experiment/sstring.hpp b/src/atom/experiment/sstring.hpp new file mode 100644 index 00000000..5ec42eb5 --- /dev/null +++ b/src/atom/experiment/sstring.hpp @@ -0,0 +1,85 @@ +/* + * sstring.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-2 + +Description: A simple static string class + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_SSTRING_HPP +#define ATOM_EXPERIMENT_SSTRING_HPP + +#include +#include + +class Static_String; +template +concept Stringable = std::is_convertible_v || + std::is_convertible_v || + std::is_convertible_v || + std::is_convertible_v; + +struct Static_String { + template + constexpr Static_String(const char (&str)[N]) noexcept + : m_size(N - 1), data(str) {} + + constexpr size_t size() const noexcept { return m_size; } + + constexpr const char *c_str() const noexcept { return data; } + + constexpr const char *begin() const noexcept { return data; } + + constexpr const char *end() const noexcept { return data + m_size; } + + constexpr bool operator==(const std::string_view &other) const noexcept { + return std::string_view(data, m_size) == other; + } + + template + requires Stringable + constexpr bool operator==(T &&other) const noexcept { + return std::string_view(data, m_size) == std::forward(other); + } + + template + requires Stringable + constexpr bool operator!=(T &&other) const noexcept { + return !(*this == std::forward(other)); + } + + template + requires Stringable + constexpr bool operator<(T &&other) const noexcept { + return std::string_view(data, m_size) < std::forward(other); + } + + template + requires Stringable + constexpr bool operator<=(T &&other) const noexcept { + return std::string_view(data, m_size) <= std::forward(other); + } + + template + requires Stringable + constexpr bool operator>(T &&other) const noexcept { + return std::string_view(data, m_size) > std::forward(other); + } + + template + requires Stringable + constexpr bool operator>=(T &&other) const noexcept { + return std::string_view(data, m_size) >= std::forward(other); + } + + const size_t m_size; + const char *data; +}; + +#endif diff --git a/src/atom/experiment/stack_vector.hpp b/src/atom/experiment/stack_vector.hpp new file mode 100644 index 00000000..5df2a297 --- /dev/null +++ b/src/atom/experiment/stack_vector.hpp @@ -0,0 +1,99 @@ +/* + * stack_vector.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-2 + +Description: A simple stack vector implementation + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_STACK_VECTOR_HPP +#define ATOM_EXPERIMENT_STACK_VECTOR_HPP + +#include +#include +#include +#include + +template +struct Stack_Vector { + Stack_Vector() noexcept = default; + Stack_Vector(const Stack_Vector &other) { + m_size = other.m_size; + for (std::size_t i = 0; i < m_size; ++i) { + new (&(*this)[i]) T(other[i]); + } + } + + Stack_Vector(Stack_Vector &&other) noexcept + : data{other.data}, m_size{other.m_size} { + other.m_size = 0; + } + + ~Stack_Vector() noexcept(std::is_nothrow_destructible_v) { + for (std::size_t pos = 0; pos < m_size; ++pos) { + (*this)[pos].~T(); + } + } + + constexpr static auto aligned_size = + sizeof(T) + (sizeof(T) & std::alignment_of_v) > 0 + ? std::alignment_of_v + : 0; + + alignas(std::alignment_of_v) char data[aligned_size * MaxSize]; + + [[nodiscard]] T &operator[](const std::size_t idx) noexcept { + return *reinterpret_cast(&data + aligned_size * idx); + } + + [[nodiscard]] const T &operator[](const std::size_t idx) const noexcept { + return *reinterpret_cast(&data + aligned_size * idx); + } + + template + T &emplace_back(Param &&...param) { + auto *p = new (&(*this)[m_size++]) T(std::forward(param)...); + return *p; + }; + + auto size() const noexcept { return m_size; }; + auto capacity() const noexcept { return MaxSize; }; + void pop_back() noexcept(std::is_nothrow_destructible_v) { + (*this)[--m_size].~T(); + } + void resize(std::size_t new_size) { m_size = new_size; } + + Stack_Vector &operator=(const Stack_Vector &other) { + if (this != &other) { + for (std::size_t i = 0; i < m_size; ++i) { + (*this)[i].~T(); + } + m_size = other.m_size; + for (std::size_t i = 0; i < m_size; ++i) { + new (&(*this)[i]) T(other[i]); + } + } + return *this; + } + + Stack_Vector &operator=(Stack_Vector &&other) noexcept { + if (this != &other) { + for (std::size_t i = 0; i < m_size; ++i) { + (*this)[i].~T(); + } + std::swap(data, other.data); + std::swap(m_size, other.m_size); + } + return *this; + } + + std::size_t m_size{0}; +}; + +#endif \ No newline at end of file diff --git a/src/atom/experiment/stringutils.hpp b/src/atom/experiment/stringutils.hpp index 8b96a1eb..1f86e9d4 100644 --- a/src/atom/experiment/stringutils.hpp +++ b/src/atom/experiment/stringutils.hpp @@ -1,5 +1,5 @@ /* - * cmdline.hpp + * stringutils.hpp * * Copyright (C) 2023-2024 Max Qian */ @@ -12,13 +12,16 @@ Description: Implementation of command line generator. **************************************************/ -#ifndef ATOM_UTILS_CMDLINE_HPP -#define ATOM_UTILS_CMDLINE_HPP +#ifndef ATOM_EXPERIMENT_STRINGUTILS_HPP +#define ATOM_EXPERIMENT_STRINGUTILS_HPP -#include +#include +#include #include #include #include +#include +#include #include #include #include @@ -57,17 +60,25 @@ struct is_map> : std::true_type {}; #if __cplusplus >= 202002L -#include - template concept BasicType = std::is_arithmetic_v; +/** + * @brief Check if a type is a basic type. + * @tparam T The type to check. + * @return True if the type is a basic type, false otherwise. + */ template concept StringType = requires(T a) { - std::is_same_v || std::is_same_v || - std::is_same_v; + std::is_same_v || std::is_same_v || + std::is_same_v || std::is_same_v; }; +/** + * @brief Check if a type is a basic type. + * @tparam T The type to check. + * @return True if the type is a basic type, false otherwise. + */ template concept SequenceContainer = requires(T a) { typename T::value_type; @@ -75,6 +86,11 @@ concept SequenceContainer = requires(T a) { { a.end() } -> std::forward_iterator; }; +/** + * @brief Check if a type is an associative container. + * @tparam T The type to check. + * @return True if the type is an associative container, false otherwise. + */ template concept AssociativeContainer = requires(T a) { typename T::key_type; @@ -83,6 +99,11 @@ concept AssociativeContainer = requires(T a) { { a.end() } -> std::forward_iterator; }; +/** + * @brief Check if a type is a smart pointer. + * @tparam T The type to check. + * @return True if the type is a smart pointer, false otherwise. + */ template concept SmartPointer = requires(T a) { { *a } -> std::convertible_to; @@ -90,6 +111,12 @@ concept SmartPointer = requires(T a) { #endif +/** + * @brief Convert a value to a string representation. + * @tparam T The type of the value. + * @param value The value to be converted. + * @return A string representation of the value. + */ template auto toString(const T &value) -> std::enable_if_t::value && !is_container::value, @@ -103,18 +130,39 @@ auto toString(const T &value) } } +/** + * @brief Join a pair of key-value pairs into a string representation. + * @tparam Key The type of the key. + * @tparam Value The type of the value. + * @param keyValue The pair of key-value pairs. + * @return A string representation of the pair. + */ template auto toString(const std::pair &keyValue) { return "(" + toString(keyValue.first) + ", " + toString(keyValue.second) + ")"; } +/** + * @brief Join a pair of key-value pairs into a string representation. + * @tparam Key The type of the key. + * @tparam Value The type of the value. + * @param keyValue The pair of key-value pairs. + * @param separator The separator to use between the key and value. + * @return A string representation of the pair. + */ template auto toString(const std::pair &keyValue, const std::string &separator) { return toString(keyValue.first) + separator + toString(keyValue.second); } +/** + * @brief Join a map of key-value pairs into a string representation. + * @tparam Container The type of the map. + * @param container The map of key-value pairs. + * @return A string representation of the map. + */ template std::enable_if_t::value, std::string> toString( const Container &container) { @@ -132,6 +180,12 @@ std::enable_if_t::value, std::string> toString( return oss.str(); } +/** + * @brief Join a container of values into a string representation. + * @tparam Container The type of the container. + * @param container The container of values. + * @return A string representation of the container. + */ template auto toString(const Container &container) -> std::enable_if_t::value && @@ -151,6 +205,12 @@ auto toString(const Container &container) return oss.str(); } +/** + * @brief Join a vector of values into a string representation. + * @tparam T The type of the values in the vector. + * @param value The vector of values. + * @return A string representation of the vector. + */ template std::string toString(const std::vector &value) { std::ostringstream oss; @@ -165,18 +225,40 @@ std::string toString(const std::vector &value) { return oss.str(); } +/** + * @brief Join a key-value pair into a string representation. + * @tparam T The type of the value. + * @param key The key. + * @param value The value. + * @param separator The separator to use between the key and value. + * @return A string representation of the key-value pair. + */ template std::enable_if_t, std::string> joinKeyValuePair( const std::string &key, const T &value, const std::string &separator = "") { return key + separator + std::string(value); } +/** + * @brief Join a key-value pair into a string representation. + * @tparam Key The type of the key. + * @tparam Value The type of the value. + * @param keyValue The key-value pair to join. + * @param separator The separator to use between the key and value. + * @return A string representation of the key-value pair. + */ template std::string joinKeyValuePair(const std::pair &keyValue, const std::string &separator = "") { return joinKeyValuePair(keyValue.first, keyValue.second, separator); } +/** + * @brief Join command line arguments into a single string. + * @tparam Args The types of the command line arguments. + * @param args The command line arguments. + * @return A string representation of the command line arguments. + */ template [[nodiscard]] std::string joinCommandLine(const Args &...args) { std::ostringstream oss; @@ -185,6 +267,12 @@ template return oss.str(); } +/** + * @brief Convert a vector of elements to a string representation. + * @tparam T The type of elements in the vector. + * @param array The vector to convert. + * @return A string representation of the vector. + */ template auto toStringArray(const std::vector &array) { std::ostringstream oss; @@ -194,5 +282,152 @@ auto toStringArray(const std::vector &array) { return oss.str(); } +/** + * @brief Concept to check if a type has begin() and end() member functions. + * @tparam T The type to check. + */ +template +concept HasIterator = requires(T t) { + t.begin(); /**< The begin() member function. */ + t.end(); /**< The end() member function. */ +}; -#endif +/** + * @brief Implementation of string equality comparison for types supporting + * iterators. + * @tparam LHS Type of the left-hand side. + * @tparam RHS Type of the right-hand side. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if the strings are equal, false otherwise. + */ +template +[[nodiscard]] constexpr bool str_equal_impl(const LHS &t_lhs, + const RHS &t_rhs) noexcept { + return std::equal(t_lhs.begin(), t_lhs.end(), t_rhs.begin(), t_rhs.end()); +} + +/** + * @brief Functor for string equality comparison. + */ +struct str_equal { + /** + * @brief Compares two std::string objects for equality. + * @param t_lhs The left-hand side string. + * @param t_rhs The right-hand side string. + * @return True if the strings are equal, false otherwise. + */ + [[nodiscard]] bool operator()(const std::string &t_lhs, + const std::string &t_rhs) const noexcept { + return t_lhs == t_rhs; + } + + /** + * @brief Compares two objects for equality using iterators. + * @tparam LHS Type of the left-hand side. + * @tparam RHS Type of the right-hand side. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if the strings are equal, false otherwise. + */ + template + [[nodiscard]] constexpr bool operator()(const LHS &t_lhs, + const RHS &t_rhs) const noexcept { + return str_equal_impl(t_lhs, t_rhs); + } + + struct is_transparent {}; /**< Enables transparent comparison. */ +}; + +/** + * @brief Implementation of string less-than comparison for types supporting + * iterators. + * @tparam T Type of the operands. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if t_lhs is less than t_rhs, false otherwise. + */ +template +[[nodiscard]] constexpr bool str_less_impl(const T &t_lhs, + const T &t_rhs) noexcept { + return t_lhs < t_rhs; +} + +/** + * @brief Implementation of string less-than comparison for types supporting + * iterators. + * @tparam LHS Type of the left-hand side. + * @tparam RHS Type of the right-hand side. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if t_lhs is less than t_rhs, false otherwise. + */ +template +[[nodiscard]] constexpr bool str_less_impl(const LHS &t_lhs, + const RHS &t_rhs) noexcept { + return std::lexicographical_compare(t_lhs.begin(), t_lhs.end(), + t_rhs.begin(), t_rhs.end()); +} + +/** + * @brief Functor for string less-than comparison. + */ +struct str_less { + /** + * @brief Compares two std::string objects. + * @param t_lhs The left-hand side string. + * @param t_rhs The right-hand side string. + * @return True if t_lhs is less than t_rhs, false otherwise. + */ + [[nodiscard]] bool operator()(const std::string &t_lhs, + const std::string &t_rhs) const noexcept { + return t_lhs < t_rhs; + } + + /** + * @brief Compares two objects using iterators. + * @tparam LHS Type of the left-hand side. + * @tparam RHS Type of the right-hand side. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if t_lhs is less than t_rhs, false otherwise. + */ + template + [[nodiscard]] constexpr bool operator()(const LHS &t_lhs, + const RHS &t_rhs) const noexcept { + return str_less_impl(t_lhs, t_rhs); + } + + struct is_transparent {}; /**< Enables transparent comparison. */ +}; + +struct str_more { + /** + * @brief Compares two std::string objects. + * @param t_lhs The left-hand side string. + * @param t_rhs The right-hand side string. + * @return True if t_lhs is greater than t_rhs, false otherwise. + */ + [[nodiscard]] bool operator()(const std::string &t_lhs, + const std::string &t_rhs) const noexcept { + return t_lhs > t_rhs; + } + + /** + * @brief Compares two objects using iterators. + * @tparam LHS Type of the left-hand side. + * @tparam RHS Type of the right-hand side. + * @param t_lhs The left-hand side operand. + * @param t_rhs The right-hand side operand. + * @return True if t_lhs is greater than t_rhs, false otherwise. + */ + template + [[nodiscard]] constexpr bool operator()(const LHS &t_lhs, + const RHS &t_rhs) const noexcept { + return str_more_impl(t_lhs, t_rhs); + } + + struct is_transparent {}; /**< Enables transparent comparison. */ +}; + +#endif // ATOM_STRINGUTILS_HPP diff --git a/src/atom/experiment/svector.cpp b/src/atom/experiment/svector.cpp new file mode 100644 index 00000000..3d88a6f8 --- /dev/null +++ b/src/atom/experiment/svector.cpp @@ -0,0 +1,112 @@ +#ifndef CHAISCRIPT_STACK_VECTOR_HPP_ +#define CHAISCRIPT_STACK_VECTOR_HPP_ + +#include +#include +#include +#include // for std::forward, std::move + +template +struct Stack_Vector { + Stack_Vector() noexcept = default; + Stack_Vector(const Stack_Vector &other) { + m_size = other.m_size; + for (std::size_t i = 0; i < m_size; ++i) { + new (&(*this)[i]) T(other[i]); + } + } + + Stack_Vector(Stack_Vector &&other) noexcept + : data{other.data}, m_size{other.m_size} { + other.m_size = 0; + } + + ~Stack_Vector() noexcept(std::is_nothrow_destructible_v) { + for (std::size_t pos = 0; pos < m_size; ++pos) { + (*this)[pos].~T(); + } + } + + constexpr static auto aligned_size = + sizeof(T) + (sizeof(T) & std::alignment_of_v) > 0 + ? std::alignment_of_v + : 0; + + alignas(std::alignment_of_v) char data[aligned_size * MaxSize]; + + [[nodiscard]] T &operator[](const std::size_t idx) noexcept { + return *reinterpret_cast(&data + aligned_size * idx); + } + + [[nodiscard]] const T &operator[](const std::size_t idx) const noexcept { + return *reinterpret_cast(&data + aligned_size * idx); + } + + template + T &emplace_back(Param &&...param) { + auto *p = new (&(*this)[m_size++]) T(std::forward(param)...); + return *p; + }; + + auto size() const noexcept { return m_size; }; + auto capacity() const noexcept { return MaxSize; }; + void pop_back() noexcept(std::is_nothrow_destructible_v) { + (*this)[--m_size].~T(); + } + void resize(std::size_t new_size) { m_size = new_size; } + + Stack_Vector &operator=(const Stack_Vector &other) { + if (this != &other) { + for (std::size_t i = 0; i < m_size; ++i) { + (*this)[i].~T(); + } + m_size = other.m_size; + for (std::size_t i = 0; i < m_size; ++i) { + new (&(*this)[i]) T(other[i]); + } + } + return *this; + } + + Stack_Vector &operator=(Stack_Vector &&other) noexcept { + if (this != &other) { + for (std::size_t i = 0; i < m_size; ++i) { + (*this)[i].~T(); + } + std::swap(data, other.data); + std::swap(m_size, other.m_size); + } + return *this; + } + + std::size_t m_size{0}; +}; + +#endif // CHAISCRIPT_STACK_VECTOR_HPP_ + +#include +#include + +struct Foo { + int a; + double b; + float c; + + Foo(int a, double b, float c) : a(a), b(b), c(c) {} + + ~Foo() { std::cout << "Destructing Foo\n"; } +}; + +int main() { + Stack_Vector sv; + + sv.emplace_back(1, 2.3, 1.1); + sv.emplace_back(4, 5.6, 1.2); + + std::cout << sv[0].a << ", " << sv[0].b << sv[0].c << "\n"; + std::cout << sv[1].a << ", " << sv[1].b << sv[1].c << "\n"; + + sv.pop_back(); + + std::cout << sv[0].a << ", " << sv[0].b << "\n"; +} \ No newline at end of file diff --git a/src/atom/experiment/type_info.hpp b/src/atom/experiment/type_info.hpp index ba0891f7..fd0610dd 100644 --- a/src/atom/experiment/type_info.hpp +++ b/src/atom/experiment/type_info.hpp @@ -259,28 +259,11 @@ struct Get_Type_Info &> { } }; -/// \brief Creates a Type_Info object representing the type passed in -/// \tparam T Type of object to get a Type_Info for, derived from the passed in -/// parameter \return Type_Info for T -/// -/// \b Example: -/// \code -/// int i; -/// chaiscript::Type_Info ti = chaiscript::user_type(i); -/// \endcode template constexpr Type_Info user_type(const T & /*t*/) noexcept { return Get_Type_Info::get(); } -/// \brief Creates a Type_Info object representing the templated type -/// \tparam T Type of object to get a Type_Info for -/// \return Type_Info for T -/// -/// \b Example: -/// \code -/// chaiscript::Type_Info ti = chaiscript::user_type(); -/// \endcode template constexpr Type_Info user_type() noexcept { return Get_Type_Info::get(); diff --git a/src/atom/script/_json.hpp b/src/atom/script/_json.hpp new file mode 100644 index 00000000..7ffdfc76 --- /dev/null +++ b/src/atom/script/_json.hpp @@ -0,0 +1,191 @@ +/* + * _json.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-4 + +Description: Json <-> Python converter from(https://github.com/pybind/pybind11_json) + +**************************************************/ + +#ifndef ATOM_SCRIPT_JSON_HPP +#define ATOM_SCRIPT_JSON_HPP + +#include +#include + +#include "atom/type/json.hpp" + +#include "pybind11/pybind11.h" + +namespace py = pybind11; +namespace nl = nlohmann; + +namespace pyjson { +inline py::object from_json(const nl::json& j) { + if (j.is_null()) { + return py::none(); + } else if (j.is_boolean()) { + return py::bool_(j.get()); + } else if (j.is_number_unsigned()) { + return py::int_(j.get()); + } else if (j.is_number_integer()) { + return py::int_(j.get()); + } else if (j.is_number_float()) { + return py::float_(j.get()); + } else if (j.is_string()) { + return py::str(j.get()); + } else if (j.is_array()) { + py::list obj(j.size()); + for (std::size_t i = 0; i < j.size(); i++) { + obj[i] = from_json(j[i]); + } + return std::move(obj); + } else // Object + { + py::dict obj; + for (nl::json::const_iterator it = j.cbegin(); it != j.cend(); ++it) { + obj[py::str(it.key())] = from_json(it.value()); + } + return std::move(obj); + } +} + +inline nl::json to_json(const py::handle& obj) { + if (obj.ptr() == nullptr || obj.is_none()) { + return nullptr; + } + if (py::isinstance(obj)) { + return obj.cast(); + } + if (py::isinstance(obj)) { + try { + nl::json::number_integer_t s = + obj.cast(); + if (py::int_(s).equal(obj)) { + return s; + } + } catch (...) { + } + try { + nl::json::number_unsigned_t u = + obj.cast(); + if (py::int_(u).equal(obj)) { + return u; + } + } catch (...) { + } + throw std::runtime_error( + "to_json received an integer out of range for both " + "nl::json::number_integer_t and nl::json::number_unsigned_t " + "type: " + + py::repr(obj).cast()); + } + if (py::isinstance(obj)) { + return obj.cast(); + } + if (py::isinstance(obj)) { + py::module base64 = py::module::import("base64"); + return base64.attr("b64encode")(obj) + .attr("decode")("utf-8") + .cast(); + } + if (py::isinstance(obj)) { + return obj.cast(); + } + if (py::isinstance(obj) || py::isinstance(obj)) { + auto out = nl::json::array(); + for (const py::handle value : obj) { + out.push_back(to_json(value)); + } + return out; + } + if (py::isinstance(obj)) { + auto out = nl::json::object(); + for (const py::handle key : obj) { + out[py::str(key).cast()] = to_json(obj[key]); + } + return out; + } + throw std::runtime_error( + "to_json not implemented for this type of object: " + + py::repr(obj).cast()); +} +} // namespace pyjson + +// nlohmann_json serializers +namespace nlohmann { +#define MAKE_NLJSON_SERIALIZER_DESERIALIZER(T) \ + template <> \ + struct adl_serializer { \ + inline static void to_json(json& j, const T& obj) { \ + j = pyjson::to_json(obj); \ + } \ + \ + inline static T from_json(const json& j) { \ + return pyjson::from_json(j); \ + } \ + } + +#define MAKE_NLJSON_SERIALIZER_ONLY(T) \ + template <> \ + struct adl_serializer { \ + inline static void to_json(json& j, const T& obj) { \ + j = pyjson::to_json(obj); \ + } \ + } + +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::object); + +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::bool_); +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::int_); +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::float_); +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::str); + +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::list); +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::tuple); +MAKE_NLJSON_SERIALIZER_DESERIALIZER(py::dict); + +MAKE_NLJSON_SERIALIZER_ONLY(py::handle); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::item_accessor); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::list_accessor); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::tuple_accessor); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::sequence_accessor); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::str_attr_accessor); +MAKE_NLJSON_SERIALIZER_ONLY(py::detail::obj_attr_accessor); + +#undef MAKE_NLJSON_SERIALIZER +#undef MAKE_NLJSON_SERIALIZER_ONLY +} // namespace nlohmann + +// pybind11 caster +namespace pybind11 { +namespace detail { +template <> +struct type_caster { +public: + PYBIND11_TYPE_CASTER(nl::json, _("json")); + + bool load(handle src, bool) { + try { + value = pyjson::to_json(src); + return true; + } catch (...) { + return false; + } + } + + static handle cast(nl::json src, return_value_policy /* policy */, + handle /* parent */) { + object obj = pyjson::from_json(src); + return obj.release(); + } +}; +} // namespace detail +} // namespace pybind11 + +#endif diff --git a/src/atom/system/_component.cpp b/src/atom/system/_component.cpp index e69de29b..e9a65908 100644 --- a/src/atom/system/_component.cpp +++ b/src/atom/system/_component.cpp @@ -0,0 +1,214 @@ +#include "_component.hpp" + +#include "atom/log/loguru.hpp" +#include "atom/type/json.hpp" +using json = nlohmann::json; + +#include "module/battery.hpp" +#include "module/cpu.hpp" +#include "module/disk.hpp" +#include "module/gpu.hpp" +#include "module/memory.hpp" +#include "module/os.hpp" +#include "module/wifi.hpp" + +#include "_constant.hpp" + +#define ATOM_SYSTEM_NO_ARGS \ + if (!m_params.is_null()) { \ + LOG_F(ERROR, "SystemComponent::{}: Invalid params", __func__); \ + return createErrorResponse(__func__, \ + {"error", Constants::INVALID_PARAMETER}, \ + "no argument should be found"); \ + } + +#define GET_CPU_INFO(name, func) \ + auto name = func(); \ + if (name < 0 || name > 100) { \ + LOG_F(ERROR, "SystemComponent::getCPUInfo: Failed to get %s", #name); \ + return createErrorResponse(__func__, \ + {"error", "failed to get " #name}, \ + Constants::SYSTEM_ERROR); \ + } + +#define GET_MEMORY_INFO(name, func) \ + auto name = func(); \ + if (name < 0) { \ + LOG_F(ERROR, "SystemComponent::getMemoryInfo: Failed to get {}", \ + #name); \ + return createErrorResponse(__func__, \ + {"error", "failed to get " #name}, \ + Constants::SYSTEM_ERROR); \ + } + +SystemComponent::SystemComponent(const std::string &name) + : SharedComponent(name) { + DLOG_F(INFO, "SystemComponent::SystemComponent"); + + regiterFunc("getCPUInfo", &SystemComponent::getCPUInfo, this); + regiterFunc("getMemoryInfo", &SystemComponent::getMemoryInfo, this); + regiterFunc("getDiskInfo", &SystemComponent::getDiskInfo, this); + regiterFunc("getNetworkInfo", &SystemComponent::getNetworkInfo, this); + regiterFunc("getBatteryInfo", &SystemComponent::getBatteryInfo, this); + regiterFunc("getGPUInfo", &SystemComponent::getGPUInfo, this); + regiterFunc("getOSInfo", &SystemComponent::getOSInfo, this); + + registerVariable("cpuUsage", "", "The CPU usage"); + registerVariable("cpuTemperature", "", "The CPU temperature"); + registerVariable("cpuModel", "", "The CPU model"); + registerVariable("cpuFrequency", "", "The CPU frequency"); + registerVariable("numberOfPhysicalPackages", "", "The number of physical " + "packages"); + registerVariable("numberOfPhysicalCPUs", "", "The number of physical CPUs"); + registerVariable("processorIdentifier", "", "The processor identifier"); + registerVariable("processorFrequency", "", "The processor frequency"); + + registerVariable("memoryUsage", "", "The memory usage"); + registerVariable("memoryTotal", "", "The total memory"); + registerVariable("memoryMax", "", "The maximum memory"); + registerVariable("memoryUsed", "", "The used memory"); + registerVariable("memoryAvailable", "", "The available memory"); + registerVariable("memorySwapTotal", "", "The total swap memory"); + + registerVariable("diskUsage", "", "The disk usage"); + registerVariable("diskTotal", "", "The total disk"); + registerVariable("diskAvailable", "", "The available disk"); + registerVariable("diskUsed", "", "The used disk"); + + registerVariable("networkWifi", "", "The wifi network"); + registerVariable("networkWired", "", "The wired network"); + registerVariable("networkHotspot", "", "The hotspot network"); +} + +SystemComponent::~SystemComponent() { + DLOG_F(INFO, "SystemComponent::~SystemComponent"); +} + +json SystemComponent::getCPUInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getCPUInfo"); + + ATOM_SYSTEM_NO_ARGS; + + GET_CPU_INFO(current_cpu_usage, Atom::System::getCurrentCpuUsage); + GET_CPU_INFO(current_cpu_temperature, + Atom::System::getCurrentCpuTemperature); + GET_CPU_INFO(cpu_model, Atom::System::getCPUModel); + GET_CPU_INFO(processor_identifier, Atom::System::getProcessorIdentifier); + GET_CPU_INFO(processor_frequency, Atom::System::getProcessorFrequency); + GET_CPU_INFO(number_of_physical_packages, + Atom::System::getNumberOfPhysicalPackages); + GET_CPU_INFO(number_of_physical_cpus, + Atom::System::getNumberOfPhysicalCPUs); + + return createSuccessResponse( + __func__, { + {"currentCpuUsage", current_cpu_usage}, + {"currentCpuTemperature", current_cpu_temperature}, + {"cpuModel", cpu_model}, + {"processorIdentifier", processor_identifier}, + {"processorFrequency", processor_frequency}, + {"numberOfPhysicalPackages", number_of_physical_packages}, + {"numberOfPhysicalCPUs", number_of_physical_cpus}, + }); +} + +json SystemComponent::getMemoryInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getMemoryInfo"); + ATOM_SYSTEM_NO_ARGS; + + GET_MEMORY_INFO(current_memory_usage, Atom::System::getMemoryUsage); + GET_MEMORY_INFO(total_memory_size, Atom::System::getTotalMemorySize); + GET_MEMORY_INFO(available_memory_size, + Atom::System::getAvailableMemorySize); + GET_MEMORY_INFO(virtual_memory_max, Atom::System::getVirtualMemoryMax); + GET_MEMORY_INFO(virtual_memory_used, Atom::System::getVirtualMemoryUsed); + GET_MEMORY_INFO(swap_memory_used, Atom::System::getSwapMemoryUsed); + GET_MEMORY_INFO(swap_memory_total, Atom::System::getSwapMemoryTotal); + + return createSuccessResponse( + __func__, { + {"currentMemoryUsage", current_memory_usage}, + {"totalMemorySize", total_memory_size}, + {"availableMemorySize", available_memory_size}, + {"virtualMemoryMax", virtual_memory_max}, + {"virtualMemoryUsed", virtual_memory_used}, + {"swapMemoryUsed", swap_memory_used}, + {"swapMemoryTotal", swap_memory_total}, + }); +} + +json SystemComponent::getDiskInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getDiskInfo"); + ATOM_SYSTEM_NO_ARGS; + auto disks_usage = Atom::System::getDiskUsage(); + if (disks_usage.size() == 0) { + LOG_F(ERROR, "SystemComponent::getDiskInfo: Failed to get disk info"); + return createErrorResponse(__func__, + {"error", "failed to get disk info"}, + Constants::SYSTEM_ERROR); + } + json res; + for (auto &disk : disks_usage) { + res.push_back({{"drive", disk.first}, {"usage", disk.second}}); + } + return createSuccessResponse(__func__, res); +} + +json SystemComponent::getBatteryInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getBatteryInfo"); + ATOM_SYSTEM_NO_ARGS; + auto battery_info = Atom::System::getBatteryInfo(); + if (battery_info.isBatteryPresent == false) { + LOG_F(ERROR, + "SystemComponent::getBatteryInfo: Failed to get battery info"); + return createErrorResponse(__func__, + {"error", "failed to get battery info"}, + Constants::SYSTEM_ERROR); + } + return createSuccessResponse( + __func__, {{"energyNow", battery_info.energyNow}, + {"energyDesign", battery_info.energyDesign}, + {"currentNow", battery_info.currentNow}, + {"batteryLifeTime", battery_info.batteryLifeTime}, + {"batteryFullLifeTime", battery_info.batteryFullLifeTime}, + {"batteryLifePercent", battery_info.batteryLifePercent}, + {"energyFull", battery_info.energyFull}, + {"voltageNow", battery_info.voltageNow}, + {"isBatteryPresent", battery_info.isBatteryPresent}, + {"isCharging", battery_info.isCharging}}); +} + +json SystemComponent::getNetworkInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getNetworkInfo"); + ATOM_SYSTEM_NO_ARGS; + auto wifi = Atom::System::getCurrentWifi(); + auto wired = Atom::System::getCurrentWiredNetwork(); + auto hotspot = Atom::System::isHotspotConnected(); + return createSuccessResponse( + __func__, {{"wifi", wifi}, {"wired", wired}, {"hotspot", hotspot}}); +} + +json SystemComponent::getGPUInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getGPUInfo"); + ATOM_SYSTEM_NO_ARGS; + auto gpu_info = Atom::System::getGPUInfo(); + if (gpu_info.empty()) { + LOG_F(ERROR, "SystemComponent::getGPUInfo: Failed to get GPU info"); + return createErrorResponse(__func__, + {"error", "failed to get GPU info"}, + Constants::SYSTEM_ERROR); + } + return createSuccessResponse(__func__, {"gpu1", gpu_info}); +} + +json SystemComponent::getOSInfo(const json &m_params) { + DLOG_F(INFO, "SystemComponent::getOSInfo"); + ATOM_SYSTEM_NO_ARGS; + auto os_info = Atom::System::getOperatingSystemInfo(); + return createSuccessResponse(__func__, + {{"osName", os_info.osName}, + {"osVersion", os_info.osVersion}, + {"kernelVersion", os_info.kernelVersion}, + {"architecture", os_info.architecture}, + {"compiler", os_info.compiler}}); +}) \ No newline at end of file diff --git a/src/atom/system/_component.hpp b/src/atom/system/_component.hpp new file mode 100644 index 00000000..6bae8024 --- /dev/null +++ b/src/atom/system/_component.hpp @@ -0,0 +1,35 @@ +#ifndef ATOM_SYSTEM_COMPONENT_HPP +#define ATOM_SYSTEM_COMPONENT_HPP + +#include "atom/components/templates/shared_component.hpp" + +class SystemComponent : public SharedComponent +{ +public: + explicit SystemComponent(const std::string &name); + ~SystemComponent(); + + // ------------------------------------------------------------------- + // Common methods + // ------------------------------------------------------------------- + + bool initialize() override; + bool destroy() override; + + // ------------------------------------------------------------------- + // System methods + // ------------------------------------------------------------------- + + json getCPUInfo(const json &m_params); + json getMemoryInfo(const json &m_params); + json getDiskInfo(const json &m_params); + json getNetworkInfo(const json &m_params); + json getGPUInfo(const json &m_params); + json getBatteryInfo(const json &m_params); + json getOSInfo(const json &m_params); + +private: + std::unique_ptr m_configManager; +}; + +#endif diff --git a/src/atom/system/_constant.hpp b/src/atom/system/_constant.hpp new file mode 100644 index 00000000..454a6140 --- /dev/null +++ b/src/atom/system/_constant.hpp @@ -0,0 +1,25 @@ +/* + * _constants.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-16 + +Description: Constants for Lithium + +**************************************************/ + +#ifndef ATOM_SYSTEM_CONSTANTS_HPP +#define ATOM_SYSTEM_CONSTANTS_HPP + +class Constants { +public: + static constexpr const char* SYSTEM_ERROR = "system error"; + static constexpr const char* SYSTEM_WARNING = "system warning"; + static constexpr const char* INVALID_PARAMETER = "invalid parameter"; +}; + +#endif // ATOM_SYSTEM_CONSTANTS_HPP diff --git a/src/atom/system/module/gpu.cpp b/src/atom/system/module/gpu.cpp new file mode 100644 index 00000000..56130c26 --- /dev/null +++ b/src/atom/system/module/gpu.cpp @@ -0,0 +1,79 @@ +/* + * gpu.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-21 + +Description: System Information Module - GPU + +**************************************************/ + +#include "gpu.hpp" + +#ifdef _WIN32 +#include +#include +#include + +#elif defined(__linux__) +#include +#endif + +namespace Atom::System { +std::string getGPUInfo() { + std::string gpuInfo; + +#ifdef _WIN32 + if (IsWindows10OrGreater()) { + // Windows 10 或更高版本 + // 使用 Windows API 获取 GPU 信息 + HDEVINFO deviceInfoSet = + SetupDiGetClassDevsA(nullptr, "DISPLAY", nullptr, DIGCF_PRESENT); + if (deviceInfoSet == INVALID_HANDLE_VALUE) { + return "Failed to get GPU information."; + } + + SP_DEVINFO_DATA deviceInfoData; + deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + for (DWORD i = 0; + SetupDiEnumDeviceInfo(deviceInfoSet, i, &deviceInfoData); ++i) { + CHAR buffer[4096]; + DWORD dataSize = sizeof(buffer); + if (SetupDiGetDeviceRegistryPropertyA( + deviceInfoSet, &deviceInfoData, SPDRP_DEVICEDESC, nullptr, + (PBYTE)buffer, dataSize, nullptr)) { + gpuInfo += buffer; + gpuInfo += "\n"; + } + } + SetupDiDestroyDeviceInfoList(deviceInfoSet); + } else { + gpuInfo = + "Windows version is not supported for GPU information retrieval."; + } +#elif defined(__linux__) + // Linux 平台 + // 读取 GPU 相关文件获取信息 + std::ifstream file("/proc/driver/nvidia/gpus/0/information"); + if (file) { + std::string line; + while (std::getline(file, line)) { + gpuInfo += line; + gpuInfo += "\n"; + } + file.close(); + } else { + gpuInfo = "Failed to open GPU information file."; + } +#else + // 其他操作系统 + gpuInfo = "GPU information retrieval is not supported on this platform."; +#endif + + return gpuInfo; +} +} // namespace Atom::System diff --git a/src/atom/system/module/gpu.hpp b/src/atom/system/module/gpu.hpp new file mode 100644 index 00000000..dc83a0e0 --- /dev/null +++ b/src/atom/system/module/gpu.hpp @@ -0,0 +1,28 @@ +/* + * gpu.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-21 + +Description: System Information Module - GPU + +**************************************************/ + +#ifndef ATOM_SYSTEM_MODULE_GPU_HPP +#define ATOM_SYSTEM_MODULE_GPU_HPP + +#include + +namespace Atom::System { +/** + * @brief Get GPU information + * @return std::string GPU information + */ +[[nodiscard]] std::string getGPUInfo(); +} // namespace Atom::System + +#endif diff --git a/src/atom/type/abi.hpp b/src/atom/type/abi.hpp new file mode 100644 index 00000000..9b3e5208 --- /dev/null +++ b/src/atom/type/abi.hpp @@ -0,0 +1,51 @@ +/* + * abi.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-12-28 + +Description: A simple C++ ABI wrapper + +**************************************************/ + +#ifndef ATOM_TYPE_ABI_HPP +#define ATOM_TYPE_ABI_HPP + +#include +#include +#include +#include +#include + +class DemangleHelper { +public: + template + static std::string DemangleType() { + return Demangle(typeid(T).name()); + } + + template + static std::string DemangleType(const T& instance) { + return Demangle(typeid(instance).name()); + } + +private: + static std::string Demangle(const char* mangled_name) { + int status = -1; + std::unique_ptr demangled_name( + abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status), + std::free); + + if (status == 0) { + return std::string(demangled_name.get()); + } else { + return std::string(mangled_name); + } + } +}; + +#endif diff --git a/src/atom/type/args.hpp b/src/atom/type/args.hpp index 302e9676..ae0108c9 100644 --- a/src/atom/type/args.hpp +++ b/src/atom/type/args.hpp @@ -17,7 +17,11 @@ Description: Argument Container Library for C++ #include #include +#include #include +#include +#include +#include #include #if ENABLE_FASTHASH #include "emhash/hash_table8.hpp" @@ -190,4 +194,66 @@ std::optional ArgumentContainer::get(const std::string &name) const { using Args = ArgumentContainer; +/** + * @brief 通用容器,用于存储任意类型的键值对。 + * @brief A universal container for storing any type of key-value pairs. + * @note 这是ArgumentContainer的弱化版,虽然功能少,但是性能更好 + * @note This is a weak version of ArgumentContainer, although it has fewer + */ +class UniversalContainer { +public: + /** + * @brief 设置键值对。 + * @brief Set key-value pairs. + * @param key 键。 + * @param key Key. + * @param value 值。 + * @param value Value. + * @note 如果键已存在,则会覆盖原有的值。 + * @note If the key exists, it will overwrite the original value. + */ + template + void set(std::string_view key, T &&value) { + _data[std::string(key)] = std::any(std::forward(value)); + } + + /** + * @brief 获取键对应的值。 + * @brief Get the value corresponding to the key. + * @param key 键。 + * @param key Key. + * @return 值。 + * @return Value. + * @note 如果键不存在,则会抛出异常。 + * @note If the key does not exist, an exception will be thrown. + */ + template + T get(std::string_view key) const { + auto it = _data.find(std::string(key)); + if (it == _data.end()) { + throw std::runtime_error("Key not found"); + } + return std::any_cast(it->second); + } + + /** + * @brief 检查键是否存在。 + * @brief Check if the key exists. + * @param key 键。 + * @param key Key. + * @return 如果键存在,则返回true;否则返回false。 + * @return If the key exists, return true; otherwise return false. + */ + bool contains(std::string_view key) const { + return _data.find(std::string(key)) != _data.end(); + } + +private: +#if ENABLE_FASTHASH + emhash8::HashMap _data; +#else + std::unordered_map _data; +#endif +}; + #endif \ No newline at end of file diff --git a/src/atom/type/enum_flag.hpp b/src/atom/type/enum_flag.hpp new file mode 100644 index 00000000..f9a7e9a6 --- /dev/null +++ b/src/atom/type/enum_flag.hpp @@ -0,0 +1,144 @@ +/* + * enum_flag.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: Enum-based flags + +**************************************************/ + +#ifndef ATOM_TYPE_ENUM_FLAG_HPP +#define ATOM_TYPE_ENUM_FLAG_HPP + +#include +#include +#include + +namespace Atom::Type { + +template +concept EnumType = std::is_enum_v; + +//! Enum-based flags false checker +template +struct IsEnumFlags : public std::false_type {}; + +#define ENUM_FLAGS(type) \ + using Atom::Type::operator&; \ + using Atom::Type::operator|; \ + using Atom::Type::operator^; \ + namespace Atom::Type { \ + template <> \ + struct IsEnumFlags : std::true_type {}; \ + } + +template +class Flags { + //! Enum underlying type + // typedef typename std::make_unsigned::type>::type type; + using type = + std::make_unsigned_t>; // 简化了类型定义 + +public: + Flags() noexcept : _value(0) {} + Flags(type value) noexcept : _value(value) {} + Flags(TEnum value) noexcept : _value((type)value) {} + Flags(const Flags &) noexcept = default; + Flags(Flags &&) noexcept = default; + ~Flags() noexcept = default; + + Flags &operator=(type value) noexcept { + _value = value; + return *this; + } + Flags &operator=(TEnum value) noexcept { + _value = (type)value; + return *this; + } + Flags &operator=(const Flags &) noexcept = default; + Flags &operator=(Flags &&) noexcept = default; + + //! Is any flag set? + explicit operator bool() const noexcept { return isset(); } + + //! Is no flag set? + bool operator!() const noexcept { return !isset(); } + + //! Reverse all flags + Flags operator~() const noexcept { return Flags(~_value); } + + //! Flags logical assign operators + Flags &operator&=(const Flags &flags) noexcept { + _value &= flags._value; + return *this; + } + Flags &operator|=(const Flags &flags) noexcept { + _value |= flags._value; + return *this; + } + Flags &operator^=(const Flags &flags) noexcept { + _value ^= flags._value; + return *this; + } + + //! Flags logical friend operators + friend Flags operator&(const Flags &flags1, const Flags &flags2) noexcept { + return Flags(flags1._value & flags2._value); + } + friend Flags operator|(const Flags &flags1, const Flags &flags2) noexcept { + return Flags(flags1._value | flags2._value); + } + friend Flags operator^(const Flags &flags1, const Flags &flags2) noexcept { + return Flags(flags1._value ^ flags2._value); + } + + // Flags comparison + friend bool operator==(const Flags &flags1, const Flags &flags2) noexcept { + return flags1._value == flags2._value; + } + friend bool operator!=(const Flags &flags1, const Flags &flags2) noexcept { + return flags1._value != flags2._value; + } + + //! Convert to the enum value + operator TEnum() const noexcept { return (TEnum)_value; } + + //! Is any flag set? + bool isset() const noexcept { return (_value != 0); } + //! Is the given flag set? + bool isset(type value) const noexcept { return (_value & value) != 0; } + //! Is the given flag set? + bool isset(TEnum value) const noexcept { + return (_value & (type)value) != 0; + } + + //! Get the enum value + TEnum value() const noexcept { return (TEnum)_value; } + //! Get the underlying enum value + type underlying() const noexcept { return _value; } + //! Get the bitset value + std::bitset bitset() const noexcept { return {_value}; } + + //! Swap two instances + void swap(Flags &flags) noexcept { + using std::swap; + swap(_value, flags._value); + } + template + friend void swap(Flags &flags1, Flags &flags2) noexcept; + +private: + type _value; +}; + +} // namespace Atom::Type + +#include "enum_flag.inl" + +#endif diff --git a/src/atom/type/enum_flag.inl b/src/atom/type/enum_flag.inl new file mode 100644 index 00000000..ea3c3d54 --- /dev/null +++ b/src/atom/type/enum_flag.inl @@ -0,0 +1,40 @@ +/* + * enum_flag.inl + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: Enum-based flags + +**************************************************/ + +namespace Atom::Type { + +template +inline void swap(Flags& flags1, Flags& flags2) noexcept { + flags1.swap(flags2); +} + +template +constexpr auto operator&(TEnum value1, TEnum value2) noexcept -> + typename std::enable_if::value, Flags>::type { + return Flags(value1) & value2; +} + +template +constexpr auto operator|(TEnum value1, TEnum value2) noexcept -> + typename std::enable_if::value, Flags>::type { + return Flags(value1) | value2; +} + +template +constexpr auto operator^(TEnum value1, TEnum value2) noexcept -> + typename std::enable_if::value, Flags>::type { + return Flags(value1) ^ value2; +} + +} // namespace Atom::Type diff --git a/src/atom/type/pointer.hpp b/src/atom/type/pointer.hpp new file mode 100644 index 00000000..b9f04e82 --- /dev/null +++ b/src/atom/type/pointer.hpp @@ -0,0 +1,103 @@ +/* + * pointer.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: Pointer Sentinel for Atom + +**************************************************/ + +#ifndef ATOM_TYPE_POINTER_HPP +#define ATOM_TYPE_POINTER_HPP + +#include +#include +#include +#include +#include + +/** + * @brief Concept to check if a type is a pointer type, including raw pointers, std::shared_ptr, and std::unique_ptr. + * + * @tparam T The type to check. + */ +template +concept PointerType = + std::is_pointer_v || + std::is_same_v::type>> || + std::is_same_v::type>>; + +/** + * @brief A class template to hold different types of pointers using std::variant. + * + * @tparam T The type of the pointed-to object. + */ +template +class PointerSentinel { +public: + // Using std::variant to store different types of pointers + std::variant, std::unique_ptr, T*> ptr; + + /** + * @brief Construct a new Pointer Sentinel object from a shared pointer. + * + * @param p The shared pointer. + */ + PointerSentinel(std::shared_ptr p) : ptr(p) {} + + /** + * @brief Construct a new Pointer Sentinel object from a unique pointer. + * + * @param p The unique pointer. + */ + PointerSentinel(std::unique_ptr&& p) : ptr(std::move(p)) {} + + /** + * @brief Construct a new Pointer Sentinel object from a raw pointer. + * + * @param p The raw pointer. + */ + PointerSentinel(T* p) : ptr(p) {} + + /** + * @brief Get the raw pointer stored in the variant. + * + * @return T* The raw pointer. + */ + T* get() const { + return std::visit( + [](auto&& arg) -> T* { + using U = std::decay_t; + if constexpr (std::is_pointer_v) { + return arg; // Raw pointer + } else { + return arg.get(); // For smart pointers + } + }, + ptr); + } + + /** + * @brief Helper method to invoke member functions on the pointed-to object. + * + * @tparam Func The type of the member function pointer. + * @tparam Args The types of the arguments to the member function. + * @param func The member function pointer. + * @param args The arguments to the member function. + * @return auto The return type of the member function. + */ + template + auto invoke(Func func, Args&&... args) { + static_assert(std::is_member_function_pointer_v, + "Func must be a member function pointer"); + T* p = get(); + return (p->*func)(std::forward(args)...); + } +}; + +#endif diff --git a/src/atom/utils/hash_util.cpp b/src/atom/utils/hash_util.cpp index e4fb309e..6c589940 100644 --- a/src/atom/utils/hash_util.cpp +++ b/src/atom/utils/hash_util.cpp @@ -20,6 +20,7 @@ Description: Implementation of murmur3 hash and quick hash #include #include #include +#include #include #include #include @@ -311,4 +312,33 @@ std::string data_from_hexstring(const char *hexstring, size_t length) { std::string data_from_hexstring(const std::string &hexstring) { return data_from_hexstring(hexstring.c_str(), hexstring.size()); } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Winvalid-constexpr" +#endif + +#ifdef _MSC_VER +#pragma warning(disable : 4244) +#pragma warning(push) +#pragma warning(disable : 4307) +#endif + +constexpr std::uint32_t fnv1a_prime = 16777619u; +constexpr std::uint32_t fnv1a_offset_basis = 2166136261u; + +constexpr std::uint32_t fnv1aHash(std::span data, + std::uint32_t hash = fnv1a_offset_basis) { + for (std::byte byte : data) { + hash ^= std::to_integer(byte); + hash *= fnv1a_prime; + } + return hash; +} + +constexpr std::uint32_t fnv1aHash(const std::string &text) { + return fnv1aHash(std::as_bytes(std::span(text))); +} + } // namespace Atom::Utils diff --git a/src/atom/utils/hash_util.hpp b/src/atom/utils/hash_util.hpp index 22d605c1..eba83b6a 100644 --- a/src/atom/utils/hash_util.hpp +++ b/src/atom/utils/hash_util.hpp @@ -16,6 +16,8 @@ Description: Implementation of murmur3 hash and quick hash #define ATOM_UTILS_HASH_UTIL_HPP #include +#include +#include #include #include @@ -89,8 +91,7 @@ namespace Atom::Utils { * @param output The output buffer to store the hexadecimal string (length must * be len * 2). */ -void hexstring_from_data(const void *data, size_t len, - char *output); +void hexstring_from_data(const void *data, size_t len, char *output); /** * @brief Converts binary data to a hexadecimal string representation. @@ -117,8 +118,7 @@ void hexstring_from_data(const void *data, size_t len, * @param output The output buffer to store the binary data (length must be * length / 2). */ -void data_from_hexstring(const char *hexstring, size_t length, - void *output); +void data_from_hexstring(const char *hexstring, size_t length, void *output); /** * @brief Converts a hexadecimal string representation to binary data. @@ -141,6 +141,11 @@ void data_from_hexstring(const char *hexstring, size_t length, * hexadecimal string. */ [[nodiscard]] std::string data_from_hexstring(const std::string &data); + +[[nodiscard]] constexpr std::uint32_t fnv1aHash( + std::span data, std::uint32_t hash = fnv1a_offset_basis); + +[[nodiscard]] constexpr std::uint32_t fnv1aHash(const std::string &text); } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/atom/utils/leak.hpp b/src/atom/utils/leak.hpp new file mode 100644 index 00000000..52cae42e --- /dev/null +++ b/src/atom/utils/leak.hpp @@ -0,0 +1,33 @@ +/* + * leak.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-12-16 + +Description: Memory Leak Detection + +**************************************************/ + +#ifndef ATOM_UTILS_LEAK_HPP +#define ATOM_UTILS_LEAK_HPP + +#if defined(__clang__) +#pragma clang system_header +#elif defined(__GNUC__) +#pragma GCC system_header +#elif defined(_MSC_VER) +#pragma system_header +#endif + +//! @cond INTERNALS +#if defined(_MSC_VER) +#define VLD_FORCE_ENABLE +#include +#endif +//! @endcond + +#endif // ATOM_UTILS_LEAK_HPP diff --git a/src/atom/utils/utf.cpp b/src/atom/utils/utf.cpp new file mode 100644 index 00000000..9287674b --- /dev/null +++ b/src/atom/utils/utf.cpp @@ -0,0 +1,137 @@ +/* + * utf.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: Some useful functions about utf string + +**************************************************/ + +#include "utf.hpp" + +#include +#include +#include +#include +#include +#include + +namespace Atom::Utils { +std::string toUTF8(std::wstring_view wstr) { +#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) + std::wstring_convert, char16_t> convert; + return convert.to_bytes((char16_t*)wstr.data(), + (char16_t*)wstr.data() + wstr.size()); +#elif defined(unix) || defined(__unix) || defined(__unix__) || \ + defined(__APPLE__) + std::wstring_convert > convert; + return convert.to_bytes(wstr.data(), wstr.data() + wstr.size()); +#elif defined(_WIN32) || defined(_WIN64) + std::wstring_convert > convert; + return convert.to_bytes(wstr.data(), wstr.data() + wstr.size()); +#endif +} + +std::wstring fromUTF8(std::string_view str) { +#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) + std::wstring_convert, char16_t> convert; + auto tmp = convert.from_bytes(str.data(), str.data() + str.size()); + return std::wstring(tmp.data(), tmp.data() + tmp.size()); +#elif defined(unix) || defined(__unix) || defined(__unix__) || \ + defined(__APPLE__) + std::wstring_convert > convert; + return convert.from_bytes(str.data(), str.data() + str.size()); +#elif defined(_WIN32) || defined(_WIN64) + std::wstring_convert > convert; + return convert.from_bytes(str.data(), str.data() + str.size()); +#endif +} + +std::u16string UTF8toUTF16(std::string_view str) { +#if defined(_MSC_VER) + std::wstring_convert, uint16_t> convert; + auto tmp = convert.from_bytes(str.data(), str.data() + str.size()); + return std::u16string(tmp.data(), tmp.data() + tmp.size()); +#else + std::wstring_convert, char16_t> convert; + return convert.from_bytes(str.data(), str.data() + str.size()); +#endif +} + +std::u32string UTF8toUTF32(std::string_view str) { +#if defined(_MSC_VER) + std::wstring_convert, uint32_t> convert; + auto tmp = convert.from_bytes(str.data(), str.data() + str.size()); + return std::u32string(tmp.data(), tmp.data() + tmp.size()); +#else + std::wstring_convert, char32_t> convert; + return convert.from_bytes(str.data(), str.data() + str.size()); +#endif +} + +std::string UTF16toUTF8(std::u16string_view str) { +#if defined(_MSC_VER) + std::wstring_convert, uint16_t> convert; + return convert.to_bytes((uint16_t*)str.data(), + (uint16_t*)str.data() + str.size()); +#else + std::wstring_convert, char16_t> convert; + return convert.to_bytes(str.data(), str.data() + str.size()); +#endif +} + +std::u32string UTF16toUTF32(std::u16string_view str) { + std::string bytes; + bytes.reserve(str.size() * 2); + + for (const char16_t ch : str) { + bytes.push_back((uint8_t)(ch / 256)); + bytes.push_back((uint8_t)(ch % 256)); + } + +#if defined(_MSC_VER) + std::wstring_convert, uint32_t> convert; + auto tmp = convert.from_bytes(bytes); + return std::u32string(tmp.data(), tmp.data() + tmp.size()); +#else + std::wstring_convert, char32_t> convert; + return convert.from_bytes(bytes); +#endif +} + +std::string UTF32toUTF8(std::u32string_view str) { +#if defined(_MSC_VER) + std::wstring_convert, uint32_t> convert; + return convert.to_bytes((uint32_t*)str.data(), + (uint32_t*)str.data() + str.size()); +#else + std::wstring_convert, char32_t> convert; + return convert.to_bytes(str.data(), str.data() + str.size()); +#endif +} + +std::u16string UTF32toUTF16(std::u32string_view str) { +#if defined(_MSC_VER) + std::wstring_convert, uint32_t> convert; + std::string bytes = convert.to_bytes((uint32_t*)str.data(), + (uint32_t*)str.data() + str.size()); +#else + std::wstring_convert, char32_t> convert; + std::string bytes = convert.to_bytes(str.data(), str.data() + str.size()); +#endif + + std::u16string result; + result.reserve(bytes.size() / 2); + + for (size_t i = 0; i < bytes.size(); i += 2) + result.push_back( + (char16_t)((uint8_t)(bytes[i]) * 256 + (uint8_t)(bytes[i + 1]))); + + return result; +} +} // namespace Atom::Utils diff --git a/src/atom/utils/utf.hpp b/src/atom/utils/utf.hpp new file mode 100644 index 00000000..0436af49 --- /dev/null +++ b/src/atom/utils/utf.hpp @@ -0,0 +1,86 @@ +/* + * utf.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: Some useful functions about utf string + +**************************************************/ + +#ifndef ATOM_UTILS_UTF_HPP +#define ATOM_UTILS_UTF_HPP + +#include + +namespace Atom::Utils { +/** + * @brief 将宽字符字符串转换为 UTF-8 字符串 + * + * @param wstr 宽字符字符串视图 + * @return std::string 转换后的 UTF-8 字符串 + */ +std::string toUTF8(std::wstring_view wstr); + +/** + * @brief 将 UTF-8 字符串转换为宽字符字符串 + * + * @param str UTF-8 字符串视图 + * @return std::wstring 转换后的宽字符字符串 + */ +std::wstring fromUTF8(std::string_view str); + +/** + * @brief 将 UTF-8 字符串转换为 UTF-16 字符串 + * + * @param str UTF-8 字符串视图 + * @return std::u16string 转换后的 UTF-16 字符串 + */ +std::u16string UTF8toUTF16(std::string_view str); + +/** + * @brief 将 UTF-8 字符串转换为 UTF-32 字符串 + * + * @param str UTF-8 字符串视图 + * @return std::u32string 转换后的 UTF-32 字符串 + */ +std::u32string UTF8toUTF32(std::string_view str); + +/** + * @brief 将 UTF-16 字符串转换为 UTF-8 字符串 + * + * @param str UTF-16 字符串视图 + * @return std::string 转换后的 UTF-8 字符串 + */ +std::string UTF16toUTF8(std::u16string_view str); + +/** + * @brief 将 UTF-16 字符串转换为 UTF-32 字符串 + * + * @param str UTF-16 字符串视图 + * @return std::u32string 转换后的 UTF-32 字符串 + */ +std::u32string UTF16toUTF32(std::u16string_view str); + +/** + * @brief 将 UTF-32 字符串转换为 UTF-8 字符串 + * + * @param str UTF-32 字符串视图 + * @return std::string 转换后的 UTF-8 字符串 + */ +std::string UTF32toUTF8(std::u32string_view str); + +/** + * @brief 将 UTF-32 字符串转换为 UTF-16 字符串 + * + * @param str UTF-32 字符串视图 + * @return std::u16string 转换后的 UTF-16 字符串 + */ +std::u16string UTF32toUTF16(std::u32string_view str); +} // namespace Atom::Utils + +#endif diff --git a/src/config/_component.cpp b/src/config/_component.cpp index 34c2ae92..922101bc 100644 --- a/src/config/_component.cpp +++ b/src/config/_component.cpp @@ -4,66 +4,167 @@ #include "atom/log/loguru.hpp" +#define CONFIG_MANAGER_CHECK \ + if (!m_configManager) { \ + LOG_F(ERROR, "ConfigComponent::{}: configManager is nullptr", \ + __func__); \ + return createErrorResponse(__func__, {"error", "key not found"}, \ + "key not found"); \ + } + +#define LITHIUM_CONFIG_KEY_CHECK(key) \ + if (!m_params.contains(key) || !m_params[key].is_string()) { \ + LOG_F(ERROR, "ConfigComponent::{}: {} not found", __func__, key); \ + return createErrorResponse(__func__, {"error", "missing " + key}, \ + "missing " + key); \ + } + ConfigComponent::ConfigComponent(const std::string& name) - : SharedComponent(name), m_configManager(Lithium::ConfigManager::createShared()) {} + : SharedComponent(name), + m_configManager(Lithium::ConfigManager::createShared()) { + DLOG_F(INFO, "ConfigComponent::Constructor"); -ConfigComponent::~ConfigComponent() {} + DLOG_F(INFO, "Injecting commands"); + registerFunc("getConfig", &ConfigComponent::getConfig, this); + registerFunc("setConfig", &ConfigComponent::setConfig, this); + registerFunc("deleteConfig", &ConfigComponent::deleteConfig, this); + registerFunc("loadConfig", &ConfigComponent::loadConfig, this); + registerFunc("saveConfig", &ConfigComponent::saveConfig, this); + registerFunc("hasConfig", &ConfigComponent::hasConfig, this); + registerFunc("loadConfigs", &ConfigComponent::loadConfigs, this); +} -bool ConfigComponent::initialize() { return true; } +ConfigComponent::~ConfigComponent() { + DLOG_F(INFO, "ConfigComponent::Destructor"); +} + +bool ConfigComponent::initialize() { + DLOG_F(INFO, "ConfigComponent::initialize"); + return true; +} -bool ConfigComponent::destroy() { return true; } +bool ConfigComponent::destroy() { + DLOG_F(INFO, "ConfigComponent::destroy") + return true; +} json ConfigComponent::getConfig(const json& m_params) { - if (!m_configManager) { - LOG_F(ERROR, "ConfigComponent::getConfig m_configManager is nullptr"); - return createErrorResponse("getConfig", {"error", "key not found"}, - "key not found"); - } - if (!m_params.contains("key") || !m_params["key"].is_string()) { - LOG_F(ERROR, "ConfigComponent::getConfig: key not found"); - return createErrorResponse("getConfig", {"error", "missing key"}, - "missing key"); - } + CONFIG_MANAGER_CHECK; + LITHIUM_CONFIG_KEY_CHECK("key"); std::string key = m_params["key"].get(); - if (!m_configManager->hasValue(key)) - { + if (!m_configManager->hasValue(key)) { LOG_F(ERROR, "ConfigComponent::getConfig: key not found"); return createErrorResponse("getConfig", {"error", "key not found"}, "key not found"); } - if (auto value = m_configManager->getValue(key); value) - { - return createSuccessResponse("getConfig", {"value",value}); + if (auto value = m_configManager->getValue(key); value) { + return createSuccessResponse("getConfig", {"value", value}); } - return createErrorResponse("getConfig", {"error", {"error", "failed to get config by key"}}, - "failed to get config by key"); + return createErrorResponse( + "getConfig", {"error", {"error", "failed to get config by key"}}, + "failed to get config by key"); } -json ConfigComponent::setConfig(const json &m_params) -{ - if (!m_configManager) - { - LOG_F(ERROR,"ConfigComponent::setConfig: m_configManager is nullptr"); - return createErrorResponse("setConfig", {"error", {"error", "config manager not set"}}, - "config manager not set"); +json ConfigComponent::setConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + if (!m_params.contains("key") || !m_params.contains("value")) { + LOG_F(ERROR, + "ConfigComponent::setConfig: m_params does not contain key"); + return createErrorResponse("setConfig", {"error", "key not set"}, + "key not set"); } - if (!m_params.contains("key") || !m_params.contains("value")) - { - LOG_F(ERROR,"ConfigComponent::setConfig: m_params does not contain key"); - return createErrorResponse("setConfig", {"error", {"error", "key not set"}}, + if (!m_params["key"].is_string() || !m_params["value"].is_primitive()) { + LOG_F(ERROR, + "ConfigComponent::setConfig: m_params is not a string or " + "primitive"); + return createErrorResponse("setConfig", {"error", "key not set"}, "key not set"); } - if (!m_params["key"].is_string() || !m_params["value"].is_primitive()) - { - LOG_F(ERROR,"ConfigComponent::setConfig: m_params is not a string or primitive"); - return createErrorResponse("setConfig", {"error", {"error", "key not set"}}, + if (!setVariable(m_params["key"].get(), m_params["value"])) { + LOG_F(ERROR, "ConfigComponent::setConfig: setVariable failed"); + return createErrorResponse( + "setConfig", {"error", {"error", "key not set"}}, "key not set"); + } + return createSuccessResponse("setConfig", {}); +} + +json ConfigComponent::deleteConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + LITHIUM_CONFIG_KEY_CHECK("key"); + try { + if (!m_configManager->deleteValue(m_params["key"].get())) { + LOG_F(ERROR, "ConfigComponent::deleteConfig: deleteValue failed"); + return createErrorResponse(__func__, {"error", "key not set"}, + "key not set"); + } + } catch (const json::exception& e) { + LOG_F(ERROR, "ConfigComponent::deleteConfig: json exception: {}", + e.what()); + return createErrorResponse(__func__, {"error", e.what()}, "key not set"); } - if (!setVariable(m_params["key"].get(), m_params["value"])) - { - LOG_F(ERROR,"ConfigComponent::setConfig: setVariable failed"); - return createErrorResponse("setConfig", {"error", {"error", "key not set"}}, + return createSuccessResponse(__func__, {}); +} + +json ConfigComponent::hasConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + LITHIUM_CONFIG_KEY_CHECK("key"); + try { + if (!m_configManager->hasValue(m_params["key"].get())) { + LOG_F(ERROR, "ConfigComponent::hasConfig: hasValue failed"); + return createErrorResponse(__func__, {"error", "key not set"}, + "key not set"); + } + } catch (const json::exception& e) { + LOG_F(ERROR, "ConfigComponent::hasConfig: json exception: {}", + e.what()); + return createErrorResponse(__func__, {"error", e.what()}, "key not set"); } - return createSuccessResponse("setConfig", {}); + return createSuccessResponse(__func__, {}); +} + +json ConfigComponent::loadConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + if (!m_params.contains("path") || !m_params["path"].is_string()) { + LOG_F(ERROR, "ConfigComponent::loadConfig: path not set"); + return createErrorResponse("loadConfig", {"error", "path not set"}, + "path not set"); + } + if (!m_configManager->loadFromFile(m_params["path"].get())) { + LOG_F(ERROR, "ConfigComponent::loadConfig: loadFromFile failed"); + return createErrorResponse("loadConfig", {"error", "path not set"}, + "path not set"); + } + return createSuccessResponse("loadConfig", {}); +} + +json ConfigComponent::saveConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + if (!m_params.contains("path") || !m_params["path"].is_string()) { + LOG_F(ERROR, "ConfigComponent::saveConfig: path not set"); + return createErrorResponse("saveConfig", {"error", "path not set"}, + "path not set"); + } + if (!m_configManager->saveToFile(m_params["path"].get())) { + LOG_F(ERROR, "ConfigComponent::saveConfig: saveToFile failed"); + return createErrorResponse(__func__, {"error", "path not set"}, + "path not set"); + } + return createSuccessResponse(__func__, {}); +} + +json ConfigComponent::loadConfigs(const json& m_params) { + CONFIG_MANAGER_CHECK; + if (!m_params.contains("path") || !m_params["path"].is_string()) { + LOG_F(ERROR, "ConfigComponent::loadConfigs: path not set"); + return createErrorResponse("loadConfigs", {"error", "path not set"}, + "path not set"); + } + if (!m_configManager->loadFromFile(m_params["path"].get())) { + LOG_F(ERROR, "ConfigComponent::loadConfigs: loadFromFile failed"); + return createErrorResponse(__func__, {"error", "path not set"}, + "path not set"); + } + return createSuccessResponse(__func__, {}); } \ No newline at end of file diff --git a/src/config/configor.hpp b/src/config/configor.hpp index 5f94b42a..2730de63 100644 --- a/src/config/configor.hpp +++ b/src/config/configor.hpp @@ -60,6 +60,10 @@ class ConfigManager { */ ~ConfigManager(); + // ------------------------------------------------------------------- + // Common methods + // ------------------------------------------------------------------- + /** * @brief 创建一个全局唯一的ConfigManager实例 * @@ -67,24 +71,9 @@ class ConfigManager { */ static std::shared_ptr createShared(); - /** - * @brief 从指定文件中加载JSON配置,并与原有配置进行合并 - * - * Load JSON configuration from the specified file and merge with the - * existing configuration. - * - * @param path 配置文件路径 - */ - bool loadFromFile(const std::string &path); - - /** - * @brief 加载指定目录下的所有JSON配置文件 - * - * Load all JSON configuration files in the specified directory. - * - * @param dir_path 配置文件所在目录的路径 - */ - bool loadFromDir(const std::string &dir_path, bool recursive); + // ------------------------------------------------------------------- + // Config methods + // ------------------------------------------------------------------- /** * @brief 获取一个配置项的值 @@ -95,7 +84,7 @@ class ConfigManager { * "database/username" * @return json 配置项对应的值,如果键不存在则返回 nullptr */ - json getValue(const std::string &key_path) const; + [[nodiscard]] json getValue(const std::string &key_path) const; /** * @brief 添加或更新一个配置项 @@ -130,6 +119,25 @@ class ConfigManager { */ bool hasValue(const std::string &key_path) const; + /** + * @brief 从指定文件中加载JSON配置,并与原有配置进行合并 + * + * Load JSON configuration from the specified file and merge with the + * existing configuration. + * + * @param path 配置文件路径 + */ + bool loadFromFile(const std::string &path); + + /** + * @brief 加载指定目录下的所有JSON配置文件 + * + * Load all JSON configuration files in the specified directory. + * + * @param dir_path 配置文件所在目录的路径 + */ + bool loadFromDir(const std::string &dir_path, bool recursive); + /** * @brief 将当前配置保存到指定文件 * diff --git a/tests/all.cpp b/tests/all.cpp new file mode 100644 index 00000000..7d174e04 --- /dev/null +++ b/tests/all.cpp @@ -0,0 +1,7 @@ +#include "gtest/gtest.h" + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests/atom/algorithm/base.cpp b/tests/atom/algorithm/base.cpp new file mode 100644 index 00000000..97d0e47a --- /dev/null +++ b/tests/atom/algorithm/base.cpp @@ -0,0 +1,186 @@ +#include +#include +#include +#include "atom/algorithm/base.hpp" + + +using namespace Atom::Algorithm; + +class Base16Test : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64}; + testEncodedData = "48656c6c6f20576f726c64"; + } + + std::vector testData; + std::string testEncodedData; +}; + +TEST_F(Base16Test, EncodeBase16) { + // Encode test data + std::string encodedData = encodeBase16(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testEncodedData); +} + +TEST_F(Base16Test, DecodeBase16) { + // Decode test data + std::vector decodedData = decodeBase16(testEncodedData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} + +class Base32Test : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = "Hello World!"; + testEncodedData = "JBSWY3DPEHPK3PXP"; + } + + std::string testData; + std::string testEncodedData; +}; + +TEST_F(Base32Test, EncodeBase32) { + // Encode test data + std::string encodedData = encodeBase32(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testEncodedData); +} + +TEST_F(Base32Test, DecodeBase32) { + // Decode test data + std::string decodedData = decodeBase32(testEncodedData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} + +class Base64Test : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64}; + testEncodedData = "SGVsbG8gV29ybGQ="; + } + + std::vector testData; + std::string testEncodedData; +}; + +TEST_F(Base64Test, Base64Encode) { + // Encode test data + std::string encodedData = base64Encode(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testEncodedData); +} + +TEST_F(Base64Test, Base64Decode) { + // Decode test data + std::vector decodedData = base64Decode(testEncodedData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} + +class Base64EnhanceTest : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64}; + testEncodedData = "SGVsbG8gV29ybGQ="; + } + + std::vector testData; + std::string testEncodedData; +}; + +TEST_F(Base64EnhanceTest, Base64EncodeEnhance) { + // Encode test data + std::string encodedData = base64EncodeEnhance(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testEncodedData); +} + +#ifndef __MAIN__ +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +#endif + + +TEST_F(Base64EnhanceTest, Base64DecodeEnhance) { + // Decode test data + std::vector decodedData = base64DecodeEnhance(testEncodedData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} + +class Base85Test : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64}; + testEncodedData = "Hello World!"; + } + + std::vector testData; + std::string testEncodedData; +}; + +TEST_F(Base85Test, EncodeBase85) { + // Encode test data + std::string encodedData = encodeBase85(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testEncodedData); +} + +TEST_F(Base85Test, DecodeBase85) { + // Decode test data + std::vector decodedData = decodeBase85(testEncodedData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} + +class Base128Test : public ::testing::Test { +protected: + void SetUp() override { + // Set up test data + testData = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64}; + } + + std::vector testData; +}; + +TEST_F(Base128Test, EncodeBase128) { + // Encode test data + std::vector encodedData = encodeBase128(testData); + + // Check the encoded data + EXPECT_EQ(encodedData, testData); +} + +TEST_F(Base128Test, DecodeBase128) { + // Decode test data + std::vector decodedData = decodeBase128(testData); + + // Check the decoded data + EXPECT_EQ(decodedData, testData); +} diff --git a/tests/atom/algorithm/base32.cpp b/tests/atom/algorithm/base32.cpp deleted file mode 100644 index 5c245479..00000000 --- a/tests/atom/algorithm/base32.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include "atom/algorithm/base32.hpp" - -TEST(Base32Test, EncodeDecodeTest) -{ - std::string input = "Hello World!"; - std::string encoded = Atom::Algorithm::encodeBase32(input); - std::string decoded = Atom::Algorithm::decodeBase32(encoded); - - EXPECT_EQ(input, decoded); -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/atom/algorithm/base64.cpp b/tests/atom/algorithm/base64.cpp deleted file mode 100644 index 643922c3..00000000 --- a/tests/atom/algorithm/base64.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include "atom/algorithm/base64.hpp" - -TEST(Base64Test, EncodeDecodeTest) -{ - std::vector data = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'}; - - // Test base64Encode and base64Decode - std::string encoded = base64Encode(data); - std::vector decoded = base64Decode(encoded); - - EXPECT_EQ(data, decoded); - - // Test base64EncodeEnhance and base64DecodeEnhance - std::vector dataEnhance = {'T', 'e', 's', 't', ' ', 'S', 't', 'r', 'i', 'n', 'g'}; - std::string encodedEnhance = base64EncodeEnhance(dataEnhance); - std::vector decodedEnhance = base64DecodeEnhance(encodedEnhance); - - EXPECT_EQ(dataEnhance, decodedEnhance); -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/atom/algorithm/hash.cpp b/tests/atom/algorithm/hash.cpp new file mode 100644 index 00000000..342d8598 --- /dev/null +++ b/tests/atom/algorithm/hash.cpp @@ -0,0 +1,62 @@ +#include "atom/algorithm/hash.hpp" +#include + +using namespace Atom::Algorithm; + +TEST(ComputeHashTest, TestInt) { + int value = 123; + std::size_t expected = std::hash{}(value); + std::size_t result = computeHash(value); + EXPECT_EQ(result, expected); +} + +TEST(ComputeHashTest, TestString) { + std::string value = "hello"; + std::size_t expected = std::hash{}(value); + std::size_t result = computeHash(value); + EXPECT_EQ(result, expected); +} + +TEST(ComputeHashTest, TestVector) { + std::vector values = {1, 2, 3}; + std::size_t expected = 0; + for (const auto& value : values) { + expected ^= std::hash{}(value) + 0x9e3779b9 + (expected << 6) + + (expected >> 2); + } + std::size_t result = computeHash(values); + EXPECT_EQ(result, expected); +} + +TEST(ComputeHashTest, TestTuple) { + std::tuple tuple = std::make_tuple(123, "hello"); + std::size_t expected = 0; + apply( + [&expected](const int& value1, const std::string& value2) { + expected ^= computeHash(value1) + 0x9e3779b9 + + (expected << 6) + (expected >> 2); + expected ^= computeHash(value2) + 0x9e3779b9 + + (expected << 6) + (expected >> 2); + }, + tuple); + std::size_t result = computeHash(tuple); + EXPECT_EQ(result, expected); +} + +TEST(ComputeHashTest, TestArray) { + std::array array = {{1, 2, 3}}; + std::size_t expected = 0; + for (const auto& value : array) { + expected ^= std::hash{}(value) + 0x9e3779b9 + (expected << 6) + + (expected >> 2); + } + std::size_t result = computeHash(array); + EXPECT_EQ(result, expected); +} + +#ifndef __MAIN__ +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +#endif diff --git a/tests/atom/experiment/memory.cpp b/tests/atom/experiment/memory.cpp new file mode 100644 index 00000000..7649f277 --- /dev/null +++ b/tests/atom/experiment/memory.cpp @@ -0,0 +1,80 @@ +#include +#include "atom/experiment/memory.hpp" + +struct TestType { + int value; +}; + +using TestPool = MemoryPool; + +class MemoryPoolTest : public ::testing::Test { +protected: + TestPool pool; +}; + +TEST_F(MemoryPoolTest, Allocate) { + auto p = pool.allocate(1); + EXPECT_NE(p, nullptr); + pool.deallocate(p, 1); +} + +TEST_F(MemoryPoolTest, AllocateMultiple) { + auto p1 = pool.allocate(1); + auto p2 = pool.allocate(2); + auto p3 = pool.allocate(3); + EXPECT_NE(p1, nullptr); + EXPECT_NE(p2, nullptr); + EXPECT_NE(p3, nullptr); + pool.deallocate(p1, 1); + pool.deallocate(p2, 2); + pool.deallocate(p3, 3); +} + +TEST_F(MemoryPoolTest, DeallocateOrder) { + auto p1 = pool.allocate(1); + auto p2 = pool.allocate(2); + pool.deallocate(p2, 2); + pool.deallocate(p1, 1); +} + +TEST_F(MemoryPoolTest, ReuseChunk) { + auto p1 = pool.allocate(1); + pool.deallocate(p1, 1); + auto p2 = pool.allocate(1); + EXPECT_EQ(p1, p2); + pool.deallocate(p2, 1); +} + +TEST_F(MemoryPoolTest, AllocateLarge) { + auto p = pool.allocate(pool.block_size() / sizeof(TestType) + 1); + EXPECT_NE(p, nullptr); + pool.deallocate(p, pool.block_size() / sizeof(TestType) + 1); +} + +TEST_F(MemoryPoolTest, AllocateHuge) { + EXPECT_THROW(pool.allocate(std::numeric_limits::max()), std::bad_alloc); +} + +TEST_F(MemoryPoolTest, Compare) { + TestPool pool2; + EXPECT_TRUE(pool.is_equal(pool)); + EXPECT_FALSE(pool.is_equal(pool2)); +} + +TEST_F(MemoryPoolTest, AsMemoryResource) { + std::pmr::vector vec{&pool}; + for (int i = 0; i < 100; ++i) { + vec.emplace_back(TestType{i}); + } + EXPECT_EQ(vec.size(), 100); + for (int i = 0; i < 100; ++i) { + EXPECT_EQ(vec[i].value, i); + } +} + +#ifndef __MAIN__ +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +#endif diff --git a/tests/atom/experiment/object.cpp b/tests/atom/experiment/object.cpp new file mode 100644 index 00000000..437e11df --- /dev/null +++ b/tests/atom/experiment/object.cpp @@ -0,0 +1,76 @@ +#include "atom/experiment/object.hpp" +#include +#include + +class TestObject { +public: + void reset() { value_ = 0; } + int value_ = 0; +}; + +class ObjectPoolTest : public ::testing::Test { +protected: + ObjectPool pool_{10}; +}; + +TEST_F(ObjectPoolTest, Acquire) { + auto obj = pool_.acquire(); + EXPECT_TRUE(obj != nullptr); + EXPECT_EQ(obj->value_, 0); +} + +TEST_F(ObjectPoolTest, Release) { + auto obj = pool_.acquire(); + obj->value_ = 42; + pool_.release(std::move(obj)); + obj = pool_.acquire(); + EXPECT_EQ(obj->value_, 0); +} + +/* +TEST_F(ObjectPoolTest, MaxSize) { + std::vector> objects; + for (int i = 0; i < 10; ++i) { + objects.push_back(pool_.acquire()); + } + EXPECT_EQ(pool_.available(), 0); + auto obj = pool_.acquire(); + EXPECT_TRUE(obj != nullptr); + EXPECT_EQ(pool_.size(), 10); +} +*/ + +TEST_F(ObjectPoolTest, ReleaseMoreThanAcquire) { + auto obj1 = pool_.acquire(); + auto obj2 = pool_.acquire(); + pool_.release(std::move(obj1)); + pool_.release(std::move(obj2)); + auto obj3 = std::make_shared(); + pool_.release(std::move(obj3)); + EXPECT_EQ(pool_.size(), 2); + EXPECT_EQ(pool_.available(), 10); +} + +TEST_F(ObjectPoolTest, ConcurrentAccess) { + std::vector threads; + for (int i = 0; i < 10; ++i) { + threads.emplace_back([this]() { + auto obj = pool_.acquire(); + obj->value_ = 42; + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + pool_.release(std::move(obj)); + }); + } + for (auto &t : threads) { + t.join(); + } + EXPECT_EQ(pool_.size(), 10); + EXPECT_EQ(pool_.available(), 10); + auto obj = pool_.acquire(); + EXPECT_EQ(obj->value_, 0); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/websrc/heal-web/.gitignore b/websrc/heal-web/.gitignore deleted file mode 100644 index 8296128d..00000000 --- a/websrc/heal-web/.gitignore +++ /dev/null @@ -1,92 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock -.DS_Store - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Webpack -.webpack/ - -# Vite -.vite/ - -# Electron-Forge -out/ diff --git a/websrc/heal-web/forge.config.js b/websrc/heal-web/forge.config.js deleted file mode 100644 index d6aa49c1..00000000 --- a/websrc/heal-web/forge.config.js +++ /dev/null @@ -1,63 +0,0 @@ -const { FusesPlugin } = require('@electron-forge/plugin-fuses'); -const { FuseV1Options, FuseVersion } = require('@electron/fuses'); - -module.exports = { - packagerConfig: { - asar: true, - }, - rebuildConfig: {}, - makers: [ - { - name: '@electron-forge/maker-squirrel', - config: {}, - }, - { - name: '@electron-forge/maker-zip', - platforms: ['darwin'], - }, - { - name: '@electron-forge/maker-deb', - config: {}, - }, - { - name: '@electron-forge/maker-rpm', - config: {}, - }, - ], - plugins: [ - { - name: '@electron-forge/plugin-auto-unpack-natives', - config: {}, - }, - { - name: '@electron-forge/plugin-webpack', - config: { - mainConfig: './webpack.main.config.js', - renderer: { - config: './webpack.renderer.config.js', - entryPoints: [ - { - html: './src/index.html', - js: './src/renderer.js', - name: 'main_window', - preload: { - js: './src/preload.js', - }, - }, - ], - }, - }, - }, - // Fuses are used to enable/disable various Electron functionality - // at package time, before code signing the application - new FusesPlugin({ - version: FuseVersion.V1, - [FuseV1Options.RunAsNode]: false, - [FuseV1Options.EnableCookieEncryption]: true, - [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, - [FuseV1Options.EnableNodeCliInspectArguments]: false, - [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, - [FuseV1Options.OnlyLoadAppFromAsar]: true, - }), - ], -}; diff --git a/websrc/heal-web/package.json b/websrc/heal-web/package.json deleted file mode 100644 index 77e64fc7..00000000 --- a/websrc/heal-web/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "heal-web", - "productName": "heal-web", - "version": "1.0.0", - "description": "My Electron application description", - "main": ".webpack/main", - "scripts": { - "start": "electron-forge start", - "package": "electron-forge package", - "make": "electron-forge make", - "publish": "electron-forge publish", - "lint": "echo \"No linting configured\"" - }, - "devDependencies": { - "@electron-forge/cli": "^7.3.0", - "@electron-forge/maker-deb": "^7.3.0", - "@electron-forge/maker-rpm": "^7.3.0", - "@electron-forge/maker-squirrel": "^7.3.0", - "@electron-forge/maker-zip": "^7.3.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.3.0", - "@electron-forge/plugin-fuses": "^7.2.0", - "@electron-forge/plugin-webpack": "^7.3.0", - "@electron/fuses": "^1.7.0", - "@vercel/webpack-asset-relocator-loader": "1.7.3", - "css-loader": "^6.0.0", - "node-loader": "^2.0.0", - "style-loader": "^3.0.0" - }, - "keywords": [], - "author": { - "name": "Max Qian", - "email": "astro_air@126.com" - }, - "license": "MIT", - "dependencies": { - "admin-lte": "^3.2", - "astro": "^4.4.4", - "electron-squirrel-startup": "^1.0.0" - } -} diff --git a/websrc/heal-web/src/index.css b/websrc/heal-web/src/index.css deleted file mode 100644 index 8856f90b..00000000 --- a/websrc/heal-web/src/index.css +++ /dev/null @@ -1,7 +0,0 @@ -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, - Arial, sans-serif; - margin: auto; - max-width: 38rem; - padding: 2rem; -} diff --git a/websrc/heal-web/src/index.html b/websrc/heal-web/src/index.html deleted file mode 100644 index 219d54b9..00000000 --- a/websrc/heal-web/src/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Hello World! - - - -

💖 Hello World!

-

Welcome to your Electron application.

- - diff --git a/websrc/heal-web/src/main.js b/websrc/heal-web/src/main.js deleted file mode 100644 index ddbffc54..00000000 --- a/websrc/heal-web/src/main.js +++ /dev/null @@ -1,49 +0,0 @@ -const { app, BrowserWindow } = require('electron'); -const path = require('path'); - -// Handle creating/removing shortcuts on Windows when installing/uninstalling. -if (require('electron-squirrel-startup')) { - app.quit(); -} - -const createWindow = () => { - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 800, - height: 600, - webPreferences: { - preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY, - }, - }); - - // and load the index.html of the app. - mainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY); - - // Open the DevTools. - mainWindow.webContents.openDevTools(); -}; - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', createWindow); - -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('activate', () => { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } -}); - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and import them here. diff --git a/websrc/heal-web/src/preload.js b/websrc/heal-web/src/preload.js deleted file mode 100644 index 5e9d369c..00000000 --- a/websrc/heal-web/src/preload.js +++ /dev/null @@ -1,2 +0,0 @@ -// See the Electron documentation for details on how to use preload scripts: -// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/websrc/heal-web/src/renderer.js b/websrc/heal-web/src/renderer.js deleted file mode 100644 index 4a353474..00000000 --- a/websrc/heal-web/src/renderer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * This file will automatically be loaded by webpack and run in the "renderer" context. - * To learn more about the differences between the "main" and the "renderer" context in - * Electron, visit: - * - * https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes - * - * By default, Node.js integration in this file is disabled. When enabling Node.js integration - * in a renderer process, please be aware of potential security implications. You can read - * more about security risks here: - * - * https://electronjs.org/docs/tutorial/security - * - * To enable Node.js integration in this file, open up `main.js` and enable the `nodeIntegration` - * flag: - * - * ``` - * // Create the browser window. - * mainWindow = new BrowserWindow({ - * width: 800, - * height: 600, - * webPreferences: { - * nodeIntegration: true - * } - * }); - * ``` - */ - -import './index.css'; - -console.log('👋 This message is being logged by "renderer.js", included via webpack'); diff --git a/websrc/heal-web/webpack.main.config.js b/websrc/heal-web/webpack.main.config.js deleted file mode 100644 index d23d0e36..00000000 --- a/websrc/heal-web/webpack.main.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - /** - * This is the main entry point for your application, it's the first file - * that runs in the main process. - */ - entry: './src/main.js', - // Put your normal webpack config below here - module: { - rules: require('./webpack.rules'), - }, -}; diff --git a/websrc/heal-web/webpack.renderer.config.js b/websrc/heal-web/webpack.renderer.config.js deleted file mode 100644 index e5f6a64c..00000000 --- a/websrc/heal-web/webpack.renderer.config.js +++ /dev/null @@ -1,13 +0,0 @@ -const rules = require('./webpack.rules'); - -rules.push({ - test: /\.css$/, - use: [{ loader: 'style-loader' }, { loader: 'css-loader' }], -}); - -module.exports = { - // Put your normal webpack config below here - module: { - rules, - }, -}; diff --git a/websrc/heal-web/webpack.rules.js b/websrc/heal-web/webpack.rules.js deleted file mode 100644 index 23cb22a3..00000000 --- a/websrc/heal-web/webpack.rules.js +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = [ - // Add support for native node modules - { - // We're specifying native_modules in the test because the asset relocator loader generates a - // "fake" .node file which is really a cjs file. - test: /native_modules[/\\].+\.node$/, - use: 'node-loader', - }, - { - test: /[/\\]node_modules[/\\].+\.(m?js|node)$/, - parser: { amd: false }, - use: { - loader: '@vercel/webpack-asset-relocator-loader', - options: { - outputAssetBase: 'native_modules', - }, - }, - }, - // Put your webpack loader rules in this array. This is where you would put - // your ts-loader configuration for instance: - /** - * Typescript Example: - * - * { - * test: /\.tsx?$/, - * exclude: /(node_modules|.webpack)/, - * loaders: [{ - * loader: 'ts-loader', - * options: { - * transpileOnly: true - * } - * }] - * } - */ -]; diff --git a/websrc/heal-web/yarn.lock b/websrc/heal-web/yarn.lock deleted file mode 100644 index ebf81985..00000000 --- a/websrc/heal-web/yarn.lock +++ /dev/null @@ -1,8737 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@astrojs/compiler@^2.5.3": - version "2.6.0" - resolved "https://registry.npmmirror.com/@astrojs/compiler/-/compiler-2.6.0.tgz#0d27c9a60530766b247f0cd1359fbe468d147fe6" - integrity sha512-c74k8iGHL3DzkosSJ0tGcHIEBEiIfBhr7eadSaPyvWlVKaieDVzVs8OW1tnRSQyBsfMc8DZQ4RcN2KAcESD8UQ== - -"@astrojs/internal-helpers@0.2.1": - version "0.2.1" - resolved "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz#4e2e6aabaa9819f17119aa10f413c4d6122c94cf" - integrity sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A== - -"@astrojs/markdown-remark@4.2.1": - version "4.2.1" - resolved "https://registry.npmmirror.com/@astrojs/markdown-remark/-/markdown-remark-4.2.1.tgz#2fba4aba6563914675cca759b635144b6c53e704" - integrity sha512-2RQBIwrq+2qPYtp99bH+eL5hfbK0BoxXla85lHsRpIX/IsGqFrPX6pXI2cbWPihBwGbKCdxS6uZNX2QerZWwpQ== - dependencies: - "@astrojs/prism" "^3.0.0" - github-slugger "^2.0.0" - import-meta-resolve "^4.0.0" - mdast-util-definitions "^6.0.0" - rehype-raw "^7.0.0" - rehype-stringify "^10.0.0" - remark-gfm "^4.0.0" - remark-parse "^11.0.0" - remark-rehype "^11.0.0" - remark-smartypants "^2.0.0" - shikiji "^0.9.18" - unified "^11.0.4" - unist-util-visit "^5.0.0" - vfile "^6.0.1" - -"@astrojs/prism@^3.0.0": - version "3.0.0" - resolved "https://registry.npmmirror.com/@astrojs/prism/-/prism-3.0.0.tgz#c9443e4cbf435acf0b5adc2c627d9789991514e7" - integrity sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ== - dependencies: - prismjs "^1.29.0" - -"@astrojs/telemetry@3.0.4": - version "3.0.4" - resolved "https://registry.npmmirror.com/@astrojs/telemetry/-/telemetry-3.0.4.tgz#566257082c87df84fcc136db23e071e1104b13fd" - integrity sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ== - dependencies: - ci-info "^3.8.0" - debug "^4.3.4" - dlv "^1.1.3" - dset "^3.1.2" - is-docker "^3.0.0" - is-wsl "^3.0.0" - which-pm-runs "^1.1.0" - -"@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@^7.23.3": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.23.3", "@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== - dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.3", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== - -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.23.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.22.5": - version "7.23.4" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" - -"@babel/template@^7.22.15", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/traverse@^7.23.3", "@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@electron-forge/cli@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/cli/-/cli-7.3.0.tgz#55a4a71ba46f2c777edffacc4da76f59554371e6" - integrity sha512-tIzNYTvCEjJbma7zLWpa03phLKX/pd9f+vG+0HlIpmESMFGWhyLDzunZn0YOOXPRKpCTVg5RpC+BVte1Da4VjQ== - dependencies: - "@electron-forge/core" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - "@electron/get" "^3.0.0" - chalk "^4.0.0" - commander "^4.1.1" - debug "^4.3.1" - fs-extra "^10.0.0" - listr2 "^5.0.3" - semver "^7.2.1" - -"@electron-forge/core-utils@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/core-utils/-/core-utils-7.3.0.tgz#6dd9e19e4ca53716f1d2cff475b157ee4703cd16" - integrity sha512-cKeWuC8zYcp2n9caRWvCQgwIFtDqaUlwQVeg2VBpgJTGYHNKEDQHadR2xtIXTcfNgPUbQEAXiaS2xuxuhPQLfw== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@electron/rebuild" "^3.2.10" - "@malept/cross-spawn-promise" "^2.0.0" - chalk "^4.0.0" - debug "^4.3.1" - find-up "^5.0.0" - fs-extra "^10.0.0" - log-symbols "^4.0.0" - semver "^7.2.1" - yarn-or-npm "^3.0.1" - -"@electron-forge/core@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/core/-/core-7.3.0.tgz#7846fe5a2a177260cf90be438cdce9d2f2bc0106" - integrity sha512-Z0wvs/YutUzo5xbCBjhoWSnlO1y5DbM4LMa5Di4Dxaf8v/xi7PQ/ncjAiOJKFYI8mG23Nn8Ae13weG0tiXISbA== - dependencies: - "@electron-forge/core-utils" "7.3.0" - "@electron-forge/maker-base" "7.3.0" - "@electron-forge/plugin-base" "7.3.0" - "@electron-forge/publisher-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/template-base" "7.3.0" - "@electron-forge/template-vite" "7.3.0" - "@electron-forge/template-vite-typescript" "7.3.0" - "@electron-forge/template-webpack" "7.3.0" - "@electron-forge/template-webpack-typescript" "7.3.0" - "@electron-forge/tracer" "7.3.0" - "@electron/get" "^3.0.0" - "@electron/packager" "^18.1.2" - "@electron/rebuild" "^3.2.10" - "@malept/cross-spawn-promise" "^2.0.0" - chalk "^4.0.0" - debug "^4.3.1" - fast-glob "^3.2.7" - filenamify "^4.1.0" - find-up "^5.0.0" - fs-extra "^10.0.0" - got "^11.8.5" - interpret "^3.1.1" - listr2 "^5.0.3" - lodash "^4.17.20" - log-symbols "^4.0.0" - node-fetch "^2.6.7" - progress "^2.0.3" - rechoir "^0.8.0" - resolve-package "^1.0.1" - semver "^7.2.1" - source-map-support "^0.5.13" - sudo-prompt "^9.1.1" - username "^5.1.0" - yarn-or-npm "^3.0.1" - -"@electron-forge/maker-base@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/maker-base/-/maker-base-7.3.0.tgz#d56d13592fd0aa7b593da0629b5051ca9a121617" - integrity sha512-1o0YT1QBCf9oAfQNJmWQehn+DQp8mqaUbwaivNtIgTKRlzAVfD7UoAS7izuUqEW6M6NOvFXfCQjp7IgGckVVBg== - dependencies: - "@electron-forge/shared-types" "7.3.0" - fs-extra "^10.0.0" - which "^2.0.2" - -"@electron-forge/maker-deb@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/maker-deb/-/maker-deb-7.3.0.tgz#150913e13c0de11d11d3f10311503e70e89a0409" - integrity sha512-rlTYjF18p1rVVzInr9kJPSwELvu2ycLp7qGi/Nrj91N2cS92D3z8l6UkQE6wvhsBMhhL0sOX+NyDhvzKoRsWNQ== - dependencies: - "@electron-forge/maker-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - optionalDependencies: - electron-installer-debian "^3.2.0" - -"@electron-forge/maker-rpm@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/maker-rpm/-/maker-rpm-7.3.0.tgz#0fa63234fa0e3d4bde4bb31dc76df25efc2f755a" - integrity sha512-EzfkRcnWeLYHUvGmtP2KcGU8I93izAaGfYze1xQqG6BQ0FXjEm7xcESy2gZThX/2vEtQUdjCdIbfVf4yveZKFQ== - dependencies: - "@electron-forge/maker-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - optionalDependencies: - electron-installer-redhat "^3.2.0" - -"@electron-forge/maker-squirrel@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/maker-squirrel/-/maker-squirrel-7.3.0.tgz#d0cb4911851f37a66416506ee72c0fa3060efc9a" - integrity sha512-JXKKwztnIDiMjzwUwROphZyIAtUivw7YOsWhskuxj/KhxtHpksNboBbwhvbvX8stfzVl2M95IgqATyPJXClQ9w== - dependencies: - "@electron-forge/maker-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - fs-extra "^10.0.0" - optionalDependencies: - electron-winstaller "^5.0.0" - -"@electron-forge/maker-zip@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/maker-zip/-/maker-zip-7.3.0.tgz#064ab2857fdbb183c3226bb0f69b77abdab1e172" - integrity sha512-VYYLScDpibVIiMRK7JWeCS9G8VYvPXa1X6p6fNYQoFOWommG9zC7OOnFfNnLBrH1+0ginZRJeLD1zo+cM12JuQ== - dependencies: - "@electron-forge/maker-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - cross-zip "^4.0.0" - fs-extra "^10.0.0" - got "^11.8.5" - -"@electron-forge/plugin-auto-unpack-natives@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.3.0.tgz#277772dc8275143e93cb5955decef1dc2354366c" - integrity sha512-cWcor6pEplaAo2OSr+khth4282xoLUtESdSLtGtRYE1Q8sNM5BbPKcwyr3tP8FFgWnj2TAYbpubwScLyb5BXZA== - dependencies: - "@electron-forge/plugin-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - -"@electron-forge/plugin-base@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/plugin-base/-/plugin-base-7.3.0.tgz#df8c7c92e7280a973d111d0a1e39676706913415" - integrity sha512-cS0dqi9yTMgKzy1RhJ21YheRjWSbUh0bOKuByYAWevdqMZfqO2KyhXIsmH5QizL+bub8uWOUsknXVrOp73NLfw== - dependencies: - "@electron-forge/shared-types" "7.3.0" - -"@electron-forge/plugin-fuses@^7.2.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/plugin-fuses/-/plugin-fuses-7.3.0.tgz#d67f389d03dde722026d87e6e9c903c7c82cacf0" - integrity sha512-+p23S+NQwia+uX1D6Hx01R2b0Ck2bNVDgS1JL8lyU8cz3OXAA3J52Ck94wMslwmj2TfdV0ErsMxI/QOQlPffiw== - dependencies: - "@electron-forge/plugin-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - -"@electron-forge/plugin-webpack@^7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/plugin-webpack/-/plugin-webpack-7.3.0.tgz#be7580d73e3c151a24ca4aa0aacff34e488b1c55" - integrity sha512-yCAJBl4INfTINd1tlLZ7tsHKWAo2VXndomixOdwvBGPpfq8I3+lVsC6H7zu7qQJtQFfkbGbJovq4xxIRLcBakQ== - dependencies: - "@electron-forge/core-utils" "7.3.0" - "@electron-forge/plugin-base" "7.3.0" - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/web-multi-logger" "7.3.0" - chalk "^4.0.0" - debug "^4.3.1" - fast-glob "^3.2.7" - fs-extra "^10.0.0" - html-webpack-plugin "^5.5.3" - webpack "^5.69.1" - webpack-dev-server "^4.0.0" - webpack-merge "^5.7.3" - -"@electron-forge/publisher-base@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/publisher-base/-/publisher-base-7.3.0.tgz#4da19c3f3f448ad90f09c88d8347a2cb7d6398b0" - integrity sha512-iO8QuM0zTLcEA0/7adEUOzMrhu/h6Qk9UiWNUllBctZXZ+FO0CbAY7eGzOgjOKqH5akbEKHwCSRnjrFt91QpQg== - dependencies: - "@electron-forge/shared-types" "7.3.0" - -"@electron-forge/shared-types@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/shared-types/-/shared-types-7.3.0.tgz#95e0d7699dd876287e9442f45b99a4aa4029c2a5" - integrity sha512-+YGOTGUGVrcaRm9zO3xsWSj2GS9iVY6E1WTG0vD2OxZtdEGcdy3hZryV72f5gH+qeZZvujYSR2s7VvZjhFEHaQ== - dependencies: - "@electron-forge/tracer" "7.3.0" - "@electron/packager" "^18.1.2" - "@electron/rebuild" "^3.2.10" - listr2 "^5.0.3" - -"@electron-forge/template-base@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/template-base/-/template-base-7.3.0.tgz#7a26a9b4de21116e7a91d08e04860834b2e940fa" - integrity sha512-Lf0fupMzuO9XuBOaWoQ5QljjQ89B7TYU40+eEUvxnIMNAfnU3n+cfhC4xGLldmh+LYRuotB1jJitX79BwRqzIA== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@malept/cross-spawn-promise" "^2.0.0" - debug "^4.3.1" - fs-extra "^10.0.0" - username "^5.1.0" - -"@electron-forge/template-vite-typescript@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.3.0.tgz#e4a00f3211201425ade95fa3adf4e7bb24d6757f" - integrity sha512-4gVlJihXLM+r6GBOCeO6mSv5vZImew9Vp/xFfxMrf3nDThMCnA6HYLIGA361ZTbn4z3ARquXPo6Vsm7/s4ykbw== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/template-base" "7.3.0" - fs-extra "^10.0.0" - -"@electron-forge/template-vite@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/template-vite/-/template-vite-7.3.0.tgz#2dcc69584eb0eabf88a2e4946427c972384154f2" - integrity sha512-4vdOLmd0/rThA9lO/Tf16oCoDBPWGLRZZF+XM+ECPDfaL0CbFNoEa/NLrr6T/2D6IlV5+GnmVjz29LlVOFUB7w== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/template-base" "7.3.0" - fs-extra "^10.0.0" - -"@electron-forge/template-webpack-typescript@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.3.0.tgz#1e2974f0ffd7b7b3a9b47a8b36f4326d2be4562d" - integrity sha512-eiBhsY/LUaV1vIy/PZqnmkxWyjEyN/PsXyq79lr1nuOKrqkVgZUe/IdvtNxr8wvPoKSScORNLHjiD/C2Jp74HA== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/template-base" "7.3.0" - fs-extra "^10.0.0" - -"@electron-forge/template-webpack@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/template-webpack/-/template-webpack-7.3.0.tgz#fbc476efcf1025b9899083a38cf7b5b2279e7141" - integrity sha512-5Cv0g+AHdEI2R4hPI38PzWTnqUwqpM36jpQgkXV1RnL3V9FvNuza/w9RLMj5bhGzB0j5M4bVbcnglMX0pDvVBQ== - dependencies: - "@electron-forge/shared-types" "7.3.0" - "@electron-forge/template-base" "7.3.0" - fs-extra "^10.0.0" - -"@electron-forge/tracer@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/tracer/-/tracer-7.3.0.tgz#f0c27b5288dce514a7765157dcf339b9d6e18f49" - integrity sha512-FS7ABTm52BMP2BlR/pDmUIKtH9NI1i+BBJuKke58KguToBRuvAX1cLt0Hhkq4HlqYR9fNjRoCo1vrK4OBb0Bew== - dependencies: - chrome-trace-event "^1.0.3" - -"@electron-forge/web-multi-logger@7.3.0": - version "7.3.0" - resolved "https://registry.npmmirror.com/@electron-forge/web-multi-logger/-/web-multi-logger-7.3.0.tgz#48bacfcbc09db59844acdf97fc63ebf332105a15" - integrity sha512-NekmSeNCEQ8uvshCJw3PlsjY27LSJM+u4bfv+Wabt7NXpbR9I+kCtLPwm6GTp/LfE7OwU7iD+QbEVaynUTnUOQ== - dependencies: - express "^4.17.1" - express-ws "^5.0.2" - xterm "^4.9.0" - xterm-addon-fit "^0.5.0" - xterm-addon-search "^0.8.0" - -"@electron/asar@^3.2.1", "@electron/asar@^3.2.7": - version "3.2.8" - resolved "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.8.tgz#2ea722f3452583dbd4ffdcc4b4f5dc903f1d8178" - integrity sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg== - dependencies: - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - -"@electron/fuses@^1.7.0": - version "1.7.0" - resolved "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.7.0.tgz#0800d5404fffe5683705297990fea089d49811a2" - integrity sha512-mfhLoZGQdqrSU/SeOFBs6r+D7g1tYiVs2C/hh7t3NFQ0chcXGoWrrad17rCQL1ImNJuCXs4cu23YBj5CAnj5SA== - dependencies: - chalk "^4.1.1" - fs-extra "^9.0.1" - minimist "^1.2.5" - -"@electron/get@^3.0.0": - version "3.0.0" - resolved "https://registry.npmmirror.com/@electron/get/-/get-3.0.0.tgz#2b0c794b98902d0bc5218546872c1379bef68aa2" - integrity sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^11.8.5" - progress "^2.0.3" - semver "^6.2.0" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^3.0.0" - -"@electron/notarize@^2.1.0": - version "2.3.0" - resolved "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.3.0.tgz#9659cf6c92563dd69411afce229f52f9f7196227" - integrity sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w== - dependencies: - debug "^4.1.1" - fs-extra "^9.0.1" - promise-retry "^2.0.1" - -"@electron/osx-sign@^1.0.5": - version "1.0.5" - resolved "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" - integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== - dependencies: - compare-version "^0.1.2" - debug "^4.3.4" - fs-extra "^10.0.0" - isbinaryfile "^4.0.8" - minimist "^1.2.6" - plist "^3.0.5" - -"@electron/packager@^18.1.2": - version "18.1.3" - resolved "https://registry.npmmirror.com/@electron/packager/-/packager-18.1.3.tgz#53eba507e5dccaa4cbfae56bf6e2f58a7bc257a5" - integrity sha512-21T5MxUf7DwV07IIes3jO/571mXCjOGVPdmYJFPCVDTimFiHQSW0Oy+OIGQaKBiNIXfnP29KylsCQbmds6O6Iw== - dependencies: - "@electron/asar" "^3.2.1" - "@electron/get" "^3.0.0" - "@electron/notarize" "^2.1.0" - "@electron/osx-sign" "^1.0.5" - "@electron/universal" "^2.0.1" - "@electron/windows-sign" "^1.0.0" - cross-spawn-windows-exe "^1.2.0" - debug "^4.0.1" - extract-zip "^2.0.0" - filenamify "^4.1.0" - fs-extra "^11.1.0" - galactus "^1.0.0" - get-package-info "^1.0.0" - junk "^3.1.0" - parse-author "^2.0.0" - plist "^3.0.0" - rcedit "^4.0.0" - resolve "^1.1.6" - semver "^7.1.3" - yargs-parser "^21.1.1" - -"@electron/rebuild@^3.2.10": - version "3.6.0" - resolved "https://registry.npmmirror.com/@electron/rebuild/-/rebuild-3.6.0.tgz#60211375a5f8541a71eb07dd2f97354ad0b2b96f" - integrity sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw== - dependencies: - "@malept/cross-spawn-promise" "^2.0.0" - chalk "^4.0.0" - debug "^4.1.1" - detect-libc "^2.0.1" - fs-extra "^10.0.0" - got "^11.7.0" - node-abi "^3.45.0" - node-api-version "^0.2.0" - node-gyp "^9.0.0" - ora "^5.1.0" - read-binary-file-arch "^1.0.6" - semver "^7.3.5" - tar "^6.0.5" - yargs "^17.0.1" - -"@electron/universal@^2.0.1": - version "2.0.1" - resolved "https://registry.npmmirror.com/@electron/universal/-/universal-2.0.1.tgz#7b070ab355e02957388f3dbd68e2c3cd08c448ae" - integrity sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA== - dependencies: - "@electron/asar" "^3.2.7" - "@malept/cross-spawn-promise" "^2.0.0" - debug "^4.3.1" - dir-compare "^4.2.0" - fs-extra "^11.1.1" - minimatch "^9.0.3" - plist "^3.1.0" - -"@electron/windows-sign@^1.0.0": - version "1.1.1" - resolved "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.1.1.tgz#4ac6a2f782e70251cc1bd7349485a764ee07320f" - integrity sha512-g8/atfOCKuuGedjVE6Xu/rlBtJvfDrmBH9UokBrjrvBVWdVz3SGV7DTjPTLvl7F+XUlmqj4genub62r3jKHIHw== - dependencies: - cross-dirname "^0.1.0" - debug "^4.3.4" - fs-extra "^11.1.1" - minimist "^1.2.8" - postject "^1.0.0-alpha.6" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@foliojs-fork/fontkit@^1.9.1": - version "1.9.1" - resolved "https://registry.npmmirror.com/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz#8124649168eb5273f580f66697a139fb5041296b" - integrity sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A== - dependencies: - "@foliojs-fork/restructure" "^2.0.2" - brfs "^2.0.0" - brotli "^1.2.0" - browserify-optional "^1.0.1" - clone "^1.0.4" - deep-equal "^1.0.0" - dfa "^1.2.0" - tiny-inflate "^1.0.2" - unicode-properties "^1.2.2" - unicode-trie "^2.0.0" - -"@foliojs-fork/linebreak@^1.1.1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz#93ecd695b7d2bb0334b9481058c3e610e019a4eb" - integrity sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig== - dependencies: - base64-js "1.3.1" - brfs "^2.0.2" - unicode-trie "^2.0.0" - -"@foliojs-fork/pdfkit@^0.14.0": - version "0.14.0" - resolved "https://registry.npmmirror.com/@foliojs-fork/pdfkit/-/pdfkit-0.14.0.tgz#ed1868050edd2904284655f8dcddd56b49576c98" - integrity sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg== - dependencies: - "@foliojs-fork/fontkit" "^1.9.1" - "@foliojs-fork/linebreak" "^1.1.1" - crypto-js "^4.2.0" - png-js "^1.0.0" - -"@foliojs-fork/restructure@^2.0.2": - version "2.0.2" - resolved "https://registry.npmmirror.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz#73759aba2aff1da87b7c4554e6839c70d43c92b4" - integrity sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA== - -"@fortawesome/fontawesome-free@^5.15.4": - version "5.15.4" - resolved "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" - integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== - -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.4" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz#9b18145d26cf33d08576cf4c7665b28554480ed7" - integrity sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.23" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz#afc96847f3f07841477f303eed687707a5aacd80" - integrity sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@lgaitan/pace-progress@^1.0.7": - version "1.0.7" - resolved "https://registry.npmmirror.com/@lgaitan/pace-progress/-/pace-progress-1.0.7.tgz#c96fbbd9fd4cf528feed34ea0c8f9d8b3e98f0dd" - integrity sha512-GMoTcF6WBpno7a7Iyx7M79os26d5bCDbh7YTZmXZM8YuLR3DDtwo0/CBYddStGD6QIBTieFDz4IAQiO0dAdRGw== - -"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": - version "1.1.1" - resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" - integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== - dependencies: - cross-spawn "^7.0.1" - -"@malept/cross-spawn-promise@^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" - integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== - dependencies: - cross-spawn "^7.0.1" - -"@medv/finder@^3.1.0": - version "3.1.0" - resolved "https://registry.npmmirror.com/@medv/finder/-/finder-3.1.0.tgz#e157c68f166ade9f113a1314603365bf81dd8b8c" - integrity sha512-ojkXjR3K0Zz3jnCR80tqPL+0yvbZk/lEodb6RIVjLz7W8RVA2wrw8ym/CzCpXO9SYVUIKHFUpc7jvf8UKfIM3w== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.npmmirror.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== - dependencies: - "@gar/promisify" "^1.1.3" - semver "^7.3.5" - -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@rollup/rollup-android-arm-eabi@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz#38c3abd1955a3c21d492af6b1a1dca4bb1d894d6" - integrity sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w== - -"@rollup/rollup-android-arm64@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz#3822e929f415627609e53b11cec9a4be806de0e2" - integrity sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ== - -"@rollup/rollup-darwin-arm64@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz#6c082de71f481f57df6cfa3701ab2a7afde96f69" - integrity sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ== - -"@rollup/rollup-darwin-x64@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz#c34ca0d31f3c46a22c9afa0e944403eea0edcfd8" - integrity sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg== - -"@rollup/rollup-linux-arm-gnueabihf@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz#48e899c1e438629c072889b824a98787a7c2362d" - integrity sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA== - -"@rollup/rollup-linux-arm64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz#788c2698a119dc229062d40da6ada8a090a73a68" - integrity sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA== - -"@rollup/rollup-linux-arm64-musl@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz#3882a4e3a564af9e55804beeb67076857b035ab7" - integrity sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ== - -"@rollup/rollup-linux-riscv64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz#0c6ad792e1195c12bfae634425a3d2aa0fe93ab7" - integrity sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw== - -"@rollup/rollup-linux-x64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz#9d62485ea0f18d8674033b57aa14fb758f6ec6e3" - integrity sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA== - -"@rollup/rollup-linux-x64-musl@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz#50e8167e28b33c977c1f813def2b2074d1435e05" - integrity sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw== - -"@rollup/rollup-win32-arm64-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz#68d233272a2004429124494121a42c4aebdc5b8e" - integrity sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw== - -"@rollup/rollup-win32-ia32-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz#366ca62221d1689e3b55a03f4ae12ae9ba595d40" - integrity sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA== - -"@rollup/rollup-win32-x64-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz#9ffdf9ed133a7464f4ae187eb9e1294413fab235" - integrity sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg== - -"@sindresorhus/is@^4.0.0": - version "4.6.0" - resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sweetalert2/theme-bootstrap-4@^5.0.8": - version "5.0.16" - resolved "https://registry.npmmirror.com/@sweetalert2/theme-bootstrap-4/-/theme-bootstrap-4-5.0.16.tgz#530431834990fdb0ebcf50a732d014255d169a32" - integrity sha512-KHFJZBTrZqZGdx9TBL1t8wmkGPzq593QKX8FWr67z6foLiVjjcPK9fvdkrUrGcOJ4sjpwrk1QdELIrsdGOyp8A== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@ttskch/select2-bootstrap4-theme@^1.5.2": - version "1.5.2" - resolved "https://registry.npmmirror.com/@ttskch/select2-bootstrap4-theme/-/select2-bootstrap4-theme-1.5.2.tgz#3b4519b349f3e7831c28752a1e9617312a192656" - integrity sha512-gAj8qNy/VYwQDBkACm0USM66kxFai8flX83ayRXPNhzZckEgSqIBB9sM74SCM3ssgeX+ZVy4BifTnLis+KpIyg== - -"@types/babel__core@^7.20.4": - version "7.20.5" - resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.5" - resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== - dependencies: - "@babel/types" "^7.20.7" - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.13" - resolved "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.4" - resolved "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/debug@^4.0.0": - version "4.1.12" - resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.7" - resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.56.3" - resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.3.tgz#d1f6b2303ac5ed53cb2cf59e0ab680cde1698f5f" - integrity sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.43" - resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" - integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.21" - resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/fs-extra@^9.0.1": - version "9.0.13" - resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/hast@^3.0.0": - version "3.0.4" - resolved "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-cache-semantics@*": - version "4.0.4" - resolved "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/http-proxy@^1.17.8": - version "1.17.14" - resolved "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" - integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== - dependencies: - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/mdast@^4.0.0": - version "4.0.3" - resolved "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" - integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== - dependencies: - "@types/unist" "*" - -"@types/mime@*": - version "3.0.4" - resolved "https://registry.npmmirror.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" - integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/ms@*": - version "0.7.34" - resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - -"@types/nlcst@^1.0.0": - version "1.0.4" - resolved "https://registry.npmmirror.com/@types/nlcst/-/nlcst-1.0.4.tgz#3b8a9c279a2367602512588a0ba6a0e93634ee3e" - integrity sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg== - dependencies: - "@types/unist" "^2" - -"@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.npmmirror.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "20.11.20" - resolved "https://registry.npmmirror.com/@types/node/-/node-20.11.20.tgz#f0a2aee575215149a62784210ad88b3a34843659" - integrity sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg== - dependencies: - undici-types "~5.26.4" - -"@types/qs@*": - version "6.9.11" - resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" - integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.4" - resolved "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.5" - resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" - integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== - dependencies: - "@types/http-errors" "*" - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.36" - resolved "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" - -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.2" - resolved "https://registry.npmmirror.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" - integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== - -"@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.10" - resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== - -"@types/ws@^8.5.5": - version "8.5.10" - resolved "https://registry.npmmirror.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== - dependencies: - "@types/node" "*" - -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - -"@ungap/structured-clone@^1.0.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vercel/webpack-asset-relocator-loader@1.7.3": - version "1.7.3" - resolved "https://registry.npmmirror.com/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz#e65ca1fd9feb045039788f9b4710e5acc84b01b0" - integrity sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g== - dependencies: - resolve "^1.10.0" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xmldom/xmldom@^0.8.8": - version "0.8.10" - resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - -acorn-node@^1.3.0: - version "1.8.2" - resolved "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.0.0: - version "7.4.1" - resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.11.2, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -admin-lte@^3.2: - version "3.2.0" - resolved "https://registry.npmmirror.com/admin-lte/-/admin-lte-3.2.0.tgz#9be383a6418c2323828466ab95af0eb083e4a597" - integrity sha512-IDUfoU8jo9DVlB59lDEASAJXTesAEXDZ68DOHI3qg93r5ehVTkMl2x0ixgIyff8NiHeNYXpcOZh3tr6oGbvu9g== - dependencies: - "@fortawesome/fontawesome-free" "^5.15.4" - "@lgaitan/pace-progress" "^1.0.7" - "@sweetalert2/theme-bootstrap-4" "^5.0.8" - "@ttskch/select2-bootstrap4-theme" "^1.5.2" - bootstrap "^4.6.1" - bootstrap-colorpicker "^3.4.0" - bootstrap-slider "^11.0.2" - bootstrap-switch "3.3.4" - bootstrap4-duallistbox "^4.0.2" - bs-custom-file-input "^1.3.4" - bs-stepper "^1.7.0" - chart.js "^2.9.4" - codemirror "^5.65.1" - datatables.net "^1.11.4" - datatables.net-autofill-bs4 "^2.3.9" - datatables.net-bs4 "^1.11.4" - datatables.net-buttons-bs4 "^2.2.2" - datatables.net-colreorder-bs4 "^1.5.5" - datatables.net-fixedcolumns-bs4 "^4.0.1" - datatables.net-fixedheader-bs4 "^3.2.1" - datatables.net-keytable-bs4 "^2.6.4" - datatables.net-responsive-bs4 "^2.2.9" - datatables.net-rowgroup-bs4 "^1.1.4" - datatables.net-rowreorder-bs4 "^1.2.8" - datatables.net-scroller-bs4 "^2.0.5" - datatables.net-searchbuilder-bs4 "^1.3.1" - datatables.net-searchpanes-bs4 "^1.4.0" - datatables.net-select-bs4 "^1.3.4" - daterangepicker "^3.1.0" - dropzone "^5.9.3" - ekko-lightbox "^5.3.0" - fastclick "^1.0.6" - filterizr "^2.2.4" - flag-icon-css "^4.1.7" - flot "^4.2.2" - fs-extra "^10.0.0" - fullcalendar "^5.10.1" - icheck-bootstrap "^3.0.1" - inputmask "^5.0.7" - ion-rangeslider "^2.3.1" - jquery "^3.6.0" - jquery-knob-chif "^1.2.13" - jquery-mapael "^2.2.0" - jquery-mousewheel "^3.1.13" - jquery-ui-dist "^1.13.0" - jquery-validation "^1.19.3" - jqvmap-novulnerability "^1.5.1" - jsgrid "^1.5.3" - jszip "^3.7.1" - moment "^2.29.1" - overlayscrollbars "^1.13.1" - pdfmake "^0.2.4" - popper.js "^1.16.1" - raphael "^2.3.0" - select2 "^4.0.13" - sparklines "^1.3.0" - summernote "^0.8.20" - sweetalert2 "^11.4.0" - tempusdominus-bootstrap-4 "^5.39.0" - toastr "^2.1.4" - uplot "^1.6.18" - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg== - -array-iterate@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/array-iterate/-/array-iterate-2.0.1.tgz#6efd43f8295b3fee06251d3d62ead4bd9805dd24" - integrity sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== - -asar@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" - integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - -ast-transform@0.0.0: - version "0.0.0" - resolved "https://registry.npmmirror.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" - integrity sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A== - dependencies: - escodegen "~1.2.0" - esprima "~1.0.4" - through "~2.3.4" - -ast-types@^0.7.0: - version "0.7.8" - resolved "https://registry.npmmirror.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" - integrity sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -astro@^4.4.4: - version "4.4.4" - resolved "https://registry.npmmirror.com/astro/-/astro-4.4.4.tgz#5087cca5779d888e5c5b15690fd4738bc9c7bbdc" - integrity sha512-EZrDTN888w4sFKqavGsHu8jSaymyxNwnoqIq5NKlMG9WNU/Xn4Yn41pUdBuAOrgNzRp1NyXXhhV6GV1pN71V2Q== - dependencies: - "@astrojs/compiler" "^2.5.3" - "@astrojs/internal-helpers" "0.2.1" - "@astrojs/markdown-remark" "4.2.1" - "@astrojs/telemetry" "3.0.4" - "@babel/core" "^7.23.3" - "@babel/generator" "^7.23.3" - "@babel/parser" "^7.23.3" - "@babel/plugin-transform-react-jsx" "^7.22.5" - "@babel/traverse" "^7.23.3" - "@babel/types" "^7.23.3" - "@medv/finder" "^3.1.0" - "@types/babel__core" "^7.20.4" - acorn "^8.11.2" - aria-query "^5.3.0" - axobject-query "^4.0.0" - boxen "^7.1.1" - chokidar "^3.5.3" - ci-info "^4.0.0" - clsx "^2.0.0" - common-ancestor-path "^1.0.1" - cookie "^0.6.0" - cssesc "^3.0.0" - debug "^4.3.4" - deterministic-object-hash "^2.0.1" - devalue "^4.3.2" - diff "^5.1.0" - dlv "^1.1.3" - dset "^3.1.3" - es-module-lexer "^1.4.1" - esbuild "^0.19.6" - estree-walker "^3.0.3" - execa "^8.0.1" - fast-glob "^3.3.2" - flattie "^1.1.0" - github-slugger "^2.0.0" - gray-matter "^4.0.3" - html-escaper "^3.0.3" - http-cache-semantics "^4.1.1" - js-yaml "^4.1.0" - kleur "^4.1.4" - magic-string "^0.30.3" - mdast-util-to-hast "13.0.2" - mime "^3.0.0" - ora "^7.0.1" - p-limit "^5.0.0" - p-queue "^8.0.1" - path-to-regexp "^6.2.1" - preferred-pm "^3.1.2" - prompts "^2.4.2" - rehype "^13.0.1" - resolve "^1.22.4" - semver "^7.5.4" - shikiji "^0.9.19" - shikiji-core "^0.9.19" - string-width "^7.0.0" - strip-ansi "^7.1.0" - tsconfck "^3.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.1" - vite "^5.1.2" - vitefu "^0.2.5" - which-pm "^2.1.1" - yargs-parser "^21.1.1" - zod "^3.22.4" - optionalDependencies: - sharp "^0.32.6" - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -author-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" - integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== - -axobject-query@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.0.0.tgz#04a4c90dce33cc5d606c76d6216e3b250ff70dab" - integrity sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== - dependencies: - dequal "^2.0.3" - -b4a@^1.6.4: - version "1.6.6" - resolved "https://registry.npmmirror.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" - integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bare-events@^2.0.0, bare-events@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/bare-events/-/bare-events-2.2.0.tgz#a7a7263c107daf8b85adf0b64f908503454ab26e" - integrity sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg== - -bare-fs@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/bare-fs/-/bare-fs-2.2.0.tgz#e23ab841be0e08b29ad2933281ce4ad5ddd60384" - integrity sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw== - dependencies: - bare-events "^2.0.0" - bare-os "^2.0.0" - bare-path "^2.0.0" - streamx "^2.13.0" - -bare-os@^2.0.0, bare-os@^2.1.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/bare-os/-/bare-os-2.2.0.tgz#24364692984d0bd507621754781b31d7872736b2" - integrity sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag== - -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/bare-path/-/bare-path-2.1.0.tgz#830f17fd39842813ca77d211ebbabe238a88cb4c" - integrity sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw== - dependencies: - bare-os "^2.1.0" - -base-64@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" - integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== - -base64-js@1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.0.3, bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.1.1: - version "3.7.2" - resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.2.1" - resolved "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" - integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== - dependencies: - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boolean@^3.0.1: - version "3.2.0" - resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" - integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== - -bootstrap-colorpicker@^3.4.0: - version "3.4.0" - resolved "https://registry.npmmirror.com/bootstrap-colorpicker/-/bootstrap-colorpicker-3.4.0.tgz#3d1873071542755a9b31cf5b314f771e2fcc7727" - integrity sha512-7vA0hvLrat3ptobEKlT9+6amzBUJcDAoh6hJRQY/AD+5dVZYXXf1ivRfrTwmuwiVLJo9rZwM8YB4lYzp6agzqg== - dependencies: - bootstrap ">=4.0" - jquery ">=2.2" - popper.js ">=1.10" - -bootstrap-slider@^11.0.2: - version "11.0.2" - resolved "https://registry.npmmirror.com/bootstrap-slider/-/bootstrap-slider-11.0.2.tgz#4b167c165f322339cc66f0c7166b5a39e289e251" - integrity sha512-CdwS+Z6X79OkLes9RfDgPB9UIY/+81wTkm6ktdSB6hdyiRbjJLFQIjZdnEr55tDyXZfgC7U6yeSXkNN9ZdGqjA== - -bootstrap-switch@3.3.4: - version "3.3.4" - resolved "https://registry.npmmirror.com/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz#70e0aeb2a877c0dc766991de108e2170fc29a2ff" - integrity sha512-7YQo+Ir6gCUqC36FFp1Zvec5dRF/+obq+1drMtdIMi9Xc84Kx63Evi0kdcp4HfiGsZpiz6IskyYDNlSKcxsL7w== - -bootstrap4-duallistbox@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/bootstrap4-duallistbox/-/bootstrap4-duallistbox-4.0.2.tgz#c6942e34a39d0d05e436d51ebaf31c9349f119d3" - integrity sha512-vQdANVE2NN0HMaZO9qWJy0C7u04uTpAmtUGO3KLq3xAZKCboJweQ437hDTszI6pbYV2olJCGZMbdhvIkBNGeGQ== - -bootstrap@>=4.0: - version "5.3.3" - resolved "https://registry.npmmirror.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" - integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== - -bootstrap@^4.6.1: - version "4.6.2" - resolved "https://registry.npmmirror.com/bootstrap/-/bootstrap-4.6.2.tgz#8e0cd61611728a5bf65a3a2b8d6ff6c77d5d7479" - integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== - -boxen@^7.1.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" - integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== - dependencies: - ansi-align "^3.0.1" - camelcase "^7.0.1" - chalk "^5.2.0" - cli-boxes "^3.0.0" - string-width "^5.1.2" - type-fest "^2.13.0" - widest-line "^4.0.1" - wrap-ansi "^8.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brfs@^2.0.0, brfs@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/brfs/-/brfs-2.0.2.tgz#44237878fa82aa479ce4f5fe2c1796ec69f07845" - integrity sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ== - dependencies: - quote-stream "^1.0.1" - resolve "^1.1.5" - static-module "^3.0.2" - through2 "^2.0.0" - -brotli@^1.2.0: - version "1.3.3" - resolved "https://registry.npmmirror.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" - integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== - dependencies: - base64-js "^1.1.2" - -browser-resolve@^1.8.1: - version "1.11.3" - resolved "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserify-optional@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" - integrity sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ== - dependencies: - ast-transform "0.0.0" - ast-types "^0.7.0" - browser-resolve "^1.8.1" - -browserslist@^4.21.10, browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -bs-custom-file-input@^1.3.4: - version "1.3.4" - resolved "https://registry.npmmirror.com/bs-custom-file-input/-/bs-custom-file-input-1.3.4.tgz#c275cb8d4f1c02ba026324292509fa9a747dbda8" - integrity sha512-NBsQzTnef3OW1MvdKBbMHAYHssCd613MSeJV7z2McXznWtVMnJCy7Ckyc+PwxV6Pk16cu6YBcYWh/ZE0XWNKCA== - -bs-stepper@^1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/bs-stepper/-/bs-stepper-1.7.0.tgz#bfa4cc51c4e67957caae57f5bdcba1977186bac1" - integrity sha512-+DX7UKKgw2GI6ucsSCRd19VHYrxf/8znRCLs1lQVVLxz+h7EqgIOxoHcJ0/QTaaNoR9Cwg78ydo6hXIasyd3LA== - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.npmmirror.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -call-bind@^1.0.2, call-bind@^1.0.6: - version "1.0.7" - resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" - integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== - -caniuse-lite@^1.0.30001587: - version "1.0.30001589" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" - integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.0.0, chalk@^5.2.0, chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -chart.js@^2.9.4: - version "2.9.4" - resolved "https://registry.npmmirror.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684" - integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A== - dependencies: - chartjs-color "^2.1.0" - moment "^2.10.2" - -chartjs-color-string@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" - integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== - dependencies: - color-name "^1.0.0" - -chartjs-color@^2.1.0: - version "2.4.1" - resolved "https://registry.npmmirror.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" - integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== - dependencies: - chartjs-color-string "^0.6.0" - color-convert "^1.9.3" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2, chrome-trace-event@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -chromium-pickle-js@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" - integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== - -ci-info@^3.8.0: - version "3.9.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -ci-info@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" - integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== - -clean-css@^5.2.2: - version "5.3.3" - resolved "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" - integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0, cli-spinners@^2.9.0: - version "2.9.2" - resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2, clone@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -clsx@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - -codemirror@^5.65.1: - version "5.65.16" - resolved "https://registry.npmmirror.com/codemirror/-/codemirror-5.65.16.tgz#efc0661be6bf4988a6a1c2fe6893294638cdb334" - integrity sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.npmmirror.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colorette@^2.0.10, colorette@^2.0.19: - version "2.0.20" - resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^5.0.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commander@^9.4.0: - version "9.5.0" - resolved "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -common-ancestor-path@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - -compare-version@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" - integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@~1.6.0: - version "1.6.2" - resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.5.1: - version "1.9.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-dirname@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/cross-dirname/-/cross-dirname-0.1.0.tgz#b899599f30a5389f59e78c150e19f957ad16a37c" - integrity sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q== - -cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" - integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw== - dependencies: - "@malept/cross-spawn-promise" "^1.1.0" - is-wsl "^2.2.0" - which "^2.0.2" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-zip@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/cross-zip/-/cross-zip-4.0.1.tgz#1bbf5d3b0e5a77b5f5ca130a6d38f770786e1270" - integrity sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ== - -crypto-js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" - integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== - -css-loader@^6.0.0: - version "6.10.0" - resolved "https://registry.npmmirror.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" - integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.4" - postcss-modules-scope "^3.1.1" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dash-ast@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz#8d0fd2e601c59bf874cc22877ee7dd889f54dee8" - integrity sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ== - -datatables.net-autofill-bs4@^2.3.9: - version "2.7.0" - resolved "https://registry.npmmirror.com/datatables.net-autofill-bs4/-/datatables.net-autofill-bs4-2.7.0.tgz#fbe87395adc9681e292873a3325e3680c9b8fc16" - integrity sha512-vVMvZeioGhmvd7URJAvXnOYod/ZWKhCDsLB7Onw7SaJmeawf4CaY7lAU79ee0531Kf0FWuLOKlZcaEt8p1w4qQ== - dependencies: - datatables.net-autofill "2.7.0" - datatables.net-bs4 ">=1.11" - jquery ">=1.7" - -datatables.net-autofill@2.7.0: - version "2.7.0" - resolved "https://registry.npmmirror.com/datatables.net-autofill/-/datatables.net-autofill-2.7.0.tgz#0d496bd7e059283e11fdfb24ce27e2de673defe9" - integrity sha512-zy7Jglke0VXu7RzyGYufMLLlSJkhr+rWJubBw0cozlaXtrqR2CNjY8LBBJA19GwBeoDCNrbojNge0YN8l44b8g== - dependencies: - datatables.net ">=1.11" - jquery ">=1.7" - -datatables.net-bs4@>=1.10.25, datatables.net-bs4@>=1.11, datatables.net-bs4@>=1.11.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/datatables.net-bs4/-/datatables.net-bs4-2.0.0.tgz#5f56efbb757be56ce1e52793d8f5ac73a30c0c66" - integrity sha512-yvxPNBmruLyT39oJfoVFdIHYguqZD+YsOUzWlegu0R+C2MHkJossKVypXlkTvJTK8vf+cy1I69dZnpYNrY/leA== - dependencies: - datatables.net "2.0.0" - jquery ">=1.7" - -datatables.net-bs4@^1.11.4, datatables.net-bs4@^1.13.0: - version "1.13.10" - resolved "https://registry.npmmirror.com/datatables.net-bs4/-/datatables.net-bs4-1.13.10.tgz#fa3970d1e57daa64ce8df444517bf3c1df14d435" - integrity sha512-t6zTyuoUhOwr7ONJGYQdN57st/G3iA6Ju9A56Q2vtoJO03XBeFjpAK3sZ0R02Yz35qtzZXgBtSU8bdOiXL2xwA== - dependencies: - datatables.net "1.13.8" - jquery ">=1.7" - -datatables.net-buttons-bs4@^2.2.2: - version "2.4.3" - resolved "https://registry.npmmirror.com/datatables.net-buttons-bs4/-/datatables.net-buttons-bs4-2.4.3.tgz#d4a720b45e3f2ec3c776536a9ac057f57861438f" - integrity sha512-j/4ZFyGtRcNNknwN/+evClgmG/OZIAF+xEhfzpwFzOz7Mk/0j7GyDGO+V5tg5FTOyxyK03NSu0cT0hvPglDpmA== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-buttons "2.4.3" - jquery ">=1.7" - -datatables.net-buttons@2.4.3: - version "2.4.3" - resolved "https://registry.npmmirror.com/datatables.net-buttons/-/datatables.net-buttons-2.4.3.tgz#38ceb492aa7a069f6b4334ae8fbc8134bfdf7363" - integrity sha512-xoHD6I2kxnU/CEp97Ar0lSnAL1siucQ/5Q/otGWWfWE2VN0o4n5C2h2Ot/ZCS8kxbEHBGd873Bc2xPdJH87yOw== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net-colreorder-bs4@^1.5.5: - version "1.7.2" - resolved "https://registry.npmmirror.com/datatables.net-colreorder-bs4/-/datatables.net-colreorder-bs4-1.7.2.tgz#53ea3150c3a34bf67e01f159f640f8fc2c9dc201" - integrity sha512-iVlvHwD82ZCDuaDaAXsD6OukNjgWNe44+f0yu43a1bOwK1ncXYiBSohlEuIhynHnESexN2vg4saj4a0rEMNx+w== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-colreorder "1.7.2" - jquery ">=1.7" - -datatables.net-colreorder@1.7.2: - version "1.7.2" - resolved "https://registry.npmmirror.com/datatables.net-colreorder/-/datatables.net-colreorder-1.7.2.tgz#9806f165048daecb2fe93a482c744efc6e649c06" - integrity sha512-F8TYMFXtWLtsjciwS7hkP/Fbp3XS6WHuHLc+iMFtQqiQmbMo/59GK7YSxKuxSoqTTJU/opaPXQYjODnIuNEc/g== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net-fixedcolumns-bs4@^4.0.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/datatables.net-fixedcolumns-bs4/-/datatables.net-fixedcolumns-bs4-4.3.1.tgz#00c691ff963b69a77edcb23f440a3869c51f3874" - integrity sha512-/JkG5vAil/KEB+FFvl0kcvqFMVHXZgq+6yzImlZaHE3NSApV8L5eWnyIQakShczPcxrU9iozGOxvtRRIFl0rqA== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-fixedcolumns "4.3.1" - jquery ">=1.7" - -datatables.net-fixedcolumns@4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/datatables.net-fixedcolumns/-/datatables.net-fixedcolumns-4.3.1.tgz#a6aa2831471bf9e78b21100ae862f5f52149647b" - integrity sha512-K5hEr5PIIHFMLd2sR9CBw3RRhf0nJbbsc5NHWnfjUUtnr9d808xbifuej3TpdKOtGeRJgAnRktiL9f30sM32CQ== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net-fixedheader-bs4@^3.2.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/datatables.net-fixedheader-bs4/-/datatables.net-fixedheader-bs4-3.4.1.tgz#567aa2e41cd3972f8ce5eb76173ad397e74b597d" - integrity sha512-Oq6yCpswdFRn+nwrjOjD0nmpH3F0glz/ppgdT8vA6U/8qkguze4d3qZyEYd7osqrCeX9ccUZR9ptpqRYb6sVtg== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-fixedheader "3.4.1" - jquery ">=1.7" - -datatables.net-fixedheader@3.4.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/datatables.net-fixedheader/-/datatables.net-fixedheader-3.4.1.tgz#db8b250e7819da989baa5df8c757a5a382754752" - integrity sha512-c9FJAShG5r8RJDIszWQvMFe6Ie+njfbHB9GhzOPjEF7zhbsMUQEkoYq1qW3ppOxY5psadDrT+D3f4iGM589u6w== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net-keytable-bs4@^2.6.4: - version "2.12.0" - resolved "https://registry.npmmirror.com/datatables.net-keytable-bs4/-/datatables.net-keytable-bs4-2.12.0.tgz#07f0d083d23e335c3043835623f5eeabd3e3404b" - integrity sha512-4Yn+EhUpz2ZjVmGiPUcS74hlAAtlEtXKCEoXP4tVnF/fICnvAoAr+iNC6GOUldh2LoA87/v/X5QreHA48W8z9Q== - dependencies: - datatables.net-bs4 ">=1.11.0" - datatables.net-keytable "2.12.0" - jquery ">=1.7" - -datatables.net-keytable@2.12.0: - version "2.12.0" - resolved "https://registry.npmmirror.com/datatables.net-keytable/-/datatables.net-keytable-2.12.0.tgz#9e95012b29c96a2dbd21c76c9ce45c5f685709cf" - integrity sha512-vijxMw7ZIB/fDe5FWGiDqe8CPiPXg3lvqK4lL48vQh1zoiE3+0C3za82qM9g/2zbwtIXmOLwBZc2ivrErNVPkA== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-responsive-bs4@^2.2.9: - version "2.5.1" - resolved "https://registry.npmmirror.com/datatables.net-responsive-bs4/-/datatables.net-responsive-bs4-2.5.1.tgz#1f5d615de94b07558bc2df0174b546fcfdc30255" - integrity sha512-cOVCG9zRioqJiqZUPXel5/vxKGt8EFhxgzVafDNy2hY3ZO+UMMuRKcs2br/QMoojbXzpKNf2rL/lM7NoXKVKZA== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-responsive "2.5.1" - jquery ">=1.7" - -datatables.net-responsive@2.5.1: - version "2.5.1" - resolved "https://registry.npmmirror.com/datatables.net-responsive/-/datatables.net-responsive-2.5.1.tgz#9747a3c6e6b59abd33174e1890356357151bb8c0" - integrity sha512-hyJb2faIzEWUX5Yn4HOSq/6NNB9SXDVbI4OU9ny+XU/2ghZEz4676spOgzpDHTdWvCfM+t1mbUsT70fDiTTr9w== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net-rowgroup-bs4@^1.1.4: - version "1.5.0" - resolved "https://registry.npmmirror.com/datatables.net-rowgroup-bs4/-/datatables.net-rowgroup-bs4-1.5.0.tgz#31e5ad371f187c079df8dc4275ef8b441bf4cab2" - integrity sha512-1CTXF2BsYwWYg3tjUw6cayRYsbt61DD3ms/8Evuz3/qrlKO6txdbp8OsmBNQJwT6qgEjPWx6tuGi8xdHGOey3A== - dependencies: - datatables.net-bs4 ">=1.11.0" - datatables.net-rowgroup "1.5.0" - jquery ">=1.7" - -datatables.net-rowgroup@1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/datatables.net-rowgroup/-/datatables.net-rowgroup-1.5.0.tgz#644b5fd7f7fc6fdb1bc4e42dfa0a9203740f31ca" - integrity sha512-V/CLJu7rMjxwfhZAv59emZOPw58cwnYmd8NXTTJSnqBDgOZsaC9mtVo0ejBpdqvNw5WmMPy3AJceH+ay6JQ3hA== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-rowreorder-bs4@^1.2.8: - version "1.5.0" - resolved "https://registry.npmmirror.com/datatables.net-rowreorder-bs4/-/datatables.net-rowreorder-bs4-1.5.0.tgz#5006eb235d9dfd78974d113df25a6b921328f013" - integrity sha512-4C9tzLRaisO+IOdJ1n6NRQ8ak0zC0IbX50Ed5hg+5PT7VJLI9klH+GBwE6hpF28UTWk7E6somzOwnRHLexqXdA== - dependencies: - datatables.net-bs4 ">=1.11.0" - datatables.net-rowreorder "1.5.0" - jquery ">=1.7" - -datatables.net-rowreorder@1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/datatables.net-rowreorder/-/datatables.net-rowreorder-1.5.0.tgz#f8b5242bd97df6b9522573378e98e8c7d64002dd" - integrity sha512-Kkq57tdJHrUCYkS8vywhL5tqKtl2q3K3p8A6wkIdwMX2b8YVjtywhQbXvvVLZnlMQsdX194FXVK1AgAwcm4hFg== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-scroller-bs4@^2.0.5: - version "2.4.0" - resolved "https://registry.npmmirror.com/datatables.net-scroller-bs4/-/datatables.net-scroller-bs4-2.4.0.tgz#5f97e0db6b683c5480d10a64125aa603a2af81fa" - integrity sha512-IARngb/lA/NzAozNj2lu+hNYVzuiuvTBd5Bc4ClWUoUN9L4rZ2m4KXlAOQkV6dYVAJrDdU2NH+kvQ4l6BKB/ow== - dependencies: - datatables.net-bs4 ">=1.11.0" - datatables.net-scroller "2.4.0" - jquery ">=1.7" - -datatables.net-scroller@2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/datatables.net-scroller/-/datatables.net-scroller-2.4.0.tgz#932b630b7ade6ec7d8d34e062bd718aae599ec79" - integrity sha512-SrIYyBD74Pjj/yajTu7i0YtGFiUMHWKlnO59kwIZoZhCyCh6d7S+e9HF/oT1tXjNvFWfvwA2wbA+PF20fDRA2g== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-searchbuilder-bs4@^1.3.1: - version "1.7.0" - resolved "https://registry.npmmirror.com/datatables.net-searchbuilder-bs4/-/datatables.net-searchbuilder-bs4-1.7.0.tgz#945b1f3e1ace03e3b5f0de5e31c5ceeeaeeaaa8a" - integrity sha512-uXvCl5tWikpAltKRIYtFltiG01Ned1wAVMg3i7i+ZRRhMgndOW26lUByc8yDC/W6PddLY1WX9fePGIpzbN6Cyg== - dependencies: - datatables.net-bs4 ">=1.11.0" - datatables.net-searchbuilder "1.7.0" - jquery ">=1.7" - -datatables.net-searchbuilder@1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/datatables.net-searchbuilder/-/datatables.net-searchbuilder-1.7.0.tgz#b57fb1abcaa807178c329b2d83813018e0a9281f" - integrity sha512-JGqxDVudgRxrHs/J+VM9O2rcwPgaUjpqBL1MHJAVJw+4vxvAY5Sbb0qP6ayo8h4yZyAE2+aPRm/smJ24N0nztw== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-searchpanes-bs4@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/datatables.net-searchpanes-bs4/-/datatables.net-searchpanes-bs4-1.4.0.tgz#efe09f8093fabd5ef311467eac198480873fb9bd" - integrity sha512-Floxzmw2cQkUQdI7Vv4IWtLqLmwPrmY6MPncbEWq4YvkSeaZW7OHzSmZLLUjMn2P6Huvz59WUVcwL0lSDui6GQ== - dependencies: - datatables.net-bs4 ">=1.10.25" - datatables.net-searchpanes ">=1.3.0" - jquery ">=1.7" - -datatables.net-searchpanes@>=1.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/datatables.net-searchpanes/-/datatables.net-searchpanes-2.3.0.tgz#c973359d473e50a2c787f8f6ce4419561e223865" - integrity sha512-AAl03TQXatzQh6gqNot1BAzenMxQ0/mxX+Nzn770mdTUmhVy2VX8pa7/vZlwe0tRbTcZ9VZMBMErCb66i5X3rA== - dependencies: - datatables.net ">=1.11.0" - jquery ">=1.7" - -datatables.net-select-bs4@^1.3.4: - version "1.7.1" - resolved "https://registry.npmmirror.com/datatables.net-select-bs4/-/datatables.net-select-bs4-1.7.1.tgz#3ddd63bd69426e3fd1bc20dfd7c019305d24ccb1" - integrity sha512-iHG4C8RdJIpsGIGDCXofUflHN1fa2N0E83MZPuqQXh1ZBkeJzd700rnru2mJXbvFc+wM9vf0Xxr6C5YsYFprgA== - dependencies: - datatables.net-bs4 "^1.13.0" - datatables.net-select "1.7.1" - jquery ">=1.7" - -datatables.net-select@1.7.1: - version "1.7.1" - resolved "https://registry.npmmirror.com/datatables.net-select/-/datatables.net-select-1.7.1.tgz#1b309b1ff92c25e5ce4b9d5af19186bdf9b34597" - integrity sha512-yC+GoBDVsnbaFTYKmZ2v5Bftc66zSZCYHbPYZb/ccdvxytEEudjc9R3wn6fgkOrVx3C2X/8keQc4a7EJvdOErg== - dependencies: - datatables.net "^1.13.0" - jquery ">=1.7" - -datatables.net@1.13.8: - version "1.13.8" - resolved "https://registry.npmmirror.com/datatables.net/-/datatables.net-1.13.8.tgz#05a2fb5a036b0b65b66d1bb1eae0ba018aaea8a3" - integrity sha512-2pDamr+GUwPTby2OgriVB9dR9ftFKD2AQyiuCXzZIiG4d9KkKFQ7gqPfNmG7uj9Tc5kDf+rGj86do4LAb/V71g== - dependencies: - jquery ">=1.7" - -datatables.net@2.0.0, datatables.net@>=1.11, datatables.net@>=1.11.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/datatables.net/-/datatables.net-2.0.0.tgz#232c45855d78b0019ccea854eaf044e1927118d3" - integrity sha512-HKndZD/qHNZyAhAyC1Bs8S+H652HedZK76xYAjzXR3xDohvxomJ8iWevsoRV4MvHSPgx8GQl3PAdBNpUvn0xJg== - dependencies: - jquery ">=1.7" - -datatables.net@^1.11.4, datatables.net@^1.13.0: - version "1.13.10" - resolved "https://registry.npmmirror.com/datatables.net/-/datatables.net-1.13.10.tgz#4527e2b5428394732331c8b7db8fa20a56c0cc7b" - integrity sha512-lVjpXGX9VzOpiPYnJ/KxOsYMAVa3oc3UniYGGo6pLBVCyajzMo80yisgXRz8J392wkZOc3bpp6VPs2pDbpKlyw== - dependencies: - jquery ">=1.7" - -daterangepicker@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/daterangepicker/-/daterangepicker-3.1.0.tgz#718d606614331df3e774c9aba82ccd8838d45da1" - integrity sha512-DxWXvvPq4srWLCqFugqSV+6CBt/CvQ0dnpXhQ3gl0autcIDAruG1PuGG3gC7yPRNytAD1oU1AcUOzaYhOawhTw== - dependencies: - jquery ">=1.10" - moment "^2.9.0" - -debug@2.6.9, debug@^2.2.0: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-equal@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" - integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== - dependencies: - is-arguments "^1.1.1" - is-date-object "^1.0.5" - is-regex "^1.1.4" - object-is "^1.1.5" - object-keys "^1.1.1" - regexp.prototype.flags "^1.5.1" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.0, dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.0, detect-libc@^2.0.1, detect-libc@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -deterministic-object-hash@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz#b251ddc801443905f0e9fef08816a46bc9fe3807" - integrity sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ== - dependencies: - base-64 "^1.0.0" - -devalue@^4.3.2: - version "4.3.2" - resolved "https://registry.npmmirror.com/devalue/-/devalue-4.3.2.tgz#cc44e4cf3872ac5a78229fbce3b77e57032727b5" - integrity sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg== - -devlop@^1.0.0, devlop@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" - integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== - dependencies: - dequal "^2.0.0" - -dfa@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" - integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== - -diff@^5.1.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - -dir-compare@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/dir-compare/-/dir-compare-4.2.0.tgz#d1d4999c14fbf55281071fdae4293b3b9ce86f19" - integrity sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ== - dependencies: - minimatch "^3.0.5" - p-limit "^3.1.0 " - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dropzone@^5.9.3: - version "5.9.3" - resolved "https://registry.npmmirror.com/dropzone/-/dropzone-5.9.3.tgz#b3070ae090fa48cbc04c17535635537ca72d70d6" - integrity sha512-Azk8kD/2/nJIuVPK+zQ9sjKMRIpRvNyqn9XwbBHNq+iNuSccbJS6hwm1Woy0pMST0erSo0u4j+KJaodndDk4vA== - -dset@^3.1.2, dset@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" - integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ekko-lightbox@^5.3.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/ekko-lightbox/-/ekko-lightbox-5.3.0.tgz#fbfcd9df93a8d1cdbf8770adc8c05aaac4d24f56" - integrity sha512-mbacwySuVD3Ad6F2hTkjSTvJt59bcVv2l/TmBerp4xZnLak8tPtA4AScUn4DL42c1ksTiAO6sGhJZ52P/1Qgew== - -electron-installer-common@^0.10.2: - version "0.10.3" - resolved "https://registry.npmmirror.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" - integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - asar "^3.0.0" - debug "^4.1.1" - fs-extra "^9.0.0" - glob "^7.1.4" - lodash "^4.17.15" - parse-author "^2.0.0" - semver "^7.1.1" - tmp-promise "^3.0.2" - optionalDependencies: - "@types/fs-extra" "^9.0.1" - -electron-installer-debian@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz#2a9c8220f50a57807de8f93619a0d61ec41271e0" - integrity sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - debug "^4.1.1" - electron-installer-common "^0.10.2" - fs-extra "^9.0.0" - get-folder-size "^2.0.1" - lodash "^4.17.4" - word-wrap "^1.2.3" - yargs "^16.0.2" - -electron-installer-redhat@^3.2.0: - version "3.4.0" - resolved "https://registry.npmmirror.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" - integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== - dependencies: - "@malept/cross-spawn-promise" "^1.0.0" - debug "^4.1.1" - electron-installer-common "^0.10.2" - fs-extra "^9.0.0" - lodash "^4.17.15" - word-wrap "^1.2.3" - yargs "^16.0.2" - -electron-squirrel-startup@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz#19b4e55933fa0ef8f556784b9c660f772546a0b8" - integrity sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q== - dependencies: - debug "^2.2.0" - -electron-to-chromium@^1.4.668: - version "1.4.681" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz#5f23fad8aa7e1f64cbb7dd9d15c7e39a1cd7e6e3" - integrity sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg== - -electron-winstaller@^5.0.0: - version "5.2.2" - resolved "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.2.2.tgz#529a3528a0dcb36268c0c5048d0f05ed0cedfb4f" - integrity sha512-nw+SbS0DA6SF8bEkcL4SqtPOoLKc5JkEXAz7kzdzz22rY12PZRtTn9zpztbwy+xrLqSBBFR1u0bdvNLpvlmrkw== - dependencies: - "@electron/asar" "^3.2.1" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash.template "^4.2.2" - temp "^0.9.0" - -emoji-regex@^10.2.1, emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1, es-module-lexer@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== - -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: - version "0.10.63" - resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" - integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.5: - version "0.1.5" - resolved "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A== - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@^0.1.5, es6-set@~0.1.5: - version "0.1.6" - resolved "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8" - integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - es6-iterator "~2.0.3" - es6-symbol "^3.1.3" - event-emitter "^0.3.5" - type "^2.7.2" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1: - version "3.1.3" - resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -esbuild@^0.19.3, esbuild@^0.19.6: - version "0.19.12" - resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -escodegen@~1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" - integrity sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA== - dependencies: - esprima "~1.0.4" - estraverse "~1.5.0" - esutils "~1.0.0" - optionalDependencies: - source-map "~0.1.30" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esprima@~1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - integrity sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@~1.5.0: - version "1.5.1" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" - integrity sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ== - -estree-is-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/estree-is-function/-/estree-is-function-1.0.0.tgz#c0adc29806d7f18a74db7df0f3b2666702e37ad2" - integrity sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -esutils@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" - integrity sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -ev-emitter@^1.0.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/ev-emitter/-/ev-emitter-1.1.1.tgz#8f18b0ce5c76a5d18017f71c0a795c65b9138f2a" - integrity sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q== - -eve-raphael@0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/eve-raphael/-/eve-raphael-0.5.0.tgz#17c754b792beef3fa6684d79cf5a47c63c4cda30" - integrity sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug== - -event-emitter@^0.3.5, event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -express-ws@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/express-ws/-/express-ws-5.0.2.tgz#5b02d41b937d05199c6c266d7cc931c823bda8eb" - integrity sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ== - dependencies: - ws "^7.4.6" - -express@^4.17.1, express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmmirror.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-zip@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-fifo@^1.1.0, fast-fifo@^1.2.0: - version "1.3.2" - resolved "https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-glob@^3.2.7, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-memoize@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -fastclick@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/fastclick/-/fastclick-1.0.6.tgz#161625b27b1a5806405936bda9a2c1926d06be6a" - integrity sha512-cXyDBT4g0uWl/Xe75QspBDAgAWQ0lkPi/zgp6YFEUHj6WV6VIZl7R6TiDZhdOVU3W4ehp/8tG61Jev1jit+ztQ== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== - -filenamify@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filterizr@^2.2.4: - version "2.2.4" - resolved "https://registry.npmmirror.com/filterizr/-/filterizr-2.2.4.tgz#02fd75cffd46ef7acc85f55e132064650ae90a14" - integrity sha512-hqyEdg7RrvJMVFOeF0yysS75HP6jLu0wBSUtSPAc3BysAtHpwcXaPnR1kYp2uZtd3YXyhH6JRfF9+H4SRvrqXg== - dependencies: - fast-memoize "^2.5.1" - imagesloaded "^4.1.4" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root2@1.2.16: - version "1.2.16" - resolved "https://registry.npmmirror.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" - integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== - dependencies: - micromatch "^4.0.2" - pkg-dir "^4.2.0" - -flag-icon-css@^4.1.7: - version "4.1.7" - resolved "https://registry.npmmirror.com/flag-icon-css/-/flag-icon-css-4.1.7.tgz#5471197f9ab965a3603b3e0face31dd513fec289" - integrity sha512-AFjSU+fv98XbU0vnTQ32vcLj89UEr1MhwDFcooQv14qWJCjg9fGZzfh9BVyDhAhIOZW/pGmJmq38RqpgPaeybQ== - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flattie@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/flattie/-/flattie-1.1.0.tgz#1459504209f2001c478751b4e2fb69d6b1ee3241" - integrity sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw== - -flora-colossus@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/flora-colossus/-/flora-colossus-2.0.0.tgz#af1e85db0a8256ef05f3fb531c1235236c97220a" - integrity sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA== - dependencies: - debug "^4.3.4" - fs-extra "^10.1.0" - -flot@^4.2.2: - version "4.2.6" - resolved "https://registry.npmmirror.com/flot/-/flot-4.2.6.tgz#f2ea48270099567a6ccf8b5ab1ef18a5b65f356d" - integrity sha512-Iz4HCet1ZBQnjGwECz4jseD1zMnh7m2XJIMI6A62l8h2SeceLYOEmYGNQto1XhkSM9fUmqzyKhWwJ+RolWLydg== - -follow-redirects@^1.0.0: - version "1.15.5" - resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^10.0.0, fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.1.0, fs-extra@^11.1.1: - version "11.2.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -fullcalendar@^5.10.1: - version "5.11.5" - resolved "https://registry.npmmirror.com/fullcalendar/-/fullcalendar-5.11.5.tgz#db57191c4741ceb9a217e47a4cdba8c9ad81b738" - integrity sha512-eaVD6zOvuFXVpoMKlg2FQAj8e+PcpitBMwlzwRJJr1zOi/dXMYAksx2hLzwtsr93FVUNSSo16xwMTTZz6+prKQ== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -galactus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/galactus/-/galactus-1.0.0.tgz#c2615182afa0c6d0859b92e56ae36d052827db7e" - integrity sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ== - dependencies: - debug "^4.3.4" - flora-colossus "^2.0.0" - fs-extra "^10.1.0" - -gar@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" - integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== - -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.npmmirror.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-assigned-identifiers@^1.1.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" - integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - -get-folder-size@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" - integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== - dependencies: - gar "^1.0.4" - tiny-each-async "2.0.3" - -get-installed-path@^2.0.3: - version "2.1.1" - resolved "https://registry.npmmirror.com/get-installed-path/-/get-installed-path-2.1.1.tgz#a1f33dc6b8af542c9331084e8edbe37fe2634152" - integrity sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA== - dependencies: - global-modules "1.0.0" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-info@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" - integrity sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw== - dependencies: - bluebird "^3.1.1" - debug "^2.2.0" - lodash.get "^4.0.0" - read-pkg-up "^2.0.0" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -github-slugger@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" - integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -global-agent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" - integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== - dependencies: - boolean "^3.0.1" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - -global-modules@1.0.0, global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globalthis@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^11.7.0, got@^11.8.5: - version "11.8.6" - resolved "https://registry.npmmirror.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has@^1.0.1: - version "1.0.4" - resolved "https://registry.npmmirror.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== - dependencies: - function-bind "^1.1.2" - -hast-util-from-html@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz#9cd38ee81bf40b2607368b92a04b0905fa987488" - integrity sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g== - dependencies: - "@types/hast" "^3.0.0" - devlop "^1.1.0" - hast-util-from-parse5 "^8.0.0" - parse5 "^7.0.0" - vfile "^6.0.0" - vfile-message "^4.0.0" - -hast-util-from-parse5@^8.0.0: - version "8.0.1" - resolved "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" - integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - devlop "^1.0.0" - hastscript "^8.0.0" - property-information "^6.0.0" - vfile "^6.0.0" - vfile-location "^5.0.0" - web-namespaces "^2.0.0" - -hast-util-parse-selector@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" - integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== - dependencies: - "@types/hast" "^3.0.0" - -hast-util-raw@^9.0.0: - version "9.0.2" - resolved "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.0.2.tgz#39b4a4886bd9f0a5dd42e86d02c966c2c152884c" - integrity sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - "@ungap/structured-clone" "^1.0.0" - hast-util-from-parse5 "^8.0.0" - hast-util-to-parse5 "^8.0.0" - html-void-elements "^3.0.0" - mdast-util-to-hast "^13.0.0" - parse5 "^7.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-to-html@^9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz#51c0ae2a3550b9aa988c094c4fc4e327af0dddd1" - integrity sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-raw "^9.0.0" - hast-util-whitespace "^3.0.0" - html-void-elements "^3.0.0" - mdast-util-to-hast "^13.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.0" - zwitch "^2.0.4" - -hast-util-to-parse5@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" - integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== - dependencies: - "@types/hast" "^3.0.0" - comma-separated-tokens "^2.0.0" - devlop "^1.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-whitespace@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" - integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== - dependencies: - "@types/hast" "^3.0.0" - -hastscript@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" - integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== - dependencies: - "@types/hast" "^3.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^4.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.npmmirror.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-escaper@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" - integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-void-elements@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" - integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== - -html-webpack-plugin@^5.5.3: - version "5.6.0" - resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -icheck-bootstrap@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/icheck-bootstrap/-/icheck-bootstrap-3.0.1.tgz#60c9c9a71524e1d9dd5bd05167a62fef05cc3a1b" - integrity sha512-Rj3SybdcMcayhsP4IJ+hmCNgCKclaFcs/5zwCuLXH1WMo468NegjhZVxbSNKhEjJjnwc4gKETogUmPYSQ9lEZQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2, iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -imagesloaded@^4.1.4: - version "4.1.4" - resolved "https://registry.npmmirror.com/imagesloaded/-/imagesloaded-4.1.4.tgz#1376efcd162bb768c34c3727ac89cc04051f3cc7" - integrity sha512-ltiBVcYpc/TYTF5nolkMNsnREHW+ICvfQ3Yla2Sgr71YFwQ86bDwV9hgpFhFtrGPuwEx5+LqOHIrdXBdoWwwsA== - dependencies: - ev-emitter "^1.0.0" - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - -import-meta-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" - integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inputmask@^5.0.7: - version "5.0.8" - resolved "https://registry.npmmirror.com/inputmask/-/inputmask-5.0.8.tgz#cd0f70b058c3291a0d4f27de25dbfc179c998bb4" - integrity sha512-1WcbyudPTXP1B28ozWWyFa6QRIUG4KiLoyR6LFHlpT4OfTzRqFfWgHFadNvRuMN1S9XNVz9CdNvCGjJi+uAMqQ== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ion-rangeslider@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/ion-rangeslider/-/ion-rangeslider-2.3.1.tgz#92ade52cb56fc30b9162d0483ff02b6f9ed237c2" - integrity sha512-6V+24FD13/feliI485gnRHZYD9Ev64M5NAFTxnVib516ATHa9PlXQrC+nOiPngouRYTCLPJyokAJEi3e1Umi5g== - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.npmmirror.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isbinaryfile@^4.0.8: - version "4.0.10" - resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" - integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jquery-knob-chif@^1.2.13: - version "1.2.13" - resolved "https://registry.npmmirror.com/jquery-knob-chif/-/jquery-knob-chif-1.2.13.tgz#5f1e462ef3745d27a9fd66ce1141fe82b44a5762" - integrity sha512-dveq9MZCr68bRrsziuRusKS+/ciT1yOOHdENOSTcXVRM9MsEyCK/DjqR9nc7V3on41269PFdDE2Fuib8Cw4jAA== - -jquery-mapael@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/jquery-mapael/-/jquery-mapael-2.2.0.tgz#a68850c680ef0ce3f8b865e8a48b2a018250ca73" - integrity sha512-B5cVcCkfs7Ezia1Zs8bEfVacYD/GvaASyqQeidApR/NJ1C4igcExk9VULVsgLcTPkxohcZrrz5uCaPXvuKeZWw== - dependencies: - jquery "^3.0 || ^2.0 || ^1.0" - raphael "^2.2.0 || ^2.1.1" - optionalDependencies: - jquery-mousewheel "^3.1" - -jquery-mousewheel@^3.1, jquery-mousewheel@^3.1.13: - version "3.1.13" - resolved "https://registry.npmmirror.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== - -jquery-ui-dist@^1.13.0: - version "1.13.2" - resolved "https://registry.npmmirror.com/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz#899fbb3c6210de19ace10657cf844a3b97f3be70" - integrity sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA== - dependencies: - jquery ">=1.8.0 <4.0.0" - -jquery-validation@^1.19.3: - version "1.20.0" - resolved "https://registry.npmmirror.com/jquery-validation/-/jquery-validation-1.20.0.tgz#dbff6d8fe61b07d4b6f844bf2f5405146556b991" - integrity sha512-c8tg4ltIIP6L7l0bZ79sRzOJYquyjS48kQZ6iv8MJ2r0OYztxtkWYKTReZyU2/zVFYiINB29i0Z/IRNNuJQN1g== - -jquery@>=1.10, jquery@>=1.12.0, jquery@>=1.7, "jquery@>=1.8.0 <4.0.0", jquery@>=2.2, "jquery@^3.0 || ^2.0 || ^1.0", jquery@^3.4.0, jquery@^3.6.0: - version "3.7.1" - resolved "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" - integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== - -jqvmap-novulnerability@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/jqvmap-novulnerability/-/jqvmap-novulnerability-1.5.1.tgz#140c42623ebbe9b9076ea2dd3b8d155fe9f38ae7" - integrity sha512-O6Jr7AGiut9iNJMelPdy8pH83tNXadOqmhJm5FZy9gtaZ5uuhZK3VNu+YLFuTpXeZI8YXUvlFUYbJJi5XHA+tw== - dependencies: - jquery "^3.4.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsgrid@^1.5.3: - version "1.5.3" - resolved "https://registry.npmmirror.com/jsgrid/-/jsgrid-1.5.3.tgz#b15fc426483153bee2b6b567312f675d92834a0d" - integrity sha512-/BJgQp7gZe8o/VgNelwXc21jHc9HN+l7WPOkBhC9b9jPXFtOrU9ftNLPVBmKYCNlIulAbGTW8SDJI0mpw7uWxQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^2.1.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jszip@^3.7.1: - version "3.10.1" - resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - setimmediate "^1.0.5" - -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== - -keyv@^4.0.0: - version "4.5.4" - resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kleur@^4.1.4: - version "4.1.5" - resolved "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -launch-editor@^2.6.0: - version "2.6.1" - resolved "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.8.1" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - -listr2@^5.0.3: - version "5.0.8" - resolved "https://registry.npmmirror.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" - integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.19" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.8.0" - through "^2.3.8" - wrap-ansi "^7.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-yaml-file@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" - integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== - dependencies: - graceful-fs "^4.1.5" - js-yaml "^3.13.0" - pify "^4.0.1" - strip-bom "^3.0.0" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== - -lodash.get@^4.0.0: - version "4.4.2" - resolved "https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.template@^4.2.2: - version "4.5.0" - resolved "https://registry.npmmirror.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-symbols@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" - integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== - dependencies: - chalk "^5.0.0" - is-unicode-supported "^1.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -magic-string@0.25.1: - version "0.25.1" - resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" - integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg== - dependencies: - sourcemap-codec "^1.4.1" - -magic-string@^0.30.3: - version "0.30.7" - resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.7.tgz#0cecd0527d473298679da95a2d7aeb8c64048505" - integrity sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-fetch-happen@^10.0.3: - version "10.2.1" - resolved "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -mdast-util-definitions@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz#c1bb706e5e76bb93f9a09dd7af174002ae69ac24" - integrity sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - unist-util-visit "^5.0.0" - -mdast-util-find-and-replace@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" - integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== - dependencies: - "@types/mdast" "^4.0.0" - escape-string-regexp "^5.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -mdast-util-from-markdown@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" - integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - mdast-util-to-string "^4.0.0" - micromark "^4.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-decode-string "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-stringify-position "^4.0.0" - -mdast-util-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" - integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== - dependencies: - "@types/mdast" "^4.0.0" - ccount "^2.0.0" - devlop "^1.0.0" - mdast-util-find-and-replace "^3.0.0" - micromark-util-character "^2.0.0" - -mdast-util-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" - integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.1.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - -mdast-util-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" - integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" - integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-task-list-item@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" - integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" - integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== - dependencies: - mdast-util-from-markdown "^2.0.0" - mdast-util-gfm-autolink-literal "^2.0.0" - mdast-util-gfm-footnote "^2.0.0" - mdast-util-gfm-strikethrough "^2.0.0" - mdast-util-gfm-table "^2.0.0" - mdast-util-gfm-task-list-item "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-phrasing@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" - integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== - dependencies: - "@types/mdast" "^4.0.0" - unist-util-is "^6.0.0" - -mdast-util-to-hast@13.0.2: - version "13.0.2" - resolved "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" - integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@ungap/structured-clone" "^1.0.0" - devlop "^1.0.0" - micromark-util-sanitize-uri "^2.0.0" - trim-lines "^3.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - -mdast-util-to-hast@^13.0.0: - version "13.1.0" - resolved "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz#1ae54d903150a10fe04d59f03b2b95fd210b2124" - integrity sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@ungap/structured-clone" "^1.0.0" - devlop "^1.0.0" - micromark-util-sanitize-uri "^2.0.0" - trim-lines "^3.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - -mdast-util-to-markdown@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" - integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^4.0.0" - mdast-util-to-string "^4.0.0" - micromark-util-decode-string "^2.0.0" - unist-util-visit "^5.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" - integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== - dependencies: - "@types/mdast" "^4.0.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -mem@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.npmmirror.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-source-map@1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" - integrity sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA== - dependencies: - source-map "^0.5.6" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromark-core-commonmark@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" - integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== - dependencies: - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-factory-destination "^2.0.0" - micromark-factory-label "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-title "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-html-tag-name "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" - integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" - integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== - dependencies: - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" - integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" - integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-tagfilter@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" - integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== - dependencies: - micromark-util-types "^2.0.0" - -micromark-extension-gfm-task-list-item@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" - integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" - integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== - dependencies: - micromark-extension-gfm-autolink-literal "^2.0.0" - micromark-extension-gfm-footnote "^2.0.0" - micromark-extension-gfm-strikethrough "^2.0.0" - micromark-extension-gfm-table "^2.0.0" - micromark-extension-gfm-tagfilter "^2.0.0" - micromark-extension-gfm-task-list-item "^2.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-destination@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" - integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-label@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" - integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== - dependencies: - devlop "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-space@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" - integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-title@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" - integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" - integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-character@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" - integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== - dependencies: - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-chunked@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" - integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-classify-character@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" - integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-combine-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" - integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== - dependencies: - micromark-util-chunked "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-decode-numeric-character-reference@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" - integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-decode-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" - integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" - integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== - -micromark-util-html-tag-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" - integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== - -micromark-util-normalize-identifier@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" - integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-resolve-all@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" - integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== - dependencies: - micromark-util-types "^2.0.0" - -micromark-util-sanitize-uri@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" - integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-subtokenize@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" - integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-symbol@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" - integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== - -micromark-util-types@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" - integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== - -micromark@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" - integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: - version "3.3.6" - resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -moment-timezone@^0.5.34: - version "0.5.45" - resolved "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.45.tgz#cb685acd56bac10e69d93c536366eb65aa6bcf5c" - integrity sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ== - dependencies: - moment "^2.29.4" - -moment@^2.10.2, moment@^2.29.1, moment@^2.29.2, moment@^2.29.4, moment@^2.9.0: - version "2.30.1" - resolved "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -negotiator@0.6.3, negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nlcst-to-string@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz#83b90f2e1ee2081e14701317efc26d3bbadc806e" - integrity sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw== - dependencies: - "@types/nlcst" "^1.0.0" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-abi@^3.3.0, node-abi@^3.45.0: - version "3.56.0" - resolved "https://registry.npmmirror.com/node-abi/-/node-abi-3.56.0.tgz#ca807d5ff735ac6bbbd684ae3ff2debc1c2a40a7" - integrity sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q== - dependencies: - semver "^7.3.5" - -node-addon-api@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" - integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== - -node-api-version@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" - integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== - dependencies: - semver "^7.3.5" - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-gyp@^9.0.0: - version "9.4.1" - resolved "https://registry.npmmirror.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" - integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - -node-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/node-loader/-/node-loader-2.0.0.tgz#9109a6d828703fd3e0aa03c1baec12a798071562" - integrity sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q== - dependencies: - loader-utils "^2.0.0" - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npmlog@^6.0.0: - version "6.0.2" - resolved "https://registry.npmmirror.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-inspect@^1.13.1, object-inspect@^1.6.0: - version "1.13.1" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^8.0.9: - version "8.4.2" - resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -ora@^5.1.0: - version "5.4.1" - resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -ora@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" - integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== - dependencies: - chalk "^5.3.0" - cli-cursor "^4.0.0" - cli-spinners "^2.9.0" - is-interactive "^2.0.0" - is-unicode-supported "^1.3.0" - log-symbols "^5.1.0" - stdin-discarder "^0.1.0" - string-width "^6.1.0" - strip-ansi "^7.1.0" - -overlayscrollbars@^1.13.1: - version "1.13.3" - resolved "https://registry.npmmirror.com/overlayscrollbars/-/overlayscrollbars-1.13.3.tgz#992c96fd2c8535802d1e56c40bc12ec03076c626" - integrity sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, "p-limit@^3.1.0 ": - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-queue@^8.0.1: - version "8.0.1" - resolved "https://registry.npmmirror.com/p-queue/-/p-queue-8.0.1.tgz#718b7f83836922ef213ddec263ff4223ce70bef8" - integrity sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== - dependencies: - eventemitter3 "^5.0.1" - p-timeout "^6.1.2" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^6.1.2: - version "6.1.2" - resolved "https://registry.npmmirror.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" - integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@^0.2.5: - version "0.2.9" - resolved "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - -pako@~1.0.2: - version "1.0.11" - resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parse-author@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" - integrity sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw== - dependencies: - author-regex "^1.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-latin@^5.0.0: - version "5.0.1" - resolved "https://registry.npmmirror.com/parse-latin/-/parse-latin-5.0.1.tgz#f3b4fac54d06f6a0501cf8b8ecfafa4cbb4f2f47" - integrity sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg== - dependencies: - nlcst-to-string "^3.0.0" - unist-util-modify-children "^3.0.0" - unist-util-visit-children "^2.0.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@^6.2.1: - version "6.2.1" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" - integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== - dependencies: - pify "^2.0.0" - -pdfmake@^0.2.4: - version "0.2.9" - resolved "https://registry.npmmirror.com/pdfmake/-/pdfmake-0.2.9.tgz#1768cf85b2b137afb47fb4bc2dd8c2cd3304ebbe" - integrity sha512-LAtYwlR8cCQqbxESK2d50DYaVAzAC9Id9NjilRte6Tb9pyHUB+Z50nhD0imuBL0eDyXQKvEYSNjo3P5AOc2ZCg== - dependencies: - "@foliojs-fork/linebreak" "^1.1.1" - "@foliojs-fork/pdfkit" "^0.14.0" - iconv-lite "^0.6.3" - xmldoc "^1.1.2" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -plist@^3.0.0, plist@^3.0.5, plist@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" - integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== - dependencies: - "@xmldom/xmldom" "^0.8.8" - base64-js "^1.5.1" - xmlbuilder "^15.1.1" - -png-js@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/png-js/-/png-js-1.0.0.tgz#e5484f1e8156996e383aceebb3789fd75df1874d" - integrity sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g== - -popper.js@>=1.10, popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.npmmirror.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.4: - version "4.0.4" - resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" - integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" - integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.15" - resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.33, postcss@^8.4.35: - version "8.4.35" - resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postject@^1.0.0-alpha.6: - version "1.0.0-alpha.6" - resolved "https://registry.npmmirror.com/postject/-/postject-1.0.0-alpha.6.tgz#9d022332272e2cfce8dea4cfce1ee6dd1b2ee135" - integrity sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A== - dependencies: - commander "^9.4.0" - -prebuild-install@^7.1.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -preferred-pm@^3.1.2: - version "3.1.3" - resolved "https://registry.npmmirror.com/preferred-pm/-/preferred-pm-3.1.3.tgz#4125ea5154603136c3b6444e5f5c94ecf90e4916" - integrity sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w== - dependencies: - find-up "^5.0.0" - find-yarn-workspace-root2 "1.2.16" - path-exists "^4.0.0" - which-pm "2.0.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -property-information@^6.0.0: - version "6.4.1" - resolved "https://registry.npmmirror.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" - integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -quote-stream@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" - integrity sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ== - dependencies: - buffer-equal "0.0.1" - minimist "^1.1.3" - through2 "^2.0.0" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -"raphael@^2.2.0 || ^2.1.1", raphael@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/raphael/-/raphael-2.3.0.tgz#eabeb09dba861a1d4cee077eaafb8c53f3131f89" - integrity sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ== - dependencies: - eve-raphael "0.5.0" - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -rcedit@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/rcedit/-/rcedit-4.0.1.tgz#892ac47a19204a380f49e00ea38ce070443343c2" - integrity sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg== - dependencies: - cross-spawn-windows-exe "^1.1.0" - -read-binary-file-arch@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" - integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== - dependencies: - debug "^4.3.4" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.3, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.npmmirror.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -regexp.prototype.flags@^1.5.1: - version "1.5.2" - resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -rehype-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/rehype-parse/-/rehype-parse-9.0.0.tgz#3949faeec6f466ec57774215661e0d75469195d9" - integrity sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw== - dependencies: - "@types/hast" "^3.0.0" - hast-util-from-html "^2.0.0" - unified "^11.0.0" - -rehype-raw@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" - integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== - dependencies: - "@types/hast" "^3.0.0" - hast-util-raw "^9.0.0" - vfile "^6.0.0" - -rehype-stringify@^10.0.0: - version "10.0.0" - resolved "https://registry.npmmirror.com/rehype-stringify/-/rehype-stringify-10.0.0.tgz#2031cf6fdd0355393706f0474ec794c75e5492f2" - integrity sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ== - dependencies: - "@types/hast" "^3.0.0" - hast-util-to-html "^9.0.0" - unified "^11.0.0" - -rehype@^13.0.1: - version "13.0.1" - resolved "https://registry.npmmirror.com/rehype/-/rehype-13.0.1.tgz#56384ba83955e2f3aa7eca1975b406c67d9dbd5e" - integrity sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg== - dependencies: - "@types/hast" "^3.0.0" - rehype-parse "^9.0.0" - rehype-stringify "^10.0.0" - unified "^11.0.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-gfm@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" - integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-gfm "^3.0.0" - micromark-extension-gfm "^3.0.0" - remark-parse "^11.0.0" - remark-stringify "^11.0.0" - unified "^11.0.0" - -remark-parse@^11.0.0: - version "11.0.0" - resolved "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" - integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-from-markdown "^2.0.0" - micromark-util-types "^2.0.0" - unified "^11.0.0" - -remark-rehype@^11.0.0: - version "11.1.0" - resolved "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" - integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - mdast-util-to-hast "^13.0.0" - unified "^11.0.0" - vfile "^6.0.0" - -remark-smartypants@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/remark-smartypants/-/remark-smartypants-2.1.0.tgz#afd26d8ff40def346c6516e38b46994449fb2efe" - integrity sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw== - dependencies: - retext "^8.1.0" - retext-smartypants "^5.2.0" - unist-util-visit "^5.0.0" - -remark-stringify@^11.0.0: - version "11.0.0" - resolved "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" - integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-to-markdown "^2.0.0" - unified "^11.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-dir@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-package@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/resolve-package/-/resolve-package-1.0.1.tgz#686f70b188bd7d675f5bbc4282ccda060abb9d27" - integrity sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g== - dependencies: - get-installed-path "^2.0.3" - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@^1.1.5, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retext-latin@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/retext-latin/-/retext-latin-3.1.0.tgz#72b0176af2c69a373fd0d37eadd3924418bb3a89" - integrity sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ== - dependencies: - "@types/nlcst" "^1.0.0" - parse-latin "^5.0.0" - unherit "^3.0.0" - unified "^10.0.0" - -retext-smartypants@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/retext-smartypants/-/retext-smartypants-5.2.0.tgz#da9cb79cc60f36aa33a20a462dfc663bec0068b4" - integrity sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw== - dependencies: - "@types/nlcst" "^1.0.0" - nlcst-to-string "^3.0.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - -retext-stringify@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/retext-stringify/-/retext-stringify-3.1.0.tgz#46ed45e077bfc4a8334977f6c2d6611e1d36263a" - integrity sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w== - dependencies: - "@types/nlcst" "^1.0.0" - nlcst-to-string "^3.0.0" - unified "^10.0.0" - -retext@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/retext/-/retext-8.1.0.tgz#c43437fb84cd46285ad240a9279142e239bada8d" - integrity sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q== - dependencies: - "@types/nlcst" "^1.0.0" - retext-latin "^3.0.0" - retext-stringify "^3.0.0" - unified "^10.0.0" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.1" - resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" - integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - -rollup@^4.2.0: - version "4.12.0" - resolved "https://registry.npmmirror.com/rollup/-/rollup-4.12.0.tgz#0b6d1e5f3d46bbcf244deec41a7421dc54cc45b5" - integrity sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.12.0" - "@rollup/rollup-android-arm64" "4.12.0" - "@rollup/rollup-darwin-arm64" "4.12.0" - "@rollup/rollup-darwin-x64" "4.12.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.12.0" - "@rollup/rollup-linux-arm64-gnu" "4.12.0" - "@rollup/rollup-linux-arm64-musl" "4.12.0" - "@rollup/rollup-linux-riscv64-gnu" "4.12.0" - "@rollup/rollup-linux-x64-gnu" "4.12.0" - "@rollup/rollup-linux-x64-musl" "4.12.0" - "@rollup/rollup-win32-arm64-msvc" "4.12.0" - "@rollup/rollup-win32-ia32-msvc" "4.12.0" - "@rollup/rollup-win32-x64-msvc" "4.12.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.0: - version "7.8.1" - resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.3.0" - resolved "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - -schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -scope-analyzer@^2.0.1: - version "2.1.2" - resolved "https://registry.npmmirror.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz#b958162feb59823c2835c7b0229187a97c77e9cd" - integrity sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ== - dependencies: - array-from "^2.1.1" - dash-ast "^2.0.1" - es6-map "^0.1.5" - es6-set "^0.1.5" - es6-symbol "^3.1.1" - estree-is-function "^1.0.0" - get-assigned-identifiers "^1.1.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -select2@^4.0.13: - version "4.0.13" - resolved "https://registry.npmmirror.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d" - integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.2.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-function-length@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" - integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== - dependencies: - define-data-property "^1.1.2" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.1" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallow-copy@~0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw== - -sharp@^0.32.6: - version "0.32.6" - resolved "https://registry.npmmirror.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" - integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== - dependencies: - color "^4.2.3" - detect-libc "^2.0.2" - node-addon-api "^6.1.0" - prebuild-install "^7.1.1" - semver "^7.5.4" - simple-get "^4.0.1" - tar-fs "^3.0.4" - tunnel-agent "^0.6.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shikiji-core@0.9.19, shikiji-core@^0.9.19: - version "0.9.19" - resolved "https://registry.npmmirror.com/shikiji-core/-/shikiji-core-0.9.19.tgz#227975e998eb2a579cf83de30977762be3802507" - integrity sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw== - -shikiji@^0.9.18, shikiji@^0.9.19: - version "0.9.19" - resolved "https://registry.npmmirror.com/shikiji/-/shikiji-0.9.19.tgz#351a32b291a04cf9a6b69933f8044fe135b70f6f" - integrity sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg== - dependencies: - shikiji-core "0.9.19" - -side-channel@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" - integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0, simple-get@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks@^2.6.2: - version "2.8.1" - resolved "https://registry.npmmirror.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" - integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@^0.5.13, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.1.30: - version "0.1.43" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ== - dependencies: - amdefine ">=0.0.4" - -sourcemap-codec@^1.4.1: - version "1.4.8" - resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -sparklines@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/sparklines/-/sparklines-1.3.0.tgz#08015a34c295b62196b91e98df53bfbcb1fde175" - integrity sha512-CkFtpDE3hmOeu1IJyIQIOH0AQtHnPj1c61ALxJZQ9cPEFKDgWC1fcNAHuwPi1i1klTDYvlKKseoYHSwe7JmdLA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@^1.1.2, sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.npmmirror.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - -static-eval@^2.0.5: - version "2.1.1" - resolved "https://registry.npmmirror.com/static-eval/-/static-eval-2.1.1.tgz#71ac6a13aa32b9e14c5b5f063c362176b0d584ba" - integrity sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA== - dependencies: - escodegen "^2.1.0" - -static-module@^3.0.2: - version "3.0.4" - resolved "https://registry.npmmirror.com/static-module/-/static-module-3.0.4.tgz#bfbd1d1c38dd1fbbf0bb4af0c1b3ae18a93a2b68" - integrity sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw== - dependencies: - acorn-node "^1.3.0" - concat-stream "~1.6.0" - convert-source-map "^1.5.1" - duplexer2 "~0.1.4" - escodegen "^1.11.1" - has "^1.0.1" - magic-string "0.25.1" - merge-source-map "1.0.4" - object-inspect "^1.6.0" - readable-stream "~2.3.3" - scope-analyzer "^2.0.1" - shallow-copy "~0.0.1" - static-eval "^2.0.5" - through2 "~2.0.3" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -stdin-discarder@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" - integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== - dependencies: - bl "^5.0.0" - -streamx@^2.13.0, streamx@^2.15.0: - version "2.16.1" - resolved "https://registry.npmmirror.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" - integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== - dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - optionalDependencies: - bare-events "^2.2.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" - integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^10.2.1" - strip-ansi "^7.0.1" - -string-width@^7.0.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" - integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -style-loader@^3.0.0: - version "3.3.4" - resolved "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" - integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== - -sudo-prompt@^9.1.1: - version "9.2.1" - resolved "https://registry.npmmirror.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" - integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== - -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - -summernote@^0.8.20: - version "0.8.20" - resolved "https://registry.npmmirror.com/summernote/-/summernote-0.8.20.tgz#395905f2cec0aceebc712edc019d91b8ef88f7cf" - integrity sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -sweetalert2@^11.4.0: - version "11.10.5" - resolved "https://registry.npmmirror.com/sweetalert2/-/sweetalert2-11.10.5.tgz#ff01f45b40ad678ca1f0c2e6c98800d79a74c49f" - integrity sha512-q9eE3EKhMcpIDU/Xcz7z5lk8axCGkgxwK47gXGrrfncnBJWxHPPHnBVAjfsVXcTt8Yi8U6HNEcBRSu+qGeyFdA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-fs@^3.0.4: - version "3.0.5" - resolved "https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.5.tgz#f954d77767e4e6edf973384e1eb95f8f81d64ed9" - integrity sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" - optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar-stream@^3.1.5: - version "3.1.7" - resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - -tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: - version "6.2.0" - resolved "https://registry.npmmirror.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp@^0.9.0: - version "0.9.4" - resolved "https://registry.npmmirror.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" - integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== - dependencies: - mkdirp "^0.5.1" - rimraf "~2.6.2" - -tempusdominus-bootstrap-4@^5.39.0: - version "5.39.2" - resolved "https://registry.npmmirror.com/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.2.tgz#f8f12194287eb6f159e9b9d94a441abb54daf94d" - integrity sha512-8Au4miSAsMGdsElPg87EUmsN7aGJFaRA5Y8Ale7dDTfhhnQL1Za53LclIJkq+t/7NO5+Ufr1jY7tmEPvWGHaVg== - dependencies: - bootstrap "^4.6.1" - jquery "^3.6.0" - moment "^2.29.2" - moment-timezone "^0.5.34" - popper.js "^1.16.1" - -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.10.0, terser@^5.26.0: - version "5.28.1" - resolved "https://registry.npmmirror.com/terser/-/terser-5.28.1.tgz#bf00f7537fd3a798c352c2d67d67d65c915d1b28" - integrity sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -through2@^2.0.0, through2@~2.0.3: - version "2.0.5" - resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.8, through@~2.3.4: - version "2.3.8" - resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-each-async@2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" - integrity sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA== - -tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" - integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - -tmp-promise@^3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" - integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== - dependencies: - tmp "^0.2.0" - -tmp@^0.2.0: - version "0.2.1" - resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toastr@^2.1.4: - version "2.1.4" - resolved "https://registry.npmmirror.com/toastr/-/toastr-2.1.4.tgz#8b43be64fb9d0c414871446f2db8e8ca4e95f181" - integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== - dependencies: - jquery ">=1.12.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== - dependencies: - escape-string-regexp "^1.0.2" - -trough@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" - integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== - -tsconfck@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/tsconfck/-/tsconfck-3.0.2.tgz#d8e279f7a049d55f207f528d13fa493e1d8e7ceb" - integrity sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q== - -tslib@^2.0.3, tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^2.13.0: - version "2.19.0" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unherit@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/unherit/-/unherit-3.0.1.tgz#65b98bb7cb58cee755d7ec699a49e9e8ff172e23" - integrity sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg== - -unicode-properties@^1.2.2: - version "1.4.1" - resolved "https://registry.npmmirror.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" - integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== - dependencies: - base64-js "^1.3.0" - unicode-trie "^2.0.0" - -unicode-trie@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" - integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== - dependencies: - pako "^0.2.5" - tiny-inflate "^1.0.0" - -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.npmmirror.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unified@^11.0.0, unified@^11.0.4: - version "11.0.4" - resolved "https://registry.npmmirror.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" - integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== - dependencies: - "@types/unist" "^3.0.0" - bail "^2.0.0" - devlop "^1.0.0" - extend "^3.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^6.0.0" - -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== - dependencies: - unique-slug "^3.0.0" - -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== - dependencies: - imurmurhash "^0.1.4" - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-modify-children@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz#c4018b86441aa3b54b3edff1151d0aa062384c82" - integrity sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA== - dependencies: - "@types/unist" "^2.0.0" - array-iterate "^2.0.0" - -unist-util-position@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" - integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" - integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-visit-children@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz#0f00a5caff567074568da2d89c54b5ee4a8c5440" - integrity sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -unist-util-visit@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" - integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uplot@^1.6.18: - version "1.6.30" - resolved "https://registry.npmmirror.com/uplot/-/uplot-1.6.30.tgz#1622a96b7cb2e50622c74330823c321847cbc147" - integrity sha512-48oVVRALM/128ttW19F2a2xobc2WfGdJ0VJFX00099CfqbCTuML7L2OrTKxNzeFP34eo1+yJbqFSoFAp2u28/Q== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -username@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/username/-/username-5.1.0.tgz#a7f9325adce2d0166448cdd55d4985b1360f2508" - integrity sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg== - dependencies: - execa "^1.0.0" - mem "^4.3.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^5.0.0: - version "5.0.2" - resolved "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" - integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== - dependencies: - "@types/unist" "^3.0.0" - vfile "^6.0.0" - -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.npmmirror.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^4.0.0: - version "4.0.2" - resolved "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" - integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.npmmirror.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -vfile@^6.0.0, vfile@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" - integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - vfile-message "^4.0.0" - -vite@^5.1.2: - version "5.1.4" - resolved "https://registry.npmmirror.com/vite/-/vite-5.1.4.tgz#14e9d3e7a6e488f36284ef13cebe149f060bcfb6" - integrity sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.35" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -vitefu@^0.2.5: - version "0.2.5" - resolved "https://registry.npmmirror.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" - integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.0.0: - version "4.15.1" - resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.69.1: - version "5.90.3" - resolved "https://registry.npmmirror.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" - integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-pm-runs@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" - integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== - -which-pm@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" - integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== - dependencies: - load-yaml-file "^0.2.0" - path-exists "^4.0.0" - -which-pm@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/which-pm/-/which-pm-2.1.1.tgz#0be2b70c67e94a32e87b9768a94a7f0954f2dcfa" - integrity sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ== - dependencies: - load-yaml-file "^0.2.0" - path-exists "^4.0.0" - -which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.16.0" - resolved "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== - -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - -xmldoc@^1.1.2: - version "1.3.0" - resolved "https://registry.npmmirror.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" - integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== - dependencies: - sax "^1.2.4" - -xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xterm-addon-fit@^0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596" - integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ== - -xterm-addon-search@^0.8.0: - version "0.8.2" - resolved "https://registry.npmmirror.com/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz#be7aa74d5ff12c901707c6ff674229f214318032" - integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg== - -xterm@^4.9.0: - version "4.19.0" - resolved "https://registry.npmmirror.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" - integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.0.2: - version "16.2.0" - resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1: - version "17.7.2" - resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yarn-or-npm@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz#6336eea4dff7e23e226acc98c1a8ada17a1b8666" - integrity sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ== - dependencies: - cross-spawn "^6.0.5" - pkg-dir "^4.2.0" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - -zod@^3.22.4: - version "3.22.4" - resolved "https://registry.npmmirror.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== - -zwitch@^2.0.0, zwitch@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From a8bc78991292d0e6811b5fa7f5e7ba31ea0c612c Mon Sep 17 00:00:00 2001 From: Max Qian Date: Fri, 5 Apr 2024 15:43:13 +0800 Subject: [PATCH 02/28] update web client --- websrc/cobalt-web/package-lock.json | 210 ++++----- websrc/cobalt-web/src/App.tsx | 25 +- websrc/cobalt-web/src/AppProvider.tsx | 13 +- websrc/cobalt-web/src/icons/console.svg | 14 + .../src/icons/console/camera_shoot.svg | 1 + .../cobalt-web/src/icons/console/filter.svg | 1 + websrc/cobalt-web/src/icons/console/guide.svg | 1 + .../src/icons/console/polar_align.svg | 1 + .../src/icons/console/telescope_control.svg | 1 + ...2\345\212\250\345\257\271\347\204\246.svg" | 1 + .../cobalt-web/src/icons/device_connect.svg | 1 + websrc/cobalt-web/src/icons/galaxy.svg | 13 + websrc/cobalt-web/src/icons/list.svg | 1 + websrc/cobalt-web/src/icons/main_page.svg | 1 + websrc/cobalt-web/src/icons/setting.svg | 1 + websrc/cobalt-web/src/icons/telescope.svg | 1 + websrc/cobalt-web/src/icons/welcome.jpg | Bin 0 -> 225449 bytes websrc/cobalt-web/src/index.css | 47 +- .../src/interfaces/ConnectControl.d.ts | 33 +- .../cobalt-web/src/interfaces/ConsoleGao.d.ts | 31 +- .../src/interfaces/GlobalParameters.d.ts | 6 +- websrc/cobalt-web/src/interfaces/PAA.d.ts | 119 +++++ .../src/interfaces/PAAFixedProcedure.d.ts | 34 +- .../src/interfaces/TargetSearch.d.ts | 233 +++++----- websrc/cobalt-web/src/interfaces/api.d.ts | 14 +- websrc/cobalt-web/src/interfaces/global.d.ts | 10 +- websrc/cobalt-web/src/interfaces/react.d.ts | 7 + .../pages/config/ClickQuestionTooltips.tsx | 32 +- .../src/pages/config/OneSettingEntryComp.tsx | 3 +- .../src/pages/config/components/camera.tsx | 0 .../src/pages/config/components/filter.tsx | 148 +++++++ .../src/pages/config/components/location.tsx | 183 ++++++++ .../src/pages/config/components/telescope.tsx | 194 ++++++++ websrc/cobalt-web/src/pages/config/index.tsx | 10 +- websrc/cobalt-web/src/pages/config/style.tsx | 7 + websrc/cobalt-web/src/pages/connect.tsx | 100 +++-- .../src/pages/connection/brand_connection.tsx | 212 +++++---- .../src/pages/connection/brand_select.tsx | 61 +++ .../pages/connection/device_connection.tsx | 253 ++++++----- .../cobalt-web/src/pages/connection/index.tsx | 2 +- .../src/pages/connection/profile.tsx | 98 +++-- websrc/cobalt-web/src/pages/device/index.tsx | 2 +- .../src/pages/home/init_ws_listener.tsx | 137 +++--- websrc/cobalt-web/src/store/PAAModel.ts | 281 ++++++++++-- .../cobalt-web/src/store/ProcessDataSave.ts | 44 +- .../src/store/ScheduledTargetList.ts | 415 ++++++++++-------- websrc/cobalt-web/src/store/connectModel.ts | 130 ++++-- websrc/cobalt-web/src/theme.tsx | 52 +++ .../cobalt-web/src/utils/combineProviders.tsx | 18 +- websrc/cobalt-web/src/utils/websocket.tsx | 10 +- .../src/utils/websocketProvider.tsx | 54 +-- 51 files changed, 2281 insertions(+), 985 deletions(-) create mode 100644 websrc/cobalt-web/src/icons/console.svg create mode 100644 websrc/cobalt-web/src/icons/console/camera_shoot.svg create mode 100644 websrc/cobalt-web/src/icons/console/filter.svg create mode 100644 websrc/cobalt-web/src/icons/console/guide.svg create mode 100644 websrc/cobalt-web/src/icons/console/polar_align.svg create mode 100644 websrc/cobalt-web/src/icons/console/telescope_control.svg create mode 100644 "websrc/cobalt-web/src/icons/console/\346\211\213\345\212\250\345\257\271\347\204\246 AF\347\232\204\345\233\276\346\240\207\345\275\223\350\207\252\345\212\250\345\257\271\347\204\246.svg" create mode 100644 websrc/cobalt-web/src/icons/device_connect.svg create mode 100644 websrc/cobalt-web/src/icons/galaxy.svg create mode 100644 websrc/cobalt-web/src/icons/list.svg create mode 100644 websrc/cobalt-web/src/icons/main_page.svg create mode 100644 websrc/cobalt-web/src/icons/setting.svg create mode 100644 websrc/cobalt-web/src/icons/telescope.svg create mode 100644 websrc/cobalt-web/src/icons/welcome.jpg create mode 100644 websrc/cobalt-web/src/interfaces/PAA.d.ts create mode 100644 websrc/cobalt-web/src/pages/config/components/camera.tsx create mode 100644 websrc/cobalt-web/src/pages/config/components/filter.tsx create mode 100644 websrc/cobalt-web/src/pages/config/components/location.tsx create mode 100644 websrc/cobalt-web/src/pages/config/components/telescope.tsx create mode 100644 websrc/cobalt-web/src/pages/config/style.tsx create mode 100644 websrc/cobalt-web/src/pages/connection/brand_select.tsx create mode 100644 websrc/cobalt-web/src/theme.tsx diff --git a/websrc/cobalt-web/package-lock.json b/websrc/cobalt-web/package-lock.json index 8d9d2d50..6796abc7 100644 --- a/websrc/cobalt-web/package-lock.json +++ b/websrc/cobalt-web/package-lock.json @@ -98,25 +98,25 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -135,9 +135,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -279,9 +279,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", @@ -306,9 +306,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -347,9 +347,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -877,9 +877,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -1057,9 +1057,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", + "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", "cpu": [ "arm" ], @@ -1069,9 +1069,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", + "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", "cpu": [ "arm64" ], @@ -1081,9 +1081,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", + "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", "cpu": [ "arm64" ], @@ -1093,9 +1093,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", + "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", "cpu": [ "x64" ], @@ -1105,9 +1105,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", + "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", "cpu": [ "arm" ], @@ -1117,9 +1117,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", + "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", "cpu": [ "arm64" ], @@ -1129,9 +1129,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", + "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", "cpu": [ "arm64" ], @@ -1141,9 +1141,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", + "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", "cpu": [ "ppc64le" ], @@ -1153,9 +1153,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", + "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", "cpu": [ "riscv64" ], @@ -1165,9 +1165,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", + "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", "cpu": [ "s390x" ], @@ -1177,9 +1177,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz", + "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==", "cpu": [ "x64" ], @@ -1189,9 +1189,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz", + "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==", "cpu": [ "x64" ], @@ -1201,9 +1201,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", + "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", "cpu": [ "arm64" ], @@ -1213,9 +1213,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", + "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", "cpu": [ "ia32" ], @@ -1225,9 +1225,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", + "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", "cpu": [ "x64" ], @@ -1523,9 +1523,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "version": "20.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", + "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -1537,9 +1537,9 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.2.74", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz", + "integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1555,9 +1555,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.2.24", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.24.tgz", + "integrity": "sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==", "devOptional": true, "dependencies": { "@types/react": "*" @@ -1985,9 +1985,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001605", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", + "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", "funding": [ { "type": "opencollective", @@ -2431,9 +2431,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.722", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz", - "integrity": "sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==" + "version": "1.4.728", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz", + "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==" }, "node_modules/entities": { "version": "4.5.0", @@ -5279,9 +5279,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", + "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", "dependencies": { "@types/estree": "1.0.5" }, @@ -5293,21 +5293,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.14.0", + "@rollup/rollup-android-arm64": "4.14.0", + "@rollup/rollup-darwin-arm64": "4.14.0", + "@rollup/rollup-darwin-x64": "4.14.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.0", + "@rollup/rollup-linux-arm64-gnu": "4.14.0", + "@rollup/rollup-linux-arm64-musl": "4.14.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.0", + "@rollup/rollup-linux-riscv64-gnu": "4.14.0", + "@rollup/rollup-linux-s390x-gnu": "4.14.0", + "@rollup/rollup-linux-x64-gnu": "4.14.0", + "@rollup/rollup-linux-x64-musl": "4.14.0", + "@rollup/rollup-win32-arm64-msvc": "4.14.0", + "@rollup/rollup-win32-ia32-msvc": "4.14.0", + "@rollup/rollup-win32-x64-msvc": "4.14.0", "fsevents": "~2.3.2" } }, @@ -6351,9 +6351,9 @@ } }, "node_modules/vite": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", - "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", diff --git a/websrc/cobalt-web/src/App.tsx b/websrc/cobalt-web/src/App.tsx index d948183c..e679eb53 100644 --- a/websrc/cobalt-web/src/App.tsx +++ b/websrc/cobalt-web/src/App.tsx @@ -1,32 +1,35 @@ -import React, { useEffect } from "react"; -import { AppProviders } from "./AppProvider"; -import { HashRouter as Router } from "react-router-dom"; -import Body from "./layout/index"; +import { useEffect } from 'react'; +import { AppProviders } from './AppProvider'; +import { HashRouter as Router } from 'react-router-dom'; +import Body from './layout/index'; import Route from "./routes/root"; - -import WS_LISTENER_COMP from "./pages/home/init_ws_listener"; +import { getResouceList } from './services/api'; +import WS_LISTENER_COMP from './pages/home/init_ws_listener'; import "bootstrap/dist/css/bootstrap.min.css"; +import React from 'react'; function Main() { + // useEffect(()=>{ // getResouceList().then(res=>{ // console.log(res); // }); // },[]) + return ( - - + + - - ); + ) } + export default () => (
-); +) diff --git a/websrc/cobalt-web/src/AppProvider.tsx b/websrc/cobalt-web/src/AppProvider.tsx index 787f6a25..e9c6b306 100644 --- a/websrc/cobalt-web/src/AppProvider.tsx +++ b/websrc/cobalt-web/src/AppProvider.tsx @@ -1,6 +1,9 @@ -import { GlobalStoreProvider } from "./store/globalStore"; -import { combineProviders } from "./utils/combineProviders"; -import { EchoWebSocketProvider } from "./utils/websocketProvider"; +import { GlobalStoreProvider } from './store/globalStore'; +import { combineProviders } from './utils/combineProviders'; +import { EchoWebSocketProvider } from './utils/websocketProvider'; +import { CustomThemeProvider } from './theme'; -export const AppProviders = ({ children }: { children?: React.ReactNode }) => - combineProviders([GlobalStoreProvider, EchoWebSocketProvider], children); +export const AppProviders = ({ children }: { children?: React.ReactNode }) => combineProviders([ + GlobalStoreProvider, + EchoWebSocketProvider, +], children); \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console.svg b/websrc/cobalt-web/src/icons/console.svg new file mode 100644 index 00000000..7274c102 --- /dev/null +++ b/websrc/cobalt-web/src/icons/console.svg @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console/camera_shoot.svg b/websrc/cobalt-web/src/icons/console/camera_shoot.svg new file mode 100644 index 00000000..5fa002eb --- /dev/null +++ b/websrc/cobalt-web/src/icons/console/camera_shoot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console/filter.svg b/websrc/cobalt-web/src/icons/console/filter.svg new file mode 100644 index 00000000..7f7e2f3d --- /dev/null +++ b/websrc/cobalt-web/src/icons/console/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console/guide.svg b/websrc/cobalt-web/src/icons/console/guide.svg new file mode 100644 index 00000000..44bf204d --- /dev/null +++ b/websrc/cobalt-web/src/icons/console/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console/polar_align.svg b/websrc/cobalt-web/src/icons/console/polar_align.svg new file mode 100644 index 00000000..df062ee5 --- /dev/null +++ b/websrc/cobalt-web/src/icons/console/polar_align.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/console/telescope_control.svg b/websrc/cobalt-web/src/icons/console/telescope_control.svg new file mode 100644 index 00000000..af1f8bc7 --- /dev/null +++ b/websrc/cobalt-web/src/icons/console/telescope_control.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/websrc/cobalt-web/src/icons/console/\346\211\213\345\212\250\345\257\271\347\204\246 AF\347\232\204\345\233\276\346\240\207\345\275\223\350\207\252\345\212\250\345\257\271\347\204\246.svg" "b/websrc/cobalt-web/src/icons/console/\346\211\213\345\212\250\345\257\271\347\204\246 AF\347\232\204\345\233\276\346\240\207\345\275\223\350\207\252\345\212\250\345\257\271\347\204\246.svg" new file mode 100644 index 00000000..3a5e1daf --- /dev/null +++ "b/websrc/cobalt-web/src/icons/console/\346\211\213\345\212\250\345\257\271\347\204\246 AF\347\232\204\345\233\276\346\240\207\345\275\223\350\207\252\345\212\250\345\257\271\347\204\246.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/device_connect.svg b/websrc/cobalt-web/src/icons/device_connect.svg new file mode 100644 index 00000000..1d14ca13 --- /dev/null +++ b/websrc/cobalt-web/src/icons/device_connect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/galaxy.svg b/websrc/cobalt-web/src/icons/galaxy.svg new file mode 100644 index 00000000..cebfc9e9 --- /dev/null +++ b/websrc/cobalt-web/src/icons/galaxy.svg @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/list.svg b/websrc/cobalt-web/src/icons/list.svg new file mode 100644 index 00000000..23afec3e --- /dev/null +++ b/websrc/cobalt-web/src/icons/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/main_page.svg b/websrc/cobalt-web/src/icons/main_page.svg new file mode 100644 index 00000000..e599850f --- /dev/null +++ b/websrc/cobalt-web/src/icons/main_page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/setting.svg b/websrc/cobalt-web/src/icons/setting.svg new file mode 100644 index 00000000..77e2bc47 --- /dev/null +++ b/websrc/cobalt-web/src/icons/setting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/telescope.svg b/websrc/cobalt-web/src/icons/telescope.svg new file mode 100644 index 00000000..d3970797 --- /dev/null +++ b/websrc/cobalt-web/src/icons/telescope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/websrc/cobalt-web/src/icons/welcome.jpg b/websrc/cobalt-web/src/icons/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66564c81812be3a50ceec60428422f0e03f1aa36 GIT binary patch literal 225449 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�(3TgtPG{_5p6#%yo48TAb-s*yn5FA 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 + )} + + setShowFilterSetDialog(false)} + > + + 修改滤镜编号{toSetFilterIndex + 1} + + +
) => { + event.preventDefault(); + setShowFilterSetDialog(false); + onSubmitClicked(toSetFilterIndex); + }} + > + + 滤镜名称 + { + setFilterTouched(true); + setSingleDialogData({ + ...singleFilterDialogData, + filter_name: event.target.value, + }); + }} + /> + + + 滤镜对焦偏置值 + { + setFilterTouched(true); + setSingleDialogData({ + ...singleFilterDialogData, + focus_offset: parseInt(event.target.value), + }); + }} + /> + + + 自动对焦曝光时间倍率 + { + setFilterTouched(true); + setSingleDialogData({ + ...singleFilterDialogData, + af_exposure_time: parseInt(event.target.value), + }); + }} + /> + + +
+
+
+ + ); +}; + +export default GPFilterEasyUseComp; diff --git a/websrc/cobalt-web/src/pages/config/components/location.tsx b/websrc/cobalt-web/src/pages/config/components/location.tsx new file mode 100644 index 00000000..94817565 --- /dev/null +++ b/websrc/cobalt-web/src/pages/config/components/location.tsx @@ -0,0 +1,183 @@ +import React from "react"; +import { GlobalStore } from "../../../store/globalStore"; +import { Card, Button, Row, Col } from "react-bootstrap"; +import { Compass } from "react-bootstrap-icons"; + +const GPLocationEasyUseComp: React.FC = () => { + const global_parameter = GlobalStore.useAppState( + (state) => state.GlobalParameterStore + ); + + const [error_in_range, set_error_in_range] = React.useState(false); + + const calculate_distance = () => { + if ( + "GlobalLocation" in window && + global_parameter.global_parameter.geo_location !== null + ) { + let GlobalLocation = (window as any).GlobalLocation as { + lng: number; + lat: number; + }; + const long1 = GlobalLocation.lng as number; + const lat1 = GlobalLocation.lat as number; + const long2 = global_parameter.global_parameter.geo_location.longitude; + const lat2 = global_parameter.global_parameter.geo_location.latitude; + // calculate distance on earth between two points. unit in km. + const R = 6371; + const dLat = ((lat2 - lat1) * Math.PI) / 180; + const dLon = ((long2 - long1) * Math.PI) / 180; + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos((lat1 * Math.PI) / 180) * + Math.cos((lat2 * Math.PI) / 180) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const d = R * c; + return d; + } else { + return -1; + } + }; + const on_import_location_2_gp_setting = () => { + if ("GlobalLocation" in window) { + let GlobalLocation = (window as any).GlobalLocation as { + lng: number; + lat: number; + }; + GlobalStore.actions.GlobalParameterStore.set_parameter({ + parameter_name: "geo_location", + to_set_parameter: { + longitude: GlobalLocation.lng, + latitude: GlobalLocation.lat, + // height: + }, + }); + } + }; + + React.useEffect(() => { + const distance = calculate_distance(); + if (distance !== -1 && distance > 5) { + set_error_in_range(false); + } else { + set_error_in_range(true); + } + }, []); + React.useEffect(() => { + const distance = calculate_distance(); + if (distance !== -1 && distance > 5) { + set_error_in_range(false); + } else { + set_error_in_range(true); + } + }, [ + global_parameter.global_parameter.geo_location?.latitude, + global_parameter.global_parameter.geo_location?.longitude, + ]); + React.useEffect(() => { + const distance = calculate_distance(); + if (distance !== -1 && distance > 5) { + set_error_in_range(false); + } else { + set_error_in_range(true); + } + }, [window.GlobalLocation?.lat]); + + return ( + <> + + + {/* 手机定位信息 */} + {"GlobalLocation" in window ? ( + + + + 定位经度: {window.GlobalLocation?.lng} ° + 定位纬度: {window.GlobalLocation?.lat} ° + 定位高度: 米 + + + {error_in_range ? ( + + ) : ( + + )} + + + + ) : ( + + + 未成功获取手机定位 + + + )} + + + {/* 全局变量内部的信息 */} + {global_parameter.global_parameter.geo_location === null ? ( + + + Failed to get phone location + + + ) : ( + + + + + 系统设置经度:{" "} + {global_parameter.global_parameter.geo_location.longitude} ° + + + 系统设置纬度:{" "} + {global_parameter.global_parameter.geo_location.latitude} ° + + + 系统设置高度:{" "} + {global_parameter.global_parameter.geo_location.height} 米 + + + 系统设置时区:{" "} + {global_parameter.global_parameter.geo_location.time_zone} + + + + + + + )} + + + + + + + + + Please confirm the longitude and latitude information before + starting device connection! + +
+ If you modify the system's longitude, latitude or other + information after connecting to the equatorial mount, it will + not automatically sync to the equatorial mount. If you have + modified the location information, you must disconnect and + reconnect the equatorial mount! +
+
+
+ +
+ + ); +}; + +export default GPLocationEasyUseComp; diff --git a/websrc/cobalt-web/src/pages/config/components/telescope.tsx b/websrc/cobalt-web/src/pages/config/components/telescope.tsx new file mode 100644 index 00000000..0d7b3590 --- /dev/null +++ b/websrc/cobalt-web/src/pages/config/components/telescope.tsx @@ -0,0 +1,194 @@ +import React from "react"; +import { Card, Form, Row, Col, InputGroup, Button } from "react-bootstrap"; +import { InfoCircle } from "react-bootstrap-icons"; +import { GlobalStore } from "../../../store/globalStore"; + +const GPTelescopeEasyUseComp: React.FC = () => { + const global_parameter = GlobalStore.useAppState( + (state) => state.GlobalParameterStore + ); + + const [main_focal_length, set_main_focal_length] = React.useState("0"); + const [main_apeture, set_main_apeture] = React.useState("0"); + const [guider_focal_length, set_guider_focal_length] = React.useState("0"); + const [guider_apeture, set_guider_apeture] = React.useState("0"); + + React.useEffect(() => { + if (global_parameter.global_parameter.telescope_info !== null) { + set_main_apeture( + String(global_parameter.global_parameter.telescope_info?.aperture) + ); + set_main_focal_length( + String(global_parameter.global_parameter.telescope_info?.focal_length) + ); + set_guider_apeture( + String( + global_parameter.global_parameter.telescope_info?.guider_aperture + ) + ); + set_guider_focal_length( + String( + global_parameter.global_parameter.telescope_info?.guider_focal_length + ) + ); + } + }, [ + global_parameter.global_parameter.telescope_info?.focal_length, + global_parameter.global_parameter.telescope_info?.aperture, + global_parameter.global_parameter.telescope_info?.guider_aperture, + global_parameter.global_parameter.telescope_info?.guider_focal_length, + ]); + + const on_telescope_modify_blur = (data_type: string) => { + let to_set_value: number; + switch (data_type) { + case "aperture": + try { + to_set_value = Number(main_apeture); + GlobalStore.actions.GlobalParameterStore.set_parameter({ + parameter_name: "telescope_info", + to_set_parameter: { + aperture: to_set_value, + }, + }); + } catch (error) {} + break; + case "focal_length": + try { + to_set_value = Number(main_focal_length); + GlobalStore.actions.GlobalParameterStore.set_parameter({ + parameter_name: "telescope_info", + to_set_parameter: { + focal_length: to_set_value, + }, + }); + } catch (error) {} + break; + case "guider_aperture": + try { + to_set_value = Number(guider_apeture); + GlobalStore.actions.GlobalParameterStore.set_parameter({ + parameter_name: "telescope_info", + to_set_parameter: { + guider_aperture: to_set_value, + }, + }); + } catch (error) {} + break; + case "guider_focal_length": + try { + to_set_value = Number(guider_focal_length); + GlobalStore.actions.GlobalParameterStore.set_parameter({ + parameter_name: "telescope_info", + to_set_parameter: { + guider_focal_length: to_set_value, + }, + }); + } catch (error) {} + break; + default: + break; + } + }; + return ( + <> + + + +

+ + 主镜参数 +

+
+
+ + + + 主镜焦距 + + + + set_main_focal_length(e.target.value)} + onBlur={() => on_telescope_modify_blur("focal_length")} + /> + mm + + + + + + + 主镜口径 + + + + set_main_apeture(e.target.value)} + onBlur={() => on_telescope_modify_blur("aperture")} + /> + mm + + + + +
+ + + + +

+ + 导星镜参数 +

+
+
+ + + + 导星焦距 + + + + set_guider_focal_length(e.target.value)} + onBlur={() => on_telescope_modify_blur("guider_focal_length")} + /> + mm + + + + + + + 导星口径 + + + + set_guider_apeture(e.target.value)} + onBlur={() => on_telescope_modify_blur("guider_aperture")} + /> + mm + + + + +
+ + ); +}; + +export default GPTelescopeEasyUseComp; diff --git a/websrc/cobalt-web/src/pages/config/index.tsx b/websrc/cobalt-web/src/pages/config/index.tsx index 1feaf8d3..c23f1672 100644 --- a/websrc/cobalt-web/src/pages/config/index.tsx +++ b/websrc/cobalt-web/src/pages/config/index.tsx @@ -10,20 +10,16 @@ import GlobalParameterAllFilterSettings from "./OneSettingSPFilterEntryComp"; import { GlobalStore } from "../../store/globalStore"; const GlobalParameterSettingPage = () => { - const parameter_explain = useRef<{ - [key: string]: { name: string; tooltips: string; range?: number[] }; - }>(parameter_explain_data); + const parameter_explain = useRef(parameter_explain_data); const global_parameter = GlobalStore.useAppState( (state) => state.GlobalParameterStore ); const get_all_global_parameters = GlobalStore.actions.GlobalParameterStore.get_all_paramters; - useEffect(() => { console.log("test"); get_all_global_parameters(); }, []); - const handleSettingChange = ( setting_part_key: string, setting_key: string, @@ -33,12 +29,14 @@ const GlobalParameterSettingPage = () => { let to_change_parameter = global_parameter.global_parameter[setting_part_key]; to_change_parameter[setting_key] = set_value; + // part 1, dispatch store action, change data. GlobalStore.actions.GlobalParameterStore.set_parameter({ parameter_name: setting_part_key, to_set_parameter: to_change_parameter, }); + // part 2, retrive new store data. this step is in set parameter to make sure it is blocking. + // GlobalStore.actions.GlobalParameterStore.get_parameter(setting_part_key); }; - const handleSettingPartChange = ( setting_part_key: string, setting_value: Partial diff --git a/websrc/cobalt-web/src/pages/config/style.tsx b/websrc/cobalt-web/src/pages/config/style.tsx new file mode 100644 index 00000000..32a9ff0e --- /dev/null +++ b/websrc/cobalt-web/src/pages/config/style.tsx @@ -0,0 +1,7 @@ +import styled from "styled-components"; + +const GlobalSettingSettingPage = styled.div` + overflow-y: auto !important; + overflow-x: hidden !important; + height: calc(100vh - 32px) !important; +`; diff --git a/websrc/cobalt-web/src/pages/connect.tsx b/websrc/cobalt-web/src/pages/connect.tsx index 89c82064..dfa3289e 100644 --- a/websrc/cobalt-web/src/pages/connect.tsx +++ b/websrc/cobalt-web/src/pages/connect.tsx @@ -8,6 +8,7 @@ import { Form, FormControl, } from "react-bootstrap"; +import { Plug, Power } from "react-bootstrap-icons"; const DeviceConnection = () => { const [camera, setCamera] = useState(""); @@ -54,7 +55,25 @@ const DeviceConnection = () => { // Perform client command action }; - // Add similar handleChange functions for other select inputs + const handleTelescopeChange = (e) => { + setTelescope(e.target.value); + }; + + const handleFilterwheelChange = (e) => { + setFilterwheel(e.target.value); + }; + + const handleFocuserChange = (e) => { + setFocuser(e.target.value); + }; + + const handleGuiderChange = (e) => { + setGuider(e.target.value); + }; + + const handleSolverChange = (e) => { + setSolver(e.target.value); + }; const handleSubmit = async (e) => { e.preventDefault(); @@ -89,111 +108,116 @@ const DeviceConnection = () => {
- + + 相机 - + + {/* 添加相机选项 */} - + + 赤道仪 - + + {/* 添加赤道仪选项 */} + + - + + 滤镜轮 - + + {/* 添加滤镜轮选项 */} - + + 电调 - + + {/* 添加电调选项 */} + + - + + 导星 - + + {/* 添加导星选项 */} - + + 板解器 - + + {/* 添加板解器选项 */} - - {/* Add similar Form.Group components for other select inputs */} - - {/* Add similar Rows and Form.Group components for other select inputs */} - - - - - - {" "} +
- + {/* 服务器通知 */} - + -

客户端未连接

+ 客户端未连接
diff --git a/websrc/cobalt-web/src/pages/connection/brand_connection.tsx b/websrc/cobalt-web/src/pages/connection/brand_connection.tsx index 2e5fdbe6..405cfc6f 100644 --- a/websrc/cobalt-web/src/pages/connection/brand_connection.tsx +++ b/websrc/cobalt-web/src/pages/connection/brand_connection.tsx @@ -1,32 +1,87 @@ -import React, { ChangeEvent, useEffect } from "react"; +import React, { ChangeEvent, useEffect, useState } from "react"; import { Form, Button, Row, Col, Container, Card } from "react-bootstrap"; -import { Trash, ArrowRight, Plus } from "react-bootstrap-icons"; +import { Trash, ArrowRight, Plus, Send } from "react-bootstrap-icons"; import { useTranslation } from "react-i18next"; import { GlobalStore } from "../../store/globalStore"; +import BrandDriverSelectDialog from "./brand_select"; + const BrandConnection = () => { const { t } = useTranslation(); const { brand_list, brand_type_cn, brand_type_en, brand_selections } = GlobalStore.useAppState((state) => state.connect); + const [dialog_open, set_dialog_open] = useState(false); + const [dialog_brand_index, set_dialog_brand_index] = useState(0); + const [dialog_selections, set_dialog_selections] = useState>([]); + + const handle_dialog_close = () => { + set_dialog_open(false); + }; + + const handle_dialog_select = ( + selection: IConnectBrandSelection, + device_type_index: number + ) => { + // console.log(selection, device_type_index); + const deviceType = brand_type_en[device_type_index]; + GlobalStore.actions.connect.setSelectBrand({ + type: deviceType, + brand_name: selection, + }); + }; + const on_select_clicked = (device_type_index: number) => { + set_dialog_open(true); + if (brand_selections !== null) { + set_dialog_brand_index(device_type_index); + set_dialog_selections( + brand_list[ + brand_type_en[device_type_index] as keyof typeof brand_selections + ] + ); + } else { + set_dialog_selections([]); + } + }; + useEffect(() => { GlobalStore.actions.connect.getBrandList(); }, []); const handleConnectBrand = async () => { + // 允许多次连接 + let count_time = 0; + let connect_ready = false; + + // 启动驱动 let deviceServerConnectReady = - GlobalStore.actions.connect.connectDeviceServer(); + await GlobalStore.actions.connect.connectDeviceServer(); - if (deviceServerConnectReady) { - GlobalStore.actions.connect.getDeviceList(); + if (!deviceServerConnectReady) { + alert("当前未选择任何品牌,请重新选择"); + return; + } + const res = await GlobalStore.actions.connect.getDeviceList(); + if (res) { + connect_ready = true; GlobalStore.actions.connect.setState({ brand_selection_over: true, + config_name: null, }); - } else { - console.error(t("品牌连接失败")); + return; } + // 异常情况, 关闭服务器, 提示用户 + else { + alert("未扫描得到任何设备, 请重新选择"); + await GlobalStore.actions.connect.closeDeviceServer(); + await Sleep(1000); + } + }; + + const Sleep = (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)); }; const handleBrandChange = ( @@ -47,95 +102,74 @@ const BrandConnection = () => { const handleResetBrandSelections = () => { GlobalStore.actions.connect.setState({ brand_selections: { - camera: "", - telescope: "", - focus: "", - filter: "", - guider: "", - polar: "", + camera: { zh: "", en: "", driver: "" }, + telescope: { zh: "", en: "", driver: "" }, + guider: { zh: "", en: "", driver: "" }, + focus: { zh: "", en: "", driver: "" }, + filter: { zh: "", en: "", driver: "" }, + polar: { zh: "", en: "", driver: "" }, }, }); }; return ( - + + + {brand_type_cn.map((item: string, type_index: number) => ( + + + { + on_select_clicked(type_index); + }} + readOnly + /> + + + ))} + + +
- - - - - {t("Device Brand")} - - {brand_type_cn.map((item: string, type_index: number) => ( - - - - {item} - {t("Brand")} - - handleBrandChange(e, type_index)} - > - - {brand_list !== null - ? brand_list[ - brand_type_en[ - type_index - ] as keyof typeof brand_selections - ].map((item: any, index: number) => ( - - )) - : null} - - - - ))} - - - - + + - - - - - - - - - - - - - + +
diff --git a/websrc/cobalt-web/src/pages/connection/brand_select.tsx b/websrc/cobalt-web/src/pages/connection/brand_select.tsx new file mode 100644 index 00000000..68995422 --- /dev/null +++ b/websrc/cobalt-web/src/pages/connection/brand_select.tsx @@ -0,0 +1,61 @@ +import React, { useState } from "react"; +import { Modal, Button, Form, ListGroup } from "react-bootstrap"; +import { XCircle } from "react-bootstrap-icons"; + +const BrandDriverSelectDialog = (props) => { + const [filter, setFilter] = useState(""); + + const handleInputChange = (event) => { + setFilter(event.target.value); + }; + + const handleListItemClick = (option) => { + props.handleSelect(option, props.device_type_index); + props.handleClose(); + }; + + return ( + + + 搜索驱动 + + + + + {props.options + .filter((option) => { + const { zh, en, driver } = option; + const lowerCaseFilter = filter.toLowerCase(); + return ( + zh.toLowerCase().includes(lowerCaseFilter) || + en.toLowerCase().includes(lowerCaseFilter) || + driver.toLowerCase().includes(lowerCaseFilter) + ); + }) + .map((option) => ( + handleListItemClick(option)} + > + {option.zh} + + ))} + + + + + + + ); +}; + +export default BrandDriverSelectDialog; diff --git a/websrc/cobalt-web/src/pages/connection/device_connection.tsx b/websrc/cobalt-web/src/pages/connection/device_connection.tsx index 939dc636..d2a79537 100644 --- a/websrc/cobalt-web/src/pages/connection/device_connection.tsx +++ b/websrc/cobalt-web/src/pages/connection/device_connection.tsx @@ -1,7 +1,17 @@ import React, { useState } from "react"; -import { Modal, Form, Button, Row, Col } from "react-bootstrap"; -import { Trash, ArrowRight, CheckCircle } from "react-bootstrap-icons"; +import { Modal, Form, Button, Row, Col, Container } from "react-bootstrap"; +import { + Trash, + ArrowRight, + CheckCircle, + Send, + Plus, + CircleFill, + XCircle, + Archive, + CodeSquare, +} from "react-bootstrap-icons"; import { useTranslation } from "react-i18next"; @@ -71,9 +81,7 @@ const DeviceConnection = () => { GlobalStore.actions.connect.setState({ config_name: value, }); - if (value !== "") { - GlobalStore.actions.connect.setProfile(selectedConfig); - } + GlobalStore.actions.connect.setProfile(selectedConfig); }; // 重置 const handleResetDeviceSelections = () => { @@ -101,6 +109,7 @@ const DeviceConnection = () => { const handleStartPHD2 = async () => { let connectReady = await GlobalStore.actions.connect.startPhd2(); if (connectReady) { + // todo modify later. alert("PHD2 start OK"); } else { alert("PHD2 Error"); @@ -128,119 +137,145 @@ const DeviceConnection = () => { }; return ( - <> - {brand_type_cn.map((item, type_index) => ( - - -
+ + + +
+ {brand_type_cn.map((item: string, type_index: number) => ( + +
+ + 选择{item}配置 + handleDeviceChange(e, type_index)} + > + + {device_list !== null + ? device_list[brand_type_en[type_index]].map( + (item: any, index: number) => ( + + ) + ) + : null} + + + {brand_connection[brand_type_en[type_index]] === 0 ? null : ( +
+ {brand_connection[brand_type_en[type_index]] === 1 ? ( + + ) : ( + + )} +
+ )} +
+
+ ))} +
+ + +
+ + 加载已有配置 handleDeviceChange(e, type_index)} + aria-label="加载已有配置" + value={device_selections !== null ? device_selections.name : ""} > - {device_list !== null - ? device_list[brand_type_en[type_index]].map( - (item, index) => ( - - ) - ) + {user_config_list !== null + ? user_config_list.map((item: any, index: number) => ( + + )) : null} - {brand_connection[brand_type_en[type_index]] === 0 ? null : ( - - {brand_connection[brand_type_en[type_index]] === 1 ? ( - - ) : ( - - )} - - )} -
- -
- ))} - - - - - {user_config_list !== null - ? user_config_list.map((item, index) => ( - - )) - : null} - - - - + + + {phd2_connect_ready && ( + + )} +
+ + + 配置命名 + + + + 配置名称 + + + + + + + + + +
- {phd2_connect_ready ? ( - - ) : null} - - - 配置命名 - - -

给新配置取一个名字,使得之后可以使用

- -
- - - - -
- - - +
); }; diff --git a/websrc/cobalt-web/src/pages/connection/index.tsx b/websrc/cobalt-web/src/pages/connection/index.tsx index b0695ffa..9cf8b55d 100644 --- a/websrc/cobalt-web/src/pages/connection/index.tsx +++ b/websrc/cobalt-web/src/pages/connection/index.tsx @@ -44,7 +44,7 @@ const Connect = () => { diff --git a/websrc/cobalt-web/src/pages/connection/profile.tsx b/websrc/cobalt-web/src/pages/connection/profile.tsx index 01ddfc89..4acef790 100644 --- a/websrc/cobalt-web/src/pages/connection/profile.tsx +++ b/websrc/cobalt-web/src/pages/connection/profile.tsx @@ -1,5 +1,13 @@ import React, { useEffect, useState } from "react"; -import { Accordion, Button, Card, Container, Form } from "react-bootstrap"; +import { + Accordion, + Button, + Card, + Col, + Container, + Form, + Row, +} from "react-bootstrap"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { dark } from "react-syntax-highlighter/dist/esm/styles/prism"; @@ -15,12 +23,11 @@ const ProfileConnection = () => { useEffect(() => { async function fetchConfigOptions() { try { - const response = await fetch("/api/config/options"); // 替换成实际的后端接口地址 + const response = await fetch("/api/config/options"); if (response.ok) { const data = await response.json(); setConfigOptions(data.options); - // 从 Cookie 中读取已有的配置 const selectedOption = getCookie("selectedConfig"); if (selectedOption && data.options.includes(selectedOption)) { setSelectedConfig(selectedOption); @@ -39,7 +46,6 @@ const ProfileConnection = () => { }, []); useEffect(() => { - // 将选中的配置和内容写入 Cookie if (selectedConfig) { setCookie("selectedConfig", selectedConfig); setCookie(`configContent_${selectedConfig}`, configContent); @@ -52,7 +58,7 @@ const ProfileConnection = () => { if (selectedOption) { try { - const response = await fetch(`/api/config/${selectedOption}`); // 替换成实际的后端接口地址 + const response = await fetch(`/api/config/${selectedOption}`); if (response.ok) { const data = await response.json(); setConfigContent(data.content); @@ -69,48 +75,54 @@ const ProfileConnection = () => { }; const handleCreateConfig = () => { - window.location.href = "/create-config"; // 替换为实际的创建配置页面 URL + window.location.href = "/create-config"; }; return ( -

Configuration Selection

-
- - Select Configuration: - - - {configOptions.map((option) => ( - - ))} - - -
- - - - {t("Config Details")} - - - - {configContent ? ( - - {configContent} - - ) : ( -

{t("No configuration selected.")}

- )} -
-
-
-
-
- - + + +

{t("配置选择")}

+
+ + {t("选择配置")}: + + + {configOptions.map((option) => ( + + ))} + + +
+ + + + {t("配置详细信息")} + + + + {configContent ? ( + + {configContent} + + ) : ( +

{t("未选择任何配置")}

+ )} +
+
+
+
+
+ +
+ +
+ +
); }; diff --git a/websrc/cobalt-web/src/pages/device/index.tsx b/websrc/cobalt-web/src/pages/device/index.tsx index 34c37f8f..535f4676 100644 --- a/websrc/cobalt-web/src/pages/device/index.tsx +++ b/websrc/cobalt-web/src/pages/device/index.tsx @@ -152,7 +152,7 @@ const DeviceControlPanelPage = () => { }, []); return ( - + diff --git a/websrc/cobalt-web/src/pages/home/init_ws_listener.tsx b/websrc/cobalt-web/src/pages/home/init_ws_listener.tsx index 55755214..12d24a7c 100644 --- a/websrc/cobalt-web/src/pages/home/init_ws_listener.tsx +++ b/websrc/cobalt-web/src/pages/home/init_ws_listener.tsx @@ -1,70 +1,100 @@ -import * as React from 'react'; -import { useEchoWebSocket } from '../..//utils/websocketProvider'; -import { GlobalStore } from '../../store/globalStore'; +import * as React from "react"; +import { useEchoWebSocket } from "../../utils/websocketProvider"; +import { GlobalStore } from "../../store/globalStore"; +import { setInterval } from "timers/promises"; const WS_LISTENER_COMP: React.FC = () => { // store taker - const register_send_message = GlobalStore.actions.ProcessDataSaveStore.at_start_add_ws_listener; + const register_send_message = + GlobalStore.actions.ProcessDataSaveStore.at_start_add_ws_listener; // const send_ws_message = GlobalStore.actions.ProcessDataSaveStore.send_message_to_ws; - const process_data = GlobalStore.useAppState((state) => state.ProcessDataSaveStore); - const append_HFR = GlobalStore.actions.ProcessDataSaveStore.append_newest_history_HFR_data; - const append_guide_step = GlobalStore.actions.ProcessDataSaveStore.append_newest_PHD2_guide_data; - const get_newest_jpg = GlobalStore.actions.ProcessDataSaveStore.get_newest_jpg; + const process_data = GlobalStore.useAppState( + (state) => state.ProcessDataSaveStore + ); + const append_HFR = + GlobalStore.actions.ProcessDataSaveStore.append_newest_history_HFR_data; + const append_guide_step = + GlobalStore.actions.ProcessDataSaveStore.append_newest_PHD2_guide_data; + const get_newest_jpg = + GlobalStore.actions.ProcessDataSaveStore.get_newest_jpg; + const load_saved_targets = + GlobalStore.actions.TargetListStore.load_all_targets; - const sendMessageRef = React.useRef<((message: string) => void)|null>(null); - const process_ws_message = (message: any) => { - if (message instanceof Blob){ - // process_blob_data(message); - }else{ - // listening signals and other important data - if (message.device_name == 'Signal'){ - if (message.instruction == 'Image Stretch'){ - if (message.data.camera_type == 'camera'){ - get_newest_jpg('camera'); - // console.log('camera got stretched!', typeof sendMessageRef.current); - // if (sendMessageRef.current != null){ - // sendMessageRef.current(JSON.stringify({ - // device_name: 'Signal', - // instruction: 'camera_newest', - // params: [], - // })); - // } - append_HFR(message.data.hfr_info); - }else if (message.data.camera_type == 'guider'){ - get_newest_jpg('guider'); - // if (sendMessageRef.current != null){ - // sendMessageRef.current(JSON.stringify({ - // device_name: 'Signal', - // instruction: 'guider_newest', - // params: [], - // })); - // } - } - }else if (message.instruction == 'Image Process Failed!'){ - + // listening signals and other important data + if (message.device_name == "Signal") { + if (message.instruction == "Image Stretch") { + if (message.data.camera_type == "camera") { + get_newest_jpg("camera"); + // console.log('camera got stretched!', typeof sendMessageRef.current); + append_HFR(message.data.hfr_info); + } else if (message.data.camera_type == "guider") { + get_newest_jpg("guider"); + } + } else if (message.instruction == "Image Process Failed!") { + } + } else if (message.device_name == "phd2") { + // message from server + switch (message.instruction) { + case "get_guiding_data": { + GlobalStore.actions.ProcessDataSaveStore.setState({ + PHD2_guide_data_list: { + dx: message.data.dx, + dy: message.data.dy, + RaControl: message.data.RaControl, + DecControl: message.data.DecControl, + RaDistance: message.data.RaDistance, + DecDistance: message.data.DecDistance, + }, + }); + break; } - }else if (message.device_name == 'PHD2_event'){ - if (message.type == 'GuideStep'){ - // process newest guide step data - append_guide_step(message.data); + case "get_record_guide_rms": { + break; } - }else if (message.device_name == 'PHD2_response'){ - + } + } else if (message.device_name == "PHD2_event") { + // message from phd2 + console.log("phd2 event", message.message); + if (message.message == "GuideStep") { + // process newest guide step data + append_guide_step(message.data); + } else if (message.message == "get_calibration_data") { + GlobalStore.actions.ProcessDataSaveStore.setState({ + PHD2_calibration_result: message.data, + }); + } + } else if (message.device_name == "PHD2_response") { + } else if (message.device_name == "PAA") { + if (message.type == "step") { + GlobalStore.actions.PAA.paa_new_step_info_in(message); + } else if (message.instruction == "log") { + GlobalStore.actions.PAA.paa_new_log_info_in(message); } } }; - const {sendMessage, removeListener} = useEchoWebSocket(process_ws_message); + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); // useEffect React.useEffect(() => { + load_saved_targets(); register_send_message(sendMessage); - sendMessageRef.current = sendMessage; - }, []) + // get history guiding data + // todo fatal bug, this sendMessage is not available at this step. + setTimeout(() => { + // console.log(sendMessage); + sendMessage( + JSON.stringify({ + device_name: "phd2", + instruction: "get_guiding_data", + params: [], + }) + ); + }, 500); + // get history hfr data, todo + }, []); // 这个listener只添加一次,不能删除 - return ( - <> - ) -} + return <>; +}; /* 现在的问题是,我需要有在全局有且仅有一次注册一个websocket的listener,去对一些特殊信号进行处理。 同时,有一部分信号要去ws接口里去send message。 @@ -74,5 +104,4 @@ const WS_LISTENER_COMP: React.FC = () => { 在一个欢迎界面下写组件,别的问题没有,怎么解决仅注册这一次? */ - -export default WS_LISTENER_COMP; \ No newline at end of file +export default WS_LISTENER_COMP; diff --git a/websrc/cobalt-web/src/store/PAAModel.ts b/websrc/cobalt-web/src/store/PAAModel.ts index cbcbd1c9..28233b4b 100644 --- a/websrc/cobalt-web/src/store/PAAModel.ts +++ b/websrc/cobalt-web/src/store/PAAModel.ts @@ -13,27 +13,51 @@ import { } from "../services/PAA"; import { Action, action, thunk, Thunk } from "easy-peasy"; -interface script_info { - file_name: string; - modified_time: string; -} +// TODO very big one +// 这里要对store的功能做个总管理。整个paa执行数据都在store里,那么前段这里只做调用和获取store的信息 + +// interface step_info{ +// device: string, +// id: number, +// params: { +// count?: number, +// repeat?: number, +// } +// instruction: string, +// children?: (step_info)[], +// after_loop?: [], +// name?: string, +// ra?: number, +// dec?: number, +// } + export interface PAAModel { // 变量 setting_mode: number; - get_object: boolean; // 脚本信息 - all_script_info: (never | script_info)[]; - + all_script_info: PAAScriptInfo[]; // 内容信息 - current_script_data: []; + all_step_data: PAABaseStepsInfo[]; + this_script_type: string; + this_script_setting: any; + + // 目前在执行的脚本 + current_step: null | PAAlog_info; + // 目前执行的脚本编号 + current_step_index: number; + current_step_children_index: number; + current_step_children_max_index: number; + // 对应的script_name等信息 - current_script_info: script_info; + current_script_info: PAAScriptInfo; + + all_logs_info: PAAlog_info[]; // 所有Post请求 post_start_PAA: Thunk; post_stop_PAA: Thunk; - post_load_script: Thunk; + post_load_script: Thunk; post_save_script: Thunk; post_update_script: Thunk; post_delete_script: Thunk; @@ -45,116 +69,285 @@ export interface PAAModel { get_current_script: Thunk; setState: Action>; + + add_paa_logs: Action; + change_paa_step: Action; + + // modified by gao + can_start_paa: boolean; // 表示是否具备启动paa的状态。 + paa_in_progress: boolean; // 表示是否有一个paa进程在运行 + // 如果有相机在单独拍摄,但是没有paa在运行,can start paa也会是false。也就是说,即使没有paa在运行,也存在可能没法启动paa。 + check_PAA_start_status: Thunk; // 这个函数就是用来专门刷新上面两个边练改的。 + change_paa_loop_step: Action; + change_paa_step_async: Thunk; + // about paa step change + current_step_id: string; + paa_new_step_info_in: Action; + paa_new_log_info_in: Action; } export const getPAAModel = (): PAAModel => ({ setting_mode: 0, - get_object: false, all_script_info: [], - current_script_data: [], + all_step_data: [], + this_script_type: "", + this_script_setting: {}, current_script_info: { file_name: "", modified_time: "", }, + current_step: null, + current_step_index: -1, + current_step_children_index: -1, + current_step_children_max_index: 0, + + all_logs_info: [], post_start_PAA: thunk(async (state, payload, { getState }) => { const res = await postPAAStart(); - console.log(res); + state.setState({ + current_step_id: "", + }); + if (res.success) { + alert("PAA启动成功"); + } else { + alert("PAA启动失败"); + } }), post_stop_PAA: thunk(async (state, payload, { getState }) => { const res = await postPAAStop(); - console.log(res); + if (res.success) { + alert("PAA停止成功"); + state.setState({ + current_step_index: -1, + current_step: null, + all_logs_info: [], + }); + } }), - + // todo modified need test post_delete_script: thunk(async (state, payload, { getState }) => { let props = { script_name: payload, }; const res = await postPAADeleteScript(props); + state.get_saved_scripts(); return res; }), - + // todo modified need test post_generate_script: thunk(async (state, payload, { getState }) => { let props = { - script_type: "dark", - script_setting: payload, + script_type: payload.name, + script_setting: payload.data, }; const res = await postPAAGenerate(props); - console.log(res); + // todo, 需要修改成当前脚本就是刚刚生成的 + state.setState({ + all_step_data: res.data.script, + this_script_type: res.data.type, + this_script_setting: res.data.setting, + }); + return res; }), // 更换当前运行的脚本 + // todo modified need test post_update_script: thunk(async (state, payload, { getState }) => { + // 把脚本替换成待运行的。这个理论上是不需要用的,在手机版上 let props = { script: payload.data, }; const res = await postPAAUpdate(props); if (res.success) { - alert("success"); + console.log("更换运行脚本成功"); state.setState({ - setting_mode: 2, - current_script_info: getState().all_script_info.find( - (item) => item.file_name == payload.file_name - ), + all_step_data: res.data.script, + this_script_type: res.data.type, + this_script_setting: res.data.setting, }); + // state.setState({ + // setting_mode: 1, + // current_script_info: getState().all_script_info.find((item) => item.file_name == payload.file_name) + // }) } }), - + // todo modifed need test post_save_script: thunk(async (state, payload, { getState }) => { let props = { script_name: payload, }; const res = await postPAASaveScript(props); + state.get_saved_scripts(); + state.setState({ + setting_mode: 1, + current_script_info: { + file_name: payload + ".json", + modified_time: "Now", + }, + }); }), // 获得脚本名字对应的脚本内容 + // todo 大改逻辑 + // todo modified need test post_load_script: thunk(async (state, payload, { getState }) => { const props = { - script_name: payload, + script_name: payload.file_name, }; const res = await postPAALoadSavedScript(props); - return res; + if (res.success) { + state.setState({ + current_script_info: payload, + setting_mode: 1, + all_step_data: res.data.script, + this_script_type: res.data.type, + this_script_setting: res.data.setting, + }); + } }), // 获得当前正在运行的脚本内容 get_current_script: thunk(async (state, payload, { getState }) => { const res = await getCurrentScript(); - // 如果current_script不在这个队列中怎么办? - state.setState({ - current_script_data: res.data, - }); + if (res.success) { + if (res.data.script.length > 0) { + state.setState({ + setting_mode: 1, + all_step_data: res.data.script, + this_script_type: res.data.type, + this_script_setting: res.data.setting, + }); + } else { + state.setState({ + setting_mode: 0, + all_step_data: [], + }); + } + } else { + state.setState({ + setting_mode: 0, + }); + } }), get_PAA_status: thunk(async (state, payload, { getState }) => { const res = await getPAAStatus(); - console.log(res); + if (res.data.flag) { + alert("当前PAA处于运行状态"); + } else { + alert("当前PAA处于关闭状态"); + } }), // 获得所有脚本 + // todo, modified, need test. get_saved_scripts: thunk(async (state, payload, { getState }) => { const res = await getSavedScripts(); if (res.success) { - const promises = res.data.map((item: any) => { - return state.post_load_script(item.file_name); + state.setState({ + all_script_info: res.data, }); + // todo, 这里不需要更新所有的脚本信息。无效的请求。 + // const promises = res.data.map((item: any) => { + // return state.post_load_script(item.file_name); + // }); - // Wait for all promises to resolve - const scriptInfos = await Promise.all(promises); + // // Wait for all promises to resolve + // const scriptInfos = await Promise.all(promises); - const updatedScriptInfo = res.data.map((item: any, index: number) => ({ - file_name: item.file_name, - modified_time: item.modified_time, - script_info: scriptInfos[index].data, - })); + // const updatedScriptInfo = res.data.map((item: any, index: number) => ({ + // file_name: item.file_name, + // modified_time: item.modified_time, + // script_info: scriptInfos[index].data, + // })); - state.setState({ - all_script_info: updatedScriptInfo, - }); + // state.setState({ + // all_script_info: updatedScriptInfo, + // }); + } + }), + + add_paa_logs: action((state, payload) => { + state.all_logs_info.unshift(payload); + const regex = /!LOOP STEP! Loop step start (\d+)\/(\d+)/; + const match = payload.message.match(regex); + + if (match && match.length === 3) { + const current = parseInt(match[1], 10); + // 获取 all_step_data 的副本 + const updatedAllStepData = [...state.all_step_data]; + + // 获取要修改的项的索引 + const indexToModify = state.current_step_index; + const subIndexToModify = state.current_step_children_index; + + // 确保索引在有效范围内 + if (indexToModify >= 0 && indexToModify < updatedAllStepData.length) { + // 修改 count 值 + if (subIndexToModify != -1) { + updatedAllStepData[indexToModify].children[ + subIndexToModify + ].params.count = current; + } else { + updatedAllStepData[indexToModify].params.count = current; + } + } + + // 更新状态 + state.all_step_data = updatedAllStepData; + } + }), + + // 1st paa change + change_paa_step: action((state, payload) => { + state.current_step_index += 1; + state.current_step_children_index = -1; + state.current_step_children_max_index = payload.data.children + ? payload.data.children.length + : 0; + state.current_step = payload; + }), + + // 2nd paa change (children) + change_paa_loop_step: action((state, payload) => { + state.current_step_children_index += 1; + state.current_step = payload; + }), + + change_paa_step_async: thunk(async (state, payload, { getState }) => { + if ( + getState().current_step_children_index + 1 === + getState().current_step_children_max_index + ) { + state.change_paa_step(payload); + } else { + state.change_paa_loop_step(payload); } }), setState: action((state, payload) => { state = Object.assign(state, payload); }), + + // modified by gao + can_start_paa: true, + paa_in_progress: false, + check_PAA_start_status: thunk(async (state, payload, { getState }) => { + const res = await getPAAUpdateStatus(); + // true meas in running + state.setState({ + paa_in_progress: res.data, + can_start_paa: !res.data, + }); + // todo, extra check camera status + }), + current_step_id: "", + paa_new_step_info_in: action((state, payload) => { + if (payload.message == "step_start") + state.current_step_id = payload.data.id; + }), + paa_new_log_info_in: action((state, payload) => { + state.all_logs_info.unshift(payload); + }), }); diff --git a/websrc/cobalt-web/src/store/ProcessDataSave.ts b/websrc/cobalt-web/src/store/ProcessDataSave.ts index 0903f389..27323f13 100644 --- a/websrc/cobalt-web/src/store/ProcessDataSave.ts +++ b/websrc/cobalt-web/src/store/ProcessDataSave.ts @@ -3,20 +3,20 @@ import { Thunk, Action, Computed } from "easy-peasy"; import * as AXIOSPAAF from "../services/paa_fixed_procedure_api"; export interface IProcessDataSaveModels { - // process_ws_message: (message: any) => void; - // - // newest_camera_jpg: string |null; camera_jpg_updated: number; newest_camera_jpg_url: string; guider_jpg_updates: number; - // newest_guider_jpg: string |null; newest_guider_jpg_url: string; show_camera: number; // 0 means camera, 1 means guider HFR_points_list: ICHFRDataPointList; newest_HFR_info: ICSingleHFRPointData; PHD2_guide_data_list: ICPHD2GuideDataPointList; + PHD2_calibration_result: ICPHD2InterfaceCalibrationResult; + PHD2_calibrated: boolean; send_ws_message_handler: ((message: any) => void) | null; registered: Computed; + // + setState: Action>; at_start_add_ws_listener: Action< IProcessDataSaveModels, (message: any) => void @@ -27,7 +27,7 @@ export interface IProcessDataSaveModels { IProcessDataSaveModels, ICSingleHFRPointData >; - fetch_history_PHD2_guide_data: Thunk; + fetch_history_PHD2_guide_data: Action; append_newest_PHD2_guide_data: Action< IProcessDataSaveModels, ICPHD2InterfaceGuideStep @@ -69,6 +69,17 @@ export const ProcessDataSaveModel = (): IProcessDataSaveModels => ({ RaControl: [], DecControl: [], }, + PHD2_calibration_result: { + calibrated: false, + xAngle: 0, + xRate: 0, + xParity: "+", + yAngle: 0, + yRate: 0, + yParity: "+", + declination: 0, + }, + PHD2_calibrated: false, send_ws_message_handler: null, registered: computed((state) => { if (state.send_ws_message_handler != null) { @@ -77,6 +88,9 @@ export const ProcessDataSaveModel = (): IProcessDataSaveModels => ({ return false; } }), + setState: action((state, payload) => { + state = Object.assign(state, payload); + }), at_start_add_ws_listener: action((state, payload) => { // const {sendMessage, removeListener} = useEchoWebSocket(process_ws_message); state.send_ws_message_handler = payload; @@ -94,21 +108,29 @@ export const ProcessDataSaveModel = (): IProcessDataSaveModels => ({ state.HFR_points_list.star_count.push(payload.star_count); state.newest_HFR_info = payload; }), - fetch_history_PHD2_guide_data: thunk(async (actions) => {}), + fetch_history_PHD2_guide_data: action((state, pyaload) => {}), append_newest_PHD2_guide_data: action((state, payload) => { state.PHD2_guide_data_list.dx.push(payload.dx); state.PHD2_guide_data_list.dy.push(payload.dy); state.PHD2_guide_data_list.RaDistance.push(payload.RADistanceRaw); state.PHD2_guide_data_list.DecDistance.push(payload.DECDistanceRaw); if (payload.RADirection == "East") { - state.PHD2_guide_data_list.RaControl.push(payload.RADuration); + state.PHD2_guide_data_list.RaControl.push(payload.RADistanceGuide); } else { - state.PHD2_guide_data_list.RaControl.push(-payload.RADuration); + state.PHD2_guide_data_list.RaControl.push(-payload.RADistanceGuide); } if (payload.DECDirection == "North") { - state.PHD2_guide_data_list.DecControl.push(payload.DECDuration); + state.PHD2_guide_data_list.DecControl.push(payload.DECDistanceGuide); } else { - state.PHD2_guide_data_list.DecControl.push(-payload.DECDuration); + state.PHD2_guide_data_list.DecControl.push(-payload.DECDistanceGuide); + } + if (state.PHD2_guide_data_list.dx.length > 300) { + state.PHD2_guide_data_list.dx.shift(); + state.PHD2_guide_data_list.dy.shift(); + state.PHD2_guide_data_list.RaDistance.shift(); + state.PHD2_guide_data_list.DecDistance.shift(); + state.PHD2_guide_data_list.RaControl.shift(); + state.PHD2_guide_data_list.DecControl.shift(); } }), // update_jpg_data: action((state, payload) => { @@ -142,7 +164,7 @@ export const ProcessDataSaveModel = (): IProcessDataSaveModels => ({ if (payload.device.includes("camera")) { state.newest_camera_jpg_url = payload.data; state.camera_jpg_updated = state.camera_jpg_updated + 1; - console.log("before generating url", typeof payload.data); + // console.log('before generating url', typeof(payload.data)); // let new_url = URL.createObjectURL(payload.data); // console.log(new_url); // if (state.newest_camera_jpg_url !== null){ diff --git a/websrc/cobalt-web/src/store/ScheduledTargetList.ts b/websrc/cobalt-web/src/store/ScheduledTargetList.ts index 07d9ee5f..6594405c 100644 --- a/websrc/cobalt-web/src/store/ScheduledTargetList.ts +++ b/websrc/cobalt-web/src/store/ScheduledTargetList.ts @@ -1,194 +1,253 @@ -import { createStore, action, thunk, computed } from 'easy-peasy'; -import {Thunk, Action, Computed } from 'easy-peasy'; +import { createStore, action, thunk, computed } from "easy-peasy"; +import { Thunk, Action, Computed } from "easy-peasy"; import { DateTime } from "luxon"; -import * as AXIOSOF from '../services/object_finding_api'; +import * as AXIOSOF from "../services/object_finding_api"; interface update_string { - index: number, - update_string: string, + index: number; + update_string: string; } const all_available_tags = [ - '星云', '星系', '黑白目标', '彩机目标', 'LRGB', 'HSO', '双窄' -] + "星云", + "星系", + "黑白目标", + "彩机目标", + "LRGB", + "HSO", + "双窄", +]; - -function isFramingObject(target_info: IDSOFramingObjectInfo | IDSOObjectInfo): target_info is IDSOFramingObjectInfo { - return 'rotation' in target_info; +function isFramingObject( + target_info: IDSOFramingObjectInfo | IDSOObjectInfo +): target_info is IDSOFramingObjectInfo { + return "rotation" in target_info; } - export interface ISTargetListModels { - current_focus_target: IDSOFramingObjectInfo; - current_focus_index: number | null; - need_focus: boolean; - all_tags: Array; - all_saved_targets: Array; - twilight_data: ITwilightData; - //-------------------------------- - add_target_and_focus: Action; - change_focus_target: Action; - change_saved_focus_target: Action; - update_focus_target_by_framing: Action; - remove_target: Action; - target_rename: Action; - target_set_flag: Action; - target_set_tag: Action; - clear_focus_target: Action; - check_one_target: Action; - clear_all_checked: Action; - fetch_twilight_data: Thunk; - update_twilight_data: Action; - // get_targets_by_flag: Action; - // get_targets_by_tag: Action; - // load_user_local_data + current_focus_target: IDSOFramingObjectInfo; + current_focus_index: number | null; + need_focus: boolean; + all_tags: Array; + all_saved_targets: Array; + twilight_data: ITwilightData; + //-------------------------------- + add_target_and_focus: Action; + change_focus_target: Action; + change_saved_focus_target: Action; + update_focus_target_by_framing: Action< + ISTargetListModels, + IDSOFramingObjectInfo + >; + remove_target: Action; + target_rename: Action; + target_set_flag: Action; + target_set_tag: Action; + clear_focus_target: Action; + check_one_target: Action; + clear_all_checked: Action; + fetch_twilight_data: Thunk; + update_twilight_data: Action; + // get_targets_by_flag: Action; + // get_targets_by_tag: Action; + // load_user_local_data + save_all_targets: Action; + load_all_targets: Action; } // todo, load user local saved data. -export const ScheduledTargetListStore = ():ISTargetListModels =>({ - current_focus_target: { - name: '', ra: 0, dec: 0, - rotation: undefined, - flag: '', - tag: '', - target_type: '', - bmag: undefined, - vmag: undefined, - size: undefined, - checked: false, +export const ScheduledTargetListStore = (): ISTargetListModels => ({ + current_focus_target: { + name: "", + ra: 0, + dec: 0, + rotation: undefined, + flag: "", + tag: "", + target_type: "", + size: undefined, + checked: false, + }, + current_focus_index: null, + need_focus: false, + all_saved_targets: [], + all_tags: all_available_tags, + twilight_data: { + evening: { + sun_set_time: new Date(2023, 1, 1, 18, 0, 0), + evening_civil_time: new Date(2023, 1, 1, 18, 0, 0), + evening_nautical_time: new Date(2023, 1, 1, 18, 0, 0), + evening_astro_time: new Date(2023, 1, 1, 18, 0, 0), }, - current_focus_index: null, - need_focus: false, - all_saved_targets: [], - all_tags: all_available_tags, - twilight_data: { - evening: { - sun_set_time: new Date(2023, 1, 1, 18, 0, 0), - evening_civil_time: new Date(2023, 1, 1, 18, 0, 0), - evening_nautical_time: new Date(2023, 1, 1, 18, 0, 0), - evening_astro_time: new Date(2023, 1, 1, 18, 0, 0) - }, - morning: { - sun_rise_time: new Date(2023, 1, 1, 18, 0, 0), - morning_civil_time: new Date(2023, 1, 1, 18, 0, 0), - morning_nautical_time: new Date(2023, 1, 1, 18, 0, 0), - morning_astro_time: new Date(2023, 1, 1, 18, 0, 0) - } + morning: { + sun_rise_time: new Date(2023, 1, 1, 18, 0, 0), + morning_civil_time: new Date(2023, 1, 1, 18, 0, 0), + morning_nautical_time: new Date(2023, 1, 1, 18, 0, 0), + morning_astro_time: new Date(2023, 1, 1, 18, 0, 0), }, - add_target_and_focus: action((state, payload) => { - state.all_saved_targets.push(payload); - state.current_focus_target = payload; - state.current_focus_index = state.all_saved_targets.length - 1; - state.need_focus = true; - }), - change_focus_target: action((state, payload) => { - state.current_focus_target = payload; - state.current_focus_index = null; - state.need_focus = true; - }), - change_saved_focus_target: action((state, payload) => { - state.current_focus_target = state.all_saved_targets[payload]; - state.current_focus_index = payload; - state.need_focus = true; - }), - update_focus_target_by_framing: action((state, payload) => { // note do not use, it is not tested and verified. - state.current_focus_target = payload; - state.need_focus = true; - }), - remove_target: action((state, payload) => { - if (payload < state.all_saved_targets.length){ - state.all_saved_targets.splice(payload, 1); - state.current_focus_index = null; - } - }), - target_rename: action((state, payload) => { - // state.all_saved_targets.map((one_target, index) => { - // if (index == payload.index){ - // one_target.name = payload.update_string; - // } - // }) - if (payload.index < state.all_saved_targets.length){ - state.all_saved_targets[payload.index].name = payload.update_string; - } - }), - target_set_flag: action((state, payload) => { - // state.all_saved_targets.map((one_target, index) => { - // if (index == payload.index){ - // one_target.flag = payload.update_string; - // } - // }) - if (payload.index < state.all_saved_targets.length){ - state.all_saved_targets[payload.index].flag = payload.update_string; - } - }), - target_set_tag: action((state, payload) => { - // if (payload.update_string in all_available_tags){ - // state.all_saved_targets.map((one_target, index) => { - // if (index == payload.index){ - // one_target.tag = payload.update_string; - // } - // }) - // } - if (payload.update_string in all_available_tags){ - if (payload.index < state.all_saved_targets.length){ - state.all_saved_targets[payload.index].tag = payload.update_string; - } - } - }), - clear_focus_target: action((state)=>{ - state.current_focus_target = { - name: '-', ra: 0, dec: 0, - rotation: undefined, - flag: '', - tag: '', - target_type: '', - bmag: undefined, - vmag: undefined, - size: undefined, - checked: false, - } - state.current_focus_index = null; - }), - check_one_target: action((state, payload) => { - state.all_saved_targets[payload].checked = true; - }), - clear_all_checked: action((state) => { - for (let i = 0; i { - let res_data = await AXIOSOF.getTwilightData(); - if (res_data.success){ - actions.update_twilight_data(res_data.data); - } - }), - update_twilight_data: action((state, payload) => { - state.twilight_data = { - evening: { - sun_set_time: DateTime.fromFormat(payload.evening.sun_set_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - evening_civil_time: DateTime.fromFormat(payload.evening.evening_civil_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - evening_nautical_time: DateTime.fromFormat(payload.evening.evening_nautical_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - evening_astro_time: DateTime.fromFormat(payload.evening.evening_astro_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - }, - morning: { - sun_rise_time: DateTime.fromFormat(payload.morning.sun_rise_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - morning_civil_time: DateTime.fromFormat(payload.morning.morning_civil_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - morning_nautical_time: DateTime.fromFormat(payload.morning.morning_nautical_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - morning_astro_time: DateTime.fromFormat(payload.morning.morning_astro_time, 'yyyy-MM-dd HH:mm:ss').toJSDate(), - } - } - }), - // get_targets_by_flag: action((state, payload) => { - // let result = []; - // for(let i=0;i { + state.all_saved_targets.push(payload); + state.current_focus_target = payload; + state.current_focus_index = state.all_saved_targets.length - 1; + state.need_focus = true; + }), + change_focus_target: action((state, payload) => { + state.current_focus_target = payload; + state.current_focus_index = null; + state.need_focus = true; + }), + change_saved_focus_target: action((state, payload) => { + state.current_focus_target = state.all_saved_targets[payload]; + state.current_focus_index = payload; + state.need_focus = true; + }), + update_focus_target_by_framing: action((state, payload) => { + // note do not use, it is not tested and verified. + state.current_focus_target = payload; + state.need_focus = true; + }), + remove_target: action((state, payload) => { + if (payload < state.all_saved_targets.length) { + state.all_saved_targets.splice(payload, 1); + state.current_focus_index = null; + } + }), + target_rename: action((state, payload) => { + // state.all_saved_targets.map((one_target, index) => { + // if (index == payload.index){ + // one_target.name = payload.update_string; // } - // return result; - // }), - // get_targets_by_tag: action((state, payload) => { - - // }), -}) \ No newline at end of file + // }) + if (payload.index < state.all_saved_targets.length) { + state.all_saved_targets[payload.index].name = payload.update_string; + } + }), + target_set_flag: action((state, payload) => { + // state.all_saved_targets.map((one_target, index) => { + // if (index == payload.index){ + // one_target.flag = payload.update_string; + // } + // }) + if (payload.index < state.all_saved_targets.length) { + state.all_saved_targets[payload.index].flag = payload.update_string; + } + }), + target_set_tag: action((state, payload) => { + // if (payload.update_string in all_available_tags){ + // state.all_saved_targets.map((one_target, index) => { + // if (index == payload.index){ + // one_target.tag = payload.update_string; + // } + // }) + // } + if (payload.update_string in all_available_tags) { + if (payload.index < state.all_saved_targets.length) { + state.all_saved_targets[payload.index].tag = payload.update_string; + } + } + }), + clear_focus_target: action((state) => { + state.current_focus_target = { + name: "-", + ra: 0, + dec: 0, + rotation: undefined, + flag: "", + tag: "", + target_type: "", + size: undefined, + checked: false, + }; + state.current_focus_index = null; + }), + check_one_target: action((state, payload) => { + state.all_saved_targets[payload].checked = true; + }), + clear_all_checked: action((state) => { + for (let i = 0; i < state.all_saved_targets.length; i++) { + state.all_saved_targets[i].checked = false; + } + }), + fetch_twilight_data: thunk(async (actions) => { + let res_data = await AXIOSOF.getTwilightData(); + if (res_data.success) { + actions.update_twilight_data(res_data.data); + } + }), + update_twilight_data: action((state, payload) => { + state.twilight_data = { + evening: { + sun_set_time: DateTime.fromFormat( + payload.evening.sun_set_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + evening_civil_time: DateTime.fromFormat( + payload.evening.evening_civil_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + evening_nautical_time: DateTime.fromFormat( + payload.evening.evening_nautical_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + evening_astro_time: DateTime.fromFormat( + payload.evening.evening_astro_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + }, + morning: { + sun_rise_time: DateTime.fromFormat( + payload.morning.sun_rise_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + morning_civil_time: DateTime.fromFormat( + payload.morning.morning_civil_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + morning_nautical_time: DateTime.fromFormat( + payload.morning.morning_nautical_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + morning_astro_time: DateTime.fromFormat( + payload.morning.morning_astro_time, + "yyyy-MM-dd HH:mm:ss" + ).toJSDate(), + }, + }; + }), + // get_targets_by_flag: action((state, payload) => { + // let result = []; + // for(let i=0;i { + + // }), + save_all_targets: action((state) => { + let to_save_array = state.all_saved_targets.map((obj) => ({ + name: obj.name, + ra: obj.ra, + dec: obj.dec, + rotation: obj.rotation, + flag: obj.flag, + tag: obj.tag, + target_type: obj.target_type, + size: obj.size, + checked: false, + })); + // console.log('saving', to_save_array); + localStorage.setItem("TargetList", JSON.stringify(to_save_array)); + }), + load_all_targets: action((state) => { + let data = localStorage.getItem("TargetList"); + if (data != null) { + let list_data = JSON.parse(data) as IDSOFramingObjectInfo[]; + // console.log('loaded list', list_data); + state.all_saved_targets = list_data; + } + }), +}); diff --git a/websrc/cobalt-web/src/store/connectModel.ts b/websrc/cobalt-web/src/store/connectModel.ts index aec58fab..43db7493 100644 --- a/websrc/cobalt-web/src/store/connectModel.ts +++ b/websrc/cobalt-web/src/store/connectModel.ts @@ -4,10 +4,20 @@ import { GetCurrentDeviceProfile, getDeviceBrand, getDeviceList, + getDriverServerStatus, + postCheckPhd2, + postCloseDeviceServer, + postConnectPhd2, postDeviceStatus, postStartDeviceServer, + postStartPhd2, } from "../services/api"; -import { postGLobalParameterOnStart } from "../services/global_parameter_api"; +import { + postGlobalLoadProfile, + postGLobalParameterOnStart, + postGLobalParameterProfileDelete, +} from "../services/global_parameter_api"; +import { filter, values } from "lodash"; interface DeviceSelection { device_name: string; @@ -28,7 +38,13 @@ interface Phd2Config { calibration_distance: number; } -type AllowedDeviceTypes = "telescope" | "camera" | "focus" | "filter" | "polar"; +type AllowedDeviceTypes = + | "telescope" + | "camera" + | "focus" + | "filter" + | "polar" + | "guider"; let deviceType: AllowedDeviceTypes = "telescope"; export interface ConnectModel { @@ -42,7 +58,7 @@ export interface ConnectModel { // 所有的device device_list: any | null; // 所有的brand类别 - brand_type_en: any; + brand_type_en: Array; brand_type_cn: any; brand_connection: any; // 所有的用户配置 @@ -66,13 +82,13 @@ export interface ConnectModel { all_profiles: []; // 用户选择的brand - brand_selections: any | null; + brand_selections: IConnectSelectedBrandList; device_selections: any | null; setState: Action>; setSelectBrand: Action< ConnectModel, - { type: string; brand_name: string | null } + { type: AllowedDeviceTypes; brand_name: IConnectBrandSelection } >; setSelectDevice: Action; resetDeviceSelections: Action; @@ -92,18 +108,23 @@ export interface ConnectModel { // 注意,前端维护用户userConfigList,但是这个应该要用到localStorage等方法 connectDeviceServer: Thunk; + closeDeviceServer: Thunk; connectDevice: Thunk; + + // 用于一口气刷新所有device的connect状态的 + refreshDeviceConnectionStatus: Thunk; + setBrandInLoading: Action; } export const getConnectModel = (): ConnectModel => ({ brand_list: null, brand_selections: { - camera: "", - telescope: "", - guider: "", - focus: "", - filter: "", - polar: "", + camera: { zh: "", en: "", driver: "" }, + telescope: { zh: "", en: "", driver: "" }, + guider: { zh: "", en: "", driver: "" }, + focus: { zh: "", en: "", driver: "" }, + filter: { zh: "", en: "", driver: "" }, + polar: { zh: "", en: "", driver: "" }, }, allDrivers: [], device_list: null, @@ -140,7 +161,7 @@ export const getConnectModel = (): ConnectModel => ({ }, phd2_connect_ready: false, - // 0:未选中,1:连接失败, 2:连接成功 + // 0:未选中,1:连接失败, 2:连接成功,-1更新中 brand_connection: { telescope: 0, camera: 0, @@ -229,17 +250,22 @@ export const getConnectModel = (): ConnectModel => ({ }); } } + console.log(getState().device_selections); } }), setProfile: thunk(async (state, payload, { getState }) => { - await postGlobalLoadProfile(payload); + if (payload == "") { + state.resetDeviceSelections(); + } else { + await postGlobalLoadProfile(payload); - // 调用一次重新获取 - await state.getProfileList(); + // 调用一次重新获取 + await state.getProfileList(); - // 更新当前页面 - await state.getProfileDevice(); + // 更新当前页面 + await state.getProfileDevice(); + } }), deleteProfile: thunk(async (state, payload, { getState }) => { @@ -280,6 +306,7 @@ export const getConnectModel = (): ConnectModel => ({ const filteredData = res.data.filter( (item: { device_name: string }) => item.device_name !== "" ); + // 加载失败 if (filteredData.length == 0) { return false; @@ -376,20 +403,24 @@ export const getConnectModel = (): ConnectModel => ({ connectDeviceServer: thunk(async (state, payload, { getState }) => { let postBrandData: string[] = []; - if (getState().brand_selections === null) { - alert("当前尚未选择品牌,请选择!"); - } else { - state.resetDeviceSelections(); - Object.entries( - getState().brand_selections as Record - ).forEach(async ([device, values]) => { - if (values != "") { + state.resetDeviceSelections(); + Object.entries(getState().brand_selections).forEach( + async ([device, values]) => { + if (values.driver != "") { postBrandData.push(values); } - }); - const res = await postStartDeviceServer(postBrandData); - return res; + } + ); + if (postBrandData.length == 0) { + return false; } + const res = await postStartDeviceServer(postBrandData); + return res; + }), + + closeDeviceServer: thunk(async (state, payload, { getState }) => { + const res = await postCloseDeviceServer(); + return res; }), // 正式连接,一个一个连,生成连接状态并且即时返回给用户 @@ -460,10 +491,10 @@ export const getConnectModel = (): ConnectModel => ({ startPhd2: thunk(async (state) => { try { const res = await postStartPhd2(); - if (res.data == true) { + if (res.data.flag == true) { await Sleep(1000); const res2 = await postConnectPhd2(); - if (res2.data === true) { + if (res2.data.flag === true) { return true; } } @@ -472,6 +503,45 @@ export const getConnectModel = (): ConnectModel => ({ return false; } }), + + refreshDeviceConnectionStatus: thunk(async (state, payload, { getState }) => { + let to_update_devices = [ + "camera", + "telescope", + "focus", + "guider", + "filter", + ]; + to_update_devices.map(async (device, index) => { + state.setBrandInLoading({ device: device, flag: true }); + try { + const res = await postDeviceStatus({ + device: device, + }); + // 回显 + if (res && res.data === "Connected") { + state.setState({ + brand_connection: { ...getState().brand_connection, [device]: 2 }, + }); + } else { + state.setState({ + brand_connection: { ...getState().brand_connection, [device]: 1 }, + }); + } + } catch (error) { + state.setState({ + brand_connection: { ...getState().brand_connection, [device]: 1 }, + }); + } + }); + }), + setBrandInLoading: action((state, payload) => { + if (payload.flag) { + state.brand_connection[payload.device] = -1; + } else { + state.brand_connection[payload.device] = 0; + } + }), }); const Sleep = (ms: number) => { diff --git a/websrc/cobalt-web/src/theme.tsx b/websrc/cobalt-web/src/theme.tsx new file mode 100644 index 00000000..744cc10a --- /dev/null +++ b/websrc/cobalt-web/src/theme.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import { ThemeProvider } from "styled-components"; +import { createGlobalStyle } from "styled-components"; +import { Container } from "react-bootstrap"; + +const darkTheme = { + palette: { + mode: "dark", + primary: { + main: "#3f51b5", + }, + secondary: { + main: "#f50057", + }, + success: { + main: "#388e3c", + }, + }, +}; + +const GlobalStyle = createGlobalStyle` + body { + background-color: ${({ theme }) => + theme.palette.mode === "dark" ? "#121212" : "#fff"}; + color: ${({ theme }) => (theme.palette.mode === "dark" ? "#fff" : "#000")}; + } + + .btn { + border-radius: 8px; + } + + .btn-link { + border-radius: 8px; + } + + .form-control { + background-color: rgba(255, 255, 255, 0.5); + } + + .form-control:focus { + background-color: rgba(255, 255, 255, 0.5); + } +`; + +export const CustomThemeProvider: React.FC = ({ children }) => { + return ( + + + {children} + + ); +}; diff --git a/websrc/cobalt-web/src/utils/combineProviders.tsx b/websrc/cobalt-web/src/utils/combineProviders.tsx index 516f2139..75909bd7 100644 --- a/websrc/cobalt-web/src/utils/combineProviders.tsx +++ b/websrc/cobalt-web/src/utils/combineProviders.tsx @@ -39,15 +39,9 @@ type ProviderList = Array; export const combineProviders = ( list: ProviderList, children: React.ReactNode -) => { - const filteredList = list.filter(Boolean) as Array; - - if (filteredList.length === 0) { - return <>{children}; - } - - return filteredList.reduceRight( - (acc, Provider) => {acc}, - <>{children} - ); -}; +) => + ( + list + // filter out falsy items + .filter(Boolean) as Array + ).reduceRight((acc, Provider) => {acc}, <>{children}); diff --git a/websrc/cobalt-web/src/utils/websocket.tsx b/websrc/cobalt-web/src/utils/websocket.tsx index 578e28ac..dda34b4b 100644 --- a/websrc/cobalt-web/src/utils/websocket.tsx +++ b/websrc/cobalt-web/src/utils/websocket.tsx @@ -1,8 +1,8 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState } from "react"; export interface WebsocketProps { url: string; - onMessage: (data:any) => void; + onMessage: (data: any) => void; onOpen: (event: Event, websocket: WebSocket) => void; keepAliveInterval?: number; onClose?: (event: Event, websocket: WebSocket) => void; @@ -12,8 +12,8 @@ const keepAlive = (websocket: WebSocket, interval: number) => { setTimeout(() => { websocket.send( JSON.stringify({ - method: 'ping', - }), + method: "ping", + }) ); keepAlive(websocket, interval); }, interval); @@ -59,4 +59,4 @@ export const Websocket = ({ }, [onMessage]); return null; -}; \ No newline at end of file +}; diff --git a/websrc/cobalt-web/src/utils/websocketProvider.tsx b/websrc/cobalt-web/src/utils/websocketProvider.tsx index 1a283311..4d742fce 100644 --- a/websrc/cobalt-web/src/utils/websocketProvider.tsx +++ b/websrc/cobalt-web/src/utils/websocketProvider.tsx @@ -1,11 +1,4 @@ -import React, { - createContext, - FC, - useContext, - useEffect, - useMemo, - useState, -} from "react"; +import React, { ReactNode, useContext, useEffect, useState } from "react"; import { Websocket } from "./websocket"; let ws_url = ""; @@ -16,20 +9,15 @@ if (process.env.NODE_ENV === "development") { ws_url += "/ws/indi_client/"; } -type EchoWebSocketContextType = [ - addListener: (event: any, filter?: string) => void, - sendMessage: (event: any) => void, - removeListener: (fn: any) => void +export type EchoWebSocketContextType = [ + (event: any, filter?: string) => void, + (event: any) => void, + (fn: any) => void ]; -const EchoWebSocketContext = createContext([ - () => {}, - () => {}, - () => {}, -]); +export const EchoWebSocketContext = + React.createContext([() => {}, () => {}, () => {}]); -interface IProps {} - -export const EchoWebSocketProvider: FC = ({ children }) => { +export const EchoWebSocketProvider: React.FC = ({ children }) => { const [webSocket, setWebSocket] = useState(null); const [listeners, setListeners] = useState<{ [key: string]: ((event: any) => void)[]; @@ -48,7 +36,7 @@ export const EchoWebSocketProvider: FC = ({ children }) => { setListeners((currentListeners) => { return { ...currentListeners, - any: currentListeners.any.filter((listener) => listener !== fn), + any: currentListeners["any"].filter((listener) => listener !== fn), }; }); }; @@ -69,22 +57,10 @@ export const EchoWebSocketProvider: FC = ({ children }) => { listeners.any.forEach((listener) => listener(event)); } }; - - const webSocketValue = useMemo( - () => [addListener, sendMessage, removeListener], - [addListener, sendMessage, removeListener] - ); - - useEffect(() => { - if (webSocket) { - return () => { - webSocket.close(); - }; - } - }, [webSocket]); - return ( - + { @@ -104,16 +80,10 @@ export const useEchoWebSocket = ( ) => { const [addListener, sendMessage, removeListener] = useContext(EchoWebSocketContext); - useEffect(() => { if (listener) { addListener(listener, filter); } - return () => { - if (listener) { - removeListener(listener); - } - }; }, []); return { sendMessage, removeListener }; From 16c01289e90e4953deba920a0b5d2011b0edae60 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Fri, 5 Apr 2024 19:54:22 +0800 Subject: [PATCH 03/28] update asi and toup camera driver --- CMakeLists.txt | 1 + driver/camera/atom-asi/_component.cpp | 0 driver/camera/atom-asi/_component.hpp | 0 driver/camera/atom-asi/camera.cpp | 469 ++++++++++++++++++ driver/camera/atom-asi/camera.hpp | 121 +++++ driver/camera/atom-asi/package.json | 35 ++ driver/camera/atom-touptek/_component.cpp | 0 driver/camera/atom-touptek/_component.hpp | 0 driver/camera/atom-touptek/camera.cpp | 111 +++++ driver/camera/atom-touptek/camera.hpp | 101 ++++ .../atom-touptek/detail/libtoupbase.cpp | 46 ++ .../atom-touptek/detail/libtoupbase.hpp | 91 ++++ driver/camera/atom-touptek/package.json | 35 ++ .../filterwheel/atom-touptek/_component.cpp | 0 .../filterwheel/atom-touptek/_component.hpp | 0 src/atom/driver/camera.cpp | 60 ++- src/atom/driver/camera.hpp | 4 + src/atom/driver/device.cpp | 16 +- 18 files changed, 1077 insertions(+), 13 deletions(-) create mode 100644 driver/camera/atom-asi/_component.cpp create mode 100644 driver/camera/atom-asi/_component.hpp create mode 100644 driver/camera/atom-asi/camera.cpp create mode 100644 driver/camera/atom-asi/camera.hpp create mode 100644 driver/camera/atom-asi/package.json create mode 100644 driver/camera/atom-touptek/_component.cpp create mode 100644 driver/camera/atom-touptek/_component.hpp create mode 100644 driver/camera/atom-touptek/camera.cpp create mode 100644 driver/camera/atom-touptek/camera.hpp create mode 100644 driver/camera/atom-touptek/detail/libtoupbase.cpp create mode 100644 driver/camera/atom-touptek/detail/libtoupbase.hpp create mode 100644 driver/camera/atom-touptek/package.json create mode 100644 driver/filterwheel/atom-touptek/_component.cpp create mode 100644 driver/filterwheel/atom-touptek/_component.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a57e6dd..4def3720 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,7 @@ endif(APPLE) # Lithium includes include_directories(${CMAKE_SOURCE_DIR}/libs/) +include_directories(${CMAKE_SOURCE_DIR}/driverlibs/) include_directories(${lithium_src_dir}) include_directories(${lithium_module_dir}) include_directories(${lithium_src_dir}) diff --git a/driver/camera/atom-asi/_component.cpp b/driver/camera/atom-asi/_component.cpp new file mode 100644 index 00000000..e69de29b diff --git a/driver/camera/atom-asi/_component.hpp b/driver/camera/atom-asi/_component.hpp new file mode 100644 index 00000000..e69de29b diff --git a/driver/camera/atom-asi/camera.cpp b/driver/camera/atom-asi/camera.cpp new file mode 100644 index 00000000..ee54b666 --- /dev/null +++ b/driver/camera/atom-asi/camera.cpp @@ -0,0 +1,469 @@ +/* + * camera.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-3-29 + +Description: ASICamera Simulator and Basic Definition + +**************************************************/ + +#include "camera.hpp" + +#include "atom/log/loguru.hpp" + +#include + +#define ASI_CAMERA_CONNECTION_CHECK \ + if (is_connected.load()) { \ + LOG_F(WARNING, "Camera already connected"); \ + return true; \ + } + +#define ASI_CAMERA_CONNECT_CHECK \ + if (!is_connected.load()) { \ + LOG_F(ERROR, "Camera not connected"); \ + return false; \ + } + +#define ASI_CAMERA_EXPOSURE_CHECK \ + if (is_exposing.load()) { \ + LOG_F(ERROR, "Camera is exposing"); \ + return false; \ + } + +#define ASI_CAMERA_VIDEO_CHECK \ + if (is_videoing.load()) { \ + LOG_F(ERROR, "Camera is videoing"); \ + return false; \ + } + +using ImgBufferPtr = std::unique_ptr; + +ASICamera::ASICamera(const std::string &name) : AtomDriver(name) {} + +ASICamera::~ASICamera() {} + +bool ASICamera::initialize() { + AtomCamera::initialize(); + + registerVariable("CAMERA_COUNT", 0, "the number of connected cameras"); + return true; +} + +bool ASICamera::destroy() { + AtomCamera::destroy(); + return true; +} + +bool ASICamera::connect(const json ¶ms) { + ASI_CAMERA_CONNECTION_CHECK; + if (!params.contains("name")) { + LOG_F(ERROR, "No camera name provided"); + return false; + } + auto camera_name = params["name"].get(); + + auto camera_count = ASIGetNumOfConnectedCameras(); + if (camera_count <= 0) { + LOG_F(ERROR, + "ASI camera not found, please check the power supply or make " + "sure the camera is connected."); + return false; + } + for (int i = 0; i < camera_count; i++) { + /*获取相机信息*/ + if ((errCode = ASIGetCameraProperty(&ASICameraInfo, i)) != + ASI_SUCCESS) { + LOG_F(ERROR, + "Unable to get {} configuration information,the error " + "code is {},please check program permissions.\n", + ASICameraInfo.Name, errCode); + return false; + } + if (ASICameraInfo.Name == camera_name) { + LOG_F(INFO, "Find camera {}", ASICameraInfo.Name); + // Max: The member variable is faster than component variable + setVariable("DEVICE_ID", ASICameraInfo.CameraID); + setVariable("DEVICE_NAME", ASICameraInfo.Name); + m_camera_id = ASICameraInfo.CameraID; + m_camera_name = ASICameraInfo.Name; + /*打开相机*/ + if ((errCode = ASIOpenCamera(ASICameraInfo.CameraID)) != + ASI_SUCCESS) { + LOG_F(ERROR,"Unable to turn on the {}, error code: {}."), + ASICameraInfo.Name, errCode); + return false; + } + /*初始化相机*/ + if ((errCode = ASIInitCamera(ASICameraInfo.CameraID)) != + ASI_SUCCESS) { + LOG_F(ERROR, + "Unable to initialize connection to " + "camera,the error code is {}.", + errCode); + return false; + } + setVariable("DEVICE_CONNECTED", true); + is_connected.store(true); + LOG_F(INFO, "Camera connected successfully\n") + updateCameraInfo(); + return true; + } else { + LOG_F(ERROR, "This is not a designated camera"); + } + } + LOG_F(ERROR, "No camera found"); + return false; +} + +bool ASICamera::disconnect(const json ¶ms) { /*在关闭相机之前停止所有任务*/ + ASI_CAMERA_CONNECT_CHECK; + if (!params.empty()) { + LOG_F(ERROR, "No parameters are allowed"); + return false; + } + + if (is_videoing.load()) { + if ((errCode = ASIStopVideoCapture(m_camera_id)) != + ASI_SUCCESS) // 停止视频拍摄 + { + LOG_F(ERROR, + "Unable to stop video capture,error code is {},please try " + "again.", + errCode); + return false; + } + is_videoing.store(false); + setVariable("CCD_VIDEO_STATUS", false); + LOG_F(INFO, "Stop video capture"); + } + if (is_exposing.load()) { + if ((errCode = ASIStopExposure(m_camera_id)) != + ASI_SUCCESS) // 停止曝光 + { + LOG_F(ERROR, + "Unable to stop exposure,error code is {}, please try again.", + errCode) + return false; + } + is_exposing.store(false); + setVariable("CCD_EXPOSURE_STATUS", false); + LOG_F(INFO, "Stop exposure"); + } + /*关闭相机*/ + if ((errCode = ASICloseCamera(m_camera_id)) != ASI_SUCCESS) // 关闭相机 + { + LOG_F(ERROR, "Unable to turn off the camera,error code: {}", errCode); + return false; + } + setVariable("DEVICE_CONNECTED", false); + is_connected.store(false); + LOG_F(INFO, "Disconnect from camera"); + return true; +} + +bool ASICamera::reconnect(const json ¶ms) { + ASI_CAMERA_CONNECT_CHECK; + int timeout = 0; + if (params.contains("timeout")) { + timeout = params["timeout"].get(); + } + + if (!disconnect({})) { + LOG_F(ERROR, "Unable to disconnect from camera"); + return false; + } + if (!connect({})) { + LOG_F(ERROR, "Unable to connect to camera"); + return false; + } + LOG_F(INFO, "Reconnect to camera: {}", + getVariable("DEVICE_NAME")); + return true; +} + +bool ASICamera::isConnected() { return is_connected.load() } + +bool ASICamera::startExposure(const double &duration) { + ASI_CAMERA_CONNECT_CHECK; + if (is_exposing.load()) { + LOG_F(ERROR, "Exposure is already in progress"); + return false; + } + + const long blink_duration = duration * 1000000; + LOG_F(INFO, "Blinking {} time(us) before exposure", blink_duration); + if ((errCode = ASISetControlValue(m_camera_id, ASI_EXPOSURE, blink_duration, + ASI_FALSE)) != ASI_SUCCESS) { + LOG_F(ERROR, "Failed to set blink exposure to {}us, error {}", + blink_duration, errCode); + return false; + } + if ((errCode = ASIStartExposure(m_camera_id, ASI_FALSE)) != ASI_SUCCESS) { + LOG_F(ERROR, "Failed to start blink exposure, error code: {}", errCode); + return false; + } + is_exposing.store(true); + setVariable("CCD_EXPOSURE_STATUS", true); + // Max: A timer is needed here + do { + usleep(10000); + errCode = ASIGetExpStatus(m_camera_id, &expStatus); + } while (errCode == ASI_SUCCESS && expStatus == ASI_EXP_WORKING); + if (errCode != ASI_SUCCESS) { + LOG_F(ERROR, "Blink exposure failed, error {}, error code: {}", errCode, + expStatus); + return false; + } + is_exposing.store(false); + setVariable("CCD_EXPOSURE_STATUS", false); + LOG_F(INFO, "Blink exposure completed"); + return true; +} + +bool ASICamera::abortExposure() { + ASI_CAMERA_CONNECT_CHECK; + if (!is_exposing.load()) { + LOG_F(ERROR, "No exposure is in progress"); + return false; + } + if ((errCode = ASIStopExposure(m_camera_id)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to stop camera exposure, error code: {}", errCode); + return false; + } + setVariable("CCD_EXPOSURE_STATUS", false); + is_exposing.store(false); + LOG_F(INFO, "Abort exposure"); + return true; +} + +bool ASICamera::getExposureStatus() { + ASI_CAMERA_CONNECT_CHECK; + if ((errCode = ASIGetExpStatus(m_camera_id, &expStatus)) != ASI_SUCCESS) { + LOG_F(INFO, "Camera is busy, status code: {}", errCode); + setVariable("CCD_EXPOSURE_STATUS", true); + is_exposing.store(true); + return true; + } + LOG_F(INFO, "Camera is idle"); + return false; +} + +bool ASICamera::getExposureResult() { + ASI_CAMERA_CONNECT_CHECK; + ASI_CAMERA_EXPOSURE_CHECK; + + long imgSize = getVariable("WIDTH") * getVariable("HEIGHT") * + (1 + (ASICAMERA->ImageType == ASI_IMG_RAW16)); + + // 使用智能指针管理图像缓冲区内存 + ImgBufferPtr imgBuf(new unsigned char[imgSize]); + + /*曝光后获取图像信息*/ + int errCode = ASIGetDataAfterExp(m_camera_id, imgBuf.get(), imgSize); + if (errCode != ASI_SUCCESS) { + // 获取图像失败 + LOG_F(ERROR, "Unable to get image from camera, error code: {}", + errCode); + return; + } + + // 图像下载完成 + LOG_F(INFO, "Download from camera completely."); + + std::string upload_mode = getVariable("UPLOAD_MODE"); + if (upload_mode == "LOCAL") [[likely]] { + // Max: image filename generation logic is needed + std::string FitsName = "test.fits"; + LOG_F(INFO, "Upload mode is LOCAL, save image to {}", FitsName) + /*将图像写入本地文件*/ + auto res = getComponent("LITHIUM_IMAGE") + ->runFunc("SaveImage", {{"filename", FitsName}, + {"data", imgBuf}, + {"size", imgSize}}); + if (res.contains("error")) { + LOG_F(ERROR, "Unable to save image to {}, error: {}", FitsName, + res["error"].get()); + return false; + } + } else if (upload_mode == "CLIENT") [[unlikely]] { + } else if (upload_mode == "None") [[unlikely]] { + LOG_F(INFO, "Upload mode is NONE, skip upload"); + } else { + LOG_F(ERROR, "Invalid upload mode: {}", upload_mode); + return false; + } + return true; +} + +bool ASICamera::saveExposureResult() { return true; } + +bool ASICamera::startVideo() { return true; } + +bool ASICamera::stopVideo() { return true; } + +bool ASICamera::getVideoStatus() { return true; } + +bool ASICamera::getVideoResult() { return true; } + +bool ASICamera::saveVideoResult() { return true; } + +bool ASICamera::startCooling() { return true; } + +bool ASICamera::stopCooling() { return true; } + +bool ASICamera::getCoolingStatus() { return true; } + +bool ASICamera::isCoolingAvailable() { return true; } + +bool ASICamera::getTemperature() { return true; } + +bool ASICamera::getCoolingPower() { return true; } + +bool ASICamera::setTemperature(const double &temperature) { + ASI_CAMERA_CONNECT_CHECK; + ASI_CAMERA_EXPOSURE_CHECK; + ASI_CAMERA_VIDEO_CHECK; + if (!is_cooling_available) { + LOG_F(ERROR, "Cooling is not available"); + return false; + } + /*转化温度参数*/ + long TargetTemp; + if (temperature > 0.5) + TargetTemp = static_cast(temperature + 0.49); + else if (temperature < 0.5) + TargetTemp = static_cast(temperature - 0.49); + else + TargetTemp = 0; + /*设置相机温度*/ + if ((errCode = ASISetControlValue(m_camera_id, ASI_TEMPERATURE, TargetTemp, + ASI_FALSE)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to set camera temperature, error code: {}", + errCode); + return false; + } + setVariable("CCD_TEMPERATURE_VALUE", TargetTemp); + LOG_F(INFO, "Set camera cooling temperature to {}", TargetTemp); + return true; +} + +bool ASICamera::setCoolingPower(const double &power) { return true; } + +bool ASICamera::getGain() { + ASI_CAMERA_CONNECT_CHECK; + long gain; + if ((errCode = ASIGetControlValue(m_camera_id, ASI_GAIN, &gain, NULL)) != + ASI_SUCCESS) { + LOG_F(ERROR, "Unable to get camera gain, error code: {}", errCode); + return false; + } + setVariable("CCD_GAIN", static_cast(gain)); + m_gain.store(static_cast(gain)); + LOG_F(INFO, "Get camera gain: {}", gain); + return true; +} + +bool ASICamera::setGain(const int &gain) { + ASI_CAMERA_CONNECT_CHECK; + ASI_CAMERA_EXPOSURE_CHECK; + ASI_CAMERA_VIDEO_CHECK; + if ((errCode = ASISetControlValue(m_camera_id, ASI_GAIN, gain, + ASI_FALSE)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to set camera gain,error code: {}", errCode); + return false; + } + setVariable("CCD_GAIN", gain); + m_gain.store(gain); + LOG_F(INFO, "Set camera gain to {}", gain); + return true; +} + +bool ASICamera::isGainAvailable() { + LOG_F(INFO, "Gain is available for {}", m_camera_name); + return true; +} + +bool ASICamera::getOffset() { + ASI_CAMERA_CONNECT_CHECK; + long offset; + if ((errCode = ASIGetControlValue(m_camera_id, ASI_BRIGHTNESS, &offset, + NULL)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to get camera offset, error code: {}", errCode); + return false; + } + setVariable("CCD_OFFSET", static_cast(offset)); + m_offset.store(static_cast(offset)); + LOG_F(INFO, "Get camera offset: {}", offset); + return true; +} + +bool ASICamera::setOffset(const int &offset) { + ASI_CAMERA_CONNECT_CHECK; + ASI_CAMERA_EXPOSURE_CHECK; + ASI_CAMERA_VIDEO_CHECK; + if ((errCode = ASISetControlValue(m_camera_id, ASI_BRIGHTNESS, offset, + ASI_FALSE)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to set camera offset, error code: {}", errCode); + return false; + } + setVariable("CCD_OFFSET", offset); + m_offset.store(offset); + LOG_F(INFO, "Set camera offset to {}", offset); + return true; +} + +bool ASICamera::isOffsetAvailable() { + LOG_F(INFO, "Offset is available for {}", m_camera_name); + return true; +} + +bool ASICamera::getISO() { + LOG_F(ERROR, "ISO is not available for {}", m_camera_name); + return false; +} + +bool ASICamera::setISO(const int &iso) { + LOG_F(ERROR, "ISO is not available for {}", m_camera_name); + return false; +} + +bool ASICamera::isISOAvailable() { + LOG_F(INFO, "ISO is not available for {}", m_camera_name); + return false; +} + +bool ASICamera::getFrame() { return true; } + +bool ASICamera::setFrame(const int &x, const int &y, const int &w, + const int &h) { + return true; +} + +bool ASICamera::isFrameSettingAvailable() { return true; } + +bool ASICamera::getBinning() { return true; } + +bool ASICamera::setBinning(const int &hor, const int &ver) { return true; } + +bool ASICamera::getFrameType() { return true; } + +bool ASICamera::setFrameType(FrameType type) { return true; } + +bool ASICamera::getUploadMode() { return true; } + +bool ASICamera::setUploadMode(UploadMode mode) { return true; } + +bool ASICamera::refreshCameraInfo() { + if ((errCode = ASIGetCameraProperty(&ASICameraInfo, i)) != ASI_SUCCESS) { + LOG_F(ERROR, "Unable to get camera information, error code: {}", + errCode); + return false; + } + return true; +} \ No newline at end of file diff --git a/driver/camera/atom-asi/camera.hpp b/driver/camera/atom-asi/camera.hpp new file mode 100644 index 00000000..1f63dec9 --- /dev/null +++ b/driver/camera/atom-asi/camera.hpp @@ -0,0 +1,121 @@ +#ifndef ATOM_ASI_COMPONENT_HPP +#define ATOM_ASI_COMPONENT_HPP + +#include "atom/driver/camera.hpp" + +#include "driverlibs/libasi/ASICamera2.h" + +#include + +class ASICamera : public AtomCamera { +public: + explicit ASICamera(const std::string &name); + ~ASICamera(); + + bool initialize() override; + bool destroy() override; + + bool connect(const json ¶ms) override; + + bool disconnect(const json ¶ms) override; + + bool reconnect(const json ¶ms) override; + + bool isConnected() override; + + bool startExposure(const double &duration); + + bool abortExposure(); + + bool getExposureStatus(); + + bool getExposureResult(); + + bool saveExposureResult(); + + bool startVideo(); + + bool stopVideo(); + + bool getVideoStatus(); + + bool getVideoResult(); + + bool saveVideoResult(); + + bool startCooling(); + + bool stopCooling(); + + bool getCoolingStatus(); + + bool isCoolingAvailable(); + + bool getTemperature(); + + bool getCoolingPower(); + + bool setTemperature(const double &temperature); + + bool setCoolingPower(const double &power); + + bool getGain(); + + bool setGain(const int &gain); + + bool isGainAvailable(); + + bool getOffset(); + + bool setOffset(const int &offset); + + bool isOffsetAvailable(); + + bool getISO(); + + bool setISO(const int &iso); + + bool isISOAvailable(); + + bool getFrame(); + + bool setFrame(const int &x, const int &y, const int &w, const int &h); + + bool isFrameSettingAvailable(); + + bool getBinning(); + + bool setBinning(const int &hor, const int &ver); + + bool getFrameType(); + + bool setFrameType(FrameType type); + + bool getUploadMode(); + + bool setUploadMode(UploadMode mode); + +private: + + bool refreshCameraInfo(); + + /*ASI相机参数*/ + ASI_CAMERA_INFO ASICameraInfo; + ASI_ERROR_CODE errCode; + ASI_EXPOSURE_STATUS expStatus; + + int m_camera_id; + std::string m_camera_name; + + std::atomic_bool is_connected; + std::atomic_bool is_exposing; + std::atomic_bool is_videoing; + std::atomic_bool is_cooling; + + bool is_cooling_available; + + std::atomic m_gain; + std::atomic m_offset; +}; + +#endif \ No newline at end of file diff --git a/driver/camera/atom-asi/package.json b/driver/camera/atom-asi/package.json new file mode 100644 index 00000000..cbd72db2 --- /dev/null +++ b/driver/camera/atom-asi/package.json @@ -0,0 +1,35 @@ +{ + "name": "Atom-Camera-ASI", + "version": "1.0.0", + "type": "shared", + "description": "Atom driver for ASI Camera", + "license": "LGPL-3.0-or-later", + "author": "Max Qian", + "repository": { + "type": "git", + "url": "https://github.com/ElementAstro/Atom-ASI" + }, + "bugs": { + "url": "https://github.com/ElementAstro/Atom-ASI/issues" + }, + "homepage": "https://github.com/ElementAstro/Atom-ASI", + "keywords": [ + "asi", + "camera", + "filter wheel" + ], + "scripts": { + "dev": "./atom-asi --standalone", + "build": "cmake --build-type=Release -- -j 4", + "lint": "clang-format -i src/*.cpp src/*.h" + }, + "dependencies": { + "asi-sdk" : "^1.34" + }, + "main": { + "ASICamera": { + "func": "getInstance", + "type" : "shared" + } + } +} \ No newline at end of file diff --git a/driver/camera/atom-touptek/_component.cpp b/driver/camera/atom-touptek/_component.cpp new file mode 100644 index 00000000..e69de29b diff --git a/driver/camera/atom-touptek/_component.hpp b/driver/camera/atom-touptek/_component.hpp new file mode 100644 index 00000000..e69de29b diff --git a/driver/camera/atom-touptek/camera.cpp b/driver/camera/atom-touptek/camera.cpp new file mode 100644 index 00000000..79814e10 --- /dev/null +++ b/driver/camera/atom-touptek/camera.cpp @@ -0,0 +1,111 @@ +/* + * camera.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-3-29 + +Description: Touptek Camera + +**************************************************/ + +#include "camera.hpp" + +#include "atom/log/loguru.hpp" + +#include + +ToupCamera::ToupCamera(const std::string &name) + : ToupCamera(name) {} + +ToupCamera::~ToupCamera() {} + +bool ToupCamera::initialize() { return true; } + +bool ToupCamera::destroy() { return true; } + +bool ToupCamera::connect(const json ¶ms) { return true; } + +bool ToupCamera::disconnect(const json ¶ms) { return true; } + +bool ToupCamera::reconnect(const json ¶ms) { return true; } + +bool ToupCamera::isConnected() { return true; } + +bool ToupCamera::startExposure(const double &duration) { return true; } + +bool ToupCamera::abortExposure() { return true; } + +bool ToupCamera::getExposureStatus() { return true; } + +bool ToupCamera::getExposureResult() { return true; } + +bool ToupCamera::saveExposureResult() { return true; } + +bool ToupCamera::startVideo() { return true; } + +bool ToupCamera::stopVideo() { return true; } + +bool ToupCamera::getVideoStatus() { return true; } + +bool ToupCamera::getVideoResult() { return true; } + +bool ToupCamera::saveVideoResult() { return true; } + +bool ToupCamera::startCooling() { return true; } + +bool ToupCamera::stopCooling() { return true; } + +bool ToupCamera::getCoolingStatus() { return true; } + +bool ToupCamera::isCoolingAvailable() { return true; } + +bool ToupCamera::getTemperature() { return true; } + +bool ToupCamera::getCoolingPower() { return true; } + +bool ToupCamera::setTemperature(const double &temperature) { return true; } + +bool ToupCamera::setCoolingPower(const double &power) { return true; } + +bool ToupCamera::getGain() { return true; } + +bool ToupCamera::setGain(const int &gain) { return true; } + +bool ToupCamera::isGainAvailable() { return true; } + +bool ToupCamera::getOffset() { return true; } + +bool ToupCamera::setOffset(const int &offset) { return true; } + +bool ToupCamera::isOffsetAvailable() { return true; } + +bool ToupCamera::getISO() { return true; } + +bool ToupCamera::setISO(const int &iso) { return true; } + +bool ToupCamera::isISOAvailable() { return true; } + +bool ToupCamera::getFrame() { return true; } + +bool ToupCamera::setFrame(const int &x, const int &y, const int &w, + const int &h) { + return true; +} + +bool ToupCamera::isFrameSettingAvailable() { return true; } + +bool ToupCamera::getBinning() { return true; } + +bool ToupCamera::setBinning(const int &hor, const int &ver) { return true; } + +bool ToupCamera::getFrameType() { return true; } + +bool ToupCamera::setFrameType(FrameType type) { return true; } + +bool ToupCamera::getUploadMode() { return true; } + +bool ToupCamera::setUploadMode(UploadMode mode) { return true; } \ No newline at end of file diff --git a/driver/camera/atom-touptek/camera.hpp b/driver/camera/atom-touptek/camera.hpp new file mode 100644 index 00000000..c38cf62b --- /dev/null +++ b/driver/camera/atom-touptek/camera.hpp @@ -0,0 +1,101 @@ +#ifndef ATOM_TOUPTEK_COMPONENT_HPP +#define ATOM_TOUPTEK_COMPONENT_HPP + +#include "atom/driver/camera.hpp" + +#include "libtouptek/toupcam.h" + +#include + +class ToupCamera : public AtomCamera { +public: + explicit ToupCamera(const std::string &name); + ~ToupCamera(); + + bool initialize() override; + bool destroy() override; + + bool connect(const json ¶ms) override; + + bool disconnect(const json ¶ms) override; + + bool reconnect(const json ¶ms) override; + + bool isConnected() override; + + bool startExposure(const double &duration); + + bool abortExposure(); + + bool getExposureStatus(); + + bool getExposureResult(); + + bool saveExposureResult(); + + bool startVideo(); + + bool stopVideo(); + + bool getVideoStatus(); + + bool getVideoResult(); + + bool saveVideoResult(); + + bool startCooling(); + + bool stopCooling(); + + bool getCoolingStatus(); + + bool isCoolingAvailable(); + + bool getTemperature(); + + bool getCoolingPower(); + + bool setTemperature(const double &temperature); + + bool setCoolingPower(const double &power); + + bool getGain(); + + bool setGain(const int &gain); + + bool isGainAvailable(); + + bool getOffset(); + + bool setOffset(const int &offset); + + bool isOffsetAvailable(); + + bool getISO(); + + bool setISO(const int &iso); + + bool isISOAvailable(); + + bool getFrame(); + + bool setFrame(const int &x, const int &y, const int &w, const int &h); + + bool isFrameSettingAvailable(); + + bool getBinning(); + + bool setBinning(const int &hor, const int &ver); + + bool getFrameType(); + + bool setFrameType(FrameType type); + + bool getUploadMode(); + + bool setUploadMode(UploadMode mode); + +private: +}; + +#endif \ No newline at end of file diff --git a/driver/camera/atom-touptek/detail/libtoupbase.cpp b/driver/camera/atom-touptek/detail/libtoupbase.cpp new file mode 100644 index 00000000..c4ccb72b --- /dev/null +++ b/driver/camera/atom-touptek/detail/libtoupbase.cpp @@ -0,0 +1,46 @@ +/* + * libtoupbase.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 20234-3-1 + +Description: ToupBase Library + +**************************************************/ + +#include "libtoupbase.hpp" +#include + +std::string errorCodes(HRESULT rc) { + static std::unordered_map errCodes = { + {0x00000000, "Success"}, + {0x00000001, "Yet another success"}, + {0x8000ffff, "Catastrophic failure"}, + {0x80004001, "Not supported or not implemented"}, + {0x80070005, "Permission denied"}, + {0x8007000e, "Out of memory"}, + {0x80070057, "One or more arguments are not valid"}, + {0x80004003, "Pointer that is not valid"}, + {0x80004005, "Generic failure"}, + {0x8001010e, "Call function in the wrong thread"}, + {0x8007001f, "Device not functioning"}, + {0x800700aa, "The requested resource is in use"}, + {0x8000000a, + "The data necessary to complete this operation is not yet available"}, + {0x8001011f, + "This operation returned because the timeout period expired"}}; + + const std::unordered_map::iterator it = + errCodes.find(rc); + if (it != errCodes.end()) + return it->second; + else { + char str[256]; + sprintf(str, "Unknown error: 0x%08x", rc); + return std::string(str); + } +} \ No newline at end of file diff --git a/driver/camera/atom-touptek/detail/libtoupbase.hpp b/driver/camera/atom-touptek/detail/libtoupbase.hpp new file mode 100644 index 00000000..ad4e4923 --- /dev/null +++ b/driver/camera/atom-touptek/detail/libtoupbase.hpp @@ -0,0 +1,91 @@ +/* + * libtoupbase.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 20234-3-1 + +Description: ToupBase Library + +**************************************************/ + +#pragma once + +#include + +#ifdef BUILD_TOUPCAM +#include +#define FP(x) Toupcam_##x +#define CP(x) TOUPCAM_##x +#define XP(x) Toupcam##x +#define THAND HToupcam +#define DNAME "ToupTek" +#elif BUILD_ALTAIRCAM +#include +#define FP(x) Altaircam_##x +#define CP(x) ALTAIRCAM_##x +#define XP(x) Altaircam##x +#define THAND HAltaircam +#define DNAME "Altair" +#elif BUILD_BRESSERCAM +#include +#define FP(x) Bressercam_##x +#define CP(x) BRESSERCAM_##x +#define XP(x) Bressercam##x +#define THAND HBressercam +#define DNAME "Bresser" +#elif BUILD_MALLINCAM +#include +#define FP(x) Mallincam_##x +#define CP(x) MALLINCAM_##x +#define XP(x) Mallincam##x +#define THAND HMallincam +#define DNAME "MALLINCAM" +#elif BUILD_NNCAM +#include +#define FP(x) Nncam_##x +#define CP(x) NNCAM_##x +#define XP(x) Nncam##x +#define THAND HNncam +#define DNAME "Nn" +#elif BUILD_OGMACAM +#include +#define FP(x) Ogmacam_##x +#define CP(x) OGMACAM_##x +#define XP(x) Ogmacam##x +#define THAND HOgmacam +#define DNAME "OGMAVision" +#elif BUILD_OMEGONPROCAM +#include +#define FP(x) Omegonprocam_##x +#define CP(x) OMEGONPROCAM_##x +#define XP(x) Omegonprocam##x +#define THAND HOmegonprocam +#define DNAME "Astroshop" +#elif BUILD_STARSHOOTG +#include +#define FP(x) Starshootg_##x +#define CP(x) STARSHOOTG_##x +#define XP(x) Starshootg##x +#define THAND HStarshootg +#define DNAME "Orion" +#elif BUILD_TSCAM +#include +#define FP(x) Tscam_##x +#define CP(x) TSCAM_##x +#define XP(x) Tscam##x +#define THAND HTscam +#define DNAME "Teleskop" +#elif BUILD_MEADECAM +#include +#define FP(x) Toupcam_##x +#define CP(x) TOUPCAM_##x +#define XP(x) Toupcam##x +#define THAND HToupcam +#define DNAME "Meade" +#endif + +extern std::string errorCodes(HRESULT rc); diff --git a/driver/camera/atom-touptek/package.json b/driver/camera/atom-touptek/package.json new file mode 100644 index 00000000..b54365c1 --- /dev/null +++ b/driver/camera/atom-touptek/package.json @@ -0,0 +1,35 @@ +{ + "name": "Atom-Camera-Touptek", + "version": "1.0.0", + "type": "shared", + "description": "Atom driver for Touptek Camera", + "license": "LGPL-3.0-or-later", + "author": "Max Qian", + "repository": { + "type": "git", + "url": "https://github.com/ElementAstro/Atom-Touptek" + }, + "bugs": { + "url": "https://github.com/ElementAstro/Atom-Touptek/issues" + }, + "homepage": "https://github.com/ElementAstro/Atom-Touptek", + "keywords": [ + "asi", + "camera", + "filter wheel" + ], + "scripts": { + "dev": "./atom-touptek --standalone", + "build": "cmake --build-type=Release -- -j 4", + "lint": "clang-format -i src/*.cpp src/*.h" + }, + "dependencies": { + "asi-sdk" : "^1.34" + }, + "main": { + "TouptekCamera": { + "func": "getInstance", + "type" : "shared" + } + } +} \ No newline at end of file diff --git a/driver/filterwheel/atom-touptek/_component.cpp b/driver/filterwheel/atom-touptek/_component.cpp new file mode 100644 index 00000000..e69de29b diff --git a/driver/filterwheel/atom-touptek/_component.hpp b/driver/filterwheel/atom-touptek/_component.hpp new file mode 100644 index 00000000..e69de29b diff --git a/src/atom/driver/camera.cpp b/src/atom/driver/camera.cpp index 1b8707a6..f91c6d3a 100644 --- a/src/atom/driver/camera.cpp +++ b/src/atom/driver/camera.cpp @@ -24,6 +24,22 @@ AtomCamera::~AtomCamera() {} bool AtomCamera::initialize() { AtomDriver::initialize(); + + // Primary CCD Exposure + registerVariable("CCD_EXPOSURE_VALUE", 1.0, "Duration (s)"); + registerVariableRanges("CCD_EXPOSURE_VALUE", 0.01, 3600); + registerVariable("CCD_EXPOSURE_STATUS", false, "Status") + + // Primary CCD Abort + registerVariable("CCD_ABORT_EXPOSURE", false, "Abort"); + + registerVariable("CCD_VIDEO_STATUS", false, "Status"); + + registerVariable("CCD_GAIN", 20, "gain"); + registerVariableRanges("CCD_GAIN", 0, 256); + registerVariable("CCD_OFFSET", 0, "offset"); + registerVariableRanges("CCD_OFFSET", 0, 256); + // CCD Temperature registerVariable("CCD_TEMPERATURE_VALUE", 0.0, "Temperature (C)"); registerVariableRanges("CCD_TEMPERATURE_VALUE", -50.0, 50.0); @@ -41,7 +57,7 @@ bool AtomCamera::initialize() { // Primary CCD Region-Of-Interest (ROI) registerVariable("X", 0.0, "Left"); registerVariable("Y", 0.0, "Top"); - registerVariable("WIDTH", 0.0 ,"Width"); + registerVariable("WIDTH", 0.0, "Width"); registerVariable("HEIGHT", 0.0, "Height"); // Primary CCD Frame Type @@ -50,13 +66,6 @@ bool AtomCamera::initialize() { registerVariable("FRAME_DARK", false, "Dark"); registerVariable("FRAME_FLAT", false, "Flat"); - // Primary CCD Exposure - registerVariable("CCD_EXPOSURE_VALUE", 1.0 ,"Duration (s)"); - registerVariableRanges("CCD_EXPOSURE_VALUE", 0.01, 3600); - - // Primary CCD Abort - registerVariable("CCD_ABORT_EXPOSURE", false, "Abort"); - // Primary CCD Binning registerVariable("HOR_BIN", 1, "X"); registerVariableRanges("HOR_BIN", 1, 4); @@ -71,9 +80,9 @@ bool AtomCamera::initialize() { registerVariable("CCD_PIXEL_SIZE", 0, "Pixel size (um)"); registerVariableRanges("CCD_PIXEL_SIZE", 1, 40); - registerVariable("CCD_PIXEL_SIZE_X", 0.0 ,"Pixel size X"); + registerVariable("CCD_PIXEL_SIZE_X", 0.0, "Pixel size X"); registerVariableRanges("CCD_PIXEL_SIZE_X", 0, 40); - registerVariable("CCD_PIXEL_SIZE_Y", 0.0 ,"Pixel size Y"); + registerVariable("CCD_PIXEL_SIZE_Y", 0.0, "Pixel size Y"); registerVariableRanges("CCD_PIXEL_SIZE_Y", 0, 40); registerVariable("CCD_BITSPERPIXEL", 0, "Bits per pixel"); registerVariableRanges("CCD_BITSPERPIXEL", 8, 64); @@ -127,6 +136,30 @@ bool AtomCamera::initialize() { registerFunc("getExposureStatus", &AtomCamera::_getExposureStatus, this); registerFunc("getExposureResult", &AtomCamera::_getExposureResult, this); + registerFunc("startVideo", &AtomCamera::_startVideo, this); + registerFunc("stopVideo", &AtomCamera::_stopVideo, this); + registerFunc("getVideoStatus", &AtomCamera::_getVideoStatus, this); + registerFunc("getVideoResult", &AtomCamera::_getVideoResult, this); + + registerFunc("startCooling", &AtomCamera::_startCooling, this); + registerFunc("stopCooling", &AtomCamera::_stopCooling, this); + registerFunc("getCoolingStatus", &AtomCamera::_getCoolingStatus, this); + registerFunc("getCoolingPower", &AtomCamera::_getCoolingPower, this); + registerFunc("setCoolingPower", &AtomCamera::_setCoolingPower, this); + registerFunc("getTemperature", &AtomCamera::_getTemperature, this); + registerFunc("setTemperature", &AtomCamera::_setTemperature, this); + + registerFunc("getGain", &AtomCamera::_getGain, this); + registerFunc("setGain", &AtomCamera::_setGain, this); + registerFunc("getOffset", &AtomCamera::_getOffset, this); + registerFunc("setOffset", &AtomCamera::_setOffset, this); + registerFunc("getISO", &AtomCamera::_getISO, this); + registerFunc("setISO", &AtomCamera::_setISO, this); + registerFunc("getBinning", &AtomCamera::_getBinning, this); + registerFunc("setBinning", &AtomCamera::_setBinning, this); + + registerFunc("getFrame", &AtomCamera::_getFrame, this); + registerFunc("setFrame", &AtomCamera::_setFrame, this); return true; } @@ -194,7 +227,8 @@ bool AtomCamera::isISOAvailable() { return true; } bool AtomCamera::getFrame() { return true; } -bool AtomCamera::setFrame(const int &x, const int &y, const int &w, const int &h) { +bool AtomCamera::setFrame(const int &x, const int &y, const int &w, + const int &h) { return true; } @@ -280,6 +314,10 @@ json AtomCamera::_getISO(const json ¶ms) { return {}; } json AtomCamera::_setISO(const json ¶ms) { return {}; } +json AtomCamera::_getBinning(const json ¶ms) { return {}; } + +json AtomCamera::_setBinning(const json ¶ms) { return {}; } + json AtomCamera::_getFrame(const json ¶ms) { return {}; } json AtomCamera::_setFrame(const json ¶ms) { return {}; } \ No newline at end of file diff --git a/src/atom/driver/camera.hpp b/src/atom/driver/camera.hpp index a34c44df..673df1a1 100644 --- a/src/atom/driver/camera.hpp +++ b/src/atom/driver/camera.hpp @@ -192,4 +192,8 @@ class AtomCamera : public AtomDriver { json _getFrame(const json ¶ms); json _setFrame(const json ¶ms); + + json _getBinning(const json ¶ms); + + json _setBinning(const json ¶ms); }; diff --git a/src/atom/driver/device.cpp b/src/atom/driver/device.cpp index daa22a6c..a92e9eb2 100644 --- a/src/atom/driver/device.cpp +++ b/src/atom/driver/device.cpp @@ -34,8 +34,20 @@ bool AtomDriver::initialize() { SharedComponent::initialize(); Atom::Utils::UUIDGenerator generator; m_uuid = generator.generateUUID(); - setVariable("DEVICE_UUID", m_uuid); - setVariable("DEVICE_NAME", m_name); + + registerVariable("DEVICE_NAME", m_name); + registerVariable("DEVICE_ID", 0, "Device ID"); + registerVariable("DEVICE_UUID", m_uuid); + registerVariable("DEVICE_TYPE", "", "Device Type"); + registerVariable("DEVICE_VERSION", "1.0.0", "Device Version"); + registerVariable("DEVICE_MANUFACTURER", "Atom", "Device Manufacturer"); + registerVariable("DEVICE_MODEL", "Atom", "Device Model"); + registerVariable("DEVICE_SERIAL_NUMBER", "00000000", + "Device Serial Number"); + + registerVariable("DEVICE_CONNECTED", false, "Device Connected"); + registerVariable("DEVICE_CONNECTION_STATUS", "Disconnected", + "Device Connection Status"); registerFunc("connect", &AtomDriver::Connect, this); registerFunc("disconnect", &AtomDriver::Disconnect, this); From 7a0047ec35a30230fefbacc2e9ea2eb24de171be Mon Sep 17 00:00:00 2001 From: Max Qian <64824374+AstroAir@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:25:10 +0000 Subject: [PATCH 04/28] update --- README.md | 12 +- example/atom/algorithm/base.cpp | 44 +++ example/atom/async/queue.cpp | 118 ++++++ example/atom/experiment/bind_first.cpp | 52 +++ example/atom/experiment/callable.cpp | 64 ++++ example/atom/experiment/static_vector.cpp | 87 +++++ scripts/build_ci.sh | 54 ++- scripts/build_win.sh | 83 ++++- scripts/install_msys2.ps1 | 29 ++ src/atom/algorithm/base.cpp | 168 ++++----- src/atom/algorithm/base.hpp | 19 +- src/atom/async/queue.hpp | 298 +++++++-------- src/atom/async/queue.inl | 204 ++++++++++ src/atom/async/thread_wrapper.hpp | 163 ++++++++ src/atom/experiment/any.hpp | 45 ++- src/atom/experiment/bind_first.hpp | 56 ++- src/atom/experiment/callable.hpp | 51 ++- src/atom/experiment/static_vector.hpp | 204 ++++++++++ src/atom/experiment/svector.cpp | 112 ------ .../{stringutils.hpp => to_string.hpp} | 0 src/atom/type/small_vector.hpp | 351 ++++++++++++++---- src/atom/utils/string.cpp | 49 ++- src/atom/utils/string.hpp | 7 +- 23 files changed, 1740 insertions(+), 530 deletions(-) create mode 100644 example/atom/algorithm/base.cpp create mode 100644 example/atom/async/queue.cpp create mode 100644 example/atom/experiment/bind_first.cpp create mode 100644 example/atom/experiment/callable.cpp create mode 100644 example/atom/experiment/static_vector.cpp create mode 100644 scripts/install_msys2.ps1 create mode 100644 src/atom/async/queue.inl create mode 100644 src/atom/async/thread_wrapper.hpp create mode 100644 src/atom/experiment/static_vector.hpp delete mode 100644 src/atom/experiment/svector.cpp rename src/atom/experiment/{stringutils.hpp => to_string.hpp} (100%) diff --git a/README.md b/README.md index fdd391fb..a33682ff 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ pacman -S mingw-w64-x86_64-libnova ```shell sudo apt-get update && sudo apt-get upgrade -y sudo apt install gcc g++ cmake -sudo apt install libcfitsio-dev zlib1g-dev libssl-dev libzip-dev libnova-dev libfmt-dev libudev-dev libuv1-dev +sudo apt install libcfitsio-dev zlib1g-dev libssl-dev libzip-dev libnova-dev libfmt-dev libudev-dev ``` Alternatively, you can directly run the provided script according to your platform: @@ -96,10 +96,18 @@ Unfortunately, the newest GCC and CMake are not available on Github Codespace, s ```shell sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y sudo apt-get update -sudo apt-get install gcc-13 # GCC13 is the best choice +sudo apt-get install gcc-13 g++-13 # GCC13 is the best choice, clang is alse OK wget https://cmake.org/files/v3.28/cmake-3.28.0-rc5.tar.gz tar -zxvf cmake-3.28.0-rc5.tar.gz +./bootstrap && make && sudo make install + +#install newest clang-format +wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - +sudo nano /etc/apt/sources.list +#deb http://apt.llvm.org/focal/ llvm-toolchain-focal-17 main +#deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-17 main +sudo apt install -y clang-format-17 ``` Build the code: diff --git a/example/atom/algorithm/base.cpp b/example/atom/algorithm/base.cpp new file mode 100644 index 00000000..e19e659d --- /dev/null +++ b/example/atom/algorithm/base.cpp @@ -0,0 +1,44 @@ +#include "atom/algorithm/base.hpp" + +#include + +using namespace Atom::Algorithm; + +int main() { + std::string input = "Hello, world!"; + auto encoded = base32Encode(reinterpret_cast(input.data()), + input.size()); + std::cout << "Encoded: " << encoded << std::endl; + + try { + auto decoded = base32Decode(encoded); + std::cout << "Decoded: " << decoded << std::endl; + } catch (const std::invalid_argument& e) { + std::cout << "Error: " << e.what() << std::endl; + } + + std::string input = "Hello, world!"; + auto encoded = base128Encode( + reinterpret_cast(input.data()), input.size()); + std::cout << "Encoded: " << encoded << std::endl; + + try { + auto decoded = base128Decode(encoded); + std::cout << "Decoded: " << decoded << std::endl; + } catch (const std::invalid_argument& e) { + std::cout << "Error: " << e.what() << std::endl; + } + + uint8_t key = 0x42; + auto encrypted = xorEncrypt(input, key); + std::cout << "Encrypted: " + << base128Encode( + reinterpret_cast(encrypted.data()), + encrypted.size()) + << std::endl; + + auto decrypted = xorDecrypt(encrypted, key); + std::cout << "Decrypted: " << decrypted << std::endl; + + return 0; +} \ No newline at end of file diff --git a/example/atom/async/queue.cpp b/example/atom/async/queue.cpp new file mode 100644 index 00000000..7750871b --- /dev/null +++ b/example/atom/async/queue.cpp @@ -0,0 +1,118 @@ +#include +#include +#include + +using namespace Atom::Async; + +void producer(ThreadSafeQueue& queue) { + for (int i = 0; i < 10; ++i) { + queue.put(i); + std::cout << "Produced: " << i << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } +} + +void consumer(ThreadSafeQueue& queue) { + while (true) { + auto item = queue.take(); + if (!item) { + break; + } + std::cout << "Consumed: " << *item << std::endl; + } +} + +int main() { + ThreadSafeQueue queue; + + std::thread t1(producer, std::ref(queue)); + std::thread t2(consumer, std::ref(queue)); + + t1.join(); + queue.destroy(); + t2.join(); + + // 使用 emplace + ThreadSafeQueue strQueue; + strQueue.emplace("Hello"); + strQueue.emplace("World"); + std::cout << "Front: " << *strQueue.front() << std::endl; + std::cout << "Back: " << *strQueue.back() << std::endl; + + // 使用 waitFor + ThreadSafeQueue intQueue; + std::thread t3([&intQueue]() { + std::this_thread::sleep_for(std::chrono::seconds(1)); + intQueue.put(42); + }); + auto item = + intQueue.waitFor([](const std::queue& q) { return !q.empty(); }); + std::cout << "Waited for: " << *item << std::endl; + t3.join(); + + // 使用 extractIf + /* + ThreadSafeQueue extractQueue; + for (int i = 0; i < 10; ++i) { + extractQueue.put(i); + } + auto evenNumbers = extractQueue.extractIf([](int i) { return i % 2 == 0; }); + std::cout << "Extracted even numbers: "; + for (auto num : evenNumbers) { + std::cout << num << " "; + } + std::cout << std::endl; + */ + + + // 使用 sort + ThreadSafeQueue sortQueue; + sortQueue.put(3); + sortQueue.put(1); + sortQueue.put(4); + sortQueue.put(1); + sortQueue.put(5); + sortQueue.sort(std::greater()); + std::cout << "Sorted queue: "; + while (!sortQueue.empty()) { + std::cout << *sortQueue.take() << " "; + } + std::cout << std::endl; + + // 使用 transform + ThreadSafeQueue transformQueue; + for (int i = 1; i <= 5; ++i) { + transformQueue.put(i); + } + /*auto squaredQueue = + transformQueue.transform([](int i) { return i * i; }); + std::cout << "Squared queue: "; + while (!squaredQueue.empty()) { + std::cout << *squaredQueue.take() << " "; + } + std::cout << std::endl;*/ + + // 使用 groupBy + /* + ThreadSafeQueue groupByQueue; + groupByQueue.put("apple"); + groupByQueue.put("banana"); + groupByQueue.put("cherry"); + groupByQueue.put("date"); + groupByQueue.put("elderberry"); + auto groupedQueues = groupByQueue.groupBy( + [](const std::string& s) -> std::string { + return std::to_string(s[0]); + }); + std::cout << "Grouped queues: " << std::endl; + for (auto& queue : groupedQueues) { + std::cout << "Group: "; + while (!queue.empty()) { + std::cout << *queue.take() << " "; + } + std::cout << std::endl; + } + */ + + return 0; +} \ No newline at end of file diff --git a/example/atom/experiment/bind_first.cpp b/example/atom/experiment/bind_first.cpp new file mode 100644 index 00000000..135d2cd4 --- /dev/null +++ b/example/atom/experiment/bind_first.cpp @@ -0,0 +1,52 @@ +#include "atom/experiment/bind_first.hpp" + +#include +#include + +int add(int a, int b) { return a + b; } + +struct Adder { + int operator()(int a, int b) const { return a + b; } +}; + +struct Person { + std::string name; + + void greet(const std::string &message) const { + std::cout << "Hello, " << name << "! " << message << std::endl; + } +}; + +int main() { + // 绑定普通函数 + auto add5 = bind_first(add, 5); + std::cout << add5(3) << std::endl; // 输出: 8 + + // 绑定函数对象 + // Adder adder; + // auto adder10 = bind_first(adder, 10); + // std::cout << adder10(7) << std::endl; // 输出: 17 + + // 绑定成员函数 + Person person{"Alice"}; + auto greet_alice = bind_first(&Person::greet, person); + greet_alice("How are you?"); // 输出: Hello, Alice! How are you? + + // 绑定 std::function + std::function fn = [](int a, int b) { return a * b; }; + auto multiply3 = bind_first(fn, 3); + std::cout << multiply3(5) << std::endl; // 输出: 15 + + // 绑定成员函数对象 + // auto greet_bob = bind_first(std::cref(person), "Bob", &Person::greet); + // greet_bob("Nice to meet you!"); // 输出: Hello, Bob! Nice to meet you! + + // 使用 is_invocable_v 和 is_nothrow_invocable_v + static_assert(is_invocable_v); + // static_assert(is_nothrow_invocable_v); + static_assert(is_invocable_v); + static_assert(is_invocable_v); + // static_assert(is_invocable_v); + + return 0; +} \ No newline at end of file diff --git a/example/atom/experiment/callable.cpp b/example/atom/experiment/callable.cpp new file mode 100644 index 00000000..aadf1d8b --- /dev/null +++ b/example/atom/experiment/callable.cpp @@ -0,0 +1,64 @@ +#include "atom/experiment/callable.hpp" + +#include +#include + +struct Person { + Person(std::string name, int age) : m_name(std::move(name)), m_age(age) {} + + void greet(const std::string &message) const { + std::cout << "Hello, " << m_name << "! " << message << std::endl; + } + + std::string m_name; + int m_age; +}; + +int add(int a, int b) { return a + b; } + +int main() { + // 使用 Constructor 构造对象 + Constructor person_constructor; + auto person = person_constructor("Alice", 30); + std::cout << "Name: " << person->m_name << ", Age: " << person->m_age + << std::endl; + + // 使用 Const_Caller 调用常成员函数 + Const_Caller greet_caller( + &Person::greet); + greet_caller(*person, "How are you?"); + + // 使用 Fun_Caller 调用普通函数 + Fun_Caller add_caller(add); + int sum = add_caller(3, 5); + std::cout << "Sum: " << sum << std::endl; + + // 使用 Caller 调用非常成员函数 + struct Square { + int operator()(int x) { return x * x; } + }; + Square square; + Caller square_caller(&Square::operator()); + int result = square_caller(square, 4); + std::cout << "Square: " << result << std::endl; + + // 使用 Arity 获取函数参数个数 + // static_assert(Arity::value == 3); + + // 使用 Function_Signature 获取函数签名 + static_assert( + std::is_same_v::Return_Type, + int>); + static_assert( + std::is_same_v::Signature, + int (*)(double, char)>); + + // 使用 Callable_Traits 获取可调用对象的特征 + auto lambda = [](int x, int y) { return x + y; }; + static_assert( + std::is_same_v::Return_Type, int>); + static_assert(std::is_same_v::Signature, + int (*)(int, int)>); + + return 0; +} \ No newline at end of file diff --git a/example/atom/experiment/static_vector.cpp b/example/atom/experiment/static_vector.cpp new file mode 100644 index 00000000..88fa77df --- /dev/null +++ b/example/atom/experiment/static_vector.cpp @@ -0,0 +1,87 @@ +#include "atom/experiment/static_vector.hpp" + +#include +#include + +int main() { + // 创建一个容量为5的StaticVector,存储int类型 + StaticVector vec; + + // 使用push_back添加元素 + vec.push_back(1); + vec.push_back(2); + vec.push_back(3); + + // 使用emplace_back添加元素 + vec.emplace_back(4); + vec.emplace_back(5); + + // 使用下标操作符访问元素 + std::cout << "vec[0]: " << vec[0] << std::endl; + std::cout << "vec[1]: " << vec[1] << std::endl; + + // 使用at函数访问元素 + std::cout << "vec.at(2): " << vec.at(2) << std::endl; + try { + std::cout << "vec.at(5): " << vec.at(5) << std::endl; + } catch (const std::out_of_range& e) { + std::cout << "Out of range: " << e.what() << std::endl; + } + + // 使用front和back函数 + std::cout << "vec.front(): " << vec.front() << std::endl; + std::cout << "vec.back(): " << vec.back() << std::endl; + + // 使用size和capacity函数 + std::cout << "vec.size(): " << vec.size() << std::endl; + std::cout << "vec.capacity(): " << vec.capacity() << std::endl; + + // 使用范围for循环遍历元素 + std::cout << "Elements in vec: "; + for (int x : vec) { + std::cout << x << " "; + } + std::cout << std::endl; + + // 使用初始化列表构造函数 + StaticVector str_vec{"Hello", "World", "!"}; + + // 使用比较操作符 + StaticVector vec1{1, 2, 3}; + StaticVector vec2{1, 2, 3}; + StaticVector vec3{1, 2, 4}; + + std::cout << "vec1 == vec2: " << (vec1 == vec2) << std::endl; + std::cout << "vec1 == vec3: " << (vec1 == vec3) << std::endl; + // std::cout << "vec1 <=> vec2: " << (vec1 <=> vec2) << std::endl; + // std::cout << "vec1 <=> vec3: " << (vec1 <=> vec3) << std::endl; + + // 使用swap函数 + StaticVector vec4{1, 2, 3}; + StaticVector vec5{4, 5, 6}; + std::cout << "Before swap: "; + std::cout << "vec4: "; + for (int x : vec4) { + std::cout << x << " "; + } + std::cout << "vec5: "; + for (int x : vec5) { + std::cout << x << " "; + } + std::cout << std::endl; + + swap(vec4, vec5); + + std::cout << "After swap: "; + std::cout << "vec4: "; + for (int x : vec4) { + std::cout << x << " "; + } + std::cout << "vec5: "; + for (int x : vec5) { + std::cout << x << " "; + } + std::cout << std::endl; + + return 0; +} \ No newline at end of file diff --git a/scripts/build_ci.sh b/scripts/build_ci.sh index ab1314e6..a7685891 100644 --- a/scripts/build_ci.sh +++ b/scripts/build_ci.sh @@ -1,3 +1,51 @@ -sudo apt-get update && sudo apt-get upgrade -y -sudo apt install gcc g++ cmake -sudo apt install libcfitsio-dev zlib1g-dev libssl-dev libzip-dev libnova-dev libfmt-dev \ No newline at end of file +#!/bin/bash + +set -e + +echo "Checking system environment..." + +# Check if the script is run with sudo +if [[ $EUID -ne 0 ]]; then + echo "This script must be run with sudo." + exit 1 +fi + +# Check if the system is Debian-based +if ! command -v apt-get &> /dev/null; then + echo "This script only supports Debian-based systems." + exit 1 +fi + +# Check if gcc and g++ are installed +if ! command -v gcc &> /dev/null || ! command -v g++ &> /dev/null; then + echo "gcc and g++ are not installed. Installing..." + apt-get install -y gcc g++ +else + echo "gcc and g++ are already installed." +fi + +# Check if CMake is installed +if ! command -v cmake &> /dev/null; then + echo "CMake is not installed. Installing..." + apt-get install -y cmake +else + echo "CMake is already installed." +fi + +echo "Updating system packages..." +apt-get update +apt-get upgrade -y + +echo "Installing dependencies..." +apt-get install -y libcfitsio-dev zlib1g-dev libssl-dev libzip-dev libnova-dev libfmt-dev + +echo "Checking installed dependencies..." +for lib in cfitsio zlib ssl zip nova fmt; do + if ! ldconfig -p | grep -q "lib$lib"; then + echo "lib$lib is not properly installed. Please check the installation manually." + else + echo "lib$lib is properly installed." + fi +done + +echo "Build environment setup completed." \ No newline at end of file diff --git a/scripts/build_win.sh b/scripts/build_win.sh index 13bd7725..d910a358 100644 --- a/scripts/build_win.sh +++ b/scripts/build_win.sh @@ -1,10 +1,75 @@ +#!/bin/bash + +set -e + +echo "Checking system environment..." + +# Check if pacman is available +if ! command -v pacman &> /dev/null; then + echo "This script requires an MSYS2 environment with pacman." + exit 1 +fi + +echo "Updating MSYS2 mirror list..." sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist* -pacman -Syu -pacman -S mingw-w64-x86_64-toolchain -pacman -S mingw-w64-x86_64-dlfcn -pacman -S mingw-w64-x86_64-cfitsio -pacman -S mingw-w64-x86_64-cmake -pacman -S mingw-w64-x86_64-libzip -pacman -S mingw-w64-x86_64-zlib -pacman -S mingw-w64-x86_64-fmt -pacman -S mingw-w64-x86_64-libnova \ No newline at end of file + +echo "Updating system packages..." +pacman -Syu --noconfirm + +echo "Installing mingw-w64-x86_64-toolchain..." +if ! pacman -Q mingw-w64-x86_64-toolchain &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-toolchain +else + echo "mingw-w64-x86_64-toolchain is already installed." +fi + +echo "Installing mingw-w64-x86_64-dlfcn..." +if ! pacman -Q mingw-w64-x86_64-dlfcn &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-dlfcn +else + echo "mingw-w64-x86_64-dlfcn is already installed." +fi + +echo "Installing mingw-w64-x86_64-cfitsio..." +if ! pacman -Q mingw-w64-x86_64-cfitsio &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-cfitsio +else + echo "mingw-w64-x86_64-cfitsio is already installed." +fi + +echo "Installing mingw-w64-x86_64-cmake..." +if ! pacman -Q mingw-w64-x86_64-cmake &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-cmake +else + echo "mingw-w64-x86_64-cmake is already installed." +fi + +echo "Installing mingw-w64-x86_64-libzip..." +if ! pacman -Q mingw-w64-x86_64-libzip &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-libzip +else + echo "mingw-w64-x86_64-libzip is already installed." +fi + +echo "Installing mingw-w64-x86_64-zlib..." +if ! pacman -Q mingw-w64-x86_64-zlib &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-zlib +else + echo "mingw-w64-x86_64-zlib is already installed." +fi + +echo "Installing mingw-w64-x86_64-fmt..." +if ! pacman -Q mingw-w64-x86_64-fmt &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-fmt +else + echo "mingw-w64-x86_64-fmt is already installed." +fi + +echo "Installing mingw-w64-x86_64-libnova..." +if ! pacman -Q mingw-w64-x86_64-libnova &> /dev/null; then + pacman -S --noconfirm mingw-w64-x86_64-libnova +else + echo "mingw-w64-x86_64-libnova is already installed." +fi + +echo "Environment setup completed." \ No newline at end of file diff --git a/scripts/install_msys2.ps1 b/scripts/install_msys2.ps1 new file mode 100644 index 00000000..34577ad4 --- /dev/null +++ b/scripts/install_msys2.ps1 @@ -0,0 +1,29 @@ +# 设置MSYS2的下载URL和安装路径 +$msys2_url = "https://github.com/msys2/msys2-installer/releases/download/2022-06-03/msys2-x86_64-20220603.exe" +$msys2_installer = "msys2-x86_64-20220603.exe" +$install_dir = "C:\msys64" + +# 下载MSYS2安装程序 +Write-Output "Downloading MSYS2 installer..." +Invoke-WebRequest -Uri $msys2_url -OutFile $msys2_installer + +# 安装MSYS2 +Write-Output "Installing MSYS2..." +Start-Process -FilePath .\$msys2_installer -ArgumentList "/S /D=$install_dir" -Wait + +# 配置pacman +Write-Output "Configuring pacman..." +$pacman_conf = "C:\msys64\etc\pacman.conf" +Add-Content -Path $pacman_conf -Value 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/' +Add-Content -Path $pacman_conf -Value 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/' +Add-Content -Path $pacman_conf -Value 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/' + +# 更新系统包 +Write-Output "Updating system packages..." +C:\msys64\usr\bin\bash.exe -lc "pacman -Syu --noconfirm" + +# 安装必要的开发工具和库 +Write-Output "Installing development tools and libraries..." +C:\msys64\usr\bin\bash.exe -lc "pacman -S --noconfirm mingw-w64-x86_64-toolchain mingw-w64-x86_64-dlfcn mingw-w64-x86_64-cfitsio mingw-w64-x86_64-cmake mingw-w64-x86_64-libzip mingw-w64-x86_64-zlib mingw-w64-x86_64-fmt mingw-w64-x86_64-libnova" + +Write-Output "MSYS2 installation and setup completed." \ No newline at end of file diff --git a/src/atom/algorithm/base.cpp b/src/atom/algorithm/base.cpp index a9ba4a3d..577eb4b1 100644 --- a/src/atom/algorithm/base.cpp +++ b/src/atom/algorithm/base.cpp @@ -20,7 +20,6 @@ Description: A collection of algorithms for C++ #include #include - #ifdef _WIN32 #include #else @@ -52,75 +51,58 @@ std::vector decodeBase16(const std::string &data) { return result; } -std::string base32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; - -std::string encodeBase32(const std::string &data) { - std::string output; - - auto getChunk = [&](size_t index) { - uint64_t chunk = 0; - for (size_t i = 0; i < 5; ++i) { - if (index * 5 + i < data.size()) { - chunk |= static_cast(data[index * 5 + i]) - << (32 - i * 8); - } - } - return chunk; - }; +constexpr std::string_view base32_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; - for (size_t i = 0; i < (data.size() + 4) / 5; ++i) { - uint64_t chunk = getChunk(i); - - for (size_t j = 0; j < 8; ++j) { - uint8_t index = (chunk >> (35 - j * 5)) & 0x1f; - output += base32Chars[index]; - } +std::string base32Encode(const uint8_t *data, size_t length) { + std::string result; + result.reserve((length + 4) / 5 * 8); - if (data.size() - i * 5 < 5) { - output.replace(output.size() - (5 - data.size() % 5), - 5 - data.size() % 5, 5 - data.size() % 5, '='); + size_t bits = 0; + int num_bits = 0; + for (size_t i = 0; i < length; ++i) { + bits = (bits << 8) | data[i]; + num_bits += 8; + while (num_bits >= 5) { + result.push_back(base32_chars[(bits >> (num_bits - 5)) & 0x1F]); + num_bits -= 5; } } - return output; -} + if (num_bits > 0) { + bits <<= (5 - num_bits); + result.push_back(base32_chars[bits & 0x1F]); + } -std::string decodeBase32(const std::string &data) { - std::string output; - std::vector bytes; + int padding_chars = (8 - result.size() % 8) % 8; + result.append(padding_chars, '='); - auto getChunk = [&](size_t index) { - uint64_t chunk = 0; - for (size_t i = 0; i < 8; ++i) { - char c = data[index * 8 + i]; - if (c == '=') { - break; - } + return result; +} - uint8_t base32Index = base32Chars.find(c); - if (base32Index == std::string::npos) { - throw std::invalid_argument("Invalid Base32 character: " + c); - } +std::string base32Decode(std::string_view encoded) { + std::string result; + result.reserve(encoded.size() * 5 / 8); - chunk |= static_cast(base32Index) << (35 - i * 5); + size_t bits = 0; + int num_bits = 0; + for (char c : encoded) { + if (c == '=') { + break; } - return chunk; - }; - - for (size_t i = 0; i < data.size() / 8; ++i) { - uint64_t chunk = getChunk(i); - - for (size_t j = 0; j < 5; ++j) { - uint8_t byte = (chunk >> (32 - j * 8)) & 0xff; - if (byte != 0) { - bytes.push_back(byte); - } + auto pos = base32_chars.find(c); + if (pos == std::string_view::npos) { + throw std::invalid_argument( + "Invalid character in Base32 encoded string"); + } + bits = (bits << 5) | pos; + num_bits += 5; + if (num_bits >= 8) { + result.push_back(static_cast(bits >> (num_bits - 8))); + num_bits -= 8; } } - output.assign(bytes.begin(), bytes.end()); - - return output; + return result; } std::string base64Encode(const std::vector &bytes_to_encode) { @@ -346,52 +328,62 @@ std::vector decodeBase85(const std::string &data) { return result; } -std::vector encodeBase128(const std::span &input) { - std::vector output; - output.reserve(input.size() * 8 / 7); // 预留足够的空间 +std::string base128Encode(const uint8_t *data, size_t length) { + std::string result; + result.reserve((length * 8 + 6) / 7); size_t bits = 0; - uint32_t value = 0; - - for (auto byte : input) { - value = (value << 8) | byte; // 将新字节加入到value中 - bits += 8; - - while (bits >= 7) { - bits -= 7; - output.push_back((value >> bits) & 0x7F); // 提取最高的7位 + int num_bits = 0; + for (size_t i = 0; i < length; ++i) { + bits = (bits << 8) | data[i]; + num_bits += 8; + while (num_bits >= 7) { + result.push_back( + static_cast((bits >> (num_bits - 7)) & 0x7F)); + num_bits -= 7; } } - if (bits > 0) { // 处理剩余的bits - output.push_back((value << (7 - bits)) & 0x7F); + if (num_bits > 0) { + bits <<= (7 - num_bits); + result.push_back(static_cast(bits & 0x7F)); } - return output; + return result; } -// 解码 -std::vector decodeBase128(const std::span &input) { - std::vector output; - output.reserve(input.size() * 7 / 8); // 预留足够的空间 +std::string base128Decode(std::string_view encoded) { + std::string result; + result.reserve(encoded.size() * 7 / 8); size_t bits = 0; - uint32_t value = 0; - - for (auto byte : input) { - if (byte & 0x80) { - throw std::invalid_argument("Input is not valid Base128 encoded."); + int num_bits = 0; + for (char c : encoded) { + if (static_cast(c) > 127) { + throw std::invalid_argument( + "Invalid character in Base128 encoded string"); } + bits = (bits << 7) | static_cast(c); + num_bits += 7; + if (num_bits >= 8) { + result.push_back(static_cast(bits >> (num_bits - 8))); + num_bits -= 8; + } + } - value = (value << 7) | byte; - bits += 7; + return result; +} - if (bits >= 8) { - bits -= 8; - output.push_back((value >> bits) & 0xFF); // 提取最高的8位 - } +std::string xorEncrypt(std::string_view plaintext, uint8_t key) { + std::string ciphertext; + ciphertext.reserve(plaintext.size()); + for (char c : plaintext) { + ciphertext.push_back(static_cast(static_cast(c) ^ key)); } + return ciphertext; +} - return output; +std::string xorDecrypt(std::string_view ciphertext, uint8_t key) { + return xorEncrypt(ciphertext, key); } } // namespace Atom::Algorithm \ No newline at end of file diff --git a/src/atom/algorithm/base.hpp b/src/atom/algorithm/base.hpp index f1237705..85bc98ed 100644 --- a/src/atom/algorithm/base.hpp +++ b/src/atom/algorithm/base.hpp @@ -18,7 +18,6 @@ Description: A collection of algorithms for C++ #include #include #include -#include namespace Atom::Algorithm { /** @@ -56,7 +55,7 @@ decodeBase16(const std::string &data); * @return The encoded string */ [[nodiscard("The result of base32Encode is not used.")]] std::string -encodeBase32(const std::string &data); +base32Encode(const uint8_t *data, size_t length); /** * @brief Decodes a Base32 string @@ -64,7 +63,7 @@ encodeBase32(const std::string &data); * @return The decoded string */ [[nodiscard("The result of base32Decode is not used.")]] std::string -decodeBase32(const std::string &data); +base32Decode(std::string_view encoded); /** * @brief Base64编码函数 @@ -141,8 +140,8 @@ decodeBase85(const std::string &data); * @param data The vector of unsigned characters to be encoded. * @return The Base128 encoded string. */ -[[nodiscard("The result of encodeBase128 is not used.")]] std::vector -encodeBase128(const std::span &data); +[[nodiscard("The result of encodeBase128 is not used.")]] std::string +base128Encode(const uint8_t *data, size_t length); /** * @brief Decodes a Base128 string into a vector of unsigned characters. @@ -154,8 +153,14 @@ encodeBase128(const std::span &data); * @param data The Base128 encoded string to be decoded. * @return The decoded vector of unsigned characters. */ -[[nodiscard("The result of decodeBase128 is not used.")]] std::vector -decodeBase128(const std::span &data); +[[nodiscard("The result of decodeBase128 is not used.")]] std::string +base128Decode(std::string_view encoded); + +[[nodiscard("The result of xorEncrypt is not used.")]] std::string xorEncrypt( + std::string_view plaintext, uint8_t key); + +[[nodiscard("The result of xorDecrypt is not used.")]] std::string xorDecrypt( + std::string_view ciphertext, uint8_t key); } // namespace Atom::Algorithm #endif diff --git a/src/atom/async/queue.hpp b/src/atom/async/queue.hpp index 6eedf3ad..e94002f2 100644 --- a/src/atom/async/queue.hpp +++ b/src/atom/async/queue.hpp @@ -1,3 +1,17 @@ +/* + * queue.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-13 + +Description: A simple thread safe queue + +**************************************************/ + #ifndef ATOM_ASYNC_QUEUE_HPP #define ATOM_ASYNC_QUEUE_HPP @@ -13,184 +27,132 @@ #include "atom/experiment/noncopyable.hpp" namespace Atom::Async { +/** + * @brief A thread-safe queue data structure that supports concurrent access + * from multiple threads. + * + * This class provides a thread-safe implementation of a queue, allowing + * elements to be added and removed concurrently from multiple threads without + * causing data races or undefined behavior. + * + * @tparam T The type of elements stored in the queue. + */ template -struct ThreadSafeQueue : public NonCopyable { +class ThreadSafeQueue : public NonCopyable { +public: + /** + * @brief Default constructor. + */ ThreadSafeQueue() = default; - void put(T element) { - { - std::lock_guard lock(m_mutex); - m_queue.push(std::move(element)); - } - m_conditionVariable.notify_one(); - } - - std::optional take() { - std::unique_lock lock(m_mutex); - m_conditionVariable.wait( - lock, [this] { return m_mustReturnNullptr || !m_queue.empty(); }); - - if (m_mustReturnNullptr) - return {}; - - T ret = std::move(m_queue.front()); - m_queue.pop(); - - return ret; - } - - std::queue destroy() { - { - std::lock_guard lock(m_mutex); - m_mustReturnNullptr = true; - } - m_conditionVariable.notify_all(); - - std::queue result; - { - std::lock_guard lock(m_mutex); - std::swap(result, m_queue); - } - return result; - } - - size_t size() const { - std::lock_guard lock(m_mutex); - return m_queue.size(); - } - - bool empty() const { - std::lock_guard lock(m_mutex); - return m_queue.empty(); - } - - void clear() { - std::lock_guard lock(m_mutex); - while (!m_queue.empty()) { - m_queue.pop(); - } - } - - std::optional front() { - std::lock_guard lock(m_mutex); - if (m_queue.empty()) { - return {}; - } - return m_queue.front(); - } - - std::optional back() { - std::lock_guard lock(m_mutex); - if (m_queue.empty()) { - return {}; - } - return m_queue.back(); - } - + /** + * @brief Adds an element to the end of the queue. + * @param element The element to be added to the queue. + */ + void put(T element); + + /** + * @brief Removes and returns an element from the front of the queue. + * @return An optional containing the removed element, or empty if the queue + * is empty. + */ + std::optional take(); + + /** + * @brief Removes all elements from the queue and returns them in a + * std::queue. + * @return A std::queue containing all the elements removed from the queue. + */ + std::queue destroy(); + + /** + * @brief Returns the number of elements currently in the queue. + * @return The number of elements in the queue. + */ + [[nodiscard]] size_t size() const; + + /** + * @brief Checks if the queue is empty. + * @return True if the queue is empty, false otherwise. + */ + [[nodiscard]] bool empty() const; + + /** + * @brief Removes all elements from the queue. + */ + void clear(); + + /** + * @brief Returns the element at the front of the queue without removing it. + * @return An optional containing the element at the front of the queue, or + * empty if the queue is empty. + */ + std::optional front(); + + /** + * @brief Returns the element at the back of the queue without removing it. + * @return An optional containing the element at the back of the queue, or + * empty if the queue is empty. + */ + std::optional back(); + + /** + * @brief Constructs and adds an element to the end of the queue. + * @tparam Args The types of arguments used to construct the element. + * @param args The arguments used to construct the element. + */ template - void emplace(Args &&...args) { - { - std::lock_guard lock(m_mutex); - m_queue.emplace(std::forward(args)...); - } - m_conditionVariable.notify_one(); - } - + void emplace(Args&&... args); + + /** + * @brief Waits until a predicate becomes true for an element in the queue, + * then removes and returns that element. + * @tparam Predicate The type of predicate function or functor. + * @param predicate The predicate to wait for. + * @return An optional containing the element that satisfied the predicate, + * or empty if the queue is destroyed or the timeout expires. + */ template - std::optional waitFor(Predicate predicate) { - std::unique_lock lock(m_mutex); - m_conditionVariable.wait(lock, [this, &predicate] { - return m_mustReturnNullptr || predicate(m_queue); - }); - - if (m_mustReturnNullptr) - return {}; - - T ret = std::move(m_queue.front()); - m_queue.pop(); - - return ret; - } - - void waitUntilEmpty() { - std::unique_lock lock(m_mutex); - m_conditionVariable.wait( - lock, [this] { return m_mustReturnNullptr || m_queue.empty(); }); - } - + std::optional waitFor(Predicate predicate); + + /** + * @brief Blocks until the queue becomes empty. + */ + void waitUntilEmpty(); + + /** + * @brief Removes and returns all elements from the queue that satisfy a + * given unary predicate. + * @tparam UnaryPredicate The type of unary predicate function or functor. + * @param pred The unary predicate used to test elements. + * @return A vector containing all elements removed from the queue that + * satisfy the predicate. + */ template - std::vector extractIf(UnaryPredicate pred) { - std::vector result; - { - std::lock_guard lock(m_mutex); - auto it = m_queue.begin(); - while (it != m_queue.end()) { - if (pred(*it)) { - result.push_back(std::move(*it)); - it = m_queue.erase(it); - } else { - ++it; - } - } - } - return result; - } - + std::vector extractIf(UnaryPredicate pred); + + /** + * @brief Sorts the elements in the queue using a custom comparison + * function. + * @tparam Compare The type of comparison function or functor. + * @param comp The comparison function used to sort elements. + */ template - void sort(Compare comp) { - std::lock_guard lock(m_mutex); - std::vector temp(std::make_move_iterator(m_queue.front()), - std::make_move_iterator(m_queue.back())); - std::sort(temp.begin(), temp.end(), comp); - std::queue newQueue; - for (auto &item : temp) { - newQueue.push(std::move(item)); - } - std::swap(m_queue, newQueue); - } - - template - ThreadSafeQueue transform(std::function func) { - ThreadSafeQueue resultQueue; - { - std::lock_guard lock(m_mutex); - while (!m_queue.empty()) { - T item = std::move(m_queue.front()); - m_queue.pop(); - resultQueue.put(func(std::move(item))); - } - } - return resultQueue; - } - - template - std::vector> groupBy(std::function func) { - std::unordered_map> resultMap; - { - std::lock_guard lock(m_mutex); - while (!m_queue.empty()) { - T item = std::move(m_queue.front()); - m_queue.pop(); - GroupKey key = func(item); - resultMap[key].put(std::move(item)); - } - } - - std::vector> resultQueues; - for (auto &pair : resultMap) { - resultQueues.push_back(std::move(pair.second)); - } - - return resultQueues; - } + void sort(Compare comp); private: - std::queue m_queue; - mutable std::mutex m_mutex; - std::condition_variable m_conditionVariable; - - std::atomic m_mustReturnNullptr{false}; + std::queue m_queue; ///< The underlying queue. + mutable std::mutex m_mutex; ///< Mutex for ensuring thread safety. + std::condition_variable + m_conditionVariable; ///< Condition variable for blocking and waking + ///< threads. + std::atomic m_mustReturnNullptr{ + false}; ///< Atomic flag indicating whether the queue should return + ///< nullptr on take() when empty. }; + } // namespace Atom::Async +#include "queue.inl" + #endif diff --git a/src/atom/async/queue.inl b/src/atom/async/queue.inl new file mode 100644 index 00000000..10699765 --- /dev/null +++ b/src/atom/async/queue.inl @@ -0,0 +1,204 @@ +#ifndef ATOM_ASYNC_QUEUE_INL +#define ATOM_ASYNC_QUEUE_INL + +#include "queue.hpp" + +#include + +namespace Atom::Async { +template +void ThreadSafeQueue::put(T element) { + { + std::lock_guard lock(m_mutex); + m_queue.push(std::move(element)); + } + m_conditionVariable.notify_one(); +} + +template +std::optional ThreadSafeQueue::take() { + std::unique_lock lock(m_mutex); + m_conditionVariable.wait( + lock, [this] { return m_mustReturnNullptr || !m_queue.empty(); }); + + if (m_mustReturnNullptr) + return std::nullopt; + + T ret = std::move(m_queue.front()); + m_queue.pop(); + + return ret; +} + +template +std::queue ThreadSafeQueue::destroy() { + { + std::lock_guard lock(m_mutex); + m_mustReturnNullptr = true; + } + m_conditionVariable.notify_all(); + + std::queue result; + { + std::lock_guard lock(m_mutex); + std::swap(result, m_queue); + } + return result; +} + +template +size_t ThreadSafeQueue::size() const { + std::lock_guard lock(m_mutex); + return m_queue.size(); +} + +template +bool ThreadSafeQueue::empty() const { + std::lock_guard lock(m_mutex); + return m_queue.empty(); +} + +template +void ThreadSafeQueue::clear() { + std::lock_guard lock(m_mutex); + std::queue empty; + std::swap(m_queue, empty); +} + +template +std::optional ThreadSafeQueue::front() { + std::lock_guard lock(m_mutex); + if (m_queue.empty()) { + return std::nullopt; + } + return m_queue.front(); +} + +template +std::optional ThreadSafeQueue::back() { + std::lock_guard lock(m_mutex); + if (m_queue.empty()) { + return std::nullopt; + } + return m_queue.back(); +} + +template +template +void ThreadSafeQueue::emplace(Args&&... args) { + { + std::lock_guard lock(m_mutex); + m_queue.emplace(std::forward(args)...); + } + m_conditionVariable.notify_one(); +} + +template +template +std::optional ThreadSafeQueue::waitFor(Predicate predicate) { + std::unique_lock lock(m_mutex); + m_conditionVariable.wait(lock, [this, &predicate] { + return m_mustReturnNullptr || predicate(m_queue); + }); + + if (m_mustReturnNullptr) + return std::nullopt; + + T ret = std::move(m_queue.front()); + m_queue.pop(); + + return ret; +} + +template +void ThreadSafeQueue::waitUntilEmpty() { + std::unique_lock lock(m_mutex); + m_conditionVariable.wait( + lock, [this] { return m_mustReturnNullptr || m_queue.empty(); }); +} + +template +template +std::vector ThreadSafeQueue::extractIf(UnaryPredicate pred) { + std::vector result; + { + std::lock_guard lock(m_mutex); + auto it = + std::remove_if(m_queue.front(), m_queue.back(), [&](const T& item) { + if (pred(item)) { + result.push_back(std::move(const_cast(item))); + return true; + } + return false; + }); + m_queue.pop(); + } + return result; +} + +template +template +void ThreadSafeQueue::sort(Compare comp) { + std::lock_guard lock(m_mutex); + + // 移动元素到临时向量并排序 + std::vector temp; + while (!m_queue.empty()) { + temp.push_back(std::move(m_queue.front())); + m_queue.pop(); + } + std::sort(temp.begin(), temp.end(), comp); + + // 将排序后的元素移动到新的队列中 + std::queue newQueue; + for (auto& elem : temp) { + newQueue.push(std::move(elem)); + } + + // 交换新旧队列 + std::swap(m_queue, newQueue); +} + +/* +template +template +ThreadSafeQueue ThreadSafeQueue::transform( + std::function func) { + ThreadSafeQueue resultQueue; + { + std::lock_guard lock(m_mutex); + std::transform(std::make_move_iterator(m_queue.front()), + std::make_move_iterator(m_queue.back()), + std::back_inserter(resultQueue.m_queue), func); + std::queue empty; + std::swap(m_queue, empty); + } + // return resultQueue; +} + +template +template +std::vector> ThreadSafeQueue::groupBy( + std::function func) { + std::unordered_map> resultMap; + { + std::lock_guard lock(m_mutex); + while (!m_queue.empty()) { + T item = std::move(m_queue.front()); + m_queue.pop(); + GroupKey key = func(item); + resultMap[key].put(std::move(item)); + } + } + + std::vector> resultQueues; + resultQueues.reserve(resultMap.size()); + for (auto& pair : resultMap) { + resultQueues.push_back(std::move(pair.second)); + } + + return resultQueues; +} +*/ + +} // namespace Atom::Async \ No newline at end of file diff --git a/src/atom/async/thread_wrapper.hpp b/src/atom/async/thread_wrapper.hpp new file mode 100644 index 00000000..e87ec8a3 --- /dev/null +++ b/src/atom/async/thread_wrapper.hpp @@ -0,0 +1,163 @@ +/* + * thread_wrapper.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-13 + +Description: A simple wrapper of std::jthread + +**************************************************/ + +#ifndef ATOM_ASYNC_THREAD_WRAPPER_HPP +#define ATOM_ASYNC_THREAD_WRAPPER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @brief A wrapper class for managing a C++20 jthread. + * + * This class provides a convenient interface for managing a C++20 jthread, + * allowing for starting, stopping, and joining threads easily. + */ +class Thread { +public: + /** + * @brief Default constructor. + */ + Thread() = default; + + /** + * @brief Move constructor. + * @param other The Thread object to move from. + */ + Thread(Thread&&) noexcept = default; + + /** + * @brief Move assignment operator. + * @param other The Thread object to move from. + * @return Reference to the assigned Thread object. + */ + Thread& operator=(Thread&&) noexcept = default; + + /** + * @brief Deleted copy constructor. + */ + Thread(const Thread&) = delete; + + /** + * @brief Deleted copy assignment operator. + */ + Thread& operator=(const Thread&) = delete; + + /** + * @brief Starts a new thread with the specified callable object and + * arguments. + * + * If the callable object is invocable with a std::stop_token and the + * provided arguments, it will be invoked with a std::stop_token as the + * first argument. Otherwise, it will be invoked with the provided + * arguments. + * + * @tparam Callable The type of the callable object. + * @tparam Args The types of the arguments. + * @param func The callable object to execute in the new thread. + * @param args The arguments to pass to the callable object. + */ + template + void start(Callable&& func, Args&&... args) { + thread_ = + std::jthread([func = std::forward(func), + ... args = std::forward(args), this]() mutable { + if constexpr (std::is_invocable_v) { + func(std::stop_token(thread_.get_stop_token()), + std::move(args)...); + } else { + func(std::move(args)...); + } + }); + } + + /** + * @brief Requests the thread to stop execution. + */ + void request_stop() { thread_.request_stop(); } + + /** + * @brief Waits for the thread to finish execution. + */ + void join() { thread_.join(); } + + /** + * @brief Checks if the thread is currently running. + * @return True if the thread is running, false otherwise. + */ + [[nodiscard]] bool running() const noexcept { return thread_.joinable(); } + + /** + * @brief Swaps the content of this Thread object with another Thread + * object. + * @param other The Thread object to swap with. + */ + void swap(Thread& other) noexcept { thread_.swap(other.thread_); } + + /** + * @brief Gets the underlying std::jthread object. + * @return Reference to the underlying std::jthread object. + */ + [[nodiscard]] std::jthread& get_thread() noexcept { return thread_; } + + /** + * @brief Gets the underlying std::jthread object (const version). + * @return Constant reference to the underlying std::jthread object. + */ + [[nodiscard]] const std::jthread& get_thread() const noexcept { + return thread_; + } + + /** + * @brief Gets the ID of the thread. + * @return The ID of the thread. + */ + [[nodiscard]] std::thread::id get_id() const noexcept { + return thread_.get_id(); + } + + /** + * @brief Gets the underlying std::stop_source object. + * @return The underlying std::stop_source object. + */ + [[nodiscard]] std::stop_source get_stop_source() noexcept { + return thread_.get_stop_source(); + } + + /** + * @brief Gets the underlying std::stop_token object. + * @return The underlying std::stop_token object. + */ + [[nodiscard]] std::stop_token get_stop_token() const noexcept { + return thread_.get_stop_token(); + } + + /** + * @brief Default destructor. + */ + ~Thread() = default; + +private: + std::jthread thread_; ///< The underlying jthread object. +}; + +#endif diff --git a/src/atom/experiment/any.hpp b/src/atom/experiment/any.hpp index 14430009..c7dbb35e 100644 --- a/src/atom/experiment/any.hpp +++ b/src/atom/experiment/any.hpp @@ -28,26 +28,29 @@ concept Derived = std::is_base_of_v, Any>; class Any { public: - Any() : ptr(nullptr) {} + constexpr Any() noexcept : ptr(nullptr) {} template requires(!Derived) - Any(T &&value) : ptr(new holder>(std::forward(value))) {} + constexpr Any(T &&value) + : ptr(new holder>(std::forward(value))) {} - Any(const Any &other) : ptr(other.ptr ? other.ptr->clone() : nullptr) {} + constexpr Any(const Any &other) + : ptr(other.ptr ? other.ptr->clone() : nullptr) {} - Any(Any &&other) noexcept : ptr(std::exchange(other.ptr, nullptr)) {} + constexpr Any(Any &&other) noexcept + : ptr(std::exchange(other.ptr, nullptr)) {} ~Any() { delete ptr; } - Any &operator=(const Any &other) { + constexpr Any &operator=(const Any &other) { if (this != &other) { Any(other).swap(*this); } return *this; } - Any &operator=(Any &&other) noexcept { + constexpr Any &operator=(Any &&other) noexcept { if (this != &other) { Any(std::move(other)).swap(*this); } @@ -56,14 +59,14 @@ class Any { template requires(!Derived) - Any &operator=(T &&value) { + constexpr Any &operator=(T &&value) { Any(std::forward(value)).swap(*this); return *this; } - bool empty() const { return !ptr; } + [[nodiscard]] constexpr bool empty() const noexcept { return !ptr; } - const std::type_info &type() const { + [[nodiscard]] constexpr const std::type_info &type() const noexcept { return ptr ? ptr->type() : typeid(void); } @@ -73,25 +76,29 @@ class Any { private: class placeholder { public: - virtual ~placeholder() {} - virtual const std::type_info &type() const = 0; - virtual placeholder *clone() const = 0; + virtual ~placeholder() = default; + [[nodiscard]] virtual const std::type_info &type() const noexcept = 0; + [[nodiscard]] virtual placeholder *clone() const = 0; virtual void swap(placeholder &other) = 0; }; template class holder : public placeholder { public: - holder(T &&value) : held(std::move(value)) {} + constexpr holder(T &&value) : held(std::move(value)) {} - holder(const T &value) : held(value) {} + constexpr holder(const T &value) : held(value) {} - const std::type_info &type() const { return typeid(T); } + [[nodiscard]] const std::type_info &type() const noexcept override { + return typeid(T); + } - placeholder *clone() const { return new holder(held); } + [[nodiscard]] placeholder *clone() const override { + return new holder(held); + } - void swap(placeholder &other) { - if (holder *other_holder = dynamic_cast(&other)) { + void swap(placeholder &other) override { + if (auto other_holder = dynamic_cast(&other)) { std::swap(held, other_holder->held); } } @@ -101,7 +108,7 @@ class Any { placeholder *ptr; - void swap(Any &other) { std::swap(ptr, other.ptr); } + constexpr void swap(Any &other) noexcept { std::swap(ptr, other.ptr); } }; template diff --git a/src/atom/experiment/bind_first.hpp b/src/atom/experiment/bind_first.hpp index 8012cf72..c5b67197 100644 --- a/src/atom/experiment/bind_first.hpp +++ b/src/atom/experiment/bind_first.hpp @@ -15,7 +15,9 @@ Description: An easy way to bind a function to a object #ifndef ATOM_EXPERIMENT_BIND_FIRST_HPP #define ATOM_EXPERIMENT_BIND_FIRST_HPP +#include #include +#include template constexpr T *get_pointer(T *t) noexcept { @@ -27,29 +29,55 @@ T *get_pointer(const std::reference_wrapper &t) noexcept { return &t.get(); } +template +concept invocable = std::is_invocable_v; + +template +concept nothrow_invocable = std::is_nothrow_invocable_v; + +// 判断函数对象是否可以用给定的参数调用 +template +constexpr bool is_invocable_v = invocable; + +// 判断函数对象是否可以用给定的参数调用,且不抛出异常 +template +constexpr bool is_nothrow_invocable_v = std::is_nothrow_invocable_v; + template -constexpr auto bind_first(Ret (*f)(P1, Param...), O &&o) { +constexpr auto bind_first(Ret (*f)(P1, Param...), O &&o) + requires invocable +{ return [f, o = std::forward(o)](Param... param) -> Ret { return f(o, std::forward(param)...); }; } template -constexpr auto bind_first(Ret (Class::*f)(Param...), O &&o) { +constexpr auto bind_first(Ret (Class::*f)(Param...), O &&o) + requires invocable +{ return [f, o = std::forward(o)](Param... param) -> Ret { return (get_pointer(o)->*f)(std::forward(param)...); }; } template -constexpr auto bind_first(Ret (Class::*f)(Param...) const, O &&o) { +constexpr auto bind_first(Ret (Class::*f)(Param...) const, O &&o) + requires invocable +{ return [f, o = std::forward(o)](Param... param) -> Ret { - return (get_pointer(o)->*f)(std::forward(param)...); + if constexpr (std::is_pointer_v>) { + return (o->*f)(std::forward(param)...); + } else { + return (o.*f)(std::forward(param)...); + } }; } template -auto bind_first(const std::function &f, O &&o) { +auto bind_first(const std::function &f, O &&o) + requires invocable, O, Param...> +{ return [f, o = std::forward(o)](Param... param) -> Ret { return f(o, std::forward(param)...); }; @@ -58,15 +86,29 @@ auto bind_first(const std::function &f, O &&o) { template constexpr auto bind_first(const F &fo, O &&o, - Ret (Class::*f)(P1, Param...) const) { + Ret (Class::*f)(P1, Param...) const) + requires invocable +{ return [fo, o = std::forward(o), f](Param... param) -> Ret { return (fo.*f)(o, std::forward(param)...); }; } template -constexpr auto bind_first(const F &f, O &&o) { +constexpr auto bind_first(const F &f, O &&o) + requires invocable +{ return bind_first(f, std::forward(o), &F::operator()); } +template +constexpr auto bind_first(F &&f, O &&o) + requires std::invocable +{ + return [f = std::forward(f), + o = std::forward(o)](auto &&...param) -> decltype(auto) { + return std::invoke(f, o, std::forward(param)...); + }; +} + #endif // ATOM_EXPERIMENT_BIND_FIRST_HPP diff --git a/src/atom/experiment/callable.hpp b/src/atom/experiment/callable.hpp index 92c1c80c..059c3b59 100644 --- a/src/atom/experiment/callable.hpp +++ b/src/atom/experiment/callable.hpp @@ -1,7 +1,22 @@ +/* + * callable.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-1 + +Description: make a callabel object + +**************************************************/ + #ifndef ATOM_EXPERIMENT_CALLABLE_HPP #define ATOM_EXPERIMENT_CALLABLE_HPP #include +#include template struct Constructor { @@ -13,11 +28,14 @@ struct Constructor { template struct Const_Caller { - explicit Const_Caller(Ret (Class::*t_func)(Param...) const) + explicit constexpr Const_Caller(Ret (Class::*t_func)(Param...) + const) noexcept : m_func(t_func) {} template - Ret operator()(const Class &o, Inner &&...inner) const { + constexpr Ret operator()(const Class &o, Inner &&...inner) const + noexcept(noexcept((std::declval().* + m_func)(std::declval()...))) { return (o.*m_func)(std::forward(inner)...); } @@ -26,10 +44,12 @@ struct Const_Caller { template struct Fun_Caller { - explicit Fun_Caller(Ret (*t_func)(Param...)) : m_func(t_func) {} + explicit constexpr Fun_Caller(Ret (*t_func)(Param...)) noexcept + : m_func(t_func) {} template - Ret operator()(Inner &&...inner) const { + constexpr Ret operator()(Inner &&...inner) const + noexcept(noexcept(m_func(std::declval()...))) { return (m_func)(std::forward(inner)...); } @@ -38,10 +58,13 @@ struct Fun_Caller { template struct Caller { - explicit Caller(Ret (Class::*t_func)(Param...)) : m_func(t_func) {} + explicit constexpr Caller(Ret (Class::*t_func)(Param...)) noexcept + : m_func(t_func) {} template - Ret operator()(Class &o, Inner &&...inner) const { + constexpr Ret operator()(Class &o, Inner &&...inner) const + noexcept(noexcept((std::declval().* + m_func)(std::declval()...))) { return (o.*m_func)(std::forward(inner)...); } @@ -49,12 +72,8 @@ struct Caller { }; template -struct Arity {}; - -template -struct Arity { - static const size_t arity = sizeof...(Params); -}; +struct Arity + : std::integral_constant>> {}; template struct Function_Signature {}; @@ -73,10 +92,10 @@ struct Function_Signature { template struct Callable_Traits { - using Signature = - typename Function_Signature::Signature; - using Return_Type = - typename Function_Signature::Return_Type; + using Signature = typename Function_Signature< + decltype(&std::remove_reference_t::operator())>::Signature; + using Return_Type = typename Function_Signature< + decltype(&std::remove_reference_t::operator())>::Return_Type; }; #endif diff --git a/src/atom/experiment/static_vector.hpp b/src/atom/experiment/static_vector.hpp new file mode 100644 index 00000000..576ae381 --- /dev/null +++ b/src/atom/experiment/static_vector.hpp @@ -0,0 +1,204 @@ +/* + * static_vector.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-1 + +Description: A static vector + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_STATIC_VECTOR_HPP +#define ATOM_EXPERIMENT_STATIC_VECTOR_HPP + +#include +#include +#include +#include +#include +#include + +template +class StaticVector { +public: + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + constexpr StaticVector() noexcept = default; + + constexpr StaticVector(std::initializer_list init) noexcept { + assert(init.size() <= Capacity); + std::copy(init.begin(), init.end(), begin()); + m_size = init.size(); + } + + constexpr void push_back(const T& value) noexcept { + assert(m_size < Capacity); + m_data[m_size++] = value; + } + + constexpr void push_back(T&& value) noexcept { + assert(m_size < Capacity); + m_data[m_size++] = std::move(value); + } + + template + constexpr reference emplace_back(Args&&... args) noexcept { + assert(m_size < Capacity); + return m_data[m_size++] = T(std::forward(args)...); + } + + constexpr void pop_back() noexcept { + assert(m_size > 0); + --m_size; + } + + constexpr void clear() noexcept { m_size = 0; } + + [[nodiscard]] constexpr bool empty() const noexcept { return m_size == 0; } + + [[nodiscard]] constexpr size_type size() const noexcept { return m_size; } + + [[nodiscard]] constexpr size_type capacity() const noexcept { + return Capacity; + } + + [[nodiscard]] constexpr reference operator[](size_type index) noexcept { + assert(index < m_size); + return m_data[index]; + } + + [[nodiscard]] constexpr const_reference operator[]( + size_type index) const noexcept { + assert(index < m_size); + return m_data[index]; + } + + [[nodiscard]] constexpr reference at(size_type index) { + if (index >= m_size) { + throw std::out_of_range("StaticVector::at"); + } + return m_data[index]; + } + + [[nodiscard]] constexpr const_reference at(size_type index) const { + if (index >= m_size) { + throw std::out_of_range("StaticVector::at"); + } + return m_data[index]; + } + + [[nodiscard]] constexpr reference front() noexcept { + assert(m_size > 0); + return m_data[0]; + } + + [[nodiscard]] constexpr const_reference front() const noexcept { + assert(m_size > 0); + return m_data[0]; + } + + [[nodiscard]] constexpr reference back() noexcept { + assert(m_size > 0); + return m_data[m_size - 1]; + } + + [[nodiscard]] constexpr const_reference back() const noexcept { + assert(m_size > 0); + return m_data[m_size - 1]; + } + + [[nodiscard]] constexpr pointer data() noexcept { return m_data.data(); } + + [[nodiscard]] constexpr const_pointer data() const noexcept { + return m_data.data(); + } + + [[nodiscard]] constexpr iterator begin() noexcept { return data(); } + + [[nodiscard]] constexpr const_iterator begin() const noexcept { + return data(); + } + + [[nodiscard]] constexpr const_iterator cbegin() const noexcept { + return begin(); + } + + [[nodiscard]] constexpr iterator end() noexcept { return data() + m_size; } + + [[nodiscard]] constexpr const_iterator end() const noexcept { + return data() + m_size; + } + + [[nodiscard]] constexpr const_iterator cend() const noexcept { + return end(); + } + + [[nodiscard]] constexpr reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + [[nodiscard]] constexpr const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + [[nodiscard]] constexpr reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + [[nodiscard]] constexpr const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept { + return rend(); + } + + constexpr void swap(StaticVector& other) noexcept { + using std::swap; + swap(m_data, other.m_data); + swap(m_size, other.m_size); + } + +private: + std::array m_data{}; + size_type m_size{0}; +}; + +template +constexpr bool operator==(const StaticVector& lhs, + const StaticVector& rhs) noexcept { + return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); +} + +template +constexpr auto operator<=>(const StaticVector& lhs, + const StaticVector& rhs) noexcept { + return std::lexicographical_compare_three_way(lhs.begin(), lhs.end(), + rhs.begin(), rhs.end()); +} + +template +constexpr void swap(StaticVector& lhs, + StaticVector& rhs) noexcept { + lhs.swap(rhs); +} + +#endif // ATOM_EXPERIMENT_STATIC_VECTOR_HPP \ No newline at end of file diff --git a/src/atom/experiment/svector.cpp b/src/atom/experiment/svector.cpp deleted file mode 100644 index 3d88a6f8..00000000 --- a/src/atom/experiment/svector.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef CHAISCRIPT_STACK_VECTOR_HPP_ -#define CHAISCRIPT_STACK_VECTOR_HPP_ - -#include -#include -#include -#include // for std::forward, std::move - -template -struct Stack_Vector { - Stack_Vector() noexcept = default; - Stack_Vector(const Stack_Vector &other) { - m_size = other.m_size; - for (std::size_t i = 0; i < m_size; ++i) { - new (&(*this)[i]) T(other[i]); - } - } - - Stack_Vector(Stack_Vector &&other) noexcept - : data{other.data}, m_size{other.m_size} { - other.m_size = 0; - } - - ~Stack_Vector() noexcept(std::is_nothrow_destructible_v) { - for (std::size_t pos = 0; pos < m_size; ++pos) { - (*this)[pos].~T(); - } - } - - constexpr static auto aligned_size = - sizeof(T) + (sizeof(T) & std::alignment_of_v) > 0 - ? std::alignment_of_v - : 0; - - alignas(std::alignment_of_v) char data[aligned_size * MaxSize]; - - [[nodiscard]] T &operator[](const std::size_t idx) noexcept { - return *reinterpret_cast(&data + aligned_size * idx); - } - - [[nodiscard]] const T &operator[](const std::size_t idx) const noexcept { - return *reinterpret_cast(&data + aligned_size * idx); - } - - template - T &emplace_back(Param &&...param) { - auto *p = new (&(*this)[m_size++]) T(std::forward(param)...); - return *p; - }; - - auto size() const noexcept { return m_size; }; - auto capacity() const noexcept { return MaxSize; }; - void pop_back() noexcept(std::is_nothrow_destructible_v) { - (*this)[--m_size].~T(); - } - void resize(std::size_t new_size) { m_size = new_size; } - - Stack_Vector &operator=(const Stack_Vector &other) { - if (this != &other) { - for (std::size_t i = 0; i < m_size; ++i) { - (*this)[i].~T(); - } - m_size = other.m_size; - for (std::size_t i = 0; i < m_size; ++i) { - new (&(*this)[i]) T(other[i]); - } - } - return *this; - } - - Stack_Vector &operator=(Stack_Vector &&other) noexcept { - if (this != &other) { - for (std::size_t i = 0; i < m_size; ++i) { - (*this)[i].~T(); - } - std::swap(data, other.data); - std::swap(m_size, other.m_size); - } - return *this; - } - - std::size_t m_size{0}; -}; - -#endif // CHAISCRIPT_STACK_VECTOR_HPP_ - -#include -#include - -struct Foo { - int a; - double b; - float c; - - Foo(int a, double b, float c) : a(a), b(b), c(c) {} - - ~Foo() { std::cout << "Destructing Foo\n"; } -}; - -int main() { - Stack_Vector sv; - - sv.emplace_back(1, 2.3, 1.1); - sv.emplace_back(4, 5.6, 1.2); - - std::cout << sv[0].a << ", " << sv[0].b << sv[0].c << "\n"; - std::cout << sv[1].a << ", " << sv[1].b << sv[1].c << "\n"; - - sv.pop_back(); - - std::cout << sv[0].a << ", " << sv[0].b << "\n"; -} \ No newline at end of file diff --git a/src/atom/experiment/stringutils.hpp b/src/atom/experiment/to_string.hpp similarity index 100% rename from src/atom/experiment/stringutils.hpp rename to src/atom/experiment/to_string.hpp diff --git a/src/atom/type/small_vector.hpp b/src/atom/type/small_vector.hpp index 4640f31d..a27fdc16 100644 --- a/src/atom/type/small_vector.hpp +++ b/src/atom/type/small_vector.hpp @@ -15,114 +15,307 @@ Description: A Small Vector Implementation #ifndef ATOM_TYPE_SMALL_VECTOR_HPP #define ATOM_TYPE_SMALL_VECTOR_HPP -#include -#include +#include +#include +#include +#include +#include +#include -template +// 内部存储的最大容量 +constexpr std::size_t InternalBufferSize = 16; + +template class SmallVector { public: - // 构造函数 - SmallVector() : m_size(0), m_capacity(N) { m_data = m_inlineData; } - - // 复制构造函数 - SmallVector(const SmallVector &other) - : m_size(other.m_size), m_capacity(other.m_capacity) { - if (other.m_size > N) { - m_data = new T[other.m_capacity]; - std::copy(other.m_data, other.m_data + other.m_size, m_data); - } else { - m_data = m_inlineData; - std::copy(other.m_data, other.m_data + other.m_size, m_data); - } + SmallVector() noexcept : m_size(0), m_isExternal(false) {} + + SmallVector(std::initializer_list ilist) : SmallVector() { + reserve(ilist.size()); + std::uninitialized_copy(ilist.begin(), ilist.end(), + m_isExternal ? m_external : m_internal); + m_size = ilist.size(); } - // 移动构造函数 - SmallVector(SmallVector &&other) noexcept - : m_size(other.m_size), - m_capacity(other.m_capacity), - m_data(other.m_data) { - if (other.m_size > N) { - other.m_data = nullptr; - } else { - std::copy(other.m_inlineData, other.m_inlineData + other.m_size, - m_inlineData); - } + SmallVector(const SmallVector& other) : SmallVector() { + reserve(other.m_size); + std::uninitialized_copy(other.begin(), other.end(), + m_isExternal ? m_external : m_internal); + m_size = other.m_size; } - // 析构函数 - ~SmallVector() { - if (m_data != m_inlineData) { - delete[] m_data; - } + SmallVector(SmallVector&& other) noexcept : SmallVector() { + moveAssign(std::move(other)); } - // 赋值操作符重载 - SmallVector &operator=(const SmallVector &other) { + ~SmallVector() { clear(); } + + SmallVector& operator=(const SmallVector& other) { if (this != &other) { + clear(); + reserve(other.m_size); + std::uninitialized_copy(other.begin(), other.end(), + m_isExternal ? m_external : m_internal); m_size = other.m_size; - m_capacity = other.m_capacity; - if (other.m_size > N) { - if (m_data != m_inlineData) { - delete[] m_data; - } - m_data = new T[other.m_capacity]; - std::copy(other.m_data, other.m_data + other.m_size, m_data); - } else { - if (m_data != m_inlineData) { - delete[] m_data; - } - m_data = m_inlineData; - std::copy(other.m_data, other.m_data + other.m_size, m_data); - } } return *this; } - // 添加元素 - void push_back(const T &value) { - if (m_size == m_capacity) { - if (m_capacity == N) { - m_capacity *= 2; - m_data = new T[m_capacity]; - std::copy(m_inlineData, m_inlineData + m_size, m_data); + SmallVector& operator=(SmallVector&& other) noexcept { + if (this != &other) { + moveAssign(std::move(other)); + } + return *this; + } + + T& operator[](std::size_t index) { + return const_cast(static_cast(*this)[index]); + } + + const T& operator[](std::size_t index) const { + return m_isExternal ? m_external[index] : m_internal[index]; + } + + bool operator==(const SmallVector& other) const { + if (m_size != other.m_size) { + return false; + } + for (std::size_t i = 0; i < m_size; ++i) { + if ((*this)[i] != other[i]) { + return false; + } + } + return true; + } + + bool operator!=(const SmallVector& other) const { + return !(*this == other); + } + + T* data() noexcept { return m_isExternal ? m_external : m_internal; } + + const T* data() const noexcept { + return m_isExternal ? m_external : m_internal; + } + + std::size_t size() const noexcept { return m_size; } + + std::size_t capacity() const noexcept { + return m_isExternal ? m_externalCapacity : N; + } + + bool empty() const noexcept { return m_size == 0; } + + void clear() noexcept { + if (m_isExternal) { + std::destroy(m_external, m_external + m_size); + ::operator delete(m_external, m_externalCapacity * sizeof(T)); + m_external = nullptr; + m_externalCapacity = 0; + } else { + std::destroy(m_internal, m_internal + m_size); + } + m_size = 0; + m_isExternal = false; + } + + void reserve(std::size_t newCapacity) { + if (newCapacity <= capacity()) { + return; + } + + if (newCapacity > N) { + if (m_isExternal) { + m_external = + static_cast(::operator new(newCapacity * sizeof(T))); + std::uninitialized_copy( + std::make_move_iterator(m_external), + std::make_move_iterator(m_external + m_size), m_external); + std::destroy(m_external, m_external + m_size); + ::operator delete(m_external, m_externalCapacity * sizeof(T)); + m_externalCapacity = newCapacity; } else { - m_capacity *= 2; - T *newData = new T[m_capacity]; - std::copy(m_data, m_data + m_size, newData); - delete[] m_data; - m_data = newData; + T* newBuffer = + static_cast(::operator new(newCapacity * sizeof(T))); + std::uninitialized_copy( + std::make_move_iterator(m_internal), + std::make_move_iterator(m_internal + m_size), newBuffer); + std::destroy(m_internal, m_internal + m_size); + m_external = newBuffer; + m_externalCapacity = newCapacity; + m_isExternal = true; } } - m_data[m_size++] = value; } - // 删除最后一个元素 - void pop_back() { - if (m_size > 0) { - --m_size; + void resize(std::size_t newSize) { + reserve(newSize); + if (newSize > m_size) { + std::uninitialized_fill( + m_isExternal ? m_external + m_size : m_internal + m_size, + m_isExternal ? m_external + newSize : m_internal + newSize, + T()); + } else { + std::destroy( + m_isExternal ? m_external + newSize : m_internal + newSize, + m_isExternal ? m_external + m_size : m_internal + m_size); } + m_size = newSize; } - // 清空向量 - void clear() { m_size = 0; } + void push_back(const T& value) { + reserve(m_size + 1); + ::new (m_isExternal ? m_external + m_size : m_internal + m_size) + T(value); + ++m_size; + } + + void push_back(T&& value) { + reserve(m_size + 1); + ::new (m_isExternal ? m_external + m_size : m_internal + m_size) + T(std::move(value)); + ++m_size; + } + + template + T& emplace_back(Args&&... args) { + reserve(m_size + 1); + T* newElement = + m_isExternal ? m_external + m_size : m_internal + m_size; + ::new (newElement) T(std::forward(args)...); + ++m_size; + return *newElement; + } + + void pop_back() { + --m_size; + std::destroy_at(m_isExternal ? m_external + m_size + : m_internal + m_size); + } + +public: + // 迭代器类型别名 + using iterator = T*; + using const_iterator = const T*; + + // 迭代器方法 + iterator begin() noexcept { return data(); } + + const_iterator begin() const noexcept { return data(); } + + iterator end() noexcept { return data() + m_size; } + + const_iterator end() const noexcept { return data() + m_size; } + + const_iterator cbegin() const noexcept { return begin(); } + + const_iterator cend() const noexcept { return end(); } + + // 反向迭代器方法 + std::reverse_iterator rbegin() noexcept { + return std::reverse_iterator(end()); + } + + std::reverse_iterator rbegin() const noexcept { + return std::reverse_iterator(end()); + } + + std::reverse_iterator rend() noexcept { + return std::reverse_iterator(begin()); + } - // 获取元素个数 - size_t size() const { return m_size; } + std::reverse_iterator rend() const noexcept { + return std::reverse_iterator(begin()); + } - // 获取容量大小 - size_t capacity() const { return m_capacity; } + std::reverse_iterator crbegin() const noexcept { + return rbegin(); + } - // 判断向量是否为空 - bool empty() const { return m_size == 0; } + std::reverse_iterator crend() const noexcept { + return rend(); + } - // 通过索引访问元素 - T &operator[](size_t index) { return m_data[index]; } +public: + // 三路比较运算符 +public: + /* + // 三路比较运算符 + auto operator<=>(const SmallVector& other) const { + if constexpr (std::is_arithmetic_v) { + // 对于内置算术类型,使用 std::is_eq 和 std::is_neq + for (std::size_t i = 0; i < std::min(m_size, other.m_size); ++i) + { if (std::is_neq((*this)[i], other[i])) { return (*this)[i] < other[i] ? + std::partial_ordering::less : (*this)[i] > other[i] ? + std::partial_ordering::greater : std::partial_ordering::unordered; + } + } + + return m_size < other.m_size ? std::partial_ordering::less + : m_size > other.m_size ? std::partial_ordering::greater + : + std::partial_ordering::equivalent; } else { + // 对于自定义类型,使用 operator<=> + using BuiltinThreeWay = + std::partial_ordering (*)(const T&, const T&); + BuiltinThreeWay cmp = &T::operator<=>; + + for (std::size_t i = 0; i < std::min(m_size, other.m_size); ++i) + { auto result = cmp((*this)[i], other[i]); if (result != + std::partial_ordering::equivalent) { return result; + } + } + + return m_size < other.m_size ? std::partial_ordering::less + : m_size > other.m_size ? std::partial_ordering::greater + : + std::partial_ordering::equivalent; + } + } + */ + +public: + static std::string partialOrderingToString(std::partial_ordering order) { + switch (order) { + case std::partial_ordering::less: + return "less"; + case std::partial_ordering::equivalent: + return "equivalent"; + case std::partial_ordering::greater: + return "greater"; + case std::partial_ordering::unordered: + return "unordered"; + default: + return "unknown"; + } + } private: - size_t m_size; // 元素个数 - size_t m_capacity; // 容量大小 - T *m_data; // 存储数据的指针 - T m_inlineData[N]; // 内置的数据存储空间 + void moveAssign(SmallVector&& other) noexcept { + clear(); + if (other.m_isExternal) { + m_external = other.m_external; + m_externalCapacity = other.m_externalCapacity; + other.m_external = nullptr; + other.m_externalCapacity = 0; + } else { + std::uninitialized_copy( + std::make_move_iterator(other.m_internal), + std::make_move_iterator(other.m_internal + other.m_size), + m_internal); + } + m_size = other.m_size; + m_isExternal = other.m_isExternal; + other.m_size = 0; + other.m_isExternal = false; + } + + alignas(T) std::byte m_internalBuffer[N * sizeof(T)]; + T* m_internal = reinterpret_cast(m_internalBuffer); + T* m_external = nullptr; + std::size_t m_externalCapacity = 0; + std::size_t m_size = 0; + bool m_isExternal = false; }; #endif diff --git a/src/atom/utils/string.cpp b/src/atom/utils/string.cpp index 0c3716de..fc626e62 100644 --- a/src/atom/utils/string.cpp +++ b/src/atom/utils/string.cpp @@ -137,25 +137,38 @@ std::string urlDecode(const std::string &str) { return result; } -std::vector splitString(const std::string &input, char delimiter) { - std::vector tokens; -#ifndef ATOM_USE_OBSOLETE - std::istringstream ss(input); - std::string token; - while (std::getline(ss, token, delimiter)) { - tokens.push_back(token); - } - return tokens; -#else +std::vector splitString(const std::string &str, + char delimiter) { + std::vector result; + std::string_view view(str); size_t pos = 0; - size_t foundPos = input.find(delimiter); - while (foundPos != std::string::npos) { - tokens.push_back(input.substr(pos, foundPos - pos)); - pos = foundPos + 1; - foundPos = input.find(delimiter, pos); + + while (true) { + size_t next_pos = view.find(delimiter, pos); + if (next_pos == std::string_view::npos) { + result.emplace_back(view.substr(pos)); + break; + } + result.emplace_back(view.substr(pos, next_pos - pos)); + pos = next_pos + 1; } - tokens.push_back(input.substr(pos)); -#endif - return tokens; + + return result; +} + +std::string joinStrings(const std::vector &strings, + const std::string_view &delimiter) { + std::ostringstream oss; + bool first = true; + + for (const auto &str : strings) { + if (!first) { + oss << delimiter; + } + oss << str; + first = false; + } + + return oss.str(); } } // namespace Atom::Utils \ No newline at end of file diff --git a/src/atom/utils/string.hpp b/src/atom/utils/string.hpp index 50774ad5..5617e6e5 100644 --- a/src/atom/utils/string.hpp +++ b/src/atom/utils/string.hpp @@ -60,8 +60,11 @@ namespace Atom::Utils { * @param delimiter 分隔符。 * @return 分割后的字符串数组。 */ -[[nodiscard]] std::vector splitString(const std::string &input, - char delimiter); +[[nodiscard]] std::vector splitString(const std::string &str, + char delimiter); + + std::string joinStrings(const std::vector &strings, + const std::string_view &delimiter) } // namespace Atom::Utils #endif \ No newline at end of file From 4f4822db53a64f78de69ff766680ab09deb1154f Mon Sep 17 00:00:00 2001 From: Max Qian <64824374+AstroAir@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:55:56 +0000 Subject: [PATCH 05/28] add chaiscript and rename it to carbon --- README.md | 4 +- .../atom-touptek/detail/libtoupbase.cpp | 2 +- example/benchmark.hpp | 71 + scripts/build_ci.sh | 19 +- src/atom/server/global_ptr.hpp | 40 +- src/carbon/README.md | 3 + src/carbon/basic.hpp | 34 + src/carbon/carbon.hpp | 868 +++++ src/carbon/command/any.hpp | 110 + src/carbon/command/bad_boxed_cast.cpp | 16 + src/carbon/command/bad_boxed_cast.hpp | 54 + src/carbon/command/bootstrap.hpp | 573 +++ src/carbon/command/bootstrap_stl.hpp | 576 +++ src/carbon/command/boxed_cast.hpp | 109 + src/carbon/command/boxed_cast_helper.hpp | 278 ++ src/carbon/command/boxed_number.cpp | 0 src/carbon/command/boxed_number.hpp | 857 +++++ src/carbon/command/boxed_value.cpp | 123 + src/carbon/command/boxed_value.hpp | 322 ++ src/carbon/command/dispatchkit.hpp | 1405 ++++++++ src/carbon/command/dynamic_object.cpp | 68 + src/carbon/command/dynamic_object.hpp | 67 + src/carbon/command/dynamic_object_detail.cpp | 176 + src/carbon/command/dynamic_object_detail.hpp | 124 + .../command/exception_specification.hpp | 107 + src/carbon/command/function_call.hpp | 131 + src/carbon/command/function_call_detail.hpp | 101 + src/carbon/command/function_params.hpp | 68 + src/carbon/command/function_signature.hpp | 186 + src/carbon/command/handle_return.hpp | 201 ++ src/carbon/command/operators.hpp | 211 ++ src/carbon/command/proxy_constructors.hpp | 57 + src/carbon/command/proxy_functions.cpp | 471 +++ src/carbon/command/proxy_functions.hpp | 642 ++++ src/carbon/command/proxy_functions_detail.hpp | 108 + src/carbon/command/register_function.hpp | 129 + src/carbon/command/type_conversions.hpp | 640 ++++ src/carbon/defines.hpp | 273 ++ src/carbon/language/algebraic.hpp | 164 + src/carbon/language/common.hpp | 748 ++++ src/carbon/language/engine.hpp | 882 +++++ src/carbon/language/eval.hpp | 1789 ++++++++++ src/carbon/language/optimizer.hpp | 521 +++ src/carbon/language/parser.hpp | 3178 +++++++++++++++++ src/carbon/language/posix.hpp | 50 + src/carbon/language/prelude.hpp | 558 +++ src/carbon/language/prelude_docs.hpp | 832 +++++ src/carbon/language/tracer.hpp | 33 + src/carbon/language/unknown.hpp | 21 + src/carbon/language/windows.hpp | 109 + src/carbon/stdlib.hpp | 70 + src/carbon/threading.hpp | 133 + src/carbon/utils/json.hpp | 665 ++++ src/carbon/utils/json_wrap.hpp | 138 + src/carbon/utils/utility.hpp | 105 + 55 files changed, 19198 insertions(+), 22 deletions(-) create mode 100644 example/benchmark.hpp create mode 100644 src/carbon/README.md create mode 100644 src/carbon/basic.hpp create mode 100644 src/carbon/carbon.hpp create mode 100644 src/carbon/command/any.hpp create mode 100644 src/carbon/command/bad_boxed_cast.cpp create mode 100644 src/carbon/command/bad_boxed_cast.hpp create mode 100644 src/carbon/command/bootstrap.hpp create mode 100644 src/carbon/command/bootstrap_stl.hpp create mode 100644 src/carbon/command/boxed_cast.hpp create mode 100644 src/carbon/command/boxed_cast_helper.hpp create mode 100644 src/carbon/command/boxed_number.cpp create mode 100644 src/carbon/command/boxed_number.hpp create mode 100644 src/carbon/command/boxed_value.cpp create mode 100644 src/carbon/command/boxed_value.hpp create mode 100644 src/carbon/command/dispatchkit.hpp create mode 100644 src/carbon/command/dynamic_object.cpp create mode 100644 src/carbon/command/dynamic_object.hpp create mode 100644 src/carbon/command/dynamic_object_detail.cpp create mode 100644 src/carbon/command/dynamic_object_detail.hpp create mode 100644 src/carbon/command/exception_specification.hpp create mode 100644 src/carbon/command/function_call.hpp create mode 100644 src/carbon/command/function_call_detail.hpp create mode 100644 src/carbon/command/function_params.hpp create mode 100644 src/carbon/command/function_signature.hpp create mode 100644 src/carbon/command/handle_return.hpp create mode 100644 src/carbon/command/operators.hpp create mode 100644 src/carbon/command/proxy_constructors.hpp create mode 100644 src/carbon/command/proxy_functions.cpp create mode 100644 src/carbon/command/proxy_functions.hpp create mode 100644 src/carbon/command/proxy_functions_detail.hpp create mode 100644 src/carbon/command/register_function.hpp create mode 100644 src/carbon/command/type_conversions.hpp create mode 100644 src/carbon/defines.hpp create mode 100644 src/carbon/language/algebraic.hpp create mode 100644 src/carbon/language/common.hpp create mode 100644 src/carbon/language/engine.hpp create mode 100644 src/carbon/language/eval.hpp create mode 100644 src/carbon/language/optimizer.hpp create mode 100644 src/carbon/language/parser.hpp create mode 100644 src/carbon/language/posix.hpp create mode 100644 src/carbon/language/prelude.hpp create mode 100644 src/carbon/language/prelude_docs.hpp create mode 100644 src/carbon/language/tracer.hpp create mode 100644 src/carbon/language/unknown.hpp create mode 100644 src/carbon/language/windows.hpp create mode 100644 src/carbon/stdlib.hpp create mode 100644 src/carbon/threading.hpp create mode 100644 src/carbon/utils/json.hpp create mode 100644 src/carbon/utils/json_wrap.hpp create mode 100644 src/carbon/utils/utility.hpp diff --git a/README.md b/README.md index a33682ff..33f691a6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## Lithium +# Lithium

@@ -124,7 +124,7 @@ Everything is very simple. The entire process is straightforward. Here is a poem adapted from a quote : -``` +```txt Learning requires not mere imagination, Nor can it be attained through mediocre dedication. It is through diligent accumulation, diff --git a/driver/camera/atom-touptek/detail/libtoupbase.cpp b/driver/camera/atom-touptek/detail/libtoupbase.cpp index c4ccb72b..b4928da2 100644 --- a/driver/camera/atom-touptek/detail/libtoupbase.cpp +++ b/driver/camera/atom-touptek/detail/libtoupbase.cpp @@ -40,7 +40,7 @@ std::string errorCodes(HRESULT rc) { return it->second; else { char str[256]; - sprintf(str, "Unknown error: 0x%08x", rc); + snprintf(str, sizeof(str), "Unknown error: 0x%08x", rc); return std::string(str); } } \ No newline at end of file diff --git a/example/benchmark.hpp b/example/benchmark.hpp new file mode 100644 index 00000000..ed082877 --- /dev/null +++ b/example/benchmark.hpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include + +class Benchmark { +public: + using Clock = std::chrono::high_resolution_clock; + using TimePoint = Clock::time_point; + using Duration = Clock::duration; + + Benchmark(const std::string& name) : name_(name) {} + + template + void Run(Func&& func, int iterations) { + std::vector durations; + durations.reserve(iterations); + + for (int i = 0; i < iterations; ++i) { + TimePoint start = Clock::now(); + func(); + Duration elapsed = Clock::now() - start; + durations.push_back(elapsed); + } + + Duration totalDuration = std::accumulate( + durations.begin(), durations.end(), Duration::zero()); + double averageDuration = static_cast(totalDuration.count()) / + iterations / 1000.0; // in microseconds + double variance = 0.0; + for (const auto& d : durations) { + variance += std::pow( + static_cast(d.count()) / 1000.0 - averageDuration, 2); + } + variance /= iterations; + double standardDeviation = std::sqrt(variance); + + results_.push_back({name_, totalDuration, averageDuration, + standardDeviation, iterations}); + } + + static void PrintResults() { + std::cout << "Benchmark Results:\n"; + for (const auto& result : results_) { + std::cout << result.name << ": " + << std::chrono::duration_cast( + result.totalDuration) + .count() + << " us (avg: " << result.averageDuration + << " us, std dev: " << result.standardDeviation << " us, " + << result.iterations << " iterations)\n"; + } + } + +private: + struct Result { + std::string name; + Duration totalDuration; + double averageDuration; + double standardDeviation; + int iterations; + }; + + static inline std::vector results_; + std::string name_; +}; + +#define BENCHMARK(name, func, iterations) Benchmark(name).Run(func, iterations) \ No newline at end of file diff --git a/scripts/build_ci.sh b/scripts/build_ci.sh index a7685891..d092c611 100644 --- a/scripts/build_ci.sh +++ b/scripts/build_ci.sh @@ -24,6 +24,13 @@ else echo "gcc and g++ are already installed." fi +# Check if g++ version is at least 10 +gpp_version=$(g++ --version | grep -oP '(?<=g\+\+ )[0-9]+') +if [ "$gpp_version" -lt "10" ]; then + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt-get install gcc-13 g++-13 -y +fi + # Check if CMake is installed if ! command -v cmake &> /dev/null; then echo "CMake is not installed. Installing..." @@ -32,6 +39,16 @@ else echo "CMake is already installed." fi +# Check if CMake version is at least 3.20 +cmake_version=$(cmake --version | grep -oP '(?<=version )([0-9]+\.[0-9]+)') +if [ "$(printf "%s\n" "3.20" "$cmake_version" | sort -V | head -n1)" != "3.20" ]; then + wget https://cmake.org/files/v3.28/cmake-3.28.0-rc5.tar.gz + tar -zxvf cmake-3.28.0-rc5.tar.gz + cd cmake-3.28.0-rc5 + ./bootstrap && make && sudo make install + cd .. +fi + echo "Updating system packages..." apt-get update apt-get upgrade -y @@ -48,4 +65,4 @@ for lib in cfitsio zlib ssl zip nova fmt; do fi done -echo "Build environment setup completed." \ No newline at end of file +echo "Build environment setup completed." diff --git a/src/atom/server/global_ptr.hpp b/src/atom/server/global_ptr.hpp index d95fc6fa..e94ec099 100644 --- a/src/atom/server/global_ptr.hpp +++ b/src/atom/server/global_ptr.hpp @@ -19,6 +19,7 @@ Description: Global shared pointer manager #include #include #include +#include #include #include #if ENABLE_FASTHASH @@ -57,8 +58,10 @@ class GlobalSharedPtrManager : public NonCopyable { * @param key the key associated with the shared pointer. * @return the shared pointer if found, nullptr otherwise. */ + template - std::shared_ptr getSharedPtr(const std::string &key); + [[nodiscard]] std::optional> getSharedPtr( + const std::string &key); /** * @brief getWeakPtr retrieves a weak pointer from the shared pointer map @@ -70,7 +73,7 @@ class GlobalSharedPtrManager : public NonCopyable { * @note The weak pointer is not guaranteed to be valid after the shared */ template - std::weak_ptr getWeakPtr(const std::string &key); + [[nodiscard]] std::weak_ptr getWeakPtr(const std::string &key); /** * @brief addSharedPtr adds a shared pointer to the shared pointer map with @@ -112,7 +115,7 @@ class GlobalSharedPtrManager : public NonCopyable { * object still exists, nullptr otherwise. */ template - std::shared_ptr getSharedPtrFromWeakPtr(const std::string &key); + [[nodiscard]] std::shared_ptr getSharedPtrFromWeakPtr(const std::string &key); /** * @brief removeExpiredWeakPtrs removes all expired weak pointers from the @@ -164,19 +167,16 @@ class GlobalSharedPtrManager : public NonCopyable { }; template -std::shared_ptr GlobalSharedPtrManager::getSharedPtr( +std::optional> GlobalSharedPtrManager::getSharedPtr( const std::string &key) { - std::shared_lock lock(mtx); + std::shared_lock lock(mtx); auto it = sharedPtrMap.find(key); if (it != sharedPtrMap.end()) { - try { - return std::any_cast>(it->second); - } catch (const std::bad_any_cast &) { - return nullptr; // 类型转换失败,返回空指针 + if (auto ptr = std::any_cast>(&it->second)) { + return *ptr; } } - - return nullptr; + return std::nullopt; } template @@ -196,14 +196,14 @@ std::weak_ptr GlobalSharedPtrManager::getWeakPtr(const std::string &key) { template void GlobalSharedPtrManager::addSharedPtr(const std::string &key, std::shared_ptr sharedPtr) { - std::unique_lock lock(mtx); + std::scoped_lock lock(mtx); sharedPtrMap[key] = sharedPtr; } template void GlobalSharedPtrManager::addWeakPtr(const std::string &key, const std::weak_ptr &weakPtr) { - std::unique_lock lock(mtx); + std::scoped_lock lock(mtx); sharedPtrMap[key] = weakPtr; } @@ -227,17 +227,21 @@ template void GlobalSharedPtrManager::removeExpiredWeakPtrs() { std::vector keysToRemove; { - std::shared_lock lock(mtx); + std::shared_lock lock(mtx); for (auto &it : sharedPtrMap) { - if (auto weakPtr = std::any_cast>(it.second); - weakPtr.expired()) { - keysToRemove.push_back(it.first); + try { + if (auto weakPtr = std::any_cast>(&it.second); + weakPtr && weakPtr->expired()) { + keysToRemove.push_back(it.first); + } + } catch (const std::bad_any_cast &) { + // TODO: Handle or ignore bad cast } } } if (!keysToRemove.empty()) { - std::unique_lock lock(mtx); + std::scoped_lock lock(mtx); for (auto &key : keysToRemove) { sharedPtrMap.erase(key); } diff --git a/src/carbon/README.md b/src/carbon/README.md new file mode 100644 index 00000000..4d39744e --- /dev/null +++ b/src/carbon/README.md @@ -0,0 +1,3 @@ +# Carbon + +A super enhanced script engine based on ChaiScript. diff --git a/src/carbon/basic.hpp b/src/carbon/basic.hpp new file mode 100644 index 00000000..cd6048f0 --- /dev/null +++ b/src/carbon/basic.hpp @@ -0,0 +1,34 @@ + + +#ifndef CARBON_BASIC_HPP +#define CARBON_BASIC_HPP + +#include "defines.hpp" + +#include "command/boxed_number.hpp" +#include "command/dispatchkit.hpp" +#include "command/dynamic_object.hpp" +#include "command/function_call.hpp" + +#include "language/engine.hpp" +#include "language/eval.hpp" + +// This file includes all of the basic requirements for ChaiScript, +// to use, you might do something like: +// + +/* + +#include "language/parser.hpp" +#include "stdlib.hpp" + +ChaiScript_Basic chai( + Carbon::Std_Lib::library(), + std::make_unique>()); + +*/ + +// If you want a fully packaged ready to go ChaiScript, use chaiscript.hpp + +#endif /* CARBON_BASIC_HPP */ diff --git a/src/carbon/carbon.hpp b/src/carbon/carbon.hpp new file mode 100644 index 00000000..657eb5a6 --- /dev/null +++ b/src/carbon/carbon.hpp @@ -0,0 +1,868 @@ +#ifndef CARBON_HPP +#define CARBON_HPP + +/// @mainpage +/// [ChaiScript](http://www.chaiscript.com") is a scripting language designed +/// specifically for integration with C++. It provides seamless integration with +/// C++ on all levels, including shared_ptr objects, functors and exceptions. +/// +/// The parts of the ChaiScript API that the average user will be concerned with +/// are contained in the chaiscript namespace and the Carbon::ChaiScript +/// class. +/// +/// The end user parts of the API are extremely simple both in size and ease of +/// use. +/// +/// Currently, all source control and project management aspects of ChaiScript +/// occur on [github](http://www.github.com/ChaiScript/ChaiScript"). +/// +/// ------------------------------------------------------------ +/// +/// @sa chaiscript +/// @sa Carbon::ChaiScript +/// @sa ChaiScript_Language for Built in Functions +/// @sa @ref LangGettingStarted +/// @sa @ref LangKeywordRef +/// @sa @ref LangInPlaceRef +/// @sa @ref LangObjectSystemRef +/// @sa http://www.chaiscript.com +/// @sa http://www.github.com/ChaiScript/ChaiScript +/// +/// ----------------------------------------------------------- +/// +/// @section gettingstarted API Getting Started +/// +/// - @ref basics +/// - @ref compiling +/// - @ref eval +/// - @ref adding_items +/// - @ref operatoroverloading +/// - @ref add_class +/// - @ref pointer_conversions +/// - @ref baseclasses +/// - @ref functionobjects +/// - @ref threading +/// - @ref exceptions +/// +/// +/// @subsection basics Basics +/// +/// Basic simple example: +/// +/// ~~~~~~~{.cpp} +/// //main.cpp +/// #include +/// +/// double function(int i, double j) +/// { +/// return i * j; +/// } +/// +/// int main() +/// { +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::fun(&function), "function"); +/// +/// double d = chai.eval("function(3, 4.75);"); +/// } +/// ~~~~~~~ +/// +/// ------------------------------------------------------ +/// +/// @subsection compiling Compiling ChaiScript Applications +/// +/// ChaiScript is a header only library with only one dependency: The +/// operating system provided dynamic library loader, which has to be specified +/// on some platforms. +/// +/// @subsubsection compilinggcc Compiling with GCC +/// +/// To compile the above application on a Unix like operating system (MacOS, +/// Linux) with GCC you need to link the dynamic loader. For example: +/// +/// ~~~~~~~~ +/// gcc main.cpp -I/path/to/chaiscript/headers -ldl +/// ~~~~~~~~ +/// +/// Alternatively, you may compile without threading support. +/// +/// ~~~~~~~~ +/// gcc main.cpp -I/path/to/chaiscript/headers -ldl -DCARBON_NO_THREADS +/// ~~~~~~~~ +/// +/// ------------------------------------------ +/// +/// @subsection eval Evaluating Scripts +/// +/// Scripts can be evaluated with the () operator, eval method or eval_file +/// method. +/// +/// @subsubsection parenoperator () Operator +/// +/// operator() can be used as a handy shortcut for evaluating ChaiScript +/// snippets. +/// +/// ~~~~~~~~{.cpp} +/// Carbon::ChaiScript chai; +/// chai("print(@"hello world@")"); +/// ~~~~~~~~ +/// +/// @sa Carbon::ChaiScript::operator()(const std::string &) +/// +/// @subsubsection evalmethod Method 'eval' +/// +/// The eval method is somewhat more verbose and can be used to get type safely +/// return values from the script. +/// +/// ~~~~~~~~{.cpp} +/// Carbon::ChaiScript chai; +/// chai.eval("callsomefunc()"); +/// int result = chai.eval("1 + 3"); +/// // result now equals 4 +/// ~~~~~~~~ +/// +/// @sa Carbon::ChaiScript::eval +/// +/// @subsubsection evalfilemethod Method 'eval_file' +/// +/// The 'eval_file' method loads a file from disk and executes the script in it +/// +/// ~~~~~~~~{.cpp} +/// Carbon::ChaiScript chai; +/// chai.eval_file("myfile.chai"); +/// std::string result = chai.eval_file("myfile.chai") // extract +/// the last value returned from the file +/// ~~~~~~~~ +/// +/// @sa Carbon::ChaiScript::eval_file +/// +/// -------------------------------------------------- +/// +/// @subsection adding_items Adding Items to ChaiScript +/// +/// ChaiScript supports 4 basic things that can be added: objects, functions, +/// type infos and Modules +/// +/// @subsubsection adding_objects Adding Objects +/// +/// Named objects can be created with the Carbon::var function. Note: adding +/// a object adds it to the current thread scope, not to a global scope. If you +/// have multiple threads that need to access the same variables you will need +/// to add them separately for each thread, from the thread itself. +/// +/// ~~~~~~~~~{.cpp} +/// using namespace Carbon; +/// ChaiScript chai; +/// int i = 5; +/// chai.add(var(i), "i"); +/// chai("print(i)"); +/// ~~~~~~~~~ +/// +/// Immutable objects can be created with the Carbon::const_var function. +/// +/// ~~~~~~~~~{.cpp} +/// chai.add(const_var(i), "i"); +/// chai("i = 5"); // exception throw, cannot assign const var +/// ~~~~~~~~~ +/// +/// Named variables can only be accessed from the context they are created in. +/// If you want a global variable, it must be const, and created with the +/// Carbon::ChaiScript::add_global_const function. +/// +/// ~~~~~~~~~{.cpp} +/// chai.add_global_const(const_var(i), "i"); +/// chai("def somefun() { print(i); }; somefun();"); +/// ~~~~~~~~~ +/// +/// @subsubsection adding_functions Adding Functions +/// +/// Functions, methods and members are all added using the same function: +/// Carbon::fun. +/// +/// ~~~~~~~~~{.cpp} +/// using namespace Carbon; +/// +/// class MyClass { +/// public: +/// int memberdata; +/// void method(); +/// void method2(int); +/// static void staticmethod(); +/// void overloadedmethod(); +/// void overloadedmethod(const std::string &); +/// }; +/// +/// ChaiScript chai; +/// chai.add(fun(&MyClass::memberdata), "memberdata"); +/// chai.add(fun(&MyClass::method), "method"); +/// chai.add(fun(&MyClass::staticmethod), "staticmethod"); +/// ~~~~~~~~~ +/// +/// Overloaded methods will need some help, to hint the compiler as to which +/// overload you want: +/// +/// ~~~~~~~~~{.cpp} +/// chai.add(fun(&MyClass::overloadedmethod), +/// "overloadedmethod"); chai.add(fun(&MyClass::overloadedmethod), "overloadedmethod"); +/// ~~~~~~~~~ +/// +/// There are also shortcuts built into Carbon::fun for binding up to the +/// first two parameters of the function. +/// +/// ~~~~~~~~~{.cpp} +/// MyClass obj; +/// chai.add(fun(&MyClass::method, &obj), "method"); +/// chai("method()"); // equiv to obj.method() +/// chai.add(fun(&MyClass::method2, &obj, 3), "method2"); +/// chai("method2()"); // equiv to obj.method2(3) +/// ~~~~~~~~~ +/// +/// @subsubsection addingtypeinfo Adding Type Info +/// +/// ChaiScript will automatically support any type implicitly provided to it in +/// the form of objects and function parameters / return types. However, it can +/// be nice to let ChaiScript know more details about the types you are giving +/// it. For instance, the "clone" functionality cannot work unless there is a +/// copy constructor registered and the name of the type is known (so that +/// ChaiScript can look up the copy constructor). +/// +/// Continuing with the example "MyClass" from above: +/// +/// ~~~~~~~~{.cpp} +/// chai.add(user_type(), "MyClass"); +/// ~~~~~~~~ +/// +/// @subsubsection adding_modules Adding Modules +/// +/// Modules are holders for collections of ChaiScript registrations. +/// +/// ~~~~~~~~{.cpp} +/// ModulePtr module = get_sum_module(); +/// chai.add(module); +/// ~~~~~~~~ +/// +/// @sa Carbon::Module +/// +/// ----------------------------------------------------------------------- +/// +/// @subsection operatoroverloading Operator Overloading +/// +/// Operators are just like any other function in ChaiScript, to overload an +/// operator, simply register it. +/// +/// ~~~~~~~~{.cpp} +/// class MyClass { +/// MyClass operator+(const MyClass &) const; +/// }; +/// +/// chai.add(fun(&MyClass::operator+), "+"); +/// +/// std::string append_string_int(const std::string &t_lhs, int t_rhs) +/// { +/// std::stringstream ss; +/// ss << t_lhs << t_rhs; +/// return ss.str(); +/// } +/// +/// chai.add(fun(append_string_int), "+"); +/// ~~~~~~~~ +/// +/// @sa @ref adding_functions +/// +/// ----------------------------------------------------------------------- +/// +/// @subsection add_class Class Helper Utility +/// +/// Much of the work of adding new classes to ChaiScript can be reduced with the +/// help of the add_class helper utility. +/// +/// ~~~~~~~~{.cpp} +/// class Test +/// { +/// public: +/// void function() {} +/// std::string function2() { return "Function2"; } +/// void function3() {} +/// std::string functionOverload(double) { return "double"; } +/// std::string functionOverload(int) { return "int"; } +/// }; +/// +/// int main() +/// { +/// Carbon::ModulePtr m = Carbon::ModulePtr(new Carbon::Module()); +/// +/// Carbon::utility::add_class(*m, +/// "Test", +/// { constructor(), +/// constructor() }, +/// { {fun(&Test::function), "function"}, +/// {fun(&Test::function2), "function2"}, +/// {fun(&Test::function2), "function3"} +/// {fun(static_cast(&Test::functionOverload)), "functionOverload"} +/// {fun(static_cast(&Test::functionOverload)), +/// "functionOverload"} } +/// ); +/// +/// +/// Carbon::ChaiScript chai; +/// chai.add(m); +/// } +/// ~~~~~~~~ +/// +/// @sa @ref adding_modules +/// +/// ----------------------------------------------------------------------- +/// +/// @subsection pointer_conversions Pointer / Object Conversions +/// +/// As much as possible, ChaiScript attempts to convert between &, *, const &, +/// const *, std::shared_ptr, std::shared_ptr, +/// std::reference_wrapper, std::reference_wrapper and value types +/// automatically. +/// +/// If a Carbon::var object was created in C++ from a pointer, it cannot be +/// converted to a shared_ptr (this would add invalid reference counting). Const +/// may be added, but never removed. +/// +/// The take away is that you can pretty much expect function calls to Just Work +/// when you need them to. +/// +/// ~~~~~~~~{.cpp} +/// void fun1(const int *); +/// void fun2(int *); +/// void fun3(int); +/// void fun4(int &); +/// void fun5(const int &); +/// void fun5(std::shared_ptr); +/// void fun6(std::shared_ptr); +/// void fun7(const std::shared_ptr &); +/// void fun8(const std::shared_ptr &); +/// void fun9(std::reference_wrapper); +/// void fun10(std::reference_wrapper); +/// +/// int main() +/// { +/// using namespace Carbon +/// Carbon::ChaiScript chai; +/// chai.add(fun(fun1), "fun1"); +/// chai.add(fun(fun2), "fun2"); +/// chai.add(fun(fun3), "fun3"); +/// chai.add(fun(fun4), "fun4"); +/// chai.add(fun(fun5), "fun5"); +/// chai.add(fun(fun6), "fun6"); +/// chai.add(fun(fun7), "fun7"); +/// chai.add(fun(fun8), "fun8"); +/// chai.add(fun(fun9), "fun9"); +/// chai.add(fun(fun10), "fun10"); +/// +/// chai("var i = 10;"); +/// chai("fun1(i)"); +/// chai("fun2(i)"); +/// chai("fun3(i)"); +/// chai("fun4(i)"); +/// chai("fun5(i)"); +/// chai("fun6(i)"); +/// chai("fun7(i)"); +/// chai("fun8(i)"); +/// chai("fun9(i)"); +/// chai("fun10(i)"); +/// } +/// ~~~~~~~~ +/// +/// See the unit test unittests/boxed_cast_test.cpp for a complete breakdown of +/// the automatic casts that available and tested. +/// +/// ----------------------------------------------------------------------- +/// +/// @subsection baseclasses Base Classes +/// +/// ChaiScript supports handling of passing a derived class object to a function +/// expecting a base class object. For the process to work, the base/derived +/// relationship must be registered with the engine. +/// +/// ~~~~~~~~{.cpp} +/// class Base {}; +/// class Derived : public Base {}; +/// void myfunction(Base *b); +/// +/// int main() +/// { +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::base_class()); +/// Derived d; +/// chai.add(Carbon::var(&d), "d"); +/// chai.add(Carbon::fun(&myfunction), "myfunction"); +/// chai("myfunction(d)"); +/// } +/// ~~~~~~~~ +/// +/// ----------------------------------------------------------------------- +/// +/// +/// @subsection functionobjects Function Objects +/// +/// Functions are first class objects in ChaiScript and ChaiScript supports +/// automatic conversion between ChaiScript functions and std::function objects. +/// +/// ~~~~~~~~{.cpp} +/// void callafunc(const std::function &t_func) +/// { +/// t_func("bob"); +/// } +/// +/// int main() +/// { +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::fun(&callafunc), "callafunc"); +/// chai("callafunc(fun(x) { print(x); })"); // pass a lambda function to the +/// registered function +/// // which expects a typed +/// std::function +/// +/// std::function f = chai.eval +/// >("dump_system"); f(); // call the ChaiScript function dump_system, from +/// C++ +/// } +/// ~~~~~~~~ +/// +/// ----------------------------------------------------------------------- +/// +/// +/// @subsection threading Threading +/// +/// Thread safety is automatically handled within the ChaiScript system. Objects +/// can be added and scripts executed from multiple threads. For each thread +/// that executes scripts, a new context is created and managed by the engine. +/// +/// Thread safety can be disabled by defining CARBON_NO_THREADS when using the +/// library. +/// +/// Disabling thread safety increases performance in many cases. +/// +/// ----------------------------------------------------------------------- +/// +/// +/// @subsection exceptions Exception Handling +/// +/// @subsubsection exceptionsbasics Exception Handling Basics +/// +/// Exceptions can be thrown in ChaiScript and caught in C++ or thrown in C++ +/// and caught in ChaiScript. +/// +/// ~~~~~~~~{.cpp} +/// void throwexception() +/// { +/// throw std::runtime_error("err"); +/// } +/// +/// int main() +/// { +/// // Throw in C++, catch in ChaiScript +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::fun(&throwexception), "throwexception"); +/// chai("try { throwexception(); } catch (e) { print(e.what()); }"); // +/// prints "err" +/// +/// // Throw in ChaiScript, catch in C++ +/// try { +/// chai("throw(1)"); +/// } catch (Carbon::Boxed_Value bv) { +/// int i = Carbon::boxed_cast(bv); +/// // i == 1 +/// } +/// } +/// ~~~~~~~~ +/// +/// @subsubsection exceptionsautomatic Exception Handling Automatic Unboxing +/// +/// As an alternative to the manual unboxing of exceptions shown above, +/// exception specifications allow the user to tell ChaiScript what possible +/// exceptions are expected from the script being executed. +/// +/// Example: +/// ~~~~~~~~{.cpp} +/// Carbon::ChaiScript chai; +/// +/// try { +/// chai.eval("throw(runtime_error(@"error@"))", +/// Carbon::exception_specification()); +/// } catch (const double e) { +/// } catch (int) { +/// } catch (float) { +/// } catch (const std::string &) { +/// } catch (const std::exception &e) { +/// // This is the one what will be called in the specific throw() above +/// } +/// ~~~~~~~~ +/// +/// @sa Carbon::Exception_Handler for details on automatic exception +/// unboxing +/// @sa Carbon::exception_specification + +/// @page LangObjectSystemRef ChaiScript Language Object Model Reference +/// +/// +/// ChaiScript has an object system built in, for types defined within the +/// ChaiScript system. +/// +/// ~~~~~~~~~ +/// attr Rectangle::height +/// attr Rectangle::width +/// def Rectangle::Rectangle() { this.height = 10; this.width = 20 } +/// def Rectangle::area() { this.height * this.width } +/// +/// var rect = Rectangle() +/// rect.height = 30 +/// print(rect.area()) +/// ~~~~~~~~~ +/// +/// Since ChaiScript 5.4.0 it has been possible to use the "class" keyword to +/// simplify this code. +/// +/// ~~~~~~~~~ +/// class Rectangle { +/// attr height +/// attr width +/// def Rectangle() { this.height = 10; this.width = 20 } +/// def area() { this.height * this.width } +/// } +/// +/// var rect = Rectangle() +/// rect.height = 30 +/// print(rect.area()) +/// ~~~~~~~~~ +/// +/// @sa @ref keywordattr +/// @sa @ref keyworddef + +/// @page LangInPlaceRef ChaiScript Language In-Place Creation Reference +/// @section inplacevector Vector +/// +/// ~~~~~~~~~ +/// In-place Vector ::= "[" [expression ("," expression)*] "]" +/// ~~~~~~~~~ +/// +/// @section inplacerangedvector Ranged Vector +/// +/// ~~~~~~~~~ +/// In-place Ranged Vector ::= "[" value ".." value "]" +/// ~~~~~~~~~ +/// +/// Creates a vector over a range (eg. 1..10) +/// +/// @section inplacemap Map +/// +/// ~~~~~~~~ +/// In-place Map ::= "[" (string ":" expression)+ "]" +/// ~~~~~~~~ + +/// @page LangGettingStarted ChaiScript Language Getting Started +/// +/// ChaiScript is a simple language that should feel familiar to anyone who +/// knows C++ or ECMAScript (JavaScript). +/// +/// ----------------------------------------------------------------------- +/// +/// @section chaiscriptloops Loops +/// +/// Common looping constructs exist in ChaiScript +/// +/// ~~~~~~~~ +/// var i = 0; +/// while (i < 10) +/// { +/// // do something +/// ++i; +/// } +/// ~~~~~~~~ +/// +/// ~~~~~~~~ +/// for (var i = 0; i < 10; ++i) +/// { +/// // do something +/// } +/// ~~~~~~~~ +/// +/// @sa @ref keywordfor +/// @sa @ref keywordwhile +/// +/// ----------------------------------------------------------------------- +/// +/// @section chaiscriptifs Conditionals +/// +/// If statements work as expected +/// +/// ~~~~~~~~ +/// var b = true; +/// +/// if (b) { +/// // do something +/// } else if (c < 10) { +/// // do something else +/// } else { +/// // or do this +/// } +/// ~~~~~~~~ +/// +/// @sa @ref keywordif +/// +/// ----------------------------------------------------------------------- +/// +/// @section chaiscriptfunctions Functions +/// +/// Functions are defined with the def keyword +/// +/// ~~~~~~~~ +/// def myfun(x) { print(x); } +/// +/// myfun(10); +/// ~~~~~~~~ +/// +/// Functions may have "guards" which determine if which is called. +/// +/// ~~~~~~~~ +/// eval> def myfun2(x) : x < 10 { print("less than 10"); } +/// eval> def myfun2(x) : x >= 10 { print("10 or greater"); } +/// eval> myfun2(5) +/// less than 10 +/// eval> myfun2(12) +/// 10 or greater +/// ~~~~~~~~ +/// +/// @sa @ref keyworddef +/// @sa @ref keywordattr +/// @sa @ref LangObjectSystemRef +/// +/// ----------------------------------------------------------------------- +/// +/// @section chaiscriptfunctionobjects Function Objects +/// +/// Functions are first class types in ChaiScript and can be used as variables. +/// +/// ~~~~~~~~ +/// eval> var p = print; +/// eval> p(1); +/// 1 +/// ~~~~~~~~ +/// +/// They can also be passed to functions. +/// +/// ~~~~~~~~ +/// eval> def callfunc(f, lhs, rhs) { return f(lhs, rhs); } +/// eval> def do_something(lhs, rhs) { print("lhs: ${lhs}, rhs: ${rhs}"); } +/// eval> callfunc(do_something, 1, 2); +/// lhs: 1, rhs: 2 +/// ~~~~~~~~ +/// +/// Operators can also be treated as functions by using the back tick operator. +/// Building on the above example: +/// +/// ~~~~~~~~ +/// eval> callfunc(`+`, 1, 4); +/// 5 +/// eval> callfunc(`*`, 3, 2); +/// 6 +/// ~~~~~~~~ +/// +/// ----------------------------------------------------------------------- +/// +/// @sa @ref LangKeywordRef +/// @sa ChaiScript_Language for Built in Functions + +/// @page LangKeywordRef ChaiScript Language Keyword Reference +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordattr attr +/// Defines a ChaiScript object attribute +/// +/// ~~~~~~~~ +/// Attribute Definition ::= "attr" class_name "::" attribute_name +/// ~~~~~~~~ +/// +/// @sa @ref LangObjectSystemRef +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordauto auto +/// +/// Defines a variable +/// +/// ~~~~~~~~ +/// Variable ::= "auto" identifier +/// ~~~~~~~~ +/// +/// Synonym for @ref keywordvar +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordbreak break +/// Stops execution of a looping block. +/// +/// ~~~~~~~~ +/// Break Statement ::= "break" +/// ~~~~~~~~ +/// +/// @sa @ref keywordfor +/// @sa @ref keywordwhile +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keyworddef def +/// Begins a function or method definition +/// +/// ~~~~~~~~ +/// Function Definition ::= "def" identifier "(" [[type] arg ("," [type] arg)*] +/// ")" [":" guard] block Method Definition ::= "def" class_name "::" +/// method_name "(" [[type] arg ("," [type] arg)*] ")" [":" guard] block +/// ~~~~~~~~ +/// +/// identifier: name of function. Required. +/// args: comma-delimited list of parameter names with optional type specifiers. +/// Optional. guards: guarding statement that act as a prerequisite for the +/// function. Optional. { }: scoped block as function body. Required. +/// +/// Functions return values in one of two ways: +/// +/// By using an explicit return call, optionally passing the value to be +/// returned. By implicitly returning the value of the last expression (if it is +/// not a while or for loop). +/// +/// Method definitions for known types extend those types with new methods. This +/// includes C++ and ChaiScript defined types. Method definitions for unknown +/// types implicitly define the named type. +/// +/// @sa @ref LangObjectSystemRef +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordelse else +/// @sa @ref keywordif +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordfor for +/// ~~~~~~~~ +/// For Block ::= "for" "(" [initial] ";" stop_condition ";" loop_expression ")" +/// block +/// ~~~~~~~~ +/// This loop can be broken using the @ref keywordbreak command. +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordfun fun +/// Begins an anonymous function declaration (sometimes called a lambda). +/// +/// ~~~~~~~~ +/// Lambda ::= "fun" "(" [variable] ("," variable)* ")" block +/// ~~~~~~~~ +/// +/// _Example_ +/// +/// ~~~~~~~~ +/// // Generate an anonymous function object that adds 2 to its parameter +/// var f = fun(x) { x + 2; } +/// ~~~~~~~~ +/// +/// @sa @ref keyworddef for more details on ChaiScript functions +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordif if +/// Begins a conditional block of code that only executes if the condition +/// evaluates as true. +/// ~~~~~~~~ +/// If Block ::= "if" "(" condition ")" block +/// Else If Block ::= "else if" "(" condition ")" block +/// Else Block ::= "else" block +/// ~~~~~~~~ +/// +/// _Example_ +/// +/// ~~~~~~~~ +/// if (true) { +/// // do something +/// } else if (false) { +/// // do something else +/// } else { +/// // otherwise do this +/// } +/// ~~~~~~~~ +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordtry try +/// ~~~~~~~~ +/// Try Block ::= "try" block +/// ("catch" ["(" [type] variable ")"] [":" guards] block)+ +/// ["finally" block] +/// ~~~~~~~~ +/// +/// @sa ChaiScript_Language::throw +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordwhile while +/// +/// Begins a conditional block of code that loops 0 or more times, as long as +/// the condition is true +/// +/// ~~~~~~~~ +/// While Block ::= "while" "(" condition ")" block +/// ~~~~~~~~ +/// +/// This loop can be broken using the @ref keywordbreak command. +/// +/// +/// ----------------------------------------------------------------------- +/// +/// @section keywordvar var +/// +/// Defines a variable +/// +/// ~~~~~~~~ +/// Variable ::= "var" identifier +/// ~~~~~~~~ +/// +/// Synonym for @ref keywordauto + +/// @namespace Carbon +/// @brief Namespace chaiscript contains every API call that the average user +/// will be concerned with. + +/// @namespace Carbon::detail +/// @brief Classes and functions reserved for internal use. Items in this +/// namespace are not supported. + +#include "basic.hpp" +#include "language/parser.hpp" +#include "stdlib.hpp" + +namespace Carbon { +class ChaiScript : public ChaiScript_Basic { +public: + ChaiScript(std::vector t_modulepaths = {}, + std::vector t_usepaths = {}, + std::vector t_opts = Carbon::default_options()) + : ChaiScript_Basic( + Carbon::Std_Lib::library(), + std::make_unique>(), + std::move(t_modulepaths), std::move(t_usepaths), + std::move(t_opts)) {} +}; +} // namespace Carbon + +#endif /* CARBON_HPP */ diff --git a/src/carbon/command/any.hpp b/src/carbon/command/any.hpp new file mode 100644 index 00000000..ec1eaca0 --- /dev/null +++ b/src/carbon/command/any.hpp @@ -0,0 +1,110 @@ + + +#ifndef CARBON_ANY_HPP +#define CARBON_ANY_HPP + +#include + +namespace Carbon { +namespace detail { +namespace exception { +/// \brief Thrown in the event that an Any cannot be cast to the desired type +/// +/// It is used internally during function dispatch. +/// +/// \sa Carbon::detail::Any +class bad_any_cast : public std::bad_cast { +public: + /// \brief Description of what error occurred + const char *what() const noexcept override { return "bad any cast"; } +}; +} // namespace exception + +class Any { +private: + struct Data { + constexpr explicit Data(const std::type_info &t_type) noexcept + : m_type(t_type) {} + + Data &operator=(const Data &) = delete; + + virtual ~Data() noexcept = default; + + virtual void *data() noexcept = 0; + + const std::type_info &type() const noexcept { return m_type; } + + virtual std::unique_ptr clone() const = 0; + const std::type_info &m_type; + }; + + template + struct Data_Impl : Data { + explicit Data_Impl(T t_type) + : Data(typeid(T)), m_data(std::move(t_type)) {} + + void *data() noexcept override { return &m_data; } + + std::unique_ptr clone() const override { + return std::make_unique>(m_data); + } + + Data_Impl &operator=(const Data_Impl &) = delete; + + T m_data; + }; + + std::unique_ptr m_data; + +public: + // construct/copy/destruct + constexpr Any() noexcept = default; + Any(Any &&) noexcept = default; + Any &operator=(Any &&t_any) = default; + + Any(const Any &t_any) + : m_data(t_any.empty() ? nullptr : t_any.m_data->clone()) {} + + template >>> + explicit Any(ValueType &&t_value) + : m_data(std::make_unique>>( + std::forward(t_value))) {} + + Any &operator=(const Any &t_any) { + Any copy(t_any); + swap(copy); + return *this; + } + + template + ToType &cast() const { + if (m_data && typeid(ToType) == m_data->type()) { + return *static_cast(m_data->data()); + } else { + throw Carbon::detail::exception::bad_any_cast(); + } + } + + // modifiers + Any &swap(Any &t_other) { + std::swap(t_other.m_data, m_data); + return *this; + } + + // queries + bool empty() const noexcept { return !static_cast(m_data); } + + const std::type_info &type() const noexcept { + if (m_data) { + return m_data->type(); + } else { + return typeid(void); + } + } +}; + +} // namespace detail +} // namespace Carbon + +#endif diff --git a/src/carbon/command/bad_boxed_cast.cpp b/src/carbon/command/bad_boxed_cast.cpp new file mode 100644 index 00000000..6dcc6130 --- /dev/null +++ b/src/carbon/command/bad_boxed_cast.cpp @@ -0,0 +1,16 @@ +#include "bad_boxed_cast.hpp" + +namespace Carbon::exception { +bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to, + utility::Static_String t_what) + : from(t_from), to(&t_to), m_what(std::move(t_what)) {} + +bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) + : from(t_from), to(&t_to), m_what("Cannot perform boxed_cast") {} + +bad_boxed_cast::bad_boxed_cast(utility::Static_String t_what) + : m_what(std::move(t_what)) {} + +/// \brief Description of what error occurred +const char *bad_boxed_cast::what() const { return m_what.c_str(); } +} // namespace Carbon::exception diff --git a/src/carbon/command/bad_boxed_cast.hpp b/src/carbon/command/bad_boxed_cast.hpp new file mode 100644 index 00000000..28956a02 --- /dev/null +++ b/src/carbon/command/bad_boxed_cast.hpp @@ -0,0 +1,54 @@ + + +#ifndef CARBON_BAD_BOXED_CAST_HPP +#define CARBON_BAD_BOXED_CAST_HPP + +#include +#include + +#include "../defines.hpp" +#include "../utils/static_string.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Info; +} // namespace Carbon + +namespace Carbon { +namespace exception { +/// \brief Thrown in the event that a Boxed_Value cannot be cast to the desired +/// type +/// +/// It is used internally during function dispatch and may be used by the end +/// user. +/// +/// \sa Carbon::boxed_cast +class bad_boxed_cast : public std::bad_cast { +public: + bad_boxed_cast(Type_Info t_from, const std::type_info &t_to, + utility::Static_String t_what) noexcept + : from(t_from), to(&t_to), m_what(std::move(t_what)) {} + + bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) noexcept + : from(t_from), to(&t_to), m_what("Cannot perform boxed_cast") {} + + explicit bad_boxed_cast(utility::Static_String t_what) noexcept + : m_what(std::move(t_what)) {} + + bad_boxed_cast(const bad_boxed_cast &) noexcept = default; + ~bad_boxed_cast() noexcept override = default; + + /// \brief Description of what error occurred + const char *what() const noexcept override { return m_what.c_str(); } + + Type_Info from; ///< Type_Info contained in the Boxed_Value + const std::type_info *to = + nullptr; ///< std::type_info of the desired (but failed) result type + +private: + utility::Static_String m_what; +}; +} // namespace exception +} // namespace Carbon + +#endif diff --git a/src/carbon/command/bootstrap.hpp b/src/carbon/command/bootstrap.hpp new file mode 100644 index 00000000..b6c3289c --- /dev/null +++ b/src/carbon/command/bootstrap.hpp @@ -0,0 +1,573 @@ + + +#ifndef CARBON_BOOTSTRAP_HPP +#define CARBON_BOOTSTRAP_HPP + +#include "../utils/utility.hpp" +#include "register_function.hpp" + +/// \brief Classes and functions useful for bootstrapping of ChaiScript and +/// adding of new types +namespace Carbon::bootstrap { +template ::value>::type> +void array(const std::string &type, Module &m) { + using ReturnType = typename std::remove_extent::type; + + m.add(user_type(), type); + m.add( + fun([](T &t, size_t index) -> ReturnType & { + constexpr const auto extent = std::extent::value; + if (extent > 0 && index >= extent) { + throw std::range_error("Array index out of range. Received: " + + std::to_string(index) + " expected < " + + std::to_string(extent)); + } else { + return t[index]; + } + }), + "[]"); + + m.add( + fun([](const T &t, size_t index) -> const ReturnType & { + constexpr const auto extent = std::extent::value; + if (extent > 0 && index >= extent) { + throw std::range_error("Array index out of range. Received: " + + std::to_string(index) + " expected < " + + std::to_string(extent)); + } else { + return t[index]; + } + }), + "[]"); + + m.add(fun([](const T &) { return std::extent::value; }), "size"); +} + +/// \brief Adds a copy constructor for the given type to the given Model +/// \param[in] type The name of the type. The copy constructor will be named +/// "type". \param[in,out] m The Module to add the copy constructor to \tparam T +/// The type to add a copy constructor for \returns The passed in Module +template +void copy_constructor(const std::string &type, Module &m) { + m.add(constructor(), type); +} + +/// \brief Add all comparison operators for the templated type. Used during +/// bootstrap, also available to users. \tparam T Type to create comparison +/// operators for \param[in,out] m module to add comparison operators to +/// \returns the passed in Module. +template +void opers_comparison(Module &m) { + operators::equal(m); + operators::greater_than(m); + operators::greater_than_equal(m); + operators::less_than(m); + operators::less_than_equal(m); + operators::not_equal(m); +} + +/// \brief Adds default and copy constructors for the given type +/// \param[in] type The name of the type to add the constructors for. +/// \param[in,out] m The Module to add the basic constructors to +/// \tparam T Type to generate basic constructors for +/// \returns The passed in Module +/// \sa copy_constructor +/// \sa constructor +template +void basic_constructors(const std::string &type, Module &m) { + m.add(constructor(), type); + copy_constructor(type, m); +} + +/// \brief Adds a constructor for a POD type +/// \tparam T The type to add the constructor for +/// \param[in] type The name of the type +/// \param[in,out] m The Module to add the constructor to +template +void construct_pod(const std::string &type, Module &m) { + m.add(fun([](const Boxed_Number &bn) { return bn.get_as(); }), type); +} + +/// Internal function for converting from a string to a value +/// uses ostream operator >> to perform the conversion +template +Input parse_string(const std::string &i) { + if constexpr (!std::is_same::value && + !std::is_same::value && + !std::is_same::value) { + std::stringstream ss(i); + Input t; + ss >> t; + return t; + } else { + throw std::runtime_error( + "Parsing of wide characters is not yet supported"); + } +} + +/// Add all common functions for a POD type. All operators, and +/// common conversions +template +void bootstrap_pod_type(const std::string &name, Module &m) { + m.add(user_type(), name); + m.add(constructor(), name); + construct_pod(name, m); + + m.add(fun(&parse_string), "to_" + name); + m.add(fun([](const T t) { return t; }), "to_" + name); +} + +/// "clone" function for a shared_ptr type. This is used in the case +/// where you do not want to make a deep copy of an object during cloning +/// but want to instead maintain the shared_ptr. It is needed internally +/// for handling of Proxy_Function object (that is, +/// function variables. +template +auto shared_ptr_clone(const std::shared_ptr &p) { + return p; +} + +/// Specific version of shared_ptr_clone just for Proxy_Functions +template +std::shared_ptr> shared_ptr_unconst_clone( + const std::shared_ptr> &p) { + return std::const_pointer_cast::type>(p); +} + +/// Assignment function for shared_ptr objects, does not perform a copy of the +/// object pointed to, instead maintains the shared_ptr concept. +/// Similar to shared_ptr_clone. Used for Proxy_Function. +template +Boxed_Value ptr_assign(Boxed_Value lhs, const std::shared_ptr &rhs) { + if (lhs.is_undef() || + (!lhs.get_type_info().is_const() && + lhs.get_type_info().bare_equal( + Get_Type_Info::get()))) { + lhs.assign(Boxed_Value(rhs)); + return lhs; + } else { + throw exception::bad_boxed_cast("type mismatch in pointer assignment"); + } +} + +/// Class consisting of only static functions. All default bootstrapping occurs +/// from this class. +class Bootstrap { +private: + /// Function allowing for assignment of an unknown type to any other value + static Boxed_Value unknown_assign(Boxed_Value lhs, Boxed_Value rhs) { + if (lhs.is_undef()) { + return (lhs.assign(rhs)); + } else { + throw exception::bad_boxed_cast( + "boxed_value has a set type already"); + } + } + + static void print(const std::string &s) noexcept { + fwrite(s.c_str(), 1, s.size(), stdout); + } + + static void println(const std::string &s) noexcept { puts(s.c_str()); } + + /// Add all arithmetic operators for PODs + static void opers_arithmetic_pod(Module &m) { + m.add(fun(&Boxed_Number::equals), "=="); + m.add(fun(&Boxed_Number::less_than), "<"); + m.add(fun(&Boxed_Number::greater_than), ">"); + m.add(fun(&Boxed_Number::greater_than_equal), ">="); + m.add(fun(&Boxed_Number::less_than_equal), "<="); + m.add(fun(&Boxed_Number::not_equal), "!="); + + m.add(fun(&Boxed_Number::pre_decrement), "--"); + m.add(fun(&Boxed_Number::pre_increment), "++"); + m.add(fun(&Boxed_Number::sum), "+"); + m.add(fun(&Boxed_Number::unary_plus), "+"); + m.add(fun(&Boxed_Number::unary_minus), "-"); + m.add(fun(&Boxed_Number::difference), "-"); + m.add(fun(&Boxed_Number::assign_bitwise_and), "&="); + m.add(fun(&Boxed_Number::assign), "="); + m.add(fun(&Boxed_Number::assign_bitwise_or), "|="); + m.add(fun(&Boxed_Number::assign_bitwise_xor), "^="); + m.add(fun(&Boxed_Number::assign_remainder), "%="); + m.add(fun(&Boxed_Number::assign_shift_left), "<<="); + m.add(fun(&Boxed_Number::assign_shift_right), ">>="); + m.add(fun(&Boxed_Number::bitwise_and), "&"); + m.add(fun(&Boxed_Number::bitwise_complement), "~"); + m.add(fun(&Boxed_Number::bitwise_xor), "^"); + m.add(fun(&Boxed_Number::bitwise_or), "|"); + m.add(fun(&Boxed_Number::assign_product), "*="); + m.add(fun(&Boxed_Number::assign_quotient), "/="); + m.add(fun(&Boxed_Number::assign_sum), "+="); + m.add(fun(&Boxed_Number::assign_difference), "-="); + m.add(fun(&Boxed_Number::quotient), "/"); + m.add(fun(&Boxed_Number::shift_left), "<<"); + m.add(fun(&Boxed_Number::product), "*"); + m.add(fun(&Boxed_Number::remainder), "%"); + m.add(fun(&Boxed_Number::shift_right), ">>"); + } + + /// Create a bound function object. The first param is the function to bind + /// the remaining parameters are the args to bind into the result + static Boxed_Value bind_function(const Function_Params ¶ms) { + if (params.empty()) { + throw exception::arity_error(0, 1); + } + + Const_Proxy_Function f = boxed_cast(params[0]); + + if (f->get_arity() != -1 && + size_t(f->get_arity()) != params.size() - 1) { + throw exception::arity_error(static_cast(params.size()), + f->get_arity()); + } + + return Boxed_Value( + Const_Proxy_Function(std::make_shared( + std::move(f), + std::vector(params.begin() + 1, params.end())))); + } + + static bool has_guard(const Const_Proxy_Function &t_pf) noexcept { + auto pf = + std::dynamic_pointer_cast( + t_pf); + return pf && pf->has_guard(); + } + + static Const_Proxy_Function get_guard(const Const_Proxy_Function &t_pf) { + const auto pf = + std::dynamic_pointer_cast( + t_pf); + if (pf && pf->get_guard()) { + return pf->get_guard(); + } else { + throw std::runtime_error("Function does not have a guard"); + } + } + + template + static std::vector do_return_boxed_value_vector( + FunctionType f, const dispatch::Proxy_Function_Base *b) { + auto v = (b->*f)(); + + std::vector vbv; + + for (const auto &o : v) { + vbv.push_back(const_var(o)); + } + + return vbv; + } + + static bool has_parse_tree( + const Carbon::Const_Proxy_Function &t_pf) noexcept { + const auto pf = std::dynamic_pointer_cast< + const Carbon::dispatch::Dynamic_Proxy_Function>(t_pf); + return bool(pf); + } + + static const Carbon::AST_Node &get_parse_tree( + const Carbon::Const_Proxy_Function &t_pf) { + const auto pf = std::dynamic_pointer_cast< + const Carbon::dispatch::Dynamic_Proxy_Function>(t_pf); + if (pf) { + return pf->get_parse_tree(); + } else { + throw std::runtime_error("Function does not have a parse tree"); + } + } + + template + static auto return_boxed_value_vector(const Function &f) { + return [f](const dispatch::Proxy_Function_Base *b) { + return do_return_boxed_value_vector(f, b); + }; + } + +public: + /// \brief perform all common bootstrap functions for std::string, void and + /// POD types \param[in,out] m Module to add bootstrapped functions to + /// \returns passed in Module + static void bootstrap(Module &m) { + m.add(user_type(), "void"); + m.add(user_type(), "bool"); + m.add(user_type(), "Object"); + m.add(user_type(), "Number"); + m.add(user_type(), "Function"); + m.add(user_type(), + "Assignable_Function"); + m.add(user_type(), "exception"); + + m.add(fun(&dispatch::Proxy_Function_Base::get_arity), "get_arity"); + m.add(fun(&dispatch::Proxy_Function_Base::operator==), "=="); + + m.add(fun(return_boxed_value_vector( + &dispatch::Proxy_Function_Base::get_param_types)), + "get_param_types"); + m.add(fun(return_boxed_value_vector( + &dispatch::Proxy_Function_Base::get_contained_functions)), + "get_contained_functions"); + + m.add( + fun([](const std::exception &e) { return std::string(e.what()); }), + "what"); + + m.add(user_type(), "out_of_range"); + m.add(user_type(), "logic_error"); + m.add(Carbon::base_class()); + m.add(Carbon::base_class()); + m.add(Carbon::base_class()); + + m.add(user_type(), "runtime_error"); + m.add(Carbon::base_class()); + + m.add(constructor(), + "runtime_error"); + + m.add(user_type(), "Dynamic_Object"); + m.add(constructor(), + "Dynamic_Object"); + m.add(constructor(), "Dynamic_Object"); + m.add(fun(&dispatch::Dynamic_Object::get_type_name), "get_type_name"); + m.add(fun(&dispatch::Dynamic_Object::get_attrs), "get_attrs"); + m.add(fun(&dispatch::Dynamic_Object::set_explicit), "set_explicit"); + m.add(fun(&dispatch::Dynamic_Object::is_explicit), "is_explicit"); + m.add(fun(&dispatch::Dynamic_Object::has_attr), "has_attr"); + + m.add(fun(static_cast( + &dispatch::Dynamic_Object::get_attr)), + "get_attr"); + m.add(fun(static_cast( + &dispatch::Dynamic_Object::get_attr)), + "get_attr"); + + m.add(fun(static_cast( + &dispatch::Dynamic_Object::method_missing)), + "method_missing"); + m.add(fun(static_cast( + &dispatch::Dynamic_Object::method_missing)), + "method_missing"); + + m.add(fun(static_cast( + &dispatch::Dynamic_Object::get_attr)), + "[]"); + m.add(fun(static_cast( + &dispatch::Dynamic_Object::get_attr)), + "[]"); + + m.eval(R"chaiscript( + def Dynamic_Object::clone() { + auto &new_o = Dynamic_Object(this.get_type_name()); + for_each(this.get_attrs(), fun[new_o](x) { new_o.get_attr(x.first) = x.second; } ); + new_o; + } + + def `=`(Dynamic_Object lhs, Dynamic_Object rhs) : lhs.get_type_name() == rhs.get_type_name() + { + for_each(rhs.get_attrs(), fun[lhs](x) { lhs.get_attr(x.first) = clone(x.second); } ); + } + + def `!=`(Dynamic_Object lhs, Dynamic_Object rhs) : lhs.get_type_name() == rhs.get_type_name() + { + var rhs_attrs := rhs.get_attrs(); + var lhs_attrs := lhs.get_attrs(); + + if (rhs_attrs.size() != lhs_attrs.size()) { + true; + } else { + return any_of(rhs_attrs, fun[lhs](x) { !lhs.has_attr(x.first) || lhs.get_attr(x.first) != x.second; } ); + } + } + + def `==`(Dynamic_Object lhs, Dynamic_Object rhs) : lhs.get_type_name() == rhs.get_type_name() + { + var rhs_attrs := rhs.get_attrs(); + var lhs_attrs := lhs.get_attrs(); + + if (rhs_attrs.size() != lhs_attrs.size()) { + false; + } else { + return all_of(rhs_attrs, fun[lhs](x) { lhs.has_attr(x.first) && lhs.get_attr(x.first) == x.second; } ); + } + } + )chaiscript"); + + m.add(fun(&has_guard), "has_guard"); + m.add(fun(&get_guard), "get_guard"); + + m.add(fun(&Boxed_Value::is_undef), "is_var_undef"); + m.add(fun(&Boxed_Value::is_null), "is_var_null"); + m.add(fun(&Boxed_Value::is_const), "is_var_const"); + m.add(fun(&Boxed_Value::is_ref), "is_var_reference"); + m.add(fun(&Boxed_Value::is_pointer), "is_var_pointer"); + m.add(fun(&Boxed_Value::is_return_value), "is_var_return_value"); + m.add(fun(&Boxed_Value::reset_return_value), "reset_var_return_value"); + m.add(fun(&Boxed_Value::is_type), "is_type"); + m.add(fun(&Boxed_Value::get_attr), "get_var_attr"); + m.add(fun(&Boxed_Value::copy_attrs), "copy_var_attrs"); + m.add(fun(&Boxed_Value::clone_attrs), "clone_var_attrs"); + + m.add(fun(&Boxed_Value::get_type_info), "get_type_info"); + m.add(user_type(), "Type_Info"); + m.add(constructor(), "Type_Info"); + + operators::equal(m); + + m.add(fun(&Type_Info::is_const), "is_type_const"); + m.add(fun(&Type_Info::is_reference), "is_type_reference"); + m.add(fun(&Type_Info::is_void), "is_type_void"); + m.add(fun(&Type_Info::is_undef), "is_type_undef"); + m.add(fun(&Type_Info::is_pointer), "is_type_pointer"); + m.add(fun(&Type_Info::is_arithmetic), "is_type_arithmetic"); + m.add(fun(&Type_Info::name), "cpp_name"); + m.add(fun(&Type_Info::bare_name), "cpp_bare_name"); + m.add(fun(&Type_Info::bare_equal), "bare_equal"); + + basic_constructors("bool", m); + operators::assign(m); + operators::equal(m); + operators::not_equal(m); + + m.add(fun([](const std::string &s) { return s; }), "to_string"); + m.add( + fun([](const bool b) { return std::string(b ? "true" : "false"); }), + "to_string"); + m.add(fun(&unknown_assign), "="); + m.add(fun([](const Boxed_Value &bv) { throw bv; }), "throw"); + + m.add(fun([](const char c) { return std::string(1, c); }), "to_string"); + m.add(fun(&Boxed_Number::to_string), "to_string"); + + bootstrap_pod_type("double", m); + bootstrap_pod_type("long_double", m); + bootstrap_pod_type("float", m); + bootstrap_pod_type("int", m); + bootstrap_pod_type("long", m); + bootstrap_pod_type("unsigned_int", m); + bootstrap_pod_type("unsigned_long", m); + bootstrap_pod_type("long_long", m); + bootstrap_pod_type("unsigned_long_long", m); + bootstrap_pod_type("size_t", m); + bootstrap_pod_type("char", m); + bootstrap_pod_type("wchar_t", m); + bootstrap_pod_type("char16_t", m); + bootstrap_pod_type("char32_t", m); + bootstrap_pod_type("int8_t", m); + bootstrap_pod_type("int16_t", m); + bootstrap_pod_type("int32_t", m); + bootstrap_pod_type("int64_t", m); + bootstrap_pod_type("uint8_t", m); + bootstrap_pod_type("uint16_t", m); + bootstrap_pod_type("uint32_t", m); + bootstrap_pod_type("uint64_t", m); + + operators::logical_compliment(m); + + opers_arithmetic_pod(m); + + m.add(fun(&Build_Info::version_major), "version_major"); + m.add(fun(&Build_Info::version_minor), "version_minor"); + m.add(fun(&Build_Info::version_patch), "version_patch"); + m.add(fun(&Build_Info::version), "version"); + m.add(fun(&Build_Info::compiler_version), "compiler_version"); + m.add(fun(&Build_Info::compiler_name), "compiler_name"); + m.add(fun(&Build_Info::compiler_id), "compiler_id"); + m.add(fun(&Build_Info::debug_build), "debug_build"); + + m.add(fun(&print), "print_string"); + m.add(fun(&println), "println_string"); + + m.add(dispatch::make_dynamic_proxy_function(&bind_function), "bind"); + + m.add(fun(&shared_ptr_unconst_clone), + "clone"); + m.add(fun(&ptr_assign< + std::remove_const::type>), + "="); + m.add(fun(&ptr_assign< + std::add_const::type>), + "="); + m.add(Carbon::base_class()); + m.add(fun([](dispatch::Assignable_Proxy_Function &t_lhs, + const std::shared_ptr + &t_rhs) { t_lhs.assign(t_rhs); }), + "="); + + m.add(fun(&Boxed_Value::type_match), "type_match"); + + m.add(Carbon::fun(&has_parse_tree), "has_parse_tree"); + m.add(Carbon::fun(&get_parse_tree), "get_parse_tree"); + + m.add(Carbon::base_class()); + m.add(Carbon::base_class()); + + m.add(Carbon::user_type(), + "arithmetic_error"); + m.add( + Carbon::base_class()); + m.add( + Carbon::base_class()); + + // Carbon::bootstrap::standard_library::vector_type + // > + // >("AST_NodeVector", m); + + Carbon::utility::add_class( + m, "eval_error", {}, + {{fun(&Carbon::exception::eval_error::reason), "reason"}, + {fun(&Carbon::exception::eval_error::pretty_print), + "pretty_print"}, + {fun([](const Carbon::exception::eval_error &t_eval_error) { + std::vector retval; + std::transform( + t_eval_error.call_stack.begin(), + t_eval_error.call_stack.end(), std::back_inserter(retval), + &Carbon::var); + return retval; + }), + "call_stack"}}); + + Carbon::utility::add_class( + m, "File_Position", + {constructor(), + constructor()}, + {{fun(&File_Position::line), "line"}, + {fun(&File_Position::column), "column"}}); + + Carbon::utility::add_class( + m, "AST_Node", {}, + {{fun(&AST_Node::text), "text"}, + {fun(&AST_Node::identifier), "identifier"}, + {fun(&AST_Node::filename), "filename"}, + {fun(&AST_Node::start), "start"}, + {fun(&AST_Node::end), "end"}, + {fun(&AST_Node::to_string), "to_string"}, + {fun([](const Carbon::AST_Node &t_node) + -> std::vector { + std::vector retval; + const auto children = t_node.get_children(); + std::transform(children.begin(), children.end(), + std::back_inserter(retval), + &Carbon::var &>); + return retval; + }), + "children"}}); + } +}; +} // namespace Carbon::bootstrap + +#endif diff --git a/src/carbon/command/bootstrap_stl.hpp b/src/carbon/command/bootstrap_stl.hpp new file mode 100644 index 00000000..6db68ed8 --- /dev/null +++ b/src/carbon/command/bootstrap_stl.hpp @@ -0,0 +1,576 @@ + + +#ifndef CARBON_BOOTSTRAP_STL_HPP +#define CARBON_BOOTSTRAP_STL_HPP + +#include +#include +#include +#include +#include + +#include "bootstrap.hpp" +#include "boxed_value.hpp" +#include "dispatchkit.hpp" +#include "operators.hpp" +#include "proxy_constructors.hpp" +#include "register_function.hpp" +#include "type_info.hpp" + +namespace Carbon::bootstrap::standard_library { +/// Bidir_Range, based on the D concept of ranges. +/// \todo Update the Range code to base its capabilities on +/// the user_typetraits of the iterator passed in +template +struct Bidir_Range { + using container_type = Container; + + constexpr Bidir_Range(Container &c) : m_begin(c.begin()), m_end(c.end()) {} + + constexpr bool empty() const noexcept { return m_begin == m_end; } + + constexpr void pop_front() { + if (empty()) { + throw std::range_error("Range empty"); + } + ++m_begin; + } + + constexpr void pop_back() { + if (empty()) { + throw std::range_error("Range empty"); + } + --m_end; + } + + constexpr decltype(auto) front() const { + if (empty()) { + throw std::range_error("Range empty"); + } + return (*m_begin); + } + + constexpr decltype(auto) back() const { + if (empty()) { + throw std::range_error("Range empty"); + } + auto pos = m_end; + --pos; + return (*(pos)); + } + + IterType m_begin; + IterType m_end; +}; + +namespace detail { +template +size_t count(const T &t_target, const typename T::key_type &t_key) { + return t_target.count(t_key); +} + +template +void insert(T &t_target, const T &t_other) { + t_target.insert(t_other.begin(), t_other.end()); +} + +template +void insert_ref(T &t_target, const typename T::value_type &t_val) { + t_target.insert(t_val); +} + +/// Add Bidir_Range support for the given ContainerType +template +void input_range_type_impl(const std::string &type, Module &m) { + m.add(user_type(), type + "_Range"); + + copy_constructor(type + "_Range", m); + + m.add(constructor(), + "range_internal"); + + m.add(fun(&Bidir_Type::empty), "empty"); + m.add(fun(&Bidir_Type::pop_front), "pop_front"); + m.add(fun(&Bidir_Type::front), "front"); + m.add(fun(&Bidir_Type::pop_back), "pop_back"); + m.add(fun(&Bidir_Type::back), "back"); +} + +/// Algorithm for inserting at a specific position into a container +template +void insert_at(Type &container, int pos, const typename Type::value_type &v) { + auto itr = container.begin(); + auto end = container.end(); + + if (pos < 0 || std::distance(itr, end) < pos) { + throw std::range_error("Cannot insert past end of range"); + } + + std::advance(itr, pos); + container.insert(itr, v); +} + +/// Algorithm for erasing a specific position from a container +template +void erase_at(Type &container, int pos) { + auto itr = container.begin(); + auto end = container.end(); + + if (pos < 0 || std::distance(itr, end) <= pos) { + throw std::range_error("Cannot erase past end of range"); + } + + std::advance(itr, pos); + container.erase(itr); +} +} // namespace detail + +template +void input_range_type(const std::string &type, Module &m) { + detail::input_range_type_impl< + Bidir_Range>(type, m); + detail::input_range_type_impl>( + "Const_" + type, m); +} + +/// Add random_access_container concept to the given ContainerType +/// http://www.sgi.com/tech/stl/RandomAccessContainer.html +template +void random_access_container_type(const std::string & /*type*/, Module &m) { + // In the interest of runtime safety for the m, we prefer the at() method + // for [] access, to throw an exception in an out of bounds condition. + m.add(fun([](ContainerType &c, int index) -> + typename ContainerType::reference { + /// \todo we are preferring to keep the key as 'int' to avoid + /// runtime conversions during dispatch. reevaluate + return c.at( + static_cast(index)); + }), + "[]"); + + m.add(fun([](const ContainerType &c, int index) -> + typename ContainerType::const_reference { + /// \todo we are preferring to keep the key as 'int' to avoid + /// runtime conversions during dispatch. reevaluate + return c.at( + static_cast(index)); + }), + "[]"); +} + +/// Add assignable concept to the given ContainerType +/// http://www.sgi.com/tech/stl/Assignable.html +template +void assignable_type(const std::string &type, Module &m) { + copy_constructor(type, m); + operators::assign(m); +} + +/// Add container resize concept to the given ContainerType +/// http://www.cplusplus.com/reference/stl/ +template +void resizable_type(const std::string & /*type*/, Module &m) { + m.add(fun([](ContainerType *a, typename ContainerType::size_type n, + const typename ContainerType::value_type &val) { + return a->resize(n, val); + }), + "resize"); + m.add(fun([](ContainerType *a, typename ContainerType::size_type n) { + return a->resize(n); + }), + "resize"); +} + +/// Add container reserve concept to the given ContainerType +/// http://www.cplusplus.com/reference/stl/ +template +void reservable_type(const std::string & /*type*/, Module &m) { + m.add(fun([](ContainerType *a, typename ContainerType::size_type n) { + return a->reserve(n); + }), + "reserve"); + m.add(fun([](const ContainerType *a) { return a->capacity(); }), + "capacity"); +} + +/// Add container concept to the given ContainerType +/// http://www.sgi.com/tech/stl/Container.html +template +void container_type(const std::string & /*type*/, Module &m) { + m.add(fun([](const ContainerType *a) { return a->size(); }), "size"); + m.add(fun([](const ContainerType *a) { return a->empty(); }), "empty"); + m.add(fun([](ContainerType *a) { a->clear(); }), "clear"); +} + +/// Add default constructable concept to the given Type +/// http://www.sgi.com/tech/stl/DefaultConstructible.html +template +void default_constructible_type(const std::string &type, Module &m) { + m.add(constructor(), type); +} + +/// Add sequence concept to the given ContainerType +/// http://www.sgi.com/tech/stl/Sequence.html +template +void sequence_type(const std::string & /*type*/, Module &m) { + m.add(fun(&detail::insert_at), []() -> std::string { + if (typeid(typename ContainerType::value_type) == typeid(Boxed_Value)) { + return "insert_ref_at"; + } else { + return "insert_at"; + } + }()); + + m.add(fun(&detail::erase_at), "erase_at"); +} + +/// Add back insertion sequence concept to the given ContainerType +/// http://www.sgi.com/tech/stl/BackInsertionSequence.html +template +void back_insertion_sequence_type(const std::string &type, Module &m) { + m.add(fun([](ContainerType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.back()); + } + }), + "back"); + m.add(fun([](const ContainerType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.back()); + } + }), + "back"); + + using push_back = + void (ContainerType::*)(const typename ContainerType::value_type &); + m.add(fun(static_cast(&ContainerType::push_back)), + [&]() -> std::string { + if (typeid(typename ContainerType::value_type) == + typeid(Boxed_Value)) { + m.eval( + "# Pushes the second value onto the container while " + "making a clone of the value\n" + "def push_back(" + + type + + " container, x)\n" + "{ \n" + " if (x.is_var_return_value()) {\n" + " x.reset_var_return_value() \n" + " container.push_back_ref(x) \n" + " } else { \n" + " container.push_back_ref(clone(x)); \n" + " }\n" + "} \n"); + + return "push_back_ref"; + } else { + return "push_back"; + } + }()); + + m.add(fun(&ContainerType::pop_back), "pop_back"); +} + +/// Front insertion sequence +/// http://www.sgi.com/tech/stl/FrontInsertionSequence.html +template +void front_insertion_sequence_type(const std::string &type, Module &m) { + using push_ptr = + void (ContainerType::*)(typename ContainerType::const_reference); + using pop_ptr = void (ContainerType::*)(); + + m.add(fun([](ContainerType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.front()); + } + }), + "front"); + + m.add(fun([](const ContainerType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.front()); + } + }), + "front"); + + m.add(fun(static_cast(&ContainerType::push_front)), + [&]() -> std::string { + if (typeid(typename ContainerType::value_type) == + typeid(Boxed_Value)) { + m.eval( + "# Pushes the second value onto the front of container " + "while making a clone of the value\n" + "def push_front(" + + type + + " container, x)\n" + "{ \n" + " if (x.is_var_return_value()) {\n" + " x.reset_var_return_value() \n" + " container.push_front_ref(x) \n" + " } else { \n" + " container.push_front_ref(clone(x)); \n" + " }\n" + "} \n"); + return "push_front_ref"; + } else { + return "push_front"; + } + }()); + + m.add(fun(static_cast(&ContainerType::pop_front)), "pop_front"); +} + +/// bootstrap a given PairType +/// http://www.sgi.com/tech/stl/pair.html +template +void pair_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + m.add(fun(&PairType::first), "first"); + m.add(fun(&PairType::second), "second"); + + basic_constructors(type, m); + m.add(constructor(), + type); +} + +/// Add pair associative container concept to the given ContainerType +/// http://www.sgi.com/tech/stl/PairAssociativeContainer.html + +template +void pair_associative_container_type(const std::string &type, Module &m) { + pair_type(type + "_Pair", m); +} + +/// Add unique associative container concept to the given ContainerType +/// http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html +template +void unique_associative_container_type(const std::string & /*type*/, + Module &m) { + m.add(fun(detail::count), "count"); + + using erase_ptr = + size_t (ContainerType::*)(const typename ContainerType::key_type &); + + m.add(fun(static_cast(&ContainerType::erase)), "erase"); + + m.add(fun(&detail::insert), "insert"); + + m.add(fun(&detail::insert_ref), []() -> std::string { + if (typeid(typename ContainerType::mapped_type) == + typeid(Boxed_Value)) { + return "insert_ref"; + } else { + return "insert"; + } + }()); +} + +/// Add a MapType container +/// http://www.sgi.com/tech/stl/Map.html +template +void map_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + using elem_access = typename MapType::mapped_type &( + MapType::*)(const typename MapType::key_type &); + using const_elem_access = const typename MapType::mapped_type &( + MapType::*)(const typename MapType::key_type &) const; + + m.add(fun(static_cast(&MapType::operator[])), "[]"); + + m.add(fun(static_cast(&MapType::at)), "at"); + m.add(fun(static_cast(&MapType::at)), "at"); + + if (typeid(MapType) == typeid(std::map)) { + m.eval(R"( + def Map::`==`(Map rhs) { + if ( rhs.size() != this.size() ) { + return false; + } else { + auto r1 = range(this); + auto r2 = range(rhs); + while (!r1.empty()) + { + if (!eq(r1.front().first, r2.front().first) || !eq(r1.front().second, r2.front().second)) + { + return false; + } + r1.pop_front(); + r2.pop_front(); + } + true; + } + } )"); + } + + container_type(type, m); + default_constructible_type(type, m); + assignable_type(type, m); + unique_associative_container_type(type, m); + pair_associative_container_type(type, m); + input_range_type(type, m); +} + +/// http://www.sgi.com/tech/stl/List.html +template +void list_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + front_insertion_sequence_type(type, m); + back_insertion_sequence_type(type, m); + sequence_type(type, m); + resizable_type(type, m); + container_type(type, m); + default_constructible_type(type, m); + assignable_type(type, m); + input_range_type(type, m); +} + +/// Create a vector type with associated concepts +/// http://www.sgi.com/tech/stl/Vector.html +template +void vector_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + m.add(fun([](VectorType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.front()); + } + }), + "front"); + + m.add(fun([](const VectorType &container) -> decltype(auto) { + if (container.empty()) { + throw std::range_error("Container empty"); + } else { + return (container.front()); + } + }), + "front"); + + back_insertion_sequence_type(type, m); + sequence_type(type, m); + random_access_container_type(type, m); + resizable_type(type, m); + reservable_type(type, m); + container_type(type, m); + default_constructible_type(type, m); + assignable_type(type, m); + input_range_type(type, m); + + if (typeid(VectorType) == typeid(std::vector)) { + m.eval(R"( + def Vector::`==`(Vector rhs) { + if ( rhs.size() != this.size() ) { + return false; + } else { + auto r1 = range(this); + auto r2 = range(rhs); + while (!r1.empty()) + { + if (!eq(r1.front(), r2.front())) + { + return false; + } + r1.pop_front(); + r2.pop_front(); + } + true; + } + } )"); + } +} + +/// Add a String container +/// http://www.sgi.com/tech/stl/basic_string.html +template +void string_type(const std::string &type, Module &m) { + m.add(user_type(), type); + operators::addition(m); + operators::assign_sum(m); + opers_comparison(m); + random_access_container_type(type, m); + sequence_type(type, m); + default_constructible_type(type, m); + // container_type(type, m); + assignable_type(type, m); + input_range_type(type, m); + + // Special case: add push_back to string (which doesn't support other + // back_insertion operations + m.add(fun(&String::push_back), []() -> std::string { + if (typeid(typename String::value_type) == typeid(Boxed_Value)) { + return "push_back_ref"; + } else { + return "push_back"; + } + }()); + + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->find(f, pos); + }), + "find"); + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->rfind(f, pos); + }), + "rfind"); + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->find_first_of(f, pos); + }), + "find_first_of"); + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->find_last_of(f, pos); + }), + "find_last_of"); + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->find_last_not_of(f, pos); + }), + "find_last_not_of"); + m.add(fun([](const String *s, const String &f, size_t pos) { + return s->find_first_not_of(f, pos); + }), + "find_first_not_of"); + + m.add(fun([](String *s, typename String::value_type c) -> decltype(auto) { + return (*s += c); + }), + "+="); + + m.add(fun([](String *s) { s->clear(); }), "clear"); + m.add(fun([](const String *s) { return s->empty(); }), "empty"); + m.add(fun([](const String *s) { return s->size(); }), "size"); + + m.add(fun([](const String *s) { return s->c_str(); }), "c_str"); + m.add(fun([](const String *s) { return s->data(); }), "data"); + m.add(fun([](const String *s, size_t pos, size_t len) { + return s->substr(pos, len); + }), + "substr"); +} + +/// Add a MapType container +/// http://www.sgi.com/tech/stl/Map.html +template +void future_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + m.add(fun([](const FutureType &t) { return t.valid(); }), "valid"); + m.add(fun([](FutureType &t) { return t.get(); }), "get"); + m.add(fun(&FutureType::wait), "wait"); +} +} // namespace Carbon::bootstrap::standard_library + +#endif diff --git a/src/carbon/command/boxed_cast.hpp b/src/carbon/command/boxed_cast.hpp new file mode 100644 index 00000000..a08b1914 --- /dev/null +++ b/src/carbon/command/boxed_cast.hpp @@ -0,0 +1,109 @@ + + +#ifndef CARBON_BOXED_CAST_HPP +#define CARBON_BOXED_CAST_HPP + +#include "../defines.hpp" +#include "bad_boxed_cast.hpp" +#include "boxed_cast_helper.hpp" +#include "boxed_value.hpp" +#include "type_conversions.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Conversions; +} +namespace Carbon::detail::exception { +class bad_any_cast; +} // namespace Carbon::detail::exception + +namespace Carbon { +/// \brief Function for extracting a value stored in a Boxed_Value object +/// \tparam Type The type to extract from the Boxed_Value +/// \param[in] bv The Boxed_Value to extract a typed value from +/// \returns Type equivalent to the requested type +/// \throws exception::bad_boxed_cast If the requested conversion is not +/// possible +/// +/// boxed_cast will attempt to make conversions between value, &, *, +/// std::shared_ptr, std::reference_wrapper, and std::function (const and +/// non-const) where possible. boxed_cast is used internally during function +/// dispatch. This means that all of these conversions will be attempted +/// automatically for you during ChaiScript function calls. +/// +/// \li non-const values can be extracted as const or non-const +/// \li const values can be extracted only as const +/// \li Boxed_Value constructed from pointer or std::reference_wrapper can be +/// extracted as reference, +/// pointer or value types +/// \li Boxed_Value constructed from std::shared_ptr or value types can be +/// extracted as reference, +/// pointer, value, or std::shared_ptr types +/// +/// Conversions to std::function objects are attempted as well +/// +/// Example: +/// \code +/// // All of the following should succeed +/// Carbon::Boxed_Value bv(1); +/// std::shared_ptr spi = Carbon::boxed_cast +/// >(bv); int i = Carbon::boxed_cast(bv); int *ip = +/// Carbon::boxed_cast(bv); int &ir = Carbon::boxed_cast(bv); std::shared_ptr cspi = +/// Carbon::boxed_cast >(bv); const int ci = +/// Carbon::boxed_cast(bv); const int *cip = +/// Carbon::boxed_cast(bv); const int &cir = +/// Carbon::boxed_cast(bv); \endcode +/// +/// std::function conversion example +/// \code +/// Carbon::ChaiScript chai; +/// Boxed_Value bv = chai.eval("`+`"); // Get the functor for the + operator +/// which is built in std::function f = +/// Carbon::boxed_cast >(bv); int i = f(2,3); +/// assert(i == 5); +/// \endcode +template +decltype(auto) boxed_cast( + const Boxed_Value &bv, + const Type_Conversions_State *t_conversions = nullptr) { + if (!t_conversions || bv.get_type_info().bare_equal(user_type()) || + (t_conversions && !(*t_conversions)->convertable_type())) { + try { + return detail::Cast_Helper::cast(bv, t_conversions); + } catch (const Carbon::detail::exception::bad_any_cast &) { + } + } + + if (t_conversions && (*t_conversions)->convertable_type()) { + try { + // We will not catch any bad_boxed_dynamic_cast that is thrown, let + // the user get it either way, we are not responsible if it doesn't + // work + return (detail::Cast_Helper::cast( + (*t_conversions) + ->boxed_type_conversion(t_conversions->saves(), bv), + t_conversions)); + } catch (...) { + try { + // try going the other way + return (detail::Cast_Helper::cast( + (*t_conversions) + ->boxed_type_down_conversion( + t_conversions->saves(), bv), + t_conversions)); + } catch (const Carbon::detail::exception::bad_any_cast &) { + throw exception::bad_boxed_cast(bv.get_type_info(), + typeid(Type)); + } + } + } else { + // If it's not convertable, just throw the error, don't waste the time + // on the attempted dynamic_cast + throw exception::bad_boxed_cast(bv.get_type_info(), typeid(Type)); + } +} + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/boxed_cast_helper.hpp b/src/carbon/command/boxed_cast_helper.hpp new file mode 100644 index 00000000..3ee094d9 --- /dev/null +++ b/src/carbon/command/boxed_cast_helper.hpp @@ -0,0 +1,278 @@ + + +#ifndef CARBON_BOXED_CAST_HELPER_HPP +#define CARBON_BOXED_CAST_HELPER_HPP + +#include +#include + +#include "boxed_value.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Conversions_State; + +namespace detail { +// Cast_Helper_Inner helper classes + +template +constexpr T *throw_if_null(T *t) { + if (t) { + return t; + } + throw std::runtime_error("Attempted to dereference null Boxed_Value"); +} + +template +static const T *verify_type_no_throw(const Boxed_Value &ob, + const std::type_info &ti, const T *ptr) { + if (ob.get_type_info() == ti) { + return ptr; + } else { + throw Carbon::detail::exception::bad_any_cast(); + } +} + +template +static T *verify_type_no_throw(const Boxed_Value &ob, const std::type_info &ti, + T *ptr) { + if (!ob.is_const() && ob.get_type_info() == ti) { + return ptr; + } else { + throw Carbon::detail::exception::bad_any_cast(); + } +} + +template +static const T *verify_type(const Boxed_Value &ob, const std::type_info &ti, + const T *ptr) { + if (ob.get_type_info().bare_equal_type_info(ti)) { + return throw_if_null(ptr); + } else { + throw Carbon::detail::exception::bad_any_cast(); + } +} + +template +static T *verify_type(const Boxed_Value &ob, const std::type_info &ti, T *ptr) { + if (!ob.is_const() && ob.get_type_info().bare_equal_type_info(ti)) { + return throw_if_null(ptr); + } else { + throw Carbon::detail::exception::bad_any_cast(); + } +} + +/// Generic Cast_Helper_Inner, for casting to any type +template +struct Cast_Helper_Inner { + static Result cast(const Boxed_Value &ob, const Type_Conversions_State *) { + return *static_cast( + verify_type(ob, typeid(Result), ob.get_const_ptr())); + } +}; + +template +struct Cast_Helper_Inner : Cast_Helper_Inner {}; + +/// Cast_Helper_Inner for casting to a const * type +template +struct Cast_Helper_Inner { + static const Result *cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return static_cast( + verify_type_no_throw(ob, typeid(Result), ob.get_const_ptr())); + } +}; + +/// Cast_Helper_Inner for casting to a * type +template +struct Cast_Helper_Inner { + static Result *cast(const Boxed_Value &ob, const Type_Conversions_State *) { + return static_cast( + verify_type_no_throw(ob, typeid(Result), ob.get_ptr())); + } +}; + +template +struct Cast_Helper_Inner : public Cast_Helper_Inner { +}; + +template +struct Cast_Helper_Inner + : public Cast_Helper_Inner {}; + +/// Cast_Helper_Inner for casting to a & type +template +struct Cast_Helper_Inner { + static const Result &cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return *static_cast( + verify_type(ob, typeid(Result), ob.get_const_ptr())); + } +}; + +/// Cast_Helper_Inner for casting to a & type +template +struct Cast_Helper_Inner { + static Result &cast(const Boxed_Value &ob, const Type_Conversions_State *) { + return *static_cast( + verify_type(ob, typeid(Result), ob.get_ptr())); + } +}; + +/// Cast_Helper_Inner for casting to a && type +template +struct Cast_Helper_Inner { + static Result &&cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return std::move(*static_cast( + verify_type(ob, typeid(Result), ob.get_ptr()))); + } +}; + +/// Cast_Helper_Inner for casting to a std::unique_ptr<> && type +/// \todo Fix the fact that this has to be in a shared_ptr for now +template +struct Cast_Helper_Inner &&> { + static std::unique_ptr &&cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return std::move( + *(ob.get().cast>>())); + } +}; + +/// Cast_Helper_Inner for casting to a std::unique_ptr<> & type +/// \todo Fix the fact that this has to be in a shared_ptr for now +template +struct Cast_Helper_Inner &> { + static std::unique_ptr &cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return *(ob.get().cast>>()); + } +}; + +/// Cast_Helper_Inner for casting to a std::unique_ptr<> & type +/// \todo Fix the fact that this has to be in a shared_ptr for now +template +struct Cast_Helper_Inner &> { + static std::unique_ptr &cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return *(ob.get().cast>>()); + } +}; + +/// Cast_Helper_Inner for casting to a std::shared_ptr<> type +template +struct Cast_Helper_Inner> { + static auto cast(const Boxed_Value &ob, const Type_Conversions_State *) { + return ob.get().cast>(); + } +}; + +/// Cast_Helper_Inner for casting to a std::shared_ptr type +template +struct Cast_Helper_Inner> { + static auto cast(const Boxed_Value &ob, const Type_Conversions_State *) { + if (!ob.get_type_info().is_const()) { + return std::const_pointer_cast( + ob.get().cast>()); + } else { + return ob.get().cast>(); + } + } +}; + +/// Cast_Helper_Inner for casting to a const std::shared_ptr<> & type +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner> {}; + +template +struct Cast_Helper_Inner &> + : Cast_Helper_Inner> {}; + +template +struct Cast_Helper_Inner &> { + static_assert( + !std::is_const::value, + "Non-const reference to std::shared_ptr is not supported"); + static auto cast(const Boxed_Value &ob, const Type_Conversions_State *) { + std::shared_ptr &res = ob.get().cast>(); + return ob.pointer_sentinel(res); + } +}; + +/// Cast_Helper_Inner for casting to a const std::shared_ptr & type +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner> {}; + +template +struct Cast_Helper_Inner &> + : Cast_Helper_Inner> {}; + +/// Cast_Helper_Inner for casting to a Boxed_Value type +template <> +struct Cast_Helper_Inner { + static Boxed_Value cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return ob; + } +}; + +/// Cast_Helper_Inner for casting to a Boxed_Value & type +template <> +struct Cast_Helper_Inner { + static std::reference_wrapper cast( + const Boxed_Value &ob, const Type_Conversions_State *) { + return std::ref(const_cast(ob)); + } +}; + +/// Cast_Helper_Inner for casting to a const Boxed_Value & type +template <> +struct Cast_Helper_Inner : Cast_Helper_Inner {}; + +template <> +struct Cast_Helper_Inner : Cast_Helper_Inner { +}; + +/// Cast_Helper_Inner for casting to a std::reference_wrapper type +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner {}; + +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner {}; + +template +struct Cast_Helper_Inner &> + : Cast_Helper_Inner {}; + +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner {}; + +template +struct Cast_Helper_Inner> + : Cast_Helper_Inner {}; + +template +struct Cast_Helper_Inner &> + : Cast_Helper_Inner {}; + +/// The exposed Cast_Helper object that by default just calls the +/// Cast_Helper_Inner +template +struct Cast_Helper { + static decltype(auto) cast(const Boxed_Value &ob, + const Type_Conversions_State *t_conversions) { + return (Cast_Helper_Inner::cast(ob, t_conversions)); + } +}; +} // namespace detail + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/boxed_number.cpp b/src/carbon/command/boxed_number.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/carbon/command/boxed_number.hpp b/src/carbon/command/boxed_number.hpp new file mode 100644 index 00000000..4adebb3b --- /dev/null +++ b/src/carbon/command/boxed_number.hpp @@ -0,0 +1,857 @@ + + +#ifndef CARBON_BOXED_NUMERIC_HPP +#define CARBON_BOXED_NUMERIC_HPP + +#include +#include +#include + +#include "../language/algebraic.hpp" +#include "any.hpp" +#include "boxed_cast.hpp" +#include "boxed_cast_helper.hpp" +#include "boxed_value.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Conversions; +} // namespace Carbon + +namespace Carbon::exception { +struct arithmetic_error : std::runtime_error { + explicit arithmetic_error(const std::string &reason) + : std::runtime_error("Arithmetic error: " + reason) {} + arithmetic_error(const arithmetic_error &) = default; + ~arithmetic_error() noexcept override = default; +}; +} // namespace Carbon::exception + +namespace Carbon { +// Due to the nature of generating every possible arithmetic operation, there +// are going to be warnings generated on every platform regarding size and sign, +// this is OK, so we're disabling size/and sign type warnings +#ifdef CARBON_MSVC +#pragma warning(push) +#pragma warning(disable : 4244 4018 4389 4146 4365 4267 4242) +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma GCC diagnostic ignored "-Wpragmas" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wfloat-equal" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wfloat-conversion" +#pragma GCC diagnostic ignored "-Wswitch" +#endif + +/// \brief Represents any numeric type, generically. Used internally for generic +/// operations between POD values +class Boxed_Number { +private: + enum class Common_Types { + t_int32, + t_double, + t_uint8, + t_int8, + t_uint16, + t_int16, + t_uint32, + t_uint64, + t_int64, + t_float, + t_long_double + }; + + template + constexpr static inline void check_divide_by_zero([[maybe_unused]] T t) { +#ifndef CARBON_NO_PROTECT_DIVIDEBYZERO + if constexpr (!std::is_floating_point::value) { + if (t == 0) { + throw Carbon::exception::arithmetic_error("divide by zero"); + } + } +#endif + } + + constexpr static Common_Types get_common_type(size_t t_size, + bool t_signed) noexcept { + return (t_size == 1 && t_signed) ? (Common_Types::t_int8) + : (t_size == 1) ? (Common_Types::t_uint8) + : (t_size == 2 && t_signed) ? (Common_Types::t_int16) + : (t_size == 2) ? (Common_Types::t_uint16) + : (t_size == 4 && t_signed) ? (Common_Types::t_int32) + : (t_size == 4) ? (Common_Types::t_uint32) + : (t_size == 8 && t_signed) ? (Common_Types::t_int64) + : (Common_Types::t_uint64); + } + + /* + const Type_Info &inp_ = t_bv.get_type_info(); + + // 一个泛型lambda函数,用于检查类型并返回相应的Common_Types + auto check_type = [&inp_](Common_Types type_if_match) -> Common_Types { + if (inp_ == user_type()) { + return type_if_match; + } + throw std::invalid_argument("Type not supported"); + }; + + try { + // 使用lambda函数替代if-else链 + return std::visit([&](auto&& arg) -> Common_Types { + using T = std::decay_t; + if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_int); + } else if constexpr (std::is_same_v) { + return Common_Types::t_double; + } else if constexpr (std::is_same_v) { + return Common_Types::t_long_double; + } else if constexpr (std::is_same_v) { + return Common_Types::t_float; + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_int8); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_uint8); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_uint32); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_int64); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_int64); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_uint64); + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types::t_uint64); + } else if constexpr (std::is_same_v) { + return Common_Types::t_int8; + } else if constexpr (std::is_same_v) { + return Common_Types::t_int16; + } else if constexpr (std::is_same_v) { + return Common_Types::t_int32; + } else if constexpr (std::is_same_v) { + return Common_Types::t_int64; + } else if constexpr (std::is_same_v) { + return Common_Types::t_uint8; + } else if constexpr (std::is_same_v) { + return Common_Types::t_uint16; + } else if constexpr (std::is_same_v) { + return Common_Types::t_uint32; + } else if constexpr (std::is_same_v) { + return Common_Types::t_uint64; + } else if constexpr (std::is_same_v) { + return check_type.template operator()(Common_Types:: + */ + + static Common_Types get_common_type(const Boxed_Value &t_bv) { + const Type_Info &inp_ = t_bv.get_type_info(); + + if (inp_ == user_type()) { + return get_common_type(sizeof(int), true); + } else if (inp_ == user_type()) { + return Common_Types::t_double; + } else if (inp_ == user_type()) { + return Common_Types::t_long_double; + } else if (inp_ == user_type()) { + return Common_Types::t_float; + } else if (inp_ == user_type()) { + return get_common_type(sizeof(char), std::is_signed::value); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(unsigned char), false); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(unsigned int), false); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(long), true); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(long long), true); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(unsigned long), false); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(unsigned long long), false); + } else if (inp_ == user_type()) { + return Common_Types::t_int8; + } else if (inp_ == user_type()) { + return Common_Types::t_int16; + } else if (inp_ == user_type()) { + return Common_Types::t_int32; + } else if (inp_ == user_type()) { + return Common_Types::t_int64; + } else if (inp_ == user_type()) { + return Common_Types::t_uint8; + } else if (inp_ == user_type()) { + return Common_Types::t_uint16; + } else if (inp_ == user_type()) { + return Common_Types::t_uint32; + } else if (inp_ == user_type()) { + return Common_Types::t_uint64; + } else if (inp_ == user_type()) { + return get_common_type(sizeof(wchar_t), + std::is_signed::value); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(char16_t), + std::is_signed::value); + } else if (inp_ == user_type()) { + return get_common_type(sizeof(char32_t), + std::is_signed::value); + } else { + throw Carbon::detail::exception::bad_any_cast(); + } + } + + template + static auto go(Operators::Opers t_oper, const Boxed_Value &t_bv, LHS *t_lhs, + const LHS &c_lhs, const RHS &c_rhs) { + switch (t_oper) { + case Operators::Opers::equals: + return const_var(c_lhs == c_rhs); + case Operators::Opers::less_than: + return const_var(c_lhs < c_rhs); + case Operators::Opers::greater_than: + return const_var(c_lhs > c_rhs); + case Operators::Opers::less_than_equal: + return const_var(c_lhs <= c_rhs); + case Operators::Opers::greater_than_equal: + return const_var(c_lhs >= c_rhs); + case Operators::Opers::not_equal: + return const_var(c_lhs != c_rhs); + case Operators::Opers::sum: + return const_var(c_lhs + c_rhs); + case Operators::Opers::quotient: + check_divide_by_zero(c_rhs); + return const_var(c_lhs / c_rhs); + case Operators::Opers::product: + return const_var(c_lhs * c_rhs); + case Operators::Opers::difference: + return const_var(c_lhs - c_rhs); + default: + break; + } + + if constexpr (!std::is_floating_point::value && + !std::is_floating_point::value) { + switch (t_oper) { + case Operators::Opers::shift_left: + return const_var(c_lhs << c_rhs); + case Operators::Opers::shift_right: + return const_var(c_lhs >> c_rhs); + case Operators::Opers::remainder: + check_divide_by_zero(c_rhs); + return const_var(c_lhs % c_rhs); + case Operators::Opers::bitwise_and: + return const_var(c_lhs & c_rhs); + case Operators::Opers::bitwise_or: + return const_var(c_lhs | c_rhs); + case Operators::Opers::bitwise_xor: + return const_var(c_lhs ^ c_rhs); + default: + break; + } + } + + if (t_lhs) { + switch (t_oper) { + case Operators::Opers::assign: + *t_lhs = c_rhs; + return t_bv; + case Operators::Opers::assign_product: + *t_lhs *= c_rhs; + return t_bv; + case Operators::Opers::assign_sum: + *t_lhs += c_rhs; + return t_bv; + case Operators::Opers::assign_quotient: + check_divide_by_zero(c_rhs); + *t_lhs /= c_rhs; + return t_bv; + case Operators::Opers::assign_difference: + *t_lhs -= c_rhs; + return t_bv; + default: + break; + } + + if constexpr (!std::is_floating_point::value && + !std::is_floating_point::value) { + switch (t_oper) { + case Operators::Opers::assign_bitwise_and: + check_divide_by_zero(c_rhs); + *t_lhs &= c_rhs; + return t_bv; + case Operators::Opers::assign_bitwise_or: + *t_lhs |= c_rhs; + return t_bv; + case Operators::Opers::assign_shift_left: + *t_lhs <<= c_rhs; + return t_bv; + case Operators::Opers::assign_shift_right: + *t_lhs >>= c_rhs; + return t_bv; + case Operators::Opers::assign_remainder: + *t_lhs %= c_rhs; + return t_bv; + case Operators::Opers::assign_bitwise_xor: + *t_lhs ^= c_rhs; + return t_bv; + default: + break; + } + } + } + + throw Carbon::detail::exception::bad_any_cast(); + } + + template + inline static auto visit(const Boxed_Value &bv, Callable &&callable) { + switch (get_common_type(bv)) { + case Common_Types::t_int32: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_uint8: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_int8: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_uint16: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_int16: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_uint32: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_uint64: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_int64: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_double: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_float: + return callable( + *static_cast(bv.get_const_ptr())); + case Common_Types::t_long_double: + return callable( + *static_cast(bv.get_const_ptr())); + } + throw Carbon::detail::exception::bad_any_cast(); + } + + inline static Boxed_Value oper(Operators::Opers t_oper, + const Boxed_Value &t_lhs) { + auto unary_operator = [t_oper, &t_lhs](const auto &c_lhs) { + auto *lhs = + static_cast *>(t_lhs.get_ptr()); + + if (lhs) { + switch (t_oper) { + case Operators::Opers::pre_increment: + ++(*lhs); + return t_lhs; + case Operators::Opers::pre_decrement: + --(*lhs); + return t_lhs; + default: + break; + } + } + + switch (t_oper) { + case Operators::Opers::unary_minus: + return const_var(-c_lhs); + case Operators::Opers::unary_plus: + return const_var(+c_lhs); + default: + break; + } + + if constexpr (!std::is_floating_point_v< + std::decay_t>) { + switch (t_oper) { + case Operators::Opers::bitwise_complement: + return const_var(~c_lhs); + default: + break; + } + } + + throw Carbon::detail::exception::bad_any_cast(); + }; + + return visit(t_lhs, unary_operator); + } + + inline static Boxed_Value oper(Operators::Opers t_oper, + const Boxed_Value &t_lhs, + const Boxed_Value &t_rhs) { + auto lhs_visit = [t_oper, &t_lhs, &t_rhs](const auto &c_lhs) { + auto *lhs = t_lhs.is_return_value() + ? nullptr + : static_cast *>( + t_lhs.get_ptr()); + + auto rhs_visit = [t_oper, &t_lhs, lhs, &c_lhs](const auto &c_rhs) { + return go(t_oper, t_lhs, lhs, c_lhs, c_rhs); + }; + + return visit(t_rhs, rhs_visit); + }; + + return visit(t_lhs, lhs_visit); + } + + template + static inline Target get_as_aux(const Boxed_Value &t_bv) { + return static_cast( + *static_cast(t_bv.get_const_ptr())); + } + + template + static std::string to_string_aux(const Boxed_Value &v) { + std::ostringstream oss; + oss << *static_cast(v.get_const_ptr()); + return oss.str(); + } + +public: + Boxed_Number() : bv(Boxed_Value(0)) {} + + explicit Boxed_Number(Boxed_Value v) : bv(std::move(v)) { + validate_boxed_number(bv); + } + + Boxed_Number(const Boxed_Number &) = default; + Boxed_Number(Boxed_Number &&) = default; + Boxed_Number &operator=(Boxed_Number &&) = default; + + template + explicit Boxed_Number(T t) : bv(Boxed_Value(t)) { + validate_boxed_number(bv); + } + + static Boxed_Value clone(const Boxed_Value &t_bv) { + return Boxed_Number(t_bv).get_as(t_bv.get_type_info()).bv; + } + + static bool is_floating_point(const Boxed_Value &t_bv) { + const Type_Info &inp_ = t_bv.get_type_info(); + + if (inp_ == user_type()) { + return true; + } else if (inp_ == user_type()) { + return true; + } else if (inp_ == user_type()) { + return true; + } else { + return false; + } + } + + Boxed_Number get_as(const Type_Info &inp_) const { + if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else if (inp_.bare_equal(user_type())) { + return Boxed_Number(get_as()); + } else { + throw Carbon::detail::exception::bad_any_cast(); + } + } + + template + static void check_type() { +#ifdef CARBON_MSVC +// MSVC complains about this being redundant / tautologica l +#pragma warning(push) +#pragma warning(disable : 4127 6287) +#endif + if (sizeof(Source) != sizeof(Target) || + std::is_signed() != std::is_signed() || + std::is_floating_point() != + std::is_floating_point()) { + throw Carbon::detail::exception::bad_any_cast(); + } +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + } + + template + Target get_as_checked() const { + switch (get_common_type(bv)) { + case Common_Types::t_int32: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint8: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int8: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint16: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int16: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint32: + check_type(); + return get_as_aux(bv); + case Common_Types::t_uint64: + check_type(); + return get_as_aux(bv); + case Common_Types::t_int64: + check_type(); + return get_as_aux(bv); + case Common_Types::t_double: + check_type(); + return get_as_aux(bv); + case Common_Types::t_float: + check_type(); + return get_as_aux(bv); + case Common_Types::t_long_double: + check_type(); + return get_as_aux(bv); + } + + throw Carbon::detail::exception::bad_any_cast(); + } + + template + Target get_as() const { + switch (get_common_type(bv)) { + case Common_Types::t_int32: + return get_as_aux(bv); + case Common_Types::t_uint8: + return get_as_aux(bv); + case Common_Types::t_int8: + return get_as_aux(bv); + case Common_Types::t_uint16: + return get_as_aux(bv); + case Common_Types::t_int16: + return get_as_aux(bv); + case Common_Types::t_uint32: + return get_as_aux(bv); + case Common_Types::t_uint64: + return get_as_aux(bv); + case Common_Types::t_int64: + return get_as_aux(bv); + case Common_Types::t_double: + return get_as_aux(bv); + case Common_Types::t_float: + return get_as_aux(bv); + case Common_Types::t_long_double: + return get_as_aux(bv); + } + + throw Carbon::detail::exception::bad_any_cast(); + } + + std::string to_string() const { + switch (get_common_type(bv)) { + case Common_Types::t_int32: + return std::to_string(get_as()); + case Common_Types::t_uint8: + return std::to_string(get_as()); + case Common_Types::t_int8: + return std::to_string(get_as()); + case Common_Types::t_uint16: + return std::to_string(get_as()); + case Common_Types::t_int16: + return std::to_string(get_as()); + case Common_Types::t_uint32: + return std::to_string(get_as()); + case Common_Types::t_uint64: + return std::to_string(get_as()); + case Common_Types::t_int64: + return std::to_string(get_as()); + case Common_Types::t_double: + return to_string_aux(bv); + case Common_Types::t_float: + return to_string_aux(bv); + case Common_Types::t_long_double: + return to_string_aux(bv); + } + + throw Carbon::detail::exception::bad_any_cast(); + } + + static void validate_boxed_number(const Boxed_Value &v) { + const Type_Info &inp_ = v.get_type_info(); + if (inp_ == user_type()) { + throw Carbon::detail::exception::bad_any_cast(); + } + + if (!inp_.is_arithmetic()) { + throw Carbon::detail::exception::bad_any_cast(); + } + } + + static bool equals(const Boxed_Number &t_lhs, const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::equals, t_lhs.bv, t_rhs.bv)); + } + + static bool less_than(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::less_than, t_lhs.bv, t_rhs.bv)); + } + + static bool greater_than(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::greater_than, t_lhs.bv, t_rhs.bv)); + } + + static bool greater_than_equal(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::greater_than_equal, t_lhs.bv, t_rhs.bv)); + } + + static bool less_than_equal(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::less_than_equal, t_lhs.bv, t_rhs.bv)); + } + + static bool not_equal(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return boxed_cast( + oper(Operators::Opers::not_equal, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number pre_decrement(Boxed_Number t_lhs) { + return Boxed_Number(oper(Operators::Opers::pre_decrement, t_lhs.bv)); + } + + static Boxed_Number pre_increment(Boxed_Number t_lhs) { + return Boxed_Number(oper(Operators::Opers::pre_increment, t_lhs.bv)); + } + + static const Boxed_Number sum(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number(oper(Operators::Opers::sum, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number unary_plus(const Boxed_Number &t_lhs) { + return Boxed_Number(oper(Operators::Opers::unary_plus, t_lhs.bv)); + } + + static const Boxed_Number unary_minus(const Boxed_Number &t_lhs) { + return Boxed_Number(oper(Operators::Opers::unary_minus, t_lhs.bv)); + } + + static const Boxed_Number difference(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::difference, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_bitwise_and(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_bitwise_and, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign(Boxed_Number t_lhs, const Boxed_Number &t_rhs) { + return Boxed_Number(oper(Operators::Opers::assign, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_bitwise_or(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_bitwise_or, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_bitwise_xor(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_bitwise_xor, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_remainder(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_remainder, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_shift_left(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_shift_left, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_shift_right(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_shift_right, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number bitwise_and(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::bitwise_and, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number bitwise_complement(const Boxed_Number &t_lhs) { + return Boxed_Number(oper(Operators::Opers::bitwise_complement, t_lhs.bv, + Boxed_Value(0))); + } + + static const Boxed_Number bitwise_xor(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::bitwise_xor, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number bitwise_or(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::bitwise_or, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_product(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_product, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_quotient(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_quotient, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Number assign_sum(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_sum, t_lhs.bv, t_rhs.bv)); + } + static Boxed_Number assign_difference(Boxed_Number t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::assign_difference, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number quotient(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::quotient, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number shift_left(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::shift_left, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number product(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::product, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number remainder(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::remainder, t_lhs.bv, t_rhs.bv)); + } + + static const Boxed_Number shift_right(const Boxed_Number &t_lhs, + const Boxed_Number &t_rhs) { + return Boxed_Number( + oper(Operators::Opers::shift_right, t_lhs.bv, t_rhs.bv)); + } + + static Boxed_Value do_oper(Operators::Opers t_oper, + const Boxed_Value &t_lhs, + const Boxed_Value &t_rhs) { + return oper(t_oper, t_lhs, t_rhs); + } + + static Boxed_Value do_oper(Operators::Opers t_oper, + const Boxed_Value &t_lhs) { + return oper(t_oper, t_lhs); + } + + Boxed_Value bv; +}; + +namespace detail { +/// Cast_Helper for converting from Boxed_Value to Boxed_Number +template <> +struct Cast_Helper { + static Boxed_Number cast(const Boxed_Value &ob, + const Type_Conversions_State *) { + return Boxed_Number(ob); + } +}; + +/// Cast_Helper for converting from Boxed_Value to Boxed_Number +template <> +struct Cast_Helper : Cast_Helper {}; + +/// Cast_Helper for converting from Boxed_Value to Boxed_Number +template <> +struct Cast_Helper : Cast_Helper {}; +} // namespace detail + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/boxed_value.cpp b/src/carbon/command/boxed_value.cpp new file mode 100644 index 00000000..7a6013d8 --- /dev/null +++ b/src/carbon/command/boxed_value.cpp @@ -0,0 +1,123 @@ +#include "boxed_value.hpp" + +namespace Carbon { +Boxed_Value::Data::Data(const Type_Info &ti, Carbon::detail::Any to, + bool is_ref, const void *t_void_ptr, + bool t_return_value) + : m_type_info(ti), + m_obj(std::move(to)), + m_data_ptr(ti.is_const() ? nullptr : const_cast(t_void_ptr)), + m_const_data_ptr(t_void_ptr), + m_is_ref(is_ref), + m_return_value(t_return_value) {} + +Boxed_Value::Data &Boxed_Value::Data::operator=(const Data &rhs) { + m_type_info = rhs.m_type_info; + m_obj = rhs.m_obj; + m_is_ref = rhs.m_is_ref; + m_data_ptr = rhs.m_data_ptr; + m_const_data_ptr = rhs.m_const_data_ptr; + m_return_value = rhs.m_return_value; + + if (rhs.m_attrs) { + m_attrs = + std::make_unique>>( + *rhs.m_attrs); + } + + return *this; +} + +Boxed_Value::Boxed_Value(std::shared_ptr t_data, Internal_Construction) + : m_data(std::move(t_data)) {} + +void Boxed_Value::swap(Boxed_Value &rhs) noexcept { + std::swap(m_data, rhs.m_data); +} + +Boxed_Value Boxed_Value::assign(const Boxed_Value &rhs) noexcept { + (*m_data) = (*rhs.m_data); + return *this; +} + +const Type_Info &Boxed_Value::get_type_info() const noexcept { + return m_data->m_type_info; +} + +/// return true if the object is uninitialized +bool Boxed_Value::is_undef() const noexcept { + return m_data->m_type_info.is_undef(); +} + +bool Boxed_Value::is_const() const noexcept { + return m_data->m_type_info.is_const(); +} + +bool Boxed_Value::is_type(const Type_Info &ti) const noexcept { + return m_data->m_type_info.bare_equal(ti); +} + +bool Boxed_Value::is_null() const noexcept { + return (m_data->m_data_ptr == nullptr && + m_data->m_const_data_ptr == nullptr); +} + +const Carbon::detail::Any &Boxed_Value::get() const noexcept { + return m_data->m_obj; +} + +bool Boxed_Value::is_ref() const noexcept { return m_data->m_is_ref; } + +bool Boxed_Value::is_return_value() const noexcept { + return m_data->m_return_value; +} + +void Boxed_Value::reset_return_value() const noexcept { + m_data->m_return_value = false; +} + +bool Boxed_Value::is_pointer() const noexcept { return !is_ref(); } + +void *Boxed_Value::get_ptr() const noexcept { return m_data->m_data_ptr; } + +const void *Boxed_Value::get_const_ptr() const noexcept { + return m_data->m_const_data_ptr; +} + +Boxed_Value Boxed_Value::get_attr(const std::string &t_name) { + if (!m_data->m_attrs) { + m_data->m_attrs = + std::make_unique>>(); + } + + auto &attr = (*m_data->m_attrs)[t_name]; + if (attr) { + return Boxed_Value(attr, Internal_Construction()); + } else { + Boxed_Value bv; // default construct a new one + attr = bv.m_data; + return bv; + } +} + +Boxed_Value &Boxed_Value::copy_attrs(const Boxed_Value &t_obj) { + if (t_obj.m_data->m_attrs) { + m_data->m_attrs = + std::make_unique>>( + *t_obj.m_data->m_attrs); + } + return *this; +} + +Boxed_Value &Boxed_Value::clone_attrs(const Boxed_Value &t_obj) { + copy_attrs(t_obj); + reset_return_value(); + return *this; +} + +/// \returns true if the two Boxed_Values share the same internal type +bool Boxed_Value::type_match(const Boxed_Value &l, + const Boxed_Value &r) noexcept { + return l.get_type_info() == r.get_type_info(); +} +} // namespace Carbon diff --git a/src/carbon/command/boxed_value.hpp b/src/carbon/command/boxed_value.hpp new file mode 100644 index 00000000..511db692 --- /dev/null +++ b/src/carbon/command/boxed_value.hpp @@ -0,0 +1,322 @@ +#ifndef CARBON_BOXED_VALUE_HPP +#define CARBON_BOXED_VALUE_HPP + +#include +#include +#include + +#include "../defines.hpp" +#include "any.hpp" +#include "type_info.hpp" + +namespace Carbon { +/// \brief A wrapper for holding any valid C++ type. All types in ChaiScript are +/// Boxed_Value objects \sa Carbon::boxed_cast +class Boxed_Value { +public: + /// used for explicitly creating a "void" object + struct Void_Type {}; + +private: + /// structure which holds the internal state of a Boxed_Value + /// \todo Get rid of Any and merge it with this, reducing an allocation in + /// the process + struct Data { + Data(const Type_Info &ti, Carbon::detail::Any to, bool is_ref, + const void *t_void_ptr, bool t_return_value); + + Data &operator=(const Data &rhs); + + Data(const Data &) = delete; + + Data(Data &&) = default; + Data &operator=(Data &&rhs) = default; + + Type_Info m_type_info; + Carbon::detail::Any m_obj; + void *m_data_ptr; + const void *m_const_data_ptr; + std::unique_ptr>> m_attrs; + bool m_is_ref; + bool m_return_value; + }; + + struct Object_Data { + static auto get(Boxed_Value::Void_Type, bool t_return_value) { + return std::make_shared(detail::Get_Type_Info::get(), + Carbon::detail::Any(), false, + nullptr, t_return_value); + } + + template + static auto get(const std::shared_ptr *obj, bool t_return_value) { + return get(*obj, t_return_value); + } + + template + static auto get(const std::shared_ptr &obj, bool t_return_value) { + return std::make_shared(detail::Get_Type_Info::get(), + Carbon::detail::Any(obj), false, + obj.get(), t_return_value); + } + + template + static auto get(std::shared_ptr &&obj, bool t_return_value) { + auto ptr = obj.get(); + return std::make_shared( + detail::Get_Type_Info::get(), + Carbon::detail::Any(std::move(obj)), false, ptr, + t_return_value); + } + + template + static auto get(T *t, bool t_return_value) { + return get(std::ref(*t), t_return_value); + } + + template + static auto get(const T *t, bool t_return_value) { + return get(std::cref(*t), t_return_value); + } + + template + static auto get(std::reference_wrapper obj, bool t_return_value) { + auto p = &obj.get(); + return std::make_shared( + detail::Get_Type_Info::get(), + Carbon::detail::Any(std::move(obj)), true, p, + t_return_value); + } + + template + static auto get(std::unique_ptr &&obj, bool t_return_value) { + auto ptr = obj.get(); + return std::make_shared( + detail::Get_Type_Info::get(), + Carbon::detail::Any( + std::make_shared>(std::move(obj))), + true, ptr, t_return_value); + } + + template + static auto get(T t, bool t_return_value) { + auto p = std::make_shared(std::move(t)); + auto ptr = p.get(); + return std::make_shared(detail::Get_Type_Info::get(), + Carbon::detail::Any(std::move(p)), + false, ptr, t_return_value); + } + + static std::shared_ptr get() { + return std::make_shared( + Type_Info(), Carbon::detail::Any(), false, nullptr, false); + } + }; + +public: + /// Basic Boxed_Value constructor + template >>> + explicit Boxed_Value(T &&t, bool t_return_value = false) + : m_data(Object_Data::get(std::forward(t), t_return_value)) {} + + /// Unknown-type constructor + Boxed_Value() = default; + + Boxed_Value(Boxed_Value &&) = default; + Boxed_Value &operator=(Boxed_Value &&) = default; + Boxed_Value(const Boxed_Value &) = default; + Boxed_Value &operator=(const Boxed_Value &) = default; + + void swap(Boxed_Value &rhs); + + /// Copy the values stored in rhs.m_data to m_data. + /// m_data pointers are not shared in this case + Boxed_Value assign(const Boxed_Value &rhs) noexcept; + + const Type_Info &get_type_info() const noexcept; + + /// return true if the object is uninitialized + bool is_undef() const noexcept; + + bool is_const() const noexcept; + + bool is_type(const Type_Info &ti) const noexcept; + + template + auto pointer_sentinel(std::shared_ptr &ptr) const noexcept { + struct Sentinel { + Sentinel(std::shared_ptr &t_ptr, Data &data) + : m_ptr(t_ptr), m_data(data) {} + + ~Sentinel() { + // save new pointer data + const auto ptr_ = m_ptr.get().get(); + m_data.get().m_data_ptr = ptr_; + m_data.get().m_const_data_ptr = ptr_; + } + + Sentinel &operator=(Sentinel &&s) = default; + Sentinel(Sentinel &&s) = default; + + operator std::shared_ptr &() const noexcept { + return m_ptr.get(); + } + + Sentinel &operator=(const Sentinel &) = delete; + Sentinel(Sentinel &) = delete; + + std::reference_wrapper> m_ptr; + std::reference_wrapper m_data; + }; + + return Sentinel(ptr, *(m_data.get())); + } + + bool is_null() const noexcept; + + const Carbon::detail::Any &get() const noexcept; + + bool is_ref() const noexcept; + + bool is_return_value() const noexcept; + + void reset_return_value() const noexcept; + + bool is_pointer() const noexcept; + + void *get_ptr() const noexcept; + + const void *get_const_ptr() const noexcept; + + Boxed_Value get_attr(const std::string &t_name); + + Boxed_Value ©_attrs(const Boxed_Value &t_obj); + + Boxed_Value &clone_attrs(const Boxed_Value &t_obj); + + /// \returns true if the two Boxed_Values share the same internal type + static bool type_match(const Boxed_Value &l, + const Boxed_Value &r) noexcept; + +private: + // necessary to avoid hitting the templated && constructor of Boxed_Value + struct Internal_Construction {}; + + Boxed_Value(std::shared_ptr t_data, Internal_Construction); + + std::shared_ptr m_data = Object_Data::get(); +}; + +/// @brief Creates a Boxed_Value. If the object passed in is a value type, it is +/// copied. If it is a pointer, std::shared_ptr, or std::reference_type +/// a copy is not made. +/// @param t The value to box +/// +/// Example: +/// +/// ~~~{.cpp} +/// int i; +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::var(i), "i"); +/// chai.add(Carbon::var(&i), "ip"); +/// ~~~ +/// +/// @sa @ref adding_objects +template +Boxed_Value var(T &&t) { + return Boxed_Value(std::forward(t)); +} + +namespace detail { +/// \brief Takes a value, copies it and returns a Boxed_Value object that is +/// immutable \param[in] t Value to copy and make const \returns Immutable +/// Boxed_Value \sa Boxed_Value::is_const +template +Boxed_Value const_var_impl(const T &t) { + return Boxed_Value(std::make_shared::type>(t)); +} + +/// \brief Takes a pointer to a value, adds const to the pointed to type and +/// returns an immutable Boxed_Value. +/// Does not copy the pointed to value. +/// \param[in] t Pointer to make immutable +/// \returns Immutable Boxed_Value +/// \sa Boxed_Value::is_const +template +Boxed_Value const_var_impl(T *t) { + return Boxed_Value(const_cast::type *>(t)); +} + +/// \brief Takes a std::shared_ptr to a value, adds const to the pointed to type +/// and returns an immutable Boxed_Value. +/// Does not copy the pointed to value. +/// \param[in] t Pointer to make immutable +/// \returns Immutable Boxed_Value +/// \sa Boxed_Value::is_const +template +Boxed_Value const_var_impl(const std::shared_ptr &t) { + return Boxed_Value( + std::const_pointer_cast::type>(t)); +} + +/// \brief Takes a std::reference_wrapper value, adds const to the referenced +/// type and returns an immutable Boxed_Value. +/// Does not copy the referenced value. +/// \param[in] t Reference object to make immutable +/// \returns Immutable Boxed_Value +/// \sa Boxed_Value::is_const +template +Boxed_Value const_var_impl(const std::reference_wrapper &t) { + return Boxed_Value(std::cref(t.get())); +} +} // namespace detail + +/// \brief Takes an object and returns an immutable Boxed_Value. If the object +/// is a std::reference or pointer type +/// the value is not copied. If it is an object type, it is copied. +/// \param[in] t Object to make immutable +/// \returns Immutable Boxed_Value +/// \sa Carbon::Boxed_Value::is_const +/// \sa Carbon::var +/// +/// Example: +/// \code +/// enum Colors +/// { +/// Blue, +/// Green, +/// Red +/// }; +/// Carbon::ChaiScript chai +/// chai.add(Carbon::const_var(Blue), "Blue"); // add immutable constant +/// chai.add(Carbon::const_var(Red), "Red"); +/// chai.add(Carbon::const_var(Green), "Green"); +/// \endcode +/// +/// \todo support C++11 strongly typed enums +/// \sa \ref adding_objects +template +Boxed_Value const_var(const T &t) { + return detail::const_var_impl(t); +} + +inline Boxed_Value void_var() { + static const auto v = Boxed_Value(Boxed_Value::Void_Type()); + return v; +} + +inline Boxed_Value const_var(bool b) { + static const auto t = detail::const_var_impl(true); + static const auto f = detail::const_var_impl(false); + + if (b) { + return t; + } else { + return f; + } +} + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/dispatchkit.hpp b/src/carbon/command/dispatchkit.hpp new file mode 100644 index 00000000..1f03463a --- /dev/null +++ b/src/carbon/command/dispatchkit.hpp @@ -0,0 +1,1405 @@ + + +#ifndef CARBON_DISPATCHKIT_HPP +#define CARBON_DISPATCHKIT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../defines.hpp" +#include "../threading.hpp" +#include "../utils/quick_flat_map.hpp" +#include "bad_boxed_cast.hpp" +#include "boxed_cast.hpp" +#include "boxed_cast_helper.hpp" +#include "boxed_value.hpp" +#include "dynamic_object.hpp" +#include "proxy_constructors.hpp" +#include "proxy_functions.hpp" +#include "short_alloc.hpp" +#include "type_conversions.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Boxed_Number; +} // namespace Carbon + +namespace Carbon { +namespace parser { +class ChaiScript_Parser_Base; +} +namespace dispatch { +class Dynamic_Proxy_Function; +class Proxy_Function_Base; +struct Placeholder_Object; +} // namespace dispatch +} // namespace Carbon + +/// \namespace Carbon::dispatch +/// \brief Classes and functions specific to the runtime dispatch side of +/// ChaiScript. Some items may be of use to the end user. + +namespace Carbon { +namespace exception { +/// Exception thrown in the case that an object name is invalid because it is a +/// reserved word +class reserved_word_error : public std::runtime_error { +public: + explicit reserved_word_error(const std::string &t_word) noexcept + : std::runtime_error("Reserved word not allowed in object name: " + + t_word), + m_word(t_word) {} + + reserved_word_error(const reserved_word_error &) = default; + + ~reserved_word_error() noexcept override = default; + + std::string word() const { return m_word; } + +private: + std::string m_word; +}; + +/// Exception thrown in the case that an object name is invalid because it +/// contains illegal characters +class illegal_name_error : public std::runtime_error { +public: + explicit illegal_name_error(const std::string &t_name) noexcept + : std::runtime_error("Reserved name not allowed in object name: " + + t_name), + m_name(t_name) {} + + illegal_name_error(const illegal_name_error &) = default; + + ~illegal_name_error() noexcept override = default; + + std::string name() const { return m_name; } + +private: + std::string m_name; +}; + +/// Exception thrown in the case that an object name is invalid because it +/// already exists in current context +class name_conflict_error : public std::runtime_error { +public: + explicit name_conflict_error(const std::string &t_name) noexcept + : std::runtime_error("Name already exists in current context " + + t_name), + m_name(t_name) {} + + name_conflict_error(const name_conflict_error &) = default; + + ~name_conflict_error() noexcept override = default; + + std::string name() const { return m_name; } + +private: + std::string m_name; +}; + +/// Exception thrown in the case that a non-const object was added as a shared +/// object +class global_non_const : public std::runtime_error { +public: + global_non_const() noexcept + : std::runtime_error("a global object must be const") {} + + global_non_const(const global_non_const &) = default; + ~global_non_const() noexcept override = default; +}; +} // namespace exception + +/// \brief Holds a collection of ChaiScript settings which can be applied to the +/// ChaiScript runtime. +/// Used to implement loadable module support. +class Module { +public: + Module &add(Type_Info ti, std::string name) { + m_typeinfos.emplace_back(ti, std::move(name)); + return *this; + } + + Module &add(Type_Conversion d) { + m_conversions.push_back(std::move(d)); + return *this; + } + + Module &add(Proxy_Function f, std::string name) { + m_funcs.emplace_back(std::move(f), std::move(name)); + return *this; + } + + Module &add_global_const(Boxed_Value t_bv, std::string t_name) { + if (!t_bv.is_const()) { + throw Carbon::exception::global_non_const(); + } + + m_globals.emplace_back(std::move(t_bv), std::move(t_name)); + return *this; + } + + // Add a bit of ChaiScript to eval during module implementation + Module &eval(std::string str) { + m_evals.push_back(std::move(str)); + return *this; + } + + template + void apply(Eval &t_eval, Engine &t_engine) const { + apply(m_typeinfos.begin(), m_typeinfos.end(), t_engine); + apply(m_funcs.begin(), m_funcs.end(), t_engine); + apply_eval(m_evals.begin(), m_evals.end(), t_eval); + apply_single(m_conversions.begin(), m_conversions.end(), t_engine); + apply_globals(m_globals.begin(), m_globals.end(), t_engine); + } + + bool has_function(const Proxy_Function &new_f, + std::string_view name) noexcept { + return std::any_of( + m_funcs.begin(), m_funcs.end(), + [&](const std::pair &existing_f) { + return existing_f.second == name && + *(existing_f.first) == *(new_f); + }); + } + +private: + std::vector> m_typeinfos; + std::vector> m_funcs; + std::vector> m_globals; + std::vector m_evals; + std::vector m_conversions; + + template + static void apply(InItr begin, const InItr end, T &t) { + for_each(begin, end, [&t](const auto &obj) { + try { + t.add(obj.first, obj.second); + } catch (const Carbon::exception::name_conflict_error &) { + /// \todo Should we throw an error if there's a name conflict + /// while applying a module? + } + }); + } + + template + static void apply_globals(InItr begin, InItr end, T &t) { + while (begin != end) { + t.add_global_const(begin->first, begin->second); + ++begin; + } + } + + template + static void apply_single(InItr begin, InItr end, T &t) { + while (begin != end) { + t.add(*begin); + ++begin; + } + } + + template + static void apply_eval(InItr begin, InItr end, T &t) { + while (begin != end) { + t.eval(*begin); + ++begin; + } + } +}; + +/// Convenience typedef for Module objects to be added to the ChaiScript runtime +using ModulePtr = std::shared_ptr; + +namespace detail { +/// A Proxy_Function implementation that is able to take +/// a vector of Proxy_Functions and perform a dispatch on them. It is +/// used specifically in the case of dealing with Function object variables +class Dispatch_Function final : public dispatch::Proxy_Function_Base { +public: + explicit Dispatch_Function(std::vector t_funcs) + : Proxy_Function_Base(build_type_infos(t_funcs), + calculate_arity(t_funcs)), + m_funcs(std::move(t_funcs)) {} + + bool operator==( + const dispatch::Proxy_Function_Base &rhs) const noexcept override { + try { + const auto &dispatch_fun = + dynamic_cast(rhs); + return m_funcs == dispatch_fun.m_funcs; + } catch (const std::bad_cast &) { + return false; + } + } + + std::vector get_contained_functions() const override { + return std::vector(m_funcs.begin(), + m_funcs.end()); + } + + static int calculate_arity( + const std::vector &t_funcs) noexcept { + if (t_funcs.empty()) { + return -1; + } + + const auto arity = t_funcs.front()->get_arity(); + + for (const auto &func : t_funcs) { + if (arity != func->get_arity()) { + // The arities in the list do not match, so it's unspecified + return -1; + } + } + + return arity; + } + + bool call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept override { + return std::any_of(std::begin(m_funcs), std::end(m_funcs), + [&vals, &t_conversions](const Proxy_Function &f) { + return f->call_match(vals, t_conversions); + }); + } + +protected: + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override { + return dispatch::dispatch(m_funcs, params, t_conversions); + } + +private: + std::vector m_funcs; + + static std::vector build_type_infos( + const std::vector &t_funcs) { + auto begin = t_funcs.cbegin(); + const auto &end = t_funcs.cend(); + + if (begin != end) { + std::vector type_infos = (*begin)->get_param_types(); + + ++begin; + + bool size_mismatch = false; + + while (begin != end) { + std::vector param_types = + (*begin)->get_param_types(); + + if (param_types.size() != type_infos.size()) { + size_mismatch = true; + } + + for (size_t i = 0; + i < type_infos.size() && i < param_types.size(); ++i) { + if (!(type_infos[i] == param_types[i])) { + type_infos[i] = + detail::Get_Type_Info::get(); + } + } + + ++begin; + } + + assert(!type_infos.empty() && + " type_info vector size is < 0, this is only possible if " + "something else is broken"); + + if (size_mismatch) { + type_infos.resize(1); + } + + return type_infos; + } + + return std::vector(); + } +}; +} // namespace detail + +namespace detail { +struct Stack_Holder { + // template + // using SmallVector = std::vector>; + + template + using SmallVector = std::vector; + + using Scope = utility::QuickFlatMap; + using StackData = SmallVector; + using Stacks = SmallVector; + using Call_Param_List = SmallVector; + using Call_Params = SmallVector; + + Stack_Holder() { + push_stack(); + push_call_params(); + } + + void push_stack_data() { + stacks.back().emplace_back(); + // stacks.back().emplace_back(Scope(scope_allocator)); + } + + void push_stack() { stacks.emplace_back(1); } + + void push_call_params() { call_params.emplace_back(); } + + Stacks stacks; + Call_Params call_params; + + int call_depth = 0; +}; + +/// Main class for the dispatchkit. Handles management +/// of the object stack, functions and registered types. +class Dispatch_Engine { +public: + using Type_Name_Map = + std::map; + using Scope = utility::QuickFlatMap; + using StackData = Stack_Holder::StackData; + + struct State { + utility::QuickFlatMap>, + str_equal> + m_functions; + utility::QuickFlatMap + m_function_objects; + utility::QuickFlatMap + m_boxed_functions; + std::map m_global_objects; + Type_Name_Map m_types; + }; + + explicit Dispatch_Engine(Carbon::parser::ChaiScript_Parser_Base &parser) + : m_stack_holder(), m_parser(parser) {} + + /// \brief casts an object while applying any Dynamic_Conversion available + template + decltype(auto) boxed_cast(const Boxed_Value &bv) const { + Type_Conversions_State state(m_conversions, + m_conversions.conversion_saves()); + return (Carbon::boxed_cast(bv, &state)); + } + + /// Add a new conversion for upcasting to a base class + void add(const Type_Conversion &d) { m_conversions.add_conversion(d); } + + /// Add a new named Proxy_Function to the system + void add(const Proxy_Function &f, const std::string &name) { + add_function(f, name); + } + + /// Set the value of an object, by name. If the object + /// is not available in the current scope it is created + void add(Boxed_Value obj, const std::string &name) { + auto &stack = get_stack_data(); + + for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); + ++stack_elem) { + if (auto itr = stack_elem->find(name); itr != stack_elem->end()) { + itr->second = std::move(obj); + return; + } + } + + add_object(name, std::move(obj)); + } + + /// Adds a named object to the current scope + /// \warning This version does not check the validity of the name + /// it is meant for internal use only + Boxed_Value &add_get_object(std::string t_name, Boxed_Value obj, + Stack_Holder &t_holder) { + auto &stack_elem = get_stack_data(t_holder).back(); + + if (auto result = + stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); + result.second) { + return result.first->second; + } else { + // insert failed + throw Carbon::exception::name_conflict_error( + result.first->first); + } + } + + /// Adds a named object to the current scope + /// \warning This version does not check the validity of the name + /// it is meant for internal use only + void add_object(std::string t_name, Boxed_Value obj, + Stack_Holder &t_holder) { + auto &stack_elem = get_stack_data(t_holder).back(); + + if (auto result = + stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); + !result.second) { + // insert failed + throw Carbon::exception::name_conflict_error( + result.first->first); + } + } + + /// Adds a named object to the current scope + /// \warning This version does not check the validity of the name + /// it is meant for internal use only + void add_object(const std::string &name, Boxed_Value obj) { + add_object(name, std::move(obj), get_stack_holder()); + } + + /// Adds a new global shared object, between all the threads + void add_global_const(const Boxed_Value &obj, const std::string &name) { + if (!obj.is_const()) { + throw Carbon::exception::global_non_const(); + } + + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + if (m_state.m_global_objects.find(name) != + m_state.m_global_objects.end()) { + throw Carbon::exception::name_conflict_error(name); + } else { + m_state.m_global_objects.insert(std::make_pair(name, obj)); + } + } + + /// Adds a new global (non-const) shared object, between all the threads + Boxed_Value add_global_no_throw(Boxed_Value obj, std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return m_state.m_global_objects + .insert(std::pair{std::move(name), std::move(obj)}) + .first->second; + } + + /// Adds a new global (non-const) shared object, between all the threads + void add_global(Boxed_Value obj, std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + if (auto result = m_state.m_global_objects.insert( + std::pair{std::move(name), std::move(obj)}); + !result.second) { + // insert failed + throw Carbon::exception::name_conflict_error( + result.first->first); + } + } + + /// Updates an existing global shared object or adds a new global shared + /// object if not found + void set_global(Boxed_Value obj, std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + m_state.m_global_objects.insert_or_assign(std::move(name), + std::move(obj)); + } + + /// Adds a new scope to the stack + void new_scope() { new_scope(*m_stack_holder); } + + /// Pops the current scope from the stack + void pop_scope() { pop_scope(*m_stack_holder); } + + /// Adds a new scope to the stack + static void new_scope(Stack_Holder &t_holder) { + t_holder.push_stack_data(); + t_holder.push_call_params(); + } + + /// Pops the current scope from the stack + static void pop_scope(Stack_Holder &t_holder) { + t_holder.call_params.pop_back(); + StackData &stack = get_stack_data(t_holder); + + assert(!stack.empty()); + + stack.pop_back(); + } + + /// Pushes a new stack on to the list of stacks + static void new_stack(Stack_Holder &t_holder) { + // add a new Stack with 1 element + t_holder.push_stack(); + } + + static void pop_stack(Stack_Holder &t_holder) { + t_holder.stacks.pop_back(); + } + + /// Searches the current stack for an object of the given name + /// includes a special overload for the _ place holder object to + /// ensure that it is always in scope. + Boxed_Value get_object(std::string_view name, + std::atomic_uint_fast32_t &t_loc, + Stack_Holder &t_holder) const { + enum class Loc : uint_fast32_t { + located = 0x80000000, + is_local = 0x40000000, + stack_mask = 0x0FFF0000, + loc_mask = 0x0000FFFF + }; + + uint_fast32_t loc = t_loc; + + if (loc == 0) { + auto &stack = get_stack_data(t_holder); + + // Is it in the stack? + for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); + ++stack_elem) { + for (auto s = stack_elem->begin(); s != stack_elem->end(); + ++s) { + if (s->first == name) { + t_loc = static_cast( + std::distance(stack.rbegin(), stack_elem) + << 16) | + static_cast( + std::distance(stack_elem->begin(), s)) | + static_cast(Loc::located) | + static_cast(Loc::is_local); + return s->second; + } + } + } + + t_loc = static_cast(Loc::located); + } else if ((loc & static_cast(Loc::is_local)) != 0u) { + auto &stack = get_stack_data(t_holder); + + return stack[stack.size() - 1 - + ((loc & static_cast(Loc::stack_mask)) >> + 16)] + .at_index(loc & static_cast(Loc::loc_mask)); + } + + // Is the value we are looking for a global or function? + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto itr = m_state.m_global_objects.find(name); + if (itr != m_state.m_global_objects.end()) { + return itr->second; + } + + // no? is it a function object? + auto obj = get_function_object_int(name, loc); + if (obj.first != loc) { + t_loc = uint_fast32_t(obj.first); + } + + return obj.second; + } + + /// Registers a new named type + void add(const Type_Info &ti, const std::string &name) { + add_global_const(const_var(ti), name + "_type"); + + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + m_state.m_types.insert(std::make_pair(name, ti)); + } + + /// Returns the type info for a named type + Type_Info get_type(std::string_view name, bool t_throw = true) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto itr = m_state.m_types.find(name); + + if (itr != m_state.m_types.end()) { + return itr->second; + } + + if (t_throw) { + throw std::range_error("Type Not Known: " + std::string(name)); + } else { + return Type_Info(); + } + } + + /// Returns the registered name of a known type_info object + /// compares the "bare_type_info" for the broadest possible + /// match + std::string get_type_name(const Type_Info &ti) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + for (const auto &elem : m_state.m_types) { + if (elem.second.bare_equal(ti)) { + return elem.first; + } + } + + return ti.bare_name(); + } + + /// Return all registered types + std::vector> get_types() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return std::vector>( + m_state.m_types.begin(), m_state.m_types.end()); + } + + std::shared_ptr> get_method_missing_functions() + const { + uint_fast32_t method_missing_loc = m_method_missing_loc; + auto method_missing_funs = + get_function("method_missing", method_missing_loc); + if (method_missing_funs.first != method_missing_loc) { + m_method_missing_loc = uint_fast32_t(method_missing_funs.first); + } + + return std::move(method_missing_funs.second); + } + + /// Return a function by name + std::pair>> + get_function(std::string_view t_name, const size_t t_hint) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto &funs = get_functions_int(); + + if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { + return std::make_pair(std::distance(funs.begin(), itr), + itr->second); + } else { + return std::make_pair( + size_t(0), std::make_shared>()); + } + } + + /// \returns a function object (Boxed_Value wrapper) if it exists + /// \throws std::range_error if it does not + Boxed_Value get_function_object(const std::string &t_name) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return get_function_object_int(t_name, 0).second; + } + + /// \returns a function object (Boxed_Value wrapper) if it exists + /// \throws std::range_error if it does not + /// \warn does not obtain a mutex lock. \sa get_function_object for public + /// version + std::pair get_function_object_int( + std::string_view t_name, const size_t t_hint) const { + const auto &funs = get_boxed_functions_int(); + + if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { + return std::make_pair(std::distance(funs.begin(), itr), + itr->second); + } else { + throw std::range_error("Object not found: " + std::string(t_name)); + } + } + + /// Return true if a function exists + bool function_exists(std::string_view name) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return get_functions_int().count(name) > 0; + } + + /// \returns All values in the local thread state in the parent scope, or if + /// it doesn't exist, + /// the current scope. + std::map get_parent_locals() const { + auto &stack = get_stack_data(); + if (stack.size() > 1) { + return std::map(stack[1].begin(), + stack[1].end()); + } else { + return std::map(stack[0].begin(), + stack[0].end()); + } + } + + /// \returns All values in the local thread state, added through the add() + /// function + std::map get_locals() const { + auto &stack = get_stack_data(); + auto &scope = stack.front(); + return std::map(scope.begin(), scope.end()); + } + + /// \brief Sets all of the locals for the current thread state. + /// + /// \param[in] t_locals The map set of variables to replace the + /// current state with + /// + /// Any existing locals are removed and the given set of variables is added + void set_locals(const std::map &t_locals) { + auto &stack = get_stack_data(); + auto &scope = stack.front(); + scope.assign(t_locals.begin(), t_locals.end()); + } + + /// + /// Get a map of all objects that can be seen from the current scope in a + /// scripting context + /// + std::map get_scripting_objects() const { + const Stack_Holder &s = *m_stack_holder; + + // We don't want the current context, but one up if it exists + const StackData &stack = (s.stacks.size() == 1) + ? (s.stacks.back()) + : (s.stacks[s.stacks.size() - 2]); + + std::map retval; + + // note: map insert doesn't overwrite existing values, which is why this + // works + for (auto itr = stack.rbegin(); itr != stack.rend(); ++itr) { + retval.insert(itr->begin(), itr->end()); + } + + // add the global values + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + retval.insert(m_state.m_global_objects.begin(), + m_state.m_global_objects.end()); + + return retval; + } + + /// + /// Get a map of all functions that can be seen from a scripting context + /// + std::map get_function_objects() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto &funs = get_function_objects_int(); + + std::map objs; + + for (const auto &fun : funs) { + objs.insert(std::make_pair(fun.first, const_var(fun.second))); + } + + return objs; + } + + /// Get a vector of all registered functions + std::vector> get_functions() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + std::vector> rets; + + const auto &functions = get_functions_int(); + + for (const auto &function : functions) { + for (const auto &internal_func : *function.second) { + rets.emplace_back(function.first, internal_func); + } + } + + return rets; + } + + const Type_Conversions &conversions() const noexcept { + return m_conversions; + } + + static bool is_attribute_call( + const std::vector &t_funs, + const Function_Params &t_params, bool t_has_params, + const Type_Conversions_State &t_conversions) noexcept { + if (!t_has_params || t_params.empty()) { + return false; + } + + return std::any_of( + std::begin(t_funs), std::end(t_funs), [&](const auto &fun) { + return fun->is_attribute_function() && + fun->compare_first_type(t_params[0], t_conversions); + }); + } + +#ifdef CARBON_MSVC +// MSVC is unable to recognize that "rethrow_exception" causes the function to +// return so we must disable it here. +#pragma warning(push) +#pragma warning(disable : 4715) +#endif + Boxed_Value call_member(const std::string &t_name, + std::atomic_uint_fast32_t &t_loc, + const Function_Params ¶ms, bool t_has_params, + const Type_Conversions_State &t_conversions) { + uint_fast32_t loc = t_loc; + const auto funs = get_function(t_name, loc); + if (funs.first != loc) { + t_loc = uint_fast32_t(funs.first); + } + + const auto do_attribute_call = + [this](int l_num_params, Function_Params l_params, + const std::vector &l_funs, + const Type_Conversions_State &l_conversions) -> Boxed_Value { + Function_Params attr_params(l_params.begin(), + l_params.begin() + l_num_params); + Boxed_Value bv = + dispatch::dispatch(l_funs, attr_params, l_conversions); + if (l_num_params < int(l_params.size()) || + bv.get_type_info().bare_equal( + user_type())) { + struct This_Foist { + This_Foist(Dispatch_Engine &e, const Boxed_Value &t_bv) + : m_e(e) { + m_e.get().new_scope(); + m_e.get().add_object("__this", t_bv); + } + + ~This_Foist() { m_e.get().pop_scope(); } + + std::reference_wrapper m_e; + }; + + This_Foist fi(*this, l_params.front()); + + try { + auto func = + boxed_cast(bv); + try { + return (*func)( + {l_params.begin() + l_num_params, l_params.end()}, + l_conversions); + } catch (const Carbon::exception::bad_boxed_cast &) { + } catch (const Carbon::exception::arity_error &) { + } catch (const Carbon::exception::guard_error &) { + } + throw Carbon::exception::dispatch_error( + {l_params.begin() + l_num_params, l_params.end()}, + std::vector{ + boxed_cast(bv)}); + } catch (const Carbon::exception::bad_boxed_cast &) { + // unable to convert bv into a Proxy_Function_Base + throw Carbon::exception::dispatch_error( + {l_params.begin() + l_num_params, l_params.end()}, + std::vector(l_funs.begin(), + l_funs.end())); + } + } else { + return bv; + } + }; + + if (is_attribute_call(*funs.second, params, t_has_params, + t_conversions)) { + return do_attribute_call(1, params, *funs.second, t_conversions); + } else { + std::exception_ptr except; + + if (!funs.second->empty()) { + try { + return dispatch::dispatch(*funs.second, params, + t_conversions); + } catch (Carbon::exception::dispatch_error &) { + except = std::current_exception(); + } + } + + // If we get here we know that either there was no method with that + // name, or there was no matching method + + const auto functions = [&]() -> std::vector { + std::vector fs; + + const auto method_missing_funs = get_method_missing_functions(); + + for (const auto &f : *method_missing_funs) { + if (f->compare_first_type(params[0], t_conversions)) { + fs.push_back(f); + } + } + + return fs; + }(); + + const bool is_no_param = [&]() -> bool { + for (const auto &f : functions) { + if (f->get_arity() != 2) { + return false; + } + } + return true; + }(); + + if (!functions.empty()) { + try { + if (is_no_param) { + auto tmp_params = params.to_vector(); + tmp_params.insert(tmp_params.begin() + 1, var(t_name)); + return do_attribute_call(2, Function_Params(tmp_params), + functions, t_conversions); + } else { + std::array p{ + params[0], var(t_name), + var(std::vector(params.begin() + 1, + params.end()))}; + return dispatch::dispatch(functions, Function_Params{p}, + t_conversions); + } + } catch (const dispatch::option_explicit_set &e) { + throw Carbon::exception::dispatch_error( + params, + std::vector(funs.second->begin(), + funs.second->end()), + e.what()); + } + } + + // If we get all the way down here we know there was no + // "method_missing" method at all. + if (except) { + std::rethrow_exception(except); + } else { + throw Carbon::exception::dispatch_error( + params, std::vector( + funs.second->begin(), funs.second->end())); + } + } + } +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + + Boxed_Value call_function( + std::string_view t_name, std::atomic_uint_fast32_t &t_loc, + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + uint_fast32_t loc = t_loc; + const auto [func_loc, func] = get_function(t_name, loc); + if (func_loc != loc) { + t_loc = uint_fast32_t(func_loc); + } + return dispatch::dispatch(*func, params, t_conversions); + } + + /// Dump object info to stdout + void dump_object(const Boxed_Value &o) const { + std::cout << (o.is_const() ? "const " : "") << type_name(o) << '\n'; + } + + /// Dump type info to stdout + void dump_type(const Type_Info &type) const { + std::cout << (type.is_const() ? "const " : "") << get_type_name(type); + } + + /// Dump function to stdout + void dump_function( + const std::pair &f) const { + const auto params = f.second->get_param_types(); + + dump_type(params.front()); + std::cout << " " << f.first << "("; + + for (auto itr = params.begin() + 1; itr != params.end();) { + dump_type(*itr); + ++itr; + + if (itr != params.end()) { + std::cout << ", "; + } + } + + std::cout << ") \n"; + } + + /// Returns true if a call can be made that consists of the first parameter + /// (the function) with the remaining parameters as its arguments. + Boxed_Value call_exists(const Function_Params ¶ms) const { + if (params.empty()) { + throw Carbon::exception::arity_error( + static_cast(params.size()), 1); + } + + const auto &f = this->boxed_cast(params[0]); + const Type_Conversions_State convs(m_conversions, + m_conversions.conversion_saves()); + + return const_var(f->call_match( + Function_Params(params.begin() + 1, params.end()), convs)); + } + + /// Dump all system info to stdout + void dump_system() const { + std::cout << "Registered Types: \n"; + for (const auto &[type_name, type] : get_types()) { + std::cout << type_name << ": " << type.bare_name() << '\n'; + } + + std::cout << '\n'; + + std::cout << "Functions: \n"; + for (const auto &func : get_functions()) { + dump_function(func); + } + std::cout << '\n'; + } + + /// return true if the Boxed_Value matches the registered type by name + bool is_type(const Boxed_Value &r, + std::string_view user_typename) const noexcept { + try { + if (get_type(user_typename).bare_equal(r.get_type_info())) { + return true; + } + } catch (const std::range_error &) { + } + + try { + const dispatch::Dynamic_Object &d = + boxed_cast(r); + return d.get_type_name() == user_typename; + } catch (const std::bad_cast &) { + } + + return false; + } + + std::string type_name(const Boxed_Value &obj) const { + return get_type_name(obj.get_type_info()); + } + + State get_state() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return m_state; + } + + void set_state(const State &t_state) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + m_state = t_state; + } + + static void save_function_params(Stack_Holder &t_s, + std::vector &&t_params) { + for (auto &¶m : t_params) { + t_s.call_params.back().insert(t_s.call_params.back().begin(), + std::move(param)); + } + } + + static void save_function_params(Stack_Holder &t_s, + const Function_Params &t_params) { + t_s.call_params.back().insert(t_s.call_params.back().begin(), + t_params.begin(), t_params.end()); + } + + void save_function_params(std::vector &&t_params) { + save_function_params(*m_stack_holder, std::move(t_params)); + } + + void save_function_params(const Function_Params &t_params) { + save_function_params(*m_stack_holder, t_params); + } + + void new_function_call(Stack_Holder &t_s, + Type_Conversions::Conversion_Saves &t_saves) { + if (t_s.call_depth == 0) { + m_conversions.enable_conversion_saves(t_saves, true); + } + + ++t_s.call_depth; + + save_function_params(m_conversions.take_saves(t_saves)); + } + + void pop_function_call(Stack_Holder &t_s, + Type_Conversions::Conversion_Saves &t_saves) { + --t_s.call_depth; + + assert(t_s.call_depth >= 0); + + if (t_s.call_depth == 0) { + t_s.call_params.back().clear(); + m_conversions.enable_conversion_saves(t_saves, false); + } + } + + void new_function_call() { + new_function_call(*m_stack_holder, m_conversions.conversion_saves()); + } + + void pop_function_call() { + pop_function_call(*m_stack_holder, m_conversions.conversion_saves()); + } + + Stack_Holder &get_stack_holder() noexcept { return *m_stack_holder; } + + /// Returns the current stack + /// make const/non const versions + const StackData &get_stack_data() const noexcept { + return m_stack_holder->stacks.back(); + } + + static StackData &get_stack_data(Stack_Holder &t_holder) noexcept { + return t_holder.stacks.back(); + } + + StackData &get_stack_data() noexcept { + return m_stack_holder->stacks.back(); + } + + parser::ChaiScript_Parser_Base &get_parser() noexcept { + return m_parser.get(); + } + +private: + const decltype(State::m_boxed_functions) &get_boxed_functions_int() + const noexcept { + return m_state.m_boxed_functions; + } + + decltype(State::m_boxed_functions) &get_boxed_functions_int() noexcept { + return m_state.m_boxed_functions; + } + + const decltype(State::m_function_objects) &get_function_objects_int() + const noexcept { + return m_state.m_function_objects; + } + + decltype(State::m_function_objects) &get_function_objects_int() noexcept { + return m_state.m_function_objects; + } + + const decltype(State::m_functions) &get_functions_int() const noexcept { + return m_state.m_functions; + } + + decltype(State::m_functions) &get_functions_int() noexcept { + return m_state.m_functions; + } + + static bool function_less_than(const Proxy_Function &lhs, + const Proxy_Function &rhs) noexcept { + auto dynamic_lhs( + std::dynamic_pointer_cast( + lhs)); + auto dynamic_rhs( + std::dynamic_pointer_cast( + rhs)); + + if (dynamic_lhs && dynamic_rhs) { + if (dynamic_lhs->get_guard()) { + return dynamic_rhs->get_guard() ? false : true; + } else { + return false; + } + } + + if (dynamic_lhs && !dynamic_rhs) { + return false; + } + + if (!dynamic_lhs && dynamic_rhs) { + return true; + } + + const auto &lhsparamtypes = lhs->get_param_types(); + const auto &rhsparamtypes = rhs->get_param_types(); + + const auto lhssize = lhsparamtypes.size(); + const auto rhssize = rhsparamtypes.size(); + + const auto boxed_type = user_type(); + const auto boxed_pod_type = user_type(); + + for (size_t i = 1; i < lhssize && i < rhssize; ++i) { + const Type_Info < = lhsparamtypes[i]; + const Type_Info &rt = rhsparamtypes[i]; + + if (lt.bare_equal(rt) && lt.is_const() == rt.is_const()) { + continue; // The first two types are essentially the same, next + // iteration + } + + // const is after non-const for the same type + if (lt.bare_equal(rt) && lt.is_const() && !rt.is_const()) { + return false; + } + + if (lt.bare_equal(rt) && !lt.is_const()) { + return true; + } + + // boxed_values are sorted last + if (lt.bare_equal(boxed_type)) { + return false; + } + + if (rt.bare_equal(boxed_type)) { + return true; + } + + if (lt.bare_equal(boxed_pod_type)) { + return false; + } + + if (rt.bare_equal(boxed_pod_type)) { + return true; + } + + // otherwise, we want to sort by typeid + return lt < rt; + } + + return false; + } + + /// Implementation detail for adding a function. + /// \throws exception::name_conflict_error if there's a function matching + /// the given one being added + void add_function(const Proxy_Function &t_f, const std::string &t_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + Proxy_Function new_func = [&]() -> Proxy_Function { + auto &funcs = get_functions_int(); + auto itr = funcs.find(t_name); + + if (itr != funcs.end()) { + auto vec = *itr->second; + for (const auto &func : vec) { + if ((*t_f) == *(func)) { + throw Carbon::exception::name_conflict_error( + t_name); + } + } + + vec.reserve(vec.size() + 1); // tightly control vec growth + vec.push_back(t_f); + std::stable_sort(vec.begin(), vec.end(), &function_less_than); + itr->second = + std::make_shared>(vec); + return std::make_shared(std::move(vec)); + } else if (t_f->has_arithmetic_param()) { + // if the function is the only function but it also contains + // arithmetic operators, we must wrap it in a dispatch function + // to allow for automatic arithmetic type conversions + std::vector vec; + vec.push_back(t_f); + funcs.insert(std::pair{ + t_name, + std::make_shared>(vec)}); + return std::make_shared(std::move(vec)); + } else { + auto vec = std::make_shared>(); + vec->push_back(t_f); + funcs.insert(std::pair{t_name, vec}); + return t_f; + } + }(); + + get_boxed_functions_int().insert_or_assign(t_name, const_var(new_func)); + get_function_objects_int().insert_or_assign(t_name, + std::move(new_func)); + } + + mutable Carbon::detail::threading::shared_mutex m_mutex; + + Type_Conversions m_conversions; + Carbon::detail::threading::Thread_Storage m_stack_holder; + std::reference_wrapper m_parser; + + mutable std::atomic_uint_fast32_t m_method_missing_loc = {0}; + + State m_state; +}; + +class Dispatch_State { +public: + explicit Dispatch_State(Dispatch_Engine &t_engine) + : m_engine(t_engine), + m_stack_holder(t_engine.get_stack_holder()), + m_conversions(t_engine.conversions(), + t_engine.conversions().conversion_saves()) {} + + Dispatch_Engine *operator->() const noexcept { return &m_engine.get(); } + + Dispatch_Engine &operator*() const noexcept { return m_engine.get(); } + + Stack_Holder &stack_holder() const noexcept { return m_stack_holder.get(); } + + const Type_Conversions_State &conversions() const noexcept { + return m_conversions; + } + + Type_Conversions::Conversion_Saves &conversion_saves() const noexcept { + return m_conversions.saves(); + } + + Boxed_Value &add_get_object(const std::string &t_name, + Boxed_Value obj) const { + return m_engine.get().add_get_object(t_name, std::move(obj), + m_stack_holder.get()); + } + + void add_object(const std::string &t_name, Boxed_Value obj) const { + m_engine.get().add_object(t_name, std::move(obj), m_stack_holder.get()); + } + + Boxed_Value get_object(std::string_view t_name, + std::atomic_uint_fast32_t &t_loc) const { + return m_engine.get().get_object(t_name, t_loc, m_stack_holder.get()); + } + +private: + std::reference_wrapper m_engine; + std::reference_wrapper m_stack_holder; + Type_Conversions_State m_conversions; +}; +} // namespace detail +} // namespace Carbon + +#endif diff --git a/src/carbon/command/dynamic_object.cpp b/src/carbon/command/dynamic_object.cpp new file mode 100644 index 00000000..33023ee6 --- /dev/null +++ b/src/carbon/command/dynamic_object.cpp @@ -0,0 +1,68 @@ +#include "dynamic_object.hpp" + +namespace Carbon { +namespace dispatch { + +Dynamic_Object::Dynamic_Object(std::string t_type_name) + : m_type_name(std::move(t_type_name)), m_option_explicit(false) {} + +bool Dynamic_Object::is_explicit() const { return m_option_explicit; } + +void Dynamic_Object::set_explicit(const bool t_explicit) { + m_option_explicit = t_explicit; +} + +const std::string &Dynamic_Object::get_type_name() const { return m_type_name; } + +const Boxed_Value &Dynamic_Object::operator[]( + const std::string &t_attr_name) const { + return get_attr(t_attr_name); +} + +Boxed_Value &Dynamic_Object::operator[](const std::string &t_attr_name) { + return get_attr(t_attr_name); +} + +const Boxed_Value &Dynamic_Object::get_attr( + const std::string &t_attr_name) const { + auto a = m_attrs.find(t_attr_name); + + if (a != m_attrs.end()) { + return a->second; + } else { + throw std::range_error("Attr not found '" + t_attr_name + + "' and cannot be added to const obj"); + } +} + +bool Dynamic_Object::has_attr(const std::string &t_attr_name) const { + return m_attrs.find(t_attr_name) != m_attrs.end(); +} + +Boxed_Value &Dynamic_Object::get_attr(const std::string &t_attr_name) { + return m_attrs[t_attr_name]; +} + +Boxed_Value &Dynamic_Object::method_missing(const std::string &t_method_name) { + if (m_option_explicit && m_attrs.find(t_method_name) == m_attrs.end()) { + throw option_explicit_set(t_method_name); + } + + return get_attr(t_method_name); +} + +const Boxed_Value &Dynamic_Object::method_missing( + const std::string &t_method_name) const { + if (m_option_explicit && m_attrs.find(t_method_name) == m_attrs.end()) { + throw option_explicit_set(t_method_name); + } + + return get_attr(t_method_name); +} + +std::map Dynamic_Object::get_attrs() const { + return m_attrs; +} + +} // namespace dispatch +} // namespace Carbon diff --git a/src/carbon/command/dynamic_object.hpp b/src/carbon/command/dynamic_object.hpp new file mode 100644 index 00000000..4bb7fbb8 --- /dev/null +++ b/src/carbon/command/dynamic_object.hpp @@ -0,0 +1,67 @@ + +#ifndef CARBON_DYNAMIC_OBJECT_HPP +#define CARBON_DYNAMIC_OBJECT_HPP + +#include +#include +#include + +#include "boxed_value.hpp" + +namespace Carbon { +class Type_Conversions; +namespace dispatch { +class Proxy_Function_Base; +} // namespace dispatch +} // namespace Carbon + +namespace Carbon { +namespace dispatch { +struct option_explicit_set : std::runtime_error { + explicit option_explicit_set(const std::string &t_param_name) + : std::runtime_error("option explicit set and parameter '" + + t_param_name + "' does not exist") {} + + option_explicit_set(const option_explicit_set &) = default; + + ~option_explicit_set() noexcept override = default; +}; + +class Dynamic_Object { +public: + explicit Dynamic_Object(std::string t_type_name); + + Dynamic_Object() = default; + + bool is_explicit() const noexcept; + + void set_explicit(const bool t_explicit) noexcept; + + const std::string &get_type_name() const noexcept; + + const Boxed_Value &operator[](const std::string &t_attr_name) const; + + Boxed_Value &operator[](const std::string &t_attr_name); + + const Boxed_Value &get_attr(const std::string &t_attr_name) const; + + bool has_attr(const std::string &t_attr_name) const; + + Boxed_Value &get_attr(const std::string &t_attr_name); + + Boxed_Value &method_missing(const std::string &t_method_name); + + const Boxed_Value &method_missing(const std::string &t_method_name) const; + + std::map get_attrs(); + +private: + const std::string m_type_name = ""; + bool m_option_explicit = false; + + std::map m_attrs; +}; + +} // namespace dispatch +} // namespace Carbon +#endif diff --git a/src/carbon/command/dynamic_object_detail.cpp b/src/carbon/command/dynamic_object_detail.cpp new file mode 100644 index 00000000..79d9af73 --- /dev/null +++ b/src/carbon/command/dynamic_object_detail.cpp @@ -0,0 +1,176 @@ +#include "dynamic_object_detail.hpp" + +namespace Carbon { +namespace dispatch { +namespace detail { +Dynamic_Object_Function::Dynamic_Object_Function(std::string t_type_name, + const Proxy_Function &t_func, + bool t_is_attribute = false) + : Proxy_Function_Base(t_func->get_param_types(), t_func->get_arity()), + m_type_name(std::move(t_type_name)), + m_func(t_func), + m_doti(user_type()), + m_is_attribute(t_is_attribute) { + assert((t_func->get_arity() > 0 || t_func->get_arity() < 0) && + "Programming error, Dynamic_Object_Function must have at least " + "one parameter (this)"); +} + +Dynamic_Object_Function::Dynamic_Object_Function(std::string t_type_name, + const Proxy_Function &t_func, + const Type_Info &t_ti, + bool t_is_attribute = false) + : Proxy_Function_Base(build_param_types(t_func->get_param_types(), t_ti), + t_func->get_arity()), + m_type_name(std::move(t_type_name)), + m_func(t_func), + m_ti(t_ti.is_undef() ? nullptr : new Type_Info(t_ti)), + m_doti(user_type()), + m_is_attribute(t_is_attribute) { + assert((t_func->get_arity() > 0 || t_func->get_arity() < 0) && + "Programming error, Dynamic_Object_Function must have at least " + "one parameter (this)"); +} + +Dynamic_Object_Function &Dynamic_Object_Function::operator=( + const Dynamic_Object_Function) = delete; + +bool Dynamic_Object_Function::operator==(const Proxy_Function_Base &f) const { + if (const auto *df = dynamic_cast(&f)) { + return df->m_type_name == m_type_name && (*df->m_func) == (*m_func); + } else { + return false; + } +} + +bool Dynamic_Object_Function::is_attribute_function() const { + return m_is_attribute; +} + +bool Dynamic_Object_Function::call_match( + const Carbon::Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + if (dynamic_object_typename_match(vals, m_type_name, m_ti, t_conversions)) { + return m_func->call_match(vals, t_conversions); + } else { + return false; + } +} + +std::vector +Dynamic_Object_Function::get_contained_functions() const { + return {m_func}; +} + +Boxed_Value do_call(const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + if (dynamic_object_typename_match(params, m_type_name, m_ti, + t_conversions)) { + return (*m_func)(params, t_conversions); + } else { + throw exception::guard_error(); + } +} + +bool Dynamic_Object_Function::compare_first_type( + const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const { + return dynamic_object_typename_match(bv, m_type_name, m_ti, t_conversions); +} + +std::vector Dynamic_Object_Function::build_param_types( + const std::vector &t_inner_types, const Type_Info &t_objectti) { + std::vector types(t_inner_types); + + assert(types.size() > 1); + // assert(types[1].bare_equal(user_type())); + types[1] = t_objectti; + return types; +} + +bool Dynamic_Object_Function::dynamic_object_typename_match( + const Boxed_Value &bv, const std::string &name, + const std::unique_ptr &ti, + const Type_Conversions_State &t_conversions) const { + if (bv.get_type_info().bare_equal(m_doti)) { + try { + const Dynamic_Object &d = + boxed_cast(bv, &t_conversions); + return name == "Dynamic_Object" || d.get_type_name() == name; + } catch (const std::bad_cast &) { + return false; + } + } else { + if (ti) { + return bv.get_type_info().bare_equal(*ti); + } else { + return false; + } + } +} + +bool Dynamic_Object_Function::dynamic_object_typename_match( + const Carbon::Function_Params &bvs, const std::string &name, + const std::unique_ptr &ti, + const Type_Conversions_State &t_conversions) const { + if (!bvs.empty()) { + return dynamic_object_typename_match(bvs[0], name, ti, t_conversions); + } else { + return false; + } +} + +Dynamic_Object_Constructor::Dynamic_Object_Constructor( + std::string t_type_name, const Proxy_Function &t_func) + : Proxy_Function_Base(build_type_list(t_func->get_param_types()), + t_func->get_arity() - 1), + m_type_name(std::move(t_type_name)), + m_func(t_func) { + assert((t_func->get_arity() > 0 || t_func->get_arity() < 0) && + "Programming error, Dynamic_Object_Function must have at least " + "one parameter (this)"); +} + +std::vector Dynamic_Object_Constructor::build_type_list( + const std::vector &tl) { + auto begin = tl.begin(); + auto end = tl.end(); + + if (begin != end) { + ++begin; + } + + return std::vector(begin, end); +} + +bool Dynamic_Object_Constructor::operator==( + const Proxy_Function_Base &f) const { + const Dynamic_Object_Constructor *dc = + dynamic_cast(&f); + return (dc != nullptr) && dc->m_type_name == m_type_name && + (*dc->m_func) == (*m_func); +} + +bool Dynamic_Object_Constructor::call_match( + const Carbon::Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + std::vector new_vals{Boxed_Value(Dynamic_Object(m_type_name))}; + new_vals.insert(new_vals.end(), vals.begin(), vals.end()); + + return m_func->call_match(Carbon::Function_Params{new_vals}, t_conversions); +} + +Boxed_Value Dynamic_Object_Constructor::do_call( + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + auto bv = Boxed_Value(Dynamic_Object(m_type_name), true); + std::vector new_params{bv}; + new_params.insert(new_params.end(), params.begin(), params.end()); + + (*m_func)(Carbon::Function_Params{new_params}, t_conversions); + + return bv; +} + +} // namespace detail +} // namespace dispatch +} // namespace Carbon diff --git a/src/carbon/command/dynamic_object_detail.hpp b/src/carbon/command/dynamic_object_detail.hpp new file mode 100644 index 00000000..8e7f4e90 --- /dev/null +++ b/src/carbon/command/dynamic_object_detail.hpp @@ -0,0 +1,124 @@ +// This file is distributed under the BSD License. +// See "license.txt" for details. +// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) +// Copyright 2009-2018, Jason Turner (jason@emptycrate.com) +// http://www.chaiscript.com + +#ifndef CARBON_DYNAMIC_OBJECT_DETAIL_HPP +#define CARBON_DYNAMIC_OBJECT_DETAIL_HPP + +#include +#include +#include +#include +#include +#include +#include + +#include "../defines.hpp" +#include "boxed_cast.hpp" +#include "boxed_cast_helper.hpp" +#include "boxed_value.hpp" +#include "dynamic_object.hpp" +#include "proxy_functions.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Conversions; +namespace dispatch { +class Proxy_Function_Base; +} // namespace dispatch +} // namespace Carbon + +namespace Carbon { +namespace dispatch { +namespace detail { +/// A Proxy_Function implementation designed for calling a function +/// that is automatically guarded based on the first param based on the +/// param's type name +class Dynamic_Object_Function final : public Proxy_Function_Base { +public: + Dynamic_Object_Function(std::string t_type_name, + const Proxy_Function &t_func, + bool t_is_attribute = false); + + Dynamic_Object_Function(std::string t_type_name, + const Proxy_Function &t_func, const Type_Info &t_ti, + bool t_is_attribute = false); + + Dynamic_Object_Function &operator=(const Dynamic_Object_Function) = delete; + Dynamic_Object_Function(Dynamic_Object_Function &) = delete; + + bool operator==(const Proxy_Function_Base &f) const noexcept override; + + bool is_attribute_function() const noexcept override; + + bool call_match( + const Carbon::Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept override; + + std::vector get_contained_functions() const override; + +protected: + Boxed_Value do_call( + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override; + + bool compare_first_type( + const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) const noexcept override; + +private: + static std::vector build_param_types( + const std::vector &t_inner_types, + const Type_Info &t_objectti); + + bool dynamic_object_typename_match( + const Boxed_Value &bv, const std::string &name, + const std::unique_ptr &ti, + const Type_Conversions_State &t_conversions) const noexcept; + + bool dynamic_object_typename_match( + const Carbon::Function_Params &bvs, const std::string &name, + const std::unique_ptr &ti, + const Type_Conversions_State &t_conversions) const noexcept; + + std::string m_type_name; + Proxy_Function m_func; + std::unique_ptr m_ti; + const Type_Info m_doti; + const bool m_is_attribute; +}; + +/** + * A Proxy_Function implementation designed for creating a new + * Dynamic_Object + * that is automatically guarded based on the first param based on the + * param's type name + */ +class Dynamic_Object_Constructor final : public Proxy_Function_Base { +public: + Dynamic_Object_Constructor(std::string t_type_name, + const Proxy_Function &t_func); + + static std::vector build_type_list( + const std::vector &tl); + + bool operator==(const Proxy_Function_Base &f) const noexcept override; + + bool call_match(const Carbon::Function_Params &vals, + const Type_Conversions_State &t_conversions) const override; + +protected: + Boxed_Value do_call( + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override; + +private: + const std::string m_type_name; + const Proxy_Function m_func; +}; +} // namespace detail +} // namespace dispatch +} // namespace Carbon +#endif diff --git a/src/carbon/command/exception_specification.hpp b/src/carbon/command/exception_specification.hpp new file mode 100644 index 00000000..6e308558 --- /dev/null +++ b/src/carbon/command/exception_specification.hpp @@ -0,0 +1,107 @@ + + +#ifndef CARBON_EXCEPTION_SPECIFICATION_HPP +#define CARBON_EXCEPTION_SPECIFICATION_HPP + +#include + +#include "../defines.hpp" +#include "boxed_cast.hpp" + +namespace Carbon { +namespace detail { +struct Exception_Handler_Base { + virtual void handle(const Boxed_Value &bv, + const Dispatch_Engine &t_engine) = 0; + + virtual ~Exception_Handler_Base() = default; + +protected: + template + static void throw_type(const Boxed_Value &bv, + const Dispatch_Engine &t_engine) { + try { + T t = t_engine.boxed_cast(bv); + throw t; + } catch (const Carbon::exception::bad_boxed_cast &) { + } + } +}; + +template +struct Exception_Handler_Impl : Exception_Handler_Base { + void handle(const Boxed_Value &bv, + const Dispatch_Engine &t_engine) override { + (throw_type(bv, t_engine), ...); + } +}; +} // namespace detail + +/// \brief Used in the automatic unboxing of exceptions thrown during script +/// evaluation +/// +/// Exception specifications allow the user to tell ChaiScript what possible +/// exceptions are expected from the script being executed. Exception_Handler +/// objects are created with the Carbon::exception_specification() function. +/// +/// Example: +/// \code +/// Carbon::ChaiScript chai; +/// +/// try { +/// chai.eval("throw(runtime_error(\"error\"))", +/// Carbon::exception_specification()); +/// } catch (const double e) { +/// } catch (int) { +/// } catch (float) { +/// } catch (const std::string &) { +/// } catch (const std::exception &e) { +/// // This is the one what will be called in the specific throw() above +/// } +/// \endcode +/// +/// It is recommended that if catching the generic \c std::exception& type that +/// you specifically catch the Carbon::exception::eval_error type, so that there +/// is no confusion. +/// +/// \code +/// try { +/// chai.eval("throw(runtime_error(\"error\"))", +/// Carbon::exception_specification()); +/// } catch (const Carbon::exception::eval_error &) { +/// // Error in script parsing / execution +/// } catch (const std::exception &e) { +/// // Error explicitly thrown from script +/// } +/// \endcode +/// +/// Similarly, if you are using the Carbon::eval form that unboxes the return +/// value, then Carbon::exception::bad_boxed_cast should be handled as well. +/// +/// \code +/// try { +/// chai.eval("1.0", Carbon::exception_specification()); +/// } catch (const Carbon::exception::eval_error &) { +/// // Error in script parsing / execution +/// } catch (const Carbon::exception::bad_boxed_cast &) { +/// // Error unboxing return value +/// } catch (const std::exception &e) { +/// // Error explicitly thrown from script +/// } +/// \endcode +/// +/// \sa Carbon::exception_specification for creation of +/// Carbon::Exception_Handler objects \sa \ref exceptions +using Exception_Handler = std::shared_ptr; + +/// \brief creates a Carbon::Exception_Handler which handles one type of +/// exception unboxing \sa \ref exceptions +template +Exception_Handler exception_specification() { + return std::make_shared>(); +} +} // namespace Carbon + +#endif diff --git a/src/carbon/command/function_call.hpp b/src/carbon/command/function_call.hpp new file mode 100644 index 00000000..fc9b3528 --- /dev/null +++ b/src/carbon/command/function_call.hpp @@ -0,0 +1,131 @@ + + +#ifndef CARBON_FUNCTION_CALL_HPP +#define CARBON_FUNCTION_CALL_HPP + +#include +#include +#include + +#include "boxed_cast.hpp" +#include "function_call_detail.hpp" +#include "proxy_functions.hpp" + +namespace Carbon { +class Boxed_Value; +class Type_Conversions_State; +namespace detail { +template +struct Cast_Helper; +} // namespace detail +} // namespace Carbon + +namespace Carbon { +namespace dispatch { +namespace detail { +template +constexpr auto arity(Ret (*)(Param...)) noexcept { + return sizeof...(Param); +} +} // namespace detail + +/// Build a function caller that knows how to dispatch on a set of functions +/// example: +/// std::function f = +/// build_function_caller(dispatchkit.get_function("print")); +/// \returns A std::function object for dispatching +/// \param[in] funcs the set of functions to dispatch on. +template +std::function functor( + const std::vector &funcs, + const Type_Conversions_State *t_conversions) { + const bool has_arity_match = std::any_of( + funcs.begin(), funcs.end(), [](const Const_Proxy_Function &f) { + return f->get_arity() == -1 || + size_t(f->get_arity()) == + detail::arity(static_cast(nullptr)); + }); + + if (!has_arity_match) { + throw exception::bad_boxed_cast(user_type(), + typeid(std::function)); + } + + FunctionType *p = nullptr; + return detail::build_function_caller_helper(p, funcs, t_conversions); +} + +/// Build a function caller for a particular Proxy_Function object +/// useful in the case that a function is being pass out from scripting back +/// into code +/// example: +/// void my_function(Proxy_Function f) +/// { +/// std::function local_f = +/// build_function_caller(f); +/// } +/// \returns A std::function object for dispatching +/// \param[in] func A function to execute. +template +std::function functor( + Const_Proxy_Function func, const Type_Conversions_State *t_conversions) { + return functor( + std::vector({std::move(func)}), t_conversions); +} + +/// Helper for automatically unboxing a Boxed_Value that contains a function +/// object and creating a typesafe C++ function caller from it. +template +std::function functor( + const Boxed_Value &bv, const Type_Conversions_State *t_conversions) { + return functor( + boxed_cast(bv, t_conversions), t_conversions); +} +} // namespace dispatch + +namespace detail { +/// Cast helper to handle automatic casting to const std::function & +template +struct Cast_Helper &> { + static std::function cast( + const Boxed_Value &ob, const Type_Conversions_State *t_conversions) { + if (ob.get_type_info().bare_equal(user_type())) { + return dispatch::functor(ob, t_conversions); + } else { + return Cast_Helper_Inner &>::cast( + ob, t_conversions); + } + } +}; + +/// Cast helper to handle automatic casting to std::function +template +struct Cast_Helper> { + static std::function cast( + const Boxed_Value &ob, const Type_Conversions_State *t_conversions) { + if (ob.get_type_info().bare_equal(user_type())) { + return dispatch::functor(ob, t_conversions); + } else { + return Cast_Helper_Inner>::cast( + ob, t_conversions); + } + } +}; + +/// Cast helper to handle automatic casting to const std::function +template +struct Cast_Helper> { + static std::function cast( + const Boxed_Value &ob, const Type_Conversions_State *t_conversions) { + if (ob.get_type_info().bare_equal(user_type())) { + return dispatch::functor(ob, t_conversions); + } else { + return Cast_Helper_Inner>::cast( + ob, t_conversions); + } + } +}; +} // namespace detail +} // namespace Carbon + +#endif diff --git a/src/carbon/command/function_call_detail.hpp b/src/carbon/command/function_call_detail.hpp new file mode 100644 index 00000000..ef8c4d08 --- /dev/null +++ b/src/carbon/command/function_call_detail.hpp @@ -0,0 +1,101 @@ + + +#ifndef CARBON_FUNCTION_CALL_DETAIL_HPP +#define CARBON_FUNCTION_CALL_DETAIL_HPP + +#include +#include +#include +#include +#include + +#include "boxed_cast.hpp" +#include "boxed_number.hpp" +#include "boxed_value.hpp" +#include "proxy_functions.hpp" +#include "type_conversions.hpp" + +namespace Carbon::dispatch::detail { +/// used internally for unwrapping a function call's types +template +struct Build_Function_Caller_Helper { + Build_Function_Caller_Helper(std::vector t_funcs, + const Type_Conversions *t_conversions) + : m_funcs(std::move(t_funcs)), m_conversions(t_conversions) {} + + Ret call(const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_state) { + if constexpr (std::is_arithmetic_v && + !std::is_same_v< + std::remove_cv_t>, + bool>) { + return Boxed_Number(dispatch::dispatch(m_funcs, params, t_state)) + .get_as(); + } else if constexpr (std::is_same_v) { + dispatch::dispatch(m_funcs, params, t_state); + } else { + return boxed_cast(dispatch::dispatch(m_funcs, params, t_state), + &t_state); + } + } + + template + Ret operator()(P &&...param) { + std::array params{ + box

(std::forward

(param))...}; + + if (m_conversions) { + Type_Conversions_State state(*m_conversions, + m_conversions->conversion_saves()); + return call(Carbon::Function_Params{params}, state); + } else { + Type_Conversions conv; + Type_Conversions_State state(conv, conv.conversion_saves()); + return call(Carbon::Function_Params{params}, state); + } + } + + template + static Boxed_Value box(Q &&q) { + if constexpr (std::is_same_v>) { + return std::forward(q); + } else if constexpr (std::is_reference_v

) { + return Boxed_Value(std::ref(std::forward(q))); + } else { + return Boxed_Value(std::forward(q)); + } + } + + std::vector m_funcs; + const Type_Conversions *m_conversions; +}; + +/// \todo what happens if t_conversions is deleted out from under us?! +template +std::function build_function_caller_helper( + Ret(Params...), const std::vector &funcs, + const Type_Conversions_State *t_conversions) { + /* + if (funcs.size() == 1) + { + std::shared_ptr> pfi = + std::dynamic_pointer_cast > + (funcs[0]); + + if (pfi) + { + return pfi->internal_function(); + } + // looks like this either wasn't a Proxy_Function_Impl or the types didn't + match + // we cannot make any other guesses or assumptions really, so continuing + } + */ + + return std::function( + Build_Function_Caller_Helper( + funcs, t_conversions ? t_conversions->get() : nullptr)); +} +} // namespace Carbon::dispatch::detail + +#endif diff --git a/src/carbon/command/function_params.hpp b/src/carbon/command/function_params.hpp new file mode 100644 index 00000000..3e004afb --- /dev/null +++ b/src/carbon/command/function_params.hpp @@ -0,0 +1,68 @@ + + +#ifndef CARBON_FUNCTION_PARAMS_HPP +#define CARBON_FUNCTION_PARAMS_HPP + +#include "boxed_value.hpp" + +namespace Carbon { +class Function_Params { +public: + constexpr Function_Params(const Boxed_Value *const t_begin, + const Boxed_Value *const t_end) + : m_begin(t_begin), m_end(t_end) {} + + explicit Function_Params(const Boxed_Value &bv) + : m_begin(&bv), m_end(m_begin + 1) {} + + explicit Function_Params(const std::vector &vec) + : m_begin(vec.empty() ? nullptr : &vec.front()), + m_end(vec.empty() ? nullptr : &vec.front() + vec.size()) {} + + template + constexpr explicit Function_Params(const std::array &a) + : m_begin(&a.front()), m_end(&a.front() + Size) {} + + [[nodiscard]] constexpr const Boxed_Value &operator[]( + const std::size_t t_i) const noexcept { + return m_begin[t_i]; + } + + [[nodiscard]] constexpr const Boxed_Value *begin() const noexcept { + return m_begin; + } + + [[nodiscard]] constexpr const Boxed_Value &front() const noexcept { + return *m_begin; + } + + [[nodiscard]] constexpr const Boxed_Value *end() const noexcept { + return m_end; + } + + [[nodiscard]] constexpr std::size_t size() const noexcept { + return std::size_t(m_end - m_begin); + } + + [[nodiscard]] std::vector to_vector() const { + return std::vector{m_begin, m_end}; + } + + [[nodiscard]] constexpr bool empty() const noexcept { + return m_begin == m_end; + } + +private: + const Boxed_Value *m_begin = nullptr; + const Boxed_Value *m_end = nullptr; +}; + +// Constructor specialization for array of size 0 +template <> +constexpr Function_Params::Function_Params( + const std::array & /* a */) + : m_begin(nullptr), m_end(nullptr) {} + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/function_signature.hpp b/src/carbon/command/function_signature.hpp new file mode 100644 index 00000000..cfbc55aa --- /dev/null +++ b/src/carbon/command/function_signature.hpp @@ -0,0 +1,186 @@ +#ifndef CARBON_FUNCTION_SIGNATURE_HPP +#define CARBON_FUNCTION_SIGNATURE_HPP + +#include + +namespace Carbon::dispatch::detail { +template +struct Function_Params {}; + +template +struct Function_Signature { + using Param_Types = Params; + using Return_Type = Ret; + constexpr static const bool is_object = IsObject; + constexpr static const bool is_member_object = IsMemberObject; + constexpr static const bool is_noexcept = IsNoExcept; + template + constexpr Function_Signature(T &&) noexcept {} + constexpr Function_Signature() noexcept = default; +}; + +// Free functions + +template +Function_Signature(Ret (*f)(Param...)) + -> Function_Signature>; + +template +Function_Signature(Ret (*f)(Param...) noexcept) + -> Function_Signature, true>; + +// no reference specifier + +template +Function_Signature(Ret (Class::*f)(Param...) volatile) + -> Function_Signature, + false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile noexcept) + -> Function_Signature, + true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const) + -> Function_Signature< + Ret, Function_Params, false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const noexcept) + -> Function_Signature< + Ret, Function_Params, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...)) + -> Function_Signature, false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) noexcept) + -> Function_Signature, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const) + -> Function_Signature, false, + true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const noexcept) + -> Function_Signature, true, + true>; + +// & reference specifier + +template +Function_Signature(Ret (Class::*f)(Param...) volatile &) + -> Function_Signature, + false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile & noexcept) + -> Function_Signature, + true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const &) + -> Function_Signature< + Ret, Function_Params, false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const & noexcept) + -> Function_Signature< + Ret, Function_Params, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) &) + -> Function_Signature, false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) & noexcept) + -> Function_Signature, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const &) + -> Function_Signature, false, + true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const & noexcept) + -> Function_Signature, true, + true>; + +// && reference specifier + +template +Function_Signature(Ret (Class::*f)(Param...) volatile &&) + -> Function_Signature, + false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile && noexcept) + -> Function_Signature, + true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const &&) + -> Function_Signature< + Ret, Function_Params, false, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) volatile const && noexcept) + -> Function_Signature< + Ret, Function_Params, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) &&) + -> Function_Signature, false, + true>; + +template +Function_Signature(Ret (Class::*f)(Param...) && noexcept) + -> Function_Signature, true, true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const &&) + -> Function_Signature, false, + true>; + +template +Function_Signature(Ret (Class::*f)(Param...) const && noexcept) + -> Function_Signature, true, + true>; + +template +Function_Signature(Ret Class::*f) + -> Function_Signature, true, true, true>; + +// primary template handles types that have no nested ::type member: +template > +struct has_call_operator : std::false_type {}; + +// specialization recognizes types that do have a nested ::type member: +template +struct has_call_operator> + : std::true_type {}; + +template +auto function_signature(const Func &f) { + if constexpr (has_call_operator::value) { + return Function_Signature< + typename decltype(Function_Signature{ + &std::decay_t::operator()})::Return_Type, + typename decltype(Function_Signature{ + &std::decay_t::operator()})::Param_Types, + decltype(Function_Signature{ + &std::decay_t::operator()})::is_noexcept, + false, false, true>{}; + } else { + return Function_Signature{f}; + } +} + +} // namespace Carbon::dispatch::detail + +#endif diff --git a/src/carbon/command/handle_return.hpp b/src/carbon/command/handle_return.hpp new file mode 100644 index 00000000..e6eb93a6 --- /dev/null +++ b/src/carbon/command/handle_return.hpp @@ -0,0 +1,201 @@ + +#ifndef CARBON_HANDLE_RETURN_HPP +#define CARBON_HANDLE_RETURN_HPP + +#include +#include +#include + +#include "boxed_number.hpp" +#include "boxed_value.hpp" + +namespace Carbon { +class Boxed_Number; +} // namespace Carbon + +namespace Carbon { +namespace dispatch { +template +class Proxy_Function_Callable_Impl; +template +class Assignable_Proxy_Function_Impl; + +namespace detail { +/// Used internally for handling a return value from a Proxy_Function call +template +struct Handle_Return { + template >>> + static Boxed_Value handle(T r) { + return Boxed_Value(std::move(r), true); + } + + template >)>> + static Boxed_Value handle(T &&r) { + return Boxed_Value(std::make_shared(std::forward(r)), true); + } +}; + +template +struct Handle_Return &> { + static Boxed_Value handle(const std::function &f) { + return Boxed_Value( + Carbon::make_shared>>(f)); + } +}; + +template +struct Handle_Return> + : Handle_Return &> {}; + +template +struct Handle_Return>> { + static Boxed_Value handle(const std::shared_ptr> &f) { + return Boxed_Value( + Carbon::make_shared>( + std::ref(*f), f)); + } +}; + +template +struct Handle_Return> &> + : Handle_Return>> {}; + +template +struct Handle_Return>> + : Handle_Return>> {}; + +template +struct Handle_Return &> { + static Boxed_Value handle(std::function &f) { + return Boxed_Value( + Carbon::make_shared>( + std::ref(f), std::shared_ptr>())); + } + + static Boxed_Value handle(const std::function &f) { + return Boxed_Value( + Carbon::make_shared>>(f)); + } +}; + +template +struct Handle_Return { + static Boxed_Value handle(Ret *p) { return Boxed_Value(p, true); } +}; + +template +struct Handle_Return { + static Boxed_Value handle(const Ret *p) { return Boxed_Value(p, true); } +}; + +template +struct Handle_Return { + static Boxed_Value handle(Ret *p) { return Boxed_Value(p, true); } +}; + +template +struct Handle_Return { + static Boxed_Value handle(const Ret *p) { return Boxed_Value(p, true); } +}; + +template +struct Handle_Return &> { + static Boxed_Value handle(const std::shared_ptr &r) { + return Boxed_Value(r, true); + } +}; + +template +struct Handle_Return> + : Handle_Return &> {}; + +template +struct Handle_Return &> + : Handle_Return &> {}; + +template +struct Handle_Return> + : Handle_Return &> { + static Boxed_Value handle(std::unique_ptr &&r) { + return Boxed_Value(std::move(r), true); + } +}; + +template +struct Handle_Return_Ref { + template + static Boxed_Value handle(T &&r) { + return Boxed_Value(std::cref(r), true); + } +}; + +template +struct Handle_Return_Ref { + template + static Boxed_Value handle(T &&r) { + return Boxed_Value(typename std::remove_reference::type{r}, + true); + } +}; + +template +struct Handle_Return + : Handle_Return_Ref::type>::value> {}; + +template +struct Handle_Return { + static Boxed_Value handle(Ret r) { return Boxed_Value(std::move(r)); } +}; + +template +struct Handle_Return { + static Boxed_Value handle(Ret &r) { return Boxed_Value(std::ref(r)); } +}; + +template <> +struct Handle_Return { + static Boxed_Value handle(const Boxed_Value &r) noexcept { return r; } +}; + +template <> +struct Handle_Return : Handle_Return {}; + +template <> +struct Handle_Return : Handle_Return {}; + +template <> +struct Handle_Return : Handle_Return {}; + +/** + * Used internally for handling a return value from a Proxy_Function call + */ +template <> +struct Handle_Return { + static Boxed_Value handle(const Boxed_Number &r) noexcept { return r.bv; } +}; + +template <> +struct Handle_Return : Handle_Return {}; + +/** + * Used internally for handling a return value from a Proxy_Function call + */ +template <> +struct Handle_Return { + static Boxed_Value handle() { return void_var(); } +}; +} // namespace detail +} // namespace dispatch +} // namespace Carbon + +#endif diff --git a/src/carbon/command/operators.hpp b/src/carbon/command/operators.hpp new file mode 100644 index 00000000..4b8c94f0 --- /dev/null +++ b/src/carbon/command/operators.hpp @@ -0,0 +1,211 @@ +// This file is distributed under the BSD License. +// See "license.txt" for details. +// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) +// Copyright 2009-2018, Jason Turner (jason@emptycrate.com) +// http://www.chaiscript.com + +// This is an open source non-commercial project. Dear PVS-Studio, please check +// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + +#ifndef CARBON_OPERATORS_HPP +#define CARBON_OPERATORS_HPP + +#include "../defines.hpp" +#include "dispatchkit.hpp" +#include "register_function.hpp" + +namespace Carbon::bootstrap::operators { +template +void assign(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs = rhs; }), + "="); +} + +template +void assign_bitwise_and(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs &= rhs; }), + "&="); +} + +template +void assign_xor(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs ^= rhs; }), + "^="); +} + +template +void assign_bitwise_or(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs |= rhs; }), + "|="); +} + +template +void assign_difference(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs -= rhs; }), + "-="); +} + +template +void assign_left_shift(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs <<= rhs; }), + "<<="); +} + +template +void assign_product(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs <<= rhs; }), + "*="); +} + +template +void assign_quotient(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs /= rhs; }), + "/="); +} + +template +void assign_remainder(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs %= rhs; }), + "%="); +} + +template +void assign_right_shift(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs >>= rhs; }), + ">>="); +} + +template +void assign_sum(Module &m) { + m.add(Carbon::fun([](T &lhs, const T &rhs) -> T & { return lhs += rhs; }), + "+="); +} + +template +void prefix_decrement(Module &m) { + m.add(Carbon::fun([](T &lhs) -> T & { return --lhs; }), "--"); +} + +template +void prefix_increment(Module &m) { + m.add(Carbon::fun([](T &lhs) -> T & { return ++lhs; }), "++"); +} + +template +void equal(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs == rhs; }), + "=="); +} + +template +void greater_than(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs > rhs; }), + ">"); +} + +template +void greater_than_equal(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs >= rhs; }), + ">="); +} + +template +void less_than(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs < rhs; }), + "<"); +} + +template +void less_than_equal(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs <= rhs; }), + "<="); +} + +template +void logical_compliment(Module &m) { + m.add(Carbon::fun([](const T &lhs) { return !lhs; }), "!"); +} + +template +void not_equal(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs != rhs; }), + "!="); +} + +template +void addition(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs + rhs; }), + "+"); +} + +template +void unary_plus(Module &m) { + m.add(Carbon::fun([](const T &lhs) { return +lhs; }), "+"); +} + +template +void subtraction(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs - rhs; }), + "-"); +} + +template +void unary_minus(Module &m) { + m.add(Carbon::fun([](const T &lhs) { return -lhs; }), "-"); +} + +template +void bitwise_and(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs & rhs; }), + "&"); +} + +template +void bitwise_compliment(Module &m) { + m.add(Carbon::fun([](const T &lhs) { return ~lhs; }), "~"); +} + +template +void bitwise_xor(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs ^ rhs; }), + "^"); +} + +template +void bitwise_or(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs | rhs; }), + "|"); +} + +template +void division(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs / rhs; }), + "/"); +} + +template +void left_shift(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs << rhs; }), + "<<"); +} + +template +void multiplication(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs * rhs; }), + "*"); +} + +template +void remainder(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs % rhs; }), + "%"); +} + +template +void right_shift(Module &m) { + m.add(Carbon::fun([](const T &lhs, const T &rhs) { return lhs >> rhs; }), + ">>"); +} +} // namespace Carbon::bootstrap::operators + +#endif diff --git a/src/carbon/command/proxy_constructors.hpp b/src/carbon/command/proxy_constructors.hpp new file mode 100644 index 00000000..82274dec --- /dev/null +++ b/src/carbon/command/proxy_constructors.hpp @@ -0,0 +1,57 @@ + + +#ifndef CARBON_PROXY_CONSTRUCTORS_HPP +#define CARBON_PROXY_CONSTRUCTORS_HPP + +#include "proxy_functions.hpp" + +namespace Carbon::dispatch::detail { +template +Proxy_Function build_constructor_(Class (*)(Params...)) { + if constexpr (!std::is_copy_constructible_v) { + auto call = [](auto &&...param) { + return std::make_shared( + std::forward(param)...); + }; + + return Proxy_Function( + Carbon::make_shared< + dispatch::Proxy_Function_Base, + dispatch::Proxy_Function_Callable_Impl< + std::shared_ptr(Params...), decltype(call)>>(call)); + } else if constexpr (true) { + auto call = [](auto &&...param) { + return Class(std::forward(param)...); + }; + + return Proxy_Function( + Carbon::make_shared>(call)); + } +} +} // namespace Carbon::dispatch::detail + +namespace Carbon { +/// \brief Generates a constructor function for use with ChaiScript +/// +/// \tparam T The signature of the constructor to generate. In the form of: +/// ClassType (ParamType1, ParamType2, ...) +/// +/// Example: +/// \code +/// Carbon::ChaiScript chai; +/// // Create a new function that creates a MyClass object using the (int, +/// float) constructor +/// // and call that function "MyClass" so that it appears as a normal +/// constructor to the user. chai.add(constructor(), +/// "MyClass"); +/// \endcode +template +Proxy_Function constructor() { + T *f = nullptr; + return (dispatch::detail::build_constructor_(f)); +} +} // namespace Carbon + +#endif diff --git a/src/carbon/command/proxy_functions.cpp b/src/carbon/command/proxy_functions.cpp new file mode 100644 index 00000000..98482e40 --- /dev/null +++ b/src/carbon/command/proxy_functions.cpp @@ -0,0 +1,471 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "proxy_functions.hpp" + +#include "../defines.hpp" +#include "boxed_cast.hpp" +#include "boxed_value.hpp" +#include "dynamic_object.hpp" +#include "function_params.hpp" +#include "proxy_functions_detail.hpp" +#include "atom/experiment/type_info.hpp" + +namespace Carbon { + +namespace dispatch { + +Param_Types::Param_Types() : m_has_types(false) {} + +Param_Types::Param_Types(std::vector> t_types) + : m_types(std::move(t_types)), m_has_types(false) { + update_has_types(); +} + +void Param_Types::push_front(const std::string &t_name, Type_Info t_ti) { + m_types.emplace(m_types.begin(), std::move(t_name), t_ti); + update_has_types(); +} + +bool Param_Types::operator==(const Param_Types &t_rhs) const { + return m_types == t_rhs.m_types; +} + +std::vector Param_Types::convert( + Function_Params t_params, + const Type_Conversions_State &t_conversions) const { + auto vals = t_params.to_vector(); + const auto dynamic_object_type_info = user_type(); + for (size_t i = 0; i < vals.size(); ++i) { + const auto &name = m_types[i].first; + if (!name.empty()) { + const auto &bv = vals[i]; + + if (!bv.get_type_info().bare_equal(dynamic_object_type_info)) { + const auto &ti = m_types[i].second; + if (!ti.is_undef()) { + if (!bv.get_type_info().bare_equal(ti)) { + if (t_conversions->converts(ti, bv.get_type_info())) { + try { + // We will not catch any + // bad_boxed_dynamic_cast that is thrown, + // let the user get it either way, we are + // not responsible if it doesn't work + vals[i] = t_conversions->boxed_type_conversion( + m_types[i].second, t_conversions.saves(), + vals[i]); + } catch (...) { + try { + // try going the other way + vals[i] = + t_conversions + ->boxed_type_down_conversion( + m_types[i].second, + t_conversions.saves(), vals[i]); + } catch (const Carbon::detail::exception:: + bad_any_cast &) { + throw exception::bad_boxed_cast( + bv.get_type_info(), + *m_types[i].second.bare_type_info()); + } + } + } + } + } + } + } + } + + return vals; +} + +// first result: is a match +// second result: needs conversions +std::pair Param_Types::match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + const auto dynamic_object_type_info = user_type(); + bool needs_conversion = false; + + if (!m_has_types) { + return std::make_pair(true, needs_conversion); + } + if (vals.size() != m_types.size()) { + return std::make_pair(false, needs_conversion); + } + + for (size_t i = 0; i < vals.size(); ++i) { + const auto &name = m_types[i].first; + if (!name.empty()) { + const auto &bv = vals[i]; + + if (bv.get_type_info().bare_equal(dynamic_object_type_info)) { + try { + const Dynamic_Object &d = + boxed_cast(bv, &t_conversions); + if (!(name == "Dynamic_Object" || + d.get_type_name() == name)) { + return std::make_pair(false, false); + } + } catch (const std::bad_cast &) { + return std::make_pair(false, false); + } + } else { + const auto &ti = m_types[i].second; + if (!ti.is_undef()) { + if (!bv.get_type_info().bare_equal(ti)) { + if (!t_conversions->converts(ti, bv.get_type_info())) { + return std::make_pair(false, false); + } else { + needs_conversion = true; + } + } + } else { + return std::make_pair(false, false); + } + } + } + } + + return std::make_pair(true, needs_conversion); +} + +const std::vector> &Param_Types::types() + const { + return m_types; +} + +void Param_Types::update_has_types() { + for (const auto &type : m_types) { + if (!type.first.empty()) { + m_has_types = true; + return; + } + } + + m_has_types = false; +} + +Boxed_Value Proxy_Function_Base::operator()( + const Function_Params ¶ms, + const Carbon::Type_Conversions_State &t_conversions) const { + if (m_arity < 0 || size_t(m_arity) == params.size()) { + return do_call(params, t_conversions); + } else { + throw exception::arity_error(static_cast(params.size()), m_arity); + } +} + +/// Returns a vector containing all of the types of the parameters the +/// function returns/takes if the function is variadic or takes no arguments +/// (arity of 0 or -1), the returned value contains exactly 1 Type_Info +/// object: the return type \returns the types of all parameters. +const std::vector &Proxy_Function_Base::get_param_types() const { + return m_types; +} + +bool Proxy_Function_Base::is_attribute_function() const; +{ return false; } + +bool Proxy_Function_Base::has_arithmetic_param() const { + return m_has_arithmetic_param; +} + +std::vector> +Proxy_Function_Base::get_contained_functions() const { + return std::vector>(); +} + +//! Return true if the function is a possible match +//! to the passed in values +bool Proxy_Function_Base::filter( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + assert(m_arity == -1 || + (m_arity > 0 && static_cast(vals.size()) == m_arity)); + + if (m_arity < 0) { + return true; + } else if (m_arity > 1) { + return compare_type_to_param(m_types[1], vals[0], t_conversions) && + compare_type_to_param(m_types[2], vals[1], t_conversions); + } else { + return compare_type_to_param(m_types[1], vals[0], t_conversions); + } +} + +/// \returns the number of arguments the function takes or -1 if it is +/// variadic +int Proxy_Function_Base::get_arity() const { return m_arity; } + +bool Proxy_Function_Base::compare_type_to_param( + const Type_Info &ti, const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) { + const auto boxed_value_ti = user_type(); + const auto boxed_number_ti = user_type(); + const auto function_ti = + user_type>(); + + if (ti.is_undef() || ti.bare_equal(boxed_value_ti) || + (!bv.get_type_info().is_undef() && + ((ti.bare_equal(boxed_number_ti) && + bv.get_type_info().is_arithmetic()) || + ti.bare_equal(bv.get_type_info()) || + bv.get_type_info().bare_equal(function_ti) || + t_conversions->converts(ti, bv.get_type_info())))) { + return true; + } else { + return false; + } +} + +bool Proxy_Function_Base::compare_first_type( + const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const { + /// TODO is m_types guaranteed to be at least 2?? + return compare_type_to_param(m_types[1], bv, t_conversions); +} + +Boxed_Value Proxy_Function_Base::do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const = 0; + +Proxy_Function_Base::Proxy_Function_Base(std::vector t_types, + int t_arity) + : m_types(std::move(t_types)), + m_arity(t_arity), + m_has_arithmetic_param(false) { + for (size_t i = 1; i < m_types.size(); ++i) { + if (m_types[i].is_arithmetic()) { + m_has_arithmetic_param = true; + return; + } + } +} + +bool Proxy_Function_Base::compare_types( + const std::vector &tis, const Function_Params &bvs, + const Type_Conversions_State &t_conversions) { + if (tis.size() - 1 != bvs.size()) { + return false; + } else { + const size_t size = bvs.size(); + for (size_t i = 0; i < size; ++i) { + if (!compare_type_to_param(tis[i + 1], bvs[i], t_conversions)) { + return false; + } + } + } + return true; +} + +} // namespace dispatch + +namespace dispatch { +Dynamic_Proxy_Function::Dynamic_Proxy_Function( + const int t_arity, std::shared_ptr t_parsenode, + Param_Types t_param_types = Param_Types(), + Proxy_Function t_guard = Proxy_Function()) + : Proxy_Function_Base(build_param_type_list(t_param_types), t_arity), + m_param_types(std::move(t_param_types)), + m_guard(std::move(t_guard)), + m_parsenode(std::move(t_parsenode)) { + // assert(t_parsenode); +} + +bool Dynamic_Proxy_Function::operator==(const Proxy_Function_Base &rhs) const { + const Dynamic_Proxy_Function *prhs = + dynamic_cast(&rhs); + + return this == &rhs || + ((prhs != nullptr) && this->m_arity == prhs->m_arity && + !this->m_guard && !prhs->m_guard && + this->m_param_types == prhs->m_param_types); +} + +bool Dynamic_Proxy_Function::call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + return call_match_internal(vals, t_conversions).first; +} + +bool Dynamic_Proxy_Function::has_guard() const { return bool(m_guard); } + +Proxy_Function Dynamic_Proxy_Function::get_guard() const { return m_guard; } + +bool Dynamic_Proxy_Function::has_parse_tree() const { + return static_cast(m_parsenode); +} + +const AST_Node &Dynamic_Proxy_Function::get_parse_tree() const { + if (m_parsenode) { + return *m_parsenode; + } else { + throw std::runtime_error( + "Dynamic_Proxy_Function does not have parse_tree"); + } +} + +bool Dynamic_Proxy_Function::test_guard( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + if (m_guard) { + try { + return boxed_cast((*m_guard)(params, t_conversions)); + } catch (const exception::arity_error &) { + return false; + } catch (const exception::bad_boxed_cast &) { + return false; + } + } else { + return true; + } +} + +// first result: is a match +// second result: needs conversions +std::pair Dynamic_Proxy_Function::call_match_internal( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + const auto comparison_result = [&]() { + if (m_arity < 0) { + return std::make_pair(true, false); + } else if (vals.size() == size_t(m_arity)) { + return m_param_types.match(vals, t_conversions); + } else { + return std::make_pair(false, false); + } + }(); + + return std::make_pair( + comparison_result.first && test_guard(vals, t_conversions), + comparison_result.second); +} + +std::vector Dynamic_Proxy_Function::build_param_type_list( + const Param_Types &t_types) { + // For the return type + std::vector types{Get_Type_Info::get()}; + + for (const auto &t : t_types.types()) { + if (t.second.is_undef()) { + types.push_back(Get_Type_Info::get()); + } else { + types.push_back(t.second); + } + } + + return types; +} + +Bound_Function::Bound_Function(const Const_Proxy_Function &t_f, + const std::vector &t_args) + : Proxy_Function_Base( + build_param_type_info(t_f, t_args), + (t_f->get_arity() < 0 + ? -1 + : static_cast(build_param_type_info(t_f, t_args).size()) - + 1)), + m_f(t_f), + m_args(t_args) { + assert(m_f->get_arity() < 0 || + m_f->get_arity() == static_cast(m_args.size())); +} + +bool Bound_Function::operator==(const Proxy_Function_Base &t_f) const { + return &t_f == this; +} + +bool Bound_Function::call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + return m_f->call_match(Function_Params(build_param_list(vals)), + t_conversions); +} + +std::vector Bound_Function::get_contained_functions() + const { + return std::vector{m_f}; +} + +std::vector Bound_Function::build_param_list( + const Function_Params ¶ms) const { + auto parg = params.begin(); + auto barg = m_args.begin(); + + std::vector args; + + while (!(parg == params.end() && barg == m_args.end())) { + while (barg != m_args.end() && + !(barg->get_type_info() == + Get_Type_Info::get())) { + args.push_back(*barg); + ++barg; + } + + if (parg != params.end()) { + args.push_back(*parg); + ++parg; + } + + if (barg != m_args.end() && + barg->get_type_info() == Get_Type_Info::get()) { + ++barg; + } + } + return args; +} + +std::vector Bound_Function::build_param_type_info( + const Const_Proxy_Function &t_f, const std::vector &t_args) { + assert(t_f->get_arity() < 0 || + t_f->get_arity() == static_cast(t_args.size())); + + if (t_f->get_arity() < 0) { + return std::vector(); + } + + const auto types = t_f->get_param_types(); + assert(types.size() == t_args.size() + 1); + + // this analysis warning is invalid in MSVC12 and doesn't exist in + // MSVC14 + std::vector retval{types[0]}; + + for (size_t i = 0; i < types.size() - 1; ++i) { + if (t_args[i].get_type_info() == + Get_Type_Info::get()) { + retval.push_back(types[i + 1]); + } + } + + return retval; +} + +Boxed_Value Bound_Function::do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + return (*m_f)(Function_Params{build_param_list(params)}, t_conversions); +} +Proxy_Function_Impl_Base::Proxy_Function_Impl_Base( + const std::vector &t_types) + : Proxy_Function_Base(t_types, static_cast(t_types.size()) - 1) {} + +bool Proxy_Function_Impl_Base::call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + return static_cast(vals.size()) == get_arity() && + (compare_types(m_types, vals, t_conversions) && + compare_types_with_cast(vals, t_conversions)); +} + +} // namespace dispatch + +} // namespace Carbon diff --git a/src/carbon/command/proxy_functions.hpp b/src/carbon/command/proxy_functions.hpp new file mode 100644 index 00000000..a1193fa8 --- /dev/null +++ b/src/carbon/command/proxy_functions.hpp @@ -0,0 +1,642 @@ + +#ifndef CARBON_PROXY_FUNCTIONS_HPP +#define CARBON_PROXY_FUNCTIONS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../defines.hpp" +#include "atom/experiment/type_info.hpp" +#include "boxed_cast.hpp" +#include "boxed_value.hpp" +#include "dynamic_object.hpp" +#include "function_params.hpp" +#include "proxy_functions_detail.hpp" + +namespace Carbon { +class Type_Conversions; +namespace exception { +class bad_boxed_cast; +struct arity_error; +} // namespace exception +} // namespace Carbon + +namespace Carbon { +class Boxed_Number; +struct AST_Node; + +using AST_NodePtr = std::unique_ptr; + +namespace dispatch { +template +std::function functor( + std::shared_ptr func, + const Type_Conversions_State *t_conversions); + +class Param_Types { +public: + Param_Types(); + + explicit Param_Types( + std::vector> t_types); + + void push_front(const std::string &t_name, Type_Info t_ti); + + bool operator==(const Param_Types &t_rhs) const noexcept; + + std::vector convert( + Function_Params t_params, + const Type_Conversions_State &t_conversions) const; + + // first result: is a match + // second result: needs conversions + std::pair match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept; + + const std::vector> &types() + const noexcept; + +private: + void update_has_types(); + + std::vector> m_types; + bool m_has_types; +}; + +/** + * Pure virtual base class for all Proxy_Function implementations + * Proxy_Functions are a type erasure of type safe C++ + * function calls. At runtime parameter types are expected to be + * tested against passed in types. + * Dispatch_Engine only knows how to work with Proxy_Function, no other + * function classes. + */ +class Proxy_Function_Base { +public: + virtual ~Proxy_Function_Base() = default; + + Boxed_Value operator()( + const Function_Params ¶ms, + const Carbon::Type_Conversions_State &t_conversions) const; + + /// Returns a vector containing all of the types of the parameters the + /// function returns/takes if the function is variadic or takes no arguments + /// (arity of 0 or -1), the returned value contains exactly 1 Type_Info + /// object: the return type \returns the types of all parameters. + const std::vector &get_param_types() const noexcept; + + virtual bool operator==(const Proxy_Function_Base &) const noexcept = 0; + virtual bool call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const = 0; + + virtual bool is_attribute_function() const noexcept; + + bool has_arithmetic_param() const noexcept; + + virtual std::vector> + get_contained_functions() const; + + //! Return true if the function is a possible match + //! to the passed in values + bool filter(const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept; + + /// \returns the number of arguments the function takes or -1 if it is + /// variadic + int get_arity() const noexcept; + + static bool compare_type_to_param( + const Type_Info &ti, const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) noexcept; + + virtual bool compare_first_type( + const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) const noexcept { + /// TODO is m_types guaranteed to be at least 2?? + return compare_type_to_param(m_types[1], bv, t_conversions); + } + +protected: + virtual Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const = 0; + + Proxy_Function_Base(std::vector t_types, int t_arity); + + static bool compare_types( + const std::vector &tis, const Function_Params &bvs, + const Type_Conversions_State &t_conversions) noexcept; + + std::vector m_types; + int m_arity; + bool m_has_arithmetic_param; +}; +} // namespace dispatch + +/// \brief Common typedef used for passing of any registered function in +/// ChaiScript +using Proxy_Function = std::shared_ptr; + +/// \brief Const version of Proxy_Function. Points to a const Proxy_Function. +/// This is how most registered functions +/// are handled internally. +using Const_Proxy_Function = + std::shared_ptr; + +namespace exception { +/// \brief Exception thrown if a function's guard fails +class guard_error : public std::runtime_error { +public: + guard_error() noexcept : std::runtime_error("Guard evaluation failed") {} + + guard_error(const guard_error &) = default; + + ~guard_error() noexcept override = default; +}; +} // namespace exception + +namespace dispatch { +/// A Proxy_Function implementation that is not type safe, the called function +/// is expecting a vector that it works with how it chooses. +class Dynamic_Proxy_Function : public Proxy_Function_Base { +public: + explicit Dynamic_Proxy_Function(const int t_arity, + std::shared_ptr t_parsenode, + Param_Types t_param_types = Param_Types(), + Proxy_Function t_guard = Proxy_Function()); + + bool operator==(const Proxy_Function_Base &rhs) const noexcept override; + + bool call_match(const Function_Params &vals, + const Type_Conversions_State &t_conversions) const override; + + bool has_guard() const noexcept; + + Proxy_Function get_guard() const noexcept; + + bool has_parse_tree() const noexcept; + + const AST_Node &get_parse_tree() const; + +protected: + bool test_guard(const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const; + + // first result: is a match + // second result: needs conversions + std::pair call_match_internal( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const; + +private: + static std::vector build_param_type_list( + const Param_Types &t_types); + +protected: + Param_Types m_param_types; + +private: + Proxy_Function m_guard; + std::shared_ptr m_parsenode; +}; + +template +class Dynamic_Proxy_Function_Impl final : public Dynamic_Proxy_Function { +public: + Dynamic_Proxy_Function_Impl( + Callable t_f, int t_arity = -1, + std::shared_ptr t_parsenode = AST_NodePtr(), + Param_Types t_param_types = Param_Types(), + Proxy_Function t_guard = Proxy_Function()) + : Dynamic_Proxy_Function(t_arity, std::move(t_parsenode), + std::move(t_param_types), std::move(t_guard)), + m_f(std::move(t_f)) {} + +protected: + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override { + const auto [is_a_match, needs_conversions] = + call_match_internal(params, t_conversions); + if (is_a_match) { + if (needs_conversions) { + return m_f(Function_Params{ + m_param_types.convert(params, t_conversions)}); + } else { + return m_f(params); + } + } else { + throw exception::guard_error(); + } + } + +private: + Callable m_f; +}; + +template +Proxy_Function make_dynamic_proxy_function(Callable &&c, Arg &&...a) { + return Carbon::make_shared>( + std::forward(c), std::forward(a)...); +} + +/// An object used by Bound_Function to represent "_" parameters +/// of a binding. This allows for unbound parameters during bind. +struct Placeholder_Object {}; + +/// An implementation of Proxy_Function that takes a Proxy_Function +/// and substitutes bound parameters into the parameter list +/// at runtime, when call() is executed. +/// it is used for bind(function, param1, _, param2) style calls +class Bound_Function final : public Proxy_Function_Base { +public: + Bound_Function(const Const_Proxy_Function &t_f, + const std::vector &t_args); + + bool operator==(const Proxy_Function_Base &t_f) const noexcept override; + + bool call_match(const Function_Params &vals, + const Type_Conversions_State &t_conversions) const override; + + std::vector get_contained_functions() const override; + +protected: + static std::vector build_param_type_info( + const Const_Proxy_Function &t_f, + const std::vector &t_args); + + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override; + +private: + Const_Proxy_Function m_f; + std::vector m_args; +}; + +class Proxy_Function_Impl_Base : public Proxy_Function_Base { +public: + explicit Proxy_Function_Impl_Base(const std::vector &t_types); + + bool call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept override; + + virtual bool compare_types_with_cast( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept = 0; +}; + +/// For any callable object +template +class Proxy_Function_Callable_Impl final : public Proxy_Function_Impl_Base { +public: + explicit Proxy_Function_Callable_Impl(Callable f) + : Proxy_Function_Impl_Base( + detail::build_param_type_list(static_cast(nullptr))), + m_f(std::move(f)) {} + + bool compare_types_with_cast( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept override { + return detail::compare_types_cast(static_cast(nullptr), vals, + t_conversions); + } + + bool operator==(const Proxy_Function_Base &t_func) const noexcept override { + return dynamic_cast< + const Proxy_Function_Callable_Impl *>( + &t_func) != nullptr; + } + +protected: + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override { + return detail::call_func(static_cast(nullptr), m_f, params, + t_conversions); + } + +private: + Callable m_f; +}; + +class Assignable_Proxy_Function : public Proxy_Function_Impl_Base { +public: + explicit Assignable_Proxy_Function(const std::vector &t_types) + : Proxy_Function_Impl_Base(t_types) {} + + virtual void assign( + const std::shared_ptr &t_rhs) = 0; +}; + +template +class Assignable_Proxy_Function_Impl final : public Assignable_Proxy_Function { +public: + Assignable_Proxy_Function_Impl( + std::reference_wrapper> t_f, + std::shared_ptr> t_ptr) + : Assignable_Proxy_Function( + detail::build_param_type_list(static_cast(nullptr))), + m_f(std::move(t_f)), + m_shared_ptr_holder(std::move(t_ptr)) { + assert(!m_shared_ptr_holder || m_shared_ptr_holder.get() == &m_f.get()); + } + + bool compare_types_with_cast( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const noexcept override { + return detail::compare_types_cast(static_cast(nullptr), vals, + t_conversions); + } + + bool operator==(const Proxy_Function_Base &t_func) const noexcept override { + return dynamic_cast *>( + &t_func) != nullptr; + } + + std::function internal_function() const { return m_f.get(); } + + void assign( + const std::shared_ptr &t_rhs) override { + m_f.get() = dispatch::functor(t_rhs, nullptr); + } + +protected: + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override { + return detail::call_func(static_cast(nullptr), m_f.get(), + params, t_conversions); + } + +private: + std::reference_wrapper> m_f; + std::shared_ptr> m_shared_ptr_holder; +}; + +/// Attribute getter Proxy_Function implementation +template +class Attribute_Access final : public Proxy_Function_Base { +public: + explicit Attribute_Access(T Class::*t_attr) + : Proxy_Function_Base(param_types(), 1), m_attr(t_attr) {} + + bool is_attribute_function() const noexcept override { return true; } + + bool operator==(const Proxy_Function_Base &t_func) const noexcept override { + const Attribute_Access *aa = + dynamic_cast *>(&t_func); + + if (aa) { + return m_attr == aa->m_attr; + } else { + return false; + } + } + + bool call_match(const Function_Params &vals, + const Type_Conversions_State &) const noexcept override { + if (vals.size() != 1) { + return false; + } + const auto class_type_info = user_type(); + return vals[0].get_type_info().bare_equal(class_type_info); + } + +protected: + Boxed_Value do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const override { + const Boxed_Value &bv = params[0]; + if (bv.is_const()) { + const Class *o = boxed_cast(bv, &t_conversions); + return do_call_impl(o); + } else { + Class *o = boxed_cast(bv, &t_conversions); + return do_call_impl(o); + } + } + +private: + template + auto do_call_impl(Class *o) const { + if constexpr (std::is_pointer::value) { + return detail::Handle_Return::handle(o->*m_attr); + } else { + return detail::Handle_Return::type>::handle(o->*m_attr); + } + } + + template + auto do_call_impl(const Class *o) const { + if constexpr (std::is_pointer::value) { + return detail::Handle_Return::handle(o->*m_attr); + } else { + return detail::Handle_Return::type>::type>::handle(o->*m_attr); + } + } + + static std::vector param_types() { + return {user_type(), user_type()}; + } + + std::vector m_param_types{user_type(), user_type()}; + T Class::*m_attr; +}; +} // namespace dispatch + +namespace exception { +/// \brief Exception thrown in the case that a method dispatch fails +/// because no matching function was found +/// +/// May be thrown due to an arity_error, a guard_error or a bad_boxed_cast +/// exception +class dispatch_error : public std::runtime_error { +public: + dispatch_error(const Function_Params &t_parameters, + std::vector t_functions) + : std::runtime_error("Error with function dispatch"), + parameters(t_parameters.to_vector()), + functions(std::move(t_functions)) {} + + dispatch_error(const Function_Params &t_parameters, + std::vector t_functions, + const std::string &t_desc) + : std::runtime_error(t_desc), + parameters(t_parameters.to_vector()), + functions(std::move(t_functions)) {} + + dispatch_error(const dispatch_error &) = default; + ~dispatch_error() noexcept override = default; + + std::vector parameters; + std::vector functions; +}; +} // namespace exception + +namespace dispatch { +namespace detail { +template +bool types_match_except_for_arithmetic( + const FuncType &t_func, const Carbon::Function_Params &plist, + const Type_Conversions_State &t_conversions) noexcept { + const std::vector &types = t_func->get_param_types(); + + if (t_func->get_arity() == -1) { + return false; + } + + assert(plist.size() == types.size() - 1); + + return std::mismatch(plist.begin(), plist.end(), types.begin() + 1, + [&](const Boxed_Value &bv, const Type_Info &ti) { + return Proxy_Function_Base::compare_type_to_param( + ti, bv, t_conversions) || + (bv.get_type_info().is_arithmetic() && + ti.is_arithmetic()); + }) == std::make_pair(plist.end(), types.end()); +} + +template +Boxed_Value dispatch_with_conversions( + InItr begin, const InItr &end, const Carbon::Function_Params &plist, + const Type_Conversions_State &t_conversions, const Funcs &t_funcs) { + InItr matching_func(end); + + while (begin != end) { + if (types_match_except_for_arithmetic(begin->second, plist, + t_conversions)) { + if (matching_func == end) { + matching_func = begin; + } else { + // handle const members vs non-const member, which is not really + // ambiguous + const auto &mat_fun_param_types = + matching_func->second->get_param_types(); + const auto &next_fun_param_types = + begin->second->get_param_types(); + + if (plist[0].is_const() && !mat_fun_param_types[1].is_const() && + next_fun_param_types[1].is_const()) { + matching_func = + begin; // keep the new one, the const/non-const matchup + // is correct + } else if (!plist[0].is_const() && + !mat_fun_param_types[1].is_const() && + next_fun_param_types[1].is_const()) { + // keep the old one, it has a better const/non-const matchup + } else { + // ambiguous function call + throw exception::dispatch_error( + plist, std::vector( + t_funcs.begin(), t_funcs.end())); + } + } + } + + ++begin; + } + + if (matching_func == end) { + // no appropriate function to attempt arithmetic type conversion on + throw exception::dispatch_error( + plist, + std::vector(t_funcs.begin(), t_funcs.end())); + } + + std::vector newplist; + newplist.reserve(plist.size()); + + const std::vector &tis = + matching_func->second->get_param_types(); + std::transform( + tis.begin() + 1, tis.end(), plist.begin(), std::back_inserter(newplist), + [](const Type_Info &ti, const Boxed_Value ¶m) -> Boxed_Value { + if (ti.is_arithmetic() && param.get_type_info().is_arithmetic() && + param.get_type_info() != ti) { + return Boxed_Number(param).get_as(ti).bv; + } else { + return param; + } + }); + + try { + return (*(matching_func->second))(Carbon::Function_Params{newplist}, + t_conversions); + } catch (const exception::bad_boxed_cast &) { + // parameter failed to cast + } catch (const exception::arity_error &) { + // invalid num params + } catch (const exception::guard_error &) { + // guard failed to allow the function to execute + } + + throw exception::dispatch_error(plist, std::vector( + t_funcs.begin(), t_funcs.end())); +} +} // namespace detail + +/// Take a vector of functions and a vector of parameters. Attempt to execute +/// each function against the set of parameters, in order, until a matching +/// function is found or throw dispatch_error if no matching function is found +template +Boxed_Value dispatch(const Funcs &funcs, const Function_Params &plist, + const Type_Conversions_State &t_conversions) { + std::vector> ordered_funcs; + ordered_funcs.reserve(funcs.size()); + + for (const auto &func : funcs) { + const auto arity = func->get_arity(); + + if (arity == -1) { + ordered_funcs.emplace_back(plist.size(), func.get()); + } else if (arity == static_cast(plist.size())) { + size_t numdiffs = 0; + for (size_t i = 0; i < plist.size(); ++i) { + if (!func->get_param_types()[i + 1].bare_equal( + plist[i].get_type_info())) { + ++numdiffs; + } + } + ordered_funcs.emplace_back(numdiffs, func.get()); + } + } + + for (size_t i = 0; i <= plist.size(); ++i) { + for (const auto &func : ordered_funcs) { + try { + if (func.first == i && + (i == 0 || func.second->filter(plist, t_conversions))) { + return (*(func.second))(plist, t_conversions); + } + } catch (const exception::bad_boxed_cast &) { + // parameter failed to cast, try again + } catch (const exception::arity_error &) { + // invalid num params, try again + } catch (const exception::guard_error &) { + // guard failed to allow the function to execute, + // try again + } + } + } + + return detail::dispatch_with_conversions(ordered_funcs.cbegin(), + ordered_funcs.cend(), plist, + t_conversions, funcs); +} +} // namespace dispatch +} // namespace Carbon + +#endif diff --git a/src/carbon/command/proxy_functions_detail.hpp b/src/carbon/command/proxy_functions_detail.hpp new file mode 100644 index 00000000..9afdea9b --- /dev/null +++ b/src/carbon/command/proxy_functions_detail.hpp @@ -0,0 +1,108 @@ + + +#ifndef CARBON_PROXY_FUNCTIONS_DETAIL_HPP +#define CARBON_PROXY_FUNCTIONS_DETAIL_HPP + +#include +#include +#include +#include + +#include "../defines.hpp" +#include "boxed_cast.hpp" +#include "boxed_value.hpp" +#include "function_params.hpp" +#include "handle_return.hpp" +#include "type_info.hpp" + +namespace Carbon { +class Type_Conversions_State; +namespace exception { +class bad_boxed_cast; +} // namespace exception +} // namespace Carbon + +namespace Carbon { +namespace exception { +/** + * Exception thrown when there is a mismatch in number of + * parameters during Proxy_Function execution + */ +struct arity_error : std::range_error { + arity_error(int t_got, int t_expected) + : std::range_error("Function dispatch arity mismatch"), + got(t_got), + expected(t_expected) {} + + arity_error(const arity_error &) = default; + + ~arity_error() noexcept override = default; + + int got; + int expected; +}; +} // namespace exception + +namespace dispatch { +namespace detail { +/** + * Used by Proxy_Function_Impl to return a list of all param types + * it contains. + */ +template +std::vector build_param_type_list(Ret (*)(Params...)) { + /// \note somehow this is responsible for a large part of the code + /// generation + return {user_type(), user_type()...}; +} + +/** + * Used by Proxy_Function_Impl to determine if it is equivalent to another + * Proxy_Function_Impl object. This function is primarily used to prevent + * registration of two functions with the exact same signatures + */ +template +bool compare_types_cast(Ret (*)(Params...), + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) noexcept { + try { + std::vector::size_type i = 0; + (boxed_cast(params[i++], &t_conversions), ...); + return true; + } catch (const exception::bad_boxed_cast &) { + return false; + } +} + +template +Ret call_func(Ret (*)(Params...), std::index_sequence, const Callable &f, + [[maybe_unused]] const Carbon::Function_Params ¶ms, + [[maybe_unused]] const Type_Conversions_State &t_conversions) { + return f(boxed_cast(params[I], &t_conversions)...); +} + +/// Used by Proxy_Function_Impl to perform typesafe execution of a function. +/// The function attempts to unbox each parameter to the expected type. +/// if any unboxing fails the execution of the function fails and +/// the bad_boxed_cast is passed up to the caller. +template +Boxed_Value call_func(Ret (*sig)(Params...), const Callable &f, + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) { + if constexpr (std::is_same_v) { + call_func(sig, std::index_sequence_for{}, f, params, + t_conversions); + return Handle_Return::handle(); + } else { + return Handle_Return::handle( + call_func(sig, std::index_sequence_for{}, f, params, + t_conversions)); + } +} + +} // namespace detail +} // namespace dispatch + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/register_function.hpp b/src/carbon/command/register_function.hpp new file mode 100644 index 00000000..5fff616b --- /dev/null +++ b/src/carbon/command/register_function.hpp @@ -0,0 +1,129 @@ + +#ifndef CARBON_REGISTER_FUNCTION_HPP +#define CARBON_REGISTER_FUNCTION_HPP + +#include + +#include "bind_first.hpp" +#include "function_signature.hpp" +#include "proxy_functions.hpp" + +namespace Carbon { +namespace dispatch::detail { +template +Param1 get_first_param(Function_Params, Obj &&obj) { + return static_cast(std::forward(obj)); +} + +template +auto make_callable_impl( + Func &&func, Function_Signature, Is_Noexcept, + Is_Member, Is_MemberObject, Is_Object>) { + if constexpr (Is_MemberObject) { + // we now that the Param pack will have only one element, so we are safe + // expanding it here + return Proxy_Function( + Carbon::make_shared< + dispatch::Proxy_Function_Base, + dispatch::Attribute_Access...>>( + std::forward(func))); + } else if constexpr (Is_Member) { + // TODO some kind of bug is preventing forwarding of this noexcept for + // the lambda + auto call = + [func = std::forward(func)]( + auto &&obj, + auto &&...param) /* noexcept(Is_Noexcept) */ -> decltype(auto) { + return ((get_first_param(Function_Params{}, obj).* + func)(std::forward(param)...)); + }; + return Proxy_Function( + Carbon::make_shared>( + std::move(call))); + } else { + return Proxy_Function( + Carbon::make_shared>>( + std::forward(func))); + } +} + +// this version peels off the function object itself from the function +// signature, when used on a callable object +template +auto make_callable(Func &&func, + Function_Signature, + Is_Noexcept, false, false, true>) { + return make_callable_impl( + std::forward(func), + Function_Signature, Is_Noexcept, false, + false, true>{}); +} + +template +auto make_callable( + Func &&func, Function_Signature, Is_Noexcept, + Is_Member, Is_MemberObject, false> + fs) { + return make_callable_impl(std::forward(func), fs); +} +} // namespace dispatch::detail + +/// \brief Creates a new Proxy_Function object from a free function, member +/// function or data member \param[in] t Function / member to expose +/// +/// \b Example: +/// \code +/// int myfunction(const std::string &); +/// class MyClass +/// { +/// public: +/// void memberfunction(); +/// int memberdata; +/// }; +/// +/// Carbon::ChaiScript chai; +/// chai.add(fun(&myfunction), "myfunction"); +/// chai.add(fun(&MyClass::memberfunction), "memberfunction"); +/// chai.add(fun(&MyClass::memberdata), "memberdata"); +/// \endcode +/// +/// \sa \ref adding_functions +template +Proxy_Function fun(T &&t) { + return dispatch::detail::make_callable( + std::forward(t), dispatch::detail::function_signature(t)); +} + +/// \brief Creates a new Proxy_Function object from a free function, member +/// function or data member and binds the first parameter of it \param[in] t +/// Function / member to expose \param[in] q Value to bind to first parameter +/// +/// \b Example: +/// \code +/// struct MyClass +/// { +/// void memberfunction(int); +/// }; +/// +/// MyClass obj; +/// Carbon::ChaiScript chai; +/// // Add function taking only one argument, an int, and permanently bound to +/// "obj" chai.add(fun(&MyClass::memberfunction, std::ref(obj)), +/// "memberfunction"); \endcode +/// +/// \sa \ref adding_functions +template +Proxy_Function fun(T &&t, const Q &q) { + return fun(detail::bind_first(std::forward(t), q)); +} + +} // namespace Carbon + +#endif diff --git a/src/carbon/command/type_conversions.hpp b/src/carbon/command/type_conversions.hpp new file mode 100644 index 00000000..ee2ce7ce --- /dev/null +++ b/src/carbon/command/type_conversions.hpp @@ -0,0 +1,640 @@ + +#ifndef CARBON_DYNAMIC_CAST_CONVERSION_HPP +#define CARBON_DYNAMIC_CAST_CONVERSION_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../threading.hpp" +#include "../utils/static_string.hpp" +#include "bad_boxed_cast.hpp" +#include "boxed_cast_helper.hpp" +#include "boxed_value.hpp" +#include "atom/experiment/type_info.hpp" +#include "atom/experiment/sstring.hpp" + +namespace Carbon { +namespace exception { +/// \brief Error thrown when there's a problem with type conversion +class conversion_error : public bad_boxed_cast { +public: + conversion_error(const Type_Info t_to, const Type_Info t_from, + const utility::Static_String what) noexcept + : bad_boxed_cast(t_from, (*t_to.bare_type_info()), what), + type_to(t_to) {} + + Type_Info type_to; +}; + +class bad_boxed_dynamic_cast : public bad_boxed_cast { +public: + bad_boxed_dynamic_cast(const Type_Info &t_from, const std::type_info &t_to, + const utility::Static_String &t_what) noexcept + : bad_boxed_cast(t_from, t_to, t_what) {} + + bad_boxed_dynamic_cast(const Type_Info &t_from, + const std::type_info &t_to) noexcept + : bad_boxed_cast(t_from, t_to) {} + + explicit bad_boxed_dynamic_cast(const utility::Static_String &w) noexcept + : bad_boxed_cast(w) {} + + bad_boxed_dynamic_cast(const bad_boxed_dynamic_cast &) = default; + + ~bad_boxed_dynamic_cast() noexcept override = default; +}; + +class bad_boxed_type_cast : public bad_boxed_cast { +public: + bad_boxed_type_cast(const Type_Info &t_from, const std::type_info &t_to, + const utility::Static_String &t_what) noexcept + : bad_boxed_cast(t_from, t_to, t_what) {} + + bad_boxed_type_cast(const Type_Info &t_from, + const std::type_info &t_to) noexcept + : bad_boxed_cast(t_from, t_to) {} + + explicit bad_boxed_type_cast(const utility::Static_String &w) noexcept + : bad_boxed_cast(w) {} + + bad_boxed_type_cast(const bad_boxed_type_cast &) = default; + + ~bad_boxed_type_cast() noexcept override = default; +}; +} // namespace exception + +namespace detail { +class Type_Conversion_Base { +public: + virtual Boxed_Value convert(const Boxed_Value &from) const = 0; + virtual Boxed_Value convert_down(const Boxed_Value &to) const = 0; + + const Type_Info &to() const noexcept { return m_to; } + const Type_Info &from() const noexcept { return m_from; } + + virtual bool bidir() const noexcept { return true; } + + virtual ~Type_Conversion_Base() = default; + +protected: + Type_Conversion_Base(Type_Info t_to, Type_Info t_from) + : m_to(std::move(t_to)), m_from(std::move(t_from)) {} + +private: + const Type_Info m_to; + const Type_Info m_from; +}; + +template +class Static_Caster { +public: + static Boxed_Value cast(const Boxed_Value &t_from) { + if (t_from.get_type_info().bare_equal(Carbon::user_type())) { + if (t_from.is_pointer()) { + // Dynamic cast out the contained boxed value, which we know is + // the type we want + if (t_from.is_const()) { + return Boxed_Value([&]() { + if (auto data = std::static_pointer_cast( + detail::Cast_Helper>::cast(t_from, nullptr))) { + return data; + } else { + throw std::bad_cast(); + } + }()); + } else { + return Boxed_Value([&]() { + if (auto data = std::static_pointer_cast( + detail::Cast_Helper< + std::shared_ptr>::cast(t_from, + nullptr))) { + return data; + } else { + throw std::bad_cast(); + } + }()); + } + } else { + // Pull the reference out of the contained boxed value, which we + // know is the type we want + if (t_from.is_const()) { + const From &d = detail::Cast_Helper::cast( + t_from, nullptr); + const To &data = static_cast(d); + return Boxed_Value(std::cref(data)); + } else { + From &d = + detail::Cast_Helper::cast(t_from, nullptr); + To &data = static_cast(d); + return Boxed_Value(std::ref(data)); + } + } + } else { + throw Carbon::exception::bad_boxed_dynamic_cast( + t_from.get_type_info(), typeid(To), + "Unknown dynamic_cast_conversion"); + } + } +}; + +template +class Dynamic_Caster { +public: + static Boxed_Value cast(const Boxed_Value &t_from) { + if (t_from.get_type_info().bare_equal(Carbon::user_type())) { + if (t_from.is_pointer()) { + // Dynamic cast out the contained boxed value, which we know is + // the type we want + if (t_from.is_const()) { + return Boxed_Value([&]() { + if (auto data = std::dynamic_pointer_cast( + detail::Cast_Helper>::cast(t_from, nullptr))) { + return data; + } else { + throw std::bad_cast(); + } + }()); + } else { + return Boxed_Value([&]() { + if (auto data = std::dynamic_pointer_cast( + detail::Cast_Helper< + std::shared_ptr>::cast(t_from, + nullptr))) { + return data; + } else { +#ifdef CARBON_LIBCPP + /// \todo fix this someday after libc++ is fixed. + if (std::string(typeid(To).name()) + .find("Assignable_Proxy_Function") != + std::string::npos) { + auto from = detail::Cast_Helper< + std::shared_ptr>::cast(t_from, + nullptr); + if (std::string(typeid(*from).name()) + .find( + "Assignable_Proxy_Function_Impl") != + std::string::npos) { + return std::static_pointer_cast(from); + } + } +#endif + throw std::bad_cast(); + } + }()); + } + } else { + // Pull the reference out of the contained boxed value, which we + // know is the type we want + if (t_from.is_const()) { + const From &d = detail::Cast_Helper::cast( + t_from, nullptr); + const To &data = dynamic_cast(d); + return Boxed_Value(std::cref(data)); + } else { + From &d = + detail::Cast_Helper::cast(t_from, nullptr); + To &data = dynamic_cast(d); + return Boxed_Value(std::ref(data)); + } + } + } else { + throw Carbon::exception::bad_boxed_dynamic_cast( + t_from.get_type_info(), typeid(To), + "Unknown dynamic_cast_conversion"); + } + } +}; + +template +class Dynamic_Conversion_Impl : public Type_Conversion_Base { +public: + Dynamic_Conversion_Impl() + : Type_Conversion_Base(Carbon::user_type(), + Carbon::user_type()) {} + + Boxed_Value convert_down(const Boxed_Value &t_base) const override { + return Dynamic_Caster::cast(t_base); + } + + Boxed_Value convert(const Boxed_Value &t_derived) const override { + return Static_Caster::cast(t_derived); + } +}; + +template +class Static_Conversion_Impl : public Type_Conversion_Base { +public: + Static_Conversion_Impl() + : Type_Conversion_Base(Carbon::user_type(), + Carbon::user_type()) {} + + Boxed_Value convert_down(const Boxed_Value &t_base) const override { + throw Carbon::exception::bad_boxed_dynamic_cast( + t_base.get_type_info(), typeid(Derived), + "Unable to cast down inheritance hierarchy with non-polymorphic " + "types"); + } + + bool bidir() const noexcept override { return false; } + + Boxed_Value convert(const Boxed_Value &t_derived) const override { + return Static_Caster::cast(t_derived); + } +}; + +template +class Type_Conversion_Impl : public Type_Conversion_Base { +public: + Type_Conversion_Impl(Type_Info t_from, Type_Info t_to, Callable t_func) + : Type_Conversion_Base(t_to, t_from), m_func(std::move(t_func)) {} + + Boxed_Value convert_down(const Boxed_Value &) const override { + throw Carbon::exception::bad_boxed_type_cast("No conversion exists"); + } + + Boxed_Value convert(const Boxed_Value &t_from) const override { + /// \todo better handling of errors from the conversion function + return m_func(t_from); + } + + bool bidir() const noexcept override { return false; } + +private: + Callable m_func; +}; +} // namespace detail + +class Type_Conversions { +public: + struct Conversion_Saves { + bool enabled = false; + std::vector saves; + }; + + struct Less_Than { + bool operator()(const std::type_info *t_lhs, + const std::type_info *t_rhs) const noexcept { + return *t_lhs != *t_rhs && t_lhs->before(*t_rhs); + } + }; + + Type_Conversions() + : m_mutex(), m_conversions(), m_convertableTypes(), m_num_types(0) {} + + Type_Conversions(const Type_Conversions &t_other) = delete; + Type_Conversions(Type_Conversions &&) = delete; + + Type_Conversions &operator=(const Type_Conversions &) = delete; + Type_Conversions &operator=(Type_Conversions &&) = delete; + + const std::set &thread_cache() const { + auto &cache = *m_thread_cache; + if (cache.size() != m_num_types) { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + cache = m_convertableTypes; + } + + return cache; + } + + void add_conversion( + const std::shared_ptr &conversion) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + if (find_bidir(conversion->to(), conversion->from()) != + m_conversions.end()) { + throw exception::conversion_error( + conversion->to(), conversion->from(), + "Trying to re-insert an existing conversion!"); + } + m_conversions.insert(conversion); + m_convertableTypes.insert({conversion->to().bare_type_info(), + conversion->from().bare_type_info()}); + m_num_types = m_convertableTypes.size(); + } + + template + bool convertable_type() const noexcept { + const auto type = user_type().bare_type_info(); + return thread_cache().count(type) != 0; + } + + template + bool converts() const noexcept { + return converts(user_type(), user_type()); + } + + bool converts(const Type_Info &to, const Type_Info &from) const noexcept { + const auto &types = thread_cache(); + if (types.count(to.bare_type_info()) != 0 && + types.count(from.bare_type_info()) != 0) { + return has_conversion(to, from); + } else { + return false; + } + } + + template + Boxed_Value boxed_type_conversion(Conversion_Saves &t_saves, + const Boxed_Value &from) const { + return boxed_type_conversion(user_type(), t_saves, from); + } + + template + Boxed_Value boxed_type_down_conversion(Conversion_Saves &t_saves, + const Boxed_Value &to) const { + return boxed_type_down_conversion(user_type(), t_saves, to); + } + + Boxed_Value boxed_type_conversion(const Type_Info &to, + Conversion_Saves &t_saves, + const Boxed_Value &from) const { + try { + Boxed_Value ret = + get_conversion(to, from.get_type_info())->convert(from); + if (t_saves.enabled) { + t_saves.saves.push_back(ret); + } + return ret; + } catch (const std::out_of_range &) { + throw exception::bad_boxed_dynamic_cast(from.get_type_info(), + *to.bare_type_info(), + "No known conversion"); + } catch (const std::bad_cast &) { + throw exception::bad_boxed_dynamic_cast( + from.get_type_info(), *to.bare_type_info(), + "Unable to perform dynamic_cast operation"); + } + } + + Boxed_Value boxed_type_down_conversion(const Type_Info &from, + Conversion_Saves &t_saves, + const Boxed_Value &to) const { + try { + Boxed_Value ret = + get_conversion(to.get_type_info(), from)->convert_down(to); + if (t_saves.enabled) { + t_saves.saves.push_back(ret); + } + return ret; + } catch (const std::out_of_range &) { + throw exception::bad_boxed_dynamic_cast(to.get_type_info(), + *from.bare_type_info(), + "No known conversion"); + } catch (const std::bad_cast &) { + throw exception::bad_boxed_dynamic_cast( + to.get_type_info(), *from.bare_type_info(), + "Unable to perform dynamic_cast operation"); + } + } + + static void enable_conversion_saves(Conversion_Saves &t_saves, bool t_val) { + t_saves.enabled = t_val; + } + + std::vector take_saves(Conversion_Saves &t_saves) { + std::vector ret; + std::swap(ret, t_saves.saves); + return ret; + } + + bool has_conversion(const Type_Info &to, const Type_Info &from) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + return find_bidir(to, from) != m_conversions.end(); + } + + std::shared_ptr get_conversion( + const Type_Info &to, const Type_Info &from) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto itr = find(to, from); + + if (itr != m_conversions.end()) { + return *itr; + } else { + throw std::out_of_range( + std::string("No such conversion exists from ") + + from.bare_name() + " to " + to.bare_name()); + } + } + + Conversion_Saves &conversion_saves() const noexcept { + return *m_conversion_saves; + } + +private: + std::set>::const_iterator + find_bidir(const Type_Info &to, const Type_Info &from) const { + return std::find_if( + m_conversions.begin(), m_conversions.end(), + [&to, &from]( + const std::shared_ptr &conversion) + -> bool { + return (conversion->to().bare_equal(to) && + conversion->from().bare_equal(from)) || + (conversion->bidir() && + conversion->from().bare_equal(to) && + conversion->to().bare_equal(from)); + }); + } + + std::set>::const_iterator + find(const Type_Info &to, const Type_Info &from) const { + return std::find_if( + m_conversions.begin(), m_conversions.end(), + [&to, &from](const std::shared_ptr + &conversion) { + return conversion->to().bare_equal(to) && + conversion->from().bare_equal(from); + }); + } + + std::set> get_conversions() + const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return m_conversions; + } + + mutable Carbon::detail::threading::shared_mutex m_mutex; + std::set> m_conversions; + std::set m_convertableTypes; + std::atomic_size_t m_num_types; + mutable Carbon::detail::threading::Thread_Storage< + std::set> + m_thread_cache; + mutable Carbon::detail::threading::Thread_Storage + m_conversion_saves; +}; + +class Type_Conversions_State { +public: + Type_Conversions_State(const Type_Conversions &t_conversions, + Type_Conversions::Conversion_Saves &t_saves) + : m_conversions(t_conversions), m_saves(t_saves) {} + + const Type_Conversions *operator->() const noexcept { + return &m_conversions.get(); + } + + const Type_Conversions *get() const noexcept { + return &m_conversions.get(); + } + + Type_Conversions::Conversion_Saves &saves() const noexcept { + return m_saves; + } + +private: + std::reference_wrapper m_conversions; + std::reference_wrapper m_saves; +}; + +using Type_Conversion = std::shared_ptr; + +/// \brief Used to register a to / parent class relationship with ChaiScript. +/// Necessary if you +/// want automatic conversions up your inheritance hierarchy. +/// +/// Create a new to class registration for applying to a module or to the +/// ChaiScript engine Currently, due to limitations in module loading on +/// Windows, and for the sake of portability, if you have a type that is +/// introduced in a loadable module and is used by multiple modules (through a +/// tertiary dll that is shared between the modules, static linking the new type +/// into both loadable modules would not be portable), you need to register the +/// type relationship in all modules that use the newly added type in a +/// polymorphic way. +/// +/// Example: +/// \code +/// class Base +/// {}; +/// class Derived : public Base +/// {}; +/// +/// Carbon::ChaiScript chai; +/// chai.add(Carbon::to_class()); +/// \endcode +/// +template +Type_Conversion base_class() { + // Can only be used with related polymorphic types + // may be expanded some day to support conversions other than child -> + // parent + static_assert(std::is_base_of::value, + "Classes are not related by inheritance"); + + if constexpr (std::is_polymorphic::value && + std::is_polymorphic::value) { + return Carbon::make_shared< + detail::Type_Conversion_Base, + detail::Dynamic_Conversion_Impl>(); + } else { + return Carbon::make_shared< + detail::Type_Conversion_Base, + detail::Static_Conversion_Impl>(); + } +} + +template +Type_Conversion type_conversion(const Type_Info &t_from, const Type_Info &t_to, + const Callable &t_func) { + return Carbon::make_shared>( + t_from, t_to, t_func); +} + +template +Type_Conversion type_conversion(const Callable &t_function) { + auto func = [t_function](const Boxed_Value &t_bv) -> Boxed_Value { + // not even attempting to call boxed_cast so that we don't get caught in + // some call recursion + return Carbon::Boxed_Value( + t_function(detail::Cast_Helper::cast(t_bv, nullptr))); + }; + + return Carbon::make_shared>( + user_type(), user_type(), func); +} + +template +Type_Conversion type_conversion() { + static_assert(std::is_convertible::value, + "Types are not automatically convertible"); + auto func = [](const Boxed_Value &t_bv) -> Boxed_Value { + // not even attempting to call boxed_cast so that we don't get caught in + // some call recursion + return Carbon::Boxed_Value( + To(detail::Cast_Helper::cast(t_bv, nullptr))); + }; + + return Carbon::make_shared>( + user_type(), user_type(), func); +} + +template +Type_Conversion vector_conversion() { + auto func = [](const Boxed_Value &t_bv) -> Boxed_Value { + const std::vector &from_vec = + detail::Cast_Helper &>::cast( + t_bv, nullptr); + + To vec; + vec.reserve(from_vec.size()); + for (const Boxed_Value &bv : from_vec) { + vec.push_back(detail::Cast_Helper::cast( + bv, nullptr)); + } + + return Boxed_Value(std::move(vec)); + }; + + return Carbon::make_shared>( + user_type>(), user_type(), func); +} + +template +Type_Conversion map_conversion() { + auto func = [](const Boxed_Value &t_bv) -> Boxed_Value { + const std::map &from_map = + detail::Cast_Helper< + const std::map &>::cast(t_bv, + nullptr); + + To map; + for (const std::pair &p : from_map) { + map.insert(std::make_pair( + p.first, detail::Cast_Helper::cast( + p.second, nullptr))); + } + + return Boxed_Value(std::move(map)); + }; + + return Carbon::make_shared>( + user_type>(), user_type(), func); +} +} // namespace Carbon + +#endif diff --git a/src/carbon/defines.hpp b/src/carbon/defines.hpp new file mode 100644 index 00000000..bd192bb7 --- /dev/null +++ b/src/carbon/defines.hpp @@ -0,0 +1,273 @@ + +#ifndef CARBON_DEFINES_HPP +#define CARBON_DEFINES_HPP + +#ifdef _MSC_VER +#define CARBON_STRINGIZE(x) "" #x +#define CARBON_STRINGIZE_EXPANDED(x) CARBON_STRINGIZE(x) +#define CARBON_COMPILER_VERSION CARBON_STRINGIZE_EXPANDED(_MSC_FULL_VER) +#define CARBON_MSVC _MSC_VER +#define CARBON_HAS_DECLSPEC + +static_assert(_MSC_FULL_VER >= 190024210, + "Visual C++ 2015 Update 3 or later required"); + +#else +#define CARBON_COMPILER_VERSION __VERSION__ +#endif + +#include +#include + +#if defined(_LIBCPP_VERSION) +#define CARBON_LIBCPP +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +#define CARBON_WINDOWS +#endif + +#if defined(_WIN32) +#if defined(__llvm__) +#define CARBON_COMPILER_NAME "clang(windows)" +#elif defined(__GNUC__) +#define CARBON_COMPILER_NAME "gcc(mingw)" +#else +#define CARBON_COMPILER_NAME "msvc" +#endif +#else +#if defined(__llvm__) +#define CARBON_COMPILER_NAME "clang" +#elif defined(__GNUC__) +#define CARBON_COMPILER_NAME "gcc" +#else +#define CARBON_COMPILER_NAME "unknown" +#endif +#endif + +#if defined(__llvm__) +#define CARBON_CLANG +#endif + +#ifdef CARBON_HAS_DECLSPEC +#define CARBON_MODULE_EXPORT extern "C" __declspec(dllexport) +#else +#define CARBON_MODULE_EXPORT extern "C" +#endif + +#if defined(CARBON_MSVC) || (defined(__GNUC__) && __GNUC__ >= 5) || \ + defined(CARBON_CLANG) +#define CARBON_UTF16_UTF32 +#endif + +#ifdef _DEBUG +#define CARBON_DEBUG true +#else +#define CARBON_DEBUG false +#endif + +#include +#include +#include + +namespace Carbon { +constexpr static const int version_major = 7; +constexpr static const int version_minor = 0; +constexpr static const int version_patch = 0; + +constexpr static const char *compiler_version = CARBON_COMPILER_VERSION; +constexpr static const char *compiler_name = CARBON_COMPILER_NAME; +constexpr static const bool debug_build = CARBON_DEBUG; + +template +inline std::shared_ptr make_shared(Arg &&...arg) { +#ifdef CARBON_USE_STD_MAKE_SHARED + return std::make_shared(std::forward(arg)...); +#else + return std::shared_ptr( + static_cast(new D(std::forward(arg)...))); +#endif +} + +template +inline std::unique_ptr make_unique(Arg &&...arg) { +#ifdef CARBON_USE_STD_MAKE_SHARED + return std::make_unique(std::forward(arg)...); +#else + return std::unique_ptr( + static_cast(new D(std::forward(arg)...))); +#endif +} + +struct Build_Info { + [[nodiscard]] constexpr static int version_major() noexcept { + return Carbon::version_major; + } + + [[nodiscard]] constexpr static int version_minor() noexcept { + return Carbon::version_minor; + } + + [[nodiscard]] constexpr static int version_patch() noexcept { + return Carbon::version_patch; + } + + [[nodiscard]] static std::string version() { + return std::to_string(version_major()) + '.' + + std::to_string(version_minor()) + '.' + + std::to_string(version_patch()); + } + + [[nodiscard]] static std::string compiler_id() { + return compiler_name() + '-' + compiler_version(); + } + + [[nodiscard]] static std::string build_id() { + return compiler_id() + (debug_build() ? "-Debug" : "-Release"); + } + + [[nodiscard]] static std::string compiler_version() { + return Carbon::compiler_version; + } + + [[nodiscard]] static std::string compiler_name() { + return Carbon::compiler_name; + } + + [[nodiscard]] constexpr static bool debug_build() noexcept { + return Carbon::debug_build; + } +}; + +template +[[nodiscard]] constexpr auto parse_num(const std::string_view t_str) noexcept -> + typename std::enable_if::value, T>::type { + T t = 0; + for (const auto c : t_str) { + if (c < '0' || c > '9') { + return t; + } + t *= 10; + t += c - '0'; + } + return t; +} + +template +[[nodiscard]] auto parse_num(const std::string_view t_str) -> + typename std::enable_if::value, T>::type { + T t = 0; + T base{}; + T decimal_place = 0; + int exponent = 0; + + for (const auto c : t_str) { + switch (c) { + case '.': + decimal_place = 10; + break; + case 'e': + case 'E': + exponent = 1; + decimal_place = 0; + base = t; + t = 0; + break; + case '-': + exponent = -1; + break; + case '+': + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (decimal_place < 10) { + t *= 10; + t += static_cast(c - '0'); + } else { + t += static_cast(c - '0') / decimal_place; + decimal_place *= 10; + } + break; + default: + break; + } + } + return exponent ? base * std::pow(T(10), t * static_cast(exponent)) : t; +} + +struct str_equal { + [[nodiscard]] bool operator()(const std::string &t_lhs, + const std::string &t_rhs) const noexcept { + return t_lhs == t_rhs; + } + template + [[nodiscard]] constexpr bool operator()(const LHS &t_lhs, + const RHS &t_rhs) const noexcept { + return std::equal(t_lhs.begin(), t_lhs.end(), t_rhs.begin(), + t_rhs.end()); + } + struct is_transparent {}; +}; + +struct str_less { + [[nodiscard]] bool operator()(const std::string &t_lhs, + const std::string &t_rhs) const noexcept { + return t_lhs < t_rhs; + } + template + [[nodiscard]] constexpr bool operator()(const LHS &t_lhs, + const RHS &t_rhs) const noexcept { + return std::lexicographical_compare(t_lhs.begin(), t_lhs.end(), + t_rhs.begin(), t_rhs.end()); + } + struct is_transparent {}; +}; + +enum class Options { + No_Load_Modules, + Load_Modules, + No_External_Scripts, + External_Scripts +}; + +template +struct is_nothrow_forward_constructible + : std::bool_constant()})> {}; + +template +static inline constexpr bool is_nothrow_forward_constructible_v = + is_nothrow_forward_constructible::value; + +template +[[nodiscard]] constexpr auto make_container(T &&...t) { + Container c; + c.reserve(sizeof...(t)); + (c.push_back(std::forward(t)), ...); + return c; +} + +template +[[nodiscard]] auto make_vector(T &&...t) + -> std::vector...>> { + using container_type = std::vector...>>; + + return make_container(std::forward(t)...); +} + +[[nodiscard]] inline std::vector default_options() { +#ifdef CARBON_NO_DYNLOAD + return {Options::No_Load_Modules, Options::External_Scripts}; +#else + return {Options::Load_Modules, Options::External_Scripts}; +#endif +} +} // namespace Carbon +#endif diff --git a/src/carbon/language/algebraic.hpp b/src/carbon/language/algebraic.hpp new file mode 100644 index 00000000..0c9ef642 --- /dev/null +++ b/src/carbon/language/algebraic.hpp @@ -0,0 +1,164 @@ + + +#ifndef CARBON_ALGEBRAIC_HPP +#define CARBON_ALGEBRAIC_HPP + +#include "../utils/hash.hpp" + +#include + +namespace Carbon { +struct Operators { + enum class Opers { + equals, + less_than, + greater_than, + less_than_equal, + greater_than_equal, + not_equal, + assign, + pre_increment, + pre_decrement, + assign_product, + assign_sum, + assign_quotient, + assign_difference, + assign_bitwise_and, + assign_bitwise_or, + assign_shift_left, + assign_shift_right, + assign_remainder, + assign_bitwise_xor, + shift_left, + shift_right, + remainder, + bitwise_and, + bitwise_or, + bitwise_xor, + bitwise_complement, + sum, + quotient, + product, + difference, + unary_plus, + unary_minus, + invalid + }; + + constexpr static const char *to_string(Opers t_oper) noexcept { + constexpr const char *opers[] = { + "", "==", "<", ">", "<=", ">=", "!=", "", "=", "++", + "--", "*=", "+=", "/=", "-=", "", "&=", "|=", "<<=", ">>=", + "%=", "^=", "", "<<", ">>", "%", "&", "|", "^", "~", + "", "+", "/", "*", "-", "+", "-", ""}; + return opers[static_cast(t_oper)]; + } + + constexpr static Opers to_operator(std::string_view t_str, + bool t_is_unary = false) noexcept { +#ifdef CARBON_MSVC +#pragma warning(push) +#pragma warning(disable : 4307) +#endif + + const auto op_hash = utility::hash(t_str); + switch (op_hash) { + case utility::hash("=="): { + return Opers::equals; + } + case utility::hash("<"): { + return Opers::less_than; + } + case utility::hash(">"): { + return Opers::greater_than; + } + case utility::hash("<="): { + return Opers::less_than_equal; + } + case utility::hash(">="): { + return Opers::greater_than_equal; + } + case utility::hash("!="): { + return Opers::not_equal; + } + case utility::hash("="): { + return Opers::assign; + } + case utility::hash("++"): { + return Opers::pre_increment; + } + case utility::hash("--"): { + return Opers::pre_decrement; + } + case utility::hash("*="): { + return Opers::assign_product; + } + case utility::hash("+="): { + return Opers::assign_sum; + } + case utility::hash("-="): { + return Opers::assign_difference; + } + case utility::hash("&="): { + return Opers::assign_bitwise_and; + } + case utility::hash("|="): { + return Opers::assign_bitwise_or; + } + case utility::hash("<<="): { + return Opers::assign_shift_left; + } + case utility::hash(">>="): { + return Opers::assign_shift_right; + } + case utility::hash("%="): { + return Opers::assign_remainder; + } + case utility::hash("^="): { + return Opers::assign_bitwise_xor; + } + case utility::hash("<<"): { + return Opers::shift_left; + } + case utility::hash(">>"): { + return Opers::shift_right; + } + case utility::hash("%"): { + return Opers::remainder; + } + case utility::hash("&"): { + return Opers::bitwise_and; + } + case utility::hash("|"): { + return Opers::bitwise_or; + } + case utility::hash("^"): { + return Opers::bitwise_xor; + } + case utility::hash("~"): { + return Opers::bitwise_complement; + } + case utility::hash("+"): { + return t_is_unary ? Opers::unary_plus : Opers::sum; + } + case utility::hash("-"): { + return t_is_unary ? Opers::unary_minus : Opers::difference; + } + case utility::hash("/"): { + return Opers::quotient; + } + case utility::hash("*"): { + return Opers::product; + } + default: { + return Opers::invalid; + } + } +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + } +}; +} // namespace Carbon + +#endif /* _CARBON_ALGEBRAIC_HPP */ diff --git a/src/carbon/language/common.hpp b/src/carbon/language/common.hpp new file mode 100644 index 00000000..eba2bbd6 --- /dev/null +++ b/src/carbon/language/common.hpp @@ -0,0 +1,748 @@ + + +#ifndef CARBON_COMMON_HPP +#define CARBON_COMMON_HPP + +#include +#include +#include +#include +#include +#include + +#include +#include "../defines.hpp" +#include "../command/boxed_value.hpp" +#include "../command/dispatchkit.hpp" +#include "../command/proxy_functions.hpp" +#include "../command/type_info.hpp" + +namespace Carbon { +struct AST_Node; +struct AST_Node_Trace; +namespace exception { +struct eval_error; +} +} // namespace Carbon + +namespace Carbon { +struct Name_Validator { + template + static bool is_reserved_word(const T &s) noexcept { + const static std::unordered_set words{ + utility::hash("def"), utility::hash("fun"), + utility::hash("while"), utility::hash("for"), + utility::hash("if"), utility::hash("else"), + utility::hash("&&"), utility::hash("||"), + utility::hash(","), utility::hash("auto"), + utility::hash("return"), utility::hash("break"), + utility::hash("true"), utility::hash("false"), + utility::hash("class"), utility::hash("attr"), + utility::hash("var"), utility::hash("global"), + utility::hash("GLOBAL"), utility::hash("_"), + utility::hash("__LINE__"), utility::hash("__FILE__"), + utility::hash("__FUNC__"), utility::hash("__CLASS__")}; + + return words.count(utility::hash(s)) == 1; + } + + template + static bool valid_object_name(const T &name) noexcept { + return name.find("::") == std::string::npos && !is_reserved_word(name); + } + + template + static void validate_object_name(const T &name) { + if (is_reserved_word(name)) { + throw exception::reserved_word_error(std::string(name)); + } + + if (name.find("::") != std::string::npos) { + throw exception::illegal_name_error(std::string(name)); + } + } +}; + +/// Signature of module entry point that all binary loadable modules must +/// implement. +using Create_Module_Func = ModulePtr (*)(); + +/// Types of AST nodes available to the parser and eval +enum class AST_Node_Type { + Id, + Fun_Call, + Unused_Return_Fun_Call, + Arg_List, + Equation, + Var_Decl, + Assign_Decl, + Array_Call, + Dot_Access, + Lambda, + Block, + Scopeless_Block, + Def, + While, + If, + For, + Ranged_For, + Inline_Array, + Inline_Map, + Return, + File, + Prefix, + Break, + Continue, + Map_Pair, + Value_Range, + Inline_Range, + Try, + Catch, + Finally, + Method, + Attr_Decl, + Logical_And, + Logical_Or, + Reference, + Switch, + Case, + Default, + Noop, + Class, + Binary, + Arg, + Global_Decl, + Constant, + Compiled +}; + +enum class Operator_Precedence { + Ternary_Cond, + Logical_Or, + Logical_And, + Bitwise_Or, + Bitwise_Xor, + Bitwise_And, + Equality, + Comparison, + Shift, + Addition, + Multiplication, + Prefix +}; + +namespace { +/// Helper lookup to get the name of each node type +constexpr const char *ast_node_type_to_string( + AST_Node_Type ast_node_type) noexcept { + constexpr const char *const ast_node_types[] = { + "Id", "Fun_Call", "Unused_Return_Fun_Call", + "Arg_List", "Equation", "Var_Decl", + "Assign_Decl", "Array_Call", "Dot_Access", + "Lambda", "Block", "Scopeless_Block", + "Def", "While", "If", + "For", "Ranged_For", "Inline_Array", + "Inline_Map", "Return", "File", + "Prefix", "Break", "Continue", + "Map_Pair", "Value_Range", "Inline_Range", + "Try", "Catch", "Finally", + "Method", "Attr_Decl", "Logical_And", + "Logical_Or", "Reference", "Switch", + "Case", "Default", "Noop", + "Class", "Binary", "Arg", + "Global_Decl", "Constant", "Compiled"}; + + return ast_node_types[static_cast(ast_node_type)]; +} +} // namespace + +/// \brief Convenience type for file positions +struct File_Position { + int line = 0; + int column = 0; + + constexpr File_Position(int t_file_line, int t_file_column) noexcept + : line(t_file_line), column(t_file_column) {} + + constexpr File_Position() noexcept = default; +}; + +struct Parse_Location { + Parse_Location(std::string t_fname = "", const int t_start_line = 0, + const int t_start_col = 0, const int t_end_line = 0, + const int t_end_col = 0) + : start(t_start_line, t_start_col), + end(t_end_line, t_end_col), + filename(std::make_shared(std::move(t_fname))) {} + + Parse_Location(std::shared_ptr t_fname, + const int t_start_line = 0, const int t_start_col = 0, + const int t_end_line = 0, const int t_end_col = 0) + : start(t_start_line, t_start_col), + end(t_end_line, t_end_col), + filename(std::move(t_fname)) {} + + File_Position start; + File_Position end; + std::shared_ptr filename; +}; + +/// \brief Struct that doubles as both a parser ast_node and an AST node. +struct AST_Node { +public: + const AST_Node_Type identifier; + const std::string text; + Parse_Location location; + + const std::string &filename() const noexcept { return *location.filename; } + + const File_Position &start() const noexcept { return location.start; } + + const File_Position &end() const noexcept { return location.end; } + + std::string pretty_print() const { + std::ostringstream oss; + + oss << text; + + for (auto &elem : get_children()) { + oss << elem.get().pretty_print() << ' '; + } + + return oss.str(); + } + + virtual std::vector> get_children() + const = 0; + virtual Boxed_Value eval( + const Carbon::detail::Dispatch_State &t_e) const = 0; + + /// Prints the contents of an AST node, including its children, recursively + std::string to_string(const std::string &t_prepend = "") const { + std::ostringstream oss; + + oss << t_prepend << "(" << ast_node_type_to_string(this->identifier) + << ") " << this->text << " : " << this->location.start.line << ", " + << this->location.start.column << '\n'; + + for (auto &elem : get_children()) { + oss << elem.get().to_string(t_prepend + " "); + } + return oss.str(); + } + + static inline bool get_bool_condition( + const Boxed_Value &t_bv, + const Carbon::detail::Dispatch_State &t_ss); + + virtual ~AST_Node() noexcept = default; + AST_Node(AST_Node &&) = default; + AST_Node &operator=(AST_Node &&) = delete; + AST_Node(const AST_Node &) = delete; + AST_Node &operator=(const AST_Node &) = delete; + +protected: + AST_Node(std::string t_ast_node_text, AST_Node_Type t_id, + Parse_Location t_loc) + : identifier(t_id), + text(std::move(t_ast_node_text)), + location(std::move(t_loc)) {} +}; + +/// \brief Typedef for pointers to AST_Node objects. Used in building of the +/// AST_Node tree +using AST_NodePtr = std::unique_ptr; +using AST_NodePtr_Const = std::unique_ptr; + +struct AST_Node_Trace { + const AST_Node_Type identifier; + const std::string text; + Parse_Location location; + + const std::string &filename() const noexcept { return *location.filename; } + + const File_Position &start() const noexcept { return location.start; } + + const File_Position &end() const noexcept { return location.end; } + + std::string pretty_print() const { + std::ostringstream oss; + + oss << text; + + for (const auto &elem : children) { + oss << elem.pretty_print() << ' '; + } + + return oss.str(); + } + + std::vector get_children(const AST_Node &node) { + const auto node_children = node.get_children(); + return std::vector(node_children.begin(), + node_children.end()); + } + + AST_Node_Trace(const AST_Node &node) + : identifier(node.identifier), + text(node.text), + location(node.location), + children(get_children(node)) {} + + std::vector children; +}; + +/// \brief Classes which may be thrown during error cases when ChaiScript is +/// executing. +namespace exception { +/// \brief Thrown if an error occurs while attempting to load a binary module +struct load_module_error : std::runtime_error { + explicit load_module_error(const std::string &t_reason) + : std::runtime_error(t_reason) {} + + load_module_error(const std::string &t_name, + const std::vector &t_errors) + : std::runtime_error(format_error(t_name, t_errors)) {} + + load_module_error(const load_module_error &) = default; + ~load_module_error() noexcept override = default; + + static std::string format_error( + const std::string &t_name, + const std::vector &t_errors) { + std::stringstream ss; + ss << "Error loading module '" << t_name << "'\n" + << " The following locations were searched:\n"; + + for (const auto &err : t_errors) { + ss << " " << err.what() << "\n"; + } + + return ss.str(); + } +}; + +/// Errors generated during parsing or evaluation +struct eval_error : std::runtime_error { + std::string reason; + File_Position start_position; + std::string filename; + std::string detail; + std::vector call_stack; + + eval_error(const std::string &t_why, const File_Position &t_where, + const std::string &t_fname, + const std::vector &t_parameters, + const std::vector &t_functions, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) noexcept + : std::runtime_error(format(t_why, t_where, t_fname, t_parameters, + t_dot_notation, t_ss)), + reason(t_why), + start_position(t_where), + filename(t_fname), + detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + + eval_error(const std::string &t_why, + const std::vector &t_parameters, + const std::vector &t_functions, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) noexcept + : std::runtime_error(format(t_why, t_parameters, t_dot_notation, t_ss)), + reason(t_why), + detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + + eval_error(const std::string &t_why, const File_Position &t_where, + const std::string &t_fname) noexcept + : std::runtime_error(format(t_why, t_where, t_fname)), + reason(t_why), + start_position(t_where), + filename(t_fname) {} + + explicit eval_error(const std::string &t_why) noexcept + : std::runtime_error("Error: \"" + t_why + "\" "), reason(t_why) {} + + eval_error(const eval_error &) = default; + + std::string pretty_print() const { + std::ostringstream ss; + + ss << what(); + if (!call_stack.empty()) { + ss << "during evaluation at (" << fname(call_stack[0]) << " " + << startpos(call_stack[0]) << ")\n"; + ss << '\n' << detail << '\n'; + ss << " " << fname(call_stack[0]) << " (" + << startpos(call_stack[0]) << ") '" << pretty(call_stack[0]) + << "'"; + for (size_t j = 1; j < call_stack.size(); ++j) { + if (id(call_stack[j]) != Carbon::AST_Node_Type::Block && + id(call_stack[j]) != Carbon::AST_Node_Type::File) { + ss << '\n'; + ss << " from " << fname(call_stack[j]) << " (" + << startpos(call_stack[j]) << ") '" + << pretty(call_stack[j]) << "'"; + } + } + } + ss << '\n'; + return ss.str(); + } + + ~eval_error() noexcept override = default; + +private: + template + static AST_Node_Type id(const T &t) noexcept { + return t.identifier; + } + + template + static std::string pretty(const T &t) { + return t.pretty_print(); + } + + template + static const std::string &fname(const T &t) noexcept { + return t.filename(); + } + + template + static std::string startpos(const T &t) { + std::ostringstream oss; + oss << t.start().line << ", " << t.start().column; + return oss.str(); + } + + static std::string format_why(const std::string &t_why) { + return "Error: \"" + t_why + "\""; + } + + static std::string format_types( + const Const_Proxy_Function &t_func, bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + assert(t_func); + int arity = t_func->get_arity(); + std::vector types = t_func->get_param_types(); + + std::string retval; + if (arity == -1) { + retval = "(...)"; + if (t_dot_notation) { + retval = "(Object)." + retval; + } + } else if (types.size() <= 1) { + retval = "()"; + } else { + std::stringstream ss; + ss << "("; + + std::string paramstr; + + for (size_t index = 1; index != types.size(); ++index) { + paramstr += (types[index].is_const() ? "const " : ""); + paramstr += t_ss.get_type_name(types[index]); + + if (index == 1 && t_dot_notation) { + paramstr += ").("; + if (types.size() == 2) { + paramstr += ", "; + } + } else { + paramstr += ", "; + } + } + + ss << paramstr.substr(0, paramstr.size() - 2); + + ss << ")"; + retval = ss.str(); + } + + std::shared_ptr dynfun = + std::dynamic_pointer_cast( + t_func); + + if (dynfun && dynfun->has_parse_tree()) { + Proxy_Function f = dynfun->get_guard(); + + if (f) { + auto dynfunguard = std::dynamic_pointer_cast< + const dispatch::Dynamic_Proxy_Function>(f); + if (dynfunguard && dynfunguard->has_parse_tree()) { + retval += + " : " + format_guard(dynfunguard->get_parse_tree()); + } + } + + retval += "\n Defined at " + + format_location(dynfun->get_parse_tree()); + } + + return retval; + } + + template + static std::string format_guard(const T &t) { + return t.pretty_print(); + } + + template + static std::string format_location(const T &t) { + std::ostringstream oss; + oss << "(" << t.filename() << " " << t.start().line << ", " + << t.start().column << ")"; + return oss.str(); + } + + static std::string format_detail( + const std::vector &t_functions, + bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + if (t_functions.size() == 1) { + assert(t_functions[0]); + ss << " Expected: " + << format_types(t_functions[0], t_dot_notation, t_ss) << '\n'; + } else { + ss << " " << t_functions.size() << " overloads available:\n"; + + for (const auto &t_function : t_functions) { + ss << " " + << format_types((t_function), t_dot_notation, t_ss) << '\n'; + } + } + + return ss.str(); + } + + static std::string format_parameters( + const std::vector &t_parameters, bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + ss << "("; + + if (!t_parameters.empty()) { + std::string paramstr; + + for (auto itr = t_parameters.begin(); itr != t_parameters.end(); + ++itr) { + paramstr += (itr->is_const() ? "const " : ""); + paramstr += t_ss.type_name(*itr); + + if (itr == t_parameters.begin() && t_dot_notation) { + paramstr += ").("; + if (t_parameters.size() == 1) { + paramstr += ", "; + } + } else { + paramstr += ", "; + } + } + + ss << paramstr.substr(0, paramstr.size() - 2); + } + ss << ")"; + + return ss.str(); + } + + static std::string format_filename(const std::string &t_fname) { + std::stringstream ss; + + if (t_fname != "__EVAL__") { + ss << "in '" << t_fname << "' "; + } else { + ss << "during evaluation "; + } + + return ss.str(); + } + + static std::string format_location(const File_Position &t_where) { + std::stringstream ss; + ss << "at (" << t_where.line << ", " << t_where.column << ")"; + return ss.str(); + } + + static std::string format(const std::string &t_why, + const File_Position &t_where, + const std::string &t_fname, + const std::vector &t_parameters, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << "With parameters: " + << format_parameters(t_parameters, t_dot_notation, t_ss); + ss << " "; + + ss << format_filename(t_fname); + ss << " "; + + ss << format_location(t_where); + + return ss.str(); + } + + static std::string format(const std::string &t_why, + const std::vector &t_parameters, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << "With parameters: " + << format_parameters(t_parameters, t_dot_notation, t_ss); + ss << " "; + + return ss.str(); + } + + static std::string format(const std::string &t_why, + const File_Position &t_where, + const std::string &t_fname) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << format_filename(t_fname); + ss << " "; + + ss << format_location(t_where); + + return ss.str(); + } +}; + +/// Errors generated when loading a file +struct file_not_found_error : std::runtime_error { + explicit file_not_found_error(const std::string &t_filename) + : std::runtime_error("File Not Found: " + t_filename), + filename(t_filename) {} + + file_not_found_error(const file_not_found_error &) = default; + ~file_not_found_error() noexcept override = default; + + std::string filename; +}; + +} // namespace exception + +// static +bool AST_Node::get_bool_condition( + const Boxed_Value &t_bv, const Carbon::detail::Dispatch_State &t_ss) { + try { + return t_ss->boxed_cast(t_bv); + } catch (const exception::bad_boxed_cast &) { + throw exception::eval_error("Condition not boolean"); + } +} + +namespace parser { +class ChaiScript_Parser_Base { +public: + virtual AST_NodePtr parse(const std::string &t_input, + const std::string &t_fname) = 0; + virtual void debug_print(const AST_Node &t, + std::string prepend = "") const = 0; + virtual void *get_tracer_ptr() = 0; + virtual ~ChaiScript_Parser_Base() = default; + ChaiScript_Parser_Base() = default; + ChaiScript_Parser_Base(ChaiScript_Parser_Base &&) = default; + ChaiScript_Parser_Base &operator=(ChaiScript_Parser_Base &&) = delete; + ChaiScript_Parser_Base &operator=(const ChaiScript_Parser_Base &&) = delete; + + template + T &get_tracer() noexcept { + // to do type check this somehow? + return *static_cast(get_tracer_ptr()); + } + +protected: + ChaiScript_Parser_Base(const ChaiScript_Parser_Base &) = default; +}; +} // namespace parser + +namespace eval { +namespace detail { +/// Special type for returned values +struct Return_Value { + Boxed_Value retval; +}; + +/// Special type indicating a call to 'break' +struct Break_Loop {}; + +/// Special type indicating a call to 'continue' +struct Continue_Loop {}; + +/// Creates a new scope then pops it on destruction +struct Scope_Push_Pop { + Scope_Push_Pop(Scope_Push_Pop &&) = default; + Scope_Push_Pop &operator=(Scope_Push_Pop &&) = delete; + Scope_Push_Pop(const Scope_Push_Pop &) = delete; + Scope_Push_Pop &operator=(const Scope_Push_Pop &) = delete; + + explicit Scope_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_scope(m_ds.stack_holder()); + } + + ~Scope_Push_Pop() { m_ds->pop_scope(m_ds.stack_holder()); } + +private: + const Carbon::detail::Dispatch_State &m_ds; +}; + +/// Creates a new function call and pops it on destruction +struct Function_Push_Pop { + Function_Push_Pop(Function_Push_Pop &&) = default; + Function_Push_Pop &operator=(Function_Push_Pop &&) = delete; + Function_Push_Pop(const Function_Push_Pop &) = delete; + Function_Push_Pop &operator=(const Function_Push_Pop &) = delete; + + explicit Function_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); + } + + ~Function_Push_Pop() { + m_ds->pop_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); + } + + void save_params(const Function_Params &t_params) { + m_ds->save_function_params(t_params); + } + +private: + const Carbon::detail::Dispatch_State &m_ds; +}; + +/// Creates a new scope then pops it on destruction +struct Stack_Push_Pop { + Stack_Push_Pop(Stack_Push_Pop &&) = default; + Stack_Push_Pop &operator=(Stack_Push_Pop &&) = delete; + Stack_Push_Pop(const Stack_Push_Pop &) = delete; + Stack_Push_Pop &operator=(const Stack_Push_Pop &) = delete; + + explicit Stack_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_stack(m_ds.stack_holder()); + } + + ~Stack_Push_Pop() { m_ds->pop_stack(m_ds.stack_holder()); } + +private: + const Carbon::detail::Dispatch_State &m_ds; +}; +} // namespace detail +} // namespace eval +} // namespace Carbon + +#endif /* _CARBON_COMMON_HPP */ diff --git a/src/carbon/language/engine.hpp b/src/carbon/language/engine.hpp new file mode 100644 index 00000000..1665a72d --- /dev/null +++ b/src/carbon/language/engine.hpp @@ -0,0 +1,882 @@ + + +#ifndef CARBON_ENGINE_HPP +#define CARBON_ENGINE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../defines.hpp" +#include "../threading.hpp" +#include "../command/boxed_cast_helper.hpp" +#include "../command/boxed_value.hpp" +#include "../command/dispatchkit.hpp" +#include "../command/proxy_functions.hpp" +#include "../command/register_function.hpp" +#include "../command/type_conversions.hpp" +#include "common.hpp" + +#if defined(__linux__) || defined(__unix__) || defined(__APPLE__) || \ + defined(__HAIKU__) +#include +#endif + +#if !defined(CARBON_NO_DYNLOAD) && defined(_POSIX_VERSION) && \ + !defined(__CYGWIN__) +#include +#endif + +#if defined(CARBON_NO_DYNLOAD) +#include "unknown.hpp" +#elif defined(CARBON_WINDOWS) +#include "windows.hpp" +#elif _POSIX_VERSION +#include "posix.hpp" +#else +#include "unknown.hpp" +#endif + +#include "../command/exception_specification.hpp" + +namespace Carbon { +/// Namespace alias to provide cleaner and more explicit syntax to users. +using Namespace = dispatch::Dynamic_Object; + +namespace detail { +using Loadable_Module_Ptr = std::shared_ptr; +} + +/// \brief The main object that the ChaiScript user will use. +class ChaiScript_Basic { + mutable Carbon::detail::threading::shared_mutex m_mutex; + mutable Carbon::detail::threading::recursive_mutex m_use_mutex; + + std::set m_used_files; + std::map m_loaded_modules; + std::set m_active_loaded_modules; + + std::vector m_module_paths; + std::vector m_use_paths; + + std::unique_ptr m_parser; + + Carbon::detail::Dispatch_Engine m_engine; + + std::map> m_namespace_generators; + + /// Evaluates the given string in by parsing it and running the results + /// through the evaluator + Boxed_Value do_eval(const std::string &t_input, + const std::string &t_filename = "__EVAL__", + bool /* t_internal*/ = false) { + try { + const auto p = m_parser->parse(t_input, t_filename); + return p->eval(Carbon::detail::Dispatch_State(m_engine)); + } catch (Carbon::eval::detail::Return_Value &rv) { + return rv.retval; + } + } + + /// Evaluates the given file and looks in the 'use' paths + Boxed_Value internal_eval_file(const std::string &t_filename) { + for (const auto &path : m_use_paths) { + try { + const auto appendedpath = path + t_filename; + return do_eval(load_file(appendedpath), appendedpath, true); + } catch (const exception::file_not_found_error &) { + // failed to load, try the next path + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } + } + + // failed to load by any name + throw exception::file_not_found_error(t_filename); + } + + /// Evaluates the given string, used during eval() inside of a script + Boxed_Value internal_eval(const std::string &t_e) { + try { + return do_eval(t_e, "__EVAL__", true); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } + } + + /// Returns the current evaluation m_engine + Carbon::detail::Dispatch_Engine &get_eval_engine() noexcept { + return m_engine; + } + + /// Builds all the requirements for ChaiScript, including its evaluator and + /// a run of its prelude. + void build_eval_system(const ModulePtr &t_lib, + const std::vector &t_opts) { + if (t_lib) { + add(t_lib); + } + + m_engine.add(fun([this]() { m_engine.dump_system(); }), "dump_system"); + m_engine.add(fun([this](const Boxed_Value &t_bv) { + m_engine.dump_object(t_bv); + }), + "dump_object"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_type) { + return m_engine.is_type(t_bv, t_type); + }), + "is_type"); + m_engine.add(fun([this](const Boxed_Value &t_bv) { + return m_engine.type_name(t_bv); + }), + "type_name"); + m_engine.add(fun([this](const std::string &t_f) { + return m_engine.function_exists(t_f); + }), + "function_exists"); + m_engine.add(fun([this]() { return m_engine.get_function_objects(); }), + "get_functions"); + m_engine.add(fun([this]() { return m_engine.get_scripting_objects(); }), + "get_objects"); + + m_engine.add(dispatch::make_dynamic_proxy_function( + [this](const Function_Params &t_params) { + return m_engine.call_exists(t_params); + }), + "call_exists"); + + m_engine.add( + fun([this]( + const dispatch::Proxy_Function_Base &t_fun, + const std::vector &t_params) -> Boxed_Value { + Type_Conversions_State s( + this->m_engine.conversions(), + this->m_engine.conversions().conversion_saves()); + return t_fun(Function_Params{t_params}, s); + }), + "call"); + + m_engine.add(fun([this](const Type_Info &t_ti) { + return m_engine.get_type_name(t_ti); + }), + "name"); + + m_engine.add(fun([this](const std::string &t_type_name, bool t_throw) { + return m_engine.get_type(t_type_name, t_throw); + }), + "type"); + m_engine.add(fun([this](const std::string &t_type_name) { + return m_engine.get_type(t_type_name, true); + }), + "type"); + + m_engine.add( + fun([this](const Type_Info &t_from, const Type_Info &t_to, + const std::function + &t_func) { + m_engine.add(Carbon::type_conversion(t_from, t_to, t_func)); + }), + "add_type_conversion"); + + if (std::find(t_opts.begin(), t_opts.end(), Options::No_Load_Modules) == + t_opts.end() && + std::find(t_opts.begin(), t_opts.end(), Options::Load_Modules) != + t_opts.end()) { + m_engine.add(fun([this](const std::string &t_module, + const std::string &t_file) { + load_module(t_module, t_file); + }), + "load_module"); + m_engine.add(fun([this](const std::string &t_module) { + return load_module(t_module); + }), + "load_module"); + } + + if (std::find(t_opts.begin(), t_opts.end(), + Options::No_External_Scripts) == t_opts.end() && + std::find(t_opts.begin(), t_opts.end(), + Options::External_Scripts) != t_opts.end()) { + m_engine.add( + fun([this](const std::string &t_file) { return use(t_file); }), + "use"); + m_engine.add(fun([this](const std::string &t_file) { + return internal_eval_file(t_file); + }), + "eval_file"); + } + + m_engine.add(fun([this](const std::string &t_str) { + return internal_eval(t_str); + }), + "eval"); + m_engine.add(fun([this](const AST_Node &t_ast) { return eval(t_ast); }), + "eval"); + + m_engine.add(fun([this](const std::string &t_str, const bool t_dump) { + return parse(t_str, t_dump); + }), + "parse"); + m_engine.add( + fun([this](const std::string &t_str) { return parse(t_str); }), + "parse"); + + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + add_global_const(t_bv, t_name); + }), + "add_global_const"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + add_global(t_bv, t_name); + }), + "add_global"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + set_global(t_bv, t_name); + }), + "set_global"); + + // why this unused parameter to Namespace? + m_engine.add(fun([this](const std::string &t_namespace_name) { + register_namespace( + [](Namespace & /*space*/) noexcept {}, + t_namespace_name); + import(t_namespace_name); + }), + "namespace"); + m_engine.add(fun([this](const std::string &t_namespace_name) { + import(t_namespace_name); + }), + "import"); + } + + /// Skip BOM at the beginning of file + static bool skip_bom(std::ifstream &infile) { + size_t bytes_needed = 3; + char buffer[3]; + + memset(buffer, '\0', bytes_needed); + + infile.read(buffer, static_cast(bytes_needed)); + + if ((buffer[0] == '\xef') && (buffer[1] == '\xbb') && + (buffer[2] == '\xbf')) { + infile.seekg(3); + return true; + } + + infile.seekg(0); + + return false; + } + + /// Helper function for loading a file + static std::string load_file(const std::string &t_filename) { + std::ifstream infile(t_filename.c_str(), + std::ios::in | std::ios::ate | std::ios::binary); + + if (!infile.is_open()) { + throw Carbon::exception::file_not_found_error(t_filename); + } + + auto size = infile.tellg(); + infile.seekg(0, std::ios::beg); + + assert(size >= 0); + + if (skip_bom(infile)) { + size -= 3; // decrement the BOM size from file size, otherwise + // we'll get parsing errors + assert(size >= 0); // and check if there's more text + } + + if (size == std::streampos(0)) { + return std::string(); + } else { + std::vector v(static_cast(size)); + infile.read(&v[0], static_cast(size)); + return std::string(v.begin(), v.end()); + } + } + + std::vector ensure_minimum_path_vec( + std::vector paths) { + if (paths.empty()) { + return {""}; + } else { + return paths; + } + } + +public: + /// \brief Virtual destructor for ChaiScript + virtual ~ChaiScript_Basic() = default; + + /// \brief Constructor for ChaiScript + /// \param[in] t_lib Standard library to apply to this ChaiScript instance + /// \param[in] t_modulepaths Vector of paths to search when attempting to + /// load a binary module \param[in] t_usepaths Vector of paths to search + /// when attempting to "use" an included ChaiScript file + ChaiScript_Basic(const ModulePtr &t_lib, + std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = + Carbon::default_options()) + : m_module_paths(ensure_minimum_path_vec(std::move(t_module_paths))), + m_use_paths(ensure_minimum_path_vec(std::move(t_use_paths))), + m_parser(std::move(parser)), + m_engine(*m_parser) { +#if !defined(CARBON_NO_DYNLOAD) && defined(_POSIX_VERSION) && \ + !defined(__CYGWIN__) + // If on Unix, add the path of the current executable to the module + // search path as windows would do + + union cast_union { + Boxed_Value (ChaiScript_Basic::*in_ptr)(const std::string &); + void *out_ptr; + }; + + Dl_info rInfo; + memset(&rInfo, 0, sizeof(rInfo)); + cast_union u; + u.in_ptr = &ChaiScript_Basic::use; + if ((dladdr(static_cast(u.out_ptr), &rInfo) != 0) && + (rInfo.dli_fname != nullptr)) { + std::string dllpath(rInfo.dli_fname); + const size_t lastslash = dllpath.rfind('/'); + if (lastslash != std::string::npos) { + dllpath.erase(lastslash); + } + + // Let's see if this is a link that we should expand + std::vector buf(2048); + const auto pathlen = + readlink(dllpath.c_str(), &buf.front(), buf.size()); + if (pathlen > 0 && static_cast(pathlen) < buf.size()) { + dllpath = + std::string(&buf.front(), static_cast(pathlen)); + } + + m_module_paths.insert(m_module_paths.begin(), dllpath + "/"); + } +#endif + build_eval_system(t_lib, t_opts); + } + +#ifndef CARBON_NO_DYNLOAD + /// \brief Constructor for ChaiScript. + /// + /// This version of the ChaiScript constructor attempts to find the stdlib + /// module to load at runtime generates an error if it cannot be found. + /// + /// \param[in] t_modulepaths Vector of paths to search when attempting to + /// load a binary module \param[in] t_usepaths Vector of paths to search + /// when attempting to "use" an included ChaiScript file + explicit ChaiScript_Basic( + std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = + Carbon::default_options()) + : ChaiScript_Basic({}, std::move(parser), t_module_paths, t_use_paths, + t_opts) { + try { + // attempt to load the stdlib + load_module("stdlib-" + Build_Info::version()); + } catch (const exception::load_module_error &t_err) { + std::cout + << "An error occurred while trying to load the chaiscript " + "standard library.\n" + "\n" + "You must either provide a standard library, or compile it " + "in.\n" + "For an example of compiling the standard library in,\n" + "see: https://gist.github.com/lefticus/9456197\n" + "Compiling the stdlib in is the recommended and MOST " + "SUPPORTED method.\n" + "\n\n" + << t_err.what(); + throw; + } + } +#else // CARBON_NO_DYNLOAD + explicit ChaiScript_Basic( + std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = + Carbon::default_options()) = delete; +#endif + + parser::ChaiScript_Parser_Base &get_parser() noexcept { return *m_parser; } + + const Boxed_Value eval(const AST_Node &t_ast) { + try { + return t_ast.eval(Carbon::detail::Dispatch_State(m_engine)); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } + } + + AST_NodePtr parse(const std::string &t_input, + const bool t_debug_print = false) { + auto ast = m_parser->parse(t_input, "PARSE"); + if (t_debug_print) { + m_parser->debug_print(*ast); + } + return ast; + } + + std::string get_type_name(const Type_Info &ti) const { + return m_engine.get_type_name(ti); + } + + template + std::string get_type_name() const { + return get_type_name(user_type()); + } + + /// \brief Loads and parses a file. If the file is already open, it is not + /// reloaded. The use paths specified at ChaiScript construction time are + /// searched for the requested file. + /// + /// \param[in] t_filename Filename to load and evaluate + Boxed_Value use(const std::string &t_filename) { + for (const auto &path : m_use_paths) { + const auto appendedpath = path + t_filename; + try { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + Boxed_Value retval; + + if (m_used_files.count(appendedpath) == 0) { + l2.unlock(); + retval = eval_file(appendedpath); + l2.lock(); + m_used_files.insert(appendedpath); + } + + return retval; // return, we loaded it, or it was already + // loaded + } catch (const exception::file_not_found_error &e) { + if (e.filename != appendedpath) { + // a nested file include failed + throw; + } + // failed to load, try the next path + } + } + + // failed to load by any name + throw exception::file_not_found_error(t_filename); + } + + /// \brief Adds a constant object that is available in all contexts and to + /// all threads \param[in] t_bv Boxed_Value to add as a global \param[in] + /// t_name Name of the value to add \throw + /// Carbon::exception::global_non_const If t_bv is not a constant object + /// \sa Boxed_Value::is_const + ChaiScript_Basic &add_global_const(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.add_global_const(t_bv, t_name); + return *this; + } + + /// \brief Adds a mutable object that is available in all contexts and to + /// all threads \param[in] t_bv Boxed_Value to add as a global \param[in] + /// t_name Name of the value to add \warning The user is responsible for + /// making sure the object is thread-safe if necessary + /// ChaiScript is thread-safe but provides no threading locking + /// mechanism to the script + ChaiScript_Basic &add_global(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.add_global(t_bv, t_name); + return *this; + } + + ChaiScript_Basic &set_global(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.set_global(t_bv, t_name); + return *this; + } + + /// \brief Represents the current state of the ChaiScript system. State and + /// be saved and restored \warning State object does not contain the user + /// defined type conversions of the engine. They + /// are left out due to performance considerations involved in + /// tracking the state + /// \sa ChaiScript::get_state + /// \sa ChaiScript::set_state + struct State { + std::set used_files; + Carbon::detail::Dispatch_Engine::State engine_state; + std::set active_loaded_modules; + }; + + /// \brief Returns a state object that represents the current state of the + /// global system + /// + /// The global system includes the reserved words, global const objects, + /// functions and types. local variables are thread specific and not + /// included. + /// + /// \return Current state of the global system + /// + /// \b Example: + /// + /// \code + /// Carbon::ChaiScript chai; + /// Carbon::ChaiScript::State s = chai.get_state(); // represents + /// bootstrapped initial state \endcode + State get_state() const { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + State s; + s.used_files = m_used_files; + s.engine_state = m_engine.get_state(); + s.active_loaded_modules = m_active_loaded_modules; + return s; + } + + /// \brief Sets the state of the system + /// + /// The global system includes the reserved words, global objects, functions + /// and types. local variables are thread specific and not included. + /// + /// \param[in] t_state New state to set + /// + /// \b Example: + /// \code + /// Carbon::ChaiScript chai; + /// Carbon::ChaiScript::State s = chai.get_state(); // get initial state + /// chai.add(Carbon::fun(&somefunction), "somefunction"); + /// chai.set_state(s); // restore initial state, which does not have the + /// recently added "somefunction" \endcode + void set_state(const State &t_state) { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + m_used_files = t_state.used_files; + m_active_loaded_modules = t_state.active_loaded_modules; + m_engine.set_state(t_state.engine_state); + } + + /// \returns All values in the local thread state, added through the add() + /// function + std::map get_locals() const { + return m_engine.get_locals(); + } + + /// \brief Sets all of the locals for the current thread state. + /// + /// \param[in] t_locals The map set of variables to replace the + /// current state with + /// + /// Any existing locals are removed and the given set of variables is added + void set_locals(const std::map &t_locals) { + m_engine.set_locals(t_locals); + } + + /// \brief Adds a type, function or object to ChaiScript. Objects are added + /// to the local thread state. \param[in] t_t Item to add \param[in] t_name + /// Name of item to add \returns Reference to current ChaiScript object + /// + /// \b Examples: + /// \code + /// Carbon::ChaiScript chai; + /// chai.add(Carbon::user_type(), "MyClass"); // Add explicit + /// type info (not strictly necessary) + /// chai.add(Carbon::fun(&MyClass::function), "function"); // Add a + /// class method MyClass obj; chai.add(Carbon::var(&obj), "obj"); // Add + /// a pointer to a locally defined object \endcode + /// + /// \sa \ref adding_items + template + ChaiScript_Basic &add(const T &t_t, const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.add(t_t, t_name); + return *this; + } + + /// \brief Add a new conversion for upcasting to a base class + /// \sa Carbon::base_class + /// \param[in] d Base class / parent class + /// + /// \b Example: + /// \code + /// Carbon::ChaiScript chai; + /// chai.add(Carbon::base_class()); \endcode + ChaiScript_Basic &add(const Type_Conversion &d) { + m_engine.add(d); + return *this; + } + + /// \brief Adds all elements of a module to ChaiScript runtime + /// \param[in] t_p The module to add. + /// \sa Carbon::Module + ChaiScript_Basic &add(const ModulePtr &t_p) { + t_p->apply(*this, this->get_eval_engine()); + return *this; + } + + /// \brief Load a binary module from a dynamic library. Works on platforms + /// that support + /// dynamic libraries. + /// \param[in] t_module_name Name of the module to load + /// + /// The module is searched for in the registered module path folders + /// (Carbon::ChaiScript::ChaiScript) and with standard prefixes and + /// postfixes: ("lib"|"")\(".dll"|".so"|".bundle"|""). + /// + /// Once the file is located, the system looks for the symbol + /// "create_module_\". If no file can be found + /// matching the search criteria and containing the appropriate entry point + /// (the symbol mentioned above), an exception is thrown. + /// + /// \throw Carbon::exception::load_module_error In the event that no + /// matching module can be found. + std::string load_module(const std::string &t_module_name) { +#ifdef CARBON_NO_DYNLOAD + throw Carbon::exception::load_module_error( + "Loadable module support was disabled (CARBON_NO_DYNLOAD)"); +#else + std::vector errors; + std::string version_stripped_name = t_module_name; + size_t version_pos = + version_stripped_name.find("-" + Build_Info::version()); + if (version_pos != std::string::npos) { + version_stripped_name.erase(version_pos); + } + + std::vector prefixes{"lib", "cyg", ""}; + + std::vector postfixes{".dll", ".so", ".bundle", ""}; + + for (auto &elem : m_module_paths) { + for (auto &prefix : prefixes) { + for (auto &postfix : postfixes) { + try { + const auto name = + elem + prefix + t_module_name + postfix; + // std::cerr << "trying location: " << name << '\n'; + load_module(version_stripped_name, name); + return name; + } catch ( + const Carbon::exception::load_module_error &e) { + // std::cerr << "error: " << e.what() << '\n'; + errors.push_back(e); + // Try next set + } + } + } + } + + throw Carbon::exception::load_module_error(t_module_name, errors); +#endif + } + + /// \brief Load a binary module from a dynamic library. Works on platforms + /// that support + /// dynamic libraries. + /// + /// \param[in] t_module_name Module name to load + /// \param[in] t_filename Ignore normal filename search process and use + /// specific filename + /// + /// \sa ChaiScript::load_module(const std::string &t_module_name) + void load_module(const std::string &t_module_name, + const std::string &t_filename) { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (m_loaded_modules.count(t_module_name) == 0) { + detail::Loadable_Module_Ptr lm( + new detail::Loadable_Module(t_module_name, t_filename)); + m_loaded_modules[t_module_name] = lm; + m_active_loaded_modules.insert(t_module_name); + add(lm->m_moduleptr); + } else if (m_active_loaded_modules.count(t_module_name) == 0) { + m_active_loaded_modules.insert(t_module_name); + add(m_loaded_modules[t_module_name]->m_moduleptr); + } + } + + /// \brief Evaluates a string. Equivalent to ChaiScript::eval. + /// + /// \param[in] t_script Script to execute + /// \param[in] t_handler Optional Exception_Handler used for automatic + /// unboxing of script thrown exceptions + /// + /// \return result of the script execution + /// + /// \throw Carbon::exception::eval_error In the case that evaluation + /// fails. + Boxed_Value operator()( + const std::string &t_script, + const Exception_Handler &t_handler = Exception_Handler()) { + return eval(t_script, t_handler); + } + + /// \brief Evaluates a string and returns a typesafe result. + /// + /// \tparam T Type to extract from the result value of the script execution + /// \param[in] t_input Script to execute + /// \param[in] t_handler Optional Exception_Handler used for automatic + /// unboxing of script thrown exceptions \param[in] t_filename Optional + /// filename to report to the user for where the error occured. Useful + /// in special cases where you are loading a file + /// internally instead of using eval_file + /// + /// \return result of the script execution + /// + /// \throw Carbon::exception::eval_error In the case that evaluation + /// fails. \throw Carbon::exception::bad_boxed_cast In the case that + /// evaluation succeeds but the result value cannot be converted + /// to the requested type. + template + T eval(const std::string &t_input, + const Exception_Handler &t_handler = Exception_Handler(), + const std::string &t_filename = "__EVAL__") { + return m_engine.boxed_cast(eval(t_input, t_handler, t_filename)); + } + + /// \brief casts an object while applying any Dynamic_Conversion available + template + decltype(auto) boxed_cast(const Boxed_Value &bv) const { + return (m_engine.boxed_cast(bv)); + } + + /// \brief Evaluates a string. + /// + /// \param[in] t_input Script to execute + /// \param[in] t_handler Optional Exception_Handler used for automatic + /// unboxing of script thrown exceptions \param[in] t_filename Optional + /// filename to report to the user for where the error occurred. Useful + /// in special cases where you are loading a file + /// internally instead of using eval_file + /// + /// \return result of the script execution + /// + /// \throw exception::eval_error In the case that evaluation fails. + Boxed_Value eval(const std::string &t_input, + const Exception_Handler &t_handler = Exception_Handler(), + const std::string &t_filename = "__EVAL__") { + try { + return do_eval(t_input, t_filename); + } catch (Boxed_Value &bv) { + if (t_handler) { + t_handler->handle(bv, m_engine); + } + throw; + } + } + + /// \brief Loads the file specified by filename, evaluates it, and returns + /// the result. \param[in] t_filename File to load and parse. \param[in] + /// t_handler Optional Exception_Handler used for automatic unboxing of + /// script thrown exceptions \return result of the script execution \throw + /// Carbon::exception::eval_error In the case that evaluation fails. + Boxed_Value eval_file( + const std::string &t_filename, + const Exception_Handler &t_handler = Exception_Handler()) { + return eval(load_file(t_filename), t_handler, t_filename); + } + + /// \brief Loads the file specified by filename, evaluates it, and returns + /// the type safe result. \tparam T Type to extract from the result value of + /// the script execution \param[in] t_filename File to load and parse. + /// \param[in] t_handler Optional Exception_Handler used for automatic + /// unboxing of script thrown exceptions \return result of the script + /// execution \throw Carbon::exception::eval_error In the case that + /// evaluation fails. \throw Carbon::exception::bad_boxed_cast In the + /// case that evaluation succeeds but the result value cannot be converted + /// to the requested type. + template + T eval_file(const std::string &t_filename, + const Exception_Handler &t_handler = Exception_Handler()) { + return m_engine.boxed_cast(eval_file(t_filename, t_handler)); + } + + /// \brief Imports a namespace object into the global scope of this + /// ChaiScript instance. \param[in] t_namespace_name Name of the namespace + /// to import. \throw std::runtime_error In the case that the namespace name + /// was never registered. + void import(const std::string &t_namespace_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (m_engine.get_scripting_objects().count(t_namespace_name)) { + throw std::runtime_error("Namespace: " + t_namespace_name + + " was already defined"); + } else if (m_namespace_generators.count(t_namespace_name)) { + m_engine.add_global( + var(std::ref(m_namespace_generators[t_namespace_name]())), + t_namespace_name); + } else { + throw std::runtime_error("No registered namespace: " + + t_namespace_name); + } + } + + /// \brief Registers a namespace generator, which delays generation of the + /// namespace until it is imported, saving memory if it is never used. + /// \param[in] t_namespace_generator Namespace generator function. + /// \param[in] t_namespace_name Name of the Namespace function being + /// registered. \throw std::runtime_error In the case that the namespace + /// name was already registered. + void register_namespace( + const std::function &t_namespace_generator, + const std::string &t_namespace_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (!m_namespace_generators.count(t_namespace_name)) { + // contain the namespace object memory within the + // m_namespace_generators map + m_namespace_generators.emplace(std::make_pair( + t_namespace_name, + [=, space = Namespace()]() mutable -> Namespace & { + t_namespace_generator(space); + return space; + })); + } else { + throw std::runtime_error("Namespace: " + t_namespace_name + + " was already registered."); + } + } +}; + +} // namespace Carbon +#endif /* CARBON_ENGINE_HPP */ diff --git a/src/carbon/language/eval.hpp b/src/carbon/language/eval.hpp new file mode 100644 index 00000000..6eafedb3 --- /dev/null +++ b/src/carbon/language/eval.hpp @@ -0,0 +1,1789 @@ + + +#ifndef CARBON_EVAL_HPP +#define CARBON_EVAL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../defines.hpp" +#include "../command/boxed_cast.hpp" +#include "../command/boxed_number.hpp" +#include "../command/boxed_value.hpp" +#include "../command/dispatchkit.hpp" +#include "../command/dynamic_object_detail.hpp" +#include "../command/proxy_functions.hpp" +#include "../command/proxy_functions_detail.hpp" +#include "../command/register_function.hpp" +#include "../command/type_info.hpp" +#include "algebraic.hpp" +#include "common.hpp" + +namespace Carbon::exception { +class bad_boxed_cast; +} // namespace Carbon::exception + +namespace Carbon { +/// \brief Classes and functions that are part of the runtime eval system +namespace eval { +template +struct AST_Node_Impl; + +template +using AST_Node_Impl_Ptr = typename std::unique_ptr>; + +namespace detail { +/// Helper function that will set up the scope around a function call, including +/// handling the named function parameters +template +Boxed_Value eval_function( + Carbon::detail::Dispatch_Engine &t_ss, const AST_Node_Impl &t_node, + const std::vector &t_param_names, + const Function_Params &t_vals, + const std::map *t_locals = nullptr, + bool has_this_capture = false) { + Carbon::detail::Dispatch_State state(t_ss); + + const Boxed_Value *thisobj = [&]() -> const Boxed_Value * { + if (auto &stack = t_ss.get_stack_data(state.stack_holder()).back(); + !stack.empty() && stack.back().first == "__this") { + return &stack.back().second; + } else if (!t_vals.empty()) { + return &t_vals[0]; + } else { + return nullptr; + } + }(); + + Carbon::eval::detail::Stack_Push_Pop tpp(state); + if (thisobj && !has_this_capture) { + state.add_object("this", *thisobj); + } + + if (t_locals) { + for (const auto &[name, value] : *t_locals) { + state.add_object(name, value); + } + } + + for (size_t i = 0; i < t_param_names.size(); ++i) { + if (t_param_names[i] != "this") { + state.add_object(t_param_names[i], t_vals[i]); + } + } + + try { + return t_node.eval(state); + } catch (detail::Return_Value &rv) { + return std::move(rv.retval); + } +} + +inline Boxed_Value clone_if_necessary( + Boxed_Value incoming, std::atomic_uint_fast32_t &t_loc, + const Carbon::detail::Dispatch_State &t_ss) { + if (!incoming.is_return_value()) { + if (incoming.get_type_info().is_arithmetic()) { + return Boxed_Number::clone(incoming); + } else if (incoming.get_type_info().bare_equal_type_info( + typeid(bool))) { + return Boxed_Value( + *static_cast(incoming.get_const_ptr())); + } else if (incoming.get_type_info().bare_equal_type_info( + typeid(std::string))) { + return Boxed_Value( + *static_cast(incoming.get_const_ptr())); + } else { + std::array params{std::move(incoming)}; + return t_ss->call_function("clone", t_loc, Function_Params{params}, + t_ss.conversions()); + } + } else { + incoming.reset_return_value(); + return incoming; + } +} +} // namespace detail + +template +struct AST_Node_Impl : AST_Node { + AST_Node_Impl(std::string t_ast_node_text, AST_Node_Type t_id, + Parse_Location t_loc, + std::vector> t_children = + std::vector>()) + : AST_Node(std::move(t_ast_node_text), t_id, std::move(t_loc)), + children(std::move(t_children)) {} + + static bool get_scoped_bool_condition( + const AST_Node_Impl &node, + const Carbon::detail::Dispatch_State &t_ss) { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + return get_bool_condition(node.eval(t_ss), t_ss); + } + + std::vector> get_children() const final { + std::vector> retval; + retval.reserve(children.size()); + for (auto &child : children) { + retval.emplace_back(*child); + } + + return retval; + } + + Boxed_Value eval( + const Carbon::detail::Dispatch_State &t_e) const final { + try { + T::trace(t_e, this); + return eval_internal(t_e); + } catch (exception::eval_error &ee) { + ee.call_stack.push_back(*this); + throw; + } + } + + std::vector> children; + +protected: + virtual Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &) const { + throw std::runtime_error("Undispatched ast_node (internal error)"); + } +}; + +template +struct Compiled_AST_Node : AST_Node_Impl { + Compiled_AST_Node(AST_Node_Impl_Ptr t_original_node, + std::vector> t_children, + std::function> &, + const Carbon::detail::Dispatch_State &t_ss)> + t_func) + : AST_Node_Impl(t_original_node->text, AST_Node_Type::Compiled, + t_original_node->location, std::move(t_children)), + m_func(std::move(t_func)), + m_original_node(std::move(t_original_node)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return m_func(this->children, t_ss); + } + + std::function> &, + const Carbon::detail::Dispatch_State &t_ss)> + m_func; + AST_Node_Impl_Ptr m_original_node; +}; + +template +struct Fold_Right_Binary_Operator_AST_Node : AST_Node_Impl { + Fold_Right_Binary_Operator_AST_Node( + const std::string &t_oper, Parse_Location t_loc, + std::vector> t_children, Boxed_Value t_rhs) + : AST_Node_Impl(t_oper, AST_Node_Type::Binary, std::move(t_loc), + std::move(t_children)), + m_oper(Operators::to_operator(t_oper)), + m_rhs(std::move(t_rhs)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return do_oper(t_ss, this->text, this->children[0]->eval(t_ss)); + } + +protected: + Boxed_Value do_oper(const Carbon::detail::Dispatch_State &t_ss, + const std::string &t_oper_string, + const Boxed_Value &t_lhs) const { + try { + if (t_lhs.get_type_info().is_arithmetic()) { + // If it's an arithmetic operation we want to short circuit + // dispatch + try { + return Boxed_Number::do_oper(m_oper, t_lhs, m_rhs); + } catch (const Carbon::exception::arithmetic_error &) { + throw; + } catch (...) { + throw exception::eval_error( + "Error with numeric operator calling: " + + t_oper_string); + } + } else { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + std::array params{t_lhs, m_rhs}; + fpp.save_params(Function_Params{params}); + return t_ss->call_function(t_oper_string, m_loc, + Function_Params{params}, + t_ss.conversions()); + } + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Can not find appropriate '" + t_oper_string + "' operator.", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + Operators::Opers m_oper; + Boxed_Value m_rhs; + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Binary_Operator_AST_Node : AST_Node_Impl { + Binary_Operator_AST_Node(const std::string &t_oper, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(t_oper, AST_Node_Type::Binary, std::move(t_loc), + std::move(t_children)), + m_oper(Operators::to_operator(t_oper)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + auto lhs = this->children[0]->eval(t_ss); + auto rhs = this->children[1]->eval(t_ss); + return do_oper(t_ss, m_oper, this->text, lhs, rhs); + } + +protected: + Boxed_Value do_oper(const Carbon::detail::Dispatch_State &t_ss, + Operators::Opers t_oper, + const std::string &t_oper_string, + const Boxed_Value &t_lhs, + const Boxed_Value &t_rhs) const { + try { + if (t_oper != Operators::Opers::invalid && + t_lhs.get_type_info().is_arithmetic() && + t_rhs.get_type_info().is_arithmetic()) { + // If it's an arithmetic operation we want to short circuit + // dispatch + try { + return Boxed_Number::do_oper(t_oper, t_lhs, t_rhs); + } catch (const Carbon::exception::arithmetic_error &) { + throw; + } catch (...) { + throw exception::eval_error( + "Error with numeric operator calling: " + + t_oper_string); + } + } else { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + std::array params{t_lhs, t_rhs}; + fpp.save_params(Function_Params(params)); + return t_ss->call_function(t_oper_string, m_loc, + Function_Params(params), + t_ss.conversions()); + } + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Can not find appropriate '" + t_oper_string + "' operator.", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + Operators::Opers m_oper; + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Constant_AST_Node final : AST_Node_Impl { + Constant_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + Boxed_Value t_value) + : AST_Node_Impl(t_ast_node_text, AST_Node_Type::Constant, + std::move(t_loc)), + m_value(std::move(t_value)) {} + + explicit Constant_AST_Node(Boxed_Value t_value) + : AST_Node_Impl("", AST_Node_Type::Constant, Parse_Location()), + m_value(std::move(t_value)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &) const override { + return m_value; + } + + Boxed_Value m_value; +}; + +template +struct Id_AST_Node final : AST_Node_Impl { + Id_AST_Node(const std::string &t_ast_node_text, Parse_Location t_loc) + : AST_Node_Impl(t_ast_node_text, AST_Node_Type::Id, + std::move(t_loc)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + try { + return t_ss.get_object(this->text, m_loc); + } catch (std::exception &) { + throw exception::eval_error("Can not find object: " + this->text); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Fun_Call_AST_Node : AST_Node_Impl { + Fun_Call_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Fun_Call, + std::move(t_loc), std::move(t_children)) { + assert(!this->children.empty()); + } + + template + Boxed_Value do_eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + + std::vector params; + + params.reserve(this->children[1]->children.size()); + for (const auto &child : this->children[1]->children) { + params.push_back(child->eval(t_ss)); + } + + if (Save_Params) { + fpp.save_params(Function_Params{params}); + } + + Boxed_Value fn(this->children[0]->eval(t_ss)); + + try { + return (*t_ss->boxed_cast( + fn))(Function_Params{params}, t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + std::string(e.what()) + " with function '" + + this->children[0]->text + "'", + e.parameters, e.functions, false, *t_ss); + } catch (const exception::bad_boxed_cast &) { + try { + using ConstFunctionTypeRef = const Const_Proxy_Function &; + Const_Proxy_Function f = + t_ss->boxed_cast(fn); + // handle the case where there is only 1 function to try to call + // and dispatch fails on it + throw exception::eval_error( + "Error calling function '" + this->children[0]->text + "'", + params, make_vector(f), false, *t_ss); + } catch (const exception::bad_boxed_cast &) { + throw exception::eval_error( + "'" + this->children[0]->pretty_print() + + "' does not evaluate to a function."); + } + } catch (const exception::arity_error &e) { + throw exception::eval_error(std::string(e.what()) + + " with function '" + + this->children[0]->text + "'"); + } catch (const exception::guard_error &e) { + throw exception::eval_error(std::string(e.what()) + + " with function '" + + this->children[0]->text + "'"); + } catch (detail::Return_Value &rv) { + return rv.retval; + } + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return do_eval_internal(t_ss); + } +}; + +template +struct Unused_Return_Fun_Call_AST_Node final : Fun_Call_AST_Node { + Unused_Return_Fun_Call_AST_Node( + std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : Fun_Call_AST_Node(std::move(t_ast_node_text), std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return this->template do_eval_internal(t_ss); + } +}; + +template +struct Arg_AST_Node final : AST_Node_Impl { + Arg_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Arg_List, + std::move(t_loc), std::move(t_children)) {} +}; + +template +struct Arg_List_AST_Node final : AST_Node_Impl { + Arg_List_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Arg_List, + std::move(t_loc), std::move(t_children)) {} + + static std::string get_arg_name(const AST_Node_Impl &t_node) { + if (t_node.children.empty()) { + return t_node.text; + } else if (t_node.children.size() == 1) { + return t_node.children[0]->text; + } else { + return t_node.children[1]->text; + } + } + + static std::vector get_arg_names( + const AST_Node_Impl &t_node) { + std::vector retval; + + for (const auto &node : t_node.children) { + retval.push_back(get_arg_name(*node)); + } + + return retval; + } + + static std::pair get_arg_type( + const AST_Node_Impl &t_node, + const Carbon::detail::Dispatch_State &t_ss) { + if (t_node.children.size() < 2) { + return {}; + } else { + return {t_node.children[0]->text, + t_ss->get_type(t_node.children[0]->text, false)}; + } + } + + static dispatch::Param_Types get_arg_types( + const AST_Node_Impl &t_node, + const Carbon::detail::Dispatch_State &t_ss) { + std::vector> retval; + + for (const auto &child : t_node.children) { + retval.push_back(get_arg_type(*child, t_ss)); + } + + return dispatch::Param_Types(std::move(retval)); + } +}; + +template +struct Equation_AST_Node final : AST_Node_Impl { + Equation_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Equation, + std::move(t_loc), std::move(t_children)), + m_oper(Operators::to_operator(this->text)) { + assert(this->children.size() == 2); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + + auto params = [&]() { + // The RHS *must* be evaluated before the LHS + // consider `var range = range(x)` + // if we declare the variable in scope first, then the name lookup + // fails for the RHS + auto rhs = this->children[1]->eval(t_ss); + auto lhs = this->children[0]->eval(t_ss); + std::array p{std::move(lhs), std::move(rhs)}; + return p; + }(); + + if (params[0].is_return_value()) { + throw exception::eval_error( + "Error, cannot assign to temporary value."); + } else if (params[0].is_const()) { + throw exception::eval_error( + "Error, cannot assign to constant value."); + } + + if (m_oper != Operators::Opers::invalid && + params[0].get_type_info().is_arithmetic() && + params[1].get_type_info().is_arithmetic()) { + try { + return Boxed_Number::do_oper(m_oper, params[0], params[1]); + } catch (const std::exception &) { + throw exception::eval_error( + "Error with unsupported arithmetic assignment operation."); + } + } else if (m_oper == Operators::Opers::assign) { + try { + if (params[0].is_undef()) { + if (!this->children.empty() && + ((this->children[0]->identifier == + AST_Node_Type::Reference) || + (!this->children[0]->children.empty() && + this->children[0]->children[0]->identifier == + AST_Node_Type::Reference))) + + { + /// \todo This does not handle the case of an unassigned + /// reference variable + /// being assigned outside of its declaration + params[0].assign(params[1]); + params[0].reset_return_value(); + return params[1]; + } else { + params[1] = detail::clone_if_necessary( + std::move(params[1]), m_clone_loc, t_ss); + } + } + + try { + return t_ss->call_function(this->text, m_loc, + Function_Params{params}, + t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error("Unable to find appropriate'" + + this->text + "' operator.", + e.parameters, e.functions, + false, *t_ss); + } + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Missing clone or copy constructor for right hand side of " + "equation", + e.parameters, e.functions, false, *t_ss); + } + } else if (this->text == ":=") { + if (params[0].is_undef() || + Boxed_Value::type_match(params[0], params[1])) { + params[0].assign(params[1]); + params[0].reset_return_value(); + } else { + throw exception::eval_error("Mismatched types in equation"); + } + } else { + try { + return t_ss->call_function(this->text, m_loc, + Function_Params{params}, + t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Unable to find appropriate'" + this->text + "' operator.", + e.parameters, e.functions, false, *t_ss); + } + } + + return params[1]; + } + +private: + Operators::Opers m_oper; + mutable std::atomic_uint_fast32_t m_loc = {0}; + mutable std::atomic_uint_fast32_t m_clone_loc = {0}; +}; + +template +struct Global_Decl_AST_Node final : AST_Node_Impl { + Global_Decl_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Global_Decl, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const std::string &idname = [&]() -> const std::string & { + if (this->children[0]->identifier == AST_Node_Type::Reference) { + return this->children[0]->children[0]->text; + } else { + return this->children[0]->text; + } + }(); + + return t_ss->add_global_no_throw(Boxed_Value(), idname); + } +}; + +template +struct Var_Decl_AST_Node final : AST_Node_Impl { + Var_Decl_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Var_Decl, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const std::string &idname = this->children[0]->text; + + try { + Boxed_Value bv; + t_ss.add_object(idname, bv); + return bv; + } catch (const exception::name_conflict_error &e) { + throw exception::eval_error("Variable redefined '" + e.name() + + "'"); + } + } +}; + +template +struct Assign_Decl_AST_Node final : AST_Node_Impl { + Assign_Decl_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Assign_Decl, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const std::string &idname = this->children[0]->text; + + try { + Boxed_Value bv(detail::clone_if_necessary( + this->children[1]->eval(t_ss), m_loc, t_ss)); + bv.reset_return_value(); + t_ss.add_object(idname, bv); + return bv; + } catch (const exception::name_conflict_error &e) { + throw exception::eval_error("Variable redefined '" + e.name() + + "'"); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Array_Call_AST_Node final : AST_Node_Impl { + Array_Call_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Array_Call, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + + std::array params{this->children[0]->eval(t_ss), + this->children[1]->eval(t_ss)}; + + try { + fpp.save_params(Function_Params{params}); + return t_ss->call_function("[]", m_loc, Function_Params{params}, + t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Can not find appropriate array lookup operator '[]'.", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Dot_Access_AST_Node final : AST_Node_Impl { + Dot_Access_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Dot_Access, std::move(t_loc), + std::move(t_children)), + m_fun_name( + ((this->children[1]->identifier == AST_Node_Type::Fun_Call) || + (this->children[1]->identifier == AST_Node_Type::Array_Call)) + ? this->children[1]->children[0]->text + : this->children[1]->text) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + + Boxed_Value retval = this->children[0]->eval(t_ss); + auto params = make_vector(retval); + + bool has_function_params = false; + if (this->children[1]->children.size() > 1) { + has_function_params = true; + for (const auto &child : this->children[1]->children[1]->children) { + params.push_back(child->eval(t_ss)); + } + } + + fpp.save_params(Function_Params{params}); + + try { + retval = + t_ss->call_member(m_fun_name, m_loc, Function_Params{params}, + has_function_params, t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + if (e.functions.empty()) { + throw exception::eval_error("'" + m_fun_name + + "' is not a function."); + } else { + throw exception::eval_error( + std::string(e.what()) + " for function '" + m_fun_name + + "'", + e.parameters, e.functions, true, *t_ss); + } + } catch (detail::Return_Value &rv) { + retval = std::move(rv.retval); + } + + if (this->children[1]->identifier == AST_Node_Type::Array_Call) { + try { + std::array p{ + retval, this->children[1]->children[1]->eval(t_ss)}; + retval = t_ss->call_function( + "[]", m_array_loc, Function_Params{p}, t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Can not find appropriate array lookup operator '[]'.", + e.parameters, e.functions, true, *t_ss); + } + } + + return retval; + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; + mutable std::atomic_uint_fast32_t m_array_loc = {0}; + const std::string m_fun_name; +}; + +template +struct Lambda_AST_Node final : AST_Node_Impl { + Lambda_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl( + t_ast_node_text, AST_Node_Type::Lambda, std::move(t_loc), + std::vector>( + std::make_move_iterator(t_children.begin()), + std::make_move_iterator(std::prev(t_children.end())))), + m_param_names( + Arg_List_AST_Node::get_arg_names(*this->children[1])), + m_this_capture(has_this_capture(this->children[0]->children)), + m_lambda_node(std::move(t_children.back())) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const auto captures = [&]() -> std::map { + std::map named_captures; + for (const auto &capture : this->children[0]->children) { + named_captures.insert( + std::make_pair(capture->children[0]->text, + capture->children[0]->eval(t_ss))); + } + return named_captures; + }(); + + const auto numparams = this->children[1]->children.size(); + const auto param_types = + Arg_List_AST_Node::get_arg_types(*this->children[1], t_ss); + + std::reference_wrapper engine( + *t_ss); + + return Boxed_Value(dispatch::make_dynamic_proxy_function( + [engine, lambda_node = this->m_lambda_node, + param_names = this->m_param_names, captures, + this_capture = + this->m_this_capture](const Function_Params &t_params) { + return detail::eval_function(engine, *lambda_node, param_names, + t_params, &captures, this_capture); + }, + static_cast(numparams), m_lambda_node, param_types)); + } + + static bool has_this_capture( + const std::vector> &t_children) noexcept { + return std::any_of(std::begin(t_children), std::end(t_children), + [](const auto &child) { + return child->children[0]->text == "this"; + }); + } + +private: + const std::vector m_param_names; + const bool m_this_capture = false; + const std::shared_ptr> m_lambda_node; +}; + +template +struct Scopeless_Block_AST_Node final : AST_Node_Impl { + Scopeless_Block_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Scopeless_Block, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const auto num_children = this->children.size(); + for (size_t i = 0; i < num_children - 1; ++i) { + this->children[i]->eval(t_ss); + } + return this->children.back()->eval(t_ss); + } +}; + +template +struct Block_AST_Node final : AST_Node_Impl { + Block_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Block, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + const auto num_children = this->children.size(); + for (size_t i = 0; i < num_children - 1; ++i) { + this->children[i]->eval(t_ss); + } + return this->children.back()->eval(t_ss); + } +}; + +template +struct Def_AST_Node final : AST_Node_Impl { + std::shared_ptr> m_body_node; + std::shared_ptr> m_guard_node; + + Def_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl( + std::move(t_ast_node_text), AST_Node_Type::Def, std::move(t_loc), + std::vector>( + std::make_move_iterator(t_children.begin()), + std::make_move_iterator(std::prev( + t_children.end(), has_guard(t_children, 1) ? 2 : 1)))), + // This apparent use after move is safe because we are only moving out + // the specific elements we need on each operation. + m_body_node(get_body_node(std::move(t_children))), + m_guard_node( + get_guard_node(std::move(t_children), + t_children.size() - this->children.size() == 2)) + + {} + + static std::shared_ptr> get_guard_node( + std::vector> &&vec, bool has_guard) { + if (has_guard) { + return std::move(*std::prev(vec.end(), 2)); + } else { + return {}; + } + } + + static std::shared_ptr> get_body_node( + std::vector> &&vec) { + return std::move(vec.back()); + } + + static bool has_guard(const std::vector> &t_children, + const std::size_t offset) noexcept { + if ((t_children.size() > 2 + offset) && + (t_children[1 + offset]->identifier == AST_Node_Type::Arg_List)) { + if (t_children.size() > 3 + offset) { + return true; + } + } else { + if (t_children.size() > 2 + offset) { + return true; + } + } + return false; + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + std::vector t_param_names; + size_t numparams = 0; + + dispatch::Param_Types param_types; + + if ((this->children.size() > 1) && + (this->children[1]->identifier == AST_Node_Type::Arg_List)) { + numparams = this->children[1]->children.size(); + t_param_names = + Arg_List_AST_Node::get_arg_names(*this->children[1]); + param_types = + Arg_List_AST_Node::get_arg_types(*this->children[1], t_ss); + } + + std::reference_wrapper engine( + *t_ss); + std::shared_ptr guard; + if (m_guard_node) { + guard = dispatch::make_dynamic_proxy_function( + [engine, guardnode = m_guard_node, + t_param_names](const Function_Params &t_params) { + return detail::eval_function(engine, *guardnode, + t_param_names, t_params); + }, + static_cast(numparams), m_guard_node); + } + + try { + const std::string &l_function_name = this->children[0]->text; + t_ss->add(dispatch::make_dynamic_proxy_function( + [engine, func_node = m_body_node, + t_param_names](const Function_Params &t_params) { + return detail::eval_function( + engine, *func_node, t_param_names, t_params); + }, + static_cast(numparams), m_body_node, param_types, + guard), + l_function_name); + } catch (const exception::name_conflict_error &e) { + throw exception::eval_error("Function redefined '" + e.name() + + "'"); + } + return void_var(); + } +}; + +template +struct While_AST_Node final : AST_Node_Impl { + While_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::While, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + try { + while (this->get_scoped_bool_condition(*this->children[0], t_ss)) { + try { + this->children[1]->eval(t_ss); + } catch (detail::Continue_Loop &) { + // we got a continue exception, which means all of the + // remaining loop implementation is skipped and we just need + // to continue to the next condition test + } + } + } catch (detail::Break_Loop &) { + // loop was broken intentionally + } + + return void_var(); + } +}; + +template +struct Class_AST_Node final : AST_Node_Impl { + Class_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Class, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + /// \todo do this better + // put class name in current scope so it can be looked up by the attrs + // and methods + t_ss.add_object("_current_class_name", + const_var(this->children[0]->text)); + + this->children[1]->eval(t_ss); + + return void_var(); + } +}; + +template +struct If_AST_Node final : AST_Node_Impl { + If_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::If, + std::move(t_loc), std::move(t_children)) { + assert(this->children.size() == 3); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + if (this->get_bool_condition(this->children[0]->eval(t_ss), t_ss)) { + return this->children[1]->eval(t_ss); + } else { + return this->children[2]->eval(t_ss); + } + } +}; + +template +struct Ranged_For_AST_Node final : AST_Node_Impl { + Ranged_For_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Ranged_For, std::move(t_loc), + std::move(t_children)) { + assert(this->children.size() == 3); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + const auto get_function = [&t_ss](const std::string &t_name, + auto &t_hint) { + uint_fast32_t hint = t_hint; + auto [funs_loc, funs] = t_ss->get_function(t_name, hint); + if (funs_loc != hint) { + t_hint = uint_fast32_t(funs_loc); + } + return std::move(funs); + }; + + const auto call_function = [&t_ss](const auto &t_funcs, + const Boxed_Value &t_param) { + return dispatch::dispatch(*t_funcs, Function_Params{t_param}, + t_ss.conversions()); + }; + + const std::string &loop_var_name = this->children[0]->text; + Boxed_Value range_expression_result = this->children[1]->eval(t_ss); + + const auto do_loop = [&loop_var_name, &t_ss, + this](const auto &ranged_thing) { + try { + for (auto &&loop_var : ranged_thing) { + // This scope push and pop might not be the best thing for + // perf but we know it's 100% correct + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + /// to-do make this if-constexpr with C++17 branch + if (!std::is_same, + Boxed_Value>::value) { + t_ss.add_get_object(loop_var_name, + Boxed_Value(std::ref(loop_var))); + } else { + t_ss.add_get_object(loop_var_name, + Boxed_Value(loop_var)); + } + try { + this->children[2]->eval(t_ss); + } catch (detail::Continue_Loop &) { + } + } + } catch (detail::Break_Loop &) { + // loop broken + } + return void_var(); + }; + + if (range_expression_result.get_type_info().bare_equal_type_info( + typeid(std::vector))) { + return do_loop(boxed_cast &>( + range_expression_result)); + } else if (range_expression_result.get_type_info().bare_equal_type_info( + typeid(std::map))) { + return do_loop( + boxed_cast &>( + range_expression_result)); + } else { + const auto range_funcs = get_function("range", m_range_loc); + const auto empty_funcs = get_function("empty", m_empty_loc); + const auto front_funcs = get_function("front", m_front_loc); + const auto pop_front_funcs = + get_function("pop_front", m_pop_front_loc); + + try { + const auto range_obj = + call_function(range_funcs, range_expression_result); + while ( + !boxed_cast(call_function(empty_funcs, range_obj))) { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + t_ss.add_get_object(loop_var_name, + call_function(front_funcs, range_obj)); + try { + this->children[2]->eval(t_ss); + } catch (detail::Continue_Loop &) { + // continue statement hit + } + call_function(pop_front_funcs, range_obj); + } + } catch (detail::Break_Loop &) { + // loop broken + } + return void_var(); + } + } + +private: + mutable std::atomic_uint_fast32_t m_range_loc = {0}; + mutable std::atomic_uint_fast32_t m_empty_loc = {0}; + mutable std::atomic_uint_fast32_t m_front_loc = {0}; + mutable std::atomic_uint_fast32_t m_pop_front_loc = {0}; +}; + +template +struct For_AST_Node final : AST_Node_Impl { + For_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::For, + std::move(t_loc), std::move(t_children)) { + assert(this->children.size() == 4); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + try { + for (this->children[0]->eval(t_ss); + this->get_scoped_bool_condition(*this->children[1], t_ss); + this->children[2]->eval(t_ss)) { + try { + // Body of Loop + this->children[3]->eval(t_ss); + } catch (detail::Continue_Loop &) { + // we got a continue exception, which means all of the + // remaining loop implementation is skipped and we just need + // to continue to the next iteration step + } + } + } catch (detail::Break_Loop &) { + // loop broken + } + + return void_var(); + } +}; + +template +struct Switch_AST_Node final : AST_Node_Impl { + Switch_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Switch, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + bool breaking = false; + size_t currentCase = 1; + bool hasMatched = false; + + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + Boxed_Value match_value(this->children[0]->eval(t_ss)); + + while (!breaking && (currentCase < this->children.size())) { + try { + if (this->children[currentCase]->identifier == + AST_Node_Type::Case) { + // This is a little odd, but because want to see both the + // switch and the case simultaneously, I do a downcast here. + try { + std::array p{ + match_value, + this->children[currentCase]->children[0]->eval( + t_ss)}; + if (hasMatched || boxed_cast(t_ss->call_function( + "==", m_loc, Function_Params{p}, + t_ss.conversions()))) { + this->children[currentCase]->eval(t_ss); + hasMatched = true; + } + } catch (const exception::bad_boxed_cast &) { + throw exception::eval_error( + "Internal error: case guard evaluation not " + "boolean"); + } + } else if (this->children[currentCase]->identifier == + AST_Node_Type::Default) { + this->children[currentCase]->eval(t_ss); + hasMatched = true; + } + } catch (detail::Break_Loop &) { + breaking = true; + } + ++currentCase; + } + return void_var(); + } + + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Case_AST_Node final : AST_Node_Impl { + Case_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Case, + std::move(t_loc), std::move(t_children)) { + assert(this->children.size() == + 2); /* how many children does it have? */ + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + this->children[1]->eval(t_ss); + + return void_var(); + } +}; + +template +struct Default_AST_Node final : AST_Node_Impl { + Default_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Default, + std::move(t_loc), std::move(t_children)) { + assert(this->children.size() == 1); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + this->children[0]->eval(t_ss); + + return void_var(); + } +}; + +template +struct Inline_Array_AST_Node final : AST_Node_Impl { + Inline_Array_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Inline_Array, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + try { + std::vector vec; + if (!this->children.empty()) { + vec.reserve(this->children[0]->children.size()); + for (const auto &child : this->children[0]->children) { + vec.push_back(detail::clone_if_necessary(child->eval(t_ss), + m_loc, t_ss)); + } + } + return const_var(std::move(vec)); + } catch (const exception::dispatch_error &) { + throw exception::eval_error( + "Can not find appropriate 'clone' or copy constructor for " + "vector elements"); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Inline_Map_AST_Node final : AST_Node_Impl { + Inline_Map_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Inline_Map, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + try { + std::map retval; + + for (const auto &child : this->children[0]->children) { + retval.insert(std::make_pair( + t_ss->boxed_cast( + child->children[0]->eval(t_ss)), + detail::clone_if_necessary(child->children[1]->eval(t_ss), + m_loc, t_ss))); + } + + return const_var(std::move(retval)); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Can not find appropriate copy constructor or 'clone' while " + "inserting into Map.", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Return_AST_Node final : AST_Node_Impl { + Return_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Return, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + if (!this->children.empty()) { + throw detail::Return_Value{this->children[0]->eval(t_ss)}; + } else { + throw detail::Return_Value{void_var()}; + } + } +}; + +template +struct File_AST_Node final : AST_Node_Impl { + File_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::File, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + try { + const auto num_children = this->children.size(); + + if (num_children > 0) { + for (size_t i = 0; i < num_children - 1; ++i) { + this->children[i]->eval(t_ss); + } + return this->children.back()->eval(t_ss); + } else { + return void_var(); + } + } catch (const detail::Continue_Loop &) { + throw exception::eval_error( + "Unexpected `continue` statement outside of a loop"); + } catch (const detail::Break_Loop &) { + throw exception::eval_error( + "Unexpected `break` statement outside of a loop"); + } + } +}; + +template +struct Reference_AST_Node final : AST_Node_Impl { + Reference_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Reference, + std::move(t_loc), std::move(t_children)) { + assert(this->children.size() == 1); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Boxed_Value bv; + t_ss.add_object(this->children[0]->text, bv); + return bv; + } +}; + +template +struct Prefix_AST_Node final : AST_Node_Impl { + Prefix_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Prefix, + std::move(t_loc), std::move(t_children)), + m_oper(Operators::to_operator(this->text, true)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Boxed_Value bv(this->children[0]->eval(t_ss)); + + try { + // short circuit arithmetic operations + if (m_oper != Operators::Opers::invalid && + m_oper != Operators::Opers::bitwise_and && + bv.get_type_info().is_arithmetic()) { + if ((m_oper == Operators::Opers::pre_increment || + m_oper == Operators::Opers::pre_decrement) && + bv.is_const()) { + throw exception::eval_error( + "Error with prefix operator evaluation: cannot modify " + "constant value."); + } + return Boxed_Number::do_oper(m_oper, bv); + } else { + Carbon::eval::detail::Function_Push_Pop fpp(t_ss); + fpp.save_params(Function_Params{bv}); + return t_ss->call_function( + this->text, m_loc, Function_Params{bv}, t_ss.conversions()); + } + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Error with prefix operator evaluation: '" + this->text + "'", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + Operators::Opers m_oper = Operators::Opers::invalid; + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Break_AST_Node final : AST_Node_Impl { + Break_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Break, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &) const override { + throw detail::Break_Loop(); + } +}; + +template +struct Continue_AST_Node final : AST_Node_Impl { + Continue_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Continue, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &) const override { + throw detail::Continue_Loop(); + } +}; + +template +struct Noop_AST_Node final : AST_Node_Impl { + Noop_AST_Node() + : AST_Node_Impl("", AST_Node_Type::Noop, Parse_Location()) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &) const override { + // It's a no-op, that evaluates to "void" + return val; + } + + Boxed_Value val = void_var(); +}; + +template +struct Map_Pair_AST_Node final : AST_Node_Impl { + Map_Pair_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Map_Pair, + std::move(t_loc), std::move(t_children)) {} +}; + +template +struct Value_Range_AST_Node final : AST_Node_Impl { + Value_Range_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Value_Range, std::move(t_loc), + std::move(t_children)) {} +}; + +template +struct Inline_Range_AST_Node final : AST_Node_Impl { + Inline_Range_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Inline_Range, std::move(t_loc), + std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + try { + std::array params{ + this->children[0]->children[0]->children[0]->eval(t_ss), + this->children[0]->children[0]->children[1]->eval(t_ss)}; + + return t_ss->call_function("generate_range", m_loc, + Function_Params{params}, + t_ss.conversions()); + } catch (const exception::dispatch_error &e) { + throw exception::eval_error( + "Unable to generate range vector, while calling " + "'generate_range'", + e.parameters, e.functions, false, *t_ss); + } + } + +private: + mutable std::atomic_uint_fast32_t m_loc = {0}; +}; + +template +struct Try_AST_Node final : AST_Node_Impl { + Try_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Try, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value handle_exception(const Carbon::detail::Dispatch_State &t_ss, + const Boxed_Value &t_except) const { + Boxed_Value retval; + + size_t end_point = this->children.size(); + if (this->children.back()->identifier == AST_Node_Type::Finally) { + assert(end_point > 0); + end_point = this->children.size() - 1; + } + for (size_t i = 1; i < end_point; ++i) { + Carbon::eval::detail::Scope_Push_Pop catch_scope(t_ss); + auto &catch_block = *this->children[i]; + + if (catch_block.children.size() == 1) { + // No variable capture + retval = catch_block.children[0]->eval(t_ss); + break; + } else if (catch_block.children.size() == 2 || + catch_block.children.size() == 3) { + const auto name = Arg_List_AST_Node::get_arg_name( + *catch_block.children[0]); + + if (dispatch::Param_Types( + std::vector>{ + Arg_List_AST_Node::get_arg_type( + *catch_block.children[0], t_ss)}) + .match(Function_Params{t_except}, t_ss.conversions()) + .first) { + t_ss.add_object(name, t_except); + + if (catch_block.children.size() == 2) { + // Variable capture + retval = catch_block.children[1]->eval(t_ss); + break; + } + } + } else { + if (this->children.back()->identifier == + AST_Node_Type::Finally) { + this->children.back()->children[0]->eval(t_ss); + } + throw exception::eval_error( + "Internal error: catch block size unrecognized"); + } + } + + return retval; + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + Boxed_Value retval; + + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + try { + retval = this->children[0]->eval(t_ss); + } catch (const exception::eval_error &e) { + retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); + } catch (const std::runtime_error &e) { + retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); + } catch (const std::out_of_range &e) { + retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); + } catch (const std::exception &e) { + retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); + } catch (Boxed_Value &e) { + retval = handle_exception(t_ss, e); + } catch (...) { + if (this->children.back()->identifier == AST_Node_Type::Finally) { + this->children.back()->children[0]->eval(t_ss); + } + throw; + } + + if (this->children.back()->identifier == AST_Node_Type::Finally) { + retval = this->children.back()->children[0]->eval(t_ss); + } + + return retval; + } +}; + +template +struct Catch_AST_Node final : AST_Node_Impl { + Catch_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Catch, + std::move(t_loc), std::move(t_children)) {} +}; + +template +struct Finally_AST_Node final : AST_Node_Impl { + Finally_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Finally, + std::move(t_loc), std::move(t_children)) {} +}; + +template +struct Method_AST_Node final : AST_Node_Impl { + std::shared_ptr> m_body_node; + std::shared_ptr> m_guard_node; + + Method_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl( + std::move(t_ast_node_text), AST_Node_Type::Method, + std::move(t_loc), + std::vector>( + std::make_move_iterator(t_children.begin()), + std::make_move_iterator(std::prev( + t_children.end(), + Def_AST_Node::has_guard(t_children, 1) ? 2 : 1)))), + m_body_node(Def_AST_Node::get_body_node(std::move(t_children))), + m_guard_node(Def_AST_Node::get_guard_node( + std::move(t_children), + t_children.size() - this->children.size() == 2)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + AST_Node_Impl_Ptr guardnode; + + const std::string &class_name = this->children[0]->text; + + // The first param of a method is always the implied this ptr. + std::vector t_param_names{"this"}; + dispatch::Param_Types param_types; + + if ((this->children.size() > 2) && + (this->children[2]->identifier == AST_Node_Type::Arg_List)) { + auto args = Arg_List_AST_Node::get_arg_names(*this->children[2]); + t_param_names.insert(t_param_names.end(), args.begin(), args.end()); + param_types = + Arg_List_AST_Node::get_arg_types(*this->children[2], t_ss); + } + + const size_t numparams = t_param_names.size(); + + std::shared_ptr guard; + std::reference_wrapper engine( + *t_ss); + if (m_guard_node) { + guard = dispatch::make_dynamic_proxy_function( + [engine, t_param_names, + guardnode = m_guard_node](const Function_Params &t_params) { + return Carbon::eval::detail::eval_function( + engine, *guardnode, t_param_names, t_params); + }, + static_cast(numparams), m_guard_node); + } + + try { + const std::string &function_name = this->children[1]->text; + + if (function_name == class_name) { + param_types.push_front(class_name, Type_Info()); + + t_ss->add( + std::make_shared< + dispatch::detail::Dynamic_Object_Constructor>( + class_name, + dispatch::make_dynamic_proxy_function( + [engine, t_param_names, node = m_body_node]( + const Function_Params &t_params) { + return Carbon::eval::detail::eval_function( + engine, *node, t_param_names, t_params); + }, + static_cast(numparams), m_body_node, + param_types, guard)), + function_name); + + } else { + // if the type is unknown, then this generates a function that + // looks up the type at runtime. Defining the type first before + // this is called is better + auto type = t_ss->get_type(class_name, false); + param_types.push_front(class_name, type); + + t_ss->add( + std::make_shared( + class_name, + dispatch::make_dynamic_proxy_function( + [engine, t_param_names, node = m_body_node]( + const Function_Params &t_params) { + return Carbon::eval::detail::eval_function( + engine, *node, t_param_names, t_params); + }, + static_cast(numparams), m_body_node, + param_types, guard), + type), + function_name); + } + } catch (const exception::name_conflict_error &e) { + throw exception::eval_error("Method redefined '" + e.name() + "'"); + } + return void_var(); + } +}; + +template +struct Attr_Decl_AST_Node final : AST_Node_Impl { + Attr_Decl_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Attr_Decl, + std::move(t_loc), std::move(t_children)) {} + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + std::string class_name = this->children[0]->text; + + try { + std::string attr_name = this->children[1]->text; + + t_ss->add( + std::make_shared( + std::move(class_name), + fun([attr_name](dispatch::Dynamic_Object &t_obj) { + return t_obj.get_attr(attr_name); + }), + true + + ), + this->children[1]->text); + } catch (const exception::name_conflict_error &e) { + throw exception::eval_error("Attribute redefined '" + e.name() + + "'"); + } + return void_var(); + } +}; + +template +struct Logical_And_AST_Node final : AST_Node_Impl { + Logical_And_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Logical_And, std::move(t_loc), + std::move(t_children)) { + assert(this->children.size() == 2); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return const_var( + this->get_bool_condition(this->children[0]->eval(t_ss), t_ss) && + this->get_bool_condition(this->children[1]->eval(t_ss), t_ss)); + } +}; + +template +struct Logical_Or_AST_Node final : AST_Node_Impl { + Logical_Or_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, + std::vector> t_children) + : AST_Node_Impl(std::move(t_ast_node_text), + AST_Node_Type::Logical_Or, std::move(t_loc), + std::move(t_children)) { + assert(this->children.size() == 2); + } + + Boxed_Value eval_internal( + const Carbon::detail::Dispatch_State &t_ss) const override { + return const_var( + this->get_bool_condition(this->children[0]->eval(t_ss), t_ss) || + this->get_bool_condition(this->children[1]->eval(t_ss), t_ss)); + } +}; +} // namespace eval + +} // namespace Carbon +#endif /* CARBON_EVAL_HPP */ diff --git a/src/carbon/language/optimizer.hpp b/src/carbon/language/optimizer.hpp new file mode 100644 index 00000000..9d4bcc78 --- /dev/null +++ b/src/carbon/language/optimizer.hpp @@ -0,0 +1,521 @@ + + +#ifndef CARBON_OPTIMIZER_HPP +#define CARBON_OPTIMIZER_HPP + +#include "eval.hpp" + +namespace Carbon { +namespace optimizer { +template +struct Optimizer : T... { + Optimizer() = default; + explicit Optimizer(T... t) : T(std::move(t))... {} + + template + auto optimize(eval::AST_Node_Impl_Ptr p) { + ((p = static_cast(*this).optimize(std::move(p))), ...); + return p; + } +}; + +template +eval::AST_Node_Impl &child_at(eval::AST_Node_Impl &node, + const size_t offset) noexcept { + if (node.children[offset]->identifier == AST_Node_Type::Compiled) { + return *( + dynamic_cast &>(*node.children[offset]) + .m_original_node); + } else { + return *node.children[offset]; + } +} + +template +const eval::AST_Node_Impl &child_at(const eval::AST_Node_Impl &node, + const size_t offset) noexcept { + if (node.children[offset]->identifier == AST_Node_Type::Compiled) { + return *(dynamic_cast &>( + *node.children[offset]) + .m_original_node); + } else { + return *node.children[offset]; + } + + /* + if (node->identifier == AST_Node_Type::Compiled) { + return dynamic_cast&>(*node).m_original_node->children[offset]; } else + { return node->children[offset]; + } + */ +} + +template +auto child_count(const eval::AST_Node_Impl &node) noexcept { + if (node.identifier == AST_Node_Type::Compiled) { + return dynamic_cast &>(node) + .m_original_node->children.size(); + } else { + return node.children.size(); + } +} + +template +auto make_compiled_node(eval::AST_Node_Impl_Ptr original_node, + std::vector> children, + Callable callable) { + return Carbon::make_unique, + eval::Compiled_AST_Node>( + std::move(original_node), std::move(children), std::move(callable)); +} + +struct Return { + template + auto optimize(eval::AST_Node_Impl_Ptr p) { + if ((p->identifier == AST_Node_Type::Def || + p->identifier == AST_Node_Type::Lambda) && + !p->children.empty()) { + auto &last_child = p->children.back(); + if (last_child->identifier == AST_Node_Type::Block) { + auto &block_last_child = last_child->children.back(); + if (block_last_child->identifier == AST_Node_Type::Return) { + if (block_last_child->children.size() == 1) { + last_child->children.back() = + std::move(block_last_child->children[0]); + } + } + } + } + + return p; + } +}; + +template +bool contains_var_decl_in_scope(const eval::AST_Node_Impl &node) noexcept { + if (node.identifier == AST_Node_Type::Var_Decl || + node.identifier == AST_Node_Type::Assign_Decl || + node.identifier == AST_Node_Type::Reference) { + return true; + } + + const auto num = child_count(node); + + for (size_t i = 0; i < num; ++i) { + const auto &child = child_at(node, i); + if (child.identifier != AST_Node_Type::Block && + child.identifier != AST_Node_Type::For && + child.identifier != AST_Node_Type::Ranged_For && + contains_var_decl_in_scope(child)) { + return true; + } + } + + return false; +} + +struct Block { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if (node->identifier == AST_Node_Type::Block) { + if (!contains_var_decl_in_scope(*node)) { + if (node->children.size() == 1) { + return std::move(node->children[0]); + } else { + return Carbon::make_unique< + eval::AST_Node_Impl, + eval::Scopeless_Block_AST_Node>( + node->text, node->location, std::move(node->children)); + } + } + } + + return node; + } +}; + +struct Dead_Code { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if (node->identifier == AST_Node_Type::Block) { + std::vector keepers; + const auto num_children = node->children.size(); + keepers.reserve(num_children); + + for (size_t i = 0; i < num_children; ++i) { + const auto &child = *node->children[i]; + if ((child.identifier != AST_Node_Type::Id && + child.identifier != AST_Node_Type::Constant && + child.identifier != AST_Node_Type::Noop) || + i == num_children - 1) { + keepers.push_back(i); + } + } + + if (keepers.size() == num_children) { + return node; + } else { + const auto new_children = [&]() { + std::vector> retval; + for (const auto x : keepers) { + retval.push_back(std::move(node->children[x])); + } + return retval; + }; + + return Carbon::make_unique, + eval::Block_AST_Node>( + node->text, node->location, new_children()); + } + } else { + return node; + } + } +}; + +struct Unused_Return { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if ((node->identifier == AST_Node_Type::Block || + node->identifier == AST_Node_Type::Scopeless_Block) && + !node->children.empty()) { + for (size_t i = 0; i < node->children.size() - 1; ++i) { + auto child = node->children[i].get(); + if (child->identifier == AST_Node_Type::Fun_Call) { + node->children[i] = Carbon::make_unique< + eval::AST_Node_Impl, + eval::Unused_Return_Fun_Call_AST_Node>( + child->text, child->location, + std::move(child->children)); + } + } + } else if ((node->identifier == AST_Node_Type::For || + node->identifier == AST_Node_Type::While) && + child_count(*node) > 0) { + auto &child = child_at(*node, child_count(*node) - 1); + if (child.identifier == AST_Node_Type::Block || + child.identifier == AST_Node_Type::Scopeless_Block) { + auto num_sub_children = child_count(child); + for (size_t i = 0; i < num_sub_children; ++i) { + auto &sub_child = child_at(child, i); + if (sub_child.identifier == AST_Node_Type::Fun_Call) { + child.children[i] = Carbon::make_unique< + eval::AST_Node_Impl, + eval::Unused_Return_Fun_Call_AST_Node>( + sub_child.text, sub_child.location, + std::move(sub_child.children)); + } + } + } + } + return node; + } +}; + +struct Assign_Decl { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if ((node->identifier == AST_Node_Type::Equation) && + node->text == "=" && node->children.size() == 2 && + node->children[0]->identifier == AST_Node_Type::Var_Decl) { + std::vector> new_children; + new_children.push_back(std::move(node->children[0]->children[0])); + new_children.push_back(std::move(node->children[1])); + return Carbon::make_unique, + eval::Assign_Decl_AST_Node>( + node->text, node->location, std::move(new_children)); + } + + return node; + } +}; + +struct If { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if ((node->identifier == AST_Node_Type::If) && + node->children.size() >= 2 && + node->children[0]->identifier == AST_Node_Type::Constant) { + const auto condition = dynamic_cast *>( + node->children[0].get()) + ->m_value; + if (condition.get_type_info().bare_equal_type_info(typeid(bool))) { + if (boxed_cast(condition)) { + return std::move(node->children[1]); + } else if (node->children.size() == 3) { + return std::move(node->children[2]); + } + } + } + + return node; + } +}; + +struct Partial_Fold { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + // Fold right side + if (node->identifier == AST_Node_Type::Binary && + node->children.size() == 2 && + node->children[0]->identifier != AST_Node_Type::Constant && + node->children[1]->identifier == AST_Node_Type::Constant) { + try { + const auto &oper = node->text; + const auto parsed = Operators::to_operator(oper); + if (parsed != Operators::Opers::invalid) { + const auto rhs = dynamic_cast *>( + node->children[1].get()) + ->m_value; + if (rhs.get_type_info().is_arithmetic()) { + return Carbon::make_unique< + eval::AST_Node_Impl, + eval::Fold_Right_Binary_Operator_AST_Node>( + node->text, node->location, + std::move(node->children), rhs); + } + } + } catch (const std::exception &) { + // failure to fold, that's OK + } + } + + return node; + } +}; + +struct Constant_Fold { + template + auto optimize(eval::AST_Node_Impl_Ptr node) { + if (node->identifier == AST_Node_Type::Prefix && + node->children.size() == 1 && + node->children[0]->identifier == AST_Node_Type::Constant) { + try { + const auto &oper = node->text; + const auto parsed = Operators::to_operator(oper, true); + const auto lhs = + dynamic_cast *>( + node->children[0].get()) + ->m_value; + const auto match = oper + node->children[0]->text; + + if (parsed != Operators::Opers::invalid && + parsed != Operators::Opers::bitwise_and && + lhs.get_type_info().is_arithmetic()) { + const auto val = Boxed_Number::do_oper(parsed, lhs); + return Carbon::make_unique, + eval::Constant_AST_Node>( + std::move(match), node->location, std::move(val)); + } else if (lhs.get_type_info().bare_equal_type_info( + typeid(bool)) && + oper == "!") { + return Carbon::make_unique, + eval::Constant_AST_Node>( + std::move(match), node->location, + Boxed_Value(!boxed_cast(lhs))); + } + } catch (const std::exception &) { + // failure to fold, that's OK + } + } else if ((node->identifier == AST_Node_Type::Logical_And || + node->identifier == AST_Node_Type::Logical_Or) && + node->children.size() == 2 && + node->children[0]->identifier == AST_Node_Type::Constant && + node->children[1]->identifier == AST_Node_Type::Constant) { + try { + const auto lhs = + dynamic_cast &>( + *node->children[0]) + .m_value; + const auto rhs = + dynamic_cast &>( + *node->children[1]) + .m_value; + if (lhs.get_type_info().bare_equal_type_info(typeid(bool)) && + rhs.get_type_info().bare_equal_type_info(typeid(bool))) { + const auto match = node->children[0]->text + " " + + node->text + " " + + node->children[1]->text; + const auto val = [lhs_val = boxed_cast(lhs), + rhs_val = boxed_cast(rhs), + id = node->identifier] { + if (id == AST_Node_Type::Logical_And) { + return Boxed_Value(lhs_val && rhs_val); + } else { + return Boxed_Value(lhs_val || rhs_val); + } + }(); + + return Carbon::make_unique, + eval::Constant_AST_Node>( + std::move(match), node->location, std::move(val)); + } + } catch (const std::exception &) { + // failure to fold, that's OK + } + } else if (node->identifier == AST_Node_Type::Binary && + node->children.size() == 2 && + node->children[0]->identifier == AST_Node_Type::Constant && + node->children[1]->identifier == AST_Node_Type::Constant) { + try { + const auto &oper = node->text; + const auto parsed = Operators::to_operator(oper); + if (parsed != Operators::Opers::invalid) { + const auto lhs = + dynamic_cast &>( + *node->children[0]) + .m_value; + const auto rhs = + dynamic_cast &>( + *node->children[1]) + .m_value; + if (lhs.get_type_info().is_arithmetic() && + rhs.get_type_info().is_arithmetic()) { + const auto val = + Boxed_Number::do_oper(parsed, lhs, rhs); + const auto match = node->children[0]->text + " " + + oper + " " + node->children[1]->text; + return Carbon::make_unique< + eval::AST_Node_Impl, eval::Constant_AST_Node>( + std::move(match), node->location, std::move(val)); + } + } + } catch (const std::exception &) { + // failure to fold, that's OK + } + } else if (node->identifier == AST_Node_Type::Fun_Call && + node->children.size() == 2 && + node->children[0]->identifier == AST_Node_Type::Id && + node->children[1]->identifier == AST_Node_Type::Arg_List && + node->children[1]->children.size() == 1 && + node->children[1]->children[0]->identifier == + AST_Node_Type::Constant) { + const auto arg = dynamic_cast &>( + *node->children[1]->children[0]) + .m_value; + if (arg.get_type_info().is_arithmetic()) { + const auto &fun_name = node->children[0]->text; + + const auto make_constant = [&node, &fun_name](auto val) { + const auto match = fun_name + "(" + + node->children[1]->children[0]->text + + ")"; + return Carbon::make_unique, + eval::Constant_AST_Node>( + std::move(match), node->location, const_var(val)); + }; + + if (fun_name == "double") { + return make_constant(Boxed_Number(arg).get_as()); + } else if (fun_name == "int") { + return make_constant(Boxed_Number(arg).get_as()); + } else if (fun_name == "float") { + return make_constant(Boxed_Number(arg).get_as()); + } else if (fun_name == "long") { + return make_constant(Boxed_Number(arg).get_as()); + } else if (fun_name == "size_t") { + return make_constant(Boxed_Number(arg).get_as()); + } + } + } + + return node; + } +}; + +struct For_Loop { + template + auto optimize(eval::AST_Node_Impl_Ptr for_node) { + if (for_node->identifier != AST_Node_Type::For) { + return for_node; + } + + const auto &eq_node = child_at(*for_node, 0); + const auto &binary_node = child_at(*for_node, 1); + const auto &prefix_node = child_at(*for_node, 2); + + if (child_count(*for_node) == 4 && + eq_node.identifier == AST_Node_Type::Assign_Decl && + child_count(eq_node) == 2 && + child_at(eq_node, 0).identifier == AST_Node_Type::Id && + child_at(eq_node, 1).identifier == AST_Node_Type::Constant && + binary_node.identifier == AST_Node_Type::Binary && + binary_node.text == "<" && child_count(binary_node) == 2 && + child_at(binary_node, 0).identifier == AST_Node_Type::Id && + child_at(binary_node, 0).text == child_at(eq_node, 0).text && + child_at(binary_node, 1).identifier == AST_Node_Type::Constant && + prefix_node.identifier == AST_Node_Type::Prefix && + prefix_node.text == "++" && child_count(prefix_node) == 1 && + child_at(prefix_node, 0).identifier == AST_Node_Type::Id && + child_at(prefix_node, 0).text == child_at(eq_node, 0).text) { + const Boxed_Value &begin = + dynamic_cast &>( + child_at(eq_node, 1)) + .m_value; + const Boxed_Value &end = + dynamic_cast &>( + child_at(binary_node, 1)) + .m_value; + const std::string &id = child_at(prefix_node, 0).text; + + if (begin.get_type_info().bare_equal(user_type()) && + end.get_type_info().bare_equal(user_type())) { + const auto start_int = boxed_cast(begin); + const auto end_int = boxed_cast(end); + + // note that we are moving the last element out, then popping + // the empty shared_ptr from the vector + std::vector> body_vector; + auto body_child = std::move(for_node->children[3]); + for_node->children.pop_back(); + body_vector.emplace_back(std::move(body_child)); + + return make_compiled_node( + std::move(for_node), std::move(body_vector), + [id, start_int, end_int]( + const std::vector> &children, + const Carbon::detail::Dispatch_State &t_ss) { + assert(children.size() == 1); + Carbon::eval::detail::Scope_Push_Pop spp(t_ss); + + int i = start_int; + t_ss.add_object(id, var(&i)); + + try { + for (; i < end_int; ++i) { + try { + // Body of Loop + children[0]->eval(t_ss); + } catch (eval::detail::Continue_Loop &) { + // we got a continue exception, which means + // all of the remaining loop implementation + // is skipped and we just need to continue + // to the next iteration step + } + } + } catch (eval::detail::Break_Loop &) { + // loop broken + } + + return void_var(); + }); + } else { + return for_node; + } + } else { + return for_node; + } + } +}; + +using Optimizer_Default = + Optimizer; + +} // namespace optimizer +} // namespace Carbon + +#endif diff --git a/src/carbon/language/parser.hpp b/src/carbon/language/parser.hpp new file mode 100644 index 00000000..37a4816e --- /dev/null +++ b/src/carbon/language/parser.hpp @@ -0,0 +1,3178 @@ + + +#ifndef CARBON_PARSER_HPP +#define CARBON_PARSER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../command/boxed_value.hpp" +#include "../utils/hash.hpp" +#include "../utils/static_string.hpp" +#include "common.hpp" +#include "optimizer.hpp" +#include "tracer.hpp" + +#if defined(CARBON_UTF16_UTF32) +#include +#include +#endif + +#if defined(CARBON_MSVC) && defined(max) && defined(min) +#define CARBON_PUSHED_MIN_MAX +#pragma push_macro("max") // Why Microsoft? why? This is worse than bad +#undef max +#pragma push_macro("min") +#undef min +#endif + +namespace Carbon { +/// \brief Classes and functions used during the parsing process. +namespace parser { +/// \brief Classes and functions internal to the parsing process. Not supported +/// for the end user. +namespace detail { +enum Alphabet { + symbol_alphabet = 0, + keyword_alphabet, + int_alphabet, + float_alphabet, + x_alphabet, + hex_alphabet, + b_alphabet, + bin_alphabet, + id_alphabet, + white_alphabet, + int_suffix_alphabet, + float_suffix_alphabet, + max_alphabet, + lengthof_alphabet = 256 +}; + +// Generic for u16, u32 and wchar +template +struct Char_Parser_Helper { + // common for all implementations + static std::string u8str_from_ll(long long val) { + using char_type = std::string::value_type; + + char_type c[2]; + c[1] = char_type(val); + c[0] = char_type(val >> 8); + + if (c[0] == 0) { + return std::string(1, c[1]); // size, character + } + + return std::string(c, 2); // char buffer, size + } + + static string_type str_from_ll(long long val) { + using target_char_type = typename string_type::value_type; +#if defined(CARBON_UTF16_UTF32) + // prepare converter + std::wstring_convert, + target_char_type> + converter; + // convert + return converter.from_bytes(u8str_from_ll(val)); +#else + // no conversion available, just put value as character + return string_type(1, target_char_type(val)); // size, character +#endif + } +}; + +// Specialization for char AKA UTF-8 +template <> +struct Char_Parser_Helper { + static std::string str_from_ll(long long val) { + // little SFINAE trick to avoid base class + return Char_Parser_Helper::u8str_from_ll(val); + } +}; +} // namespace detail + +template +class ChaiScript_Parser final : public ChaiScript_Parser_Base { + void *get_tracer_ptr() noexcept override { return &m_tracer; } + + std::size_t m_current_parse_depth = 0; + + struct Depth_Counter { + static const auto max_depth = Parse_Depth; + Depth_Counter(ChaiScript_Parser *t_parser) : parser(t_parser) { + ++parser->m_current_parse_depth; + if (parser->m_current_parse_depth > max_depth) { + throw exception::eval_error( + "Maximum parse depth exceeded", + File_Position(parser->m_position.line, + parser->m_position.col), + *(parser->m_filename)); + } + } + + ~Depth_Counter() noexcept { --parser->m_current_parse_depth; } + + ChaiScript_Parser *parser; + }; + + template + constexpr static void set_alphabet(Array2D &array, const First first, + const Second second) noexcept { + auto *first_ptr = &std::get<0>(array) + static_cast(first); + auto *second_ptr = + &std::get<0>(*first_ptr) + static_cast(second); + *second_ptr = true; + } + + constexpr static std::array, + detail::max_alphabet> + build_alphabet() noexcept { + std::array, + detail::max_alphabet> + alphabet{}; + + set_alphabet(alphabet, detail::symbol_alphabet, '?'); + + set_alphabet(alphabet, detail::symbol_alphabet, '?'); + set_alphabet(alphabet, detail::symbol_alphabet, '+'); + set_alphabet(alphabet, detail::symbol_alphabet, '-'); + set_alphabet(alphabet, detail::symbol_alphabet, '*'); + set_alphabet(alphabet, detail::symbol_alphabet, '/'); + set_alphabet(alphabet, detail::symbol_alphabet, '|'); + set_alphabet(alphabet, detail::symbol_alphabet, '&'); + set_alphabet(alphabet, detail::symbol_alphabet, '^'); + set_alphabet(alphabet, detail::symbol_alphabet, '='); + set_alphabet(alphabet, detail::symbol_alphabet, '.'); + set_alphabet(alphabet, detail::symbol_alphabet, '<'); + set_alphabet(alphabet, detail::symbol_alphabet, '>'); + + for (size_t c = 'a'; c <= 'z'; ++c) { + set_alphabet(alphabet, detail::keyword_alphabet, c); + } + for (size_t c = 'A'; c <= 'Z'; ++c) { + set_alphabet(alphabet, detail::keyword_alphabet, c); + } + for (size_t c = '0'; c <= '9'; ++c) { + set_alphabet(alphabet, detail::keyword_alphabet, c); + } + set_alphabet(alphabet, detail::keyword_alphabet, '_'); + + for (size_t c = '0'; c <= '9'; ++c) { + set_alphabet(alphabet, detail::int_alphabet, c); + } + for (size_t c = '0'; c <= '9'; ++c) { + set_alphabet(alphabet, detail::float_alphabet, c); + } + set_alphabet(alphabet, detail::float_alphabet, '.'); + + for (size_t c = '0'; c <= '9'; ++c) { + set_alphabet(alphabet, detail::hex_alphabet, c); + } + for (size_t c = 'a'; c <= 'f'; ++c) { + set_alphabet(alphabet, detail::hex_alphabet, c); + } + for (size_t c = 'A'; c <= 'F'; ++c) { + set_alphabet(alphabet, detail::hex_alphabet, c); + } + + set_alphabet(alphabet, detail::x_alphabet, 'x'); + set_alphabet(alphabet, detail::x_alphabet, 'X'); + + for (size_t c = '0'; c <= '1'; ++c) { + set_alphabet(alphabet, detail::bin_alphabet, c); + } + set_alphabet(alphabet, detail::b_alphabet, 'b'); + set_alphabet(alphabet, detail::b_alphabet, 'B'); + + for (size_t c = 'a'; c <= 'z'; ++c) { + set_alphabet(alphabet, detail::id_alphabet, c); + } + for (size_t c = 'A'; c <= 'Z'; ++c) { + set_alphabet(alphabet, detail::id_alphabet, c); + } + set_alphabet(alphabet, detail::id_alphabet, '_'); + + set_alphabet(alphabet, detail::white_alphabet, ' '); + set_alphabet(alphabet, detail::white_alphabet, '\t'); + + set_alphabet(alphabet, detail::int_suffix_alphabet, 'l'); + set_alphabet(alphabet, detail::int_suffix_alphabet, 'L'); + set_alphabet(alphabet, detail::int_suffix_alphabet, 'u'); + set_alphabet(alphabet, detail::int_suffix_alphabet, 'U'); + + set_alphabet(alphabet, detail::float_suffix_alphabet, 'l'); + set_alphabet(alphabet, detail::float_suffix_alphabet, 'L'); + set_alphabet(alphabet, detail::float_suffix_alphabet, 'f'); + set_alphabet(alphabet, detail::float_suffix_alphabet, 'F'); + + return alphabet; + } + + struct Operator_Matches { + using SS = utility::Static_String; + + std::array m_0{{SS("?")}}; + std::array m_1{{SS("||")}}; + std::array m_2{{SS("&&")}}; + std::array m_3{{SS("|")}}; + std::array m_4{{SS("^")}}; + std::array m_5{{SS("&")}}; + std::array m_6{{SS("=="), SS("!=")}}; + std::array m_7{ + {SS("<"), SS("<="), SS(">"), SS(">=")}}; + std::array m_8{{SS("<<"), SS(">>")}}; + // We share precedence here but then separate them later + std::array m_9{{SS("+"), SS("-")}}; + std::array m_10{{SS("*"), SS("/"), SS("%")}}; + std::array m_11{ + {SS("++"), SS("--"), SS("-"), SS("+"), SS("!"), SS("~")}}; + + bool is_match(std::string_view t_str) const noexcept { + constexpr std::array groups{ + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + return std::any_of(groups.begin(), groups.end(), + [&t_str, this](const std::size_t group) { + return is_match(group, t_str); + }); + } + + template + bool any_of(const std::size_t t_group, Predicate &&predicate) const { + auto match = [&predicate](const auto &array) { + return std::any_of(array.begin(), array.end(), predicate); + }; + + switch (t_group) { + case 0: + return match(m_0); + case 1: + return match(m_1); + case 2: + return match(m_2); + case 3: + return match(m_3); + case 4: + return match(m_4); + case 5: + return match(m_5); + case 6: + return match(m_6); + case 7: + return match(m_7); + case 8: + return match(m_8); + case 9: + return match(m_9); + case 10: + return match(m_10); + case 11: + return match(m_11); + default: + return false; + } + } + + constexpr bool is_match(const std::size_t t_group, + std::string_view t_str) const noexcept { + auto match = [&t_str](const auto &array) { + return std::any_of( + array.begin(), array.end(), + [&t_str](const auto &v) { return v == t_str; }); + }; + + switch (t_group) { + case 0: + return match(m_0); + case 1: + return match(m_1); + case 2: + return match(m_2); + case 3: + return match(m_3); + case 4: + return match(m_4); + case 5: + return match(m_5); + case 6: + return match(m_6); + case 7: + return match(m_7); + case 8: + return match(m_8); + case 9: + return match(m_9); + case 10: + return match(m_10); + case 11: + return match(m_11); + default: + return false; + } + } + }; + + constexpr static std::array + create_operators() noexcept { + std::array operators = { + {Operator_Precedence::Ternary_Cond, Operator_Precedence::Logical_Or, + Operator_Precedence::Logical_And, Operator_Precedence::Bitwise_Or, + Operator_Precedence::Bitwise_Xor, Operator_Precedence::Bitwise_And, + Operator_Precedence::Equality, Operator_Precedence::Comparison, + Operator_Precedence::Shift, Operator_Precedence::Addition, + Operator_Precedence::Multiplication, Operator_Precedence::Prefix}}; + return operators; + } + + constexpr static utility::Static_String m_multiline_comment_end{"*/"}; + constexpr static utility::Static_String m_multiline_comment_begin{"/*"}; + constexpr static utility::Static_String m_singleline_comment{"//"}; + constexpr static utility::Static_String m_annotation{"#"}; + constexpr static utility::Static_String m_cr_lf{"\r\n"}; + constexpr static auto m_operators = create_operators(); + + std::shared_ptr m_filename; + std::vector> m_match_stack; + + struct Position { + constexpr Position() = default; + + constexpr Position(const char *t_pos, const char *t_end) noexcept + : line(1), col(1), m_pos(t_pos), m_end(t_end), m_last_col(1) {} + + static std::string_view str(const Position &t_begin, + const Position &t_end) noexcept { + if (t_begin.m_pos != nullptr && t_end.m_pos != nullptr) { + return std::string_view( + t_begin.m_pos, + std::size_t(std::distance(t_begin.m_pos, t_end.m_pos))); + } else { + return {}; + } + } + + constexpr Position &operator++() noexcept { + if (m_pos != m_end) { + if (*m_pos == '\n') { + ++line; + m_last_col = col; + col = 1; + } else { + ++col; + } + + ++m_pos; + } + return *this; + } + + constexpr Position &operator--() noexcept { + --m_pos; + if (*m_pos == '\n') { + --line; + col = m_last_col; + } else { + --col; + } + return *this; + } + + constexpr Position &operator+=(size_t t_distance) noexcept { + *this = (*this) + t_distance; + return *this; + } + + constexpr Position operator+(size_t t_distance) const noexcept { + Position ret(*this); + for (size_t i = 0; i < t_distance; ++i) { + ++ret; + } + return ret; + } + + constexpr Position &operator-=(size_t t_distance) noexcept { + *this = (*this) - t_distance; + return *this; + } + + constexpr Position operator-(size_t t_distance) const noexcept { + Position ret(*this); + for (size_t i = 0; i < t_distance; ++i) { + --ret; + } + return ret; + } + + constexpr bool operator==(const Position &t_rhs) const noexcept { + return m_pos == t_rhs.m_pos; + } + + constexpr bool operator!=(const Position &t_rhs) const noexcept { + return m_pos != t_rhs.m_pos; + } + + constexpr bool has_more() const noexcept { return m_pos != m_end; } + + constexpr size_t remaining() const noexcept { + return static_cast(m_end - m_pos); + } + + constexpr const char &operator*() const noexcept { + if (m_pos == m_end) { + return ""[0]; + } else { + return *m_pos; + } + } + + int line = -1; + int col = -1; + + private: + const char *m_pos = nullptr; + const char *m_end = nullptr; + int m_last_col = -1; + }; + + Position m_position; + + Tracer m_tracer; + Optimizer m_optimizer; + + void validate_object_name(std::string_view name) const { + if (!Name_Validator::valid_object_name(name)) { + throw exception::eval_error( + "Invalid Object Name: " + std::string(name), + File_Position(m_position.line, m_position.col), *m_filename); + } + } + +public: + explicit ChaiScript_Parser(Tracer tracer = Tracer(), + Optimizer optimizer = Optimizer()) + : m_tracer(std::move(tracer)), m_optimizer(std::move(optimizer)) { + m_match_stack.reserve(2); + } + + Tracer &get_tracer() noexcept { return m_tracer; } + + Optimizer &get_optimizer() noexcept { return m_optimizer; } + + ChaiScript_Parser(const ChaiScript_Parser &) = delete; + ChaiScript_Parser &operator=(const ChaiScript_Parser &) = delete; + ChaiScript_Parser(ChaiScript_Parser &&) = default; + ChaiScript_Parser &operator=(ChaiScript_Parser &&) = delete; + + constexpr static auto m_alphabet = build_alphabet(); + constexpr static Operator_Matches m_operator_matches{}; + + /// test a char in an m_alphabet + constexpr bool char_in_alphabet(char c, detail::Alphabet a) const noexcept { + return m_alphabet[a][static_cast(c)]; + } + + /// Prints the parsed ast_nodes as a tree + void debug_print(const AST_Node &t, + std::string prepend = "") const override { + std::cout << prepend << "(" << ast_node_type_to_string(t.identifier) + << ") " << t.text << " : " << t.start().line << ", " + << t.start().column << '\n'; + for (const auto &node : t.get_children()) { + debug_print(node.get(), prepend + " "); + } + } + + /// Helper function that collects ast_nodes from a starting position to the + /// top of the stack into a new AST node + template + void build_match(size_t t_match_start, std::string t_text = "") { + bool is_deep = false; + + Parse_Location filepos = [&]() -> Parse_Location { + // so we want to take everything to the right of this and make them + // children + if (t_match_start != m_match_stack.size()) { + is_deep = true; + return Parse_Location( + m_filename, + m_match_stack[t_match_start]->location.start.line, + m_match_stack[t_match_start]->location.start.column, + m_position.line, m_position.col); + } else { + return Parse_Location(m_filename, m_position.line, + m_position.col, m_position.line, + m_position.col); + } + }(); + + std::vector> new_children; + + if (is_deep) { + new_children.assign( + std::make_move_iterator(m_match_stack.begin() + + static_cast(t_match_start)), + std::make_move_iterator(m_match_stack.end())); + m_match_stack.erase( + m_match_stack.begin() + static_cast(t_match_start), + m_match_stack.end()); + } + + /// \todo fix the fact that a successful match that captured no + /// ast_nodes doesn't have any real start position + m_match_stack.push_back(m_optimizer.optimize( + Carbon::make_unique, + NodeType>(std::move(t_text), + std::move(filepos), + std::move(new_children)))); + } + + /// Reads a symbol group from input if it matches the parameter, without + /// skipping initial whitespace + inline auto Symbol_(const utility::Static_String &sym) noexcept { + const auto len = sym.size(); + if (m_position.remaining() >= len) { + const char *file_pos = &(*m_position); + for (size_t pos = 0; pos < len; ++pos) { + if (sym.c_str()[pos] != file_pos[pos]) { + return false; + } + } + m_position += len; + return true; + } + return false; + } + + /// Skips any multi-line or single-line comment + bool SkipComment() { + if (Symbol_(m_multiline_comment_begin)) { + while (m_position.has_more()) { + if (Symbol_(m_multiline_comment_end)) { + break; + } else if (!Eol_()) { + ++m_position; + } + } + return true; + } else if (Symbol_(m_singleline_comment)) { + while (m_position.has_more()) { + if (Symbol_(m_cr_lf)) { + m_position -= 2; + break; + } else if (Char_('\n')) { + --m_position; + break; + } else { + ++m_position; + } + } + return true; + } else if (Symbol_(m_annotation)) { + while (m_position.has_more()) { + if (Symbol_(m_cr_lf)) { + m_position -= 2; + break; + } else if (Char_('\n')) { + --m_position; + break; + } else { + ++m_position; + } + } + return true; + } + return false; + } + + /// Skips ChaiScript whitespace, which means space and tab, but not cr/lf + /// jespada: Modified SkipWS to skip optionally CR ('\n') and/or LF+CR + /// ("\r\n") AlekMosingiewicz: Added exception when illegal character + /// detected + bool SkipWS(bool skip_cr = false) { + bool retval = false; + + while (m_position.has_more()) { + if (static_cast(*m_position) > 0x7e) { + throw exception::eval_error( + "Illegal character", + File_Position(m_position.line, m_position.col), + *m_filename); + } + auto end_line = + (*m_position != 0) && + ((*m_position == '\n') || + (*m_position == '\r' && *(m_position + 1) == '\n')); + + if (char_in_alphabet(*m_position, detail::white_alphabet) || + (skip_cr && end_line)) { + if (end_line) { + if (*m_position == '\r') { + // discards lf + ++m_position; + } + } + + ++m_position; + + retval = true; + } else if (SkipComment()) { + retval = true; + } else { + break; + } + } + return retval; + } + + /// Reads the optional exponent (scientific notation) and suffix for a Float + bool read_exponent_and_suffix() noexcept { + // Support a form of scientific notation: 1e-5, 35.5E+8, 0.01e19 + if (m_position.has_more() && (std::tolower(*m_position) == 'e')) { + ++m_position; + if (m_position.has_more() && + ((*m_position == '-') || (*m_position == '+'))) { + ++m_position; + } + auto exponent_pos = m_position; + while (m_position.has_more() && + char_in_alphabet(*m_position, detail::int_alphabet)) { + ++m_position; + } + if (m_position == exponent_pos) { + // Require at least one digit after the exponent + return false; + } + } + + // Parse optional float suffix + while (m_position.has_more() && + char_in_alphabet(*m_position, detail::float_suffix_alphabet)) { + ++m_position; + } + + return true; + } + + /// Reads a floating point value from input, without skipping initial + /// whitespace + bool Float_() noexcept { + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::float_alphabet)) { + while (m_position.has_more() && + char_in_alphabet(*m_position, detail::int_alphabet)) { + ++m_position; + } + + if (m_position.has_more() && (std::tolower(*m_position) == 'e')) { + // The exponent is valid even without any decimal in the Float + // (1e8, 3e-15) + return read_exponent_and_suffix(); + } else if (m_position.has_more() && (*m_position == '.')) { + ++m_position; + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::int_alphabet)) { + while ( + m_position.has_more() && + char_in_alphabet(*m_position, detail::int_alphabet)) { + ++m_position; + } + + // After any decimal digits, support an optional exponent + // (3.7e3) + return read_exponent_and_suffix(); + } else { + --m_position; + } + } + } + return false; + } + + /// Reads a hex value from input, without skipping initial whitespace + bool Hex_() noexcept { + if (m_position.has_more() && (*m_position == '0')) { + ++m_position; + + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::x_alphabet)) { + ++m_position; + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::hex_alphabet)) { + while ( + m_position.has_more() && + char_in_alphabet(*m_position, detail::hex_alphabet)) { + ++m_position; + } + while (m_position.has_more() && + char_in_alphabet(*m_position, + detail::int_suffix_alphabet)) { + ++m_position; + } + + return true; + } else { + --m_position; + } + } else { + --m_position; + } + } + + return false; + } + + /// Reads an integer suffix + void IntSuffix_() { + while (m_position.has_more() && + char_in_alphabet(*m_position, detail::int_suffix_alphabet)) { + ++m_position; + } + } + + /// Reads a binary value from input, without skipping initial whitespace + bool Binary_() { + if (m_position.has_more() && (*m_position == '0')) { + ++m_position; + + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::b_alphabet)) { + ++m_position; + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::bin_alphabet)) { + while ( + m_position.has_more() && + char_in_alphabet(*m_position, detail::bin_alphabet)) { + ++m_position; + } + return true; + } else { + --m_position; + } + } else { + --m_position; + } + } + + return false; + } + + /// Parses a floating point value and returns a Boxed_Value representation + /// of it + static Boxed_Value buildFloat(std::string_view t_val) { + bool float_ = false; + bool long_ = false; + + auto i = t_val.size(); + + for (; i > 0; --i) { + char val = t_val[i - 1]; + + if (val == 'f' || val == 'F') { + float_ = true; + } else if (val == 'l' || val == 'L') { + long_ = true; + } else { + break; + } + } + + if (float_) { + return const_var(parse_num(t_val.substr(0, i))); + } else if (long_) { + return const_var(parse_num(t_val.substr(0, i))); + } else { + return const_var(parse_num(t_val.substr(0, i))); + } + } + + static Boxed_Value buildInt(const int base, std::string_view t_val, + const bool prefixed) { + bool unsigned_ = false; + bool long_ = false; + bool longlong_ = false; + + auto i = t_val.size(); + + for (; i > 0; --i) { + const char val = t_val[i - 1]; + + if (val == 'u' || val == 'U') { + unsigned_ = true; + } else if (val == 'l' || val == 'L') { + if (long_) { + longlong_ = true; + } + + long_ = true; + } else { + break; + } + } + + if (prefixed) { + t_val.remove_prefix(2); + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-compare" + +#ifdef CARBON_CLANG +#pragma GCC diagnostic ignored "-Wtautological-compare" +#pragma GCC diagnostic ignored "-Wtautological-unsigned-zero-compare" +#pragma GCC diagnostic ignored "-Wtautological-type-limit-compare" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#endif + +#endif + + try { + /// TODO fix this to use from_chars + auto u = std::stoll(std::string(t_val), nullptr, base); + + if (!unsigned_ && !long_ && u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else if ((unsigned_ || base != 10) && !long_ && + u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else if (!unsigned_ && !longlong_ && + u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else if ((unsigned_ || base != 10) && !longlong_ && + u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else if (!unsigned_ && + u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else { + return const_var(static_cast(u)); + } + + } catch (const std::out_of_range &) { + // too big to be signed + try { + /// TODO fix this to use from_chars + auto u = std::stoull(std::string(t_val), nullptr, base); + + if (!longlong_ && + u >= std::numeric_limits::min() && + u <= std::numeric_limits::max()) { + return const_var(static_cast(u)); + } else { + return const_var(static_cast(u)); + } + } catch (const std::out_of_range &) { + // it's just simply too big + return const_var(std::numeric_limits::max()); + } + } + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + template + std::unique_ptr> make_node( + std::string_view t_match, const int t_prev_line, const int t_prev_col, + Param &&...param) { + return Carbon::make_unique, T>( + std::string(t_match), + Parse_Location(m_filename, t_prev_line, t_prev_col, m_position.line, + m_position.col), + std::forward(param)...); + } + + /// Reads a number from the input, detecting if it's an integer or floating + /// point + bool Num() { + SkipWS(); + + const auto start = m_position; + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::float_alphabet)) { + try { + if (Hex_()) { + auto match = Position::str(start, m_position); + auto bv = buildInt(16, match, true); + m_match_stack.emplace_back( + make_node>( + match, start.line, start.col, std::move(bv))); + return true; + } + + if (Binary_()) { + auto match = Position::str(start, m_position); + auto bv = buildInt(2, match, true); + m_match_stack.push_back( + make_node>( + match, start.line, start.col, std::move(bv))); + return true; + } + if (Float_()) { + auto match = Position::str(start, m_position); + auto bv = buildFloat(match); + m_match_stack.push_back( + make_node>( + match, start.line, start.col, std::move(bv))); + return true; + } else { + IntSuffix_(); + auto match = Position::str(start, m_position); + if (!match.empty() && (match[0] == '0')) { + auto bv = buildInt(8, match, false); + m_match_stack.push_back( + make_node>( + match, start.line, start.col, std::move(bv))); + } else if (!match.empty()) { + auto bv = buildInt(10, match, false); + m_match_stack.push_back( + make_node>( + match, start.line, start.col, std::move(bv))); + } else { + return false; + } + return true; + } + } catch (const std::invalid_argument &) { + // error parsing number passed in to buildFloat/buildInt + return false; + } + } else { + return false; + } + } + + /// Reads an identifier from input which conforms to C's identifier naming + /// conventions, without skipping initial whitespace + bool Id_() { + if (m_position.has_more() && + char_in_alphabet(*m_position, detail::id_alphabet)) { + while (m_position.has_more() && + char_in_alphabet(*m_position, detail::keyword_alphabet)) { + ++m_position; + } + + return true; + } else if (m_position.has_more() && (*m_position == '`')) { + ++m_position; + const auto start = m_position; + + while (m_position.has_more() && (*m_position != '`')) { + if (Eol()) { + throw exception::eval_error( + "Carriage return in identifier literal", + File_Position(m_position.line, m_position.col), + *m_filename); + } else { + ++m_position; + } + } + + if (start == m_position) { + throw exception::eval_error( + "Missing contents of identifier literal", + File_Position(m_position.line, m_position.col), + *m_filename); + } else if (!m_position.has_more()) { + throw exception::eval_error( + "Incomplete identifier literal", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + ++m_position; + + return true; + } + return false; + } + + /// Reads (and potentially captures) an identifier from input + bool Id(const bool validate) { + SkipWS(); + + const auto start = m_position; + if (Id_()) { + auto text = Position::str(start, m_position); + const auto text_hash = utility::hash(text); + + if (validate) { + validate_object_name(text); + } + +#ifdef CARBON_MSVC +#pragma warning(push) +#pragma warning(disable : 4307) +#endif + + switch (text_hash) { + case utility::hash("true"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, const_var(true))); + } break; + case utility::hash("false"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, const_var(false))); + } break; + case utility::hash("Infinity"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, + const_var( + std::numeric_limits::infinity()))); + } break; + case utility::hash("NaN"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, + const_var( + std::numeric_limits::quiet_NaN()))); + } break; + case utility::hash("__LINE__"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, + const_var(start.line))); + } break; + case utility::hash("__FILE__"): { + m_match_stack.push_back( + make_node>( + text, start.line, start.col, + const_var(m_filename))); + } break; + case utility::hash("__FUNC__"): { + std::string fun_name = "NOT_IN_FUNCTION"; + for (size_t idx = m_match_stack.empty() + ? 0 + : m_match_stack.size() - 1; + idx > 0; --idx) { + if (m_match_stack[idx - 1]->identifier == + AST_Node_Type::Id && + m_match_stack[idx - 0]->identifier == + AST_Node_Type::Arg_List) { + fun_name = m_match_stack[idx - 1]->text; + } + } + + m_match_stack.push_back( + make_node>( + text, start.line, start.col, const_var(fun_name))); + } break; + case utility::hash("__CLASS__"): { + std::string fun_name = "NOT_IN_CLASS"; + for (size_t idx = m_match_stack.empty() + ? 0 + : m_match_stack.size() - 1; + idx > 1; --idx) { + if (m_match_stack[idx - 2]->identifier == + AST_Node_Type::Id && + m_match_stack[idx - 1]->identifier == + AST_Node_Type::Id && + m_match_stack[idx - 0]->identifier == + AST_Node_Type::Arg_List) { + fun_name = m_match_stack[idx - 2]->text; + } + } + + m_match_stack.push_back( + make_node>( + std::move(text), start.line, start.col, + const_var(fun_name))); + } break; + case utility::hash("_"): { + m_match_stack.push_back( + make_node>( + std::move(text), start.line, start.col, + Boxed_Value(std::make_shared< + dispatch::Placeholder_Object>()))); + } break; + default: { + auto val = text; + if (*start == '`') { + // 'escaped' literal, like an operator name + val = Position::str(start + 1, m_position - 1); + // val.remove_prefix(1); val.remove_suffix(1); + } + m_match_stack.push_back( + make_node>(val, start.line, + start.col)); + } break; + } + +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + + return true; + } else { + return false; + } + } + + /// Reads an argument from input + bool Arg(const bool t_type_allowed = true) { + const auto prev_stack_top = m_match_stack.size(); + SkipWS(); + + if (!Id(true)) { + return false; + } + + SkipWS(); + + if (t_type_allowed) { + Id(true); + } + + build_match>(prev_stack_top); + + return true; + } + + /// Reads a quoted string from input, without skipping initial whitespace + bool Quoted_String_() { + if (m_position.has_more() && (*m_position == '\"')) { + char prev_char = *m_position; + ++m_position; + + int in_interpolation = 0; + bool in_quote = false; + + while (m_position.has_more() && + ((*m_position != '\"') || (in_interpolation > 0) || + (prev_char == '\\'))) { + if (!Eol_()) { + if (prev_char == '$' && *m_position == '{') { + ++in_interpolation; + } else if (prev_char != '\\' && *m_position == '"') { + in_quote = !in_quote; + } else if (*m_position == '}' && !in_quote) { + --in_interpolation; + } + + if (prev_char == '\\') { + prev_char = 0; + } else { + prev_char = *m_position; + } + ++m_position; + } + } + + if (m_position.has_more()) { + ++m_position; + } else { + throw exception::eval_error( + "Unclosed quoted string", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + return true; + } + return false; + } + + template + struct Char_Parser { + string_type &match; + using char_type = typename string_type::value_type; + bool is_escaped = false; + bool is_interpolated = false; + bool saw_interpolation_marker = false; + bool is_octal = false; + bool is_hex = false; + std::size_t unicode_size = 0; + const bool interpolation_allowed; + + string_type octal_matches; + string_type hex_matches; + + Char_Parser(string_type &t_match, const bool t_interpolation_allowed) + : match(t_match), interpolation_allowed(t_interpolation_allowed) {} + + Char_Parser &operator=(const Char_Parser &) = delete; + + ~Char_Parser() { + try { + if (is_octal) { + process_octal(); + } + + if (is_hex) { + process_hex(); + } + + if (unicode_size > 0) { + process_unicode(); + } + } catch (const std::invalid_argument &) { + } catch (const exception::eval_error &) { + // Something happened with parsing, we'll catch it later? + } + } + + void process_hex() { + if (!hex_matches.empty()) { + auto val = stoll(hex_matches, nullptr, 16); + match.push_back(char_type(val)); + } + hex_matches.clear(); + is_escaped = false; + is_hex = false; + } + + void process_octal() { + if (!octal_matches.empty()) { + auto val = stoll(octal_matches, nullptr, 8); + match.push_back(char_type(val)); + } + octal_matches.clear(); + is_escaped = false; + is_octal = false; + } + + void process_unicode() { + const auto ch = + static_cast(std::stoi(hex_matches, nullptr, 16)); + const auto match_size = hex_matches.size(); + hex_matches.clear(); + is_escaped = false; + const auto u_size = unicode_size; + unicode_size = 0; + + char buf[4]; + if (u_size != match_size) { + throw exception::eval_error( + "Incomplete unicode escape sequence"); + } + if (u_size == 4 && ch >= 0xD800 && ch <= 0xDFFF) { + throw exception::eval_error( + "Invalid 16 bit universal character"); + } + + if (ch < 0x80) { + match += static_cast(ch); + } else if (ch < 0x800) { + buf[0] = static_cast(0xC0 | (ch >> 6)); + buf[1] = static_cast(0x80 | (ch & 0x3F)); + match.append(buf, 2); + } else if (ch < 0x10000) { + buf[0] = static_cast(0xE0 | (ch >> 12)); + buf[1] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + buf[2] = static_cast(0x80 | (ch & 0x3F)); + match.append(buf, 3); + } else if (ch < 0x200000) { + buf[0] = static_cast(0xF0 | (ch >> 18)); + buf[1] = static_cast(0x80 | ((ch >> 12) & 0x3F)); + buf[2] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + buf[3] = static_cast(0x80 | (ch & 0x3F)); + match.append(buf, 4); + } else { + // this must be an invalid escape sequence? + throw exception::eval_error( + "Invalid 32 bit universal character"); + } + } + + void parse(const char_type t_char, const int line, const int col, + const std::string &filename) { + const bool is_octal_char = t_char >= '0' && t_char <= '7'; + + const bool is_hex_char = (t_char >= '0' && t_char <= '9') || + (t_char >= 'a' && t_char <= 'f') || + (t_char >= 'A' && t_char <= 'F'); + + if (is_octal) { + if (is_octal_char) { + octal_matches.push_back(t_char); + + if (octal_matches.size() == 3) { + process_octal(); + } + return; + } else { + process_octal(); + } + } else if (is_hex) { + if (is_hex_char) { + hex_matches.push_back(t_char); + + if (hex_matches.size() == 2 * sizeof(char_type)) { + // This rule differs from the C/C++ standard, but + // ChaiScript does not offer the same workaround + // options, and having hexadecimal sequences longer than + // can fit into the char type is undefined behavior + // anyway. + process_hex(); + } + return; + } else { + process_hex(); + } + } else if (unicode_size > 0) { + if (is_hex_char) { + hex_matches.push_back(t_char); + + if (hex_matches.size() == unicode_size) { + // Format is specified to be 'slash'uABCD + // on collecting from A to D do parsing + process_unicode(); + } + return; + } else { + // Not a unicode anymore, try parsing any way + // May be someone used 'slash'uAA only + process_unicode(); + } + } + + if (t_char == '\\') { + if (is_escaped) { + match.push_back('\\'); + is_escaped = false; + } else { + is_escaped = true; + } + } else { + if (is_escaped) { + if (is_octal_char) { + is_octal = true; + octal_matches.push_back(t_char); + } else if (t_char == 'x') { + is_hex = true; + } else if (t_char == 'u') { + unicode_size = 4; + } else if (t_char == 'U') { + unicode_size = 8; + } else { + switch (t_char) { + case ('\''): + match.push_back('\''); + break; + case ('\"'): + match.push_back('\"'); + break; + case ('?'): + match.push_back('?'); + break; + case ('a'): + match.push_back('\a'); + break; + case ('b'): + match.push_back('\b'); + break; + case ('f'): + match.push_back('\f'); + break; + case ('n'): + match.push_back('\n'); + break; + case ('r'): + match.push_back('\r'); + break; + case ('t'): + match.push_back('\t'); + break; + case ('v'): + match.push_back('\v'); + break; + case ('$'): + match.push_back('$'); + break; + default: + throw exception::eval_error( + "Unknown escaped sequence in string", + File_Position(line, col), filename); + } + is_escaped = false; + } + } else if (interpolation_allowed && t_char == '$') { + saw_interpolation_marker = true; + } else { + match.push_back(t_char); + } + } + } + }; + + /// Reads (and potentially captures) a quoted string from input. Translates + /// escaped sequences. + bool Quoted_String() { + Depth_Counter dc{this}; + SkipWS(); + + const auto start = m_position; + + if (Quoted_String_()) { + std::string match; + const auto prev_stack_top = m_match_stack.size(); + + bool is_interpolated = [&]() -> bool { + Char_Parser cparser(match, true); + + auto s = start + 1, end = m_position - 1; + + while (s != end) { + if (cparser.saw_interpolation_marker) { + if (*s == '{') { + // We've found an interpolation point + + m_match_stack.push_back( + make_node>( + match, start.line, start.col, + const_var(match))); + + if (cparser.is_interpolated) { + // If we've seen previous interpolation, add on + // instead of making a new one + build_match< + eval::Binary_Operator_AST_Node>( + prev_stack_top, "+"); + } + + // We've finished with the part of the string up to + // this point, so clear it + match.clear(); + + std::string eval_match; + + ++s; + while ((s != end) && (*s != '}')) { + eval_match.push_back(*s); + ++s; + } + + if (*s == '}') { + cparser.is_interpolated = true; + ++s; + + const auto tostr_stack_top = + m_match_stack.size(); + + m_match_stack.push_back( + make_node>( + "to_string", start.line, start.col)); + + const auto ev_stack_top = m_match_stack.size(); + + try { + m_match_stack.push_back( + parse_instr_eval(eval_match)); + } catch (const exception::eval_error &e) { + throw exception::eval_error( + e.what(), + File_Position(start.line, start.col), + *m_filename); + } + + build_match>( + ev_stack_top); + build_match>( + tostr_stack_top); + build_match< + eval::Binary_Operator_AST_Node>( + prev_stack_top, "+"); + } else { + throw exception::eval_error( + "Unclosed in-string eval", + File_Position(start.line, start.col), + *m_filename); + } + } else { + match.push_back('$'); + } + cparser.saw_interpolation_marker = false; + } else { + cparser.parse(*s, start.line, start.col, *m_filename); + + ++s; + } + } + + if (cparser.saw_interpolation_marker) { + match.push_back('$'); + } + + return cparser.is_interpolated; + }(); + + m_match_stack.push_back(make_node>( + match, start.line, start.col, const_var(match))); + + if (is_interpolated) { + build_match>( + prev_stack_top, "+"); + } + + return true; + } else { + return false; + } + } + + /// Reads a character group from input, without skipping initial whitespace + bool Single_Quoted_String_() { + bool retval = false; + if (m_position.has_more() && (*m_position == '\'')) { + retval = true; + char prev_char = *m_position; + ++m_position; + + while (m_position.has_more() && + ((*m_position != '\'') || (prev_char == '\\'))) { + if (!Eol_()) { + if (prev_char == '\\') { + prev_char = 0; + } else { + prev_char = *m_position; + } + ++m_position; + } + } + + if (m_position.has_more()) { + ++m_position; + } else { + throw exception::eval_error( + "Unclosed single-quoted string", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + return retval; + } + + /// Reads (and potentially captures) a char group from input. Translates + /// escaped sequences. + bool Single_Quoted_String() { + Depth_Counter dc{this}; + SkipWS(); + + const auto start = m_position; + if (Single_Quoted_String_()) { + std::string match; + + { + // scope for cparser destructor + Char_Parser cparser(match, false); + + for (auto s = start + 1, end = m_position - 1; s != end; ++s) { + cparser.parse(*s, start.line, start.col, *m_filename); + } + } + + if (match.size() != 1) { + throw exception::eval_error( + "Single-quoted strings must be 1 character long", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + m_match_stack.push_back(make_node>( + match, start.line, start.col, const_var(char(match.at(0))))); + return true; + } else { + return false; + } + } + + /// Reads a char from input if it matches the parameter, without skipping + /// initial whitespace + bool Char_(const char c) { + if (m_position.has_more() && (*m_position == c)) { + ++m_position; + return true; + } else { + return false; + } + } + + /// Reads (and potentially captures) a char from input if it matches the + /// parameter + bool Char(const char t_c) { + Depth_Counter dc{this}; + SkipWS(); + return Char_(t_c); + } + + /// Reads a string from input if it matches the parameter, without skipping + /// initial whitespace + bool Keyword_(const utility::Static_String &t_s) { + const auto len = t_s.size(); + if (m_position.remaining() >= len) { + auto tmp = m_position; + for (size_t i = 0; tmp.has_more() && i < len; ++i) { + if (*tmp != t_s.c_str()[i]) { + return false; + } + ++tmp; + } + m_position = tmp; + return true; + } + + return false; + } + + /// Reads (and potentially captures) a string from input if it matches the + /// parameter + bool Keyword(const utility::Static_String &t_s) { + Depth_Counter dc{this}; + SkipWS(); + const auto start = m_position; + bool retval = Keyword_(t_s); + // ignore substring matches + if (retval && m_position.has_more() && + char_in_alphabet(*m_position, detail::keyword_alphabet)) { + m_position = start; + retval = false; + } + + return retval; + } + + bool is_operator(std::string_view t_s) const noexcept { + return m_operator_matches.is_match(t_s); + } + + /// Reads (and potentially captures) a symbol group from input if it matches + /// the parameter + bool Symbol(const utility::Static_String &t_s, + const bool t_disallow_prevention = false) { + Depth_Counter dc{this}; + SkipWS(); + const auto start = m_position; + bool retval = Symbol_(t_s); + + // ignore substring matches + if (retval && m_position.has_more() && + (t_disallow_prevention == false) && + char_in_alphabet(*m_position, detail::symbol_alphabet)) { + if (*m_position != '=' && + is_operator(Position::str(start, m_position)) && + !is_operator(Position::str(start, m_position + 1))) { + // don't throw this away, it's a good match and the next is not + } else { + m_position = start; + retval = false; + } + } + + return retval; + } + + /// Reads an end-of-line group from input, without skipping initial + /// whitespace + bool Eol_(const bool t_eos = false) { + bool retval = false; + + if (m_position.has_more() && (Symbol_(m_cr_lf) || Char_('\n'))) { + retval = true; + //++m_position.line; + m_position.col = 1; + } else if (m_position.has_more() && !t_eos && Char_(';')) { + retval = true; + } + + return retval; + } + + /// Reads until the end of the current statement + bool Eos() { + Depth_Counter dc{this}; + SkipWS(); + + return Eol_(true); + } + + /// Reads (and potentially captures) an end-of-line group from input + bool Eol() { + Depth_Counter dc{this}; + SkipWS(); + + return Eol_(); + } + + /// Reads a comma-separated list of values from input. Id's only, no types + /// allowed + bool Id_Arg_List() { + Depth_Counter dc{this}; + SkipWS(true); + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Arg(false)) { + retval = true; + while (Eol()) { + } + + while (Char(',')) { + while (Eol()) { + } + if (!Arg(false)) { + throw exception::eval_error( + "Unexpected value in parameter list", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + } + build_match>(prev_stack_top); + + SkipWS(true); + + return retval; + } + + /// Reads a comma-separated list of values from input, for function + /// declarations + bool Decl_Arg_List() { + Depth_Counter dc{this}; + SkipWS(true); + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Arg()) { + retval = true; + while (Eol()) { + } + + while (Char(',')) { + while (Eol()) { + } + if (!Arg()) { + throw exception::eval_error( + "Unexpected value in parameter list", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + } + build_match>(prev_stack_top); + + SkipWS(true); + + return retval; + } + + /// Reads a comma-separated list of values from input + bool Arg_List() { + Depth_Counter dc{this}; + SkipWS(true); + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Equation()) { + retval = true; + while (Eol()) { + } + while (Char(',')) { + while (Eol()) { + } + if (!Equation()) { + throw exception::eval_error( + "Unexpected value in parameter list", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + } + + build_match>(prev_stack_top); + + SkipWS(true); + + return retval; + } + + /// Reads possible special container values, including ranges and map_pairs + bool Container_Arg_List() { + Depth_Counter dc{this}; + bool retval = false; + SkipWS(true); + + const auto prev_stack_top = m_match_stack.size(); + + if (Value_Range()) { + retval = true; + build_match>(prev_stack_top); + } else if (Map_Pair()) { + retval = true; + while (Eol()) { + } + while (Char(',')) { + while (Eol()) { + } + if (!Map_Pair()) { + throw exception::eval_error( + "Unexpected value in container", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + build_match>(prev_stack_top); + } else if (Operator()) { + retval = true; + while (Eol()) { + } + while (Char(',')) { + while (Eol()) { + } + if (!Operator()) { + throw exception::eval_error( + "Unexpected value in container", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + build_match>(prev_stack_top); + } + + SkipWS(true); + + return retval; + } + + /// Reads a lambda (anonymous function) from input + bool Lambda() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("fun")) { + retval = true; + + if (Char('[')) { + Id_Arg_List(); + if (!Char(']')) { + throw exception::eval_error( + "Incomplete anonymous function bind", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } else { + // make sure we always have the same number of nodes + build_match>(prev_stack_top); + } + + if (Char('(')) { + Decl_Arg_List(); + if (!Char(')')) { + throw exception::eval_error( + "Incomplete anonymous function", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } else { + throw exception::eval_error( + "Incomplete anonymous function", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete anonymous function", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads a function definition from input + bool Def(const bool t_class_context = false, + const std::string &t_class_name = "") { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("def")) { + retval = true; + + if (t_class_context) { + m_match_stack.push_back(make_node>( + t_class_name, m_position.line, m_position.col)); + } + + if (!Id(true)) { + throw exception::eval_error( + "Missing function name in definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + bool is_method = false; + + if (Symbol("::")) { + // We're now a method + is_method = true; + + if (!Id(true)) { + throw exception::eval_error( + "Missing method name in definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + + if (Char('(')) { + Decl_Arg_List(); + if (!Char(')')) { + throw exception::eval_error( + "Incomplete function definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + + while (Eos()) { + } + + if (Char(':')) { + if (!Operator()) { + throw exception::eval_error( + "Missing guard expression for function", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + + while (Eol()) { + } + if (!Block()) { + throw exception::eval_error( + "Incomplete function definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (is_method || t_class_context) { + build_match>(prev_stack_top); + } else { + build_match>(prev_stack_top); + } + } + + return retval; + } + + /// Reads a function definition from input + bool Try() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("try")) { + retval = true; + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'try' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + bool has_matches = true; + while (has_matches) { + while (Eol()) { + } + has_matches = false; + if (Keyword("catch")) { + const auto catch_stack_top = m_match_stack.size(); + if (Char('(')) { + if (!(Arg() && Char(')'))) { + throw exception::eval_error( + "Incomplete 'catch' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'catch' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + build_match>(catch_stack_top); + has_matches = true; + } + } + while (Eol()) { + } + if (Keyword("finally")) { + const auto finally_stack_top = m_match_stack.size(); + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'finally' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + build_match>(finally_stack_top); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads an if/else if/else block from input + bool If() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("if")) { + retval = true; + + if (!Char('(')) { + throw exception::eval_error( + "Incomplete 'if' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (!Equation()) { + throw exception::eval_error( + "Incomplete 'if' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + const bool is_if_init = Eol() && Equation(); + + if (!Char(')')) { + throw exception::eval_error( + "Incomplete 'if' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'if' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + bool has_matches = true; + while (has_matches) { + while (Eol()) { + } + has_matches = false; + if (Keyword("else")) { + if (If()) { + has_matches = true; + } else { + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'else' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + has_matches = true; + } + } + } + + const auto num_children = m_match_stack.size() - prev_stack_top; + + if ((is_if_init && num_children == 3) || + (!is_if_init && num_children == 2)) { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + + if (!is_if_init) { + build_match>(prev_stack_top); + } else { + build_match>(prev_stack_top + 1); + build_match>(prev_stack_top); + } + } + + return retval; + } + + /// Reads a class block from input + bool Class(const bool t_class_allowed) { + Depth_Counter dc{this}; + bool retval = false; + + size_t prev_stack_top = m_match_stack.size(); + + if (Keyword("class")) { + if (!t_class_allowed) { + throw exception::eval_error( + "Class definitions only allowed at top scope", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + retval = true; + + if (!Id(true)) { + throw exception::eval_error( + "Missing class name in definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + const auto class_name = m_match_stack.back()->text; + + while (Eol()) { + } + + if (!Class_Block(class_name)) { + throw exception::eval_error( + "Incomplete 'class' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads a while block from input + bool While() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("while")) { + retval = true; + + if (!Char('(')) { + throw exception::eval_error( + "Incomplete 'while' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (!(Operator() && Char(')'))) { + throw exception::eval_error( + "Incomplete 'while' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'while' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads the ranged `for` conditions from input + bool Range_Expression() { + Depth_Counter dc{this}; + // the first element will have already been captured by the For_Guards() + // call that preceeds it + return Char(':') && Equation(); + } + + /// Reads the C-style `for` conditions from input + bool For_Guards() { + Depth_Counter dc{this}; + if (!(Equation() && Eol())) { + if (!Eol()) { + return false; + } else { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + } + + if (!(Equation() && Eol())) { + if (!Eol()) { + return false; + } else { + m_match_stack.push_back( + Carbon::make_unique, + eval::Constant_AST_Node>( + Boxed_Value(true))); + } + } + + if (!Equation()) { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + + return true; + } + + /// Reads a for block from input + bool For() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("for")) { + retval = true; + + if (!Char('(')) { + throw exception::eval_error( + "Incomplete 'for' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + const bool classic_for = For_Guards() && Char(')'); + if (!classic_for && !(Range_Expression() && Char(')'))) { + throw exception::eval_error( + "Incomplete 'for' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'for' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + const auto num_children = m_match_stack.size() - prev_stack_top; + + if (classic_for) { + if (num_children != 4) { + throw exception::eval_error( + "Incomplete 'for' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + build_match>(prev_stack_top); + } else { + if (num_children != 3) { + throw exception::eval_error( + "Incomplete ranged-for expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + build_match>(prev_stack_top); + } + } + + return retval; + } + + /// Reads a case block from input + bool Case() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("case")) { + retval = true; + + if (!Char('(')) { + throw exception::eval_error( + "Incomplete 'case' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (!(Operator() && Char(')'))) { + throw exception::eval_error( + "Incomplete 'case' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'case' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } else if (Keyword("default")) { + retval = true; + + while (Eol()) { + } + + if (!Block()) { + throw exception::eval_error( + "Incomplete 'default' block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads a switch statement from input + bool Switch() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("switch")) { + if (!Char('(')) { + throw exception::eval_error( + "Incomplete 'switch' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (!(Operator() && Char(')'))) { + throw exception::eval_error( + "Incomplete 'switch' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + while (Eol()) { + } + + if (Char('{')) { + while (Eol()) { + } + + while (Case()) { + while (Eol()) { + } // eat + } + + while (Eol()) { + } // eat + + if (!Char('}')) { + throw exception::eval_error( + "Incomplete block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + } else { + throw exception::eval_error( + "Incomplete block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + return true; + + } else { + return false; + } + } + + /// Reads a curly-brace C-style class block from input + bool Class_Block(const std::string &t_class_name) { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Char('{')) { + retval = true; + + Class_Statements(t_class_name); + if (!Char('}')) { + throw exception::eval_error( + "Incomplete class block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (m_match_stack.size() == prev_stack_top) { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads a curly-brace C-style block from input + bool Block() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (Char('{')) { + retval = true; + + Statements(); + if (!Char('}')) { + throw exception::eval_error( + "Incomplete block", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (m_match_stack.size() == prev_stack_top) { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads a return statement from input + bool Return() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("return")) { + Operator(); + build_match>(prev_stack_top); + return true; + } else { + return false; + } + } + + /// Reads a break statement from input + bool Break() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("break")) { + build_match>(prev_stack_top); + return true; + } else { + return false; + } + } + + /// Reads a continue statement from input + bool Continue() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Keyword("continue")) { + build_match>(prev_stack_top); + return true; + } else { + return false; + } + } + + /// Reads a dot expression(member access), then proceeds to check if it's a + /// function or array call + bool Dot_Fun_Array() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + if (Lambda() || Num() || Quoted_String() || Single_Quoted_String() || + Paren_Expression() || Inline_Container() || Id(false)) { + retval = true; + bool has_more = true; + + while (has_more) { + has_more = false; + + if (Char('(')) { + has_more = true; + + Arg_List(); + if (!Char(')')) { + throw exception::eval_error( + "Incomplete function call", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>( + prev_stack_top); + /// \todo Work around for method calls until we have a + /// better solution + if (!m_match_stack.back()->children.empty()) { + if (m_match_stack.back()->children[0]->identifier == + AST_Node_Type::Dot_Access) { + if (m_match_stack.empty()) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + if (m_match_stack.back()->children.empty()) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + auto dot_access = + std::move(m_match_stack.back()->children[0]); + auto func_call = std::move(m_match_stack.back()); + m_match_stack.pop_back(); + func_call->children.erase( + func_call->children.begin()); + if (dot_access->children.empty()) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + func_call->children.insert( + func_call->children.begin(), + std::move(dot_access->children.back())); + dot_access->children.pop_back(); + dot_access->children.push_back( + std::move(func_call)); + if (dot_access->children.size() != 2) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + m_match_stack.push_back(std::move(dot_access)); + } + } + } else if (Char('[')) { + has_more = true; + + if (!(Operator() && Char(']'))) { + throw exception::eval_error( + "Incomplete array access", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>( + prev_stack_top); + } else if (Symbol(".")) { + has_more = true; + if (!(Id(true))) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + if (std::distance(m_match_stack.begin() + + static_cast(prev_stack_top), + m_match_stack.end()) != 2) { + throw exception::eval_error( + "Incomplete dot access fun call", + File_Position(m_position.line, m_position.col), + *m_filename); + } + build_match>( + prev_stack_top); + } else if (Eol()) { + auto start = --m_position; + while (Eol()) { + } + if (Symbol(".")) { + has_more = true; + --m_position; + } else { + m_position = start; + } + } + } + } + + return retval; + } + + /// Reads a variable declaration from input + bool Var_Decl(const bool t_class_context = false, + const std::string &t_class_name = "") { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + + if (t_class_context && + (Keyword("attr") || Keyword("auto") || Keyword("var"))) { + retval = true; + + m_match_stack.push_back(make_node>( + t_class_name, m_position.line, m_position.col)); + + if (!Id(true)) { + throw exception::eval_error( + "Incomplete attribute declaration", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } else if (Keyword("auto") || Keyword("var")) { + retval = true; + + if (Reference()) { + // we built a reference node - continue + } else if (Id(true)) { + build_match>(prev_stack_top); + } else { + throw exception::eval_error( + "Incomplete variable declaration", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + } else if (Keyword("global")) { + retval = true; + + if (!(Reference() || Id(true))) { + throw exception::eval_error( + "Incomplete global declaration", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } else if (Keyword("attr")) { + retval = true; + + if (!Id(true)) { + throw exception::eval_error( + "Incomplete attribute declaration", + File_Position(m_position.line, m_position.col), + *m_filename); + } + if (!Symbol("::")) { + throw exception::eval_error( + "Incomplete attribute declaration", + File_Position(m_position.line, m_position.col), + *m_filename); + } + if (!Id(true)) { + throw exception::eval_error( + "Missing attribute name in definition", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } + + return retval; + } + + /// Reads an expression surrounded by parentheses from input + bool Paren_Expression() { + Depth_Counter dc{this}; + if (Char('(')) { + if (!Operator()) { + throw exception::eval_error( + "Incomplete expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + if (!Char(')')) { + throw exception::eval_error( + "Missing closing parenthesis ')'", + File_Position(m_position.line, m_position.col), + *m_filename); + } + return true; + } else { + return false; + } + } + + /// Reads, and identifies, a short-form container initialization from input + bool Inline_Container() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Char('[')) { + Container_Arg_List(); + + if (!Char(']')) { + throw exception::eval_error( + "Missing closing square bracket ']' in container " + "initializer", + File_Position(m_position.line, m_position.col), + *m_filename); + } + if ((prev_stack_top != m_match_stack.size()) && + (!m_match_stack.back()->children.empty())) { + if (m_match_stack.back()->children[0]->identifier == + AST_Node_Type::Value_Range) { + build_match>( + prev_stack_top); + } else if (m_match_stack.back()->children[0]->identifier == + AST_Node_Type::Map_Pair) { + build_match>( + prev_stack_top); + } else { + build_match>( + prev_stack_top); + } + } else { + build_match>( + prev_stack_top); + } + + return true; + } else { + return false; + } + } + + /// Parses a variable specified with a & aka reference + bool Reference() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + if (Symbol("&")) { + if (!Id(true)) { + throw exception::eval_error( + "Incomplete '&' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + return true; + } else { + return false; + } + } + + /// Reads a unary prefixed expression from input + bool Prefix() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + using SS = utility::Static_String; + const std::array prefix_opers{ + {SS{"++"}, SS{"--"}, SS{"-"}, SS{"+"}, SS{"!"}, SS{"~"}}}; + + for (const auto &oper : prefix_opers) { + const bool is_char = oper.size() == 1; + if ((is_char && Char(oper.c_str()[0])) || + (!is_char && Symbol(oper))) { + if (!Operator(m_operators.size() - 1)) { + throw exception::eval_error( + "Incomplete prefix '" + std::string(oper.c_str()) + + "' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top, + oper.c_str()); + return true; + } + } + + return false; + } + + /// Parses any of a group of 'value' style ast_node groups from input + bool Value() { + Depth_Counter dc{this}; + return Var_Decl() || Dot_Fun_Array() || Prefix(); + } + + bool Operator_Helper(const size_t t_precedence, std::string &oper) { + return m_operator_matches.any_of(t_precedence, + [&oper, this](const auto &elem) { + if (Symbol(elem)) { + oper = elem.c_str(); + return true; + } else { + return false; + } + }); + } + + bool Operator(const size_t t_precedence = 0) { + Depth_Counter dc{this}; + bool retval = false; + const auto prev_stack_top = m_match_stack.size(); + + if (m_operators[t_precedence] != Operator_Precedence::Prefix) { + if (Operator(t_precedence + 1)) { + retval = true; + std::string oper; + while (Operator_Helper(t_precedence, oper)) { + while (Eol()) { + } + if (!Operator(t_precedence + 1)) { + throw exception::eval_error( + "Incomplete '" + oper + "' expression", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + switch (m_operators[t_precedence]) { + case (Operator_Precedence::Ternary_Cond): + if (Symbol(":")) { + if (!Operator(t_precedence + 1)) { + throw exception::eval_error( + "Incomplete '" + oper + "' expression", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + build_match>( + prev_stack_top); + } else { + throw exception::eval_error( + "Incomplete '" + oper + "' expression", + File_Position(m_position.line, + m_position.col), + *m_filename); + } + break; + + case (Operator_Precedence::Addition): + case (Operator_Precedence::Multiplication): + case (Operator_Precedence::Shift): + case (Operator_Precedence::Equality): + case (Operator_Precedence::Bitwise_And): + case (Operator_Precedence::Bitwise_Xor): + case (Operator_Precedence::Bitwise_Or): + case (Operator_Precedence::Comparison): + build_match>( + prev_stack_top, oper); + break; + + case (Operator_Precedence::Logical_And): + build_match>( + prev_stack_top, oper); + break; + case (Operator_Precedence::Logical_Or): + build_match>( + prev_stack_top, oper); + break; + case (Operator_Precedence::Prefix): + assert(false); // cannot reach here because of if() + // statement at the top + break; + + // default: + // throw + // exception::eval_error("Internal + // error: unhandled ast_node", + // File_Position(m_position.line, + // m_position.col), *m_filename); + } + } + } + } else { + return Value(); + } + + return retval; + } + + /// Reads a pair of values used to create a map initialization from input + bool Map_Pair() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + const auto prev_pos = m_position; + + if (Operator()) { + if (Symbol(":")) { + retval = true; + if (!Operator()) { + throw exception::eval_error( + "Incomplete map pair", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } else { + m_position = prev_pos; + while (prev_stack_top != m_match_stack.size()) { + m_match_stack.pop_back(); + } + } + } + + return retval; + } + + /// Reads a pair of values used to create a range initialization from input + bool Value_Range() { + Depth_Counter dc{this}; + bool retval = false; + + const auto prev_stack_top = m_match_stack.size(); + const auto prev_pos = m_position; + + if (Operator()) { + if (Symbol("..")) { + retval = true; + if (!Operator()) { + throw exception::eval_error( + "Incomplete value range", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top); + } else { + m_position = prev_pos; + while (prev_stack_top != m_match_stack.size()) { + m_match_stack.pop_back(); + } + } + } + + return retval; + } + + /// Parses a string of binary equation operators + bool Equation() { + Depth_Counter dc{this}; + const auto prev_stack_top = m_match_stack.size(); + + using SS = utility::Static_String; + + if (Operator()) { + for (const auto &sym : {SS{"="}, SS{":="}, SS{"+="}, SS{"-="}, + SS{"*="}, SS{"/="}, SS{"%="}, SS{"<<="}, + SS{">>="}, SS{"&="}, SS{"^="}, SS{"|="}}) { + if (Symbol(sym, true)) { + SkipWS(true); + if (!Equation()) { + throw exception::eval_error( + "Incomplete equation", + File_Position(m_position.line, m_position.col), + *m_filename); + } + + build_match>(prev_stack_top, + sym.c_str()); + return true; + } + } + return true; + } + + return false; + } + + /// Parses statements allowed inside of a class block + bool Class_Statements(const std::string &t_class_name) { + Depth_Counter dc{this}; + bool retval = false; + + bool has_more = true; + bool saw_eol = true; + + while (has_more) { + const auto start = m_position; + if (Def(true, t_class_name) || Var_Decl(true, t_class_name)) { + if (!saw_eol) { + throw exception::eval_error( + "Two function definitions missing line separator", + File_Position(start.line, start.col), *m_filename); + } + has_more = true; + retval = true; + saw_eol = true; + } else if (Eol()) { + has_more = true; + retval = true; + saw_eol = true; + } else { + has_more = false; + } + } + + return retval; + } + + /// Top level parser, starts parsing of all known parses + bool Statements(const bool t_class_allowed = false) { + Depth_Counter dc{this}; + bool retval = false; + + bool has_more = true; + bool saw_eol = true; + + while (has_more) { + const auto start = m_position; + if (Def() || Try() || If() || While() || Class(t_class_allowed) || + For() || Switch()) { + if (!saw_eol) { + throw exception::eval_error( + "Two function definitions missing line separator", + File_Position(start.line, start.col), *m_filename); + } + has_more = true; + retval = true; + saw_eol = true; + } else if (Return() || Break() || Continue() || Equation()) { + if (!saw_eol) { + throw exception::eval_error( + "Two expressions missing line separator", + File_Position(start.line, start.col), *m_filename); + } + has_more = true; + retval = true; + saw_eol = false; + } else if (Block() || Eol()) { + has_more = true; + retval = true; + saw_eol = true; + } else { + has_more = false; + } + } + + return retval; + } + + AST_NodePtr parse(const std::string &t_input, + const std::string &t_fname) override { + ChaiScript_Parser parser(m_tracer, m_optimizer); + return parser.parse_internal(t_input, t_fname); + } + + eval::AST_Node_Impl_Ptr parse_instr_eval( + const std::string &t_input) { + auto last_position = m_position; + auto last_filename = m_filename; + auto last_match_stack = + std::exchange(m_match_stack, decltype(m_match_stack){}); + + auto retval = parse_internal(t_input, "instr eval"); + + m_position = std::move(last_position); + m_filename = std::move(last_filename); + m_match_stack = std::move(last_match_stack); + + return eval::AST_Node_Impl_Ptr( + dynamic_cast *>(retval.release())); + } + + /// Parses the given input string, tagging parsed ast_nodes with the given + /// m_filename. + AST_NodePtr parse_internal(const std::string &t_input, + std::string t_fname) { + const auto begin = t_input.empty() ? nullptr : &t_input.front(); + const auto end = begin == nullptr ? nullptr : begin + t_input.size(); + m_position = Position(begin, end); + m_filename = std::make_shared(std::move(t_fname)); + + if ((t_input.size() > 1) && (t_input[0] == '#') && + (t_input[1] == '!')) { + while (m_position.has_more() && (!Eol())) { + ++m_position; + } + } + + if (Statements(true)) { + if (m_position.has_more()) { + throw exception::eval_error( + "Unparsed input", + File_Position(m_position.line, m_position.col), + *m_filename); + } else { + build_match>(0); + } + } else { + m_match_stack.push_back( + Carbon::make_unique, + eval::Noop_AST_Node>()); + } + + AST_NodePtr retval(std::move(m_match_stack.front())); + m_match_stack.clear(); + return retval; + } +}; +} // namespace parser +} // namespace Carbon + +#if defined(CARBON_MSVC) && defined(CARBON_PUSHED_MIN_MAX) +#undef CARBON_PUSHED_MIN_MAX +#pragma pop_macro("min") +#pragma pop_macro("max") +#endif + +#endif /* CARBON_PARSER_HPP */ diff --git a/src/carbon/language/posix.hpp b/src/carbon/language/posix.hpp new file mode 100644 index 00000000..b6f72c1f --- /dev/null +++ b/src/carbon/language/posix.hpp @@ -0,0 +1,50 @@ + + +#ifndef CARBON_POSIX_HPP +#define CARBON_POSIX_HPP + +namespace Carbon::detail { +struct Loadable_Module { + struct DLModule { + explicit DLModule(const std::string &t_filename) + : m_data(dlopen(t_filename.c_str(), RTLD_NOW)) { + if (m_data == nullptr) { + throw Carbon::exception::load_module_error(dlerror()); + } + } + + DLModule(DLModule &&) = default; + DLModule &operator=(DLModule &&) = default; + DLModule(const DLModule &) = delete; + DLModule &operator=(const DLModule &) = delete; + + ~DLModule() { dlclose(m_data); } + + void *m_data; + }; + + template + struct DLSym { + DLSym(DLModule &t_mod, const std::string &t_symbol) + : m_symbol( + reinterpret_cast(dlsym(t_mod.m_data, t_symbol.c_str()))) { + if (!m_symbol) { + throw Carbon::exception::load_module_error(dlerror()); + } + } + + T m_symbol; + }; + + Loadable_Module(const std::string &t_module_name, + const std::string &t_filename) + : m_dlmodule(t_filename), + m_func(m_dlmodule, "create_module_" + t_module_name), + m_moduleptr(m_func.m_symbol()) {} + + DLModule m_dlmodule; + DLSym m_func; + ModulePtr m_moduleptr; +}; +} // namespace Carbon::detail +#endif diff --git a/src/carbon/language/prelude.hpp b/src/carbon/language/prelude.hpp new file mode 100644 index 00000000..7b72c1fc --- /dev/null +++ b/src/carbon/language/prelude.hpp @@ -0,0 +1,558 @@ + + +#ifndef CARBON_PRELUDE_HPP +#define CARBON_PRELUDE_HPP + +namespace Carbon { +struct ChaiScript_Prelude { + static std::string prelude() { + return R"chaiscript( + +def lt(l, r) { + if (call_exists(`<`, l, r)) { + l < r + } else { + type_name(l) < type_name(r) + } +} + + +def gt(l, r) { + if (call_exists(`>`, l, r)) { + l > r + } else { + type_name(l) > type_name(r) + } +} + +def eq(l, r) { + if (call_exists(`==`, l, r)) { + l == r + } else { + false + } +} + +def new(x) { + eval(type_name(x))(); +} + +def clone(double x) { + double(x).clone_var_attrs(x) +} + +def clone(string x) { + string(x).clone_var_attrs(x) +} + +def clone(vector x) { + vector(x).clone_var_attrs(x) +} + + +def clone(int x) { + int(x).clone_var_attrs(x) +} + +def clone(x) : function_exists(type_name(x)) && call_exists(eval(type_name(x)), x) +{ + eval(type_name(x))(x).clone_var_attrs(x); +} + + +# to_string for Pair() +def to_string(x) : call_exists(first, x) && call_exists(second, x) { + "<" + x.first.to_string() + ", " + x.second.to_string() + ">"; +} + +# to_string for containers +def to_string(x) : call_exists(range, x) && !x.is_type("string"){ + "[" + x.join(", ") + "]"; +} + +# Prints to console with no carriage return +def puts(x) { + print_string(x.to_string()); +} + +# Prints to console with carriage return +def print(x) { + println_string(x.to_string()); +} + +# Returns the maximum value of two numbers +def max(a, b) { + if (a>b) { + a + } else { + b + } +} + +# Returns the minimum value of two numbers +def min(a, b) +{ + if (a 0) && (!r.empty())) { + inserter(r.front()); + r.pop_front(); + --i; + } +} + + +# Returns a new container with the given number of elements taken from the container +def take(container, num) { + auto retval := new(container); + take(container, num, back_inserter(retval)); + retval; +} + + +def take_while(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while ((!r.empty()) && f(r.front())) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given elements match the second value function +def take_while(container, f) { + auto retval := new(container); + take_while(container, f, back_inserter(retval)); + retval; +} + + +def drop(container, num, inserter) : call_exists(range, container) { + auto r := range(container); + auto i = num; + while ((i > 0) && (!r.empty())) { + r.pop_front(); + --i; + } + while (!r.empty()) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given number of elements dropped from the given container +def drop(container, num) { + auto retval := new(container); + drop(container, num, back_inserter(retval)); + retval; +} + + +def drop_while(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while ((!r.empty())&& f(r.front())) { + r.pop_front(); + } + while (!r.empty()) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given elements dropped that match the second value function +def drop_while(container, f) { + auto retval := new(container); + drop_while(container, f, back_inserter(retval)); + retval; +} + + +# Applies the second value function to the container. Starts with the first two elements. Expects at least 2 elements. +def reduce(container, func) : container.size() >= 2 && call_exists(range, container) { + auto r := range(container); + auto retval = r.front(); + r.pop_front(); + retval = func(retval, r.front()); + r.pop_front(); + while (!r.empty()) { + retval = func(retval, r.front()); + r.pop_front(); + } + retval; +} + + +# Returns a string of the elements in container delimited by the second value string +def join(container, delim) { + auto retval = ""; + auto range := range(container); + if (!range.empty()) { + retval += to_string(range.front()); + range.pop_front(); + while (!range.empty()) { + retval += delim; + retval += to_string(range.front()); + range.pop_front(); + } + } + retval; +} + + +def filter(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while (!r.empty()) { + if (f(r.front())) { + inserter(r.front()); + } + r.pop_front(); + } +} + + +# Returns a new Vector which match the second value function +def filter(container, f) { + auto retval := new(container); + filter(container, f, back_inserter(retval)); + retval; +} + + +def generate_range(x, y, inserter) { + auto i = x; + while (i <= y) { + inserter(i); + ++i; + } +} + + +# Returns a new Vector which represents the range from the first value to the second value +def generate_range(x, y) { + auto retval := Vector(); + generate_range(x,y,back_inserter(retval)); + retval; +} + + +# Returns a new Vector with the first value to the second value as its elements +def collate(x, y) { + return [x, y]; +} + + +def zip_with(f, x, y, inserter) : call_exists(range, x) && call_exists(range, y) { + auto r_x := range(x); + auto r_y := range(y); + while (!r_x.empty() && !r_y.empty()) { + inserter(f(r_x.front(), r_y.front())); + r_x.pop_front(); + r_y.pop_front(); + } +} + + +# Returns a new Vector which joins matching elements of the second and third value with the first value function +def zip_with(f, x, y) { + auto retval := Vector(); + zip_with(f,x,y,back_inserter(retval)); + retval; +} + + +# Returns a new Vector which joins matching elements of the first and second +def zip(x, y) { + zip_with(collate, x, y); +} + + +# Returns the position of the second value string in the first value string +def string::find(string substr) { + find(this, substr, size_t(0)); +} + + +# Returns the position of last match of the second value string in the first value string +def string::rfind(string substr) { + rfind(this, substr, size_t(-1)); +} + + +# Returns the position of the first match of elements in the second value string in the first value string +def string::find_first_of(string list) { + find_first_of(this, list, size_t(0)); +} + + +# Returns the position of the last match of elements in the second value string in the first value string +def string::find_last_of(string list) { + find_last_of(this, list, size_t(-1)); +} + + +# Returns the position of the first non-matching element in the second value string in the first value string +def string::find_first_not_of(string list) { + find_first_not_of(this, list, size_t(0)); +} + + +# Returns the position of the last non-matching element in the second value string in the first value string +def string::find_last_not_of(string list) { + find_last_not_of(this, list, size_t(-1)); +} + + +def string::ltrim() { + drop_while(this, fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'}); +} + + +def string::rtrim() { + reverse(drop_while(reverse(this), fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'})); +} + + +def string::trim() { + ltrim(rtrim(this)); +} + + +def find(container, value, Function compare_func) : call_exists(range, container) { + auto range := range(container); + while (!range.empty()) { + if (compare_func(range.front(), value)) { + return range; + } else { + range.pop_front(); + } + } + range; +} + + +def find(container, value) { + find(container, value, eq) +} + + +)chaiscript"; + } +}; +} // namespace Carbon + +#endif /* CARBON_PRELUDE_HPP */ diff --git a/src/carbon/language/prelude_docs.hpp b/src/carbon/language/prelude_docs.hpp new file mode 100644 index 00000000..41c4adf2 --- /dev/null +++ b/src/carbon/language/prelude_docs.hpp @@ -0,0 +1,832 @@ +/// This file is not technically part of the ChaiScript API. It is used solely +/// for generating Doxygen docs regarding the ChaiScript standard runtime +/// library. + +/// \brief Items in this namespace exist in the ChaiScript language runtime. +/// They are not part of the C++ API +namespace ChaiScript_Language { +/// \page LangStandardLibraryRef ChaiScript Language Standard Library Reference +/// +/// ChaiScript, at its core, has some very functional programming-inspired +/// habits. Few places show this off as clearly as the prelude, itself a name +/// taken as a nod to the popular functional language Haskell. This prelude is +/// available to all standard ChaiScript applications, and provides a simple +/// foundation for using numbers, strings, and ranges (the general category of +/// Range cs and their iteration). +/// + +/// \brief Generic concept of a value in ChaiScript. +/// +/// The Object type exists merely as a concept. All objects in ChaiScript +/// support this concept and have the following methods available to them. All +/// objects are stored internally as Carbon::Boxed_Value types. +/// +/// \sa Carbon::Boxed_Value +class Object { +public: + /// \brief Returns the Type_Info value for this Object + Type_Info get_type_info() const; + + /// \brief Returns true if the Object is of the named type + bool is_type(string) const; + + /// \brief Returns true if the Object is of the Type_Info passed in + bool is_type(Type_Info) const; + + /// \brief Returns true if the Object is immutable + bool is_var_const() const; + + /// \brief Returns true if the Object is a pointer and the pointer is null + bool is_var_null() const; + + /// \brief Returns true if the Object is stored as a pointer + bool is_var_pointer() const; + + /// \brief Returns true if the Object is stored as a reference + bool is_var_reference() const; + + /// \brief Returns true if the Object does not contain a value is is + /// undefined. + bool is_var_undef() const; + + /// \brief Returns the registered name of the type of the object. + /// + /// \sa Type_Info::name(); + string type_name() const; +}; + +/// \brief Item returned from a Range object from a Map +class Map_Pair { +public: + /// \brief Returns the key of the Map entry + const string first(); + + /// \brief Returns the value Object of the Map entry + Object second(); +}; + +/// \brief Maps strings to Objects +/// +/// ChaiScript has a built in shortcut for generating Map objects: +/// +/// Example: +/// \code +/// eval> var m = ["a":1, "b":2]; +/// [, ] +/// eval> m.count("a"); +/// 1 +/// eval> m.count("c"); +/// 0 +/// eval> m.size(); +/// 2 +/// \endcode +/// +/// Implemented as std::map +/// +/// \sa Map_Pair +/// \sa Carbon::bootstrap::standard_library::map_type +class Map { +public: + /// \brief Returns an object that implements the Range concept for the + /// Map_Pair's in this Map + Range range(); + + /// \brief Returns an object that implements the Const_Range concept for the + /// Map_Pair's in this Map + Const_Range range() const; + + /// \brief Returns the number of elements in the Map + int size() const; + + /// \brief Returns the item at the given key, creating an undefined Object + /// if the key does not yet exist in the map + Object operator[](string); + + /// \brief Clears the map of all items + void clear(); + + /// \brief Returns the number of items in the Map with the given key. + /// Returns 0 or 1 since this is not an std::multimap. + int count(string) const; + + /// \brief Returns true if the map contains no items + bool empty() const; +}; + +/// \brief A concept implemented by string, Vector and Map. It is convertible to +/// Range, default constructable and back_insertable +class Container { +public: + void push_back(Object); + Range range(); + Const_Range range() const; +}; + +/// \brief Converts o into a string. +/// +/// \code +/// eval> to_string(3).is_type("string")
+/// true
+/// \endcode +string to_string(Object o); + +/// \brief Prints o to the terminal, without a trailing carriage return. Applies +/// conversions to string automatically. \code eval> puts("hi, "); puts("there") +/// hi, thereeval> +/// \endcode +/// \sa to_string +/// \sa print +void puts(Object o); + +/// \brief Prints o to the terminal, with a trailing carriage return. Applies +/// conversions to string automatically \code eval> print("hello") hello eval> +/// \endcode +/// \sa to_string +/// \sa puts +void print(Object o); + +/// \brief ChaiScript representation of std::string. It is an std::string but +/// only some member are exposed to ChaiScript. +/// +/// Because the ChaiScript string object is an std::string, it is directly +/// convertible to and from std::string using the Carbon::boxed_cast and +/// Carbon::var functions. +/// +/// With the exception of string::trim, string::rtrim, string::ltrim, all +/// members are direct pass-throughs to the std::string of the same name. +/// +/// \note Object and function notations are equivalent in ChaiScript. This means +/// that +/// \c "bob".find("b") and \c find("bob", "b") are exactly the same. Most +/// examples below follow the second formation of the function calls. +/// \sa \ref keyworddef for extending existing C++ classes in ChaiScript +/// \sa Carbon::bootstrap::standard_library::string_type +class string { +public: + /// \brief Finds the first instance of substr. + /// \code + /// eval> find("abab", "ab") + /// 0 + /// \endcode + int find(string s) const; + + /// \brief Finds the last instance of substr. + /// \code + /// eval> rfind("abab", "ab") + /// 2 + /// \endcode + int rfind(string s) const; + + /// \brief Finds the first of characters in list in the string. + /// + /// \code + /// eval> find_first_of("abab", "bec") + /// 1 + /// \endcode + int find_first_of(string list) const; + + /// \brief Finds the last of characters in list in the string. + /// + /// \code + /// eval> find_last_of("abab", "bec") + /// 3 + /// \endcode + int find_last_of(string list) const; + + /// \brief Finds the first non-matching character to list in the str string. + /// + /// \code + /// eval> find_first_not_of("abcd", "fec") + /// 0 + /// \endcode + int find_first_not_of(string list) const; + + /// \brief Finds the last non-matching character to list in the list string. + /// + /// \code + /// eval> find_last_not_of("abcd", "fec") + /// 3 + /// \endcode + int find_last_not_of(string list) const; + + /// \brief Removes whitespace from the front of the string, returning a new + /// string + /// + /// \note This function is implemented as a ChaiScript function using the + /// def member function notation. + /// + /// \code + /// eval> ltrim(" bob") + /// bob + /// \endcode + /// + /// \sa \ref keyworddef + string lstrim() const; + + /// \brief Removes whitespace from the back of the string, returning a new + /// string + /// + /// \note This function is implemented as a ChaiScript function using the + /// def member function notation. + /// + /// \code + /// eval> rtrim("bob ") + "|" + /// bob| + /// \endcode + /// + /// \sa \ref keyworddef + string rtrim() const; + + /// \brief Removes whitespace from the front and back of the string, + /// returning a new string + /// + /// \note This function is implemented as a ChaiScript function using the + /// def member function notation. + /// + /// \code + /// eval> trim(" bob ") + "|" + /// bob| + /// \endcode + /// + /// Equivalent to rtrim(ltrim(" bob ")); + /// + /// \sa \ref keyworddef + string trim() const; + + /// \brief Returns the character at the given index in the string, const + /// version + const char &operator[](int t_index) const; + + /// \brief Returns the character at the given index in the string + char &operator[](int t_index); + + /// \brief Returns underlying const char * for C api compatibility + const char *c_str() const; + + /// \brief Returns a pointer to the raw data in the string + const char *data() const; + + /// \brief Resets the string to empty + void clear(); + + /// \brief Returns true if the string is empty + bool empty() const; + + /// \brief Returns the size of the string in bytes. + /// + /// This function normally returns size_t in C++. In ChaiScript the return + /// value is cast to int for ease of use. + int size() const; + + /// \brief Returns an object that implements the Range concept for the + /// characters of this string + Range range(); + + /// \brief Returns an object that implements the Const_Range concept for the + /// characters of this string + Const_Range range() const; +}; + +/// \brief A concept in ChaiScript that is implemented by \ref string, Vector +/// and Map. It provides +/// easy iteration over the elements in a container. +/// +/// Implemented by the template +/// Carbon::bootstrap::standard_library::Bidir_Range +/// +/// \sa Const_Range +class Range { +public: + /// \brief Returns the last item of the range + Object back(); + + /// \brief Returns true if the front and back pointers have passed each + /// other, if no items + /// are left in the Range + bool empty() const; + + /// \brief Returns the first item of the range + Object front(); + + /// \brief Moves the back pointer back one. + /// + /// \post back() returns the element at back() - 1; + void pop_back(); + + /// \brief Moves the front pointer forward one + /// + /// \post front() returns the element at front() + 1; + void pop_front(); +}; + +/// \brief A concept in ChaiScript that is implemented by \ref string, Vector +/// and Map. It provides +/// easy iteration over the elements in a container. Contained values are +/// const. +/// +/// Implemented by the template +/// Carbon::bootstrap::standard_library::Const_Bidir_Range +/// +/// \sa Range +class Const_Range { +public: + /// \brief Returns the last item of the range + const Object back(); + + /// \brief Returns true if the front and back pointers have passed each + /// other, if no items + /// are left in the Range + bool empty() const; + + /// \brief Returns the first item of the range + const Object front(); + + /// \brief Moves the back pointer back one. + /// + /// \post back() returns the element at back() - 1; + void pop_back(); + + /// \brief Moves the front pointer forward one + /// + /// \post front() returns the element at front() + 1; + void pop_front(); +}; + +/// \brief A vector of Objects +/// +/// ChaiScript includes a shortcut for creating a Vector of Objects +/// +/// Example: +/// \code +/// eval> var v = [1,2,3,4] +/// [1, 2, 3, 4] +/// eval> v[0]; +/// 1 +/// eval> v.size(); +/// 4 +/// \endcode +/// +/// Implemented with std::vector +/// +/// \sa Carbon::bootstrap::standard_library::vector_type +class Vector { +public: + /// \brief returns the Object at the given index. Throws an exception if the + /// index does not exist + Object operator[](int t_index); + + /// \brief returns a const Object at the given index. Throws an exception if + /// the index does not exist. + const Object operator[](int t_index) const; + + /// \brief returns the last item in the Vector + Object back(); + + /// \brief Clears the Vector of all items + void clear(); + + /// \brief Returns true if the Vector is contains 0 items + bool empty(); + + /// \brief Erases the element at the given index + void erase_at(int t_index); + + /// \brief Returns the first item in the Vector + Object front(); + + /// \brief Inserts a new item in the Vector at the given index. The item is + /// not cloned on insert + /// + /// \sa insert_ref + void insert_ref_at(int, Object); + + /// \brief Inserts a new item in the Vector at the given index. The item is + /// cloned on insert + /// + /// \sa insert_ref + void insert_at(int, Object); + + /// \brief Removes the last item from the Vector + void pop_back(); + + /// \brief Adds an item to the end of the Vector. The item is not cloned. + /// + /// \sa push_back + void push_back_ref(Object); + + /// \brief Adds an item to the end of the Vector. The item is cloned. + /// + /// \sa push_back_ref + void push_back(Object); + + /// \brief Returns a Range object for the entire vector + Range range(); + + /// \brief Returns a Const_Range object for the entire vector + Const_Range range() const; + + /// \brief Returns the number of elements in the Vector + int size() const; +}; + +class Type_Info { +public: + /// \brief Compares this Type_Info object with another one and returns true + /// if the two types are the same + /// after const, pointer, reference are removed. + bool bare_equal(Type_Info t_ti) const; + + /// \brief Returns the mangled C++ name for the type given by the compiler + /// after const, pointer, reference is removed. + string cpp_bare_name() const; + + /// \brief Returns the mangled C++ name for the type given by the compiler. + string cpp_name() const; + + /// \brief Returns true if the type is const + bool is_type_const() const; + + /// \brief Returns true if the type is a pointer + bool is_type_pointer() const; + + /// \brief Returns true if the type is a reference + bool is_type_reference() const; + + /// \brief Returns true if the type is undefined + bool is_type_undef() const; + + /// \brief Returns true if the type is "void" + bool is_type_void() const; + + /// \brief Returns the ChaiScript registered name for the type if one + /// exists. + string name() const; +}; + +/// \brief Represents a function object in ChaiScript +/// +/// A function object may be one function, such as: +/// \code +/// var f = fun(x) { return x; } +/// \endcode +/// +/// Or it may represent multiple functions +/// \code +/// var f2 = `-`; // represents the unary - as well as the set of binary - +/// operators \endcode +/// +/// Guarded function example +/// \code +/// def f3(x) : x > 2 { +/// return x; +/// } +/// \endcode +/// +/// Examples in the function definitions below will reference these examples +class Function { +public: + /// \brief Returns the annotation description of the function + string get_annotation() const; + + /// \brief Returns the arity of the function, -1 if the function takes a + /// variable number of parameters + /// + /// Example: + /// \code + /// eval> f.get_arity() + /// 1 + /// eval> f2.get_arity() + /// -1 + /// \endcode + int get_arity() const; + + /// \brief Returns a vector of the contained functions + /// + /// Example: + /// \code + /// eval> f.get_contained_functions().size() + /// 0 + /// eval> f2.get_contained_functions().size() + /// 11 + /// eval> var v = f2.get_contained_functions(); + /// v[0].get_arity() + /// 2 + /// \endcode + Vector get_contained_functions() const; + + /// \brief Returns a function guard as function + /// + /// Example: + /// \code + /// eval> f.get_guard() // Throws exception + /// Function does not have a guard + /// eval> f3.get_guard().get_arity() + /// 1 + /// \endcode + Function get_guard() const; + + /// \brief Returns a vector of Type_Info objects that represent the param + /// types for this function. + /// The first value in the list is the return type. + /// + /// If this function is a conglomerate of several functions + /// (get_contained_values().size() > 0) then the function returns as many + /// Type_Info objects as it can. If the functions contained all have the + /// same arity, then it represents the arity. If they have different + /// arities, it returns only one value - the return type. + /// + /// For each parameter that is the same type, the type is returned. If the + /// types are different then a Type_Info for Object is returned. + /// + /// Example: + /// \code + /// eval> f2.get_param_types().size(); // Returns a Type_Info for Object for + /// the return type + /// 1 + /// \endcode + Vector get_param_types() const; + + /// \brief Returns true if the function has a guard to it. Always returns + /// false for a conglomerate function + bool has_guard() const; + + /// \brief Calls the function with the given set of parameters and returns + /// the value; + /// + /// Example: + /// \code + /// eval> `-`.call([2,1]); + /// 1 + /// \endcode + Object call(Vector t_params) const; +} + +/// \brief Returns the max of a or b. Requires that operator>(a, b) exists +/// Equivalent to +/// \code +/// return a>b?a:b; +/// \endcode +/// +/// Example: +/// \code +/// eval> max(4, 10) +/// 10 +/// \endcode +Object +max(Object a, Object b); + +/// \brief Returns the min of a or b. Requires that operator<(a, b) exists +/// +/// Equivalent to +/// \code +/// return a min(4, 10) +/// 4 +/// \endcode +Object min(Object a, Object b); + +/// \brief Returns true if x is an even integer. +/// +/// Will also work on any non-integer type for which an operator%(x, int) exists +/// +/// Example: +/// \code +/// eval> even(4) +/// true +/// \endcode +bool even(Object x); + +/// \brief Returns true if x is an odd integer. +/// +/// Will also work on any non-integer type for which an operator%(x, int) exists +/// +/// Example: +/// \code +/// eval> odd(4) +/// false +/// \endcode +bool even(Object x); + +/// \brief Applies the function f over each element in the Range c. +/// +/// Example: +/// \code +/// eval> for_each([1, 2, 3], print) +/// 1 +/// 2 +/// 3 +/// \endcode +void for_each(Range c, Function f); + +/// \brief Applies f over each element in the Range c, joining all the results. +/// +/// Example: +/// \code +/// eval> map([1, 2, 3], odd) +/// [true, false, true] +/// \endcode +Object map(Range c, Function f); + +/// \brief Starts with the initial value and applies the function f to it and +/// the first element of the Range c. +/// The result is then applied to the second element, and so on until the +/// elements are exhausted. +/// +/// Example: +/// \code +/// eval> foldl([1, 2, 3, 4], `+`, 0) +/// 10 +/// \endcode +Object foldl(Range c, Function f, Object initial); + +/// \brief Returns the sum total of the values in the Range c. +/// +/// Example: +/// \code +/// eval> sum([1, 2, 3, 4]) +/// 10 +/// \endcode +/// +/// Equivalent to: +/// \code +/// foldl(c, `+`, 0.0); +/// \endcode +Numeric sum(Range c); + +/// \brief Returns the product of the value in the Range c. +/// +/// Example: +/// \code +/// eval> product([1, 2, 3, 4]) +/// 24 +/// \endcode +/// +/// Equivalent to: +/// \code +/// foldl(c, `*`, 1.0); +/// \endcode +Numeric product(Range c); + +/// \brief Takes num elements from the Range c, returning them. +/// +/// Example: +/// \code +/// eval> take([1, 2, 3, 4], 2) +/// [1, 2] +/// \endcode +/// +/// \returns A container of the same type that was passed in +Object take(Range c, int num); + +/// \brief Takes elements from the Range c that match function f, stopping at +/// the first non-match, returning them as a new Vector. +/// +/// Example: +/// \code +/// eval> take_while([1, 2, 3], odd) +/// [1] +/// \endcode +/// +/// \returns A container of the same type that was passed in +Object take_while(Range c, Function f); + +/// \brief Drops num elements from the Range c, returning the remainder. +/// +/// Example: +/// \code +/// eval> drop([1, 2, 3, 4], 2) +/// [3, 4] +/// \endcode +/// +/// \returns A container of the same type that was passed in +Object drop(Range c, int num); + +/// \brief Drops elements from the Range c that match f, stopping at the first +/// non-match, returning the remainder. +/// +/// Example: +/// \code +/// eval> drop_while([1, 2, 3], odd) +/// [2, 3] +/// \endcode +Object drop_while(Range c, Function f); + +/// \brief Similar to foldl, this takes the first two elements as its starting +/// values for f. This assumes Range c has at least 2 elements. +/// +/// Example: +/// \code +/// eval> reduce([1, 2, 3, 4], `+`) +/// 10 +/// \endcode +Object reduce(Range c, Function f); + +/// \brief Takes elements from Container c that match function f, return them. +/// +/// Example: +/// \code +/// eval> filter([1, 2, 3, 4], odd) +/// [1, 3] +/// \endcode +Object filter(Container c, Function f); + +/// \brief Joins the elements of the Range c into a string, delimiting each with +/// the delim string. +/// +/// Example: +/// \code +/// eval> join([1, 2, 3], "*") +/// 1*2*3 +/// \endcode +string join(Range c, string delim); + +/// \brief Returns the contents of the Container c in reversed order. +/// +/// Example: +/// \code +/// eval> reverse([1, 2, 3, 4, 5, 6, 7]) +/// [7, 6, 5, 4, 3, 2, 1] +/// \endcode +Container reverse(Container c); + +/// \brief Generates a new Vector filled with values starting at x and ending +/// with y. +/// +/// Works on types supporting operator<=(x, y) and operator++(x) +/// +/// Example: +/// \code +/// eval> generate_range(1, 10) +/// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +/// \endcode +Vector generate_range(Object x, Object y); + +/// \brief Returns a new Range with x and y concatenated. +/// +/// Example: +/// \code +/// eval> concat([1, 2, 3], [4, 5, 6]) +/// [1, 2, 3, 4, 5, 6] +/// \endcode +Object concat(Range x, Range y); + +/// \brief Returns a new Vector with x and y as its values. +/// +/// Example: +/// \code +/// eval> collate(1, 2) +/// [1, 2] +/// \endcode +Vector collate(Object x, Object y); + +/// \brief Applies f to elements of x and y, returning a new Vector with the +/// result of each application. +/// +/// Example: +/// \code +/// eval> zip_with(`+`, [1, 2, 3], [4, 5, 6]) +/// [5, 7, 9] +/// \endcode +Vector zip_with(Function f, Range x, Range y); + +/// \brief Collates elements of x and y, returning a new Vector with the result. +/// +/// Example: +/// \code +/// eval> zip([1, 2, 3], [4, 5, 6]) +/// [[1, 4], [2, 5], [3, 6]] +/// \endcode +Vector zip(Range x, Range y); + +/// \brief returns true if there exists a call to the Function f that takes the +/// given parameters +/// +/// Example: +/// \code +/// eval> call_exists(`+`, 1, 2) +/// true +/// \endcode +bool call_exists(Function f, ...); + +/// \brief Reverses a Range object so that the elements are accessed in reverse +Range retro(Range); + +/// \brief Reverses a Const_Range object so that the elements are accessed in +/// reverse +Const_Range retro(Const_Range); + +/// \brief Raises the given object as an exception. Any type of object can be +/// thrown. +/// +/// Example: +/// \code +/// eval> try { throw(1); } catch (e) { print("Exception caught: " + +/// to_string(e)); } Exception caught: 1 \endcode +/// +/// \sa \ref keywordtry +void throw(Object); +} // namespace ChaiScript_Language diff --git a/src/carbon/language/tracer.hpp b/src/carbon/language/tracer.hpp new file mode 100644 index 00000000..b1d35ddb --- /dev/null +++ b/src/carbon/language/tracer.hpp @@ -0,0 +1,33 @@ + + +#ifndef CARBON_TRACER_HPP +#define CARBON_TRACER_HPP + +namespace Carbon::eval { +struct Noop_Tracer_Detail { + template + constexpr void trace(const Carbon::detail::Dispatch_State &, + const AST_Node_Impl *) noexcept {} +}; + +template +struct Tracer : T... { + Tracer() = default; + constexpr explicit Tracer(T... t) : T(std::move(t))... {} + + void do_trace(const Carbon::detail::Dispatch_State &ds, + const AST_Node_Impl> *node) { + (static_cast(*this).trace(ds, node), ...); + } + + static void trace(const Carbon::detail::Dispatch_State &ds, + const AST_Node_Impl> *node) { + ds->get_parser().get_tracer>().do_trace(ds, node); + } +}; + +using Noop_Tracer = Tracer; + +} // namespace Carbon::eval + +#endif diff --git a/src/carbon/language/unknown.hpp b/src/carbon/language/unknown.hpp new file mode 100644 index 00000000..ea5f591f --- /dev/null +++ b/src/carbon/language/unknown.hpp @@ -0,0 +1,21 @@ + + +#ifndef CARBON_UNKNOWN_HPP +#define CARBON_UNKNOWN_HPP + +namespace Carbon { + namespace detail { + struct Loadable_Module { + Loadable_Module(const std::string &, const std::string &) { +#ifdef CARBON_NO_DYNLOAD + throw Carbon::exception::load_module_error("Loadable module support was disabled (CARBON_NO_DYNLOAD)"); +#else + throw Carbon::exception::load_module_error("Loadable module support not available for your platform"); +#endif + } + + ModulePtr m_moduleptr; + }; + } // namespace detail +} // namespace Carbon +#endif diff --git a/src/carbon/language/windows.hpp b/src/carbon/language/windows.hpp new file mode 100644 index 00000000..415063f5 --- /dev/null +++ b/src/carbon/language/windows.hpp @@ -0,0 +1,109 @@ + + +#ifndef CARBON_WINDOWS_HPP +#define CARBON_WINDOWS_HPP + +#include + +#ifdef CARBON_WINDOWS +#define VC_EXTRA_LEAN +#if !defined(WIN32_LEAN_AND_MEAN) +#define WIN32_LEAN_AND_MEAN +#endif +#include +#endif + +namespace Carbon { +namespace detail { +struct Loadable_Module { + template + static std::wstring to_wstring(const T &t_str) { + return std::wstring(t_str.begin(), t_str.end()); + } + + template + static std::string to_string(const T &t_str) { + return std::string(t_str.begin(), t_str.end()); + } + +#if defined(_UNICODE) || defined(UNICODE) + template + static std::wstring to_proper_string(const T &t_str) { + return to_wstring(t_str); + } +#else + template + static std::string to_proper_string(const T &t_str) { + return to_string(t_str); + } +#endif + + static std::string get_error_message(DWORD t_err) { + using StringType = LPTSTR; + +#if defined(_UNICODE) || defined(UNICODE) + std::wstring retval = L"Unknown Error"; +#else + std::string retval = "Unknown Error"; +#endif + StringType lpMsgBuf = nullptr; + + if (FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, t_err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + reinterpret_cast(&lpMsgBuf), 0, nullptr) != 0 && + lpMsgBuf) { + retval = lpMsgBuf; + LocalFree(lpMsgBuf); + } + + return to_string(retval); + } + + struct DLModule { + explicit DLModule(const std::string &t_filename) + : m_data(LoadLibrary(to_proper_string(t_filename).c_str())) { + if (!m_data) { + throw Carbon::exception::load_module_error( + get_error_message(GetLastError())); + } + } + + DLModule(DLModule &&) = default; + DLModule &operator=(DLModule &&) = default; + DLModule(const DLModule &) = delete; + DLModule &operator=(const DLModule &) = delete; + + ~DLModule() { FreeLibrary(m_data); } + + HMODULE m_data; + }; + + template + struct DLSym { + DLSym(DLModule &t_mod, const std::string &t_symbol) + : m_symbol(reinterpret_cast( + GetProcAddress(t_mod.m_data, t_symbol.c_str()))) { + if (!m_symbol) { + throw Carbon::exception::load_module_error( + get_error_message(GetLastError())); + } + } + + T m_symbol; + }; + + Loadable_Module(const std::string &t_module_name, + const std::string &t_filename) + : m_dlmodule(t_filename), + m_func(m_dlmodule, "create_module_" + t_module_name), + m_moduleptr(m_func.m_symbol()) {} + + DLModule m_dlmodule; + DLSym m_func; + ModulePtr m_moduleptr; +}; +} // namespace detail +} // namespace Carbon +#endif diff --git a/src/carbon/stdlib.hpp b/src/carbon/stdlib.hpp new file mode 100644 index 00000000..7c30cb2b --- /dev/null +++ b/src/carbon/stdlib.hpp @@ -0,0 +1,70 @@ + + +#ifndef CARBON_STDLIB_HPP +#define CARBON_STDLIB_HPP + +#include +#include +#include +#include +#include + +#include "defines.hpp" +#include "language/common.hpp" + +#include "command/function_call.hpp" + +// #include "command/dispatchkit.hpp" +#include "command/bootstrap.hpp" +#include "command/bootstrap_stl.hpp" +#include "command/operators.hpp" +// #include "command/boxed_value.hpp" +#include "command/register_function.hpp" +#include "language/prelude.hpp" +#include "utils/json_wrap.hpp" + +#ifndef CARBON_NO_THREADS +#include +#endif + +/// @file +/// +/// This file generates the standard library that normal ChaiScript usage +/// requires. + +namespace Carbon { +class Std_Lib { +public: + [[nodiscard]] static ModulePtr library() { + auto lib = std::make_shared(); + bootstrap::Bootstrap::bootstrap(*lib); + + bootstrap::standard_library::vector_type>( + "Vector", *lib); + bootstrap::standard_library::string_type("string", *lib); + bootstrap::standard_library::map_type< + std::map>("Map", *lib); + bootstrap::standard_library::pair_type< + std::pair>("Pair", *lib); + +#ifndef CARBON_NO_THREADS + bootstrap::standard_library::future_type< + std::future>("future", *lib); + lib->add( + Carbon::fun( + [](const std::function &t_func) { + return std::async(std::launch::async, t_func); + }), + "async"); +#endif + + json_wrap::library(*lib); + + lib->eval(ChaiScript_Prelude::prelude() /*, "standard prelude"*/); + + return lib; + } +}; +} // namespace Carbon + +#endif diff --git a/src/carbon/threading.hpp b/src/carbon/threading.hpp new file mode 100644 index 00000000..e3ab5053 --- /dev/null +++ b/src/carbon/threading.hpp @@ -0,0 +1,133 @@ +// This file is distributed under the BSD License. +// See "license.txt" for details. +// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) +// Copyright 2009-2018, Jason Turner (jason@emptycrate.com) +// http://www.chaiscript.com + +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + +#ifndef CARBON_THREADING_HPP +#define CARBON_THREADING_HPP + +#include + +#ifndef CARBON_NO_THREADS +#include +#include +#include +#else +#ifndef CARBON_NO_THREADS_WARNING +#pragma message("ChaiScript is compiling without thread safety.") +#endif +#endif + +#include "defines.hpp" + +/// \file +/// +/// This file contains code necessary for thread support in ChaiScript. +/// If the compiler definition CARBON_NO_THREADS is defined then thread safety +/// is disabled in ChaiScript. This has the result that some code is faster, because mutex locks are not required. +/// It also has the side effect that the Carbon::ChaiScript object may not be accessed from more than +/// one thread simultaneously. + +/// If threading is enabled, then this namespace contains std thread classes. +/// If threading is not enabled, then stubbed in wrappers that do nothing are provided. +/// This allows us to avoid \#ifdef code in the sections that need thread safety. +namespace Carbon::detail::threading { +#ifndef CARBON_NO_THREADS + + template + using unique_lock = std::unique_lock; + + template + using shared_lock = std::shared_lock; + + template + using lock_guard = std::lock_guard; + + using std::shared_mutex; + + using std::mutex; + + using std::recursive_mutex; + + /// Typesafe thread specific storage. If threading is enabled, this class uses a mutex protected map. If + /// threading is not enabled, the class always returns the same data, regardless of which thread it is called from. + template + class Thread_Storage { + public: + Thread_Storage() = default; + Thread_Storage(const Thread_Storage &) = delete; + Thread_Storage(Thread_Storage &&) = delete; + Thread_Storage &operator=(const Thread_Storage &) = delete; + Thread_Storage &operator=(Thread_Storage &&) = delete; + + ~Thread_Storage() { t().erase(this); } + + inline const T *operator->() const noexcept { return &(t()[this]); } + + inline const T &operator*() const noexcept { return t()[this]; } + + inline T *operator->() noexcept { return &(t()[this]); } + + inline T &operator*() noexcept { return t()[this]; } + + void *m_key; + + private: + /// todo: is it valid to make this noexcept? The allocation could fail, but if it + /// does there is no possible way to recover + static std::unordered_map &t() noexcept { + static thread_local std::unordered_map my_t; + return my_t; + } + }; + +#else // threading disabled + template + class unique_lock { + public: + constexpr explicit unique_lock(T &) noexcept {} + constexpr void lock() noexcept {} + constexpr void unlock() noexcept {} + }; + + template + class shared_lock { + public: + constexpr explicit shared_lock(T &) noexcept {} + constexpr void lock() noexcept {} + constexpr void unlock() noexcept {} + }; + + template + class lock_guard { + public: + constexpr explicit lock_guard(T &) noexcept {} + }; + + class shared_mutex { + }; + + class recursive_mutex { + }; + + template + class Thread_Storage { + public: + constexpr explicit Thread_Storage() noexcept {} + + constexpr inline T *operator->() const noexcept { return &obj; } + + constexpr inline T &operator*() const noexcept { return obj; } + + private: + mutable T obj; + }; + +#endif +} // namespace Carbon::detail::threading + +#endif diff --git a/src/carbon/utils/json.hpp b/src/carbon/utils/json.hpp new file mode 100644 index 00000000..df916541 --- /dev/null +++ b/src/carbon/utils/json.hpp @@ -0,0 +1,665 @@ + + +#ifndef SIMPLEJSON_HPP +#define SIMPLEJSON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../defines.hpp" +#include "quick_flat_map.hpp" + +namespace Carbon::json { +using std::enable_if; +using std::initializer_list; +using std::is_convertible; +using std::is_floating_point; +using std::is_integral; +using std::is_same; + +class JSON { +public: + enum class Class { + Null = 0, + Object, + Array, + String, + Floating, + Integral, + Boolean + }; + +private: + using Data = std::variant< + std::nullptr_t, Carbon::utility::QuickFlatMap, + std::vector, std::string, double, std::int64_t, bool>; + + struct Internal { + Internal(std::nullptr_t) : d(nullptr) {} + Internal() : d(nullptr) {} + Internal(Class c) : d(make_type(c)) {} + template + Internal(T t) : d(std::move(t)) {} + + static Data make_type(Class c) { + switch (c) { + case Class::Null: + return nullptr; + case Class::Object: + return Carbon::utility::QuickFlatMap{}; + case Class::Array: + return std::vector{}; + case Class::String: + return std::string{}; + case Class::Floating: + return double{}; + case Class::Integral: + return std::int64_t{}; + case Class::Boolean: + return bool{}; + } + throw std::runtime_error("unknown type"); + } + + void set_type(Class c) { + if (type() != c) { + d = make_type(c); + } + } + + Class type() const noexcept { return Class(d.index()); } + + template + decltype(auto) visit_or(Visitor &&visitor, Or &&other) const { + if (type() == Class(ClassValue)) { + return visitor( + std::get(ClassValue)>(d)); + } else { + return other(); + } + } + + template + auto &get_set_type() { + set_type(ClassValue); + return (std::get(ClassValue)>(d)); + } + + auto &Map() { return get_set_type(); } + auto &Vector() { return get_set_type(); } + auto &String() { return get_set_type(); } + auto &Int() { return get_set_type(); } + auto &Float() { return get_set_type(); } + auto &Bool() { return get_set_type(); } + + auto Map() const noexcept { + return std::get_if(Class::Object)>(&d); + } + auto Vector() const noexcept { + return std::get_if(Class::Array)>(&d); + } + auto String() const noexcept { + return std::get_if(Class::String)>(&d); + } + auto Int() const noexcept { + return std::get_if(Class::Integral)>(&d); + } + auto Float() const noexcept { + return std::get_if(Class::Floating)>(&d); + } + auto Bool() const noexcept { + return std::get_if(Class::Boolean)>(&d); + } + + Data d; + }; + + Internal internal; + +public: + template + class JSONWrapper { + Container *object = nullptr; + + public: + JSONWrapper(Container *val) : object(val) {} + JSONWrapper(std::nullptr_t) {} + + typename Container::iterator begin() { + return object ? object->begin() : typename Container::iterator(); + } + typename Container::iterator end() { + return object ? object->end() : typename Container::iterator(); + } + typename Container::const_iterator begin() const { + return object ? object->begin() : typename Container::iterator(); + } + typename Container::const_iterator end() const { + return object ? object->end() : typename Container::iterator(); + } + }; + + template + class JSONConstWrapper { + const Container *object = nullptr; + + public: + JSONConstWrapper(const Container *val) : object(val) {} + JSONConstWrapper(std::nullptr_t) {} + + typename Container::const_iterator begin() const noexcept { + return object ? object->begin() + : typename Container::const_iterator(); + } + typename Container::const_iterator end() const noexcept { + return object ? object->end() + : typename Container::const_iterator(); + } + }; + + JSON() = default; + JSON(std::nullptr_t) {} + + explicit JSON(Class type) : internal(type) {} + + JSON(initializer_list list) : internal(Class::Object) { + for (auto i = list.begin(), e = list.end(); i != e; ++i, ++i) { + operator[](i->to_string()) = *std::next(i); + } + } + + template + explicit JSON(T b, typename enable_if::value>::type * = + nullptr) noexcept + : internal(static_cast(b)) {} + + template + explicit JSON(T i, typename enable_if::value && + !is_same::value>::type * = + nullptr) noexcept + : internal(static_cast(i)) {} + + template + explicit JSON(T f, typename enable_if::value>::type * = + nullptr) noexcept + : internal(static_cast(f)) {} + + template + explicit JSON( + T s, typename enable_if::value>::type * = + nullptr) + : internal(static_cast(s)) {} + + static JSON Load(const std::string &); + + JSON &operator[](const std::string &key) { + return internal.Map().operator[](key); + } + + JSON &operator[](const size_t index) { + auto &vec = internal.Vector(); + if (index >= vec.size()) { + vec.resize(index + 1); + } + + return vec.operator[](index); + } + + JSON &at(const std::string &key) { return operator[](key); } + + const JSON &at(const std::string &key) const { + return internal.visit_or( + [&](const auto &m) -> const JSON & { return m.at(key); }, + []() -> const JSON & { + throw std::range_error("Not an object, no keys"); + }); + } + + JSON &at(size_t index) { return operator[](index); } + + const JSON &at(size_t index) const { + return internal.visit_or( + [&](const auto &m) -> const JSON & { return m.at(index); }, + []() -> const JSON & { + throw std::range_error("Not an array, no indexes"); + }); + } + + auto length() const noexcept { + return internal.visit_or( + [&](const auto &m) { return static_cast(m.size()); }, + []() { return -1; }); + } + + bool has_key(const std::string &key) const noexcept { + return internal.visit_or( + [&](const auto &m) { return m.count(key) != 0; }, + []() { return false; }); + } + + int size() const noexcept { + if (auto m = internal.Map(); m != nullptr) { + return static_cast(m->size()); + } + if (auto v = internal.Vector(); v != nullptr) { + return static_cast(v->size()); + } else { + return -1; + } + } + + Class JSONType() const noexcept { return internal.type(); } + + /// Functions for getting primitives from the JSON object. + bool is_null() const noexcept { return internal.type() == Class::Null; } + + std::string to_string() const noexcept { + return internal.visit_or([](const auto &o) { return o; }, + []() { return std::string{}; }); + } + double to_float() const noexcept { + return internal.visit_or( + [](const auto &o) { return o; }, []() { return double{}; }); + } + std::int64_t to_int() const noexcept { + return internal.visit_or( + [](const auto &o) { return o; }, []() { return std::int64_t{}; }); + } + bool to_bool() const noexcept { + return internal.visit_or( + [](const auto &o) { return o; }, []() { return false; }); + } + + JSONWrapper> + object_range() { + return std::get_if(Class::Object)>( + &internal.d); + } + + JSONWrapper> array_range() { + return std::get_if(Class::Array)>(&internal.d); + } + + JSONConstWrapper> + object_range() const { + return std::get_if(Class::Object)>( + &internal.d); + } + + JSONConstWrapper> array_range() const { + return std::get_if(Class::Array)>(&internal.d); + } + + std::string dump(long depth = 1, std::string tab = " ") const { + switch (internal.type()) { + case Class::Null: + return "null"; + case Class::Object: { + std::string pad = ""; + for (long i = 0; i < depth; ++i, pad += tab) { + } + + std::string s = "{\n"; + bool skip = true; + for (auto &p : *internal.Map()) { + if (!skip) { + s += ",\n"; + } + s += (pad + "\"" + json_escape(p.first) + + "\" : " + p.second.dump(depth + 1, tab)); + skip = false; + } + s += ("\n" + pad.erase(0, 2) + "}"); + return s; + } + case Class::Array: { + std::string s = "["; + bool skip = true; + for (auto &p : *internal.Vector()) { + if (!skip) { + s += ", "; + } + s += p.dump(depth + 1, tab); + skip = false; + } + s += "]"; + return s; + } + case Class::String: + return "\"" + json_escape(*internal.String()) + "\""; + case Class::Floating: + return std::to_string(*internal.Float()); + case Class::Integral: + return std::to_string(*internal.Int()); + case Class::Boolean: + return *internal.Bool() ? "true" : "false"; + } + + throw std::runtime_error("Unhandled JSON type"); + } + +private: + static std::string json_escape(const std::string &str) { + std::string output; + for (char i : str) { + switch (i) { + case '\"': + output += "\\\""; + break; + case '\\': + output += "\\\\"; + break; + case '\b': + output += "\\b"; + break; + case '\f': + output += "\\f"; + break; + case '\n': + output += "\\n"; + break; + case '\r': + output += "\\r"; + break; + case '\t': + output += "\\t"; + break; + default: + output += i; + break; + } + } + return output; + } + +private: +}; + +struct JSONParser { + static bool isspace(const char c) noexcept { +#ifdef CHAISCRIPT_MSVC +// MSVC warns on these line in some circumstances +#pragma warning(push) +#pragma warning(disable : 6330) +#endif + return ::isspace(c) != 0; +#ifdef CHAISCRIPT_MSVC +#pragma warning(pop) +#endif + } + + static void consume_ws(const std::string &str, size_t &offset) { + while (isspace(str.at(offset)) && offset <= str.size()) { + ++offset; + } + } + + static JSON parse_object(const std::string &str, size_t &offset) { + JSON Object(JSON::Class::Object); + + ++offset; + consume_ws(str, offset); + if (str.at(offset) == '}') { + ++offset; + return Object; + } + + for (; offset < str.size();) { + JSON Key = parse_next(str, offset); + consume_ws(str, offset); + if (str.at(offset) != ':') { + throw std::runtime_error( + std::string("JSON ERROR: Object: Expected colon, found '") + + str.at(offset) + "'\n"); + } + consume_ws(str, ++offset); + JSON Value = parse_next(str, offset); + Object[Key.to_string()] = Value; + + consume_ws(str, offset); + if (str.at(offset) == ',') { + ++offset; + continue; + } else if (str.at(offset) == '}') { + ++offset; + break; + } else { + throw std::runtime_error( + std::string("JSON ERROR: Object: Expected comma, found '") + + str.at(offset) + "'\n"); + } + } + + return Object; + } + + static JSON parse_array(const std::string &str, size_t &offset) { + JSON Array(JSON::Class::Array); + size_t index = 0; + + ++offset; + consume_ws(str, offset); + if (str.at(offset) == ']') { + ++offset; + return Array; + } + + for (; offset < str.size();) { + Array[index++] = parse_next(str, offset); + consume_ws(str, offset); + + if (str.at(offset) == ',') { + ++offset; + continue; + } else if (str.at(offset) == ']') { + ++offset; + break; + } else { + throw std::runtime_error( + std::string( + "JSON ERROR: Array: Expected ',' or ']', found '") + + str.at(offset) + "'\n"); + } + } + + return Array; + } + + static JSON parse_string(const std::string &str, size_t &offset) { + std::string val; + for (char c = str.at(++offset); c != '\"'; c = str.at(++offset)) { + if (c == '\\') { + switch (str.at(++offset)) { + case '\"': + val += '\"'; + break; + case '\\': + val += '\\'; + break; + case '/': + val += '/'; + break; + case 'b': + val += '\b'; + break; + case 'f': + val += '\f'; + break; + case 'n': + val += '\n'; + break; + case 'r': + val += '\r'; + break; + case 't': + val += '\t'; + break; + case 'u': { + val += "\\u"; + for (size_t i = 1; i <= 4; ++i) { + c = str.at(offset + i); + if ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F')) { + val += c; + } else { + throw std::runtime_error( + std::string("JSON ERROR: String: Expected " + "hex character in unicode " + "escape, found '") + + c + "'"); + } + } + offset += 4; + } break; + default: + val += '\\'; + break; + } + } else { + val += c; + } + } + ++offset; + return JSON(val); + } + + static JSON parse_number(const std::string &str, size_t &offset) { + std::string val, exp_str; + char c = '\0'; + bool isDouble = false; + bool isNegative = false; + std::int64_t exp = 0; + bool isExpNegative = false; + if (offset < str.size() && str.at(offset) == '-') { + isNegative = true; + ++offset; + } + for (; offset < str.size();) { + c = str.at(offset++); + if (c >= '0' && c <= '9') { + val += c; + } else if (c == '.' && !isDouble) { + val += c; + isDouble = true; + } else { + break; + } + } + if (offset < str.size() && (c == 'E' || c == 'e')) { + c = str.at(offset++); + if (c == '-') { + isExpNegative = true; + } else if (c == '+') { + // do nothing + } else { + --offset; + } + + for (; offset < str.size();) { + c = str.at(offset++); + if (c >= '0' && c <= '9') { + exp_str += c; + } else if (!isspace(c) && c != ',' && c != ']' && c != '}') { + throw std::runtime_error( + std::string("JSON ERROR: Number: Expected a number for " + "exponent, found '") + + c + "'"); + } else { + break; + } + } + exp = Carbon::parse_num(exp_str) * + (isExpNegative ? -1 : 1); + } else if (offset < str.size() && + (!isspace(c) && c != ',' && c != ']' && c != '}')) { + throw std::runtime_error( + std::string("JSON ERROR: Number: unexpected character '") + c + + "'"); + } + --offset; + + if (isDouble) { + return JSON((isNegative ? -1 : 1) * Carbon::parse_num(val) * + std::pow(10, exp)); + } else { + if (!exp_str.empty()) { + return JSON( + (isNegative ? -1 : 1) * + static_cast(Carbon::parse_num(val)) * + std::pow(10, exp)); + } else { + return JSON((isNegative ? -1 : 1) * + Carbon::parse_num(val)); + } + } + } + + static JSON parse_bool(const std::string &str, size_t &offset) { + if (str.substr(offset, 4) == "true") { + offset += 4; + return JSON(true); + } else if (str.substr(offset, 5) == "false") { + offset += 5; + return JSON(false); + } else { + throw std::runtime_error( + std::string( + "JSON ERROR: Bool: Expected 'true' or 'false', found '") + + str.substr(offset, 5) + "'"); + } + } + + static JSON parse_null(const std::string &str, size_t &offset) { + if (str.substr(offset, 4) != "null") { + throw std::runtime_error( + std::string("JSON ERROR: Null: Expected 'null', found '") + + str.substr(offset, 4) + "'"); + } + offset += 4; + return JSON(); + } + + static JSON parse_next(const std::string &str, size_t &offset) { + char value; + consume_ws(str, offset); + value = str.at(offset); + switch (value) { + case '[': + return parse_array(str, offset); + case '{': + return parse_object(str, offset); + case '\"': + return parse_string(str, offset); + case 't': + case 'f': + return parse_bool(str, offset); + case 'n': + return parse_null(str, offset); + default: + if ((value <= '9' && value >= '0') || value == '-') { + return parse_number(str, offset); + } + } + throw std::runtime_error( + std::string("JSON ERROR: Parse: Unexpected starting character '") + + value + "'"); + } +}; + +inline JSON JSON::Load(const std::string &str) { + size_t offset = 0; + return JSONParser::parse_next(str, offset); +} + +} // namespace Carbon::json + +#endif diff --git a/src/carbon/utils/json_wrap.hpp b/src/carbon/utils/json_wrap.hpp new file mode 100644 index 00000000..8c73f857 --- /dev/null +++ b/src/carbon/utils/json_wrap.hpp @@ -0,0 +1,138 @@ +#ifndef CHAISCRIPT_SIMPLEJSON_WRAP_HPP +#define CHAISCRIPT_SIMPLEJSON_WRAP_HPP + +#include "json.hpp" + +namespace chaiscript { +class json_wrap { +public: + static Module &library(Module &m) { + m.add(Carbon::fun( + [](const std::string &t_str) { return from_json(t_str); }), + "from_json"); + m.add(Carbon::fun(&json_wrap::to_json), "to_json"); + + return m; + } + +private: + static Boxed_Value from_json(const json::JSON &t_json) { + switch (t_json.JSONType()) { + case json::JSON::Class::Null: + return Boxed_Value(); + case json::JSON::Class::Object: { + std::map m; + + for (const auto &p : t_json.object_range()) { + m.insert(std::make_pair(p.first, from_json(p.second))); + } + + return Boxed_Value(m); + } + case json::JSON::Class::Array: { + std::vector vec; + + for (const auto &p : t_json.array_range()) { + vec.emplace_back(from_json(p)); + } + + return Boxed_Value(vec); + } + case json::JSON::Class::String: + return Boxed_Value(t_json.to_string()); + case json::JSON::Class::Floating: + return Boxed_Value(t_json.to_float()); + case json::JSON::Class::Integral: + return Boxed_Value(t_json.to_int()); + case json::JSON::Class::Boolean: + return Boxed_Value(t_json.to_bool()); + } + + throw std::runtime_error("Unknown JSON type"); + } + + static Boxed_Value from_json(const std::string &t_json) { + try { + return from_json(json::JSON::Load(t_json)); + } catch (const std::out_of_range &) { + throw std::runtime_error("Unparsed JSON input"); + } + } + + static std::string to_json(const Boxed_Value &t_bv) { + return to_json_object(t_bv).dump(); + } + + static json::JSON to_json_object(const Boxed_Value &t_bv) { + try { + const std::map m = Carbon::boxed_cast< + const std::map &>(t_bv); + + json::JSON obj(json::JSON::Class::Object); + for (const auto &o : m) { + obj[o.first] = to_json_object(o.second); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a map + } + + try { + const std::vector v = + Carbon::boxed_cast &>(t_bv); + + json::JSON obj(json::JSON::Class::Array); + for (size_t i = 0; i < v.size(); ++i) { + obj[i] = to_json_object(v[i]); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a vector + } + + try { + Boxed_Number bn(t_bv); + if (Boxed_Number::is_floating_point(t_bv)) { + return json::JSON(bn.get_as()); + } else { + return json::JSON(bn.get_as()); + } + } catch (const Carbon::detail::exception::bad_any_cast &) { + // not a number + } + + try { + return json::JSON(boxed_cast(t_bv)); + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a bool + } + + try { + return json::JSON(boxed_cast(t_bv)); + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a string + } + + try { + const Carbon::dispatch::Dynamic_Object &o = + boxed_cast(t_bv); + + json::JSON obj(json::JSON::Class::Object); + for (const auto &attr : o.get_attrs()) { + obj[attr.first] = to_json_object(attr.second); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a dynamic object + } + + if (t_bv.is_null()) + return json::JSON(); // a null value + + throw std::runtime_error("Unknown object type to convert to JSON"); + } +}; + +} // namespace chaiscript + +#endif diff --git a/src/carbon/utils/utility.hpp b/src/carbon/utils/utility.hpp new file mode 100644 index 00000000..782614be --- /dev/null +++ b/src/carbon/utils/utility.hpp @@ -0,0 +1,105 @@ + + +#ifndef CHAISCRIPT_UTILITY_UTILITY_HPP_ +#define CHAISCRIPT_UTILITY_UTILITY_HPP_ + +#include +#include +#include +#include + +#include "../command/operators.hpp" +#include "../command/register_function.hpp" +#include "../language/common.hpp" + +namespace Carbon::utility { +/// Single step command for registering a class with ChaiScript +/// +/// \param[in,out] t_module Model to add class to +/// \param[in] t_class_name Name of the class being registered +/// \param[in] t_constructors Vector of constructors to add +/// \param[in] t_funcs Vector of methods to add +/// +/// \example Adding a basic class to ChaiScript in one step +/// +/// \code +/// Carbon::utility::add_class(*m, +/// "test", +/// { constructor(), +/// constructor() }, +/// { {fun(&test::function), "function"}, +/// {fun(&test::function2), "function2"}, +/// {fun(&test::function3), "function3"}, +/// {fun(static_cast(&test::function_overload)), +/// "function_overload" }, +/// {fun(static_cast(&test::function_overload)), +/// "function_overload" }, {fun(static_cast(&test::operator=)), "=" } +/// } +/// ); +/// +template +void add_class(ModuleType &t_module, const std::string &t_class_name, + const std::vector &t_constructors, + const std::vector> + &t_funcs) { + t_module.add(Carbon::user_type(), t_class_name); + + for (const Carbon::Proxy_Function &ctor : t_constructors) { + t_module.add(ctor, t_class_name); + } + + for (const auto &fun : t_funcs) { + t_module.add(fun.first, fun.second); + } +} + +template +typename std::enable_if::value, void>::type add_class( + ModuleType &t_module, const std::string &t_class_name, + const std::vector::type, + std::string>> &t_constants) { + t_module.add(Carbon::user_type(), t_class_name); + + t_module.add(Carbon::constructor(), t_class_name); + t_module.add(Carbon::constructor(), t_class_name); + + using namespace Carbon::bootstrap::operators; + equal(t_module); + not_equal(t_module); + assign(t_module); + + t_module.add( + Carbon::fun([](const Enum &e, const int &i) { return e == i; }), "=="); + t_module.add( + Carbon::fun([](const int &i, const Enum &e) { return i == e; }), "=="); + + for (const auto &constant : t_constants) { + t_module.add_global_const(Carbon::const_var(Enum(constant.first)), + constant.second); + } +} + +template +typename std::enable_if::value, void>::type add_class( + ModuleType &t_module, const std::string &t_class_name, + const std::vector> &t_constants) { + t_module.add(Carbon::user_type(), t_class_name); + + t_module.add(Carbon::constructor(), t_class_name); + t_module.add(Carbon::constructor(), + t_class_name); + + using namespace Carbon::bootstrap::operators; + equal(t_module); + not_equal(t_module); + assign(t_module); + + for (const auto &constant : t_constants) { + t_module.add_global_const(Carbon::const_var(EnumClass(constant.first)), + constant.second); + } +} +} // namespace Carbon::utility + +#endif From 472e5f57d91cc0cfed88097f0a921a28b04e351d Mon Sep 17 00:00:00 2001 From: Max Qian <64824374+AstroAir@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:48:40 +0000 Subject: [PATCH 06/28] fix bugs in carbon --- src/atom/algorithm/hash.hpp | 60 +++ src/carbon/CMakeLists.txt | 450 ++++++++++++++++++ src/carbon/basic.hpp | 4 +- src/carbon/carbon.hpp | 12 +- src/carbon/command/any.hpp | 2 + src/carbon/command/bad_boxed_cast.cpp | 4 +- src/carbon/command/bad_boxed_cast.hpp | 69 ++- src/carbon/command/boxed_cast.hpp | 2 +- src/carbon/command/boxed_number.hpp | 2 +- src/carbon/command/boxed_value.hpp | 2 +- src/carbon/command/dispatchkit.hpp | 10 +- src/carbon/command/dynamic_object.hpp | 2 +- src/carbon/command/dynamic_object_detail.cpp | 2 +- .../command/exception_specification.hpp | 1 + src/carbon/command/proxy_functions.cpp | 6 +- src/carbon/command/proxy_functions.hpp | 329 +++++++++++-- src/carbon/command/register_function.hpp | 106 +++-- src/carbon/command/type_conversions.hpp | 12 +- src/carbon/language/algebraic.hpp | 62 +-- src/carbon/language/common.hpp | 65 +-- src/carbon/language/engine.hpp | 38 +- src/carbon/language/eval.hpp | 2 +- src/carbon/language/parser.hpp | 94 ++-- src/carbon/language/posix.hpp | 3 + src/carbon/language/prelude.hpp | 4 +- src/carbon/language/prelude_docs.hpp | 4 +- src/carbon/language/tracer.hpp | 1 + src/carbon/language/unknown.hpp | 22 +- src/carbon/stdlib.hpp | 4 +- src/carbon/utils/json.hpp | 16 +- src/carbon/utils/json_wrap.hpp | 4 +- 31 files changed, 1108 insertions(+), 286 deletions(-) create mode 100644 src/carbon/CMakeLists.txt diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index 3a81e9aa..be1fd984 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -16,7 +16,10 @@ Description: A collection of hash algorithms #define ATOM_ALGORITHM_HASH_HPP #include +#include #include +#include +#include #include #include #include @@ -64,6 +67,63 @@ std::size_t computeHash(const std::array& array) { } return result; } + +template +constexpr std::uint32_t fnv1a_hash(Itr begin, Itr end) noexcept { + std::uint32_t h = 0x811c9dc5; + + while (begin != end) { + h = (h ^ static_cast(*begin)) * 0x01000193; + ++begin; + } + return h; +} + +template +constexpr std::uint32_t fnv1a_hash(const char (&str)[N]) noexcept { + return fnv1a_hash(std::begin(str), std::end(str) - 1); +} + +constexpr std::uint32_t fnv1a_hash(std::string_view sv) noexcept { + return fnv1a_hash(sv.begin(), sv.end()); +} + +inline std::uint32_t fnv1a_hash(const std::string& s) noexcept { + return fnv1a_hash(std::string_view{s}); +} + +template +constexpr std::uint32_t jenkins_one_at_a_time_hash(Itr begin, + Itr end) noexcept { + std::uint32_t hash = 0; + + while (begin != end) { + hash += static_cast(*begin); + hash += hash << 10; + hash ^= hash >> 6; + ++begin; + } + + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; +} + +template +constexpr std::uint32_t jenkins_one_at_a_time_hash( + const char (&str)[N]) noexcept { + return jenkins_one_at_a_time_hash(std::begin(str), std::end(str) - 1); +} + +constexpr std::uint32_t jenkins_one_at_a_time_hash( + std::string_view sv) noexcept { + return jenkins_one_at_a_time_hash(sv.begin(), sv.end()); +} + +inline std::uint32_t jenkins_one_at_a_time_hash(const std::string& s) noexcept { + return jenkins_one_at_a_time_hash(std::string_view{s}); +} } // namespace Atom::Algorithm #endif diff --git a/src/carbon/CMakeLists.txt b/src/carbon/CMakeLists.txt new file mode 100644 index 00000000..dc3466ab --- /dev/null +++ b/src/carbon/CMakeLists.txt @@ -0,0 +1,450 @@ +cmake_minimum_required(VERSION 3.12) + +project(Carbon) + +cmake_policy(SET CMP0054 NEW) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# required since cmake 3.4 at least for libc++ +set(CMAKE_ENABLE_EXPORTS ON) + +option(MULTITHREAD_SUPPORT_ENABLED "Multithreaded Support Enabled" TRUE) +option(DYNLOAD_ENABLED "Dynamic Loading Support Enabled" TRUE) +option(BUILD_MODULES "Build Extra Modules (stl)" TRUE) +option(BUILD_SAMPLES "Build Samples Folder" FALSE) +option(RUN_FUZZY_TESTS "Run tests generated by AFL" FALSE) +option(USE_STD_MAKE_SHARED "Use std::make_shared instead of Carbon::make_shared" FALSE) +option(RUN_PERFORMANCE_TESTS "Run Performance Tests" FALSE) + +mark_as_advanced(USE_STD_MAKE_SHARED) + +if(USE_STD_MAKE_SHARED) + add_definitions(-DCarbon_USE_STD_MAKE_SHARED) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + option(ENABLE_COVERAGE "Enable Coverage Reporting in GCC" FALSE) + + if(ENABLE_COVERAGE) + add_definitions(--coverage -O0) + set(LINKER_FLAGS "${LINKER_FLAGS} --coverage") + endif() +endif() + +if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + option(ENABLE_THREAD_SANITIZER "Enable thread sanitizer testing in gcc/clang" FALSE) + if(ENABLE_THREAD_SANITIZER) + add_definitions(-fsanitize=thread -g) + set(LINKER_FLAGS "${LINKER_FLAGS} -fsanitize=thread") + endif() + + option(ENABLE_ADDRESS_SANITIZER "Enable address sanitizer testing in gcc/clang" FALSE) + if(ENABLE_ADDRESS_SANITIZER) + add_definitions(-fsanitize=address -g) + set(LINKER_FLAGS "${LINKER_FLAGS} -fsanitize=address") + + option(BUILD_LIBFUZZ_TESTER "Build libfuzzer tool" FALSE) + endif() + + option(ENABLE_MEMORY_SANITIZER "Enable memory sanitizer testing in gcc/clang" FALSE) + if(ENABLE_MEMORY_SANITIZER) + add_definitions(-fsanitize=memory -fsanitize-memory-track-origins -g) + set(LINKER_FLAGS "${LINKER_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins ") + endif() + + option(ENABLE_UNDEFINED_SANITIZER "Enable undefined behavior sanitizer testing in gcc/clang" FALSE) + if(ENABLE_UNDEFINED_SANITIZER) + add_definitions(-fsanitize=undefined -g) + set(LINKER_FLAGS "${LINKER_FLAGS} -fsanitize=undefined") + endif() + + option(ENABLE_LTO "Enable Link Time Optimization" FALSE) + if(ENABLE_LTO) + check_ipo_supported() + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + + option(GPROF_OUTPUT "Generate profile data" FALSE) + if(GPROF_OUTPUT) + add_definitions(-pg) + set(LINKER_FLAGS "${LINKER_FLAGS} -pg") + endif() + + + option(PROFILE_GENERATE "Generate profile data" FALSE) + if(PROFILE_GENERATE) + add_definitions(-fprofile-generate) + set(LINKER_FLAGS "${LINKER_FLAGS} -fprofile-generate") + endif() + + option(PROFILE_USE "Use profile data" FALSE) + if(PROFILE_USE) + add_definitions(-fprofile-use) + set(LINKER_FLAGS "${LINKER_FLAGS} -fprofile-use") + endif() + + +endif() + +list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}") +list(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.svn") +list(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.git") +list(APPEND CPACK_SOURCE_IGNORE_FILES ".swp") +list(APPEND CPACK_SOURCE_IGNORE_FILES ".*~") + +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/license.txt") +set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/readme.md") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/description.txt") + +set(CPACK_PACKAGE_VERSION_MAJOR 7) +set(CPACK_PACKAGE_VERSION_MINOR 0) +set(CPACK_PACKAGE_VERSION_PATCH 0) + +set(CPACK_PACKAGE_EXECUTABLES "chai;Carbon Eval") +set(CPACK_PACKAGE_VENDOR "Carbon.com") +set(CPACK_PACKAGE_CONTACT "contact@Carbon.com") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An embedded scripting language for C++") + +set(CPACK_DEBIAN_PACKAGE_SECTION "devel") +set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") + +set(CPACK_RPM_PACKAGE_LICENSE "BSD") +set(CPACK_RPM_PACKAGE_GROUP "Programming") + +set(CHAI_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}) + +configure_file(Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile) + +include(CTest) +include(CPack) +include(cmake/Catch.cmake) + +if(NOT MINGW) + find_library(READLINE_LIBRARY NAMES readline PATH /usr/lib /usr/local/lib /opt/local/lib) +endif() + +if(UNIX AND NOT APPLE) + find_program(VALGRIND NAMES valgrind PATH /usr/bin /usr/local/bin) +endif() + +enable_testing() + + +message(STATUS "Detecting readline support") +if(READLINE_LIBRARY) + message(STATUS "Found: ${READLINE_LIBRARY}") + set(READLINE_LIB readline) + add_definitions(/DREADLINE_AVAILABLE) +else() + message(STATUS "Not Found") + set(READLINE_LIB) + set(READLINE_FLAG) +endif() + +if(MSVC) + add_definitions(/W4 /w14545 /w34242 /w34254 /w34287 /w44263 /w44265 /w44296 /w44311 /w44826 /we4289 /w14546 /w14547 /w14549 /w14555 /w14619 /w14905 /w14906 /w14928) + + if(MSVC_VERSION STREQUAL "1800") + # VS2013 doesn't have magic statics + add_definitions(/w44640) + else() + # enum warnings are too noisy on MSVC2013 + add_definitions(/w34062) + endif() + + add_definitions(/bigobj /permissive- /utf-8) + # Note on MSVC compiler flags. + # The code base selective disables warnings as necessary when the compiler is complaining too much + # about something that is perfectly valid, or there is simply no technical way around it + # This particular warning, C4503 is in regards to the decorated names that MSVC generates internally. + # The error did not come up until the move to C++11, but the compiler doesn't give enough information + # to determine where the error is coming from, and the internet provides no real information for + # how to workaround or fix the error. So I'm disabling it globally. + add_definitions(/wd4503) +else() + add_definitions(-Wall -Wextra -Wconversion -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Wunused -Woverloaded-virtual -Wno-noexcept-type -Wpedantic -Werror=return-type) + + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") + add_definitions(-Weverything -Wno-c++98-compat-pedantic -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables -Wno-missing-prototypes -Wno-padded -Wno-missing-noreturn -Wno-exit-time-destructors -Wno-documentation-unknown-command -Wno-unused-template -Wno-undef -Wno-double-promotion) + else() + add_definitions(-Wnoexcept) + endif() + + if(APPLE) + add_definitions(-Wno-sign-compare) + endif() +endif() + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + option(USE_LIBCXX "Use clang's libcxx" FALSE) + + if(USE_LIBCXX) + add_definitions(-stdlib=libc++) + set(LINKER_FLAGS "${LINKER_FLAGS} -stdlib=libc++") + endif() +endif() + +# limitations in MinGW require us to make an optimized build +# for the sake of object sizes or something +if(MINGW OR CYGWIN) + add_definitions(-O3) +endif() + +include_directories(include) + + +set(Chai_INCLUDES include/Carbon/Carbon.hpp include/Carbon/Carbon_threading.hpp include/Carbon/dispatchkit/bad_boxed_cast.hpp include/Carbon/dispatchkit/bind_first.hpp include/Carbon/dispatchkit/bootstrap.hpp include/Carbon/dispatchkit/bootstrap_stl.hpp include/Carbon/dispatchkit/boxed_cast.hpp include/Carbon/dispatchkit/boxed_cast_helper.hpp include/Carbon/dispatchkit/boxed_number.hpp include/Carbon/dispatchkit/boxed_value.hpp include/Carbon/dispatchkit/dispatchkit.hpp include/Carbon/dispatchkit/type_conversions.hpp include/Carbon/dispatchkit/dynamic_object.hpp include/Carbon/dispatchkit/exception_specification.hpp include/Carbon/dispatchkit/function_call.hpp include/Carbon/dispatchkit/function_call_detail.hpp include/Carbon/dispatchkit/handle_return.hpp include/Carbon/dispatchkit/operators.hpp include/Carbon/dispatchkit/proxy_constructors.hpp include/Carbon/dispatchkit/proxy_functions.hpp include/Carbon/dispatchkit/proxy_functions_detail.hpp include/Carbon/dispatchkit/register_function.hpp include/Carbon/dispatchkit/type_info.hpp include/Carbon/language/Carbon_algebraic.hpp include/Carbon/language/Carbon_common.hpp include/Carbon/language/Carbon_engine.hpp include/Carbon/language/Carbon_eval.hpp include/Carbon/language/Carbon_parser.hpp include/Carbon/language/Carbon_prelude.hpp include/Carbon/language/Carbon_prelude_docs.hpp include/Carbon/utility/utility.hpp include/Carbon/utility/json.hpp include/Carbon/utility/json_wrap.hpp) + +set_source_files_properties(${Chai_INCLUDES} PROPERTIES HEADER_FILE_ONLY TRUE) + +if(NOT MULTITHREAD_SUPPORT_ENABLED) + add_definitions(-DCarbon_NO_THREADS) +endif() + +if(NOT DYNLOAD_ENABLED) + add_definitions(-DCarbon_NO_DYNLOAD) +endif() + +if(CMAKE_HOST_UNIX) + if(DYNLOAD_ENABLED) + if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Haiku") + list(APPEND LIBS "dl") + endif() + endif() + + if(MULTITHREAD_SUPPORT_ENABLED) + if(CMAKE_COMPILER_IS_GNUCC) + execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE GCC_FULL_VERSION) + if(GCC_FULL_VERSION MATCHES "4.8.1.*ubuntu") + set(LINKER_FLAGS "${LINKER_FLAGS} -Wl,--no-as-needed -pthread") + else() + set(LINKER_FLAGS "${LINKER_FLAGS} -pthread") + endif() + else() + set(LINKER_FLAGS "${LINKER_FLAGS} -pthread") + endif() + + add_definitions(-pthread) + endif() + +endif() + +list(APPEND LIBS ${READLINE_LIB}) + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINKER_FLAGS}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}") +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}") + +add_library(stdlib STATIC static_libs/Carbon_stdlib.cpp) +add_library(parser STATIC static_libs/Carbon_parser.cpp) + +add_library(Carbon_stdlib-${CHAI_VERSION} MODULE src/Carbon_stdlib_module.cpp) +target_link_libraries(Carbon_stdlib-${CHAI_VERSION} ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) + +set(Carbon_LIBS stdlib parser) + +add_executable(chai src/main.cpp ${Chai_INCLUDES}) +target_link_libraries(chai ${LIBS} ${Carbon_LIBS}) + +add_library(Carbon INTERFACE) +target_include_directories(Carbon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) + +if(BUILD_SAMPLES) + add_executable(sanity_checks src/sanity_checks.cpp) + target_link_libraries(sanity_checks ${LIBS}) + add_executable(test_num_exceptions samples/test_num_exceptions.cpp) + target_link_libraries(test_num_exceptions ${LIBS} ${Carbon_LIBS}) + add_executable(memory_leak_test samples/memory_leak_test.cpp) + target_link_libraries(memory_leak_test ${LIBS} ${Carbon_LIBS}) + add_executable(inheritance samples/inheritance.cpp) + target_link_libraries(inheritance ${LIBS} ${Carbon_LIBS}) + add_executable(factory samples/factory.cpp) + target_link_libraries(factory ${LIBS} ${Carbon_LIBS}) + add_executable(fun_call_performance samples/fun_call_performance.cpp) + target_link_libraries(fun_call_performance ${LIBS} ${Carbon_LIBS}) +endif() + + +if(BUILD_MODULES) + add_library(test_module MODULE src/test_module.cpp) + target_link_libraries(test_module ${LIBS}) + + add_library(stl_extra MODULE src/stl_extra.cpp) + target_link_libraries(stl_extra ${LIBS}) + + set(MODULES stl_extra) +endif() + + +file(GLOB UNIT_TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/unittests/ ${CMAKE_CURRENT_SOURCE_DIR}/unittests/*.chai ${CMAKE_CURRENT_SOURCE_DIR}/unittests/3.x/*.chai) +list(SORT UNIT_TESTS) + +file(GLOB PERFORMANCE_TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/performance_tests/ ${CMAKE_CURRENT_SOURCE_DIR}/performance_tests/*.chai) +list(SORT PERFORMANCE_TESTS) + + +if(RUN_FUZZY_TESTS) + + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/unittests") + + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xjf ${CMAKE_CURRENT_SOURCE_DIR}/unittests/fuzzy_tests-2017-07-20.tar.bz2 + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/unittests + ) + + + file(GLOB FUZZY_TESTS RELATIVE ${CMAKE_BINARY_DIR}/unittests/ ${CMAKE_BINARY_DIR}/unittests/MINIMIZED/*) + list(SORT FUZZY_TESTS) + + foreach(filename ${FUZZY_TESTS}) + message(STATUS "Adding test ${filename}") + add_test(fuzz.${filename} chai "-e" "--exception" "--any-exception" ${CMAKE_CURRENT_SOURCE_DIR}/unittests/fuzz_unit_test.inc ${CMAKE_BINARY_DIR}/unittests/${filename}) + endforeach() + + set_property(TEST ${FUZZY_EXCEPTION_TESTS} + PROPERTY ENVIRONMENT + "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + +endif() + + +if(BUILD_TESTING) + + option(UNIT_TEST_LIGHT "Unit tests light (expect module loading failures)" FALSE) + + add_test(version_check chai -c "if(\"\\\${ version() };\\\${version_major()};\\\${version_minor()};\\\${version_patch()}\" != \"${CHAI_VERSION};${CPACK_PACKAGE_VERSION_MAJOR};${CPACK_PACKAGE_VERSION_MINOR};${CPACK_PACKAGE_VERSION_PATCH}\") { exit(-1) }") + set_property(TEST version_check + PROPERTY ENVIRONMENT + "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + + add_test(version_check_2 chai --version ) + set_property(TEST version_check_2 + PROPERTY ENVIRONMENT + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + PROPERTY PASS_REGULAR_EXPRESSION "${CHAI_VERSION}" + ) + + add_test(help chai --help ) + set_property(TEST help + PROPERTY ENVIRONMENT + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + + + set(TESTS "") + + foreach(filename ${UNIT_TESTS}) + message(STATUS "Adding unit test ${filename}") + add_test(unit.${filename} chai ${CMAKE_CURRENT_SOURCE_DIR}/unittests/unit_test.inc ${CMAKE_CURRENT_SOURCE_DIR}/unittests/${filename}) + list(APPEND TESTS unit.${filename}) + endforeach() + + if(RUN_PERFORMANCE_TESTS) + foreach(filename ${PERFORMANCE_TESTS}) + message(STATUS "Adding performance test ${filename}") + + add_test(NAME performance.${filename} COMMAND ${VALGRIND} --tool=callgrind --callgrind-out-file=callgrind.performance.${filename} $ ${CMAKE_CURRENT_SOURCE_DIR}/performance_tests/${filename}) + list(APPEND TESTS performance.${filename}) + endforeach() + + add_executable(profile_cpp_calls_2 performance_tests/profile_cpp_calls_2.cpp) + target_link_libraries(profile_cpp_calls_2 ${LIBS}) + add_test(NAME performance.profile_cpp_calls_2 COMMAND ${VALGRIND} --tool=callgrind --callgrind-out-file=callgrind.performance.profile_cpp_calls_2 $) + + add_executable(profile_fun_wrappers performance_tests/profile_fun_wrappers.cpp) + target_link_libraries(profile_fun_wrappers ${LIBS}) + add_test(NAME performance.profile_fun_wrappers COMMAND ${VALGRIND} --tool=callgrind --callgrind-out-file=callgrind.performance.profile_fun_wrappers $) + endif() + + set_property(TEST ${TESTS} + PROPERTY ENVIRONMENT + "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + + if(NOT UNIT_TEST_LIGHT) + add_executable(compiled_tests unittests/compiled_tests.cpp) + target_link_libraries(compiled_tests ${LIBS} ${Carbon_LIBS}) + catch_discover_tests(compiled_tests TEST_PREFIX "compiled.") + + add_executable(static_Carbon_test unittests/static_Carbon.cpp) + target_link_libraries(static_Carbon_test ${LIBS}) + add_test(NAME Static_Carbon_Test COMMAND static_Carbon_test) + + add_executable(boxed_cast_test unittests/boxed_cast_test.cpp) + target_link_libraries(boxed_cast_test ${LIBS}) + add_test(NAME Boxed_Cast_Test COMMAND boxed_cast_test) + + add_executable(type_info_test unittests/type_info_test.cpp) + target_link_libraries(type_info_test ${LIBS}) + add_test(NAME Type_Info_Test COMMAND type_info_test) + + add_executable(c_linkage_test unittests/c_linkage_test.cpp) + target_link_libraries(c_linkage_test ${LIBS} ${Carbon_LIBS}) + add_test(NAME C_Linkage_Test COMMAND c_linkage_test) + + add_executable(integer_literal_test unittests/integer_literal_test.cpp) + target_link_libraries(integer_literal_test ${LIBS} ${Carbon_LIBS}) + add_test(NAME Integer_Literal_Test COMMAND integer_literal_test) + + if(MULTITHREAD_SUPPORT_ENABLED) + add_executable(multithreaded_test unittests/multithreaded_test.cpp) + target_link_libraries(multithreaded_test ${LIBS}) + add_test(NAME Multithreaded_Test COMMAND multithreaded_test) + set_property(TEST Multithreaded_Test + PROPERTY ENVIRONMENT + "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + endif() + + add_executable(multifile_test + unittests/multifile_test_main.cpp + unittests/multifile_test_chai.cpp + unittests/multifile_test_module.cpp + ) + target_link_libraries(multifile_test ${LIBS}) + add_test(NAME MultiFile_Test COMMAND multifile_test) + + install(TARGETS test_module RUNTIME DESTINATION bin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/Carbon") + endif() +endif() + + +if(BUILD_LIBFUZZ_TESTER) + add_executable(fuzzer src/libfuzzer_client.cpp src/sha3.cpp) + target_compile_options(fuzzer PRIVATE "-fsanitize=fuzzer,address") + target_link_libraries(fuzzer PRIVATE ${LIBS} "-fsanitize=fuzzer,address") +endif() + + +install(TARGETS chai Carbon_stdlib-${CHAI_VERSION} ${MODULES} RUNTIME DESTINATION bin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/Carbon") + +install(DIRECTORY include/Carbon DESTINATION include + PATTERN "*.hpp" + PATTERN "*/.svn*" EXCLUDE + PATTERN "*/.git*" EXCLUDE + PATTERN "*~" EXCLUDE) +install(DIRECTORY unittests DESTINATION share/Carbon + PATTERN "*.chai" + PATTERN "*.inc" + PATTERN "*/.svn*" EXCLUDE + PATTERN "*/.git*" EXCLUDE + PATTERN "*~" EXCLUDE) +install(DIRECTORY samples DESTINATION share/Carbon + PATTERN "*.chai" + PATTERN "*/.svn*" EXCLUDE + PATTERN "*/.git*" EXCLUDE + PATTERN "*~" EXCLUDE) + +configure_file(contrib/pkgconfig/Carbon.pc.in lib/pkgconfig/Carbon.pc @ONLY) +install(FILES "${Carbon_BINARY_DIR}/lib/pkgconfig/Carbon.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + + diff --git a/src/carbon/basic.hpp b/src/carbon/basic.hpp index cd6048f0..671e3f19 100644 --- a/src/carbon/basic.hpp +++ b/src/carbon/basic.hpp @@ -22,9 +22,9 @@ #include "language/parser.hpp" #include "stdlib.hpp" -ChaiScript_Basic chai( +Carbon_Basic chai( Carbon::Std_Lib::library(), - std::make_unique>()); */ diff --git a/src/carbon/carbon.hpp b/src/carbon/carbon.hpp index 657eb5a6..5abbdccc 100644 --- a/src/carbon/carbon.hpp +++ b/src/carbon/carbon.hpp @@ -20,7 +20,7 @@ /// /// @sa chaiscript /// @sa Carbon::ChaiScript -/// @sa ChaiScript_Language for Built in Functions +/// @sa Carbon_Language for Built in Functions /// @sa @ref LangGettingStarted /// @sa @ref LangKeywordRef /// @sa @ref LangInPlaceRef @@ -670,7 +670,7 @@ /// ----------------------------------------------------------------------- /// /// @sa @ref LangKeywordRef -/// @sa ChaiScript_Language for Built in Functions +/// @sa Carbon_Language for Built in Functions /// @page LangKeywordRef ChaiScript Language Keyword Reference /// @@ -809,7 +809,7 @@ /// ["finally" block] /// ~~~~~~~~ /// -/// @sa ChaiScript_Language::throw +/// @sa Carbon_Language::throw /// /// /// ----------------------------------------------------------------------- @@ -851,14 +851,14 @@ #include "stdlib.hpp" namespace Carbon { -class ChaiScript : public ChaiScript_Basic { +class ChaiScript : public Carbon_Basic { public: ChaiScript(std::vector t_modulepaths = {}, std::vector t_usepaths = {}, std::vector t_opts = Carbon::default_options()) - : ChaiScript_Basic( + : Carbon_Basic( Carbon::Std_Lib::library(), - std::make_unique>(), std::move(t_modulepaths), std::move(t_usepaths), std::move(t_opts)) {} diff --git a/src/carbon/command/any.hpp b/src/carbon/command/any.hpp index ec1eaca0..0511a30e 100644 --- a/src/carbon/command/any.hpp +++ b/src/carbon/command/any.hpp @@ -4,6 +4,8 @@ #define CARBON_ANY_HPP #include +#include +#include namespace Carbon { namespace detail { diff --git a/src/carbon/command/bad_boxed_cast.cpp b/src/carbon/command/bad_boxed_cast.cpp index 6dcc6130..2894db89 100644 --- a/src/carbon/command/bad_boxed_cast.cpp +++ b/src/carbon/command/bad_boxed_cast.cpp @@ -2,13 +2,13 @@ namespace Carbon::exception { bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to, - utility::Static_String t_what) + Static_String t_what) : from(t_from), to(&t_to), m_what(std::move(t_what)) {} bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) : from(t_from), to(&t_to), m_what("Cannot perform boxed_cast") {} -bad_boxed_cast::bad_boxed_cast(utility::Static_String t_what) +bad_boxed_cast::bad_boxed_cast(Static_String t_what) : m_what(std::move(t_what)) {} /// \brief Description of what error occurred diff --git a/src/carbon/command/bad_boxed_cast.hpp b/src/carbon/command/bad_boxed_cast.hpp index 28956a02..c417e9e6 100644 --- a/src/carbon/command/bad_boxed_cast.hpp +++ b/src/carbon/command/bad_boxed_cast.hpp @@ -7,47 +7,70 @@ #include #include "../defines.hpp" -#include "../utils/static_string.hpp" -#include "type_info.hpp" - -namespace Carbon { -class Type_Info; -} // namespace Carbon +#include "atom/experiment/sstring.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { namespace exception { -/// \brief Thrown in the event that a Boxed_Value cannot be cast to the desired -/// type -/// -/// It is used internally during function dispatch and may be used by the end -/// user. -/// -/// \sa Carbon::boxed_cast +/** + * @brief Exception thrown to indicate a failed cast operation involving + * Boxed_Value. + * + * This exception is thrown when an attempt to cast a Boxed_Value to another + * type fails. It provides information about the source type (from), the target + * type (to), and a description of the error. + */ class bad_boxed_cast : public std::bad_cast { public: + /** + * @brief Constructs a bad_boxed_cast object with detailed information. + * + * @param t_from The Type_Info of the source type contained in the + * Boxed_Value. + * @param t_to The std::type_info of the desired (but failed) result type. + * @param t_what A Static_String providing additional description of the + * error. + */ bad_boxed_cast(Type_Info t_from, const std::type_info &t_to, - utility::Static_String t_what) noexcept - : from(t_from), to(&t_to), m_what(std::move(t_what)) {} + Static_String t_what) noexcept; - bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) noexcept - : from(t_from), to(&t_to), m_what("Cannot perform boxed_cast") {} + /** + * @brief Constructs a bad_boxed_cast object with type information only. + * + * @param t_from The Type_Info of the source type contained in the + * Boxed_Value. + * @param t_to The std::type_info of the desired (but failed) result type. + */ + bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) noexcept; - explicit bad_boxed_cast(utility::Static_String t_what) noexcept - : m_what(std::move(t_what)) {} + /** + * @brief Constructs a bad_boxed_cast object with a custom error message. + * + * @param t_what A Static_String providing additional description of the + * error. + */ + explicit bad_boxed_cast(Static_String t_what) noexcept; - bad_boxed_cast(const bad_boxed_cast &) noexcept = default; + /** + * @brief Destructor for bad_boxed_cast. + */ ~bad_boxed_cast() noexcept override = default; - /// \brief Description of what error occurred - const char *what() const noexcept override { return m_what.c_str(); } + /** + * @brief Retrieves a C-style string describing the error. + * + * @return A pointer to a constant C-style string describing the error. + */ + const char *what() const noexcept override; Type_Info from; ///< Type_Info contained in the Boxed_Value const std::type_info *to = nullptr; ///< std::type_info of the desired (but failed) result type private: - utility::Static_String m_what; + Static_String m_what; ///< Additional description of the error }; + } // namespace exception } // namespace Carbon diff --git a/src/carbon/command/boxed_cast.hpp b/src/carbon/command/boxed_cast.hpp index a08b1914..0957a6f8 100644 --- a/src/carbon/command/boxed_cast.hpp +++ b/src/carbon/command/boxed_cast.hpp @@ -8,7 +8,7 @@ #include "boxed_cast_helper.hpp" #include "boxed_value.hpp" #include "type_conversions.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { class Type_Conversions; diff --git a/src/carbon/command/boxed_number.hpp b/src/carbon/command/boxed_number.hpp index 4adebb3b..3a4c26a4 100644 --- a/src/carbon/command/boxed_number.hpp +++ b/src/carbon/command/boxed_number.hpp @@ -12,7 +12,7 @@ #include "boxed_cast.hpp" #include "boxed_cast_helper.hpp" #include "boxed_value.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { class Type_Conversions; diff --git a/src/carbon/command/boxed_value.hpp b/src/carbon/command/boxed_value.hpp index 511db692..21fef101 100644 --- a/src/carbon/command/boxed_value.hpp +++ b/src/carbon/command/boxed_value.hpp @@ -43,7 +43,7 @@ class Boxed_Value { struct Object_Data { static auto get(Boxed_Value::Void_Type, bool t_return_value) { - return std::make_shared(detail::Get_Type_Info::get(), + return std::make_shared(Get_Type_Info::get(), Carbon::detail::Any(), false, nullptr, t_return_value); } diff --git a/src/carbon/command/dispatchkit.hpp b/src/carbon/command/dispatchkit.hpp index 1f03463a..408a4a87 100644 --- a/src/carbon/command/dispatchkit.hpp +++ b/src/carbon/command/dispatchkit.hpp @@ -18,7 +18,7 @@ #include "../defines.hpp" #include "../threading.hpp" -#include "../utils/quick_flat_map.hpp" +#include "atom/experiment/flatmap.hpp" #include "bad_boxed_cast.hpp" #include "boxed_cast.hpp" #include "boxed_cast_helper.hpp" @@ -36,7 +36,7 @@ class Boxed_Number; namespace Carbon { namespace parser { -class ChaiScript_Parser_Base; +class Carbon_Parser_Base; } namespace dispatch { class Dynamic_Proxy_Function; @@ -388,7 +388,7 @@ class Dispatch_Engine { Type_Name_Map m_types; }; - explicit Dispatch_Engine(Carbon::parser::ChaiScript_Parser_Base &parser) + explicit Dispatch_Engine(Carbon::parser::Carbon_Parser_Base &parser) : m_stack_holder(), m_parser(parser) {} /// \brief casts an object while applying any Dynamic_Conversion available @@ -1189,7 +1189,7 @@ class Dispatch_Engine { return m_stack_holder->stacks.back(); } - parser::ChaiScript_Parser_Base &get_parser() noexcept { + parser::Carbon_Parser_Base &get_parser() noexcept { return m_parser.get(); } @@ -1350,7 +1350,7 @@ class Dispatch_Engine { Type_Conversions m_conversions; Carbon::detail::threading::Thread_Storage m_stack_holder; - std::reference_wrapper m_parser; + std::reference_wrapper m_parser; mutable std::atomic_uint_fast32_t m_method_missing_loc = {0}; diff --git a/src/carbon/command/dynamic_object.hpp b/src/carbon/command/dynamic_object.hpp index 4bb7fbb8..469f2159 100644 --- a/src/carbon/command/dynamic_object.hpp +++ b/src/carbon/command/dynamic_object.hpp @@ -53,7 +53,7 @@ class Dynamic_Object { const Boxed_Value &method_missing(const std::string &t_method_name) const; - std::map get_attrs(); + std::map get_attrs() const; private: const std::string m_type_name = ""; diff --git a/src/carbon/command/dynamic_object_detail.cpp b/src/carbon/command/dynamic_object_detail.cpp index 79d9af73..d4a1db49 100644 --- a/src/carbon/command/dynamic_object_detail.cpp +++ b/src/carbon/command/dynamic_object_detail.cpp @@ -62,7 +62,7 @@ Dynamic_Object_Function::get_contained_functions() const { return {m_func}; } -Boxed_Value do_call(const Carbon::Function_Params ¶ms, +Boxed_Value Dynamic_Object_Function::do_call(const Carbon::Function_Params ¶ms, const Type_Conversions_State &t_conversions) const { if (dynamic_object_typename_match(params, m_type_name, m_ti, t_conversions)) { diff --git a/src/carbon/command/exception_specification.hpp b/src/carbon/command/exception_specification.hpp index 6e308558..08f3bb2f 100644 --- a/src/carbon/command/exception_specification.hpp +++ b/src/carbon/command/exception_specification.hpp @@ -7,6 +7,7 @@ #include "../defines.hpp" #include "boxed_cast.hpp" +#include "dispatchkit.hpp" namespace Carbon { namespace detail { diff --git a/src/carbon/command/proxy_functions.cpp b/src/carbon/command/proxy_functions.cpp index 98482e40..af258f35 100644 --- a/src/carbon/command/proxy_functions.cpp +++ b/src/carbon/command/proxy_functions.cpp @@ -172,7 +172,7 @@ const std::vector &Proxy_Function_Base::get_param_types() const { return m_types; } -bool Proxy_Function_Base::is_attribute_function() const; +bool Proxy_Function_Base::is_attribute_function() const { return false; } bool Proxy_Function_Base::has_arithmetic_param() const { @@ -233,10 +233,6 @@ bool Proxy_Function_Base::compare_first_type( return compare_type_to_param(m_types[1], bv, t_conversions); } -Boxed_Value Proxy_Function_Base::do_call( - const Function_Params ¶ms, - const Type_Conversions_State &t_conversions) const = 0; - Proxy_Function_Base::Proxy_Function_Base(std::vector t_types, int t_arity) : m_types(std::move(t_types)), diff --git a/src/carbon/command/proxy_functions.hpp b/src/carbon/command/proxy_functions.hpp index a1193fa8..51cf58b6 100644 --- a/src/carbon/command/proxy_functions.hpp +++ b/src/carbon/command/proxy_functions.hpp @@ -39,80 +39,194 @@ std::function functor( std::shared_ptr func, const Type_Conversions_State *t_conversions); +/** + * @brief A class representing the parameter types of a function. + * + * This class stores information about the types of parameters in a function. + */ class Param_Types { public: + /** + * @brief Default constructor. + */ Param_Types(); + /** + * @brief Constructor with parameters. + * + * @param t_types A vector of pairs containing parameter names and type + * information. + */ explicit Param_Types( std::vector> t_types); + /** + * @brief Pushes a new parameter type to the front of the list. + * + * @param t_name The name of the parameter. + * @param t_ti The type information of the parameter. + */ void push_front(const std::string &t_name, Type_Info t_ti); + /** + * @brief Checks if two Param_Types objects are equal. + * + * @param t_rhs The right-hand side Param_Types object. + * @return True if the objects are equal, false otherwise. + */ bool operator==(const Param_Types &t_rhs) const noexcept; + /** + * @brief Converts function parameters to boxed values using type + * conversions. + * + * @param t_params The function parameters. + * @param t_conversions The state of type conversions. + * @return A vector of boxed values representing the converted parameters. + */ std::vector convert( Function_Params t_params, const Type_Conversions_State &t_conversions) const; - // first result: is a match - // second result: needs conversions + /** + * @brief Checks if given values match the parameter types. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return A pair of booleans indicating if there is a match and if + * conversions are needed. + */ std::pair match( const Function_Params &vals, const Type_Conversions_State &t_conversions) const noexcept; + /** + * @brief Gets the vector of parameter types. + * + * @return A vector of pairs containing parameter names and type + * information. + */ const std::vector> &types() const noexcept; private: + /** + * @brief Updates the flag indicating whether the Param_Types object has + * types. + */ void update_has_types(); - std::vector> m_types; - bool m_has_types; + std::vector> + m_types; ///< Vector of parameter names and type information. + bool m_has_types; ///< Flag indicating whether the Param_Types object has + ///< types. }; /** - * Pure virtual base class for all Proxy_Function implementations - * Proxy_Functions are a type erasure of type safe C++ - * function calls. At runtime parameter types are expected to be - * tested against passed in types. + * @brief Pure virtual base class for all Proxy_Function implementations. + * + * Proxy_Functions are a type erasure of type safe C++ function calls. At + * runtime, parameter types are expected to be tested against passed in types. * Dispatch_Engine only knows how to work with Proxy_Function, no other * function classes. */ class Proxy_Function_Base { public: + /** + * @brief Virtual destructor. + */ virtual ~Proxy_Function_Base() = default; + /** + * @brief Calls the function with the given parameters. + * + * @param params The parameters to pass to the function. + * @param t_conversions The state of type conversions. + * @return The result of the function call. + */ Boxed_Value operator()( const Function_Params ¶ms, const Carbon::Type_Conversions_State &t_conversions) const; - /// Returns a vector containing all of the types of the parameters the - /// function returns/takes if the function is variadic or takes no arguments - /// (arity of 0 or -1), the returned value contains exactly 1 Type_Info - /// object: the return type \returns the types of all parameters. + /** + * @brief Returns the types of all parameters. + * + * If the function is variadic or takes no arguments (arity of 0 or -1), + * the returned value contains exactly 1 Type_Info object: the return type. + * + * @return A vector containing all of the types of the parameters the + * function returns/takes. + */ const std::vector &get_param_types() const noexcept; + /** + * @brief Checks if two Proxy_Function_Base objects are equal. + * + * @param rhs The right-hand side Proxy_Function_Base object. + * @return True if the objects are equal, false otherwise. + */ virtual bool operator==(const Proxy_Function_Base &) const noexcept = 0; + + /** + * @brief Checks if the function matches the given parameters. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return True if the function matches, false otherwise. + */ virtual bool call_match( const Function_Params &vals, const Type_Conversions_State &t_conversions) const = 0; + /** + * @brief Checks if the function is an attribute function. + * + * @return True if the function is an attribute function, false otherwise. + */ virtual bool is_attribute_function() const noexcept; + /** + * @brief Checks if the function has an arithmetic parameter. + * + * @return True if the function has an arithmetic parameter, false + * otherwise. + */ bool has_arithmetic_param() const noexcept; + /** + * @brief Gets the contained functions. + * + * @return A vector containing shared pointers to the contained functions. + */ virtual std::vector> get_contained_functions() const; - //! Return true if the function is a possible match - //! to the passed in values + /** + * @brief Filters the function based on the passed in values. + * + * @param vals The values to filter. + * @param t_conversions The state of type conversions. + * @return True if the function is a possible match to the passed in values, + * false otherwise. + */ bool filter(const Function_Params &vals, const Type_Conversions_State &t_conversions) const noexcept; - /// \returns the number of arguments the function takes or -1 if it is - /// variadic + /** + * @brief Gets the number of arguments the function takes. + * + * @return The number of arguments the function takes, or -1 if it is + * variadic. + */ int get_arity() const noexcept; + /** + * @brief Compares a type to the first parameter. + * + * @param bv The boxed value to compare. + * @param t_conversions The state of type conversions. + * @return True if the type matches the first parameter, false otherwise. + */ static bool compare_type_to_param( const Type_Info &ti, const Boxed_Value &bv, const Type_Conversions_State &t_conversions) noexcept; @@ -125,19 +239,41 @@ class Proxy_Function_Base { } protected: + /** + * @brief Performs the function call. + * + * @param params The parameters to pass to the function. + * @param t_conversions The state of type conversions. + * @return The result of the function call. + */ virtual Boxed_Value do_call( const Function_Params ¶ms, const Type_Conversions_State &t_conversions) const = 0; + /** + * @brief Constructor. + * + * @param t_types The types of the parameters. + * @param t_arity The arity of the function. + */ Proxy_Function_Base(std::vector t_types, int t_arity); + /** + * @brief Compares types to parameters. + * + * @param tis The types to compare. + * @param bvs The parameters to compare against. + * @param t_conversions The state of type conversions. + * @return True if the types match the parameters, false otherwise. + */ static bool compare_types( const std::vector &tis, const Function_Params &bvs, const Type_Conversions_State &t_conversions) noexcept; - std::vector m_types; - int m_arity; - bool m_has_arithmetic_param; + std::vector m_types; ///< Vector of parameter types. + int m_arity; ///< The arity of the function. + bool m_has_arithmetic_param; ///< Flag indicating if the function has an + ///< arithmetic parameter. }; } // namespace dispatch @@ -164,48 +300,112 @@ class guard_error : public std::runtime_error { } // namespace exception namespace dispatch { -/// A Proxy_Function implementation that is not type safe, the called function -/// is expecting a vector that it works with how it chooses. +/** + * @brief A Proxy_Function implementation that is not type safe. + * + * The called function is expecting a vector that it works with how + * it chooses. + */ class Dynamic_Proxy_Function : public Proxy_Function_Base { public: + /** + * @brief Constructor. + * + * @param t_arity The arity of the function. + * @param t_parsenode The parse node. + * @param t_param_types The parameter types. + * @param t_guard The guard function. + */ explicit Dynamic_Proxy_Function(const int t_arity, std::shared_ptr t_parsenode, Param_Types t_param_types = Param_Types(), Proxy_Function t_guard = Proxy_Function()); + /** + * @brief Checks if two Dynamic_Proxy_Function objects are equal. + * + * @param rhs The right-hand side Dynamic_Proxy_Function object. + * @return True if the objects are equal, false otherwise. + */ bool operator==(const Proxy_Function_Base &rhs) const noexcept override; + /** + * @brief Checks if the function matches the given parameters. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return True if the function matches, false otherwise. + */ bool call_match(const Function_Params &vals, const Type_Conversions_State &t_conversions) const override; + /** + * @brief Checks if the function has a guard. + * + * @return True if the function has a guard, false otherwise. + */ bool has_guard() const noexcept; + /** + * @brief Gets the guard function. + * + * @return The guard function. + */ Proxy_Function get_guard() const noexcept; + /** + * @brief Checks if the function has a parse tree. + * + * @return True if the function has a parse tree, false otherwise. + */ bool has_parse_tree() const noexcept; + /** + * @brief Gets the parse tree. + * + * @return The parse tree. + */ const AST_Node &get_parse_tree() const; protected: + /** + * @brief Tests the guard function. + * + * @param params The parameters to test. + * @param t_conversions The state of type conversions. + * @return True if the guard function passes, false otherwise. + */ bool test_guard(const Function_Params ¶ms, const Type_Conversions_State &t_conversions) const; - // first result: is a match - // second result: needs conversions + /** + * @brief Checks if the function matches the given parameters internally. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return A pair of booleans indicating if there is a match and if + * conversions are needed. + */ std::pair call_match_internal( const Function_Params &vals, const Type_Conversions_State &t_conversions) const; private: + /** + * @brief Builds a list of parameter types. + * + * @param t_types The parameter types. + * @return A vector containing the parameter types. + */ static std::vector build_param_type_list( const Param_Types &t_types); protected: - Param_Types m_param_types; + Param_Types m_param_types; ///< The parameter types. private: - Proxy_Function m_guard; - std::shared_ptr m_parsenode; + Proxy_Function m_guard; ///< The guard function. + std::shared_ptr m_parsenode; ///< The parse node. }; template @@ -253,44 +453,109 @@ Proxy_Function make_dynamic_proxy_function(Callable &&c, Arg &&...a) { /// of a binding. This allows for unbound parameters during bind. struct Placeholder_Object {}; -/// An implementation of Proxy_Function that takes a Proxy_Function -/// and substitutes bound parameters into the parameter list -/// at runtime, when call() is executed. -/// it is used for bind(function, param1, _, param2) style calls +/** + * @brief An implementation of Proxy_Function that takes a Proxy_Function + * and substitutes bound parameters into the parameter list + * at runtime, when call() is executed. + * It is used for bind(function, param1, _, param2) style calls. + */ class Bound_Function final : public Proxy_Function_Base { public: + /** + * @brief Constructor. + * + * @param t_f The original function. + * @param t_args The arguments to bind. + */ Bound_Function(const Const_Proxy_Function &t_f, const std::vector &t_args); + /** + * @brief Checks if two Bound_Function objects are equal. + * + * @param t_f The right-hand side Bound_Function object. + * @return True if the objects are equal, false otherwise. + */ bool operator==(const Proxy_Function_Base &t_f) const noexcept override; + /** + * @brief Checks if the function matches the given parameters. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return True if the function matches, false otherwise. + */ bool call_match(const Function_Params &vals, const Type_Conversions_State &t_conversions) const override; + /** + * @brief Gets the contained functions. + * + * @return A vector containing shared pointers to the contained functions. + */ std::vector get_contained_functions() const override; + std::vector build_param_list( + const Function_Params ¶ms) const; + protected: + /** + * @brief Builds parameter type information. + * + * @param t_f The original function. + * @param t_args The arguments. + * @return A vector containing the parameter type information. + */ static std::vector build_param_type_info( const Const_Proxy_Function &t_f, const std::vector &t_args); + /** + * @brief Executes the function call. + * + * @param params The parameters to pass to the function. + * @param t_conversions The state of type conversions. + * @return The result of the function call. + */ Boxed_Value do_call( const Function_Params ¶ms, const Type_Conversions_State &t_conversions) const override; private: - Const_Proxy_Function m_f; - std::vector m_args; + Const_Proxy_Function m_f; ///< The original function. + std::vector m_args; ///< The bound arguments. }; +/** + * @brief Base class for Proxy_Function implementations. + */ class Proxy_Function_Impl_Base : public Proxy_Function_Base { public: + /** + * @brief Constructor. + * + * @param t_types The types of the parameters. + */ explicit Proxy_Function_Impl_Base(const std::vector &t_types); + /** + * @brief Checks if the function matches the given parameters. + * + * @param vals The values to check. + * @param t_conversions The state of type conversions. + * @return True if the function matches, false otherwise. + */ bool call_match( const Function_Params &vals, const Type_Conversions_State &t_conversions) const noexcept override; + /** + * @brief Compares types with casting. + * + * @param vals The values to compare. + * @param t_conversions The state of type conversions. + * @return True if the types match with casting, false otherwise. + */ virtual bool compare_types_with_cast( const Function_Params &vals, const Type_Conversions_State &t_conversions) const noexcept = 0; diff --git a/src/carbon/command/register_function.hpp b/src/carbon/command/register_function.hpp index 5fff616b..e0aebc79 100644 --- a/src/carbon/command/register_function.hpp +++ b/src/carbon/command/register_function.hpp @@ -4,17 +4,43 @@ #include -#include "bind_first.hpp" +#include "atom/experiment/bind_first.hpp" #include "function_signature.hpp" #include "proxy_functions.hpp" namespace Carbon { namespace dispatch::detail { +/** + * @brief Retrieves the first parameter from a function parameter pack. + * + * @tparam Obj The type of the object. + * @tparam Param1 The type of the first parameter. + * @tparam Rest The remaining parameter types. + * @param params The function parameters. + * @param obj The object. + * @return Param1 The first parameter value. + */ template Param1 get_first_param(Function_Params, Obj &&obj) { return static_cast(std::forward(obj)); } +/** + * @brief Internal implementation to create a callable object from a function or + * member function. + * + * @tparam Func The type of the function. + * @tparam Is_Noexcept Boolean indicating if the function is noexcept. + * @tparam Is_Member Boolean indicating if the function is a member function. + * @tparam Is_MemberObject Boolean indicating if the function is a member + * object. + * @tparam Is_Object Boolean indicating if the object is a callable object. + * @tparam Ret The return type of the function. + * @tparam Param The parameter types of the function. + * @param func The function to be made callable. + * @param fs The function signature. + * @return A Proxy_Function representing the callable object. + */ template auto make_callable_impl( @@ -52,8 +78,6 @@ auto make_callable_impl( } } -// this version peels off the function object itself from the function -// signature, when used on a callable object template auto make_callable(Func &&func, @@ -65,65 +89,49 @@ auto make_callable(Func &&func, false, true>{}); } -template -auto make_callable( - Func &&func, Function_Signature, Is_Noexcept, - Is_Member, Is_MemberObject, false> - fs) { +/** + * @brief Creates a callable object from a free function, member function, or + * data member. + * + * @tparam Func The type of the function. + * @tparam Ret The return type of the function. + * @tparam Object The type of the object. + * @tparam Param The parameter types of the function. + * @tparam Is_Noexcept Boolean indicating if the function is noexcept. + * @param func The function to be made callable. + * @param fs The function signature. + * @return A Proxy_Function representing the callable object. + */ +template +auto make_callable(Func &&func, + Function_Signature, + Is_Noexcept, false, false, true> + fs) { return make_callable_impl(std::forward(func), fs); } -} // namespace dispatch::detail -/// \brief Creates a new Proxy_Function object from a free function, member -/// function or data member \param[in] t Function / member to expose -/// -/// \b Example: -/// \code -/// int myfunction(const std::string &); -/// class MyClass -/// { -/// public: -/// void memberfunction(); -/// int memberdata; -/// }; -/// -/// Carbon::ChaiScript chai; -/// chai.add(fun(&myfunction), "myfunction"); -/// chai.add(fun(&MyClass::memberfunction), "memberfunction"); -/// chai.add(fun(&MyClass::memberdata), "memberdata"); -/// \endcode -/// -/// \sa \ref adding_functions template Proxy_Function fun(T &&t) { return dispatch::detail::make_callable( std::forward(t), dispatch::detail::function_signature(t)); } -/// \brief Creates a new Proxy_Function object from a free function, member -/// function or data member and binds the first parameter of it \param[in] t -/// Function / member to expose \param[in] q Value to bind to first parameter -/// -/// \b Example: -/// \code -/// struct MyClass -/// { -/// void memberfunction(int); -/// }; -/// -/// MyClass obj; -/// Carbon::ChaiScript chai; -/// // Add function taking only one argument, an int, and permanently bound to -/// "obj" chai.add(fun(&MyClass::memberfunction, std::ref(obj)), -/// "memberfunction"); \endcode -/// -/// \sa \ref adding_functions +/** + * @brief Creates a callable object from a free function, member function, or + * data member and binds the first parameter. + * + * @tparam T The type of the function. + * @tparam Q The type of the value to bind to the first parameter. + * @param t The function or member to expose. + * @param q The value to bind to the first parameter. + * @return A Proxy_Function representing the callable object. + */ template Proxy_Function fun(T &&t, const Q &q) { return fun(detail::bind_first(std::forward(t), q)); } - +} // namespace dispatch::detail } // namespace Carbon #endif diff --git a/src/carbon/command/type_conversions.hpp b/src/carbon/command/type_conversions.hpp index ee2ce7ce..f8ccfbb3 100644 --- a/src/carbon/command/type_conversions.hpp +++ b/src/carbon/command/type_conversions.hpp @@ -12,7 +12,7 @@ #include #include "../threading.hpp" -#include "../utils/static_string.hpp" +#include "atom/experiment/sstring.hpp" #include "bad_boxed_cast.hpp" #include "boxed_cast_helper.hpp" #include "boxed_value.hpp" @@ -25,7 +25,7 @@ namespace exception { class conversion_error : public bad_boxed_cast { public: conversion_error(const Type_Info t_to, const Type_Info t_from, - const utility::Static_String what) noexcept + const Static_String what) noexcept : bad_boxed_cast(t_from, (*t_to.bare_type_info()), what), type_to(t_to) {} @@ -35,14 +35,14 @@ class conversion_error : public bad_boxed_cast { class bad_boxed_dynamic_cast : public bad_boxed_cast { public: bad_boxed_dynamic_cast(const Type_Info &t_from, const std::type_info &t_to, - const utility::Static_String &t_what) noexcept + const Static_String &t_what) noexcept : bad_boxed_cast(t_from, t_to, t_what) {} bad_boxed_dynamic_cast(const Type_Info &t_from, const std::type_info &t_to) noexcept : bad_boxed_cast(t_from, t_to) {} - explicit bad_boxed_dynamic_cast(const utility::Static_String &w) noexcept + explicit bad_boxed_dynamic_cast(const Static_String &w) noexcept : bad_boxed_cast(w) {} bad_boxed_dynamic_cast(const bad_boxed_dynamic_cast &) = default; @@ -53,14 +53,14 @@ class bad_boxed_dynamic_cast : public bad_boxed_cast { class bad_boxed_type_cast : public bad_boxed_cast { public: bad_boxed_type_cast(const Type_Info &t_from, const std::type_info &t_to, - const utility::Static_String &t_what) noexcept + const Static_String &t_what) noexcept : bad_boxed_cast(t_from, t_to, t_what) {} bad_boxed_type_cast(const Type_Info &t_from, const std::type_info &t_to) noexcept : bad_boxed_cast(t_from, t_to) {} - explicit bad_boxed_type_cast(const utility::Static_String &w) noexcept + explicit bad_boxed_type_cast(const Static_String &w) noexcept : bad_boxed_cast(w) {} bad_boxed_type_cast(const bad_boxed_type_cast &) = default; diff --git a/src/carbon/language/algebraic.hpp b/src/carbon/language/algebraic.hpp index 0c9ef642..7c0d5d77 100644 --- a/src/carbon/language/algebraic.hpp +++ b/src/carbon/language/algebraic.hpp @@ -3,7 +3,7 @@ #ifndef CARBON_ALGEBRAIC_HPP #define CARBON_ALGEBRAIC_HPP -#include "../utils/hash.hpp" +#include "atom/algorithm/hash.hpp" #include @@ -61,93 +61,93 @@ struct Operators { #pragma warning(disable : 4307) #endif - const auto op_hash = utility::hash(t_str); + const auto op_hash = Atom::Algorithm::fnv1a_hash(t_str); switch (op_hash) { - case utility::hash("=="): { + case Atom::Algorithm::fnv1a_hash("=="): { return Opers::equals; } - case utility::hash("<"): { + case Atom::Algorithm::fnv1a_hash("<"): { return Opers::less_than; } - case utility::hash(">"): { + case Atom::Algorithm::fnv1a_hash(">"): { return Opers::greater_than; } - case utility::hash("<="): { + case Atom::Algorithm::fnv1a_hash("<="): { return Opers::less_than_equal; } - case utility::hash(">="): { + case Atom::Algorithm::fnv1a_hash(">="): { return Opers::greater_than_equal; } - case utility::hash("!="): { + case Atom::Algorithm::fnv1a_hash("!="): { return Opers::not_equal; } - case utility::hash("="): { + case Atom::Algorithm::fnv1a_hash("="): { return Opers::assign; } - case utility::hash("++"): { + case Atom::Algorithm::fnv1a_hash("++"): { return Opers::pre_increment; } - case utility::hash("--"): { + case Atom::Algorithm::fnv1a_hash("--"): { return Opers::pre_decrement; } - case utility::hash("*="): { + case Atom::Algorithm::fnv1a_hash("*="): { return Opers::assign_product; } - case utility::hash("+="): { + case Atom::Algorithm::fnv1a_hash("+="): { return Opers::assign_sum; } - case utility::hash("-="): { + case Atom::Algorithm::fnv1a_hash("-="): { return Opers::assign_difference; } - case utility::hash("&="): { + case Atom::Algorithm::fnv1a_hash("&="): { return Opers::assign_bitwise_and; } - case utility::hash("|="): { + case Atom::Algorithm::fnv1a_hash("|="): { return Opers::assign_bitwise_or; } - case utility::hash("<<="): { + case Atom::Algorithm::fnv1a_hash("<<="): { return Opers::assign_shift_left; } - case utility::hash(">>="): { + case Atom::Algorithm::fnv1a_hash(">>="): { return Opers::assign_shift_right; } - case utility::hash("%="): { + case Atom::Algorithm::fnv1a_hash("%="): { return Opers::assign_remainder; } - case utility::hash("^="): { + case Atom::Algorithm::fnv1a_hash("^="): { return Opers::assign_bitwise_xor; } - case utility::hash("<<"): { + case Atom::Algorithm::fnv1a_hash("<<"): { return Opers::shift_left; } - case utility::hash(">>"): { + case Atom::Algorithm::fnv1a_hash(">>"): { return Opers::shift_right; } - case utility::hash("%"): { + case Atom::Algorithm::fnv1a_hash("%"): { return Opers::remainder; } - case utility::hash("&"): { + case Atom::Algorithm::fnv1a_hash("&"): { return Opers::bitwise_and; } - case utility::hash("|"): { + case Atom::Algorithm::fnv1a_hash("|"): { return Opers::bitwise_or; } - case utility::hash("^"): { + case Atom::Algorithm::fnv1a_hash("^"): { return Opers::bitwise_xor; } - case utility::hash("~"): { + case Atom::Algorithm::fnv1a_hash("~"): { return Opers::bitwise_complement; } - case utility::hash("+"): { + case Atom::Algorithm::fnv1a_hash("+"): { return t_is_unary ? Opers::unary_plus : Opers::sum; } - case utility::hash("-"): { + case Atom::Algorithm::fnv1a_hash("-"): { return t_is_unary ? Opers::unary_minus : Opers::difference; } - case utility::hash("/"): { + case Atom::Algorithm::fnv1a_hash("/"): { return Opers::quotient; } - case utility::hash("*"): { + case Atom::Algorithm::fnv1a_hash("*"): { return Opers::product; } default: { diff --git a/src/carbon/language/common.hpp b/src/carbon/language/common.hpp index eba2bbd6..5828447b 100644 --- a/src/carbon/language/common.hpp +++ b/src/carbon/language/common.hpp @@ -11,11 +11,11 @@ #include #include -#include "../defines.hpp" #include "../command/boxed_value.hpp" #include "../command/dispatchkit.hpp" #include "../command/proxy_functions.hpp" -#include "../command/type_info.hpp" +#include "../defines.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { struct AST_Node; @@ -30,20 +30,32 @@ struct Name_Validator { template static bool is_reserved_word(const T &s) noexcept { const static std::unordered_set words{ - utility::hash("def"), utility::hash("fun"), - utility::hash("while"), utility::hash("for"), - utility::hash("if"), utility::hash("else"), - utility::hash("&&"), utility::hash("||"), - utility::hash(","), utility::hash("auto"), - utility::hash("return"), utility::hash("break"), - utility::hash("true"), utility::hash("false"), - utility::hash("class"), utility::hash("attr"), - utility::hash("var"), utility::hash("global"), - utility::hash("GLOBAL"), utility::hash("_"), - utility::hash("__LINE__"), utility::hash("__FILE__"), - utility::hash("__FUNC__"), utility::hash("__CLASS__")}; - - return words.count(utility::hash(s)) == 1; + Atom::Algorithm::fnv1a_hash("def"), + Atom::Algorithm::fnv1a_hash("fun"), + Atom::Algorithm::fnv1a_hash("while"), + Atom::Algorithm::fnv1a_hash("for"), + Atom::Algorithm::fnv1a_hash("if"), + Atom::Algorithm::fnv1a_hash("else"), + Atom::Algorithm::fnv1a_hash("&&"), + Atom::Algorithm::fnv1a_hash("||"), + Atom::Algorithm::fnv1a_hash(","), + Atom::Algorithm::fnv1a_hash("auto"), + Atom::Algorithm::fnv1a_hash("return"), + Atom::Algorithm::fnv1a_hash("break"), + Atom::Algorithm::fnv1a_hash("true"), + Atom::Algorithm::fnv1a_hash("false"), + Atom::Algorithm::fnv1a_hash("class"), + Atom::Algorithm::fnv1a_hash("attr"), + Atom::Algorithm::fnv1a_hash("var"), + Atom::Algorithm::fnv1a_hash("global"), + Atom::Algorithm::fnv1a_hash("GLOBAL"), + Atom::Algorithm::fnv1a_hash("_"), + Atom::Algorithm::fnv1a_hash("__LINE__"), + Atom::Algorithm::fnv1a_hash("__FILE__"), + Atom::Algorithm::fnv1a_hash("__FUNC__"), + Atom::Algorithm::fnv1a_hash("__CLASS__")}; + + return words.count(Atom::Algorithm::fnv1a_hash(s)) == 1; } template @@ -232,8 +244,7 @@ struct AST_Node { } static inline bool get_bool_condition( - const Boxed_Value &t_bv, - const Carbon::detail::Dispatch_State &t_ss); + const Boxed_Value &t_bv, const Carbon::detail::Dispatch_State &t_ss); virtual ~AST_Node() noexcept = default; AST_Node(AST_Node &&) = default; @@ -635,8 +646,8 @@ struct file_not_found_error : std::runtime_error { } // namespace exception // static -bool AST_Node::get_bool_condition( - const Boxed_Value &t_bv, const Carbon::detail::Dispatch_State &t_ss) { +bool AST_Node::get_bool_condition(const Boxed_Value &t_bv, + const Carbon::detail::Dispatch_State &t_ss) { try { return t_ss->boxed_cast(t_bv); } catch (const exception::bad_boxed_cast &) { @@ -645,18 +656,18 @@ bool AST_Node::get_bool_condition( } namespace parser { -class ChaiScript_Parser_Base { +class Carbon_Parser_Base { public: virtual AST_NodePtr parse(const std::string &t_input, const std::string &t_fname) = 0; virtual void debug_print(const AST_Node &t, std::string prepend = "") const = 0; virtual void *get_tracer_ptr() = 0; - virtual ~ChaiScript_Parser_Base() = default; - ChaiScript_Parser_Base() = default; - ChaiScript_Parser_Base(ChaiScript_Parser_Base &&) = default; - ChaiScript_Parser_Base &operator=(ChaiScript_Parser_Base &&) = delete; - ChaiScript_Parser_Base &operator=(const ChaiScript_Parser_Base &&) = delete; + virtual ~Carbon_Parser_Base() = default; + Carbon_Parser_Base() = default; + Carbon_Parser_Base(Carbon_Parser_Base &&) = default; + Carbon_Parser_Base &operator=(Carbon_Parser_Base &&) = delete; + Carbon_Parser_Base &operator=(const Carbon_Parser_Base &&) = delete; template T &get_tracer() noexcept { @@ -665,7 +676,7 @@ class ChaiScript_Parser_Base { } protected: - ChaiScript_Parser_Base(const ChaiScript_Parser_Base &) = default; + Carbon_Parser_Base(const Carbon_Parser_Base &) = default; }; } // namespace parser diff --git a/src/carbon/language/engine.hpp b/src/carbon/language/engine.hpp index 1665a72d..de62852c 100644 --- a/src/carbon/language/engine.hpp +++ b/src/carbon/language/engine.hpp @@ -56,7 +56,7 @@ using Loadable_Module_Ptr = std::shared_ptr; } /// \brief The main object that the ChaiScript user will use. -class ChaiScript_Basic { +class Carbon_Basic { mutable Carbon::detail::threading::shared_mutex m_mutex; mutable Carbon::detail::threading::recursive_mutex m_use_mutex; @@ -67,7 +67,7 @@ class ChaiScript_Basic { std::vector m_module_paths; std::vector m_use_paths; - std::unique_ptr m_parser; + std::unique_ptr m_parser; Carbon::detail::Dispatch_Engine m_engine; @@ -320,15 +320,15 @@ class ChaiScript_Basic { public: /// \brief Virtual destructor for ChaiScript - virtual ~ChaiScript_Basic() = default; + virtual ~Carbon_Basic() = default; /// \brief Constructor for ChaiScript /// \param[in] t_lib Standard library to apply to this ChaiScript instance /// \param[in] t_modulepaths Vector of paths to search when attempting to /// load a binary module \param[in] t_usepaths Vector of paths to search /// when attempting to "use" an included ChaiScript file - ChaiScript_Basic(const ModulePtr &t_lib, - std::unique_ptr &&parser, + Carbon_Basic(const ModulePtr &t_lib, + std::unique_ptr &&parser, std::vector t_module_paths = {}, std::vector t_use_paths = {}, const std::vector &t_opts = @@ -343,14 +343,14 @@ class ChaiScript_Basic { // search path as windows would do union cast_union { - Boxed_Value (ChaiScript_Basic::*in_ptr)(const std::string &); + Boxed_Value (Carbon_Basic::*in_ptr)(const std::string &); void *out_ptr; }; Dl_info rInfo; memset(&rInfo, 0, sizeof(rInfo)); cast_union u; - u.in_ptr = &ChaiScript_Basic::use; + u.in_ptr = &Carbon_Basic::use; if ((dladdr(static_cast(u.out_ptr), &rInfo) != 0) && (rInfo.dli_fname != nullptr)) { std::string dllpath(rInfo.dli_fname); @@ -383,13 +383,13 @@ class ChaiScript_Basic { /// \param[in] t_modulepaths Vector of paths to search when attempting to /// load a binary module \param[in] t_usepaths Vector of paths to search /// when attempting to "use" an included ChaiScript file - explicit ChaiScript_Basic( - std::unique_ptr &&parser, + explicit Carbon_Basic( + std::unique_ptr &&parser, std::vector t_module_paths = {}, std::vector t_use_paths = {}, const std::vector &t_opts = Carbon::default_options()) - : ChaiScript_Basic({}, std::move(parser), t_module_paths, t_use_paths, + : Carbon_Basic({}, std::move(parser), t_module_paths, t_use_paths, t_opts) { try { // attempt to load the stdlib @@ -411,15 +411,15 @@ class ChaiScript_Basic { } } #else // CARBON_NO_DYNLOAD - explicit ChaiScript_Basic( - std::unique_ptr &&parser, + explicit Carbon_Basic( + std::unique_ptr &&parser, std::vector t_module_paths = {}, std::vector t_use_paths = {}, const std::vector &t_opts = Carbon::default_options()) = delete; #endif - parser::ChaiScript_Parser_Base &get_parser() noexcept { return *m_parser; } + parser::Carbon_Parser_Base &get_parser() noexcept { return *m_parser; } const Boxed_Value eval(const AST_Node &t_ast) { try { @@ -492,7 +492,7 @@ class ChaiScript_Basic { /// t_name Name of the value to add \throw /// Carbon::exception::global_non_const If t_bv is not a constant object /// \sa Boxed_Value::is_const - ChaiScript_Basic &add_global_const(const Boxed_Value &t_bv, + Carbon_Basic &add_global_const(const Boxed_Value &t_bv, const std::string &t_name) { Name_Validator::validate_object_name(t_name); m_engine.add_global_const(t_bv, t_name); @@ -505,14 +505,14 @@ class ChaiScript_Basic { /// making sure the object is thread-safe if necessary /// ChaiScript is thread-safe but provides no threading locking /// mechanism to the script - ChaiScript_Basic &add_global(const Boxed_Value &t_bv, + Carbon_Basic &add_global(const Boxed_Value &t_bv, const std::string &t_name) { Name_Validator::validate_object_name(t_name); m_engine.add_global(t_bv, t_name); return *this; } - ChaiScript_Basic &set_global(const Boxed_Value &t_bv, + Carbon_Basic &set_global(const Boxed_Value &t_bv, const std::string &t_name) { Name_Validator::validate_object_name(t_name); m_engine.set_global(t_bv, t_name); @@ -620,7 +620,7 @@ class ChaiScript_Basic { /// /// \sa \ref adding_items template - ChaiScript_Basic &add(const T &t_t, const std::string &t_name) { + Carbon_Basic &add(const T &t_t, const std::string &t_name) { Name_Validator::validate_object_name(t_name); m_engine.add(t_t, t_name); return *this; @@ -635,7 +635,7 @@ class ChaiScript_Basic { /// Carbon::ChaiScript chai; /// chai.add(Carbon::base_class()); \endcode - ChaiScript_Basic &add(const Type_Conversion &d) { + Carbon_Basic &add(const Type_Conversion &d) { m_engine.add(d); return *this; } @@ -643,7 +643,7 @@ class ChaiScript_Basic { /// \brief Adds all elements of a module to ChaiScript runtime /// \param[in] t_p The module to add. /// \sa Carbon::Module - ChaiScript_Basic &add(const ModulePtr &t_p) { + Carbon_Basic &add(const ModulePtr &t_p) { t_p->apply(*this, this->get_eval_engine()); return *this; } diff --git a/src/carbon/language/eval.hpp b/src/carbon/language/eval.hpp index 6eafedb3..17758a3c 100644 --- a/src/carbon/language/eval.hpp +++ b/src/carbon/language/eval.hpp @@ -22,7 +22,7 @@ #include "../command/proxy_functions.hpp" #include "../command/proxy_functions_detail.hpp" #include "../command/register_function.hpp" -#include "../command/type_info.hpp" +#include "atom/experiment/type_info.hpp" #include "algebraic.hpp" #include "common.hpp" diff --git a/src/carbon/language/parser.hpp b/src/carbon/language/parser.hpp index 37a4816e..4bd0e17a 100644 --- a/src/carbon/language/parser.hpp +++ b/src/carbon/language/parser.hpp @@ -13,8 +13,8 @@ #include #include "../command/boxed_value.hpp" -#include "../utils/hash.hpp" -#include "../utils/static_string.hpp" +#include "atom/algorithm/hash.hpp" +#include "atom/experiment/sstring.hpp" #include "common.hpp" #include "optimizer.hpp" #include "tracer.hpp" @@ -100,14 +100,14 @@ struct Char_Parser_Helper { } // namespace detail template -class ChaiScript_Parser final : public ChaiScript_Parser_Base { +class Carbon_Parser final : public Carbon_Parser_Base { void *get_tracer_ptr() noexcept override { return &m_tracer; } std::size_t m_current_parse_depth = 0; struct Depth_Counter { static const auto max_depth = Parse_Depth; - Depth_Counter(ChaiScript_Parser *t_parser) : parser(t_parser) { + Depth_Counter(Carbon_Parser *t_parser) : parser(t_parser) { ++parser->m_current_parse_depth; if (parser->m_current_parse_depth > max_depth) { throw exception::eval_error( @@ -120,7 +120,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { ~Depth_Counter() noexcept { --parser->m_current_parse_depth; } - ChaiScript_Parser *parser; + Carbon_Parser *parser; }; template @@ -217,22 +217,22 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { } struct Operator_Matches { - using SS = utility::Static_String; - - std::array m_0{{SS("?")}}; - std::array m_1{{SS("||")}}; - std::array m_2{{SS("&&")}}; - std::array m_3{{SS("|")}}; - std::array m_4{{SS("^")}}; - std::array m_5{{SS("&")}}; - std::array m_6{{SS("=="), SS("!=")}}; - std::array m_7{ + using SS = Static_String; + + std::array m_0{{SS("?")}}; + std::array m_1{{SS("||")}}; + std::array m_2{{SS("&&")}}; + std::array m_3{{SS("|")}}; + std::array m_4{{SS("^")}}; + std::array m_5{{SS("&")}}; + std::array m_6{{SS("=="), SS("!=")}}; + std::array m_7{ {SS("<"), SS("<="), SS(">"), SS(">=")}}; - std::array m_8{{SS("<<"), SS(">>")}}; + std::array m_8{{SS("<<"), SS(">>")}}; // We share precedence here but then separate them later - std::array m_9{{SS("+"), SS("-")}}; - std::array m_10{{SS("*"), SS("/"), SS("%")}}; - std::array m_11{ + std::array m_9{{SS("+"), SS("-")}}; + std::array m_10{{SS("*"), SS("/"), SS("%")}}; + std::array m_11{ {SS("++"), SS("--"), SS("-"), SS("+"), SS("!"), SS("~")}}; bool is_match(std::string_view t_str) const noexcept { @@ -331,11 +331,11 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { return operators; } - constexpr static utility::Static_String m_multiline_comment_end{"*/"}; - constexpr static utility::Static_String m_multiline_comment_begin{"/*"}; - constexpr static utility::Static_String m_singleline_comment{"//"}; - constexpr static utility::Static_String m_annotation{"#"}; - constexpr static utility::Static_String m_cr_lf{"\r\n"}; + constexpr static Static_String m_multiline_comment_end{"*/"}; + constexpr static Static_String m_multiline_comment_begin{"/*"}; + constexpr static Static_String m_singleline_comment{"//"}; + constexpr static Static_String m_annotation{"#"}; + constexpr static Static_String m_cr_lf{"\r\n"}; constexpr static auto m_operators = create_operators(); std::shared_ptr m_filename; @@ -455,7 +455,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { } public: - explicit ChaiScript_Parser(Tracer tracer = Tracer(), + explicit Carbon_Parser(Tracer tracer = Tracer(), Optimizer optimizer = Optimizer()) : m_tracer(std::move(tracer)), m_optimizer(std::move(optimizer)) { m_match_stack.reserve(2); @@ -465,10 +465,10 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { Optimizer &get_optimizer() noexcept { return m_optimizer; } - ChaiScript_Parser(const ChaiScript_Parser &) = delete; - ChaiScript_Parser &operator=(const ChaiScript_Parser &) = delete; - ChaiScript_Parser(ChaiScript_Parser &&) = default; - ChaiScript_Parser &operator=(ChaiScript_Parser &&) = delete; + Carbon_Parser(const Carbon_Parser &) = delete; + Carbon_Parser &operator=(const Carbon_Parser &) = delete; + Carbon_Parser(Carbon_Parser &&) = default; + Carbon_Parser &operator=(Carbon_Parser &&) = delete; constexpr static auto m_alphabet = build_alphabet(); constexpr static Operator_Matches m_operator_matches{}; @@ -535,7 +535,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { /// Reads a symbol group from input if it matches the parameter, without /// skipping initial whitespace - inline auto Symbol_(const utility::Static_String &sym) noexcept { + inline auto Symbol_(const Static_String &sym) noexcept { const auto len = sym.size(); if (m_position.remaining() >= len) { const char *file_pos = &(*m_position); @@ -1007,7 +1007,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { const auto start = m_position; if (Id_()) { auto text = Position::str(start, m_position); - const auto text_hash = utility::hash(text); + const auto text_hash = Atom::Algorithm::fnv1a_hash(text); if (validate) { validate_object_name(text); @@ -1019,43 +1019,43 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { #endif switch (text_hash) { - case utility::hash("true"): { + case Atom::Algorithm::fnv1a_hash("true"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var(true))); } break; - case utility::hash("false"): { + case Atom::Algorithm::fnv1a_hash("false"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var(false))); } break; - case utility::hash("Infinity"): { + case Atom::Algorithm::fnv1a_hash("Infinity"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var( std::numeric_limits::infinity()))); } break; - case utility::hash("NaN"): { + case Atom::Algorithm::fnv1a_hash("NaN"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var( std::numeric_limits::quiet_NaN()))); } break; - case utility::hash("__LINE__"): { + case Atom::Algorithm::fnv1a_hash("__LINE__"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var(start.line))); } break; - case utility::hash("__FILE__"): { + case Atom::Algorithm::fnv1a_hash("__FILE__"): { m_match_stack.push_back( make_node>( text, start.line, start.col, const_var(m_filename))); } break; - case utility::hash("__FUNC__"): { + case Atom::Algorithm::fnv1a_hash("__FUNC__"): { std::string fun_name = "NOT_IN_FUNCTION"; for (size_t idx = m_match_stack.empty() ? 0 @@ -1073,7 +1073,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { make_node>( text, start.line, start.col, const_var(fun_name))); } break; - case utility::hash("__CLASS__"): { + case Atom::Algorithm::fnv1a_hash("__CLASS__"): { std::string fun_name = "NOT_IN_CLASS"; for (size_t idx = m_match_stack.empty() ? 0 @@ -1094,7 +1094,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { std::move(text), start.line, start.col, const_var(fun_name))); } break; - case utility::hash("_"): { + case Atom::Algorithm::fnv1a_hash("_"): { m_match_stack.push_back( make_node>( std::move(text), start.line, start.col, @@ -1613,7 +1613,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { /// Reads a string from input if it matches the parameter, without skipping /// initial whitespace - bool Keyword_(const utility::Static_String &t_s) { + bool Keyword_(const Static_String &t_s) { const auto len = t_s.size(); if (m_position.remaining() >= len) { auto tmp = m_position; @@ -1632,7 +1632,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { /// Reads (and potentially captures) a string from input if it matches the /// parameter - bool Keyword(const utility::Static_String &t_s) { + bool Keyword(const Static_String &t_s) { Depth_Counter dc{this}; SkipWS(); const auto start = m_position; @@ -1653,7 +1653,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { /// Reads (and potentially captures) a symbol group from input if it matches /// the parameter - bool Symbol(const utility::Static_String &t_s, + bool Symbol(const Static_String &t_s, const bool t_disallow_prevention = false) { Depth_Counter dc{this}; SkipWS(); @@ -2820,8 +2820,8 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { bool Prefix() { Depth_Counter dc{this}; const auto prev_stack_top = m_match_stack.size(); - using SS = utility::Static_String; - const std::array prefix_opers{ + using SS = Static_String; + const std::array prefix_opers{ {SS{"++"}, SS{"--"}, SS{"-"}, SS{"+"}, SS{"!"}, SS{"~"}}}; for (const auto &oper : prefix_opers) { @@ -3009,7 +3009,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { Depth_Counter dc{this}; const auto prev_stack_top = m_match_stack.size(); - using SS = utility::Static_String; + using SS = Static_String; if (Operator()) { for (const auto &sym : {SS{"="}, SS{":="}, SS{"+="}, SS{"-="}, @@ -3109,7 +3109,7 @@ class ChaiScript_Parser final : public ChaiScript_Parser_Base { AST_NodePtr parse(const std::string &t_input, const std::string &t_fname) override { - ChaiScript_Parser parser(m_tracer, m_optimizer); + Carbon_Parser parser(m_tracer, m_optimizer); return parser.parse_internal(t_input, t_fname); } diff --git a/src/carbon/language/posix.hpp b/src/carbon/language/posix.hpp index b6f72c1f..abfeb171 100644 --- a/src/carbon/language/posix.hpp +++ b/src/carbon/language/posix.hpp @@ -3,6 +3,9 @@ #ifndef CARBON_POSIX_HPP #define CARBON_POSIX_HPP +#include +#include + namespace Carbon::detail { struct Loadable_Module { struct DLModule { diff --git a/src/carbon/language/prelude.hpp b/src/carbon/language/prelude.hpp index 7b72c1fc..bf7eed05 100644 --- a/src/carbon/language/prelude.hpp +++ b/src/carbon/language/prelude.hpp @@ -3,8 +3,10 @@ #ifndef CARBON_PRELUDE_HPP #define CARBON_PRELUDE_HPP +#include + namespace Carbon { -struct ChaiScript_Prelude { +struct Carbon_Prelude { static std::string prelude() { return R"chaiscript( diff --git a/src/carbon/language/prelude_docs.hpp b/src/carbon/language/prelude_docs.hpp index 41c4adf2..19e2a44f 100644 --- a/src/carbon/language/prelude_docs.hpp +++ b/src/carbon/language/prelude_docs.hpp @@ -4,7 +4,7 @@ /// \brief Items in this namespace exist in the ChaiScript language runtime. /// They are not part of the C++ API -namespace ChaiScript_Language { +namespace Carbon_Language { /// \page LangStandardLibraryRef ChaiScript Language Standard Library Reference /// /// ChaiScript, at its core, has some very functional programming-inspired @@ -829,4 +829,4 @@ Const_Range retro(Const_Range); /// /// \sa \ref keywordtry void throw(Object); -} // namespace ChaiScript_Language +} // namespace Carbon_Language diff --git a/src/carbon/language/tracer.hpp b/src/carbon/language/tracer.hpp index b1d35ddb..96737eb0 100644 --- a/src/carbon/language/tracer.hpp +++ b/src/carbon/language/tracer.hpp @@ -1,3 +1,4 @@ +#include "eval.hpp" #ifndef CARBON_TRACER_HPP diff --git a/src/carbon/language/unknown.hpp b/src/carbon/language/unknown.hpp index ea5f591f..bf46e876 100644 --- a/src/carbon/language/unknown.hpp +++ b/src/carbon/language/unknown.hpp @@ -4,18 +4,20 @@ #define CARBON_UNKNOWN_HPP namespace Carbon { - namespace detail { - struct Loadable_Module { - Loadable_Module(const std::string &, const std::string &) { +namespace detail { +struct Loadable_Module { + Loadable_Module(const std::string &, const std::string &) { #ifdef CARBON_NO_DYNLOAD - throw Carbon::exception::load_module_error("Loadable module support was disabled (CARBON_NO_DYNLOAD)"); + throw Carbon::exception::load_module_error( + "Loadable module support was disabled (CARBON_NO_DYNLOAD)"); #else - throw Carbon::exception::load_module_error("Loadable module support not available for your platform"); + throw Carbon::exception::load_module_error( + "Loadable module support not available for your platform"); #endif - } + } - ModulePtr m_moduleptr; - }; - } // namespace detail -} // namespace Carbon + ModulePtr m_moduleptr; +}; +} // namespace detail +} // namespace Carbon #endif diff --git a/src/carbon/stdlib.hpp b/src/carbon/stdlib.hpp index 7c30cb2b..40184c9e 100644 --- a/src/carbon/stdlib.hpp +++ b/src/carbon/stdlib.hpp @@ -25,7 +25,7 @@ #ifndef CARBON_NO_THREADS #include -#endif +#endif\ /// @file /// @@ -60,7 +60,7 @@ class Std_Lib { json_wrap::library(*lib); - lib->eval(ChaiScript_Prelude::prelude() /*, "standard prelude"*/); + lib->eval(Carbon_Prelude::prelude() /*, "standard prelude"*/); return lib; } diff --git a/src/carbon/utils/json.hpp b/src/carbon/utils/json.hpp index df916541..8115965c 100644 --- a/src/carbon/utils/json.hpp +++ b/src/carbon/utils/json.hpp @@ -15,7 +15,7 @@ #include #include #include "../defines.hpp" -#include "quick_flat_map.hpp" +#include "atom/experiment/flatmap.hpp" namespace Carbon::json { using std::enable_if; @@ -38,9 +38,9 @@ class JSON { }; private: - using Data = std::variant< - std::nullptr_t, Carbon::utility::QuickFlatMap, - std::vector, std::string, double, std::int64_t, bool>; + using Data = std::variant, + std::vector, std::string, double, + std::int64_t, bool>; struct Internal { Internal(std::nullptr_t) : d(nullptr) {} @@ -54,7 +54,7 @@ class JSON { case Class::Null: return nullptr; case Class::Object: - return Carbon::utility::QuickFlatMap{}; + return QuickFlatMap{}; case Class::Array: return std::vector{}; case Class::String: @@ -278,8 +278,7 @@ class JSON { [](const auto &o) { return o; }, []() { return false; }); } - JSONWrapper> - object_range() { + JSONWrapper> object_range() { return std::get_if(Class::Object)>( &internal.d); } @@ -288,8 +287,7 @@ class JSON { return std::get_if(Class::Array)>(&internal.d); } - JSONConstWrapper> - object_range() const { + JSONConstWrapper> object_range() const { return std::get_if(Class::Object)>( &internal.d); } diff --git a/src/carbon/utils/json_wrap.hpp b/src/carbon/utils/json_wrap.hpp index 8c73f857..60f26b0e 100644 --- a/src/carbon/utils/json_wrap.hpp +++ b/src/carbon/utils/json_wrap.hpp @@ -3,7 +3,7 @@ #include "json.hpp" -namespace chaiscript { +namespace Carbon { class json_wrap { public: static Module &library(Module &m) { @@ -133,6 +133,6 @@ class json_wrap { } }; -} // namespace chaiscript +} // namespace Carbon #endif From 116c4c6b9e0f7bc7bb37bd50fcb2991d0c55557d Mon Sep 17 00:00:00 2001 From: Max Qian <64824374+AstroAir@users.noreply.github.com> Date: Fri, 12 Apr 2024 10:34:27 +0000 Subject: [PATCH 07/28] just a update --- scripts/nginx.sh | 70 ++++++++++------ scripts/start-hotspot.sh | 100 +++++++++++++++------- src/atom/experiment/short_string.cpp | 119 +++++++++++++++++++++++++++ src/atom/experiment/short_string.hpp | 95 +++++++++++++++++++++ src/config/_pocket.hpp | 0 src/config/_pybind.cpp | 0 src/config/_script.hpp | 0 7 files changed, 330 insertions(+), 54 deletions(-) create mode 100644 src/atom/experiment/short_string.cpp create mode 100644 src/atom/experiment/short_string.hpp create mode 100644 src/config/_pocket.hpp create mode 100644 src/config/_pybind.cpp create mode 100644 src/config/_script.hpp diff --git a/scripts/nginx.sh b/scripts/nginx.sh index 20a7b377..83781c1d 100644 --- a/scripts/nginx.sh +++ b/scripts/nginx.sh @@ -1,66 +1,86 @@ #!/bin/bash -# 定义颜色 +# Define colors GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' -# 定义 Nginx 路径 +# Define Nginx paths NGINX_PATH="/etc/nginx" NGINX_CONF="$NGINX_PATH/nginx.conf" NGINX_BINARY="/usr/sbin/nginx" -# 函数: 启动 Nginx +# Function: Install Nginx if not installed +install_nginx() { + if ! command -v nginx &>/dev/null; then + echo "Installing Nginx..." + # Add installation commands according to the package manager used (apt, yum, etc.) + # Example for apt: + sudo apt-get update + sudo apt-get install nginx -y + fi +} + +# Function: Start Nginx start_nginx() { if [ -f "$NGINX_BINARY" ]; then $NGINX_BINARY - echo -e "${GREEN}Nginx 已启动${NC}" + echo -e "${GREEN}Nginx has been started${NC}" else - echo -e "${RED}无法找到 Nginx 二进制文件${NC}" + echo -e "${RED}Nginx binary not found${NC}" fi } -# 函数: 停止 Nginx +# Function: Stop Nginx stop_nginx() { if [ -f "$NGINX_BINARY" ]; then $NGINX_BINARY -s stop - echo -e "${GREEN}Nginx 已停止${NC}" + echo -e "${GREEN}Nginx has been stopped${NC}" else - echo -e "${RED}无法找到 Nginx 二进制文件${NC}" + echo -e "${RED}Nginx binary not found${NC}" fi } -# 函数: 重新加载 Nginx 配置 +# Function: Reload Nginx configuration reload_nginx() { if [ -f "$NGINX_BINARY" ]; then $NGINX_BINARY -s reload - echo -e "${GREEN}Nginx 配置已重新加载${NC}" + echo -e "${GREEN}Nginx configuration has been reloaded${NC}" else - echo -e "${RED}无法找到 Nginx 二进制文件${NC}" + echo -e "${RED}Nginx binary not found${NC}" fi } -# 函数: 检查 Nginx 配置文件语法 +# Function: Check Nginx configuration syntax check_config() { if [ -f "$NGINX_CONF" ]; then $NGINX_BINARY -t -c "$NGINX_CONF" else - echo -e "${RED}无法找到 Nginx 配置文件${NC}" + echo -e "${RED}Nginx configuration file not found${NC}" fi } -# 函数: 显示帮助信息 +# Function: Show help message show_help() { echo "Usage: $0 [start|stop|reload|check|help]" - echo " start 启动 Nginx" - echo " stop 停止 Nginx" - echo " reload 重新加载 Nginx 配置" - echo " check 检查 Nginx 配置文件语法" - echo " help 显示帮助信息" + echo " start Start Nginx" + echo " stop Stop Nginx" + echo " reload Reload Nginx configuration" + echo " check Check Nginx configuration syntax" + echo " help Show help message" } -# 主函数 +# Main function main() { + if [ "$1" == "help" ]; then + show_help + exit 0 + fi + + # Check if Nginx is installed + install_nginx + + # Execute the command case "$1" in start) start_nginx @@ -74,15 +94,13 @@ main() { check) check_config ;; - help) - show_help - ;; *) - echo -e "${RED}无效的命令${NC}" + echo -e "${RED}Invalid command${NC}" show_help + exit 1 ;; esac } -# 执行主函数 -main "$1" \ No newline at end of file +# Execute main function with the provided argument +main "$1" diff --git a/scripts/start-hotspot.sh b/scripts/start-hotspot.sh index 0995a745..bbb50ddb 100644 --- a/scripts/start-hotspot.sh +++ b/scripts/start-hotspot.sh @@ -3,35 +3,82 @@ # Set default values SSID="LithiumServer" PASSWORD="lithiumserver" +PACKAGE_MANAGER="" + +# Function to detect package manager +detect_package_manager() { + if command -v apt-get &>/dev/null; then + PACKAGE_MANAGER="apt" + elif command -v yum &>/dev/null; then + PACKAGE_MANAGER="yum" + elif command -v dnf &>/dev/null; then + PACKAGE_MANAGER="dnf" + else + echo "Unsupported package manager. Please install 'hostapd' and 'dnsmasq' manually." + exit 1 + fi +} + +# Function to install packages +install_packages() { + case $PACKAGE_MANAGER in + apt) + sudo apt-get update + sudo apt-get install hostapd dnsmasq -y + ;; + yum|dnf) + sudo $PACKAGE_MANAGER install hostapd dnsmasq -y + ;; + *) + echo "Unsupported package manager." + exit 1 + ;; + esac +} + +# Function to start services +start_services() { + sudo systemctl start dnsmasq + sudo systemctl start hostapd +} + +# Function to check if services are running +check_services() { + if ! systemctl is-active --quiet dnsmasq || ! systemctl is-active --quiet hostapd; then + echo "Failed to start the hotspot." + exit 1 + fi +} + +# Main script # Process arguments -while [[ $# -gt 0 ]] -do -key="$1" +while [[ $# -gt 0 ]]; do + key="$1" -case $key in - -s|--ssid) - SSID="$2" - shift # past argument - shift # past value - ;; - -p|--password) - PASSWORD="$2" - shift # past argument - shift # past value - ;; - *) # unknown option - echo "Unknown option: $1" - exit 1 - ;; -esac + case $key in + -s|--ssid) + SSID="$2" + shift 2 + ;; + -p|--password) + PASSWORD="$2" + shift 2 + ;; + *) + echo "Unknown option: $1" + exit 1 + ;; + esac done +# Detect package manager +detect_package_manager + # Check if hostapd and dnsmasq are installed if ! dpkg -s hostapd dnsmasq > /dev/null 2>&1; then echo "Installing hostapd and dnsmasq..." - sudo apt-get update - sudo apt-get install hostapd dnsmasq -y + install_packages fi # Configure dnsmasq @@ -54,12 +101,9 @@ wpa_pairwise=TKIP rsn_pairwise=CCMP" | sudo tee /etc/hostapd/hostapd.conf > /dev/null # Start dnsmasq and hostapd -sudo systemctl start dnsmasq -sudo systemctl start hostapd +start_services # Check if the hotspot is started -ip addr show wlan0 | grep inet | awk '{print $2}' | cut -d/ -f1 | if grep -qE '^(192\.168\.4\.[0-9]{1,3})$'; then - echo "Hotspot $SSID has been started with password $PASSWORD" -else - echo "Failed to start the hotspot" -fi +check_services + +echo "Hotspot $SSID has been started with password $PASSWORD" diff --git a/src/atom/experiment/short_string.cpp b/src/atom/experiment/short_string.cpp new file mode 100644 index 00000000..9dc15417 --- /dev/null +++ b/src/atom/experiment/short_string.cpp @@ -0,0 +1,119 @@ +#include "short_string.hpp" + +#include + +ShortString::ShortString(const std::string& s) { + if (s.length() > MAX_LENGTH) { + throw std::invalid_argument("String too long for ShortString"); + } + str = s; +} + +ShortString::ShortString(std::string_view s) { + if (s.length() > MAX_LENGTH) { + throw std::invalid_argument("String too long for ShortString"); + } + str = s; +} + +ShortString::ShortString(const char* s) : ShortString(std::string(s)) {} + +ShortString::ShortString(const ShortString& other) : str(other.str) {} + +ShortString& ShortString::operator=(const ShortString& other) { + if (this != &other) { + str = other.str; + } + return *this; +} + +ShortString& ShortString::operator=(const std::string& s) { + if (s.length() > MAX_LENGTH) { + throw std::invalid_argument("String too long for ShortString"); + } + str = s; + return *this; +} + +ShortString& ShortString::operator=(const char* s) { + *this = ShortString(s); + return *this; +} + +ShortString& ShortString::operator=(std::string_view s) { + if (s.length() > MAX_LENGTH) { + throw std::invalid_argument("String too long for ShortString"); + } + str = s; + return *this; +} + +std::ostream& operator<<(std::ostream& os, const ShortString& ss) { + return os << ss.str; +} + +ShortString ShortString::operator+(const ShortString& other) const { + if (str.length() + other.str.length() > MAX_LENGTH) { + throw std::invalid_argument( + "Resulting string too long for ShortString"); + } + return ShortString(str + other.str); +} + +ShortString& ShortString::operator+=(const ShortString& other) { + *this = *this + other; + return *this; +} + +ShortString& ShortString::operator+=(std::string_view other) { + if (str.length() + other.length() > MAX_LENGTH) { + throw std::invalid_argument( + "Resulting string too long for ShortString"); + } + str += other; + return *this; +} + +bool ShortString::operator==(const ShortString& other) const noexcept { + return str == other.str; +} + +bool ShortString::operator!=(const ShortString& other) const noexcept { + return !(*this == other); +} + +bool ShortString::operator<(const ShortString& other) const noexcept { + return str < other.str; +} + +bool ShortString::operator>(const ShortString& other) const noexcept { + return str > other.str; +} + +bool ShortString::operator<=(const ShortString& other) const noexcept { + return !(*this > other); +} + +bool ShortString::operator>=(const ShortString& other) const noexcept { + return !(*this < other); +} + +char& ShortString::operator[](size_t index) noexcept { return str[index]; } + +const char& ShortString::operator[](size_t index) const noexcept { + return str[index]; +} + +size_t ShortString::length() const noexcept { return str.length(); } + +ShortString ShortString::substr(size_t pos = 0, + size_t count = std::string::npos) const { + if (pos > str.length()) { + throw std::out_of_range("Starting position out of range"); + } + return ShortString(str.substr(pos, count)); +} + +void ShortString::clear() noexcept { str.clear(); } + +void ShortString::swap(ShortString& other) noexcept { str.swap(other.str); } \ No newline at end of file diff --git a/src/atom/experiment/short_string.hpp b/src/atom/experiment/short_string.hpp new file mode 100644 index 00000000..64b477b9 --- /dev/null +++ b/src/atom/experiment/short_string.hpp @@ -0,0 +1,95 @@ +#include +#include + +class ShortString { +private: + static constexpr size_t MAX_LENGTH = + 15; ///< Maximum length of the short string + std::string str; ///< Actual string stored + +public: + /** + * @brief Default constructor for ShortString. + */ + ShortString() = default; + + /** + * @brief Constructor taking a std::string. + * @param s The input std::string. + */ + explicit ShortString(const std::string& s); + + /** + * @brief Constructor taking a std::string_view. + * @param s The input std::string_view. + */ + explicit ShortString(std::string_view s); + + /** + * @brief Constructor taking a C-style string. + * @param s The input C-style string. + */ + ShortString(const char* s); + + /** + * @brief Copy constructor. + * @param other The ShortString to copy from. + */ + ShortString(const ShortString& other); + + /** + * @brief Copy assignment operator. + * @param other The ShortString to assign from. + * @return Reference to the modified ShortString. + */ + ShortString& operator=(const ShortString& other); + + ShortString& operator=(const std::string& s); + + ShortString& operator=(const char* s); + + ShortString& operator=(std::string_view s); + + /** + * @brief Overloaded stream insertion operator for ShortString. + * @param os The output stream to write to. + * @param ss The ShortString to write. + * @return Reference to the output stream. + */ + friend std::ostream& operator<<(std::ostream& os, const ShortString& ss); + + /** + * @brief Overloaded addition operator for ShortString. + * @param other The ShortString to add. + * @return The result of concatenating two ShortStrings. + */ + ShortString operator+(const ShortString& other) const; + + ShortString& operator+=(const ShortString& other); + + ShortString& operator+=(std::string_view other); + + [[nodiscard]] bool operator==(const ShortString& other) const noexcept; + + [[nodiscard]] bool operator!=(const ShortString& other) const noexcept; + + [[nodiscard]] bool operator<(const ShortString& other) const noexcept; + + [[nodiscard]] bool operator>(const ShortString& other) const noexcept; + + [[nodiscard]] bool operator<=(const ShortString& other) const noexcept; + + [[nodiscard]] bool operator>=(const ShortString& other) const noexcept; + + [[nodiscard]] char& operator[](size_t index) noexcept; + + [[nodiscard]] const char& operator[](size_t index) const noexcept; + + [[nodiscard]] size_t length() const noexcept; + + ShortString substr(size_t pos = 0, size_t count = std::string::npos) const; + + void clear() noexcept; + + void swap(ShortString& other) noexcept; +}; \ No newline at end of file diff --git a/src/config/_pocket.hpp b/src/config/_pocket.hpp new file mode 100644 index 00000000..e69de29b diff --git a/src/config/_pybind.cpp b/src/config/_pybind.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/config/_script.hpp b/src/config/_script.hpp new file mode 100644 index 00000000..e69de29b From d02fd4e751450adf04fcc01dc7fac89b40331ed0 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 13 Apr 2024 04:51:54 +0800 Subject: [PATCH 08/28] update --- README.md | 9 + src/App.cpp | 27 +- src/LithiumApp.cpp | 4 +- .../algorithm/_component.cpp} | 0 .../algorithm/_component.hpp} | 0 .../algorithm/_pybind.cpp} | 0 src/atom/algorithm/_script.cpp | 28 + src/atom/algorithm/base.cpp | 8 +- src/atom/algorithm/base.hpp | 8 +- src/atom/driver/camera.cpp | 6 +- src/atom/experiment/ranges.hpp | 247 ++ src/atom/experiment/short_alloc.hpp | 213 +- src/atom/experiment/sstring.hpp | 97 +- src/atom/experiment/stack_vector.hpp | 98 +- src/atom/io/io.cpp | 42 +- src/atom/io/io.hpp | 13 + src/atom/log/loguru.cpp | 3772 +++++++++-------- src/atom/log/loguru.hpp | 2539 +++++------ src/atom/server/message_queue.hpp | 11 +- src/atom/system/_component.cpp | 54 +- src/atom/system/_component.hpp | 16 +- src/atom/system/_pybind.cpp | 169 + src/atom/system/_script.cpp | 182 +- src/atom/system/system.cpp | 161 +- src/atom/system/system.hpp | 41 +- src/atom/type/_script.cpp | 143 + src/atom/type/autotype.hpp | 158 - src/atom/type/pointer.hpp | 30 +- src/atom/utils/hash_util.cpp | 28 - src/atom/utils/hash_util.hpp | 5 - src/atom/utils/string.hpp | 16 +- src/atom/web/time.cpp | 4 +- src/carbon/command/bootstrap_stl.hpp | 2 +- src/carbon/command/boxed_cast_helper.hpp | 2 +- src/carbon/command/boxed_value.hpp | 3 +- src/carbon/command/dispatchkit.cpp | 1046 +++++ src/carbon/command/dispatchkit.hpp | 1005 +---- src/carbon/command/dynamic_object_detail.hpp | 2 +- src/carbon/command/proxy_functions.hpp | 3 - src/carbon/command/proxy_functions_detail.hpp | 2 +- src/carbon/command/register_function.hpp | 3 +- src/carbon/utils/json.hpp | 4 +- src/carbon/utils/json_wrap.hpp | 4 +- src/carbon/utils/utility.hpp | 4 +- src/config/_component.cpp | 28 +- src/config/_component.hpp | 23 +- src/config/_script.cpp | 201 + src/config/configor.cpp | 224 +- src/config/configor.hpp | 73 +- src/controller/AsyncSystemController.hpp | 6 +- src/debug/terminal.cpp | 489 +-- src/debug/terminal.hpp | 255 +- src/device/server/hydrogen.cpp | 4 +- src/launcher/faq.cpp | 56 +- src/launcher/faq.hpp | 27 +- src/script/custom/config.cpp | 98 +- src/script/custom/os.cpp | 42 +- src/script/custom/sys.cpp | 12 +- src/task/generator.cpp | 2 +- src/task/generator.hpp | 2 +- src/task/manager.cpp | 34 +- src/task/manager.hpp | 12 +- src/task/tick.cpp | 7 +- src/task/tick.hpp | 2 +- tests/atom/huffman.cpp | 83 - tests/config/configor.cpp | 125 + tools/CMakeLists.txt | 3 + tools/csv2json.cpp | 11 - tools/gui/sqmm.cpp | 248 ++ tools/ini2json.cpp | 11 - tools/json2ini.cpp | 11 - tools/json2toml.cpp | 11 - tools/json2xml.cpp | 11 - tools/toml2json.cpp | 11 - tools/xml2json.cpp | 11 - 75 files changed, 6757 insertions(+), 5585 deletions(-) rename src/{config/_pocket.hpp => atom/algorithm/_component.cpp} (100%) rename src/{config/_pybind.cpp => atom/algorithm/_component.hpp} (100%) rename src/{config/_script.hpp => atom/algorithm/_pybind.cpp} (100%) create mode 100644 src/atom/algorithm/_script.cpp create mode 100644 src/atom/experiment/ranges.hpp create mode 100644 src/atom/system/_pybind.cpp create mode 100644 src/atom/type/_script.cpp delete mode 100644 src/atom/type/autotype.hpp create mode 100644 src/carbon/command/dispatchkit.cpp create mode 100644 src/config/_script.cpp delete mode 100644 tests/atom/huffman.cpp create mode 100644 tests/config/configor.cpp create mode 100644 tools/gui/sqmm.cpp diff --git a/README.md b/README.md index 33f691a6..90e4a31b 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,10 @@ pacman -S mingw-w64-x86_64-libzip pacman -S mingw-w64-x86_64-zlib pacman -S mingw-w64-x86_64-fmt pacman -S mingw-w64-x86_64-libnova +pacman -S mingw-w64-x86_64-gsl + +# for test +pacman -S mingw-w64-x86_64-gtest ``` #### On Ubuntu or other similar Linux platforms (No INDI needed) @@ -204,6 +208,11 @@ pacman -S mingw-w64-x86_64-fmt pacman -S mingw-w64-x86_64-libnova # 如果想用make构建 pacman -S make # 注意添加对应的目录,否则会当场爆炸 + +pacman -S mingw-w64-x86_64-gsl + +# 测试用 +pacman -S mingw-w64-x86_64-gtest ``` #### Ubuntu/Debian/Other Linux diff --git a/src/App.cpp b/src/App.cpp index 2bb8c4ed..dec77db2 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -287,31 +287,8 @@ int main(int argc, char *argv[]) { Lithium::MyApp->SetConfig( {{"key", "config/terminal/enabled"}, {"value", true}}); - CommandManager manager; - - // 注册指令函数 - manager.registerCommand("ls", lsCommand); - manager.registerCommand("pwd", pwdCommand); - manager.registerCommand("mkdir", mkdirCommand); - manager.registerCommand("cp", cpCommand); - manager.registerCommand("system", systemCommand); - - clearTerminal(); - - // 打印终端头部信息 - printHeader(); - - while (true) - { - // 获取终端输入 - std::string input = getTerminalInput(manager); - - // 运行指令函数 - std::string result = manager.runCommand(input, ""); - - // 在终端上显示执行结果 - std::cout << result << std::endl; - } + ConsoleTerminal terminal; + terminal.run(); #endif diff --git a/src/LithiumApp.cpp b/src/LithiumApp.cpp index 42bcdc02..3ae538cf 100644 --- a/src/LithiumApp.cpp +++ b/src/LithiumApp.cpp @@ -159,8 +159,8 @@ void InitLithiumApp(int argc, char **argv) { // ScriptManager::createShared(GetPtr("MessageBus"))); AddPtr("lithium.device", DeviceManager::createShared( - GetPtr("lithium.bus"), - GetPtr("lithium.config"))); + GetPtr("lithium.bus").value(), + GetPtr("lithium.config").value())); AddPtr("lithium.device.hydrogen", HydrogenManager::createShared()); AddPtr("lithium.error.stack", std::make_shared()); diff --git a/src/config/_pocket.hpp b/src/atom/algorithm/_component.cpp similarity index 100% rename from src/config/_pocket.hpp rename to src/atom/algorithm/_component.cpp diff --git a/src/config/_pybind.cpp b/src/atom/algorithm/_component.hpp similarity index 100% rename from src/config/_pybind.cpp rename to src/atom/algorithm/_component.hpp diff --git a/src/config/_script.hpp b/src/atom/algorithm/_pybind.cpp similarity index 100% rename from src/config/_script.hpp rename to src/atom/algorithm/_pybind.cpp diff --git a/src/atom/algorithm/_script.cpp b/src/atom/algorithm/_script.cpp new file mode 100644 index 00000000..ef01b3b2 --- /dev/null +++ b/src/atom/algorithm/_script.cpp @@ -0,0 +1,28 @@ +#include "carbon/carbon.hpp" + +#include "base.hpp" +#include + +#include "atom/log/loguru.hpp" + +using namespace Atom::Algorithm; + +CARBON_MODULE_EXPORT { + Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { + try { + Carbon::ModulePtr m_module = std::make_shared(); + + m_module->add(Carbon::fun(&base16Encode), "base16encode"); + m_module->add(Carbon::fun(&base16Decode), "base16decode"); + m_module->add(Carbon::fun(&base32Encode), "base32encode"); + m_module->add(Carbon::fun(&base32Decode), "base32decode"); + + return m_module; + } catch (const std::bad_any_cast &e) { + LOG_F(ERROR, "Failed to load config manager"); + return nullptr; + } + } +} + + diff --git a/src/atom/algorithm/base.cpp b/src/atom/algorithm/base.cpp index 577eb4b1..822d0362 100644 --- a/src/atom/algorithm/base.cpp +++ b/src/atom/algorithm/base.cpp @@ -27,7 +27,7 @@ Description: A collection of algorithms for C++ #endif namespace Atom::Algorithm { -std::string encodeBase16(const std::vector &data) { +std::string base16Encode(const std::vector &data) { std::stringstream ss; ss << std::hex << std::uppercase << std::setfill('0'); @@ -38,7 +38,7 @@ std::string encodeBase16(const std::vector &data) { return ss.str(); } -std::vector decodeBase16(const std::string &data) { +std::vector base16Decode(const std::string &data) { std::vector result; for (size_t i = 0; i < data.length(); i += 2) { @@ -281,7 +281,7 @@ const std::string base85_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<" "=>?@^_`{|}~"; -std::string encodeBase85(const std::vector &data) { +std::string base85Encode(const std::vector &data) { std::string result; unsigned int value = 0; @@ -307,7 +307,7 @@ std::string encodeBase85(const std::vector &data) { return result; } -std::vector decodeBase85(const std::string &data) { +std::vector base85Decode(const std::string &data) { std::vector result; unsigned int value = 0; diff --git a/src/atom/algorithm/base.hpp b/src/atom/algorithm/base.hpp index 85bc98ed..63270efc 100644 --- a/src/atom/algorithm/base.hpp +++ b/src/atom/algorithm/base.hpp @@ -32,7 +32,7 @@ namespace Atom::Algorithm { * @return The Base16 encoded string. */ [[nodiscard("The result of base16Encode is not used.")]] std::string -encodeBase16(const std::vector &data); +base16Encode(const std::vector &data); /** * @brief Decodes a Base16 string into a vector of unsigned characters. @@ -47,7 +47,7 @@ encodeBase16(const std::vector &data); */ [[nodiscard( "The result of base16Decode is not used.")]] std::vector -decodeBase16(const std::string &data); +base16Decode(const std::string &data); /** * @brief Encodes a string to Base32 @@ -114,7 +114,7 @@ base64DecodeEnhance(const std::string &encoded_string); * @return The Base85 encoded string. */ [[nodiscard("The result of base85Encode is not used.")]] std::string -encodeBase85(const std::vector &data); +base85Encode(const std::vector &data); /** * @brief Decodes a Base85 string into a vector of unsigned characters. @@ -128,7 +128,7 @@ encodeBase85(const std::vector &data); */ [[nodiscard( "The result of base85Decode is not used.")]] std::vector -decodeBase85(const std::string &data); +base85Decode(const std::string &data); /** * @brief Encodes a vector of unsigned characters into a Base128 string. diff --git a/src/atom/driver/camera.cpp b/src/atom/driver/camera.cpp index f91c6d3a..257badc7 100644 --- a/src/atom/driver/camera.cpp +++ b/src/atom/driver/camera.cpp @@ -28,10 +28,10 @@ bool AtomCamera::initialize() { // Primary CCD Exposure registerVariable("CCD_EXPOSURE_VALUE", 1.0, "Duration (s)"); registerVariableRanges("CCD_EXPOSURE_VALUE", 0.01, 3600); - registerVariable("CCD_EXPOSURE_STATUS", false, "Status") + registerVariable("CCD_EXPOSURE_STATUS", false, "Status"); - // Primary CCD Abort - registerVariable("CCD_ABORT_EXPOSURE", false, "Abort"); + // Primary CCD Abort + registerVariable("CCD_ABORT_EXPOSURE", false, "Abort"); registerVariable("CCD_VIDEO_STATUS", false, "Status"); diff --git a/src/atom/experiment/ranges.hpp b/src/atom/experiment/ranges.hpp new file mode 100644 index 00000000..d70955fe --- /dev/null +++ b/src/atom/experiment/ranges.hpp @@ -0,0 +1,247 @@ +/* + * ranges.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-12 + +Description: Some ranges functions for C++20 + +**************************************************/ + +#ifndef ATOM_EXPERIMENT_RANGES_HPP +#define ATOM_EXPERIMENT_RANGES_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @brief Filters elements in a range satisfying a predicate and transforms them + * using a function. + * + * @tparam Range The type of the range. + * @tparam Pred The type of the predicate. + * @tparam Func The type of the function. + * @param range The input range. + * @param pred The predicate function. + * @param func The transformation function. + * @return The transformed range. + * + * @usage + * std::vector numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + * auto result = filter_and_transform( + * numbers, [](int x) { return x % 2 == 0; }, [](int x) { return x * 2; }); + * for (auto x : result) { + * std::cout << x << " "; + * } + */ +template +auto filter_and_transform(Range&& range, Pred&& pred, Func&& func) { + return std::forward(range) | + std::views::filter(std::forward(pred)) | + std::views::transform(std::forward(func)); +} + +/** + * @brief Finds an element in a range. + * + * @tparam Range The type of the range. + * @tparam T The type of the value to find. + * @param range The input range. + * @param value The value to find. + * @return An optional containing the found value, or nullopt if not found. + * + * @usage + * std::vector numbers = {1, 2, 3, 4, 5}; + * auto result = find_element(numbers, 3); + * if (result) { + * std::cout << "Found: " << *result << std::endl; + * } else { + * std::cout << "Element not found" << std::endl; + * } + */ +template +auto find_element(Range&& range, const T& value) { + auto it = std::ranges::find(std::forward(range), value); + return it != std::ranges::end(range) + ? std::optional>{*it} + : std::nullopt; +} + +/** + * @brief Groups elements in a range by a key and aggregates values using an + * aggregator function. + * + * @tparam Range The type of the range. + * @tparam KeySelector The type of the key selector function. + * @tparam Aggregator The type of the aggregator function. + * @param range The input range. + * @param key_selector The function to extract keys from elements. + * @param aggregator The function to aggregate values. + * @return A map containing grouped and aggregated results. + * + * @usage + * std::vector> data = {{"apple", 2}, + * {"banana", 3}, + * {"apple", 1}, + * {"cherry", 4}, + * {"banana", 1}}; + * auto fruit_counts = group_and_aggregate( + * data, [](const auto& pair) { return pair.first; }, + * [](const auto& pair) { return pair.second; }); + * for (const auto& [fruit, count] : fruit_counts) { + * std::cout << fruit << ": " << count << std::endl; + * } + */ +template +auto group_and_aggregate(Range&& range, KeySelector&& key_selector, + Aggregator&& aggregator) { + using Key = std::invoke_result_t>; + using Value = + std::invoke_result_t>; + + std::map result; + for (auto&& item : std::forward(range)) { + Key key = std::invoke(std::forward(key_selector), item); + Value value = std::invoke(std::forward(aggregator), item); + result[key] += value; + } + return result; +} + +/** + * @brief Drops the first n elements from a range. + * + * @tparam Range The type of the range. + * @param range The input range. + * @param n The number of elements to drop. + * @return The range with the first n elements dropped. + * + * @usage + * auto remaining_numbers = drop(numbers, 3); + * for (auto x : remaining_numbers) { + * std::cout << x << " "; + * } + * std::cout << std::endl; + */ +template +auto drop(Range&& range, std::ranges::range_difference_t n) { + return std::forward(range) | std::views::drop(n); +} + +/** + * @brief Takes the first n elements from a range. + * + * @tparam Range The type of the range. + * @param range The input range. + * @param n The number of elements to take. + * @return The range with the first n elements taken. + * + * @usage + * auto first_three = take(numbers, 3); + * for (auto x : first_three) { + * std::cout << x << " "; + * } + * std::cout << std::endl; + */ +template +auto take(Range&& range, std::ranges::range_difference_t n) { + return std::forward(range) | std::views::take(n); +} + +/** + * @brief Takes elements from a range while a predicate is true. + * + * @tparam Range The type of the range. + * @tparam Pred The type of the predicate function. + * @param range The input range. + * @param pred The predicate function. + * @return The range with elements taken while the predicate is true. + * + * @usage + * auto less_than_six = take_while(numbers, [](int x) { return x < 6; }); + * for (auto x : less_than_six) { + * std::cout << x << " "; + * } + * std::cout << std::endl; + */ +template +auto take_while(Range&& range, Pred&& pred) { + return std::forward(range) | + std::views::take_while(std::forward(pred)); +} + +/** + * @brief Drops elements from a range while a predicate is true. + * + * @tparam Range The type of the range. + * @tparam Pred The type of the predicate function. + * @param range The input range. + * @param pred The predicate function. + * @return The range with elements dropped while the predicate is true. + * + * @usage + * auto more_than_two = drop_while(numbers, [](int x) { return x <= 2; }); + * for (auto x : more_than_two) { + * std::cout << x << " "; + * } + * std::cout << std::endl; + */ +template +auto drop_while(Range&& range, Pred&& pred) { + return std::forward(range) | + std::views::drop_while(std::forward(pred)); +} + +/** + * @brief Reverses the elements in a range. + * + * @tparam Range The type of the range. + * @param range The input range. + * @return The reversed range. + * + * @usage + * auto reversed_numbers = reverse(numbers); + * for (auto x : reversed_numbers) { + * std::cout << x << " "; + * } + * std::cout << std::endl; + */ +template +auto reverse(Range&& range) { + return std::forward(range) | std::views::reverse; +} + +/** + * @brief Accumulates the elements in a range using a binary operation. + * + * @tparam Range The type of the range. + * @tparam T The type of the initial value. + * @tparam BinaryOp The type of the binary operation function. + * @param range The input range. + * @param init The initial value for accumulation. + * @param op The binary operation function. + * @return The result of the accumulation. + * + * @usage + * auto sum = accumulate(numbers, 0, std::plus<>{}); + * std::cout << "Sum: " << sum << std::endl; + */ +template +auto accumulate(Range&& range, T init, BinaryOp&& op) { + return std::accumulate(std::begin(range), std::end(range), std::move(init), + std::forward(op)); +} + +#endif \ No newline at end of file diff --git a/src/atom/experiment/short_alloc.hpp b/src/atom/experiment/short_alloc.hpp index 79072dc9..340bfc12 100644 --- a/src/atom/experiment/short_alloc.hpp +++ b/src/atom/experiment/short_alloc.hpp @@ -18,116 +18,206 @@ Description: Short Alloc from Howard Hinnant #include #include +/** + * @brief A fixed-size memory arena for allocating memory with aligned + * addresses. + * + * @tparam N The size of the arena buffer. + * @tparam alignment The alignment requirement for memory allocation. + */ template class arena { - alignas(alignment) char buf_[N]; - char *ptr_; + alignas(alignment) char buf_[N]; /**< The buffer for memory allocation. */ + char *ptr_; /**< Pointer to the next available memory location. */ public: - ~arena() { ptr_ = nullptr; } - arena() noexcept : ptr_(buf_) {} - arena(const arena &) = delete; - arena &operator=(const arena &) = delete; - + ~arena() { ptr_ = nullptr; } /**< Destructor. */ + arena() noexcept : ptr_(buf_) {} /**< Default constructor. */ + arena(const arena &) = delete; /**< Copy constructor (deleted). */ + arena &operator=(const arena &) = + delete; /**< Copy assignment operator (deleted). */ + + /** + * @brief Allocates memory from the arena with the specified alignment. + * + * @tparam ReqAlign The required alignment for the allocated memory. + * @param n The number of bytes to allocate. + * @return Pointer to the allocated memory. + */ template char *allocate(std::size_t n); + + /** + * @brief Deallocates memory previously allocated from the arena. + * + * @param p Pointer to the memory block to deallocate. + * @param n The number of bytes to deallocate. + */ void deallocate(char *p, std::size_t n) noexcept; + /** + * @brief Gets the total size of the arena buffer. + * + * @return The size of the arena buffer. + */ static constexpr std::size_t size() noexcept { return N; } + + /** + * @brief Gets the amount of memory used in the arena. + * + * @return The number of bytes used in the arena. + */ std::size_t used() const noexcept { return static_cast(ptr_ - buf_); } + + /** + * @brief Resets the arena, making all allocated memory available for reuse. + */ void reset() noexcept { ptr_ = buf_; } private: + /** + * @brief Rounds up the size to the nearest multiple of the alignment. + * + * @param n The size to round up. + * @return The rounded-up size. + */ static constexpr std::size_t align_up(std::size_t n) noexcept { return (n + (alignment - 1)) & ~(alignment - 1); } + /** + * @brief Checks if a pointer is within the arena buffer. + * + * @param p Pointer to check. + * @return True if the pointer is within the arena buffer, otherwise false. + */ bool pointer_in_buffer(char *p) noexcept { return buf_ <= p && p <= buf_ + N; } }; -template -template -char *arena::allocate(std::size_t n) { - static_assert(ReqAlign <= alignment, - "alignment is too small for this arena"); - assert(pointer_in_buffer(ptr_) && "short_alloc has outlived arena"); - auto const aligned_n = align_up(n); - if (static_cast(buf_ + N - ptr_) >= aligned_n) { - char *r = ptr_; - ptr_ += aligned_n; - return r; - } - - static_assert( - alignment <= alignof(std::max_align_t), - "you've chosen an " - "alignment that is larger than alignof(std::max_align_t), and " - "cannot be guaranteed by normal operator new"); - return static_cast(::operator new(n)); -} - -template -void arena::deallocate(char *p, std::size_t n) noexcept { - assert(pointer_in_buffer(ptr_) && "short_alloc has outlived arena"); - if (pointer_in_buffer(p)) { - n = align_up(n); - if (p + n == ptr_) { - ptr_ = p; - } - } else { - ::operator delete(p); - } -} - +/** + * @brief A memory allocator adapter for using the arena as a memory pool. + * + * @tparam T The type of objects to allocate. + * @tparam N The size of the arena buffer. + * @tparam Align The alignment requirement for memory allocation. + */ template class short_alloc { public: - using value_type = T; - static auto constexpr alignment = Align; - static auto constexpr size = N; - using arena_type = arena; + using value_type = T; /**< The type of objects to allocate. */ + static auto constexpr alignment = + Align; /**< The alignment requirement for memory allocation. */ + static auto constexpr size = N; /**< The size of the arena buffer. */ + using arena_type = + arena; /**< The type of the underlying arena. */ private: - arena_type &a_; + arena_type &a_; /**< Reference to the underlying arena. */ public: - short_alloc(const short_alloc &) = default; - short_alloc &operator=(const short_alloc &) = delete; - + short_alloc(const short_alloc &) = + default; /**< Copy constructor (defaulted). */ + short_alloc &operator=(const short_alloc &) = + delete; /**< Copy assignment operator (deleted). */ + + /** + * @brief Constructs the short_alloc with the specified arena. + * + * @param a Reference to the arena to use for allocation. + */ explicit short_alloc(arena_type &a) noexcept : a_(a) { static_assert(size % alignment == 0, "size N needs to be a multiple of alignment Align"); } + + /** + * @brief Constructs the short_alloc with the specified arena of a different + * type. + * + * @tparam U The type of objects allocated by the other short_alloc. + * @param a Reference to the other short_alloc's arena. + */ template explicit short_alloc(const short_alloc &a) noexcept : a_(a.a_) {} - template - struct rebind { - using other = short_alloc<_Up, N, alignment>; - }; - + /** + * @brief Allocates memory for an object of type T. + * + * @param n Number of objects to allocate memory for. + * @return Pointer to the allocated memory. + */ T *allocate(std::size_t n) { return reinterpret_cast( a_.template allocate(n * sizeof(T))); } + + /** + * @brief Deallocates memory previously allocated for objects of type T. + * + * @param p Pointer to the memory block to deallocate. + * @param n Number of objects to deallocate memory for. + */ void deallocate(T *p, std::size_t n) noexcept { a_.deallocate(reinterpret_cast(p), n * sizeof(T)); } + /** + * @brief Nested type alias for rebind. + * + * @tparam _Up The new type to rebind to. + */ + template + struct rebind { + using other = short_alloc<_Up, N, alignment>; + }; + + /** + * @brief Equality comparison operator. + * + * @tparam T1 The type of objects allocated by the left short_alloc. + * @tparam N1 The size of the arena buffer for the left short_alloc. + * @tparam A1 The alignment requirement for the left short_alloc. + * @tparam U The type of objects allocated by the right short_alloc. + * @tparam M The size of the arena buffer for the right short_alloc. + * @tparam A2 The alignment requirement for the right short_alloc. + * @param x The left short_alloc. + * @param y The right short_alloc. + * @return True if the short_allocs are equal, otherwise false. + */ template friend bool operator==(const short_alloc &x, const short_alloc &y) noexcept; - template + /** + * @brief Friendship declaration for the rebind struct. + * + * @tparam U The type of objects allocated by the other short_alloc. + * @tparam M The size of the arena buffer for the other short_alloc. + * @tparam A2 The alignment requirement for the other short_alloc. + */ + template friend class short_alloc; }; +/** + * @brief Equality comparison operator for short_alloc. + * + * @tparam T The type of objects allocated by the left short_alloc. + * @tparam N The size of the arena buffer for the left short_alloc. + * @tparam A1 The alignment requirement for the left short_alloc. + * @tparam U The type of objects allocated by the right short_alloc. + * @tparam M The size of the arena buffer for the right short_alloc. + * @tparam A2 The alignment requirement for the right short_alloc. + * @param x The left short_alloc. + * @param y The right short_alloc. + * @return True if the short_allocs are equal, otherwise false. + */ template inline bool operator==(const short_alloc &x, @@ -135,6 +225,19 @@ inline bool operator==(const short_alloc &x, return N == M && A1 == A2 && &x.a_ == &y.a_; } +/** + * @brief Inequality comparison operator for short_alloc. + * + * @tparam T The type of objects allocated by the left short_alloc. + * @tparam N The size of the arena buffer for the left short_alloc. + * @tparam A1 The alignment requirement for the left short_alloc. + * @tparam U The type of objects allocated by the right short_alloc. + * @tparam M The size of the arena buffer for the right short_alloc. + * @tparam A2 The alignment requirement for the right short_alloc. + * @param x The left short_alloc. + * @param y The right short_alloc. + * @return True if the short_allocs are not equal, otherwise false. + */ template inline bool operator!=(const short_alloc &x, diff --git a/src/atom/experiment/sstring.hpp b/src/atom/experiment/sstring.hpp index 5ec42eb5..d6c691e5 100644 --- a/src/atom/experiment/sstring.hpp +++ b/src/atom/experiment/sstring.hpp @@ -25,61 +25,152 @@ concept Stringable = std::is_convertible_v || std::is_convertible_v || std::is_convertible_v; -struct Static_String { +class Static_String { +public: + /** + * @brief Constructs a Static_String object from a string literal. + * + * @tparam N Size of the string literal. + * @param str The string literal. + */ template constexpr Static_String(const char (&str)[N]) noexcept : m_size(N - 1), data(str) {} + /** + * @brief Gets the size of the Static_String object. + * + * @return Size of the Static_String object. + */ constexpr size_t size() const noexcept { return m_size; } + /** + * @brief Gets a pointer to the C-style string stored in the Static_String + * object. + * + * @return Pointer to the C-style string. + */ constexpr const char *c_str() const noexcept { return data; } + /** + * @brief Gets an iterator to the beginning of the Static_String object. + * + * @return Iterator to the beginning of the Static_String object. + */ constexpr const char *begin() const noexcept { return data; } + /** + * @brief Gets an iterator to the end of the Static_String object. + * + * @return Iterator to the end of the Static_String object. + */ constexpr const char *end() const noexcept { return data + m_size; } + /** + * @brief Checks if the Static_String object is equal to the provided + * std::string_view. + * + * @param other The std::string_view to compare with. + * @return true if the Static_String object is equal to the + * std::string_view, otherwise false. + */ constexpr bool operator==(const std::string_view &other) const noexcept { return std::string_view(data, m_size) == other; } + /** + * @brief Checks if the Static_String object is equal to the provided + * convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is equal to the convertible + * type, otherwise false. + */ template requires Stringable constexpr bool operator==(T &&other) const noexcept { return std::string_view(data, m_size) == std::forward(other); } + /** + * @brief Checks if the Static_String object is not equal to the provided + * convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is not equal to the convertible + * type, otherwise false. + */ template requires Stringable constexpr bool operator!=(T &&other) const noexcept { return !(*this == std::forward(other)); } + /** + * @brief Checks if the Static_String object is less than the provided + * convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is less than the convertible + * type, otherwise false. + */ template requires Stringable constexpr bool operator<(T &&other) const noexcept { return std::string_view(data, m_size) < std::forward(other); } + /** + * @brief Checks if the Static_String object is less than or equal to the + * provided convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is less than or equal to the + * convertible type, otherwise false. + */ template requires Stringable constexpr bool operator<=(T &&other) const noexcept { return std::string_view(data, m_size) <= std::forward(other); } + /** + * @brief Checks if the Static_String object is greater than the provided + * convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is greater than the convertible + * type, otherwise false. + */ template requires Stringable constexpr bool operator>(T &&other) const noexcept { return std::string_view(data, m_size) > std::forward(other); } + /** + * @brief Checks if the Static_String object is greater than or equal to the + * provided convertible type. + * + * @tparam T The convertible type. + * @param other The convertible type to compare with. + * @return true if the Static_String object is greater than or equal to the + * convertible type, otherwise false. + */ template requires Stringable constexpr bool operator>=(T &&other) const noexcept { return std::string_view(data, m_size) >= std::forward(other); } - const size_t m_size; - const char *data; +private: + const size_t m_size; /**< Size of the Static_String object. */ + const char *data; /**< Pointer to the C-style string data. */ }; #endif diff --git a/src/atom/experiment/stack_vector.hpp b/src/atom/experiment/stack_vector.hpp index 5df2a297..17d7f7e7 100644 --- a/src/atom/experiment/stack_vector.hpp +++ b/src/atom/experiment/stack_vector.hpp @@ -20,9 +20,25 @@ Description: A simple stack vector implementation #include #include +/** + * @brief A stack-allocated vector that stores elements of type T with a maximum + * capacity. + * + * @tparam T The type of elements stored in the Stack_Vector. + * @tparam MaxSize The maximum capacity of the Stack_Vector. + */ template struct Stack_Vector { + /** + * @brief Default constructor. + */ Stack_Vector() noexcept = default; + + /** + * @brief Copy constructor. + * + * @param other The Stack_Vector to copy from. + */ Stack_Vector(const Stack_Vector &other) { m_size = other.m_size; for (std::size_t i = 0; i < m_size; ++i) { @@ -30,45 +46,94 @@ struct Stack_Vector { } } + /** + * @brief Move constructor. + * + * @param other The Stack_Vector to move from. + */ Stack_Vector(Stack_Vector &&other) noexcept : data{other.data}, m_size{other.m_size} { other.m_size = 0; } + /** + * @brief Destructor. + */ ~Stack_Vector() noexcept(std::is_nothrow_destructible_v) { for (std::size_t pos = 0; pos < m_size; ++pos) { (*this)[pos].~T(); } } - constexpr static auto aligned_size = - sizeof(T) + (sizeof(T) & std::alignment_of_v) > 0 - ? std::alignment_of_v - : 0; - - alignas(std::alignment_of_v) char data[aligned_size * MaxSize]; - + /** + * @brief Operator to access elements by index. + * + * @param idx The index of the element. + * @return Reference to the element at the specified index. + */ [[nodiscard]] T &operator[](const std::size_t idx) noexcept { return *reinterpret_cast(&data + aligned_size * idx); } + /** + * @brief Operator to access elements by index (const version). + * + * @param idx The index of the element. + * @return Const reference to the element at the specified index. + */ [[nodiscard]] const T &operator[](const std::size_t idx) const noexcept { return *reinterpret_cast(&data + aligned_size * idx); } + /** + * @brief Adds a new element to the end of the Stack_Vector. + * + * @tparam Param The parameter types for constructing the new element. + * @param param The arguments to forward to the constructor of the new + * element. + * @return Reference to the newly added element. + */ template T &emplace_back(Param &&...param) { auto *p = new (&(*this)[m_size++]) T(std::forward(param)...); return *p; }; + /** + * @brief Gets the number of elements stored in the Stack_Vector. + * + * @return The number of elements. + */ auto size() const noexcept { return m_size; }; + + /** + * @brief Gets the maximum capacity of the Stack_Vector. + * + * @return The maximum capacity. + */ auto capacity() const noexcept { return MaxSize; }; + + /** + * @brief Removes the last element from the Stack_Vector. + */ void pop_back() noexcept(std::is_nothrow_destructible_v) { (*this)[--m_size].~T(); } + + /** + * @brief Resizes the Stack_Vector to contain the specified number of + * elements. + * + * @param new_size The new size of the Stack_Vector. + */ void resize(std::size_t new_size) { m_size = new_size; } + /** + * @brief Copy assignment operator. + * + * @param other The Stack_Vector to copy from. + * @return Reference to the modified Stack_Vector. + */ Stack_Vector &operator=(const Stack_Vector &other) { if (this != &other) { for (std::size_t i = 0; i < m_size; ++i) { @@ -82,6 +147,12 @@ struct Stack_Vector { return *this; } + /** + * @brief Move assignment operator. + * + * @param other The Stack_Vector to move from. + * @return Reference to the modified Stack_Vector. + */ Stack_Vector &operator=(Stack_Vector &&other) noexcept { if (this != &other) { for (std::size_t i = 0; i < m_size; ++i) { @@ -93,7 +164,18 @@ struct Stack_Vector { return *this; } - std::size_t m_size{0}; + /** + * @brief Size of each aligned element in the Stack_Vector. + */ + constexpr static auto aligned_size = + sizeof(T) + (sizeof(T) & std::alignment_of_v) > 0 + ? std::alignment_of_v + : 0; + + std::size_t m_size{ + 0}; /**< Current number of elements in the Stack_Vector. */ + alignas(std::alignment_of_v) char data + [aligned_size * MaxSize]; /**< Storage for the elements. */ }; #endif \ No newline at end of file diff --git a/src/atom/io/io.cpp b/src/atom/io/io.cpp index 6ba5dd92..0afd0eff 100644 --- a/src/atom/io/io.cpp +++ b/src/atom/io/io.cpp @@ -77,7 +77,7 @@ void createDirectory(const std::string &date, const std::string &rootDir) { return; } - std::vector tokens = Atom::Utils::splitString(date, '/'); + auto tokens = Atom::Utils::splitString(date, '/'); // Create directories fs::path currentDir = rootDir; @@ -86,8 +86,8 @@ void createDirectory(const std::string &date, const std::string &rootDir) { if (!fs::is_directory(currentDir)) { if (!fs::create_directory(currentDir)) { - LOG_F(ERROR, "Error: Failed to create directory - {}" - , currentDir.string()); + LOG_F(ERROR, "Error: Failed to create directory - {}", + currentDir.string()); return; } } else { @@ -460,4 +460,40 @@ std::vector checkFileTypeInFolder(const std::string &folderPath, return files; } + +bool isExecutableFile(const std::string &fileName, const std::string &fileExt) { +#ifdef _WIN32 + fs::path filePath = fileName + fileExt; +#else + fs::path filePath = fileName; +#endif + + DLOG_F(INFO, "Checking file '{}'.", filePath.string()); + + if (!fs::exists(filePath)) { + DLOG_F(WARNING, "The file '{}' does not exist.", filePath.string()); + return false; + } + +#ifdef _WIN32 + if (!fs::is_regular_file(filePath) || + !(GetFileAttributesA(filePath.generic_string().c_str()) & + FILE_ATTRIBUTE_DIRECTORY)) { + DLOG_F(WARNING, + "The file '{}' is not a regular file or is not executable.", + filePath.string()); + return false; + } +#else + if (!fs::is_regular_file(filePath) || access(filePath.c_str(), X_OK) != 0) { + DLOG_F(WARNING, + "The file '{}' is not a regular file or is not executable.", + filePath.string()); + return false; + } +#endif + + DLOG_F(INFO, "The file '{}' exists and is executable.", filePath.string()); + return true; +} } // namespace Atom::IO diff --git a/src/atom/io/io.hpp b/src/atom/io/io.hpp index ab6393dd..c207f289 100644 --- a/src/atom/io/io.hpp +++ b/src/atom/io/io.hpp @@ -345,6 +345,19 @@ enum class FileOption { Path, Name }; [[nodiscard]] std::vector checkFileTypeInFolder( const std::string &folderPath, const std::string &fileType, FileOption fileOption); + +/** + * @brief Check whether the specified file exists. + * 检查指定文件是否存在 + * + * @param fileName The name of the file. 文件名称 + * @param fileExt The extension of the file. 文件扩展名 + * @return true if the file exists. + * 如果文件存在,则返回 true + * @return false if the file does not exist or an error occurred. + * 如果文件不存在或发生错误,则返回 false + */ +bool isExecutableFile(const std::string &fileName, const std::string &fileExt); } // namespace Atom::IO #endif diff --git a/src/atom/log/loguru.cpp b/src/atom/log/loguru.cpp index 997d0c61..c285e7a6 100644 --- a/src/atom/log/loguru.cpp +++ b/src/atom/log/loguru.cpp @@ -17,7 +17,8 @@ #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" #elif defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4365) // conversion from 'X' to 'Y', signed/unsigned mismatch +#pragma warning( \ + disable : 4365) // conversion from 'X' to 'Y', signed/unsigned mismatch #endif #include "loguru.hpp" @@ -25,7 +26,8 @@ #ifndef LOGURU_HAS_BEEN_IMPLEMENTED #define LOGURU_HAS_BEEN_IMPLEMENTED -#define LOGURU_PREAMBLE_WIDTH (53 + LOGURU_THREADNAME_WIDTH + LOGURU_FILENAME_WIDTH) +#define LOGURU_PREAMBLE_WIDTH \ + (53 + LOGURU_THREADNAME_WIDTH + LOGURU_FILENAME_WIDTH) #undef min #undef max @@ -51,209 +53,212 @@ #endif #ifdef _WIN32 - #include +#include - #define localtime_r(a, b) localtime_s(b, a) // No localtime_r with MSVC, but arguments are swapped for localtime_s +#define localtime_r(a, b) \ + localtime_s(b, a) // No localtime_r with MSVC, but arguments are swapped + // for localtime_s #else - #include - #include // mkdir - #include // STDERR_FILENO +#include +#include // mkdir +#include // STDERR_FILENO #endif #ifdef __linux__ - #include // PATH_MAX +#include // PATH_MAX #elif !defined(_WIN32) - #include // PATH_MAX +#include // PATH_MAX #endif #ifndef PATH_MAX - #define PATH_MAX 1024 +#define PATH_MAX 1024 #endif #ifdef __APPLE__ - #include "TargetConditionals.h" +#include "TargetConditionals.h" #endif // TODO: use defined(_POSIX_VERSION) for some of these things? #if defined(_WIN32) || defined(__CYGWIN__) - #define LOGURU_PTHREADS 0 - #define LOGURU_WINTHREADS 1 - #ifndef LOGURU_STACKTRACES - #define LOGURU_STACKTRACES 0 - #endif +#define LOGURU_PTHREADS 0 +#define LOGURU_WINTHREADS 1 +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 0 +#endif +#else +#define LOGURU_PTHREADS 1 +#define LOGURU_WINTHREADS 0 +#ifdef __GLIBC__ +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 1 +#endif #else - #define LOGURU_PTHREADS 1 - #define LOGURU_WINTHREADS 0 - #ifdef __GLIBC__ - #ifndef LOGURU_STACKTRACES - #define LOGURU_STACKTRACES 1 - #endif - #else - #ifndef LOGURU_STACKTRACES - #define LOGURU_STACKTRACES 0 - #endif - #endif +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 0 +#endif +#endif #endif #if LOGURU_STACKTRACES - #include // for __cxa_demangle - #include // for dladdr - #include // for backtrace -#endif // LOGURU_STACKTRACES +#ifdef _WIN32 +#include +#include +#pragma comment(lib, "Dbghelp.lib") +#else +#include +#include +#include +#endif +#endif // LOGURU_STACKTRACES #if LOGURU_PTHREADS - #include - #if defined(__FreeBSD__) - #include - #include - #elif defined(__OpenBSD__) - #include - #endif - - #ifdef __linux__ - /* On Linux, the default thread name is the same as the name of the binary. - Additionally, all new threads inherit the name of the thread it got forked from. - For this reason, Loguru use the pthread Thread Local Storage - for storing thread names on Linux. */ - #ifndef LOGURU_PTLS_NAMES - #define LOGURU_PTLS_NAMES 1 - #endif - #endif +#include +#if defined(__FreeBSD__) +#include +#include +#elif defined(__OpenBSD__) +#include +#endif + +#ifdef __linux__ +/* On Linux, the default thread name is the same as the name of the binary. + Additionally, all new threads inherit the name of the thread it got forked + from. For this reason, Loguru use the pthread Thread Local Storage for + storing thread names on Linux. */ +#ifndef LOGURU_PTLS_NAMES +#define LOGURU_PTLS_NAMES 1 +#endif +#endif #endif #if LOGURU_WINTHREADS - #ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0502 - #endif - #define WIN32_LEAN_AND_MEAN - #include - #include +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0502 +#endif +#define WIN32_LEAN_AND_MEAN +#include +#include #endif #ifndef LOGURU_PTLS_NAMES - #define LOGURU_PTLS_NAMES 0 +#define LOGURU_PTLS_NAMES 0 #endif LOGURU_ANONYMOUS_NAMESPACE_BEGIN -namespace loguru -{ - using namespace std::chrono; +namespace loguru { +using namespace std::chrono; #if LOGURU_WITH_FILEABS - struct FileAbs - { - char path[PATH_MAX]; - char mode_str[4]; - Verbosity verbosity; - struct stat st; - FILE* fp; - bool is_reopening = false; // to prevent recursive call in file_reopen. - decltype(steady_clock::now()) last_check_time = steady_clock::now(); - }; +struct FileAbs { + char path[PATH_MAX]; + char mode_str[4]; + Verbosity verbosity; + struct stat st; + FILE* fp; + bool is_reopening = false; // to prevent recursive call in file_reopen. + decltype(steady_clock::now()) last_check_time = steady_clock::now(); +}; +#else +typedef FILE* FileAbs; +#endif + +struct Callback { + std::string id; + log_handler_t callback; + void* user_data; + Verbosity verbosity; // Does not change! + close_handler_t close; + flush_handler_t flush; + unsigned indentation; +}; + +using CallbackVec = std::vector; + +using StringPair = std::pair; +using StringPairList = std::vector; + +const auto s_start_time = steady_clock::now(); + +Verbosity g_stderr_verbosity = Verbosity_0; +bool g_colorlogtostderr = true; +unsigned g_flush_interval_ms = 0; +bool g_preamble_header = true; +bool g_preamble = true; + +Verbosity g_internal_verbosity = Verbosity_0; + +// Preamble details +bool g_preamble_date = true; +bool g_preamble_time = true; +bool g_preamble_uptime = true; +bool g_preamble_thread = true; +bool g_preamble_file = true; +bool g_preamble_verbose = true; +bool g_preamble_pipe = true; + +static std::recursive_mutex s_mutex; +static Verbosity s_max_out_verbosity = Verbosity_OFF; +static std::string s_argv0_filename; +static std::string s_arguments; +static char s_current_dir[PATH_MAX]; +static CallbackVec s_callbacks; +static fatal_handler_t s_fatal_handler = nullptr; +static verbosity_to_name_t s_verbosity_to_name_callback = nullptr; +static name_to_verbosity_t s_name_to_verbosity_callback = nullptr; +static StringPairList s_user_stack_cleanups; +static bool s_strip_file_path = true; +static std::atomic s_stderr_indentation{0}; + +// For periodic flushing: +static std::thread* s_flush_thread = nullptr; +static bool s_needs_flushing = false; + +static SignalOptions s_signal_options = SignalOptions::none(); + +static const bool s_terminal_has_color = []() { +#ifdef _WIN32 +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + if (hOut != INVALID_HANDLE_VALUE) { + DWORD dwMode = 0; + GetConsoleMode(hOut, &dwMode); + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + return SetConsoleMode(hOut, dwMode) != 0; + } + return false; #else - typedef FILE* FileAbs; + if (!isatty(STDERR_FILENO)) { + return false; + } + if (const char* term = getenv("TERM")) { + return 0 == strcmp(term, "cygwin") || 0 == strcmp(term, "linux") || + 0 == strcmp(term, "rxvt-unicode-256color") || + 0 == strcmp(term, "screen") || + 0 == strcmp(term, "screen-256color") || + 0 == strcmp(term, "screen.xterm-256color") || + 0 == strcmp(term, "tmux-256color") || + 0 == strcmp(term, "xterm") || + 0 == strcmp(term, "xterm-256color") || + 0 == strcmp(term, "xterm-termite") || + 0 == strcmp(term, "xterm-color"); + } else { + return false; + } #endif +}(); - struct Callback - { - std::string id; - log_handler_t callback; - void* user_data; - Verbosity verbosity; // Does not change! - close_handler_t close; - flush_handler_t flush; - unsigned indentation; - }; - - using CallbackVec = std::vector; - - using StringPair = std::pair; - using StringPairList = std::vector; - - const auto s_start_time = steady_clock::now(); - - Verbosity g_stderr_verbosity = Verbosity_0; - bool g_colorlogtostderr = true; - unsigned g_flush_interval_ms = 0; - bool g_preamble_header = true; - bool g_preamble = true; - - Verbosity g_internal_verbosity = Verbosity_0; - - // Preamble details - bool g_preamble_date = true; - bool g_preamble_time = true; - bool g_preamble_uptime = true; - bool g_preamble_thread = true; - bool g_preamble_file = true; - bool g_preamble_verbose = true; - bool g_preamble_pipe = true; - - static std::recursive_mutex s_mutex; - static Verbosity s_max_out_verbosity = Verbosity_OFF; - static std::string s_argv0_filename; - static std::string s_arguments; - static char s_current_dir[PATH_MAX]; - static CallbackVec s_callbacks; - static fatal_handler_t s_fatal_handler = nullptr; - static verbosity_to_name_t s_verbosity_to_name_callback = nullptr; - static name_to_verbosity_t s_name_to_verbosity_callback = nullptr; - static StringPairList s_user_stack_cleanups; - static bool s_strip_file_path = true; - static std::atomic s_stderr_indentation { 0 }; - - // For periodic flushing: - static std::thread* s_flush_thread = nullptr; - static bool s_needs_flushing = false; - - static SignalOptions s_signal_options = SignalOptions::none(); - - static const bool s_terminal_has_color = [](){ - #ifdef _WIN32 - #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING - #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 - #endif - - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (hOut != INVALID_HANDLE_VALUE) { - DWORD dwMode = 0; - GetConsoleMode(hOut, &dwMode); - dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - return SetConsoleMode(hOut, dwMode) != 0; - } - return false; - #else - if (!isatty(STDERR_FILENO)) { - return false; - } - if (const char* term = getenv("TERM")) { - return 0 == strcmp(term, "cygwin") - || 0 == strcmp(term, "linux") - || 0 == strcmp(term, "rxvt-unicode-256color") - || 0 == strcmp(term, "screen") - || 0 == strcmp(term, "screen-256color") - || 0 == strcmp(term, "screen.xterm-256color") - || 0 == strcmp(term, "tmux-256color") - || 0 == strcmp(term, "xterm") - || 0 == strcmp(term, "xterm-256color") - || 0 == strcmp(term, "xterm-termite") - || 0 == strcmp(term, "xterm-color"); - } else { - return false; - } - #endif - }(); - - static void print_preamble_header(char* out_buff, size_t out_buff_size); - - // ------------------------------------------------------------------------------ - // Colors - - bool terminal_has_color() { return s_terminal_has_color; } - - // Colors +static void print_preamble_header(char* out_buff, size_t out_buff_size); + +// ------------------------------------------------------------------------------ +// Colors + +bool terminal_has_color() { return s_terminal_has_color; } + +// Colors #ifdef _WIN32 #define VTSEQ(ID) ("\x1b[1;" #ID "m") @@ -261,1633 +266,1698 @@ namespace loguru #define VTSEQ(ID) ("\x1b[" #ID "m") #endif - const char* terminal_black() { return s_terminal_has_color ? VTSEQ(30) : ""; } - const char* terminal_red() { return s_terminal_has_color ? VTSEQ(31) : ""; } - const char* terminal_green() { return s_terminal_has_color ? VTSEQ(32) : ""; } - const char* terminal_yellow() { return s_terminal_has_color ? VTSEQ(33) : ""; } - const char* terminal_blue() { return s_terminal_has_color ? VTSEQ(34) : ""; } - const char* terminal_purple() { return s_terminal_has_color ? VTSEQ(35) : ""; } - const char* terminal_cyan() { return s_terminal_has_color ? VTSEQ(36) : ""; } - const char* terminal_light_gray() { return s_terminal_has_color ? VTSEQ(37) : ""; } - const char* terminal_white() { return s_terminal_has_color ? VTSEQ(37) : ""; } - const char* terminal_light_red() { return s_terminal_has_color ? VTSEQ(91) : ""; } - const char* terminal_dim() { return s_terminal_has_color ? VTSEQ(2) : ""; } - - // Formating - const char* terminal_bold() { return s_terminal_has_color ? VTSEQ(1) : ""; } - const char* terminal_underline() { return s_terminal_has_color ? VTSEQ(4) : ""; } - - // You should end each line with this! - const char* terminal_reset() { return s_terminal_has_color ? VTSEQ(0) : ""; } - - // ------------------------------------------------------------------------------ +const char* terminal_black() { return s_terminal_has_color ? VTSEQ(30) : ""; } +const char* terminal_red() { return s_terminal_has_color ? VTSEQ(31) : ""; } +const char* terminal_green() { return s_terminal_has_color ? VTSEQ(32) : ""; } +const char* terminal_yellow() { return s_terminal_has_color ? VTSEQ(33) : ""; } +const char* terminal_blue() { return s_terminal_has_color ? VTSEQ(34) : ""; } +const char* terminal_purple() { return s_terminal_has_color ? VTSEQ(35) : ""; } +const char* terminal_cyan() { return s_terminal_has_color ? VTSEQ(36) : ""; } +const char* terminal_light_gray() { + return s_terminal_has_color ? VTSEQ(37) : ""; +} +const char* terminal_white() { return s_terminal_has_color ? VTSEQ(37) : ""; } +const char* terminal_light_red() { + return s_terminal_has_color ? VTSEQ(91) : ""; +} +const char* terminal_dim() { return s_terminal_has_color ? VTSEQ(2) : ""; } + +// Formating +const char* terminal_bold() { return s_terminal_has_color ? VTSEQ(1) : ""; } +const char* terminal_underline() { + return s_terminal_has_color ? VTSEQ(4) : ""; +} + +// You should end each line with this! +const char* terminal_reset() { return s_terminal_has_color ? VTSEQ(0) : ""; } + +// ------------------------------------------------------------------------------ #if LOGURU_WITH_FILEABS - void file_reopen(void* user_data); - inline FILE* to_file(void* user_data) { return reinterpret_cast(user_data)->fp; } +void file_reopen(void* user_data); +inline FILE* to_file(void* user_data) { + return reinterpret_cast(user_data)->fp; +} #else - inline FILE* to_file(void* user_data) { return reinterpret_cast(user_data); } +inline FILE* to_file(void* user_data) { + return reinterpret_cast(user_data); +} #endif - void file_log(void* user_data, const Message& message) - { +void file_log(void* user_data, const Message& message) { #if LOGURU_WITH_FILEABS - FileAbs* file_abs = reinterpret_cast(user_data); - if (file_abs->is_reopening) { - return; - } - // It is better checking file change every minute/hour/day, - // instead of doing this every time we log. - // Here check_interval is set to zero to enable checking every time; - const auto check_interval = seconds(0); - if (duration_cast(steady_clock::now() - file_abs->last_check_time) > check_interval) { - file_abs->last_check_time = steady_clock::now(); - file_reopen(user_data); - } - FILE* file = to_file(user_data); - if (!file) { - return; - } + FileAbs* file_abs = reinterpret_cast(user_data); + if (file_abs->is_reopening) { + return; + } + // It is better checking file change every minute/hour/day, + // instead of doing this every time we log. + // Here check_interval is set to zero to enable checking every time; + const auto check_interval = seconds(0); + if (duration_cast(steady_clock::now() - + file_abs->last_check_time) > check_interval) { + file_abs->last_check_time = steady_clock::now(); + file_reopen(user_data); + } + FILE* file = to_file(user_data); + if (!file) { + return; + } #else - FILE* file = to_file(user_data); + FILE* file = to_file(user_data); #endif - fprintf(file, "%s%s%s%s\n", - message.preamble, message.indentation, message.prefix, message.message); - if (g_flush_interval_ms == 0) { - fflush(file); - } - } - - void file_close(void* user_data) - { - FILE* file = to_file(user_data); - if (file) { - fclose(file); - } + fprintf(file, "%s%s%s%s\n", message.preamble, message.indentation, + message.prefix, message.message); + if (g_flush_interval_ms == 0) { + fflush(file); + } +} + +void file_close(void* user_data) { + FILE* file = to_file(user_data); + if (file) { + fclose(file); + } #if LOGURU_WITH_FILEABS - delete reinterpret_cast(user_data); + delete reinterpret_cast(user_data); #endif - } +} - void file_flush(void* user_data) - { - FILE* file = to_file(user_data); - fflush(file); - } +void file_flush(void* user_data) { + FILE* file = to_file(user_data); + fflush(file); +} #if LOGURU_WITH_FILEABS - void file_reopen(void* user_data) - { - FileAbs * file_abs = reinterpret_cast(user_data); - struct stat st; - int ret; - if (!file_abs->fp || (ret = stat(file_abs->path, &st)) == -1 || (st.st_ino != file_abs->st.st_ino)) { - file_abs->is_reopening = true; - if (file_abs->fp) { - fclose(file_abs->fp); - } - if (!file_abs->fp) { - VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to previous error", file_abs->path); - } - else if (ret < 0) { - const auto why = errno_as_text(); - VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to '" LOGURU_FMT(s) "'", file_abs->path, why.c_str()); - } else { - VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to file changed", file_abs->path); - } - // try reopen current file. - if (!create_directories(file_abs->path)) { - LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", file_abs->path); - } - file_abs->fp = fopen(file_abs->path, file_abs->mode_str); - if (!file_abs->fp) { - LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", file_abs->path); - } else { - stat(file_abs->path, &file_abs->st); - } - file_abs->is_reopening = false; - } - } +void file_reopen(void* user_data) { + FileAbs* file_abs = reinterpret_cast(user_data); + struct stat st; + int ret; + if (!file_abs->fp || (ret = stat(file_abs->path, &st)) == -1 || + (st.st_ino != file_abs->st.st_ino)) { + file_abs->is_reopening = true; + if (file_abs->fp) { + fclose(file_abs->fp); + } + if (!file_abs->fp) { + VLOG_F(g_internal_verbosity, + "Reopening file '" LOGURU_FMT(s) "' due to previous error", + file_abs->path); + } else if (ret < 0) { + const auto why = errno_as_text(); + VLOG_F( + g_internal_verbosity, + "Reopening file '" LOGURU_FMT(s) "' due to '" LOGURU_FMT(s) "'", + file_abs->path, why.c_str()); + } else { + VLOG_F(g_internal_verbosity, + "Reopening file '" LOGURU_FMT(s) "' due to file changed", + file_abs->path); + } + // try reopen current file. + if (!create_directories(file_abs->path)) { + LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", + file_abs->path); + } + file_abs->fp = fopen(file_abs->path, file_abs->mode_str); + if (!file_abs->fp) { + LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", file_abs->path); + } else { + stat(file_abs->path, &file_abs->st); + } + file_abs->is_reopening = false; + } +} #endif - // ------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ #if LOGURU_SYSLOG - void syslog_log(void* /*user_data*/, const Message& message) - { - /* - Level 0: Is reserved for kernel panic type situations. - Level 1: Is for Major resource failure. - Level 2->7 Application level failures - */ - int level; - if (message.verbosity < Verbosity_FATAL) { - level = 1; // System Alert - } else { - switch(message.verbosity) { - case Verbosity_FATAL: level = 2; break; // System Critical - case Verbosity_ERROR: level = 3; break; // System Error - case Verbosity_WARNING: level = 4; break; // System Warning - case Verbosity_INFO: level = 5; break; // System Notice - case Verbosity_1: level = 6; break; // System Info - default: level = 7; break; // System Debug - } - } - - // Note: We don't add the time info. - // This is done automatically by the syslog deamon. - // Otherwise log all information that the file log does. - syslog(level, "%s%s%s", message.indentation, message.prefix, message.message); - } - - void syslog_close(void* /*user_data*/) - { - closelog(); - } - - void syslog_flush(void* /*user_data*/) - {} +void syslog_log(void* /*user_data*/, const Message& message) { + /* + Level 0: Is reserved for kernel panic type situations. + Level 1: Is for Major resource failure. + Level 2->7 Application level failures + */ + int level; + if (message.verbosity < Verbosity_FATAL) { + level = 1; // System Alert + } else { + switch (message.verbosity) { + case Verbosity_FATAL: + level = 2; + break; // System Critical + case Verbosity_ERROR: + level = 3; + break; // System Error + case Verbosity_WARNING: + level = 4; + break; // System Warning + case Verbosity_INFO: + level = 5; + break; // System Notice + case Verbosity_1: + level = 6; + break; // System Info + default: + level = 7; + break; // System Debug + } + } + + // Note: We don't add the time info. + // This is done automatically by the syslog deamon. + // Otherwise log all information that the file log does. + syslog(level, "%s%s%s", message.indentation, message.prefix, + message.message); +} + +void syslog_close(void* /*user_data*/) { closelog(); } + +void syslog_flush(void* /*user_data*/) {} #endif // ------------------------------------------------------------------------------ - // Helpers: +// Helpers: - Text::~Text() { free(_str); } +Text::~Text() { free(_str); } #if LOGURU_USE_FMTLIB - Text vtextprintf(const char* format, fmt::format_args args) - { - return Text(STRDUP(fmt::vformat(format, args).c_str())); - } +Text vtextprintf(const char* format, fmt::format_args args) { + return Text(STRDUP(fmt::vformat(format, args).c_str())); +} #else - LOGURU_PRINTF_LIKE(1, 0) - static Text vtextprintf(const char* format, va_list vlist) - { +LOGURU_PRINTF_LIKE(1, 0) +static Text vtextprintf(const char* format, va_list vlist) { #ifdef _WIN32 - int bytes_needed = _vscprintf(format, vlist); - CHECK_F(bytes_needed >= 0, "Bad string format: '%s'", format); - char* buff = (char*)malloc(bytes_needed+1); - vsnprintf(buff, bytes_needed+1, format, vlist); - return Text(buff); + int bytes_needed = _vscprintf(format, vlist); + CHECK_F(bytes_needed >= 0, "Bad string format: '%s'", format); + char* buff = (char*)malloc(bytes_needed + 1); + vsnprintf(buff, bytes_needed + 1, format, vlist); + return Text(buff); #else - char* buff = nullptr; - int result = vasprintf(&buff, format, vlist); - CHECK_F(result >= 0, "Bad string format: '" LOGURU_FMT(s) "'", format); - return Text(buff); + char* buff = nullptr; + int result = vasprintf(&buff, format, vlist); + CHECK_F(result >= 0, "Bad string format: '" LOGURU_FMT(s) "'", format); + return Text(buff); +#endif +} + +Text textprintf(const char* format, ...) { + va_list vlist; + va_start(vlist, format); + auto result = vtextprintf(format, vlist); + va_end(vlist); + return result; +} +#endif + +// Overloaded for variadic template matching. +Text textprintf() { return Text(static_cast(calloc(1, 1))); } + +static const char* indentation(unsigned depth) { + static const char buff[] = + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . " + ". . . . . . . . . . "; + static const size_t INDENTATION_WIDTH = 4; + static const size_t NUM_INDENTATIONS = + (sizeof(buff) - 1) / INDENTATION_WIDTH; + depth = std::min(depth, NUM_INDENTATIONS); + return buff + INDENTATION_WIDTH * (NUM_INDENTATIONS - depth); +} + +static void parse_args(int& argc, char* argv[], const char* verbosity_flag) { + int arg_dest = 1; + int out_argc = argc; + + for (int arg_it = 1; arg_it < argc; ++arg_it) { + auto cmd = argv[arg_it]; + auto arg_len = strlen(verbosity_flag); + + bool last_is_alpha = false; +#if LOGURU_USE_LOCALE + try { // locale variant of isalpha will throw on error + last_is_alpha = std::isalpha(cmd[arg_len], std::locale("")); + } catch (...) { + last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); + } +#else + last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); +#endif + + if (strncmp(cmd, verbosity_flag, arg_len) == 0 && !last_is_alpha) { + out_argc -= 1; + auto value_str = cmd + arg_len; + if (value_str[0] == '\0') { + // Value in separate argument + arg_it += 1; + CHECK_LT_F(arg_it, argc, + "Missing verbosiy level after " LOGURU_FMT(s) "", + verbosity_flag); + value_str = argv[arg_it]; + out_argc -= 1; + } + if (*value_str == '=') { + value_str += 1; + } + + auto req_verbosity = get_verbosity_from_name(value_str); + if (req_verbosity != Verbosity_INVALID) { + g_stderr_verbosity = req_verbosity; + } else { + char* end = 0; + g_stderr_verbosity = + static_cast(strtol(value_str, &end, 10)); + CHECK_F(end && *end == '\0', + "Invalid verbosity. Expected integer, INFO, WARNING, " + "ERROR or OFF, got '" LOGURU_FMT(s) "'", + value_str); + } + } else { + argv[arg_dest++] = argv[arg_it]; + } + } + + argc = out_argc; + argv[argc] = nullptr; +} + +static long long now_ns() { + return duration_cast( + high_resolution_clock::now().time_since_epoch()) + .count(); +} + +// Returns the part of the path after the last / or \ (if any). +const char* filename(const char* path) { + for (auto ptr = path; *ptr; ++ptr) { + if (*ptr == '/' || *ptr == '\\') { + path = ptr + 1; + } + } + return path; +} + +// ------------------------------------------------------------------------------ + +static void on_atexit() { + VLOG_F(g_internal_verbosity, "atexit"); + flush(); +} + +static void install_signal_handlers(const SignalOptions& signal_options); + +static void write_hex_digit(std::string& out, unsigned num) { + DCHECK_LT_F(num, 16u); + if (num < 10u) { + out.push_back(char('0' + num)); + } else { + out.push_back(char('A' + num - 10)); + } +} + +static void write_hex_byte(std::string& out, uint8_t n) { + write_hex_digit(out, n >> 4u); + write_hex_digit(out, n & 0x0f); +} + +static void escape(std::string& out, const std::string& str) { + for (char c : str) { + /**/ if (c == '\a') { + out += "\\a"; + } else if (c == '\b') { + out += "\\b"; + } else if (c == '\f') { + out += "\\f"; + } else if (c == '\n') { + out += "\\n"; + } else if (c == '\r') { + out += "\\r"; + } else if (c == '\t') { + out += "\\t"; + } else if (c == '\v') { + out += "\\v"; + } else if (c == '\\') { + out += "\\\\"; + } else if (c == '\'') { + out += "\\\'"; + } else if (c == '\"') { + out += "\\\""; + } else if (c == ' ') { + out += "\\ "; + } else if (0 <= c && c < 0x20) { // ASCI control character: + // else if (c < 0x20 || c != (c & 127)) { // ASCII control character + // or UTF-8: + out += "\\x"; + write_hex_byte(out, static_cast(c)); + } else { + out += c; + } + } +} + +Text errno_as_text() { + char buff[256]; +#if defined(__GLIBC__) && defined(_GNU_SOURCE) + // GNU Version + return Text(STRDUP(strerror_r(errno, buff, sizeof(buff)))); +#elif defined(__APPLE__) || _POSIX_C_SOURCE >= 200112L + // XSI Version + strerror_r(errno, buff, sizeof(buff)); + return Text(strdup(buff)); +#elif defined(_WIN32) + strerror_s(buff, sizeof(buff), errno); + return Text(STRDUP(buff)); +#else + // Not thread-safe. + return Text(STRDUP(strerror(errno))); +#endif +} + +void init(int& argc, char* argv[], const Options& options) { + CHECK_GT_F(argc, 0, "Expected proper argc/argv"); + CHECK_EQ_F(argv[argc], nullptr, "Expected proper argc/argv"); + + s_argv0_filename = filename(argv[0]); + +#ifdef _WIN32 +#define getcwd _getcwd #endif - } - - Text textprintf(const char* format, ...) - { - va_list vlist; - va_start(vlist, format); - auto result = vtextprintf(format, vlist); - va_end(vlist); - return result; - } + + if (!getcwd(s_current_dir, sizeof(s_current_dir))) { + const auto error_text = errno_as_text(); + LOG_F(WARNING, + "Failed to get current working directory: " LOGURU_FMT(s) "", + error_text.c_str()); + } + + s_arguments = ""; + for (int i = 0; i < argc; ++i) { + escape(s_arguments, argv[i]); + if (i + 1 < argc) { + s_arguments += " "; + } + } + + if (options.verbosity_flag) { + parse_args(argc, argv, options.verbosity_flag); + } + + if (const auto main_thread_name = options.main_thread_name) { +#if LOGURU_PTLS_NAMES || LOGURU_WINTHREADS + set_thread_name(main_thread_name); +#elif LOGURU_PTHREADS + char old_thread_name[16] = {0}; + auto this_thread = pthread_self(); +#if defined(__APPLE__) || defined(__linux__) || defined(__sun) + pthread_getname_np(this_thread, old_thread_name, + sizeof(old_thread_name)); +#endif + if (old_thread_name[0] == 0) { +#ifdef __APPLE__ + pthread_setname_np(main_thread_name); +#elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(this_thread, main_thread_name); +#elif defined(__linux__) || defined(__sun) + pthread_setname_np(this_thread, main_thread_name); #endif + } +#endif // LOGURU_PTHREADS + } + + if (g_stderr_verbosity >= Verbosity_INFO) { + if (g_preamble_header) { + char preamble_explain[LOGURU_PREAMBLE_WIDTH]; + print_preamble_header(preamble_explain, sizeof(preamble_explain)); + if (g_colorlogtostderr && s_terminal_has_color) { + fprintf(stderr, "%s%s%s\n", terminal_reset(), terminal_dim(), + preamble_explain); + } else { + fprintf(stderr, "%s\n", preamble_explain); + } + } + fflush(stderr); + } + VLOG_F(g_internal_verbosity, "arguments: " LOGURU_FMT(s) "", + s_arguments.c_str()); + if (strlen(s_current_dir) != 0) { + VLOG_F(g_internal_verbosity, "Current dir: " LOGURU_FMT(s) "", + s_current_dir); + } + VLOG_F(g_internal_verbosity, "stderr verbosity: " LOGURU_FMT(d) "", + g_stderr_verbosity); + VLOG_F(g_internal_verbosity, "-----------------------------------"); + + install_signal_handlers(options.signal_options); + + atexit(on_atexit); +} + +void shutdown() { + VLOG_F(g_internal_verbosity, "loguru::shutdown()"); + remove_all_callbacks(); + set_fatal_handler(nullptr); + set_verbosity_to_name_callback(nullptr); + set_name_to_verbosity_callback(nullptr); +} + +void write_date_time(char* buff, unsigned long long buff_size) { + auto now = system_clock::now(); + long long ms_since_epoch = + duration_cast(now.time_since_epoch()).count(); + time_t sec_since_epoch = time_t(ms_since_epoch / 1000); + tm time_info; + localtime_r(&sec_since_epoch, &time_info); + snprintf(buff, buff_size, "%04d%02d%02d_%02d%02d%02d.%03lld", + 1900 + time_info.tm_year, 1 + time_info.tm_mon, time_info.tm_mday, + time_info.tm_hour, time_info.tm_min, time_info.tm_sec, + ms_since_epoch % 1000); +} + +const char* argv0_filename() { return s_argv0_filename.c_str(); } + +const char* arguments() { return s_arguments.c_str(); } + +const char* current_dir() { return s_current_dir; } + +const char* home_dir() { +#ifdef __MINGW32__ + auto home = getenv("USERPROFILE"); + CHECK_F(home != nullptr, "Missing USERPROFILE"); + return home; +#elif defined(_WIN32) + char* user_profile; + size_t len; + errno_t err = _dupenv_s(&user_profile, &len, "USERPROFILE"); + CHECK_F(err == 0, "Missing USERPROFILE"); + return user_profile; +#else // _WIN32 + auto home = getenv("HOME"); + CHECK_F(home != nullptr, "Missing HOME"); + return home; +#endif // _WIN32 +} + +void suggest_log_path(const char* prefix, char* buff, + unsigned long long buff_size) { + if (prefix[0] == '~') { + snprintf(buff, buff_size - 1, "%s%s", home_dir(), prefix + 1); + } else { + snprintf(buff, buff_size - 1, "%s", prefix); + } + + // Check for terminating / + size_t n = strlen(buff); + if (n != 0) { + if (buff[n - 1] != '/') { + CHECK_F(n + 2 < buff_size, "Filename buffer too small"); + buff[n] = '/'; + buff[n + 1] = '\0'; + } + } - // Overloaded for variadic template matching. - Text textprintf() - { - return Text(static_cast(calloc(1, 1))); - } - - static const char* indentation(unsigned depth) - { - static const char buff[] = - ". . . . . . . . . . " ". . . . . . . . . . " - ". . . . . . . . . . " ". . . . . . . . . . " - ". . . . . . . . . . " ". . . . . . . . . . " - ". . . . . . . . . . " ". . . . . . . . . . " - ". . . . . . . . . . " ". . . . . . . . . . "; - static const size_t INDENTATION_WIDTH = 4; - static const size_t NUM_INDENTATIONS = (sizeof(buff) - 1) / INDENTATION_WIDTH; - depth = std::min(depth, NUM_INDENTATIONS); - return buff + INDENTATION_WIDTH * (NUM_INDENTATIONS - depth); - } - - static void parse_args(int& argc, char* argv[], const char* verbosity_flag) - { - int arg_dest = 1; - int out_argc = argc; - - for (int arg_it = 1; arg_it < argc; ++arg_it) { - auto cmd = argv[arg_it]; - auto arg_len = strlen(verbosity_flag); - - bool last_is_alpha = false; - #if LOGURU_USE_LOCALE - try { // locale variant of isalpha will throw on error - last_is_alpha = std::isalpha(cmd[arg_len], std::locale("")); - } - catch (...) { - last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); - } - #else - last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); - #endif - - if (strncmp(cmd, verbosity_flag, arg_len) == 0 && !last_is_alpha) { - out_argc -= 1; - auto value_str = cmd + arg_len; - if (value_str[0] == '\0') { - // Value in separate argument - arg_it += 1; - CHECK_LT_F(arg_it, argc, "Missing verbosiy level after " LOGURU_FMT(s) "", verbosity_flag); - value_str = argv[arg_it]; - out_argc -= 1; - } - if (*value_str == '=') { value_str += 1; } - - auto req_verbosity = get_verbosity_from_name(value_str); - if (req_verbosity != Verbosity_INVALID) { - g_stderr_verbosity = req_verbosity; - } else { - char* end = 0; - g_stderr_verbosity = static_cast(strtol(value_str, &end, 10)); - CHECK_F(end && *end == '\0', - "Invalid verbosity. Expected integer, INFO, WARNING, ERROR or OFF, got '" LOGURU_FMT(s) "'", value_str); - } - } else { - argv[arg_dest++] = argv[arg_it]; - } - } - - argc = out_argc; - argv[argc] = nullptr; - } - - static long long now_ns() - { - return duration_cast(high_resolution_clock::now().time_since_epoch()).count(); - } - - // Returns the part of the path after the last / or \ (if any). - const char* filename(const char* path) - { - for (auto ptr = path; *ptr; ++ptr) { - if (*ptr == '/' || *ptr == '\\') { - path = ptr + 1; - } - } - return path; - } - - // ------------------------------------------------------------------------------ - - static void on_atexit() - { - VLOG_F(g_internal_verbosity, "atexit"); - flush(); - } - - static void install_signal_handlers(const SignalOptions& signal_options); - - static void write_hex_digit(std::string& out, unsigned num) - { - DCHECK_LT_F(num, 16u); - if (num < 10u) { out.push_back(char('0' + num)); } - else { out.push_back(char('A' + num - 10)); } - } - - static void write_hex_byte(std::string& out, uint8_t n) - { - write_hex_digit(out, n >> 4u); - write_hex_digit(out, n & 0x0f); - } - - static void escape(std::string& out, const std::string& str) - { - for (char c : str) { - /**/ if (c == '\a') { out += "\\a"; } - else if (c == '\b') { out += "\\b"; } - else if (c == '\f') { out += "\\f"; } - else if (c == '\n') { out += "\\n"; } - else if (c == '\r') { out += "\\r"; } - else if (c == '\t') { out += "\\t"; } - else if (c == '\v') { out += "\\v"; } - else if (c == '\\') { out += "\\\\"; } - else if (c == '\'') { out += "\\\'"; } - else if (c == '\"') { out += "\\\""; } - else if (c == ' ') { out += "\\ "; } - else if (0 <= c && c < 0x20) { // ASCI control character: - // else if (c < 0x20 || c != (c & 127)) { // ASCII control character or UTF-8: - out += "\\x"; - write_hex_byte(out, static_cast(c)); - } else { out += c; } - } - } - - Text errno_as_text() - { - char buff[256]; - #if defined(__GLIBC__) && defined(_GNU_SOURCE) - // GNU Version - return Text(STRDUP(strerror_r(errno, buff, sizeof(buff)))); - #elif defined(__APPLE__) || _POSIX_C_SOURCE >= 200112L - // XSI Version - strerror_r(errno, buff, sizeof(buff)); - return Text(strdup(buff)); - #elif defined(_WIN32) - strerror_s(buff, sizeof(buff), errno); - return Text(STRDUP(buff)); - #else - // Not thread-safe. - return Text(STRDUP(strerror(errno))); - #endif - } - - void init(int& argc, char* argv[], const Options& options) - { - CHECK_GT_F(argc, 0, "Expected proper argc/argv"); - CHECK_EQ_F(argv[argc], nullptr, "Expected proper argc/argv"); - - s_argv0_filename = filename(argv[0]); - - #ifdef _WIN32 - #define getcwd _getcwd - #endif - - if (!getcwd(s_current_dir, sizeof(s_current_dir))) { - const auto error_text = errno_as_text(); - LOG_F(WARNING, "Failed to get current working directory: " LOGURU_FMT(s) "", error_text.c_str()); - } - - s_arguments = ""; - for (int i = 0; i < argc; ++i) { - escape(s_arguments, argv[i]); - if (i + 1 < argc) { - s_arguments += " "; - } - } - - if (options.verbosity_flag) { - parse_args(argc, argv, options.verbosity_flag); - } - - if (const auto main_thread_name = options.main_thread_name) { - #if LOGURU_PTLS_NAMES || LOGURU_WINTHREADS - set_thread_name(main_thread_name); - #elif LOGURU_PTHREADS - char old_thread_name[16] = {0}; - auto this_thread = pthread_self(); - #if defined(__APPLE__) || defined(__linux__) || defined(__sun) - pthread_getname_np(this_thread, old_thread_name, sizeof(old_thread_name)); - #endif - if (old_thread_name[0] == 0) { - #ifdef __APPLE__ - pthread_setname_np(main_thread_name); - #elif defined(__FreeBSD__) || defined(__OpenBSD__) - pthread_set_name_np(this_thread, main_thread_name); - #elif defined(__linux__) || defined(__sun) - pthread_setname_np(this_thread, main_thread_name); - #endif - } - #endif // LOGURU_PTHREADS - } - - if (g_stderr_verbosity >= Verbosity_INFO) { - if (g_preamble_header) { - char preamble_explain[LOGURU_PREAMBLE_WIDTH]; - print_preamble_header(preamble_explain, sizeof(preamble_explain)); - if (g_colorlogtostderr && s_terminal_has_color) { - fprintf(stderr, "%s%s%s\n", terminal_reset(), terminal_dim(), preamble_explain); - } else { - fprintf(stderr, "%s\n", preamble_explain); - } - } - fflush(stderr); - } - VLOG_F(g_internal_verbosity, "arguments: " LOGURU_FMT(s) "", s_arguments.c_str()); - if (strlen(s_current_dir) != 0) - { - VLOG_F(g_internal_verbosity, "Current dir: " LOGURU_FMT(s) "", s_current_dir); - } - VLOG_F(g_internal_verbosity, "stderr verbosity: " LOGURU_FMT(d) "", g_stderr_verbosity); - VLOG_F(g_internal_verbosity, "-----------------------------------"); - - install_signal_handlers(options.signal_options); - - atexit(on_atexit); - } - - void shutdown() - { - VLOG_F(g_internal_verbosity, "loguru::shutdown()"); - remove_all_callbacks(); - set_fatal_handler(nullptr); - set_verbosity_to_name_callback(nullptr); - set_name_to_verbosity_callback(nullptr); - } - - void write_date_time(char* buff, unsigned long long buff_size) - { - auto now = system_clock::now(); - long long ms_since_epoch = duration_cast(now.time_since_epoch()).count(); - time_t sec_since_epoch = time_t(ms_since_epoch / 1000); - tm time_info; - localtime_r(&sec_since_epoch, &time_info); - snprintf(buff, buff_size, "%04d%02d%02d_%02d%02d%02d.%03lld", - 1900 + time_info.tm_year, 1 + time_info.tm_mon, time_info.tm_mday, - time_info.tm_hour, time_info.tm_min, time_info.tm_sec, ms_since_epoch % 1000); - } - - const char* argv0_filename() - { - return s_argv0_filename.c_str(); - } - - const char* arguments() - { - return s_arguments.c_str(); - } - - const char* current_dir() - { - return s_current_dir; - } - - const char* home_dir() - { - #ifdef __MINGW32__ - auto home = getenv("USERPROFILE"); - CHECK_F(home != nullptr, "Missing USERPROFILE"); - return home; - #elif defined(_WIN32) - char* user_profile; - size_t len; - errno_t err = _dupenv_s(&user_profile, &len, "USERPROFILE"); - CHECK_F(err == 0, "Missing USERPROFILE"); - return user_profile; - #else // _WIN32 - auto home = getenv("HOME"); - CHECK_F(home != nullptr, "Missing HOME"); - return home; - #endif // _WIN32 - } - - void suggest_log_path(const char* prefix, char* buff, unsigned long long buff_size) - { - if (prefix[0] == '~') { - snprintf(buff, buff_size - 1, "%s%s", home_dir(), prefix + 1); - } else { - snprintf(buff, buff_size - 1, "%s", prefix); - } - - // Check for terminating / - size_t n = strlen(buff); - if (n != 0) { - if (buff[n - 1] != '/') { - CHECK_F(n + 2 < buff_size, "Filename buffer too small"); - buff[n] = '/'; - buff[n + 1] = '\0'; - } - } - - #ifdef _WIN32 - strncat_s(buff, buff_size - strlen(buff) - 1, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); - strncat_s(buff, buff_size - strlen(buff) - 1, "/", buff_size - strlen(buff) - 1); - write_date_time(buff + strlen(buff), buff_size - strlen(buff)); - strncat_s(buff, buff_size - strlen(buff) - 1, ".log", buff_size - strlen(buff) - 1); - #else - strncat(buff, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); - strncat(buff, "/", buff_size - strlen(buff) - 1); - write_date_time(buff + strlen(buff), buff_size - strlen(buff)); - strncat(buff, ".log", buff_size - strlen(buff) - 1); - #endif - } - - bool create_directories(const char* file_path_const) - { - CHECK_F(file_path_const && *file_path_const); - char* file_path = STRDUP(file_path_const); - for (char* p = strchr(file_path + 1, '/'); p; p = strchr(p + 1, '/')) { - *p = '\0'; - - #ifdef _WIN32 - if (_mkdir(file_path) == -1) { - #else - if (mkdir(file_path, 0755) == -1) { - #endif - if (errno != EEXIST) { - LOG_F(ERROR, "Failed to create directory '" LOGURU_FMT(s) "'", file_path); - LOG_IF_F(ERROR, errno == EACCES, "EACCES"); - LOG_IF_F(ERROR, errno == ENAMETOOLONG, "ENAMETOOLONG"); - LOG_IF_F(ERROR, errno == ENOENT, "ENOENT"); - LOG_IF_F(ERROR, errno == ENOTDIR, "ENOTDIR"); - LOG_IF_F(ERROR, errno == ELOOP, "ELOOP"); - - *p = '/'; - free(file_path); - return false; - } - } - *p = '/'; - } - free(file_path); - return true; - } - bool add_file(const char* path_in, FileMode mode, Verbosity verbosity) - { - char path[PATH_MAX]; - if (path_in[0] == '~') { - snprintf(path, sizeof(path) - 1, "%s%s", home_dir(), path_in + 1); - } else { - snprintf(path, sizeof(path) - 1, "%s", path_in); - } - - if (!create_directories(path)) { - LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", path); - } - - const char* mode_str = (mode == FileMode::Truncate ? "w" : "a"); - FILE* file; - #ifdef _WIN32 - file = _fsopen(path, mode_str, _SH_DENYNO); - #else - file = fopen(path, mode_str); - #endif - if (!file) { - LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", path); - return false; - } +#ifdef _WIN32 + strncat_s(buff, buff_size - strlen(buff) - 1, s_argv0_filename.c_str(), + buff_size - strlen(buff) - 1); + strncat_s(buff, buff_size - strlen(buff) - 1, "/", + buff_size - strlen(buff) - 1); + write_date_time(buff + strlen(buff), buff_size - strlen(buff)); + strncat_s(buff, buff_size - strlen(buff) - 1, ".log", + buff_size - strlen(buff) - 1); +#else + strncat(buff, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); + strncat(buff, "/", buff_size - strlen(buff) - 1); + write_date_time(buff + strlen(buff), buff_size - strlen(buff)); + strncat(buff, ".log", buff_size - strlen(buff) - 1); +#endif +} + +bool create_directories(const char* file_path_const) { + CHECK_F(file_path_const && *file_path_const); + char* file_path = STRDUP(file_path_const); + for (char* p = strchr(file_path + 1, '/'); p; p = strchr(p + 1, '/')) { + *p = '\0'; + +#ifdef _WIN32 + if (_mkdir(file_path) == -1) { +#else + if (mkdir(file_path, 0755) == -1) { +#endif + if (errno != EEXIST) { + LOG_F(ERROR, "Failed to create directory '" LOGURU_FMT(s) "'", + file_path); + LOG_IF_F(ERROR, errno == EACCES, "EACCES"); + LOG_IF_F(ERROR, errno == ENAMETOOLONG, "ENAMETOOLONG"); + LOG_IF_F(ERROR, errno == ENOENT, "ENOENT"); + LOG_IF_F(ERROR, errno == ENOTDIR, "ENOTDIR"); + LOG_IF_F(ERROR, errno == ELOOP, "ELOOP"); + + *p = '/'; + free(file_path); + return false; + } + } + *p = '/'; + } + free(file_path); + return true; +} +bool add_file(const char* path_in, FileMode mode, Verbosity verbosity) { + char path[PATH_MAX]; + if (path_in[0] == '~') { + snprintf(path, sizeof(path) - 1, "%s%s", home_dir(), path_in + 1); + } else { + snprintf(path, sizeof(path) - 1, "%s", path_in); + } + + if (!create_directories(path)) { + LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", + path); + } + + const char* mode_str = (mode == FileMode::Truncate ? "w" : "a"); + FILE* file; +#ifdef _WIN32 + file = _fsopen(path, mode_str, _SH_DENYNO); +#else + file = fopen(path, mode_str); +#endif + if (!file) { + LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", path); + return false; + } #if LOGURU_WITH_FILEABS - FileAbs* file_abs = new FileAbs(); // this is deleted in file_close; - snprintf(file_abs->path, sizeof(file_abs->path) - 1, "%s", path); - snprintf(file_abs->mode_str, sizeof(file_abs->mode_str) - 1, "%s", mode_str); - stat(file_abs->path, &file_abs->st); - file_abs->fp = file; - file_abs->verbosity = verbosity; - add_callback(path_in, file_log, file_abs, verbosity, file_close, file_flush); + FileAbs* file_abs = new FileAbs(); // this is deleted in file_close; + snprintf(file_abs->path, sizeof(file_abs->path) - 1, "%s", path); + snprintf(file_abs->mode_str, sizeof(file_abs->mode_str) - 1, "%s", + mode_str); + stat(file_abs->path, &file_abs->st); + file_abs->fp = file; + file_abs->verbosity = verbosity; + add_callback(path_in, file_log, file_abs, verbosity, file_close, + file_flush); #else - add_callback(path_in, file_log, file, verbosity, file_close, file_flush); + add_callback(path_in, file_log, file, verbosity, file_close, file_flush); #endif - if (mode == FileMode::Append) { - fprintf(file, "\n\n\n\n\n"); - } - if (!s_arguments.empty()) { - fprintf(file, "arguments: %s\n", s_arguments.c_str()); - } - if (strlen(s_current_dir) != 0) { - fprintf(file, "Current dir: %s\n", s_current_dir); - } - fprintf(file, "File verbosity level: %d\n", verbosity); - if (g_preamble_header) { - char preamble_explain[LOGURU_PREAMBLE_WIDTH]; - print_preamble_header(preamble_explain, sizeof(preamble_explain)); - fprintf(file, "%s\n", preamble_explain); - } - fflush(file); - - VLOG_F(g_internal_verbosity, "Logging to '" LOGURU_FMT(s) "', mode: '" LOGURU_FMT(s) "', verbosity: " LOGURU_FMT(d) "", path, mode_str, verbosity); - return true; - } - - /* - Will add syslog as a standard sink for log messages - Any logging message with a verbosity lower or equal to - the given verbosity will be included. - - This works for Unix like systems (i.e. Linux/Mac) - There is no current implementation for Windows (as I don't know the - equivalent calls or have a way to test them). If you know please - add and send a pull request. - - The code should still compile under windows but will only generate - a warning message that syslog is unavailable. - - Search for LOGURU_SYSLOG to find and fix. - */ - bool add_syslog(const char* app_name, Verbosity verbosity) - { - return add_syslog(app_name, verbosity, LOG_USER); - } - bool add_syslog(const char* app_name, Verbosity verbosity, int facility) - { + if (mode == FileMode::Append) { + fprintf(file, "\n\n\n\n\n"); + } + if (!s_arguments.empty()) { + fprintf(file, "arguments: %s\n", s_arguments.c_str()); + } + if (strlen(s_current_dir) != 0) { + fprintf(file, "Current dir: %s\n", s_current_dir); + } + fprintf(file, "File verbosity level: %d\n", verbosity); + if (g_preamble_header) { + char preamble_explain[LOGURU_PREAMBLE_WIDTH]; + print_preamble_header(preamble_explain, sizeof(preamble_explain)); + fprintf(file, "%s\n", preamble_explain); + } + fflush(file); + + VLOG_F(g_internal_verbosity, + "Logging to '" LOGURU_FMT(s) "', mode: '" LOGURU_FMT( + s) "', verbosity: " LOGURU_FMT(d) "", + path, mode_str, verbosity); + return true; +} + +/* + Will add syslog as a standard sink for log messages + Any logging message with a verbosity lower or equal to + the given verbosity will be included. + + This works for Unix like systems (i.e. Linux/Mac) + There is no current implementation for Windows (as I don't know the + equivalent calls or have a way to test them). If you know please + add and send a pull request. + + The code should still compile under windows but will only generate + a warning message that syslog is unavailable. + + Search for LOGURU_SYSLOG to find and fix. +*/ +bool add_syslog(const char* app_name, Verbosity verbosity) { + return add_syslog(app_name, verbosity, LOG_USER); +} +bool add_syslog(const char* app_name, Verbosity verbosity, int facility) { #if LOGURU_SYSLOG - if (app_name == nullptr) { - app_name = argv0_filename(); - } - openlog(app_name, 0, facility); - add_callback("'syslog'", syslog_log, nullptr, verbosity, syslog_close, syslog_flush); - - VLOG_F(g_internal_verbosity, "Logging to 'syslog' , verbosity: " LOGURU_FMT(d) "", verbosity); - return true; + if (app_name == nullptr) { + app_name = argv0_filename(); + } + openlog(app_name, 0, facility); + add_callback("'syslog'", syslog_log, nullptr, verbosity, syslog_close, + syslog_flush); + + VLOG_F(g_internal_verbosity, + "Logging to 'syslog' , verbosity: " LOGURU_FMT(d) "", verbosity); + return true; #else - (void)app_name; - (void)verbosity; - (void)facility; - VLOG_F(g_internal_verbosity, "syslog not implemented on this system. Request to install syslog logging ignored."); - return false; + (void)app_name; + (void)verbosity; + (void)facility; + VLOG_F(g_internal_verbosity, + "syslog not implemented on this system. Request to install syslog " + "logging ignored."); + return false; #endif - } - // Will be called right before abort(). - void set_fatal_handler(fatal_handler_t handler) - { - s_fatal_handler = handler; - } - - fatal_handler_t get_fatal_handler() - { - return s_fatal_handler; - } - - void set_verbosity_to_name_callback(verbosity_to_name_t callback) - { - s_verbosity_to_name_callback = callback; - } - - void set_name_to_verbosity_callback(name_to_verbosity_t callback) - { - s_name_to_verbosity_callback = callback; - } - - void add_stack_cleanup(const char* find_this, const char* replace_with_this) - { - if (strlen(find_this) <= strlen(replace_with_this)) { - LOG_F(WARNING, "add_stack_cleanup: the replacement should be shorter than the pattern!"); - return; - } - - s_user_stack_cleanups.push_back(StringPair(find_this, replace_with_this)); - } - - static void on_callback_change() - { - s_max_out_verbosity = Verbosity_OFF; - for (const auto& callback : s_callbacks) { - s_max_out_verbosity = std::max(s_max_out_verbosity, callback.verbosity); - } - } - - void add_callback( - const char* id, - log_handler_t callback, - void* user_data, - Verbosity verbosity, - close_handler_t on_close, - flush_handler_t on_flush) - { - std::lock_guard lock(s_mutex); - s_callbacks.push_back(Callback{id, callback, user_data, verbosity, on_close, on_flush, 0}); - on_callback_change(); - } - - // Returns a custom verbosity name if one is available, or nullptr. - // See also set_verbosity_to_name_callback. - const char* get_verbosity_name(Verbosity verbosity) - { - auto name = s_verbosity_to_name_callback - ? (*s_verbosity_to_name_callback)(verbosity) - : nullptr; - - // Use standard replacements if callback fails: - if (!name) - { - if (verbosity <= Verbosity_FATAL) { - name = "FATL"; - } else if (verbosity == Verbosity_ERROR) { - name = "ERR"; - } else if (verbosity == Verbosity_WARNING) { - name = "WARN"; - } else if (verbosity == Verbosity_INFO) { - name = "INFO"; - } - } - - return name; - } - - // Returns Verbosity_INVALID if the name is not found. - // See also set_name_to_verbosity_callback. - Verbosity get_verbosity_from_name(const char* name) - { - auto verbosity = s_name_to_verbosity_callback - ? (*s_name_to_verbosity_callback)(name) - : Verbosity_INVALID; - - // Use standard replacements if callback fails: - if (verbosity == Verbosity_INVALID) { - if (strcmp(name, "OFF") == 0) { - verbosity = Verbosity_OFF; - } else if (strcmp(name, "INFO") == 0) { - verbosity = Verbosity_INFO; - } else if (strcmp(name, "WARNING") == 0) { - verbosity = Verbosity_WARNING; - } else if (strcmp(name, "ERROR") == 0) { - verbosity = Verbosity_ERROR; - } else if (strcmp(name, "FATAL") == 0) { - verbosity = Verbosity_FATAL; - } - } - - return verbosity; - } - - bool remove_callback(const char* id) - { - std::lock_guard lock(s_mutex); - auto it = std::find_if(begin(s_callbacks), end(s_callbacks), [&](const Callback& c) { return c.id == id; }); - if (it != s_callbacks.end()) { - if (it->close) { it->close(it->user_data); } - s_callbacks.erase(it); - on_callback_change(); - return true; - } else { - LOG_F(ERROR, "Failed to locate callback with id '" LOGURU_FMT(s) "'", id); - return false; - } - } - - void remove_all_callbacks() - { - std::lock_guard lock(s_mutex); - for (auto& callback : s_callbacks) { - if (callback.close) { - callback.close(callback.user_data); - } - } - s_callbacks.clear(); - on_callback_change(); - } - - // Returns the maximum of g_stderr_verbosity and all file/custom outputs. - Verbosity current_verbosity_cutoff() - { - return g_stderr_verbosity > s_max_out_verbosity ? - g_stderr_verbosity : s_max_out_verbosity; - } - - // ------------------------------------------------------------------------ - // Threads names +} +// Will be called right before abort(). +void set_fatal_handler(fatal_handler_t handler) { s_fatal_handler = handler; } + +fatal_handler_t get_fatal_handler() { return s_fatal_handler; } + +void set_verbosity_to_name_callback(verbosity_to_name_t callback) { + s_verbosity_to_name_callback = callback; +} + +void set_name_to_verbosity_callback(name_to_verbosity_t callback) { + s_name_to_verbosity_callback = callback; +} + +void add_stack_cleanup(const char* find_this, const char* replace_with_this) { + if (strlen(find_this) <= strlen(replace_with_this)) { + LOG_F(WARNING, + "add_stack_cleanup: the replacement should be shorter than the " + "pattern!"); + return; + } + + s_user_stack_cleanups.push_back(StringPair(find_this, replace_with_this)); +} + +static void on_callback_change() { + s_max_out_verbosity = Verbosity_OFF; + for (const auto& callback : s_callbacks) { + s_max_out_verbosity = std::max(s_max_out_verbosity, callback.verbosity); + } +} + +void add_callback(const char* id, log_handler_t callback, void* user_data, + Verbosity verbosity, close_handler_t on_close, + flush_handler_t on_flush) { + std::lock_guard lock(s_mutex); + s_callbacks.push_back( + Callback{id, callback, user_data, verbosity, on_close, on_flush, 0}); + on_callback_change(); +} + +// Returns a custom verbosity name if one is available, or nullptr. +// See also set_verbosity_to_name_callback. +const char* get_verbosity_name(Verbosity verbosity) { + auto name = s_verbosity_to_name_callback + ? (*s_verbosity_to_name_callback)(verbosity) + : nullptr; + + // Use standard replacements if callback fails: + if (!name) { + if (verbosity <= Verbosity_FATAL) { + name = "FATL"; + } else if (verbosity == Verbosity_ERROR) { + name = "ERR"; + } else if (verbosity == Verbosity_WARNING) { + name = "WARN"; + } else if (verbosity == Verbosity_INFO) { + name = "INFO"; + } + } + + return name; +} + +// Returns Verbosity_INVALID if the name is not found. +// See also set_name_to_verbosity_callback. +Verbosity get_verbosity_from_name(const char* name) { + auto verbosity = s_name_to_verbosity_callback + ? (*s_name_to_verbosity_callback)(name) + : Verbosity_INVALID; + + // Use standard replacements if callback fails: + if (verbosity == Verbosity_INVALID) { + if (strcmp(name, "OFF") == 0) { + verbosity = Verbosity_OFF; + } else if (strcmp(name, "INFO") == 0) { + verbosity = Verbosity_INFO; + } else if (strcmp(name, "WARNING") == 0) { + verbosity = Verbosity_WARNING; + } else if (strcmp(name, "ERROR") == 0) { + verbosity = Verbosity_ERROR; + } else if (strcmp(name, "FATAL") == 0) { + verbosity = Verbosity_FATAL; + } + } + + return verbosity; +} + +bool remove_callback(const char* id) { + std::lock_guard lock(s_mutex); + auto it = std::find_if(begin(s_callbacks), end(s_callbacks), + [&](const Callback& c) { return c.id == id; }); + if (it != s_callbacks.end()) { + if (it->close) { + it->close(it->user_data); + } + s_callbacks.erase(it); + on_callback_change(); + return true; + } else { + LOG_F(ERROR, "Failed to locate callback with id '" LOGURU_FMT(s) "'", + id); + return false; + } +} + +void remove_all_callbacks() { + std::lock_guard lock(s_mutex); + for (auto& callback : s_callbacks) { + if (callback.close) { + callback.close(callback.user_data); + } + } + s_callbacks.clear(); + on_callback_change(); +} + +// Returns the maximum of g_stderr_verbosity and all file/custom outputs. +Verbosity current_verbosity_cutoff() { + return g_stderr_verbosity > s_max_out_verbosity ? g_stderr_verbosity + : s_max_out_verbosity; +} + +// ------------------------------------------------------------------------ +// Threads names #if LOGURU_PTLS_NAMES - static pthread_once_t s_pthread_key_once = PTHREAD_ONCE_INIT; - static pthread_key_t s_pthread_key_name; +static pthread_once_t s_pthread_key_once = PTHREAD_ONCE_INIT; +static pthread_key_t s_pthread_key_name; - void make_pthread_key_name() - { - (void)pthread_key_create(&s_pthread_key_name, free); - } +void make_pthread_key_name() { + (void)pthread_key_create(&s_pthread_key_name, free); +} #endif #if LOGURU_WINTHREADS - // Where we store the custom thread name set by `set_thread_name` - char* thread_name_buffer() - { - __declspec( thread ) static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = {0}; - return &thread_name[0]; - } -#endif // LOGURU_WINTHREADS - - void set_thread_name(const char* name) - { - #if LOGURU_PTLS_NAMES - // Store thread name in thread-local storage at `s_pthread_key_name` - (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); - (void)pthread_setspecific(s_pthread_key_name, STRDUP(name)); - #elif LOGURU_PTHREADS - // Tell the OS the thread name - #ifdef __APPLE__ - pthread_setname_np(name); - #elif defined(__FreeBSD__) || defined(__OpenBSD__) - pthread_set_name_np(pthread_self(), name); - #elif defined(__linux__) || defined(__sun) - pthread_setname_np(pthread_self(), name); - #endif - #elif LOGURU_WINTHREADS - // Store thread name in a thread-local storage: - strncpy_s(thread_name_buffer(), LOGURU_THREADNAME_WIDTH + 1, name, _TRUNCATE); - #else // LOGURU_PTHREADS - // TODO: on these weird platforms we should also store the thread name - // in a generic thread-local storage. - (void)name; - #endif // LOGURU_PTHREADS - } - - void get_thread_name(char* buffer, unsigned long long length, bool right_align_hex_id) - { - CHECK_NE_F(length, 0u, "Zero length buffer in get_thread_name"); - CHECK_NOTNULL_F(buffer, "nullptr in get_thread_name"); - - #if LOGURU_PTLS_NAMES - (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); - if (const char* name = static_cast(pthread_getspecific(s_pthread_key_name))) { - snprintf(buffer, static_cast(length), "%s", name); - } else { - buffer[0] = 0; - } - #elif LOGURU_PTHREADS - // Ask the OS about the thread name. - // This is what we *want* to do on all platforms, but - // only some platforms support it (currently). - pthread_getname_np(pthread_self(), buffer, length); - #elif LOGURU_WINTHREADS - snprintf(buffer, static_cast(length), "%s", thread_name_buffer()); - #else - // Thread names unsupported - buffer[0] = 0; - #endif - - if (buffer[0] == 0) { - // We failed to get a readable thread name. - // Write a HEX thread ID instead. - // We try to get an ID that is the same as the ID you could - // read in your debugger, system monitor etc. - - #ifdef __APPLE__ - uint64_t thread_id; - pthread_threadid_np(pthread_self(), &thread_id); - #elif defined(__FreeBSD__) - long thread_id; - (void)thr_self(&thread_id); - #elif LOGURU_PTHREADS - uint64_t thread_id = pthread_self(); - #else - // This ID does not correllate to anything we can get from the OS, - // so this is the worst way to get the ID. - const auto thread_id = std::hash{}(std::this_thread::get_id()); - #endif - - if (right_align_hex_id) { - snprintf(buffer, static_cast(length), "%*X", static_cast(length - 1), static_cast(thread_id)); - } else { - snprintf(buffer, static_cast(length), "%X", static_cast(thread_id)); - } - } - } - - // ------------------------------------------------------------------------ - // Stack traces +// Where we store the custom thread name set by `set_thread_name` +char* thread_name_buffer() { + thread_local static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { + 0}; + return &thread_name[0]; +} +#endif // LOGURU_WINTHREADS + +void set_thread_name(const char* name) { +#if LOGURU_PTLS_NAMES + // Store thread name in thread-local storage at `s_pthread_key_name` + (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); + (void)pthread_setspecific(s_pthread_key_name, STRDUP(name)); +#elif LOGURU_PTHREADS +// Tell the OS the thread name +#ifdef __APPLE__ + pthread_setname_np(name); +#elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(pthread_self(), name); +#elif defined(__linux__) || defined(__sun) + pthread_setname_np(pthread_self(), name); +#endif +#elif LOGURU_WINTHREADS + // Store thread name in a thread-local storage: + strncpy_s(thread_name_buffer(), LOGURU_THREADNAME_WIDTH + 1, name, + _TRUNCATE); +#else // LOGURU_PTHREADS + // TODO: on these weird platforms we should also store the thread name + // in a generic thread-local storage. + (void)name; +#endif // LOGURU_PTHREADS +} + +void get_thread_name(char* buffer, unsigned long long length, + bool right_align_hex_id) { + CHECK_NE_F(length, 0u, "Zero length buffer in get_thread_name"); + CHECK_NOTNULL_F(buffer, "nullptr in get_thread_name"); + +#if LOGURU_PTLS_NAMES + (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); + if (const char* name = + static_cast(pthread_getspecific(s_pthread_key_name))) { + snprintf(buffer, static_cast(length), "%s", name); + } else { + buffer[0] = 0; + } +#elif LOGURU_PTHREADS + // Ask the OS about the thread name. + // This is what we *want* to do on all platforms, but + // only some platforms support it (currently). + pthread_getname_np(pthread_self(), buffer, length); +#elif LOGURU_WINTHREADS + snprintf(buffer, static_cast(length), "%s", thread_name_buffer()); +#else + // Thread names unsupported + buffer[0] = 0; +#endif + + if (buffer[0] == 0) { + // We failed to get a readable thread name. + // Write a HEX thread ID instead. + // We try to get an ID that is the same as the ID you could + // read in your debugger, system monitor etc. + +#ifdef __APPLE__ + uint64_t thread_id; + pthread_threadid_np(pthread_self(), &thread_id); +#elif defined(__FreeBSD__) + long thread_id; + (void)thr_self(&thread_id); +#elif LOGURU_PTHREADS + uint64_t thread_id = pthread_self(); +#else + // This ID does not correllate to anything we can get from the OS, + // so this is the worst way to get the ID. + const auto thread_id = + std::hash{}(std::this_thread::get_id()); +#endif + + if (right_align_hex_id) { + snprintf(buffer, static_cast(length), "%*X", + static_cast(length - 1), + static_cast(thread_id)); + } else { + snprintf(buffer, static_cast(length), "%X", + static_cast(thread_id)); + } + } +} + +// ------------------------------------------------------------------------ +// Stack traces #if LOGURU_STACKTRACES - Text demangle(const char* name) - { - int status = -1; - char* demangled = abi::__cxa_demangle(name, 0, 0, &status); - Text result{status == 0 ? demangled : STRDUP(name)}; - return result; - } - - #if LOGURU_RTTI - template - std::string type_name() - { - auto demangled = demangle(typeid(T).name()); - return demangled.c_str(); - } - #endif // LOGURU_RTTI - - static const StringPairList REPLACE_LIST = { - #if LOGURU_RTTI - { type_name(), "std::string" }, - { type_name(), "std::wstring" }, - { type_name(), "std::u16string" }, - { type_name(), "std::u32string" }, - #endif // LOGURU_RTTI - { "std::__1::", "std::" }, - { "__thiscall ", "" }, - { "__cdecl ", "" }, - }; - - void do_replacements(const StringPairList& replacements, std::string& str) - { - for (auto&& p : replacements) { - if (p.first.size() <= p.second.size()) { - // On gcc, "type_name()" is "std::string" - continue; - } - - size_t it; - while ((it=str.find(p.first)) != std::string::npos) { - str.replace(it, p.first.size(), p.second); - } - } - } - - std::string prettify_stacktrace(const std::string& input) - { - std::string output = input; - - do_replacements(s_user_stack_cleanups, output); - do_replacements(REPLACE_LIST, output); - - try { - std::regex std_allocator_re(R"(,\s*std::allocator<[^<>]+>)"); - output = std::regex_replace(output, std_allocator_re, std::string("")); - - std::regex template_spaces_re(R"(<\s*([^<> ]+)\s*>)"); - output = std::regex_replace(output, template_spaces_re, std::string("<$1>")); - } catch (std::regex_error&) { - // Probably old GCC. - } - - return output; - } - - std::string stacktrace_as_stdstring(int skip) - { - // From https://gist.github.com/fmela/591333 - void* callstack[128]; - const auto max_frames = sizeof(callstack) / sizeof(callstack[0]); - int num_frames = backtrace(callstack, max_frames); - char** symbols = backtrace_symbols(callstack, num_frames); - - std::string result; - // Print stack traces so the most relevant ones are written last - // Rationale: http://yellerapp.com/posts/2015-01-22-upside-down-stacktraces.html - for (int i = num_frames - 1; i >= skip; --i) { - char buf[1024]; - Dl_info info; - if (dladdr(callstack[i], &info) && info.dli_sname) { - char* demangled = NULL; - int status = -1; - if (info.dli_sname[0] == '_') { - demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); - } - snprintf(buf, sizeof(buf), "%-3d %*p %s + %zd\n", - i - skip, int(2 + sizeof(void*) * 2), callstack[i], - status == 0 ? demangled : - info.dli_sname == 0 ? symbols[i] : info.dli_sname, - static_cast(callstack[i]) - static_cast(info.dli_saddr)); - free(demangled); - } else { - snprintf(buf, sizeof(buf), "%-3d %*p %s\n", - i - skip, int(2 + sizeof(void*) * 2), callstack[i], symbols[i]); - } - result += buf; - } - free(symbols); - - if (num_frames == max_frames) { - result = "[truncated]\n" + result; - } - - if (!result.empty() && result[result.size() - 1] == '\n') { - result.resize(result.size() - 1); - } - - return prettify_stacktrace(result); - } - -#else // LOGURU_STACKTRACES - Text demangle(const char* name) - { - return Text(STRDUP(name)); - } - - std::string stacktrace_as_stdstring(int) - { - // No stacktraces available on this platform" - return ""; - } - -#endif // LOGURU_STACKTRACES - - Text stacktrace(int skip) - { - auto str = stacktrace_as_stdstring(skip + 1); - return Text(STRDUP(str.c_str())); - } - - // ------------------------------------------------------------------------ - - static void print_preamble_header(char* out_buff, size_t out_buff_size) - { - if (out_buff_size == 0) { return; } - out_buff[0] = '\0'; - size_t pos = 0; - if (g_preamble_date && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "date "); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_time && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "time "); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_uptime && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "( uptime ) "); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_thread && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", LOGURU_THREADNAME_WIDTH, " thread name/id"); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_file && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:line ", LOGURU_FILENAME_WIDTH, "file"); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_verbose && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, " v"); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_pipe && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); - if (bytes > 0) { - pos += bytes; - } - } - } - - static void print_preamble(char* out_buff, size_t out_buff_size, Verbosity verbosity, const char* file, unsigned line) - { - if (out_buff_size == 0) { return; } - out_buff[0] = '\0'; - if (!g_preamble) { return; } - long long ms_since_epoch = duration_cast(system_clock::now().time_since_epoch()).count(); - time_t sec_since_epoch = time_t(ms_since_epoch / 1000); - tm time_info; - localtime_r(&sec_since_epoch, &time_info); - - auto uptime_ms = duration_cast(steady_clock::now() - s_start_time).count(); - auto uptime_sec = static_cast (uptime_ms) / 1000.0; - - char thread_name[LOGURU_THREADNAME_WIDTH + 1] = {0}; - get_thread_name(thread_name, LOGURU_THREADNAME_WIDTH + 1, true); - - if (s_strip_file_path) { - file = filename(file); - } - - char level_buff[6]; - const char* custom_level_name = get_verbosity_name(verbosity); - if (custom_level_name) { - snprintf(level_buff, sizeof(level_buff) - 1, "%s", custom_level_name); - } else { - snprintf(level_buff, sizeof(level_buff) - 1, "% 4d", static_cast(verbosity)); - } - - size_t pos = 0; - - if (g_preamble_date && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%04d-%02d-%02d ", - 1900 + time_info.tm_year, 1 + time_info.tm_mon, time_info.tm_mday); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_time && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%02d:%02d:%02d.%03lld ", - time_info.tm_hour, time_info.tm_min, time_info.tm_sec, ms_since_epoch % 1000); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_uptime && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "(%8.3fs) ", - uptime_sec); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_thread && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", - LOGURU_THREADNAME_WIDTH, thread_name); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_file && pos < out_buff_size) { - char shortened_filename[LOGURU_FILENAME_WIDTH + 1]; - snprintf(shortened_filename, LOGURU_FILENAME_WIDTH + 1, "%s", file); - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:%-5u ", - LOGURU_FILENAME_WIDTH, shortened_filename, line); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_verbose && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%4s", - level_buff); - if (bytes > 0) { - pos += bytes; - } - } - if (g_preamble_pipe && pos < out_buff_size) { - int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); - if (bytes > 0) { - pos += bytes; - } - } - } - - // stack_trace_skip is just if verbosity == FATAL. - static void log_message(int stack_trace_skip, Message& message, bool with_indentation, bool abort_if_fatal) - { - const auto verbosity = message.verbosity; - std::lock_guard lock(s_mutex); - - if (message.verbosity == Verbosity_FATAL) { - auto st = loguru::stacktrace(stack_trace_skip + 2); - if (!st.empty()) { - RAW_LOG_F(ERROR, "Stack trace:\n" LOGURU_FMT(s) "", st.c_str()); - } - - auto ec = loguru::get_error_context(); - if (!ec.empty()) { - RAW_LOG_F(ERROR, "" LOGURU_FMT(s) "", ec.c_str()); - } - } - - if (with_indentation) { - message.indentation = indentation(s_stderr_indentation); - } - - if (verbosity <= g_stderr_verbosity) { - if (g_colorlogtostderr && s_terminal_has_color) { - if (verbosity > Verbosity_WARNING) { - fprintf(stderr, "%s%s%s%s%s%s%s%s\n", - terminal_reset(), - terminal_dim(), - message.preamble, - message.indentation, - verbosity == Verbosity_INFO ? terminal_reset() : "", // un-dim for info - message.prefix, - message.message, - terminal_reset()); - } else { - fprintf(stderr, "%s%s%s%s%s%s%s\n", - terminal_reset(), - verbosity == Verbosity_WARNING ? terminal_yellow() : terminal_red(), - message.preamble, - message.indentation, - message.prefix, - message.message, - terminal_reset()); - } - } else { - fprintf(stderr, "%s%s%s%s\n", - message.preamble, message.indentation, message.prefix, message.message); - } - - if (g_flush_interval_ms == 0) { - fflush(stderr); - } else { - s_needs_flushing = true; - } - } - - for (auto& p : s_callbacks) { - if (verbosity <= p.verbosity) { - if (with_indentation) { - message.indentation = indentation(p.indentation); - } - p.callback(p.user_data, message); - if (g_flush_interval_ms == 0) { - if (p.flush) { p.flush(p.user_data); } - } else { - s_needs_flushing = true; - } - } - } - - if (g_flush_interval_ms > 0 && !s_flush_thread) { - s_flush_thread = new std::thread([](){ - for (;;) { - if (s_needs_flushing) { - flush(); - } - std::this_thread::sleep_for(std::chrono::milliseconds(g_flush_interval_ms)); - } - }); - } - - if (message.verbosity == Verbosity_FATAL) { - flush(); - - if (s_fatal_handler) { - s_fatal_handler(message); - flush(); - } - - if (abort_if_fatal) { +Text demangle(const char* name) { + int status = -1; + char* demangled = abi::__cxa_demangle(name, 0, 0, &status); + Text result{status == 0 ? demangled : STRDUP(name)}; + return result; +} + +#if LOGURU_RTTI +template +std::string type_name() { + auto demangled = demangle(typeid(T).name()); + return demangled.c_str(); +} +#endif // LOGURU_RTTI + +static const StringPairList REPLACE_LIST = { +#if LOGURU_RTTI + {type_name(), "std::string"}, + {type_name(), "std::wstring"}, + {type_name(), "std::u16string"}, + {type_name(), "std::u32string"}, +#endif // LOGURU_RTTI + {"std::__1::", "std::"}, + {"__thiscall ", ""}, + {"__cdecl ", ""}, +}; + +void do_replacements(const StringPairList& replacements, std::string& str) { + for (auto&& p : replacements) { + if (p.first.size() <= p.second.size()) { + // On gcc, "type_name()" is "std::string" + continue; + } + + size_t it; + while ((it = str.find(p.first)) != std::string::npos) { + str.replace(it, p.first.size(), p.second); + } + } +} + +std::string prettify_stacktrace(const std::string& input) { + std::string output = input; + + do_replacements(s_user_stack_cleanups, output); + do_replacements(REPLACE_LIST, output); + + try { + std::regex std_allocator_re(R"(,\s*std::allocator<[^<>]+>)"); + output = std::regex_replace(output, std_allocator_re, std::string("")); + + std::regex template_spaces_re(R"(<\s*([^<> ]+)\s*>)"); + output = + std::regex_replace(output, template_spaces_re, std::string("<$1>")); + } catch (std::regex_error&) { + // Probably old GCC. + } + + return output; +} + +std::string stacktrace_as_stdstring(int skip) { + void* callstack[128]; + const auto max_frames = sizeof(callstack) / sizeof(callstack[0]); + int num_frames; + +#ifdef _WIN32 + num_frames = CaptureStackBackTrace(0, max_frames, callstack, nullptr); +#else + num_frames = backtrace(callstack, max_frames); +#endif + + std::vector symbols(num_frames); + +#ifdef _WIN32 + SYMBOL_INFO* symbol_info = + (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1); + symbol_info->MaxNameLen = 255; + symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO); +#endif + + std::ostringstream result; + for (int i = num_frames - 1; i >= skip; --i) { + char buf[1024]; +#ifdef _WIN32 + if (SymFromAddr(GetCurrentProcess(), (DWORD64)(callstack[i]), 0, + symbol_info)) { + snprintf(buf, sizeof(buf), "%-3d %p %s + %zd\n", i - skip, + callstack[i], symbol_info->Name, + (char*)callstack[i] - (char*)symbol_info->Address); + } else { + snprintf(buf, sizeof(buf), "%-3d %p\n", i - skip, callstack[i]); + } +#else + Dl_info info; + if (dladdr(callstack[i], &info) && info.dli_sname) { + char* demangled = nullptr; + int status = -1; + if (info.dli_sname[0] == '_') { + demangled = abi::__cxa_demangle(info.dli_sname, nullptr, + nullptr, &status); + } + snprintf(buf, sizeof(buf), "%-3d %p %s + %zd\n", i - skip, + callstack[i], + status == 0 ? demangled + : info.dli_sname == nullptr ? symbols[i].c_str() + : info.dli_sname, + (char*)callstack[i] - (char*)info.dli_saddr); + if (demangled) { + free(demangled); + } + } else { + snprintf(buf, sizeof(buf), "%-3d %p %s\n", i - skip, callstack[i], + symbols[i].c_str()); + } +#endif + result << buf; + } + +#ifdef _WIN32 + free(symbol_info); +#endif + + if (num_frames == max_frames) { + result << "[truncated]\n"; + } + + std::string stacktrace = result.str(); + if (!stacktrace.empty() && stacktrace.back() == '\n') { + stacktrace.pop_back(); + } + + return stacktrace; +} + +#else // LOGURU_STACKTRACES +Text demangle(const char* name) { return Text(STRDUP(name)); } + +std::string stacktrace_as_stdstring(int) { + // No stacktraces available on this platform" + return ""; +} + +#endif // LOGURU_STACKTRACES + +Text stacktrace(int skip) { + auto str = stacktrace_as_stdstring(skip + 1); + return Text(STRDUP(str.c_str())); +} + +// ------------------------------------------------------------------------ + +static void print_preamble_header(char* out_buff, size_t out_buff_size) { + if (out_buff_size == 0) { + return; + } + out_buff[0] = '\0'; + size_t pos = 0; + if (g_preamble_date && pos < out_buff_size) { + int bytes = + snprintf(out_buff + pos, out_buff_size - pos, "date "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_time && pos < out_buff_size) { + int bytes = + snprintf(out_buff + pos, out_buff_size - pos, "time "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_uptime && pos < out_buff_size) { + int bytes = + snprintf(out_buff + pos, out_buff_size - pos, "( uptime ) "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_thread && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", + LOGURU_THREADNAME_WIDTH, " thread name/id"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_file && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:line ", + LOGURU_FILENAME_WIDTH, "file"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_verbose && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, " v"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_pipe && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); + if (bytes > 0) { + pos += bytes; + } + } +} + +static void print_preamble(char* out_buff, size_t out_buff_size, + Verbosity verbosity, const char* file, + unsigned line) { + if (out_buff_size == 0) { + return; + } + out_buff[0] = '\0'; + if (!g_preamble) { + return; + } + long long ms_since_epoch = + duration_cast(system_clock::now().time_since_epoch()) + .count(); + time_t sec_since_epoch = time_t(ms_since_epoch / 1000); + tm time_info; + localtime_r(&sec_since_epoch, &time_info); + + auto uptime_ms = + duration_cast(steady_clock::now() - s_start_time).count(); + auto uptime_sec = static_cast(uptime_ms) / 1000.0; + + char thread_name[LOGURU_THREADNAME_WIDTH + 1] = {0}; + get_thread_name(thread_name, LOGURU_THREADNAME_WIDTH + 1, true); + + if (s_strip_file_path) { + file = filename(file); + } + + char level_buff[6]; + const char* custom_level_name = get_verbosity_name(verbosity); + if (custom_level_name) { + snprintf(level_buff, sizeof(level_buff) - 1, "%s", custom_level_name); + } else { + snprintf(level_buff, sizeof(level_buff) - 1, "% 4d", + static_cast(verbosity)); + } + + size_t pos = 0; + + if (g_preamble_date && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, + "%04d-%02d-%02d ", 1900 + time_info.tm_year, + 1 + time_info.tm_mon, time_info.tm_mday); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_time && pos < out_buff_size) { + int bytes = + snprintf(out_buff + pos, out_buff_size - pos, + "%02d:%02d:%02d.%03lld ", time_info.tm_hour, + time_info.tm_min, time_info.tm_sec, ms_since_epoch % 1000); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_uptime && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "(%8.3fs) ", + uptime_sec); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_thread && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", + LOGURU_THREADNAME_WIDTH, thread_name); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_file && pos < out_buff_size) { + char shortened_filename[LOGURU_FILENAME_WIDTH + 1]; + snprintf(shortened_filename, LOGURU_FILENAME_WIDTH + 1, "%s", file); + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:%-5u ", + LOGURU_FILENAME_WIDTH, shortened_filename, line); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_verbose && pos < out_buff_size) { + int bytes = + snprintf(out_buff + pos, out_buff_size - pos, "%4s", level_buff); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_pipe && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); + if (bytes > 0) { + pos += bytes; + } + } +} + +// stack_trace_skip is just if verbosity == FATAL. +static void log_message(int stack_trace_skip, Message& message, + bool with_indentation, bool abort_if_fatal) { + const auto verbosity = message.verbosity; + std::lock_guard lock(s_mutex); + + if (message.verbosity == Verbosity_FATAL) { + auto st = loguru::stacktrace(stack_trace_skip + 2); + if (!st.empty()) { + RAW_LOG_F(ERROR, "Stack trace:\n" LOGURU_FMT(s) "", st.c_str()); + } + + auto ec = loguru::get_error_context(); + if (!ec.empty()) { + RAW_LOG_F(ERROR, "" LOGURU_FMT(s) "", ec.c_str()); + } + } + + if (with_indentation) { + message.indentation = indentation(s_stderr_indentation); + } + + if (verbosity <= g_stderr_verbosity) { + if (g_colorlogtostderr && s_terminal_has_color) { + if (verbosity > Verbosity_WARNING) { + fprintf(stderr, "%s%s%s%s%s%s%s%s\n", terminal_reset(), + terminal_dim(), message.preamble, message.indentation, + verbosity == Verbosity_INFO ? terminal_reset() + : "", // un-dim for info + message.prefix, message.message, terminal_reset()); + } else { + fprintf(stderr, "%s%s%s%s%s%s%s\n", terminal_reset(), + verbosity == Verbosity_WARNING ? terminal_yellow() + : terminal_red(), + message.preamble, message.indentation, message.prefix, + message.message, terminal_reset()); + } + } else { + fprintf(stderr, "%s%s%s%s\n", message.preamble, message.indentation, + message.prefix, message.message); + } + + if (g_flush_interval_ms == 0) { + fflush(stderr); + } else { + s_needs_flushing = true; + } + } + + for (auto& p : s_callbacks) { + if (verbosity <= p.verbosity) { + if (with_indentation) { + message.indentation = indentation(p.indentation); + } + p.callback(p.user_data, message); + if (g_flush_interval_ms == 0) { + if (p.flush) { + p.flush(p.user_data); + } + } else { + s_needs_flushing = true; + } + } + } + + if (g_flush_interval_ms > 0 && !s_flush_thread) { + s_flush_thread = new std::thread([]() { + for (;;) { + if (s_needs_flushing) { + flush(); + } + std::this_thread::sleep_for( + std::chrono::milliseconds(g_flush_interval_ms)); + } + }); + } + + if (message.verbosity == Verbosity_FATAL) { + flush(); + + if (s_fatal_handler) { + s_fatal_handler(message); + flush(); + } + + if (abort_if_fatal) { #if !defined(_WIN32) - if (s_signal_options.sigabrt) { - // Make sure we don't catch our own abort: - signal(SIGABRT, SIG_DFL); - } + if (s_signal_options.sigabrt) { + // Make sure we don't catch our own abort: + signal(SIGABRT, SIG_DFL); + } #endif - abort(); - } - } - } - - // stack_trace_skip is just if verbosity == FATAL. - void log_to_everywhere(int stack_trace_skip, Verbosity verbosity, - const char* file, unsigned line, - const char* prefix, const char* buff) - { - char preamble_buff[LOGURU_PREAMBLE_WIDTH]; - print_preamble(preamble_buff, sizeof(preamble_buff), verbosity, file, line); - auto message = Message{verbosity, file, line, preamble_buff, "", prefix, buff}; - log_message(stack_trace_skip + 1, message, true, true); - } + abort(); + } + } +} + +// stack_trace_skip is just if verbosity == FATAL. +void log_to_everywhere(int stack_trace_skip, Verbosity verbosity, + const char* file, unsigned line, const char* prefix, + const char* buff) { + char preamble_buff[LOGURU_PREAMBLE_WIDTH]; + print_preamble(preamble_buff, sizeof(preamble_buff), verbosity, file, line); + auto message = + Message{verbosity, file, line, preamble_buff, "", prefix, buff}; + log_message(stack_trace_skip + 1, message, true, true); +} #if LOGURU_USE_FMTLIB - void vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, fmt::format_args args) - { - auto formatted = fmt::vformat(format, args); - log_to_everywhere(1, verbosity, file, line, "", formatted.c_str()); - } - - void raw_vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, fmt::format_args args) - { - auto formatted = fmt::vformat(format, args); - auto message = Message{verbosity, file, line, "", "", "", formatted.c_str()}; - log_message(1, message, false, true); - } +void vlog(Verbosity verbosity, const char* file, unsigned line, + const char* format, fmt::format_args args) { + auto formatted = fmt::vformat(format, args); + log_to_everywhere(1, verbosity, file, line, "", formatted.c_str()); +} + +void raw_vlog(Verbosity verbosity, const char* file, unsigned line, + const char* format, fmt::format_args args) { + auto formatted = fmt::vformat(format, args); + auto message = + Message{verbosity, file, line, "", "", "", formatted.c_str()}; + log_message(1, message, false, true); +} #else - void log(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) - { - va_list vlist; - va_start(vlist, format); - vlog(verbosity, file, line, format, vlist); - va_end(vlist); - } - - void vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, va_list vlist) - { - auto buff = vtextprintf(format, vlist); - log_to_everywhere(1, verbosity, file, line, "", buff.c_str()); - } - - void raw_log(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) - { - va_list vlist; - va_start(vlist, format); - auto buff = vtextprintf(format, vlist); - auto message = Message{verbosity, file, line, "", "", "", buff.c_str()}; - log_message(1, message, false, true); - va_end(vlist); - } +void log(Verbosity verbosity, const char* file, unsigned line, + const char* format, ...) { + va_list vlist; + va_start(vlist, format); + vlog(verbosity, file, line, format, vlist); + va_end(vlist); +} + +void vlog(Verbosity verbosity, const char* file, unsigned line, + const char* format, va_list vlist) { + auto buff = vtextprintf(format, vlist); + log_to_everywhere(1, verbosity, file, line, "", buff.c_str()); +} + +void raw_log(Verbosity verbosity, const char* file, unsigned line, + const char* format, ...) { + va_list vlist; + va_start(vlist, format); + auto buff = vtextprintf(format, vlist); + auto message = Message{verbosity, file, line, "", "", "", buff.c_str()}; + log_message(1, message, false, true); + va_end(vlist); +} #endif - void flush() - { - std::lock_guard lock(s_mutex); - fflush(stderr); - for (const auto& callback : s_callbacks) - { - if (callback.flush) { - callback.flush(callback.user_data); - } - } - s_needs_flushing = false; - } - - LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, const char* format, va_list vlist) : - _verbosity(verbosity), _file(file), _line(line) - { - this->Init(format, vlist); - } - - LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) : - _verbosity(verbosity), _file(file), _line(line) - { - va_list vlist; - va_start(vlist, format); - this->Init(format, vlist); - va_end(vlist); - } - - LogScopeRAII::~LogScopeRAII() - { - if (_file) { - std::lock_guard lock(s_mutex); - if (_indent_stderr && s_stderr_indentation > 0) { - --s_stderr_indentation; - } - for (auto& p : s_callbacks) { - // Note: Callback indentation cannot change! - if (_verbosity <= p.verbosity) { - // in unlikely case this callback is new - if (p.indentation > 0) { - --p.indentation; - } - } - } +void flush() { + std::lock_guard lock(s_mutex); + fflush(stderr); + for (const auto& callback : s_callbacks) { + if (callback.flush) { + callback.flush(callback.user_data); + } + } + s_needs_flushing = false; +} + +LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, + const char* format, va_list vlist) + : _verbosity(verbosity), _file(file), _line(line) { + this->Init(format, vlist); +} + +LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, + const char* format, ...) + : _verbosity(verbosity), _file(file), _line(line) { + va_list vlist; + va_start(vlist, format); + this->Init(format, vlist); + va_end(vlist); +} + +LogScopeRAII::~LogScopeRAII() { + if (_file) { + std::lock_guard lock(s_mutex); + if (_indent_stderr && s_stderr_indentation > 0) { + --s_stderr_indentation; + } + for (auto& p : s_callbacks) { + // Note: Callback indentation cannot change! + if (_verbosity <= p.verbosity) { + // in unlikely case this callback is new + if (p.indentation > 0) { + --p.indentation; + } + } + } #if LOGURU_VERBOSE_SCOPE_ENDINGS - auto duration_sec = static_cast(now_ns() - _start_time_ns) / 1e9; + auto duration_sec = + static_cast(now_ns() - _start_time_ns) / 1e9; #if LOGURU_USE_FMTLIB - auto buff = textprintf("{:.{}f} s: {:s}", duration_sec, LOGURU_SCOPE_TIME_PRECISION, _name); + auto buff = textprintf("{:.{}f} s: {:s}", duration_sec, + LOGURU_SCOPE_TIME_PRECISION, _name); #else - auto buff = textprintf("%.*f s: %s", LOGURU_SCOPE_TIME_PRECISION, duration_sec, _name); + auto buff = textprintf("%.*f s: %s", LOGURU_SCOPE_TIME_PRECISION, + duration_sec, _name); #endif - log_to_everywhere(1, _verbosity, _file, _line, "} ", buff.c_str()); + log_to_everywhere(1, _verbosity, _file, _line, "} ", buff.c_str()); #else - log_to_everywhere(1, _verbosity, _file, _line, "}", ""); + log_to_everywhere(1, _verbosity, _file, _line, "}", ""); #endif - } - } - - void LogScopeRAII::Init(const char* format, va_list vlist) - { - if (_verbosity <= current_verbosity_cutoff()) { - std::lock_guard lock(s_mutex); - _indent_stderr = (_verbosity <= g_stderr_verbosity); - _start_time_ns = now_ns(); - vsnprintf(_name, sizeof(_name), format, vlist); - log_to_everywhere(1, _verbosity, _file, _line, "{ ", _name); - - if (_indent_stderr) { - ++s_stderr_indentation; - } - - for (auto& p : s_callbacks) { - if (_verbosity <= p.verbosity) { - ++p.indentation; - } - } - } else { - _file = nullptr; - } - } + } +} + +void LogScopeRAII::Init(const char* format, va_list vlist) { + if (_verbosity <= current_verbosity_cutoff()) { + std::lock_guard lock(s_mutex); + _indent_stderr = (_verbosity <= g_stderr_verbosity); + _start_time_ns = now_ns(); + vsnprintf(_name, sizeof(_name), format, vlist); + log_to_everywhere(1, _verbosity, _file, _line, "{ ", _name); + + if (_indent_stderr) { + ++s_stderr_indentation; + } + + for (auto& p : s_callbacks) { + if (_verbosity <= p.verbosity) { + ++p.indentation; + } + } + } else { + _file = nullptr; + } +} #if LOGURU_USE_FMTLIB - void vlog_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, const char* format, fmt::format_args args) - { - auto formatted = fmt::vformat(format, args); - log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, formatted.c_str()); - abort(); // log_to_everywhere already does this, but this makes the analyzer happy. - } +void vlog_and_abort(int stack_trace_skip, const char* expr, const char* file, + unsigned line, const char* format, fmt::format_args args) { + auto formatted = fmt::vformat(format, args); + log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, + formatted.c_str()); + abort(); // log_to_everywhere already does this, but this makes the + // analyzer happy. +} #else - void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, const char* format, ...) - { - va_list vlist; - va_start(vlist, format); - auto buff = vtextprintf(format, vlist); - log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, buff.c_str()); - va_end(vlist); - abort(); // log_to_everywhere already does this, but this makes the analyzer happy. - } +void log_and_abort(int stack_trace_skip, const char* expr, const char* file, + unsigned line, const char* format, ...) { + va_list vlist; + va_start(vlist, format); + auto buff = vtextprintf(format, vlist); + log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, + buff.c_str()); + va_end(vlist); + abort(); // log_to_everywhere already does this, but this makes the + // analyzer happy. +} #endif - void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line) - { - log_and_abort(stack_trace_skip + 1, expr, file, line, " "); - } +void log_and_abort(int stack_trace_skip, const char* expr, const char* file, + unsigned line) { + log_and_abort(stack_trace_skip + 1, expr, file, line, " "); +} - // ---------------------------------------------------------------------------- - // Streams: +// ---------------------------------------------------------------------------- +// Streams: #if LOGURU_USE_FMTLIB - template - std::string vstrprintf(const char* format, const Args&... args) - { - auto text = textprintf(format, args...); - std::string result = text.c_str(); - return result; - } - - template - std::string strprintf(const char* format, const Args&... args) - { - return vstrprintf(format, args...); - } +template +std::string vstrprintf(const char* format, const Args&... args) { + auto text = textprintf(format, args...); + std::string result = text.c_str(); + return result; +} + +template +std::string strprintf(const char* format, const Args&... args) { + return vstrprintf(format, args...); +} #else - std::string vstrprintf(const char* format, va_list vlist) - { - auto text = vtextprintf(format, vlist); - std::string result = text.c_str(); - return result; - } - - std::string strprintf(const char* format, ...) - { - va_list vlist; - va_start(vlist, format); - auto result = vstrprintf(format, vlist); - va_end(vlist); - return result; - } +std::string vstrprintf(const char* format, va_list vlist) { + auto text = vtextprintf(format, vlist); + std::string result = text.c_str(); + return result; +} + +std::string strprintf(const char* format, ...) { + va_list vlist; + va_start(vlist, format); + auto result = vstrprintf(format, vlist); + va_end(vlist); + return result; +} #endif - #if LOGURU_WITH_STREAMS +#if LOGURU_WITH_STREAMS - StreamLogger::~StreamLogger() noexcept(false) - { - auto message = _ss.str(); - log(_verbosity, _file, _line, LOGURU_FMT(s), message.c_str()); - } +StreamLogger::~StreamLogger() noexcept(false) { + auto message = _ss.str(); + log(_verbosity, _file, _line, LOGURU_FMT(s), message.c_str()); +} - AbortLogger::~AbortLogger() noexcept(false) - { - auto message = _ss.str(); - loguru::log_and_abort(1, _expr, _file, _line, LOGURU_FMT(s), message.c_str()); - } +AbortLogger::~AbortLogger() noexcept(false) { + auto message = _ss.str(); + loguru::log_and_abort(1, _expr, _file, _line, LOGURU_FMT(s), + message.c_str()); +} - #endif // LOGURU_WITH_STREAMS +#endif // LOGURU_WITH_STREAMS - // ---------------------------------------------------------------------------- - // 888888 88""Yb 88""Yb dP"Yb 88""Yb dP""b8 dP"Yb 88b 88 888888 888888 Yb dP 888888 - // 88__ 88__dP 88__dP dP Yb 88__dP dP `" dP Yb 88Yb88 88 88__ YbdP 88 - // 88"" 88"Yb 88"Yb Yb dP 88"Yb Yb Yb dP 88 Y88 88 88"" dPYb 88 - // 888888 88 Yb 88 Yb YbodP 88 Yb YboodP YbodP 88 Y8 88 888888 dP Yb 88 - // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// 888888 88""Yb 88""Yb dP"Yb 88""Yb dP""b8 dP"Yb 88b 88 888888 888888 +// Yb dP 888888 88__ 88__dP 88__dP dP Yb 88__dP dP `" dP Yb 88Yb88 +// 88 88__ YbdP 88 88"" 88"Yb 88"Yb Yb dP 88"Yb Yb Yb dP +// 88 Y88 88 88"" dPYb 88 888888 88 Yb 88 Yb YbodP 88 Yb YboodP +// YbodP 88 Y8 88 888888 dP Yb 88 +// ---------------------------------------------------------------------------- - struct StringStream - { - std::string str; - }; +struct StringStream { + std::string str; +}; - // Use this in your EcPrinter implementations. - void stream_print(StringStream& out_string_stream, const char* text) - { - out_string_stream.str += text; - } +// Use this in your EcPrinter implementations. +void stream_print(StringStream& out_string_stream, const char* text) { + out_string_stream.str += text; +} - // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- - using ECPtr = EcEntryBase*; +using ECPtr = EcEntryBase*; #if defined(_WIN32) || (defined(__APPLE__) && !TARGET_OS_IPHONE) - #ifdef __APPLE__ - #define LOGURU_THREAD_LOCAL __thread - #else - #define LOGURU_THREAD_LOCAL thread_local - #endif - static LOGURU_THREAD_LOCAL ECPtr thread_ec_ptr = nullptr; - - ECPtr& get_thread_ec_head_ref() - { - return thread_ec_ptr; - } -#else // !thread_local - static pthread_once_t s_ec_pthread_once = PTHREAD_ONCE_INIT; - static pthread_key_t s_ec_pthread_key; - - void free_ec_head_ref(void* io_error_context) - { - delete reinterpret_cast(io_error_context); - } - - void ec_make_pthread_key() - { - (void)pthread_key_create(&s_ec_pthread_key, free_ec_head_ref); - } - - ECPtr& get_thread_ec_head_ref() - { - (void)pthread_once(&s_ec_pthread_once, ec_make_pthread_key); - auto ec = reinterpret_cast(pthread_getspecific(s_ec_pthread_key)); - if (ec == nullptr) { - ec = new ECPtr(nullptr); - (void)pthread_setspecific(s_ec_pthread_key, ec); - } - return *ec; - } -#endif // !thread_local - - // ---------------------------------------------------------------------------- - - EcHandle get_thread_ec_handle() - { - return get_thread_ec_head_ref(); - } - - Text get_error_context() - { - return get_error_context_for(get_thread_ec_head_ref()); - } - - Text get_error_context_for(const EcEntryBase* ec_head) - { - std::vector stack; - while (ec_head) { - stack.push_back(ec_head); - ec_head = ec_head->_previous; - } - std::reverse(stack.begin(), stack.end()); - - StringStream result; - if (!stack.empty()) { - result.str += "------------------------------------------------\n"; - for (auto entry : stack) { - const auto description = std::string(entry->_descr) + ":"; +#ifdef __APPLE__ +#define LOGURU_THREAD_LOCAL __thread +#else +#define LOGURU_THREAD_LOCAL thread_local +#endif +static LOGURU_THREAD_LOCAL ECPtr thread_ec_ptr = nullptr; + +ECPtr& get_thread_ec_head_ref() { return thread_ec_ptr; } +#else // !thread_local +static pthread_once_t s_ec_pthread_once = PTHREAD_ONCE_INIT; +static pthread_key_t s_ec_pthread_key; + +void free_ec_head_ref(void* io_error_context) { + delete reinterpret_cast(io_error_context); +} + +void ec_make_pthread_key() { + (void)pthread_key_create(&s_ec_pthread_key, free_ec_head_ref); +} + +ECPtr& get_thread_ec_head_ref() { + (void)pthread_once(&s_ec_pthread_once, ec_make_pthread_key); + auto ec = reinterpret_cast(pthread_getspecific(s_ec_pthread_key)); + if (ec == nullptr) { + ec = new ECPtr(nullptr); + (void)pthread_setspecific(s_ec_pthread_key, ec); + } + return *ec; +} +#endif // !thread_local + +// ---------------------------------------------------------------------------- + +EcHandle get_thread_ec_handle() { return get_thread_ec_head_ref(); } + +Text get_error_context() { + return get_error_context_for(get_thread_ec_head_ref()); +} + +Text get_error_context_for(const EcEntryBase* ec_head) { + std::vector stack; + while (ec_head) { + stack.push_back(ec_head); + ec_head = ec_head->_previous; + } + std::reverse(stack.begin(), stack.end()); + + StringStream result; + if (!stack.empty()) { + result.str += "------------------------------------------------\n"; + for (auto entry : stack) { + const auto description = std::string(entry->_descr) + ":"; #if LOGURU_USE_FMTLIB - auto prefix = textprintf("[ErrorContext] {.{}s}:{:-5u} {:-20s} ", - filename(entry->_file), LOGURU_FILENAME_WIDTH, entry->_line, description.c_str()); + auto prefix = textprintf( + "[ErrorContext] {.{}s}:{:-5u} {:-20s} ", filename(entry->_file), + LOGURU_FILENAME_WIDTH, entry->_line, description.c_str()); #else - auto prefix = textprintf("[ErrorContext] %*s:%-5u %-20s ", - LOGURU_FILENAME_WIDTH, filename(entry->_file), entry->_line, description.c_str()); + auto prefix = textprintf( + "[ErrorContext] %*s:%-5u %-20s ", LOGURU_FILENAME_WIDTH, + filename(entry->_file), entry->_line, description.c_str()); #endif - result.str += prefix.c_str(); - entry->print_value(result); - result.str += "\n"; - } - result.str += "------------------------------------------------"; - } - return Text(STRDUP(result.str.c_str())); - } - - EcEntryBase::EcEntryBase(const char* file, unsigned line, const char* descr) - : _file(file), _line(line), _descr(descr) - { - EcEntryBase*& ec_head = get_thread_ec_head_ref(); - _previous = ec_head; - ec_head = this; - } - - EcEntryBase::~EcEntryBase() - { - get_thread_ec_head_ref() = _previous; - } - - // ------------------------------------------------------------------------ - - Text ec_to_text(const char* value) - { - // Add quotes around the string to make it obvious where it begin and ends. - // This is great for detecting erroneous leading or trailing spaces in e.g. an identifier. - auto str = "\"" + std::string(value) + "\""; - return Text{STRDUP(str.c_str())}; - } - - Text ec_to_text(char c) - { - // Add quotes around the character to make it obvious where it begin and ends. - std::string str = "'"; - - auto write_hex_digit = [&](unsigned num) - { - if (num < 10u) { str += char('0' + num); } - else { str += char('a' + num - 10); } - }; - - auto write_hex_16 = [&](uint16_t n) - { - write_hex_digit((n >> 12u) & 0x0f); - write_hex_digit((n >> 8u) & 0x0f); - write_hex_digit((n >> 4u) & 0x0f); - write_hex_digit((n >> 0u) & 0x0f); - }; - - if (c == '\\') { str += "\\\\"; } - else if (c == '\"') { str += "\\\""; } - else if (c == '\'') { str += "\\\'"; } - else if (c == '\0') { str += "\\0"; } - else if (c == '\b') { str += "\\b"; } - else if (c == '\f') { str += "\\f"; } - else if (c == '\n') { str += "\\n"; } - else if (c == '\r') { str += "\\r"; } - else if (c == '\t') { str += "\\t"; } - else if (0 <= c && c < 0x20) { - str += "\\u"; - write_hex_16(static_cast(c)); - } else { str += c; } - - str += "'"; - - return Text{STRDUP(str.c_str())}; - } - - #define DEFINE_EC(Type) \ - Text ec_to_text(Type value) \ - { \ - auto str = std::to_string(value); \ - return Text{STRDUP(str.c_str())}; \ - } - - DEFINE_EC(int) - DEFINE_EC(unsigned int) - DEFINE_EC(long) - DEFINE_EC(unsigned long) - DEFINE_EC(long long) - DEFINE_EC(unsigned long long) - DEFINE_EC(float) - DEFINE_EC(double) - DEFINE_EC(long double) - - #undef DEFINE_EC - - Text ec_to_text(EcHandle ec_handle) - { - Text parent_ec = get_error_context_for(ec_handle); - size_t buffer_size = strlen(parent_ec.c_str()) + 2; - char* with_newline = reinterpret_cast(malloc(buffer_size)); - with_newline[0] = '\n'; - #ifdef _WIN32 - strncpy_s(with_newline + 1, buffer_size, parent_ec.c_str(), buffer_size - 2); - #else - strcpy(with_newline + 1, parent_ec.c_str()); - #endif - return Text(with_newline); - } - - // ---------------------------------------------------------------------------- - -} // namespace loguru + result.str += prefix.c_str(); + entry->print_value(result); + result.str += "\n"; + } + result.str += "------------------------------------------------"; + } + return Text(STRDUP(result.str.c_str())); +} + +EcEntryBase::EcEntryBase(const char* file, unsigned line, const char* descr) + : _file(file), _line(line), _descr(descr) { + EcEntryBase*& ec_head = get_thread_ec_head_ref(); + _previous = ec_head; + ec_head = this; +} + +EcEntryBase::~EcEntryBase() { get_thread_ec_head_ref() = _previous; } + +// ------------------------------------------------------------------------ + +Text ec_to_text(const char* value) { + // Add quotes around the string to make it obvious where it begin and ends. + // This is great for detecting erroneous leading or trailing spaces in e.g. + // an identifier. + auto str = "\"" + std::string(value) + "\""; + return Text{STRDUP(str.c_str())}; +} + +Text ec_to_text(char c) { + // Add quotes around the character to make it obvious where it begin and + // ends. + std::string str = "'"; + + auto write_hex_digit = [&](unsigned num) { + if (num < 10u) { + str += char('0' + num); + } else { + str += char('a' + num - 10); + } + }; + + auto write_hex_16 = [&](uint16_t n) { + write_hex_digit((n >> 12u) & 0x0f); + write_hex_digit((n >> 8u) & 0x0f); + write_hex_digit((n >> 4u) & 0x0f); + write_hex_digit((n >> 0u) & 0x0f); + }; + + if (c == '\\') { + str += "\\\\"; + } else if (c == '\"') { + str += "\\\""; + } else if (c == '\'') { + str += "\\\'"; + } else if (c == '\0') { + str += "\\0"; + } else if (c == '\b') { + str += "\\b"; + } else if (c == '\f') { + str += "\\f"; + } else if (c == '\n') { + str += "\\n"; + } else if (c == '\r') { + str += "\\r"; + } else if (c == '\t') { + str += "\\t"; + } else if (0 <= c && c < 0x20) { + str += "\\u"; + write_hex_16(static_cast(c)); + } else { + str += c; + } + + str += "'"; + + return Text{STRDUP(str.c_str())}; +} + +#define DEFINE_EC(Type) \ + Text ec_to_text(Type value) { \ + auto str = std::to_string(value); \ + return Text{STRDUP(str.c_str())}; \ + } + +DEFINE_EC(int) +DEFINE_EC(unsigned int) +DEFINE_EC(long) +DEFINE_EC(unsigned long) +DEFINE_EC(long long) +DEFINE_EC(unsigned long long) +DEFINE_EC(float) +DEFINE_EC(double) +DEFINE_EC(long double) + +#undef DEFINE_EC + +Text ec_to_text(EcHandle ec_handle) { + Text parent_ec = get_error_context_for(ec_handle); + size_t buffer_size = strlen(parent_ec.c_str()) + 2; + char* with_newline = reinterpret_cast(malloc(buffer_size)); + with_newline[0] = '\n'; +#ifdef _WIN32 + strncpy_s(with_newline + 1, buffer_size, parent_ec.c_str(), + buffer_size - 2); +#else + strcpy(with_newline + 1, parent_ec.c_str()); +#endif + return Text(with_newline); +} + +// ---------------------------------------------------------------------------- + +} // namespace loguru // ---------------------------------------------------------------------------- // .dP"Y8 88 dP""b8 88b 88 db 88 .dP"Y8 @@ -1898,133 +1968,147 @@ namespace loguru #ifdef _WIN32 namespace loguru { - void install_signal_handlers(const SignalOptions& signal_options) - { - (void)signal_options; - // TODO: implement signal handlers on windows - } -} // namespace loguru - -#else // _WIN32 - -namespace loguru -{ - void write_to_stderr(const char* data, size_t size) - { - auto result = write(STDERR_FILENO, data, size); - (void)result; // Ignore errors. - } - - void write_to_stderr(const char* data) - { - write_to_stderr(data, strlen(data)); - } - - void call_default_signal_handler(int signal_number) - { - struct sigaction sig_action; - memset(&sig_action, 0, sizeof(sig_action)); - sigemptyset(&sig_action.sa_mask); - sig_action.sa_handler = SIG_DFL; - sigaction(signal_number, &sig_action, NULL); - kill(getpid(), signal_number); - } - - void signal_handler(int signal_number, siginfo_t*, void*) - { - const char* signal_name = "UNKNOWN SIGNAL"; - - if (signal_number == SIGABRT) { signal_name = "SIGABRT"; } - if (signal_number == SIGBUS) { signal_name = "SIGBUS"; } - if (signal_number == SIGFPE) { signal_name = "SIGFPE"; } - if (signal_number == SIGILL) { signal_name = "SIGILL"; } - if (signal_number == SIGINT) { signal_name = "SIGINT"; } - if (signal_number == SIGSEGV) { signal_name = "SIGSEGV"; } - if (signal_number == SIGTERM) { signal_name = "SIGTERM"; } - - // -------------------------------------------------------------------- - /* There are few things that are safe to do in a signal handler, - but writing to stderr is one of them. - So we first print out what happened to stderr so we're sure that gets out, - then we do the unsafe things, like logging the stack trace. - */ - - if (g_colorlogtostderr && s_terminal_has_color) { - write_to_stderr(terminal_reset()); - write_to_stderr(terminal_bold()); - write_to_stderr(terminal_light_red()); - } - write_to_stderr("\n"); - write_to_stderr("Loguru caught a signal: "); - write_to_stderr(signal_name); - write_to_stderr("\n"); - if (g_colorlogtostderr && s_terminal_has_color) { - write_to_stderr(terminal_reset()); - } - - // -------------------------------------------------------------------- - - if (s_signal_options.unsafe_signal_handler) { - // -------------------------------------------------------------------- - /* Now we do unsafe things. This can for example lead to deadlocks if - the signal was triggered from the system's memory management functions - and the code below tries to do allocations. - */ - - flush(); - char preamble_buff[LOGURU_PREAMBLE_WIDTH]; - print_preamble(preamble_buff, sizeof(preamble_buff), Verbosity_FATAL, "", 0); - auto message = Message{Verbosity_FATAL, "", 0, preamble_buff, "", "Signal: ", signal_name}; - try { - log_message(1, message, false, false); - } catch (...) { - // This can happed due to s_fatal_handler. - write_to_stderr("Exception caught and ignored by Loguru signal handler.\n"); - } - flush(); - - // -------------------------------------------------------------------- - } - - call_default_signal_handler(signal_number); - } - - void install_signal_handlers(const SignalOptions& signal_options) - { - s_signal_options = signal_options; - - struct sigaction sig_action; - memset(&sig_action, 0, sizeof(sig_action)); - sigemptyset(&sig_action.sa_mask); - sig_action.sa_flags |= SA_SIGINFO; - sig_action.sa_sigaction = &signal_handler; - - if (signal_options.sigabrt) { - CHECK_F(sigaction(SIGABRT, &sig_action, NULL) != -1, "Failed to install handler for SIGABRT"); - } - if (signal_options.sigbus) { - CHECK_F(sigaction(SIGBUS, &sig_action, NULL) != -1, "Failed to install handler for SIGBUS"); - } - if (signal_options.sigfpe) { - CHECK_F(sigaction(SIGFPE, &sig_action, NULL) != -1, "Failed to install handler for SIGFPE"); - } - if (signal_options.sigill) { - CHECK_F(sigaction(SIGILL, &sig_action, NULL) != -1, "Failed to install handler for SIGILL"); - } - if (signal_options.sigint) { - CHECK_F(sigaction(SIGINT, &sig_action, NULL) != -1, "Failed to install handler for SIGINT"); - } - if (signal_options.sigsegv) { - CHECK_F(sigaction(SIGSEGV, &sig_action, NULL) != -1, "Failed to install handler for SIGSEGV"); - } - if (signal_options.sigterm) { - CHECK_F(sigaction(SIGTERM, &sig_action, NULL) != -1, "Failed to install handler for SIGTERM"); - } - } -} // namespace loguru - -#endif // _WIN32 +void install_signal_handlers(const SignalOptions& signal_options) { + (void)signal_options; + // TODO: implement signal handlers on windows +} +} // namespace loguru + +#else // _WIN32 +namespace loguru { +void write_to_stderr(const char* data, size_t size) { + auto result = write(STDERR_FILENO, data, size); + (void)result; // Ignore errors. +} + +void write_to_stderr(const char* data) { write_to_stderr(data, strlen(data)); } + +void call_default_signal_handler(int signal_number) { + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_handler = SIG_DFL; + sigaction(signal_number, &sig_action, NULL); + kill(getpid(), signal_number); +} + +void signal_handler(int signal_number, siginfo_t*, void*) { + const char* signal_name = "UNKNOWN SIGNAL"; + + if (signal_number == SIGABRT) { + signal_name = "SIGABRT"; + } + if (signal_number == SIGBUS) { + signal_name = "SIGBUS"; + } + if (signal_number == SIGFPE) { + signal_name = "SIGFPE"; + } + if (signal_number == SIGILL) { + signal_name = "SIGILL"; + } + if (signal_number == SIGINT) { + signal_name = "SIGINT"; + } + if (signal_number == SIGSEGV) { + signal_name = "SIGSEGV"; + } + if (signal_number == SIGTERM) { + signal_name = "SIGTERM"; + } + + // -------------------------------------------------------------------- + /* There are few things that are safe to do in a signal handler, + but writing to stderr is one of them. + So we first print out what happened to stderr so we're sure that gets + out, then we do the unsafe things, like logging the stack trace. + */ + + if (g_colorlogtostderr && s_terminal_has_color) { + write_to_stderr(terminal_reset()); + write_to_stderr(terminal_bold()); + write_to_stderr(terminal_light_red()); + } + write_to_stderr("\n"); + write_to_stderr("Loguru caught a signal: "); + write_to_stderr(signal_name); + write_to_stderr("\n"); + if (g_colorlogtostderr && s_terminal_has_color) { + write_to_stderr(terminal_reset()); + } + + // -------------------------------------------------------------------- + + if (s_signal_options.unsafe_signal_handler) { + // -------------------------------------------------------------------- + /* Now we do unsafe things. This can for example lead to deadlocks if + the signal was triggered from the system's memory management + functions and the code below tries to do allocations. + */ + + flush(); + char preamble_buff[LOGURU_PREAMBLE_WIDTH]; + print_preamble(preamble_buff, sizeof(preamble_buff), Verbosity_FATAL, + "", 0); + auto message = Message{ + Verbosity_FATAL, "", 0, preamble_buff, "", "Signal: ", signal_name}; + try { + log_message(1, message, false, false); + } catch (...) { + // This can happed due to s_fatal_handler. + write_to_stderr( + "Exception caught and ignored by Loguru signal handler.\n"); + } + flush(); + + // -------------------------------------------------------------------- + } + + call_default_signal_handler(signal_number); +} + +void install_signal_handlers(const SignalOptions& signal_options) { + s_signal_options = signal_options; + + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_flags |= SA_SIGINFO; + sig_action.sa_sigaction = &signal_handler; + + if (signal_options.sigabrt) { + CHECK_F(sigaction(SIGABRT, &sig_action, NULL) != -1, + "Failed to install handler for SIGABRT"); + } + if (signal_options.sigbus) { + CHECK_F(sigaction(SIGBUS, &sig_action, NULL) != -1, + "Failed to install handler for SIGBUS"); + } + if (signal_options.sigfpe) { + CHECK_F(sigaction(SIGFPE, &sig_action, NULL) != -1, + "Failed to install handler for SIGFPE"); + } + if (signal_options.sigill) { + CHECK_F(sigaction(SIGILL, &sig_action, NULL) != -1, + "Failed to install handler for SIGILL"); + } + if (signal_options.sigint) { + CHECK_F(sigaction(SIGINT, &sig_action, NULL) != -1, + "Failed to install handler for SIGINT"); + } + if (signal_options.sigsegv) { + CHECK_F(sigaction(SIGSEGV, &sig_action, NULL) != -1, + "Failed to install handler for SIGSEGV"); + } + if (signal_options.sigterm) { + CHECK_F(sigaction(SIGTERM, &sig_action, NULL) != -1, + "Failed to install handler for SIGTERM"); + } +} +} // namespace loguru + +#endif // _WIN32 #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop @@ -2034,4 +2118,4 @@ namespace loguru LOGURU_ANONYMOUS_NAMESPACE_END -#endif // LOGURU_IMPLEMENTATION +#endif // LOGURU_IMPLEMENTATION diff --git a/src/atom/log/loguru.hpp b/src/atom/log/loguru.hpp index 4742b272..93203f91 100644 --- a/src/atom/log/loguru.hpp +++ b/src/atom/log/loguru.hpp @@ -7,99 +7,124 @@ Mail: emil.ernerfeldt@gmail.com Website: www.ilikebigbits.com # License - This software is in the public domain. Where that dedication is not - recognized, you are granted a perpetual, irrevocable license to - copy, modify and distribute it as you see fit. + This software is in the public domain. Where that dedication is not + recognized, you are granted a perpetual, irrevocable license to + copy, modify and distribute it as you see fit. # Inspiration - Much of Loguru was inspired by GLOG, https://code.google.com/p/google-glog/. - The choice of public domain is fully due Sean T. Barrett - and his wonderful stb libraries at https://github.com/nothings/stb. + Much of Loguru was inspired by GLOG, +https://code.google.com/p/google-glog/. The choice of public domain is fully due +Sean T. Barrett and his wonderful stb libraries at +https://github.com/nothings/stb. # Version history - * Version 0.1.0 - 2015-03-22 - Works great on Mac. - * Version 0.2.0 - 2015-09-17 - Removed the only dependency. - * Version 0.3.0 - 2015-10-02 - Drop-in replacement for most of GLOG - * Version 0.4.0 - 2015-10-07 - Single-file! - * Version 0.5.0 - 2015-10-17 - Improved file logging - * Version 0.6.0 - 2015-10-24 - Add stack traces - * Version 0.7.0 - 2015-10-27 - Signals - * Version 0.8.0 - 2015-10-30 - Color logging. - * Version 0.9.0 - 2015-11-26 - ABORT_S and proper handling of FATAL - * Version 1.0.0 - 2016-02-14 - ERROR_CONTEXT - * Version 1.1.0 - 2016-02-19 - -v OFF, -v INFO etc - * Version 1.1.1 - 2016-02-20 - textprintf vs strprintf - * Version 1.1.2 - 2016-02-22 - Remove g_alsologtostderr - * Version 1.1.3 - 2016-02-29 - ERROR_CONTEXT as linked list - * Version 1.2.0 - 2016-03-19 - Add get_thread_name() - * Version 1.2.1 - 2016-03-20 - Minor fixes - * Version 1.2.2 - 2016-03-29 - Fix issues with set_fatal_handler throwing an exception - * Version 1.2.3 - 2016-05-16 - Log current working directory in loguru::init(). - * Version 1.2.4 - 2016-05-18 - Custom replacement for -v in loguru::init() by bjoernpollex - * Version 1.2.5 - 2016-05-18 - Add ability to print ERROR_CONTEXT of parent thread. - * Version 1.2.6 - 2016-05-19 - Bug fix regarding VLOG verbosity argument lacking (). - * Version 1.2.7 - 2016-05-23 - Fix PATH_MAX problem. - * Version 1.2.8 - 2016-05-26 - Add shutdown() and remove_all_callbacks() - * Version 1.2.9 - 2016-06-09 - Use a monotonic clock for uptime. - * Version 1.3.0 - 2016-07-20 - Fix issues with callback flush/close not being called. - * Version 1.3.1 - 2016-07-20 - Add LOGURU_UNSAFE_SIGNAL_HANDLER to toggle stacktrace on signals. - * Version 1.3.2 - 2016-07-20 - Add loguru::arguments() - * Version 1.4.0 - 2016-09-15 - Semantic versioning + add loguru::create_directories - * Version 1.4.1 - 2016-09-29 - Customize formating with LOGURU_FILENAME_WIDTH - * Version 1.5.0 - 2016-12-22 - LOGURU_USE_FMTLIB by kolis and LOGURU_WITH_FILEABS by scinart - * Version 1.5.1 - 2017-08-08 - Terminal colors on Windows 10 thanks to looki - * Version 1.6.0 - 2018-01-03 - Add LOGURU_RTTI and LOGURU_STACKTRACES settings - * Version 1.7.0 - 2018-01-03 - Add ability to turn off the preamble with loguru::g_preamble - * Version 1.7.1 - 2018-04-05 - Add function get_fatal_handler - * Version 1.7.2 - 2018-04-22 - Fix a bug where large file names could cause stack corruption (thanks @ccamporesi) - * Version 1.8.0 - 2018-04-23 - Shorten long file names to keep preamble fixed width - * Version 1.9.0 - 2018-09-22 - Adjust terminal colors, add LOGURU_VERBOSE_SCOPE_ENDINGS, add LOGURU_SCOPE_TIME_PRECISION, add named log levels - * Version 2.0.0 - 2018-09-22 - Split loguru.hpp into loguru.hpp and loguru.cpp - * Version 2.1.0 - 2019-09-23 - Update fmtlib + add option to loguru::init to NOT set main thread name. - * Version 2.2.0 - 2020-07-31 - Replace LOGURU_CATCH_SIGABRT with struct SignalOptions + * Version 0.1.0 - 2015-03-22 - Works great on Mac. + * Version 0.2.0 - 2015-09-17 - Removed the only dependency. + * Version 0.3.0 - 2015-10-02 - Drop-in replacement for most of GLOG + * Version 0.4.0 - 2015-10-07 - Single-file! + * Version 0.5.0 - 2015-10-17 - Improved file logging + * Version 0.6.0 - 2015-10-24 - Add stack traces + * Version 0.7.0 - 2015-10-27 - Signals + * Version 0.8.0 - 2015-10-30 - Color logging. + * Version 0.9.0 - 2015-11-26 - ABORT_S and proper handling of FATAL + * Version 1.0.0 - 2016-02-14 - ERROR_CONTEXT + * Version 1.1.0 - 2016-02-19 - -v OFF, -v INFO etc + * Version 1.1.1 - 2016-02-20 - textprintf vs strprintf + * Version 1.1.2 - 2016-02-22 - Remove g_alsologtostderr + * Version 1.1.3 - 2016-02-29 - ERROR_CONTEXT as linked list + * Version 1.2.0 - 2016-03-19 - Add get_thread_name() + * Version 1.2.1 - 2016-03-20 - Minor fixes + * Version 1.2.2 - 2016-03-29 - Fix issues with set_fatal_handler +throwing an exception + * Version 1.2.3 - 2016-05-16 - Log current working directory in +loguru::init(). + * Version 1.2.4 - 2016-05-18 - Custom replacement for -v in +loguru::init() by bjoernpollex + * Version 1.2.5 - 2016-05-18 - Add ability to print ERROR_CONTEXT of +parent thread. + * Version 1.2.6 - 2016-05-19 - Bug fix regarding VLOG verbosity argument +lacking (). + * Version 1.2.7 - 2016-05-23 - Fix PATH_MAX problem. + * Version 1.2.8 - 2016-05-26 - Add shutdown() and remove_all_callbacks() + * Version 1.2.9 - 2016-06-09 - Use a monotonic clock for uptime. + * Version 1.3.0 - 2016-07-20 - Fix issues with callback flush/close not +being called. + * Version 1.3.1 - 2016-07-20 - Add LOGURU_UNSAFE_SIGNAL_HANDLER to +toggle stacktrace on signals. + * Version 1.3.2 - 2016-07-20 - Add loguru::arguments() + * Version 1.4.0 - 2016-09-15 - Semantic versioning + add +loguru::create_directories + * Version 1.4.1 - 2016-09-29 - Customize formating with +LOGURU_FILENAME_WIDTH + * Version 1.5.0 - 2016-12-22 - LOGURU_USE_FMTLIB by kolis and +LOGURU_WITH_FILEABS by scinart + * Version 1.5.1 - 2017-08-08 - Terminal colors on Windows 10 thanks to +looki + * Version 1.6.0 - 2018-01-03 - Add LOGURU_RTTI and LOGURU_STACKTRACES +settings + * Version 1.7.0 - 2018-01-03 - Add ability to turn off the preamble with +loguru::g_preamble + * Version 1.7.1 - 2018-04-05 - Add function get_fatal_handler + * Version 1.7.2 - 2018-04-22 - Fix a bug where large file names could +cause stack corruption (thanks @ccamporesi) + * Version 1.8.0 - 2018-04-23 - Shorten long file names to keep preamble +fixed width + * Version 1.9.0 - 2018-09-22 - Adjust terminal colors, add +LOGURU_VERBOSE_SCOPE_ENDINGS, add LOGURU_SCOPE_TIME_PRECISION, add named log +levels + * Version 2.0.0 - 2018-09-22 - Split loguru.hpp into loguru.hpp and +loguru.cpp + * Version 2.1.0 - 2019-09-23 - Update fmtlib + add option to +loguru::init to NOT set main thread name. + * Version 2.2.0 - 2020-07-31 - Replace LOGURU_CATCH_SIGABRT with struct +SignalOptions # Compiling - Just include where you want to use Loguru. - Then, in one .cpp file #include - Make sure you compile with -std=c++11 -lstdc++ -lpthread -ldl + Just include where you want to use Loguru. + Then, in one .cpp file #include + Make sure you compile with -std=c++11 -lstdc++ -lpthread -ldl # Usage - For details, please see the official documentation at emilk.github.io/loguru + For details, please see the official documentation at +emilk.github.io/loguru - #include + #include - int main(int argc, char* argv[]) { - loguru::init(argc, argv); + int main(int argc, char* argv[]) { + loguru::init(argc, argv); - // Put every log message in "everything.log": - loguru::add_file("everything.log", loguru::Append, loguru::Verbosity_MAX); + // Put every log message in "everything.log": + loguru::add_file("everything.log", loguru::Append, +loguru::Verbosity_MAX); - LOG_F(INFO, "The magic number is %d", 42); - } + LOG_F(INFO, "The magic number is %d", 42); + } */ #if defined(LOGURU_IMPLEMENTATION) - #error "You are defining LOGURU_IMPLEMENTATION. This is for older versions of Loguru. You should now instead include loguru.cpp (or build it and link with it)" +#error \ + "You are defining LOGURU_IMPLEMENTATION. This is for older versions of Loguru. You should now instead include loguru.cpp (or build it and link with it)" #endif // Disable all warnings from gcc/clang: #if defined(__clang__) - #pragma clang system_header +#pragma clang system_header #elif defined(__GNUC__) - #pragma GCC system_header +#pragma GCC system_header #endif #ifndef LOGURU_HAS_DECLARED_FORMAT_HEADER #define LOGURU_HAS_DECLARED_FORMAT_HEADER -// Semantic versioning. Loguru version can be printed with printf("%d.%d.%d", LOGURU_VERSION_MAJOR, LOGURU_VERSION_MINOR, LOGURU_VERSION_PATCH); +// Semantic versioning. Loguru version can be printed with printf("%d.%d.%d", +// LOGURU_VERSION_MAJOR, LOGURU_VERSION_MINOR, LOGURU_VERSION_PATCH); #define LOGURU_VERSION_MAJOR 2 #define LOGURU_VERSION_MINOR 1 #define LOGURU_VERSION_PATCH 0 #if defined(_MSC_VER) -#include // Needed for _In_z_ etc annotations +#include // Needed for _In_z_ etc annotations #endif #if defined(__linux__) || defined(__APPLE__) @@ -111,128 +136,134 @@ Website: www.ilikebigbits.com // ---------------------------------------------------------------------------- #ifndef LOGURU_EXPORT - // Define to your project's export declaration if needed for use in a shared library. - #define LOGURU_EXPORT +// Define to your project's export declaration if needed for use in a shared +// library. +#define LOGURU_EXPORT #endif #ifndef LOGURU_SCOPE_TEXT_SIZE - // Maximum length of text that can be printed by a LOG_SCOPE. - // This should be long enough to get most things, but short enough not to clutter the stack. - #define LOGURU_SCOPE_TEXT_SIZE 196 +// Maximum length of text that can be printed by a LOG_SCOPE. +// This should be long enough to get most things, but short enough not to +// clutter the stack. +#define LOGURU_SCOPE_TEXT_SIZE 196 #endif #ifndef LOGURU_FILENAME_WIDTH - // Width of the column containing the file name - #define LOGURU_FILENAME_WIDTH 23 +// Width of the column containing the file name +#define LOGURU_FILENAME_WIDTH 23 #endif #ifndef LOGURU_THREADNAME_WIDTH - // Width of the column containing the thread name - #define LOGURU_THREADNAME_WIDTH 16 +// Width of the column containing the thread name +#define LOGURU_THREADNAME_WIDTH 16 #endif #ifndef LOGURU_SCOPE_TIME_PRECISION - // Resolution of scope timers. 3=ms, 6=us, 9=ns - #define LOGURU_SCOPE_TIME_PRECISION 3 +// Resolution of scope timers. 3=ms, 6=us, 9=ns +#define LOGURU_SCOPE_TIME_PRECISION 3 #endif #ifdef LOGURU_CATCH_SIGABRT - #error "You are defining LOGURU_CATCH_SIGABRT. This is for older versions of Loguru. You should now instead set the options passed to loguru::init" +#error \ + "You are defining LOGURU_CATCH_SIGABRT. This is for older versions of Loguru. You should now instead set the options passed to loguru::init" #endif #ifndef LOGURU_VERBOSE_SCOPE_ENDINGS - // Show milliseconds and scope name at end of scope. - #define LOGURU_VERBOSE_SCOPE_ENDINGS 1 +// Show milliseconds and scope name at end of scope. +#define LOGURU_VERBOSE_SCOPE_ENDINGS 1 #endif #ifndef LOGURU_REDEFINE_ASSERT - #define LOGURU_REDEFINE_ASSERT 0 +#define LOGURU_REDEFINE_ASSERT 0 #endif #ifndef LOGURU_WITH_STREAMS - #define LOGURU_WITH_STREAMS 0 +#define LOGURU_WITH_STREAMS 0 #endif #ifndef LOGURU_REPLACE_GLOG - #define LOGURU_REPLACE_GLOG 0 +#define LOGURU_REPLACE_GLOG 0 #endif #if LOGURU_REPLACE_GLOG - #undef LOGURU_WITH_STREAMS - #define LOGURU_WITH_STREAMS 1 +#undef LOGURU_WITH_STREAMS +#define LOGURU_WITH_STREAMS 1 #endif #if defined(LOGURU_UNSAFE_SIGNAL_HANDLER) - #error "You are defining LOGURU_UNSAFE_SIGNAL_HANDLER. This is for older versions of Loguru. You should now instead set the unsafe_signal_handler option when you call loguru::init." +#error \ + "You are defining LOGURU_UNSAFE_SIGNAL_HANDLER. This is for older versions of Loguru. You should now instead set the unsafe_signal_handler option when you call loguru::init." #endif #if LOGURU_IMPLEMENTATION - #undef LOGURU_WITH_STREAMS - #define LOGURU_WITH_STREAMS 1 +#undef LOGURU_WITH_STREAMS +#define LOGURU_WITH_STREAMS 1 #endif #ifndef LOGURU_USE_FMTLIB - #define LOGURU_USE_FMTLIB 1 +#define LOGURU_USE_FMTLIB 1 #endif #ifndef LOGURU_USE_LOCALE - #define LOGURU_USE_LOCALE 0 +#define LOGURU_USE_LOCALE 0 #endif #ifndef LOGURU_WITH_FILEABS - #define LOGURU_WITH_FILEABS 0 +#define LOGURU_WITH_FILEABS 0 #endif #ifndef LOGURU_RTTI #if defined(__clang__) - #if __has_feature(cxx_rtti) - #define LOGURU_RTTI 1 - #endif +#if __has_feature(cxx_rtti) +#define LOGURU_RTTI 1 +#endif #elif defined(__GNUG__) - #if defined(__GXX_RTTI) - #define LOGURU_RTTI 1 - #endif +#if defined(__GXX_RTTI) +#define LOGURU_RTTI 1 +#endif #elif defined(_MSC_VER) - #if defined(_CPPRTTI) - #define LOGURU_RTTI 1 - #endif +#if defined(_CPPRTTI) +#define LOGURU_RTTI 1 +#endif #endif #endif #ifdef LOGURU_USE_ANONYMOUS_NAMESPACE - #define LOGURU_ANONYMOUS_NAMESPACE_BEGIN namespace { - #define LOGURU_ANONYMOUS_NAMESPACE_END } +#define LOGURU_ANONYMOUS_NAMESPACE_BEGIN namespace { +#define LOGURU_ANONYMOUS_NAMESPACE_END } #else - #define LOGURU_ANONYMOUS_NAMESPACE_BEGIN - #define LOGURU_ANONYMOUS_NAMESPACE_END +#define LOGURU_ANONYMOUS_NAMESPACE_BEGIN +#define LOGURU_ANONYMOUS_NAMESPACE_END #endif // -------------------------------------------------------------------- // Utility macros -#define LOGURU_CONCATENATE_IMPL(s1, s2) s1 ## s2 +#define LOGURU_CONCATENATE_IMPL(s1, s2) s1##s2 #define LOGURU_CONCATENATE(s1, s2) LOGURU_CONCATENATE_IMPL(s1, s2) #ifdef __COUNTER__ -# define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __COUNTER__) +#define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __COUNTER__) #else -# define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __LINE__) +#define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __LINE__) #endif #if defined(__clang__) || defined(__GNUC__) - // Helper macro for declaring functions as having similar signature to printf. - // This allows the compiler to catch format errors at compile-time. - #define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) __attribute__((__format__ (__printf__, fmtarg, firstvararg))) - #define LOGURU_FORMAT_STRING_TYPE const char* +// Helper macro for declaring functions as having similar signature to printf. +// This allows the compiler to catch format errors at compile-time. +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) \ + __attribute__((__format__(__printf__, fmtarg, firstvararg))) +#define LOGURU_FORMAT_STRING_TYPE const char* #elif defined(_MSC_VER) - #define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) - #define LOGURU_FORMAT_STRING_TYPE _In_z_ _Printf_format_string_ const char* +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) +#define LOGURU_FORMAT_STRING_TYPE _In_z_ _Printf_format_string_ const char* #else - #define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) - #define LOGURU_FORMAT_STRING_TYPE const char* +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) +#define LOGURU_FORMAT_STRING_TYPE const char* #endif -// Used to mark log_and_abort for the benefit of the static analyzer and optimizer. +// Used to mark log_and_abort for the benefit of the static analyzer and +// optimizer. #if defined(_MSC_VER) #define LOGURU_NORETURN __declspec(noreturn) #else @@ -241,23 +272,23 @@ Website: www.ilikebigbits.com #if defined(_MSC_VER) #define LOGURU_PREDICT_FALSE(x) (x) -#define LOGURU_PREDICT_TRUE(x) (x) +#define LOGURU_PREDICT_TRUE(x) (x) #else -#define LOGURU_PREDICT_FALSE(x) (__builtin_expect(x, 0)) -#define LOGURU_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#define LOGURU_PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#define LOGURU_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #endif #if LOGURU_USE_FMTLIB - #include - #define LOGURU_FMT(x) "{:" #x "}" +#include +#define LOGURU_FMT(x) "{:" #x "}" #else - #define LOGURU_FMT(x) "%" #x +#define LOGURU_FMT(x) "%" #x #endif #ifdef _WIN32 - #define STRDUP(str) _strdup(str) +#define STRDUP(str) _strdup(str) #else - #define STRDUP(str) strdup(str) +#define STRDUP(str) strdup(str) #endif #include @@ -265,57 +296,53 @@ Website: www.ilikebigbits.com // -------------------------------------------------------------------- LOGURU_ANONYMOUS_NAMESPACE_BEGIN -namespace loguru -{ - // Simple RAII ownership of a char*. - class LOGURU_EXPORT Text - { - public: - explicit Text(char* owned_str) : _str(owned_str) {} - ~Text(); - Text(Text&& t) - { - _str = t._str; - t._str = nullptr; - } - Text(Text& t) = delete; - Text& operator=(Text& t) = delete; - void operator=(Text&& t) = delete; - - const char* c_str() const { return _str; } - bool empty() const { return _str == nullptr || *_str == '\0'; } - - char* release() - { - auto result = _str; - _str = nullptr; - return result; - } - - private: - char* _str; - }; - - // Like printf, but returns the formated text. +namespace loguru { +// Simple RAII ownership of a char*. +class LOGURU_EXPORT Text { +public: + explicit Text(char* owned_str) : _str(owned_str) {} + ~Text(); + Text(Text&& t) { + _str = t._str; + t._str = nullptr; + } + Text(Text& t) = delete; + Text& operator=(Text& t) = delete; + void operator=(Text&& t) = delete; + + const char* c_str() const { return _str; } + bool empty() const { return _str == nullptr || *_str == '\0'; } + + char* release() { + auto result = _str; + _str = nullptr; + return result; + } + +private: + char* _str; +}; + +// Like printf, but returns the formated text. #if LOGURU_USE_FMTLIB - LOGURU_EXPORT - Text vtextprintf(const char* format, fmt::format_args args); - - template - LOGURU_EXPORT - Text textprintf(LOGURU_FORMAT_STRING_TYPE format, const Args&... args) { - return vtextprintf(format, fmt::make_format_args(args...)); - } +LOGURU_EXPORT +Text vtextprintf(const char* format, fmt::format_args args); + +template +LOGURU_EXPORT Text textprintf(LOGURU_FORMAT_STRING_TYPE format, + const Args&... args) { + return vtextprintf(format, fmt::make_format_args(args...)); +} #else - LOGURU_EXPORT - Text textprintf(LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(1, 2); +LOGURU_EXPORT +Text textprintf(LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(1, 2); #endif - // Overloaded for variadic template matching. - LOGURU_EXPORT - Text textprintf(); +// Overloaded for variadic template matching. +LOGURU_EXPORT +Text textprintf(); - using Verbosity = int; +using Verbosity = int; #undef FATAL #undef ERROR @@ -323,733 +350,824 @@ namespace loguru #undef INFO #undef MAX - enum NamedVerbosity : Verbosity - { - // Used to mark an invalid verbosity. Do not log to this level. - Verbosity_INVALID = -10, // Never do LOG_F(INVALID) - - // You may use Verbosity_OFF on g_stderr_verbosity, but for nothing else! - Verbosity_OFF = -9, // Never do LOG_F(OFF) - - // Prefer to use ABORT_F or ABORT_S over LOG_F(FATAL) or LOG_S(FATAL). - Verbosity_FATAL = -3, - Verbosity_ERROR = -2, - Verbosity_WARNING = -1, - - // Normal messages. By default written to stderr. - Verbosity_INFO = 0, - - // Same as Verbosity_INFO in every way. - Verbosity_0 = 0, - - // Verbosity levels 1-9 are generally not written to stderr, but are written to file. - Verbosity_1 = +1, - Verbosity_2 = +2, - Verbosity_3 = +3, - Verbosity_4 = +4, - Verbosity_5 = +5, - Verbosity_6 = +6, - Verbosity_7 = +7, - Verbosity_8 = +8, - Verbosity_9 = +9, - - // Do not use higher verbosity levels, as that will make grepping log files harder. - Verbosity_MAX = +9, - }; - - struct Message - { - // You would generally print a Message by just concatenating the buffers without spacing. - // Optionally, ignore preamble and indentation. - Verbosity verbosity; // Already part of preamble - const char* filename; // Already part of preamble - unsigned line; // Already part of preamble - const char* preamble; // Date, time, uptime, thread, file:line, verbosity. - const char* indentation; // Just a bunch of spacing. - const char* prefix; // Assertion failure info goes here (or ""). - const char* message; // User message goes here. - }; - - /* Everything with a verbosity equal or greater than g_stderr_verbosity will be - written to stderr. You can set this in code or via the -v argument. - Set to loguru::Verbosity_OFF to write nothing to stderr. - Default is 0, i.e. only log ERROR, WARNING and INFO are written to stderr. - */ - LOGURU_EXPORT extern Verbosity g_stderr_verbosity; - LOGURU_EXPORT extern bool g_colorlogtostderr; // True by default. - LOGURU_EXPORT extern unsigned g_flush_interval_ms; // 0 (unbuffered) by default. - LOGURU_EXPORT extern bool g_preamble_header; // Prepend each log start by a descriptions line with all columns name? True by default. - LOGURU_EXPORT extern bool g_preamble; // Prefix each log line with date, time etc? True by default. - - /* Specify the verbosity used by loguru to log its info messages including the header - logged when logged::init() is called or on exit. Default is 0 (INFO). - */ - LOGURU_EXPORT extern Verbosity g_internal_verbosity; - - // Turn off individual parts of the preamble - LOGURU_EXPORT extern bool g_preamble_date; // The date field - LOGURU_EXPORT extern bool g_preamble_time; // The time of the current day - LOGURU_EXPORT extern bool g_preamble_uptime; // The time since init call - LOGURU_EXPORT extern bool g_preamble_thread; // The logging thread - LOGURU_EXPORT extern bool g_preamble_file; // The file from which the log originates from - LOGURU_EXPORT extern bool g_preamble_verbose; // The verbosity field - LOGURU_EXPORT extern bool g_preamble_pipe; // The pipe symbol right before the message - - // May not throw! - typedef void (*log_handler_t)(void* user_data, const Message& message); - typedef void (*close_handler_t)(void* user_data); - typedef void (*flush_handler_t)(void* user_data); - - // May throw if that's how you'd like to handle your errors. - typedef void (*fatal_handler_t)(const Message& message); - - // Given a verbosity level, return the level's name or nullptr. - typedef const char* (*verbosity_to_name_t)(Verbosity verbosity); - - // Given a verbosity level name, return the verbosity level or - // Verbosity_INVALID if name is not recognized. - typedef Verbosity (*name_to_verbosity_t)(const char* name); - - struct SignalOptions - { - /// Make Loguru try to do unsafe but useful things, - /// like printing a stack trace, when catching signals. - /// This may lead to bad things like deadlocks in certain situations. - bool unsafe_signal_handler = true; - - /// Should Loguru catch SIGABRT ? - bool sigabrt = true; - - /// Should Loguru catch SIGBUS ? - bool sigbus = true; - - /// Should Loguru catch SIGFPE ? - bool sigfpe = true; - - /// Should Loguru catch SIGILL ? - bool sigill = true; - - /// Should Loguru catch SIGINT ? - bool sigint = true; - - /// Should Loguru catch SIGSEGV ? - bool sigsegv = true; - - /// Should Loguru catch SIGTERM ? - bool sigterm = true; - - static SignalOptions none() - { - SignalOptions options; - options.unsafe_signal_handler = false; - options.sigabrt = false; - options.sigbus = false; - options.sigfpe = false; - options.sigill = false; - options.sigint = false; - options.sigsegv = false; - options.sigterm = false; - return options; - } - }; - - // Runtime options passed to loguru::init - struct Options - { - // This allows you to use something else instead of "-v" via verbosity_flag. - // Set to nullptr if you don't want Loguru to parse verbosity from the args. - const char* verbosity_flag = "-v"; - - // loguru::init will set the name of the calling thread to this. - // If you don't want Loguru to set the name of the main thread, - // set this to nullptr. - // NOTE: on SOME platforms loguru::init will only overwrite the thread name - // if a thread name has not already been set. - // To always set a thread name, use loguru::set_thread_name instead. - const char* main_thread_name = "main thread"; - - SignalOptions signal_options; - }; - - /* Should be called from the main thread. - You don't *need* to call this, but if you do you get: - * Signal handlers installed - * Program arguments logged - * Working dir logged - * Optional -v verbosity flag parsed - * Main thread name set to "main thread" - * Explanation of the preamble (date, thread name, etc) logged - - loguru::init() will look for arguments meant for loguru and remove them. - Arguments meant for loguru are: - -v n Set loguru::g_stderr_verbosity level. Examples: - -v 3 Show verbosity level 3 and lower. - -v 0 Only show INFO, WARNING, ERROR, FATAL (default). - -v INFO Only show INFO, WARNING, ERROR, FATAL (default). - -v WARNING Only show WARNING, ERROR, FATAL. - -v ERROR Only show ERROR, FATAL. - -v FATAL Only show FATAL. - -v OFF Turn off logging to stderr. - - Tip: You can set g_stderr_verbosity before calling loguru::init. - That way you can set the default but have the user override it with the -v flag. - Note that -v does not affect file logging (see loguru::add_file). - - You can you something other than the -v flag by setting the verbosity_flag option. - */ - LOGURU_EXPORT - void init(int& argc, char* argv[], const Options& options = {}); - - // Will call remove_all_callbacks(). After calling this, logging will still go to stderr. - // You generally don't need to call this. - LOGURU_EXPORT - void shutdown(); - - // What ~ will be replaced with, e.g. "/home/your_user_name/" - LOGURU_EXPORT - const char* home_dir(); - - /* Returns the name of the app as given in argv[0] but without leading path. - That is, if argv[0] is "../foo/app" this will return "app". - */ - LOGURU_EXPORT - const char* argv0_filename(); - - // Returns all arguments given to loguru::init(), but escaped with a single space as separator. - LOGURU_EXPORT - const char* arguments(); - - // Returns the path to the current working dir when loguru::init() was called. - LOGURU_EXPORT - const char* current_dir(); - - // Returns the part of the path after the last / or \ (if any). - LOGURU_EXPORT - const char* filename(const char* path); - - // e.g. "foo/bar/baz.ext" will create the directories "foo/" and "foo/bar/" - LOGURU_EXPORT - bool create_directories(const char* file_path_const); - - // Writes date and time with millisecond precision, e.g. "20151017_161503.123" - LOGURU_EXPORT - void write_date_time(char* buff, unsigned long long buff_size); - - // Helper: thread-safe version strerror - LOGURU_EXPORT - Text errno_as_text(); - - /* Given a prefix of e.g. "~/loguru/" this might return - "/home/your_username/loguru/app_name/20151017_161503.123.log" - - where "app_name" is a sanitized version of argv[0]. - */ - LOGURU_EXPORT - void suggest_log_path(const char* prefix, char* buff, unsigned long long buff_size); - - enum FileMode { Truncate, Append }; - - /* Will log to a file at the given path. - Any logging message with a verbosity lower or equal to - the given verbosity will be included. - The function will create all directories in 'path' if needed. - If path starts with a ~, it will be replaced with loguru::home_dir() - To stop the file logging, just call loguru::remove_callback(path) with the same path. - */ - LOGURU_EXPORT - bool add_file(const char* path, FileMode mode, Verbosity verbosity); - - LOGURU_EXPORT - // Send logs to syslog with LOG_USER facility (see next call) - bool add_syslog(const char* app_name, Verbosity verbosity); - LOGURU_EXPORT - // Send logs to syslog with your own choice of facility (LOG_USER, LOG_AUTH, ...) - // see loguru.cpp: syslog_log() for more details. - bool add_syslog(const char* app_name, Verbosity verbosity, int facility); - - /* Will be called right before abort(). - You can for instance use this to print custom error messages, or throw an exception. - Feel free to call LOG:ing function from this, but not FATAL ones! */ - LOGURU_EXPORT - void set_fatal_handler(fatal_handler_t handler); - - // Get the current fatal handler, if any. Default value is nullptr. - LOGURU_EXPORT - fatal_handler_t get_fatal_handler(); - - /* Will be called on each log messages with a verbosity less or equal to the given one. - Useful for displaying messages on-screen in a game, for example. - The given on_close is also expected to flush (if desired). - */ - LOGURU_EXPORT - void add_callback( - const char* id, - log_handler_t callback, - void* user_data, - Verbosity verbosity, - close_handler_t on_close = nullptr, - flush_handler_t on_flush = nullptr); - - /* Set a callback that returns custom verbosity level names. If callback - is nullptr or returns nullptr, default log names will be used. - */ - LOGURU_EXPORT - void set_verbosity_to_name_callback(verbosity_to_name_t callback); - - /* Set a callback that returns the verbosity level matching a name. The - callback should return Verbosity_INVALID if the name is not - recognized. - */ - LOGURU_EXPORT - void set_name_to_verbosity_callback(name_to_verbosity_t callback); - - /* Get a custom name for a specific verbosity, if one exists, or nullptr. */ - LOGURU_EXPORT - const char* get_verbosity_name(Verbosity verbosity); - - /* Get the verbosity enum value from a custom 4-character level name, if one exists. - If the name does not match a custom level name, Verbosity_INVALID is returned. - */ - LOGURU_EXPORT - Verbosity get_verbosity_from_name(const char* name); - - // Returns true iff the callback was found (and removed). - LOGURU_EXPORT - bool remove_callback(const char* id); - - // Shut down all file logging and any other callback hooks installed. - LOGURU_EXPORT - void remove_all_callbacks(); - - // Returns the maximum of g_stderr_verbosity and all file/custom outputs. - LOGURU_EXPORT - Verbosity current_verbosity_cutoff(); +enum NamedVerbosity : Verbosity { + // Used to mark an invalid verbosity. Do not log to this level. + Verbosity_INVALID = -10, // Never do LOG_F(INVALID) + + // You may use Verbosity_OFF on g_stderr_verbosity, but for nothing else! + Verbosity_OFF = -9, // Never do LOG_F(OFF) + + // Prefer to use ABORT_F or ABORT_S over LOG_F(FATAL) or LOG_S(FATAL). + Verbosity_FATAL = -3, + Verbosity_ERROR = -2, + Verbosity_WARNING = -1, + + // Normal messages. By default written to stderr. + Verbosity_INFO = 0, + + // Same as Verbosity_INFO in every way. + Verbosity_0 = 0, + + // Verbosity levels 1-9 are generally not written to stderr, but are written + // to file. + Verbosity_1 = +1, + Verbosity_2 = +2, + Verbosity_3 = +3, + Verbosity_4 = +4, + Verbosity_5 = +5, + Verbosity_6 = +6, + Verbosity_7 = +7, + Verbosity_8 = +8, + Verbosity_9 = +9, + + // Do not use higher verbosity levels, as that will make grepping log files + // harder. + Verbosity_MAX = +9, +}; + +struct Message { + // You would generally print a Message by just concatenating the buffers + // without spacing. Optionally, ignore preamble and indentation. + Verbosity verbosity; // Already part of preamble + const char* filename; // Already part of preamble + unsigned line; // Already part of preamble + const char* preamble; // Date, time, uptime, thread, file:line, verbosity. + const char* indentation; // Just a bunch of spacing. + const char* prefix; // Assertion failure info goes here (or ""). + const char* message; // User message goes here. +}; + +/* Everything with a verbosity equal or greater than g_stderr_verbosity will be +written to stderr. You can set this in code or via the -v argument. +Set to loguru::Verbosity_OFF to write nothing to stderr. +Default is 0, i.e. only log ERROR, WARNING and INFO are written to stderr. +*/ +LOGURU_EXPORT extern Verbosity g_stderr_verbosity; +LOGURU_EXPORT extern bool g_colorlogtostderr; // True by default. +LOGURU_EXPORT extern unsigned + g_flush_interval_ms; // 0 (unbuffered) by default. +LOGURU_EXPORT extern bool + g_preamble_header; // Prepend each log start by a descriptions line with + // all columns name? True by default. +LOGURU_EXPORT extern bool + g_preamble; // Prefix each log line with date, time etc? True by default. + +/* Specify the verbosity used by loguru to log its info messages including the +header logged when logged::init() is called or on exit. Default is 0 (INFO). +*/ +LOGURU_EXPORT extern Verbosity g_internal_verbosity; + +// Turn off individual parts of the preamble +LOGURU_EXPORT extern bool g_preamble_date; // The date field +LOGURU_EXPORT extern bool g_preamble_time; // The time of the current day +LOGURU_EXPORT extern bool g_preamble_uptime; // The time since init call +LOGURU_EXPORT extern bool g_preamble_thread; // The logging thread +LOGURU_EXPORT extern bool + g_preamble_file; // The file from which the log originates from +LOGURU_EXPORT extern bool g_preamble_verbose; // The verbosity field +LOGURU_EXPORT extern bool + g_preamble_pipe; // The pipe symbol right before the message + +// May not throw! +typedef void (*log_handler_t)(void* user_data, const Message& message); +typedef void (*close_handler_t)(void* user_data); +typedef void (*flush_handler_t)(void* user_data); + +// May throw if that's how you'd like to handle your errors. +typedef void (*fatal_handler_t)(const Message& message); + +// Given a verbosity level, return the level's name or nullptr. +typedef const char* (*verbosity_to_name_t)(Verbosity verbosity); + +// Given a verbosity level name, return the verbosity level or +// Verbosity_INVALID if name is not recognized. +typedef Verbosity (*name_to_verbosity_t)(const char* name); + +struct SignalOptions { + /// Make Loguru try to do unsafe but useful things, + /// like printing a stack trace, when catching signals. + /// This may lead to bad things like deadlocks in certain situations. + bool unsafe_signal_handler = true; + + /// Should Loguru catch SIGABRT ? + bool sigabrt = true; + + /// Should Loguru catch SIGBUS ? + bool sigbus = true; + + /// Should Loguru catch SIGFPE ? + bool sigfpe = true; + + /// Should Loguru catch SIGILL ? + bool sigill = true; + + /// Should Loguru catch SIGINT ? + bool sigint = true; + + /// Should Loguru catch SIGSEGV ? + bool sigsegv = true; + + /// Should Loguru catch SIGTERM ? + bool sigterm = true; + + static SignalOptions none() { + SignalOptions options; + options.unsafe_signal_handler = false; + options.sigabrt = false; + options.sigbus = false; + options.sigfpe = false; + options.sigill = false; + options.sigint = false; + options.sigsegv = false; + options.sigterm = false; + return options; + } +}; + +// Runtime options passed to loguru::init +struct Options { + // This allows you to use something else instead of "-v" via verbosity_flag. + // Set to nullptr if you don't want Loguru to parse verbosity from the args. + const char* verbosity_flag = "-v"; + + // loguru::init will set the name of the calling thread to this. + // If you don't want Loguru to set the name of the main thread, + // set this to nullptr. + // NOTE: on SOME platforms loguru::init will only overwrite the thread name + // if a thread name has not already been set. + // To always set a thread name, use loguru::set_thread_name instead. + const char* main_thread_name = "main thread"; + + SignalOptions signal_options; +}; + +/* Should be called from the main thread. + You don't *need* to call this, but if you do you get: + * Signal handlers installed + * Program arguments logged + * Working dir logged + * Optional -v verbosity flag parsed + * Main thread name set to "main thread" + * Explanation of the preamble (date, thread name, etc) logged + + loguru::init() will look for arguments meant for loguru and remove them. + Arguments meant for loguru are: + -v n Set loguru::g_stderr_verbosity level. Examples: + -v 3 Show verbosity level 3 and lower. + -v 0 Only show INFO, WARNING, ERROR, FATAL + (default). -v INFO Only show INFO, WARNING, ERROR, FATAL (default). -v + WARNING Only show WARNING, ERROR, FATAL. -v ERROR Only show ERROR, FATAL. + -v FATAL Only show FATAL. + -v OFF Turn off logging to stderr. + + Tip: You can set g_stderr_verbosity before calling loguru::init. + That way you can set the default but have the user override it with the + -v flag. Note that -v does not affect file logging (see loguru::add_file). + + You can you something other than the -v flag by setting the + verbosity_flag option. +*/ +LOGURU_EXPORT +void init(int& argc, char* argv[], const Options& options = {}); + +// Will call remove_all_callbacks(). After calling this, logging will still go +// to stderr. You generally don't need to call this. +LOGURU_EXPORT +void shutdown(); + +// What ~ will be replaced with, e.g. "/home/your_user_name/" +LOGURU_EXPORT +const char* home_dir(); + +/* Returns the name of the app as given in argv[0] but without leading path. + That is, if argv[0] is "../foo/app" this will return "app". +*/ +LOGURU_EXPORT +const char* argv0_filename(); + +// Returns all arguments given to loguru::init(), but escaped with a single +// space as separator. +LOGURU_EXPORT +const char* arguments(); + +// Returns the path to the current working dir when loguru::init() was called. +LOGURU_EXPORT +const char* current_dir(); + +// Returns the part of the path after the last / or \ (if any). +LOGURU_EXPORT +const char* filename(const char* path); + +// e.g. "foo/bar/baz.ext" will create the directories "foo/" and "foo/bar/" +LOGURU_EXPORT +bool create_directories(const char* file_path_const); + +// Writes date and time with millisecond precision, e.g. "20151017_161503.123" +LOGURU_EXPORT +void write_date_time(char* buff, unsigned long long buff_size); + +// Helper: thread-safe version strerror +LOGURU_EXPORT +Text errno_as_text(); + +/* Given a prefix of e.g. "~/loguru/" this might return + "/home/your_username/loguru/app_name/20151017_161503.123.log" + + where "app_name" is a sanitized version of argv[0]. +*/ +LOGURU_EXPORT +void suggest_log_path(const char* prefix, char* buff, + unsigned long long buff_size); + +enum FileMode { Truncate, Append }; + +/* Will log to a file at the given path. + Any logging message with a verbosity lower or equal to + the given verbosity will be included. + The function will create all directories in 'path' if needed. + If path starts with a ~, it will be replaced with loguru::home_dir() + To stop the file logging, just call loguru::remove_callback(path) with + the same path. +*/ +LOGURU_EXPORT +bool add_file(const char* path, FileMode mode, Verbosity verbosity); + +LOGURU_EXPORT +// Send logs to syslog with LOG_USER facility (see next call) +bool add_syslog(const char* app_name, Verbosity verbosity); +LOGURU_EXPORT +// Send logs to syslog with your own choice of facility (LOG_USER, LOG_AUTH, +// ...) see loguru.cpp: syslog_log() for more details. +bool add_syslog(const char* app_name, Verbosity verbosity, int facility); + +/* Will be called right before abort(). + You can for instance use this to print custom error messages, or throw + an exception. Feel free to call LOG:ing function from this, but not FATAL + ones! */ +LOGURU_EXPORT +void set_fatal_handler(fatal_handler_t handler); + +// Get the current fatal handler, if any. Default value is nullptr. +LOGURU_EXPORT +fatal_handler_t get_fatal_handler(); + +/* Will be called on each log messages with a verbosity less or equal to the + given one. Useful for displaying messages on-screen in a game, for example. + The given on_close is also expected to flush (if desired). +*/ +LOGURU_EXPORT +void add_callback(const char* id, log_handler_t callback, void* user_data, + Verbosity verbosity, close_handler_t on_close = nullptr, + flush_handler_t on_flush = nullptr); + +/* Set a callback that returns custom verbosity level names. If callback + is nullptr or returns nullptr, default log names will be used. +*/ +LOGURU_EXPORT +void set_verbosity_to_name_callback(verbosity_to_name_t callback); + +/* Set a callback that returns the verbosity level matching a name. The + callback should return Verbosity_INVALID if the name is not + recognized. +*/ +LOGURU_EXPORT +void set_name_to_verbosity_callback(name_to_verbosity_t callback); + +/* Get a custom name for a specific verbosity, if one exists, or nullptr. */ +LOGURU_EXPORT +const char* get_verbosity_name(Verbosity verbosity); + +/* Get the verbosity enum value from a custom 4-character level name, if one + exists. If the name does not match a custom level name, Verbosity_INVALID is + returned. +*/ +LOGURU_EXPORT +Verbosity get_verbosity_from_name(const char* name); + +// Returns true iff the callback was found (and removed). +LOGURU_EXPORT +bool remove_callback(const char* id); + +// Shut down all file logging and any other callback hooks installed. +LOGURU_EXPORT +void remove_all_callbacks(); + +// Returns the maximum of g_stderr_verbosity and all file/custom outputs. +LOGURU_EXPORT +Verbosity current_verbosity_cutoff(); #if LOGURU_USE_FMTLIB - // Internal functions - LOGURU_EXPORT - void vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); - LOGURU_EXPORT - void raw_vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); - - // Actual logging function. Use the LOG macro instead of calling this directly. - template - LOGURU_EXPORT - void log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args &... args) { - vlog(verbosity, file, line, format, fmt::make_format_args(args...)); - } - - // Log without any preamble or indentation. - template - LOGURU_EXPORT - void raw_log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args &... args) { - raw_vlog(verbosity, file, line, format, fmt::make_format_args(args...)); - } -#else // LOGURU_USE_FMTLIB? - // Actual logging function. Use the LOG macro instead of calling this directly. - LOGURU_EXPORT - void log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); - - // Actual logging function. - LOGURU_EXPORT - void vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, va_list) LOGURU_PRINTF_LIKE(4, 0); - - // Log without any preamble or indentation. - LOGURU_EXPORT - void raw_log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); -#endif // !LOGURU_USE_FMTLIB - - // Helper class for LOG_SCOPE_F - class LOGURU_EXPORT LogScopeRAII - { - public: - LogScopeRAII() : _file(nullptr) {} // No logging - LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, va_list vlist) LOGURU_PRINTF_LIKE(5, 0); - LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(5, 6); - ~LogScopeRAII(); - - void Init(LOGURU_FORMAT_STRING_TYPE format, va_list vlist) LOGURU_PRINTF_LIKE(2, 0); +// Internal functions +LOGURU_EXPORT +void vlog(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); +LOGURU_EXPORT +void raw_vlog(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); + +// Actual logging function. Use the LOG macro instead of calling this directly. +template +LOGURU_EXPORT void log(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, const Args&... args) { + vlog(verbosity, file, line, format, fmt::make_format_args(args...)); +} + +// Log without any preamble or indentation. +template +LOGURU_EXPORT void raw_log(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, + const Args&... args) { + raw_vlog(verbosity, file, line, format, fmt::make_format_args(args...)); +} +#else // LOGURU_USE_FMTLIB? + // Actual logging function. Use the LOG macro instead of calling this + // directly. +LOGURU_EXPORT +void log(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); + +// Actual logging function. +LOGURU_EXPORT +void vlog(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, va_list) LOGURU_PRINTF_LIKE(4, 0); + +// Log without any preamble or indentation. +LOGURU_EXPORT +void raw_log(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); +#endif // !LOGURU_USE_FMTLIB + +// Helper class for LOG_SCOPE_F +class LOGURU_EXPORT LogScopeRAII { +public: + LogScopeRAII() : _file(nullptr) {} // No logging + LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, va_list vlist) + LOGURU_PRINTF_LIKE(5, 0); + LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, ...) + LOGURU_PRINTF_LIKE(5, 6); + ~LogScopeRAII(); + + void Init(LOGURU_FORMAT_STRING_TYPE format, va_list vlist) + LOGURU_PRINTF_LIKE(2, 0); #if defined(_MSC_VER) && _MSC_VER > 1800 - // older MSVC default move ctors close the scope on move. See - // issue #43 - LogScopeRAII(LogScopeRAII&& other) - : _verbosity(other._verbosity) - , _file(other._file) - , _line(other._line) - , _indent_stderr(other._indent_stderr) - , _start_time_ns(other._start_time_ns) - { - // Make sure the tmp object's destruction doesn't close the scope: - other._file = nullptr; - - for (unsigned int i = 0; i < LOGURU_SCOPE_TEXT_SIZE; ++i) { - _name[i] = other._name[i]; - } - } + // older MSVC default move ctors close the scope on move. See + // issue #43 + LogScopeRAII(LogScopeRAII&& other) + : _verbosity(other._verbosity), + _file(other._file), + _line(other._line), + _indent_stderr(other._indent_stderr), + _start_time_ns(other._start_time_ns) { + // Make sure the tmp object's destruction doesn't close the scope: + other._file = nullptr; + + for (unsigned int i = 0; i < LOGURU_SCOPE_TEXT_SIZE; ++i) { + _name[i] = other._name[i]; + } + } #else - LogScopeRAII(LogScopeRAII&&) = default; + LogScopeRAII(LogScopeRAII&&) = default; #endif - private: - LogScopeRAII(const LogScopeRAII&) = delete; - LogScopeRAII& operator=(const LogScopeRAII&) = delete; - void operator=(LogScopeRAII&&) = delete; - - Verbosity _verbosity; - const char* _file; // Set to null if we are disabled due to verbosity - unsigned _line; - bool _indent_stderr; // Did we? - long long _start_time_ns; - char _name[LOGURU_SCOPE_TEXT_SIZE]; - }; - - // Marked as 'noreturn' for the benefit of the static analyzer and optimizer. - // stack_trace_skip is the number of extrace stack frames to skip above log_and_abort. +private: + LogScopeRAII(const LogScopeRAII&) = delete; + LogScopeRAII& operator=(const LogScopeRAII&) = delete; + void operator=(LogScopeRAII&&) = delete; + + Verbosity _verbosity; + const char* _file; // Set to null if we are disabled due to verbosity + unsigned _line; + bool _indent_stderr; // Did we? + long long _start_time_ns; + char _name[LOGURU_SCOPE_TEXT_SIZE]; +}; + +// Marked as 'noreturn' for the benefit of the static analyzer and optimizer. +// stack_trace_skip is the number of extrace stack frames to skip above +// log_and_abort. #if LOGURU_USE_FMTLIB - LOGURU_EXPORT - LOGURU_NORETURN void vlog_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args); - template - LOGURU_EXPORT - LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args&... args) { - vlog_and_abort(stack_trace_skip, expr, file, line, format, fmt::make_format_args(args...)); - } +LOGURU_EXPORT +LOGURU_NORETURN void vlog_and_abort(int stack_trace_skip, const char* expr, + const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, + fmt::format_args); +template +LOGURU_EXPORT LOGURU_NORETURN void log_and_abort( + int stack_trace_skip, const char* expr, const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, const Args&... args) { + vlog_and_abort(stack_trace_skip, expr, file, line, format, + fmt::make_format_args(args...)); +} #else - LOGURU_EXPORT - LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(5, 6); +LOGURU_EXPORT +LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, + const char* file, unsigned line, + LOGURU_FORMAT_STRING_TYPE format, ...) + LOGURU_PRINTF_LIKE(5, 6); #endif - LOGURU_EXPORT - LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line); - - // Flush output to stderr and files. - // If g_flush_interval_ms is set to non-zero, this will be called automatically this often. - // If not set, you do not need to call this at all. - LOGURU_EXPORT - void flush(); - - template inline Text format_value(const T&) { return textprintf("N/A"); } - template<> inline Text format_value(const char& v) { return textprintf(LOGURU_FMT(c), v); } - template<> inline Text format_value(const int& v) { return textprintf(LOGURU_FMT(d), v); } - template<> inline Text format_value(const float& v) { return textprintf(LOGURU_FMT(f), v); } - template<> inline Text format_value(const double& v) { return textprintf(LOGURU_FMT(f), v); } +LOGURU_EXPORT +LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, + const char* file, unsigned line); + +// Flush output to stderr and files. +// If g_flush_interval_ms is set to non-zero, this will be called automatically +// this often. If not set, you do not need to call this at all. +LOGURU_EXPORT +void flush(); + +template +inline Text format_value(const T&) { + return textprintf("N/A"); +} +template <> +inline Text format_value(const char& v) { + return textprintf(LOGURU_FMT(c), v); +} +template <> +inline Text format_value(const int& v) { + return textprintf(LOGURU_FMT(d), v); +} +template <> +inline Text format_value(const float& v) { + return textprintf(LOGURU_FMT(f), v); +} +template <> +inline Text format_value(const double& v) { + return textprintf(LOGURU_FMT(f), v); +} #if LOGURU_USE_FMTLIB - template<> inline Text format_value(const unsigned int& v) { return textprintf(LOGURU_FMT(d), v); } - template<> inline Text format_value(const long& v) { return textprintf(LOGURU_FMT(d), v); } - template<> inline Text format_value(const unsigned long& v) { return textprintf(LOGURU_FMT(d), v); } - template<> inline Text format_value(const long long& v) { return textprintf(LOGURU_FMT(d), v); } - template<> inline Text format_value(const unsigned long long& v) { return textprintf(LOGURU_FMT(d), v); } +template <> +inline Text format_value(const unsigned int& v) { + return textprintf(LOGURU_FMT(d), v); +} +template <> +inline Text format_value(const long& v) { + return textprintf(LOGURU_FMT(d), v); +} +template <> +inline Text format_value(const unsigned long& v) { + return textprintf(LOGURU_FMT(d), v); +} +template <> +inline Text format_value(const long long& v) { + return textprintf(LOGURU_FMT(d), v); +} +template <> +inline Text format_value(const unsigned long long& v) { + return textprintf(LOGURU_FMT(d), v); +} #else - template<> inline Text format_value(const unsigned int& v) { return textprintf(LOGURU_FMT(u), v); } - template<> inline Text format_value(const long& v) { return textprintf(LOGURU_FMT(lu), v); } - template<> inline Text format_value(const unsigned long& v) { return textprintf(LOGURU_FMT(ld), v); } - template<> inline Text format_value(const long long& v) { return textprintf(LOGURU_FMT(llu), v); } - template<> inline Text format_value(const unsigned long long& v) { return textprintf(LOGURU_FMT(lld), v); } +template <> +inline Text format_value(const unsigned int& v) { + return textprintf(LOGURU_FMT(u), v); +} +template <> +inline Text format_value(const long& v) { + return textprintf(LOGURU_FMT(lu), v); +} +template <> +inline Text format_value(const unsigned long& v) { + return textprintf(LOGURU_FMT(ld), v); +} +template <> +inline Text format_value(const long long& v) { + return textprintf(LOGURU_FMT(llu), v); +} +template <> +inline Text format_value(const unsigned long long& v) { + return textprintf(LOGURU_FMT(lld), v); +} #endif - /* Thread names can be set for the benefit of readable logs. - If you do not set the thread name, a hex id will be shown instead. - These thread names may or may not be the same as the system thread names, - depending on the system. - Try to limit the thread name to 15 characters or less. */ - LOGURU_EXPORT - void set_thread_name(const char* name); - - /* Returns the thread name for this thread. - On most *nix systems this will return the system thread name (settable from both within and without Loguru). - On other systems it will return whatever you set in `set_thread_name()`; - If no thread name is set, this will return a hexadecimal thread id. - `length` should be the number of bytes available in the buffer. - 17 is a good number for length. - `right_align_hex_id` means any hexadecimal thread id will be written to the end of buffer. - */ - LOGURU_EXPORT - void get_thread_name(char* buffer, unsigned long long length, bool right_align_hex_id); - - /* Generates a readable stacktrace as a string. - 'skip' specifies how many stack frames to skip. - For instance, the default skip (1) means: - don't include the call to loguru::stacktrace in the stack trace. */ - LOGURU_EXPORT - Text stacktrace(int skip = 1); - - /* Add a string to be replaced with something else in the stack output. - - For instance, instead of having a stack trace look like this: - 0x41f541 some_function(std::basic_ofstream >&) - You can clean it up with: - auto verbose_type_name = loguru::demangle(typeid(std::ofstream).name()); - loguru::add_stack_cleanup(verbose_type_name.c_str(); "std::ofstream"); - So the next time you will instead see: - 0x41f541 some_function(std::ofstream&) - - `replace_with_this` must be shorter than `find_this`. - */ - LOGURU_EXPORT - void add_stack_cleanup(const char* find_this, const char* replace_with_this); - - // Example: demangle(typeid(std::ofstream).name()) -> "std::basic_ofstream >" - LOGURU_EXPORT - Text demangle(const char* name); - - // ------------------------------------------------------------------------ - /* - Not all terminals support colors, but if they do, and g_colorlogtostderr - is set, Loguru will write them to stderr to make errors in red, etc. - - You also have the option to manually use them, via the function below. - - Note, however, that if you do, the color codes could end up in your logfile! - - This means if you intend to use them functions you should either: - * Use them on the stderr/stdout directly (bypass Loguru). - * Don't add file outputs to Loguru. - * Expect some \e[1m things in your logfile. - - Usage: - printf("%sRed%sGreen%sBold green%sClear again\n", - loguru::terminal_red(), loguru::terminal_green(), - loguru::terminal_bold(), loguru::terminal_reset()); - - If the terminal at hand does not support colors the above output - will just not have funky \e[1m things showing. - */ - - // Do the output terminal support colors? - LOGURU_EXPORT - bool terminal_has_color(); - - // Colors - LOGURU_EXPORT const char* terminal_black(); - LOGURU_EXPORT const char* terminal_red(); - LOGURU_EXPORT const char* terminal_green(); - LOGURU_EXPORT const char* terminal_yellow(); - LOGURU_EXPORT const char* terminal_blue(); - LOGURU_EXPORT const char* terminal_purple(); - LOGURU_EXPORT const char* terminal_cyan(); - LOGURU_EXPORT const char* terminal_light_gray(); - LOGURU_EXPORT const char* terminal_light_red(); - LOGURU_EXPORT const char* terminal_white(); - - // Formating - LOGURU_EXPORT const char* terminal_bold(); - LOGURU_EXPORT const char* terminal_underline(); - - // You should end each line with this! - LOGURU_EXPORT const char* terminal_reset(); - - // -------------------------------------------------------------------- - // Error context related: - - struct StringStream; - - // Use this in your EcEntryBase::print_value overload. - LOGURU_EXPORT - void stream_print(StringStream& out_string_stream, const char* text); - - class LOGURU_EXPORT EcEntryBase - { - public: - EcEntryBase(const char* file, unsigned line, const char* descr); - ~EcEntryBase(); - EcEntryBase(const EcEntryBase&) = delete; - EcEntryBase(EcEntryBase&&) = delete; - EcEntryBase& operator=(const EcEntryBase&) = delete; - EcEntryBase& operator=(EcEntryBase&&) = delete; - - virtual void print_value(StringStream& out_string_stream) const = 0; - - EcEntryBase* previous() const { return _previous; } - - // private: - const char* _file; - unsigned _line; - const char* _descr; - EcEntryBase* _previous; - }; - - template - class EcEntryData : public EcEntryBase - { - public: - using Printer = Text(*)(T data); - - EcEntryData(const char* file, unsigned line, const char* descr, T data, Printer&& printer) - : EcEntryBase(file, line, descr), _data(data), _printer(printer) {} - - virtual void print_value(StringStream& out_string_stream) const override - { - const auto str = _printer(_data); - stream_print(out_string_stream, str.c_str()); - } - - private: - T _data; - Printer _printer; - }; - - // template - // class EcEntryLambda : public EcEntryBase - // { - // public: - // EcEntryLambda(const char* file, unsigned line, const char* descr, Printer&& printer) - // : EcEntryBase(file, line, descr), _printer(std::move(printer)) {} - - // virtual void print_value(StringStream& out_string_stream) const override - // { - // const auto str = _printer(); - // stream_print(out_string_stream, str.c_str()); - // } - - // private: - // Printer _printer; - // }; - - // template - // EcEntryLambda make_ec_entry_lambda(const char* file, unsigned line, const char* descr, Printer&& printer) - // { - // return {file, line, descr, std::move(printer)}; - // } - - template - struct decay_char_array { using type = T; }; - - template - struct decay_char_array { using type = const char*; }; - - template - struct make_const_ptr { using type = T; }; - - template - struct make_const_ptr { using type = const T*; }; - - template - struct make_ec_type { using type = typename make_const_ptr::type>::type; }; - - /* A stack trace gives you the names of the function at the point of a crash. - With ERROR_CONTEXT, you can also get the values of select local variables. - Usage: - - void process_customers(const std::string& filename) - { - ERROR_CONTEXT("Processing file", filename.c_str()); - for (int customer_index : ...) - { - ERROR_CONTEXT("Customer index", customer_index); - ... - } - } - - The context is in effect during the scope of the ERROR_CONTEXT. - Use loguru::get_error_context() to get the contents of the active error contexts. - - Example result: - - ------------------------------------------------ - [ErrorContext] main.cpp:416 Processing file: "customers.json" - [ErrorContext] main.cpp:417 Customer index: 42 - ------------------------------------------------ - - Error contexts are printed automatically on crashes, and only on crashes. - This makes them much faster than logging the value of a variable. - */ - #define ERROR_CONTEXT(descr, data) \ - const loguru::EcEntryData::type> \ - LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ - __FILE__, __LINE__, descr, data, \ - static_cast::type>::Printer>(loguru::ec_to_text) ) // For better error messages +/* Thread names can be set for the benefit of readable logs. + If you do not set the thread name, a hex id will be shown instead. + These thread names may or may not be the same as the system thread names, + depending on the system. + Try to limit the thread name to 15 characters or less. */ +LOGURU_EXPORT +void set_thread_name(const char* name); + +/* Returns the thread name for this thread. + On most *nix systems this will return the system thread name (settable from + both within and without Loguru). On other systems it will return whatever you + set in `set_thread_name()`; If no thread name is set, this will return a + hexadecimal thread id. `length` should be the number of bytes available in + the buffer. 17 is a good number for length. `right_align_hex_id` means any + hexadecimal thread id will be written to the end of buffer. +*/ +LOGURU_EXPORT +void get_thread_name(char* buffer, unsigned long long length, + bool right_align_hex_id); + +/* Generates a readable stacktrace as a string. + 'skip' specifies how many stack frames to skip. + For instance, the default skip (1) means: + don't include the call to loguru::stacktrace in the stack trace. */ +LOGURU_EXPORT +Text stacktrace(int skip = 1); + +/* Add a string to be replaced with something else in the stack output. + + For instance, instead of having a stack trace look like this: + 0x41f541 some_function(std::basic_ofstream >&) You can clean it up with: auto verbose_type_name = + loguru::demangle(typeid(std::ofstream).name()); + loguru::add_stack_cleanup(verbose_type_name.c_str(); + "std::ofstream"); So the next time you will instead see: 0x41f541 + some_function(std::ofstream&) + + `replace_with_this` must be shorter than `find_this`. +*/ +LOGURU_EXPORT +void add_stack_cleanup(const char* find_this, const char* replace_with_this); + +// Example: demangle(typeid(std::ofstream).name()) -> "std::basic_ofstream >" +LOGURU_EXPORT +Text demangle(const char* name); + +// ------------------------------------------------------------------------ +/* +Not all terminals support colors, but if they do, and g_colorlogtostderr +is set, Loguru will write them to stderr to make errors in red, etc. + +You also have the option to manually use them, via the function below. + +Note, however, that if you do, the color codes could end up in your logfile! + +This means if you intend to use them functions you should either: + * Use them on the stderr/stdout directly (bypass Loguru). + * Don't add file outputs to Loguru. + * Expect some \e[1m things in your logfile. + +Usage: + printf("%sRed%sGreen%sBold green%sClear again\n", + loguru::terminal_red(), loguru::terminal_green(), + loguru::terminal_bold(), loguru::terminal_reset()); + +If the terminal at hand does not support colors the above output +will just not have funky \e[1m things showing. +*/ + +// Do the output terminal support colors? +LOGURU_EXPORT +bool terminal_has_color(); + +// Colors +LOGURU_EXPORT const char* terminal_black(); +LOGURU_EXPORT const char* terminal_red(); +LOGURU_EXPORT const char* terminal_green(); +LOGURU_EXPORT const char* terminal_yellow(); +LOGURU_EXPORT const char* terminal_blue(); +LOGURU_EXPORT const char* terminal_purple(); +LOGURU_EXPORT const char* terminal_cyan(); +LOGURU_EXPORT const char* terminal_light_gray(); +LOGURU_EXPORT const char* terminal_light_red(); +LOGURU_EXPORT const char* terminal_white(); + +// Formating +LOGURU_EXPORT const char* terminal_bold(); +LOGURU_EXPORT const char* terminal_underline(); + +// You should end each line with this! +LOGURU_EXPORT const char* terminal_reset(); + +// -------------------------------------------------------------------- +// Error context related: + +struct StringStream; + +// Use this in your EcEntryBase::print_value overload. +LOGURU_EXPORT +void stream_print(StringStream& out_string_stream, const char* text); + +class LOGURU_EXPORT EcEntryBase { +public: + EcEntryBase(const char* file, unsigned line, const char* descr); + ~EcEntryBase(); + EcEntryBase(const EcEntryBase&) = delete; + EcEntryBase(EcEntryBase&&) = delete; + EcEntryBase& operator=(const EcEntryBase&) = delete; + EcEntryBase& operator=(EcEntryBase&&) = delete; + + virtual void print_value(StringStream& out_string_stream) const = 0; + + EcEntryBase* previous() const { return _previous; } + + // private: + const char* _file; + unsigned _line; + const char* _descr; + EcEntryBase* _previous; +}; + +template +class EcEntryData : public EcEntryBase { +public: + using Printer = Text (*)(T data); + + EcEntryData(const char* file, unsigned line, const char* descr, T data, + Printer&& printer) + : EcEntryBase(file, line, descr), _data(data), _printer(printer) {} + + virtual void print_value(StringStream& out_string_stream) const override { + const auto str = _printer(_data); + stream_print(out_string_stream, str.c_str()); + } + +private: + T _data; + Printer _printer; +}; + +// template +// class EcEntryLambda : public EcEntryBase +// { +// public: +// EcEntryLambda(const char* file, unsigned line, const char* descr, +// Printer&& printer) : EcEntryBase(file, line, descr), +// _printer(std::move(printer)) {} + +// virtual void print_value(StringStream& out_string_stream) const override +// { +// const auto str = _printer(); +// stream_print(out_string_stream, str.c_str()); +// } + +// private: +// Printer _printer; +// }; + +// template +// EcEntryLambda make_ec_entry_lambda(const char* file, unsigned line, +// const char* descr, Printer&& printer) +// { +// return {file, line, descr, std::move(printer)}; +// } + +template +struct decay_char_array { + using type = T; +}; + +template +struct decay_char_array { + using type = const char*; +}; + +template +struct make_const_ptr { + using type = T; +}; + +template +struct make_const_ptr { + using type = const T*; +}; + +template +struct make_ec_type { + using type = + typename make_const_ptr::type>::type; +}; + +/* A stack trace gives you the names of the function at the point of a + crash. With ERROR_CONTEXT, you can also get the values of select local + variables. Usage: + + void process_customers(const std::string& filename) + { + ERROR_CONTEXT("Processing file", filename.c_str()); + for (int customer_index : ...) + { + ERROR_CONTEXT("Customer index", customer_index); + ... + } + } + + The context is in effect during the scope of the ERROR_CONTEXT. + Use loguru::get_error_context() to get the contents of the active error + contexts. + + Example result: + + ------------------------------------------------ + [ErrorContext] main.cpp:416 Processing file: + "customers.json" [ErrorContext] main.cpp:417 Customer index: + 42 + ------------------------------------------------ + + Error contexts are printed automatically on crashes, and only on + crashes. This makes them much faster than logging the value of a variable. +*/ +#define ERROR_CONTEXT(descr, data) \ + const loguru::EcEntryData::type> \ + LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ + __FILE__, __LINE__, descr, data, \ + static_cast::type>::Printer>( \ + loguru::ec_to_text)) // For better error messages /* - #define ERROR_CONTEXT(descr, data) \ - const auto LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ - loguru::make_ec_entry_lambda(__FILE__, __LINE__, descr, \ - [=](){ return loguru::ec_to_text(data); })) + #define ERROR_CONTEXT(descr, data) \ + const auto LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ + loguru::make_ec_entry_lambda(__FILE__, __LINE__, descr, + \ + [=](){ return loguru::ec_to_text(data); })) */ - using EcHandle = const EcEntryBase*; - - /* - Get a light-weight handle to the error context stack on this thread. - The handle is valid as long as the current thread has no changes to its error context stack. - You can pass the handle to loguru::get_error_context on another thread. - This can be very useful for when you have a parent thread spawning several working threads, - and you want the error context of the parent thread to get printed (too) when there is an - error on the child thread. You can accomplish this thusly: - - void foo(const char* parameter) - { - ERROR_CONTEXT("parameter", parameter) - const auto parent_ec_handle = loguru::get_thread_ec_handle(); - - std::thread([=]{ - loguru::set_thread_name("child thread"); - ERROR_CONTEXT("parent context", parent_ec_handle); - dangerous_code(); - }.join(); - } - - */ - LOGURU_EXPORT - EcHandle get_thread_ec_handle(); - - // Get a string describing the current stack of error context. Empty string if there is none. - LOGURU_EXPORT - Text get_error_context(); - - // Get a string describing the error context of the given thread handle. - LOGURU_EXPORT - Text get_error_context_for(EcHandle ec_handle); - - // ------------------------------------------------------------------------ - - LOGURU_EXPORT Text ec_to_text(const char* data); - LOGURU_EXPORT Text ec_to_text(char data); - LOGURU_EXPORT Text ec_to_text(int data); - LOGURU_EXPORT Text ec_to_text(unsigned int data); - LOGURU_EXPORT Text ec_to_text(long data); - LOGURU_EXPORT Text ec_to_text(unsigned long data); - LOGURU_EXPORT Text ec_to_text(long long data); - LOGURU_EXPORT Text ec_to_text(unsigned long long data); - LOGURU_EXPORT Text ec_to_text(float data); - LOGURU_EXPORT Text ec_to_text(double data); - LOGURU_EXPORT Text ec_to_text(long double data); - LOGURU_EXPORT Text ec_to_text(EcHandle); - - /* - You can add ERROR_CONTEXT support for your own types by overloading ec_to_text. Here's how: - - some.hpp: - namespace loguru { - Text ec_to_text(MySmallType data) - Text ec_to_text(const MyBigType* data) - } // namespace loguru - - some.cpp: - namespace loguru { - Text ec_to_text(MySmallType small_value) - { - // Called only when needed, i.e. on a crash. - std::string str = small_value.as_string(); // Format 'small_value' here somehow. - return Text{STRDUP(str.c_str())}; - } - - Text ec_to_text(const MyBigType* big_value) - { - // Called only when needed, i.e. on a crash. - std::string str = big_value->as_string(); // Format 'big_value' here somehow. - return Text{STRDUP(str.c_str())}; - } - } // namespace loguru - - Any file that include some.hpp: - void foo(MySmallType small, const MyBigType& big) - { - ERROR_CONTEXT("Small", small); // Copy ´small` by value. - ERROR_CONTEXT("Big", &big); // `big` should not change during this scope! - .... - } - */ -} // namespace loguru +using EcHandle = const EcEntryBase*; + +/* + Get a light-weight handle to the error context stack on this thread. + The handle is valid as long as the current thread has no changes to its + error context stack. You can pass the handle to loguru::get_error_context on + another thread. This can be very useful for when you have a parent thread + spawning several working threads, and you want the error context of the + parent thread to get printed (too) when there is an error on the child + thread. You can accomplish this thusly: + + void foo(const char* parameter) + { + ERROR_CONTEXT("parameter", parameter) + const auto parent_ec_handle = loguru::get_thread_ec_handle(); + + std::thread([=]{ + loguru::set_thread_name("child thread"); + ERROR_CONTEXT("parent context", parent_ec_handle); + dangerous_code(); + }.join(); + } + +*/ +LOGURU_EXPORT +EcHandle get_thread_ec_handle(); + +// Get a string describing the current stack of error context. Empty string if +// there is none. +LOGURU_EXPORT +Text get_error_context(); + +// Get a string describing the error context of the given thread handle. +LOGURU_EXPORT +Text get_error_context_for(EcHandle ec_handle); + +// ------------------------------------------------------------------------ + +LOGURU_EXPORT Text ec_to_text(const char* data); +LOGURU_EXPORT Text ec_to_text(char data); +LOGURU_EXPORT Text ec_to_text(int data); +LOGURU_EXPORT Text ec_to_text(unsigned int data); +LOGURU_EXPORT Text ec_to_text(long data); +LOGURU_EXPORT Text ec_to_text(unsigned long data); +LOGURU_EXPORT Text ec_to_text(long long data); +LOGURU_EXPORT Text ec_to_text(unsigned long long data); +LOGURU_EXPORT Text ec_to_text(float data); +LOGURU_EXPORT Text ec_to_text(double data); +LOGURU_EXPORT Text ec_to_text(long double data); +LOGURU_EXPORT Text ec_to_text(EcHandle); + +/* +You can add ERROR_CONTEXT support for your own types by overloading ec_to_text. +Here's how: + +some.hpp: + namespace loguru { + Text ec_to_text(MySmallType data) + Text ec_to_text(const MyBigType* data) + } // namespace loguru + +some.cpp: + namespace loguru { + Text ec_to_text(MySmallType small_value) + { + // Called only when needed, i.e. on a crash. + std::string str = small_value.as_string(); // Format +'small_value' here somehow. return Text{STRDUP(str.c_str())}; + } + + Text ec_to_text(const MyBigType* big_value) + { + // Called only when needed, i.e. on a crash. + std::string str = big_value->as_string(); // Format +'big_value' here somehow. return Text{STRDUP(str.c_str())}; + } + } // namespace loguru + +Any file that include some.hpp: + void foo(MySmallType small, const MyBigType& big) + { + ERROR_CONTEXT("Small", small); // Copy ´small` by value. + ERROR_CONTEXT("Big", &big); // `big` should not change during +this scope! + .... + } +*/ +} // namespace loguru LOGURU_ANONYMOUS_NAMESPACE_END @@ -1057,36 +1175,41 @@ LOGURU_ANONYMOUS_NAMESPACE_END // Logging macros // LOG_F(2, "Only logged if verbosity is 2 or higher: %d", some_number); -#define VLOG_F(verbosity, ...) \ - ((verbosity) > loguru::current_verbosity_cutoff()) ? (void)0 \ - : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) +#define VLOG_F(verbosity, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff()) \ + ? (void)0 \ + : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) // LOG_F(INFO, "Foo: %d", some_number); -#define LOG_F(verbosity_name, ...) VLOG_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) +#define LOG_F(verbosity_name, ...) \ + VLOG_F(loguru::Verbosity_##verbosity_name, __VA_ARGS__) -#define VLOG_IF_F(verbosity, cond, ...) \ - ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ - ? (void)0 \ - : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) +#define VLOG_IF_F(verbosity, cond, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ + ? (void)0 \ + : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) -#define LOG_IF_F(verbosity_name, cond, ...) \ - VLOG_IF_F(loguru::Verbosity_ ## verbosity_name, cond, __VA_ARGS__) +#define LOG_IF_F(verbosity_name, cond, ...) \ + VLOG_IF_F(loguru::Verbosity_##verbosity_name, cond, __VA_ARGS__) -#define VLOG_SCOPE_F(verbosity, ...) \ - loguru::LogScopeRAII LOGURU_ANONYMOUS_VARIABLE(error_context_RAII_) = \ - ((verbosity) > loguru::current_verbosity_cutoff()) ? loguru::LogScopeRAII() : \ - loguru::LogScopeRAII(verbosity, __FILE__, __LINE__, __VA_ARGS__) +#define VLOG_SCOPE_F(verbosity, ...) \ + loguru::LogScopeRAII LOGURU_ANONYMOUS_VARIABLE(error_context_RAII_) = \ + ((verbosity) > loguru::current_verbosity_cutoff()) \ + ? loguru::LogScopeRAII() \ + : loguru::LogScopeRAII(verbosity, __FILE__, __LINE__, __VA_ARGS__) // Raw logging - no preamble, no indentation. Slightly faster than full logging. -#define RAW_VLOG_F(verbosity, ...) \ - ((verbosity) > loguru::current_verbosity_cutoff()) ? (void)0 \ - : loguru::raw_log(verbosity, __FILE__, __LINE__, __VA_ARGS__) +#define RAW_VLOG_F(verbosity, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff()) \ + ? (void)0 \ + : loguru::raw_log(verbosity, __FILE__, __LINE__, __VA_ARGS__) -#define RAW_LOG_F(verbosity_name, ...) RAW_VLOG_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) +#define RAW_LOG_F(verbosity_name, ...) \ + RAW_VLOG_F(loguru::Verbosity_##verbosity_name, __VA_ARGS__) // Use to book-end a scope. Affects logging on all threads. -#define LOG_SCOPE_F(verbosity_name, ...) \ - VLOG_SCOPE_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) +#define LOG_SCOPE_F(verbosity_name, ...) \ + VLOG_SCOPE_F(loguru::Verbosity_##verbosity_name, __VA_ARGS__) #define LOG_SCOPE_FUNCTION(verbosity_name) LOG_SCOPE_F(verbosity_name, __func__) @@ -1094,118 +1217,120 @@ LOGURU_ANONYMOUS_NAMESPACE_END // ABORT_F macro. Usage: ABORT_F("Cause of error: %s", error_str); // Message is optional -#define ABORT_F(...) loguru::log_and_abort(0, "ABORT: ", __FILE__, __LINE__, __VA_ARGS__) +#define ABORT_F(...) \ + loguru::log_and_abort(0, "ABORT: ", __FILE__, __LINE__, __VA_ARGS__) // -------------------------------------------------------------------- // CHECK_F macros: -#define CHECK_WITH_INFO_F(test, info, ...) \ - LOGURU_PREDICT_TRUE((test) == true) ? (void)0 : loguru::log_and_abort(0, "CHECK FAILED: " info " ", __FILE__, \ - __LINE__, ##__VA_ARGS__) +#define CHECK_WITH_INFO_F(test, info, ...) \ + LOGURU_PREDICT_TRUE((test) == true) \ + ? (void)0 \ + : loguru::log_and_abort(0, "CHECK FAILED: " info " ", __FILE__, \ + __LINE__, ##__VA_ARGS__) -/* Checked at runtime too. Will print error, then call fatal_handler (if any), then 'abort'. - Note that the test must be boolean. - CHECK_F(ptr); will not compile, but CHECK_F(ptr != nullptr); will. */ +/* Checked at runtime too. Will print error, then call fatal_handler (if any), + then 'abort'. Note that the test must be boolean. CHECK_F(ptr); will not + compile, but CHECK_F(ptr != nullptr); will. */ #define CHECK_F(test, ...) CHECK_WITH_INFO_F(test, #test, ##__VA_ARGS__) -#define CHECK_NOTNULL_F(x, ...) CHECK_WITH_INFO_F((x) != nullptr, #x " != nullptr", ##__VA_ARGS__) - -#define CHECK_OP_F(expr_left, expr_right, op, ...) \ - do \ - { \ - auto val_left = expr_left; \ - auto val_right = expr_right; \ - if (! LOGURU_PREDICT_TRUE(val_left op val_right)) \ - { \ - auto str_left = loguru::format_value(val_left); \ - auto str_right = loguru::format_value(val_right); \ - auto fail_info = loguru::textprintf("CHECK FAILED: " LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) " (" LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) ") ", \ - #expr_left, #op, #expr_right, str_left.c_str(), #op, str_right.c_str()); \ - auto user_msg = loguru::textprintf(__VA_ARGS__); \ - loguru::log_and_abort(0, fail_info.c_str(), __FILE__, __LINE__, \ - LOGURU_FMT(s), user_msg.c_str()); \ - } \ - } while (false) +#define CHECK_NOTNULL_F(x, ...) \ + CHECK_WITH_INFO_F((x) != nullptr, #x " != nullptr", ##__VA_ARGS__) + +#define CHECK_OP_F(expr_left, expr_right, op, ...) \ + do { \ + auto val_left = expr_left; \ + auto val_right = expr_right; \ + if (!LOGURU_PREDICT_TRUE(val_left op val_right)) { \ + auto str_left = loguru::format_value(val_left); \ + auto str_right = loguru::format_value(val_right); \ + auto fail_info = loguru::textprintf("CHECK FAILED: " LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) " (" LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) ") ", \ + #expr_left, #op, #expr_right, str_left.c_str(), #op, str_right.c_str()); \ + auto user_msg = loguru::textprintf(__VA_ARGS__); \ + loguru::log_and_abort(0, fail_info.c_str(), __FILE__, __LINE__, \ + LOGURU_FMT(s), user_msg.c_str()); \ + } \ + } while (false) #ifndef LOGURU_DEBUG_LOGGING - #ifndef NDEBUG - #define LOGURU_DEBUG_LOGGING 1 - #else - #define LOGURU_DEBUG_LOGGING 0 - #endif +#ifndef NDEBUG +#define LOGURU_DEBUG_LOGGING 1 +#else +#define LOGURU_DEBUG_LOGGING 0 +#endif #endif #if LOGURU_DEBUG_LOGGING - // Debug logging enabled: - #define DLOG_F(verbosity_name, ...) LOG_F(verbosity_name, __VA_ARGS__) - #define DVLOG_F(verbosity, ...) VLOG_F(verbosity, __VA_ARGS__) - #define DLOG_IF_F(verbosity_name, ...) LOG_IF_F(verbosity_name, __VA_ARGS__) - #define DVLOG_IF_F(verbosity, ...) VLOG_IF_F(verbosity, __VA_ARGS__) - #define DRAW_LOG_F(verbosity_name, ...) RAW_LOG_F(verbosity_name, __VA_ARGS__) - #define DRAW_VLOG_F(verbosity, ...) RAW_VLOG_F(verbosity, __VA_ARGS__) - #define DLOG_SCOPE_F(verbosity_name,...) LOG_SCOPE_F(verbosity_name, __VA_ARGS__) - #define DLOG_SCOPE_FUNCTION(...) LOG_SCOPE_FUNCTION(__VA_ARGS__) +// Debug logging enabled: +#define DLOG_F(verbosity_name, ...) LOG_F(verbosity_name, __VA_ARGS__) +#define DVLOG_F(verbosity, ...) VLOG_F(verbosity, __VA_ARGS__) +#define DLOG_IF_F(verbosity_name, ...) LOG_IF_F(verbosity_name, __VA_ARGS__) +#define DVLOG_IF_F(verbosity, ...) VLOG_IF_F(verbosity, __VA_ARGS__) +#define DRAW_LOG_F(verbosity_name, ...) RAW_LOG_F(verbosity_name, __VA_ARGS__) +#define DRAW_VLOG_F(verbosity, ...) RAW_VLOG_F(verbosity, __VA_ARGS__) +#define DLOG_SCOPE_F(verbosity_name, ...) \ + LOG_SCOPE_F(verbosity_name, __VA_ARGS__) +#define DLOG_SCOPE_FUNCTION(...) LOG_SCOPE_FUNCTION(__VA_ARGS__) #else - // Debug logging disabled: - #define DLOG_F(verbosity_name, ...) - #define DVLOG_F(verbosity, ...) - #define DLOG_IF_F(verbosity_name, ...) - #define DVLOG_IF_F(verbosity, ...) - #define DRAW_LOG_F(verbosity_name, ...) - #define DRAW_VLOG_F(verbosity, ...) - #define DLOG_SCOPE_F(verbosity_name,...) - #define DLOG_SCOPE_FUNCTION(...) +// Debug logging disabled: +#define DLOG_F(verbosity_name, ...) +#define DVLOG_F(verbosity, ...) +#define DLOG_IF_F(verbosity_name, ...) +#define DVLOG_IF_F(verbosity, ...) +#define DRAW_LOG_F(verbosity_name, ...) +#define DRAW_VLOG_F(verbosity, ...) +#define DLOG_SCOPE_F(verbosity_name, ...) +#define DLOG_SCOPE_FUNCTION(...) #endif #define CHECK_EQ_F(a, b, ...) CHECK_OP_F(a, b, ==, ##__VA_ARGS__) #define CHECK_NE_F(a, b, ...) CHECK_OP_F(a, b, !=, ##__VA_ARGS__) -#define CHECK_LT_F(a, b, ...) CHECK_OP_F(a, b, < , ##__VA_ARGS__) -#define CHECK_GT_F(a, b, ...) CHECK_OP_F(a, b, > , ##__VA_ARGS__) +#define CHECK_LT_F(a, b, ...) CHECK_OP_F(a, b, <, ##__VA_ARGS__) +#define CHECK_GT_F(a, b, ...) CHECK_OP_F(a, b, >, ##__VA_ARGS__) #define CHECK_LE_F(a, b, ...) CHECK_OP_F(a, b, <=, ##__VA_ARGS__) #define CHECK_GE_F(a, b, ...) CHECK_OP_F(a, b, >=, ##__VA_ARGS__) #ifndef LOGURU_DEBUG_CHECKS - #ifndef NDEBUG - #define LOGURU_DEBUG_CHECKS 1 - #else - #define LOGURU_DEBUG_CHECKS 0 - #endif +#ifndef NDEBUG +#define LOGURU_DEBUG_CHECKS 1 +#else +#define LOGURU_DEBUG_CHECKS 0 +#endif #endif #if LOGURU_DEBUG_CHECKS - // Debug checks enabled: - #define DCHECK_F(test, ...) CHECK_F(test, ##__VA_ARGS__) - #define DCHECK_NOTNULL_F(x, ...) CHECK_NOTNULL_F(x, ##__VA_ARGS__) - #define DCHECK_EQ_F(a, b, ...) CHECK_EQ_F(a, b, ##__VA_ARGS__) - #define DCHECK_NE_F(a, b, ...) CHECK_NE_F(a, b, ##__VA_ARGS__) - #define DCHECK_LT_F(a, b, ...) CHECK_LT_F(a, b, ##__VA_ARGS__) - #define DCHECK_LE_F(a, b, ...) CHECK_LE_F(a, b, ##__VA_ARGS__) - #define DCHECK_GT_F(a, b, ...) CHECK_GT_F(a, b, ##__VA_ARGS__) - #define DCHECK_GE_F(a, b, ...) CHECK_GE_F(a, b, ##__VA_ARGS__) +// Debug checks enabled: +#define DCHECK_F(test, ...) CHECK_F(test, ##__VA_ARGS__) +#define DCHECK_NOTNULL_F(x, ...) CHECK_NOTNULL_F(x, ##__VA_ARGS__) +#define DCHECK_EQ_F(a, b, ...) CHECK_EQ_F(a, b, ##__VA_ARGS__) +#define DCHECK_NE_F(a, b, ...) CHECK_NE_F(a, b, ##__VA_ARGS__) +#define DCHECK_LT_F(a, b, ...) CHECK_LT_F(a, b, ##__VA_ARGS__) +#define DCHECK_LE_F(a, b, ...) CHECK_LE_F(a, b, ##__VA_ARGS__) +#define DCHECK_GT_F(a, b, ...) CHECK_GT_F(a, b, ##__VA_ARGS__) +#define DCHECK_GE_F(a, b, ...) CHECK_GE_F(a, b, ##__VA_ARGS__) #else - // Debug checks disabled: - #define DCHECK_F(test, ...) - #define DCHECK_NOTNULL_F(x, ...) - #define DCHECK_EQ_F(a, b, ...) - #define DCHECK_NE_F(a, b, ...) - #define DCHECK_LT_F(a, b, ...) - #define DCHECK_LE_F(a, b, ...) - #define DCHECK_GT_F(a, b, ...) - #define DCHECK_GE_F(a, b, ...) -#endif // NDEBUG - +// Debug checks disabled: +#define DCHECK_F(test, ...) +#define DCHECK_NOTNULL_F(x, ...) +#define DCHECK_EQ_F(a, b, ...) +#define DCHECK_NE_F(a, b, ...) +#define DCHECK_LT_F(a, b, ...) +#define DCHECK_LE_F(a, b, ...) +#define DCHECK_GT_F(a, b, ...) +#define DCHECK_GE_F(a, b, ...) +#endif // NDEBUG #if LOGURU_REDEFINE_ASSERT - #undef assert - #ifndef NDEBUG - // Debug: - #define assert(test) CHECK_WITH_INFO_F(!!(test), #test) // HACK - #else - #define assert(test) - #endif -#endif // LOGURU_REDEFINE_ASSERT +#undef assert +#ifndef NDEBUG +// Debug: +#define assert(test) CHECK_WITH_INFO_F(!!(test), #test) // HACK +#else +#define assert(test) +#endif +#endif // LOGURU_REDEFINE_ASSERT -#endif // LOGURU_HAS_DECLARED_FORMAT_HEADER +#endif // LOGURU_HAS_DECLARED_FORMAT_HEADER // ---------------------------------------------------------------------------- // .dP"Y8 888888 88""Yb 888888 db 8b d8 .dP"Y8 @@ -1223,125 +1348,131 @@ LOGURU_ANONYMOUS_NAMESPACE_END */ #include -#include // Adds about 38 kLoC on clang. +#include // Adds about 38 kLoC on clang. #include LOGURU_ANONYMOUS_NAMESPACE_BEGIN -namespace loguru -{ - // Like sprintf, but returns the formated text. - LOGURU_EXPORT - std::string strprintf(LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(1, 2); - - // Like vsprintf, but returns the formated text. - LOGURU_EXPORT - std::string vstrprintf(LOGURU_FORMAT_STRING_TYPE format, va_list) LOGURU_PRINTF_LIKE(1, 0); - - class LOGURU_EXPORT StreamLogger - { - public: - StreamLogger(Verbosity verbosity, const char* file, unsigned line) : _verbosity(verbosity), _file(file), _line(line) {} - ~StreamLogger() noexcept(false); - - template - StreamLogger& operator<<(const T& t) - { - _ss << t; - return *this; - } - - // std::endl and other iomanip:s. - StreamLogger& operator<<(std::ostream&(*f)(std::ostream&)) - { - f(_ss); - return *this; - } - - private: - Verbosity _verbosity; - const char* _file; - unsigned _line; - std::ostringstream _ss; - }; - - class LOGURU_EXPORT AbortLogger - { - public: - AbortLogger(const char* expr, const char* file, unsigned line) : _expr(expr), _file(file), _line(line) { } - LOGURU_NORETURN ~AbortLogger() noexcept(false); - - template - AbortLogger& operator<<(const T& t) - { - _ss << t; - return *this; - } - - // std::endl and other iomanip:s. - AbortLogger& operator<<(std::ostream&(*f)(std::ostream&)) - { - f(_ss); - return *this; - } - - private: - const char* _expr; - const char* _file; - unsigned _line; - std::ostringstream _ss; - }; - - class LOGURU_EXPORT Voidify - { - public: - Voidify() {} - // This has to be an operator with a precedence lower than << but higher than ?: - void operator&(const StreamLogger&) { } - void operator&(const AbortLogger&) { } - }; - - /* Helper functions for CHECK_OP_S macro. - GLOG trick: The (int, int) specialization works around the issue that the compiler - will not instantiate the template version of the function on values of unnamed enum type. */ - #define DEFINE_CHECK_OP_IMPL(name, op) \ - template \ - inline std::string* name(const char* expr, const T1& v1, const char* op_str, const T2& v2) \ - { \ - if (LOGURU_PREDICT_TRUE(v1 op v2)) { return NULL; } \ - std::ostringstream ss; \ - ss << "CHECK FAILED: " << expr << " (" << v1 << " " << op_str << " " << v2 << ") "; \ - return new std::string(ss.str()); \ - } \ - inline std::string* name(const char* expr, int v1, const char* op_str, int v2) \ - { \ - return name(expr, v1, op_str, v2); \ - } - - DEFINE_CHECK_OP_IMPL(check_EQ_impl, ==) - DEFINE_CHECK_OP_IMPL(check_NE_impl, !=) - DEFINE_CHECK_OP_IMPL(check_LE_impl, <=) - DEFINE_CHECK_OP_IMPL(check_LT_impl, < ) - DEFINE_CHECK_OP_IMPL(check_GE_impl, >=) - DEFINE_CHECK_OP_IMPL(check_GT_impl, > ) - #undef DEFINE_CHECK_OP_IMPL - - /* GLOG trick: Function is overloaded for integral types to allow static const integrals - declared in classes and not defined to be used as arguments to CHECK* macros. */ - template - inline const T& referenceable_value(const T& t) { return t; } - inline char referenceable_value(char t) { return t; } - inline unsigned char referenceable_value(unsigned char t) { return t; } - inline signed char referenceable_value(signed char t) { return t; } - inline short referenceable_value(short t) { return t; } - inline unsigned short referenceable_value(unsigned short t) { return t; } - inline int referenceable_value(int t) { return t; } - inline unsigned int referenceable_value(unsigned int t) { return t; } - inline long referenceable_value(long t) { return t; } - inline unsigned long referenceable_value(unsigned long t) { return t; } - inline long long referenceable_value(long long t) { return t; } - inline unsigned long long referenceable_value(unsigned long long t) { return t; } -} // namespace loguru +namespace loguru { +// Like sprintf, but returns the formated text. +LOGURU_EXPORT +std::string strprintf(LOGURU_FORMAT_STRING_TYPE format, ...) + LOGURU_PRINTF_LIKE(1, 2); + +// Like vsprintf, but returns the formated text. +LOGURU_EXPORT +std::string vstrprintf(LOGURU_FORMAT_STRING_TYPE format, va_list) + LOGURU_PRINTF_LIKE(1, 0); + +class LOGURU_EXPORT StreamLogger { +public: + StreamLogger(Verbosity verbosity, const char* file, unsigned line) + : _verbosity(verbosity), _file(file), _line(line) {} + ~StreamLogger() noexcept(false); + + template + StreamLogger& operator<<(const T& t) { + _ss << t; + return *this; + } + + // std::endl and other iomanip:s. + StreamLogger& operator<<(std::ostream& (*f)(std::ostream&)) { + f(_ss); + return *this; + } + +private: + Verbosity _verbosity; + const char* _file; + unsigned _line; + std::ostringstream _ss; +}; + +class LOGURU_EXPORT AbortLogger { +public: + AbortLogger(const char* expr, const char* file, unsigned line) + : _expr(expr), _file(file), _line(line) {} + LOGURU_NORETURN ~AbortLogger() noexcept(false); + + template + AbortLogger& operator<<(const T& t) { + _ss << t; + return *this; + } + + // std::endl and other iomanip:s. + AbortLogger& operator<<(std::ostream& (*f)(std::ostream&)) { + f(_ss); + return *this; + } + +private: + const char* _expr; + const char* _file; + unsigned _line; + std::ostringstream _ss; +}; + +class LOGURU_EXPORT Voidify { +public: + Voidify() {} + // This has to be an operator with a precedence lower than << but higher + // than ?: + void operator&(const StreamLogger&) {} + void operator&(const AbortLogger&) {} +}; + +/* Helper functions for CHECK_OP_S macro. + GLOG trick: The (int, int) specialization works around the issue that + the compiler will not instantiate the template version of the function on + values of unnamed enum type. */ +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template \ + inline std::string* name(const char* expr, const T1& v1, \ + const char* op_str, const T2& v2) { \ + if (LOGURU_PREDICT_TRUE(v1 op v2)) { \ + return NULL; \ + } \ + std::ostringstream ss; \ + ss << "CHECK FAILED: " << expr << " (" << v1 << " " << op_str << " " \ + << v2 << ") "; \ + return new std::string(ss.str()); \ + } \ + inline std::string* name(const char* expr, int v1, const char* op_str, \ + int v2) { \ + return name(expr, v1, op_str, v2); \ + } + +DEFINE_CHECK_OP_IMPL(check_EQ_impl, ==) +DEFINE_CHECK_OP_IMPL(check_NE_impl, !=) +DEFINE_CHECK_OP_IMPL(check_LE_impl, <=) +DEFINE_CHECK_OP_IMPL(check_LT_impl, <) +DEFINE_CHECK_OP_IMPL(check_GE_impl, >=) +DEFINE_CHECK_OP_IMPL(check_GT_impl, >) +#undef DEFINE_CHECK_OP_IMPL + +/* GLOG trick: Function is overloaded for integral types to allow static const + integrals declared in classes and not defined to be used as arguments to + CHECK* macros. */ +template +inline const T& referenceable_value(const T& t) { + return t; +} +inline char referenceable_value(char t) { return t; } +inline unsigned char referenceable_value(unsigned char t) { return t; } +inline signed char referenceable_value(signed char t) { return t; } +inline short referenceable_value(short t) { return t; } +inline unsigned short referenceable_value(unsigned short t) { return t; } +inline int referenceable_value(int t) { return t; } +inline unsigned int referenceable_value(unsigned int t) { return t; } +inline long referenceable_value(long t) { return t; } +inline unsigned long referenceable_value(unsigned long t) { return t; } +inline long long referenceable_value(long long t) { return t; } +inline unsigned long long referenceable_value(unsigned long long t) { + return t; +} +} // namespace loguru LOGURU_ANONYMOUS_NAMESPACE_END @@ -1349,138 +1480,146 @@ LOGURU_ANONYMOUS_NAMESPACE_END // Logging macros: // usage: LOG_STREAM(INFO) << "Foo " << std::setprecision(10) << some_value; -#define VLOG_IF_S(verbosity, cond) \ - ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ - ? (void)0 \ - : loguru::Voidify() & loguru::StreamLogger(verbosity, __FILE__, __LINE__) -#define LOG_IF_S(verbosity_name, cond) VLOG_IF_S(loguru::Verbosity_ ## verbosity_name, cond) -#define VLOG_S(verbosity) VLOG_IF_S(verbosity, true) -#define LOG_S(verbosity_name) VLOG_S(loguru::Verbosity_ ## verbosity_name) +#define VLOG_IF_S(verbosity, cond) \ + ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ + ? (void)0 \ + : loguru::Voidify() & \ + loguru::StreamLogger(verbosity, __FILE__, __LINE__) +#define LOG_IF_S(verbosity_name, cond) \ + VLOG_IF_S(loguru::Verbosity_##verbosity_name, cond) +#define VLOG_S(verbosity) VLOG_IF_S(verbosity, true) +#define LOG_S(verbosity_name) VLOG_S(loguru::Verbosity_##verbosity_name) // ----------------------------------------------- // ABORT_S macro. Usage: ABORT_S() << "Causo of error: " << details; -#define ABORT_S() loguru::Voidify() & loguru::AbortLogger("ABORT: ", __FILE__, __LINE__) +#define ABORT_S() \ + loguru::Voidify() & loguru::AbortLogger("ABORT: ", __FILE__, __LINE__) // ----------------------------------------------- // CHECK_S macros: -#define CHECK_WITH_INFO_S(cond, info) \ - LOGURU_PREDICT_TRUE((cond) == true) \ - ? (void)0 \ - : loguru::Voidify() & loguru::AbortLogger("CHECK FAILED: " info " ", __FILE__, __LINE__) +#define CHECK_WITH_INFO_S(cond, info) \ + LOGURU_PREDICT_TRUE((cond) == true) \ + ? (void)0 \ + : loguru::Voidify() & loguru::AbortLogger("CHECK FAILED: " info " ", \ + __FILE__, __LINE__) #define CHECK_S(cond) CHECK_WITH_INFO_S(cond, #cond) #define CHECK_NOTNULL_S(x) CHECK_WITH_INFO_S((x) != nullptr, #x " != nullptr") -#define CHECK_OP_S(function_name, expr1, op, expr2) \ - while (auto error_string = loguru::function_name(#expr1 " " #op " " #expr2, \ - loguru::referenceable_value(expr1), #op, \ - loguru::referenceable_value(expr2))) \ - loguru::AbortLogger(error_string->c_str(), __FILE__, __LINE__) +#define CHECK_OP_S(function_name, expr1, op, expr2) \ + while (auto error_string = loguru::function_name( \ + #expr1 " " #op " " #expr2, loguru::referenceable_value(expr1), \ + #op, loguru::referenceable_value(expr2))) \ + loguru::AbortLogger(error_string->c_str(), __FILE__, __LINE__) #define CHECK_EQ_S(expr1, expr2) CHECK_OP_S(check_EQ_impl, expr1, ==, expr2) #define CHECK_NE_S(expr1, expr2) CHECK_OP_S(check_NE_impl, expr1, !=, expr2) #define CHECK_LE_S(expr1, expr2) CHECK_OP_S(check_LE_impl, expr1, <=, expr2) -#define CHECK_LT_S(expr1, expr2) CHECK_OP_S(check_LT_impl, expr1, < , expr2) +#define CHECK_LT_S(expr1, expr2) CHECK_OP_S(check_LT_impl, expr1, <, expr2) #define CHECK_GE_S(expr1, expr2) CHECK_OP_S(check_GE_impl, expr1, >=, expr2) -#define CHECK_GT_S(expr1, expr2) CHECK_OP_S(check_GT_impl, expr1, > , expr2) +#define CHECK_GT_S(expr1, expr2) CHECK_OP_S(check_GT_impl, expr1, >, expr2) #if LOGURU_DEBUG_LOGGING - // Debug logging enabled: - #define DVLOG_IF_S(verbosity, cond) VLOG_IF_S(verbosity, cond) - #define DLOG_IF_S(verbosity_name, cond) LOG_IF_S(verbosity_name, cond) - #define DVLOG_S(verbosity) VLOG_S(verbosity) - #define DLOG_S(verbosity_name) LOG_S(verbosity_name) +// Debug logging enabled: +#define DVLOG_IF_S(verbosity, cond) VLOG_IF_S(verbosity, cond) +#define DLOG_IF_S(verbosity_name, cond) LOG_IF_S(verbosity_name, cond) +#define DVLOG_S(verbosity) VLOG_S(verbosity) +#define DLOG_S(verbosity_name) LOG_S(verbosity_name) #else - // Debug logging disabled: - #define DVLOG_IF_S(verbosity, cond) \ - (true || (verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ - ? (void)0 \ - : loguru::Voidify() & loguru::StreamLogger(verbosity, __FILE__, __LINE__) - - #define DLOG_IF_S(verbosity_name, cond) DVLOG_IF_S(loguru::Verbosity_ ## verbosity_name, cond) - #define DVLOG_S(verbosity) DVLOG_IF_S(verbosity, true) - #define DLOG_S(verbosity_name) DVLOG_S(loguru::Verbosity_ ## verbosity_name) +// Debug logging disabled: +#define DVLOG_IF_S(verbosity, cond) \ + (true || (verbosity) > loguru::current_verbosity_cutoff() || \ + (cond) == false) \ + ? (void)0 \ + : loguru::Voidify() & \ + loguru::StreamLogger(verbosity, __FILE__, __LINE__) + +#define DLOG_IF_S(verbosity_name, cond) \ + DVLOG_IF_S(loguru::Verbosity_##verbosity_name, cond) +#define DVLOG_S(verbosity) DVLOG_IF_S(verbosity, true) +#define DLOG_S(verbosity_name) DVLOG_S(loguru::Verbosity_##verbosity_name) #endif #if LOGURU_DEBUG_CHECKS - // Debug checks enabled: - #define DCHECK_S(cond) CHECK_S(cond) - #define DCHECK_NOTNULL_S(x) CHECK_NOTNULL_S(x) - #define DCHECK_EQ_S(a, b) CHECK_EQ_S(a, b) - #define DCHECK_NE_S(a, b) CHECK_NE_S(a, b) - #define DCHECK_LT_S(a, b) CHECK_LT_S(a, b) - #define DCHECK_LE_S(a, b) CHECK_LE_S(a, b) - #define DCHECK_GT_S(a, b) CHECK_GT_S(a, b) - #define DCHECK_GE_S(a, b) CHECK_GE_S(a, b) +// Debug checks enabled: +#define DCHECK_S(cond) CHECK_S(cond) +#define DCHECK_NOTNULL_S(x) CHECK_NOTNULL_S(x) +#define DCHECK_EQ_S(a, b) CHECK_EQ_S(a, b) +#define DCHECK_NE_S(a, b) CHECK_NE_S(a, b) +#define DCHECK_LT_S(a, b) CHECK_LT_S(a, b) +#define DCHECK_LE_S(a, b) CHECK_LE_S(a, b) +#define DCHECK_GT_S(a, b) CHECK_GT_S(a, b) +#define DCHECK_GE_S(a, b) CHECK_GE_S(a, b) #else // Debug checks disabled: - #define DCHECK_S(cond) CHECK_S(true || (cond)) - #define DCHECK_NOTNULL_S(x) CHECK_S(true || (x) != nullptr) - #define DCHECK_EQ_S(a, b) CHECK_S(true || (a) == (b)) - #define DCHECK_NE_S(a, b) CHECK_S(true || (a) != (b)) - #define DCHECK_LT_S(a, b) CHECK_S(true || (a) < (b)) - #define DCHECK_LE_S(a, b) CHECK_S(true || (a) <= (b)) - #define DCHECK_GT_S(a, b) CHECK_S(true || (a) > (b)) - #define DCHECK_GE_S(a, b) CHECK_S(true || (a) >= (b)) +#define DCHECK_S(cond) CHECK_S(true || (cond)) +#define DCHECK_NOTNULL_S(x) CHECK_S(true || (x) != nullptr) +#define DCHECK_EQ_S(a, b) CHECK_S(true || (a) == (b)) +#define DCHECK_NE_S(a, b) CHECK_S(true || (a) != (b)) +#define DCHECK_LT_S(a, b) CHECK_S(true || (a) < (b)) +#define DCHECK_LE_S(a, b) CHECK_S(true || (a) <= (b)) +#define DCHECK_GT_S(a, b) CHECK_S(true || (a) > (b)) +#define DCHECK_GE_S(a, b) CHECK_S(true || (a) >= (b)) #endif #if LOGURU_REPLACE_GLOG - #undef LOG - #undef VLOG - #undef LOG_IF - #undef VLOG_IF - #undef CHECK - #undef CHECK_NOTNULL - #undef CHECK_EQ - #undef CHECK_NE - #undef CHECK_LT - #undef CHECK_LE - #undef CHECK_GT - #undef CHECK_GE - #undef DLOG - #undef DVLOG - #undef DLOG_IF - #undef DVLOG_IF - #undef DCHECK - #undef DCHECK_NOTNULL - #undef DCHECK_EQ - #undef DCHECK_NE - #undef DCHECK_LT - #undef DCHECK_LE - #undef DCHECK_GT - #undef DCHECK_GE - #undef VLOG_IS_ON - - #define LOG LOG_S - #define VLOG VLOG_S - #define LOG_IF LOG_IF_S - #define VLOG_IF VLOG_IF_S - #define CHECK(cond) CHECK_S(!!(cond)) - #define CHECK_NOTNULL CHECK_NOTNULL_S - #define CHECK_EQ CHECK_EQ_S - #define CHECK_NE CHECK_NE_S - #define CHECK_LT CHECK_LT_S - #define CHECK_LE CHECK_LE_S - #define CHECK_GT CHECK_GT_S - #define CHECK_GE CHECK_GE_S - #define DLOG DLOG_S - #define DVLOG DVLOG_S - #define DLOG_IF DLOG_IF_S - #define DVLOG_IF DVLOG_IF_S - #define DCHECK DCHECK_S - #define DCHECK_NOTNULL DCHECK_NOTNULL_S - #define DCHECK_EQ DCHECK_EQ_S - #define DCHECK_NE DCHECK_NE_S - #define DCHECK_LT DCHECK_LT_S - #define DCHECK_LE DCHECK_LE_S - #define DCHECK_GT DCHECK_GT_S - #define DCHECK_GE DCHECK_GE_S - #define VLOG_IS_ON(verbosity) ((verbosity) <= loguru::current_verbosity_cutoff()) - -#endif // LOGURU_REPLACE_GLOG - -#endif // LOGURU_WITH_STREAMS - -#endif // LOGURU_HAS_DECLARED_STREAMS_HEADER +#undef LOG +#undef VLOG +#undef LOG_IF +#undef VLOG_IF +#undef CHECK +#undef CHECK_NOTNULL +#undef CHECK_EQ +#undef CHECK_NE +#undef CHECK_LT +#undef CHECK_LE +#undef CHECK_GT +#undef CHECK_GE +#undef DLOG +#undef DVLOG +#undef DLOG_IF +#undef DVLOG_IF +#undef DCHECK +#undef DCHECK_NOTNULL +#undef DCHECK_EQ +#undef DCHECK_NE +#undef DCHECK_LT +#undef DCHECK_LE +#undef DCHECK_GT +#undef DCHECK_GE +#undef VLOG_IS_ON + +#define LOG LOG_S +#define VLOG VLOG_S +#define LOG_IF LOG_IF_S +#define VLOG_IF VLOG_IF_S +#define CHECK(cond) CHECK_S(!!(cond)) +#define CHECK_NOTNULL CHECK_NOTNULL_S +#define CHECK_EQ CHECK_EQ_S +#define CHECK_NE CHECK_NE_S +#define CHECK_LT CHECK_LT_S +#define CHECK_LE CHECK_LE_S +#define CHECK_GT CHECK_GT_S +#define CHECK_GE CHECK_GE_S +#define DLOG DLOG_S +#define DVLOG DVLOG_S +#define DLOG_IF DLOG_IF_S +#define DVLOG_IF DVLOG_IF_S +#define DCHECK DCHECK_S +#define DCHECK_NOTNULL DCHECK_NOTNULL_S +#define DCHECK_EQ DCHECK_EQ_S +#define DCHECK_NE DCHECK_NE_S +#define DCHECK_LT DCHECK_LT_S +#define DCHECK_LE DCHECK_LE_S +#define DCHECK_GT DCHECK_GT_S +#define DCHECK_GE DCHECK_GE_S +#define VLOG_IS_ON(verbosity) \ + ((verbosity) <= loguru::current_verbosity_cutoff()) + +#endif // LOGURU_REPLACE_GLOG + +#endif // LOGURU_WITH_STREAMS + +#endif // LOGURU_HAS_DECLARED_STREAMS_HEADER diff --git a/src/atom/server/message_queue.hpp b/src/atom/server/message_queue.hpp index 58069ece..87cbef62 100644 --- a/src/atom/server/message_queue.hpp +++ b/src/atom/server/message_queue.hpp @@ -24,10 +24,15 @@ Description: A simple message queue (just learn something) #include #include #include -#include #include -namespace Atom::Async { +#if ENABLE_FASTHASH +#include "emhash/hash_table8.hpp" +#else +#include +#endif + +namespace Atom::Server { /** * @brief A message queue that allows subscribers to receive messages of type T. * @@ -198,6 +203,6 @@ void MessageQueue::stopProcessingThread() { } m_processingThreads.clear(); } -} // namespace Atom::Async +} // namespace Atom::Server #endif diff --git a/src/atom/system/_component.cpp b/src/atom/system/_component.cpp index e9a65908..4d30faa3 100644 --- a/src/atom/system/_component.cpp +++ b/src/atom/system/_component.cpp @@ -1,3 +1,17 @@ +/* + * _component.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Component of Atom-System + +**************************************************/ + #include "_component.hpp" #include "atom/log/loguru.hpp" @@ -25,7 +39,16 @@ using json = nlohmann::json; #define GET_CPU_INFO(name, func) \ auto name = func(); \ if (name < 0 || name > 100) { \ - LOG_F(ERROR, "SystemComponent::getCPUInfo: Failed to get %s", #name); \ + LOG_F(ERROR, "SystemComponent::getCPUInfo: Failed to get {}", #name); \ + return createErrorResponse(__func__, \ + {"error", "failed to get " #name}, \ + Constants::SYSTEM_ERROR); \ + } + +#define GET_CPU_INFO_S(name, func) \ + auto name = func(); \ + if (name.empty()) { \ + LOG_F(ERROR, "SystemComponent::getCPUInfo: Failed to get {}", #name); \ return createErrorResponse(__func__, \ {"error", "failed to get " #name}, \ Constants::SYSTEM_ERROR); \ @@ -45,20 +68,21 @@ SystemComponent::SystemComponent(const std::string &name) : SharedComponent(name) { DLOG_F(INFO, "SystemComponent::SystemComponent"); - regiterFunc("getCPUInfo", &SystemComponent::getCPUInfo, this); - regiterFunc("getMemoryInfo", &SystemComponent::getMemoryInfo, this); - regiterFunc("getDiskInfo", &SystemComponent::getDiskInfo, this); - regiterFunc("getNetworkInfo", &SystemComponent::getNetworkInfo, this); - regiterFunc("getBatteryInfo", &SystemComponent::getBatteryInfo, this); - regiterFunc("getGPUInfo", &SystemComponent::getGPUInfo, this); - regiterFunc("getOSInfo", &SystemComponent::getOSInfo, this); + registerFunc("getCPUInfo", &SystemComponent::getCPUInfo, this); + registerFunc("getMemoryInfo", &SystemComponent::getMemoryInfo, this); + registerFunc("getDiskInfo", &SystemComponent::getDiskInfo, this); + registerFunc("getNetworkInfo", &SystemComponent::getNetworkInfo, this); + registerFunc("getBatteryInfo", &SystemComponent::getBatteryInfo, this); + registerFunc("getGPUInfo", &SystemComponent::getGPUInfo, this); + registerFunc("getOSInfo", &SystemComponent::getOSInfo, this); registerVariable("cpuUsage", "", "The CPU usage"); registerVariable("cpuTemperature", "", "The CPU temperature"); registerVariable("cpuModel", "", "The CPU model"); registerVariable("cpuFrequency", "", "The CPU frequency"); - registerVariable("numberOfPhysicalPackages", "", "The number of physical " - "packages"); + registerVariable("numberOfPhysicalPackages", "", + "The number of physical " + "packages"); registerVariable("numberOfPhysicalCPUs", "", "The number of physical CPUs"); registerVariable("processorIdentifier", "", "The processor identifier"); registerVariable("processorFrequency", "", "The processor frequency"); @@ -84,6 +108,10 @@ SystemComponent::~SystemComponent() { DLOG_F(INFO, "SystemComponent::~SystemComponent"); } +bool SystemComponent::initialize() { return true; } + +bool SystemComponent::destroy() { return true; } + json SystemComponent::getCPUInfo(const json &m_params) { DLOG_F(INFO, "SystemComponent::getCPUInfo"); @@ -92,8 +120,8 @@ json SystemComponent::getCPUInfo(const json &m_params) { GET_CPU_INFO(current_cpu_usage, Atom::System::getCurrentCpuUsage); GET_CPU_INFO(current_cpu_temperature, Atom::System::getCurrentCpuTemperature); - GET_CPU_INFO(cpu_model, Atom::System::getCPUModel); - GET_CPU_INFO(processor_identifier, Atom::System::getProcessorIdentifier); + GET_CPU_INFO_S(cpu_model, Atom::System::getCPUModel); + GET_CPU_INFO_S(processor_identifier, Atom::System::getProcessorIdentifier); GET_CPU_INFO(processor_frequency, Atom::System::getProcessorFrequency); GET_CPU_INFO(number_of_physical_packages, Atom::System::getNumberOfPhysicalPackages); @@ -211,4 +239,4 @@ json SystemComponent::getOSInfo(const json &m_params) { {"kernelVersion", os_info.kernelVersion}, {"architecture", os_info.architecture}, {"compiler", os_info.compiler}}); -}) \ No newline at end of file +} \ No newline at end of file diff --git a/src/atom/system/_component.hpp b/src/atom/system/_component.hpp index 6bae8024..85471ef6 100644 --- a/src/atom/system/_component.hpp +++ b/src/atom/system/_component.hpp @@ -1,3 +1,17 @@ +/* + * _component.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Component of Atom-System + +**************************************************/ + #ifndef ATOM_SYSTEM_COMPONENT_HPP #define ATOM_SYSTEM_COMPONENT_HPP @@ -28,8 +42,6 @@ class SystemComponent : public SharedComponent json getBatteryInfo(const json &m_params); json getOSInfo(const json &m_params); -private: - std::unique_ptr m_configManager; }; #endif diff --git a/src/atom/system/_pybind.cpp b/src/atom/system/_pybind.cpp new file mode 100644 index 00000000..ed16e1e3 --- /dev/null +++ b/src/atom/system/_pybind.cpp @@ -0,0 +1,169 @@ +/* + * _pybind.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Python Binding of Atom-System Module + +**************************************************/ + +#include + +#include "module/battery.hpp" +#include "module/cpu.hpp" +#include "module/disk.hpp" +#include "module/memory.hpp" +#include "module/os.hpp" +#include "module/wifi.hpp" + +#include "command.hpp" +#include "crash_quotes.hpp" +#include "lregistry.hpp" +#include "os.hpp" +#include "pidwatcher.hpp" +#include "user.hpp" + +namespace py = pybind11; + +using namespace Atom::System; + +PYBIND11_MODULE(atom_system, m) { + pybind11::class_(m, "BatteryInfo") + .def_readwrite("isBatteryPresent", &BatteryInfo::isBatteryPresent) + .def_readwrite("isCharging", &BatteryInfo::isCharging) + .def_readwrite("batteryLifePercent", &BatteryInfo::batteryLifePercent) + .def_readwrite("batteryLifeTime", &BatteryInfo::batteryLifeTime) + .def_readwrite("batteryFullLifeTime", &BatteryInfo::batteryFullLifeTime) + .def_readwrite("energyNow", &BatteryInfo::energyNow) + .def_readwrite("energyFull", &BatteryInfo::energyFull) + .def_readwrite("energyDesign", &BatteryInfo::energyDesign) + .def_readwrite("voltageNow", &BatteryInfo::voltageNow) + .def_readwrite("currentNow", &BatteryInfo::currentNow); + + m.def("getBatteryInfo", &getBatteryInfo); + + m.def("get_current_cpu_usage", &getCurrentCpuUsage, + "Get the current CPU usage as a percentage."); + m.def("get_current_cpu_temperature", &getCurrentCpuTemperature, + "Get the current CPU temperature in degrees Celsius."); + m.def("get_cpu_model", &getCPUModel, "Get the model of the CPU."); + m.def("get_processor_identifier", &getProcessorIdentifier, + "Get the identifier of the CPU processor."); + m.def("get_processor_frequency", &getProcessorFrequency, + "Get the frequency of the CPU in GHz."); + m.def("get_number_of_physical_packages", &getNumberOfPhysicalPackages, + "Get the number of physical CPU packages."); + m.def("get_number_of_physical_cpus", &getNumberOfPhysicalCPUs, + "Get the number of physical CPUs."); + + m.def("getDiskUsage", &getDiskUsage); + m.def("getDriveModel", &getDriveModel); + m.def("getStorageDeviceModels", &getStorageDeviceModels); + m.def("getAvailableDrives", &getAvailableDrives); + m.def("calculateDiskUsagePercentage", &calculateDiskUsagePercentage); + + m.def("get_memory_usage", &getMemoryUsage); + m.def("get_total_memory_size", &getTotalMemorySize); + m.def("get_available_memory_size", &getAvailableDrives); + m.def("get_physical_memory_info", &getPhysicalMemoryInfo); + m.def("get_virtual_memory_max", &getVirtualMemoryMax); + m.def("get_virtual_memory_used", &getVirtualMemoryUsed); + m.def("get_swap_memory_total", &getSwapMemoryTotal); + m.def("get_swap_memory_used", &getSwapMemoryUsed); + + py::class_(m, "OperatingSystemInfo") + .def(py::init<>()) + .def("toJson", &OperatingSystemInfo::toJson); + + m.def("getOperatingSystemInfo", &getOperatingSystemInfo); + + m.def("getCurrentWifi", &getCurrentWifi, "Get the current WiFi name"); + m.def("getCurrentWiredNetwork", &getCurrentWiredNetwork, + "Get the current wired network name"); + m.def("isHotspotConnected", &isHotspotConnected, + "Check if hotspot is connected"); + + // m.def("executeCommand", &executeCommand, "Execute a command and return + // the output as a string"); + m.def("executeCommands", &executeCommands, "Execute a list of commands"); + // m.def("executeCommand", &executeCommand, "Execute a command and return + // the process handle"); + m.def("killProcess", &killProcess, "Kill a process"); + m.def("executeCommandWithEnv", &executeCommandWithEnv, + "Execute a command with environment variables and return the output " + "as a string"); + m.def("executeCommandWithStatus", &executeCommandWithStatus, + "Execute a command and return the output along with the exit status"); + + py::class_(m, "Quote") + .def(py::init()) + .def("getText", &Quote::getText) + .def("getAuthor", &Quote::getAuthor); + + py::class_(m, "QuoteManager") + .def("addQuote", &QuoteManager::addQuote) + .def("removeQuote", &QuoteManager::removeQuote) +#ifdef DEBUG + .def("displayQuotes", &QuoteManager::displayQuotes) +#endif + .def("shuffleQuotes", &QuoteManager::shuffleQuotes) + .def("clearQuotes", &QuoteManager::clearQuotes) + .def("loadQuotesFromFile", &QuoteManager::loadQuotesFromFile) + .def("saveQuotesToFile", &QuoteManager::saveQuotesToFile) + .def("searchQuotes", &QuoteManager::searchQuotes) + .def("filterQuotesByAuthor", &QuoteManager::filterQuotesByAuthor) + .def("getRandomQuote", &QuoteManager::getRandomQuote); + + py::class_(m, "Registry") + .def(py::init<>()) + .def("loadRegistryFromFile", &Registry::loadRegistryFromFile) + .def("createKey", &Registry::createKey) + .def("deleteKey", &Registry::deleteKey) + .def("setValue", &Registry::setValue) + .def("getValue", &Registry::getValue) + .def("deleteValue", &Registry::deleteValue) + .def("backupRegistryData", &Registry::backupRegistryData) + .def("restoreRegistryData", &Registry::restoreRegistryData) + .def("keyExists", &Registry::keyExists) + .def("valueExists", &Registry::valueExists) + .def("getValueNames", &Registry::getValueNames); + + py::class_(m, "Utsname") + .def(py::init<>()) + .def_readwrite("sysname", &Utsname::sysname) + .def_readwrite("nodename", &Utsname::nodename) + .def_readwrite("release", &Utsname::release) + .def_readwrite("version", &Utsname::version) + .def_readwrite("machine", &Utsname::machine); + + m.def("walk", &walk); + m.def("jwalk", &jwalk); + m.def("fwalk", &fwalk); + m.def("Environ", &Environ); + m.def("ctermid", &Atom::System::ctermid); + m.def("getpriority", &getpriority); + m.def("getlogin", &Atom::System::getlogin); + m.def("uname", &uname); + + py::class_(m, "PidWatcher") + .def(py::init<>()) + .def("SetExitCallback", &PidWatcher::SetExitCallback) + .def("SetMonitorFunction", &PidWatcher::SetMonitorFunction) + .def("GetPidByName", &PidWatcher::GetPidByName) + .def("Start", &PidWatcher::Start) + .def("Stop", &PidWatcher::Stop) + .def("Switch", &PidWatcher::Switch); + + m.def("getUserGroups", &getUserGroups); + m.def("getUsername", &getUsername); + m.def("getHostname", &getHostname); + m.def("getUserId", &getUserId); + m.def("getGroupId", &getGroupId); + m.def("getHomeDirectory", &getHomeDirectory); + m.def("getLoginShell", &getLoginShell); +} diff --git a/src/atom/system/_script.cpp b/src/atom/system/_script.cpp index 7dcd3a22..8b7464b3 100644 --- a/src/atom/system/_script.cpp +++ b/src/atom/system/_script.cpp @@ -1,4 +1,18 @@ -#include +/* + * _script.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Carbon Binding of Atom-System + +**************************************************/ + +#include "carbon/carbon.hpp" #include "module/battery.hpp" #include "module/cpu.hpp" @@ -7,137 +21,43 @@ #include "module/os.hpp" #include "module/wifi.hpp" -#include "command.hpp" -#include "crash_quotes.hpp" -#include "lregistry.hpp" -#include "os.hpp" -#include "pidwatcher.hpp" -#include "user.hpp" - -namespace py = pybind11; +#include +#include "atom/log/loguru.hpp" using namespace Atom::System; -PYBIND11_MODULE(atom_system, m) { - - pybind11::class_(m, "BatteryInfo") - .def_readwrite("isBatteryPresent", &BatteryInfo::isBatteryPresent) - .def_readwrite("isCharging", &BatteryInfo::isCharging) - .def_readwrite("batteryLifePercent", &BatteryInfo::batteryLifePercent) - .def_readwrite("batteryLifeTime", &BatteryInfo::batteryLifeTime) - .def_readwrite("batteryFullLifeTime", &BatteryInfo::batteryFullLifeTime) - .def_readwrite("energyNow", &BatteryInfo::energyNow) - .def_readwrite("energyFull", &BatteryInfo::energyFull) - .def_readwrite("energyDesign", &BatteryInfo::energyDesign) - .def_readwrite("voltageNow", &BatteryInfo::voltageNow) - .def_readwrite("currentNow", &BatteryInfo::currentNow); - - m.def("getBatteryInfo", &getBatteryInfo); - - m.def("get_current_cpu_usage", &getCurrentCpuUsage, "Get the current CPU usage as a percentage."); - m.def("get_current_cpu_temperature", &getCurrentCpuTemperature, "Get the current CPU temperature in degrees Celsius."); - m.def("get_cpu_model", &getCPUModel, "Get the model of the CPU."); - m.def("get_processor_identifier", &getProcessorIdentifier, "Get the identifier of the CPU processor."); - m.def("get_processor_frequency", &getProcessorFrequency, "Get the frequency of the CPU in GHz."); - m.def("get_number_of_physical_packages", &getNumberOfPhysicalPackages, "Get the number of physical CPU packages."); - m.def("get_number_of_physical_cpus", &getNumberOfPhysicalCPUs, "Get the number of physical CPUs."); - - m.def("getDiskUsage", &getDiskUsage); - m.def("getDriveModel", &getDriveModel); - m.def("getStorageDeviceModels", &getStorageDeviceModels); - m.def("getAvailableDrives", &getAvailableDrives); - m.def("calculateDiskUsagePercentage", &calculateDiskUsagePercentage); - - m.def("get_memory_usage", &getMemoryUsage); - m.def("get_total_memory_size", &getTotalMemorySize); - m.def("get_available_memory_size", &getAvailableDrives); - m.def("get_physical_memory_info", &getPhysicalMemoryInfo); - m.def("get_virtual_memory_max", &getVirtualMemoryMax); - m.def("get_virtual_memory_used", &getVirtualMemoryUsed); - m.def("get_swap_memory_total", &getSwapMemoryTotal); - m.def("get_swap_memory_used", &getSwapMemoryUsed); - - py::class_(m, "OperatingSystemInfo") - .def(py::init<>()) - .def("toJson", &OperatingSystemInfo::toJson); - - m.def("getOperatingSystemInfo", &getOperatingSystemInfo); - - m.def("getCurrentWifi", &getCurrentWifi, "Get the current WiFi name"); - m.def("getCurrentWiredNetwork", &getCurrentWiredNetwork, "Get the current wired network name"); - m.def("isHotspotConnected", &isHotspotConnected, "Check if hotspot is connected"); - - //m.def("executeCommand", &executeCommand, "Execute a command and return the output as a string"); - m.def("executeCommands", &executeCommands, "Execute a list of commands"); - //m.def("executeCommand", &executeCommand, "Execute a command and return the process handle"); - m.def("killProcess", &killProcess, "Kill a process"); - m.def("executeCommandWithEnv", &executeCommandWithEnv, "Execute a command with environment variables and return the output as a string"); - m.def("executeCommandWithStatus", &executeCommandWithStatus, "Execute a command and return the output along with the exit status"); - - py::class_(m, "Quote") - .def(py::init()) - .def("getText", &Quote::getText) - .def("getAuthor", &Quote::getAuthor); - - py::class_(m, "QuoteManager") - .def("addQuote", &QuoteManager::addQuote) - .def("removeQuote", &QuoteManager::removeQuote) - #ifdef DEBUG - .def("displayQuotes", &QuoteManager::displayQuotes) - #endif - .def("shuffleQuotes", &QuoteManager::shuffleQuotes) - .def("clearQuotes", &QuoteManager::clearQuotes) - .def("loadQuotesFromFile", &QuoteManager::loadQuotesFromFile) - .def("saveQuotesToFile", &QuoteManager::saveQuotesToFile) - .def("searchQuotes", &QuoteManager::searchQuotes) - .def("filterQuotesByAuthor", &QuoteManager::filterQuotesByAuthor) - .def("getRandomQuote", &QuoteManager::getRandomQuote); - - py::class_(m, "Registry") - .def(py::init<>()) - .def("loadRegistryFromFile", &Registry::loadRegistryFromFile) - .def("createKey", &Registry::createKey) - .def("deleteKey", &Registry::deleteKey) - .def("setValue", &Registry::setValue) - .def("getValue", &Registry::getValue) - .def("deleteValue", &Registry::deleteValue) - .def("backupRegistryData", &Registry::backupRegistryData) - .def("restoreRegistryData", &Registry::restoreRegistryData) - .def("keyExists", &Registry::keyExists) - .def("valueExists", &Registry::valueExists) - .def("getValueNames", &Registry::getValueNames); - - py::class_(m, "Utsname") - .def(py::init<>()) - .def_readwrite("sysname", &Utsname::sysname) - .def_readwrite("nodename", &Utsname::nodename) - .def_readwrite("release", &Utsname::release) - .def_readwrite("version", &Utsname::version) - .def_readwrite("machine", &Utsname::machine); - - m.def("walk", &walk); - m.def("jwalk", &jwalk); - m.def("fwalk", &fwalk); - m.def("Environ", &Environ); - m.def("ctermid", &Atom::System::ctermid); - m.def("getpriority", &getpriority); - m.def("getlogin", &Atom::System::getlogin); - m.def("uname", &uname); - - py::class_(m, "PidWatcher") - .def(py::init<>()) - .def("SetExitCallback", &PidWatcher::SetExitCallback) - .def("SetMonitorFunction", &PidWatcher::SetMonitorFunction) - .def("GetPidByName", &PidWatcher::GetPidByName) - .def("Start", &PidWatcher::Start) - .def("Stop", &PidWatcher::Stop) - .def("Switch", &PidWatcher::Switch); - - m.def("getUserGroups", &getUserGroups); - m.def("getUsername", &getUsername); - m.def("getHostname", &getHostname); - m.def("getUserId", &getUserId); - m.def("getGroupId", &getGroupId); - m.def("getHomeDirectory", &getHomeDirectory); - m.def("getLoginShell", &getLoginShell); +CARBON_MODULE_EXPORT { + Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { + Carbon::ModulePtr m_module = std::make_shared(); + + m_module->add(Carbon::fun(&getCurrentCpuUsage), + "get_current_cpu_usage"); + m_module->add(Carbon::fun(&getCurrentCpuTemperature), + "get_current_cpu_temperature"); + m_module->add(Carbon::fun(&getCPUModel), "get_cpu_model"); + m_module->add(Carbon::fun(&getProcessorIdentifier), + "get_processor_identifier"); + m_module->add(Carbon::fun(&getProcessorFrequency), + "get_processor_frequency"); + m_module->add(Carbon::fun(&getNumberOfPhysicalPackages), + "get_number_of_physical_packages"); + m_module->add(Carbon::fun(&getNumberOfPhysicalCPUs), + "get_number_of_physical_cpus"); + + m_module->add(Carbon::fun(&getMemoryUsage), "get_memory_usage"); + m_module->add(Carbon::fun(&getTotalMemorySize), + "get_total_memory_size"); + m_module->add(Carbon::fun(&getAvailableMemorySize), + "get_available_memory_size"); + m_module->add(Carbon::fun(&getPhysicalMemoryInfo), + "get_physical_memory_info"); + m_module->add(Carbon::fun(&getVirtualMemoryMax), + "get_virtual_memory_max"); + m_module->add(Carbon::fun(&getVirtualMemoryUsed), + "get_virtual_memory_used"); + m_module->add(Carbon::fun(&getSwapMemoryTotal), + "get_swap_memory_total"); + m_module->add(Carbon::fun(&getSwapMemoryUsed), "get_swap_memory_used"); + return m_module; + } } diff --git a/src/atom/system/system.cpp b/src/atom/system/system.cpp index 84c9f44f..3f0d3c86 100644 --- a/src/atom/system/system.cpp +++ b/src/atom/system/system.cpp @@ -54,7 +54,7 @@ namespace fs = std::filesystem; #include "atom/log/loguru.hpp" namespace Atom::System { -bool CheckSoftwareInstalled(const std::string &software_name) { +bool checkSoftwareInstalled(const std::string &software_name) { bool is_installed = false; #ifdef _WIN32 HKEY hKey; @@ -116,46 +116,7 @@ bool CheckSoftwareInstalled(const std::string &software_name) { return is_installed; } -bool checkExecutableFile(const std::string &fileName, - const std::string &fileExt) { -#ifdef _WIN32 - fs::path filePath = fileName + fileExt; -#else - fs::path filePath = fileName; -#endif - - DLOG_F(INFO, "Checking file '%s'.", filePath.string().c_str()); - - if (!fs::exists(filePath)) { - DLOG_F(WARNING, "The file '%s' does not exist.", - filePath.string().c_str()); - return false; - } - -#ifdef _WIN32 - if (!fs::is_regular_file(filePath) || - !(GetFileAttributesA(filePath.generic_string().c_str()) & - FILE_ATTRIBUTE_DIRECTORY)) { - DLOG_F(WARNING, - "The file '%s' is not a regular file or is not executable.", - filePath.string().c_str()); - return false; - } -#else - if (!fs::is_regular_file(filePath) || access(filePath.c_str(), X_OK) != 0) { - DLOG_F(WARNING, - "The file '%s' is not a regular file or is not executable.", - filePath.string().c_str()); - return false; - } -#endif - - DLOG_F(INFO, "The file '%s' exists and is executable.", - filePath.string().c_str()); - return true; -} - -bool Shutdown() { +bool shutdown() { #ifdef _WIN32 ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0); #else @@ -168,7 +129,7 @@ bool Shutdown() { } // 重启函数 -bool Reboot() { +bool reboot() { #ifdef _WIN32 ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); #else @@ -180,20 +141,20 @@ bool Reboot() { return true; } -bool IsRoot() { +bool isRoot() { #ifdef _WIN32 HANDLE hToken; TOKEN_ELEVATION elevation; DWORD dwSize; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { - LOG_F(ERROR, "IsRoot error: OpenProcessToken error"); + LOG_F(ERROR, "isRoot error: OpenProcessToken error"); return false; } if (!GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize)) { - LOG_F(ERROR, "IsRoot error: GetTokenInformation error"); + LOG_F(ERROR, "isRoot error: GetTokenInformation error"); CloseHandle(hToken); return false; } @@ -206,27 +167,10 @@ bool IsRoot() { #endif } -std::string GetCurrentUsername() { -#ifdef _WIN32 - char username[UNLEN + 1]; - DWORD usernameLen = UNLEN + 1; - if (GetUserNameA(username, &usernameLen)) { - return std::string(username); - } -#else - char username[256]; - if (getlogin_r(username, sizeof(username)) == 0) { - return std::string(username); - } -#endif - return ""; -} - -std::vector> GetProcessInfo() { +std::vector> getProcessInfo() { std::vector> processInfo; #ifdef _WIN32 - // 使用 Windows API 获取进程信息和文件地址 DWORD processes[1024]; DWORD cbNeeded; if (EnumProcesses(processes, sizeof(processes), &cbNeeded)) { @@ -330,7 +274,7 @@ std::vector> GetProcessInfo() { return processInfo; } -bool CheckDuplicateProcess(const std::string &program_name) { +bool checkDuplicateProcess(const std::string &program_name) { #ifdef _WIN32 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { @@ -450,22 +394,6 @@ bool isProcessRunning(const std::string &processName) { closedir(dir); return true; - // An alternative way to check - /* - std::string command = "pgrep -c " + processName; - std::string output; - std::ifstream pipe(command.c_str()); - if (pipe) - { - if (getline(pipe, output)) - { - int count = std::stoi(output); - return (count > 0); - } - } - - return false; - */ #endif } @@ -550,7 +478,7 @@ std::vector GetProcessDetails() { } #ifdef _WIN32 -DWORD GetParentProcessId(DWORD processId) { +DWORD getParentProcessId(DWORD processId) { DWORD parentProcessId = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot != INVALID_HANDLE_VALUE) { @@ -571,7 +499,7 @@ DWORD GetParentProcessId(DWORD processId) { return parentProcessId; } -bool GetProcessInfoByID(DWORD processID, ProcessInfo &processInfo) { +bool getProcessInfoByID(DWORD processID, ProcessInfo &processInfo) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); if (hProcess != NULL) { @@ -582,7 +510,7 @@ bool GetProcessInfoByID(DWORD processID, ProcessInfo &processInfo) { processInfo.processID = processID; processInfo.executableFile = std::string(exeName); // if - // (!GetProcessId(reinterpret_cast(GetParentProcessId(reinterpret_cast(hProcess))), + // (!GetProcessId(reinterpret_cast(getParentProcessId(reinterpret_cast(hProcess))), // &processInfo.parentProcessID)) processInfo.parentProcessID = 0; processInfo.basePriority = GetPriorityClass(hProcess); @@ -597,12 +525,12 @@ bool GetProcessInfoByID(DWORD processID, ProcessInfo &processInfo) { return false; } -bool GetProcessInfoByName(const std::string &processName, +bool getProcessInfoByName(const std::string &processName, ProcessInfo &processInfo) { std::vector processes = GetProcessDetails(); for (const auto &process : processes) { if (process.executableFile == processName) { - if (GetProcessInfoByID(process.processID, processInfo)) + if (getProcessInfoByID(process.processID, processInfo)) return true; } } @@ -610,7 +538,7 @@ bool GetProcessInfoByName(const std::string &processName, return false; } #else -bool GetProcessInfoByID(int processID, ProcessInfo &processInfo) { +bool getProcessInfoByID(int processID, ProcessInfo &processInfo) { std::string statPath = "/proc/" + std::to_string(processID) + "/stat"; std::ifstream statFile(statPath); @@ -644,7 +572,7 @@ bool GetProcessInfoByID(int processID, ProcessInfo &processInfo) { return false; } -bool GetProcessInfoByName(const std::string &processName, +bool getProcessInfoByName(const std::string &processName, ProcessInfo &processInfo) { std::vector processes = GetProcessDetails(); for (const auto &process : processes) { @@ -652,7 +580,7 @@ bool GetProcessInfoByName(const std::string &processName, if (pos != std::string::npos) { std::string fileName = process.executableFile.substr(pos + 1); if (fileName == processName) { - if (GetProcessInfoByID(process.processID, processInfo)) + if (getProcessInfoByID(process.processID, processInfo)) return true; } } @@ -662,60 +590,3 @@ bool GetProcessInfoByName(const std::string &processName, } #endif } // namespace Atom::System - -/* -int main() -{ - float cpu_usage = cpustat(); - float mem_usage = memstat(); - float gpu_usage = gpustat(); - - std::cout << "CPU Usage: " << cpu_usage << "%" << std::endl; - std::cout << "Memory Usage: " << mem_usage << "%" << std::endl; - std::cout << "GPU Usage: " << gpu_usage << "%" << std::endl; - - std::vector> disk_usage = diskstat(); - for (const auto &disk : disk_usage) - { - std::cout << "Disk " << disk.first << " Usage: " << disk.second << "%" -<< std::endl; - } - - std::vector net_connections = netstat(); - for (const auto &conn : net_connections) - { - std::cout << "Network Connection: " << conn << std::endl; - } - - float cpuTemperature = GetCpuTemperature(); - - std::cout << "CPU Temperature: " << cpuTemperature << "°C" << std::endl; - - bool isConnected = IsConnectedToInternet(); - if (isConnected) { - std::cout << "Connected to the Internet." << std::endl; - } else { - std::cout << "Not connected to the Internet." << std::endl; - } - - bool elevated = IsRoot(); - if (elevated) { - std::cout << "Current process has elevated privileges." << std::endl; - } else { - std::cout << "Current process does not have elevated privileges." << -std::endl; - } - - std::vector> processInfo = -GetProcessInfo(); - - for (const auto &info : processInfo) - { - std::cout << "Process Name: " << info.first << std::endl; - std::cout << "File Address: " << info.second << std::endl; - std::cout << std::endl; - } - - return 0; -} -*/ \ No newline at end of file diff --git a/src/atom/system/system.hpp b/src/atom/system/system.hpp index 025936fa..5ff6046e 100644 --- a/src/atom/system/system.hpp +++ b/src/atom/system/system.hpp @@ -44,21 +44,7 @@ struct ProcessInfo { * @return false if the software is not installed or an error occurred. * 如果软件未安装或发生错误,则返回 false */ -bool CheckSoftwareInstalled(const std::string &software_name); - -/** - * @brief Check whether the specified file exists. - * 检查指定文件是否存在 - * - * @param fileName The name of the file. 文件名称 - * @param fileExt The extension of the file. 文件扩展名 - * @return true if the file exists. - * 如果文件存在,则返回 true - * @return false if the file does not exist or an error occurred. - * 如果文件不存在或发生错误,则返回 false - */ -bool checkExecutableFile(const std::string &fileName, - const std::string &fileExt); +bool checkSoftwareInstalled(const std::string &software_name); /** * @brief Check whether the current user has root/administrator privileges. @@ -69,16 +55,7 @@ bool checkExecutableFile(const std::string &fileName, * @return false if the current user does not have root/administrator * privileges. 如果当前用户没有根/管理员权限,则返回 false */ -bool IsRoot(); - -/** - * @brief Get the current user name. - * 获取当前用户名 - * - * @return The current user name. - * 当前用户名 - */ -std::string GetCurrentUsername(); +bool isRoot(); // Max: Surely, we will not recieve any signal after we call this function. @@ -91,7 +68,7 @@ std::string GetCurrentUsername(); * @return false if an error occurred. * 如果发生错误,则返回 false */ -bool Shutdown(); +bool shutdown(); /** * @brief Reboot the system. @@ -102,7 +79,7 @@ bool Shutdown(); * @return false if an error occurred. * 如果发生错误,则返回 false */ -bool Reboot(); +bool reboot(); /** * @brief Get the process information and file address. @@ -112,7 +89,7 @@ bool Reboot(); * process ID) and its file address. * 包含进程信息(名称和进程ID)以及对应文件地址的一对对的向量 */ -std::vector> GetProcessInfo(); +std::vector> getProcessInfo(); /** * @brief Check if there are duplicate processes with the same program name. @@ -125,7 +102,7 @@ std::vector> GetProcessInfo(); * @param program_name The name of the program to check for duplicates. * 要检查重复项的程序名称。 */ -bool CheckDuplicateProcess(const std::string &program_name); +bool checkDuplicateProcess(const std::string &program_name); /** * @brief Check if the specified process is running. @@ -160,9 +137,9 @@ std::vector GetProcessDetails(); * 如果发生错误,则返回 false */ #ifdef _WIN32 -bool GetProcessInfoByID(DWORD processID, ProcessInfo &processInfo); +bool getProcessInfoByID(DWORD processID, ProcessInfo &processInfo); #else -bool GetProcessInfoByID(int processID, ProcessInfo &processInfo); +bool getProcessInfoByID(int processID, ProcessInfo &processInfo); #endif /** @@ -176,7 +153,7 @@ bool GetProcessInfoByID(int processID, ProcessInfo &processInfo); * @return false if an error occurred. * 如果发生错误,则返回 false */ -bool GetProcessInfoByName(const std::string &processName, +bool getProcessInfoByName(const std::string &processName, ProcessInfo &processInfo); } // namespace Atom::System diff --git a/src/atom/type/_script.cpp b/src/atom/type/_script.cpp new file mode 100644 index 00000000..af32cc25 --- /dev/null +++ b/src/atom/type/_script.cpp @@ -0,0 +1,143 @@ +#ifndef CARBON_NLOHMANN_JSON_WRAP_HPP +#define CARBON_NLOHMANN_JSON_WRAP_HPP + +#include "carbon/carbon.hpp" + +#include "json.hpp" + +namespace Carbon { +class json_wrap { +public: + static Module &library(Module &m) { + m.add(Carbon::fun( + [](const std::string &t_str) { return from_json(t_str); }), + "from_json"); + m.add(Carbon::fun(&json_wrap::to_json), "to_json"); + + return m; + } + +private: + static Boxed_Value from_json(const nlohmann::json &t_json) { + switch (t_json.type()) { + case nlohmann::json::value_t::null: + return Boxed_Value(); + case nlohmann::json::value_t::object: { + std::map m; + + for (const auto &p : + t_json.get>()) { + m.insert(std::make_pair(p.first, from_json(p.second))); + } + + return Boxed_Value(m); + } + case nlohmann::json::value_t::array: { + std::vector vec; + + for (const auto &p : + t_json.get>()) { + vec.emplace_back(from_json(p)); + } + + return Boxed_Value(vec); + } + case nlohmann::json::value_t::string: + return Boxed_Value(t_json.get()); + case nlohmann::json::value_t::number_float: + return Boxed_Value(t_json.get()); + case nlohmann::json::value_t::number_integer: + return Boxed_Value(t_json.get()); + case nlohmann::json::value_t::boolean: + return Boxed_Value(t_json.get()); + } + + throw std::runtime_error("Unknown JSON type"); + } + + static Boxed_Value from_json(const std::string &t_json) { + try { + return from_json(nlohmann::json::parse(t_json)); + } catch (const std::out_of_range &) { + throw std::runtime_error("Unparsed JSON input"); + } + } + + static std::string to_json(const Boxed_Value &t_bv) { + return to_json_object(t_bv).dump(); + } + + static nlohmann::json to_json_object(const Boxed_Value &t_bv) { + try { + const std::map m = + Carbon::boxed_cast &>( + t_bv); + + nlohmann::json obj(nlohmann::json::value_t::object); + for (const auto &o : m) { + obj[o.first] = to_json_object(o.second); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a map + } + + try { + const std::vector v = + Carbon::boxed_cast &>(t_bv); + + nlohmann::json obj(nlohmann::json::value_t::array); + for (size_t i = 0; i < v.size(); ++i) { + obj[i] = to_json_object(v[i]); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a vector + } + + try { + Boxed_Number bn(t_bv); + if (Boxed_Number::is_floating_point(t_bv)) { + return nlohmann::json(bn.get_as()); + } else { + return nlohmann::json(bn.get_as()); + } + } catch (const Carbon::detail::exception::bad_any_cast &) { + // not a number + } + + try { + return nlohmann::json(boxed_cast(t_bv)); + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a bool + } + + try { + return nlohmann::json(boxed_cast(t_bv)); + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a string + } + + try { + const Carbon::dispatch::Dynamic_Object &o = + boxed_cast(t_bv); + + nlohmann::json obj(nlohmann::json::value_t::object); + for (const auto &attr : o.get_attrs()) { + obj[attr.first] = to_json_object(attr.second); + } + return obj; + } catch (const Carbon::exception::bad_boxed_cast &) { + // not a dynamic object + } + + if (t_bv.is_null()) + return nlohmann::json(); // a null value + + throw std::runtime_error("Unknown object type to convert to JSON"); + } +}; + +} // namespace Carbon + +#endif diff --git a/src/atom/type/autotype.hpp b/src/atom/type/autotype.hpp deleted file mode 100644 index 806091e4..00000000 --- a/src/atom/type/autotype.hpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - * type.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-12-13 - -Description: A simple type wrapper - -**************************************************/ - -#ifndef ATOM_TYPE_TYPE_HPP -#define ATOM_TYPE_TYPE_HPP - -#include -#include -#include - -namespace Atom::Type { -class Any { -public: - template - Any(const T &value) : m_ptr(new Derived(value)) {} - - template - T cast() const { - return static_cast *>(m_ptr)->m_value; - } - -private: - struct Base { - virtual ~Base() {} - }; - - template - struct Derived : Base { - explicit Derived(const T &value) : m_value(value) {} - T m_value; - }; - - Base *m_ptr; -}; - -// 优化后的自动类型类模板 -template -class AutoType { -public: - explicit AutoType(const T &value) : m_value(value) {} - - template - auto operator+(const AutoType &other) const { - return AutoType(m_value + other.m_value); - } - - template - auto operator-(const AutoType &other) const { - return AutoType(m_value - other.m_value); - } - - template - auto operator*(const AutoType &other) const { - return AutoType(m_value * other.m_value); - } - - template - auto operator/(const AutoType &other) const { - return AutoType(m_value / other.m_value); - } - - template - auto operator%(const AutoType &other) const { - return AutoType(m_value % other.m_value); - } - - template - auto operator==(const AutoType &other) const { - return m_value == other.m_value; - } - - template - auto operator!=(const AutoType &other) const { - return m_value != other.m_value; - } - - template - auto operator<(const AutoType &other) const { - return m_value < other.m_value; - } - - template - auto operator<=(const AutoType &other) const { - return m_value <= other.m_value; - } - - template - auto operator>(const AutoType &other) const { - return m_value > other.m_value; - } - - template - auto operator>=(const AutoType &other) const { - return m_value >= other.m_value; - } - - // 省略其他运算符重载 - - T m_value; // 成员变量 -}; - -// 辅助函数模板,用于创建AutoType对象 -template -AutoType makeAutoType(const T &value) { - return AutoType(value); -} - -// 元组打印类模板 -template > -struct TuplePrinter { - static void print(const Tuple &t) { - if constexpr (N > 1) { - TuplePrinter::print(t); - std::cout << ", " << std::get(t); - } else { - std::cout << std::get<0>(t); - } - } -}; -} // namespace Atom::Type - -#endif - -/* -int main() -{ - AutoType a(2); - AutoType b(3.5); - - auto c = a + b; // AutoType(5.5) - auto d = a - b; // AutoType(-1.5) - auto e = a * b; // AutoType(7.0) - auto f = a / b; // AutoType(0.571429) - - std::cout << std::boolalpha << (a == b) << '\n'; // false - std::cout << std::boolalpha << (a != b) << '\n'; // true - std::cout << std::boolalpha << (a < b) << '\n'; // true - std::cout << std::boolalpha << (a <= b) << '\n'; // true - std::cout << std::boolalpha << (a > b) << '\n'; // false - std::cout << std::boolalpha << (a >= b) << '\n'; // false - - auto t = std::make_tuple(1, 2.5, "Hello"); - TuplePrinter::print(t); // 1, 2.5, Hello - - return 0; -} -*/ \ No newline at end of file diff --git a/src/atom/type/pointer.hpp b/src/atom/type/pointer.hpp index b9f04e82..67ffdafe 100644 --- a/src/atom/type/pointer.hpp +++ b/src/atom/type/pointer.hpp @@ -22,8 +22,9 @@ Description: Pointer Sentinel for Atom #include /** - * @brief Concept to check if a type is a pointer type, including raw pointers, std::shared_ptr, and std::unique_ptr. - * + * @brief Concept to check if a type is a pointer type, including raw pointers, + * std::shared_ptr, and std::unique_ptr. + * * @tparam T The type to check. */ template @@ -33,8 +34,9 @@ concept PointerType = std::is_same_v::type>>; /** - * @brief A class template to hold different types of pointers using std::variant. - * + * @brief A class template to hold different types of pointers using + * std::variant. + * * @tparam T The type of the pointed-to object. */ template @@ -45,31 +47,31 @@ class PointerSentinel { /** * @brief Construct a new Pointer Sentinel object from a shared pointer. - * + * * @param p The shared pointer. */ - PointerSentinel(std::shared_ptr p) : ptr(p) {} + explicit PointerSentinel(std::shared_ptr p) : ptr(p) {} /** * @brief Construct a new Pointer Sentinel object from a unique pointer. - * + * * @param p The unique pointer. */ - PointerSentinel(std::unique_ptr&& p) : ptr(std::move(p)) {} + explicit PointerSentinel(std::unique_ptr&& p) : ptr(std::move(p)) {} /** * @brief Construct a new Pointer Sentinel object from a raw pointer. - * + * * @param p The raw pointer. */ - PointerSentinel(T* p) : ptr(p) {} + explicit PointerSentinel(T* p) : ptr(p) {} /** * @brief Get the raw pointer stored in the variant. - * + * * @return T* The raw pointer. */ - T* get() const { + [[nodiscard]] T* get() const { return std::visit( [](auto&& arg) -> T* { using U = std::decay_t; @@ -84,7 +86,7 @@ class PointerSentinel { /** * @brief Helper method to invoke member functions on the pointed-to object. - * + * * @tparam Func The type of the member function pointer. * @tparam Args The types of the arguments to the member function. * @param func The member function pointer. @@ -92,7 +94,7 @@ class PointerSentinel { * @return auto The return type of the member function. */ template - auto invoke(Func func, Args&&... args) { + [[nodiscard]] auto invoke(Func func, Args&&... args) { static_assert(std::is_member_function_pointer_v, "Func must be a member function pointer"); T* p = get(); diff --git a/src/atom/utils/hash_util.cpp b/src/atom/utils/hash_util.cpp index 6c589940..a1779714 100644 --- a/src/atom/utils/hash_util.cpp +++ b/src/atom/utils/hash_util.cpp @@ -313,32 +313,4 @@ std::string data_from_hexstring(const std::string &hexstring) { return data_from_hexstring(hexstring.c_str(), hexstring.size()); } -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Winvalid-constexpr" -#endif - -#ifdef _MSC_VER -#pragma warning(disable : 4244) -#pragma warning(push) -#pragma warning(disable : 4307) -#endif - -constexpr std::uint32_t fnv1a_prime = 16777619u; -constexpr std::uint32_t fnv1a_offset_basis = 2166136261u; - -constexpr std::uint32_t fnv1aHash(std::span data, - std::uint32_t hash = fnv1a_offset_basis) { - for (std::byte byte : data) { - hash ^= std::to_integer(byte); - hash *= fnv1a_prime; - } - return hash; -} - -constexpr std::uint32_t fnv1aHash(const std::string &text) { - return fnv1aHash(std::as_bytes(std::span(text))); -} - } // namespace Atom::Utils diff --git a/src/atom/utils/hash_util.hpp b/src/atom/utils/hash_util.hpp index eba83b6a..0954d213 100644 --- a/src/atom/utils/hash_util.hpp +++ b/src/atom/utils/hash_util.hpp @@ -141,11 +141,6 @@ void data_from_hexstring(const char *hexstring, size_t length, void *output); * hexadecimal string. */ [[nodiscard]] std::string data_from_hexstring(const std::string &data); - -[[nodiscard]] constexpr std::uint32_t fnv1aHash( - std::span data, std::uint32_t hash = fnv1a_offset_basis); - -[[nodiscard]] constexpr std::uint32_t fnv1aHash(const std::string &text); } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/atom/utils/string.hpp b/src/atom/utils/string.hpp index 5617e6e5..a83a33ea 100644 --- a/src/atom/utils/string.hpp +++ b/src/atom/utils/string.hpp @@ -60,11 +60,19 @@ namespace Atom::Utils { * @param delimiter 分隔符。 * @return 分割后的字符串数组。 */ -[[nodiscard]] std::vector splitString(const std::string &str, - char delimiter); +[[nodiscard( + "the result of splitString is not used")]] std::vector +splitString(const std::string &str, char delimiter); - std::string joinStrings(const std::vector &strings, - const std::string_view &delimiter) +/** + * @brief 将字符串数组连接为一个字符串。 + * @param strings 字符串数组。 + * @param delimiter 分隔符。 + * @return 连接后的字符串。 + */ +[[nodiscard("the result of joinStrings is not used")]] std::string joinStrings( + const std::vector &strings, + const std::string_view &delimiter); } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/atom/web/time.cpp b/src/atom/web/time.cpp index e0b441ac..e2793474 100644 --- a/src/atom/web/time.cpp +++ b/src/atom/web/time.cpp @@ -197,7 +197,7 @@ bool syncTimeFromRTC() { FILETIME ft; ft.dwLowDateTime = (DWORD)new_timestamp; ft.dwHighDateTime = (DWORD)(new_timestamp >> 32); - if (!System::IsRoot()) { + if (!System::isRoot()) { LOG_F(ERROR, "Permission denied. Need root privilege to set system time."); return false; @@ -210,7 +210,7 @@ bool syncTimeFromRTC() { void setSystemTime(int year, int month, int day, int hour, int minute, int second) { - if (!System::IsRoot()) { + if (!System::isRoot()) { LOG_F(ERROR, "Permission denied. Need root privilege to set system time."); return; diff --git a/src/carbon/command/bootstrap_stl.hpp b/src/carbon/command/bootstrap_stl.hpp index 6db68ed8..bdd6dbf7 100644 --- a/src/carbon/command/bootstrap_stl.hpp +++ b/src/carbon/command/bootstrap_stl.hpp @@ -15,7 +15,7 @@ #include "operators.hpp" #include "proxy_constructors.hpp" #include "register_function.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon::bootstrap::standard_library { /// Bidir_Range, based on the D concept of ranges. diff --git a/src/carbon/command/boxed_cast_helper.hpp b/src/carbon/command/boxed_cast_helper.hpp index 3ee094d9..d8d71736 100644 --- a/src/carbon/command/boxed_cast_helper.hpp +++ b/src/carbon/command/boxed_cast_helper.hpp @@ -7,7 +7,7 @@ #include #include "boxed_value.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { class Type_Conversions_State; diff --git a/src/carbon/command/boxed_value.hpp b/src/carbon/command/boxed_value.hpp index 21fef101..e180d578 100644 --- a/src/carbon/command/boxed_value.hpp +++ b/src/carbon/command/boxed_value.hpp @@ -7,7 +7,8 @@ #include "../defines.hpp" #include "any.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" +#include "atom/type/pointer.hpp" namespace Carbon { /// \brief A wrapper for holding any valid C++ type. All types in ChaiScript are diff --git a/src/carbon/command/dispatchkit.cpp b/src/carbon/command/dispatchkit.cpp new file mode 100644 index 00000000..4c0600da --- /dev/null +++ b/src/carbon/command/dispatchkit.cpp @@ -0,0 +1,1046 @@ +#include "dispatchkit.hpp" +#include "boxed_number.hpp" + +namespace Carbon { + +Module &Module::add(Type_Info ti, std::string name) { + m_typeinfos.emplace_back(ti, std::move(name)); + return *this; +} + +Module &Module::add(Type_Conversion d) { + m_conversions.push_back(std::move(d)); + return *this; +} + +Module &Module::add(Proxy_Function f, std::string name) { + m_funcs.emplace_back(std::move(f), std::move(name)); + return *this; +} + +Module &Module::add_global_const(Boxed_Value t_bv, std::string t_name) { + if (!t_bv.is_const()) { + throw Carbon::exception::global_non_const(); + } + + m_globals.emplace_back(std::move(t_bv), std::move(t_name)); + return *this; +} + +// Add a bit of ChaiScript to eval during module implementation +Module &Module::eval(std::string str) { + m_evals.push_back(std::move(str)); + return *this; +} + +bool Module::has_function(const Proxy_Function &new_f, std::string_view name) { + return std::any_of( + m_funcs.begin(), m_funcs.end(), + [&](const std::pair &existing_f) { + return existing_f.second == name && *(existing_f.first) == *(new_f); + }); +} + +namespace detail { +Dispatch_Function::Dispatch_Function(std::vector t_funcs) + : Proxy_Function_Base(build_type_infos(t_funcs), calculate_arity(t_funcs)), + m_funcs(std::move(t_funcs)) {} + +bool Dispatch_Function::operator==( + const dispatch::Proxy_Function_Base &rhs) const { + try { + const auto &dispatch_fun = dynamic_cast(rhs); + return m_funcs == dispatch_fun.m_funcs; + } catch (const std::bad_cast &) { + return false; + } +} + +std::vector Dispatch_Function::get_contained_functions() + const { + return std::vector(m_funcs.begin(), m_funcs.end()); +} + +int Dispatch_Function::calculate_arity( + const std::vector &t_funcs) { + if (t_funcs.empty()) { + return -1; + } + + const auto arity = t_funcs.front()->get_arity(); + + for (const auto &func : t_funcs) { + if (arity != func->get_arity()) { + // The arities in the list do not match, so it's unspecified + return -1; + } + } + + return arity; +} + +bool Dispatch_Function::call_match( + const Function_Params &vals, + const Type_Conversions_State &t_conversions) const { + return std::any_of(std::begin(m_funcs), std::end(m_funcs), + [&vals, &t_conversions](const Proxy_Function &f) { + return f->call_match(vals, t_conversions); + }); +} + +Boxed_Value Dispatch_Function::do_call( + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + return dispatch::dispatch(m_funcs, params, t_conversions); +} + +std::vector Dispatch_Function::build_type_infos( + const std::vector &t_funcs) { + auto begin = t_funcs.cbegin(); + const auto &end = t_funcs.cend(); + + if (begin != end) { + std::vector type_infos = (*begin)->get_param_types(); + + ++begin; + + bool size_mismatch = false; + + while (begin != end) { + std::vector param_types = (*begin)->get_param_types(); + + if (param_types.size() != type_infos.size()) { + size_mismatch = true; + } + + for (size_t i = 0; i < type_infos.size() && i < param_types.size(); + ++i) { + if (!(type_infos[i] == param_types[i])) { + type_infos[i] = Get_Type_Info::get(); + } + } + + ++begin; + } + + assert(!type_infos.empty() && + " type_info vector size is < 0, this is only possible if " + "something else is broken"); + + if (size_mismatch) { + type_infos.resize(1); + } + + return type_infos; + } + + return std::vector(); +} +} // namespace detail + +namespace detail { + +Dispatch_Engine::Dispatch_Engine(Carbon::parser::Carbon_Parser_Base &parser) + : m_stack_holder(), m_parser(parser) {} + +void Dispatch_Engine::add(const Type_Conversion &d) { + m_conversions.add_conversion(d); +} + +void Dispatch_Engine::add(const Proxy_Function &f, const std::string &name) { + add_function(f, name); +} + +void Dispatch_Engine::add(Boxed_Value obj, const std::string &name) { + auto &stack = get_stack_data(); + + for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); + ++stack_elem) { + if (auto itr = stack_elem->find(name); itr != stack_elem->end()) { + itr->second = std::move(obj); + return; + } + } + + add_object(name, std::move(obj)); +} + +Boxed_Value &Dispatch_Engine::add_get_object(std::string t_name, + Boxed_Value obj, + Stack_Holder &t_holder) { + auto &stack_elem = get_stack_data(t_holder).back(); + + if (auto result = + stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); + result.second) { + return result.first->second; + } else { + // insert failed + throw Carbon::exception::name_conflict_error(result.first->first); + } +} + +void Dispatch_Engine::add_object(std::string t_name, Boxed_Value obj, + Stack_Holder &t_holder) { + auto &stack_elem = get_stack_data(t_holder).back(); + + if (auto result = + stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); + !result.second) { + // insert failed + throw Carbon::exception::name_conflict_error(result.first->first); + } +} + +void Dispatch_Engine::add_object(const std::string &name, Boxed_Value obj) { + add_object(name, std::move(obj), get_stack_holder()); +} + +/// Adds a new global shared object, between all the threads +void Dispatch_Engine::add_global_const(const Boxed_Value &obj, + const std::string &name) { + if (!obj.is_const()) { + throw Carbon::exception::global_non_const(); + } + + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + if (m_state.m_global_objects.find(name) != m_state.m_global_objects.end()) { + throw Carbon::exception::name_conflict_error(name); + } else { + m_state.m_global_objects.insert(std::make_pair(name, obj)); + } +} + +/// Adds a new global (non-const) shared object, between all the threads +Boxed_Value Dispatch_Engine::add_global_no_throw(Boxed_Value obj, + std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return m_state.m_global_objects + .insert(std::pair{std::move(name), std::move(obj)}) + .first->second; +} + +/// Adds a new global (non-const) shared object, between all the threads +void Dispatch_Engine::add_global(Boxed_Value obj, std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + if (auto result = m_state.m_global_objects.insert( + std::pair{std::move(name), std::move(obj)}); + !result.second) { + // insert failed + throw Carbon::exception::name_conflict_error(result.first->first); + } +} + +void Dispatch_Engine::set_global(Boxed_Value obj, std::string name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + m_state.m_global_objects.insert_or_assign(std::move(name), std::move(obj)); +} + +void Dispatch_Engine::new_scope() { new_scope(*m_stack_holder); } + +void Dispatch_Engine::pop_scope() { pop_scope(*m_stack_holder); } + +void Dispatch_Engine::new_scope(Stack_Holder &t_holder) { + t_holder.push_stack_data(); + t_holder.push_call_params(); +} + +void Dispatch_Engine::pop_scope(Stack_Holder &t_holder) { + t_holder.call_params.pop_back(); + StackData &stack = get_stack_data(t_holder); + + assert(!stack.empty()); + + stack.pop_back(); +} + +void Dispatch_Engine::new_stack(Stack_Holder &t_holder) { + // add a new Stack with 1 element + t_holder.push_stack(); +} + +void Dispatch_Engine::pop_stack(Stack_Holder &t_holder) { + t_holder.stacks.pop_back(); +} + +Boxed_Value Dispatch_Engine::get_object(std::string_view name, + std::atomic_uint_fast32_t &t_loc, + Stack_Holder &t_holder) const { + enum class Loc : uint_fast32_t { + located = 0x80000000, + is_local = 0x40000000, + stack_mask = 0x0FFF0000, + loc_mask = 0x0000FFFF + }; + + uint_fast32_t loc = t_loc; + + if (loc == 0) { + auto &stack = get_stack_data(t_holder); + + // Is it in the stack? + for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); + ++stack_elem) { + for (auto s = stack_elem->begin(); s != stack_elem->end(); ++s) { + if (s->first == name) { + t_loc = + static_cast( + std::distance(stack.rbegin(), stack_elem) << 16) | + static_cast( + std::distance(stack_elem->begin(), s)) | + static_cast(Loc::located) | + static_cast(Loc::is_local); + return s->second; + } + } + } + + t_loc = static_cast(Loc::located); + } else if ((loc & static_cast(Loc::is_local)) != 0u) { + auto &stack = get_stack_data(t_holder); + + return stack[stack.size() - 1 - + ((loc & static_cast(Loc::stack_mask)) >> + 16)] + .at_index(loc & static_cast(Loc::loc_mask)); + } + + // Is the value we are looking for a global or function? + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto itr = m_state.m_global_objects.find(name); + if (itr != m_state.m_global_objects.end()) { + return itr->second; + } + + // no? is it a function object? + auto obj = get_function_object_int(name, loc); + if (obj.first != loc) { + t_loc = uint_fast32_t(obj.first); + } + + return obj.second; +} + +void Dispatch_Engine::add(const Type_Info &ti, const std::string &name) { + add_global_const(const_var(ti), name + "_type"); + + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + m_state.m_types.insert(std::make_pair(name, ti)); +} + +Type_Info Dispatch_Engine::get_type(std::string_view name, + bool t_throw = true) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto itr = m_state.m_types.find(name); + + if (itr != m_state.m_types.end()) { + return itr->second; + } + + if (t_throw) { + throw std::range_error("Type Not Known: " + std::string(name)); + } else { + return Type_Info(); + } +} + +std::string Dispatch_Engine::get_type_name(const Type_Info &ti) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + for (const auto &elem : m_state.m_types) { + if (elem.second.bare_equal(ti)) { + return elem.first; + } + } + + return ti.bare_name(); +} + +std::vector> Dispatch_Engine::get_types() + const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return std::vector>( + m_state.m_types.begin(), m_state.m_types.end()); +} + +std::shared_ptr> +Dispatch_Engine::get_method_missing_functions() const { + uint_fast32_t method_missing_loc = m_method_missing_loc; + auto method_missing_funs = + get_function("method_missing", method_missing_loc); + if (method_missing_funs.first != method_missing_loc) { + m_method_missing_loc = uint_fast32_t(method_missing_funs.first); + } + + return std::move(method_missing_funs.second); +} + +std::pair>> +Dispatch_Engine::get_function(std::string_view t_name, + const size_t t_hint) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto &funs = get_functions_int(); + + if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { + return std::make_pair(std::distance(funs.begin(), itr), itr->second); + } else { + return std::make_pair(size_t(0), + std::make_shared>()); + } +} + +Boxed_Value Dispatch_Engine::get_function_object( + const std::string &t_name) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return get_function_object_int(t_name, 0).second; +} + +std::pair Dispatch_Engine::get_function_object_int( + std::string_view t_name, const size_t t_hint) const { + const auto &funs = get_boxed_functions_int(); + + if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { + return std::make_pair(std::distance(funs.begin(), itr), itr->second); + } else { + throw std::range_error("Object not found: " + std::string(t_name)); + } +} + +bool Dispatch_Engine::function_exists(std::string_view name) const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return get_functions_int().count(name) > 0; +} + +std::map Dispatch_Engine::get_parent_locals() const { + auto &stack = get_stack_data(); + if (stack.size() > 1) { + return std::map(stack[1].begin(), + stack[1].end()); + } else { + return std::map(stack[0].begin(), + stack[0].end()); + } +} + +std::map Dispatch_Engine::get_locals() const { + auto &stack = get_stack_data(); + auto &scope = stack.front(); + return std::map(scope.begin(), scope.end()); +} + +void Dispatch_Engine::set_locals( + const std::map &t_locals) { + auto &stack = get_stack_data(); + auto &scope = stack.front(); + scope.assign(t_locals.begin(), t_locals.end()); +} + +std::map Dispatch_Engine::get_scripting_objects() + const { + const Stack_Holder &s = *m_stack_holder; + + // We don't want the current context, but one up if it exists + const StackData &stack = (s.stacks.size() == 1) + ? (s.stacks.back()) + : (s.stacks[s.stacks.size() - 2]); + + std::map retval; + + // note: map insert doesn't overwrite existing values, which is why this + // works + for (auto itr = stack.rbegin(); itr != stack.rend(); ++itr) { + retval.insert(itr->begin(), itr->end()); + } + + // add the global values + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + retval.insert(m_state.m_global_objects.begin(), + m_state.m_global_objects.end()); + + return retval; +} + +std::map Dispatch_Engine::get_function_objects() + const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + const auto &funs = get_function_objects_int(); + + std::map objs; + + for (const auto &fun : funs) { + objs.insert(std::make_pair(fun.first, const_var(fun.second))); + } + + return objs; +} + +/// Get a vector of all registered functions +std::vector> +Dispatch_Engine::get_functions() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + std::vector> rets; + + const auto &functions = get_functions_int(); + + for (const auto &function : functions) { + for (const auto &internal_func : *function.second) { + rets.emplace_back(function.first, internal_func); + } + } + + return rets; +} + +const Type_Conversions &Dispatch_Engine::conversions() const { + return m_conversions; +} + +bool Dispatch_Engine::is_attribute_call( + const std::vector &t_funs, const Function_Params &t_params, + bool t_has_params, const Type_Conversions_State &t_conversions) { + if (!t_has_params || t_params.empty()) { + return false; + } + + return std::any_of( + std::begin(t_funs), std::end(t_funs), [&](const auto &fun) { + return fun->is_attribute_function() && + fun->compare_first_type(t_params[0], t_conversions); + }); +} + +#ifdef CARBON_MSVC +// MSVC is unable to recognize that "rethrow_exception" causes the function to +// return so we must disable it here. +#pragma warning(push) +#pragma warning(disable : 4715) +#endif +Boxed_Value Dispatch_Engine::call_member( + const std::string &t_name, std::atomic_uint_fast32_t &t_loc, + const Function_Params ¶ms, bool t_has_params, + const Type_Conversions_State &t_conversions) { + uint_fast32_t loc = t_loc; + const auto funs = get_function(t_name, loc); + if (funs.first != loc) { + t_loc = uint_fast32_t(funs.first); + } + + const auto do_attribute_call = + [this](int l_num_params, Function_Params l_params, + const std::vector &l_funs, + const Type_Conversions_State &l_conversions) -> Boxed_Value { + Function_Params attr_params(l_params.begin(), + l_params.begin() + l_num_params); + Boxed_Value bv = dispatch::dispatch(l_funs, attr_params, l_conversions); + if (l_num_params < int(l_params.size()) || + bv.get_type_info().bare_equal( + user_type())) { + struct This_Foist { + This_Foist(Dispatch_Engine &e, const Boxed_Value &t_bv) + : m_e(e) { + m_e.get().new_scope(); + m_e.get().add_object("__this", t_bv); + } + + ~This_Foist() { m_e.get().pop_scope(); } + + std::reference_wrapper m_e; + }; + + This_Foist fi(*this, l_params.front()); + + try { + auto func = + boxed_cast(bv); + try { + return (*func)( + {l_params.begin() + l_num_params, l_params.end()}, + l_conversions); + } catch (const Carbon::exception::bad_boxed_cast &) { + } catch (const Carbon::exception::arity_error &) { + } catch (const Carbon::exception::guard_error &) { + } + throw Carbon::exception::dispatch_error( + {l_params.begin() + l_num_params, l_params.end()}, + std::vector{ + boxed_cast(bv)}); + } catch (const Carbon::exception::bad_boxed_cast &) { + // unable to convert bv into a Proxy_Function_Base + throw Carbon::exception::dispatch_error( + {l_params.begin() + l_num_params, l_params.end()}, + std::vector(l_funs.begin(), + l_funs.end())); + } + } else { + return bv; + } + }; + + if (is_attribute_call(*funs.second, params, t_has_params, t_conversions)) { + return do_attribute_call(1, params, *funs.second, t_conversions); + } else { + std::exception_ptr except; + + if (!funs.second->empty()) { + try { + return dispatch::dispatch(*funs.second, params, t_conversions); + } catch (Carbon::exception::dispatch_error &) { + except = std::current_exception(); + } + } + + // If we get here we know that either there was no method with that + // name, or there was no matching method + + const auto functions = [&]() -> std::vector { + std::vector fs; + + const auto method_missing_funs = get_method_missing_functions(); + + for (const auto &f : *method_missing_funs) { + if (f->compare_first_type(params[0], t_conversions)) { + fs.push_back(f); + } + } + + return fs; + }(); + + const bool is_no_param = [&]() -> bool { + for (const auto &f : functions) { + if (f->get_arity() != 2) { + return false; + } + } + return true; + }(); + + if (!functions.empty()) { + try { + if (is_no_param) { + auto tmp_params = params.to_vector(); + tmp_params.insert(tmp_params.begin() + 1, var(t_name)); + return do_attribute_call(2, Function_Params(tmp_params), + functions, t_conversions); + } else { + std::array p{ + params[0], var(t_name), + var(std::vector(params.begin() + 1, + params.end()))}; + return dispatch::dispatch(functions, Function_Params{p}, + t_conversions); + } + } catch (const dispatch::option_explicit_set &e) { + throw Carbon::exception::dispatch_error( + params, + std::vector(funs.second->begin(), + funs.second->end()), + e.what()); + } + } + + // If we get all the way down here we know there was no + // "method_missing" method at all. + if (except) { + std::rethrow_exception(except); + } else { + throw Carbon::exception::dispatch_error( + params, std::vector(funs.second->begin(), + funs.second->end())); + } + } +} +#ifdef CARBON_MSVC +#pragma warning(pop) +#endif + +Boxed_Value Dispatch_Engine::call_function( + std::string_view t_name, std::atomic_uint_fast32_t &t_loc, + const Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { + uint_fast32_t loc = t_loc; + const auto [func_loc, func] = get_function(t_name, loc); + if (func_loc != loc) { + t_loc = uint_fast32_t(func_loc); + } + return dispatch::dispatch(*func, params, t_conversions); +} + +/// Dump object info to stdout +void Dispatch_Engine::dump_object(const Boxed_Value &o) const { + std::cout << (o.is_const() ? "const " : "") << type_name(o) << '\n'; +} + +/// Dump type info to stdout +void Dispatch_Engine::dump_type(const Type_Info &type) const { + std::cout << (type.is_const() ? "const " : "") << get_type_name(type); +} + +/// Dump function to stdout +void Dispatch_Engine::dump_function( + const std::pair &f) const { + const auto params = f.second->get_param_types(); + + dump_type(params.front()); + std::cout << " " << f.first << "("; + + for (auto itr = params.begin() + 1; itr != params.end();) { + dump_type(*itr); + ++itr; + + if (itr != params.end()) { + std::cout << ", "; + } + } + + std::cout << ") \n"; +} + +/// Returns true if a call can be made that consists of the first parameter +/// (the function) with the remaining parameters as its arguments. +Boxed_Value Dispatch_Engine::call_exists(const Function_Params ¶ms) const { + if (params.empty()) { + throw Carbon::exception::arity_error(static_cast(params.size()), + 1); + } + + const auto &f = this->boxed_cast(params[0]); + const Type_Conversions_State convs(m_conversions, + m_conversions.conversion_saves()); + + return const_var(f->call_match( + Function_Params(params.begin() + 1, params.end()), convs)); +} + +/// Dump all system info to stdout +void Dispatch_Engine::dump_system() const { + std::cout << "Registered Types: \n"; + for (const auto &[type_name, type] : get_types()) { + std::cout << type_name << ": " << type.bare_name() << '\n'; + } + + std::cout << '\n'; + + std::cout << "Functions: \n"; + for (const auto &func : get_functions()) { + dump_function(func); + } + std::cout << '\n'; +} + +/// return true if the Boxed_Value matches the registered type by name +bool Dispatch_Engine::is_type(const Boxed_Value &r, + std::string_view user_typename) const { + try { + if (get_type(user_typename).bare_equal(r.get_type_info())) { + return true; + } + } catch (const std::range_error &) { + } + + try { + const dispatch::Dynamic_Object &d = + boxed_cast(r); + return d.get_type_name() == user_typename; + } catch (const std::bad_cast &) { + } + + return false; +} + +std::string Dispatch_Engine::type_name(const Boxed_Value &obj) const { + return get_type_name(obj.get_type_info()); +} + +Dispatch_Engine::State Dispatch_Engine::get_state() const { + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + return m_state; +} + +void Dispatch_Engine::set_state(const State &t_state) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + m_state = t_state; +} + +void Dispatch_Engine::save_function_params( + Stack_Holder &t_s, std::vector &&t_params) { + for (auto &¶m : t_params) { + t_s.call_params.back().insert(t_s.call_params.back().begin(), + std::move(param)); + } +} + +void Dispatch_Engine::save_function_params(Stack_Holder &t_s, + const Function_Params &t_params) { + t_s.call_params.back().insert(t_s.call_params.back().begin(), + t_params.begin(), t_params.end()); +} + +void Dispatch_Engine::save_function_params( + std::vector &&t_params) { + save_function_params(*m_stack_holder, std::move(t_params)); +} + +void Dispatch_Engine::save_function_params(const Function_Params &t_params) { + save_function_params(*m_stack_holder, t_params); +} + +void Dispatch_Engine::new_function_call( + Stack_Holder &t_s, Type_Conversions::Conversion_Saves &t_saves) { + if (t_s.call_depth == 0) { + m_conversions.enable_conversion_saves(t_saves, true); + } + + ++t_s.call_depth; + + save_function_params(m_conversions.take_saves(t_saves)); +} + +void Dispatch_Engine::pop_function_call( + Stack_Holder &t_s, Type_Conversions::Conversion_Saves &t_saves) { + --t_s.call_depth; + + assert(t_s.call_depth >= 0); + + if (t_s.call_depth == 0) { + t_s.call_params.back().clear(); + m_conversions.enable_conversion_saves(t_saves, false); + } +} + +void Dispatch_Engine::new_function_call() { + new_function_call(*m_stack_holder, m_conversions.conversion_saves()); +} + +void Dispatch_Engine::pop_function_call() { + pop_function_call(*m_stack_holder, m_conversions.conversion_saves()); +} + +Stack_Holder &Dispatch_Engine::get_stack_holder() { return *m_stack_holder; } + +const Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() const { + return m_stack_holder->stacks.back(); +} + +Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data( + Stack_Holder &t_holder) { + return t_holder.stacks.back(); +} + +Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() { + return m_stack_holder->stacks.back(); +} + +parser::Carbon_Parser_Base &Dispatch_Engine::get_parser() { + return m_parser.get(); +} + +bool Dispatch_Engine::function_less_than(const Proxy_Function &lhs, + const Proxy_Function &rhs) { + auto dynamic_lhs( + std::dynamic_pointer_cast(lhs)); + auto dynamic_rhs( + std::dynamic_pointer_cast(rhs)); + + if (dynamic_lhs && dynamic_rhs) { + if (dynamic_lhs->get_guard()) { + return dynamic_rhs->get_guard() ? false : true; + } else { + return false; + } + } + + if (dynamic_lhs && !dynamic_rhs) { + return false; + } + + if (!dynamic_lhs && dynamic_rhs) { + return true; + } + + const auto &lhsparamtypes = lhs->get_param_types(); + const auto &rhsparamtypes = rhs->get_param_types(); + + const auto lhssize = lhsparamtypes.size(); + const auto rhssize = rhsparamtypes.size(); + + const auto boxed_type = user_type(); + const auto boxed_pod_type = user_type(); + + for (size_t i = 1; i < lhssize && i < rhssize; ++i) { + const Type_Info < = lhsparamtypes[i]; + const Type_Info &rt = rhsparamtypes[i]; + + if (lt.bare_equal(rt) && lt.is_const() == rt.is_const()) { + continue; // The first two types are essentially the same, next + // iteration + } + + // const is after non-const for the same type + if (lt.bare_equal(rt) && lt.is_const() && !rt.is_const()) { + return false; + } + + if (lt.bare_equal(rt) && !lt.is_const()) { + return true; + } + + // boxed_values are sorted last + if (lt.bare_equal(boxed_type)) { + return false; + } + + if (rt.bare_equal(boxed_type)) { + return true; + } + + if (lt.bare_equal(boxed_pod_type)) { + return false; + } + + if (rt.bare_equal(boxed_pod_type)) { + return true; + } + + // otherwise, we want to sort by typeid + return lt < rt; + } + + return false; +} + +/// Implementation detail for adding a function. +/// \throws exception::name_conflict_error if there's a function matching +/// the given one being added +void Dispatch_Engine::add_function(const Proxy_Function &t_f, + const std::string &t_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l(m_mutex); + + Proxy_Function new_func = [&]() -> Proxy_Function { + auto &funcs = get_functions_int(); + auto itr = funcs.find(t_name); + + if (itr != funcs.end()) { + auto vec = *itr->second; + for (const auto &func : vec) { + if ((*t_f) == *(func)) { + throw Carbon::exception::name_conflict_error(t_name); + } + } + + vec.reserve(vec.size() + 1); // tightly control vec growth + vec.push_back(t_f); + std::stable_sort(vec.begin(), vec.end(), &function_less_than); + itr->second = std::make_shared>(vec); + return std::make_shared(std::move(vec)); + } else if (t_f->has_arithmetic_param()) { + // if the function is the only function but it also contains + // arithmetic operators, we must wrap it in a dispatch function + // to allow for automatic arithmetic type conversions + std::vector vec; + vec.push_back(t_f); + funcs.insert(std::pair{ + t_name, std::make_shared>(vec)}); + return std::make_shared(std::move(vec)); + } else { + auto vec = std::make_shared>(); + vec->push_back(t_f); + funcs.insert(std::pair{t_name, vec}); + return t_f; + } + }(); + + get_boxed_functions_int().insert_or_assign(t_name, const_var(new_func)); + get_function_objects_int().insert_or_assign(t_name, std::move(new_func)); +} + +Dispatch_State::Dispatch_State(Dispatch_Engine &t_engine) + : m_engine(t_engine), + m_stack_holder(t_engine.get_stack_holder()), + m_conversions(t_engine.conversions(), + t_engine.conversions().conversion_saves()) {} + +Dispatch_Engine *Dispatch_State::operator->() const { return &m_engine.get(); } + +Dispatch_Engine &Dispatch_State::operator*() const { return m_engine.get(); } + +Stack_Holder &Dispatch_State::stack_holder() const { + return m_stack_holder.get(); +} + +const Type_Conversions_State &Dispatch_State::conversions() const { + return m_conversions; +} + +Type_Conversions::Conversion_Saves &Dispatch_State::conversion_saves() const { + return m_conversions.saves(); +} + +Boxed_Value &Dispatch_State::add_get_object(const std::string &t_name, + Boxed_Value obj) const { + return m_engine.get().add_get_object(t_name, std::move(obj), + m_stack_holder.get()); +} + +void Dispatch_State::add_object(const std::string &t_name, + Boxed_Value obj) const { + m_engine.get().add_object(t_name, std::move(obj), m_stack_holder.get()); +} + +Boxed_Value Dispatch_State::get_object(std::string_view t_name, + std::atomic_uint_fast32_t &t_loc) const { + return m_engine.get().get_object(t_name, t_loc, m_stack_holder.get()); +} + +} // namespace detail +} // namespace Carbon diff --git a/src/carbon/command/dispatchkit.hpp b/src/carbon/command/dispatchkit.hpp index 408a4a87..797da10d 100644 --- a/src/carbon/command/dispatchkit.hpp +++ b/src/carbon/command/dispatchkit.hpp @@ -19,6 +19,8 @@ #include "../defines.hpp" #include "../threading.hpp" #include "atom/experiment/flatmap.hpp" +#include "atom/experiment/short_alloc.hpp" +#include "atom/experiment/type_info.hpp" #include "bad_boxed_cast.hpp" #include "boxed_cast.hpp" #include "boxed_cast_helper.hpp" @@ -26,9 +28,7 @@ #include "dynamic_object.hpp" #include "proxy_constructors.hpp" #include "proxy_functions.hpp" -#include "short_alloc.hpp" #include "type_conversions.hpp" -#include "type_info.hpp" namespace Carbon { class Boxed_Number; @@ -125,35 +125,16 @@ class global_non_const : public std::runtime_error { /// Used to implement loadable module support. class Module { public: - Module &add(Type_Info ti, std::string name) { - m_typeinfos.emplace_back(ti, std::move(name)); - return *this; - } + Module &add(Type_Info ti, std::string name); - Module &add(Type_Conversion d) { - m_conversions.push_back(std::move(d)); - return *this; - } + Module &add(Type_Conversion d); - Module &add(Proxy_Function f, std::string name) { - m_funcs.emplace_back(std::move(f), std::move(name)); - return *this; - } + Module &add(Proxy_Function f, std::string name); - Module &add_global_const(Boxed_Value t_bv, std::string t_name) { - if (!t_bv.is_const()) { - throw Carbon::exception::global_non_const(); - } - - m_globals.emplace_back(std::move(t_bv), std::move(t_name)); - return *this; - } + Module &add_global_const(Boxed_Value t_bv, std::string t_name); // Add a bit of ChaiScript to eval during module implementation - Module &eval(std::string str) { - m_evals.push_back(std::move(str)); - return *this; - } + Module &eval(std::string str); template void apply(Eval &t_eval, Engine &t_engine) const { @@ -165,14 +146,7 @@ class Module { } bool has_function(const Proxy_Function &new_f, - std::string_view name) noexcept { - return std::any_of( - m_funcs.begin(), m_funcs.end(), - [&](const std::pair &existing_f) { - return existing_f.second == name && - *(existing_f.first) == *(new_f); - }); - } + std::string_view name) noexcept; private: std::vector> m_typeinfos; @@ -227,108 +201,30 @@ namespace detail { /// used specifically in the case of dealing with Function object variables class Dispatch_Function final : public dispatch::Proxy_Function_Base { public: - explicit Dispatch_Function(std::vector t_funcs) - : Proxy_Function_Base(build_type_infos(t_funcs), - calculate_arity(t_funcs)), - m_funcs(std::move(t_funcs)) {} + explicit Dispatch_Function(std::vector t_funcs); bool operator==( - const dispatch::Proxy_Function_Base &rhs) const noexcept override { - try { - const auto &dispatch_fun = - dynamic_cast(rhs); - return m_funcs == dispatch_fun.m_funcs; - } catch (const std::bad_cast &) { - return false; - } - } + const dispatch::Proxy_Function_Base &rhs) const noexcept override; - std::vector get_contained_functions() const override { - return std::vector(m_funcs.begin(), - m_funcs.end()); - } + std::vector get_contained_functions() const override; static int calculate_arity( - const std::vector &t_funcs) noexcept { - if (t_funcs.empty()) { - return -1; - } - - const auto arity = t_funcs.front()->get_arity(); - - for (const auto &func : t_funcs) { - if (arity != func->get_arity()) { - // The arities in the list do not match, so it's unspecified - return -1; - } - } - - return arity; - } + const std::vector &t_funcs) noexcept; bool call_match( const Function_Params &vals, - const Type_Conversions_State &t_conversions) const noexcept override { - return std::any_of(std::begin(m_funcs), std::end(m_funcs), - [&vals, &t_conversions](const Proxy_Function &f) { - return f->call_match(vals, t_conversions); - }); - } + const Type_Conversions_State &t_conversions) const noexcept override; protected: Boxed_Value do_call( const Function_Params ¶ms, - const Type_Conversions_State &t_conversions) const override { - return dispatch::dispatch(m_funcs, params, t_conversions); - } + const Type_Conversions_State &t_conversions) const override; private: std::vector m_funcs; static std::vector build_type_infos( - const std::vector &t_funcs) { - auto begin = t_funcs.cbegin(); - const auto &end = t_funcs.cend(); - - if (begin != end) { - std::vector type_infos = (*begin)->get_param_types(); - - ++begin; - - bool size_mismatch = false; - - while (begin != end) { - std::vector param_types = - (*begin)->get_param_types(); - - if (param_types.size() != type_infos.size()) { - size_mismatch = true; - } - - for (size_t i = 0; - i < type_infos.size() && i < param_types.size(); ++i) { - if (!(type_infos[i] == param_types[i])) { - type_infos[i] = - detail::Get_Type_Info::get(); - } - } - - ++begin; - } - - assert(!type_infos.empty() && - " type_info vector size is < 0, this is only possible if " - "something else is broken"); - - if (size_mismatch) { - type_infos.resize(1); - } - - return type_infos; - } - - return std::vector(); - } + const std::vector &t_funcs); }; } // namespace detail @@ -340,7 +236,7 @@ struct Stack_Holder { template using SmallVector = std::vector; - using Scope = utility::QuickFlatMap; + using Scope = QuickFlatMap; using StackData = SmallVector; using Stacks = SmallVector; using Call_Param_List = SmallVector; @@ -370,26 +266,21 @@ struct Stack_Holder { /// of the object stack, functions and registered types. class Dispatch_Engine { public: - using Type_Name_Map = - std::map; - using Scope = utility::QuickFlatMap; + using Type_Name_Map = std::map; + using Scope = QuickFlatMap; using StackData = Stack_Holder::StackData; struct State { - utility::QuickFlatMap>, - str_equal> + QuickFlatMap>, + str_equal> m_functions; - utility::QuickFlatMap - m_function_objects; - utility::QuickFlatMap - m_boxed_functions; + QuickFlatMap m_function_objects; + QuickFlatMap m_boxed_functions; std::map m_global_objects; Type_Name_Map m_types; }; - explicit Dispatch_Engine(Carbon::parser::Carbon_Parser_Base &parser) - : m_stack_holder(), m_parser(parser) {} + explicit Dispatch_Engine(Carbon::parser::Carbon_Parser_Base &parser); /// \brief casts an object while applying any Dynamic_Conversion available template @@ -400,364 +291,112 @@ class Dispatch_Engine { } /// Add a new conversion for upcasting to a base class - void add(const Type_Conversion &d) { m_conversions.add_conversion(d); } + void add(const Type_Conversion &d); /// Add a new named Proxy_Function to the system - void add(const Proxy_Function &f, const std::string &name) { - add_function(f, name); - } + void add(const Proxy_Function &f, const std::string &name); /// Set the value of an object, by name. If the object /// is not available in the current scope it is created - void add(Boxed_Value obj, const std::string &name) { - auto &stack = get_stack_data(); - - for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); - ++stack_elem) { - if (auto itr = stack_elem->find(name); itr != stack_elem->end()) { - itr->second = std::move(obj); - return; - } - } - - add_object(name, std::move(obj)); - } + void add(Boxed_Value obj, const std::string &name); /// Adds a named object to the current scope /// \warning This version does not check the validity of the name /// it is meant for internal use only Boxed_Value &add_get_object(std::string t_name, Boxed_Value obj, - Stack_Holder &t_holder) { - auto &stack_elem = get_stack_data(t_holder).back(); - - if (auto result = - stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); - result.second) { - return result.first->second; - } else { - // insert failed - throw Carbon::exception::name_conflict_error( - result.first->first); - } - } + Stack_Holder &t_holder); /// Adds a named object to the current scope /// \warning This version does not check the validity of the name /// it is meant for internal use only void add_object(std::string t_name, Boxed_Value obj, - Stack_Holder &t_holder) { - auto &stack_elem = get_stack_data(t_holder).back(); - - if (auto result = - stack_elem.insert(std::pair{std::move(t_name), std::move(obj)}); - !result.second) { - // insert failed - throw Carbon::exception::name_conflict_error( - result.first->first); - } - } + Stack_Holder &t_holder); /// Adds a named object to the current scope /// \warning This version does not check the validity of the name /// it is meant for internal use only - void add_object(const std::string &name, Boxed_Value obj) { - add_object(name, std::move(obj), get_stack_holder()); - } + void add_object(const std::string &name, Boxed_Value obj); /// Adds a new global shared object, between all the threads - void add_global_const(const Boxed_Value &obj, const std::string &name) { - if (!obj.is_const()) { - throw Carbon::exception::global_non_const(); - } - - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - if (m_state.m_global_objects.find(name) != - m_state.m_global_objects.end()) { - throw Carbon::exception::name_conflict_error(name); - } else { - m_state.m_global_objects.insert(std::make_pair(name, obj)); - } - } + void add_global_const(const Boxed_Value &obj, const std::string &name); /// Adds a new global (non-const) shared object, between all the threads - Boxed_Value add_global_no_throw(Boxed_Value obj, std::string name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - return m_state.m_global_objects - .insert(std::pair{std::move(name), std::move(obj)}) - .first->second; - } + Boxed_Value add_global_no_throw(Boxed_Value obj, std::string name); /// Adds a new global (non-const) shared object, between all the threads - void add_global(Boxed_Value obj, std::string name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - if (auto result = m_state.m_global_objects.insert( - std::pair{std::move(name), std::move(obj)}); - !result.second) { - // insert failed - throw Carbon::exception::name_conflict_error( - result.first->first); - } - } + void add_global(Boxed_Value obj, std::string name); /// Updates an existing global shared object or adds a new global shared /// object if not found - void set_global(Boxed_Value obj, std::string name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - m_state.m_global_objects.insert_or_assign(std::move(name), - std::move(obj)); - } + void set_global(Boxed_Value obj, std::string name); /// Adds a new scope to the stack - void new_scope() { new_scope(*m_stack_holder); } + void new_scope(); /// Pops the current scope from the stack - void pop_scope() { pop_scope(*m_stack_holder); } + void pop_scope(); /// Adds a new scope to the stack - static void new_scope(Stack_Holder &t_holder) { - t_holder.push_stack_data(); - t_holder.push_call_params(); - } + static void new_scope(Stack_Holder &t_holder); /// Pops the current scope from the stack - static void pop_scope(Stack_Holder &t_holder) { - t_holder.call_params.pop_back(); - StackData &stack = get_stack_data(t_holder); - - assert(!stack.empty()); - - stack.pop_back(); - } + static void pop_scope(Stack_Holder &t_holder); /// Pushes a new stack on to the list of stacks - static void new_stack(Stack_Holder &t_holder) { - // add a new Stack with 1 element - t_holder.push_stack(); - } + static void new_stack(Stack_Holder &t_holder); - static void pop_stack(Stack_Holder &t_holder) { - t_holder.stacks.pop_back(); - } + static void pop_stack(Stack_Holder &t_holder); /// Searches the current stack for an object of the given name /// includes a special overload for the _ place holder object to /// ensure that it is always in scope. Boxed_Value get_object(std::string_view name, std::atomic_uint_fast32_t &t_loc, - Stack_Holder &t_holder) const { - enum class Loc : uint_fast32_t { - located = 0x80000000, - is_local = 0x40000000, - stack_mask = 0x0FFF0000, - loc_mask = 0x0000FFFF - }; - - uint_fast32_t loc = t_loc; - - if (loc == 0) { - auto &stack = get_stack_data(t_holder); - - // Is it in the stack? - for (auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); - ++stack_elem) { - for (auto s = stack_elem->begin(); s != stack_elem->end(); - ++s) { - if (s->first == name) { - t_loc = static_cast( - std::distance(stack.rbegin(), stack_elem) - << 16) | - static_cast( - std::distance(stack_elem->begin(), s)) | - static_cast(Loc::located) | - static_cast(Loc::is_local); - return s->second; - } - } - } - - t_loc = static_cast(Loc::located); - } else if ((loc & static_cast(Loc::is_local)) != 0u) { - auto &stack = get_stack_data(t_holder); - - return stack[stack.size() - 1 - - ((loc & static_cast(Loc::stack_mask)) >> - 16)] - .at_index(loc & static_cast(Loc::loc_mask)); - } - - // Is the value we are looking for a global or function? - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - const auto itr = m_state.m_global_objects.find(name); - if (itr != m_state.m_global_objects.end()) { - return itr->second; - } - - // no? is it a function object? - auto obj = get_function_object_int(name, loc); - if (obj.first != loc) { - t_loc = uint_fast32_t(obj.first); - } - - return obj.second; - } + Stack_Holder &t_holder) const; /// Registers a new named type - void add(const Type_Info &ti, const std::string &name) { - add_global_const(const_var(ti), name + "_type"); - - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - m_state.m_types.insert(std::make_pair(name, ti)); - } + void add(const Type_Info &ti, const std::string &name); /// Returns the type info for a named type - Type_Info get_type(std::string_view name, bool t_throw = true) const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - const auto itr = m_state.m_types.find(name); - - if (itr != m_state.m_types.end()) { - return itr->second; - } - - if (t_throw) { - throw std::range_error("Type Not Known: " + std::string(name)); - } else { - return Type_Info(); - } - } + Type_Info get_type(std::string_view name, bool t_throw = true) const; /// Returns the registered name of a known type_info object /// compares the "bare_type_info" for the broadest possible /// match - std::string get_type_name(const Type_Info &ti) const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - for (const auto &elem : m_state.m_types) { - if (elem.second.bare_equal(ti)) { - return elem.first; - } - } - - return ti.bare_name(); - } + std::string get_type_name(const Type_Info &ti) const; /// Return all registered types - std::vector> get_types() const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - return std::vector>( - m_state.m_types.begin(), m_state.m_types.end()); - } + std::vector> get_types() const; std::shared_ptr> get_method_missing_functions() - const { - uint_fast32_t method_missing_loc = m_method_missing_loc; - auto method_missing_funs = - get_function("method_missing", method_missing_loc); - if (method_missing_funs.first != method_missing_loc) { - m_method_missing_loc = uint_fast32_t(method_missing_funs.first); - } - - return std::move(method_missing_funs.second); - } + const; /// Return a function by name std::pair>> - get_function(std::string_view t_name, const size_t t_hint) const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - const auto &funs = get_functions_int(); - - if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { - return std::make_pair(std::distance(funs.begin(), itr), - itr->second); - } else { - return std::make_pair( - size_t(0), std::make_shared>()); - } - } + get_function(std::string_view t_name, const size_t t_hint) const; /// \returns a function object (Boxed_Value wrapper) if it exists /// \throws std::range_error if it does not - Boxed_Value get_function_object(const std::string &t_name) const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - return get_function_object_int(t_name, 0).second; - } + Boxed_Value get_function_object(const std::string &t_name) const; /// \returns a function object (Boxed_Value wrapper) if it exists /// \throws std::range_error if it does not /// \warn does not obtain a mutex lock. \sa get_function_object for public /// version std::pair get_function_object_int( - std::string_view t_name, const size_t t_hint) const { - const auto &funs = get_boxed_functions_int(); - - if (const auto itr = funs.find(t_name, t_hint); itr != funs.end()) { - return std::make_pair(std::distance(funs.begin(), itr), - itr->second); - } else { - throw std::range_error("Object not found: " + std::string(t_name)); - } - } + std::string_view t_name, const size_t t_hint) const; /// Return true if a function exists - bool function_exists(std::string_view name) const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - return get_functions_int().count(name) > 0; - } + bool function_exists(std::string_view name) const; /// \returns All values in the local thread state in the parent scope, or if /// it doesn't exist, /// the current scope. - std::map get_parent_locals() const { - auto &stack = get_stack_data(); - if (stack.size() > 1) { - return std::map(stack[1].begin(), - stack[1].end()); - } else { - return std::map(stack[0].begin(), - stack[0].end()); - } - } + std::map get_parent_locals() const; /// \returns All values in the local thread state, added through the add() /// function - std::map get_locals() const { - auto &stack = get_stack_data(); - auto &scope = stack.front(); - return std::map(scope.begin(), scope.end()); - } + std::map get_locals() const; /// \brief Sets all of the locals for the current thread state. /// @@ -765,98 +404,28 @@ class Dispatch_Engine { /// current state with /// /// Any existing locals are removed and the given set of variables is added - void set_locals(const std::map &t_locals) { - auto &stack = get_stack_data(); - auto &scope = stack.front(); - scope.assign(t_locals.begin(), t_locals.end()); - } + void set_locals(const std::map &t_locals); /// /// Get a map of all objects that can be seen from the current scope in a /// scripting context /// - std::map get_scripting_objects() const { - const Stack_Holder &s = *m_stack_holder; - - // We don't want the current context, but one up if it exists - const StackData &stack = (s.stacks.size() == 1) - ? (s.stacks.back()) - : (s.stacks[s.stacks.size() - 2]); - - std::map retval; - - // note: map insert doesn't overwrite existing values, which is why this - // works - for (auto itr = stack.rbegin(); itr != stack.rend(); ++itr) { - retval.insert(itr->begin(), itr->end()); - } - - // add the global values - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - retval.insert(m_state.m_global_objects.begin(), - m_state.m_global_objects.end()); - - return retval; - } + std::map get_scripting_objects() const; /// /// Get a map of all functions that can be seen from a scripting context /// - std::map get_function_objects() const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - const auto &funs = get_function_objects_int(); - - std::map objs; - - for (const auto &fun : funs) { - objs.insert(std::make_pair(fun.first, const_var(fun.second))); - } - - return objs; - } + std::map get_function_objects() const; /// Get a vector of all registered functions - std::vector> get_functions() const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - std::vector> rets; - - const auto &functions = get_functions_int(); - - for (const auto &function : functions) { - for (const auto &internal_func : *function.second) { - rets.emplace_back(function.first, internal_func); - } - } + std::vector> get_functions() const; - return rets; - } - - const Type_Conversions &conversions() const noexcept { - return m_conversions; - } + const Type_Conversions &conversions() const noexcept; static bool is_attribute_call( const std::vector &t_funs, const Function_Params &t_params, bool t_has_params, - const Type_Conversions_State &t_conversions) noexcept { - if (!t_has_params || t_params.empty()) { - return false; - } - - return std::any_of( - std::begin(t_funs), std::end(t_funs), [&](const auto &fun) { - return fun->is_attribute_function() && - fun->compare_first_type(t_params[0], t_conversions); - }); - } + const Type_Conversions_State &t_conversions) noexcept; #ifdef CARBON_MSVC // MSVC is unable to recognize that "rethrow_exception" causes the function to @@ -867,141 +436,7 @@ class Dispatch_Engine { Boxed_Value call_member(const std::string &t_name, std::atomic_uint_fast32_t &t_loc, const Function_Params ¶ms, bool t_has_params, - const Type_Conversions_State &t_conversions) { - uint_fast32_t loc = t_loc; - const auto funs = get_function(t_name, loc); - if (funs.first != loc) { - t_loc = uint_fast32_t(funs.first); - } - - const auto do_attribute_call = - [this](int l_num_params, Function_Params l_params, - const std::vector &l_funs, - const Type_Conversions_State &l_conversions) -> Boxed_Value { - Function_Params attr_params(l_params.begin(), - l_params.begin() + l_num_params); - Boxed_Value bv = - dispatch::dispatch(l_funs, attr_params, l_conversions); - if (l_num_params < int(l_params.size()) || - bv.get_type_info().bare_equal( - user_type())) { - struct This_Foist { - This_Foist(Dispatch_Engine &e, const Boxed_Value &t_bv) - : m_e(e) { - m_e.get().new_scope(); - m_e.get().add_object("__this", t_bv); - } - - ~This_Foist() { m_e.get().pop_scope(); } - - std::reference_wrapper m_e; - }; - - This_Foist fi(*this, l_params.front()); - - try { - auto func = - boxed_cast(bv); - try { - return (*func)( - {l_params.begin() + l_num_params, l_params.end()}, - l_conversions); - } catch (const Carbon::exception::bad_boxed_cast &) { - } catch (const Carbon::exception::arity_error &) { - } catch (const Carbon::exception::guard_error &) { - } - throw Carbon::exception::dispatch_error( - {l_params.begin() + l_num_params, l_params.end()}, - std::vector{ - boxed_cast(bv)}); - } catch (const Carbon::exception::bad_boxed_cast &) { - // unable to convert bv into a Proxy_Function_Base - throw Carbon::exception::dispatch_error( - {l_params.begin() + l_num_params, l_params.end()}, - std::vector(l_funs.begin(), - l_funs.end())); - } - } else { - return bv; - } - }; - - if (is_attribute_call(*funs.second, params, t_has_params, - t_conversions)) { - return do_attribute_call(1, params, *funs.second, t_conversions); - } else { - std::exception_ptr except; - - if (!funs.second->empty()) { - try { - return dispatch::dispatch(*funs.second, params, - t_conversions); - } catch (Carbon::exception::dispatch_error &) { - except = std::current_exception(); - } - } - - // If we get here we know that either there was no method with that - // name, or there was no matching method - - const auto functions = [&]() -> std::vector { - std::vector fs; - - const auto method_missing_funs = get_method_missing_functions(); - - for (const auto &f : *method_missing_funs) { - if (f->compare_first_type(params[0], t_conversions)) { - fs.push_back(f); - } - } - - return fs; - }(); - - const bool is_no_param = [&]() -> bool { - for (const auto &f : functions) { - if (f->get_arity() != 2) { - return false; - } - } - return true; - }(); - - if (!functions.empty()) { - try { - if (is_no_param) { - auto tmp_params = params.to_vector(); - tmp_params.insert(tmp_params.begin() + 1, var(t_name)); - return do_attribute_call(2, Function_Params(tmp_params), - functions, t_conversions); - } else { - std::array p{ - params[0], var(t_name), - var(std::vector(params.begin() + 1, - params.end()))}; - return dispatch::dispatch(functions, Function_Params{p}, - t_conversions); - } - } catch (const dispatch::option_explicit_set &e) { - throw Carbon::exception::dispatch_error( - params, - std::vector(funs.second->begin(), - funs.second->end()), - e.what()); - } - } - - // If we get all the way down here we know there was no - // "method_missing" method at all. - if (except) { - std::rethrow_exception(except); - } else { - throw Carbon::exception::dispatch_error( - params, std::vector( - funs.second->begin(), funs.second->end())); - } - } - } + const Type_Conversions_State &t_conversions); #ifdef CARBON_MSVC #pragma warning(pop) #endif @@ -1009,189 +444,66 @@ class Dispatch_Engine { Boxed_Value call_function( std::string_view t_name, std::atomic_uint_fast32_t &t_loc, const Function_Params ¶ms, - const Type_Conversions_State &t_conversions) const { - uint_fast32_t loc = t_loc; - const auto [func_loc, func] = get_function(t_name, loc); - if (func_loc != loc) { - t_loc = uint_fast32_t(func_loc); - } - return dispatch::dispatch(*func, params, t_conversions); - } + const Type_Conversions_State &t_conversions) const; /// Dump object info to stdout - void dump_object(const Boxed_Value &o) const { - std::cout << (o.is_const() ? "const " : "") << type_name(o) << '\n'; - } + void dump_object(const Boxed_Value &o) const; /// Dump type info to stdout - void dump_type(const Type_Info &type) const { - std::cout << (type.is_const() ? "const " : "") << get_type_name(type); - } + void dump_type(const Type_Info &type) const; /// Dump function to stdout void dump_function( - const std::pair &f) const { - const auto params = f.second->get_param_types(); - - dump_type(params.front()); - std::cout << " " << f.first << "("; - - for (auto itr = params.begin() + 1; itr != params.end();) { - dump_type(*itr); - ++itr; - - if (itr != params.end()) { - std::cout << ", "; - } - } - - std::cout << ") \n"; - } + const std::pair &f) const; /// Returns true if a call can be made that consists of the first parameter /// (the function) with the remaining parameters as its arguments. - Boxed_Value call_exists(const Function_Params ¶ms) const { - if (params.empty()) { - throw Carbon::exception::arity_error( - static_cast(params.size()), 1); - } - - const auto &f = this->boxed_cast(params[0]); - const Type_Conversions_State convs(m_conversions, - m_conversions.conversion_saves()); - - return const_var(f->call_match( - Function_Params(params.begin() + 1, params.end()), convs)); - } + Boxed_Value call_exists(const Function_Params ¶ms) const; /// Dump all system info to stdout - void dump_system() const { - std::cout << "Registered Types: \n"; - for (const auto &[type_name, type] : get_types()) { - std::cout << type_name << ": " << type.bare_name() << '\n'; - } - - std::cout << '\n'; - - std::cout << "Functions: \n"; - for (const auto &func : get_functions()) { - dump_function(func); - } - std::cout << '\n'; - } + void dump_system() const; /// return true if the Boxed_Value matches the registered type by name bool is_type(const Boxed_Value &r, - std::string_view user_typename) const noexcept { - try { - if (get_type(user_typename).bare_equal(r.get_type_info())) { - return true; - } - } catch (const std::range_error &) { - } - - try { - const dispatch::Dynamic_Object &d = - boxed_cast(r); - return d.get_type_name() == user_typename; - } catch (const std::bad_cast &) { - } + std::string_view user_typename) const noexcept; - return false; - } - - std::string type_name(const Boxed_Value &obj) const { - return get_type_name(obj.get_type_info()); - } + std::string type_name(const Boxed_Value &obj) const; - State get_state() const { - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); + State get_state() const; - return m_state; - } - - void set_state(const State &t_state) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - m_state = t_state; - } + void set_state(const State &t_state); static void save_function_params(Stack_Holder &t_s, - std::vector &&t_params) { - for (auto &¶m : t_params) { - t_s.call_params.back().insert(t_s.call_params.back().begin(), - std::move(param)); - } - } + std::vector &&t_params); static void save_function_params(Stack_Holder &t_s, - const Function_Params &t_params) { - t_s.call_params.back().insert(t_s.call_params.back().begin(), - t_params.begin(), t_params.end()); - } + const Function_Params &t_params); - void save_function_params(std::vector &&t_params) { - save_function_params(*m_stack_holder, std::move(t_params)); - } + void save_function_params(std::vector &&t_params); - void save_function_params(const Function_Params &t_params) { - save_function_params(*m_stack_holder, t_params); - } + void save_function_params(const Function_Params &t_params); void new_function_call(Stack_Holder &t_s, - Type_Conversions::Conversion_Saves &t_saves) { - if (t_s.call_depth == 0) { - m_conversions.enable_conversion_saves(t_saves, true); - } - - ++t_s.call_depth; - - save_function_params(m_conversions.take_saves(t_saves)); - } + Type_Conversions::Conversion_Saves &t_saves); void pop_function_call(Stack_Holder &t_s, - Type_Conversions::Conversion_Saves &t_saves) { - --t_s.call_depth; + Type_Conversions::Conversion_Saves &t_saves); - assert(t_s.call_depth >= 0); - - if (t_s.call_depth == 0) { - t_s.call_params.back().clear(); - m_conversions.enable_conversion_saves(t_saves, false); - } - } - - void new_function_call() { - new_function_call(*m_stack_holder, m_conversions.conversion_saves()); - } + void new_function_call(); - void pop_function_call() { - pop_function_call(*m_stack_holder, m_conversions.conversion_saves()); - } + void pop_function_call(); - Stack_Holder &get_stack_holder() noexcept { return *m_stack_holder; } + Stack_Holder &get_stack_holder() noexcept; /// Returns the current stack /// make const/non const versions - const StackData &get_stack_data() const noexcept { - return m_stack_holder->stacks.back(); - } + const StackData &get_stack_data() const noexcept; - static StackData &get_stack_data(Stack_Holder &t_holder) noexcept { - return t_holder.stacks.back(); - } + static StackData &get_stack_data(Stack_Holder &t_holder) noexcept; - StackData &get_stack_data() noexcept { - return m_stack_holder->stacks.back(); - } + StackData &get_stack_data() noexcept; - parser::Carbon_Parser_Base &get_parser() noexcept { - return m_parser.get(); - } + parser::Carbon_Parser_Base &get_parser() noexcept; private: const decltype(State::m_boxed_functions) &get_boxed_functions_int() @@ -1221,130 +533,12 @@ class Dispatch_Engine { } static bool function_less_than(const Proxy_Function &lhs, - const Proxy_Function &rhs) noexcept { - auto dynamic_lhs( - std::dynamic_pointer_cast( - lhs)); - auto dynamic_rhs( - std::dynamic_pointer_cast( - rhs)); - - if (dynamic_lhs && dynamic_rhs) { - if (dynamic_lhs->get_guard()) { - return dynamic_rhs->get_guard() ? false : true; - } else { - return false; - } - } - - if (dynamic_lhs && !dynamic_rhs) { - return false; - } - - if (!dynamic_lhs && dynamic_rhs) { - return true; - } - - const auto &lhsparamtypes = lhs->get_param_types(); - const auto &rhsparamtypes = rhs->get_param_types(); - - const auto lhssize = lhsparamtypes.size(); - const auto rhssize = rhsparamtypes.size(); - - const auto boxed_type = user_type(); - const auto boxed_pod_type = user_type(); - - for (size_t i = 1; i < lhssize && i < rhssize; ++i) { - const Type_Info < = lhsparamtypes[i]; - const Type_Info &rt = rhsparamtypes[i]; - - if (lt.bare_equal(rt) && lt.is_const() == rt.is_const()) { - continue; // The first two types are essentially the same, next - // iteration - } - - // const is after non-const for the same type - if (lt.bare_equal(rt) && lt.is_const() && !rt.is_const()) { - return false; - } - - if (lt.bare_equal(rt) && !lt.is_const()) { - return true; - } - - // boxed_values are sorted last - if (lt.bare_equal(boxed_type)) { - return false; - } - - if (rt.bare_equal(boxed_type)) { - return true; - } - - if (lt.bare_equal(boxed_pod_type)) { - return false; - } - - if (rt.bare_equal(boxed_pod_type)) { - return true; - } - - // otherwise, we want to sort by typeid - return lt < rt; - } - - return false; - } + const Proxy_Function &rhs) noexcept; /// Implementation detail for adding a function. /// \throws exception::name_conflict_error if there's a function matching /// the given one being added - void add_function(const Proxy_Function &t_f, const std::string &t_name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l(m_mutex); - - Proxy_Function new_func = [&]() -> Proxy_Function { - auto &funcs = get_functions_int(); - auto itr = funcs.find(t_name); - - if (itr != funcs.end()) { - auto vec = *itr->second; - for (const auto &func : vec) { - if ((*t_f) == *(func)) { - throw Carbon::exception::name_conflict_error( - t_name); - } - } - - vec.reserve(vec.size() + 1); // tightly control vec growth - vec.push_back(t_f); - std::stable_sort(vec.begin(), vec.end(), &function_less_than); - itr->second = - std::make_shared>(vec); - return std::make_shared(std::move(vec)); - } else if (t_f->has_arithmetic_param()) { - // if the function is the only function but it also contains - // arithmetic operators, we must wrap it in a dispatch function - // to allow for automatic arithmetic type conversions - std::vector vec; - vec.push_back(t_f); - funcs.insert(std::pair{ - t_name, - std::make_shared>(vec)}); - return std::make_shared(std::move(vec)); - } else { - auto vec = std::make_shared>(); - vec->push_back(t_f); - funcs.insert(std::pair{t_name, vec}); - return t_f; - } - }(); - - get_boxed_functions_int().insert_or_assign(t_name, const_var(new_func)); - get_function_objects_int().insert_or_assign(t_name, - std::move(new_func)); - } + void add_function(const Proxy_Function &t_f, const std::string &t_name); mutable Carbon::detail::threading::shared_mutex m_mutex; @@ -1359,40 +553,25 @@ class Dispatch_Engine { class Dispatch_State { public: - explicit Dispatch_State(Dispatch_Engine &t_engine) - : m_engine(t_engine), - m_stack_holder(t_engine.get_stack_holder()), - m_conversions(t_engine.conversions(), - t_engine.conversions().conversion_saves()) {} + explicit Dispatch_State(Dispatch_Engine &t_engine); - Dispatch_Engine *operator->() const noexcept { return &m_engine.get(); } + Dispatch_Engine *operator->() const noexcept; - Dispatch_Engine &operator*() const noexcept { return m_engine.get(); } + Dispatch_Engine &operator*() const noexcept; - Stack_Holder &stack_holder() const noexcept { return m_stack_holder.get(); } + Stack_Holder &stack_holder() const noexcept; - const Type_Conversions_State &conversions() const noexcept { - return m_conversions; - } + const Type_Conversions_State &conversions() const noexcept; - Type_Conversions::Conversion_Saves &conversion_saves() const noexcept { - return m_conversions.saves(); - } + Type_Conversions::Conversion_Saves &conversion_saves() const noexcept; Boxed_Value &add_get_object(const std::string &t_name, - Boxed_Value obj) const { - return m_engine.get().add_get_object(t_name, std::move(obj), - m_stack_holder.get()); - } + Boxed_Value obj) const; - void add_object(const std::string &t_name, Boxed_Value obj) const { - m_engine.get().add_object(t_name, std::move(obj), m_stack_holder.get()); - } + void add_object(const std::string &t_name, Boxed_Value obj) const; Boxed_Value get_object(std::string_view t_name, - std::atomic_uint_fast32_t &t_loc) const { - return m_engine.get().get_object(t_name, t_loc, m_stack_holder.get()); - } + std::atomic_uint_fast32_t &t_loc) const; private: std::reference_wrapper m_engine; diff --git a/src/carbon/command/dynamic_object_detail.hpp b/src/carbon/command/dynamic_object_detail.hpp index 8e7f4e90..7d681bf3 100644 --- a/src/carbon/command/dynamic_object_detail.hpp +++ b/src/carbon/command/dynamic_object_detail.hpp @@ -21,7 +21,7 @@ #include "boxed_value.hpp" #include "dynamic_object.hpp" #include "proxy_functions.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { class Type_Conversions; diff --git a/src/carbon/command/proxy_functions.hpp b/src/carbon/command/proxy_functions.hpp index 51cf58b6..95283468 100644 --- a/src/carbon/command/proxy_functions.hpp +++ b/src/carbon/command/proxy_functions.hpp @@ -25,9 +25,6 @@ namespace exception { class bad_boxed_cast; struct arity_error; } // namespace exception -} // namespace Carbon - -namespace Carbon { class Boxed_Number; struct AST_Node; diff --git a/src/carbon/command/proxy_functions_detail.hpp b/src/carbon/command/proxy_functions_detail.hpp index 9afdea9b..0b3eca40 100644 --- a/src/carbon/command/proxy_functions_detail.hpp +++ b/src/carbon/command/proxy_functions_detail.hpp @@ -13,7 +13,7 @@ #include "boxed_value.hpp" #include "function_params.hpp" #include "handle_return.hpp" -#include "type_info.hpp" +#include "atom/experiment/type_info.hpp" namespace Carbon { class Type_Conversions_State; diff --git a/src/carbon/command/register_function.hpp b/src/carbon/command/register_function.hpp index e0aebc79..70b06de8 100644 --- a/src/carbon/command/register_function.hpp +++ b/src/carbon/command/register_function.hpp @@ -110,7 +110,7 @@ auto make_callable(Func &&func, fs) { return make_callable_impl(std::forward(func), fs); } - +} // namespace dispatch::detail template Proxy_Function fun(T &&t) { return dispatch::detail::make_callable( @@ -131,7 +131,6 @@ template Proxy_Function fun(T &&t, const Q &q) { return fun(detail::bind_first(std::forward(t), q)); } -} // namespace dispatch::detail } // namespace Carbon #endif diff --git a/src/carbon/utils/json.hpp b/src/carbon/utils/json.hpp index 8115965c..711fb1d4 100644 --- a/src/carbon/utils/json.hpp +++ b/src/carbon/utils/json.hpp @@ -383,13 +383,13 @@ class JSON { struct JSONParser { static bool isspace(const char c) noexcept { -#ifdef CHAISCRIPT_MSVC +#ifdef CARBON_MSVC // MSVC warns on these line in some circumstances #pragma warning(push) #pragma warning(disable : 6330) #endif return ::isspace(c) != 0; -#ifdef CHAISCRIPT_MSVC +#ifdef CARBON_MSVC #pragma warning(pop) #endif } diff --git a/src/carbon/utils/json_wrap.hpp b/src/carbon/utils/json_wrap.hpp index 60f26b0e..6f44b04a 100644 --- a/src/carbon/utils/json_wrap.hpp +++ b/src/carbon/utils/json_wrap.hpp @@ -1,5 +1,5 @@ -#ifndef CHAISCRIPT_SIMPLEJSON_WRAP_HPP -#define CHAISCRIPT_SIMPLEJSON_WRAP_HPP +#ifndef CARBON_SIMPLEJSON_WRAP_HPP +#define CARBON_SIMPLEJSON_WRAP_HPP #include "json.hpp" diff --git a/src/carbon/utils/utility.hpp b/src/carbon/utils/utility.hpp index 782614be..4813d311 100644 --- a/src/carbon/utils/utility.hpp +++ b/src/carbon/utils/utility.hpp @@ -1,7 +1,7 @@ -#ifndef CHAISCRIPT_UTILITY_UTILITY_HPP_ -#define CHAISCRIPT_UTILITY_UTILITY_HPP_ +#ifndef CARBON_UTILITY_UTILITY_HPP_ +#define CARBON_UTILITY_UTILITY_HPP_ #include #include diff --git a/src/config/_component.cpp b/src/config/_component.cpp index 922101bc..51f1b41d 100644 --- a/src/config/_component.cpp +++ b/src/config/_component.cpp @@ -1,3 +1,17 @@ +/* + * _component.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Config Component for Atom Addon + +**************************************************/ + #include "_component.hpp" #include "configor.hpp" @@ -21,7 +35,7 @@ ConfigComponent::ConfigComponent(const std::string& name) : SharedComponent(name), - m_configManager(Lithium::ConfigManager::createShared()) { + m_configManager(Lithium::ConfigManager::createUnique()) { DLOG_F(INFO, "ConfigComponent::Constructor"); DLOG_F(INFO, "Injecting commands"); @@ -44,7 +58,7 @@ bool ConfigComponent::initialize() { } bool ConfigComponent::destroy() { - DLOG_F(INFO, "ConfigComponent::destroy") + DLOG_F(INFO, "ConfigComponent::destroy"); return true; } @@ -57,8 +71,8 @@ json ConfigComponent::getConfig(const json& m_params) { return createErrorResponse("getConfig", {"error", "key not found"}, "key not found"); } - if (auto value = m_configManager->getValue(key); value) { - return createSuccessResponse("getConfig", {"value", value}); + if (auto value = m_configManager->getValue(key); value.has_value()) { + return createSuccessResponse("getConfig", {"value", value.value()}); } return createErrorResponse( "getConfig", {"error", {"error", "failed to get config by key"}}, @@ -167,4 +181,10 @@ json ConfigComponent::loadConfigs(const json& m_params) { "path not set"); } return createSuccessResponse(__func__, {}); +} + +json ConfigComponent::tidyConfig(const json& m_params) { + CONFIG_MANAGER_CHECK; + m_configManager->tidyConfig(); + return createSuccessResponse(__func__, {}); } \ No newline at end of file diff --git a/src/config/_component.hpp b/src/config/_component.hpp index 8e6dd022..e7242c83 100644 --- a/src/config/_component.hpp +++ b/src/config/_component.hpp @@ -1,15 +1,27 @@ +/* + * _component.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Config Component for Atom Addon + +**************************************************/ + #ifndef LITHIUM_CONFIG_COMPONENT_HPP #define LITHIUM_CONFIG_COMPONENT_HPP #include "atom/components/templates/shared_component.hpp" -namespace Lithium -{ - class ConfigManager; +namespace Lithium { +class ConfigManager; } -class ConfigComponent : public SharedComponent -{ +class ConfigComponent : public SharedComponent { public: explicit ConfigComponent(const std::string &name); ~ConfigComponent(); @@ -33,6 +45,7 @@ class ConfigComponent : public SharedComponent json loadConfig(const json &m_params); json loadConfigs(const json &m_params); json saveConfig(const json &m_params); + json tidyConfig(const json &m_params); private: std::unique_ptr m_configManager; diff --git a/src/config/_script.cpp b/src/config/_script.cpp new file mode 100644 index 00000000..53e0e615 --- /dev/null +++ b/src/config/_script.cpp @@ -0,0 +1,201 @@ +/* + * _script.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Carbon Binding of ConfigManager + +**************************************************/ + +#include "carbon/carbon.hpp" + +#include "configor.hpp" + +#include "atom/log/loguru.hpp" + +using namespace Lithium; + +CARBON_MODULE_EXPORT { + Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { + if (m_params.type() != typeid(std::weak_ptr)) { + LOG_F(ERROR, + "Invalid parameters recieved while loading ConfigModule"); + return nullptr; + } + try { + auto m_configManager = + std::any_cast>(m_params); + if (m_configManager.expired()) { + LOG_F(ERROR, "config manager pointer is expired!"); + return nullptr; + } + Carbon::ModulePtr m_module = std::make_shared(); + + auto get_config_func = [](std::weak_ptr manager, + const std::string &sv) -> json { + if (!sv.empty() && !manager.expired()) { + LOG_F(ERROR, "no key path found"); + return {}; + } + if (auto value = manager.lock()->getValue(sv); + value.has_value()) { + return value.value(); + } + return {}; + }; + + m_module->add(Carbon::fun([m_configManager, get_config_func]( + const std::string &key) -> double { + if (!key.empty()) { + try { + return get_config_func(m_configManager, + key) + .get(); + } catch (const json::exception &e) { + } + } + return -1; + }), + "get_number_config"); + + m_module->add( + Carbon::fun([m_configManager, get_config_func]( + const std::string &key) -> std::string { + if (!key.empty()) { + try { + return get_config_func(m_configManager, key) + .get(); + } catch (const json::exception &e) { + } + } + return ""; + }), + "get_string_config"); + + m_module->add( + Carbon::fun([m_configManager, + get_config_func](const std::string &key) -> bool { + if (!key.empty()) { + try { + return get_config_func(m_configManager, key) + .get(); + } catch (const json::exception &e) { + } + } + return false; + }), + "get_boolean_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &key, + double number) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, number)) { + return true; + } + } + return false; + }), + "set_number_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &key, + const std::string &text) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, text)) { + return true; + } + } + return false; + }), + "set_string_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &key, + bool value) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, value)) { + return true; + } + } + return false; + }), + "set_bool_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &key) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->hasValue(key)) { + return true; + } + } + return false; + }), + "has_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &key) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->deleteValue(key)) { + return true; + } + } + return false; + }), + "delete_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &file_path) { + if (!file_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->loadFromFile(file_path)) { + return true; + } + } + return false; + }), + "load_config"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &folder_path) { + if (!folder_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->loadFromDir(folder_path)) { + return true; + } + } + return false; + }), + "load_configs"); + + m_module->add( + Carbon::fun([m_configManager](const std::string &file_path) { + if (!file_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->saveToFile(file_path)) { + return true; + } + } + return false; + }), + "save_config"); + + m_module->add(Carbon::fun([m_configManager]() { + if (!m_configManager.expired()) [[likely]] { + m_configManager.lock()->tidyConfig(); + } + }), + "tidy_config"); + + return m_module; + } catch (const std::bad_any_cast &e) { + LOG_F(ERROR, "Failed to load config manager"); + return nullptr; + } + } +} diff --git a/src/config/configor.cpp b/src/config/configor.cpp index cfe5a952..737ec77e 100644 --- a/src/config/configor.cpp +++ b/src/config/configor.cpp @@ -30,170 +30,182 @@ Description: Configor namespace fs = std::filesystem; namespace Lithium { -ConfigManager::ConfigManager() { +class ConfigManagerImpl { +public: + mutable std::shared_mutex rw_mutex_; + json config_; +}; + +ConfigManager::ConfigManager() : m_impl(std::make_unique()) { if (loadFromFile("config.json")) { - DLOG_F(INFO, "current config: {}", config_.dump(4)); + DLOG_F(INFO, "Config loaded successfully."); } } ConfigManager::~ConfigManager() { saveToFile("config.json"); } std::shared_ptr ConfigManager::createShared() { - return std::make_shared(); + static std::shared_ptr instance = + std::make_shared(); + return instance; +} + +std::unique_ptr ConfigManager::createUnique() { + return std::make_unique(); } -bool ConfigManager::loadFromFile(const std::string &path) { - std::lock_guard lock(mutex_); +bool ConfigManager::loadFromFile(const fs::path& path) { + std::shared_lock lock(m_impl->rw_mutex_); try { std::ifstream ifs(path); - if (!ifs.is_open()) { + if (!ifs || ifs.peek() == std::ifstream::traits_type::eof()) { LOG_F(ERROR, "Failed to open file: {}", path); return false; } json j = json::parse(ifs); - const std::string basename = fs::path(path).stem().string(); - config_[basename] = j["config"]; - DLOG_F(INFO, "Loaded config file {} successfully", path); + if (j.empty()) { + return false; + } + + mergeConfig(j); return true; - } catch (const json::exception &e) { + } catch (const json::exception& e) { LOG_F(ERROR, "Failed to parse file: {}, error message: {}", path, e.what()); - } catch (const std::exception &e) { + } catch (const std::exception& e) { LOG_F(ERROR, "Failed to load config file: {}, error message: {}", path, e.what()); } return false; } -bool ConfigManager::loadFromDir(const std::string &dir_path, bool recursive) { - std::lock_guard lock(rw_mutex_); - for (const auto &entry : fs::directory_iterator(dir_path)) { - if (entry.is_regular_file() && entry.path().extension() == ".json") { - loadFromFile(entry.path().string()); - } else if (recursive && entry.is_directory()) { - const std::string subdir_path = entry.path().string(); - const std::string config_file_path = subdir_path + "/config.json"; - if (fs::exists(config_file_path)) { - try { - json j = json::parse(std::ifstream(config_file_path)); - auto merged_j = json::object(); - merged_j[dir_path][entry.path().filename().string()] = j; - mergeConfig(merged_j); - } catch (const json::exception &e) { - LOG_F(ERROR, "Failed to parse file: {}, error message: {}", - config_file_path, e.what()); - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to open file {}", config_file_path); - } +bool ConfigManager::loadFromDir(const fs::path& dir_path, bool recursive) { + std::shared_lock lock(m_impl->rw_mutex_); + try { + for (const auto& entry : fs::directory_iterator(dir_path)) { + if (entry.is_regular_file() && + entry.path().extension() == ".json") { + loadFromFile(entry.path()); + } else if (recursive && entry.is_directory()) { + loadFromDir(entry.path(), true); } - loadFromDir(subdir_path, true); } + } catch (const std::exception& e) { + LOG_F(ERROR, "Failed to load config file from: {}, error message: {}", + dir_path, e.what()); + return false; } return true; } -json ConfigManager::getValue(const std::string &key_path) const { - // std::lock_guard lock(rw_mutex_); - try { - const json *p = &config_; - for (const auto &key : Atom::Utils::splitString(key_path, '/')) { - if (p->is_object() && p->contains(key)) { - p = &(*p)[key]; - } else { - LOG_F(ERROR, "Key not found: {}", key_path); - return nullptr; - } +std::optional ConfigManager::getValue(const std::string& key_path) const { + std::shared_lock lock(m_impl->rw_mutex_); + const json* p = &m_impl->config_; + for (const auto& key : key_path | std::views::split('/')) { + if (p->is_object() && + p->contains(std::string(key.begin(), key.end()))) { + p = &(*p)[std::string(key.begin(), key.end())]; + } else { + return std::nullopt; } - return *p; - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to get value: {} {}", key_path, e.what()); - return nullptr; } + return *p; } -bool ConfigManager::setValue(const std::string &key_path, const json &value) { - // std::lock_guard lock(rw_mutex_); - try { - json *p = &config_; - for (const auto &key : Atom::Utils::splitString(key_path, '/')) { - DLOG_F(INFO, "Key: {}" , key); - if (!p->is_object()) { - LOG_F(ERROR, "Invalid key path: {}", key_path); - return false; - } - p = &(*p)[key]; - } - *p = value; - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to set key: {} with {}", key_path, e.what()); - return false; +bool ConfigManager::setValue(const std::string& key_path, const json& value) { + std::unique_lock lock(m_impl->rw_mutex_); + json* p = &m_impl->config_; + std::vector keys; + for (auto sub_range : key_path | std::views::split('/')) { + keys.emplace_back(sub_range.data(), sub_range.size()); } - return true; -} -bool ConfigManager::deleteValue(const std::string &key_path) { - std::lock_guard lock(rw_mutex_); - std::vector keys = Atom::Utils::splitString(key_path, '/'); - json *p = &config_; - for (const auto &key : keys) { + for (auto it = keys.begin(); it != keys.end(); ++it) { + if (it + 1 == keys.end()) { + (*p)[*it] = value; + return true; + } + if (!p->is_object()) { return false; } - auto it = p->find(key); - if (it == p->end()) { - return false; + + if (!p->contains(*it)) { + (*p)[*it] = json::object(); } - p = &(*p)[key]; + + p = &(*p)[*it]; } - p->clear(); - return true; -} -bool ConfigManager::hasValue(const std::string &key_path) const { - return getValue(key_path) != nullptr; + return true; } -void ConfigManager::tidyConfig() { - std::lock_guard lock(mutex_); - - json updated_config; - - for (const auto &[key, value] : config_.items()) { - std::vector keys = Atom::Utils::splitString(key, '/'); - json *p = &updated_config; - - for (const auto &sub_key : keys) { - if (!p->contains(sub_key)) { - (*p)[sub_key] = json::object(); +bool ConfigManager::deleteValue(const std::string& key_path) { + std::unique_lock lock(m_impl->rw_mutex_); + std::vector keys; + for (auto sub_range : key_path | std::views::split('/')) { + keys.emplace_back(sub_range.data(), sub_range.size()); + } + json* p = &m_impl->config_; + for (auto it = keys.begin(); it != keys.end(); ++it) { + if (it + 1 == keys.end()) { // Last key + if (p->contains(*it)) { + p->erase(*it); + return true; } - - p = &(*p)[sub_key]; + return false; } - - *p = value; + if (!p->contains(*it) || !(*p)[*it].is_object()) { + return false; + } + p = &(*p)[*it]; } - - config_ = std::move(updated_config); + return false; } -void ConfigManager::mergeConfig(const json &j) { config_.merge_patch(j); } +bool ConfigManager::hasValue(const std::string& key_path) const { + return getValue(key_path).has_value(); +} -bool ConfigManager::saveToFile(const std::string &file_path) const { +bool ConfigManager::saveToFile(const fs::path& file_path) const { + std::unique_lock lock(m_impl->rw_mutex_); std::ofstream ofs(file_path); - if (!ofs.is_open()) { + if (!ofs) { LOG_F(ERROR, "Failed to open file: {}", file_path); return false; } try { - ofs << config_.dump(4); - } catch (const std::exception &e) { + ofs << m_impl->config_.dump(4); + ofs.close(); + return true; + } catch (const std::exception& e) { LOG_F(ERROR, "Failed to save config to file: {}, error message: {}", file_path, e.what()); - ofs.close(); return false; } - ofs.close(); - DLOG_F(INFO, "Save config to file: {}", file_path); - return true; } + +void ConfigManager::tidyConfig() { + std::unique_lock lock(m_impl->rw_mutex_); + json updated_config; + for (const auto& [key, value] : m_impl->config_.items()) { + json* p = &updated_config; + for (auto sub_key : key | std::views::split('/')) { + if (!p->contains(std::string(sub_key.begin(), sub_key.end()))) { + (*p)[std::string(sub_key.begin(), sub_key.end())] = + json::object(); + } + p = &(*p)[std::string(sub_key.begin(), sub_key.end())]; + } + *p = value; + } + m_impl->config_ = std::move(updated_config); +} + +void ConfigManager::mergeConfig(const json& src) { + m_impl->config_.merge_patch(src); +} + +void ConfigManager::clearConfig() { m_impl->config_.clear(); } + } // namespace Lithium diff --git a/src/config/configor.hpp b/src/config/configor.hpp index 2730de63..52a281a7 100644 --- a/src/config/configor.hpp +++ b/src/config/configor.hpp @@ -12,11 +12,13 @@ Description: Configor **************************************************/ -#pragma once +#ifndef LITHIUM_CONFIG_CONFIGOR_HPP +#define LITHIUM_CONFIG_CONFIGOR_HPP -#include #include #include +#include +namespace fs = std::filesystem; #include "error/error_code.hpp" @@ -24,26 +26,29 @@ Description: Configor using json = nlohmann::json; #define GetIntConfig(path) \ - GetPtr("lithium.config")->getValue(path).get() + GetPtr("lithium.config").value()->getValue(path).get() #define GetFloatConfig(path) \ - GetPtr("lithium.config")->getValue(path).get() + GetPtr("lithium.config").value()->getValue(path).get() #define GetBoolConfig(path) \ - GetPtr("lithium.config")->getValue(path).get() + GetPtr("lithium.config").value()->getValue(path).get() -#define GetDoubleConfig(path) \ - GetPtr("lithium.config")->getValue(path).get() +#define GetDoubleConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .get() -#define GetStringConfig(path) \ - GetPtr("lithium.config")->getValue(path).get() +#define GetStringConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .get() namespace Lithium { -/** - * @brief 配置管理器 - * - * Config manager. - */ +class ConfigManagerImpl; + class ConfigManager { public: /** @@ -65,12 +70,14 @@ class ConfigManager { // ------------------------------------------------------------------- /** - * @brief 创建一个全局唯一的ConfigManager实例 + * @brief 创建ConfigManager的共享指针,但是全局唯一 * - * Create a globally unique ConfigManager instance. + * Create a shared pointer of ConfigManager. But global only */ static std::shared_ptr createShared(); + static std::unique_ptr createUnique(); + // ------------------------------------------------------------------- // Config methods // ------------------------------------------------------------------- @@ -84,7 +91,8 @@ class ConfigManager { * "database/username" * @return json 配置项对应的值,如果键不存在则返回 nullptr */ - [[nodiscard]] json getValue(const std::string &key_path) const; + [[nodiscard("config value should not be ignored!")]] std::optional + getValue(const std::string& key_path) const; /** * @brief 添加或更新一个配置项 @@ -96,8 +104,7 @@ class ConfigManager { * @param value 配置项的值,使用 JSON 格式进行表示 * @return bool 成功返回 true,失败返回 false */ - bool setValue(const std::string &key_path, const json &value); - + bool setValue(const std::string& key_path, const json& value); /** * @brief 删除一个配置项 * @@ -106,7 +113,8 @@ class ConfigManager { * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 * "database/username" */ - bool deleteValue(const std::string &key_path); + + bool deleteValue(const std::string& key_path); /** * @brief 判断一个配置项是否存在 @@ -117,7 +125,8 @@ class ConfigManager { * "database/username" * @return bool 存在返回 true,不存在返回 false */ - bool hasValue(const std::string &key_path) const; + [[nodiscard("status of the value should not be ignored")]] bool hasValue( + const std::string& key_path) const; /** * @brief 从指定文件中加载JSON配置,并与原有配置进行合并 @@ -127,7 +136,7 @@ class ConfigManager { * * @param path 配置文件路径 */ - bool loadFromFile(const std::string &path); + bool loadFromFile(const fs::path& path); /** * @brief 加载指定目录下的所有JSON配置文件 @@ -136,7 +145,7 @@ class ConfigManager { * * @param dir_path 配置文件所在目录的路径 */ - bool loadFromDir(const std::string &dir_path, bool recursive); + bool loadFromDir(const fs::path& dir_path, bool recursive = false); /** * @brief 将当前配置保存到指定文件 @@ -145,7 +154,7 @@ class ConfigManager { * * @param file_path 目标文件路径 */ - bool saveToFile(const std::string &file_path) const; + bool saveToFile(const fs::path& file_path) const; /** * @brief 清理配置项 @@ -154,11 +163,15 @@ class ConfigManager { */ void tidyConfig(); + /** + * @brief 清除所有配置(测试用) + * + * Clear all of the configurations, only used for test + */ + void clearConfig(); + private: - // JSON配置项 - json config_; - std::mutex mutex_; - mutable std::shared_mutex rw_mutex_; + std::unique_ptr m_impl; /** * @brief 将 JSON 配置合并到当前配置中 @@ -167,6 +180,8 @@ class ConfigManager { * * @param j JSON 配置 */ - void mergeConfig(const json &j); + void mergeConfig(const json& j); }; } // namespace Lithium + +#endif diff --git a/src/controller/AsyncSystemController.hpp b/src/controller/AsyncSystemController.hpp index 5889e6c6..c5b8639a 100644 --- a/src/controller/AsyncSystemController.hpp +++ b/src/controller/AsyncSystemController.hpp @@ -445,7 +445,7 @@ class SystemController : public oatpp::web::server::api::ApiController { ENDPOINT_ASYNC_INIT(getUIProcesses); Action act() override { nlohmann::json res; - for (const auto &process : Atom::System::GetProcessInfo()) { + for (const auto &process : Atom::System::getProcessInfo()) { OATPP_LOGD("System", "Process Name: %s File Address: %s", process.first.c_str(), process.second.c_str()); res["value"][process.first] = process.second; @@ -465,7 +465,7 @@ class SystemController : public oatpp::web::server::api::ApiController { ENDPOINT_ASYNC("GET", "/api/system/shutdown", getUIShutdown) { ENDPOINT_ASYNC_INIT(getUIShutdown); Action act() override { - Atom::System::Shutdown(); + Atom::System::shutdown(); return _return(controller->createResponse( Status::CODE_200, "Wtf, how can you do that?")); } @@ -475,7 +475,7 @@ class SystemController : public oatpp::web::server::api::ApiController { ENDPOINT_ASYNC("GET", "/api/system/reboot", getUIReboot) { ENDPOINT_ASYNC_INIT(getUIReboot); Action act() override { - Atom::System::Reboot(); + Atom::System::reboot(); return _return(controller->createResponse( Status::CODE_200, "Wtf, how can you do that?")); } diff --git a/src/debug/terminal.cpp b/src/debug/terminal.cpp index 7498b479..ff1d06a2 100644 --- a/src/debug/terminal.cpp +++ b/src/debug/terminal.cpp @@ -14,359 +14,156 @@ Description: Terminal #include "terminal.hpp" +#include #include -#include -#ifdef _WIN32 -#include -#include -#include -const std::string SHELL_COMMAND = "powershell.exe -Command "; -#else -#include -#include -const std::string SHELL_COMMAND = "sh -c "; -#endif +namespace fs = std::filesystem; namespace Lithium::Terminal { -CommandManager::CommandManager() : hist_iter_(command_history_.begin()) {} - -void CommandManager::registerCommand( - const std::string &cmd, - std::function func) { - std::lock_guard lock(mutex_); - commands_.emplace(cmd, func); -} -const std::string &CommandManager::runCommand(const std::string &cmd, - const std::string &arg) { - std::lock_guard lock(mutex_); - auto it = commands_.find(cmd); - if (it != commands_.end()) { - const std::string command_str = cmd + " " + arg; - command_history_.emplace_back(command_str); - history_index_ = command_history_.size(); - static std::string result = it->second(arg); - return result; - } - static const std::string unknown_cmd = - "\033[31mUnknown command: " + cmd + "\033[0m\n"; - return unknown_cmd; +ConsoleTerminal::ConsoleTerminal() { +#ifdef _WIN32 + hConsole = GetStdHandle(STD_OUTPUT_HANDLE); +#else + tcgetattr(STDIN_FILENO, &orig_termios); +#endif + registerMemberCommand("help", this, helpCommand); + registerMemberCommand("pwd", this, pwdCommand); + registerMemberCommand("help", this, helpCommand); + registerMemberCommand("echo", this, echoCommand); + registerMemberCommand("create", this, createFile); + registerMemberCommand("delete", this, deleteFile); } -std::future CommandManager::runCommandAsync( - const std::string &cmd, const std::string &arg) { - std::lock_guard lock(mutex_); - auto it = commands_.find(cmd); - if (it != commands_.end()) { - std::future future = - std::async(std::launch::async, [this, it, arg]() { - const std::string command_str = it->first + " " + arg; - command_history_.emplace_back(command_str); - history_index_ = command_history_.size(); - return std::string(it->second(arg)); - }); - addFuture(std::move(future)); - return future; - } - return std::async(std::launch::async, []() { - return std::string("\033[31mUnknown command\033[0m"); - }); +ConsoleTerminal::~ConsoleTerminal() { +#ifdef _WIN32 + // Windows-specific cleanup can be added here if needed +#else + tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios); +#endif } -void CommandManager::addFuture(std::future &&future) { - std::lock_guard lock(mutex_); - futures_.emplace_back(std::move(future)); +void ConsoleTerminal::registerCommand(const std::string& name, + CommandFunction func) { + commandMap.emplace(name, std::move(func)); } -void CommandManager::join() { - for (auto it = futures_.begin(); it != futures_.end();) { - if (it->valid()) { - try { - it->wait(); - const std::string result = it->get(); - if (!result.empty()) { - std::cout << result << std::endl; - } - it = futures_.erase(it); - } catch (const std::exception &e) { - std::cerr << "Exception in task: " << e.what() << std::endl; - it = futures_.erase(it); - } - } else { - it = futures_.erase(it); - } - } -} - -const std::vector &CommandManager::getRegisteredCommands() const { +std::vector ConsoleTerminal::getRegisteredCommands() const { std::vector commands; - for (const auto &cmd : commands_) { - commands.emplace_back(cmd.first); + for (const auto& [name, _] : commandMap) { + commands.push_back(name); } - static const std::vector command_list = std::move(commands); - return command_list; + return commands; } -const std::string &CommandManager::getPrevCommand() { - if (hist_iter_ != command_history_.begin()) { - --hist_iter_; - history_index_ = hist_iter_ - command_history_.begin(); - } - static const std::string empty_str; - return (history_index_ >= 0 && history_index_ < command_history_.size()) - ? *(hist_iter_) - : empty_str; -} +void ConsoleTerminal::callCommand(const std::string& name, + const std::vector& args) { + if (auto it = commandMap.find(name); it != commandMap.end()) { + try { + it->second(args); + } catch (const std::exception& e) { + std::cout << "Error: " << e.what() << '\n'; + } -const std::string &CommandManager::getNextCommand() { - if (hist_iter_ != command_history_.end() - 1) { - ++hist_iter_; - history_index_ = (hist_iter_ - command_history_.begin()); + } else { + std::cout << "Command '" << name << "' not found.\n"; } - static const std::string empty_str; - return (history_index_ >= 0 && history_index_ < command_history_.size()) - ? *(hist_iter_) - : empty_str; -} - -void CommandManager::addCommandHistory(const std::string &cmd) { - command_history_.emplace_back(cmd); - history_index_ = command_history_.size(); - hist_iter_ = command_history_.end(); } -bool CommandManager::hasNextCommand() const { - return hist_iter_ != command_history_.end() - 1; -} +void ConsoleTerminal::run() { + std::string input; + std::deque history; + int historyIndex = 0; -bool CommandManager::hasPrevCommand() const { - return hist_iter_ != command_history_.begin(); -} + printHeader(); -std::string getCursorLocation() { - std::cout << "\033[6n" << std::flush; + while (true) { + std::cout << "> "; + std::getline(std::cin, input); - char c = '\0'; - std::string result = ""; - while (c != 'R') { - if (read(STDIN_FILENO, &c, 1) == -1) { + history.push_front(input); + if (history.size() > MAX_HISTORY_SIZE) { + history.pop_back(); + } + historyIndex = 0; + + std::istringstream iss(input); + std::string command; + iss >> command; + std::vector args(std::istream_iterator{iss}, + std::istream_iterator{}); + + if (command == "exit") { + break; + } else if (command == "clear") { + clearConsole(); + continue; } - result += c; - } - return result; + callCommand(command, args); + } } -bool isColorSupported() { -#ifdef _WIN32 - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (hOut == INVALID_HANDLE_VALUE) - return false; - - DWORD dwMode; - if (!GetConsoleMode(hOut, &dwMode)) - return false; - - dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - if (!SetConsoleMode(hOut, dwMode)) - return false; - - // 输出绿色字符 - std::cout << "\x1B[32m" << std::flush; - - int c = getchar(); // 读取用户的输入 - bool result = (c == '\033'); // 判断是否为控制字符 - - // 恢复默认颜色 - std::cout << "\x1B[0m" << std::flush; - - // 还原控制台模式 - dwMode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(hOut, dwMode); - - return result; -#else - if (!isatty(fileno(stdout))) - return false; - - struct termios saved_termios, modified_termios; - tcgetattr(STDIN_FILENO, &saved_termios); - - modified_termios = saved_termios; - modified_termios.c_lflag &= ~(ECHO | ICANON); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &modified_termios); - - // 输出绿色字符 - std::cout << "\033[32m" << std::flush; - - int c = getchar(); // 读取用户的输入 - bool result = (c == '\033'); // 判断是否为控制字符 - - // 恢复默认颜色 - std::cout << "\033[0m" << std::flush; - - tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_termios); - - return result; -#endif +void ConsoleTerminal::helpCommand(const std::vector& args) { + std::cout << "Available commands:\n"; + std::cout << " print [args...] - Print arguments to console\n"; + std::cout << " ls [dir] - List files in directory\n"; + std::cout << " rm - Delete file\n"; + std::cout << " help - Show available commands\n"; + std::cout << " exit - Exit the terminal\n"; } -std::string getTerminalInput(CommandManager &manager) { - // 保存当前终端属性 -#ifdef _WIN32 - HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); - DWORD mode; - GetConsoleMode(hStdin, &mode); - DWORD saved_mode = mode; -#else - struct termios saved_termios, modified_termios; - tcgetattr(STDIN_FILENO, &saved_termios); -#endif - - // 修改终端属性 -#ifdef _WIN32 - mode &= ~ENABLE_ECHO_INPUT; - mode &= ~ENABLE_LINE_INPUT; - SetConsoleMode(hStdin, mode); -#else - modified_termios = saved_termios; - modified_termios.c_lflag &= ~(ECHO | ICANON); - modified_termios.c_cc[VTIME] = 0; // 设置非阻塞模式 - modified_termios.c_cc[VMIN] = 1; // 设置最少读取的字符数 - tcsetattr(STDIN_FILENO, TCSAFLUSH, &modified_termios); -#endif - - std::string input = ""; - int c = 0; - - std::cout << "\033[94m>>>\033[0m " << std::flush; // 改变提示符颜色 - - while (true) { - // 读取字符 -#ifdef _WIN32 - c = _getch(); -#else - c = getchar(); -#endif - - if (c == '\n' || c == EOF) { // 输入结束,退出循环 - std::cout << std::endl; // 输出一个换行符 - - if (!input.empty()) { - // 将输入的命令添加到历史记录中 - manager.addCommandHistory(input); - - std::string output = manager.runCommand(input, ""); - std::cout << output; - } - - std::cout << "\033[94m>>>\033[0m " << std::flush; // 重新输出提示符 - - input.clear(); // 清空输入缓存 - } else if (c == 127 || c == 8) { // 处理退格键 - if (!input.empty()) { - input.pop_back(); - -#ifdef _WIN32 - std::cout - << "\b \b" - << std:: - flush; // 输出退格符、空格和退格符,相当于清空当前字符 -#else - std::cout - << "\b \b" - << std:: - flush; // 输出退格符、空格和退格符,相当于清空当前字符 -#endif - } - } else if (c == '\033') { // 处理特殊字符,如向上键 -#ifdef _WIN32 - int nextC = _getch(); -#else - int nextC = getchar(); -#endif - if (nextC == '[') { -#ifdef _WIN32 - switch (_getch()) -#else - switch (getchar()) -#endif - { - case 'B': // 向上键 - if (manager.hasNextCommand()) { - input = manager.getNextCommand(); - std::cout << "\r\033[K" << "\033[94m>>>\033[0m " - << input - << std::flush; // 输出命令和提示符 - } - break; - - case 'A': // 向下键 - if (manager.hasPrevCommand()) { - input = manager.getPrevCommand(); - std::cout << "\r\033[K" << "\033[94m>>>\033[0m " - << input - << std::flush; // 输出命令和提示符 - } - break; - - default: - break; - } - } - } else { // 处理普通字符 - input += c; - std::cout << static_cast(c) - << std::flush; // 直接输出字符即可 - } +void ConsoleTerminal::echoCommand(const std::vector& args) { + for (const auto& arg : args) { + std::cout << arg << ' '; } + std::cout << '\n'; +} - // 恢复终端属性 -#ifdef _WIN32 - SetConsoleMode(hStdin, saved_mode); -#else - tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_termios); -#endif +void ConsoleTerminal::pwdCommand(const std::vector& args) { + std::cout << "Current directory: " << fs::current_path() << '\n'; +} - return input; +void ConsoleTerminal::cdCommand(const std::vector& args) { + if (args.empty()) { + std::cout << "Usage: cd \n"; + return; + } + fs::current_path(args[0]); } -void clearTerminal() { -#ifdef _WIN32 - // Windows 平台下使用 System 函数 - std::system("cls"); -#else - // Linux 平台下使用 system 函数 - std::system("clear"); -#endif +void ConsoleTerminal::listDirectory(const std::vector& args) { + std::string path = "."; + if (!args.empty()) + path = args[0]; + for (const auto& entry : fs::directory_iterator(path)) + std::cout << entry.path() << '\n'; } -// 实现 ls 指令,用于显示当前目录下的文件和文件夹 -std::string lsCommand(const std::string &arg) { - std::string cmd = "ls -al "; - if (!arg.empty()) { - cmd += arg; - } else { - cmd += "."; +void ConsoleTerminal::createFile(const std::vector& args) { + if (args.empty()) { + std::cout << "No file name provided.\n"; + return; } - - FILE *pipe = popen(cmd.c_str(), "r"); - if (!pipe) { - return "Failed to execute command: " + cmd; + std::ofstream file(args[0]); + if (file.is_open()) { + std::cout << "File created: " << args[0] << '\n'; + file.close(); + } else { + std::cout << "Failed to create file: " << args[0] << '\n'; } +} - char buffer[128]; - std::string result = ""; - while (fgets(buffer, 128, pipe) != nullptr) { - result += buffer; +void ConsoleTerminal::deleteFile(const std::vector& args) { + if (args.empty()) { + std::cout << "No file name provided.\n"; + return; } - pclose(pipe); - - return result; + fs::remove(args[0]); + std::cout << "File deleted: " << args[0] << '\n'; } -void printHeader() { +void ConsoleTerminal::printHeader() { std::cout << "Welcome to Lithium Command Line Tool v1.0" << std::endl; std::cout << "A debugging tool for Lithium Engine" << std::endl; std::cout << "--------------------------------------------------" @@ -377,62 +174,18 @@ void printHeader() { << std::endl; } -// 实现 pwd 指令,用于显示当前工作目录路径名 -std::string pwdCommand(const std::string &arg) { - return "Current working directory: " + std::string(getcwd(nullptr, 0)) + - "\n"; -} - -// 实现 mkdir 指令,用于创建目录 -std::string mkdirCommand(const std::string &arg) { - std::string cmd = "mkdir " + arg; - - FILE *pipe = popen(cmd.c_str(), "r"); - if (!pipe) { - return "Failed to execute command: " + cmd; - } - - pclose(pipe); - - return "Directory created: " + arg; -} - -// 实现 cp 指令,用于复制文件或目录 -std::string cpCommand(const std::string &arg) { - std::string cmd = "cp -r " + arg; - - FILE *pipe = popen(cmd.c_str(), "r"); - if (!pipe) { - return "Failed to execute command: " + cmd; - } - - pclose(pipe); - - return "File or directory copied: " + arg; -} - -// 实现 help 指令,列出所有可用的命令 -std::string helpCommand(CommandManager &manager, const std::string &arg) { - std::vector commands = manager.getRegisteredCommands(); - - // 构造输出字符串 - std::stringstream ss; - ss << "Available commands:" << std::endl; - for (const auto &cmd : commands) { - ss << " - " << cmd << std::endl; - } - return ss.str(); +void ConsoleTerminal::clearConsole() { +#ifdef _WIN32 + COORD topLeft = {0, 0}; + CONSOLE_SCREEN_BUFFER_INFO screen; + DWORD written; + GetConsoleScreenBufferInfo(hConsole, &screen); + FillConsoleOutputCharacter(hConsole, ' ', screen.dwSize.X * screen.dwSize.Y, + topLeft, &written); + SetConsoleCursorPosition(hConsole, topLeft); +#else + std::cout << "\x1B[2J\x1B[H"; +#endif } -std::string systemCommand(const std::string &arg) { - std::string command = SHELL_COMMAND + "'" + arg + "' 2>&1"; - std::string output; - int result = std::system(command.c_str()); - if (result == 0) { - output = "\033[32mCommand executed successfully.\033[0m\n"; - } else { - output = "\033[31mCommand failed to execute.\033[0m\n"; - } - return output; -} } // namespace Lithium::Terminal diff --git a/src/debug/terminal.hpp b/src/debug/terminal.hpp index 1f8f92d1..ce7e6cbb 100644 --- a/src/debug/terminal.hpp +++ b/src/debug/terminal.hpp @@ -1,200 +1,83 @@ -/* - * terminal.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-6-30 - -Description: Terminal - -**************************************************/ - -#pragma once - -#define HAS_LITHIUM_TERMINAL 1 +#ifndef LITHIUM_DEBUG_TERMINAL_HPP +#define LITHIUM_DEBUG_TERMINAL_HPP +#include +#include #include -#include -#include -#include +#include +#include +#include #include +#include #include -#if ENABLE_FASTHASH -#include "emhash/emhash8_table.hpp" +#ifdef _WIN32 +#include #else -#include +#include +#include #endif namespace Lithium::Terminal { -/** - * @brief 命令管理器类,用于注册、运行指令函数以及管理历史记录等功能。 - */ -class CommandManager { +class ConsoleTerminal { public: - /** - * @brief 构造函数,初始化命令管理器。 - */ - CommandManager(); - - /** - * @brief 注册指令函数。 - * @param cmd 指令名称。 - * @param func 指令函数。 - */ - void registerCommand(const std::string &cmd, - std::function func); - - /** - * @brief 运行指令函数,同步调用。 - * @param cmd 指令名称。 - * @param arg 指令参数。 - * @return 指令函数的返回值。 - */ - const std::string &runCommand(const std::string &cmd, - const std::string &arg); - - /** - * @brief 运行指令函数,异步调用。 - * @param cmd 指令名称。 - * @param arg 指令参数。 - * @return std::future 对象,可用于获取异步调用的返回值。 - */ - std::future runCommandAsync(const std::string &cmd, - const std::string &arg); - - /** - * @brief 添加 std::future 对象到 futures_ 中。 - * @param future std::future 对象。 - */ - void addFuture(std::future &&future); - - /** - * @brief 等待所有异步调用结束。 - */ - void join(); - - /** - * @brief 获取注册的指令函数名称列表。 - * @return 指令函数名称列表。 - */ - const std::vector &getRegisteredCommands() const; - - /** - * @brief 获取历史记录中上一个命令。 - * @return 上一个命令。 - */ - const std::string &getPrevCommand(); - - /** - * @brief 获取历史记录中下一个命令。 - * @return 下一个命令。 - */ - const std::string &getNextCommand(); - - /** - * @brief 添加命令到历史记录中。 - * @param cmd 命令。 - */ - void addCommandHistory(const std::string &cmd); - - /** - * @brief 检查是否存在下一个历史命令。 - * @return 若存在下一个历史命令则返回 true,否则返回 false。 - */ - bool hasNextCommand() const; - - /** - * @brief 检查是否存在上一个历史命令。 - * @return 若存在上一个历史命令则返回 true,否则返回 false。 - */ - bool hasPrevCommand() const; + using CommandFunction = + std::function&)>; + + ConsoleTerminal(); + + ~ConsoleTerminal(); + + void registerCommand(const std::string& name, CommandFunction func); + + template + void registerMemberCommand( + const std::string& name, Class* instance, + void (Class::*memFunc)(const std::vector&)) { + CommandFunction func = [instance, + memFunc](const std::vector& args) { + (instance->*memFunc)(args); + }; + registerCommand(name, func); + } + + std::vector getRegisteredCommands() const; + + void callCommand(const std::string& name, + const std::vector& args); + + void run(); + +protected: + void helpCommand(const std::vector& args); + + void echoCommand(const std::vector& args); + + void pwdCommand(const std::vector& args); + + void cdCommand(const std::vector& args); + + void listDirectory(const std::vector& args); + + void createFile(const std::vector& args); + + void deleteFile(const std::vector& args); private: - std::unordered_map> - commands_; // 注册的指令函数 - std::mutex mutex_; // 互斥锁,用于保护 commands_ 和 futures_ - std::vector> - futures_; // 异步调用的 std::future 对象 - - std::vector command_history_; // 历史命令 - int history_index_ = 0; // 当前历史命令的索引位置 - std::vector::const_iterator hist_iter_; // 历史命令遍历迭代器 -}; + void printHeader(); -/** - * @brief 获取光标位置。 - * @return 光标位置字符串。 - */ -std::string getCursorLocation(); - -/** - * @brief 检查终端是否支持彩色输出。 - * @return 若支持彩色输出则返回 true,否则返回 false。 - */ -bool isColorSupported(); - -/** - * @brief 清除终端。 - */ -void clearTerminal(); - -/** - * @brief 获取终端输入。 - * @param manager 命令管理器。 - * @return 终端输入字符串。 - */ -std::string getTerminalInput(CommandManager &manager); - -/** - * @brief ls 指令的实现,用于显示当前目录下的文件和文件夹。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string lsCommand(const std::string &arg); - -/** - * @brief pwd 指令的实现,用于显示当前工作目录路径名。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string pwdCommand(const std::string &arg); - -/** - * @brief 打印终端头部信息。 - */ -void printHeader(); - -/** - * @brief mkdir 指令的实现,用于创建目录。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string mkdirCommand(const std::string &arg); - -/** - * @brief cp 指令的实现,用于复制文件或目录。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string cpCommand(const std::string &arg); - -/** - * @brief help 指令的实现,列出所有可用的命令。 - * @param manager 命令管理器。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string helpCommand(CommandManager &manager, const std::string &arg); - -/** - * @brief system 指令的实现,用于执行系统命令。 - * @param arg 指令参数。 - * @return 执行结果字符串。 - */ -std::string systemCommand(const std::string &arg); +private: + std::unordered_map commandMap; + static const int MAX_HISTORY_SIZE = 100; + +#ifdef _WIN32 + HANDLE hConsole; +#else + struct termios orig_termios; +#endif + + void clearConsole(); +}; } // namespace Lithium::Terminal + +#endif diff --git a/src/device/server/hydrogen.cpp b/src/device/server/hydrogen.cpp index a6895557..75368f94 100644 --- a/src/device/server/hydrogen.cpp +++ b/src/device/server/hydrogen.cpp @@ -215,11 +215,11 @@ bool HydrogenManager::isRunning() { bool HydrogenManager::isInstalled() { #ifdef _WIN32 - if (!Atom::System::CheckSoftwareInstalled("hydrogenserver.exe")) { + if (!Atom::System::checkSoftwareInstalled("hydrogenserver.exe")) { return false; } #else - if (!Atom::System::CheckSoftwareInstalled("hydrogenserver")) { + if (!Atom::System::checkSoftwareInstalled("hydrogenserver")) { return false; } #endif diff --git a/src/launcher/faq.cpp b/src/launcher/faq.cpp index fdd83372..473dca12 100644 --- a/src/launcher/faq.cpp +++ b/src/launcher/faq.cpp @@ -1,14 +1,25 @@ +/* + * faq.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: F&Q Manager for HEAL + +**************************************************/ + +#include "faq.hpp" + #include #include #include -#include #include -#include #include -#include "json.hpp" - - -using json = nlohmann::json; +#include struct FAQ { std::string question; @@ -19,22 +30,21 @@ struct FAQ { std::vector links; }; -public: -void addFAQ(const FAQ &faq) { - std::lock_guard lock(mutex); +void FAQManager::addFAQ(const FAQ &faq) { + std::lock_guard lock(mutex); faqs.push_back(faq); } -void deleteFAQ(const std::string &question) { - std::lock_guard lock(mutex); +void FAQManager::deleteFAQ(const std::string &question) { + std::lock_guard lock(mutex); faqs.erase(std::remove_if( faqs.begin(), faqs.end(), [&](const FAQ &faq) { return faq.question == question; }), faqs.end()); } -std::vector searchFAQs(const std::string &keyword) { - std::lock_guard lock(mutex); +std::vector FAQManager::searchFAQs(const std::string &keyword) { + std::lock_guard lock(mutex); // 检查缓存中是否存在搜索结果 if (cache.find(keyword) != cache.end()) { @@ -56,13 +66,13 @@ std::vector searchFAQs(const std::string &keyword) { return results; } -std::vector getFAQs() const { - std::lock_guard lock(mutex); +std::vector FAQManager::getFAQs() const { + std::lock_guard lock(mutex); return faqs; } -std::vector getCategorizedFAQs(const std::string &category) { - std::lock_guard lock(mutex); +std::vector FAQManager::getCategorizedFAQs(const std::string &category) { + std::lock_guard lock(mutex); // 检查缓存中是否存在分类结果 if (categoryCache.find(category) != categoryCache.end()) { @@ -82,8 +92,8 @@ std::vector getCategorizedFAQs(const std::string &category) { return results; } -void saveToFile(const std::string &filename) { - std::lock_guard lock(mutex); +void FAQManager::saveToFile(const std::string &filename) { + std::lock_guard lock(mutex); json jsonData; for (const auto &faq : faqs) { @@ -102,8 +112,8 @@ void saveToFile(const std::string &filename) { file << jsonData.dump(4); // 4-space indentation for pretty printing } -void loadFromFile(const std::string &filename) { - std::lock_guard lock(mutex); +void FAQManager::loadFromFile(const std::string &filename) { + std::lock_guard lock(mutex); std::ifstream file(filename); json jsonData; file >> jsonData; @@ -125,8 +135,8 @@ void loadFromFile(const std::string &filename) { } } -void printFAQs() const { - std::lock_guard lock(mutex); +void FAQManager::printFAQs() const { + std::lock_guard lock(mutex); json jsonData; for (const auto &faq : faqs) { diff --git a/src/launcher/faq.hpp b/src/launcher/faq.hpp index ae52915a..2a50f43f 100644 --- a/src/launcher/faq.hpp +++ b/src/launcher/faq.hpp @@ -1,8 +1,26 @@ +/* + * faq.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: F&Q Manager for HEAL + +**************************************************/ + #include #include -#include #include +#if ENABLE_FASTHASH +#include "emhash/hash_table8.hpp" +#else +#include +#endif #include "atom/type/json.hpp" using json = nlohmann::json; @@ -24,6 +42,8 @@ class FAQManager { std::vector searchFAQs(const std::string &keyword); + std::vector getFAQs() const; + std::vector getCategorizedFAQs(const std::string &category); void saveToFile(const std::string &filename); @@ -34,7 +54,12 @@ class FAQManager { private: std::vector faqs; +#if ENABLE_FASTHASH + emhash8::HashMap> cache; + emhash8::HashMap> categoryCache; +#else std::unordered_map> cache; std::unordered_map> categoryCache; +#endif mutable std::mutex mutex; }; \ No newline at end of file diff --git a/src/script/custom/config.cpp b/src/script/custom/config.cpp index ae7f6c0e..df4a2e0e 100644 --- a/src/script/custom/config.cpp +++ b/src/script/custom/config.cpp @@ -1,39 +1,42 @@ /* - * python_config.cpp + * config.cpp * * Copyright (C) 2023-2024 Max Qian */ /************************************************* -Date: 2023-7-13 +Date: 2024-4-13 -Description: Config module for Python scripting engine +Description: Config module for PocketPy(builtin) **************************************************/ #include "pocketpy/include/pocketpy/bindings.h" using namespace pkpy; -#include "config/configor.hpp" -#include "atom/server/global_ptr.hpp" #include "atom/log/loguru.hpp" +#include "atom/server/global_ptr.hpp" #include "atom/system/system.hpp" #include "atom/type/json.hpp" +#include "config/configor.hpp" using json = nlohmann::json; namespace Lithium { void addConfigModule(VM *vm) { DLOG_F(INFO, "Adding config module"); - PyObject* mod = vm->new_module("li_config"); + PyObject *mod = vm->new_module("li_config"); vm->bind(mod, "get_str_config(key : str) -> str", "get specified config value and return in string type", [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config")->getValue(key.str()); + json value = GetPtr("lithium.config") + .value() + ->getValue(key.str()) + .value(); if (value.is_null() || !value.is_string()) { LOG_F(ERROR, "Failed to get config value: {}", key.str()); return pkpy::py_var(vm, ""); @@ -47,7 +50,10 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config")->getValue(key.str()); + json value = GetPtr("lithium.config") + .value() + ->getValue(key.str()) + .value(); if (value.is_null() || !value.is_number()) { LOG_F(ERROR, "Failed to get config value: {}", key.str()); return pkpy::py_var(vm, 0); @@ -61,7 +67,10 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config")->getValue(key.str()); + json value = GetPtr("lithium.config") + .value() + ->getValue(key.str()) + .value(); if (value.is_null() || !value.is_number()) { LOG_F(ERROR, "Failed to get config value: {}", key.str()); return pkpy::py_var(vm, 0.0f); @@ -75,7 +84,10 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config")->getValue(key.str()); + json value = GetPtr("lithium.config") + .value() + ->getValue(key.str()) + .value(); if (value.is_null() || !value.is_boolean()) { LOG_F(ERROR, "Failed to get config value: {}", key.str()); return pkpy::py_var(vm, false); @@ -92,7 +104,10 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; pkpy::Str &value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var(vm, GetPtr("lithium.config")->setValue(key.str(), value)); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->setValue(key.str(), value)); }); vm->bind(mod, @@ -103,7 +118,10 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; int value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var(vm, GetPtr("lithium.config")->setValue(key.str(), value)); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->setValue(key.str(), value)); }); vm->bind(mod, @@ -114,7 +132,10 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; float value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var(vm, GetPtr("lithium.config")->setValue(key.str(), value)); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->setValue(key.str(), value)); }); vm->bind(mod, @@ -125,7 +146,10 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; bool value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var(vm, GetPtr("lithium.config")->setValue(key.str(), value)); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->setValue(key.str(), value)); }); vm->bind(mod, "delete_config(key : str) -> bool", @@ -133,27 +157,35 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - return pkpy::py_var(vm, GetPtr("lithium.config")->deleteValue(key.str())); - }); - - vm->bind(mod, "save_config(path : str) -> bool", - "save config to specified path", - [](pkpy::VM *vm, pkpy::ArgsView args) { - pkpy::PyObject *path_obj = args[0]; - pkpy::Str &path = pkpy::py_cast(vm, path_obj); return pkpy::py_var( - vm, GetPtr("lithium.config")->saveToFile( - path.str().empty() ? "config/config.json" : path.str())); + vm, GetPtr("lithium.config") + .value() + ->deleteValue(key.str())); }); - vm->bind(mod, "load_config(path : str) -> bool", - "load config from specified path", - [](pkpy::VM *vm, pkpy::ArgsView args) { - pkpy::PyObject *path_obj = args[0]; - pkpy::Str &path = pkpy::py_cast(vm, path_obj); - return pkpy::py_var( - vm, GetPtr("lithium.config")->loadFromFile( - path.str().empty() ? "config/config.json" : path.str())); - }); + vm->bind( + mod, "save_config(path : str) -> bool", "save config to specified path", + [](pkpy::VM *vm, pkpy::ArgsView args) { + pkpy::PyObject *path_obj = args[0]; + pkpy::Str &path = pkpy::py_cast(vm, path_obj); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->saveToFile(path.str().empty() ? "config/config.json" + : path.str())); + }); + + vm->bind( + mod, "load_config(path : str) -> bool", + "load config from specified path", + [](pkpy::VM *vm, pkpy::ArgsView args) { + pkpy::PyObject *path_obj = args[0]; + pkpy::Str &path = pkpy::py_cast(vm, path_obj); + return pkpy::py_var( + vm, GetPtr("lithium.config") + .value() + ->loadFromFile(path.str().empty() ? "config/config.json" + : path.str())); + }); } } // namespace Lithium diff --git a/src/script/custom/os.cpp b/src/script/custom/os.cpp index a025aa6f..a35a690c 100644 --- a/src/script/custom/os.cpp +++ b/src/script/custom/os.cpp @@ -1,34 +1,52 @@ +/* + * os.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: OS module for PocketPy(builtin) + +**************************************************/ + #include "pocketpy/include/pocketpy/bindings.h" #include "config.h" -#include "atom/system/os.hpp" #include "atom/io/io.hpp" +#include "atom/log/loguru.hpp" +#include "atom/system/os.hpp" using namespace pkpy; -void addOSModule(VM* vm){ + +namespace Lithium { +void addOSModule(VM* vm) { PyObject* mod = vm->new_module("li_os"); - vm->setattr(mod, "version", VAR(LITHIUM_VERSION_STRING)); + vm->setattr(mod, "version", VAR("1.0.0")); vm->bind_func<1>(mod, "walk", [](VM* vm, ArgsView args) { std::string_view sv; - if(is_non_tagged_type(args[0], vm->tp_bytes)){ + if (is_non_tagged_type(args[0], vm->tp_bytes)) [[likely]] { sv = PK_OBJ_GET(Bytes, args[0]).sv(); - }else{ + } else { sv = CAST(Str&, args[0]).sv(); } - if (!Atom::IO::isisFolderExists(sv)) - { - + if (!Atom::IO::isFolderExists(std::string(sv))) { + LOG_F(ERROR, "Folder is not existing: {}", sv); + return vm->None; } - auto result = Atom::System::jwalk(sv); - if (result.empty()){ + auto result = Atom::System::jwalk(std::string(sv)); + if (result.empty()) { return vm->None; } - return vm->_exec(code, vm->top_frame()->_module); + return py_var(vm, result); }); vm->bind_func<1>(mod, "dumps", [](VM* vm, ArgsView args) { return vm->py_json(args[0]); }); -} \ No newline at end of file +} +} // namespace Lithium diff --git a/src/script/custom/sys.cpp b/src/script/custom/sys.cpp index 045850cf..85ee1999 100644 --- a/src/script/custom/sys.cpp +++ b/src/script/custom/sys.cpp @@ -251,7 +251,7 @@ void addSysModule(VM *vm) { DLOG_F(INFO, "Check if the current process is running as " "root"); - bool is_root = Atom::System::IsRoot(); + bool is_root = Atom::System::isRoot(); return py_var(vm, is_root); }); @@ -272,14 +272,14 @@ void addSysModule(VM *vm) { vm->bind(mod, "shutdown() -> bool", "shutdown the system", [](VM *vm, ArgsView args) { DLOG_F(INFO, "Shutdown the system"); - Atom::System::Shutdown(); + Atom::System::shutdown(); return py_var(vm, true); }); vm->bind(mod, "reboot() -> bool", "reboot the system", [](VM *vm, ArgsView args) { DLOG_F(INFO, "Reboot the system"); - Atom::System::Reboot(); + Atom::System::reboot(); return py_var(vm, true); }); @@ -290,7 +290,7 @@ void addSysModule(VM *vm) { Str &name = py_cast(vm, name_obj); bool is_duplicate = - Atom::System::CheckDuplicateProcess(name.c_str()); + Atom::System::checkDuplicateProcess(name.c_str()); if (is_duplicate) { LOG_F(ERROR, "Failed to check duplicate process: {}", is_duplicate); @@ -318,7 +318,7 @@ void addSysModule(VM *vm) { Str &name = py_cast(vm, name_obj); Atom::System::ProcessInfo info; Dict d(vm); - if (Atom::System::GetProcessInfoByName(name.c_str(), info)) { + if (Atom::System::getProcessInfoByName(name.c_str(), info)) { d.set(VAR("id"), VAR(info.processID)); d.set(VAR("parent_id"), VAR(info.parentProcessID)); d.set(VAR("priority"), VAR(info.basePriority)); @@ -335,7 +335,7 @@ void addSysModule(VM *vm) { int id = py_cast(vm, args[0]); Atom::System::ProcessInfo info; Dict d(vm); - if (Atom::System::GetProcessInfoByID(id, info)) { + if (Atom::System::getProcessInfoByID(id, info)) { d.set(VAR("id"), VAR(info.processID)); d.set(VAR("parent_id"), VAR(info.parentProcessID)); d.set(VAR("priority"), VAR(info.basePriority)); diff --git a/src/task/generator.cpp b/src/task/generator.cpp index 87dd95d4..20471b09 100644 --- a/src/task/generator.cpp +++ b/src/task/generator.cpp @@ -24,7 +24,7 @@ Description: Task Generator namespace Lithium { TaskGenerator::TaskGenerator() { - m_DeviceManager = GetPtr("lithium.device"); + m_DeviceManager = GetWeakPtr("lithium.device"); } std::shared_ptr TaskGenerator::createShared() { diff --git a/src/task/generator.hpp b/src/task/generator.hpp index 470d56aa..de350dcc 100644 --- a/src/task/generator.hpp +++ b/src/task/generator.hpp @@ -80,7 +80,7 @@ class TaskGenerator { std::mutex m_Mutex; - std::shared_ptr m_DeviceManager; + std::weak_ptr m_DeviceManager; }; } // namespace Lithium diff --git a/src/task/manager.cpp b/src/task/manager.cpp index 3d4bfd0a..82fd766d 100644 --- a/src/task/manager.cpp +++ b/src/task/manager.cpp @@ -20,12 +20,12 @@ Description: Task Manager namespace Lithium { TaskManager::TaskManager() : m_StopFlag(false) { // Load Task Component from Global Ptr Manager - m_TaskContainer = GetPtr("lithium.task.contianer"); - m_TaskPool = GetPtr("lithium.task.pool"); - m_TaskList = GetPtr("lithium.task.list"); - m_TaskGenerator = GetPtr("lithium.task.generator"); - m_TickScheduler = GetPtr("lithium.task.tick"); - m_TaskLoader = GetPtr("ltihium.task.loader"); + m_TaskContainer = GetWeakPtr("lithium.task.contianer"); + m_TaskPool = GetWeakPtr("lithium.task.pool"); + m_TaskList = GetWeakPtr("lithium.task.list"); + m_TaskGenerator = GetWeakPtr("lithium.task.generator"); + m_TickScheduler = GetWeakPtr("lithium.task.tick"); + m_TaskLoader = GetWeakPtr("ltihium.task.loader"); } TaskManager::~TaskManager() { saveTasksToJson(); } @@ -36,13 +36,13 @@ std::shared_ptr TaskManager::createShared() { bool TaskManager::addTask(const std::string name, const json ¶ms) { // Task Check Needed - m_TaskList->addOrUpdateTask(name, params); + m_TaskList.lock()->addOrUpdateTask(name, params); return true; } bool TaskManager::insertTask(const int &position, const std::string &name, const json ¶ms) { - if (m_TaskList->insertTask(name, params, position)) { + if (m_TaskList.lock()->insertTask(name, params, position)) { DLOG_F(INFO, "Insert {} task to {}", name, position); } else { } @@ -50,31 +50,31 @@ bool TaskManager::insertTask(const int &position, const std::string &name, } bool TaskManager::modifyTask(const std::string &name, const json ¶ms) { - m_TaskList->addOrUpdateTask(name, params); + m_TaskList.lock()->addOrUpdateTask(name, params); return true; } bool TaskManager::deleteTask(const std::string &name) { - m_TaskList->removeTask(name); + m_TaskList.lock()->removeTask(name); return true; } bool TaskManager::executeAllTasks() { - for (const auto &[name, params] : m_TaskList->getTasks()) { + for (const auto &[name, params] : m_TaskList.lock()->getTasks()) { DLOG_F(INFO, "Run task {}", name); std::string task_type = params["type"].get(); - if (auto task = m_TaskContainer->getTask(task_type); task.has_value()) { + if (auto task = m_TaskContainer.lock()->getTask(task_type); task.has_value()) { json t_params = params["params"]; - auto handle = m_TickScheduler->scheduleTask( + auto handle = m_TickScheduler.lock()->scheduleTask( 1, false, 1, std::chrono::milliseconds(0), std::nullopt, std::nullopt, std::nullopt, task.value()->m_function, t_params); if (params.contains("callbacks")) { std::vector callbacks = params["callbacks"]; for (auto callback : callbacks) { - auto c_task = m_TaskContainer->getTask(task_type); + auto c_task = m_TaskContainer.lock()->getTask(task_type); if (c_task.has_value()) { - m_TickScheduler->setCompletionCallback( + m_TickScheduler.lock()->setCompletionCallback( handle, [c_task]() { c_task.value()->m_function({}); }); } @@ -89,9 +89,9 @@ bool TaskManager::executeAllTasks() { } else { std::string timer_name = timer["name"]; int tick = timer["delay"]; - if (auto tt_task = m_TaskContainer->getTask(name); + if (auto tt_task = m_TaskContainer.lock()->getTask(name); tt_task.has_value()) { - m_TickScheduler->scheduleTask( + m_TickScheduler.lock()->scheduleTask( tick, false, 1, std::chrono::milliseconds(0), std::nullopt, std::nullopt, std::nullopt, tt_task.value()->m_function, timer["params"]); diff --git a/src/task/manager.hpp b/src/task/manager.hpp index 4369f928..49ecb132 100644 --- a/src/task/manager.hpp +++ b/src/task/manager.hpp @@ -145,12 +145,12 @@ class TaskManager { void loadBuiltinTask(); private: - std::shared_ptr m_TaskContainer; - std::shared_ptr m_TaskGenerator; - std::shared_ptr m_TaskList; - std::shared_ptr m_TaskLoader; - std::shared_ptr m_TaskPool; - std::shared_ptr m_TickScheduler; + std::weak_ptr m_TaskContainer; + std::weak_ptr m_TaskGenerator; + std::weak_ptr m_TaskList; + std::weak_ptr m_TaskLoader; + std::weak_ptr m_TaskPool; + std::weak_ptr m_TickScheduler; std::unique_ptr m_Timer; diff --git a/src/task/tick.cpp b/src/task/tick.cpp index d2bdc49a..34c0f154 100644 --- a/src/task/tick.cpp +++ b/src/task/tick.cpp @@ -18,7 +18,6 @@ Description: Tick Sheduler, just like Minecraft's #include "atom/server/global_ptr.hpp" #include "atom/utils/stopwatcher.hpp" - namespace Lithium { TickScheduler::TickScheduler(size_t threads) : currentTick(0), stop(false), tickLength(100) { @@ -27,7 +26,7 @@ TickScheduler::TickScheduler(size_t threads) #else schedulerThread = std::thread([this] { this->taskSchedulerLoop(); }); #endif - pool = GetPtr("lithium.task.pool"); + pool = GetWeakPtr("lithium.task.pool"); stopwatch = std::make_unique(); } @@ -121,7 +120,7 @@ void TickScheduler::triggerTasks() { while (it != tasks.end()) { auto task = *it; if (task->tick <= currentTick.load() && allDependenciesMet(task)) { - pool->enqueue([task]() { + pool.lock()->enqueue([task]() { task->func(); task->completed.store(true); if (task->onCompletion) { @@ -163,7 +162,7 @@ void TickScheduler::taskSchedulerLoop() { auto task = *it; if (task->tick <= currentTick.load() && allDependenciesMet(task)) { - pool->enqueue([this, task]() { + pool.lock()->enqueue([this, task]() { task->isRunning.store(true); task->func(); task->completed.store(true); diff --git a/src/task/tick.hpp b/src/task/tick.hpp index 6702ffb6..6ed33da5 100644 --- a/src/task/tick.hpp +++ b/src/task/tick.hpp @@ -292,7 +292,7 @@ class TickScheduler { void triggerTasks(); private: - std::shared_ptr pool; // 线程池对象 + std::weak_ptr pool; // 线程池对象 std::vector> tasks; // 所有待执行的任务 std::mutex tasksMutex; // 任务队列的互斥锁 std::condition_variable cv; // 条件变量,用于暂停和恢复任务调度器的执行 diff --git a/tests/atom/huffman.cpp b/tests/atom/huffman.cpp deleted file mode 100644 index d1ca2685..00000000 --- a/tests/atom/huffman.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include - -class HuffmanTreeTest : public ::testing::Test -{ -protected: - void SetUp() override - { - // Set up test data - frequencies = std::map{ - {'a', 5}, - {'b', 3}, - {'c', 7}, - {'d', 2}}; - expectedHuffmanCodes = std::map{ - {'a', "111"}, - {'b', "110"}, - {'c', "01"}, - {'d', "00"}}; - expectedCompressedText = "111110100100"; - expectedDecompressedText = "abcdd"; - } - - std::map frequencies; - std::map expectedHuffmanCodes; - std::string expectedCompressedText; - std::string expectedDecompressedText; -}; - -TEST_F(HuffmanTreeTest, CreateHuffmanTree) -{ - HuffmanNode *root = createHuffmanTree(frequencies); - - // Verify root node - EXPECT_EQ(root->data, '$'); - EXPECT_EQ(root->frequency, 17); - - // Verify left and right nodes - HuffmanNode *leftNode = root->left; - HuffmanNode *rightNode = root->right; - EXPECT_NE(leftNode, nullptr); - EXPECT_NE(rightNode, nullptr); - EXPECT_EQ(leftNode->data, 'c'); - EXPECT_EQ(leftNode->frequency, 7); - EXPECT_EQ(rightNode->data, 'a'); - EXPECT_EQ(rightNode->frequency, 5); -} - -TEST_F(HuffmanTreeTest, GenerateHuffmanCodes) -{ - HuffmanNode *root = createHuffmanTree(frequencies); - std::map huffmanCodes; - - generateHuffmanCodes(root, "", huffmanCodes); - - // Verify generated huffman codes - for (auto &pair : expectedHuffmanCodes) - { - EXPECT_EQ(huffmanCodes[pair.first], pair.second); - } -} - -TEST_F(HuffmanTreeTest, CompressText) -{ - HuffmanNode *root = createHuffmanTree(frequencies); - std::string text = "abcdd"; - - std::string compressedText = compressText(text, expectedHuffmanCodes); - - // Verify compressed text - EXPECT_EQ(compressedText, expectedCompressedText); -} - -TEST_F(HuffmanTreeTest, DecompressText) -{ - HuffmanNode *root = createHuffmanTree(frequencies); - std::string compressedText = expectedCompressedText; - - std::string decompressedText = decompressText(compressedText, root); - - // Verify decompressed text - EXPECT_EQ(decompressedText, expectedDecompressedText); -} \ No newline at end of file diff --git a/tests/config/configor.cpp b/tests/config/configor.cpp new file mode 100644 index 00000000..3ff7bec3 --- /dev/null +++ b/tests/config/configor.cpp @@ -0,0 +1,125 @@ +#include "config/configor.cpp" +#include + + +class ConfigManagerTest : public ::testing::Test { +protected: + void SetUp() override { + // 初始化 ConfigManager 实例 + config_manager_ = ConfigManager::createShared(); + } + + void TearDown() override { + // 清理 ConfigManager 实例 + config_manager_.reset(); + } + + std::shared_ptr config_manager_; +}; + +TEST_F(ConfigManagerTest, SetValueAndGet) { + // 设置配置值 + config_manager_->setValue("test/key1", "value1"); + config_manager_->setValue("test/key2", 42); + + // 获取配置值并验证 + auto value1 = config_manager_->getValue("test/key1"); + EXPECT_TRUE(value1.has_value()); + EXPECT_EQ(value1.value(), "value1"); + + auto value2 = config_manager_->getValue("test/key2"); + EXPECT_TRUE(value2.has_value()); + EXPECT_EQ(value2.value(), 42); +} + +TEST_F(ConfigManagerTest, DeleteValue) { + // 设置配置值 + config_manager_->setValue("test/key1", "value1"); + + // 删除配置值并验证 + EXPECT_TRUE(config_manager_->deleteValue("test/key1")); + EXPECT_FALSE(config_manager_->hasValue("test/key1")); +} + +TEST_F(ConfigManagerTest, SaveAndLoadFromFile) { + // 设置配置值 + config_manager_->setValue("test/key1", "value1"); + config_manager_->setValue("test/key2", 42); + + // 保存配置到文件 + std::string file_path = "test_config.json"; + EXPECT_TRUE(config_manager_->saveToFile(file_path)); + + // 创建新的 ConfigManager 实例并从文件加载配置 + auto new_config_manager = ConfigManager::createShared(); + EXPECT_TRUE(new_config_manager->loadFromFile(file_path)); + + // 验证新的实例中是否包含相同的配置值 + EXPECT_TRUE(new_config_manager->hasValue("test/key1")); + EXPECT_TRUE(new_config_manager->hasValue("test/key2")); + EXPECT_EQ(new_config_manager->getValue("test/key1").value(), "value1"); + EXPECT_EQ(new_config_manager->getValue("test/key2").value(), 42); +} + +TEST_F(ConfigManagerTest, TidyConfig) { + // 设置配置值 + config_manager_->setValue("test/key1", "value1"); + config_manager_->setValue("test/key2", 42); + + // 设置包含子对象的配置值 + config_manager_->setValue("test/sub/key3", "value3"); + + // 整理配置 + config_manager_->tidyConfig(); + + // 验证整理后的配置 + EXPECT_TRUE(config_manager_->hasValue("test")); + EXPECT_TRUE(config_manager_->hasValue("test/sub")); + EXPECT_TRUE(config_manager_->hasValue("test/key1")); + EXPECT_TRUE(config_manager_->hasValue("test/key2")); + EXPECT_TRUE(config_manager_->hasValue("test/sub/key3")); +} + +// 测试异常情况:尝试获取不存在的配置键时返回空的 std::optional +TEST_F(ConfigManagerTest, GetValueNonExistentKey) { + auto value = config_manager_->getValue("non_existent_key"); + EXPECT_FALSE(value.has_value()); +} + +// 测试异常情况:尝试删除不存在的配置键时返回 false +TEST_F(ConfigManagerTest, DeleteNonExistentKey) { + EXPECT_FALSE(config_manager_->deleteValue("non_existent_key")); +} + +// 测试异常情况:尝试从无效路径加载配置文件时返回 false +TEST_F(ConfigManagerTest, LoadFromInvalidFile) { + EXPECT_FALSE(config_manager_->loadFromFile("invalid_file_path.json")); +} + +// 测试边界条件:当配置文件为空时加载成功但不包含任何配置项 +TEST_F(ConfigManagerTest, LoadEmptyConfigFile) { + // 创建一个空的配置文件 + std::string file_path = "empty_config.json"; + std::ofstream ofs(file_path); + ofs.close(); + + // 加载空的配置文件 + EXPECT_FALSE(config_manager_->loadFromFile(file_path)); + + // 验证配置文件不包含任何配置项 + EXPECT_FALSE(config_manager_->hasValue("a")); +} + +// 测试边界条件:在没有配置键值对的情况下保存配置文件 +TEST_F(ConfigManagerTest, SaveEmptyConfigToFile) { + // 保存空的配置到文件 + std::string file_path = "empty_config.json"; + config_manager_->clearConfig(); + EXPECT_TRUE(config_manager_->saveToFile(file_path)); + + // 加载保存的配置文件 + EXPECT_FALSE(config_manager_->loadFromFile(file_path)); + + // 验证配置文件不包含任何配置项 + EXPECT_FALSE(config_manager_->hasValue("a")); +} \ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 4bdc9fe3..81210ef1 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -24,3 +24,6 @@ target_link_libraries(csv2json loguru) add_executable(tcp_proxy tcp_proxy.cpp) target_link_libraries(tcp_proxy loguru) +if(WIN32) +target_link_libraries(tcp_proxy ws2_32) +endif() diff --git a/tools/csv2json.cpp b/tools/csv2json.cpp index 35e66939..98c60f19 100644 --- a/tools/csv2json.cpp +++ b/tools/csv2json.cpp @@ -2,17 +2,6 @@ * csv2json.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/gui/sqmm.cpp b/tools/gui/sqmm.cpp new file mode 100644 index 00000000..550e22c8 --- /dev/null +++ b/tools/gui/sqmm.cpp @@ -0,0 +1,248 @@ +/* + * sqmm.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-7-29 + +Description: A simple GUI for SQMM calculation + +**************************************************/ + +#include + +using namespace cycfi::elements; + +#define M_PI 3.14159265358979323846 + +// Main window background color +auto constexpr bkd_color = rgba(35, 35, 37, 255); +auto background = box(bkd_color); + +auto box = draw([](context const &ctx) { + auto &c = ctx.canvas; + + c.begin_path(); + c.add_round_rect(ctx.bounds, 4); + c.fill_style(colors::gold.opacity(0.8)); + c.fill(); +}); + +auto check_number(std::string_view text) { + try { + int value = std::stoi(std::string(text)); + if (value > 0) { + return true; + } + } catch (const std::exception &e) { + } + return false; +} + +auto my_label(const std::string &text) { + return margin_right( + 10, + label(text) + .text_align(canvas::right) + .font( + font_descr{"文泉驿微米黑, \"WenQuanYi Micro Hei\""}.semi_bold()) + .font_color(colors::antique_white) + .font_size(18)); +} + +auto result_dialog_content(double A20, double B20, double a0) { + return hsize( + 300, simple_heading(margin({10, 10, 10, 10}, + vtile(htile(my_label("天空sqm:"), + my_label(std::to_string(A20)), + my_label("(mag/arcsec²)")), + htile(my_label("天空亮度:"), + my_label(std::to_string(B20)), + my_label("(nit)")), + htile(my_label("光污染等级:"), + my_label(std::to_string(a0))))), + "Result", 1.1)); +} + +auto make_result_dialog(view &_view, double A20, double B20, double a) { + auto &&on_ok = []() {}; + + auto &&on_cancel = []() { + // Do something on cancel + }; + + auto dialog = + dialog2(_view, result_dialog_content(A20, B20, a), on_ok, on_cancel); + + return dialog; +} + +auto make_app(view &view_) { + static float const grid[] = {0.32, 1.0}; + + auto my_input = [=](auto caption, auto input) { + return margin_bottom(10, hgrid(grid, my_label(caption), input)); + }; + + // This is an example on how to add an on_text callback and showing an + // error message if input validation fails: + + auto error_number_input = + message_box1(view_, "Invalid Input", icons::attention, []() {}); + + // Shared flag that tells us if we got the money! + auto got_the_money = std::make_shared(false); + + auto screen_light = input_box("must > 0"); + auto screen_exposure = input_box("must > 0"); + auto sky_exposure = input_box("must > 0"); + auto image_light = input_box("must > 0"); + auto light = input_box("must > 0"); + + screen_light.second->on_end_focus = + [input = screen_light.second.get(), &view_, + error_number_input](std::string_view text) -> bool { + if (text == "") [[likely]] { + return true; + } + if (!check_number(text)) { + open_popup(error_number_input, view_); + } + return true; + }; + + screen_exposure.second->on_end_focus = + [input = screen_exposure.second.get(), &view_, + error_number_input](std::string_view text) -> bool { + if (text == "") [[likely]] { + return true; + } + if (!check_number(text)) { + open_popup(error_number_input, view_); + } + return true; + }; + + sky_exposure.second->on_end_focus = + [input = sky_exposure.second.get(), &view_, + error_number_input](std::string_view text) -> bool { + if (text == "") [[likely]] { + return true; + } + if (!check_number(text)) { + open_popup(error_number_input, view_); + } + return true; + }; + + image_light.second->on_end_focus = + [input = image_light.second.get(), &view_, + error_number_input](std::string_view text) -> bool { + if (text == "") [[likely]] { + return true; + } + if (!check_number(text)) { + open_popup(error_number_input, view_); + } + return true; + }; + + light.second->on_end_focus = + [input = light.second.get(), &view_, + error_number_input](std::string_view text) -> bool { + if (text == "") [[likely]] { + return true; + } + if (!check_number(text)) { + open_popup(error_number_input, view_); + } + return true; + }; + + auto text_input = pane( + "Sqmm", margin({10, 5, 10, 5}, + vtile(my_input("手机屏幕亮度", screen_light.first), + my_input("屏幕曝光时间", screen_exposure.first), + my_input("天空曝光时间", sky_exposure.first), + my_input("照片亮度值", image_light.first), + my_input("亮度值", light.first)))); + + auto mbutton = share(icon_button(icons::right_circled, 1.2)); + + mbutton->on_click = [input_screen_light = screen_light.second.get(), + input_screen_exposure = screen_exposure.second.get(), + input_sky_exposure = sky_exposure.second.get(), + input_image_light = image_light.second.get(), + input_light = light.second.get(), error_number_input, + &view_](bool) mutable { + try { + auto A14 = std::stod(input_screen_light->get_text()); + auto B14 = std::stod(input_screen_exposure->get_text()); + auto A17 = std::stod(input_sky_exposure->get_text()); + auto B17 = std::stod(input_image_light->get_text()); + auto A11 = std::stod(input_light->get_text()); + + if (A14 != 0 && B14 != 0 && A17 != 0 && B17 != 0 && A11 != 0) + [[likely]] { + double A2 = 140000; + double B2 = -26.7; + double C2 = B2 + std::log(A2) / std::log(100); + double F2 = 180 / M_PI; + double D2 = std::log((std::pow(F2, 2)) * (std::pow(3600, 2)) * 4) / + std::log(100) + + C2; + double C17 = (B14 / A14) / (B17 / A17); + double B20 = A11 / C17; + double A20 = std::log(1 / B20) / std::log(100) + D2; + int a0 = 0; + if (A20 <= 18.38) { + a0 = 8; + } else if (18.38 < A20 && A20 <= 18.94) { + a0 = 7; + } else if (18.94 < A20 && A20 <= 19.5) { + a0 = 6; + } else if (19.5 < A20 && A20 <= 20.49) { + a0 = 5; + } else if (20.49 < A20 && A20 <= 21.69) { + a0 = 4; + } else if (21.69 < A20 && A20 <= 21.89) { + a0 = 3; + } else if (21.89 < A20 && A20 <= 21.99) { + a0 = 2; + } else if (21.99 <= A20) { + a0 = 1; + } + open_popup(make_result_dialog(view_, A20, B20, a0), view_); + } else [[unlikely]] { + open_popup(error_number_input, view_); + } + } catch (const std::exception &e) { + open_popup(error_number_input, view_); + } + return true; + }; + + return margin({10, 0, 10, 10}, vtile(text_input, hold(mbutton))); +} + +auto make_elements(view &view_) { + return max_size({1280, 640}, + margin({20, 10, 20, 10}, + htile(margin({20, 20, 20, 20}, make_app(view_))))); +} + +int main(int argc, char *argv[]) { + app _app("Sqmm Calculator"); + window _win(_app.name()); + _win.on_close = [&_app]() { _app.stop(); }; + + view view_(_win); + + view_.content(make_elements(view_), background); + + _app.run(); + return 0; +} diff --git a/tools/ini2json.cpp b/tools/ini2json.cpp index ca56656e..7caed6a8 100644 --- a/tools/ini2json.cpp +++ b/tools/ini2json.cpp @@ -2,17 +2,6 @@ * ini2json.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/json2ini.cpp b/tools/json2ini.cpp index e5b1e4eb..a60fb417 100644 --- a/tools/json2ini.cpp +++ b/tools/json2ini.cpp @@ -2,17 +2,6 @@ * json2ini.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/json2toml.cpp b/tools/json2toml.cpp index 75df68ba..ee89581d 100644 --- a/tools/json2toml.cpp +++ b/tools/json2toml.cpp @@ -2,17 +2,6 @@ * json2toml.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/json2xml.cpp b/tools/json2xml.cpp index ee14df6d..cba8d674 100644 --- a/tools/json2xml.cpp +++ b/tools/json2xml.cpp @@ -2,17 +2,6 @@ * json2xml.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/toml2json.cpp b/tools/toml2json.cpp index 84ff8b5e..c769ceab 100644 --- a/tools/toml2json.cpp +++ b/tools/toml2json.cpp @@ -2,17 +2,6 @@ * toml2json.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* diff --git a/tools/xml2json.cpp b/tools/xml2json.cpp index b3b7908b..538632c6 100644 --- a/tools/xml2json.cpp +++ b/tools/xml2json.cpp @@ -2,17 +2,6 @@ * xml2json.cpp * * Copyright (C) 2023-2024 Max Qian - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ /************************************************* From fd4f1ef8d200c1d3fc1bedff2bce28806bc4881b Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 13 Apr 2024 06:37:38 +0800 Subject: [PATCH 09/28] build bug fixed --- src/LithiumApp.cpp | 10 +-- src/atom/log/loguru.cpp | 160 ++++++++++++++++++++++------------- src/atom/type/CMakeLists.txt | 1 - src/atom/web/time.cpp | 2 +- src/config/configor.cpp | 12 +-- src/config/configor.hpp | 28 ++++-- src/script/custom/config.cpp | 86 +++++++------------ src/script/custom/sys.cpp | 14 --- src/task/tick.cpp | 4 +- 9 files changed, 164 insertions(+), 153 deletions(-) diff --git a/src/LithiumApp.cpp b/src/LithiumApp.cpp index 3ae538cf..7d2ebc35 100644 --- a/src/LithiumApp.cpp +++ b/src/LithiumApp.cpp @@ -31,9 +31,9 @@ Description: Lithium App Enter #include "atom/error/error_stack.hpp" #include "atom/log/loguru.hpp" +#include "atom/server/global_ptr.hpp" #include "atom/system/process.hpp" #include "atom/utils/time.hpp" -#include "atom/server/global_ptr.hpp" #include "utils/marco.hpp" #include "magic_enum/magic_enum.hpp" @@ -178,7 +178,7 @@ void InitLithiumApp(int argc, char **argv) { AddPtr("lithium.utils.env", Atom::Utils::Env::createShared(argc, argv)); - // TODO: Addons path need to be configurable + // TODO: Addons path need to be configurable AddPtr("lithium.addon.loader", ModuleLoader::createShared("./modules")); AddPtr("lithium.addon.addon", AddonManager::createShared()); AddPtr("lithium.addon.manager", ComponentManager::createShared()); @@ -249,9 +249,9 @@ json LithiumApp::GetConfig(const json ¶ms) { CHECK_PARAM("key"); std::string key_path = params["key"].get(); json res; - if (json value = m_ConfigManager.lock()->getValue(key_path); - !value.is_null()) { - return createSuccessResponse(__func__, value); + if (auto value = m_ConfigManager.lock()->getValue(key_path); + value.has_value()) { + return createSuccessResponse(__func__, value.value()); } return createErrorResponse(__func__, json(), std::format("Key {} not found", key_path)); diff --git a/src/atom/log/loguru.cpp b/src/atom/log/loguru.cpp index c285e7a6..ba953a58 100644 --- a/src/atom/log/loguru.cpp +++ b/src/atom/log/loguru.cpp @@ -68,6 +68,8 @@ #include // PATH_MAX #elif !defined(_WIN32) #include // PATH_MAX +#elif _WIN32 +#include #endif #ifndef PATH_MAX @@ -84,7 +86,7 @@ #define LOGURU_PTHREADS 0 #define LOGURU_WINTHREADS 1 #ifndef LOGURU_STACKTRACES -#define LOGURU_STACKTRACES 0 +#define LOGURU_STACKTRACES 1 #endif #else #define LOGURU_PTHREADS 1 @@ -104,13 +106,16 @@ #ifdef _WIN32 #include #include -#pragma comment(lib, "Dbghelp.lib") +#include +#ifndef __MINGW64__ +#pragma comment(lib, "DbgHelp.lib") +#endif #else -#include -#include -#include +#include // for __cxa_demangle +#include // for dladdr +#include // for backtrace #endif -#endif // LOGURU_STACKTRACES +#endif // LOGURU_STACKTRACES #if LOGURU_PTHREADS #include @@ -137,8 +142,11 @@ #define _WIN32_WINNT 0x0502 #endif #define WIN32_LEAN_AND_MEAN -#include -#include +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#include #endif #ifndef LOGURU_PTLS_NAMES @@ -782,13 +790,27 @@ void suggest_log_path(const char* prefix, char* buff, } #ifdef _WIN32 - strncat_s(buff, buff_size - strlen(buff) - 1, s_argv0_filename.c_str(), - buff_size - strlen(buff) - 1); - strncat_s(buff, buff_size - strlen(buff) - 1, "/", - buff_size - strlen(buff) - 1); - write_date_time(buff + strlen(buff), buff_size - strlen(buff)); - strncat_s(buff, buff_size - strlen(buff) - 1, ".log", - buff_size - strlen(buff) - 1); + size_t buff_len = strlen(buff); + size_t remaining_space = buff_size - buff_len - 1; + if (remaining_space > 0) { + size_t filename_len = s_argv0_filename.length(); + size_t copy_len = std::min(filename_len, remaining_space); + strncat_s(buff + buff_len, remaining_space, s_argv0_filename.c_str(), + copy_len); + remaining_space = buff_size - strlen(buff) - 1; + buff_len = strlen(buff); + if (remaining_space > 0) { + strncat_s(buff + buff_len, remaining_space, "/", 1); + remaining_space = buff_size - strlen(buff) - 1; + buff_len = strlen(buff); + } + write_date_time(buff + buff_len, remaining_space); + remaining_space = buff_size - strlen(buff) - 1; + buff_len = strlen(buff); + if (remaining_space > 0) { + strncat_s(buff + buff_len, remaining_space, ".log", 4); + } + } #else strncat(buff, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); strncat(buff, "/", buff_size - strlen(buff) - 1); @@ -1067,8 +1089,12 @@ void make_pthread_key_name() { #if LOGURU_WINTHREADS // Where we store the custom thread name set by `set_thread_name` char* thread_name_buffer() { - thread_local static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { +#ifdef _WIN32 + thread_local static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = {0}; +#else + __declspec(thread) static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { 0}; +#endif return &thread_name[0]; } #endif // LOGURU_WINTHREADS @@ -1161,8 +1187,23 @@ void get_thread_name(char* buffer, unsigned long long length, #if LOGURU_STACKTRACES Text demangle(const char* name) { int status = -1; - char* demangled = abi::__cxa_demangle(name, 0, 0, &status); - Text result{status == 0 ? demangled : STRDUP(name)}; +#ifdef _WIN32 + DWORD length = 512; + char* demangled = (char*)malloc(length * sizeof(char)); + if (demangled) { + if (UnDecorateSymbolName(name, demangled, length, UNDNAME_COMPLETE) != + 0) { + status = 0; + } + } +#else + char* demangled = abi::__cxa_demangle(name, nullptr, nullptr, &status); +#endif + + Text result{status == 0 && demangled ? demangled : STRDUP(name)}; +#ifdef _WIN32 + free(demangled); +#endif return result; } @@ -1221,9 +1262,10 @@ std::string prettify_stacktrace(const std::string& input) { } std::string stacktrace_as_stdstring(int skip) { + // From https://gist.github.com/fmela/591333 void* callstack[128]; const auto max_frames = sizeof(callstack) / sizeof(callstack[0]); - int num_frames; + int num_frames = 0; #ifdef _WIN32 num_frames = CaptureStackBackTrace(0, max_frames, callstack, nullptr); @@ -1231,67 +1273,63 @@ std::string stacktrace_as_stdstring(int skip) { num_frames = backtrace(callstack, max_frames); #endif - std::vector symbols(num_frames); + char** symbols = nullptr; #ifdef _WIN32 SYMBOL_INFO* symbol_info = - (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1); + (SYMBOL_INFO*)malloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char)); symbol_info->MaxNameLen = 255; symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO); -#endif - std::ostringstream result; - for (int i = num_frames - 1; i >= skip; --i) { - char buf[1024]; -#ifdef _WIN32 - if (SymFromAddr(GetCurrentProcess(), (DWORD64)(callstack[i]), 0, - symbol_info)) { - snprintf(buf, sizeof(buf), "%-3d %p %s + %zd\n", i - skip, - callstack[i], symbol_info->Name, - (char*)callstack[i] - (char*)symbol_info->Address); + symbols = (char**)malloc(num_frames * sizeof(char*)); + for (int i = 0; i < num_frames; ++i) { + symbols[i] = (char*)malloc(256 * sizeof(char)); + symbol_info->Name[0] = '\0'; + symbol_info->Address = (DWORD64)callstack[i]; + DWORD64 displacement = 0; + if (SymFromAddr(GetCurrentProcess(), (DWORD64)callstack[i], + &displacement, symbol_info)) { + StringCchPrintfA(symbols[i], 256, "%s + 0x%I64X", symbol_info->Name, + displacement); } else { - snprintf(buf, sizeof(buf), "%-3d %p\n", i - skip, callstack[i]); + StringCchPrintfA(symbols[i], 256, "0x%p", callstack[i]); } + } #else - Dl_info info; - if (dladdr(callstack[i], &info) && info.dli_sname) { - char* demangled = nullptr; - int status = -1; - if (info.dli_sname[0] == '_') { - demangled = abi::__cxa_demangle(info.dli_sname, nullptr, - nullptr, &status); - } - snprintf(buf, sizeof(buf), "%-3d %p %s + %zd\n", i - skip, - callstack[i], - status == 0 ? demangled - : info.dli_sname == nullptr ? symbols[i].c_str() - : info.dli_sname, - (char*)callstack[i] - (char*)info.dli_saddr); - if (demangled) { - free(demangled); - } - } else { - snprintf(buf, sizeof(buf), "%-3d %p %s\n", i - skip, callstack[i], - symbols[i].c_str()); - } + symbols = backtrace_symbols(callstack, num_frames); #endif - result << buf; - } + std::string result; + // Print stack traces so the most relevant ones are written last + // Rationale: + // http://yellerapp.com/posts/2015-01-22-upside-down-stacktraces.html + for (int i = num_frames - 1; i >= skip; --i) { + char buf[1024]; #ifdef _WIN32 - free(symbol_info); + snprintf(buf, sizeof(buf), "%-3d %p %s\n", i - skip, callstack[i], + symbols[i]); +#else + snprintf(buf, sizeof(buf), "%-3d %*p %s\n", i - skip, + int(2 + sizeof(void*) * 2), callstack[i], symbols[i]); #endif + result += buf; + } if (num_frames == max_frames) { - result << "[truncated]\n"; + result = "[truncated]\n" + result; } - std::string stacktrace = result.str(); - if (!stacktrace.empty() && stacktrace.back() == '\n') { - stacktrace.pop_back(); + if (!result.empty() && result[result.size() - 1] == '\n') { + result.resize(result.size() - 1); } - return stacktrace; +#ifdef _WIN32 + free(symbol_info); +#else + free(symbols); +#endif + + return prettify_stacktrace(result); } #else // LOGURU_STACKTRACES diff --git a/src/atom/type/CMakeLists.txt b/src/atom/type/CMakeLists.txt index 04bf09e7..05b0392b 100644 --- a/src/atom/type/CMakeLists.txt +++ b/src/atom/type/CMakeLists.txt @@ -19,7 +19,6 @@ set(${PROJECT_NAME}_SOURCES # Headers set(${PROJECT_NAME}_HEADERS args.hpp - autotype.hpp ini_impl.hpp ini.hpp json.hpp diff --git a/src/atom/web/time.cpp b/src/atom/web/time.cpp index e2793474..9c47319e 100644 --- a/src/atom/web/time.cpp +++ b/src/atom/web/time.cpp @@ -22,9 +22,9 @@ Description: Time #include #ifdef _WIN32 // Windows +#include #include #include -#include #include #else // Linux #include diff --git a/src/config/configor.cpp b/src/config/configor.cpp index 737ec77e..b1c5ddc4 100644 --- a/src/config/configor.cpp +++ b/src/config/configor.cpp @@ -59,7 +59,7 @@ bool ConfigManager::loadFromFile(const fs::path& path) { try { std::ifstream ifs(path); if (!ifs || ifs.peek() == std::ifstream::traits_type::eof()) { - LOG_F(ERROR, "Failed to open file: {}", path); + LOG_F(ERROR, "Failed to open file: {}", path.string()); return false; } json j = json::parse(ifs); @@ -70,10 +70,10 @@ bool ConfigManager::loadFromFile(const fs::path& path) { mergeConfig(j); return true; } catch (const json::exception& e) { - LOG_F(ERROR, "Failed to parse file: {}, error message: {}", path, + LOG_F(ERROR, "Failed to parse file: {}, error message: {}", path.string(), e.what()); } catch (const std::exception& e) { - LOG_F(ERROR, "Failed to load config file: {}, error message: {}", path, + LOG_F(ERROR, "Failed to load config file: {}, error message: {}", path.string(), e.what()); } return false; @@ -92,7 +92,7 @@ bool ConfigManager::loadFromDir(const fs::path& dir_path, bool recursive) { } } catch (const std::exception& e) { LOG_F(ERROR, "Failed to load config file from: {}, error message: {}", - dir_path, e.what()); + dir_path.string(), e.what()); return false; } return true; @@ -171,7 +171,7 @@ bool ConfigManager::saveToFile(const fs::path& file_path) const { std::unique_lock lock(m_impl->rw_mutex_); std::ofstream ofs(file_path); if (!ofs) { - LOG_F(ERROR, "Failed to open file: {}", file_path); + LOG_F(ERROR, "Failed to open file: {}", file_path.string()); return false; } try { @@ -180,7 +180,7 @@ bool ConfigManager::saveToFile(const fs::path& file_path) const { return true; } catch (const std::exception& e) { LOG_F(ERROR, "Failed to save config to file: {}, error message: {}", - file_path, e.what()); + file_path.string(), e.what()); return false; } } diff --git a/src/config/configor.hpp b/src/config/configor.hpp index 52a281a7..8c7b529f 100644 --- a/src/config/configor.hpp +++ b/src/config/configor.hpp @@ -15,9 +15,9 @@ Description: Configor #ifndef LITHIUM_CONFIG_CONFIGOR_HPP #define LITHIUM_CONFIG_CONFIGOR_HPP +#include #include #include -#include namespace fs = std::filesystem; #include "error/error_code.hpp" @@ -25,25 +25,39 @@ namespace fs = std::filesystem; #include "atom/type/json.hpp" using json = nlohmann::json; -#define GetIntConfig(path) \ - GetPtr("lithium.config").value()->getValue(path).get() +#define GetIntConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() -#define GetFloatConfig(path) \ - GetPtr("lithium.config").value()->getValue(path).get() +#define GetFloatConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() -#define GetBoolConfig(path) \ - GetPtr("lithium.config").value()->getValue(path).get() +#define GetBoolConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() #define GetDoubleConfig(path) \ GetPtr("lithium.config") \ .value() \ ->getValue(path) \ + .value() \ .get() #define GetStringConfig(path) \ GetPtr("lithium.config") \ .value() \ ->getValue(path) \ + .value() \ .get() namespace Lithium { diff --git a/src/script/custom/config.cpp b/src/script/custom/config.cpp index df4a2e0e..086b9c29 100644 --- a/src/script/custom/config.cpp +++ b/src/script/custom/config.cpp @@ -24,6 +24,28 @@ using namespace pkpy; using json = nlohmann::json; namespace Lithium { +template +pkpy::PyObject *get_config(pkpy::VM *vm, pkpy::Str &key, + const std::string &log_type) { + json value = GetPtr("lithium.config") + .value() + ->getValue(key.str()) + .value(); + if (value.is_null() || value.type_name() != typeid(T).name()) { + LOG_F(ERROR, "Failed to get config value: {}", key.str()); + return pkpy::py_var(vm, T()); + } + DLOG_F(INFO, "Config value: {}", value.get()); + return pkpy::py_var(vm, value.get()); +} + +template +pkpy::PyObject *set_config(pkpy::VM *vm, pkpy::Str &key, T value) { + return pkpy::py_var(vm, GetPtr("lithium.config") + .value() + ->setValue(key.str(), value)); +} + void addConfigModule(VM *vm) { DLOG_F(INFO, "Adding config module"); PyObject *mod = vm->new_module("li_config"); @@ -33,16 +55,7 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config") - .value() - ->getValue(key.str()) - .value(); - if (value.is_null() || !value.is_string()) { - LOG_F(ERROR, "Failed to get config value: {}", key.str()); - return pkpy::py_var(vm, ""); - } - DLOG_F(INFO, "Config value: {}", value.get()); - return pkpy::py_var(vm, value.get()); + return get_config(vm, key, "str"); }); vm->bind(mod, "get_int_config(key : str) -> int", @@ -50,16 +63,7 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config") - .value() - ->getValue(key.str()) - .value(); - if (value.is_null() || !value.is_number()) { - LOG_F(ERROR, "Failed to get config value: {}", key.str()); - return pkpy::py_var(vm, 0); - } - DLOG_F(INFO, "Config value: {}", value.get()); - return pkpy::py_var(vm, value.get()); + return get_config(vm, key, "int"); }); vm->bind(mod, "get_float_config(key : str) -> float", @@ -67,16 +71,7 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config") - .value() - ->getValue(key.str()) - .value(); - if (value.is_null() || !value.is_number()) { - LOG_F(ERROR, "Failed to get config value: {}", key.str()); - return pkpy::py_var(vm, 0.0f); - } - DLOG_F(INFO, "Config value: {}", value.get()); - return pkpy::py_var(vm, value.get()); + return get_config(vm, key, "float"); }); vm->bind(mod, "get_bool_config(key : str) -> bool", @@ -84,16 +79,7 @@ void addConfigModule(VM *vm) { [](pkpy::VM *vm, pkpy::ArgsView args) { pkpy::PyObject *key_obj = args[0]; pkpy::Str &key = pkpy::py_cast(vm, key_obj); - json value = GetPtr("lithium.config") - .value() - ->getValue(key.str()) - .value(); - if (value.is_null() || !value.is_boolean()) { - LOG_F(ERROR, "Failed to get config value: {}", key.str()); - return pkpy::py_var(vm, false); - } - DLOG_F(INFO, "Config value: {}", value.get()); - return pkpy::py_var(vm, value.get()); + return get_config(vm, key, "bool"); }); vm->bind(mod, @@ -104,10 +90,7 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; pkpy::Str &value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var( - vm, GetPtr("lithium.config") - .value() - ->setValue(key.str(), value)); + return set_config(vm, key, value.str()); }); vm->bind(mod, @@ -118,10 +101,7 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; int value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var( - vm, GetPtr("lithium.config") - .value() - ->setValue(key.str(), value)); + return set_config(vm, key, value); }); vm->bind(mod, @@ -132,10 +112,7 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; float value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var( - vm, GetPtr("lithium.config") - .value() - ->setValue(key.str(), value)); + return set_config(vm, key, value); }); vm->bind(mod, @@ -146,10 +123,7 @@ void addConfigModule(VM *vm) { pkpy::Str &key = pkpy::py_cast(vm, key_obj); pkpy::PyObject *value_obj = args[1]; bool value = pkpy::py_cast(vm, value_obj); - return pkpy::py_var( - vm, GetPtr("lithium.config") - .value() - ->setValue(key.str(), value)); + return set_config(vm, key, value); }); vm->bind(mod, "delete_config(key : str) -> bool", diff --git a/src/script/custom/sys.cpp b/src/script/custom/sys.cpp index 85ee1999..d334e46e 100644 --- a/src/script/custom/sys.cpp +++ b/src/script/custom/sys.cpp @@ -255,20 +255,6 @@ void addSysModule(VM *vm) { return py_var(vm, is_root); }); - vm->bind(mod, "get_current_username() -> str", - "get current username, and return a string value", - [](VM *vm, ArgsView args) { - DLOG_F(INFO, "Get current username"); - std::string current_username = - Atom::System::GetCurrentUsername(); - if (current_username.empty()) { - LOG_F(ERROR, "Failed to get current username: {}", - current_username); - } - DLOG_F(INFO, "Current username: {}", current_username); - return py_var(vm, current_username); - }); - vm->bind(mod, "shutdown() -> bool", "shutdown the system", [](VM *vm, ArgsView args) { DLOG_F(INFO, "Shutdown the system"); diff --git a/src/task/tick.cpp b/src/task/tick.cpp index 34c0f154..1e6b87fb 100644 --- a/src/task/tick.cpp +++ b/src/task/tick.cpp @@ -138,7 +138,7 @@ void TickScheduler::triggerTasks() { void TickScheduler::taskSchedulerLoop() { while (!stop.load()) { // 记录每个Tick需要的时间 - DLOG_F(INFO, "Tick %llu", currentTick.load()); + DLOG_F(INFO, "Tick {}", currentTick.load()); stopwatch->start(); if (manualMode.load()) { std::this_thread::sleep_for(std::chrono::milliseconds( @@ -183,7 +183,7 @@ void TickScheduler::taskSchedulerLoop() { std::chrono::milliseconds(tickLength.load())); // Simulate a tick stopwatch->stop(); stopwatch->reset(); - DLOG_F(INFO, "Tick %llu took %f ms", currentTick.load(), + DLOG_F(INFO, "Tick {} took {} ms", currentTick.load(), stopwatch->elapsedMilliseconds()); currentTick++; } From c3dd70a9ddbc355a578850168ac0e2d0eea2cd46 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 13 Apr 2024 13:53:21 +0800 Subject: [PATCH 10/28] update --- src/atom/experiment/callable.hpp | 28 +- src/atom/experiment/invoke.hpp | 72 ++- websrc/cobalt-web/package-lock.json | 67 +++ websrc/cobalt-web/package.json | 3 + websrc/cobalt-web/server/http.js | 128 +++++ websrc/cobalt-web/src/constants/net-config.ts | 2 +- websrc/cobalt-web/src/pages/connect.tsx | 39 +- .../src/pages/connection/create_config.tsx | 139 +++++ .../cobalt-web/src/pages/connection/index.tsx | 2 +- .../src/pages/connection/profile.tsx | 8 +- websrc/cobalt-web/src/pages/device/camera.tsx | 57 +- websrc/cobalt-web/src/pages/device/guider.tsx | 5 +- websrc/cobalt-web/src/pages/device/index.tsx | 76 ++- websrc/cobalt-web/src/pages/device/solver.tsx | 195 +++++++ .../cobalt-web/src/pages/device/telescope.tsx | 512 ++++++++++-------- websrc/cobalt-web/src/routes/root.tsx | 14 +- 16 files changed, 1014 insertions(+), 333 deletions(-) create mode 100644 websrc/cobalt-web/server/http.js create mode 100644 websrc/cobalt-web/src/pages/connection/create_config.tsx create mode 100644 websrc/cobalt-web/src/pages/device/solver.tsx diff --git a/src/atom/experiment/callable.hpp b/src/atom/experiment/callable.hpp index 059c3b59..f67c5519 100644 --- a/src/atom/experiment/callable.hpp +++ b/src/atom/experiment/callable.hpp @@ -16,12 +16,14 @@ Description: make a callabel object #define ATOM_EXPERIMENT_CALLABLE_HPP #include +#include #include +#include template struct Constructor { template - std::shared_ptr operator()(Inner &&...inner) const { + auto operator()(Inner &&...inner) const -> std::shared_ptr { return std::make_shared(std::forward(inner)...); } }; @@ -33,9 +35,8 @@ struct Const_Caller { : m_func(t_func) {} template - constexpr Ret operator()(const Class &o, Inner &&...inner) const - noexcept(noexcept((std::declval().* - m_func)(std::declval()...))) { + constexpr auto operator()(const Class &o, Inner &&...inner) const + noexcept(noexcept((o.*m_func)(std::forward(inner)...))) -> Ret { return (o.*m_func)(std::forward(inner)...); } @@ -48,9 +49,9 @@ struct Fun_Caller { : m_func(t_func) {} template - constexpr Ret operator()(Inner &&...inner) const - noexcept(noexcept(m_func(std::declval()...))) { - return (m_func)(std::forward(inner)...); + constexpr auto operator()(Inner &&...inner) const + noexcept(noexcept(m_func(std::forward(inner)...))) -> Ret { + return m_func(std::forward(inner)...); } Ret (*m_func)(Param...); @@ -62,9 +63,8 @@ struct Caller { : m_func(t_func) {} template - constexpr Ret operator()(Class &o, Inner &&...inner) const - noexcept(noexcept((std::declval().* - m_func)(std::declval()...))) { + constexpr auto operator()(Class &o, Inner &&...inner) const + noexcept(noexcept((o.*m_func)(std::forward(inner)...))) -> Ret { return (o.*m_func)(std::forward(inner)...); } @@ -72,11 +72,11 @@ struct Caller { }; template -struct Arity - : std::integral_constant>> {}; +struct Arity : std::integral_constant>::value> {}; template -struct Function_Signature {}; +struct Function_Signature; template struct Function_Signature { @@ -98,4 +98,4 @@ struct Callable_Traits { decltype(&std::remove_reference_t::operator())>::Return_Type; }; -#endif +#endif // ATOM_EXPERIMENT_CALLABLE_HPP \ No newline at end of file diff --git a/src/atom/experiment/invoke.hpp b/src/atom/experiment/invoke.hpp index f7a39a7f..83a938f0 100644 --- a/src/atom/experiment/invoke.hpp +++ b/src/atom/experiment/invoke.hpp @@ -21,18 +21,17 @@ Description: An implementation of invoke function. Support C++11 and C++17. #include #include - #if __cplusplus >= 201703L #include +#include template concept Invocable = std::is_invocable_v, std::decay_t...>; template + requires Invocable auto delay_invoke(F &&f, Args &&...args) { - static_assert(Invocable, "F must be callable with Args..."); - return [f = std::forward(f), args = std::make_tuple(std::forward(args)...)]() mutable { return std::apply(std::move(f), std::move(args)); @@ -40,8 +39,8 @@ auto delay_invoke(F &&f, Args &&...args) { } template -std::invoke_result_t, std::decay_t...> safe_call( - Func &&func, Args &&...args) { + requires Invocable +auto safe_call(Func &&func, Args &&...args) { try { return std::invoke(std::forward(func), std::forward(args)...); @@ -56,21 +55,28 @@ std::invoke_result_t, std::decay_t...> safe_call( } } -template -auto safe_try_catch(Func &&func, Args &&...args) { +template + requires std::is_invocable_v, std::decay_t...> +auto safe_try_catch(F &&func, Args &&...args) { + using ReturnType = + std::invoke_result_t, std::decay_t...>; + using ResultType = std::variant; + try { - return std::invoke(std::forward(func), - std::forward(args)...); + if constexpr (std::is_same_v) { + std::invoke(std::forward(func), std::forward(args)...); + return ResultType{}; // Empty variant for void functions + } else { + return ResultType{std::invoke(std::forward(func), + std::forward(args)...)}; + } } catch (...) { - if constexpr (std::is_void_v, std::decay_t...>>) { - std::rethrow_exception(std::current_exception()); - } else - return std::make_tuple(std::current_exception()); + return ResultType{std::current_exception()}; } } template + requires Invocable auto safe_try_catch_or_default( Func &&func, std::invoke_result_t, std::decay_t...> @@ -122,6 +128,44 @@ T delay_invoke(F &&f, Args &&...args) { return DelayInvoke(std::forward(f), std::forward(args)...)(); } + +template +auto safe_try_catch(Func &&func, Args &&...args) -> + typename std::enable_if< + !std::is_void >::value, + std::tuple::type, + std::exception_ptr> >::type { + using ReturnType = typename std::result_of::type; + try { + return std::make_tuple( + std::forward(func)(std::forward(args)...), nullptr); + } catch (...) { + return std::make_tuple(ReturnType(), std::current_exception()); + } +} + +template +auto safe_try_catch(Func &&func, Args &&...args) -> + typename std::enable_if >::value, + std::tuple >::type { + try { + std::forward(func)(std::forward(args)...); + return std::make_tuple(nullptr); + } catch (...) { + return std::make_tuple(std::current_exception()); + } +} + +template +auto safe_try_catch_or_default( + Func &&func, typename std::result_of::type default_value, + Args &&...args) -> typename std::result_of::type { + try { + return std::forward(func)(std::forward(args)...); + } catch (...) { + return default_value; + } +} #endif #endif \ No newline at end of file diff --git a/websrc/cobalt-web/package-lock.json b/websrc/cobalt-web/package-lock.json index 6796abc7..ac3a8d1e 100644 --- a/websrc/cobalt-web/package-lock.json +++ b/websrc/cobalt-web/package-lock.json @@ -35,11 +35,14 @@ "react-i18next": "^14.0.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", + "react-scroll": "^1.9.0", + "react-smooth-scrollbar": "^8.0.6", "react-spinners": "^0.13.8", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", "react-tsparticles": "^2.12.2", "redux": "^4.2.1", + "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", "ts-essentials": "^9.4.1", @@ -2122,6 +2125,17 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4201,6 +4215,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5067,6 +5086,29 @@ "react-dom": ">=16.8" } }, + "node_modules/react-scroll": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.9.0.tgz", + "integrity": "sha512-mamNcaX9Ng+JeSbBu97nWwRhYvL2oba+xR2GxvyXsbDeGP+gkYIKZ+aDMMj/n20TbV9SCWm/H7nyuNTSiXA6yA==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-smooth-scrollbar": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/react-smooth-scrollbar/-/react-smooth-scrollbar-8.0.6.tgz", + "integrity": "sha512-yWiIC4L8DwfIRkLL+PdXq5rysEm6trxHzRk1Rx82bzuu2aWDcHhT+l1vXH/73Re/zHmGjBgrxts/wIrwC6yYJA==", + "peerDependencies": { + "prop-types": "*", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "smooth-scrollbar": "^8.0.0" + } + }, "node_modules/react-spinners": { "version": "0.13.8", "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", @@ -5478,6 +5520,31 @@ "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==" }, + "node_modules/smooth-scrollbar": { + "version": "8.8.4", + "resolved": "https://registry.npmjs.org/smooth-scrollbar/-/smooth-scrollbar-8.8.4.tgz", + "integrity": "sha512-Wn2Q/iE+PE1ef4EfhFMhgaIMfSrjJl2LalRu0hBWSrw5nZKGsUIjWFWHnLB/Lpx7N+a1pJH6+wkQzBr+5nWPUg==", + "peer": true, + "dependencies": { + "core-js": "^3.6.4", + "tslib": "^1.10.0" + } + }, + "node_modules/smooth-scrollbar-react": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/smooth-scrollbar-react/-/smooth-scrollbar-react-2.4.1.tgz", + "integrity": "sha512-9UuVZtQO1V2oeWb1n13ZgXcZ0nM79Tqtgov/8xUeZUWicTIg8xO+tHzhfBrE/3DlvGEQ+keFDX96UGTzICoNSg==", + "peerDependencies": { + "react": ">=16.8", + "smooth-scrollbar": "^8.0.0" + } + }, + "node_modules/smooth-scrollbar/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", diff --git a/websrc/cobalt-web/package.json b/websrc/cobalt-web/package.json index 7fa5d2c3..c61e7084 100644 --- a/websrc/cobalt-web/package.json +++ b/websrc/cobalt-web/package.json @@ -37,11 +37,14 @@ "react-i18next": "^14.0.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", + "react-scroll": "^1.9.0", + "react-smooth-scrollbar": "^8.0.6", "react-spinners": "^0.13.8", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", "react-tsparticles": "^2.12.2", "redux": "^4.2.1", + "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", "ts-essentials": "^9.4.1", diff --git a/websrc/cobalt-web/server/http.js b/websrc/cobalt-web/server/http.js new file mode 100644 index 00000000..0c608cf0 --- /dev/null +++ b/websrc/cobalt-web/server/http.js @@ -0,0 +1,128 @@ +import { createServer } from "http"; +import { parse } from "url"; + +// 创建 HTTP 服务器 +const server = createServer((req, res) => { + // 解析请求 URL + const parsedUrl = parse(req.url, true); + + // 获取请求路径 + const path = parsedUrl.pathname; + + // 获取请求方法 + const method = req.method; + + // 设置响应头 + res.setHeader("Content-Type", "application/json"); + + // 处理不同的接口 + if (path === "/GlobalParameter/" && method === "GET") { + // 处理 /api/data GET 请求 + const responseData = { + message: "Hello, this is your data!", + data: { + meridian_flip: { + before_meridian: 2, + after_meridian: 2, + recenter_after_flip: true, + autofocus_after_flip: false, + settle_time_after: 30, + }, + guider_start_guide_settle: { + time: 30, + timeout: 300, + pixels: 1.5, + }, + guider_dither_settle: { + time: 5, + timeout: 30, + pixels: 1.5, + }, + filter_setting: { + filter_number: 8, + filter_info: [ + { + filter_name: "filter1", + focus_offset: 0, + af_exposure_time: 1, + }, + { + filter_name: "filter2", + focus_offset: 0, + af_exposure_time: 1, + }, + ], + }, + autofocus: { + use_filter_offset: true, + step_size: 50, + initial_steps: 5, + default_exposure_time: 1, + retry_times: 1, + each_step_exposure: 1, + af_after_filter_change: false, + af_offset_base_filter_slot: 0, + }, + plate_solve: { + use: "astap", + exposure_time: 2, + use_filter: "Current", + downsample: 4, + tolerance: 100, + }, + telescope_info: { + name: "", + aperture: 80, + focal_length: 480, + guider_aperture: 60, + guider_focal_length: 240, + }, + info_get: { + camera: false, + guider_camera: false, + }, + camera_info: { + CCD_MAX_X: 0, + CCD_MAX_Y: 0, + CCD_PIXEL_SIZE: 0, + }, + guider_camera_info: { + CCD_MAX_X: 0, + CCD_MAX_Y: 0, + CCD_PIXEL_SIZE: 0, + }, + dither: { + amount: 2, + ra_only: false, + }, + }, + }; + res.statusCode = 200; + res.end(JSON.stringify(responseData)); + } else if (path === "/api/postData" && method === "POST") { + // 处理 /api/postData POST 请求 + let body = ""; + req.on("data", (chunk) => { + body += chunk.toString(); + }); + req.on("end", () => { + const postData = JSON.parse(body); + const responseData = { + message: "Data received successfully!", + receivedData: postData, + }; + res.statusCode = 200; + res.end(JSON.stringify(responseData)); + }); + } else { + // 处理未知路由 + res.statusCode = 404; + res.end(JSON.stringify({ error: "Not Found" })); + } +}); + +// 监听端口 +const port = 3000; +server.listen(port, () => { + console.log(`Server is running on port ${port}`); +}); diff --git a/websrc/cobalt-web/src/constants/net-config.ts b/websrc/cobalt-web/src/constants/net-config.ts index 51138129..f1c63f0e 100644 --- a/websrc/cobalt-web/src/constants/net-config.ts +++ b/websrc/cobalt-web/src/constants/net-config.ts @@ -1,6 +1,6 @@ export default { // axios 基础url地址 - baseURL: process.env.NODE_ENV === 'development' ? 'http://localhost:5173/api' : '', + baseURL: process.env.NODE_ENV === 'development' ? 'http://localhost:3000/' : '', // 操作正常返回的code,根据后端第一 successCode: [200, 0], // 超时时间 diff --git a/websrc/cobalt-web/src/pages/connect.tsx b/websrc/cobalt-web/src/pages/connect.tsx index dfa3289e..77d65186 100644 --- a/websrc/cobalt-web/src/pages/connect.tsx +++ b/websrc/cobalt-web/src/pages/connect.tsx @@ -8,7 +8,7 @@ import { Form, FormControl, } from "react-bootstrap"; -import { Plug, Power } from "react-bootstrap-icons"; +import { ExclamationCircle, Plug, Power } from "react-bootstrap-icons"; const DeviceConnection = () => { const [camera, setCamera] = useState(""); @@ -104,9 +104,9 @@ const DeviceConnection = () => { }; return ( - +

- + 相机 @@ -136,7 +136,7 @@ const DeviceConnection = () => { - + 滤镜轮 @@ -166,7 +166,7 @@ const DeviceConnection = () => { - + 导星 @@ -196,14 +196,25 @@ const DeviceConnection = () => { - - - {" "} - + + +
+ +
+ + +
+ +
@@ -217,7 +228,7 @@ const DeviceConnection = () => { - 客户端未连接 + 客户端未连接 diff --git a/websrc/cobalt-web/src/pages/connection/create_config.tsx b/websrc/cobalt-web/src/pages/connection/create_config.tsx new file mode 100644 index 00000000..a57a6af5 --- /dev/null +++ b/websrc/cobalt-web/src/pages/connection/create_config.tsx @@ -0,0 +1,139 @@ +import React, { useState } from "react"; +import { Button, Modal, Form } from "react-bootstrap"; +import { Save } from "react-bootstrap-icons"; + +const ConfigCreationModal = () => { + const [show, setShow] = useState(false); + const handleClose = () => setShow(false); + const handleShow = () => setShow(true); + + // Initial state for the configuration values + const [config, setConfig] = useState({ + server: { + configpath: "config.json", + host: "0.0.0.0", + maxprocess: 10, + maxthread: 10, + modulepath: "modules", + port: 3000, + }, + terminal: { + enabled: true, + }, + }); + + // Function to handle changes in the configuration values + const handleChange = (e) => { + const { name, value, checked } = e.target; + const section = name.split(".")[0]; + const key = name.split(".")[1]; + setConfig((prevConfig) => ({ + ...prevConfig, + [section]: { + ...prevConfig[section], + [key]: value === "true" || value === "false" ? checked : value, + }, + })); + }; + + // Function to submit the configuration + const handleSubmit = (e) => { + e.preventDefault(); + console.log(config); // You can send the config to the server or perform other actions here + handleClose(); // Close the modal after submission + }; + + return ( + <> +
+ +
+ + + + + Configuration Creation + + +
+ {/* Server Configuration Section */} + + Config Path + + + + Host + + + + Max Process + + + + Max Thread + + + + Module Path + + + + Port + + + + {/* Terminal Configuration Section */} + + + + + {/* Submit Button */} + +
+
+
+ + ); +}; + +export default ConfigCreationModal; diff --git a/websrc/cobalt-web/src/pages/connection/index.tsx b/websrc/cobalt-web/src/pages/connection/index.tsx index 9cf8b55d..64061242 100644 --- a/websrc/cobalt-web/src/pages/connection/index.tsx +++ b/websrc/cobalt-web/src/pages/connection/index.tsx @@ -33,7 +33,7 @@ const Connect = () => { }; return ( - + diff --git a/websrc/cobalt-web/src/pages/connection/profile.tsx b/websrc/cobalt-web/src/pages/connection/profile.tsx index 4acef790..81bf2bd6 100644 --- a/websrc/cobalt-web/src/pages/connection/profile.tsx +++ b/websrc/cobalt-web/src/pages/connection/profile.tsx @@ -11,6 +11,8 @@ import { import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { dark } from "react-syntax-highlighter/dist/esm/styles/prism"; +import ConfigCreationModal from "./create_config"; + import { useTranslation } from "react-i18next"; const ProfileConnection = () => { @@ -116,11 +118,7 @@ const ProfileConnection = () => { -
- -
+
diff --git a/websrc/cobalt-web/src/pages/device/camera.tsx b/websrc/cobalt-web/src/pages/device/camera.tsx index 60b5ef5e..818eacf9 100644 --- a/websrc/cobalt-web/src/pages/device/camera.tsx +++ b/websrc/cobalt-web/src/pages/device/camera.tsx @@ -288,10 +288,10 @@ const DeviceCameraGeneralControlPanel: React.FC = () => { }, []); return ( - + - + 主相机信息
设备型号: {device_name}
@@ -300,32 +300,41 @@ const DeviceCameraGeneralControlPanel: React.FC = () => {

y像素数量: {camera_info.y_pixels}

x像元大小: {camera_info.x_pixel_size.toFixed(2)} um

y像元大小: {camera_info.y_pixel_size.toFixed(2)} um

-
- {exposure_status ? ( - - ) : ( - - )} -
-
- {cool_status ? ( - - ) : ( - - )} -
+ + +
+ {exposure_status ? ( + + ) : ( + + )} +
+ + +
+ {cool_status ? ( + + ) : ( + + )} +
+ +
- - 设备控制 + 开关冷冻 diff --git a/websrc/cobalt-web/src/pages/device/guider.tsx b/websrc/cobalt-web/src/pages/device/guider.tsx index 40596020..4772ae2a 100644 --- a/websrc/cobalt-web/src/pages/device/guider.tsx +++ b/websrc/cobalt-web/src/pages/device/guider.tsx @@ -6,6 +6,7 @@ import { InputGroup, Col, Row, + Container, } from "react-bootstrap"; import { ArrowLeft, @@ -192,7 +193,7 @@ const DeviceGuiderGeneralControlPanel = () => { }, []); return ( -
+
@@ -597,7 +598,7 @@ const DeviceGuiderGeneralControlPanel = () => {
-
+
); }; diff --git a/websrc/cobalt-web/src/pages/device/index.tsx b/websrc/cobalt-web/src/pages/device/index.tsx index 535f4676..30f82a1e 100644 --- a/websrc/cobalt-web/src/pages/device/index.tsx +++ b/websrc/cobalt-web/src/pages/device/index.tsx @@ -23,6 +23,7 @@ import DeviceFocuserGeneralControlPanel from "./focuser"; import DeviceGuiderGeneralControlPanel from "./guider"; import DevicePHD2GeneralControlPanel from "./phd2"; import DeviceTelescopeGeneralControlPanel from "./telescope"; +import DeviceSolverGeneralControlPanel from "./solver"; import DeviceCameraDetailedControlPanel from "./detail/camera"; import DeviceTelescopeDetailedControlPanel from "./detail/telescope"; @@ -67,6 +68,8 @@ const DeviceControlPanelPage = () => { return true; } else if (device_key === "phd2") { return true; + } else if (device_key == "solver") { + return true; } }; @@ -144,6 +147,18 @@ const DeviceControlPanelPage = () => {
); + } else if (device_key == "solver") { + return ( + + + + + Solver未连接 + +

Solver未连接

+
+
+ ); } }; @@ -153,28 +168,31 @@ const DeviceControlPanelPage = () => { return ( - - - - set_show_detail(false)} - /> - setShowAdvancedMode(true)} - size={32} - /> - + + + +
+ +
+
+ +
+ +
+
+ { /> - + { )} + + { + //show_device_icon_if_not_connected("solver") + } + {!show_detail ? ( + + ) : ( + + )} +
diff --git a/websrc/cobalt-web/src/pages/device/solver.tsx b/websrc/cobalt-web/src/pages/device/solver.tsx new file mode 100644 index 00000000..139e98b1 --- /dev/null +++ b/websrc/cobalt-web/src/pages/device/solver.tsx @@ -0,0 +1,195 @@ +import React, { useState, useEffect } from "react"; +import Container from "react-bootstrap/Container"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Form from "react-bootstrap/Form"; +import Button from "react-bootstrap/Button"; +import ButtonGroup from "react-bootstrap/ButtonGroup"; +import { Check, XCircle } from "react-bootstrap-icons"; + +import { useEchoWebSocket } from "../../utils/websocketProvider"; + +const DeviceSolverGeneralControlPanel = () => { + const [connected, setConnected] = useState(false); + const [solver, setSolver] = useState("astrometry"); // Default solver + const [solveTimeout, setSolveTimeout] = useState(60); // Default solve timeout in seconds + const [downsample, setDownsample] = useState(2); // Default downsample value + const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); + + const checkSolverStatus = () => { + // Placeholder for checking the status of selected solver + }; + + const saveSettings = () => { + // Placeholder for saving solver settings + }; + + const processWsMessage = (msg) => { + // Placeholder for processing WebSocket messages + }; + + const { sendMessage, removeListener } = useEchoWebSocket(processWsMessage); + + useEffect(() => { + checkSolverStatus(); + return () => { + removeListener(processWsMessage); + }; + }, []); + + return ( + + + + +
+
解析器设置
+ {connected ? ( + + ) : ( + + )} +
+
+ + + 解析器选择 + setSolver(e.target.value)} + > + + + + + + + + + 超时设置 (秒) + setSolveTimeout(event.target.value)} + min={0} + /> + + + 降采样 + + + + + + + + + {/* + + + + + {showAdvancedOptions && ( +
+ {solver === "astrometry" && ( + + + Astrometry.net API Key + + + + )} +
+ )} + */} +
+ + + {/* Right side for specific solver parameters */} +
+ {/* Specific solver parameters */} + + {solver === "astrometry" && ( +
+ {/* Astrometry.net parameters */} +

Astrometry.net特有参数

+ + 位深 + + + + + + + + 拉伸 + + + {/* Add more Astrometry.net parameters as needed */} +
+ )} + {solver === "astap" && ( +
+ {/* Astap parameters */} + + Specific parameter A + + + + Specific parameter B + + + {/* Add more Astap parameters as needed */} +
+ )} + {solver === "stellarsolver" && ( +
+ {/* StellarSolver parameters */} + + Specific parameter X + + + + Specific parameter Y + + + {/* Add more StellarSolver parameters as needed */} +
+ )} +
+ +
+
+ ); +}; + +export default DeviceSolverGeneralControlPanel; diff --git a/websrc/cobalt-web/src/pages/device/telescope.tsx b/websrc/cobalt-web/src/pages/device/telescope.tsx index 1694ed7c..ecd557e2 100644 --- a/websrc/cobalt-web/src/pages/device/telescope.tsx +++ b/websrc/cobalt-web/src/pages/device/telescope.tsx @@ -1,5 +1,13 @@ import React from "react"; -import { Container, Row, Col, Form, Button, Card } from "react-bootstrap"; +import { + Container, + Row, + Col, + Form, + Button, + Card, + ButtonGroup, +} from "react-bootstrap"; import { ArrowUp, ArrowDown, @@ -12,6 +20,7 @@ import { import { useImmer } from "use-immer"; import { useEchoWebSocket } from "../../utils/websocketProvider"; import { map } from "lodash"; +import Scrollbar from "react-smooth-scrollbar"; const DeviceTelescopeGeneralControlPanel: React.FC = () => { const [geo_location, update_geo_location] = useImmer({ @@ -33,7 +42,19 @@ const DeviceTelescopeGeneralControlPanel: React.FC = () => { const [fix_time_selection, set_fix_time_selection] = React.useState(true); const [slew_speed_selections, set_slew_speed_selections] = React.useState< Array<{ label: String; value: String }> - >([{ label: "1x", value: "1x" }]); + >([ + { label: "1x", value: "1x" }, + { label: "2x", value: "2x" }, + { label: "4x", value: "4x" }, + { label: "8x", value: "8x" }, + { label: "16x", value: "16x" }, + { label: "32x", value: "32x" }, + { label: "64x", value: "64x" }, + { label: "128x", value: "128x" }, + { label: "256x", value: "256x" }, + { label: "512x", value: "512x" }, + { label: "1024x", value: "1024x" }, + ]); const [selected_slew_speed, set_selected_slew_speed] = React.useState("0(0.25x)"); @@ -290,11 +311,10 @@ const DeviceTelescopeGeneralControlPanel: React.FC = () => { }; return ( - + - - 赤道仪信息 + 设备记录经度: {geo_location.longitude} ° 设备记录纬度: {geo_location.latitude} ° @@ -316,239 +336,273 @@ const DeviceTelescopeGeneralControlPanel: React.FC = () => { ra: {heading_degree.ra} ° dec: {heading_degree.dec} ° - - - - - - 设置赤道仪移动速率 - { - set_selected_slew_speed(event.target.value); - }} - > - {slew_speed_selections.map((one_slew_selection, index) => { - return ( - - ); - })} - - - - - - { - if (!arrow_in_action) { - set_fix_time_selection(event.target.checked); - } else { - // 提示松开按钮 - } - }} - /> - {fix_time_selection && ( - - 选择手动移动时长(s) - { - set_moving_time(event.target.value); - }} - > - {time_selections.map((one_time_select, index) => { - return ( - - ); - })} - - - )} - - {fix_time_selection ? "固定移动时间" : "长按手柄模式"} - - - - - - - - - - - - - - + + + +
+ {tracking_status ? ( + + ) : ( + + )} +
+ + +
- - - - - - - - - - - - - - - - {tracking_status ? ( - - ) : ( - - )} - - - - +
+ +
+ + + + + + + + + + + +
+ + + + + 设置赤道仪移动速率 + { + set_selected_slew_speed(event.target.value); + }} + > + {slew_speed_selections.map((one_slew_selection, index) => { + return ( + + ); + })} + + + + + + { + if (!arrow_in_action) { + set_fix_time_selection(event.target.checked); + } else { + // 提示松开按钮 + } + }} + /> + {fix_time_selection && ( + + 选择手动移动时长(s) + { + set_moving_time(event.target.value); + }} + > + {time_selections.map((one_time_select, index) => { + return ( + + ); + })} + + + )} + + {fix_time_selection ? "固定移动时间" : "长按手柄模式"} + + + + + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + +
+ +
+ + +
+
+
+
+
+
); diff --git a/websrc/cobalt-web/src/routes/root.tsx b/websrc/cobalt-web/src/routes/root.tsx index 8604392b..b1fe6f44 100644 --- a/websrc/cobalt-web/src/routes/root.tsx +++ b/websrc/cobalt-web/src/routes/root.tsx @@ -32,7 +32,7 @@ import ErrorPage from "../pages/error"; import ObjectFinding from "../pages/skymap"; import Dashboard from "../pages/dashboard/index"; import PAAIndexPage from "../pages/sequence" -import Test from "../pages/test/test"; +//import Test from "../pages/test/test"; interface IndexRouteObjectPlus extends IndexRouteObject { title?: string; @@ -152,12 +152,12 @@ export const routesConfig: RouteObjectPlus[] = [ title: "错误", icon: , }, - { - path: "/test", - element: , - title: "测试", - icon: , - } + //{ + // path: "/test", + // element: , + // title: "测试", + // icon: , + //} ]; const Route = () => { From 7ec1d827d74a8ee66509bd187e4d7dfe51939650 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sun, 14 Apr 2024 21:22:13 +0800 Subject: [PATCH 11/28] update -- modified project structure -- add python bindings --- .pre-commit-config.yaml | 7 + CMakeLists.txt | 71 +--- src/App.cpp | 184 ++-------- src/LithiumApp.cpp | 2 +- src/LithiumApp.hpp | 2 +- src/addon/manager.cpp | 71 ++-- src/addon/sort.cpp | 127 +++++++ src/addon/sort.hpp | 12 + src/atom/CMakeLists.txt | 8 + src/atom/algorithm/CMakeLists.txt | 11 +- src/atom/algorithm/_pybind.cpp | 179 ++++++++++ src/atom/algorithm/_script.cpp | 8 + src/atom/algorithm/algorithm.cpp | 164 +++++++++ src/atom/algorithm/algorithm.hpp | 221 ++++++++++++ src/atom/algorithm/base.cpp | 87 +++++ src/atom/algorithm/base.hpp | 16 + src/atom/algorithm/fraction.cpp | 15 +- src/atom/algorithm/fraction.hpp | 154 ++++++++- src/atom/algorithm/hash.hpp | 117 ++++++- src/atom/algorithm/math.cpp | 318 +++++------------- src/atom/algorithm/math.hpp | 131 +------- src/atom/algorithm/mathutils.cpp | 105 ------ src/atom/algorithm/mathutils.hpp | 34 -- src/atom/algorithm/md5.cpp | 5 +- src/atom/algorithm/md5.hpp | 4 +- src/atom/async/CMakeLists.txt | 7 +- src/atom/async/_pybind.cpp | 185 ++++++++++ src/atom/async/async_impl.hpp | 2 +- src/atom/async/queue.inl | 4 +- src/atom/async/trigger_impl.hpp | 5 +- src/atom/connection/CMakeLists.txt | 10 +- src/atom/connection/_pybind.cpp | 92 +++++ src/atom/connection/fifoclient.cpp | 87 ++--- src/atom/connection/fifoclient.hpp | 35 +- src/atom/connection/fifoserver.cpp | 128 +++---- src/atom/connection/fifoserver.hpp | 60 ++-- src/atom/connection/sockethub.cpp | 4 + src/atom/driver/_pybind.cpp | 191 +++++++++++ src/atom/log/CMakeLists.txt | 14 + src/server/App.cpp | 304 +++++++++++++++++ src/{ => server}/AppComponent.hpp | 0 src/{ => server}/Constants.hpp | 0 src/{ => server}/ErrorHandler.cpp | 0 src/{ => server}/ErrorHandler.hpp | 0 src/{ => server}/Launcher.cpp | 0 src/{ => server}/LauncherComponent.hpp | 0 src/{ => server}/Runner.cpp | 0 src/{ => server}/Runner.hpp | 0 src/{ => server}/auth/AuthHandler.cpp | 0 src/{ => server}/auth/AuthHandler.hpp | 0 src/{ => server}/auth/JWT.cpp | 0 src/{ => server}/auth/JWT.hpp | 0 src/{ => server}/config/Config.hpp | 0 src/{ => server}/config/HubsConfig.cpp | 0 src/{ => server}/config/HubsConfig.hpp | 0 .../controller/AsyncClientController.hpp | 0 .../controller/AsyncConfigController.hpp | 0 .../controller/AsyncDeviceController.hpp | 2 +- .../controller/AsyncIOController.hpp | 0 .../controller/AsyncModuleController.hpp | 0 .../controller/AsyncPHD2Controller.hpp | 2 +- .../controller/AsyncProcessController.hpp | 0 .../controller/AsyncScriptController.hpp | 2 +- .../controller/AsyncServerController.hpp | 0 .../controller/AsyncStaticController.hpp | 0 .../controller/AsyncSystemController.hpp | 0 .../controller/AsyncUploadController.hpp | 0 .../controller/AsyncWebSocketController.hpp | 0 .../controller/AuthController.hpp | 0 .../controller/StaticController.hpp | 0 .../controller/StoryController.hpp | 0 src/{ => server}/data/AuthDto.hpp | 0 src/{ => server}/data/ConfigDto.hpp | 0 src/{ => server}/data/DeviceDto.hpp | 0 src/{ => server}/data/IODto.hpp | 0 src/{ => server}/data/ModuleDto.hpp | 0 src/{ => server}/data/PageDto.hpp | 0 src/{ => server}/data/ProcessDto.hpp | 0 src/{ => server}/data/SignInDto.hpp | 0 src/{ => server}/data/SignUpDto.hpp | 0 src/{ => server}/data/StatusDto.hpp | 0 src/{ => server}/data/StoryDto.hpp | 0 src/{ => server}/data/SystemCustom.hpp | 0 src/{ => server}/data/SystemDto.hpp | 0 src/{ => server}/data/UserDto.hpp | 0 src/{ => server}/database/StoryDb.hpp | 0 src/{ => server}/database/UserDb.hpp | 0 .../database/model/StoryModel.hpp | 0 src/{ => server}/database/model/UserModel.hpp | 0 .../interceptor/AuthInterceptor.cpp | 0 .../interceptor/AuthInterceptor.hpp | 0 src/{ => server}/launcher/faq.cpp | 0 src/{ => server}/launcher/faq.hpp | 0 src/{ => server}/service/AuthService.cpp | 0 src/{ => server}/service/AuthService.hpp | 0 src/{ => server}/service/StoryService.cpp | 0 src/{ => server}/service/StoryService.hpp | 0 src/{ => server}/websocket/Connection.cpp | 0 src/{ => server}/websocket/Connection.hpp | 0 src/{ => server}/websocket/Hub.cpp | 0 src/{ => server}/websocket/Hub.hpp | 0 src/{ => server}/websocket/Registry.cpp | 0 src/{ => server}/websocket/Registry.hpp | 0 src/{ => server}/websocket/Session.cpp | 0 src/{ => server}/websocket/Session.hpp | 0 src/{ => server}/websocket/data/DTOs.hpp | 0 .../websocket/template/error_message.hpp | 0 .../websocket/template/function.hpp | 0 .../websocket/template/message.hpp | 0 .../websocket/template/variable.hpp | 0 src/utils/constant.hpp | 53 +++ 111 files changed, 2290 insertions(+), 950 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 src/addon/sort.cpp create mode 100644 src/addon/sort.hpp create mode 100644 src/atom/algorithm/algorithm.cpp create mode 100644 src/atom/algorithm/algorithm.hpp delete mode 100644 src/atom/algorithm/mathutils.cpp delete mode 100644 src/atom/algorithm/mathutils.hpp create mode 100644 src/atom/async/_pybind.cpp create mode 100644 src/atom/connection/_pybind.cpp create mode 100644 src/atom/driver/_pybind.cpp create mode 100644 src/server/App.cpp rename src/{ => server}/AppComponent.hpp (100%) rename src/{ => server}/Constants.hpp (100%) rename src/{ => server}/ErrorHandler.cpp (100%) rename src/{ => server}/ErrorHandler.hpp (100%) rename src/{ => server}/Launcher.cpp (100%) rename src/{ => server}/LauncherComponent.hpp (100%) rename src/{ => server}/Runner.cpp (100%) rename src/{ => server}/Runner.hpp (100%) rename src/{ => server}/auth/AuthHandler.cpp (100%) rename src/{ => server}/auth/AuthHandler.hpp (100%) rename src/{ => server}/auth/JWT.cpp (100%) rename src/{ => server}/auth/JWT.hpp (100%) rename src/{ => server}/config/Config.hpp (100%) rename src/{ => server}/config/HubsConfig.cpp (100%) rename src/{ => server}/config/HubsConfig.hpp (100%) rename src/{ => server}/controller/AsyncClientController.hpp (100%) rename src/{ => server}/controller/AsyncConfigController.hpp (100%) rename src/{ => server}/controller/AsyncDeviceController.hpp (99%) rename src/{ => server}/controller/AsyncIOController.hpp (100%) rename src/{ => server}/controller/AsyncModuleController.hpp (100%) rename src/{ => server}/controller/AsyncPHD2Controller.hpp (99%) rename src/{ => server}/controller/AsyncProcessController.hpp (100%) rename src/{ => server}/controller/AsyncScriptController.hpp (99%) rename src/{ => server}/controller/AsyncServerController.hpp (100%) rename src/{ => server}/controller/AsyncStaticController.hpp (100%) rename src/{ => server}/controller/AsyncSystemController.hpp (100%) rename src/{ => server}/controller/AsyncUploadController.hpp (100%) rename src/{ => server}/controller/AsyncWebSocketController.hpp (100%) rename src/{ => server}/controller/AuthController.hpp (100%) rename src/{ => server}/controller/StaticController.hpp (100%) rename src/{ => server}/controller/StoryController.hpp (100%) rename src/{ => server}/data/AuthDto.hpp (100%) rename src/{ => server}/data/ConfigDto.hpp (100%) rename src/{ => server}/data/DeviceDto.hpp (100%) rename src/{ => server}/data/IODto.hpp (100%) rename src/{ => server}/data/ModuleDto.hpp (100%) rename src/{ => server}/data/PageDto.hpp (100%) rename src/{ => server}/data/ProcessDto.hpp (100%) rename src/{ => server}/data/SignInDto.hpp (100%) rename src/{ => server}/data/SignUpDto.hpp (100%) rename src/{ => server}/data/StatusDto.hpp (100%) rename src/{ => server}/data/StoryDto.hpp (100%) rename src/{ => server}/data/SystemCustom.hpp (100%) rename src/{ => server}/data/SystemDto.hpp (100%) rename src/{ => server}/data/UserDto.hpp (100%) rename src/{ => server}/database/StoryDb.hpp (100%) rename src/{ => server}/database/UserDb.hpp (100%) rename src/{ => server}/database/model/StoryModel.hpp (100%) rename src/{ => server}/database/model/UserModel.hpp (100%) rename src/{ => server}/interceptor/AuthInterceptor.cpp (100%) rename src/{ => server}/interceptor/AuthInterceptor.hpp (100%) rename src/{ => server}/launcher/faq.cpp (100%) rename src/{ => server}/launcher/faq.hpp (100%) rename src/{ => server}/service/AuthService.cpp (100%) rename src/{ => server}/service/AuthService.hpp (100%) rename src/{ => server}/service/StoryService.cpp (100%) rename src/{ => server}/service/StoryService.hpp (100%) rename src/{ => server}/websocket/Connection.cpp (100%) rename src/{ => server}/websocket/Connection.hpp (100%) rename src/{ => server}/websocket/Hub.cpp (100%) rename src/{ => server}/websocket/Hub.hpp (100%) rename src/{ => server}/websocket/Registry.cpp (100%) rename src/{ => server}/websocket/Registry.hpp (100%) rename src/{ => server}/websocket/Session.cpp (100%) rename src/{ => server}/websocket/Session.hpp (100%) rename src/{ => server}/websocket/data/DTOs.hpp (100%) rename src/{ => server}/websocket/template/error_message.hpp (100%) rename src/{ => server}/websocket/template/function.hpp (100%) rename src/{ => server}/websocket/template/message.hpp (100%) rename src/{ => server}/websocket/template/variable.hpp (100%) create mode 100644 src/utils/constant.hpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..0e379f7c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +fail_fast: false +repos: + - repo: https://github.com/pocc/pre-commit-hooks + rev: master + hooks: + - id: clang-format + - id: cppcheck \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 4def3720..2b70371b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ # Author: Max Qian # License: GPL3 -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.20) project(Lithium) enable_language(C CXX) @@ -184,37 +184,16 @@ set(component_module ${lithium_component_dir}/loader.cpp ${lithium_component_dir}/manager.cpp ${lithium_component_dir}/sandbox.cpp + ${lithium_component_dir}/sort.cpp ) set(config_module ${lithium_src_dir}/config/configor.cpp - ${lithium_src_dir}/config/HubsConfig.cpp ) -if (ENABLE_DEBUG_FLAG) set(debug_module ${lithium_src_dir}/debug/terminal.cpp ) -else() -set(debug_module - ${lithium_src_dir}/debug/terminal.cpp -) -endif() - -if (ENABLE_ASYNC_FLAG) -set(server_module - ${lithium_src_dir}/websocket/Hub.cpp - ${lithium_src_dir}/websocket/Connection.cpp - ${lithium_src_dir}/websocket/Registry.cpp - ${lithium_src_dir}/websocket/Session.cpp -) -else() -set(server_module - ${lithium_src_dir}/websocket/WsServer.cpp - ${lithium_src_dir}/websocket/WsHub.cpp - ${lithium_src_dir}/websocket/WsInstance.cpp -) -endif() set(script_module ${lithium_src_dir}/script/manager.cpp @@ -236,8 +215,6 @@ set(task_module ) set(Lithium_module - ${lithium_src_dir}/AppComponent.hpp - ${lithium_src_dir}/ErrorHandler.cpp ${lithium_src_dir}/LithiumApp.cpp ) @@ -256,8 +233,8 @@ find_package(fmt REQUIRED) ################################################################################# # Main -add_library(lithium_server-library STATIC ${component_module} ${config_module} ${debug_module} ${module_module} ${device_module} ${task_module} ${server_module} ${script_module} ${Lithium_module}) -add_executable(lithium_server ${lithium_src_dir}/App.cpp) +add_library(lithium_server-library STATIC ${component_module} ${config_module} ${debug_module} ${module_module} ${device_module} ${task_module} ${script_module} ${Lithium_module}) +add_executable(lithium_server ${lithium_src_dir}/app.cpp) target_link_directories(lithium_server PUBLIC ${CMAKE_BINARY_DIR}/libs) target_link_libraries(lithium_server lithium_server-library) @@ -294,43 +271,3 @@ set_target_properties( PROPERTIES OUTPUT_NAME lithium_server ) - -################################################################################# -# Hello Element Astro Launcher - -add_library(heal-library STATIC - ${lithium_src_dir}/auth/AuthHandler.cpp - ${lithium_src_dir}/auth/AuthHandler.hpp - ${lithium_src_dir}/auth/JWT.cpp - ${lithium_src_dir}/auth/JWT.hpp - ${lithium_src_dir}/controller/StaticController.hpp - ${lithium_src_dir}/controller/StoryController.hpp - ${lithium_src_dir}/controller/AuthController.hpp - ${lithium_src_dir}/database/model/StoryModel.hpp - ${lithium_src_dir}/database/model/UserModel.hpp - ${lithium_src_dir}/database/StoryDb.hpp - ${lithium_src_dir}/database/UserDb.hpp - ${lithium_src_dir}/data/AuthDto.hpp - ${lithium_src_dir}/data/PageDto.hpp - ${lithium_src_dir}/data/SignInDto.hpp - ${lithium_src_dir}/data/SignUpDto.hpp - ${lithium_src_dir}/data/StatusDto.hpp - ${lithium_src_dir}/data/StoryDto.hpp - ${lithium_src_dir}/interceptor/AuthInterceptor.cpp - ${lithium_src_dir}/interceptor/AuthInterceptor.hpp - ${lithium_src_dir}/service/AuthService.cpp - ${lithium_src_dir}/service/AuthService.hpp - ${lithium_src_dir}/service/StoryService.cpp - ${lithium_src_dir}/service/StoryService.hpp - ${lithium_src_dir}/LauncherComponent.hpp - ${lithium_src_dir}/components/DatabaseComponent.hpp - ${lithium_src_dir}/components/SwaggerComponent.hpp - ${lithium_src_dir}/ErrorHandler.cpp - ${lithium_src_dir}/ErrorHandler.hpp -) - -target_include_directories(heal-library PUBLIC ${lithium_src_dir}) - -add_executable(heal ${lithium_src_dir}/Launcher.cpp) -target_link_libraries(heal heal-library) -target_link_libraries(heal oatpp-websocket oatpp-swagger oatpp-openssl oatpp-zlib oatpp-sqlite oatpp) diff --git a/src/App.cpp b/src/App.cpp index dec77db2..e149154a 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -1,49 +1,18 @@ /* - * App.cpp + * app.cpp * * Copyright (C) 2023-2024 Max Qian */ /************************************************* -Date: 2023-7-13 +Date: 2024-14 -Description: Main +Description: Main Entry **************************************************/ -#ifdef ENABLE_WEB_SERVER -// This is for debug only, please remove it in production -// Oatpp server is still experimental, it may be improved in the future -#include "AppComponent.hpp" - -#ifdef ENABLE_ASYNC -#include "controller/AsyncConfigController.hpp" -#include "controller/AsyncDeviceController.hpp" -#include "controller/AsyncIOController.hpp" -#include "controller/AsyncProcessController.hpp" -#include "controller/AsyncStaticController.hpp" -#include "controller/AsyncSystemController.hpp" -#include "controller/AsyncUploadController.hpp" -// #include "controller/AsyncWebSocketController.hpp" -#include "controller/AsyncClientController.hpp" -#include "oatpp-swagger/AsyncController.hpp" -#else -#include "oatpp-swagger/Controller.hpp" -#endif - -#include "oatpp/network/Server.hpp" - -#define ADD_CONTROLLER(controller, docEndpoints, router, logMessage) \ - auto controller##_ptr = controller::createShared(); \ - docEndpoints.append(controller##_ptr->getEndpoints()); \ - router->addController(controller##_ptr); \ - DLOG_F(INFO, logMessage " loaded"); - -#endif -#include - -#include "LithiumApp.hpp" +#include "lithiumapp.hpp" #include "atom/log/loguru.hpp" #include "atom/server/global_ptr.hpp" @@ -66,97 +35,7 @@ using namespace Lithium::Terminal; #include #endif -void BusLoggerFunction(void *user_data, const loguru::Message &message) { - Lithium::MyApp->sendJsonMessage("log", {{"message", message.message}, - {"level", message.verbosity}, - {"file", message.filename}, - {"line", message.line}, - {"timestamp", message.preamble}}); -} - -#ifdef ENABLE_WEB_SERVER -void runServer() { - DLOG_F(INFO, "Loading App component ..."); -#if ENABLE_IPV6 - AppComponent components( - Lithium::MyApp->GetConfig("config/server").value("host", "::"), - Lithium::MyApp->GetConfig("config/server") - .value("port", 8000)); // Create scope Environment components -#else - DLOG_F(INFO, "Server host:", Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("host", "0.0.0.0")); - DLOG_F(INFO, "Server port:", Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("port", 8000)); - AppComponent components( - Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("host", "0.0.0.0"), - Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("port", 8000)); // Create scope Environment components -#endif - DLOG_F(INFO, "App component loaded"); - - /* Get router component */ - OATPP_COMPONENT(std::shared_ptr, router); - oatpp::web::server::api::Endpoints docEndpoints; - /* Add routes & documents */ - - ADD_CONTROLLER(ConfigController, docEndpoints, router, - "AsyncConfigController"); - - ADD_CONTROLLER(StaticController, docEndpoints, router, - "AsyncStaticController"); - - ADD_CONTROLLER(SystemController, docEndpoints, router, - "AsyncSystemController"); - - // ADD_CONTROLLER(WebSocketController, docEndpoints, router, - // "AsyncWebSocketController"); - - ADD_CONTROLLER(IOController, docEndpoints, router, "AsyncIOController"); - - ADD_CONTROLLER(ProcessController, docEndpoints, router, - "AsyncProcessController"); - - ADD_CONTROLLER(ClientController, docEndpoints, router, - "AsyncClientController"); - - DLOG_F(INFO, "Starting to load API doc controller"); -#if ENABLE_ASYNC - router->addController( - oatpp::swagger::AsyncController::createShared(docEndpoints)); -#else - router->addController( - oatpp::swagger::Controller::createShared(docEndpoints)); -#endif - DLOG_F(INFO, "API doc controller loaded"); - - /* Load websocket route */ - // router->addController(WebSocketController::createShared()); - - /* Get connection handler component */ - OATPP_COMPONENT(std::shared_ptr, - connectionHandler, "http"); - - /* Get connection provider component */ - OATPP_COMPONENT(std::shared_ptr, - connectionProvider); - - DLOG_F(INFO, "Loaded server components ... Prepare for starting ..."); - /* create server */ - oatpp::network::Server server(connectionProvider, connectionHandler); - - DLOG_F(INFO, "Server running on port {}...", - connectionProvider->getProperty("port").toString()->c_str()); - - /* This is a block function that will be called when the server is started - */ - server.run(); -} -#endif - - -// TODO: add network logger, not implemented yet -// struct MyNetworkLogger {}; +#include "argparse/argparse.hpp" /** * @brief setup log file @@ -176,16 +55,9 @@ void setupLogFile() { loguru::add_file(logFilePath.string().c_str(), loguru::Append, loguru::Verbosity_MAX); - // MyNetworkLogger network_logger; - // TODO loguru::add_callback("network_logger", BusLoggerFunction, - // &network_logger, loguru::Verbosity_INFO); - loguru::set_fatal_handler([](const loguru::Message &message) { Atom::System::saveCrashLog(std::string(message.prefix) + message.message); -#if ENABLE_WEB_SERVER - oatpp::base::Environment::destroy(); -#endif }); } @@ -196,6 +68,8 @@ void setupLogFile() { * @return 0 on success */ int main(int argc, char *argv[]) { + // NOTE: gettext is not supported yet, it will cause compilation error on + // Mingw64 /* Add gettext */ #if ENABLE_GETTEXT bindtextdomain("lithium", "locale"); @@ -203,15 +77,16 @@ int main(int argc, char *argv[]) { setlocale(LC_ALL, ""); textdomain("lithium"); #endif + // Set log file + setupLogFile(); // Init loguru log system loguru::init(argc, argv); - // Set log file - setupLogFile(); /* Parse arguments */ argparse::ArgumentParser program("Lithium Server"); + // NOTE: The command arguments' priority is higher than the config file program.add_argument("-P", "--port") .help("port the server running on") .default_value(8000); @@ -227,6 +102,9 @@ int main(int argc, char *argv[]) { program.add_argument("-W", "--web-panel") .help("web panel") .default_value(true); + program.add_argument("-D", "--debug") + .help("debug mode") + .default_value(false); program.add_argument("-L", "--log-file").help("path to log file"); program.add_description("Lithium Command Line Interface:"); @@ -235,7 +113,7 @@ int main(int argc, char *argv[]) { program.parse_args(argc, argv); Lithium::InitLithiumApp(argc, argv); - // Run oatpp server + // Create shared instance Lithium::MyApp = Lithium::LithiumApp::createShared(); auto cmd_port = program.get("--port"); @@ -255,6 +133,7 @@ int main(int argc, char *argv[]) { auto cmd_config_path = program.get("--config"); auto cmd_module_path = program.get("--module-path"); auto cmd_web_panel = program.get("--web-panel"); + auto cmd_debug = program.get("--debug"); if (!cmd_host.empty()) { Lithium::MyApp->SetConfig( @@ -279,26 +158,25 @@ int main(int argc, char *argv[]) { DLOG_F(INFO, "Disable web panel"); } } + + if (cmd_debug) { + if (!Lithium::MyApp->GetConfig("config/server/debug").get()) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/debug"}, {"value", true}}); + + ConsoleTerminal terminal; + terminal.run(); + } + } else { + if (Lithium::MyApp->GetConfig("config/server/debug").get()) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/debug"}, {"value", false}}); + DLOG_F(INFO, "Disable debug mode"); + } + } } catch (const std::bad_any_cast &e) { LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); } -#if ENABLE_TERMINAL - Lithium::MyApp->SetConfig( - {{"key", "config/terminal/enabled"}, {"value", true}}); - - ConsoleTerminal terminal; - terminal.run(); - -#endif - -#if ENABLE_WEB_SERVER - oatpp::base::Environment::init(); - // Run the main server - runServer(); - // Clean up all - oatpp::base::Environment::destroy(); -#endif - return 0; } \ No newline at end of file diff --git a/src/LithiumApp.cpp b/src/LithiumApp.cpp index 7d2ebc35..2285e5a9 100644 --- a/src/LithiumApp.cpp +++ b/src/LithiumApp.cpp @@ -12,7 +12,7 @@ Description: Lithium App Enter **************************************************/ -#include "LithiumApp.hpp" +#include "lithiumapp.hpp" #include "config.h" diff --git a/src/LithiumApp.hpp b/src/LithiumApp.hpp index c4801614..bd97ea3e 100644 --- a/src/LithiumApp.hpp +++ b/src/LithiumApp.hpp @@ -1,5 +1,5 @@ /* - * LithiumApp.hpp + * lithiumapp.hpp * * Copyright (C) 2023-2024 Max Qian */ diff --git a/src/addon/manager.cpp b/src/addon/manager.cpp index 73a6796a..9d625722 100644 --- a/src/addon/manager.cpp +++ b/src/addon/manager.cpp @@ -19,21 +19,15 @@ Description: Component Manager (the core of the plugin system) // #include "finder.hpp" #include "loader.hpp" #include "sandbox.hpp" +#include "sort.hpp" #include "atom/io/io.hpp" #include "atom/log/loguru.hpp" #include "atom/server/global_ptr.hpp" +#include "utils/constant.hpp" #include "utils/marco.hpp" -#ifdef _WIN32 -constexpr std::string PATH_SEPARATOR = "\\"; -constexpr std::string DYNAMIC_LIBRARY_EXTENSION = ".dll"; -#else -constexpr std::string PATH_SEPARATOR = "/"; -constexpr std::string DYNAMIC_LIBRARY_EXTENSION = ".so"; -#endif - #define IS_ARGUMENT_EMPTY() \ if (params.is_null()) { \ return false; \ @@ -47,19 +41,23 @@ constexpr std::string DYNAMIC_LIBRARY_EXTENSION = ".so"; type name = params[#name].get(); namespace Lithium { -ComponentManager::ComponentManager() - : m_Sandbox(nullptr), m_Compiler(nullptr) { - m_ModuleLoader = GetWeakPtr("lithium.addon.loader"); +ComponentManager::ComponentManager() : m_Sandbox(nullptr), m_Compiler(nullptr) { + m_ModuleLoader = + GetWeakPtr(constants::LITHIUM_MODULE_LOADER); CHECK_WEAK_PTR_EXPIRED(m_ModuleLoader, "load module loader from gpm: lithium.addon.loader"); - m_Env = GetWeakPtr("lithium.utils.env"); + m_Env = GetWeakPtr(constants::LITHIUM_UTILS_ENV); CHECK_WEAK_PTR_EXPIRED(m_Env, "load env from gpm: lithium.utils.env"); - m_AddonManager = GetWeakPtr("lithium.addon.addon"); + m_AddonManager = + GetWeakPtr(constants::LITHIUM_ADDON_MANAGER); CHECK_WEAK_PTR_EXPIRED(m_AddonManager, "load addon manager from gpm: lithium.addon.addon"); // m_ComponentFinder = std::make_unique( // m_Env.lock()->getEnv("LITHIUM_ADDON_PATH", "./modules"), checkFunc); + // NOTE: AddonFinder is not supported yet + + // Initialize sandbox and compiler, these are not shared objects m_Sandbox = std::make_unique(); m_Compiler = std::make_unique(); @@ -83,8 +81,8 @@ bool ComponentManager::Initialize() { // Check if the module path is valid or reset by the user // Default path is ./modules // TODO: Windows support - const std::string &module_path = - m_Env.lock()->getEnv("LITHIUM_ADDON_PATH", "./modules"); + const std::string &module_path = m_Env.lock()->getEnv( + constants::ENV_VAR_MODULE_PATH, constants::MODULE_FOLDER); // Get all of the available addon path /* /if (!m_ComponentFinder->traverseDir(std::filesystem::path(module_path))) { @@ -93,7 +91,15 @@ bool ComponentManager::Initialize() { } */ - for (const auto &dir : getQualifiedSubDirs(module_path)) { + // make a loading list of modules + std::vector qualified_subdirs = + resolveDependencies(getQualifiedSubDirs(module_path)); + if (qualified_subdirs.empty()) { + LOG_F(WARNING, "No modules found"); + return true; + } + + for (const auto &dir : qualified_subdirs) { std::filesystem::path path = std::filesystem::path(module_path) / dir; if (!m_AddonManager.lock()->addModule(path, dir)) { @@ -127,7 +133,8 @@ std::shared_ptr ComponentManager::createShared() { return std::make_shared(); } -std::vector ComponentManager::getFilesInDir(const std::string &path) { +std::vector ComponentManager::getFilesInDir( + const std::string &path) { std::vector files; for (const auto &entry : std::filesystem::directory_iterator(path)) { if (!entry.is_directory()) { @@ -137,7 +144,8 @@ std::vector ComponentManager::getFilesInDir(const std::string &path return files; } -std::vector ComponentManager::getQualifiedSubDirs(const std::string &path) { +std::vector ComponentManager::getQualifiedSubDirs( + const std::string &path) { std::vector qualifiedSubDirs; for (const auto &entry : std::filesystem::directory_iterator(path)) { if (entry.is_directory()) { @@ -145,11 +153,11 @@ std::vector ComponentManager::getQualifiedSubDirs(const std::string std::vector files = getFilesInDir(entry.path().string()); for (const auto &fileName : files) { - if (fileName == "package.json") { + if (fileName == constants::PACKAGE_NAME) { hasJson = true; } else if (fileName.size() > 4 && fileName.substr(fileName.size() - 4) == - DYNAMIC_LIBRARY_EXTENSION) { + constants::LIB_EXTENSION) { hasLib = true; } if (hasJson && hasLib) { @@ -221,15 +229,15 @@ bool ComponentManager::checkComponent(const std::string &module_name, } // Check component package.json file, this is for the first time loading // And we need to know how to load component's ptr from this file - if (!Atom::IO::isFileExists(module_path + PATH_SEPARATOR + - "package.json")) { + if (!Atom::IO::isFileExists(module_path + constants::PATH_SEPARATOR + + constants::PACKAGE_NAME)) { LOG_F(ERROR, "Component path {} does not contain package.json", module_path); return false; } // Check component library files std::vector files = Atom::IO::checkFileTypeInFolder( - module_path, DYNAMIC_LIBRARY_EXTENSION, Atom::IO::FileOption::Name); + module_path, constants::LIB_EXTENSION, Atom::IO::FileOption::Name); if (files.empty()) { LOG_F(ERROR, "Component path {} does not contain dll or so file", @@ -237,12 +245,12 @@ bool ComponentManager::checkComponent(const std::string &module_name, return false; } auto it = std::find(files.begin(), files.end(), - module_name + DYNAMIC_LIBRARY_EXTENSION); + module_name + constants::LIB_EXTENSION); if (it != files.end()) { - if (!m_ModuleLoader.lock()->LoadModule(module_path + PATH_SEPARATOR + - module_name + - DYNAMIC_LIBRARY_EXTENSION, - module_name)) { + if (!m_ModuleLoader.lock()->LoadModule( + module_path + constants::PATH_SEPARATOR + module_name + + constants::LIB_EXTENSION, + module_name)) { LOG_F(ERROR, "Failed to load module: {}'s library {}", module_name, module_path); return false; @@ -259,14 +267,15 @@ bool ComponentManager::checkComponent(const std::string &module_name, bool ComponentManager::loadComponentInfo(const std::string &module_path) { // Load the Package.json // Max: We will only load the root package.json - std::string file_path = module_path + PATH_SEPARATOR + "package.json"; + std::string file_path = + module_path + constants::PATH_SEPARATOR + constants::PACKAGE_NAME; if (!Atom::IO::isFileExists(file_path)) { LOG_F(ERROR, "Component path {} does not contain package.json", module_path); return false; } - std::string module_name = - module_path.substr(module_path.find_last_of(PATH_SEPARATOR) + 1); + std::string module_name = module_path.substr( + module_path.find_last_of(constants::PATH_SEPARATOR) + 1); try { m_ComponentInfos[module_name] = json::parse(std::ifstream(file_path)); } catch (const json::parse_error &e) { diff --git a/src/addon/sort.cpp b/src/addon/sort.cpp new file mode 100644 index 00000000..ef274be7 --- /dev/null +++ b/src/addon/sort.cpp @@ -0,0 +1,127 @@ +#include "sort.hpp" + +#include +#include +#include +#include + +#include "atom/log/loguru.hpp" +#include "atom/type/json.hpp" + +using json = nlohmann::json; + +namespace Lithium { +std::vector removeDuplicates( + const std::vector& input) { + std::unordered_set seen; + std::vector result; + + for (const auto& element : input) { + if (seen.insert(element).second) { + result.push_back(element); + } + } + + return result; +} + +std::pair> parsePackageJson( + const std::string& path) { + std::ifstream file(path); + if (!file.is_open()) { + throw std::runtime_error("Failed to open " + path); + } + + json package_json; + try { + file >> package_json; + } catch (const json::exception& e) { + throw std::runtime_error("Error parsing JSON in " + path + ": " + + e.what()); + } + + if (!package_json.contains("name")) { + throw std::runtime_error("Missing package name in " + path); + } + + std::string package_name = package_json["name"]; + std::vector deps; + + if (package_json.contains("dependencies")) { + for (auto& dep : package_json["dependencies"].items()) { + deps.push_back(dep.key()); + } + } + + file.close(); + return {package_name, deps}; +} + +std::vector resolveDependencies( + const std::vector& directories) { + std::unordered_map> dependency_graph; + std::unordered_map indegree; + std::vector sorted_packages; + std::unordered_set visited; + + for (const auto& dir : directories) { + std::string package_path = dir + "/package.json"; + auto [package_name, deps] = parsePackageJson(package_path); + + // 构建依赖图和入度表 + if (!dependency_graph.count(package_name)) { + dependency_graph[package_name] = {}; + indegree[package_name] = 0; + } + + for (const auto& dep : deps) { + dependency_graph[dep].push_back(package_name); + indegree[package_name]++; + } + } + + if (dependency_graph.empty()) { + LOG_F(ERROR, "No packages found."); + return {}; + } + + std::queue q; + for (const auto& [node, _] : dependency_graph) { + q.push(node); + } + + while (!q.empty()) { + std::string current = q.front(); + q.pop(); + sorted_packages.push_back(current); + visited.insert(current); + + for (const auto& neighbor : dependency_graph[current]) { + if (visited.count(neighbor)) { + LOG_F(WARNING, + "Circular dependency detected. Ignoring dependency from " + "{} to {}", + current, neighbor); + continue; + } + indegree[neighbor]--; + if (indegree[neighbor] == 0) { + q.push(neighbor); + } + } + } + + for (const auto& node : indegree) { + if (node.second > 0) { + LOG_F(WARNING, "Unresolved dependency for {}", node.first); + } + } + + if (sorted_packages.size() != dependency_graph.size()) { + LOG_F(WARNING, "Some packages were not included in the load order."); + } + + return removeDuplicates(sorted_packages); +} + +} // namespace Lithium diff --git a/src/addon/sort.hpp b/src/addon/sort.hpp new file mode 100644 index 00000000..2bce1738 --- /dev/null +++ b/src/addon/sort.hpp @@ -0,0 +1,12 @@ +#ifndef LITHIUM_COMPONENTS_SORT_HPP +#define LITHIUM_COMPONENTS_SORT_HPP + +#include +#include + +namespace Lithium { +[[nodiscard("result is discarded")]] std::vector +resolveDependencies(const std::vector& directories); +} + +#endif \ No newline at end of file diff --git a/src/atom/CMakeLists.txt b/src/atom/CMakeLists.txt index 58c330fb..a1c590e1 100644 --- a/src/atom/CMakeLists.txt +++ b/src/atom/CMakeLists.txt @@ -19,6 +19,14 @@ set(ATOM_SOVERSION ${CMAKE_ATOM_VERSION_MAJOR}) set(CMAKE_ATOM_VERSION_STRING "${CMAKE_ATOM_VERSION_MAJOR}.${CMAKE_ATOM_VERSION_MINOR}.${CMAKE_ATOM_VERSION_RELEASE}") set(ATOM_VERSION ${CMAKE_ATOM_VERSION_MAJOR}.${CMAKE_ATOM_VERSION_MINOR}.${CMAKE_ATOM_VERSION_RELEASE}) +option(ATOM_BUILD_PYTHON " Build Atom with Python support" OFF) +find_package(Python COMPONENTS Interpreter Development REQUIRED) +if(${PYTHON_FOUND}) + message("-- Found Python ${PYTHON_VERSION_STRING}: ${PYTHON_EXECUTABLE}") + find_package(pybind11 REQUIRED) + set(ATOM_BUILD_PYTHON ON) +endif() +add_subdirectory(algorithm) add_subdirectory(async) add_subdirectory(components) add_subdirectory(connection) diff --git a/src/atom/algorithm/CMakeLists.txt b/src/atom/algorithm/CMakeLists.txt index fe3d04a0..6165958f 100644 --- a/src/atom/algorithm/CMakeLists.txt +++ b/src/atom/algorithm/CMakeLists.txt @@ -11,24 +11,24 @@ project(atom-algorithm C CXX) # Sources set(${PROJECT_NAME}_SOURCES + algorithm.cpp base.cpp convolve.cpp fraction.cpp huffman.cpp math.cpp - mathutils.cpp md5.cpp ) # Headers set(${PROJECT_NAME}_HEADERS + algorithm.hpp base.hpp convolve.hpp fraction.hpp hash.hpp huffman.hpp math.hpp - mathutils.hpp md5.hpp ) @@ -59,4 +59,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) \ No newline at end of file +) + +if (ATOM_BUILD_PYTHON) +pybind11_add_module(${PROJECT_NAME}-py _pybind.cpp) +target_link_libraries(${PROJECT_NAME}-py PRIVATE ${PROJECT_NAME}) +endif() \ No newline at end of file diff --git a/src/atom/algorithm/_pybind.cpp b/src/atom/algorithm/_pybind.cpp index e69de29b..ed18085e 100644 --- a/src/atom/algorithm/_pybind.cpp +++ b/src/atom/algorithm/_pybind.cpp @@ -0,0 +1,179 @@ +/* + * _pybind.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Python Binding of Atom-Algorithm + +**************************************************/ + +#include +#include +#include + +#include "algorithm.hpp" +#include "base.hpp" +#include "convolve.hpp" +#include "fraction.hpp" +#include "hash.hpp" +#include "huffman.hpp" +#include "math.hpp" +#include "md5.hpp" + +namespace py = pybind11; + +using namespace Atom::Algorithm; + +PYBIND11_MODULE(atom_algorithm, m) { + m.doc() = "Atom Algorithm Python Binding"; + + m.def("base16encode", &base16Encode, "Base16 Encode"); + m.def("base16decode", &base16Decode, "Base16 Decode"); + m.def("base32encode", &base32Encode, "Base32 Encode"); + m.def("base32decode", &base32Decode, "Base32 Decode"); + m.def("base64encode", &base64Encode, "Base64 Encode"); + m.def("base64decode", &base64Decode, "Base64 Decode"); + m.def("base85encode", &base85Encode, "Base85 Encode"); + m.def("base85decode", &base85Decode, "Base85 Decode"); + m.def("base91encode", &base91Encode, "Base91 Encode"); + m.def("base91decode", &base91Decode, "Base91 Decode"); + m.def("base128encode", &base128Encode, "Base128 Encode"); + m.def("base128decode", &base128Decode, "Base128 Decode"); + + py::class_(m, "KMP") + .def(py::init()) + .def("search", &KMP::Search) + .def("set_pattern", &KMP::SetPattern); + + py::class_(m, "MinHash") + .def(py::init()) + .def("compute_signature", &MinHash::compute_signature) + .def("estimate_similarity", &MinHash::estimate_similarity); + + m.def("convolve", &convolve, "Perform one-dimensional convolution"); + m.def("deconvolve", &deconvolve, "Perform one-dimensional deconvolution"); + m.def("convolve2D", &convolve2D, "Perform two-dimensional convolution", + py::arg("input"), py::arg("kernel"), py::arg("numThreads") = 1); + m.def("deconvolve2D", &deconvolve2D, + "Perform two-dimensional deconvolution"); + + py::class_(m, "Fraction") + .def(py::init(), py::arg("numerator") = 0, + py::arg("denominator") = 1) + .def("__add__", &Fraction::operator+, py::arg("other")) + //.def("__sub__", &Fraction::operator-, py::arg("other")) + .def("__mul__", &Fraction::operator*, py::arg("other")) + .def("__truediv__", &Fraction::operator/, py::arg("other")) + .def(py::self += py::self) + .def(py::self -= py::self) + .def(py::self *= py::self) + .def(py::self /= py::self) + .def("__eq__", &Fraction::operator==) + //.def("__lt__", &Fraction::operator<) + //.def("__neg__", &Fraction::operator-) + .def("__str__", &Fraction::to_string) + .def("__float__", &Fraction::to_double) + .def("__int__", &Fraction::operator int) + .def("__float__", &Fraction::operator float) + .def("__double__", &Fraction::operator double) + .def("__repr__", &Fraction::to_string) + .def("__abs__", + [](const Fraction& f) { + return Fraction(std::abs(f.numerator), + std::abs(f.denominator)); + }) + .def( + "__iadd__", + [](Fraction& self, const Fraction& other) { + self += other; + return self; + }, + py::arg("other")) + .def( + "__isub__", + [](Fraction& self, const Fraction& other) { + self -= other; + return self; + }, + py::arg("other")) + .def( + "__imul__", + [](Fraction& self, const Fraction& other) { + self *= other; + return self; + }, + py::arg("other")) + .def( + "__idiv__", + [](Fraction& self, const Fraction& other) { + self /= other; + return self; + }, + py::arg("other")) + .def("__pos__", + [](const Fraction& f) { + return Fraction(f.numerator, f.denominator); + }) + .def("__abs__", + [](const Fraction& f) { + return Fraction(std::abs(f.numerator), + std::abs(f.denominator)); + }) + .def("__pos__", + [](const Fraction& f) { + return Fraction(f.numerator, f.denominator); + }) + .def("__neg__", + [](const Fraction& f) { + return Fraction(-f.numerator, f.denominator); + }) + .def("__hash__", + [](const Fraction& f) { + return std::hash()(f.to_double()); + }) + .def( + "__pow__", + [](const Fraction& f, int power) { + return Fraction(std::pow(f.to_double(), power)); + }, + py::arg("power")) + //.def(py::self < py::self) + .def(py::self == py::self) + .def(py::self != py::self) + .def("__float__", [](const Fraction& f) { return f.to_double(); }) + .def("__int__", + [](const Fraction& f) { return static_cast(f.to_double()); }); + + //m.def("compute_hash", &fnv1a_hash, + // "Compute FNV-1a hash for a string view"); + + //m.def("compute_hash", &jenkins_one_at_a_time_hash, + // "Compute Jenkins One-at-a-Time hash for a string view"); + + // Bindings for createHuffmanTree function + m.def("create_huffman_tree", &createHuffmanTree, + "Create a Huffman tree from character frequencies"); + + // Bindings for generateHuffmanCodes function + m.def("generate_huffman_codes", &generateHuffmanCodes, + "Generate Huffman codes for characters in the Huffman tree"); + + // Bindings for compressText function + m.def("compress_text", &compressText, + "Compress text using Huffman encoding"); + + // Bindings for decompressText function + m.def("decompress_text", &decompressText, + "Decompress text using Huffman decoding"); + + m.def("mul_div_64", &mulDiv64, "Perform 64-bit multiplication and division"); + + py::class_(m, "MD5") + .def(py::init<>()) + .def_static("encrypt", &MD5::encrypt); +} diff --git a/src/atom/algorithm/_script.cpp b/src/atom/algorithm/_script.cpp index ef01b3b2..40fe6f3d 100644 --- a/src/atom/algorithm/_script.cpp +++ b/src/atom/algorithm/_script.cpp @@ -16,6 +16,14 @@ CARBON_MODULE_EXPORT { m_module->add(Carbon::fun(&base16Decode), "base16decode"); m_module->add(Carbon::fun(&base32Encode), "base32encode"); m_module->add(Carbon::fun(&base32Decode), "base32decode"); + m_module->add(Carbon::fun(&base64Encode), "base64encode"); + m_module->add(Carbon::fun(&base64Decode), "base64decode"); + m_module->add(Carbon::fun(&base85Encode), "base85encode"); + m_module->add(Carbon::fun(&base85Decode), "base85decode"); + m_module->add(Carbon::fun(&base91Encode), "base91encode"); + m_module->add(Carbon::fun(&base91Decode), "base91decode"); + m_module->add(Carbon::fun(&base128Encode), "base128encode"); + m_module->add(Carbon::fun(&base128Decode), "base128decode"); return m_module; } catch (const std::bad_any_cast &e) { diff --git a/src/atom/algorithm/algorithm.cpp b/src/atom/algorithm/algorithm.cpp new file mode 100644 index 00000000..ddbb8576 --- /dev/null +++ b/src/atom/algorithm/algorithm.cpp @@ -0,0 +1,164 @@ +#include "algorithm.hpp" + +#include + +namespace Atom::Algorithm { + +KMP::KMP(std::string_view pattern) : pattern_(pattern) { + failure_ = ComputeFailureFunction(pattern_); +} + +std::vector KMP::Search(std::string_view text) { + std::vector occurrences; + int n = static_cast(text.length()); + int m = static_cast(pattern_.length()); + int i = 0, j = 0; + while (i < n) { + if (text[i] == pattern_[j]) { + ++i; + ++j; + if (j == m) { + occurrences.push_back(i - m); + j = failure_[j - 1]; + } + } else if (j > 0) { + j = failure_[j - 1]; + } else { + ++i; + } + } + return occurrences; +} + +void KMP::SetPattern(std::string_view pattern) { + pattern_ = pattern; + failure_ = ComputeFailureFunction(pattern_); +} + +std::vector KMP::ComputeFailureFunction(std::string_view pattern) { + int m = static_cast(pattern.length()); + std::vector failure(m, 0); + int i = 1, j = 0; + while (i < m) { + if (pattern[i] == pattern[j]) { + failure[i] = j + 1; + ++i; + ++j; + } else if (j > 0) { + j = failure[j - 1]; + } else { + failure[i] = 0; + ++i; + } + } + return failure; +} + +MinHash::MinHash(int num_hash_functions) + : m_num_hash_functions(num_hash_functions) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dis; + + for (int i = 0; i < num_hash_functions; ++i) { + m_coefficients_a.push_back(dis(gen)); + m_coefficients_b.push_back(dis(gen)); + } +} + +std::vector MinHash::compute_signature( + const std::unordered_set& set) { + std::vector signature( + m_num_hash_functions, std::numeric_limits::max()); + + for (const auto& element : set) { + for (int i = 0; i < m_num_hash_functions; ++i) { + unsigned long long hash_value = hash(element, i); + signature[i] = std::min(signature[i], hash_value); + } + } + + return signature; +} + +double MinHash::estimate_similarity( + const std::vector& signature1, + const std::vector& signature2) { + int num_matches = 0; + for (int i = 0; i < m_num_hash_functions; ++i) { + if (signature1[i] == signature2[i]) { + ++num_matches; + } + } + return static_cast(num_matches) / m_num_hash_functions; +} + +unsigned long long MinHash::hash(const std::string& element, int index) { + unsigned long long hash_value = 0; + for (char c : element) { + hash_value += + (m_coefficients_a[index] * static_cast(c) + + m_coefficients_b[index]); + } + return hash_value; +} + +BoyerMoore::BoyerMoore(std::string_view pattern) : pattern_(pattern) { + ComputeBadCharacterShift(); + ComputeGoodSuffixShift(); +} + +std::vector BoyerMoore::Search(std::string_view text) { + std::vector occurrences; + int n = static_cast(text.length()); + int m = static_cast(pattern_.length()); + int i = 0; + while (i <= n - m) { + int j = m - 1; + while (j >= 0 && pattern_[j] == text[i + j]) { + --j; + } + if (j < 0) { + occurrences.push_back(i); + i += good_suffix_shift_[0]; + } else { + i += std::max(good_suffix_shift_[j + 1], + bad_char_shift_[text[i + j]] - m + 1 + j); + } + } + return occurrences; +} + +void BoyerMoore::SetPattern(std::string_view pattern) { + pattern_ = pattern; + ComputeBadCharacterShift(); + ComputeGoodSuffixShift(); +} + +void BoyerMoore::ComputeBadCharacterShift() { + bad_char_shift_.clear(); + for (int i = 0; i < static_cast(pattern_.length()) - 1; ++i) { + bad_char_shift_[pattern_[i]] = + static_cast(pattern_.length()) - 1 - i; + } +} + +void BoyerMoore::ComputeGoodSuffixShift() { + int m = static_cast(pattern_.length()); + good_suffix_shift_.resize(m, m); + std::vector suffix(m, 0); + int j = 0; + for (int i = m - 1; i >= 0; --i) { + if (pattern_.substr(i) == pattern_.substr(m - j - 1, j + 1)) { + suffix[i] = j + 1; + } + if (i > 0) { + good_suffix_shift_[m - suffix[i]] = m - i; + } + } + for (int i = 0; i < m - 1; ++i) { + good_suffix_shift_[m - suffix[i]] = m - i; + } +} + +} // namespace Atom::Algorithm \ No newline at end of file diff --git a/src/atom/algorithm/algorithm.hpp b/src/atom/algorithm/algorithm.hpp new file mode 100644 index 00000000..94095af3 --- /dev/null +++ b/src/atom/algorithm/algorithm.hpp @@ -0,0 +1,221 @@ +/* + * base.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-4-5 + +Description: A collection of algorithms for C++ + +**************************************************/ + +#ifndef ATOM_ALGORITHM_ALGORITHM_HPP +#define ATOM_ALGORITHM_ALGORITHM_HPP + +#include +#include +#include +#include +#include +#include + +namespace Atom::Algorithm { +/** + * @brief The KMP class implements the Knuth-Morris-Pratt string searching + * algorithm. + */ +class KMP { +public: + /** + * @brief Constructs a new KMP object with the specified pattern. + * @param pattern The pattern to search for. + */ + explicit KMP(std::string_view pattern); + + /** + * @brief Searches for occurrences of the pattern in the given text. + * @param text The text to search in. + * @return A vector containing the starting positions of all occurrences of + * the pattern in the text. + */ + std::vector Search(std::string_view text); + + /** + * @brief Sets a new pattern to search for. + * @param pattern The new pattern to set. + */ + void SetPattern(std::string_view pattern); + +private: + /** + * @brief Computes the failure function for the specified pattern. + * @param pattern The pattern for which to compute the failure function. + * @return A vector containing the failure function values. + */ + std::vector ComputeFailureFunction(std::string_view pattern); + + std::string pattern_; /**< The pattern to search for. */ + std::vector + failure_; /**< The failure function for the current pattern. */ +}; + +/** + * @brief The MinHash class implements the MinHash algorithm for estimating the + * Jaccard similarity between sets. + */ +class MinHash { +public: + /** + * @brief Constructs a new MinHash object with the specified number of hash + * functions. + * @param num_hash_functions The number of hash functions to use for + * computing MinHash signatures. + */ + explicit MinHash(int num_hash_functions); + + /** + * @brief Computes the MinHash signature for the given set. + * @param set The set for which to compute the MinHash signature. + * @return A vector containing the MinHash signature of the set. + */ + std::vector compute_signature( + const std::unordered_set& set); + + /** + * @brief Estimates the Jaccard similarity between two sets using their + * MinHash signatures. + * @param signature1 The MinHash signature of the first set. + * @param signature2 The MinHash signature of the second set. + * @return The estimated Jaccard similarity between the two sets. + */ + double estimate_similarity( + const std::vector& signature1, + const std::vector& signature2); + +private: + /** + * @brief Computes the hash value of an element using a specific hash + * function. + * @param element The element to hash. + * @param index The index of the hash function to use. + * @return The hash value of the element. + */ + unsigned long long hash(const std::string& element, int index); + + int m_num_hash_functions; /**< The number of hash functions used for + MinHash. */ + std::vector + m_coefficients_a; /**< Coefficients 'a' for hash functions. */ + std::vector + m_coefficients_b; /**< Coefficients 'b' for hash functions. */ +}; + +/** + * @brief The BloomFilter class implements a Bloom filter data structure. + * @tparam N The size of the Bloom filter (number of bits). + */ +template +class BloomFilter { +public: + /** + * @brief Constructs a new BloomFilter object with the specified number of + * hash functions. + * @param num_hash_functions The number of hash functions to use for the + * Bloom filter. + */ + explicit BloomFilter(std::size_t num_hash_functions) + : m_num_hash_functions(num_hash_functions) {} + + /** + * @brief Inserts an element into the Bloom filter. + * @param element The element to insert. + */ + void insert(std::string_view element) { + for (std::size_t i = 0; i < m_num_hash_functions; ++i) { + std::size_t hash_value = hash(element, i); + m_bits.set(hash_value % N); + } + } + + /** + * @brief Checks if an element might be present in the Bloom filter. + * @param element The element to check. + * @return True if the element might be present, false otherwise. + */ + bool contains(std::string_view element) const { + for (std::size_t i = 0; i < m_num_hash_functions; ++i) { + std::size_t hash_value = hash(element, i); + if (!m_bits.test(hash_value % N)) { + return false; + } + } + return true; + } + +private: + std::bitset m_bits; /**< The bitset representing the Bloom filter. */ + std::size_t m_num_hash_functions; /**< The number of hash functions used. */ + + /** + * @brief Computes the hash value of an element using a specific seed. + * @param element The element to hash. + * @param seed The seed value for the hash function. + * @return The hash value of the element. + */ + std::size_t hash(std::string_view element, std::size_t seed) const { + std::size_t hash_value = seed; + for (char c : element) { + hash_value = hash_value * 31 + static_cast(c); + } + return hash_value; + } +}; + +/** + * @brief The BoyerMoore class implements the Boyer-Moore algorithm for string + * searching. + */ +class BoyerMoore { +public: + /** + * @brief Constructs a new BoyerMoore object with the specified pattern. + * @param pattern The pattern to search for. + */ + explicit BoyerMoore(std::string_view pattern); + + /** + * @brief Searches for occurrences of the pattern in the given text. + * @param text The text in which to search for the pattern. + * @return A vector containing the starting positions of all occurrences of + * the pattern in the text. + */ + std::vector Search(std::string_view text); + + /** + * @brief Sets a new pattern for the BoyerMoore object. + * @param pattern The new pattern to set. + */ + void SetPattern(std::string_view pattern); + +private: + /** + * @brief Computes the bad character shift table for the pattern. + */ + void ComputeBadCharacterShift(); + + /** + * @brief Computes the good suffix shift table for the pattern. + */ + void ComputeGoodSuffixShift(); + + std::string pattern_; /**< The pattern to search for. */ + std::unordered_map + bad_char_shift_; /**< The bad character shift table. */ + std::vector good_suffix_shift_; /**< The good suffix shift table. */ +}; +} // namespace Atom::Algorithm + +#endif diff --git a/src/atom/algorithm/base.cpp b/src/atom/algorithm/base.cpp index 822d0362..7724b2a5 100644 --- a/src/atom/algorithm/base.cpp +++ b/src/atom/algorithm/base.cpp @@ -15,6 +15,7 @@ Description: A collection of algorithms for C++ #include "base.hpp" #include +#include #include #include #include @@ -328,6 +329,92 @@ std::vector base85Decode(const std::string &data) { return result; } +constexpr std::array kEncodeTable = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '#', '$', + '%', '&', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=', + '>', '?', '@', '[', ']', '^', '_', '`', '{', '|', '}', '~', '"'}; + +constexpr std::array kDecodeTable = []() { + std::array table{}; + table.fill(-1); + for (int i = 0; i < kEncodeTable.size(); ++i) { + table[kEncodeTable[i]] = i; + } + return table; +}(); + +std::string base91Encode(std::string_view data) { + std::string result; + result.reserve(data.size() * 2); + + int ebq = 0; + int en = 0; + for (char c : data) { + ebq |= static_cast(c) << en; + en += 8; + if (en > 13) { + int ev = ebq & 8191; + if (ev > 88) { + ebq >>= 13; + en -= 13; + } else { + ev = ebq & 16383; + ebq >>= 14; + en -= 14; + } + result += kEncodeTable[ev % 91]; + result += kEncodeTable[ev / 91]; + } + } + + if (en > 0) { + result += kEncodeTable[ebq % 91]; + if (en > 7 || ebq > 90) { + result += kEncodeTable[ebq / 91]; + } + } + + return result; +} + +std::string base91Decode(std::string_view data) { + std::string result; + result.reserve(data.size()); + + int dbq = 0; + int dn = 0; + int dv = -1; + + for (char c : data) { + if (c == '"') { + continue; + } + if (dv == -1) { + dv = kDecodeTable[c]; + } else { + dv += kDecodeTable[c] * 91; + dbq |= dv << dn; + dn += (dv & 8191) > 88 ? 13 : 14; + do { + result += static_cast(dbq & 0xFF); + dbq >>= 8; + dn -= 8; + } while (dn > 7); + dv = -1; + } + } + + if (dv != -1) { + result += static_cast((dbq | dv << dn) & 0xFF); + } + + return result; +} + std::string base128Encode(const uint8_t *data, size_t length) { std::string result; result.reserve((length * 8 + 6) / 7); diff --git a/src/atom/algorithm/base.hpp b/src/atom/algorithm/base.hpp index 63270efc..181787f6 100644 --- a/src/atom/algorithm/base.hpp +++ b/src/atom/algorithm/base.hpp @@ -130,6 +130,22 @@ base85Encode(const std::vector &data); "The result of base85Decode is not used.")]] std::vector base85Decode(const std::string &data); +/** + * @brief Encodes a string to Base91 + * @param data The string to encode + * @return The encoded string + */ +[[nodiscard("The result of base91Encode is not used.")]] +std::string base91Encode(std::string_view data); + +/** + * @brief Decodes a Base91 string + * @param data The string to decode + * @return The decoded string + */ +[[nodiscard("The result of base91Decode is not used.")]] std::string +base91Decode(std::string_view data); + /** * @brief Encodes a vector of unsigned characters into a Base128 string. * diff --git a/src/atom/algorithm/fraction.cpp b/src/atom/algorithm/fraction.cpp index 2bd25c9b..dfcbea4e 100644 --- a/src/atom/algorithm/fraction.cpp +++ b/src/atom/algorithm/fraction.cpp @@ -2,6 +2,7 @@ #include #include +#include namespace Atom::Algorithm { @@ -115,13 +116,11 @@ Fraction Fraction::operator-() const { return Fraction(-numerator, denominator); } -explicit Fraction::operator double() const { return to_double(); } +Fraction::operator double() const { return to_double(); } -explicit Fraction::operator float() const { - return static_cast(to_double()); -} +Fraction::operator float() const { return static_cast(to_double()); } -explicit Fraction::operator int() const { return numerator / denominator; } +Fraction::operator int() const { return numerator / denominator; } std::string Fraction::to_string() const { if (denominator == 1) { @@ -142,8 +141,10 @@ std::ostream &operator<<(std::ostream &os, const Fraction &f) { std::istream &operator>>(std::istream &is, Fraction &f) { int n, d; char slash; - is >> n >> slash >> d; - f = Fraction(n, d); + // TODO: Fix this + // is >> n >> slash >> d; + f = Fraction(n, d); // Assuming Fraction has a constructor that takes + // numerator and denominator return is; } diff --git a/src/atom/algorithm/fraction.hpp b/src/atom/algorithm/fraction.hpp index 38742982..c88fc317 100644 --- a/src/atom/algorithm/fraction.hpp +++ b/src/atom/algorithm/fraction.hpp @@ -19,40 +19,182 @@ Description: Implementation of fraction class #include #include - namespace Atom::Algorithm { - +/** + * @brief Represents a fraction with numerator and denominator. + */ class Fraction { -private: - int numerator; - int denominator; - + /** + * @brief Computes the greatest common divisor (GCD) of two numbers. + * @param a The first number. + * @param b The second number. + * @return The GCD of the two numbers. + */ static int gcd(int a, int b); + + /** + * @brief Reduces the fraction to its simplest form. + */ void reduce(); +// For pybind11 compatibility +public: + int numerator; /**< The numerator of the fraction. */ + int denominator; /**< The denominator of the fraction. */ + public: + /** + * @brief Constructs a new Fraction object with the given numerator and + * denominator. + * @param n The numerator (default is 0). + * @param d The denominator (default is 1). + */ Fraction(int n = 0, int d = 1); + + /** + * @brief Adds another fraction to this fraction. + * @param other The fraction to add. + * @return Reference to the modified fraction. + */ Fraction& operator+=(const Fraction& other); + + /** + * @brief Subtracts another fraction from this fraction. + * @param other The fraction to subtract. + * @return Reference to the modified fraction. + */ Fraction& operator-=(const Fraction& other); + + /** + * @brief Multiplies this fraction by another fraction. + * @param other The fraction to multiply by. + * @return Reference to the modified fraction. + */ Fraction& operator*=(const Fraction& other); + + /** + * @brief Divides this fraction by another fraction. + * @param other The fraction to divide by. + * @return Reference to the modified fraction. + */ Fraction& operator/=(const Fraction& other); + + /** + * @brief Adds another fraction to this fraction. + * @param other The fraction to add. + * @return The result of addition. + */ Fraction operator+(const Fraction& other) const; + + /** + * @brief Subtracts another fraction from this fraction. + * @param other The fraction to subtract. + * @return The result of subtraction. + */ Fraction operator-(const Fraction& other) const; + + /** + * @brief Multiplies this fraction by another fraction. + * @param other The fraction to multiply by. + * @return The result of multiplication. + */ Fraction operator*(const Fraction& other) const; + + /** + * @brief Divides this fraction by another fraction. + * @param other The fraction to divide by. + * @return The result of division. + */ Fraction operator/(const Fraction& other) const; + + /** + * @brief Compares this fraction with another fraction. + * @param other The fraction to compare with. + * @return An integer indicating the comparison result. + */ auto operator<=>(const Fraction& other) const; + + /** + * @brief Checks if this fraction is equal to another fraction. + * @param other The fraction to compare with. + * @return True if fractions are equal, false otherwise. + */ bool operator==(const Fraction& other) const; + + /** + * @brief Pre-increments the fraction by 1. + * @return Reference to the modified fraction. + */ Fraction& operator++(); + + /** + * @brief Post-increments the fraction by 1. + * @return The fraction before incrementing. + */ Fraction operator++(int); + + /** + * @brief Pre-decrements the fraction by 1. + * @return Reference to the modified fraction. + */ Fraction& operator--(); + + /** + * @brief Post-decrements the fraction by 1. + * @return The fraction before decrementing. + */ Fraction operator--(int); + + /** + * @brief Negates the fraction. + * @return The negated fraction. + */ Fraction operator-() const; + + /** + * @brief Converts the fraction to a double value. + * @return The fraction as a double. + */ explicit operator double() const; + + /** + * @brief Converts the fraction to a float value. + * @return The fraction as a float. + */ explicit operator float() const; + + /** + * @brief Converts the fraction to an integer value. + * @return The fraction as an integer. + */ explicit operator int() const; + + /** + * @brief Converts the fraction to a string representation. + * @return The string representation of the fraction. + */ std::string to_string() const; + + /** + * @brief Converts the fraction to a double value. + * @return The fraction as a double. + */ double to_double() const; + + /** + * @brief Outputs the fraction to the output stream. + * @param os The output stream. + * @param f The fraction to output. + * @return Reference to the output stream. + */ friend std::ostream& operator<<(std::ostream& os, const Fraction& f); + + /** + * @brief Inputs the fraction from the input stream. + * @param is The input stream. + * @param f The fraction to input. + * @return Reference to the input stream. + */ friend std::istream& operator>>(std::istream& is, Fraction& f); }; diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index be1fd984..932b33e1 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -25,16 +25,40 @@ Description: A collection of hash algorithms #include namespace Atom::Algorithm { +/** + * @brief Concept to check if a type is hashable. + * + * A type is considered hashable if it can be used as a key in hash-based + * containers. + */ template concept Hashable = requires(T a) { { std::hash{}(a) } -> std::convertible_to; }; +/** + * @brief Computes the hash value of a single value. + * + * This function computes the hash value of a single value using std::hash. + * + * @param value The value for which to compute the hash. + * @return The hash value of the input value. + */ template std::size_t computeHash(const T& value) { return std::hash{}(value); } +/** + * @brief Computes the hash value of a vector of hashable values. + * + * This function computes the hash value of a vector of hashable values by + * combining the hash values of individual elements using a bitwise XOR + * operation. + * + * @param values The vector of hashable values. + * @return The hash value of the vector. + */ template std::size_t computeHash(const std::vector& values) { std::size_t result = 0; @@ -45,10 +69,20 @@ std::size_t computeHash(const std::vector& values) { return result; } +/** + * @brief Computes the hash value of a tuple of hashable values. + * + * This function computes the hash value of a tuple of hashable values by + * applying the computeHash function to each element of the tuple and combining + * the hash values using a bitwise XOR operation. + * + * @param tuple The tuple of hashable values. + * @return The hash value of the tuple. + */ template std::size_t computeHash(const std::tuple& tuple) { std::size_t result = 0; - apply( + std::apply( [&result](const Ts&... values) { ((result ^= computeHash(values) + 0x9e3779b9 + (result << 6) + (result >> 2)), @@ -58,6 +92,16 @@ std::size_t computeHash(const std::tuple& tuple) { return result; } +/** + * @brief Computes the hash value of an array of hashable values. + * + * This function computes the hash value of an array of hashable values by + * combining the hash values of individual elements using a bitwise XOR + * operation. + * + * @param array The array of hashable values. + * @return The hash value of the array. + */ template std::size_t computeHash(const std::array& array) { std::size_t result = 0; @@ -68,6 +112,15 @@ std::size_t computeHash(const std::array& array) { return result; } +/** + * @brief Computes the FNV-1a hash value of a range. + * + * This function computes the FNV-1a hash value of a range defined by iterators. + * + * @param begin Iterator to the beginning of the range. + * @param end Iterator to the end of the range. + * @return The FNV-1a hash value of the range. + */ template constexpr std::uint32_t fnv1a_hash(Itr begin, Itr end) noexcept { std::uint32_t h = 0x811c9dc5; @@ -79,19 +132,54 @@ constexpr std::uint32_t fnv1a_hash(Itr begin, Itr end) noexcept { return h; } +/** + * @brief Computes the FNV-1a hash value of a null-terminated string literal. + * + * This function computes the FNV-1a hash value of a null-terminated string + * literal. + * + * @param str The null-terminated string literal. + * @return The FNV-1a hash value of the string. + */ template constexpr std::uint32_t fnv1a_hash(const char (&str)[N]) noexcept { return fnv1a_hash(std::begin(str), std::end(str) - 1); } +/** + * @brief Computes the FNV-1a hash value of a string view. + * + * This function computes the FNV-1a hash value of a string view. + * + * @param sv The string view. + * @return The FNV-1a hash value of the string view. + */ constexpr std::uint32_t fnv1a_hash(std::string_view sv) noexcept { return fnv1a_hash(sv.begin(), sv.end()); } +/** + * @brief Computes the FNV-1a hash value of a string. + * + * This function computes the FNV-1a hash value of a string. + * + * @param s The string. + * @return The FNV-1a hash value of the string. + */ inline std::uint32_t fnv1a_hash(const std::string& s) noexcept { return fnv1a_hash(std::string_view{s}); } +/** + * @brief Computes the Jenkins One-at-a-Time hash value of a range. + * + * This function computes the Jenkins One-at-a-Time hash value of a range + * defined by iterators. + * + * @param begin Iterator to the beginning of the range. + * @param end Iterator to the end of the range. + * @return The Jenkins One-at-a-Time hash value of the range. + */ template constexpr std::uint32_t jenkins_one_at_a_time_hash(Itr begin, Itr end) noexcept { @@ -110,20 +198,47 @@ constexpr std::uint32_t jenkins_one_at_a_time_hash(Itr begin, return hash; } +/** + * @brief Computes the Jenkins One-at-a-Time hash value of a null-terminated + * string literal. + * + * This function computes the Jenkins One-at-a-Time hash value of a + * null-terminated string literal. + * + * @param str The null-terminated string literal. + * @return The Jenkins One-at-a-Time hash value of the string. + */ template constexpr std::uint32_t jenkins_one_at_a_time_hash( const char (&str)[N]) noexcept { return jenkins_one_at_a_time_hash(std::begin(str), std::end(str) - 1); } +/** + * @brief Computes the Jenkins One-at-a-Time hash value of a string view. + * + * This function computes the Jenkins One-at-a-Time hash value of a string view. + * + * @param sv The string view. + * @return The Jenkins One-at-a-Time hash value of the string view. + */ constexpr std::uint32_t jenkins_one_at_a_time_hash( std::string_view sv) noexcept { return jenkins_one_at_a_time_hash(sv.begin(), sv.end()); } +/** + * @brief Computes the Jenkins One-at-a-Time hash value of a string. + * + * This function computes the Jenkins One-at-a-Time hash value of a string. + * + * @param s The string. + * @return The Jenkins One-at-a-Time hash value of the string. + */ inline std::uint32_t jenkins_one_at_a_time_hash(const std::string& s) noexcept { return jenkins_one_at_a_time_hash(std::string_view{s}); } + } // namespace Atom::Algorithm #endif diff --git a/src/atom/algorithm/math.cpp b/src/atom/algorithm/math.cpp index 0e106bd3..694c5797 100644 --- a/src/atom/algorithm/math.cpp +++ b/src/atom/algorithm/math.cpp @@ -1,5 +1,5 @@ /* - * math.cpp + * mathutils.cpp * * Copyright (C) 2023-2024 Max Qian */ @@ -14,246 +14,92 @@ Description: Extra Math Library #include "math.hpp" -#include -#include - -namespace Atom::Utils { -/* "+",加法重载部分 */ -// 友元函数是可以通过成员访问运算符访问私有成员的 -Fraction operator+(const Fraction &f1, const Fraction &f2) { - // 如果声明中加了const,定义中没有加const,可能会出现无权访问私有成员的报错 - // 加法友元重载函数定义 - int retnum = f1.getNumerator() * f2.getDenominator() + - f2.getNumerator() * f1.getDenominator(); - int retden = f1.getDenominator() * f2.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - if (retden < 0 && retnum >= 0) { - ratio *= -1; - } - return Fraction( - retnum / ratio, - retden / ratio); // 在使用的时候编译器会自动调用构造函数Fraction(const - // Fraction&),用来处理作用域问题(深复制了) -} - -/* "-",减法重载部分 */ -Fraction operator-(const Fraction &f1, const Fraction &f2) { - // 减法友元重载函数定义 - int retnum = f1.getNumerator() * f2.getDenominator() - - f2.getNumerator() * f1.getDenominator(); - int retden = f1.getDenominator() * f2.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - if (retden < 0 && retnum >= 0) { - ratio *= -1; - } - return Fraction( - retnum / ratio, - retden / - ratio); // 在使用的时候编译器会自动调用Fraction默认构造函数,用来处理作用域问题(深复制了) -} - -/* "*",乘法重载部分 */ -Fraction operator*(const Fraction &f1, const Fraction &f2) { - // 加法友元重载函数定义 - int retnum = f1.getNumerator() * f2.getNumerator(); - int retden = f1.getDenominator() * f2.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - if (retden < 0 && retnum >= 0) { - ratio *= -1; - } - return Fraction(retnum / ratio, retden / ratio); -} - -/* '/'乘法重载 */ -Fraction operator/(const Fraction &f1, const Fraction &f2) { - // 减法友元重载函数定义 - int retnum = f1.getNumerator() * f2.getDenominator(); - int retden = f1.getDenominator() * f2.getNumerator(); - int ratio = Fraction::Euclid(retnum, retden); - if (retden < 0 && retnum >= 0) { - ratio *= -1; - } - return Fraction(retnum / ratio, retden / ratio); -} - -// "+="运算符作为成员函数进行重载 -Fraction &Fraction::operator+=(const Fraction &f) { - int retnum = this->numerator * f.getDenominator() + - this->denominator * f.getNumerator(); - int retden = this->denominator * f.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - // 保证分母永远大于0 - if (this->denominator < 0 && this->numerator >= 0) { - ratio *= -1; - } - this->numerator = retnum / ratio; - this->denominator = retden / ratio; - return (*this); -} - -// "-="运算符作为成员函数进行重载 - -Fraction &Fraction::operator-=(const Fraction &f) { - int retnum = this->numerator * f.getDenominator() - - this->denominator * f.getNumerator(); - int retden = this->denominator * f.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - if (this->denominator < 0 && this->numerator >= 0) { - ratio *= -1; - } - this->numerator = retnum / ratio; - this->denominator = retden / ratio; - return (*this); -} - -// "*="运算符作为成员函数进行重载 -Fraction &Fraction::operator*=(const Fraction &f) { - int retnum = this->numerator * f.getNumerator(); - int retden = this->denominator * f.getDenominator(); - int ratio = Fraction::Euclid(retnum, retden); - if (this->denominator < 0 && this->numerator >= 0) { - ratio *= -1; - } - this->numerator = retnum / ratio; - this->denominator = retden / ratio; - return *this; -} -Fraction &Fraction::operator/=(const Fraction &f) { - int retnum = this->numerator * f.getDenominator(); - int retden = this->denominator * f.getNumerator(); - int ratio = Fraction::Euclid(retnum, retden); - if (this->denominator < 0 && this->numerator >= 0) { - ratio *= -1; +#if defined(_MSC_VER) +#include +#endif + +namespace Atom::Algorithm { + +uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, + uint64_t divider) { +#if defined(__GNUC__) && defined(__SIZEOF_INT128__) + __uint128_t a = operant; + __uint128_t b = multiplier; + __uint128_t c = divider; + + return (uint64_t)(a * b / c); +#elif defined(_MSC_VER) +#if defined(_M_IX86) + // Your x86 specific code here +#elif defined(_M_X64) +#pragma warning(push) +#pragma warning(disable : 4244) // C4244: 'conversion' conversion from 'type1' + // to 'type2', possible loss of data + uint64_t a = operant; + uint64_t b = multiplier; + uint64_t c = divider; + + // Normalize divisor + unsigned long shift; + _BitScanReverse64(&shift, c); + shift = 63 - shift; + + c <<= shift; + + // Multiply + a = _umul128(a, b, &b); + if (((b << shift) >> shift) != b) { + // Overflow + return 0xFFFFFFFFFFFFFFFF; } - this->numerator = retnum / ratio; - this->denominator = retden / ratio; - - return *this; -} -Fraction &Fraction::operator=(const Fraction &f) { - this->numerator = f.getNumerator(); - this->denominator = f.getDenominator(); - return *this; -} - -Fraction &Fraction::operator=(const Fraction &&f) { - this->numerator = f.getNumerator(); - this->denominator = f.getDenominator(); - return *this; -} - -bool operator==(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num == res_den) { - result = true; - } - return result; -} - -bool operator!=(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num != res_den) { - result = true; - } - return result; -} - -bool operator>(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num > res_den) { - result = true; + b = __shiftleft128(a, b, shift); + a <<= shift; + + uint32_t div; + uint32_t q0, q1; + uint64_t t0, t1; + + // 1st Reduction + div = (uint32_t)(c >> 32); + t0 = b / div; + if (t0 > 0xFFFFFFFF) + t0 = 0xFFFFFFFF; + q1 = (uint32_t)t0; + while (1) { + t0 = _umul128(c, (uint64_t)q1 << 32, &t1); + if (t1 < b || (t1 == b && t0 <= a)) + break; + q1--; } - return result; -} - -bool operator>=(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num >= res_den) { - result = true; + b -= t1; + if (t0 > a) + b--; + a -= t0; + + if (b > 0xFFFFFFFF) { + // Overflow + return 0xFFFFFFFFFFFFFFFF; } - return result; -} -bool operator<(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num < res_den) { - result = true; + // 2nd reduction + t0 = ((b << 32) | (a >> 32)) / div; + if (t0 > 0xFFFFFFFF) + t0 = 0xFFFFFFFF; + q0 = (uint32_t)t0; + + while (1) { + t0 = _umul128(c, q0, &t1); + if (t1 < b || (t1 == b && t0 <= a)) + break; + q0--; } - return result; -} -bool operator<=(const Fraction &f1, const Fraction &f2) { - int f1_num = f1.getNumerator(); - int f1_den = f1.getDenominator(); - int f2_num = f2.getNumerator(); - int f2_den = f2.getDenominator(); - int res_num = f1_num * f2_den; - int res_den = f1_den * f2_num; - bool result = false; - if (res_num <= res_den) { - result = true; - } - return result; + return ((uint64_t)q1 << 32) | q0; +#pragma warning(pop) +#endif +#else +#error MulDiv64 is no supported! +#endif } -std::istream &operator>>(std::istream &input, Fraction &f) { - input >> f.numerator; - char split_c = input.peek(); - - if (split_c > '9' || split_c < '0') { - if (split_c == '/') { - input >> split_c; - input >> f.denominator; - if (f.denominator == 0) { - throw Exception::WrongArgument( - "Got 0 in the denominator of Math::Fraction object!"); - } - if (f.denominator < 0) { - f.denominator *= -1; - f.numerator *= -1; - } - return input; - } - } - f.denominator = 1; - return input; -} -std::ostream &operator<<(std::ostream &output, const Fraction &f) { - output << f.getNumerator() << "/" << f.getDenominator(); - return output; -} -std::ostream &operator<<(std::ostream &output, const Fraction &&f) { - output << f.getNumerator() << "/" << f.getDenominator(); - return output; -} -} // namespace Atom::Utils +} // namespace Atom::Algorithm diff --git a/src/atom/algorithm/math.hpp b/src/atom/algorithm/math.hpp index 6e4b153f..2ac45700 100644 --- a/src/atom/algorithm/math.hpp +++ b/src/atom/algorithm/math.hpp @@ -15,125 +15,20 @@ Description: Extra Math Library #ifndef ATOM_ALGORITHM_MATH_HPP #define ATOM_ALGORITHM_MATH_HPP -#include -#include -#include "exception.hpp" +#include namespace Atom::Algorithm { -class Fraction; -// 运算符,友元函数声明 -Fraction operator+(const Fraction &f1, const Fraction &f2); - -Fraction operator-(const Fraction &f1, const Fraction &f2); - -Fraction operator*(const Fraction &f1, const Fraction &f2); - -Fraction operator/(const Fraction &f1, const Fraction &f2); -// 接收两个运算算子的引用,返回一个Fraction对象 - -bool operator==(const Fraction &f1, const Fraction &f2); - -bool operator!=(const Fraction &f1, const Fraction &f2); - -bool operator>(const Fraction &f1, const Fraction &f2); -bool operator>=(const Fraction &f1, const Fraction &f2); -bool operator<(const Fraction &f1, const Fraction &f2); -bool operator<=(const Fraction &f1, const Fraction &f2); - -std::istream &operator>>(std::istream &input, Fraction &f); -std::ostream &operator<<(std::ostream &output, const Fraction &f); -std::ostream &operator<<(std::ostream &output, const Fraction &&f); - -class Fraction { -private: - int numerator; // 分子 - int denominator; // 分母 -public: - static int Euclid(int a, int b) { - // 计算两个数的最大公因数(欧几里得算法) - // 声明为静态成员函数 - int c; - while (a % b != 0) { - c = b; - b = a % b; - a = c; - } - return b; - }; - // 保留隐式转换,减少编程工作 - Fraction(int num_value, int den_value) - : numerator(num_value), denominator(den_value) { - if (this->denominator == 0) { - throw Exception::WrongArgument( - "Got 0 in the denominator of Math::Fraction object!"); - } - }; - Fraction(int num_value) : numerator(num_value), denominator(1){}; - Fraction(const char *str) { - this->denominator = 1; - std::stringstream inistream; - inistream << str; - inistream >> (*this); - } - Fraction() : numerator(0), denominator(1){}; - Fraction(const Fraction &f) - : numerator(f.getNumerator()), denominator(f.getDenominator()){}; - Fraction(Fraction &&f) - : numerator(f.numerator), denominator(f.denominator){}; - - inline int getNumerator() const { return numerator; } - // 申明为不可修改数据的函数,const常函数 - inline int getDenominator() const { return denominator; } - - inline void alterValue(int num_value, int den_value) { - this->numerator = num_value; - this->denominator = den_value; - } - - inline void alterValue(const Fraction &f) { - this->numerator = f.getNumerator(); - this->denominator = f.getDenominator(); - } - - inline Fraction inverse() { - // 返回这个分数的倒数 - return Fraction(this->getDenominator(), this->getNumerator()); - } - - friend Fraction operator+(const Fraction &f1, const Fraction &f2); - - friend Fraction operator-(const Fraction &f1, const Fraction &f2); - - friend Fraction operator*(const Fraction &f1, const Fraction &f2); - - friend Fraction operator/(const Fraction &f1, const Fraction &f2); - - // 负号运算符,将一个分数变成其相反数 - inline Fraction operator-() { - return Fraction(-this->numerator, this->denominator); - } - Fraction &operator+=(const Fraction &f); - - Fraction &operator-=(const Fraction &f); - - Fraction &operator*=(const Fraction &f); - - Fraction &operator/=(const Fraction &f); - - Fraction &operator=(const Fraction &f); - - Fraction &operator=(const Fraction &&f); - - friend bool operator==(const Fraction &f1, const Fraction &f2); - friend bool operator!=(const Fraction &f1, const Fraction &f2); - friend bool operator>(const Fraction &f1, const Fraction &f2); - friend bool operator>=(const Fraction &f1, const Fraction &f2); - friend bool operator<(const Fraction &f1, const Fraction &f2); - friend bool operator<=(const Fraction &f1, const Fraction &f2); - friend std::istream &operator>>(std::istream &input, Fraction &f); - friend std::ostream &operator<<(std::ostream &output, const Fraction &f); - friend std::ostream &operator<<(std::ostream &output, const Fraction &&f); -}; +/** + * @brief Performs a 64-bit multiplication followed by division. + * + * This function calculates the result of (operant * multiplier) / divider. + * + * @param operant The first operand for multiplication. + * @param multiplier The second operand for multiplication. + * @param divider The divisor for the division operation. + * @return The result of (operant * multiplier) / divider. + */ +uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, uint64_t divider); } // namespace Atom::Algorithm -#endif // ATOM_ALGORITHM_MATH_HPP +#endif \ No newline at end of file diff --git a/src/atom/algorithm/mathutils.cpp b/src/atom/algorithm/mathutils.cpp deleted file mode 100644 index 5a632eca..00000000 --- a/src/atom/algorithm/mathutils.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - * mathutils.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-11-10 - -Description: Extra Math Library - -**************************************************/ - -#include "mathutils.hpp" - -#if defined(_MSC_VER) -#include -#endif - -namespace Atom::Algorithm { - -uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, - uint64_t divider) { -#if defined(__GNUC__) && defined(__SIZEOF_INT128__) - __uint128_t a = operant; - __uint128_t b = multiplier; - __uint128_t c = divider; - - return (uint64_t)(a * b / c); -#elif defined(_MSC_VER) -#if defined(_M_IX86) - // Your x86 specific code here -#elif defined(_M_X64) -#pragma warning(push) -#pragma warning(disable : 4244) // C4244: 'conversion' conversion from 'type1' - // to 'type2', possible loss of data - uint64_t a = operant; - uint64_t b = multiplier; - uint64_t c = divider; - - // Normalize divisor - unsigned long shift; - _BitScanReverse64(&shift, c); - shift = 63 - shift; - - c <<= shift; - - // Multiply - a = _umul128(a, b, &b); - if (((b << shift) >> shift) != b) { - // Overflow - return 0xFFFFFFFFFFFFFFFF; - } - b = __shiftleft128(a, b, shift); - a <<= shift; - - uint32_t div; - uint32_t q0, q1; - uint64_t t0, t1; - - // 1st Reduction - div = (uint32_t)(c >> 32); - t0 = b / div; - if (t0 > 0xFFFFFFFF) - t0 = 0xFFFFFFFF; - q1 = (uint32_t)t0; - while (1) { - t0 = _umul128(c, (uint64_t)q1 << 32, &t1); - if (t1 < b || (t1 == b && t0 <= a)) - break; - q1--; - } - b -= t1; - if (t0 > a) - b--; - a -= t0; - - if (b > 0xFFFFFFFF) { - // Overflow - return 0xFFFFFFFFFFFFFFFF; - } - - // 2nd reduction - t0 = ((b << 32) | (a >> 32)) / div; - if (t0 > 0xFFFFFFFF) - t0 = 0xFFFFFFFF; - q0 = (uint32_t)t0; - - while (1) { - t0 = _umul128(c, q0, &t1); - if (t1 < b || (t1 == b && t0 <= a)) - break; - q0--; - } - - return ((uint64_t)q1 << 32) | q0; -#pragma warning(pop) -#endif -#else -#error MulDiv64 is no supported! -#endif -} - -} // namespace Atom::Algorithm diff --git a/src/atom/algorithm/mathutils.hpp b/src/atom/algorithm/mathutils.hpp deleted file mode 100644 index 5f7762ac..00000000 --- a/src/atom/algorithm/mathutils.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * mathutils.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-11-10 - -Description: Extra Math Library - -**************************************************/ - -#ifndef ATOM_ALGORITHM_MATHUTILS_HPP -#define ATOM_ALGORITHM_MATHUTILS_HPP - -#include - -namespace Atom::Algorithm { -/** - * @brief Performs a 64-bit multiplication followed by division. - * - * This function calculates the result of (operant * multiplier) / divider. - * - * @param operant The first operand for multiplication. - * @param multiplier The second operand for multiplication. - * @param divider The divisor for the division operation. - * @return The result of (operant * multiplier) / divider. - */ -uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, uint64_t divider); -} // namespace Atom::Algorithm - -#endif \ No newline at end of file diff --git a/src/atom/algorithm/md5.cpp b/src/atom/algorithm/md5.cpp index e3b771f6..c57efc89 100644 --- a/src/atom/algorithm/md5.cpp +++ b/src/atom/algorithm/md5.cpp @@ -18,8 +18,7 @@ Description: Self implemented MD5 algorithm. #include #include - -namespace Atom::Utils { +namespace Atom::Algorithm { constexpr uint32_t T[64] = { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, @@ -152,4 +151,4 @@ std::string MD5::encrypt(const std::string &input) { md5.update(input); return md5.finalize(); } -} // namespace Atom::Utils \ No newline at end of file +} // namespace Atom::Algorithm \ No newline at end of file diff --git a/src/atom/algorithm/md5.hpp b/src/atom/algorithm/md5.hpp index 0728612e..6944e71d 100644 --- a/src/atom/algorithm/md5.hpp +++ b/src/atom/algorithm/md5.hpp @@ -20,7 +20,7 @@ Description: Self implemented MD5 algorithm. #include -namespace Atom::Utils { +namespace Atom::Algorithm { /** * @brief The MD5 class for calculating MD5 hash of input data. */ @@ -97,6 +97,6 @@ class MD5 { std::vector _buffer; /**< Buffer for input data. */ }; -} // namespace Atom::Utils +} // namespace Atom::Algorithm #endif // MD5_H diff --git a/src/atom/async/CMakeLists.txt b/src/atom/async/CMakeLists.txt index b56a9459..4fe26bdc 100644 --- a/src/atom/async/CMakeLists.txt +++ b/src/atom/async/CMakeLists.txt @@ -51,4 +51,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) \ No newline at end of file +) + +if (ATOM_BUILD_PYTHON) +pybind11_add_module(${PROJECT_NAME}-py _pybind.cpp) +target_link_libraries(${PROJECT_NAME}-py PRIVATE ${PROJECT_NAME}) +endif() \ No newline at end of file diff --git a/src/atom/async/_pybind.cpp b/src/atom/async/_pybind.cpp new file mode 100644 index 00000000..c12fcbdf --- /dev/null +++ b/src/atom/async/_pybind.cpp @@ -0,0 +1,185 @@ +/* + * _pybind.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Python Binding of Atom-Async + +**************************************************/ + +#include +#include +#include +#include + +#include "async.hpp" +#include "queue.hpp" +#include "thread_wrapper.hpp" +#include "timer.hpp" +#include "trigger.hpp" + +namespace py = pybind11; + +using namespace Atom::Async; + +template +void start_wrapper(Thread& thread, Callable&& func, Args&&... args) { + thread.start(std::forward(func), std::forward(args)...); +} + +void bind_thread(py::module& m) { + py::class_(m, "Thread") + .def(py::init<>()) + .def("start", &start_wrapper, + "Starts a new thread with the specified callable object and " + "arguments.") + .def("request_stop", &Thread::request_stop, + "Requests the thread to stop execution.") + .def("join", &Thread::join, "Waits for the thread to finish execution.") + .def("running", &Thread::running, + "Checks if the thread is currently running.") + .def("swap", &Thread::swap, + "Swaps the content of this Thread object with another Thread " + "object.") + .def("get_id", &Thread::get_id, "Gets the ID of the thread.") + .def("get_stop_source", &Thread::get_stop_source, + "Gets the underlying std::stop_source object.") + .def("get_stop_token", &Thread::get_stop_token, + "Gets the underlying std::stop_token object.") + //.def_property_readonly("thread", &Thread::get_thread, + // "Gets the underlying std::jthread object.") + .def("__enter__", [](Thread& self) -> Thread& { return self; }) + .def("__exit__", [](Thread& self, py::object, py::object, + py::object) { self.join(); }) + .def("__enter__", [](Thread& self) -> Thread& { return self; }) + .def("__exit__", [](Thread& self, py::object, py::object, py::object) { + self.join(); + }); +} + +// Bind TimerTask class +void bind_timer_task(py::module& m) { + py::class_(m, "TimerTask") + .def(py::init, unsigned int, int, int>()) + .def("__lt__", &TimerTask::operator<) + .def("run", &TimerTask::run) + .def("getNextExecutionTime", &TimerTask::getNextExecutionTime); +} + +// Bind Timer class +void bind_timer(py::module& m) { + py::class_(m, "Timer") + .def(py::init<>()) + .def("setTimeout", &Timer::setTimeout, + "Schedules a task to be executed once after a specified delay.") + .def("setInterval", &Timer::setInterval, + "Schedules a task to be executed repeatedly at a specified " + "interval.") + .def("now", &Timer::now, "Returns the current time.") + .def("cancelAllTasks", &Timer::cancelAllTasks, + "Cancels all scheduled tasks.") + .def("pause", &Timer::pause, "Pauses the execution of scheduled tasks.") + .def("resume", &Timer::resume, + "Resumes the execution of scheduled tasks after pausing.") + .def("stop", &Timer::stop, "Stops the timer and cancels all tasks.") + .def("setCallback", &Timer::setCallback, + "Sets a callback function to be called when a task is executed.") + .def("getTaskCount", &Timer::getTaskCount, + "Gets the number of scheduled tasks."); +} + +/* +// TODO: Fix this +template +void bind_thread_safe_queue(py::module& m, const std::string& name) { + py::class_>(m, name.c_str()) + .def(py::init<>()) + .def("put", &ThreadSafeQueue::put) + .def("take", &ThreadSafeQueue::take) + .def("destroy", &ThreadSafeQueue::destroy) + .def("size", &ThreadSafeQueue::size) + .def("empty", &ThreadSafeQueue::empty) + .def("clear", &ThreadSafeQueue::clear) + .def("front", &ThreadSafeQueue::front) + .def("back", &ThreadSafeQueue::back) + .def("emplace", &ThreadSafeQueue::template emplace) + .def("waitFor", &ThreadSafeQueue::template waitFor) + .def("waitUntilEmpty", &ThreadSafeQueue::waitUntilEmpty) + .def("extractIf", &ThreadSafeQueue::template extractIf) + .def("sort", &ThreadSafeQueue::template sort); +} + +// Bind AsyncWorker class +template +void bind_async_worker(py::module& m, const std::string& name) { + py::class_>(m, name.c_str()) + .def(py::init<>()) + //.def("StartAsync", + // &AsyncWorker::template StartAsync) + .def("GetResult", &AsyncWorker::GetResult) + .def("Cancel", &AsyncWorker::Cancel) + .def("IsDone", &AsyncWorker::IsDone) + .def("IsActive", &AsyncWorker::IsActive) + .def("Validate", &AsyncWorker::Validate) + .def("SetCallback", &AsyncWorker::SetCallback) + .def("SetTimeout", &AsyncWorker::SetTimeout) + .def("WaitForCompletion", &AsyncWorker::WaitForCompletion); +} + +// Bind AsyncWorkerManager class +template +void bind_async_worker_manager(py::module& m, const std::string& name) { + py::class_>(m, name.c_str()) + .def(py::init<>()) + .def( + "CreateWorker", + &AsyncWorkerManager::template CreateWorker) + .def("CancelAll", &AsyncWorkerManager::CancelAll) + .def("AllDone", &AsyncWorkerManager::AllDone) + .def("WaitForAll", &AsyncWorkerManager::WaitForAll) + .def("IsDone", &AsyncWorkerManager::IsDone) + .def("Cancel", &AsyncWorkerManager::Cancel); +} +*/ + +PYBIND11_MODULE(atom_async, m) { + m.doc() = "Atom Async Python Binding"; + + // Define the Trigger class and its methods + py::class_>(m, "Trigger") + .def(py::init<>()) + .def("register_callback", &Trigger::registerCallback) + .def("unregister_callback", &Trigger::unregisterCallback) + .def("trigger", &Trigger::trigger) + .def("schedule_trigger", &Trigger::scheduleTrigger) + .def("schedule_async_trigger", &Trigger::scheduleAsyncTrigger) + .def("cancel_trigger", &Trigger::cancelTrigger) + .def("cancel_all_triggers", &Trigger::cancelAllTriggers); + + + + bind_thread(m); + bind_timer_task(m); + bind_timer(m); + + /* + bind_thread_safe_queue(m, "ThreadSafeQueueInt"); + bind_thread_safe_queue(m, "ThreadSafeQueueDouble"); + bind_thread_safe_queue(m, "ThreadSafeQueueString"); + + bind_async_worker(m, "AsyncWorkerInt"); + bind_async_worker(m, "AsyncWorkerFloat"); + bind_async_worker(m, "AsyncWorkerString"); + + bind_async_worker_manager(m, "AsyncWorkerManagerInt"); + bind_async_worker_manager(m, "AsyncWorkerManagerFloat"); + bind_async_worker_manager(m, "AsyncWorkerManagerString"); + */ +} diff --git a/src/atom/async/async_impl.hpp b/src/atom/async/async_impl.hpp index 7b968b1c..0696698f 100644 --- a/src/atom/async/async_impl.hpp +++ b/src/atom/async/async_impl.hpp @@ -28,7 +28,7 @@ void AsyncWorker::StartAsync(Func &&func, Args &&...args) { template [[nodiscard]] ResultType AsyncWorker::GetResult() { if (!task_.valid()) { - throw Utils::Exception::InvalidArgument("Task is not valid"); + throw std::invalid_argument("Task is not valid"); } return task_.get(); } diff --git a/src/atom/async/queue.inl b/src/atom/async/queue.inl index 10699765..f026f202 100644 --- a/src/atom/async/queue.inl +++ b/src/atom/async/queue.inl @@ -201,4 +201,6 @@ std::vector> ThreadSafeQueue::groupBy( } */ -} // namespace Atom::Async \ No newline at end of file +} // namespace Atom::Async + +#endif \ No newline at end of file diff --git a/src/atom/async/trigger_impl.hpp b/src/atom/async/trigger_impl.hpp index 415af312..fa22d1dd 100644 --- a/src/atom/async/trigger_impl.hpp +++ b/src/atom/async/trigger_impl.hpp @@ -77,7 +77,6 @@ void Trigger::trigger(const std::string &event, try { callback.second(param); } catch (std::exception &e) { - throw std::throw_with_nested(std::nested_exception(e)); } } } @@ -86,7 +85,7 @@ template void Trigger::scheduleTrigger(const std::string &event, const ParamType ¶m, std::chrono::milliseconds delay) { - std::thread([=]() { + std::thread([this, event, param, delay]() { std::this_thread::sleep_for(delay); trigger(event, param); }).detach(); @@ -97,7 +96,7 @@ std::future Trigger::scheduleAsyncTrigger( const std::string &event, const ParamType ¶m) { auto promise = std::make_shared>(); auto future = promise->get_future(); - std::thread([=]() mutable { + std::thread([this, event, param, promise]() mutable { try { trigger(event, param); promise->set_value(); diff --git a/src/atom/connection/CMakeLists.txt b/src/atom/connection/CMakeLists.txt index 3e9343c4..02a59787 100644 --- a/src/atom/connection/CMakeLists.txt +++ b/src/atom/connection/CMakeLists.txt @@ -69,4 +69,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) \ No newline at end of file +) + +if (ATOM_BUILD_PYTHON) +pybind11_add_module(${PROJECT_NAME}-py _pybind.cpp) +target_link_libraries(${PROJECT_NAME}-py PRIVATE ${PROJECT_NAME}) +if (WIN32) +target_link_libraries(${PROJECT_NAME}-py PRIVATE ws2_32) +endif() +endif() \ No newline at end of file diff --git a/src/atom/connection/_pybind.cpp b/src/atom/connection/_pybind.cpp new file mode 100644 index 00000000..5351d1a8 --- /dev/null +++ b/src/atom/connection/_pybind.cpp @@ -0,0 +1,92 @@ +/* + * _pybind.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Python Binding of Atom-Connection + +**************************************************/ + +#include + +#include "fifoclient.hpp" +#include "fifoserver.hpp" +#include "shared_memory.hpp" +#include "sockethub.hpp" +#include "udp_server.hpp" + +#if ENABLE_SSHCLIENT +#include "sshclient.hpp" +#endif +namespace py = pybind11; + +using namespace Atom::Connection; + +template +void bind_shared_memory(py::module &m, const std::string &type_name) { + py::class_>(m, ("shared_memory_" + type_name).c_str()) + .def(py::init()) + .def("write", &SharedMemory::write, py::arg("data"), + py::arg("timeout") = std::chrono::milliseconds(0)) + .def("read", &SharedMemory::read, + py::arg("timeout") = std::chrono::milliseconds(0)) + .def("clear", &SharedMemory::clear) + .def("isOccupied", &SharedMemory::isOccupied); +} + +PYBIND11_MODULE(atom_connection, m) { + m.doc() = "Atom Connection Python Binding"; + + py::class_(m, "FifoClient") + .def(py::init()) + .def("write", &FifoClient::write) + .def("read", &FifoClient::read); + + py::class_(m, "FIFOServer") + .def(py::init()) + .def("sendMessage", &FIFOServer::sendMessage); + + bind_shared_memory(m, "int"); + bind_shared_memory(m, "float"); + bind_shared_memory(m, "double"); + + py::class_(m, "UdpSocketHub") + .def(py::init<>()) + .def("start", &UdpSocketHub::start, py::arg("port")) + .def("stop", &UdpSocketHub::stop) + .def("addHandler", &UdpSocketHub::addHandler) + .def("sendTo", &UdpSocketHub::sendTo, py::arg("message"), py::arg("ip"), + py::arg("port")); + +#if ENABLE_SSHCLIENT + py::class_(m, "SSHClient") + .def(py::init()) + .def("Connect", &SSHClient::Connect, py::arg("username"), + py::arg("password"), py::arg("timeout") = 10) + .def("IsConnected", &SSHClient::IsConnected) + .def("Disconnect", &SSHClient::Disconnect) + .def("ExecuteCommand", &SSHClient::ExecuteCommand) + .def("ExecuteCommands", &SSHClient::ExecuteCommands) + .def("FileExists", &SSHClient::FileExists) + .def("CreateDirectory", &SSHClient::CreateDirectory, + py::arg("remote_path"), py::arg("mode") = S_NORMAL) + .def("RemoveFile", &SSHClient::RemoveFile) + .def("RemoveDirectory", &SSHClient::RemoveDirectory) + .def("ListDirectory", &SSHClient::ListDirectory) + .def("Rename", &SSHClient::Rename) + .def("GetFileInfo", &SSHClient::GetFileInfo) + .def("DownloadFile", &SSHClient::DownloadFile) + .def("UploadFile", &SSHClient::UploadFile); +#endif + + py::class_(m, "SocketHub") + .def(py::init<>()) + .def("start", &SocketHub::start) + .def("stop", &SocketHub::stop) + .def("addHandler", &SocketHub::addHandler); +} diff --git a/src/atom/connection/fifoclient.cpp b/src/atom/connection/fifoclient.cpp index dd6f1796..1df396a1 100644 --- a/src/atom/connection/fifoclient.cpp +++ b/src/atom/connection/fifoclient.cpp @@ -14,79 +14,66 @@ Description: FIFO CLient #include "fifoclient.hpp" +#include +#include #include - -#include "atom/log/loguru.hpp" +#include namespace Atom::Connection { +FifoClient::FifoClient(const std::string& fifoPath) : m_fifoPath(fifoPath) { #ifdef _WIN32 -FifoClient::FifoClient(const std::string &fifoPath) - : fifoPath(fifoPath), - pipeHandle(INVALID_HANDLE_VALUE) + m_fifo = CreateFile(m_fifoPath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); +#elif __APPLE__ + // 在 macOS 上使用命名管道 + m_fifo = open(m_fifoPath.c_str(), O_RDWR); #else -FifoClient::FifoClient(const std::string &fifoPath) - : fifoPath(fifoPath), - pipeFd() + m_fifo = open(m_fifoPath.c_str(), O_RDWR); #endif -{ } -void FifoClient::connect() { - DLOG_F(INFO, "Connecting to FIFO..."); - +FifoClient::~FifoClient() { #ifdef _WIN32 - if (!WaitNamedPipeA(fifoPath.c_str(), NMPWAIT_WAIT_FOREVER)) { - throw std::runtime_error("Failed to connect to FIFO"); - } - - pipeHandle = CreateFileA(fifoPath.c_str(), GENERIC_WRITE, 0, nullptr, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); - - if (pipeHandle == INVALID_HANDLE_VALUE) { - throw std::runtime_error("Failed to open FIFO"); - } + CloseHandle(m_fifo); #else - int fd = open(fifoPath.c_str(), O_WRONLY); - if (fd == -1) { - throw std::runtime_error("Failed to open FIFO"); - } - - pipeFd = fd; + close(m_fifo); #endif - - DLOG_F(INFO, "Connected to FIFO"); } -void FifoClient::sendMessage(const std::string &message) { - DLOG_F(INFO, "Sending message..."); +bool FifoClient::write(const std::string& data) { + std::vector buffer(data.begin(), data.end()); + buffer.push_back('\0'); // 添加字符串结束符 #ifdef _WIN32 - DWORD numBytesWritten; - if (!WriteFile(pipeHandle, message.c_str(), message.length(), - &numBytesWritten, nullptr) || - numBytesWritten != message.length()) { - throw std::runtime_error("Failed to write message to FIFO"); - } + DWORD bytesWritten; + return WriteFile(m_fifo, buffer.data(), static_cast(buffer.size()), + &bytesWritten, nullptr) != 0; #else - ssize_t numBytesWritten = write(pipeFd, message.c_str(), message.length()); - if (numBytesWritten == -1 || - static_cast(numBytesWritten) != message.length()) { - throw std::runtime_error("Failed to write message to FIFO"); - } + return write(m_fifo, buffer.data(), buffer.size()) != -1; #endif - - DLOG_F(INFO, "Message sent"); } -void FifoClient::disconnect() { - DLOG_F(INFO, "Disconnecting from FIFO..."); +std::string FifoClient::read() { + std::string data; + char buffer[1024]; #ifdef _WIN32 - CloseHandle(pipeHandle); + DWORD bytesRead; + while (ReadFile(m_fifo, buffer, sizeof(buffer) - 1, &bytesRead, nullptr) != + 0 && + bytesRead != 0) { + buffer[bytesRead] = '\0'; + data += buffer; + } #else - close(pipeFd); + ssize_t bytesRead; + while ((bytesRead = read(m_fifo, buffer, sizeof(buffer) - 1)) > 0) { + buffer[bytesRead] = '\0'; + data += buffer; + } #endif - DLOG_F(INFO, "Disconnected from FIFO"); + return data; } + } // namespace Atom::Connection diff --git a/src/atom/connection/fifoclient.hpp b/src/atom/connection/fifoclient.hpp index e6530c2b..640791bb 100644 --- a/src/atom/connection/fifoclient.hpp +++ b/src/atom/connection/fifoclient.hpp @@ -29,43 +29,46 @@ Description: FIFO CLient namespace Atom::Connection { /** * @brief The FifoClient class provides functionality to connect to a FIFO - * (First In First Out) pipe, send messages through the pipe, and disconnect - * from the pipe. + * (First In First Out) pipe, write data to the pipe, and read data from + * the pipe. */ class FifoClient { public: /** - * @brief Constructor for FifoClient. + * @brief Constructs a FifoClient object with the specified FIFO path. + * * @param fifoPath The path to the FIFO pipe. */ - explicit FifoClient(const std::string &fifoPath); + FifoClient(const std::string& fifoPath); /** - * @brief Connects to the FIFO pipe. + * @brief Destructor for the FifoClient object. */ - void connect(); + ~FifoClient(); /** - * @brief Sends a message through the FIFO pipe. - * @param message The message to send. + * @brief Writes data to the FIFO pipe. + * + * @param data The data to be written to the pipe. + * @return True if the data was successfully written, false otherwise. */ - void sendMessage(const std::string &message); + bool write(const std::string& data); /** - * @brief Disconnects from the FIFO pipe. + * @brief Reads data from the FIFO pipe. + * + * @return The data read from the pipe as a string. */ - void disconnect(); + std::string read(); private: - std::string fifoPath; /**< The path to the FIFO pipe. */ - #ifdef _WIN32 - HANDLE pipeHandle; /**< Handle to the pipe (Windows). */ + HANDLE m_fifo; /**< Handle to the FIFO pipe (Windows). */ #else - int pipeFd; /**< File descriptor for the pipe (Unix/Linux). */ + int m_fifo; /**< File descriptor for the FIFO pipe (Unix/Linux). */ #endif + std::string m_fifoPath; /**< The path to the FIFO pipe. */ }; - } // namespace Atom::Connection #endif // FIFOSERVER_H diff --git a/src/atom/connection/fifoserver.cpp b/src/atom/connection/fifoserver.cpp index 91f82a2a..870cfaed 100644 --- a/src/atom/connection/fifoserver.cpp +++ b/src/atom/connection/fifoserver.cpp @@ -14,98 +14,80 @@ Description: FIFO Server #include "fifoserver.hpp" -#include - -#include "atom/log/loguru.hpp" - -namespace Atom::Connection { +#include +#include +#include #ifdef _WIN32 -FifoServer::FifoServer(const std::string &fifoPath) - : fifoPath(fifoPath), - pipeHandle(INVALID_HANDLE_VALUE) +#include #else -FifoServer::FifoServer(const std::string &fifoPath) - : fifoPath(fifoPath), - pipeFd() +#include +#include +#include +#include #endif -{ -} -void FifoServer::start() { - DLOG_F(INFO, "Starting FIFO server..."); +namespace Atom::Connection { +FIFOServer::FIFOServer(const std::string& fifo_path) : fifo_path_(fifo_path) { +// 创建 FIFO 文件 #ifdef _WIN32 - if (!WaitNamedPipeA(fifoPath.c_str(), NMPWAIT_WAIT_FOREVER)) { - throw std::runtime_error("Failed to connect to FIFO"); - } - - pipeHandle = - CreateNamedPipeA(fifoPath.c_str(), PIPE_ACCESS_INBOUND, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, - bufferSize, bufferSize, 0, nullptr); - - if (pipeHandle == INVALID_HANDLE_VALUE) { - throw std::runtime_error("Failed to create FIFO"); - } - - if (!ConnectNamedPipe(pipeHandle, nullptr)) { - throw std::runtime_error("Failed to establish connection with client"); - } -#else - if (mkfifo(fifoPath.c_str(), 0666) == -1) { - throw std::runtime_error("Failed to create FIFO"); - } - - int fd = open(fifoPath.c_str(), O_RDONLY); - if (fd == -1) { - throw std::runtime_error("Failed to open FIFO"); - } - - pipeFd = fd; + CreateNamedPipeA(fifo_path_.c_str(), PIPE_ACCESS_DUPLEX, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, NULL); +#elif __APPLE__ || __linux__ + mkfifo(fifo_path_.c_str(), 0666); #endif - DLOG_F(INFO, "FIFO server started"); + // 启动服务器线程 + server_thread_ = std::thread([this] { serverLoop(); }); } -std::string FifoServer::receiveMessage() { - DLOG_F(INFO, "Receiving message..."); - - char buffer[bufferSize]; +FIFOServer::~FIFOServer() { + // 停止服务器线程 + stop_server_ = true; + server_thread_.join(); +// 删除 FIFO 文件 #ifdef _WIN32 - DWORD numBytesRead; - if (!ReadFile(pipeHandle, buffer, bufferSize - 1, &numBytesRead, nullptr) || - numBytesRead == 0) { - return ""; - } -#else - ssize_t numBytesRead = read(pipeFd, buffer, bufferSize - 1); - if (numBytesRead == -1 || numBytesRead == 0) { - return ""; - } + DeleteFileA(fifo_path_.c_str()); +#elif __APPLE__ || __linux__ + std::filesystem::remove(fifo_path_); #endif +} - buffer[numBytesRead] = '\0'; - std::string receivedMessage(buffer); - - DLOG_F(INFO, "Received message: %s", receivedMessage.c_str()); - - return receivedMessage; +void FIFOServer::sendMessage(const std::string& message) { + std::lock_guard lock(queue_mutex_); + message_queue_.push(message); + message_cv_.notify_one(); } -void FifoServer::stop() { - DLOG_F(INFO, "Stopping FIFO server..."); +void FIFOServer::serverLoop() { + while (!stop_server_) { + std::string message; + { + std::unique_lock lock(queue_mutex_); + message_cv_.wait(lock, [this] { return !message_queue_.empty(); }); + message = message_queue_.front(); + message_queue_.pop(); + } #ifdef _WIN32 - DisconnectNamedPipe(pipeHandle); - CloseHandle(pipeHandle); - DeleteFileA(fifoPath.c_str()); -#else - close(pipeFd); - unlink(fifoPath.c_str()); + HANDLE pipe = CreateFileA(fifo_path_.c_str(), GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, NULL); + DWORD bytes_written; + WriteFile(pipe, message.c_str(), message.length(), &bytes_written, + NULL); + CloseHandle(pipe); +#elif __APPLE__ + int fd = open(fifo_path_.c_str(), O_WRONLY); + write(fd, message.c_str(), message.length()); + close(fd); +#elif __linux__ + int fd = open(fifo_path_.c_str(), O_WRONLY); + write(fd, message.c_str(), message.length()); + close(fd); #endif - - DLOG_F(INFO, "FIFO server stopped"); + } } } // namespace Atom::Connection diff --git a/src/atom/connection/fifoserver.hpp b/src/atom/connection/fifoserver.hpp index 14c0e2cd..a836b196 100644 --- a/src/atom/connection/fifoserver.hpp +++ b/src/atom/connection/fifoserver.hpp @@ -15,57 +15,51 @@ Description: FIFO Server #ifndef ATOM_CONNECTION_FIFOSERVER_HPP #define ATOM_CONNECTION_FIFOSERVER_HPP +#include +#include +#include #include - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#endif +#include namespace Atom::Connection { + /** - * @brief The FifoServer class provides functionality to start a server that - * listens on a FIFO (First In First Out) pipe, receive messages from the pipe, - * and stop the server. + * @brief A class representing a server for handling FIFO messages. */ -class FifoServer { +class FIFOServer { public: /** - * @brief Constructor for FifoServer. - * @param fifoPath The path to the FIFO pipe. + * @brief Constructs a new FIFOServer object. + * + * @param fifo_path The path to the FIFO pipe. */ - FifoServer(const std::string &fifoPath); + explicit FIFOServer(const std::string& fifo_path); /** - * @brief Starts the FIFO server to listen for incoming messages. + * @brief Destroys the FIFOServer object. */ - void start(); + ~FIFOServer(); /** - * @brief Receives a message from the FIFO pipe. - * @return The received message as a string. + * @brief Sends a message through the FIFO pipe. + * + * @param message The message to be sent. */ - std::string receiveMessage(); + void sendMessage(const std::string& message); +private: /** - * @brief Stops the FIFO server. + * @brief The main server loop function. */ - void stop(); - -private: - std::string fifoPath; /**< The path to the FIFO pipe. */ - static const int bufferSize = - 1024; /**< The size of the buffer for receiving messages. */ + void serverLoop(); -#ifdef _WIN32 - HANDLE pipeHandle; /**< Handle to the pipe (Windows). */ -#else - int pipeFd; /**< File descriptor for the pipe (Unix/Linux). */ -#endif + std::string fifo_path_; /**< The path to the FIFO pipe. */ + std::thread server_thread_; /**< The server thread. */ + std::atomic_bool stop_server_ = false; /**< Flag to stop the server. */ + std::queue message_queue_; /**< Queue for storing messages. */ + std::mutex queue_mutex_; /**< Mutex for message queue synchronization. */ + std::condition_variable + message_cv_; /**< Condition variable for message synchronization. */ }; } // namespace Atom::Connection diff --git a/src/atom/connection/sockethub.cpp b/src/atom/connection/sockethub.cpp index f602e2b8..488d614d 100644 --- a/src/atom/connection/sockethub.cpp +++ b/src/atom/connection/sockethub.cpp @@ -110,6 +110,10 @@ void SocketHub::stop() { DLOG_F(INFO, "SocketHub stopped."); } +void SocketHub::addHandler(std::function handler) { + this->handler = std::move(handler); +} + bool SocketHub::initWinsock() { #ifdef _WIN32 WSADATA wsaData; diff --git a/src/atom/driver/_pybind.cpp b/src/atom/driver/_pybind.cpp new file mode 100644 index 00000000..2d3e410c --- /dev/null +++ b/src/atom/driver/_pybind.cpp @@ -0,0 +1,191 @@ +/* + * _pybind.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Python Binding of Atom-Driver + +**************************************************/ + +#include + +#include "camera.hpp" +#include "device.hpp" +#include "filterwheel.hpp" +#include "focuser.hpp" +#include "solver.hpp" +#include "telescope.hpp" + +#include "pid/pid.hpp" + +namespace py = pybind11; + +PYBIND11_MODULE(atom_driver, m) { + m.doc() = "Atom Driver Python Binding"; + + py::class_(m, "AtomDriver") + .def(py::init()) // 默认构造函数 + .def("initialize", &AtomDriver::initialize) // initialize 方法 + .def("connect", &AtomDriver::connect) // connect 方法 + .def("disconnect", &AtomDriver::disconnect) // disconnect 方法 + .def("reconnect", &AtomDriver::reconnect) // reconnect 方法 + .def("isConnected", &AtomDriver::isConnected) // isConnected 方法 + .def("Connect", &AtomDriver::Connect) // Connect 方法 + .def("Disconnect", &AtomDriver::Disconnect) // Disconnect 方法 + .def("Reconnect", &AtomDriver::Reconnect) // Reconnect 方法 + .def("IsConnected", &AtomDriver::IsConnected); // IsConnected 方法 + + py::class_(m, "AtomCamera") + .def(py::init()) // 默认构造函数 + .def("initialize", &AtomCamera::initialize) // initialize 方法 + .def("connect", &AtomCamera::connect) // connect 方法 + .def("disconnect", &AtomCamera::disconnect) // disconnect 方法 + .def("reconnect", &AtomCamera::reconnect) // reconnect 方法 + .def("isConnected", &AtomCamera::isConnected) // isConnected 方法 + .def("startExposure", &AtomCamera::startExposure) // startExposure 方法 + .def("abortExposure", &AtomCamera::abortExposure) // abortExposure 方法 + .def("getExposureStatus", + &AtomCamera::getExposureStatus) // getExposureStatus 方法 + .def("getExposureResult", + &AtomCamera::getExposureResult) // getExposureResult 方法 + .def("saveExposureResult", + &AtomCamera::saveExposureResult) // saveExposureResult 方法 + .def("startVideo", &AtomCamera::startVideo) // startVideo 方法 + .def("stopVideo", &AtomCamera::stopVideo) // stopVideo 方法 + .def("getVideoStatus", + &AtomCamera::getVideoStatus) // getVideoStatus 方法 + .def("getVideoResult", + &AtomCamera::getVideoResult) // getVideoResult 方法 + .def("saveVideoResult", + &AtomCamera::saveVideoResult) // saveVideoResult 方法 + .def("startCooling", &AtomCamera::startCooling) // startCooling 方法 + .def("stopCooling", &AtomCamera::stopCooling) // stopCooling 方法 + .def("getCoolingStatus", + &AtomCamera::getCoolingStatus) // getCoolingStatus 方法 + .def("isCoolingAvailable", + &AtomCamera::isCoolingAvailable) // isCoolingAvailable 方法 + .def("getTemperature", + &AtomCamera::getTemperature) // getTemperature 方法 + .def("getCoolingPower", + &AtomCamera::getCoolingPower) // getCoolingPower 方法 + .def("setTemperature", + &AtomCamera::setTemperature) // setTemperature 方法 + .def("setCoolingPower", + &AtomCamera::setCoolingPower) // setCoolingPower 方法 + .def("getGain", &AtomCamera::getGain) // getGain 方法 + .def("setGain", &AtomCamera::setGain) // setGain 方法 + .def("isGainAvailable", + &AtomCamera::isGainAvailable) // isGainAvailable 方法 + .def("getOffset", &AtomCamera::getOffset) // getOffset 方法 + .def("setOffset", &AtomCamera::setOffset) // setOffset 方法 + .def("isOffsetAvailable", + &AtomCamera::isOffsetAvailable) // isOffsetAvailable 方法 + .def("getISO", &AtomCamera::getISO) // getISO 方法 + .def("setISO", &AtomCamera::setISO) // setISO 方法 + .def("isISOAvailable", + &AtomCamera::isISOAvailable) // isISOAvailable 方法 + .def("getFrame", &AtomCamera::getFrame) // getFrame 方法 + .def("setFrame", &AtomCamera::setFrame) // setFrame 方法 + .def("isFrameSettingAvailable", + &AtomCamera::isFrameSettingAvailable) // isFrameSettingAvailable + // 方法 + .def("getBinning", &AtomCamera::getBinning) // getBinning 方法 + .def("setBinning", &AtomCamera::setBinning); // setBinning 方法 + + py::class_(m, "Telescope") + .def(py::init()) // 默认构造函数 + .def("connect", &Telescope::connect) // connect 方法 + .def("disconnect", &Telescope::disconnect) // disconnect 方法 + .def("reconnect", &Telescope::reconnect) // reconnect 方法 + .def("isConnected", &Telescope::isConnected) // isConnected 方法 + .def("SlewTo", &Telescope::SlewTo) // SlewTo 方法 + .def("Abort", &Telescope::Abort) // Abort 方法 + .def("isSlewing", &Telescope::isSlewing) // isSlewing 方法 + .def("getCurrentRA", &Telescope::getCurrentRA) // getCurrentRA 方法 + .def("getCurrentDec", &Telescope::getCurrentDec) // getCurrentDec 方法 + .def("StartTracking", &Telescope::StartTracking) // StartTracking 方法 + .def("StopTracking", &Telescope::StopTracking) // StopTracking 方法 + .def("setTrackingMode", + &Telescope::setTrackingMode) // setTrackingMode 方法 + .def("setTrackingSpeed", + &Telescope::setTrackingSpeed) // setTrackingSpeed 方法 + .def("getTrackingMode", + &Telescope::getTrackingMode) // getTrackingMode 方法 + .def("getTrackingSpeed", + &Telescope::getTrackingSpeed) // getTrackingSpeed 方法 + .def("Home", &Telescope::Home) // Home 方法 + .def("isAtHome", &Telescope::isAtHome) // isAtHome 方法 + .def("setHomePosition", + &Telescope::setHomePosition) // setHomePosition 方法 + .def("isHomeAvailable", + &Telescope::isHomeAvailable) // isHomeAvailable 方法 + .def("Park", &Telescope::Park) // Park 方法 + .def("Unpark", &Telescope::Unpark) // Unpark 方法 + .def("isAtPark", &Telescope::isAtPark) // isAtPark 方法 + .def("setParkPosition", + &Telescope::setParkPosition) // setParkPosition 方法 + .def("isParkAvailable", + &Telescope::isParkAvailable); // isParkAvailable 方法 + + // 继承 AtomDriver 的 Focuser 类 + py::class_(m, "Focuser") + .def(py::init()) // 默认构造函数 + .def("connect", &Focuser::connect) // connect 方法 + .def("disconnect", &Focuser::disconnect) // disconnect 方法 + .def("reconnect", &Focuser::reconnect) // reconnect 方法 + .def("isConnected", &Focuser::isConnected) // isConnected 方法 + .def("moveTo", &Focuser::moveTo) // moveTo 方法 + .def("moveToAbsolute", &Focuser::moveToAbsolute) // moveToAbsolute 方法 + .def("moveStep", &Focuser::moveStep) // moveStep 方法 + .def("moveStepAbsolute", + &Focuser::moveStepAbsolute) // moveStepAbsolute 方法 + .def("AbortMove", &Focuser::AbortMove) // AbortMove 方法 + .def("getMaxPosition", &Focuser::getMaxPosition) // getMaxPosition 方法 + .def("setMaxPosition", &Focuser::setMaxPosition) // setMaxPosition 方法 + .def("isGetTemperatureAvailable", + &Focuser::isGetTemperatureAvailable) // isGetTemperatureAvailable + // 方法 + .def("getTemperature", &Focuser::getTemperature) // getTemperature 方法 + .def("isAbsoluteMoveAvailable", + &Focuser::isAbsoluteMoveAvailable) // isAbsoluteMoveAvailable 方法 + .def("isManualMoveAvailable", + &Focuser::isManualMoveAvailable) // isManualMoveAvailable 方法 + .def("getCurrentPosition", + &Focuser::getCurrentPosition) // getCurrentPosition 方法 + .def("haveBacklash", &Focuser::haveBacklash) // haveBacklash 方法 + .def("setBacklash", &Focuser::setBacklash); // setBacklash 方法 + + py::class_(m, "Filterwheel") + .def(py::init()) // 默认构造函数 + .def("connect", &Filterwheel::connect) // connect 方法 + .def("disconnect", &Filterwheel::disconnect) // disconnect 方法 + .def("reconnect", &Filterwheel::reconnect) // reconnect 方法 + .def("isConnected", &Filterwheel::isConnected) // isConnected 方法 + .def("moveTo", &Filterwheel::moveTo) // moveTo 方法 + .def("getCurrentPosition", + &Filterwheel::getCurrentPosition); // getCurrentPosition 方法 + + py::class_(m, "PID") + .def(py::init()) // 构造函数 + .def("setIntegratorLimits", + &PID::setIntegratorLimits) // setIntegratorLimits 方法 + .def("setTau", &PID::setTau) // setTau 方法 + .def("calculate", &PID::calculate) // calculate 方法 + .def("propotionalTerm", &PID::propotionalTerm) // propotionalTerm 方法 + .def("integralTerm", &PID::integralTerm) // integralTerm 方法 + .def("derivativeTerm", &PID::derivativeTerm); // derivativeTerm 方法 + + py::class_(m, "Solver") + .def(py::init()) // 构造函数 + .def("solveImage", &Solver::solveImage) // solveImage 方法 + .def("getSolveResult", &Solver::getSolveResult) // getSolveResult 方法 + .def("getSolveStatus", &Solver::getSolveStatus) // getSolveStatus 方法 + .def("setSolveParams", &Solver::setSolveParams) // setSolveParams 方法 + .def("getSolveParams", &Solver::getSolveParams); // getSolveParams 方法 +} diff --git a/src/atom/log/CMakeLists.txt b/src/atom/log/CMakeLists.txt index 981af7ed..c2298f5b 100644 --- a/src/atom/log/CMakeLists.txt +++ b/src/atom/log/CMakeLists.txt @@ -82,6 +82,11 @@ endif() set(LOGURU_USE_FMTLIB On) set(LOGURU_STACKTRACES On) +if (WIN32) + find_package(dlfcn-win32 REQUIRED) + set(CMAKE_DL_LIBS dlfcn-win32::dl) +endif () + if (LOGURU_STACKTRACES AND (NOT CMAKE_DL_LIBS)) message(WARNING "Stack traces requested but the required 'dl' library was not found. " @@ -107,11 +112,20 @@ target_include_directories(loguru target_compile_features(loguru PUBLIC cxx_std_11) find_package(Threads REQUIRED) # defines IMPORTED target Threads::Threads +if(WIN32) +target_link_libraries(loguru + PUBLIC + Threads::Threads # pthreads (or equivalent) + dlfcn-win32::dl + dbghelp +) +else() target_link_libraries(loguru PUBLIC Threads::Threads # pthreads (or equivalent) ${_lib_dl_linkflag} # dl (or equivalent) ) +endif() set_target_properties(loguru PROPERTIES diff --git a/src/server/App.cpp b/src/server/App.cpp new file mode 100644 index 00000000..2f5298c3 --- /dev/null +++ b/src/server/App.cpp @@ -0,0 +1,304 @@ +/* + * App.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-7-13 + +Description: Main + +**************************************************/ + +#ifdef ENABLE_WEB_SERVER +// This is for debug only, please remove it in production +// Oatpp server is still experimental, it may be improved in the future +#include "AppComponent.hpp" + +#ifdef ENABLE_ASYNC +#include "controller/AsyncConfigController.hpp" +#include "controller/AsyncDeviceController.hpp" +#include "controller/AsyncIOController.hpp" +#include "controller/AsyncProcessController.hpp" +#include "controller/AsyncStaticController.hpp" +#include "controller/AsyncSystemController.hpp" +#include "controller/AsyncUploadController.hpp" +// #include "controller/AsyncWebSocketController.hpp" +#include "controller/AsyncClientController.hpp" +#include "oatpp-swagger/AsyncController.hpp" +#else +#include "oatpp-swagger/Controller.hpp" +#endif + +#include "oatpp/network/Server.hpp" + +#define ADD_CONTROLLER(controller, docEndpoints, router, logMessage) \ + auto controller##_ptr = controller::createShared(); \ + docEndpoints.append(controller##_ptr->getEndpoints()); \ + router->addController(controller##_ptr); \ + DLOG_F(INFO, logMessage " loaded"); + +#endif +#include + +#include "lithiumapp.hpp" + +#include "atom/log/loguru.hpp" +#include "atom/server/global_ptr.hpp" +#include "atom/system/crash.hpp" +#include "atom/web/utils.hpp" + +// TODO: This is for debug only, please remove it in production +#define ENABLE_TERMINAL 1 +#if ENABLE_TERMINAL +#include "debug/terminal.hpp" +using namespace Lithium::Terminal; +#endif + +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +void BusLoggerFunction(void *user_data, const loguru::Message &message) { + Lithium::MyApp->sendJsonMessage("log", {{"message", message.message}, + {"level", message.verbosity}, + {"file", message.filename}, + {"line", message.line}, + {"timestamp", message.preamble}}); +} + +#ifdef ENABLE_WEB_SERVER +void runServer() { + DLOG_F(INFO, "Loading App component ..."); +#if ENABLE_IPV6 + AppComponent components( + Lithium::MyApp->GetConfig("config/server").value("host", "::"), + Lithium::MyApp->GetConfig("config/server") + .value("port", 8000)); // Create scope Environment components +#else + DLOG_F(INFO, "Server host:", Lithium::MyApp->GetConfig({"key", "config/server"}) + .value("host", "0.0.0.0")); + DLOG_F(INFO, "Server port:", Lithium::MyApp->GetConfig({"key", "config/server"}) + .value("port", 8000)); + AppComponent components( + Lithium::MyApp->GetConfig({"key", "config/server"}) + .value("host", "0.0.0.0"), + Lithium::MyApp->GetConfig({"key", "config/server"}) + .value("port", 8000)); // Create scope Environment components +#endif + DLOG_F(INFO, "App component loaded"); + + /* Get router component */ + OATPP_COMPONENT(std::shared_ptr, router); + oatpp::web::server::api::Endpoints docEndpoints; + /* Add routes & documents */ + + ADD_CONTROLLER(ConfigController, docEndpoints, router, + "AsyncConfigController"); + + ADD_CONTROLLER(StaticController, docEndpoints, router, + "AsyncStaticController"); + + ADD_CONTROLLER(SystemController, docEndpoints, router, + "AsyncSystemController"); + + // ADD_CONTROLLER(WebSocketController, docEndpoints, router, + // "AsyncWebSocketController"); + + ADD_CONTROLLER(IOController, docEndpoints, router, "AsyncIOController"); + + ADD_CONTROLLER(ProcessController, docEndpoints, router, + "AsyncProcessController"); + + ADD_CONTROLLER(ClientController, docEndpoints, router, + "AsyncClientController"); + + DLOG_F(INFO, "Starting to load API doc controller"); +#if ENABLE_ASYNC + router->addController( + oatpp::swagger::AsyncController::createShared(docEndpoints)); +#else + router->addController( + oatpp::swagger::Controller::createShared(docEndpoints)); +#endif + DLOG_F(INFO, "API doc controller loaded"); + + /* Load websocket route */ + // router->addController(WebSocketController::createShared()); + + /* Get connection handler component */ + OATPP_COMPONENT(std::shared_ptr, + connectionHandler, "http"); + + /* Get connection provider component */ + OATPP_COMPONENT(std::shared_ptr, + connectionProvider); + + DLOG_F(INFO, "Loaded server components ... Prepare for starting ..."); + /* create server */ + oatpp::network::Server server(connectionProvider, connectionHandler); + + DLOG_F(INFO, "Server running on port {}...", + connectionProvider->getProperty("port").toString()->c_str()); + + /* This is a block function that will be called when the server is started + */ + server.run(); +} +#endif + + +// TODO: add network logger, not implemented yet +// struct MyNetworkLogger {}; + +/** + * @brief setup log file + * @note This is called in main function + */ +void setupLogFile() { + std::filesystem::path logsFolder = std::filesystem::current_path() / "logs"; + if (!std::filesystem::exists(logsFolder)) { + std::filesystem::create_directory(logsFolder); + } + auto now = std::chrono::system_clock::now(); + auto now_time_t = std::chrono::system_clock::to_time_t(now); + std::tm *local_time = std::localtime(&now_time_t); + char filename[100]; + std::strftime(filename, sizeof(filename), "%Y%m%d_%H%M%S.log", local_time); + std::filesystem::path logFilePath = logsFolder / filename; + loguru::add_file(logFilePath.string().c_str(), loguru::Append, + loguru::Verbosity_MAX); + + // MyNetworkLogger network_logger; + // TODO loguru::add_callback("network_logger", BusLoggerFunction, + // &network_logger, loguru::Verbosity_INFO); + + loguru::set_fatal_handler([](const loguru::Message &message) { + Atom::System::saveCrashLog(std::string(message.prefix) + + message.message); +#if ENABLE_WEB_SERVER + oatpp::base::Environment::destroy(); +#endif + }); +} + +/** + * @brief main function + * @param argc number of arguments + * @param argv arguments + * @return 0 on success + */ +int main(int argc, char *argv[]) { + /* Add gettext */ +#if ENABLE_GETTEXT + bindtextdomain("lithium", "locale"); + /* Only write the following 2 lines if creating an executable */ + setlocale(LC_ALL, ""); + textdomain("lithium"); +#endif + + // Init loguru log system + loguru::init(argc, argv); + // Set log file + setupLogFile(); + + /* Parse arguments */ + argparse::ArgumentParser program("Lithium Server"); + + program.add_argument("-P", "--port") + .help("port the server running on") + .default_value(8000); + program.add_argument("-H", "--host") + .help("host the server running on") + .default_value("0.0.0.0"); + program.add_argument("-C", "--config") + .help("path to the config file") + .default_value("config.json"); + program.add_argument("-M", "--module-path") + .help("path to the modules directory") + .default_value("modules"); + program.add_argument("-W", "--web-panel") + .help("web panel") + .default_value(true); + program.add_argument("-L", "--log-file").help("path to log file"); + + program.add_description("Lithium Command Line Interface:"); + program.add_epilog("End."); + + program.parse_args(argc, argv); + + Lithium::InitLithiumApp(argc, argv); + // Run oatpp server + Lithium::MyApp = Lithium::LithiumApp::createShared(); + + auto cmd_port = program.get("--port"); + if (cmd_port != 8000) { + DLOG_F(INFO, "Command line server port : {}", cmd_port); + + auto port = + Lithium::MyApp->GetConfig("config/server").value("port", 8000); + if (port != cmd_port) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/port"}, {"value", cmd_port}}); + DLOG_F(INFO, "Set server port to {}", cmd_port); + } + } + try { + auto cmd_host = program.get("--host"); + auto cmd_config_path = program.get("--config"); + auto cmd_module_path = program.get("--module-path"); + auto cmd_web_panel = program.get("--web-panel"); + + if (!cmd_host.empty()) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/host"}, {"value", cmd_host}}); + DLOG_F(INFO, "Set server host to {}", cmd_host); + } + if (!cmd_config_path.empty()) { + Lithium::MyApp->SetConfig({{"key", "config/server/configpath"}, + {"value", cmd_config_path}}); + DLOG_F(INFO, "Set server config path to {}", cmd_config_path); + } + if (!cmd_module_path.empty()) { + Lithium::MyApp->SetConfig({{"key", "config/server/modulepath"}, + {"value", cmd_module_path}}); + DLOG_F(INFO, "Set server module path to {}", cmd_module_path); + } + + if (!cmd_web_panel) { + if (Lithium::MyApp->GetConfig("config/server/web").get()) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/web"}, {"value", false}}); + DLOG_F(INFO, "Disable web panel"); + } + } + } catch (const std::bad_any_cast &e) { + LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); + } + +#if ENABLE_TERMINAL + Lithium::MyApp->SetConfig( + {{"key", "config/terminal/enabled"}, {"value", true}}); + + ConsoleTerminal terminal; + terminal.run(); + +#endif + +#if ENABLE_WEB_SERVER + oatpp::base::Environment::init(); + // Run the main server + runServer(); + // Clean up all + oatpp::base::Environment::destroy(); +#endif + + return 0; +} \ No newline at end of file diff --git a/src/AppComponent.hpp b/src/server/AppComponent.hpp similarity index 100% rename from src/AppComponent.hpp rename to src/server/AppComponent.hpp diff --git a/src/Constants.hpp b/src/server/Constants.hpp similarity index 100% rename from src/Constants.hpp rename to src/server/Constants.hpp diff --git a/src/ErrorHandler.cpp b/src/server/ErrorHandler.cpp similarity index 100% rename from src/ErrorHandler.cpp rename to src/server/ErrorHandler.cpp diff --git a/src/ErrorHandler.hpp b/src/server/ErrorHandler.hpp similarity index 100% rename from src/ErrorHandler.hpp rename to src/server/ErrorHandler.hpp diff --git a/src/Launcher.cpp b/src/server/Launcher.cpp similarity index 100% rename from src/Launcher.cpp rename to src/server/Launcher.cpp diff --git a/src/LauncherComponent.hpp b/src/server/LauncherComponent.hpp similarity index 100% rename from src/LauncherComponent.hpp rename to src/server/LauncherComponent.hpp diff --git a/src/Runner.cpp b/src/server/Runner.cpp similarity index 100% rename from src/Runner.cpp rename to src/server/Runner.cpp diff --git a/src/Runner.hpp b/src/server/Runner.hpp similarity index 100% rename from src/Runner.hpp rename to src/server/Runner.hpp diff --git a/src/auth/AuthHandler.cpp b/src/server/auth/AuthHandler.cpp similarity index 100% rename from src/auth/AuthHandler.cpp rename to src/server/auth/AuthHandler.cpp diff --git a/src/auth/AuthHandler.hpp b/src/server/auth/AuthHandler.hpp similarity index 100% rename from src/auth/AuthHandler.hpp rename to src/server/auth/AuthHandler.hpp diff --git a/src/auth/JWT.cpp b/src/server/auth/JWT.cpp similarity index 100% rename from src/auth/JWT.cpp rename to src/server/auth/JWT.cpp diff --git a/src/auth/JWT.hpp b/src/server/auth/JWT.hpp similarity index 100% rename from src/auth/JWT.hpp rename to src/server/auth/JWT.hpp diff --git a/src/config/Config.hpp b/src/server/config/Config.hpp similarity index 100% rename from src/config/Config.hpp rename to src/server/config/Config.hpp diff --git a/src/config/HubsConfig.cpp b/src/server/config/HubsConfig.cpp similarity index 100% rename from src/config/HubsConfig.cpp rename to src/server/config/HubsConfig.cpp diff --git a/src/config/HubsConfig.hpp b/src/server/config/HubsConfig.hpp similarity index 100% rename from src/config/HubsConfig.hpp rename to src/server/config/HubsConfig.hpp diff --git a/src/controller/AsyncClientController.hpp b/src/server/controller/AsyncClientController.hpp similarity index 100% rename from src/controller/AsyncClientController.hpp rename to src/server/controller/AsyncClientController.hpp diff --git a/src/controller/AsyncConfigController.hpp b/src/server/controller/AsyncConfigController.hpp similarity index 100% rename from src/controller/AsyncConfigController.hpp rename to src/server/controller/AsyncConfigController.hpp diff --git a/src/controller/AsyncDeviceController.hpp b/src/server/controller/AsyncDeviceController.hpp similarity index 99% rename from src/controller/AsyncDeviceController.hpp rename to src/server/controller/AsyncDeviceController.hpp index 8011d0e1..d61fed05 100644 --- a/src/controller/AsyncDeviceController.hpp +++ b/src/server/controller/AsyncDeviceController.hpp @@ -29,7 +29,7 @@ Description: Device Routes #include "magic_enum/magic_enum.hpp" -#include "LithiumApp.hpp" +#include "lithiumapp.hpp" #include OATPP_CODEGEN_BEGIN(ApiController) //<- Begin Codegen diff --git a/src/controller/AsyncIOController.hpp b/src/server/controller/AsyncIOController.hpp similarity index 100% rename from src/controller/AsyncIOController.hpp rename to src/server/controller/AsyncIOController.hpp diff --git a/src/controller/AsyncModuleController.hpp b/src/server/controller/AsyncModuleController.hpp similarity index 100% rename from src/controller/AsyncModuleController.hpp rename to src/server/controller/AsyncModuleController.hpp diff --git a/src/controller/AsyncPHD2Controller.hpp b/src/server/controller/AsyncPHD2Controller.hpp similarity index 99% rename from src/controller/AsyncPHD2Controller.hpp rename to src/server/controller/AsyncPHD2Controller.hpp index 59c76d2f..219ddd95 100644 --- a/src/controller/AsyncPHD2Controller.hpp +++ b/src/server/controller/AsyncPHD2Controller.hpp @@ -15,7 +15,7 @@ Description: PHD2 Route #ifndef ASYNC_PHD2_CONTROLLER_HPP #define ASYNC_PHD2_CONTROLLER_HPP -#include "LithiumApp.hpp" +#include "lithiumapp.hpp" #include "config.h" diff --git a/src/controller/AsyncProcessController.hpp b/src/server/controller/AsyncProcessController.hpp similarity index 100% rename from src/controller/AsyncProcessController.hpp rename to src/server/controller/AsyncProcessController.hpp diff --git a/src/controller/AsyncScriptController.hpp b/src/server/controller/AsyncScriptController.hpp similarity index 99% rename from src/controller/AsyncScriptController.hpp rename to src/server/controller/AsyncScriptController.hpp index eb6e4868..d8758120 100644 --- a/src/controller/AsyncScriptController.hpp +++ b/src/server/controller/AsyncScriptController.hpp @@ -36,7 +36,7 @@ Description: Async Script Controller #include "data/ScriptDto.hpp" #include "data/StatusDto.hpp" -#include "LithiumApp.hpp" +#include "lithiumapp.hpp" #include OATPP_CODEGEN_BEGIN(ApiController) //<- Begin Codegen diff --git a/src/controller/AsyncServerController.hpp b/src/server/controller/AsyncServerController.hpp similarity index 100% rename from src/controller/AsyncServerController.hpp rename to src/server/controller/AsyncServerController.hpp diff --git a/src/controller/AsyncStaticController.hpp b/src/server/controller/AsyncStaticController.hpp similarity index 100% rename from src/controller/AsyncStaticController.hpp rename to src/server/controller/AsyncStaticController.hpp diff --git a/src/controller/AsyncSystemController.hpp b/src/server/controller/AsyncSystemController.hpp similarity index 100% rename from src/controller/AsyncSystemController.hpp rename to src/server/controller/AsyncSystemController.hpp diff --git a/src/controller/AsyncUploadController.hpp b/src/server/controller/AsyncUploadController.hpp similarity index 100% rename from src/controller/AsyncUploadController.hpp rename to src/server/controller/AsyncUploadController.hpp diff --git a/src/controller/AsyncWebSocketController.hpp b/src/server/controller/AsyncWebSocketController.hpp similarity index 100% rename from src/controller/AsyncWebSocketController.hpp rename to src/server/controller/AsyncWebSocketController.hpp diff --git a/src/controller/AuthController.hpp b/src/server/controller/AuthController.hpp similarity index 100% rename from src/controller/AuthController.hpp rename to src/server/controller/AuthController.hpp diff --git a/src/controller/StaticController.hpp b/src/server/controller/StaticController.hpp similarity index 100% rename from src/controller/StaticController.hpp rename to src/server/controller/StaticController.hpp diff --git a/src/controller/StoryController.hpp b/src/server/controller/StoryController.hpp similarity index 100% rename from src/controller/StoryController.hpp rename to src/server/controller/StoryController.hpp diff --git a/src/data/AuthDto.hpp b/src/server/data/AuthDto.hpp similarity index 100% rename from src/data/AuthDto.hpp rename to src/server/data/AuthDto.hpp diff --git a/src/data/ConfigDto.hpp b/src/server/data/ConfigDto.hpp similarity index 100% rename from src/data/ConfigDto.hpp rename to src/server/data/ConfigDto.hpp diff --git a/src/data/DeviceDto.hpp b/src/server/data/DeviceDto.hpp similarity index 100% rename from src/data/DeviceDto.hpp rename to src/server/data/DeviceDto.hpp diff --git a/src/data/IODto.hpp b/src/server/data/IODto.hpp similarity index 100% rename from src/data/IODto.hpp rename to src/server/data/IODto.hpp diff --git a/src/data/ModuleDto.hpp b/src/server/data/ModuleDto.hpp similarity index 100% rename from src/data/ModuleDto.hpp rename to src/server/data/ModuleDto.hpp diff --git a/src/data/PageDto.hpp b/src/server/data/PageDto.hpp similarity index 100% rename from src/data/PageDto.hpp rename to src/server/data/PageDto.hpp diff --git a/src/data/ProcessDto.hpp b/src/server/data/ProcessDto.hpp similarity index 100% rename from src/data/ProcessDto.hpp rename to src/server/data/ProcessDto.hpp diff --git a/src/data/SignInDto.hpp b/src/server/data/SignInDto.hpp similarity index 100% rename from src/data/SignInDto.hpp rename to src/server/data/SignInDto.hpp diff --git a/src/data/SignUpDto.hpp b/src/server/data/SignUpDto.hpp similarity index 100% rename from src/data/SignUpDto.hpp rename to src/server/data/SignUpDto.hpp diff --git a/src/data/StatusDto.hpp b/src/server/data/StatusDto.hpp similarity index 100% rename from src/data/StatusDto.hpp rename to src/server/data/StatusDto.hpp diff --git a/src/data/StoryDto.hpp b/src/server/data/StoryDto.hpp similarity index 100% rename from src/data/StoryDto.hpp rename to src/server/data/StoryDto.hpp diff --git a/src/data/SystemCustom.hpp b/src/server/data/SystemCustom.hpp similarity index 100% rename from src/data/SystemCustom.hpp rename to src/server/data/SystemCustom.hpp diff --git a/src/data/SystemDto.hpp b/src/server/data/SystemDto.hpp similarity index 100% rename from src/data/SystemDto.hpp rename to src/server/data/SystemDto.hpp diff --git a/src/data/UserDto.hpp b/src/server/data/UserDto.hpp similarity index 100% rename from src/data/UserDto.hpp rename to src/server/data/UserDto.hpp diff --git a/src/database/StoryDb.hpp b/src/server/database/StoryDb.hpp similarity index 100% rename from src/database/StoryDb.hpp rename to src/server/database/StoryDb.hpp diff --git a/src/database/UserDb.hpp b/src/server/database/UserDb.hpp similarity index 100% rename from src/database/UserDb.hpp rename to src/server/database/UserDb.hpp diff --git a/src/database/model/StoryModel.hpp b/src/server/database/model/StoryModel.hpp similarity index 100% rename from src/database/model/StoryModel.hpp rename to src/server/database/model/StoryModel.hpp diff --git a/src/database/model/UserModel.hpp b/src/server/database/model/UserModel.hpp similarity index 100% rename from src/database/model/UserModel.hpp rename to src/server/database/model/UserModel.hpp diff --git a/src/interceptor/AuthInterceptor.cpp b/src/server/interceptor/AuthInterceptor.cpp similarity index 100% rename from src/interceptor/AuthInterceptor.cpp rename to src/server/interceptor/AuthInterceptor.cpp diff --git a/src/interceptor/AuthInterceptor.hpp b/src/server/interceptor/AuthInterceptor.hpp similarity index 100% rename from src/interceptor/AuthInterceptor.hpp rename to src/server/interceptor/AuthInterceptor.hpp diff --git a/src/launcher/faq.cpp b/src/server/launcher/faq.cpp similarity index 100% rename from src/launcher/faq.cpp rename to src/server/launcher/faq.cpp diff --git a/src/launcher/faq.hpp b/src/server/launcher/faq.hpp similarity index 100% rename from src/launcher/faq.hpp rename to src/server/launcher/faq.hpp diff --git a/src/service/AuthService.cpp b/src/server/service/AuthService.cpp similarity index 100% rename from src/service/AuthService.cpp rename to src/server/service/AuthService.cpp diff --git a/src/service/AuthService.hpp b/src/server/service/AuthService.hpp similarity index 100% rename from src/service/AuthService.hpp rename to src/server/service/AuthService.hpp diff --git a/src/service/StoryService.cpp b/src/server/service/StoryService.cpp similarity index 100% rename from src/service/StoryService.cpp rename to src/server/service/StoryService.cpp diff --git a/src/service/StoryService.hpp b/src/server/service/StoryService.hpp similarity index 100% rename from src/service/StoryService.hpp rename to src/server/service/StoryService.hpp diff --git a/src/websocket/Connection.cpp b/src/server/websocket/Connection.cpp similarity index 100% rename from src/websocket/Connection.cpp rename to src/server/websocket/Connection.cpp diff --git a/src/websocket/Connection.hpp b/src/server/websocket/Connection.hpp similarity index 100% rename from src/websocket/Connection.hpp rename to src/server/websocket/Connection.hpp diff --git a/src/websocket/Hub.cpp b/src/server/websocket/Hub.cpp similarity index 100% rename from src/websocket/Hub.cpp rename to src/server/websocket/Hub.cpp diff --git a/src/websocket/Hub.hpp b/src/server/websocket/Hub.hpp similarity index 100% rename from src/websocket/Hub.hpp rename to src/server/websocket/Hub.hpp diff --git a/src/websocket/Registry.cpp b/src/server/websocket/Registry.cpp similarity index 100% rename from src/websocket/Registry.cpp rename to src/server/websocket/Registry.cpp diff --git a/src/websocket/Registry.hpp b/src/server/websocket/Registry.hpp similarity index 100% rename from src/websocket/Registry.hpp rename to src/server/websocket/Registry.hpp diff --git a/src/websocket/Session.cpp b/src/server/websocket/Session.cpp similarity index 100% rename from src/websocket/Session.cpp rename to src/server/websocket/Session.cpp diff --git a/src/websocket/Session.hpp b/src/server/websocket/Session.hpp similarity index 100% rename from src/websocket/Session.hpp rename to src/server/websocket/Session.hpp diff --git a/src/websocket/data/DTOs.hpp b/src/server/websocket/data/DTOs.hpp similarity index 100% rename from src/websocket/data/DTOs.hpp rename to src/server/websocket/data/DTOs.hpp diff --git a/src/websocket/template/error_message.hpp b/src/server/websocket/template/error_message.hpp similarity index 100% rename from src/websocket/template/error_message.hpp rename to src/server/websocket/template/error_message.hpp diff --git a/src/websocket/template/function.hpp b/src/server/websocket/template/function.hpp similarity index 100% rename from src/websocket/template/function.hpp rename to src/server/websocket/template/function.hpp diff --git a/src/websocket/template/message.hpp b/src/server/websocket/template/message.hpp similarity index 100% rename from src/websocket/template/message.hpp rename to src/server/websocket/template/message.hpp diff --git a/src/websocket/template/variable.hpp b/src/server/websocket/template/variable.hpp similarity index 100% rename from src/websocket/template/variable.hpp rename to src/server/websocket/template/variable.hpp diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp new file mode 100644 index 00000000..9a337fa9 --- /dev/null +++ b/src/utils/constant.hpp @@ -0,0 +1,53 @@ +/* + * constants.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-16 + +Description: Constants for Lithium + +**************************************************/ + +#ifndef LITHIUM_UTILS_CONSTANTS_HPP +#define LITHIUM_UTILS_CONSTANTS_HPP + +class constants { +public: +#ifdef _WIN32 + static constexpr const char* PATH_SEPARATOR = "\\"; + static constexpr const char* LIB_EXTENSION = ".dll"; +#elif defined(__APPLE__) + static constexpr const char* PATH_SEPARATOR = "/"; + static constexpr const char* LIB_EXTENSION = ".dylib"; +#else + static constexpr const char* PATH_SEPARATOR = "/"; + static constexpr const char* LIB_EXTENSION = ".so"; +#endif + + // Package info + static constexpr const char* PACKAGE_NAME = "package.lithium"; + static constexpr const char* PACKAGE_NAME_SHORT = "lithium"; + static constexpr const char* PACKAGE_VERSION = "0.1.0"; + + // Module info +#ifdef _WIN32 + static constexpr const char* MODULE_FOLDER = ".\\modules"; +#else + static constexpr const char* MODULE_FOLDER = "./modules"; +#endif + + // Env info + static constexpr const char* ENV_VAR_MODULE_PATH = "LITHIUM_MODULE_PATH"; + + // Inside Module Identifiers + + static constexpr const char* LITHIUM_MODULE_LOADER = "lithium.addon.loader"; + static constexpr const char* LITHIUM_ADDON_MANAGER = "lithium.addon.addon"; + static constexpr const char* LITHIUM_UTILS_ENV = "lithium.utils.env"; +}; + +#endif // LITHIUM_UTILS_CONSTANTS_HPP From 6524852274c3790c711ba18835a249903a814f33 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Tue, 16 Apr 2024 18:45:19 +0800 Subject: [PATCH 12/28] update not finished --- .gitignore | 4 +- CMakeLists.txt | 2 + driver/camera/atom-asi/camera.cpp | 47 +-- driver/camera/atom-asi/camera.hpp | 87 +++--- driver/camera/atom-touptek/camera.hpp | 84 +++--- example/component_test/package.json | 55 ++-- src/addon/manager.cpp | 22 +- src/atom/CMakeLists.txt | 2 + src/atom/algorithm/fraction.cpp | 10 - src/atom/algorithm/fraction.hpp | 14 +- src/atom/algorithm/meson.build | 49 ++++ src/atom/algorithm/xmake.lua | 69 +++++ src/atom/async/CMakeLists.txt | 6 + src/atom/async/meson.build | 49 ++++ src/atom/async/xmake.lua | 59 ++++ src/atom/connection/meson.build | 59 ++++ src/atom/connection/xmake.lua | 0 src/atom/driver/marco.hpp | 16 ++ src/atom/driver/meson.build | 66 +++++ src/atom/experiment/CMakeLists.txt | 15 + src/atom/experiment/meson.build | 50 ++++ src/atom/experiment/platform.cpp | 2 +- src/atom/experiment/platform.hpp | 2 + src/atom/experiment/xmake.lua | 65 +++++ src/atom/io/io.cpp | 4 + src/atom/io/io.hpp | 1 + src/atom/log/xmake.lua | 86 ++++++ src/atom/meson.build | 73 +++++ src/atom/type/CMakeLists.txt | 5 + src/atom/type/abi.hpp | 31 +- src/atom/type/args.hpp | 27 +- src/atom/type/flatset.hpp | 269 ++++++++++++++++++ src/atom/type/meson.build | 54 ++++ src/atom/type/xmake.lua | 55 ++++ src/atom/utils/meson.build | 59 ++++ src/atom/utils/xmake.lua | 67 +++++ src/atom/web/meson.build | 47 +++ src/atom/web/xmake.lua | 59 ++++ src/atom/xmake.lua | 94 ++++++ src/config/CMakeLists.txt | 58 ++++ src/config/_component.cpp | 11 +- src/config/_main.cpp | 28 ++ src/config/package.lithium | 34 +++ .../components/DatabaseComponent.hpp | 0 .../components/SwaggerComponent.hpp | 0 src/utils/constant.hpp | 9 + 46 files changed, 1721 insertions(+), 184 deletions(-) create mode 100644 src/atom/algorithm/meson.build create mode 100644 src/atom/algorithm/xmake.lua create mode 100644 src/atom/async/meson.build create mode 100644 src/atom/async/xmake.lua create mode 100644 src/atom/connection/meson.build create mode 100644 src/atom/connection/xmake.lua create mode 100644 src/atom/driver/meson.build create mode 100644 src/atom/experiment/meson.build create mode 100644 src/atom/experiment/xmake.lua create mode 100644 src/atom/log/xmake.lua create mode 100644 src/atom/meson.build create mode 100644 src/atom/type/flatset.hpp create mode 100644 src/atom/type/meson.build create mode 100644 src/atom/type/xmake.lua create mode 100644 src/atom/utils/meson.build create mode 100644 src/atom/utils/xmake.lua create mode 100644 src/atom/web/meson.build create mode 100644 src/atom/web/xmake.lua create mode 100644 src/atom/xmake.lua create mode 100644 src/config/CMakeLists.txt create mode 100644 src/config/_main.cpp create mode 100644 src/config/package.lithium rename src/{ => server}/components/DatabaseComponent.hpp (100%) rename src/{ => server}/components/SwaggerComponent.hpp (100%) diff --git a/.gitignore b/.gitignore index 883d63fd..d3ee04ac 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,6 @@ libexample.json test *.log -*.xml \ No newline at end of file +*.xml + +.xmake \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b70371b..ed88685f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,6 +117,8 @@ add_subdirectory(modules) add_subdirectory(driver) +add_subdirectory(${lithium_src_dir}/config) + ################################################################################# # # General defines for compatibility across different platforms diff --git a/driver/camera/atom-asi/camera.cpp b/driver/camera/atom-asi/camera.cpp index ee54b666..3903f999 100644 --- a/driver/camera/atom-asi/camera.cpp +++ b/driver/camera/atom-asi/camera.cpp @@ -14,8 +14,10 @@ Description: ASICamera Simulator and Basic Definition #include "camera.hpp" +#include "atom/driver/macro.hpp" #include "atom/log/loguru.hpp" +#include #include #define ASI_CAMERA_CONNECTION_CHECK \ @@ -44,7 +46,7 @@ Description: ASICamera Simulator and Basic Definition using ImgBufferPtr = std::unique_ptr; -ASICamera::ASICamera(const std::string &name) : AtomDriver(name) {} +ASICamera::ASICamera(const std::string &name) : AtomCamera(name) {} ASICamera::~ASICamera() {} @@ -95,9 +97,9 @@ bool ASICamera::connect(const json ¶ms) { /*打开相机*/ if ((errCode = ASIOpenCamera(ASICameraInfo.CameraID)) != ASI_SUCCESS) { - LOG_F(ERROR,"Unable to turn on the {}, error code: {}."), - ASICameraInfo.Name, errCode); - return false; + LOG_F(ERROR, "Unable to turn on the {}, error code: {}.", + ASICameraInfo.Name, errCode); + return false; } /*初始化相机*/ if ((errCode = ASIInitCamera(ASICameraInfo.CameraID)) != @@ -110,8 +112,7 @@ bool ASICamera::connect(const json ¶ms) { } setVariable("DEVICE_CONNECTED", true); is_connected.store(true); - LOG_F(INFO, "Camera connected successfully\n") - updateCameraInfo(); + LOG_F(INFO, "Camera connected successfully\n"); return true; } else { LOG_F(ERROR, "This is not a designated camera"); @@ -148,7 +149,7 @@ bool ASICamera::disconnect(const json ¶ms) { /*在关闭相机之前停止 { LOG_F(ERROR, "Unable to stop exposure,error code is {}, please try again.", - errCode) + errCode); return false; } is_exposing.store(false); @@ -187,7 +188,7 @@ bool ASICamera::reconnect(const json ¶ms) { return true; } -bool ASICamera::isConnected() { return is_connected.load() } +bool ASICamera::isConnected() { return is_connected.load(); } bool ASICamera::startExposure(const double &duration) { ASI_CAMERA_CONNECT_CHECK; @@ -258,8 +259,11 @@ bool ASICamera::getExposureResult() { ASI_CAMERA_CONNECT_CHECK; ASI_CAMERA_EXPOSURE_CHECK; - long imgSize = getVariable("WIDTH") * getVariable("HEIGHT") * - (1 + (ASICAMERA->ImageType == ASI_IMG_RAW16)); + GET_INT_VARIABLE(width); + GET_INT_VARIABLE(height); + + long imgSize = width * height; + //* (1 + (ASICAMERA->ImageType == ASI_IMG_RAW16)); // 使用智能指针管理图像缓冲区内存 ImgBufferPtr imgBuf(new unsigned char[imgSize]); @@ -276,21 +280,22 @@ bool ASICamera::getExposureResult() { // 图像下载完成 LOG_F(INFO, "Download from camera completely."); - std::string upload_mode = getVariable("UPLOAD_MODE"); + GET_STR_VARIABLE(upload_mode); if (upload_mode == "LOCAL") [[likely]] { // Max: image filename generation logic is needed std::string FitsName = "test.fits"; - LOG_F(INFO, "Upload mode is LOCAL, save image to {}", FitsName) + LOG_F(INFO, "Upload mode is LOCAL, save image to {}", FitsName); /*将图像写入本地文件*/ - auto res = getComponent("LITHIUM_IMAGE") - ->runFunc("SaveImage", {{"filename", FitsName}, - {"data", imgBuf}, - {"size", imgSize}}); - if (res.contains("error")) { - LOG_F(ERROR, "Unable to save image to {}, error: {}", FitsName, - res["error"].get()); - return false; - } + // auto res = getComponent("LITHIUM_IMAGE") + // ->runFunc("SaveImage", {{"filename", FitsName}, + // {"data", imgBuf}, + //{ "size", imgSize } + //}); + // if (res.contains("error")) { + // LOG_F(ERROR, "Unable to save image to {}, error: {}", FitsName, + // res["error"].get()); + // return false; + //} } else if (upload_mode == "CLIENT") [[unlikely]] { } else if (upload_mode == "None") [[unlikely]] { LOG_F(INFO, "Upload mode is NONE, skip upload"); diff --git a/driver/camera/atom-asi/camera.hpp b/driver/camera/atom-asi/camera.hpp index 1f63dec9..8c7fe6f2 100644 --- a/driver/camera/atom-asi/camera.hpp +++ b/driver/camera/atom-asi/camera.hpp @@ -12,93 +12,92 @@ class ASICamera : public AtomCamera { explicit ASICamera(const std::string &name); ~ASICamera(); - bool initialize() override; - bool destroy() override; + bool initialize() final; + bool destroy() final; - bool connect(const json ¶ms) override; + bool connect(const json ¶ms) final; - bool disconnect(const json ¶ms) override; + bool disconnect(const json ¶ms) final; - bool reconnect(const json ¶ms) override; + bool reconnect(const json ¶ms) final; - bool isConnected() override; + bool isConnected() final; - bool startExposure(const double &duration); + bool startExposure(const double &duration) final; - bool abortExposure(); + bool abortExposure() final; - bool getExposureStatus(); + bool getExposureStatus() final; - bool getExposureResult(); + bool getExposureResult() final; - bool saveExposureResult(); + bool saveExposureResult() final; - bool startVideo(); + bool startVideo() final; - bool stopVideo(); + bool stopVideo() final; - bool getVideoStatus(); + bool getVideoStatus() final; - bool getVideoResult(); + bool getVideoResult() final; - bool saveVideoResult(); + bool saveVideoResult() final; - bool startCooling(); + bool startCooling() final; - bool stopCooling(); + bool stopCooling() final; - bool getCoolingStatus(); + bool getCoolingStatus() final; - bool isCoolingAvailable(); + bool isCoolingAvailable() final; - bool getTemperature(); + bool getTemperature() final; - bool getCoolingPower(); + bool getCoolingPower() final; - bool setTemperature(const double &temperature); + bool setTemperature(const double &temperature) final; - bool setCoolingPower(const double &power); + bool setCoolingPower(const double &power) final; - bool getGain(); + bool getGain() final; - bool setGain(const int &gain); + bool setGain(const int &gain) final; - bool isGainAvailable(); + bool isGainAvailable() final; - bool getOffset(); + bool getOffset() final; - bool setOffset(const int &offset); + bool setOffset(const int &offset) final; - bool isOffsetAvailable(); + bool isOffsetAvailable() final; - bool getISO(); + bool getISO() final; - bool setISO(const int &iso); + bool setISO(const int &iso) final; - bool isISOAvailable(); + bool isISOAvailable() final; - bool getFrame(); + bool getFrame() final; - bool setFrame(const int &x, const int &y, const int &w, const int &h); + bool setFrame(const int &x, const int &y, const int &w, const int &h) final; - bool isFrameSettingAvailable(); + bool isFrameSettingAvailable() final; - bool getBinning(); + bool getBinning() final; - bool setBinning(const int &hor, const int &ver); + bool setBinning(const int &hor, const int &ver) final; - bool getFrameType(); + bool getFrameType() final; - bool setFrameType(FrameType type); + bool setFrameType(FrameType type) final; - bool getUploadMode(); + bool getUploadMode() final; - bool setUploadMode(UploadMode mode); + bool setUploadMode(UploadMode mode) final; private: - bool refreshCameraInfo(); - + /*ASI相机参数*/ ASI_CAMERA_INFO ASICameraInfo; ASI_ERROR_CODE errCode; diff --git a/driver/camera/atom-touptek/camera.hpp b/driver/camera/atom-touptek/camera.hpp index c38cf62b..ee8a7aa5 100644 --- a/driver/camera/atom-touptek/camera.hpp +++ b/driver/camera/atom-touptek/camera.hpp @@ -12,88 +12,88 @@ class ToupCamera : public AtomCamera { explicit ToupCamera(const std::string &name); ~ToupCamera(); - bool initialize() override; - bool destroy() override; + bool initialize() final; + bool destroy() final; - bool connect(const json ¶ms) override; + bool connect(const json ¶ms) final; - bool disconnect(const json ¶ms) override; + bool disconnect(const json ¶ms) final; - bool reconnect(const json ¶ms) override; + bool reconnect(const json ¶ms) final; - bool isConnected() override; + bool isConnected() final; - bool startExposure(const double &duration); + bool startExposure(const double &duration) final; - bool abortExposure(); + bool abortExposure() final; - bool getExposureStatus(); + bool getExposureStatus() final; - bool getExposureResult(); + bool getExposureResult() final; - bool saveExposureResult(); + bool saveExposureResult() final; - bool startVideo(); + bool startVideo() final; - bool stopVideo(); + bool stopVideo() final; - bool getVideoStatus(); + bool getVideoStatus() final; - bool getVideoResult(); + bool getVideoResult() final; - bool saveVideoResult(); + bool saveVideoResult() final; - bool startCooling(); + bool startCooling() final; - bool stopCooling(); + bool stopCooling() final; - bool getCoolingStatus(); + bool getCoolingStatus() final; - bool isCoolingAvailable(); + bool isCoolingAvailable() final; - bool getTemperature(); + bool getTemperature() final; - bool getCoolingPower(); + bool getCoolingPower() final; - bool setTemperature(const double &temperature); + bool setTemperature(const double &temperature) final; - bool setCoolingPower(const double &power); + bool setCoolingPower(const double &power) final; - bool getGain(); + bool getGain() final; - bool setGain(const int &gain); + bool setGain(const int &gain) final; - bool isGainAvailable(); + bool isGainAvailable() final; - bool getOffset(); + bool getOffset() final; - bool setOffset(const int &offset); + bool setOffset(const int &offset) final; - bool isOffsetAvailable(); + bool isOffsetAvailable() final; - bool getISO(); + bool getISO() final; - bool setISO(const int &iso); + bool setISO(const int &iso) final; - bool isISOAvailable(); + bool isISOAvailable() final; - bool getFrame(); + bool getFrame() final; - bool setFrame(const int &x, const int &y, const int &w, const int &h); + bool setFrame(const int &x, const int &y, const int &w, const int &h) final; - bool isFrameSettingAvailable(); + bool isFrameSettingAvailable() final; - bool getBinning(); + bool getBinning() final; - bool setBinning(const int &hor, const int &ver); + bool setBinning(const int &hor, const int &ver) final; - bool getFrameType(); + bool getFrameType() final; - bool setFrameType(FrameType type); + bool setFrameType(FrameType type) final; - bool getUploadMode(); + bool getUploadMode() final; - bool setUploadMode(UploadMode mode); + bool setUploadMode(UploadMode mode) final; private: }; diff --git a/example/component_test/package.json b/example/component_test/package.json index 86abadb4..840e9317 100644 --- a/example/component_test/package.json +++ b/example/component_test/package.json @@ -1,55 +1,36 @@ { - "name": "example", - "version": "0.0.0", + "name": "atom-config", + "version": "1.0.0", "type": "shared", - "description": "An example project", + "description": "Atom driver for Touptek Camera", "license": "LGPL-3.0-or-later", "author": "Max Qian", "repository": { "type": "git", - "url": "https://github.com/maxqian/cobalt-example.git" + "url": "https://github.com/ElementAstro/Atom-Touptek" }, "bugs": { - "url": "https://github.com/maxqian/cobalt-example/issues" + "url": "https://github.com/ElementAstro/Atom-Touptek/issues" }, - "homepage": "https://github.com/maxqian/cobalt-example", + "homepage": "https://github.com/ElementAstro/Atom-Touptek", "keywords": [ - "cobalt", - "example" + "asi", + "camera", + "filter wheel" ], "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "build": "cmake --build-type=Release -- -j 4", + "foramt": "clang-format -i src/*.cpp src/*.h", + "lint": "clang-tidy src/*.cpp src/*.h", + "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "axios": "^1.6.2", - "bootstrap": "^5.3.2", - "chart.js": "^4.4.1", - "easy-peasy": "^6.0.4", - "formik": "^2.4.5", - "isomorphic-ws": "^5.0.0", - "less": "^4.2.0", - "localforage": "^1.10.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "match-sorter": "^6.3.1", - "react": "^18.2.0", - "react-bootstrap": "^2.9.1", - "react-bootstrap-icons": "^1.10.3", - "react-dom": "^18.2.0", - "react-router-bootstrap": "^0.26.2", - "react-router-dom": "^6.21.1", - "redux": "^4.2.1", - "sort-by": "^0.0.2", - "vite-plugin-svgr": "^4.2.0", - "yup": "^1.3.3" + "asi-sdk": "^1.34" }, - "main": { - "example1": { - "func": "getExample1", - "type" : "shared" + "modules": { + "main": { + "func": "getInstance", + "check": true } } } \ No newline at end of file diff --git a/src/addon/manager.cpp b/src/addon/manager.cpp index 9d625722..aef43900 100644 --- a/src/addon/manager.cpp +++ b/src/addon/manager.cpp @@ -110,18 +110,32 @@ bool ComponentManager::Initialize() { // Check if the addon info is valid if (!addon_info.contains("modules") || addon_info.is_null()) { LOG_F(ERROR, "Failed to load module: {}", path.string()); + LOG_F(ERROR, "Missing modules field in addon info"); + m_AddonManager.lock()->removeModule(dir); continue; } - for (const auto &module_name : - addon_info["modules"].get>()) { - std::filesystem::path module_path = path / module_name; + // loading + for (const auto &module_info : + addon_info["modules"].get()) { + if (module_info.is_null() || !module_info.contains("name") || + !module_info.contains("entry")) { + LOG_F(ERROR, "Failed to load module: {}/{}", path.string(), + module_info.dump()); + continue; + } + auto module_name = module_info["name"].get(); + std::filesystem::path module_path = + path / module_name / constants::LIB_EXTENSION; + + DLOG_F(INFO, "Loading module: {}/{}", path.string(), module_name); + // This step is to load the dynamic library if (!m_ModuleLoader.lock()->LoadModule(module_path.string(), module_name)) { LOG_F(ERROR, "Failed to load module: {}/{}", path.string(), module_name); continue; } - DLOG_F(INFO, "Loaded module: {}/{}", path.string(), module_name); + DLOG_F(INFO, "Loaded module: {}/{}", path.string(), module_info); } } return true; diff --git a/src/atom/CMakeLists.txt b/src/atom/CMakeLists.txt index a1c590e1..c8489488 100644 --- a/src/atom/CMakeLists.txt +++ b/src/atom/CMakeLists.txt @@ -74,6 +74,8 @@ list(APPEND ${PROJECT_NAME}_LIBS loguru cpp_httplib libzippp + atom-algorithm + atom-connection atom-async atom-task atom-io diff --git a/src/atom/algorithm/fraction.cpp b/src/atom/algorithm/fraction.cpp index dfcbea4e..75686b07 100644 --- a/src/atom/algorithm/fraction.cpp +++ b/src/atom/algorithm/fraction.cpp @@ -76,16 +76,6 @@ Fraction Fraction::operator/(const Fraction &other) const { return result; } -auto Fraction::operator<=>(const Fraction &other) const { - double diff = this->to_double() - other.to_double(); - if (diff > 0) - return std::strong_ordering::greater; - else if (diff < 0) - return std::strong_ordering::less; - else - return std::strong_ordering::equal; -} - bool Fraction::operator==(const Fraction &other) const { return (numerator == other.numerator) && (denominator == other.denominator); } diff --git a/src/atom/algorithm/fraction.hpp b/src/atom/algorithm/fraction.hpp index c88fc317..fb312e51 100644 --- a/src/atom/algorithm/fraction.hpp +++ b/src/atom/algorithm/fraction.hpp @@ -37,7 +37,7 @@ class Fraction { */ void reduce(); -// For pybind11 compatibility + // For pybind11 compatibility public: int numerator; /**< The numerator of the fraction. */ int denominator; /**< The denominator of the fraction. */ @@ -107,12 +107,22 @@ class Fraction { */ Fraction operator/(const Fraction& other) const; +#if __cplusplus >= 202002L /** * @brief Compares this fraction with another fraction. * @param other The fraction to compare with. * @return An integer indicating the comparison result. */ - auto operator<=>(const Fraction& other) const; + auto Fraction::operator<=>(const Fraction& other) const { + double diff = this->to_double() - other.to_double(); + if (diff > 0) + return std::strong_ordering::greater; + else if (diff < 0) + return std::strong_ordering::less; + else + return std::strong_ordering::equal; + } +#endif /** * @brief Checks if this fraction is equal to another fraction. diff --git a/src/atom/algorithm/meson.build b/src/atom/algorithm/meson.build new file mode 100644 index 00000000..3118c1be --- /dev/null +++ b/src/atom/algorithm/meson.build @@ -0,0 +1,49 @@ +project('Atom-Algorithm', 'cpp') + +# Define sources and headers +sources = [ + 'algorithm.cpp', + 'base.cpp', + 'convolve.cpp', + 'fraction.cpp', + 'huffman.cpp', + 'math.cpp', + 'md5.cpp' +] +headers = [ + 'algorithm.hpp', + 'base.hpp', + 'convolve.hpp', + 'fraction.hpp', + 'hash.hpp', + 'huffman.hpp', + 'math.hpp', + 'md5.hpp' +] + +# Create object library +atom_algorithm_obj = library('atom_algorithm_obj', + sources + headers, + cpp_std: c_std +) + +# Create static library +atom_algorithm_static = static_library('atom_algorithm_static', atom_algorithm_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_algorithm_static.version = version +atom_algorithm_static.soversion = soversion +atom_algorithm_static.basename = 'Atom-Algorithm' + +# Install target +install_targets(atom_algorithm_static) + +# Check if Python support is enabled +atom_build_python = get_option('atom_build_python') + +if atom_build_python + pybind11_module('atom_algorithm_py' 'pybind.cpp' link_with : [atom_algorithm_static]) +endif diff --git a/src/atom/algorithm/xmake.lua b/src/atom/algorithm/xmake.lua new file mode 100644 index 00000000..d8a9d533 --- /dev/null +++ b/src/atom/algorithm/xmake.lua @@ -0,0 +1,69 @@ +-- xmake.lua for Atom-Algorithm +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Algorithm +-- Description: A collection of algorithms +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-algorithm") +set_version("1.0.0") +set_license("GPL3") + +-- Sources +local sources = { + "algorithm.cpp", + "base.cpp", + "convolve.cpp", + "fraction.cpp", + "huffman.cpp", + "math.cpp", + "md5.cpp" +} + +-- Headers +local headers = { + "algorithm.hpp", + "base.hpp", + "convolve.hpp", + "fraction.hpp", + "hash.hpp", + "huffman.hpp", + "math.hpp", + "md5.hpp" +} + +-- Build Object Library +target("atom-algorithm-object") + set_kind("object") + add_headerfiles(headers, {public = true}) + add_files(sources, {public = false}) + +-- Build Static Library +target("atom-algorithm") + set_kind("static") + add_deps("atom-algorithm-object") + add_includedirs(".", {public = true}) + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) + +-- Build Python Module (Optional) +if has_config("atom_build_python") then + target("atom-algorithm-py") + set_kind("shared") + add_deps("atom-algorithm") + add_files("_pybind.cpp") + add_packages("pybind11") + + after_build(function (target) + os.cp("$(buildir)/*.so", "$(projectdir)/python") + end) +end \ No newline at end of file diff --git a/src/atom/async/CMakeLists.txt b/src/atom/async/CMakeLists.txt index 4fe26bdc..ba669cf5 100644 --- a/src/atom/async/CMakeLists.txt +++ b/src/atom/async/CMakeLists.txt @@ -11,12 +11,18 @@ project(atom-async C CXX) # Sources set(${PROJECT_NAME}_SOURCES + lock.cpp timer.cpp ) # Headers set(${PROJECT_NAME}_HEADERS async.hpp + async_impl.hpp + lock.hpp + queue.hpp + queue.inl + thread_wrapper.hpp timer.hpp trigger.hpp trigger_impl.hpp diff --git a/src/atom/async/meson.build b/src/atom/async/meson.build new file mode 100644 index 00000000..135445ff --- /dev/null +++ b/src/atom/async/meson.build @@ -0,0 +1,49 @@ +project('Atom-Async', 'cpp') + +# Define sources and headers +sources = [ + 'lock.cpp', + 'timer.cpp' +] +headers = [ + 'async.hpp', + 'async_impl.hpp', + 'lock.hpp', + 'queue.hpp', + 'queue.inl', + 'thread_wrapper.hpp', + 'timer.hpp', + 'trigger.hpp', + 'trigger_impl.hpp' +] + +# Create object library +atom_async_obj = library('atom_async_obj', + sources + headers, + cpp_std: c_std +) + +# Link with necessary libraries +atom_async_obj_link_libs = ['loguru'] +atom_async_obj.link_with(atom_async_obj_link_libs) + +# Create static library +atom_async_static = static_library('atom_async_static', atom_async_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_async_static.version = version +atom_async_static.soversion = soversion +atom_async_static.basename = 'Atom-Async' + +# Install target +install_targets(atom_async_static) + +# Check if Python support is enabled +atom_build_python = get_option('atom_build_python') + +if atom_build_python + pybind11_module('atom_async_py' '_pybind.cpp' link_with : [atom_async_static]) +endif diff --git a/src/atom/async/xmake.lua b/src/atom/async/xmake.lua new file mode 100644 index 00000000..5bcc6bfd --- /dev/null +++ b/src/atom/async/xmake.lua @@ -0,0 +1,59 @@ +-- xmake.lua for Atom-Async +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Async +-- Description: Async Implementation of Lithium Server and Driver +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-async") + +set_languages("cxx20") + +-- 设置CMake最低版本 +cmake_minimum_required("version" 3.20) + +-- 设置项目名称和描述 +set_project_name("atom-async") +set_project_description("Async Implementation of Lithium Server and Driver") + +-- 添加源文件 +add_files("lock.cpp") +add_files("timer.cpp") + +-- 添加头文件 +add_header_files("async.hpp") +add_header_files("async_impl.hpp") +add_header_files("lock.hpp") +add_header_files("queue.hpp") +add_header_files("queue.inl") +add_header_files("thread_wrapper.hpp") +add_header_files("timer.hpp") +add_header_files("trigger.hpp") +add_header_files("trigger_impl.hpp") + +-- 创建对象库 +obj_library("atom_async_object" srcs _all_) +set_property("atom_async_object", {position_independent = true}) +target_link_libraries("atom_async_object" "loguru") + +-- 创建静态库 +static_library("atom_async" srcs _all_ dependencies "atom_async_object") + +-- 链接必要的库 +target_link_libraries("atom_async" "atom_async_object" ${CMAKE_THREAD_LIBS_INIT}) +target_include_directories("atom_async" include_path ".") + +-- 设置版本和输出文件名 +set_property("atom_async", {version = CMAKE_HYDROGEN_VERSION_STRING, so_version = HYDROGEN_SOVERSION, output_name = "atom_async"}) + +-- 安装目标 +install_target("atom_async" arch "lib" dest "lib") + +-- 如果构建Python模块 +if (ATOM_BUILD_PYTHON) + pybind11_add_module("atom_async_py" srcs "_pybind.cpp") + target_link_libraries("atom_async_py" "atom_async") +endif() \ No newline at end of file diff --git a/src/atom/connection/meson.build b/src/atom/connection/meson.build new file mode 100644 index 00000000..25b9cc12 --- /dev/null +++ b/src/atom/connection/meson.build @@ -0,0 +1,59 @@ +project('Atom-Connection', 'cpp') + +# Define sources and headers +sources = [ + 'fifoclient.cpp', + 'fifoserver.cpp', + 'sockethub.cpp', + 'udp_server.cpp' +] +headers = [ + 'fifoclient.hpp', + 'fifoserver.hpp', + 'shared_memory.hpp', + 'sockethub.hpp', + 'udp_server.hpp' +] + +# Check if LibSSH is enabled +enable_ssh = get_option('ENABLE_SSH') +enable_libssh = get_option('ENABLE_LIBSSH') + +if enable_ssh and enable_libssh + sources += 'sshclient.cpp' + headers += 'sshclient.hpp' +endif + +# Create object library +atom_connection_obj = library('atom_connection_obj', + sources + headers, + cpp_std: c_std +) + +# Link with necessary libraries +atom_connection_obj_link_libs = ['loguru'] +atom_connection_obj.link_with(atom_connection_obj_link_libs) + +# Create static library +atom_connection_static = static_library('atom_connection_static', atom_connection_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_connection_static.version = version +atom_connection_static.soversion = soversion +atom_connection_static.basename = 'Atom-Connection' + +# Install target +install_targets(atom_connection_static) + +# Check if Python support is enabled +atom_build_python = get_option('ATOM_BUILD_PYTHON') + +if atom_build_python + pybind11_module('atom_connection_py' 'pybind.cpp' link_with : [atom_connection_static]) + if meson.get_build_option('WIN32') + pybind11_module_link_with('atom_connection_py', ['ws2_32']) + endif +endif diff --git a/src/atom/connection/xmake.lua b/src/atom/connection/xmake.lua new file mode 100644 index 00000000..e69de29b diff --git a/src/atom/driver/marco.hpp b/src/atom/driver/marco.hpp index 9fd52401..5c86a690 100644 --- a/src/atom/driver/marco.hpp +++ b/src/atom/driver/marco.hpp @@ -11,4 +11,20 @@ "Missing value"); \ } +#define GET_STR_VARIABLE(x) \ + auto _ #x = getVariable(#x); \ + if (!_ #x.has_value()) { \ + LOG_F(ERROR, "{} {}: Missing {} value", getName(), __func__, #x); \ + return false; \ + } \ + auto x = _ #x.value(); + +#define GET_INT_VARIABLE(x) \ + auto _ #x = getVariable(#x); \ + if (!_ #x.has_value()) { \ + LOG_F(ERROR, "{} {}: Missing {} value", getName(), __func__, #x); \ + return false; \ + } \ + auto x = _ #x.value(); + #endif \ No newline at end of file diff --git a/src/atom/driver/meson.build b/src/atom/driver/meson.build new file mode 100644 index 00000000..0e00cc15 --- /dev/null +++ b/src/atom/driver/meson.build @@ -0,0 +1,66 @@ +project('atom-driver', 'cpp') + +# Set minimum Meson version required +meson_version = '>=0.59.0' + +# Define sources and headers +sources = [ + 'fitskeyword.cpp', + 'device.cpp', + 'camera.cpp', + 'telescope.cpp', + 'focuser.cpp', + 'filterwheel.cpp', + 'guider.cpp', + 'solver.cpp' +] +headers = [ + 'fitskeyword.h', + 'device.hpp', + 'camera.hpp', + 'telescope.hpp', + 'focuser.hpp', + 'filterwheel.hpp', + 'guider.hpp', + 'solver.hpp' +] + +# Check if fmt library is available +has_fmt = find_library('fmt') + +# Create object library +atom_driver_obj = library('atom_driver_obj', + sources + headers, + cpp_std: c_std +) + +# Link with necessary libraries +atom_driver_obj_link_libs = ['atom-component', 'atom-server'] +atom_driver_obj.link_with(atom_driver_obj_link_libs) + +if not has_fmt.found() + atom_driver_obj_link_libs += ['fmt'] +endif + +if host_machine.system() == 'linux' + atom_driver_obj_link_libs += ['uuid'] +endif + +atom_driver_obj.link_with(atom_driver_obj_link_libs) + +# Create shared library +atom_driver_shared = shared_library('atom_driver_shared', atom_driver_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_driver_shared.version = version +atom_driver_shared.soversion = soversion +atom_driver_shared.basename = 'atom-driver' + +# Install target +install_targets(atom_driver_shared) + +# Create executable +shared_driver_test = executable('shared_driver_test', 'main.cpp', link_with : [atom_driver_shared]) diff --git a/src/atom/experiment/CMakeLists.txt b/src/atom/experiment/CMakeLists.txt index 8ee0c214..adc20f41 100644 --- a/src/atom/experiment/CMakeLists.txt +++ b/src/atom/experiment/CMakeLists.txt @@ -11,18 +11,33 @@ project(atom-experiment C CXX) # Sources list(APPEND ${PROJECT_NAME}_SOURCES + platform.cpp string.cpp ) # Headers list(APPEND ${PROJECT_NAME}_HEADERS any.hpp + anyutils.hpp + bind_first.hpp + callable.hpp decorate.hpp + flatmap.hpp + func_traits.hpp invoke.hpp list.hpp + memory.hpp noncopyable.hpp + object.hpp optional.hpp + platform.hpp + ranges.hpp + short_alloc.hpp + stack_vector.hpp + static_vector.hpp string.hpp + to_string.hpp + type_info.hpp ) # Build Object Library diff --git a/src/atom/experiment/meson.build b/src/atom/experiment/meson.build new file mode 100644 index 00000000..ccb5965f --- /dev/null +++ b/src/atom/experiment/meson.build @@ -0,0 +1,50 @@ +project('Atom-Experiment', 'cpp') + +# Define sources and headers +sources = [ + 'platform.cpp', + 'string.cpp' +] +headers = [ + 'any.hpp', + 'anyutils.hpp', + 'bind_first.hpp', + 'callable.hpp', + 'decorate.hpp', + 'flatmap.hpp', + 'func_traits.hpp', + 'invoke.hpp', + 'list.hpp', + 'memory.hpp', + 'noncopyable.hpp', + 'object.hpp', + 'optional.hpp', + 'platform.hpp', + 'ranges.hpp', + 'short_alloc.hpp', + 'stack_vector.hpp', + 'static_vector.hpp', + 'string.hpp', + 'to_string.hpp', + 'type_info.hpp' +] + +# Create object library +atom_experiment_obj = library('atom_experiment', + sources + headers, + cpp_std: c_std +) + +# Create static library +atom_experiment_static = static_library('atom_experiment_static', atom_experiment_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_experiment_static.version = version +atom_experiment_static.soversion = soversion +atom_experiment_static.basename = 'Atom-Experiment' + +# Install target +install_targets(atom_experiment_static) diff --git a/src/atom/experiment/platform.cpp b/src/atom/experiment/platform.cpp index 01143e16..a475bac3 100644 --- a/src/atom/experiment/platform.cpp +++ b/src/atom/experiment/platform.cpp @@ -41,7 +41,7 @@ std::string getWindowsVersion() { } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) [[unlikely]] { return "Windows XP"; - } else [[unlikely]] { + } else { return "Unknown Windows version"; } } diff --git a/src/atom/experiment/platform.hpp b/src/atom/experiment/platform.hpp index 5a5bce89..1cadff85 100644 --- a/src/atom/experiment/platform.hpp +++ b/src/atom/experiment/platform.hpp @@ -15,6 +15,8 @@ Description: A platform information collection. #ifndef ATOM_EXPERIMENT_PLATFORM_HPP #define ATOM_EXPERIMENT_PLATFORM_HPP +#include + // 获取系统平台 #if defined(_WIN32) const std::string platform = "Windows"; diff --git a/src/atom/experiment/xmake.lua b/src/atom/experiment/xmake.lua new file mode 100644 index 00000000..0930b4f7 --- /dev/null +++ b/src/atom/experiment/xmake.lua @@ -0,0 +1,65 @@ +-- xmake.lua for Atom-Experiment +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Experiment +-- Description: A collection of experiments for the Atom project +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-experiment") +set_version("1.0.0") +set_license("GPL3") + +-- Sources +local sources = { + "platform.cpp", + "string.cpp" +} + +-- Headers +local headers = { + "any.hpp", + "anyutils.hpp", + "bind_first.hpp", + "callable.hpp", + "decorate.hpp", + "flatmap.hpp", + "func_traits.hpp", + "invoke.hpp", + "list.hpp", + "memory.hpp", + "noncopyable.hpp", + "object.hpp", + "optional.hpp", + "platform.hpp", + "ranges.hpp", + "short_alloc.hpp", + "stack_vector.hpp", + "static_vector.hpp", + "string.hpp", + "to_string.hpp", + "type_info.hpp" +} + +-- Build Object Library +target("atom-experiment-object") + set_kind("object") + add_headerfiles(headers, {public = true}) + add_files(sources, {public = false}) + +-- Build Static Library +target("atom-experiment") + set_kind("static") + add_deps("atom-experiment-object") + add_packages("threads") + add_includedirs(".", {public = true}) + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) \ No newline at end of file diff --git a/src/atom/io/io.cpp b/src/atom/io/io.cpp index 0afd0eff..c76b0354 100644 --- a/src/atom/io/io.cpp +++ b/src/atom/io/io.cpp @@ -311,6 +311,10 @@ bool isFolderExists(const std::string &folderName) { return fs::exists(folderName) && fs::is_directory(folderName); } +bool isFolderExists(const fs::path &folderName) { + return isFolderExists(folderName.string()); +} + bool isFileExists(const std::string &fileName) { if (!isFileNameValid(fileName)) { return false; diff --git a/src/atom/io/io.hpp b/src/atom/io/io.hpp index c207f289..a19759a0 100644 --- a/src/atom/io/io.hpp +++ b/src/atom/io/io.hpp @@ -272,6 +272,7 @@ void traverseDirectories(const std::filesystem::path &directory, * @return 如果文件夹存在,则返回true,否则返回false。 */ [[nodiscard]] bool isFolderExists(const std::string &folderPath); +[[nodiscard]] bool isFolderExists(const fs::path &folderPath); /** * @brief Check if the file exists. diff --git a/src/atom/log/xmake.lua b/src/atom/log/xmake.lua new file mode 100644 index 00000000..3085d628 --- /dev/null +++ b/src/atom/log/xmake.lua @@ -0,0 +1,86 @@ +-- xmake.lua for Loguru +-- This project is licensed under the terms of the MIT license. + +add_rules("mode.debug", "mode.release") + +-- Define project and policies +set_project("loguru") +set_version("2.1.0") +set_languages("cxx11") + +-- Expose xmake-specific user options +option("build_examples", {showmenu = true, default = false, description = "Build the project examples"}) +option("build_tests", {showmenu = true, default = false, description = "Build the tests"}) + +-- Set global compile flags +if is_mode("debug") then + set_symbols("debug") + set_optimize("none") +else + set_symbols("hidden") + set_optimize("fastest") + set_strip("all") +end + +-- Add loguru target +target("loguru") + set_kind("$(kind)") + add_files("loguru.cpp") + add_headerfiles("loguru.hpp") + add_includedirs(".", {public = true}) + set_configvar("LOGURU_STACKTRACES", 1) + set_configvar("LOGURU_USE_FMTLIB", 1) + + -- Determine if linking 'dl' is required + if is_plat("windows") then + add_packages("dlfcn-win32") + add_links("dlfcn-win32", "dbghelp") + else + add_links("dl") + end + + -- Link fmt (if needed) + if has_config("LOGURU_USE_FMTLIB") then + add_packages("fmt") + if has_config("LOGURU_FMT_HEADER_ONLY") then + add_packages("fmt", {configs = {header_only = true}}) + end + end + + -- Set target properties + set_configvar("LOGURU_DEBUG_LOGGING", 0) + set_configvar("LOGURU_DEBUG_CHECKS", 0) + set_configvar("LOGURU_REDEFINE_ASSERT", 0) + set_configvar("LOGURU_WITH_STREAMS", 1) + set_configvar("LOGURU_REPLACE_GLOG", 0) + set_configvar("LOGURU_FMT_HEADER_ONLY", 0) + set_configvar("LOGURU_WITH_FILEABS", 0) + set_configvar("LOGURU_RTTI", 1) + set_configvar("LOGURU_FILENAME_WIDTH", 23) + set_configvar("LOGURU_THREADNAME_WIDTH", 16) + set_configvar("LOGURU_SCOPE_TIME_PRECISION", 3) + set_configvar("LOGURU_VERBOSE_SCOPE_ENDINGS", 0) + +-- Setup examples +if has_config("build_examples") then + -- TODO: Add example targets +end + +-- Setup tests +if has_config("build_tests") then + -- TODO: Add test targets +end + +-- Setup install rules +target("install") + set_kind("phony") + on_install(function (target) + -- Install the main library + install_targets("loguru", {libdir = "lib"}) + + -- Install the header file + install_headers("loguru.hpp", {prefixdir = "include/loguru"}) + + -- Install pkgconfig file + -- TODO: Generate and install pkgconfig file + end) \ No newline at end of file diff --git a/src/atom/meson.build b/src/atom/meson.build new file mode 100644 index 00000000..d28569a7 --- /dev/null +++ b/src/atom/meson.build @@ -0,0 +1,73 @@ +project('Atom', 'cpp') + +# Define sources and headers +atom_sources = [ + 'error/error_stack.cpp', + 'log/logger.cpp', + 'log/global_logger.cpp', + 'log/syslog.cpp' +] +atom_headers = [ + 'error/error_code.hpp', + 'error/error_stack.hpp', + 'log/logger.hpp', + 'log/global_logger.hpp', + 'log/syslog.hpp' +] + +# Private headers +atom_private_headers = [] + +# Define libraries +atom_libs = [ + 'loguru', + 'cpp_httplib', + 'libzippp', + 'atom-async', + 'atom-task', + 'atom-io', + 'atom-driver', + 'atom-event', + 'atom-experiment', + 'atom-component', + 'atom-type', + 'atom-utils', + 'atom-search', + 'atom-web', + 'atom-system', + 'atom-server' +] + +# Check if fmt library is available +has_fmt = find_library('fmt') + +if not has_fmt.found() + atom_libs += 'fmt' +endif + +# Create object library +atom_obj = library('atom_obj', + atom_sources + atom_headers + atom_private_headers, + cpp_std: c_std +) + +# Link with necessary libraries +foreach lib: atom_libs + atom_obj_link_libs += dependency(lib) +endforeach + +atom_obj.link_with(atom_obj_link_libs) + +# Create static library +atom_static = static_library('atom_static', atom_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_static.version = version +atom_static.soversion = soversion +atom_static.basename = 'Atom' + +# Install target +install_targets(atom_static) diff --git a/src/atom/type/CMakeLists.txt b/src/atom/type/CMakeLists.txt index 05b0392b..4a07fb21 100644 --- a/src/atom/type/CMakeLists.txt +++ b/src/atom/type/CMakeLists.txt @@ -18,11 +18,16 @@ set(${PROJECT_NAME}_SOURCES # Headers set(${PROJECT_NAME}_HEADERS + abi.hpp args.hpp + enum_flag.hpp + enum_flag.inl + flatset.hpp ini_impl.hpp ini.hpp json.hpp message.hpp + pointer.hpp small_vector.hpp ) diff --git a/src/atom/type/abi.hpp b/src/atom/type/abi.hpp index 9b3e5208..ed46c27d 100644 --- a/src/atom/type/abi.hpp +++ b/src/atom/type/abi.hpp @@ -15,12 +15,22 @@ Description: A simple C++ ABI wrapper #ifndef ATOM_TYPE_ABI_HPP #define ATOM_TYPE_ABI_HPP -#include #include #include +#include #include #include +#ifdef _WIN32 +#include +#include +#if !defined(__MINGW32__) && !defined(__MINGW64__) +#pragma comment(lib, "dbghelp.lib") +#endif +#else +#include +#endif + class DemangleHelper { public: template @@ -34,17 +44,30 @@ class DemangleHelper { } private: - static std::string Demangle(const char* mangled_name) { + static std::string Demangle(std::string_view mangled_name) { +#ifdef _WIN32 + char buffer[1024]; + DWORD length = UnDecorateSymbolName(mangled_name.data(), buffer, + sizeof(buffer), UNDNAME_COMPLETE); + + if (length > 0) { + return std::string(buffer, length); + } else { + return std::string(mangled_name); + } +#else int status = -1; + std::size_t length = 0; std::unique_ptr demangled_name( - abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status), + abi::__cxa_demangle(mangled_name.data(), nullptr, &length, &status), std::free); if (status == 0) { - return std::string(demangled_name.get()); + return std::string(demangled_name.get(), length); } else { return std::string(mangled_name); } +#endif } }; diff --git a/src/atom/type/args.hpp b/src/atom/type/args.hpp index ae0108c9..6116789d 100644 --- a/src/atom/type/args.hpp +++ b/src/atom/type/args.hpp @@ -195,10 +195,11 @@ std::optional ArgumentContainer::get(const std::string &name) const { using Args = ArgumentContainer; /** - * @brief 通用容器,用于存储任意类型的键值对。 + * @brief 通用容器,用于存储任意类型的键值对。 * @brief A universal container for storing any type of key-value pairs. - * @note 这是ArgumentContainer的弱化版,虽然功能少,但是性能更好 + * @note 这是ArgumentContainer的弱化版,虽然功能少,但是性能更好。 * @note This is a weak version of ArgumentContainer, although it has fewer + * features, it has better performance. */ class UniversalContainer { public: @@ -209,12 +210,12 @@ class UniversalContainer { * @param key Key. * @param value 值。 * @param value Value. - * @note 如果键已存在,则会覆盖原有的值。 + * @note 如果键已存在,则会覆盖原有的值。 * @note If the key exists, it will overwrite the original value. */ template void set(std::string_view key, T &&value) { - _data[std::string(key)] = std::any(std::forward(value)); + m_data.emplace(key, std::forward(value)); } /** @@ -224,16 +225,16 @@ class UniversalContainer { * @param key Key. * @return 值。 * @return Value. - * @note 如果键不存在,则会抛出异常。 + * @note 如果键不存在,则会抛出异常。 * @note If the key does not exist, an exception will be thrown. */ template T get(std::string_view key) const { - auto it = _data.find(std::string(key)); - if (it == _data.end()) { + try { + return std::any_cast(m_data.at(key)); + } catch (const std::out_of_range &) { throw std::runtime_error("Key not found"); } - return std::any_cast(it->second); } /** @@ -241,18 +242,18 @@ class UniversalContainer { * @brief Check if the key exists. * @param key 键。 * @param key Key. - * @return 如果键存在,则返回true;否则返回false。 + * @return 如果键存在,则返回true;否则返回false。 * @return If the key exists, return true; otherwise return false. */ - bool contains(std::string_view key) const { - return _data.find(std::string(key)) != _data.end(); + bool contains(std::string_view key) const noexcept { + return m_data.find(key) != m_data.end(); } private: #if ENABLE_FASTHASH - emhash8::HashMap _data; + emhash8::HashMap m_data; #else - std::unordered_map _data; + std::unordered_map m_data; #endif }; diff --git a/src/atom/type/flatset.hpp b/src/atom/type/flatset.hpp new file mode 100644 index 00000000..232c63db --- /dev/null +++ b/src/atom/type/flatset.hpp @@ -0,0 +1,269 @@ +/* + * flatset.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-16 + +Description: A FlatSet + +**************************************************/ + +#ifndef ATOM_TYPE_FLAT_SET_HPP +#define ATOM_TYPE_FLAT_SET_HPP + +#include +#include +#include +#include +#include +#include +#include + +template > +class FlatSet { +public: + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + using iterator = typename std::vector::const_iterator; + using const_iterator = typename std::vector::const_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + using key_compare = Compare; + using value_compare = Compare; + +private: + std::vector m_data; + Compare m_comp; + +public: + FlatSet() = default; + + explicit FlatSet(const Compare& comp) : m_comp(comp) {} + + template + FlatSet(InputIt first, InputIt last, const Compare& comp = Compare()) + : m_data(first, last), m_comp(comp) { + std::sort(m_data.begin(), m_data.end(), m_comp); + m_data.erase(std::unique(m_data.begin(), m_data.end()), m_data.end()); + } + + FlatSet(std::initializer_list init, const Compare& comp = Compare()) + : FlatSet(init.begin(), init.end(), comp) {} + + FlatSet(const FlatSet& other) = default; + FlatSet(FlatSet&& other) noexcept = default; + + FlatSet& operator=(const FlatSet& other) = default; + FlatSet& operator=(FlatSet&& other) noexcept = default; + + iterator begin() noexcept { return m_data.begin(); } + const_iterator begin() const noexcept { return m_data.begin(); } + const_iterator cbegin() const noexcept { return m_data.cbegin(); } + + iterator end() noexcept { return m_data.end(); } + const_iterator end() const noexcept { return m_data.end(); } + const_iterator cend() const noexcept { return m_data.cend(); } + + reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + const_reverse_iterator crbegin() const noexcept { + return const_reverse_iterator(cend()); + } + + reverse_iterator rend() noexcept { return reverse_iterator(begin()); } + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crend() const noexcept { + return const_reverse_iterator(cbegin()); + } + + bool empty() const noexcept { return m_data.empty(); } + size_type size() const noexcept { return m_data.size(); } + size_type max_size() const noexcept { return m_data.max_size(); } + + void clear() noexcept { m_data.clear(); } + + std::pair insert(const T& value) { + auto it = std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + if (it != m_data.end() && !m_comp(value, *it)) { + return {it, false}; + } + return {m_data.insert(it, value), true}; + } + + std::pair insert(T&& value) { + auto it = std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + if (it != m_data.end() && !m_comp(value, *it)) { + return {it, false}; + } + return {m_data.insert(it, std::move(value)), true}; + } + + iterator insert(const_iterator hint, const T& value) { + if (hint == m_data.end() || m_comp(value, *hint)) { + if (hint == m_data.begin() || m_comp(*(hint - 1), value)) { + return m_data.insert(hint, value); + } + return insert(value).first; + } + return hint; + } + + iterator insert(const_iterator hint, T&& value) { + if (hint == m_data.end() || m_comp(value, *hint)) { + if (hint == m_data.begin() || m_comp(*(hint - 1), value)) { + return m_data.insert(hint, std::move(value)); + } + return insert(std::move(value)).first; + } + return hint; + } + + template + void insert(InputIt first, InputIt last) { + while (first != last) { + insert(*first++); + } + } + + void insert(std::initializer_list ilist) { + insert(ilist.begin(), ilist.end()); + } + + template + std::pair emplace(Args&&... args) { + return insert(T(std::forward(args)...)); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return insert(hint, T(std::forward(args)...)); + } + + iterator erase(const_iterator pos) { return m_data.erase(pos); } + + iterator erase(const_iterator first, const_iterator last) { + return m_data.erase(first, last); + } + + size_type erase(const T& value) { + auto it = find(value); + if (it != m_data.end()) { + erase(it); + return 1; + } + return 0; + } + + void swap(FlatSet& other) noexcept { + std::swap(m_data, other.m_data); + std::swap(m_comp, other.m_comp); + } + + size_type count(const T& value) const { + return find(value) != m_data.end() ? 1 : 0; + } + + iterator find(const T& value) { + auto it = std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + if (it != m_data.end() && !m_comp(value, *it)) { + return it; + } + return m_data.end(); + } + + const_iterator find(const T& value) const { + auto it = std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + if (it != m_data.end() && !m_comp(value, *it)) { + return it; + } + return m_data.end(); + } + + std::pair equal_range(const T& value) { + return std::equal_range(m_data.begin(), m_data.end(), value, m_comp); + } + + std::pair equal_range( + const T& value) const { + return std::equal_range(m_data.begin(), m_data.end(), value, m_comp); + } + + iterator lower_bound(const T& value) { + return std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + } + + const_iterator lower_bound(const T& value) const { + return std::lower_bound(m_data.begin(), m_data.end(), value, m_comp); + } + + iterator upper_bound(const T& value) { + return std::upper_bound(m_data.begin(), m_data.end(), value, m_comp); + } + + const_iterator upper_bound(const T& value) const { + return std::upper_bound(m_data.begin(), m_data.end(), value, m_comp); + } + + key_compare key_comp() const { return m_comp; } + + value_compare value_comp() const { return m_comp; } + + bool contains(const T& value) const { return find(value) != m_data.end(); } +}; + +template +bool operator==(const FlatSet& lhs, + const FlatSet& rhs) { + return lhs.size() == rhs.size() && + std::equal(lhs.begin(), lhs.end(), rhs.begin()); +} + +template +bool operator!=(const FlatSet& lhs, + const FlatSet& rhs) { + return !(lhs == rhs); +} + +template +bool operator<(const FlatSet& lhs, const FlatSet& rhs) { + return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), + rhs.end()); +} + +template +bool operator<=(const FlatSet& lhs, + const FlatSet& rhs) { + return !(rhs < lhs); +} + +template +bool operator>(const FlatSet& lhs, const FlatSet& rhs) { + return rhs < lhs; +} + +template +bool operator>=(const FlatSet& lhs, + const FlatSet& rhs) { + return !(lhs < rhs); +} + +template +void swap(FlatSet& lhs, + FlatSet& rhs) noexcept(noexcept(lhs.swap(rhs))) { + lhs.swap(rhs); +} + +#endif // ATOM_TYPE_FLAT_SET_HPP \ No newline at end of file diff --git a/src/atom/type/meson.build b/src/atom/type/meson.build new file mode 100644 index 00000000..dfa592d4 --- /dev/null +++ b/src/atom/type/meson.build @@ -0,0 +1,54 @@ +project('Atom-Type', 'cpp') + +# Define sources and headers +sources = [ + 'args.cpp', + 'ini.cpp', + 'message.cpp' +] +headers = [ + 'abi.hpp', + 'args.hpp', + 'enum_flag.hpp', + 'enum_flag.inl', + 'flatset.hpp', + 'ini_impl.hpp', + 'ini.hpp', + 'json.hpp', + 'message.hpp', + 'pointer.hpp', + 'small_vector.hpp' +] + +# Create object library +atom_type_obj = library('atom_type', + sources + headers, + cpp_std: c_std +) + +# Create static library +atom_type_static = static_library('atom_type_static', atom_type_obj) + +# Set version properties +version = '1.0.0' # You should define your version here +soversion = '1' + +atom_type_static.version = version +atom_type_static.soversion = soversion +atom_type_static.basename = 'Atom-Type' + +# Link to other libraries if necessary +atom_type_static_link_libs = [] +foreach lib : ['atom-utils'] + atom_type_static_link_libs += dependency(lib) +endforeach + +atom_type_static_link_libs = [] +foreach lib : ['atom-utils'] + atom_type_static_link_libs += dependency(lib) +endforeach + +atom_type_static.link_with(atom_type_static_link_libs) + +# Install target +install_targets(atom_type_static) diff --git a/src/atom/type/xmake.lua b/src/atom/type/xmake.lua new file mode 100644 index 00000000..57ad5eaf --- /dev/null +++ b/src/atom/type/xmake.lua @@ -0,0 +1,55 @@ +-- xmake.lua for Atom-Type +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Type +-- Description: All of the self-implement types +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-type") +set_version("1.0.0") +set_license("GPL3") + +-- Sources +local sources = { + "args.cpp", + "ini.cpp", + "message.cpp" +} + +-- Headers +local headers = { + "abi.hpp", + "args.hpp", + "enum_flag.hpp", + "enum_flag.inl", + "flatset.hpp", + "ini_impl.hpp", + "ini.hpp", + "json.hpp", + "message.hpp", + "pointer.hpp", + "small_vector.hpp" +} + +-- Build Object Library +target("atom-type-object") + set_kind("object") + add_files(headers, {public = true}) + add_files(sources, {public = false}) + +-- Build Static Library +target("atom-type") + set_kind("static") + add_deps("atom-type-object", "atom-utils") + add_includedirs(".", {public = true}) + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) \ No newline at end of file diff --git a/src/atom/utils/meson.build b/src/atom/utils/meson.build new file mode 100644 index 00000000..c7d9b01a --- /dev/null +++ b/src/atom/utils/meson.build @@ -0,0 +1,59 @@ +project('Atom-Utils', 'cpp') + +# Define sources and headers +sources = [ + 'aes.cpp', + 'env.cpp', + 'hash_util.cpp', + 'random.cpp', + 'string.cpp', + 'stopwatcher.cpp', + 'time.cpp', + 'uuid.cpp', + 'xml.cpp' +] +headers = [ + 'aes.hpp', + 'env.hpp', + 'hash_util.hpp', + 'random.hpp', + 'refl.hpp', + 'string.hpp', + 'stopwatcher.hpp', + 'switch.hpp', + 'time.hpp', + 'uuid.hpp', + 'xml.hpp' +] + +# Private headers +private_headers = [ +] + +# Create object library +atom_utils_obj = library('atom_utils', + sources + headers + private_headers, + cpp_std: c_std +) + +# Link to other libraries if necessary +atom_utils_obj_link_libs = [] +foreach lib : ['loguru', 'tinyxml2'] + atom_utils_obj_link_libs += dependency(lib) +endforeach + +atom_utils_obj.link_with(atom_utils_obj_link_libs) + +# Create static library +atom_utils_static = static_library('atom_utils_static', atom_utils_obj) + +# Set version properties +version = '1.0.0' +soversion = '1' + +atom_utils_static.version = version +atom_utils_static.soversion = soversion +atom_utils_static.basename = 'Atom-Utils' + +# Install target +install_targets(atom_utils_static) diff --git a/src/atom/utils/xmake.lua b/src/atom/utils/xmake.lua new file mode 100644 index 00000000..82e00bde --- /dev/null +++ b/src/atom/utils/xmake.lua @@ -0,0 +1,67 @@ +-- xmake.lua for Atom-Utils +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Utils +-- Description: A collection of useful functions +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-utils") +set_version("1.0.0") +set_license("GPL3") + +-- Sources +local sources = { + "aes.cpp", + "env.cpp", + "hash_util.cpp", + "random.cpp", + "string.cpp", + "stopwatcher.cpp", + "time.cpp", + "uuid.cpp", + "xml.cpp" +} + +-- Headers +local headers = { + "aes.hpp", + "env.hpp", + "hash_util.hpp", + "random.hpp", + "refl.hpp", + "string.hpp", + "stopwatcher.hpp", + "switch.hpp", + "time.hpp", + "uuid.hpp", + "xml.hpp" +} + +-- Private Headers +local private_headers = { +} + +-- Build Object Library +target("atom-utils-object") + set_kind("object") + add_files(headers, {public = true}) + add_files(sources, private_headers, {public = false}) + add_packages("loguru", "tinyxml2") + +-- Build Static Library +target("atom-utils") + set_kind("static") + add_deps("atom-utils-object") + add_packages("loguru", "tinyxml2") + add_includedirs(".", {public = true}) + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) \ No newline at end of file diff --git a/src/atom/web/meson.build b/src/atom/web/meson.build new file mode 100644 index 00000000..b866d8c7 --- /dev/null +++ b/src/atom/web/meson.build @@ -0,0 +1,47 @@ +project('Atom-Web', 'cpp') + +# Define sources and headers +sources = [ + 'address.cpp', + 'downloader.cpp', + 'httpclient.cpp', + 'httplite.cpp', + 'utils.cpp', + 'time.cpp' +] +headers = [ + 'address.hpp', + 'downloader.hpp', + 'httpclient.hpp', + 'httplite.hpp', + 'utils.hpp', + 'time.hpp' +] + +# Create object library +atom_web_obj = library('atom_web', + sources + headers, + cpp_std: c_std +) + +# Link to other libraries if necessary +atom_web_obj_link_libs = [] +foreach lib : ['loguru', 'cpp_httplib'] + atom_web_obj_link_libs += dependency(lib) +endforeach + +atom_web_obj.link_with(atom_web_obj_link_libs) + +# Create static library +atom_web_static = static_library('atom_web_static', atom_web_obj) + +# Set version properties +version = '1.0.0' +soversion = '1' + +atom_web_static.version = version +atom_web_static.soversion = soversion +atom_web_static.basename = 'Atom-Web' + +# Install target +install_targets(atom_web_static) diff --git a/src/atom/web/xmake.lua b/src/atom/web/xmake.lua new file mode 100644 index 00000000..d6d4e0e7 --- /dev/null +++ b/src/atom/web/xmake.lua @@ -0,0 +1,59 @@ +-- xmake.lua for Atom-Web +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom-Web +-- Description: Web API +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom-web") +set_version("1.0.0") +set_license("GPL3") + +-- Sources +local sources = { + "address.cpp", + "downloader.cpp", + "httpclient.cpp", + "httplite.cpp", + "utils.cpp", + "time.cpp" +} + +-- Headers +local headers = { + "address.hpp", + "downloader.hpp", + "httpclient.hpp", + "httplite.hpp", + "utils.hpp", + "time.hpp" +} + +-- Build Object Library +target("atom-web-object") + set_kind("object") + add_files(headers, {public = true}) + add_files(sources, {public = false}) + add_packages("loguru") + +-- Build Static Library +target("atom-web") + set_kind("static") + add_deps("atom-web-object") + add_packages("loguru", "cpp_httplib") + add_includedirs(".", {public = true}) + + if is_plat("windows") then + add_syslinks("wsock32", "ws2_32") + end + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) \ No newline at end of file diff --git a/src/atom/xmake.lua b/src/atom/xmake.lua new file mode 100644 index 00000000..64dc0a13 --- /dev/null +++ b/src/atom/xmake.lua @@ -0,0 +1,94 @@ +-- xmake.lua for Atom +-- This project is licensed under the terms of the GPL3 license. +-- +-- Project Name: Atom +-- Description: Atom Library for all of the Element Astro Project +-- Author: Max Qian +-- License: GPL3 + +add_rules("mode.debug", "mode.release") + +set_project("atom") +set_version("1.0.0") +set_license("GPL3") + +option("atom_build_python", {description = "Build Atom with Python support", default = false}) + +if has_config("atom_build_python") then + add_requires("python 3.x", {kind = "binary"}) + add_requires("pybind11") +end + +add_subdirs("algorithm", "async", "components", "connection", "driver", "event", "experiment", "io", "log", "server", "search", "system", "task", "type", "utils", "web") + +if not has_config("HAS_STD_FORMAT") then + add_requires("fmt") +end + +-- Sources +local sources = { + "error/error_stack.cpp", + "log/logger.cpp", + "log/global_logger.cpp", + "log/syslog.cpp" +} + +-- Headers +local headers = { + "error/error_code.hpp", + "error/error_stack.hpp", + "log/logger.hpp", + "log/global_logger.hpp", + "log/syslog.hpp" +} + +-- Private Headers +local private_headers = { +} + +-- Dependencies +local dependencies = { + "loguru", + "cpp_httplib", + "libzippp", + "atom-async", + "atom-task", + "atom-io", + "atom-driver", + "atom-event", + "atom-experiment", + "atom-component", + "atom-type", + "atom-utils", + "atom-search", + "atom-web", + "atom-system", + "atom-server" +} + +-- Build Object Library +target("atom-object") + set_kind("object") + add_files(headers, {public = true}) + add_files(sources, private_headers, {public = false}) + add_defines("HAVE_LIBNOVA") + add_packages(dependencies) + + if is_plat("windows") then + add_syslinks("setupapi", "wsock32", "ws2_32", "shlwapi", "iphlpapi") + end + +-- Build Static Library +target("atom") + set_kind("static") + add_deps("atom-object") + add_packages(dependencies) + add_includedirs(".", {public = true}) + + set_targetdir("$(buildir)/lib") + set_objectdir("$(buildir)/obj") + + after_build(function (target) + os.cp("$(buildir)/lib", "$(projectdir)/lib") + os.cp("$(projectdir)/*.hpp", "$(projectdir)/include") + end) \ No newline at end of file diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt new file mode 100644 index 00000000..2076c950 --- /dev/null +++ b/src/config/CMakeLists.txt @@ -0,0 +1,58 @@ +# This project is licensed under the terms of the GPL3 license. +# +# Project Name: Lithium-Config +# Description: the official config module for lithium server +# Author: Max Qian +# License: GPL3 + +cmake_minimum_required(VERSION 3.20) +project(lithium-config C CXX) + +# Sources +set(${PROJECT_NAME}_SOURCES + _main.cpp + _component.cpp + configor.cpp +) + +# Headers +set(${PROJECT_NAME}_HEADERS + _component.hpp + configor.hpp +) + +set(${PROJECT_NAME}_LIBS + loguru + atom-component +) + +# Build Object Library +add_library(${PROJECT_NAME}_OBJECT OBJECT) +set_property(TARGET ${PROJECT_NAME}_OBJECT PROPERTY POSITION_INDEPENDENT_CODE 1) + +target_sources(${PROJECT_NAME}_OBJECT + PUBLIC + ${${PROJECT_NAME}_HEADERS} + PRIVATE + ${${PROJECT_NAME}_SOURCES} +) + +target_link_libraries(${PROJECT_NAME}_OBJECT ${${PROJECT_NAME}_LIBS}) + +add_library(${PROJECT_NAME} SHARED) + +target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_OBJECT ${${PROJECT_NAME}_LIBS}) +target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT}) +target_include_directories(${PROJECT_NAME} PUBLIC .) + +set_target_properties(${PROJECT_NAME} PROPERTIES + VERSION ${CMAKE_HYDROGEN_VERSION_STRING} + SOVERSION ${HYDROGEN_SOVERSION} + OUTPUT_NAME ${PROJECT_NAME} +) + +install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + + diff --git a/src/config/_component.cpp b/src/config/_component.cpp index 51f1b41d..96a02226 100644 --- a/src/config/_component.cpp +++ b/src/config/_component.cpp @@ -26,11 +26,12 @@ Description: Config Component for Atom Addon "key not found"); \ } -#define LITHIUM_CONFIG_KEY_CHECK(key) \ - if (!m_params.contains(key) || !m_params[key].is_string()) { \ - LOG_F(ERROR, "ConfigComponent::{}: {} not found", __func__, key); \ - return createErrorResponse(__func__, {"error", "missing " + key}, \ - "missing " + key); \ +#define LITHIUM_CONFIG_KEY_CHECK(key) \ + if (!m_params.contains(key) || !m_params[key].is_string()) { \ + LOG_F(ERROR, "ConfigComponent::{}: {} not found", __func__, key); \ + return createErrorResponse(__func__, \ + {"error", std::string("missing ") + key}, \ + std::string("missing ") + key); \ } ConfigComponent::ConfigComponent(const std::string& name) diff --git a/src/config/_main.cpp b/src/config/_main.cpp new file mode 100644 index 00000000..1c5ca8c1 --- /dev/null +++ b/src/config/_main.cpp @@ -0,0 +1,28 @@ +/* + * _main.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Main Entry + +**************************************************/ + +#include "_component.hpp" + +extern "C" { + +std::shared_ptr getInstance( + [[maybe_unused]] const json ¶ms) { + if (params.contains("name") && params["name"].is_string()) { + return std::make_shared( + params["name"].get()); + } + return std::make_shared("lithium.config"); +} + +} \ No newline at end of file diff --git a/src/config/package.lithium b/src/config/package.lithium new file mode 100644 index 00000000..22441f2f --- /dev/null +++ b/src/config/package.lithium @@ -0,0 +1,34 @@ +{ + "name": "lithium.config", + "version": "1.0.0", + "type": "shared", + "description": "Lithium server builtin config module", + "license": "GPL-3.0-or-later", + "author": "Max Qian", + "repository": { + "type": "git", + "url": "https://github.com/ElementAstro/Lithium" + }, + "bugs": { + "type": "git", + "url": "https://github.com/ElementAstro/Lithium/issues" + }, + "homepage": { + "type": "git", + "url": "https://github.com/ElementAstro/Lithium" + }, + "keywords": [ + "lithium", + "config" + ], + "scripts": { + "build": "cmake --build-type=Release -- -j 4", + "lint": "clang-format -i src/*.cpp src/*.h" + }, + "modules": [ + { + "name": "config", + "entry": "getInstance" + } + ] +} \ No newline at end of file diff --git a/src/components/DatabaseComponent.hpp b/src/server/components/DatabaseComponent.hpp similarity index 100% rename from src/components/DatabaseComponent.hpp rename to src/server/components/DatabaseComponent.hpp diff --git a/src/components/SwaggerComponent.hpp b/src/server/components/SwaggerComponent.hpp similarity index 100% rename from src/components/SwaggerComponent.hpp rename to src/server/components/SwaggerComponent.hpp diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp index 9a337fa9..00c6bce2 100644 --- a/src/utils/constant.hpp +++ b/src/utils/constant.hpp @@ -18,8 +18,13 @@ Description: Constants for Lithium class constants { public: #ifdef _WIN32 +#if defined(__MINGW32__) || defined(__MINGW64__) + static constexpr const char* PATH_SEPARATOR = "/"; + static constexpr const char* LIB_EXTENSION = ".dll"; +#else static constexpr const char* PATH_SEPARATOR = "\\"; static constexpr const char* LIB_EXTENSION = ".dll"; +#endif #elif defined(__APPLE__) static constexpr const char* PATH_SEPARATOR = "/"; static constexpr const char* LIB_EXTENSION = ".dylib"; @@ -35,7 +40,11 @@ class constants { // Module info #ifdef _WIN32 +#if defined(__MINGW32__) || defined(__MINGW64__) + static constexpr const char* MODULE_FOLDER = "./modules"; +#else static constexpr const char* MODULE_FOLDER = ".\\modules"; +#endif #else static constexpr const char* MODULE_FOLDER = "./modules"; #endif From f5b2a3b665b70ffbf6d8e1f8d5e0b25a95b58a5f Mon Sep 17 00:00:00 2001 From: Max Qian Date: Tue, 16 Apr 2024 19:41:21 +0800 Subject: [PATCH 13/28] update -- the build system was not finished --- STYLE_OF_CODE.md | 6 +- example/benchmark.hpp | 51 ++++++--- meson.build | 103 ++++++++++++++++++ src/addon/manager.cpp | 2 +- src/atom/CMakeLists.txt | 2 +- src/atom/algorithm/fraction.hpp | 2 +- src/atom/connection/xmake.lua | 69 ++++++++++++ src/atom/io/meson.build | 42 ++++++++ src/atom/io/xmake.lua | 34 ++++++ src/atom/search/CMakeLists.txt | 2 +- src/atom/search/meson.build | 38 +++++++ src/atom/search/xmake.lua | 34 ++++++ src/atom/system/meson.build | 64 +++++++++++ src/atom/system/xmake.lua | 41 +++++++ src/atom/task/meson.build | 35 ++++++ src/atom/task/xmake.lua | 30 ++++++ src/atom/utils/xmake.lua | 2 +- xmake.lua | 182 ++++++-------------------------- 18 files changed, 567 insertions(+), 172 deletions(-) create mode 100644 meson.build create mode 100644 src/atom/io/meson.build create mode 100644 src/atom/io/xmake.lua create mode 100644 src/atom/search/meson.build create mode 100644 src/atom/search/xmake.lua create mode 100644 src/atom/system/meson.build create mode 100644 src/atom/system/xmake.lua create mode 100644 src/atom/task/meson.build create mode 100644 src/atom/task/xmake.lua diff --git a/STYLE_OF_CODE.md b/STYLE_OF_CODE.md index 538210ad..cd527f25 100644 --- a/STYLE_OF_CODE.md +++ b/STYLE_OF_CODE.md @@ -1,4 +1,6 @@ -# C++ Naming Conventions +# Style of Code + +## C++ Naming Conventions ## Variable Naming @@ -109,7 +111,7 @@ Good naming conventions improve code readability and maintainability, making it easier for others to understand and use your code. -# C++命名规则 +## C++命名规则 ## 变量命名 diff --git a/example/benchmark.hpp b/example/benchmark.hpp index ed082877..3e8dd87d 100644 --- a/example/benchmark.hpp +++ b/example/benchmark.hpp @@ -1,6 +1,12 @@ +#ifndef LITHIUM_BENCHMARK_HPP +#define LITHIUM_BENCHMARK_HPP + +#include #include #include +#include #include +#include #include #include #include @@ -16,26 +22,32 @@ class Benchmark { template void Run(Func&& func, int iterations) { - std::vector durations; - durations.reserve(iterations); + std::vector durations(iterations); - for (int i = 0; i < iterations; ++i) { - TimePoint start = Clock::now(); - func(); - Duration elapsed = Clock::now() - start; - durations.push_back(elapsed); - } + std::transform(std::execution::par, durations.begin(), durations.end(), + durations.begin(), [&func](const Duration&) { + TimePoint start = Clock::now(); + func(); + return Clock::now() - start; + }); Duration totalDuration = std::accumulate( durations.begin(), durations.end(), Duration::zero()); double averageDuration = static_cast(totalDuration.count()) / iterations / 1000.0; // in microseconds - double variance = 0.0; - for (const auto& d : durations) { - variance += std::pow( - static_cast(d.count()) / 1000.0 - averageDuration, 2); - } - variance /= iterations; + + double variance = + std::transform_reduce( + std::execution::par, durations.begin(), durations.end(), 0.0, + std::plus<>(), + [&averageDuration](const Duration& d) { + double durationInMicroseconds = + static_cast(d.count()) / 1000.0; + return std::pow(durationInMicroseconds - averageDuration, + 2); + }) / + iterations; + double standardDeviation = std::sqrt(variance); results_.push_back({name_, totalDuration, averageDuration, @@ -45,11 +57,12 @@ class Benchmark { static void PrintResults() { std::cout << "Benchmark Results:\n"; for (const auto& result : results_) { - std::cout << result.name << ": " + std::cout << std::setw(20) << std::left << result.name << ": " << std::chrono::duration_cast( result.totalDuration) .count() - << " us (avg: " << result.averageDuration + << " us (avg: " << std::setprecision(4) + << result.averageDuration << " us, std dev: " << result.standardDeviation << " us, " << result.iterations << " iterations)\n"; } @@ -68,4 +81,8 @@ class Benchmark { std::string name_; }; -#define BENCHMARK(name, func, iterations) Benchmark(name).Run(func, iterations) \ No newline at end of file +#define BENCHMARK(name, func, iterations) Benchmark(name).Run(func, iterations) + +std::vector Benchmark::results_; + +#endif diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..d877d0c1 --- /dev/null +++ b/meson.build @@ -0,0 +1,103 @@ +project('Lithium', 'cpp') + +lithium_src_dir = 'src' +lithium_module_dir = join_paths(lithium_src_dir, 'atom') +lithium_client_dir = join_paths(lithium_src_dir, 'client') +lithium_component_dir = join_paths(lithium_src_dir, 'addon') +lithium_task_dir = join_paths(lithium_src_dir, 'task') + +libs_dir = 'libs' + +lithium_deps = [ + dependency('oatpp-websocket'), + dependency('oatpp-swagger'), + dependency('oatpp-openssl'), + dependency('oatpp-zlib'), + dependency('loguru'), + dependency('libzippp'), + dependency('fmt'), + dependency('cfitsio'), + dependency('openssl'), + dependency('sqlite3'), + dependency('cpp_httplib'), + dependency('backward'), + dependency('tinyxml2'), + dependency('pocketpy'), +] + +cpp = meson.get_compiler('cpp') + +lithium_server_src = files([ + join_paths(lithium_src_dir, 'app.cpp'), +]) + +lithium_server_library_src = files([ + join_paths(lithium_src_dir, 'device/server/ascom.cpp'), + join_paths(lithium_src_dir, 'device/server/hydrogen.cpp'), + join_paths(lithium_src_dir, 'device/server/hydrogen_driver.cpp'), + join_paths(lithium_src_dir, 'device/server/connector.cpp'), + join_paths(lithium_src_dir, 'device/manager.cpp'), + join_paths(lithium_src_dir, 'device/utils/utils.cpp'), + join_paths(lithium_component_dir, 'addons.cpp'), + join_paths(lithium_component_dir, 'compiler.cpp'), + join_paths(lithium_component_dir, 'finder.cpp'), + join_paths(lithium_component_dir, 'loader.cpp'), + join_paths(lithium_component_dir, 'manager.cpp'), + join_paths(lithium_component_dir, 'sandbox.cpp'), + join_paths(lithium_component_dir, 'sort.cpp'), + join_paths(lithium_src_dir, 'config/configor.cpp'), + join_paths(lithium_src_dir, 'debug/terminal.cpp'), + join_paths(lithium_task_dir, 'manager.cpp'), + join_paths(lithium_task_dir, 'generator.cpp'), + join_paths(lithium_task_dir, 'container.cpp'), + join_paths(lithium_task_dir, 'tick.cpp'), + join_paths(lithium_task_dir, 'loader.cpp'), + join_paths(lithium_task_dir, 'list.cpp'), + join_paths(lithium_task_dir, 'pool.cpp'), + join_paths(lithium_src_dir, 'LithiumApp.cpp'), +]) + +lithium_server = executable( + 'lithium_server', + lithium_server_src, + dependencies: lithium_deps, + include_directories: include_directories('.', 'libs', 'libs/oatpp', 'libs/oatpp-swagger', 'libs/oatpp-websocket'), + link_with: lithium_server_library, + link_args: cpp.get_supported_link_arguments(), +) + +lithium_server_library = static_library( + 'lithium_server-library', + lithium_server_library_src, + dependencies: lithium_deps, + include_directories: include_directories('.', 'libs', 'libs/oatpp', 'libs/oatpp-swagger', 'libs/oatpp-websocket'), +) + +configure_file( + input: 'config.h.in', + output: 'config.h', +) + +# Additional targets +cmake_additional_files = custom_target( + 'CmakeAdditionalFiles', + input: join_paths(lithium_src_dir, '../cmake_modules/compiler_options.cmake'), +) + +# clang-format +if cpp.get_id() == 'clang' + format_code = get_option('FORMAT_CODE') + if format_code.get_value() + all_source_files = [] + all_source_files += files(lithium_src_dir, recursive: true, exclude_files: ['*.h']) + clangformat_exe = find_program('clang-format-5.0') + if clangformat_exe.found() + run_target( + 'clang-format', + command: [clangformat_exe, '-style=file', '-i'] + all_source_files, + input: all_source_files, + capture: true, + ) + endif + endif +endif diff --git a/src/addon/manager.cpp b/src/addon/manager.cpp index aef43900..cd97f3d0 100644 --- a/src/addon/manager.cpp +++ b/src/addon/manager.cpp @@ -135,7 +135,7 @@ bool ComponentManager::Initialize() { module_name); continue; } - DLOG_F(INFO, "Loaded module: {}/{}", path.string(), module_info); + DLOG_F(INFO, "Loaded module: {}/{}", path.string(), module_info.dump()); } } return true; diff --git a/src/atom/CMakeLists.txt b/src/atom/CMakeLists.txt index c8489488..47070d12 100644 --- a/src/atom/CMakeLists.txt +++ b/src/atom/CMakeLists.txt @@ -75,7 +75,7 @@ list(APPEND ${PROJECT_NAME}_LIBS cpp_httplib libzippp atom-algorithm - atom-connection + #atom-connection atom-async atom-task atom-io diff --git a/src/atom/algorithm/fraction.hpp b/src/atom/algorithm/fraction.hpp index fb312e51..1f720fd5 100644 --- a/src/atom/algorithm/fraction.hpp +++ b/src/atom/algorithm/fraction.hpp @@ -113,7 +113,7 @@ class Fraction { * @param other The fraction to compare with. * @return An integer indicating the comparison result. */ - auto Fraction::operator<=>(const Fraction& other) const { + auto operator<=>(const Fraction& other) const { double diff = this->to_double() - other.to_double(); if (diff > 0) return std::strong_ordering::greater; diff --git a/src/atom/connection/xmake.lua b/src/atom/connection/xmake.lua index e69de29b..5dfc1701 100644 --- a/src/atom/connection/xmake.lua +++ b/src/atom/connection/xmake.lua @@ -0,0 +1,69 @@ +-- 设置项目信息 +set_project("atom-connection") +set_version("1.0.0") +set_description("Connection Between Lithium Drivers, TCP and IPC") +set_license("GPL3") + +-- 添加构建模式 +add_rules("mode.debug", "mode.release") + +-- 设置构建选项 +option("enable_ssh") + set_default(false) + set_showmenu(true) + set_description("Enable SSH support") +option_end() + +option("enable_libssh") + set_default(false) + set_showmenu(true) + set_description("Enable LibSSH support") +option_end() + +option("enable_python") + set_default(false) + set_showmenu(true) + set_description("Enable Python bindings") +option_end() + +-- 设置构建目标 +target("atom-connection") + set_kind("static") + add_files("*.cpp") + add_headerfiles("*.hpp") + add_packages("loguru") + if is_plat("windows") then + add_syslinks("ws2_32") + end + if has_config("enable_ssh") then + add_packages("libssh") + end + if has_config("enable_libssh") then + add_files("sshclient.cpp") + add_headerfiles("sshclient.hpp") + end + if has_config("enable_python") then + add_rules("python.pybind11_module") + add_files("_pybind.cpp") + add_deps("python") + end + +-- 安装目标文件 +target("install") + set_kind("phony") + add_deps("atom-connection") + on_install(function (target) + import("package.tools.install") + local installx = package.tools.install + installx.static("atom-connection", {destdir = "/usr/local/lib"}) + end) + +-- 构建项目 +target("build") + set_kind("phony") + add_deps("atom-connection") + +-- 清理构建产物 +target("clean") + set_kind("phony") + add_rules("utils.clean.clean") \ No newline at end of file diff --git a/src/atom/io/meson.build b/src/atom/io/meson.build new file mode 100644 index 00000000..2a98279d --- /dev/null +++ b/src/atom/io/meson.build @@ -0,0 +1,42 @@ +project('atom-io', 'cpp') + +# Sources +atom_io_sources = [ + 'compress.cpp', + 'file.cpp', + 'io.cpp', +] + +# Headers +atom_io_headers = [ + 'compress.hpp', + 'file.hpp', + 'glob.hpp', + 'io.hpp', +] + +# Build Object Library +atom_io_object = library( + 'atom-io-object', + atom_io_sources, + include_directories: include_directories('.') +) + +# Link libraries +atom_io_object_deps = [ + dependency('loguru'), + dependency('libzippp') +] + +# Build Static Library +atom_io_static = library( + 'atom-io', + atom_io_sources, + include_directories: include_directories('.'), + dependencies: atom_io_object_deps, + version: '1.0', + soversion: '1' +) + +# Install +install_targets(atom_io_static) diff --git a/src/atom/io/xmake.lua b/src/atom/io/xmake.lua new file mode 100644 index 00000000..bbc5ff37 --- /dev/null +++ b/src/atom/io/xmake.lua @@ -0,0 +1,34 @@ +-- xmake.lua for Atom-IO + +-- Project Information +set_project("Atom-IO") +set_version("1.0.0") +set_description("IO Components for Element Astro Project") +set_licenses("GPL-3.0") + +-- Specify the C++ Languages +set_languages("c++17") + +-- Add Source Files +add_files("*.cpp") +add_files("*.hpp") + +-- Add Private Header Files +add_headerfiles("*.hpp", {prefixdir = "$(projectdir)"}) + +-- Add Target +target("Atom-IO") + set_kind("static") + add_packages("loguru", "libzippp") + add_links("pthread") + add_includedirs(".") + +-- Install Rules +after_install("install_headers") +after_install("install_libraries") + +-- Install Headers +install_headers("*.hpp", "$(projectdir)/include/$(projectname)") + +-- Install Libraries +install_libraries("$(targetdir)/*.a", "$(projectdir)/lib") \ No newline at end of file diff --git a/src/atom/search/CMakeLists.txt b/src/atom/search/CMakeLists.txt index 67533262..3fe931aa 100644 --- a/src/atom/search/CMakeLists.txt +++ b/src/atom/search/CMakeLists.txt @@ -1,7 +1,7 @@ # CMakeLists.txt for Atom-Search # This project is licensed under the terms of the GPL3 license. # -# Project Name: Atom-Utils +# Project Name: Atom-Search # Description: Search Engine for Element Astro Project # Author: Max Qian # License: GPL3 diff --git a/src/atom/search/meson.build b/src/atom/search/meson.build new file mode 100644 index 00000000..c99b30f8 --- /dev/null +++ b/src/atom/search/meson.build @@ -0,0 +1,38 @@ +project('atom-search', 'cpp') + +# Sources +atom_search_sources = [ + 'search.cpp', + 'sqlite.cpp', +] + +# Headers +atom_search_headers = [ + 'cache_impl.hpp', + 'cache.hpp', + 'search.hpp', + 'sqlite.hpp', +] + +# Build Object Library +atom_search_object = library( + 'atom-search-object', + atom_search_sources, + include_directories: include_directories('.') +) + +# Link libraries +atom_search_object_deps = dependency('loguru') + +# Build Static Library +atom_search_static = library( + 'atom-search', + atom_search_sources, + include_directories: include_directories('.'), + dependencies: [atom_search_object_deps], + version: '1.0', + soversion: '1' +) + +# Install +install_targets(atom_search_static) diff --git a/src/atom/search/xmake.lua b/src/atom/search/xmake.lua new file mode 100644 index 00000000..b894c7bd --- /dev/null +++ b/src/atom/search/xmake.lua @@ -0,0 +1,34 @@ +-- xmake.lua for Atom-Search + +-- Project Information +set_project("Atom-Search") +set_version("1.0.0") +set_description("Search Engine for Element Astro Project") +set_licenses("GPL-3.0") + +-- Specify the C++ Languages +set_languages("c++17") + +-- Add Source Files +add_files("*.cpp") +add_files("*.hpp") + +-- Add Private Header Files +add_headerfiles("*.hpp", {prefixdir = "$(projectdir)"}) + +-- Add Target +target("Atom-Search") + set_kind("static") + add_packages("loguru") + add_links("pthread") + add_includedirs(".") + +-- Install Rules +after_install("install_headers") +after_install("install_libraries") + +-- Install Headers +install_headers("*.hpp", "$(projectdir)/include/$(projectname)") + +-- Install Libraries +install_libraries("$(targetdir)/*.a", "$(projectdir)/lib") \ No newline at end of file diff --git a/src/atom/system/meson.build b/src/atom/system/meson.build new file mode 100644 index 00000000..346ff75a --- /dev/null +++ b/src/atom/system/meson.build @@ -0,0 +1,64 @@ +project('atom-system', 'cpp') + +# Sources +atom_system_sources = [ + 'command.cpp', + 'crash_quotes.cpp', + 'crash.cpp', + 'pidwatcher.cpp', + 'process.cpp', + 'register.cpp', + 'storage.cpp', + 'system.cpp', + 'user.cpp', + + 'module/cpu.cpp', + 'module/disk.cpp', + 'module/memory.cpp', + 'module/battery.cpp', + 'module/wifi.cpp', + 'module/os.cpp', +] + +# Headers +atom_system_headers = [ + 'command.hpp', + 'crash_quotes.hpp', + 'crash.hpp', + 'pidwatcher.hpp', + 'process.hpp', + 'register.hpp', + 'storage.hpp', + 'system.hpp', + 'user.hpp', + + 'module/cpu.hpp', + 'module/disk.hpp', + 'module/memory.hpp', + 'module/battery.hpp', +] + +# Build Object Library +atom_system_object = library( + 'atom-system-object', + atom_system_sources, + include_directories: include_directories('.') +) + +# Link libraries +atom_system_object_deps = [ + dependency('loguru') +] + +# Build Static Library +atom_system_static = library( + 'atom-system', + atom_system_sources, + include_directories: include_directories('.'), + dependencies: atom_system_object_deps, + version: '1.0', + soversion: '1' +) + +# Install +install_targets(atom_system_static) diff --git a/src/atom/system/xmake.lua b/src/atom/system/xmake.lua new file mode 100644 index 00000000..589bfbf4 --- /dev/null +++ b/src/atom/system/xmake.lua @@ -0,0 +1,41 @@ +-- xmake.lua for Atom-System + +-- Project Information +set_project("Atom-System") +set_version("1.0.0") +set_description("A collection of useful system functions") +set_licenses("GPL-3.0") + +-- Specify the C++ Languages +set_languages("c++17") + +-- Add Source Files +add_files("*.cpp") +add_files("module/*.cpp") +add_files("*.hpp") +add_files("module/*.hpp") + +-- Add Private Header Files +add_headerfiles("*.hpp", {prefixdir = "$(projectdir)"}) +add_headerfiles("module/*.hpp", {prefixdir = "$(projectdir)/module"}) + +-- Add Target +target("Atom-System") + set_kind("static") + add_packages("loguru") + add_links("pthread") + add_includedirs(".") + if is_plat("windows") then + add_links("pdh", "wlanapi") + end + +-- Install Rules +after_install("install_headers") +after_install("install_libraries") + +-- Install Headers +install_headers("*.hpp", "$(projectdir)/include/$(projectname)") +install_headers("module/*.hpp", "$(projectdir)/include/$(projectname)/module") + +-- Install Libraries +install_libraries("$(targetdir)/*.a", "$(projectdir)/lib") \ No newline at end of file diff --git a/src/atom/task/meson.build b/src/atom/task/meson.build new file mode 100644 index 00000000..ffc7f3bd --- /dev/null +++ b/src/atom/task/meson.build @@ -0,0 +1,35 @@ +project('atom-task', 'cpp') + +# Sources +atom_task_sources = [ + 'loop_task.cpp', + 'conditional_task.cpp', + 'task.cpp', +] + +# Headers +atom_task_headers = [ + 'loop_task.hpp', + 'conditional_task.hpp', + 'task.hpp', +] + +# Build Object Library +atom_task_object = library( + 'atom-task-object', + atom_task_sources, + include_directories: include_directories('.') +) + +# Build Static Library +atom_task_static = library( + 'atom-task', + atom_task_sources, + include_directories: include_directories('.'), + dependencies: atom_task_object, + version: '1.0', + soversion: '1' +) + +# Install +install_targets(atom_task_static) diff --git a/src/atom/task/xmake.lua b/src/atom/task/xmake.lua new file mode 100644 index 00000000..c6376c12 --- /dev/null +++ b/src/atom/task/xmake.lua @@ -0,0 +1,30 @@ +-- xmake.lua for Atom-Task + +-- Project Information +set_project("Atom-Task") +set_version("1.0.0") +set_description("Core Task Definitions") +set_licenses("GPL-3.0") + +-- Specify the C++ Languages +set_languages("c++17") + +-- Add Source Files +add_files("*.cpp") +add_files("*.hpp") + +-- Add Target +target("Atom-Task") + set_kind("static") + add_links("pthread") + add_includedirs(".") + +-- Install Rules +after_install("install_headers") +after_install("install_libraries") + +-- Install Headers +install_headers("*.hpp", "$(projectdir)/include/$(projectname)") + +-- Install Libraries +install_libraries("$(targetdir)/*.a", "$(projectdir)/lib") \ No newline at end of file diff --git a/src/atom/utils/xmake.lua b/src/atom/utils/xmake.lua index 82e00bde..071e7bdf 100644 --- a/src/atom/utils/xmake.lua +++ b/src/atom/utils/xmake.lua @@ -47,7 +47,7 @@ local private_headers = { -- Build Object Library target("atom-utils-object") set_kind("object") - add_files(headers, {public = true}) + add_headerfiles(headers, {public = true}) add_files(sources, private_headers, {public = false}) add_packages("loguru", "tinyxml2") diff --git a/xmake.lua b/xmake.lua index a8b3d4ed..ed33fda3 100644 --- a/xmake.lua +++ b/xmake.lua @@ -2,164 +2,50 @@ -- This project is licensed under the terms of the GPL3 license. -- -- Project Name: Lithium --- Description: Open Astrophotography Terminal +-- Description: Lithium - Open Astrophotography Terminal -- Author: Max Qian -- License: GPL3 -add_rules("mode.release", "mode.debug") +set_project("Lithium") +set_languages("c++20") --- root directory of the project -set(Lithium_PROJECT_ROOT_DIR, "$(projectdir)") -set(lithium_src_dir, "$(projectdir)/src/") - --- compiler options -if is_plat("windows") then - add_defines("WIN32") - add_cxxflags("/EHsc") -elseif is_plat("macosx") or is_plat("linux") then - add_defines("UNIX") +if is_plat("macosx") then + add_shflags("-undefined dynamic_lookup") end -add_defines("USE_FOLDERS") --- main project --- this should appear after setting the architecture -target("Lithium") +set_version("1.0.0") - set_targetdir("$(projectdir)/build") - set_objectdir("$(projectdir)/build/$(plat)") +add_includedirs("libs/", "driverlibs/", "src/", "src/atom", "libs/oatpp", "libs/oatpp-swagger", "libs/oatpp-websocket", {public = true}) - -- include directories - add_includedirs( - "$(projectdir)/libs/", - "$(lithium_src_dir)", - "$(lithium_src_dir)/modules", - "$(projectdir)/src/", - "$(projectdir)/libs/oatpp", - "$(projectdir)/libs/oatpp-swagger", - "$(projectdir)/libs/oatpp-websocket" - ) +add_defines("ENABLE_ASYNC_FLAG=1", "ENABLE_DEBUG_FLAG=1", "ENABLE_NATIVE_SERVER_FLAG=1", "ENABLE_FASHHASH_FLAG=1", "ENABLE_WEB_SERVER_FLAG=1", "ENABLE_WEB_CLIENT_FLAG=1") - -- source files - add_files( - "$(lithium_src_dir)/api/astap.cpp", - "$(lithium_src_dir)/api/astap.hpp", - "$(lithium_src_dir)/api/astrometry.cpp", - "$(lithium_src_dir)/api/astrometry.hpp", - "$(lithium_src_dir)/api/phd2client.cpp", - "$(lithium_src_dir)/api/phd2client.hpp", - "$(lithium_src_dir)/modules/config/configor.cpp", - "$(lithium_src_dir)/modules/config/configor.hpp", - "$(lithium_src_dir)/database/database.cpp", - "$(lithium_src_dir)/database/database.hpp", - "$(lithium_src_dir)/debug/terminal.cpp", - "$(lithium_src_dir)/debug/terminal.hpp", - "$(lithium_src_dir)/modules/device/device.cpp", - "$(lithium_src_dir)/modules/device/device.hpp", - "$(lithium_src_dir)/modules/device/device_manager.cpp", - "$(lithium_src_dir)/modules/device/device_manager.hpp", - "$(lithium_src_dir)/api/hydrogenclient.cpp", - "$(lithium_src_dir)/api/hydrogenclient.hpp", - "$(lithium_src_dir)/driver/indi/indi_exception.hpp", - "$(lithium_src_dir)/driver/indi/indicamera.cpp", - "$(lithium_src_dir)/driver/indi/indicamera.hpp", - "$(lithium_src_dir)/driver/indi/indifocuser.cpp", - "$(lithium_src_dir)/driver/indi/indifocuser.hpp", - "$(lithium_src_dir)/driver/indi/inditelescope.cpp", - "$(lithium_src_dir)/driver/indi/inditelescope.hpp", - "$(lithium_src_dir)/driver/indi/indifilterwheel.cpp", - "$(lithium_src_dir)/driver/indi/indifilterwheel.hpp", - "$(lithium_src_dir)/image/image.cpp", - "$(lithium_src_dir)/image/image.hpp", - "$(lithium_src_dir)/image/draw.cpp", - "$(lithium_src_dir)/modules/io/compress.cpp", - "$(lithium_src_dir)/modules/io/compress.hpp", - "$(lithium_src_dir)/modules/io/file.cpp", - "$(lithium_src_dir)/modules/io/file.hpp", - "$(lithium_src_dir)/modules/io/glob.hpp", - "$(lithium_src_dir)/modules/io/io.cpp", - "$(lithium_src_dir)/modules/io/io.hpp", - "$(lithium_src_dir)/launcher/crash.cpp", - "$(lithium_src_dir)/launcher/crash.hpp", - "$(lithium_src_dir)/logger/aptlogger.cpp", - "$(lithium_src_dir)/logger/aptlogger.hpp", - "$(lithium_src_dir)/logger/log_manager.cpp", - "$(lithium_src_dir)/logger/log_manager.hpp", - "$(lithium_src_dir)/modules/module/module_loader.cpp", - "$(lithium_src_dir)/modules/module/module_loader.hpp", - "$(lithium_src_dir)/network/downloader.cpp", - "$(lithium_src_dir)/network/downloader.hpp", - "$(lithium_src_dir)/network/httpclient.cpp", - "$(lithium_src_dir)/network/httpclient.hpp", - "$(lithium_src_dir)/network/socketclient.cpp", - "$(lithium_src_dir)/network/socketclient.hpp", - "$(lithium_src_dir)/network/time.cpp", - "$(lithium_src_dir)/network/time.hpp", - "$(lithium_src_dir)/liproperty/base64.cpp", - "$(lithium_src_dir)/liproperty/base64.hpp", - "$(lithium_src_dir)/liproperty/imessage.cpp", - "$(lithium_src_dir)/liproperty/iproperty.hpp", - "$(lithium_src_dir)/liproperty/sha256.hpp", - "$(lithium_src_dir)/liproperty/uuid.cpp", - "$(lithium_src_dir)/liproperty/uuid.hpp", - "$(lithium_src_dir)/modules/server/commander.cpp", - "$(lithium_src_dir)/modules/server/commander.hpp", - "$(lithium_src_dir)/websocket/WebSocketServer.cpp", - "$(lithium_src_dir)/modules/thread/thread.cpp", - "$(lithium_src_dir)/modules/thread/thread.hpp", - "$(lithium_src_dir)/modules/thread/threadpool.cpp", - "$(lithium_src_dir)/modules/thread/threadpool.hpp", - "$(lithium_src_dir)/modules/system/system.cpp", - "$(lithium_src_dir)/modules/system/system.hpp", - "$(lithium_src_dir)/App.cpp", - "$(lithium_src_dir)/AppComponent.hpp", - "$(lithium_src_dir)/LithiumApp.cpp", - "$(lithium_src_dir)/LithiumApp.hpp" - ) - - -- link libraries - if is_plat("windows") then - add_links("pdh", "iphlpapi") - add_cxxflags("/MD") - add_defines("_CRT_SECURE_NO_WARNINGS") - add_packages("openssl") - add_packages("cfitsio") - add_packages("zlib") - add_packages("sqlite3") - add_packages("pugixml") - add_packages("loguru") - add_packages("dlfcn-win32") - add_packages("oatpp-websocket", "oatpp-swagger", "oatpp-openssl", "oatpp") - elseif is_plat("macosx") then - add_frameworks( - "Cocoa", - "IOKit", - "Carbon", - "Security", - "Foundation" - ) - add_packages("openssl") - add_packages("cfitsio") - add_packages("zlib") - add_packages("sqlite3") - add_packages("pugixml") - add_packages("oatpp-websocket", "oatpp-swagger", "oatpp-openssl", "oatpp") - add_packages("loguru") - elseif is_plat("linux") then - add_packages("openssl") - add_packages("cfitsio") - add_packages("zlib") - add_packages("sqlite3") - add_packages("pugixml") - add_packages("oatpp-websocket", "oatpp-swagger", "oatpp-openssl", "oatpp") - add_packages("loguru") - add_packages("dl") - end +if is_plat("windows") then + set_installdir("C:/Program Files/LithiumServer") +elseif is_plat("linux") then + set_installdir("/usr/lithium") +end - -- set output directory and name for Lithium executable +target("lithium_server-library") + set_kind("static") + add_files("src/device/server/*.cpp", "src/device/manager.cpp", "src/device/utils/utils.cpp", "src/addon/*.cpp", "src/config/configor.cpp", + "src/debug/terminal.cpp", "src/script/*.cpp", "src/script/custom/*.cpp", "src/task/*.cpp", "src/LithiumApp.cpp") + add_packages("openssl", "cfitsio", "zlib", "sqlite3", "fmt") + add_deps("atomstatic", "loguru", "libzippp", "oatpp", "oatpp-websocket", "oatpp-swagger", "oatpp-openssl", "oatpp-zlib", "cpp_httplib", "backward", "tinyxml2", "pocketpy") + +target("lithium_server") + set_kind("binary") + add_files("src/app.cpp") + add_deps("lithium_server-library") + add_defines("LOGURU_DEBUG_LOGGING") + add_packages("openssl", "cfitsio", "zlib", "sqlite3", "fmt") + add_deps("atomstatic", "loguru", "libzippp", "oatpp", "oatpp-websocket", "oatpp-swagger", "oatpp-openssl", "oatpp-zlib", "cpp_httplib", "backward", "tinyxml2", "pocketpy") if is_plat("windows") then - set_targetdir("$(projectdir)/build/$(plat)/$(arch)") - set_targetname("lithium_server") + add_syslinks("pdh", "iphlpapi", "winmm", "crypt32", "wsock32", "ws2_32") + add_requires("dlfcn-win32") else - set_targetdir("$(projectdir)/build") - set_targetname("lithium_server") + add_syslinks("dl") end + set_targetdir("$(buildir)") + set_filename("lithium_server") + +includes("libs", "tools", "modules", "driver") \ No newline at end of file From 3b19eefdb8eae769a7136279dd4528c203d8916a Mon Sep 17 00:00:00 2001 From: Max Qian Date: Tue, 16 Apr 2024 21:21:22 +0800 Subject: [PATCH 14/28] module load is ok now --- src/addon/loader.cpp | 46 ++++++++------- src/addon/loader.hpp | 4 +- src/addon/manager.cpp | 62 ++++++++++++++++++-- src/atom/io/io.cpp | 1 + src/atom/utils/string.cpp | 18 ++++++ src/atom/utils/string.hpp | 10 ++++ src/config/{package.lithium => package.json} | 0 src/utils/constant.hpp | 2 +- 8 files changed, 113 insertions(+), 30 deletions(-) rename src/config/{package.lithium => package.json} (100%) diff --git a/src/addon/loader.cpp b/src/addon/loader.cpp index e3ecf8c8..2bb248fc 100644 --- a/src/addon/loader.cpp +++ b/src/addon/loader.cpp @@ -69,7 +69,7 @@ std::shared_ptr ModuleLoader::createShared( bool ModuleLoader::LoadModule(const std::string &path, const std::string &name) { - std::unique_lock lock(m_SharedMutex); + // std::unique_lock lock(m_SharedMutex); try { // Max : The mod's name should be unique, so we check if it already // exists @@ -280,13 +280,15 @@ std::vector> ModuleLoader::loadModuleFunctions( } bool ModuleLoader::UnloadModule(const std::string &name) { - std::unique_lock lock(m_SharedMutex); + // Check if the module is loaded and has a valid handle + // Max: Check before loading to avaid dead lock + if (!HasModule(name)) { + LOG_F(ERROR, "Module {} is not loaded", name); + return false; + }; + // TODO: Fix this, maybe use a lock + // std::unique_lock lock(m_SharedMutex); try { - // Check if the module is loaded and has a valid handle - if (!HasModule(name)) { - LOG_F(ERROR, "Module {} is not loaded", name); - return false; - }; // Unload the library and remove its handle from handles_ map int result = UNLOAD_LIBRARY(GetModule(name)->handle); if (result != 0) { @@ -302,7 +304,7 @@ bool ModuleLoader::UnloadModule(const std::string &name) { } bool ModuleLoader::UnloadAllModules() { - std::unique_lock lock(m_SharedMutex); + std::unique_lock lock(m_SharedMutex); for (auto entry : modules_) { int result = UNLOAD_LIBRARY(entry.second->handle); if (result != 0) { @@ -315,7 +317,7 @@ bool ModuleLoader::UnloadAllModules() { } bool ModuleLoader::CheckModuleExists(const std::string &name) const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); // Max : Directly check if the library exists seems to be a litle bit slow. // May we use filesystem instead? void *handle = LOAD_LIBRARY(name.c_str()); @@ -330,7 +332,7 @@ bool ModuleLoader::CheckModuleExists(const std::string &name) const { std::shared_ptr ModuleLoader::GetModule( const std::string &name) const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); auto it = modules_.find(name); if (it == modules_.end()) { return nullptr; @@ -339,7 +341,7 @@ std::shared_ptr ModuleLoader::GetModule( } void *ModuleLoader::GetHandle(const std::string &name) const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); auto it = modules_.find(name); if (it == modules_.end()) { return nullptr; @@ -348,12 +350,12 @@ void *ModuleLoader::GetHandle(const std::string &name) const { } bool ModuleLoader::HasModule(const std::string &name) const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); return modules_.count(name) > 0; } bool ModuleLoader::EnableModule(const std::string &name) { - std::unique_lock lock(m_SharedMutex); + std::unique_lock lock(m_SharedMutex); // Check if the module is loaded if (!HasModule(name)) { LOG_F(ERROR, "Module {} is not loaded", name); @@ -381,7 +383,7 @@ bool ModuleLoader::EnableModule(const std::string &name) { } bool ModuleLoader::DisableModule(const std::string &name) { - std::unique_lock lock(m_SharedMutex); + std::unique_lock lock(m_SharedMutex); // Check if the module is loaded if (!HasModule(name)) { LOG_F(ERROR, "Module {} is not loaded", name); @@ -408,7 +410,7 @@ bool ModuleLoader::DisableModule(const std::string &name) { } bool ModuleLoader::IsModuleEnabled(const std::string &name) const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); if (!HasModule(name)) { LOG_F(ERROR, "Module {} is not loaded", name); return false; @@ -420,7 +422,7 @@ bool ModuleLoader::IsModuleEnabled(const std::string &name) const { } std::string ModuleLoader::GetModuleVersion(const std::string &name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); if (HasModule(name)) { return GetFunction(name, "GetVersion")(); } @@ -428,7 +430,7 @@ std::string ModuleLoader::GetModuleVersion(const std::string &name) { } std::string ModuleLoader::GetModuleDescription(const std::string &name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); if (HasModule(name)) { return GetFunction(name, "GetDescription")(); } @@ -436,7 +438,7 @@ std::string ModuleLoader::GetModuleDescription(const std::string &name) { } std::string ModuleLoader::GetModuleAuthor(const std::string &name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); if (HasModule(name)) { return GetFunction(name, "GetAuthor")(); } @@ -444,7 +446,7 @@ std::string ModuleLoader::GetModuleAuthor(const std::string &name) { } std::string ModuleLoader::GetModuleLicense(const std::string &name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); if (HasModule(name)) { return GetFunction(name, "GetLicense")(); } @@ -452,7 +454,7 @@ std::string ModuleLoader::GetModuleLicense(const std::string &name) { } std::string ModuleLoader::GetModulePath(const std::string &name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); auto it = modules_.find(name); if (it != modules_.end()) { Dl_info dl_info; @@ -471,7 +473,7 @@ json ModuleLoader::GetModuleConfig(const std::string &name) { } const std::vector ModuleLoader::GetAllExistedModules() const { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); std::vector modules_name; if (modules_.empty()) { return modules_name; @@ -484,7 +486,7 @@ const std::vector ModuleLoader::GetAllExistedModules() const { bool ModuleLoader::HasFunction(const std::string &name, const std::string &function_name) { - std::shared_lock lock(m_SharedMutex); + std::shared_lock lock(m_SharedMutex); auto handle_it = modules_.find(name); if (handle_it == modules_.end()) { LOG_F(ERROR, "Failed to find module {}", name); diff --git a/src/addon/loader.hpp b/src/addon/loader.hpp index 14b23e41..c2327758 100644 --- a/src/addon/loader.hpp +++ b/src/addon/loader.hpp @@ -45,8 +45,8 @@ Description: C++ and Modules Loader #include #include #define MODULE_HANDLE void * -#define LOAD_LIBRARY(p) dlopen(p, RTLD_NOW | RTLD_GLOBAL) -#define LOAD_SHARED_LIBRARY(file, size) dlopen(nullptr, RTLD_NOW | RTLD_GLOBAL) +#define LOAD_LIBRARY(p) dlopen(p, RTLD_LAZY | RTLD_GLOBAL) +#define LOAD_SHARED_LIBRARY(file, size) dlopen(nullptr, RTLD_LAZY | RTLD_GLOBAL) #define UNLOAD_LIBRARY(p) dlclose(p) #define LOAD_ERROR() dlerror() #define LOAD_FUNCTION(handle, name) dlsym(handle, name) diff --git a/src/addon/manager.cpp b/src/addon/manager.cpp index cd97f3d0..d9af5ec9 100644 --- a/src/addon/manager.cpp +++ b/src/addon/manager.cpp @@ -24,6 +24,7 @@ Description: Component Manager (the core of the plugin system) #include "atom/io/io.hpp" #include "atom/log/loguru.hpp" #include "atom/server/global_ptr.hpp" +#include "atom/utils/string.hpp" #include "utils/constant.hpp" #include "utils/marco.hpp" @@ -107,6 +108,12 @@ bool ComponentManager::Initialize() { continue; } const json &addon_info = m_AddonManager.lock()->getModule(dir); + if (!addon_info.is_object() || !addon_info.contains("name") || + !addon_info["name"].is_string()) { + LOG_F(ERROR, "Invalid module name: {}", path.string()); + continue; + } + auto addon_name = addon_info["name"].get(); // Check if the addon info is valid if (!addon_info.contains("modules") || addon_info.is_null()) { LOG_F(ERROR, "Failed to load module: {}", path.string()); @@ -123,19 +130,64 @@ bool ComponentManager::Initialize() { module_info.dump()); continue; } - auto module_name = module_info["name"].get(); + auto module_name = + addon_name + "." + module_info["name"].get(); std::filesystem::path module_path = - path / module_name / constants::LIB_EXTENSION; + path / (module_info["name"].get() + + std::string(constants::LIB_EXTENSION)); + + DLOG_F(INFO, "Loading module: {}", module_path.string()); +#ifdef _WIN32 + // This is to pass file name check + auto module_path_str = + Atom::Utils::replaceString(module_path.string(), "/", "\\"); +#else + auto module_path_str = + Atom::Utils::replaceString(module_path.string(), "\\", "/"); +#endif - DLOG_F(INFO, "Loading module: {}/{}", path.string(), module_name); // This step is to load the dynamic library - if (!m_ModuleLoader.lock()->LoadModule(module_path.string(), + if (!m_ModuleLoader.lock()->LoadModule(module_path_str, module_name)) { + LOG_F(ERROR, "Failed to load module: {}", module_path_str); + continue; + } + DLOG_F(INFO, "Loaded module: {}/{}", path.string(), + module_info.dump()); + auto component_entry = module_info["entry"].get(); + if (component_entry.empty()) { LOG_F(ERROR, "Failed to load module: {}/{}", path.string(), module_name); continue; } - DLOG_F(INFO, "Loaded module: {}/{}", path.string(), module_info.dump()); + auto component_identifier = + addon_name + module_name + component_entry; + if (auto component = + m_ModuleLoader.lock()->GetInstance( + module_name, {}, component_entry); + component) { + LOG_F(INFO, "Loaded shared component: {}", + component_identifier); + try { + if (component->initialize()) { + m_SharedComponents[addon_name + module_name] = + component; + LOG_F(INFO, "Loaded shared component: {}", + component_identifier); + } else { + LOG_F(ERROR, + "Failed to initialize shared component: {}", + component_identifier); + } + } catch (const std::exception &e) { + LOG_F(ERROR, "Failed to initialize shared component: {}", + component_identifier); + } + + } else { + LOG_F(ERROR, "Failed to load shared component: {}", + component_identifier); + } } } return true; diff --git a/src/atom/io/io.cpp b/src/atom/io/io.cpp index c76b0354..ae8ce7e0 100644 --- a/src/atom/io/io.cpp +++ b/src/atom/io/io.cpp @@ -317,6 +317,7 @@ bool isFolderExists(const fs::path &folderName) { bool isFileExists(const std::string &fileName) { if (!isFileNameValid(fileName)) { + LOG_F(ERROR, "Invalid file name: {}", fileName); return false; } return fs::exists(fileName) && fs::is_regular_file(fileName); diff --git a/src/atom/utils/string.cpp b/src/atom/utils/string.cpp index fc626e62..04062b0e 100644 --- a/src/atom/utils/string.cpp +++ b/src/atom/utils/string.cpp @@ -171,4 +171,22 @@ std::string joinStrings(const std::vector &strings, return oss.str(); } + +std::string replaceString(std::string_view text, std::string_view oldStr, std::string_view newStr) { + std::string result = text.data(); + size_t pos = 0; + while ((pos = result.find(std::string(oldStr), pos)) != std::string::npos) { + result.replace(pos, oldStr.length(), std::string(newStr)); + pos += newStr.length(); + } + return result; +} + +std::string replaceStrings(std::string_view text, const std::vector>& replacements) { + std::string result(text); + for (const auto& [oldStr, newStr] : replacements) { + result = replaceString(result, oldStr, newStr); + } + return result; +} } // namespace Atom::Utils \ No newline at end of file diff --git a/src/atom/utils/string.hpp b/src/atom/utils/string.hpp index a83a33ea..5b289985 100644 --- a/src/atom/utils/string.hpp +++ b/src/atom/utils/string.hpp @@ -16,6 +16,7 @@ Description: Some useful string functions #define ATOM_UTILS_STRING_HPP #include +#include #include namespace Atom::Utils { @@ -73,6 +74,15 @@ splitString(const std::string &str, char delimiter); [[nodiscard("the result of joinStrings is not used")]] std::string joinStrings( const std::vector &strings, const std::string_view &delimiter); + +[[nodiscard("the result of replaceString is not used")]] std::string +replaceString(std::string_view text, std::string_view oldStr, + std::string_view newStr); + +[[nodiscard("the result of replaceStrings is not used")]] std::string +replaceStrings(std::string_view text, + const std::vector> + &replacements); } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/config/package.lithium b/src/config/package.json similarity index 100% rename from src/config/package.lithium rename to src/config/package.json diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp index 00c6bce2..389bad8b 100644 --- a/src/utils/constant.hpp +++ b/src/utils/constant.hpp @@ -34,7 +34,7 @@ class constants { #endif // Package info - static constexpr const char* PACKAGE_NAME = "package.lithium"; + static constexpr const char* PACKAGE_NAME = "package.json"; static constexpr const char* PACKAGE_NAME_SHORT = "lithium"; static constexpr const char* PACKAGE_VERSION = "0.1.0"; From e9a52d4083d5588092d72839193ea17e221ed8ee Mon Sep 17 00:00:00 2001 From: Max Qian Date: Wed, 17 Apr 2024 20:23:51 +0800 Subject: [PATCH 15/28] sync webclient --- src/addon/loader.cpp | 119 ++-- websrc/cobalt-web/package-lock.json | 259 +++++---- websrc/cobalt-web/package.json | 4 +- .../src/components/skymap/target_detail.tsx | 259 ++++----- .../src/components/skymap/target_small.tsx | 323 ++++++----- .../components/skymap/target_super_simle.tsx | 221 ++++++++ .../actions/align/ThreePointDataDisplay.tsx | 137 +++++ .../actions/align/ThreePointManualDialog.tsx | 70 +++ .../actions/align/ThreePointSettings.tsx | 168 ++++++ .../actions/align/ThreePointStepper.tsx | 511 ++++++++++++++++++ .../pages/dashboard2/actions/align/index.tsx | 459 ++++++++++++++++ .../autofocus/AutoFocusSettingDialog.tsx | 103 ++++ .../actions/autofocus/BackSlashMeasure.tsx | 0 .../dashboard2/actions/autofocus/index.tsx | 298 ++++++++++ .../actions/controls/CameraControl.tsx | 294 ++++++++++ .../actions/controls/FilterControl.tsx | 175 ++++++ .../actions/controls/FocuserControl.tsx | 248 +++++++++ .../actions/controls/GuiderControl.tsx | 12 + .../actions/controls/Phd2Control.tsx | 138 +++++ .../actions/controls/TelescopeControl.tsx | 389 +++++++++++++ .../actions/light/ConfirmDialog.tsx | 49 ++ .../actions/light/LightStarSelection.tsx | 58 ++ .../pages/dashboard2/actions/light/index.tsx | 325 +++++++++++ .../actions/shoot/HFRHistoryChart.tsx | 0 .../pages/dashboard2/actions/shoot/index.tsx | 414 ++++++++++++++ .../pages/dashboard2/actions/shoot/style.less | 90 +++ .../dashboard2/comps/graph/AF_figure.tsx | 19 + .../comps/graph/HFR_history_result.tsx | 8 + .../comps/graph/PHD2_calibration_result.tsx | 8 + .../comps/graph/PHD2_guide_graph.tsx | 104 ++++ .../dashboard2/comps/ui/ConsoleSelectComp.tsx | 123 +++++ .../dashboard2/comps/ui/InfoUpdateComp.tsx | 19 + .../cobalt-web/src/pages/dashboard2/index.tsx | 103 ++++ .../src/pages/dashboard2/registry/index.tsx | 40 ++ .../src/pages/dashboard2/style.less | 89 +++ .../src/pages/device/SquareButton.tsx | 34 ++ .../cobalt-web/src/pages/device/telescope.tsx | 313 ++++++----- .../cobalt-web/src/pages/skymap/framing.css | 7 + .../src/pages/skymap/image_framing.tsx | 442 ++++++++------- websrc/cobalt-web/src/pages/skymap/index.tsx | 75 ++- .../src/pages/skymap/object_manager.tsx | 356 +++++------- .../pages/skymap/object_manager_dialog.tsx | 18 +- .../src/pages/skymap/object_search.tsx | 160 +++--- .../src/pages/skymap/object_search_dialog.tsx | 39 +- 44 files changed, 5924 insertions(+), 1156 deletions(-) create mode 100644 websrc/cobalt-web/src/components/skymap/target_super_simle.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointDataDisplay.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointManualDialog.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointSettings.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/align/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/AutoFocusSettingDialog.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/BackSlashMeasure.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/FilterControl.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/GuiderControl.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/Phd2Control.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/light/ConfirmDialog.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/light/LightStarSelection.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/light/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/shoot/HFRHistoryChart.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/actions/shoot/style.less create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/graph/AF_figure.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/graph/HFR_history_result.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_calibration_result.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_guide_graph.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/ui/ConsoleSelectComp.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/comps/ui/InfoUpdateComp.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx create mode 100644 websrc/cobalt-web/src/pages/dashboard2/style.less create mode 100644 websrc/cobalt-web/src/pages/device/SquareButton.tsx create mode 100644 websrc/cobalt-web/src/pages/skymap/framing.css diff --git a/src/addon/loader.cpp b/src/addon/loader.cpp index 2bb248fc..a58bdfde 100644 --- a/src/addon/loader.cpp +++ b/src/addon/loader.cpp @@ -69,6 +69,7 @@ std::shared_ptr ModuleLoader::createShared( bool ModuleLoader::LoadModule(const std::string &path, const std::string &name) { + // dead lock if use std::lock_guard // std::unique_lock lock(m_SharedMutex); try { // Max : The mod's name should be unique, so we check if it already @@ -90,6 +91,7 @@ bool ModuleLoader::LoadModule(const std::string &path, return false; } mod_info->handle = handle; + mod_info->functions = loadModuleFunctions(name); // Load infomation from the library // Store the library handle in handles_ map with the module name as key @@ -183,97 +185,54 @@ std::vector> ModuleLoader::loadModuleFunctions( dl_iterate_phdr( [](struct dl_phdr_info *info, size_t size, void *data) { - std::vector *funcs = - reinterpret_cast *>(data); - + auto funcs = + static_cast> *>(data); if (info->dlpi_name && strcmp(info->dlpi_name, "") != 0) { - DLOG_F(INFO, "Module: {}", info->dlpi_name); - - Dl_info dl_info; - memset(&dl_info, 0, sizeof(Dl_info)); - dladdr(reinterpret_cast(info->dlpi_addr), - &dl_info); - - ElfW(Ehdr) *elfHeader = - reinterpret_cast(info->dlpi_addr); - int numOfSymbols = elfHeader->e_shnum; - ElfW(Shdr) *symbolSection = nullptr; - ElfW(Sym) *symbolTable = nullptr; - char *strTable = nullptr; - int strTableSize = 0; - - /* - TODO: fix this when we have a way to get the correct module - base address from lldb for (int i = 0; i < numOfSymbols; ++i) { - ElfW(Shdr)* sectionHeader = - reinterpret_cast(info->dlpi_addr + - elfHeader->e_shoff + i * elfHeader->e_shentsize); if - (sectionHeader->sh_type == SHT_DYNSYM) { symbolSection = - sectionHeader; symbolTable = - reinterpret_cast(info->dlpi_addr + - symbolSection->sh_offset); strTable = - reinterpret_cast(info->dlpi_addr + - reinterpret_cast(info->dlpi_phdr + - info->dlpi_phnum)->sh_offset); strTableSize = - reinterpret_cast(info->dlpi_phdr + - info->dlpi_phnum)->sh_size; break; - } - - // Get function parameters using libdw - Dwfl* dwfl = dwfl_begin(nullptr); - Dwfl_Module* module = dwfl_module_info(dwfl, - info->dlpi_addr); GElf_Sym sym; GElf_Addr sym_address; - Dwarf_Die* die = nullptr; - - if (gelf_getsym(symtab, i, &sym)) { - sym_address = sym.st_value; - die = dwarf_offdie(elf, sym.st_value); - } - - if (die != nullptr) { - Dwarf_Die params; - Dwarf_Die param; - if (dwarf_child(die, ¶ms) == DW_DLV_OK) - { while (dwarf_siblingof(die, ¶m) == DW_DLV_OK) { char* - paramName = nullptr; dwarf_diename(param, ¶mName); - - if (paramName != nullptr) { - funcs[i].parameters.push_back(paramName); - } + DLOG_F(INFO, "Module: %s", info->dlpi_name); + + const ElfW(Addr) base_address = info->dlpi_addr; + const ElfW(Phdr) *phdr = info->dlpi_phdr; + const auto phnum = info->dlpi_phnum; + + for (int j = 0; j < phnum; ++j) { + if (phdr[j].p_type == PT_DYNAMIC) { + auto *dyn = reinterpret_cast( + base_address + phdr[j].p_vaddr); + ElfW(Sym) *symtab = nullptr; + char *strtab = nullptr; + + for (; dyn->d_tag != DT_NULL; ++dyn) { + if (dyn->d_tag == DT_SYMTAB) { + symtab = reinterpret_cast( + base_address + dyn->d_un.d_ptr); + } else if (dyn->d_tag == DT_STRTAB) { + strtab = reinterpret_cast( + base_address + dyn->d_un.d_ptr); + } + } - dwarf_nextcu(die, &die, nullptr); - } - } + if (symtab && strtab) { + for (ElfW(Sym) *sym = symtab; sym->st_name != 0; + ++sym) { + if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC) { + const char *name = &strtab[sym->st_name]; + std::unique_ptr func = + std::make_unique(); + func->name = name; + func->address = reinterpret_cast( + base_address + sym->st_value); + funcs->push_back(std::move(func)); + DLOG_F(INFO, "Function: %s", name); } } - */ - - if (symbolTable && symbolSection) { - int numOfSymbols = - symbolSection->sh_size / sizeof(ElfW(Sym)); - for (int i = 0; i < numOfSymbols; ++i) { - ElfW(Sym) *symbol = &symbolTable[i]; - char *symName = &strTable[symbol->st_name]; - - if (ELF64_ST_TYPE(symbol->st_info) == STT_FUNC && - symName[0] != '\0') { - std::unique_ptr func = - std::make_unique(); - func->name = symName; - func->address = reinterpret_cast( - info->dlpi_addr + symbol->st_value); - // funcs->push_back(std::move(func)); - LOG_F(INFO, "Function: {}", symName); } } } } - return 0; }, - &funcs); + funcs); - dlclose(handle); #endif return funcs; diff --git a/websrc/cobalt-web/package-lock.json b/websrc/cobalt-web/package-lock.json index ac3a8d1e..6abed7bb 100644 --- a/websrc/cobalt-web/package-lock.json +++ b/websrc/cobalt-web/package-lock.json @@ -28,7 +28,7 @@ "react-ace-builds": "^7.4.1", "react-beautiful-dnd": "^13.1.1", "react-bootstrap": "^2.9.1", - "react-bootstrap-icons": "^1.10.3", + "react-bootstrap-icons": "^1.11.4", "react-cropper": "^2.3.3", "react-dom": "^18.2.0", "react-draggable": "^4.4.6", @@ -36,7 +36,7 @@ "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", "react-scroll": "^1.9.0", - "react-smooth-scrollbar": "^8.0.6", + "react-slick": "^0.30.2", "react-spinners": "^0.13.8", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", @@ -1060,9 +1060,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", - "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", "cpu": [ "arm" ], @@ -1072,9 +1072,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", - "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", "cpu": [ "arm64" ], @@ -1084,9 +1084,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", - "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", "cpu": [ "arm64" ], @@ -1096,9 +1096,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", - "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", "cpu": [ "x64" ], @@ -1108,9 +1108,21 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", - "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", "cpu": [ "arm" ], @@ -1120,9 +1132,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", - "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", "cpu": [ "arm64" ], @@ -1132,9 +1144,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", - "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", "cpu": [ "arm64" ], @@ -1144,11 +1156,11 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", - "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", "cpu": [ - "ppc64le" + "ppc64" ], "optional": true, "os": [ @@ -1156,9 +1168,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", - "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", "cpu": [ "riscv64" ], @@ -1168,9 +1180,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", - "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", "cpu": [ "s390x" ], @@ -1180,9 +1192,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz", - "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", "cpu": [ "x64" ], @@ -1192,9 +1204,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz", - "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", "cpu": [ "x64" ], @@ -1204,9 +1216,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", - "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", "cpu": [ "arm64" ], @@ -1216,9 +1228,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", - "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", "cpu": [ "ia32" ], @@ -1228,9 +1240,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", - "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", "cpu": [ "x64" ], @@ -1441,9 +1453,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.8.tgz", - "integrity": "sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.10.tgz", + "integrity": "sha512-CU+RF9FySljn7HVSkkjiB84hWkvTaI3rtLvF433+jRSBL2hMu3zX5bGhHS8C80SM++h4xy8hBSnUHFQHmRXSBw==", "dependencies": { "tslib": "^2.4.0" } @@ -1526,9 +1538,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -1540,9 +1552,9 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.2.74", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz", - "integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==", + "version": "18.2.79", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", + "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1558,9 +1570,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.24.tgz", - "integrity": "sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==", + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", "devOptional": true, "dependencies": { "@types/react": "*" @@ -1988,9 +2000,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001605", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", - "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", + "version": "1.0.30001610", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", + "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", "funding": [ { "type": "opencollective", @@ -2126,9 +2138,9 @@ } }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "peer": true, "funding": { @@ -2445,9 +2457,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.728", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz", - "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==" + "version": "1.4.738", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", + "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==" + }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" }, "node_modules/entities": { "version": "4.5.0", @@ -3479,9 +3496,9 @@ } }, "node_modules/i18next": { - "version": "23.10.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", - "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "version": "23.11.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", + "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", "funding": [ { "type": "individual", @@ -4080,6 +4097,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -4199,6 +4224,11 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -4924,9 +4954,9 @@ } }, "node_modules/react-bootstrap-icons": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.11.3.tgz", - "integrity": "sha512-f/DAy4UXnjdbaZyUcZKR2I3xim56uCznb9t+u3ojwzDG1p2RUrua/d8R4xplAQ8Bj/LVZwHVSrvO+npvp3l3pw==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.11.4.tgz", + "integrity": "sha512-lnkOpNEZ/Zr7mNxvjA9efuarCPSgtOuGA55XiRj7ASJnBjb1wEAdtJOd2Aiv9t07r7FLI1IgyZPg9P6jqWD/IA==", "dependencies": { "prop-types": "^15.7.2" }, @@ -5099,14 +5129,20 @@ "react-dom": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-smooth-scrollbar": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/react-smooth-scrollbar/-/react-smooth-scrollbar-8.0.6.tgz", - "integrity": "sha512-yWiIC4L8DwfIRkLL+PdXq5rysEm6trxHzRk1Rx82bzuu2aWDcHhT+l1vXH/73Re/zHmGjBgrxts/wIrwC6yYJA==", + "node_modules/react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, "peerDependencies": { - "prop-types": "*", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0", - "smooth-scrollbar": "^8.0.0" + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-spinners": { @@ -5270,6 +5306,11 @@ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -5321,9 +5362,9 @@ } }, "node_modules/rollup": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", - "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", "dependencies": { "@types/estree": "1.0.5" }, @@ -5335,21 +5376,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.0", - "@rollup/rollup-android-arm64": "4.14.0", - "@rollup/rollup-darwin-arm64": "4.14.0", - "@rollup/rollup-darwin-x64": "4.14.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.0", - "@rollup/rollup-linux-arm64-gnu": "4.14.0", - "@rollup/rollup-linux-arm64-musl": "4.14.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.0", - "@rollup/rollup-linux-riscv64-gnu": "4.14.0", - "@rollup/rollup-linux-s390x-gnu": "4.14.0", - "@rollup/rollup-linux-x64-gnu": "4.14.0", - "@rollup/rollup-linux-x64-musl": "4.14.0", - "@rollup/rollup-win32-arm64-msvc": "4.14.0", - "@rollup/rollup-win32-ia32-msvc": "4.14.0", - "@rollup/rollup-win32-x64-msvc": "4.14.0", + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", "fsevents": "~2.3.2" } }, @@ -5585,6 +5627,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -5789,9 +5836,9 @@ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" }, "node_modules/ts-essentials": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", - "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.2.tgz", + "integrity": "sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==", "peerDependencies": { "typescript": ">=4.1.0" }, @@ -6418,9 +6465,9 @@ } }, "node_modules/vite": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", - "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", + "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", diff --git a/websrc/cobalt-web/package.json b/websrc/cobalt-web/package.json index c61e7084..558fe385 100644 --- a/websrc/cobalt-web/package.json +++ b/websrc/cobalt-web/package.json @@ -30,7 +30,7 @@ "react-ace-builds": "^7.4.1", "react-beautiful-dnd": "^13.1.1", "react-bootstrap": "^2.9.1", - "react-bootstrap-icons": "^1.10.3", + "react-bootstrap-icons": "^1.11.4", "react-cropper": "^2.3.3", "react-dom": "^18.2.0", "react-draggable": "^4.4.6", @@ -38,7 +38,7 @@ "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", "react-scroll": "^1.9.0", - "react-smooth-scrollbar": "^8.0.6", + "react-slick": "^0.30.2", "react-spinners": "^0.13.8", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", diff --git a/websrc/cobalt-web/src/components/skymap/target_detail.tsx b/websrc/cobalt-web/src/components/skymap/target_detail.tsx index 8507eba7..27e4cb59 100644 --- a/websrc/cobalt-web/src/components/skymap/target_detail.tsx +++ b/websrc/cobalt-web/src/components/skymap/target_detail.tsx @@ -10,13 +10,14 @@ import { DateTime } from "luxon"; import { GlobalStore } from "../../store/globalStore"; import Spinner from "react-bootstrap/esm/Spinner"; +import { Tab } from "react-bootstrap"; interface TargetSmallCardProps { open_dialog: number; target_info: IDSOObjectDetailedInfo; in_updating: boolean; on_choice_maken: (() => void) | null; - in_manage: boolean; + in_manage?: boolean; } const alt_fig_options_template: any = { @@ -24,7 +25,7 @@ const alt_fig_options_template: any = { top: 10, bottom: 20, right: "1%", - left: "10%", + left: "32", }, tooltip: { trigger: "axis", @@ -89,8 +90,8 @@ const fig_line_data_template: any = [ ]; const polar_fig_options_template: any = { grid: { - top: 0, - bottom: 0, + top: 1, + bottom: 1, right: "0%", left: "0%", }, @@ -218,137 +219,147 @@ const TargetDetailCard: React.FC = (props) => { }; return ( - <> - set_open(true)} - > - - -
{props.target_info.name}
- - -
RA:
- {props.in_updating ? ( - - Loading... - - ) : ( - props.target_info.ra.toFixed(4) - )} + + + + + + + + + + + {props.target_info.name} + + + + + {props.in_updating ? ( +
+ +
+ ) : ( + + )} + +
- -
DEC:
+ {props.in_updating ? ( - - Loading... - +
+ +
) : ( - props.target_info.dec.toFixed(4) + )}
- {!props.in_manage && ( - - - - - - - - - )} -
-
- - - - {props.target_info.name} - - - - - + /> + + {props.target_info.name} + + +

Ra: {props.target_info.ra.toFixed(7)} °

+ + +

Dec: {props.target_info.dec.toFixed(7)} °

+ + +

+ 目标类型{" "} + {TranslateTargetType(props.target_info.target_type)} +

+ + +

+ 目标视角大小 {props.target_info.size} ′ +

+ +
+
+ - -
基本信息
- - -
英文名:
- {props.target_info.aliases.en} - - -
中文名:
- {props.target_info.aliases.zh} - -
-
描述:
- {props.target_info.description} - - -
RA:
- {props.in_updating ? ( - - Loading... - - ) : ( - props.target_info.ra.toFixed(4) - )} - - -
DEC:
- {props.in_updating ? ( - - Loading... - - ) : ( - props.target_info.dec.toFixed(4) - )} - -
+ + + + +

当前高度: {current_alt.toFixed(0)}°

+ + +

最高高度: {highest_alt.toFixed(0)}°

+ + +

估计可拍摄时间: {available_time.toFixed(1)}h

+ + +

+ +
+
+ + +
+ {/* 目标维基小百科 */} +
+
+ -
- -
高度角曲线
- {props.in_updating ? ( - - Loading... - - ) : ( - - )} - -
- -
方位角-高度角图像
- {props.in_updating ? ( - - Loading... - - ) : ( - - )} -
-
- +
+ {props.in_manage ? ( + <> + ) : ( + + )} + + +
+
); }; diff --git a/websrc/cobalt-web/src/components/skymap/target_small.tsx b/websrc/cobalt-web/src/components/skymap/target_small.tsx index 497a8d32..064f89d8 100644 --- a/websrc/cobalt-web/src/components/skymap/target_small.tsx +++ b/websrc/cobalt-web/src/components/skymap/target_small.tsx @@ -1,23 +1,21 @@ -import React, { useState, useEffect } from "react"; +import * as React from "react"; import TargetDetailCard from "./target_detail"; -import Figure from "react-bootstrap/Figure"; -import Button from "react-bootstrap/Button"; -import Form from "react-bootstrap/Form"; import Card from "react-bootstrap/Card"; -import Accordion from "react-bootstrap/Accordion"; -import { Heart, ThreeDots } from "react-bootstrap-icons"; -import Image from "react-bootstrap/Image"; +import Button from "react-bootstrap/Button"; +import OverlayTrigger from "react-bootstrap/OverlayTrigger"; +import Tooltip from "react-bootstrap/Tooltip"; import ReactECharts from "echarts-for-react"; -import * as AXIOSOF from "../../services/object_finding_api"; import { DateTime } from "luxon"; import { GlobalStore } from "../../store/globalStore"; +import { XCircle, Check, FilePlus, CheckCircle } from "react-bootstrap-icons"; +import * as AXIOSOF from "../../services/object_finding_api"; interface TargetSmallCardProps { target_info: IDSOObjectDetailedInfo | IDSOFramingObjectInfo; card_index: number; on_card_clicked: ((card_index: number, checked: boolean) => void) | null; on_choice_maken: (() => void) | null; - in_manage: boolean; + in_manage?: boolean; } const fig_options_template: any = { @@ -32,6 +30,9 @@ const fig_options_template: any = { }, xAxis: { type: "time", + axisLabel: { + formatter: "{HH}", + }, }, yAxis: { type: "value", @@ -47,6 +48,9 @@ const fig_options_template: any = { silent: true, data: [], }, + tooltip: { + trigger: "none", + }, }, ], }; @@ -88,7 +92,7 @@ const fig_line_data_template: any = [ lineStyle: { color: "black" }, }, ]; -// todo, how to auto get the target pic url? + function isDetailed(object: any): object is IDSOObjectDetailedInfo { return "altitude" in object; } @@ -97,32 +101,39 @@ const TargetSmallCard: React.FC = (props) => { // ui control const [show_detail, set_show_detail] = React.useState(0); const [this_checked, set_this_checked] = React.useState(false); - const [add_btn_color, set_add_btn_color] = - React.useState("primary"); + const [added_flag, set_added_flag] = React.useState(false); + const [target_icon_link, set_target_icon_link] = React.useState(""); + const [add_tooltip_open, set_add_tooltip_open] = React.useState(false); + // display data // display data const [echarts_options, set_echarts_options] = React.useState(fig_options_template); const [real_target_info, set_real_target_info] = React.useState({ name: "", + alias: "", ra: 0, dec: 0, target_type: "", - bmag: 0, - vmag: 0, + const: "", size: 0, - moon_distance: 0, + transit_month: 0, + transit_date: "", + filter: "", + focal_length: 0, altitude: [], + Top200: null, }); const [in_updating, set_in_updating] = React.useState(true); - // store ddata + // store data const target_store = GlobalStore.useAppState( (state) => state.TargetListStore ); const add_target_to_store = GlobalStore.actions.TargetListStore.add_target_and_focus; + const save_all_targets = GlobalStore.actions.TargetListStore.save_all_targets; const set_focus_target_to_store = GlobalStore.actions.TargetListStore.change_focus_target; @@ -134,33 +145,31 @@ const TargetSmallCard: React.FC = (props) => { ra: props.target_info.ra, dec: props.target_info.dec, target_type: props.target_info.target_type, - bmag: props.target_info.bmag, - vmag: props.target_info.vmag, size: props.target_info.size, - moon_distance: props.target_info.moon_distance, altitude: props.target_info.altitude, + alias: props.target_info.alias, + const: props.target_info.const, + transit_month: props.target_info.transit_month, + transit_date: props.target_info.transit_date, + filter: props.target_info.filter, + focal_length: props.target_info.focal_length, + Top200: props.target_info.Top200, }; set_real_target_info(new_target_frame_info); } else { - // console.log('is framing object!'); - // let new_target_frame_info: IDSOObjectDetailedInfo = { - // name: props.target_info.name, - // ra: props.target_info.ra, - // dec: props.target_info.dec, - // target_type: props.target_info.target_type, - // bmag: props.target_info.bmag, - // vmag: props.target_info.vmag, - // size: props.target_info.size, - // moon_distance: 0, - // altitude: [], - // } - // set_real_target_info(new_target_frame_info); construct_framing_info2card_info(); } + if (process.env.NODE_ENV == "development") { + set_target_icon_link("/api/file/DSO/" + props.target_info.name + ".jpg"); + } else { + set_target_icon_link("/file/DSO/" + props.target_info.name + ".jpg"); + } }, []); + React.useEffect(() => { initial_fig_data(); }, [real_target_info]); + React.useEffect(() => { if ("checked" in props.target_info) { set_this_checked(props.target_info.checked); @@ -168,10 +177,8 @@ const TargetSmallCard: React.FC = (props) => { }, [props.target_info]); const initial_fig_data = () => { - // process target info to display data let new_data = []; for (let i = 0; i < real_target_info.altitude.length; i++) { - // console.log(props.target_info.altitude[i][0], DateTime.fromFormat(props.target_info.altitude[i][0], 'yyyy-MM-dd HH:mm:ss')); new_data.push([ DateTime.fromFormat( real_target_info.altitude[i][0], @@ -193,6 +200,7 @@ const TargetSmallCard: React.FC = (props) => { set_echarts_options(new_options); set_in_updating(false); }; + const construct_framing_info2card_info = async () => { try { const new_curve_data = await AXIOSOF.getTargetALtCurveOnly( @@ -205,11 +213,15 @@ const TargetSmallCard: React.FC = (props) => { ra: props.target_info.ra, dec: props.target_info.dec, target_type: props.target_info.target_type, - bmag: props.target_info.bmag, - vmag: props.target_info.vmag, size: props.target_info.size, - moon_distance: new_curve_data.data.moon_distance, altitude: new_curve_data.data.altitude, + alias: "", + const: "", + transit_month: 0, + transit_date: "", + filter: "", + focal_length: 0, + Top200: null, }; set_real_target_info(new_target_frame_info); initial_fig_data(); @@ -221,6 +233,7 @@ const TargetSmallCard: React.FC = (props) => { return null; } }; + const on_add_target_to_framing_clicked = () => { let to_add_object: IDSOFramingObjectInfo = { name: props.target_info.name, @@ -230,119 +243,154 @@ const TargetSmallCard: React.FC = (props) => { flag: "", tag: "", target_type: props.target_info.target_type, - bmag: props.target_info.bmag, - vmag: props.target_info.vmag, size: props.target_info.size, checked: false, }; - // add_target_to_store(to_add_object); set_focus_target_to_store(to_add_object); if (props.on_choice_maken != null) { props.on_choice_maken(); } }; + const on_add_target_to_list_clicked = () => { - let to_add_object: IDSOFramingObjectInfo = { - name: props.target_info.name, - ra: props.target_info.ra, - dec: props.target_info.dec, - rotation: 0, - flag: "", - tag: "", - target_type: props.target_info.target_type, - bmag: props.target_info.bmag, - vmag: props.target_info.vmag, - size: props.target_info.size, - checked: false, - }; - add_target_to_store(to_add_object); - set_focus_target_to_store({ - name: props.target_info.name, - ra: props.target_info.ra, - dec: props.target_info.dec, - rotation: 0, - flag: "", - tag: "", - target_type: props.target_info.target_type, - bmag: props.target_info.bmag, - vmag: props.target_info.vmag, - size: props.target_info.size, - checked: false, - }); - set_add_btn_color("danger"); - // if (props.on_choice_maken!=null){ - // props.on_choice_maken(); - // } + if (added_flag) { + set_add_tooltip_open(true); + setTimeout(() => set_add_tooltip_open(false), 3000); + } else { + let to_add_object: IDSOFramingObjectInfo = { + name: props.target_info.name, + ra: props.target_info.ra, + dec: props.target_info.dec, + rotation: 0, + flag: "", + tag: "", + target_type: props.target_info.target_type, + size: props.target_info.size, + checked: false, + }; + add_target_to_store(to_add_object); + save_all_targets(); + set_focus_target_to_store({ + name: props.target_info.name, + ra: props.target_info.ra, + dec: props.target_info.dec, + rotation: 0, + flag: "", + tag: "", + target_type: props.target_info.target_type, + size: props.target_info.size, + checked: false, + }); + set_added_flag(true); + } }; return ( - -
- { - set_this_checked(!this_checked); - if (props.on_card_clicked != null) { - props.on_card_clicked(props.card_index, !this_checked); - } - }} - /> - - -
-
- - {props.target_info.name} - Ra: {props.target_info.ra.toFixed(7)} ° - Dec: {props.target_info.dec.toFixed(7)} ° - -
- - + + +
+
+ { + set_this_checked(!this_checked); + if (props.on_card_clicked != null) { + props.on_card_clicked(props.card_index, !this_checked); + } + }} + /> + + + 已添加到待拍摄列表,如需要删除目标,请到目标管理界面删除 + + } + > + + + {props.on_card_clicked != null && ( + + )} +
+
+ + {props.target_info.name} + + Ra: {props.target_info.ra.toFixed(5)} ° + Dec: {props.target_info.dec.toFixed(5)} ° +
+
+
+ {in_updating ? ( +
+
+ Loading... +
+
+ ) : ( + + )} +
- {props.on_card_clicked == null ? ( - <> - ) : ( - { - set_this_checked(!this_checked); - if (props.on_card_clicked != null) { - props.on_card_clicked(props.card_index, !this_checked); - } - }} - > - {this_checked ? "checked" : "unchecked"} - - )} = (props) => {
); }; + TargetSmallCard.defaultProps = { on_choice_maken: null, in_manage: false, diff --git a/websrc/cobalt-web/src/components/skymap/target_super_simle.tsx b/websrc/cobalt-web/src/components/skymap/target_super_simle.tsx new file mode 100644 index 00000000..7307754f --- /dev/null +++ b/websrc/cobalt-web/src/components/skymap/target_super_simle.tsx @@ -0,0 +1,221 @@ +import * as React from "react"; +import Card from "react-bootstrap/Card"; +import Button from "react-bootstrap/Button"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Placeholder from "react-bootstrap/Placeholder"; +import * as AXIOSOF from "../../services/object_finding_api"; + +interface TargetSuperSimpleCardProps { + target_name: string; + ra: number; + dec: number; + target_type: string; + on_target_selected: (index: number) => void; + index: number; +} + +export const TranslateTargetType = (target_type: string) => { + /* + all case types: + Asterism + Dark Neb + Em Neb + Gal Chain + Gal Clus + Gal Group + Gal-BCD + Gal-Dwarf + Gal-Ell + Gal-Lent + Gal-Mag + Galaxy + Glob Cl + HH + HII Neb + Mol Cld + Nova + Open Cl + PN + PPN + Quasar + Ref Neb + SNR + Star + Star Cld + WR Neb + YSO + */ + switch (target_type) { + case "Asterism": + return "星群"; + case "Dark Neb": + return "暗星云"; + case "Em Neb": + return "发射星云"; + case "Gal Chain": + return "星系链"; + case "Gal Clus": + return "星系团"; + case "Gal Group": + return "星系群"; + case "Gal-BCD": + return "致密蓝矮星系"; + case "Gal-Dwarf": + return "矮星系"; + case "Gal-Ell": + return "椭圆星系"; + case "Gal-Lent": + return "透镜状星系"; + case "Gal-Mag": + return "麦哲伦星系"; + case "Galaxy": + return "星系"; + case "Glob Cl": + return "球状星团"; + case "HH": + return "赫比格-哈罗天体"; + case "HII Neb": + return "电离氢发射星云"; + case "Mol Cld": + return "分子云"; + case "Nova": + return "新星"; + case "Open Cl": + return "疏散星团"; + case "PN": + return "行星状星云"; + case "PPN": + return "原行星云"; + case "Quasar": + return "类星体"; + case "Ref Neb": + return "反射星云"; + case "SNR": + return "超新星遗迹"; + case "Star": + return "恒星"; + case "Star Cld": + return "恒星云"; + case "WR Neb": + return "沃尔夫-拉叶星云"; + case "YSO": + return "初期恒星体"; + default: + return "未知"; + } +}; + +const TargetSuperSimpleCard: React.FC = (props) => { + // ui data + const [target_icon_link, set_target_icon_link] = React.useState(""); + const [display_type, set_display_type] = React.useState(""); + const [updated, set_updated] = React.useState(false); + const [current_alt, set_current_alt] = React.useState(0); + const [highest_alt, set_highest_alt] = React.useState(0); + const [available_time, set_available_time] = React.useState(0); + + const update_simple_data = async () => { + try { + let this_result = await AXIOSOF.getSimpleCardInfo(props.ra, props.dec); + if (this_result.success) { + set_current_alt(this_result.data.current); + set_highest_alt(this_result.data.highest); + set_available_time(this_result.data.available_shoot_time); + } + set_updated(true); + } catch (err) { + set_updated(true); + } + }; + React.useEffect(() => { + update_simple_data(); + if (process.env.NODE_ENV == "development") { + set_target_icon_link( + "/api/file/DSO/DSOObjects/Small/" + props.target_name + ".jpg" + ); + } else { + set_target_icon_link( + "/file/DSO/DSOObjects/Small/" + props.target_name + ".jpg" + ); + } + set_display_type(TranslateTargetType(props.target_type)); + }, []); + + const handle_img_error = () => { + set_target_icon_link("/file/DSO/DSOObjects/Small/default.jpg"); + }; + + return ( + + + + + + + + + {display_type} + + {props.target_name} + + + + + + + + + + + + + + + + {updated ? ( + <> + + + 当前{current_alt.toFixed(0)}° + + + + + 最高{highest_alt.toFixed(0)}° + + + + + 可拍{available_time.toFixed(1)}h + + + + ) : ( + + + + + + )} + + + + ); +}; + +export default TargetSuperSimpleCard; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointDataDisplay.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointDataDisplay.tsx new file mode 100644 index 00000000..9a5a2352 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointDataDisplay.tsx @@ -0,0 +1,137 @@ +import * as React from "react"; +import { Row, Col } from "react-bootstrap"; +import Card from "react-bootstrap/Card"; +import { + ArrowLeft, + ArrowRight, + ArrowUp, + ArrowDown, +} from "react-bootstrap-icons"; +import ProgressBar from "react-bootstrap/ProgressBar"; + +interface ThreePointDisplayProps { + east_west_angle: number | null; + up_down_angle: number | null; + target_radec: ICThreePointTarget | null; + current_radec: ICThreePointTarget | null; +} + +function degToDMS(deg: number) { + // Get the degrees, minutes, and seconds + let degrees = Math.floor(deg); + let minutes = Math.floor((deg - degrees) * 60); + let seconds = Math.round((deg - degrees - minutes / 60) * 3600); + + // Return the DMS values as a string + return { degrees, minutes, seconds }; +} + +const ThreePointDataDisplay: React.FC = (props) => { + // ui display data + const [east_west, set_east_west] = React.useState(false); + const [up_down, set_up_down] = React.useState(false); + const [east_west_degree, set_east_west_degree] = React.useState(""); + const [up_down_degree, set_up_down_degree] = React.useState(""); + const [can_show, set_can_show] = React.useState(false); + + React.useEffect(() => {}, []); + React.useEffect(() => { + if (props.east_west_angle != null && props.up_down_angle != null) { + // 注意,在误差标记这块,这里顺时针是正,是东,是true。逆时针的方向,是西,是false。z轴指向天顶。 + // 但是在移动,因为东是顺时针,所以向西移动。 + // 同理,上下,正是朝上,下是朝下,但是修正是如果在上面,要朝下移动。 + // 与后台的算法在确认。 + set_can_show(true); + if (props.east_west_angle > 0) { + set_east_west(true); + } else { + set_east_west(false); + } + let new_east_west = degToDMS(props.east_west_angle); + set_east_west_degree( + new_east_west.degrees + + "°" + + new_east_west.minutes + + "'" + + new_east_west.seconds + + '"' + ); + if (props.up_down_angle > 0) { + set_up_down(true); + } else { + set_up_down(false); + } + let new_up_down = degToDMS(props.up_down_angle); + set_up_down_degree( + new_up_down.degrees + + "°" + + new_up_down.minutes + + "'" + + new_up_down.seconds + + '"' + ); + } else { + set_can_show(false); + } + }, [props.east_west_angle, props.up_down_angle]); + React.useEffect(() => {}, [props.current_radec]); + + return ( + <> + + + + +
+ +
+ {east_west ? ( + + ) : ( + + )} +
+
+ + {east_west ? "向西移动" : "向东移动"} + + {east_west_degree} +
+
+ + + + +
+ +
+ {up_down ? : } +
+
+ + {up_down ? "向下移动" : "向上移动"} + + {up_down_degree} +
+
+ +
+ + ); +}; + +export default ThreePointDataDisplay; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointManualDialog.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointManualDialog.tsx new file mode 100644 index 00000000..a61941d4 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointManualDialog.tsx @@ -0,0 +1,70 @@ +import * as React from "react"; +import Slider from "react-slick"; +import "slick-carousel/slick/slick.css"; +import "slick-carousel/slick/slick-theme.css"; +import { Modal, Button } from "react-bootstrap"; + +interface ThreePointManualDialogProps { + open_dialog: number; + handleClose: (flag: boolean) => void; +} + +const ThreePointManualDialog: React.FC = ( + props +) => { + // ui control + const [open, set_open] = React.useState(false); + + const settings = { + dots: true, + }; + + // open dialog + React.useEffect(() => { + if (props.open_dialog > 0) { + set_open(true); + } + }, [props.open_dialog]); + + return ( + { + props.handleClose(false); + }} + > + + +
+ Slide 1 +
+
+ Slide 2 +
+
+
+ + + + +
+ ); +}; + +export default ThreePointManualDialog; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointSettings.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointSettings.tsx new file mode 100644 index 00000000..1a24db09 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointSettings.tsx @@ -0,0 +1,168 @@ +import * as React from "react"; +import { + Modal, + Button, + Form, + FormControl, + FormLabel, + FormText, + FormGroup, +} from "react-bootstrap"; + +interface ThreePointSettingDialogProps { + open_dialog: number; + direction_switch: boolean; + move_time: number; + solve_retry_time: number; + manual_start: boolean; + search_radius: number; + on_update_data: ( + direction_switch: boolean, + move_time: number, + solve_retry_time: number, + manual_start: boolean, + search_radius: number + ) => void; +} + +const ThreePointSettingDialog: React.FC = ( + props +) => { + // ui control + const [open, set_open] = React.useState(false); + + // input data + const [direction_switch, set_direction_switch] = React.useState(false); + const [move_time, set_move_time] = React.useState(10); + const [solve_retry_time, set_solve_retry_time] = React.useState(3); + const [manual_start, set_manual_start] = React.useState(true); + const [search_radius, set_search_radius] = React.useState(30); + + // useEffect + // on mount + React.useEffect(() => { + set_direction_switch(props.direction_switch); + set_move_time(props.move_time); + set_solve_retry_time(props.solve_retry_time); + set_manual_start(props.manual_start); + set_search_radius(props.search_radius); + }, []); + // open dialog + React.useEffect(() => { + if (props.open_dialog > 0) { + set_open(true); + } + }, [props.open_dialog]); + + // functions + const handleClose = (save_flag: boolean) => { + if (save_flag) { + props.on_update_data( + direction_switch, + move_time, + solve_retry_time, + manual_start, + search_radius + ); + } + set_open(false); + }; + + return ( + { + handleClose(true); + }} + > + + 对极轴初始化设置 + + +

+ 注意,为了比较准确的进行极轴校准,请务必进行至少2次以上的极轴校准流程。 + 如果没有连接赤道仪和相机,是无法进行本流程的! +

+

+ 对极轴过程中会进行拍摄解析,解析的相关设置请到全局变量中进行设置。 +

+

开始本流程前,请先进行粗对极轴,并且确认赤道仪的坐标信息正确

+
+ { + set_direction_switch(!direction_switch); + }} + /> + + 赤道仪移动时间 + { + let new_value = parseInt(event.target.value); + if (new_value < 3) { + new_value = 3; + } else if (new_value > 20) { + new_value = 20; + } + set_move_time(new_value); + }} + /> + 单位:秒 + + + 解析失败重试次数 + { + let new_value = parseInt(event.target.value); + if (new_value < 10) { + new_value = 10; + } else if (new_value > 180) { + new_value = 180; + } + set_solve_retry_time(new_value); + }} + /> + 单位:次 + + { + set_manual_start(!manual_start); + }} + /> + + 解析搜索半径 + { + set_search_radius(parseInt(event.target.value)); + }} + /> + 单位:度 + + +
+ + + + +
+ ); +}; + +export default ThreePointSettingDialog; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx new file mode 100644 index 00000000..5df1bdc2 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx @@ -0,0 +1,511 @@ +import * as React from 'react'; +import Stepper from '@mui/joy/Stepper'; +import Step from '@mui/joy/Step'; +import StepIndicator from '@mui/joy/StepIndicator'; +import PendingIcon from '@mui/icons-material/Pending'; +import CircularProgress from '@mui/joy/CircularProgress'; +import CheckRoundedIcon from '@mui/icons-material/CheckCircle'; +import StopIcon from '@mui/icons-material/Stop'; +import CancelIcon from '@mui/icons-material/Cancel'; +import Typography from '@mui/joy/Typography'; +import Stack from '@mui/joy/Stack'; +import { useImmer } from 'use-immer'; +import { Paper } from '@mui/material'; +import { ColorPaletteProp } from '@mui/joy'; + +import ThreePointDataDisplay from './ThreePointDataDisplay'; + + +interface ThreePointStepperProps { + current_step: number; + incoming_data: any; +} +/* +step -1: before first +step 0: initial finished +step 91: manual start move telescope +step 1: start exposure +step 11: exposure and solve finished +step 15: start telescope move +step 16: move finished +step 17: settle finished +step 19: first exposure solve failed +step 2: start second exposure +step 21: exposure and solve finished +step 29: second exposure solve failed +step 3: start thrid exposure +step 31: exposure and solve finished +step 38: error calculation finished +step 39: third exposure solve failed +step 4: update exposure start +step 41: update exposure and solved finished +step 42: update exposure new error calculated +step 49: update exposure solve failed +step 99: update timeout +*/ + +interface StepProps { + step_complete_status: number; + step_exposure_fig_status: number; + step_number: string; + step_data: any; +} + +const MoveStep:React.FC = (props) => { + const [completed, set_completed] = React.useState(false); + const [active, set_active] = React.useState(false); + const [step_color, set_step_color] = React.useState('primary'); + + + React.useEffect(() => { + if (props.step_complete_status == 0){ + set_completed(false); + set_active(true); + set_step_color('primary'); + }else if (props.step_complete_status == 1){ + set_completed(true); + set_active(false); + set_step_color('success'); + }else if (props.step_complete_status == -1){ + set_completed(false); + set_active(false); + set_step_color('danger'); + } + }, [props.step_complete_status]) + + return ( + + {(props.step_exposure_fig_status == 0) && ()} + {(props.step_exposure_fig_status == 1) && ()} + {(props.step_exposure_fig_status == 2) && ()} + {(props.step_exposure_fig_status == 3) && ()} + + } + > + 移动望远镜 + + ) +} + +const ExposureStep:React.FC = (props) => { + const [completed, set_completed] = React.useState(false); + const [active, set_active] = React.useState(false); + const [step_color, set_step_color] = React.useState('primary'); + + React.useEffect(() => { + if (props.step_complete_status == 0){ + set_completed(false); + set_active(true); + set_step_color('primary'); + }else if (props.step_complete_status == 1){ + set_completed(true); + set_active(false); + set_step_color('success'); + }else if (props.step_complete_status == -1){ + set_completed(false); + set_active(false); + set_step_color('danger'); + } + }, [props.step_complete_status]) + + + return ( + + {(props.step_exposure_fig_status == 0) && ()} + {(props.step_exposure_fig_status == 1) && ()} + {(props.step_exposure_fig_status == 2) && ()} + {(props.step_exposure_fig_status == 3) && ()} + + } + > + 拍摄解析第{props.step_number}张 + + ) +} + + +const ThreePointStepper:React.FC = (props)=>{ + // ui control + const [measure_finished, set_measure_finished] = React.useState(false); + const [step_show_data, update_step_show_data] = useImmer({ + first_exposure_complete_status: 0, // 0 for normal, 1 for complete, -1 for fail + first_exposure_fig_status: 0, // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed + first_move_complete_status: 0, + first_move_fig_status: 0, + second_exposure_complete_status: 0, + second_exposure_fig_status: 0, + second_move_complete_status: 0, + second_move_fig_status: 0, + third_exposure_complete_status: 0, + third_exposure_fig_status: 0, + update_exposure_complete_status: 0, + update_exposure_fig_status: 0, + }) + const [current_discription, set_current_discription] = React.useState(''); + const [first_move, set_first_move] = React.useState(false); + + // polar error related data + const [east_west_angle, set_east_west_angle] = React.useState(null); + const [up_down_angle, set_up_down_angle] = React.useState(null); + const [target_ra_dec, set_target_ra_dec] = React.useState(null); + const [current_ra_dec, set_current_ra_dec] = React.useState(null); + const [solved_ra_dec, update_solved_ra_dec] = useImmer<[ICThreePointTarget | null, ICThreePointTarget | null, ICThreePointTarget | null, ICThreePointTarget | null]>([null, null, null, null]); + + // use effect + // on mount + React.useEffect(() => { + + }, []); + React.useEffect(() => { + switch (props.current_step){ + case (-1): { + set_measure_finished(false); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail + draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 0; + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 0; + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 0; + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 0; + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 0; + }); + update_solved_ra_dec((draft) => { + draft = [null, null, null, null]; + }); + set_current_discription('等待启动'); + break; + } + case (91): { + set_measure_finished(false); + set_first_move(true); + break; + } + case (0): { + set_measure_finished(false); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail + draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 0; + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 0; + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 0; + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 0; + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 0; + }); + update_solved_ra_dec((draft) => { + draft = [null, null, null, null]; + }); + set_first_move(true); + set_current_discription('初始化设置完成'); + break; + } + case (1): { // step 1: start exposure + set_first_move(true); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; + draft.first_exposure_fig_status = 1; + }); + set_current_discription('开始第一次曝光'); + break; + } + case (11): { // step 11: exposure and solve finished + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 1; + draft.first_exposure_fig_status = 2; + }); + set_current_discription('第一张曝光解析完成'); + update_solved_ra_dec((draft) => { + draft[0] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + } + }) + break; + } + case (15): { // step 15: starttelescope move + if (first_move){ + update_step_show_data((draft) => { + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 1; + }); + }else{ + update_step_show_data((draft) => { + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 1; + }); + } + set_current_discription('移动望远镜中'); + break; + } + case (16): { // step 16: move finished + if (first_move){ + update_step_show_data((draft) => { + draft.first_move_complete_status = 1; + draft.first_move_fig_status = 1; + }); + }else{ + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 1; + }); + } + set_current_discription('等待望远镜稳定中'); + break; + } + case (17): { // step 17: settle finished + if (first_move){ + update_step_show_data((draft) => { + draft.first_move_complete_status = 1; + draft.first_move_fig_status = 2; + }); + }else{ + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 2; + }); + } + set_current_discription('望远镜稳定完成'); + break; + } + case (19): { // step 19: first exposure solve failed + update_step_show_data((draft) => { + draft.first_exposure_complete_status = -1; + draft.first_exposure_fig_status = 4; + }); + set_current_discription('第一次曝光解析失败,终止流程'); + break; + } + case (2): { // step 2: start second exposure + set_first_move(false); + update_step_show_data((draft) => { + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 1; + }); + set_current_discription('开始第二次曝光'); + break; + } + case (21): { // step 21: exposure and solve finished + update_step_show_data((draft) => { + draft.second_exposure_complete_status = 1; + draft.second_exposure_fig_status = 2; + }); + set_current_discription('第二张曝光解析完成'); + update_solved_ra_dec((draft) => { + draft[1] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + } + }) + break; + } + case (25): { // step 25: starttelescope move + update_step_show_data((draft) => { + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 1; + }); + set_current_discription('移动望远镜中'); + break; + } + case (26): { // step 26: move finished + set_current_discription('等待望远镜稳定中'); + break; + } + case (27): { // step 27: settle finished + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 2; + }); + set_current_discription('望远镜稳定完成'); + break; + } + case (29): { // step 29: second exposure solve failed + update_step_show_data((draft) => { + draft.second_exposure_complete_status = -1; + draft.second_exposure_fig_status = 4; + }); + set_current_discription('第二次曝光解析失败,终止流程'); + break; + } + case (3): { // step 3: start thrid exposure + update_step_show_data((draft) => { + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 1; + }); + set_current_discription('开始第三次曝光'); + break; + } + case (31): { // step 31: exposure and solve finished + update_step_show_data((draft) => { + draft.third_exposure_complete_status = 1; + draft.third_exposure_fig_status = 2; + }); + set_current_discription('第三张曝光解析完成'); + update_solved_ra_dec((draft) => { + draft[2] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + } + }); + set_current_ra_dec({ + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }); + break; + } + case (38): { // step 38: error calculation finished + set_measure_finished(true); + set_east_west_angle(props.incoming_data.east_west_move); + set_up_down_angle(props.incoming_data.up_down_move); + set_target_ra_dec({ + ra: props.incoming_data.target_ra, + dec: props.incoming_data.target_dec + }); + break; + } + case (39): { // step 39: third exposure solve failed + update_step_show_data((draft) => { + draft.third_exposure_complete_status = -1; + draft.third_exposure_fig_status = 4; + }); + set_current_discription('第三次曝光解析失败,终止流程'); + break; + } + case (4): { // step 4: update exposure start + set_measure_finished(true); + update_step_show_data((draft) => { + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 1; + }); + set_current_discription('开始修正极轴曝光'); + break; + } + case (41): { // step 41: update exposure and solved finished + set_measure_finished(true); + update_step_show_data((draft) => { + draft.update_exposure_complete_status = 1; + draft.update_exposure_fig_status = 2; + }); + set_current_discription('修正极轴曝光解析完成'); + update_solved_ra_dec((draft) => { + draft[3] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + } + }); + set_target_ra_dec({ + ra: props.incoming_data.target_ra, + dec: props.incoming_data.target_dec + }); + break; + } + case (42): { // step 42: update exposure new error calculated + set_measure_finished(true); + set_east_west_angle(props.incoming_data.east_west_move); + set_up_down_angle(props.incoming_data.up_down_move); + break; + } + case (49): { // step 49: update exposure solve failed + update_step_show_data((draft) => { + draft.update_exposure_complete_status = -1; + draft.update_exposure_fig_status = 4; + }); + set_current_discription('修正极轴曝光解析失败等待中'); + break; + } + case (99): { // update timeout + break; + } + default: { + break; + } + } + }, [props.current_step]) + + + return ( + + { + (measure_finished)? + ( + <> + + + + + + + } + > + 停止 + + + 单次对极轴的时间不建议超过5分钟。
+ 粗对之后再重启一次流程会更准。
+
+
+
+
+ + ): + ( + + + + + + + + + + + + + + + } + >计算误差 + + + ) + } + +
+ ) +} + +export default ThreePointStepper; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/index.tsx new file mode 100644 index 00000000..5519515d --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/index.tsx @@ -0,0 +1,459 @@ +import * as React from "react"; +import { Button } from "react-bootstrap"; +import { Card } from "react-bootstrap"; +import { Row, Col } from "react-bootstrap"; +import { Play, Stop, Gear, QuestionCircle } from "react-bootstrap-icons"; +import Alert from "react-bootstrap/Alert"; +import * as AXIOSPAAF from "../../../../services/paa_fixed_procedure_api"; + +import ThreePointStepper from "./ThreePointStepper"; +import ConfirmDialog from "../light/ConfirmDialog"; + +import ThreePointSettingDialog from "./ThreePointSettings"; +import ThreePointManualDialog from "./ThreePointManualDialog"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { GlobalStore } from "../../../../store/globalStore"; + +const Align: React.FC = () => { + //ui control + const [can_start_paa, set_can_start_paa] = React.useState(false); + const [dialog_open, set_dialog_open] = React.useState(0); + + const [show_setting, set_show_setting] = React.useState(0); + const [manual_show, set_manual_show] = React.useState(0); + // const [alert_color, set_alert_color] = React.useState('success'); + // const [alert_text, set_alert_text] = React.useState('待机'); + + // progress data + const [step_number, set_step_number] = React.useState(0); + const [incoming_data, set_incoming_data] = React.useState({}); + const [direction_switch, set_direction_switch] = React.useState(false); + const [move_time, set_move_time] = React.useState(10); + const [solve_retry_time, set_solve_retry_time] = React.useState(3); + const [manual_start, set_manual_start] = React.useState(false); + const [search_radius, set_search_radius] = React.useState(30); + // store + const console_state = GlobalStore.useAppState((state) => state.console); + const global_parameter_ui_setting = GlobalStore.useAppState( + (state) => state.GlobalParameterStore.ui_setting.show_three_point_help + ); + const set_gp_ui = GlobalStore.actions.GlobalParameterStore.set_ui_setting; + const set_console_state = GlobalStore.actions.console.setState; + // function + const process_ws_message = (msg: any): void => { + if (msg.type == "error") { + return; + } + if ( + msg.device_name == "PAA" && + msg.instruction == "three point alignment" + ) { + switch (msg.message) { + case "start tracking": { + set_step_number(0); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "设置赤道仪开始跟踪", + }); + // set_alert_color('success'); + // set_alert_text('设置赤道仪开始跟踪'); + break; + } + case "manual start move telescope": { + set_step_number(91); + set_incoming_data(msg.data); + set_console_state({ + alert_type: "success", + alert_message: "自动移动初始位置", + }); + break; + } + case "start first exposure": { + set_step_number(1); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "开始第一次曝光", + }); + // set_alert_color('success'); + // set_alert_text('开始第一次曝光'); + break; + } + case "first exposure solved": { + set_incoming_data(msg.data); + set_step_number(11); + set_console_state({ + alert_type: "success", + alert_message: "第一次曝光解析成功", + }); + // set_alert_color('success'); + // set_alert_text('第一次曝光解析成功'); + break; + } + case "!FAIL! first exposure failed": { + set_step_number(19); + set_incoming_data({}); + set_console_state({ + alert_type: "danger", + alert_message: "第一次曝光解析失败!终止流程", + }); + setTimeout(update_paa_status_and_clean, 100); + // set_alert_color('danger'); + // set_alert_text('第一次曝光解析失败!终止流程'); + break; + } + case "start second exposure": { + set_step_number(2); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "开始第二次曝光", + }); + // set_alert_color('success'); + // set_alert_text('开始第二次曝光'); + break; + } + case "second exposure solved": { + set_incoming_data(msg.data); + set_step_number(21); + set_console_state({ + alert_type: "success", + alert_message: "第二次曝光解析成功", + }); + // set_alert_color('success'); + // set_alert_text('第二次曝光解析成功'); + break; + } + case "!FAIL! second exposure failed": { + set_step_number(29); + set_incoming_data({}); + set_console_state({ + alert_type: "danger", + alert_message: "第二次曝光解析失败!终止流程", + }); + setTimeout(update_paa_status_and_clean, 100); + // set_alert_color('danger'); + // set_alert_text('第二次曝光解析失败!终止流程'); + break; + } + case "start third exposure": { + set_step_number(3); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "开始第三次曝光", + }); + // set_alert_color('success'); + // set_alert_text('开始第三次曝光'); + break; + } + case "third exposure solved": { + set_incoming_data(msg.data); + set_step_number(31); + set_console_state({ + alert_type: "success", + alert_message: "第三次曝光解析成功", + }); + // set_alert_color('success'); + // set_alert_text('第三次曝光解析成功'); + break; + } + case "!FAIL! third exposure failed": { + set_step_number(39); + set_incoming_data({}); + set_console_state({ + alert_type: "danger", + alert_message: "第三次曝光解析失败!终止流程", + }); + setTimeout(update_paa_status_and_clean, 100); + // set_alert_color('danger'); + // set_alert_text('第三次曝光解析失败!终止流程'); + break; + } + case "polar error result": { + set_incoming_data(msg.data); + set_step_number(38); + set_console_state({ + alert_type: "success", + alert_message: "极轴误差计算成功", + }); + // set_alert_color('success'); + // set_alert_text('极轴误差计算成功'); + break; + } + case "start update exposure": { + set_step_number(4); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "开始校准曝光", + }); + // set_alert_color('success'); + // set_alert_text('开始校准曝光'); + break; + } + case "update exposure solved": { + set_incoming_data(msg.data); + set_step_number(41); + set_console_state({ + alert_type: "success", + alert_message: "校准曝光解析成功", + }); + // set_alert_color('success'); + // set_alert_text('校准曝光解析成功'); + break; + } + case "polar error update": { + set_incoming_data(msg.data); + set_step_number(42); + set_console_state({ + alert_type: "success", + alert_message: "极轴误差更新", + }); + // set_alert_color('warning'); + // set_alert_text('极轴误差校准更新失败'); + break; + } + case "!FAIL! update exposure failed": { + set_step_number(49); + set_incoming_data({}); + set_console_state({ + alert_type: "warning", + alert_message: "极轴校准曝光解析失败", + }); + // set_alert_color('warning'); + // set_alert_text('极轴校准曝光解析失败'); + break; + } + case "moving telescope": { + set_step_number(15); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "移动赤道仪中", + }); + // set_alert_color('success'); + // set_alert_text('移动赤道仪中'); + break; + } + case "moving telescope finished, settling": { + set_step_number(16); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "赤道仪移动完成,稳定中", + }); + // set_alert_color('success'); + // set_alert_text('赤道仪移动完成,稳定中'); + break; + } + case "settle telescope finished": { + set_step_number(17); + set_incoming_data({}); + set_console_state({ + alert_type: "success", + alert_message: "赤道仪稳定完成", + }); + // set_alert_color('success'); + // set_alert_text('赤道仪稳定完成'); + break; + } + case "update timeout": { + set_step_number(99); + set_incoming_data({}); + set_console_state({ + alert_type: "warning", + alert_message: "单次对极轴时间过长,自动终止", + }); + setTimeout(update_paa_status_and_clean, 100); + // set_alert_color('warning'); + // set_alert_text('单次对极轴时间过长,自动终止'); + break; + } + } + } + }; + // websocket handler + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + + const update_paa_status_and_clean = async () => { + set_can_start_paa(false); + try { + let paa_running_status = await AXIOSPAAF.get_update_paa_running_status(); + if (paa_running_status.data) { + // true means in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + const get_paa_status_after_start = async () => { + set_can_start_paa(false); + try { + let paa_status_check = await AXIOSPAAF.get_paa_status(); + if (paa_status_check.data.flag) { + // true meas in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + + const post_stop_paa = async () => { + try { + let stop_result = await AXIOSPAAF.post_stop_paa(); + if (stop_result.success) { + set_can_start_paa(true); + update_paa_status_and_clean(); + } else { + set_can_start_paa(true); + console.log(stop_result.message); + } + } catch (err) { + return null; + } + }; + + // useEffect + React.useEffect(() => { + // check the initial status. + if (global_parameter_ui_setting) { + set_manual_show(manual_show + 1); + } else { + // open setting tab to confirm + set_show_setting(show_setting + 1); + } + // check if there is paa in progres + update_paa_status_and_clean(); + return () => { + removeListener(process_ws_message); + }; + }, []); + + // functions + const on_start_polar_clicked = async () => { + try { + let start_result = await AXIOSPAAF.start_fixed_PolarAlignment({ + start_from: direction_switch ? "East" : "West", + move_time: move_time, + solve_retry: solve_retry_time, + manual_start: manual_start, + }); + if (start_result.success) { + // successfully started + set_can_start_paa(false); + } else { + console.log(start_result.message); + get_paa_status_after_start(); + } + } catch (err) { + return null; + } + }; + const on_stop_polar_clicked = () => { + set_dialog_open(dialog_open + 1); + }; + const on_setting_closed_update = ( + direction_switch: boolean, + move_time: number, + solve_retry_time: number, + manual_start: boolean, + search_radius: number + ) => { + set_direction_switch(direction_switch); + set_move_time(move_time); + set_solve_retry_time(solve_retry_time); + set_manual_start(manual_start); + set_search_radius(search_radius); + }; + + return ( +
+ + + + + + {!can_start_paa ? ( + + ) : ( + + )} + + + + + + + +
+ +
+ + {}} + /> + { + if (flag) { + set_gp_ui({ + show_three_point_help: false, + }); + } + set_show_setting(show_setting + 1); + }} + /> +
+ ); +}; + +Align.displayName = "对极轴"; + +export default Align; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/AutoFocusSettingDialog.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/AutoFocusSettingDialog.tsx new file mode 100644 index 00000000..6a62dcfc --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/AutoFocusSettingDialog.tsx @@ -0,0 +1,103 @@ +import React, { useState, useEffect } from "react"; +import { Modal, Button, Form, Col, Row } from "react-bootstrap"; +import { GlobalStore } from "../../../../store/globalStore"; + +const AutoFocusSettingDialog = (props) => { + // ui control + const [open, setOpen] = useState(false); + + // input data + const [startSide, setStartSide] = useState(false); + + // filter selections + const initialFilterNames = + GlobalStore.useAppState( + (state) => state.GlobalParameterStore.get_filter_names_full + ) || []; + const [allFilters, setAllFilters] = useState(initialFilterNames); + const [selectedFilter, setSelectedFilter] = useState(1); + + const { brand_connection } = GlobalStore.useAppState( + (state) => state.connect + ); + + // useEffect + // on mount + useEffect(() => { + setOpen(props.open_dialog > 0); + setStartSide(props.start_side); + }, []); + + // open dialog + useEffect(() => { + setOpen(props.open_dialog > 0); + }, [props.open_dialog]); + + // functions + const handleClose = () => { + props.on_update_data(selectedFilter, startSide); + setOpen(false); + }; + + return ( + + + 自动对焦初始化设置 + + +

单独执行自动对焦流程的初始化配置。

+

+ 一部分参数在全局变量的自动对焦参数里进行修改!全局变量里的自动对焦参数在所有运行的自动对焦流程都有效,包括PAA的流程。 +

+

+ + 开始自动对焦前,请务必保证 + 望远镜已经在焦点附近! + 否则将无法进行自动对焦。请在拍摄界面确认已经可以看到比较细的星点的情况下再进行本流程! + +

+
+ + + {startSide ? "初始向外移动" : "初始向内移动"} + + + setStartSide(!startSide)} + /> + + + + {/* 滤镜选择 */} + {brand_connection["filter"] == 2 ? ( + + 滤镜选择 + setSelectedFilter(e.target.value)} + > + {allFilters.map((filter, index) => ( + + ))} + + + ) : ( +

滤镜轮未连接

+ )} +
+
+ + + +
+ ); +}; + +export default AutoFocusSettingDialog; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/BackSlashMeasure.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/BackSlashMeasure.tsx new file mode 100644 index 00000000..e69de29b diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/index.tsx new file mode 100644 index 00000000..5f9a5d2e --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/autofocus/index.tsx @@ -0,0 +1,298 @@ +import * as React from "react"; +import { Card } from "react-bootstrap"; +import { Button } from "react-bootstrap"; +import { Play, Stop, Gear, QuestionCircle } from "react-bootstrap-icons"; +import * as AXIOSPAAF from "../../../../services/paa_fixed_procedure_api"; + +import AutoFocusSettingDialog from "./AutoFocusSettingDialog"; +import ConfirmDialog from "../light/ConfirmDialog"; + +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { GlobalStore } from "../../../../store/globalStore"; + +const Autofocus = () => { + //ui control + const [can_start_paa, set_can_start_paa] = React.useState(false); + const [show_setting, set_show_setting] = React.useState(0); + const [manual_show, set_manual_show] = React.useState(0); + const [dialog_open, set_dialog_open] = React.useState(0); + const [show_af_curve, set_show_af_curve] = React.useState(false); + // af data + const [af_measure_data, set_af_measure_data] = React.useState< + Array<[number, number]> + >([]); + const [af_model, set_af_model] = React.useState< + null | [number, number, number] + >(null); + const [af_r_square, set_af_r_square] = React.useState(0); + // setting data control + const [filter_index, set_filter_index] = React.useState( + 1 + ); + const [start_side, set_start_side] = React.useState(true); + // store + const console_state = GlobalStore.useAppState((state) => state.console); + const set_console_state = GlobalStore.actions.console.setState; + // function + const process_ws_message = (msg: any): void => { + if (msg.type == "error") { + return; + } + if (msg.device_name == "PAA" && msg.instruction == "AutoFocus") { + switch (msg.message) { + case "initial": { + set_console_state({ + alert_type: "success", + alert_message: "初始化中", + }); + break; + } + case "out side": { + set_console_state({ + alert_type: "success", + alert_message: "调焦器讲向外移动", + }); + break; + } + case "in side": { + set_console_state({ + alert_type: "success", + alert_message: "调焦器讲向内移动", + }); + break; + } + case "move focus": { + set_console_state({ + alert_type: "success", + alert_message: "调焦移动中", + }); + break; + } + case "start exposure": { + set_console_state({ + alert_type: "success", + alert_message: "开始曝光", + }); + break; + } + case "single exposure finished": { + set_console_state({ + alert_type: "success", + alert_message: "单次曝光完成", + }); + break; + } + case "step exposure": { + // important + set_af_measure_data((af_measure_data) => [ + ...af_measure_data, + [msg.data.step, msg.data.mean], + ]); + set_console_state({ + alert_type: "success", + alert_message: "测量完成", + }); + break; + } + case "no useful measure": { + set_console_state({ + alert_type: "warning", + alert_message: "没有测量到有效星点大小", + }); + break; + } + case "first side finished!": { + set_console_state({ + alert_type: "success", + alert_message: "第一侧测量完成", + }); + break; + } + case "first side failed": { + set_console_state({ + alert_type: "danger", + alert_message: "第一侧测量失败", + }); + break; + } + case "other side init": { + set_console_state({ + alert_type: "success", + alert_message: "初始化第二侧测量", + }); + break; + } + case "second side finished!": { + set_console_state({ + alert_type: "success", + alert_message: "第二侧测量完成", + }); + break; + } + case "focus found": { + set_console_state({ + alert_type: "success", + alert_message: "找到焦点!", + }); + set_af_model(msg.data.model); + set_af_r_square(msg.data.r_square); + break; + } + case "moveto focus": { + set_console_state({ + alert_type: "success", + alert_message: "移动至焦点", + }); + break; + } + case "min focus not found": { + set_console_state({ + alert_type: "danger", + alert_message: "焦点没有找到!", + }); + break; + } + } + } + }; + + // websocket handler + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + + const update_paa_status_and_clean = async () => { + set_can_start_paa(false); + try { + let paa_running_status = await AXIOSPAAF.get_update_paa_running_status(); + if (paa_running_status.data) { + // true means in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + + const post_stop_paa = async () => { + try { + let stop_result = await AXIOSPAAF.post_stop_paa(); + if (stop_result.success) { + set_can_start_paa(true); + update_paa_status_and_clean(); + } else { + set_can_start_paa(true); + console.log(stop_result.message); + } + } catch (err) { + return null; + } + }; + const on_stop_paa_clicked = () => { + set_dialog_open(dialog_open + 1); + }; + const on_start_autofocus_clicked = async () => { + set_af_model(null); + try { + let start_result = await AXIOSPAAF.start_fixed_autofocus({ + filter_index: 0, + start_side: false, + }); + if (start_result.success) { + // successfully started + set_can_start_paa(false); + } else { + console.log(start_result.message); + get_paa_status_after_start(); + } + } catch (err) { + return null; + } + }; + const get_paa_status_after_start = async () => { + set_can_start_paa(false); + try { + let paa_status_check = await AXIOSPAAF.get_paa_status(); + if (paa_status_check.data.flag) { + // true meas in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + // useEffect + React.useEffect(() => { + // open setting tab to confirm + set_show_setting(show_setting + 1); + // check if there is paa in progres + update_paa_status_and_clean(); + return () => { + removeListener(process_ws_message); + }; + }, []); + + const on_setting_closed_update = ( + filter_index: "current" | number, + start_side: boolean + ) => { + set_filter_index(filter_index); + set_start_side(start_side); + }; + + return ( + <> + + +
+ {!can_start_paa ? ( + + ) : ( + + )} + + +
+
+
+ + + {}} + /> + + ); +}; + +Autofocus.displayName = "AF"; + +export default Autofocus; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx new file mode 100644 index 00000000..6de4237b --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx @@ -0,0 +1,294 @@ +import * as React from "react"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { Card, Form, Button, Stack, Row, Col } from "react-bootstrap"; +import { + ArrowUp, + ArrowRight, + SnowflakeFill, + Grid3x3GapFill, +} from "react-bootstrap-icons"; + +const DeviceCameraSimpleControlPanel: React.FC = () => { + const [cool_status, set_cool_status] = React.useState(false); + const [camera_temperature, set_camera_temperature] = React.useState(0); + const [binning, set_binning] = React.useState(1); + const [gain, set_gain] = React.useState(100); + const [offset, set_offset] = React.useState(0); + + // input data + const [input_target_temperature, set_input_target_temperature] = + React.useState("-10"); + const [input_binning, set_input_binning] = React.useState("1"); + const [input_gain, set_input_gain] = React.useState(""); + const [input_offset, set_input_offset] = React.useState(""); + + // functions + const process_ws_message = (msg: any): void => { + if (msg.device_name == "camera") { + switch (msg.instruction) { + case "get_real_time_info": { + set_camera_temperature(msg.data.temperature); + set_cool_status(msg.data.in_cooling); + break; + } + case "get_set_params": { + set_gain(msg.data.gain); + set_offset(msg.data.offset); + // binning + if (msg.data.binning !== null) { + set_binning(msg.data.binning); + } + } + } + } + }; + + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + const MINUTE_MS = 1000; + React.useEffect(() => { + set_input_gain(String(gain)); + }, [gain]); + React.useEffect(() => { + set_input_offset(String(offset)); + }, [offset]); + React.useEffect(() => { + set_input_binning(String(binning)); + }, [binning]); + React.useEffect(() => { + const interval = setInterval(() => { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "get_real_time_info", + params: [], + }) + ); + }, MINUTE_MS); + + return () => { + clearInterval(interval); + removeListener(process_ws_message); + }; + }, []); + + return ( + + + + {cool_status ? ( + 制冷中 + ) : ( + 未制冷 + )} + { + set_cool_status(event.target.checked); + if (event.target.checked) { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "start_cool_camera", + params: [], + }) + ); + } else { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "stop_cool_camera", + params: [], + }) + ); + } + }} + label="开关冷冻" + /> + + + + 相机温度 + + + {camera_temperature < 0 ? ( + {camera_temperature} ℃ + ) : ( + {camera_temperature} ℃ + )} + + + + + + 修改冷冻目标温度 ℃ + + set_input_target_temperature(event.target.value) + } + /> + + + + + + + 当前增益gain + + + {gain} + + + + + + 修改增益 + set_input_gain(event.target.value)} + /> + + + + + + + 当前偏置值offset + + + {offset} + + + + + + 修改偏置值 + set_input_offset(event.target.value)} + /> + + + + + + + 当前binning + + + {binning} + + + + + + 修改binning值 + { + let real_binning = parseInt(event.target.value); + if (real_binning > 4) { + real_binning = 4; + } + if (real_binning == 3) { + real_binning = 4; + } + if (real_binning < 1) { + real_binning = 1; + } + set_input_binning(String(real_binning)); + }} + /> + + + + + + + ); +}; + +DeviceCameraSimpleControlPanel.displayName = "相机控制"; + +export default DeviceCameraSimpleControlPanel; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FilterControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FilterControl.tsx new file mode 100644 index 00000000..60041c77 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FilterControl.tsx @@ -0,0 +1,175 @@ +import * as React from "react"; +import { Card } from "react-bootstrap"; +import { GlobalStore } from "../../../../store/globalStore"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { ButtonGroup, Button } from "react-bootstrap"; + +interface FilterInfo { + slot: number; + filter_name: string; +} + +const DeviceFilterSimpleControlPanel: React.FC = () => { + const [current_filter, set_current_filter] = React.useState(0); + const [max_filter, set_max_filter] = React.useState(8); + const [rotate_flag, set_rotate_flag] = React.useState(true); + // 全体名称 + const initialFilterNames = + GlobalStore.useAppState( + (state) => state.GlobalParameterStore.get_filter_names_full + ) || []; + const GlobalInfo = GlobalStore.useAppState( + (state) => state.GlobalParameterStore + ).global_parameter; + const [all_filters, setAllFilters] = React.useState(initialFilterNames); + + // ws数据传递 + const process_ws_message = (msg: any): void => { + let response_data = msg; + console.log(response_data); + if (response_data.device_name == "filter") { + switch (response_data.instruction) { + // 获取信息 + case "get_filter_slot": { + // 设置最大滤镜轮数量 + set_current_filter(response_data.data.filter_slot); + set_rotate_flag(response_data.data.idle); + break; + } + case "get_all_params": { + set_current_filter(response_data.data.filter_slot); + updateFiltersInfo(response_data.data.filters_info); + break; + } + case "update_all_slot_data": { + // 没有错误返回 + } + case "set_one_filter_solt_value": { + // 没有错误返回 + } + case "switch_filter": { + if (response_data.message == "Filter wheel in rotating!") { + // report error + } + if ( + response_data.message == "filter slot index value out of range!" + ) { + // report error + } + } + default: { + } + } + } + }; + + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + + // 更新 + const updateFiltersInfo = (filtersInfo: FilterInfo[]) => { + const updatedFilterNames = filtersInfo.map((filterInfo) => ({ + label: filterInfo.filter_name, + value: filterInfo.slot, + })); + setAllFilters(updatedFilterNames); + set_max_filter(filtersInfo.length); + }; + const OnFilterClicked = (slot_number: number) => { + if (slot_number != current_filter) { + switch_filter(slot_number, true); + } + }; + // 旋转当前滤镜轮 + const switch_filter = (slot_index: number, need_focuser: boolean) => { + sendMessage( + JSON.stringify({ + device_name: "filter", + instruction: "switch_filter", + params: [slot_index], + }) + ); + // 需要focuser + if (need_focuser) { + if (GlobalInfo.autofocus?.use_filter_offset) { + if ( + GlobalInfo.filter_setting?.filter_info[slot_index - 1] && + GlobalInfo.filter_setting?.filter_info[current_filter - 1] + ) { + let to_set_move_rel_step = + GlobalInfo.filter_setting.filter_info[slot_index - 1].focus_offset - + GlobalInfo.filter_setting.filter_info[current_filter - 1] + .focus_offset; + sendMessage( + JSON.stringify({ + device_name: "focus", + instruction: "move_relative_step", + params: [to_set_move_rel_step], + }) + ); + } else { + alert("filter not found"); + } + } else { + alert("auto focus prohibited!"); + } + } + // set_current_filter(slot_index); + }; + const MINUTE_MS = 1000; + React.useEffect(() => { + // This will fire only on mount. + sendMessage( + JSON.stringify({ + device_name: "filter", + instruction: "get_all_params", + params: [], + }) + ); + const interval = setInterval(() => { + console.log("Logs every second"); + sendMessage( + JSON.stringify({ + device_name: "filter", + instruction: "get_filter_slot", + params: [], + }) + ); + }, MINUTE_MS); + + return () => { + console.log("clear interval"); + clearInterval(interval); + removeListener(process_ws_message); + }; // This represents the unmount function, in which you need to clear your interval to prevent memory leaks. + }, []); + + return ( + + {all_filters.length > 0 ? ( + + {all_filters.map((one_filter, index) => { + return ( + + ); + })} + + ) : ( +

全局变量中没有检测到滤镜配置!

+ )} +
+ ); +}; + +DeviceFilterSimpleControlPanel.displayName = "滤镜轮控制"; + +export default DeviceFilterSimpleControlPanel; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx new file mode 100644 index 00000000..8f2039d9 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx @@ -0,0 +1,248 @@ +import * as React from "react"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { Card, Button, ButtonGroup, Form, InputGroup } from "react-bootstrap"; +import { + ArrowLeftCircleFill, + ArrowRightCircleFill, + ArrowLeftSquareFill, + ArrowRightSquareFill, + CursorFill, +} from "react-bootstrap-icons"; +import HelperSnackbar from "@/pages/DeviceControl/Description/HelperSnackbar"; + +const DeviceFocuserSimpleControlPanel: React.FC = () => { + const [current_step, set_current_step] = React.useState(0); + const [max_step, set_max_step] = React.useState(65000); + const [work_status, set_work_status] = React.useState(false); + const [help_text, set_help_text] = React.useState(""); + const helper_ref = React.useRef(null); + + const [to_set_move_step, set_to_set_move_step] = React.useState(0); + const [to_set_move_rel_step, set_to_set_move_rel_step] = React.useState(0); + + const process_ws_message = (msg: any): void => { + let response_data = msg; + if (response_data.device_name == "focus") { + switch (response_data.instruction) { + case "get_params": { + set_current_step(response_data.data.focus_position); + set_max_step(response_data.data.focus_max); + if ( + response_data.data.focus_state == "Idle" || + response_data.data.focus_state == "Ok" + ) { + set_work_status(false); + } else { + set_work_status(true); + } + break; + } + } + } + }; + + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + + const MINUTE_MS = 1000; + React.useEffect(() => { + const interval = setInterval(() => { + console.log("Logs every second"); + sendMessage( + JSON.stringify({ + device_name: "focus", + instruction: "get_params", + params: [], + }) + ); + }, MINUTE_MS); + + return () => { + console.log("clear interval"); + clearInterval(interval); + removeListener(process_ws_message); + }; + }, []); + + return ( + + + +

当前位置 {current_step}

+ + + + + + + + 移动到指定步长 + + + + + + set_to_set_move_step(parseInt(event.target.value)) + } + /> + + + + + 移动相对步长 + + + + + + set_to_set_move_rel_step(parseInt(event.target.value)) + } + /> + + + +
+
+ ); +}; + +DeviceFocuserSimpleControlPanel.displayName = "调焦器控制"; + +export default DeviceFocuserSimpleControlPanel; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/GuiderControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/GuiderControl.tsx new file mode 100644 index 00000000..946d743f --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/GuiderControl.tsx @@ -0,0 +1,12 @@ +import * as React from 'react'; + + +const DeviceGuiderSimpleControlPanel: React.FC = () => { + return ( +
+ ) +} + +DeviceGuiderSimpleControlPanel.displayName = '导星相机控制' + +export default DeviceGuiderSimpleControlPanel; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/Phd2Control.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/Phd2Control.tsx new file mode 100644 index 00000000..83a955e3 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/Phd2Control.tsx @@ -0,0 +1,138 @@ +import * as React from "react"; +import { + Container, + Button, + ButtonGroup, + Alert, + Accordion, + Card, + CardBody, + CardHeader, +} from "react-bootstrap"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; +import { GlobalStore } from "../../../../store/globalStore"; + +import { ReactComponent as GuideSVG } from "../../../../../icons/console/guide.svg"; +import { ReactComponent as CameraShootSVG } from "../../../../../icons/console/camera_shoot.svg"; +import PHD2GuideResultGraph from "../../comps/graph/PHD2_guide_graph"; + +const DevicePHD2SimpleControlPanel: React.FC = () => { + // ui control + const [guide_graph, set_guide_graph] = React.useState(false); + const [calibration_result, set_calibration_result] = React.useState(false); + + const close_guide_graph = () => { + set_guide_graph(false); + }; + const open_guide_graph = () => { + set_guide_graph(!guide_graph); + }; + const open_calibration_result = () => { + set_calibration_result(!calibration_result); + }; + const close_calibration_result = () => { + set_calibration_result(false); + }; + const check_phd2_status = () => {}; + const process_ws_message = (msg: any): void => { + if (msg.device_name == "phd2_event") { + } else if (msg.device_name == "PHD2_response") { + } + }; + const start_exposure = () => { + sendMessage( + JSON.stringify({ + device_name: "phd2", + instruction: "loop_exposure", + params: [], + }) + ); + }; + const start_calibration = () => { + sendMessage( + JSON.stringify({ + device_name: "phd2", + instruction: "start_guide", + params: [true], + }) + ); + }; + const start_guide = () => { + sendMessage( + JSON.stringify({ + device_name: "phd2", + instruction: "start_guide", + params: [false], + }) + ); + }; + const stop_guide = () => { + sendMessage( + JSON.stringify({ + device_name: "phd2", + instruction: "stop_guide", + params: [], + }) + ); + }; + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + React.useEffect(() => { + check_phd2_status(); + return () => { + removeListener(process_ws_message); + }; + }, []); + + return ( +
+ {/* control of the graph */} +
+ + {/* control of the graph */} + + + + + {/* main control */} + + + + 主控制面板 + + + + + + + + + + + + + + + 导星数据 + + + 校准结果 + + +
+
+ ); +}; + +DevicePHD2SimpleControlPanel.displayName = "PHD2控制"; + +export default DevicePHD2SimpleControlPanel; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx new file mode 100644 index 00000000..bb769d43 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx @@ -0,0 +1,389 @@ +import * as React from "react"; +import { + Container, + Row, + Col, + Card, + Form, + Button, + Modal, +} from "react-bootstrap"; +import { Gear, ArrowClockwise, XLg, Settings } from "react-bootstrap-icons"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; + +import SquareButton from "../../../device/SquareButton"; + +const DeviceTelescopeSimpleControlPanel: React.FC = () => { + const [tracking_status, set_tracking_status] = React.useState(false); + const [moving_time, set_moving_time] = React.useState("1"); // in seconds + // ui data + const [fix_time_selection, set_fix_time_selection] = React.useState(true); + const [slew_speed_selections, set_slew_speed_selections] = React.useState< + Array<{ label: String; value: String }> + >([{ label: "1x", value: "1x" }]); + const [selected_slew_speed, set_selected_slew_speed] = + React.useState("0(0.25x)"); + const [setting_open, set_setting_open] = React.useState(false); + + const time_selections = [ + { label: "0.001", value: "0.001" }, + { label: "0.01", value: "0.01" }, + { label: "0.05", value: "0.05" }, + { label: "0.1", value: "0.1" }, + { label: "0.5", value: "0.5" }, + { label: "1", value: "1" }, + { label: "2", value: "2" }, + ]; + const process_ws_message = (msg: any): void => { + if (msg.device_name == "telescope") { + switch (msg.instruction) { + case "get_set_params": { + // update all selections to selects. + let new_selections = []; + for (let i = 0; i < msg.data.slew_rate.selections.length; i++) { + new_selections.push({ + label: msg.data.slew_rate.selections[i], + value: msg.data.slew_rate.selections[i], + }); + } + set_slew_speed_selections(new_selections); + // set current slection. + set_selected_slew_speed(msg.data.slew_rate.value); + break; + } + case "get_real_time_info": { + set_tracking_status(msg.data.tracking); + break; + } + } + } + }; + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + const MINUTE_MS = 1000; + React.useEffect(() => { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "get_set_params", + params: [], + }) + ); + // This will fire only on mount. + const interval = setInterval(() => { + // console.log('Logs every second'); + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "get_real_time_info", + params: [], + }) + ); + }, MINUTE_MS); + + return () => { + console.log("clear interval"); + clearInterval(interval); + removeListener(process_ws_message); + // if arrow in action, send abort + if (arrow_in_action) { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "abort", + params: [], + }) + ); + } + }; // This represents the unmount function, in which you need to clear your interval to prevent memory leaks. + }, []); + React.useEffect(() => { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "set_slew_rate", + params: [selected_slew_speed], + }) + ); + }, [selected_slew_speed]); + const [arrow_in_action, set_arrow_in_action] = React.useState(false); + const arrow_action_func = (btn_type: string, action: string) => { + // console.log('!!!arrow', btn_type, action); + + if (fix_time_selection) { + if (action == "press") { + if (arrow_in_action) { + // console.log('in action, no effect'); + return; + } + set_arrow_in_action(true); + let wait_time = 0; + if (moving_time[0] == null) { + wait_time = 1000; + } else { + wait_time = parseFloat(moving_time[0]); + } + // set time out + // console.log('set timeout'); + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "handle_move_button", + params: [btn_type, true], + }) + ); + setTimeout(() => { + // console.log('timeout finished'); + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "handle_move_button", + params: [btn_type, false], + }) + ); + set_arrow_in_action(false); + }, wait_time); + } + } else { + if (action == "press") { + if (arrow_in_action) { + console.log("in action, no effect"); + return; + } + // console.log('press down'); + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "handle_move_button", + params: [btn_type, true], + }) + ); + set_arrow_in_action(true); + } else if (action == "release") { + // console.log('released'); + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "handle_move_button", + params: [btn_type, false], + }) + ); + set_arrow_in_action(false); + } else { + console.log("error!"); + } + } + }; + + return ( + + + + + {fix_time_selection ? ( +

+ 固定移动时间 +

+ ) : ( +

+ 长按手柄模式 +

+ )} + +
+ + + set_setting_open(true)} + > + 设置 + + + + arrow_action_func("up", "press")} + onMouseUp={() => arrow_action_func("up", "release")} + > + 上 + + + + + {null} + + + + + + arrow_action_func("left", "press")} + onMouseUp={() => arrow_action_func("left", "release")} + > + 左 + + + + { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "abort", + params: [], + }) + ); + }} + > + 停 + + + + arrow_action_func("right", "press")} + onMouseUp={() => arrow_action_func("right", "release")} + > + 右 + + + + + + {tracking_status ? ( + + 跟踪中 + + ) : ( + + 未跟踪 + + )} + + + arrow_action_func("down", "press")} + onMouseUp={() => arrow_action_func("down", "release")} + > + 下 + + + + { + if (tracking_status) { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "stop_track", + params: [], + }) + ); + } else { + sendMessage( + JSON.stringify({ + device_name: "telescope", + instruction: "start_track", + params: [], + }) + ); + } + }} + > + 开始跟踪/停止跟踪 + + + +
+ + set_setting_open(false)}> + + 赤道仪手控器参数设置 + + + + 设置赤道仪移动速率 + set_selected_slew_speed(event.target.value)} + > + {slew_speed_selections.map((one_slew_selection, index) => ( + + ))} + + + + { + if (!arrow_in_action) { + set_fix_time_selection(event.target.checked); + } + }} + label={fix_time_selection ? "固定时间模式" : "模拟手柄模式"} + /> + + {fix_time_selection && ( + + 选择手动移动时长(s) + set_moving_time(event.target.value)} + > + {time_selections.map((one_time_select, index) => ( + + ))} + + + )} + + + + + +
+ ); +}; + +DeviceTelescopeSimpleControlPanel.displayName = "赤道仪控制"; + +export default DeviceTelescopeSimpleControlPanel; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/light/ConfirmDialog.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/light/ConfirmDialog.tsx new file mode 100644 index 00000000..f0c5c2ac --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/light/ConfirmDialog.tsx @@ -0,0 +1,49 @@ +import * as React from "react"; +import Button from "react-bootstrap/Button"; +import Modal from "react-bootstrap/Modal"; + +interface ConfirmDialogProps { + open: number; + show_text: string; + show_title: string; + on_confirm_clicked: () => void; + on_cancel_clicked: () => void; +} + +const ConfirmDialog: React.FC = (props) => { + const [show, setShow] = React.useState(false); + + const handleClose = (confirm_flag: boolean) => { + setShow(false); + if (confirm_flag) { + props.on_confirm_clicked(); + } else { + props.on_cancel_clicked(); + } + }; + + React.useEffect(() => { + if (props.open > 0) { + setShow(true); + } + }, [props.open]); + + return ( + handleClose(false)}> + + {props.show_title} + + {props.show_text} + + + + + + ); +}; + +export default ConfirmDialog; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/light/LightStarSelection.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/light/LightStarSelection.tsx new file mode 100644 index 00000000..bbb99164 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/light/LightStarSelection.tsx @@ -0,0 +1,58 @@ +import * as React from "react"; +import { ListGroup, Card, Container, Row, Col } from "react-bootstrap"; +import { Modal } from "react-bootstrap"; + +interface LightStarSelectionProps { + open: boolean; + handleClose: () => void; + all_star_lists: [ + Array, + Array, + Array, + Array + ]; + on_star_selected: (star_area_index: number, star_array_index: number) => void; +} + +const LightStartSelection: React.FC = (props) => { + const area_categoary = ["东天区", "西天区", "南天区", "北天区"]; + + return ( + + + 亮星选择 + + + + + {area_categoary.map((categoryName, categoryIndex) => ( + + + {categoryName} + + {props.all_star_lists[categoryIndex].map( + (star_info, index) => ( + { + props.on_star_selected(categoryIndex, index); + }} + > + {star_info.show_name}: 高度角{" "} + {star_info.alt.toFixed(1)}° + + ) + )} + + + + ))} + + + + + ); +}; + +export default LightStartSelection; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/light/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/light/index.tsx new file mode 100644 index 00000000..94a9a1b7 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/light/index.tsx @@ -0,0 +1,325 @@ +import * as React from "react"; +import { + Card, + Button, + ButtonGroup, + Modal, + Accordion, + AccordionHeader, + AccordionBody, +} from "react-bootstrap"; +import { GlobalStore } from "../../../../store/globalStore"; +import * as AXIOSOF from "../../../../services/object_finding_api"; +import * as AXIOSPAAF from "../../../../services/paa_fixed_procedure_api"; + +import LightStartSelection from "./LightStarSelection"; +import ConfirmDialog from "./ConfirmDialog"; + +const Star = () => { + const [east_selected, set_east_selected] = React.useState(true); + const [west_selected, set_west_selected] = React.useState(true); + const [south_selected, set_south_selected] = React.useState(true); + const [north_selected, set_north_selected] = React.useState(true); + const [all_star_lists, set_all_star_lists] = React.useState< + [ + Array, + Array, + Array, + Array + ] + >([[], [], [], []]); + const [selected_star_info, set_selected_star_info] = + React.useState(null); + const [can_start_paa, set_can_start_paa] = React.useState(false); + const [dialog_open, set_dialog_open] = React.useState(0); + const [select_star_open, set_select_star_open] = React.useState(false); + // store + const set_console_state = GlobalStore.actions.console.setState; + + const on_filter_button_clicked = (clicked_type: string) => { + switch (clicked_type) { + case "east": { + set_east_selected(!east_selected); + get_light_star_data( + !east_selected, + west_selected, + south_selected, + north_selected + ); + break; + } + case "west": { + set_west_selected(!west_selected); + get_light_star_data( + east_selected, + !west_selected, + south_selected, + north_selected + ); + break; + } + case "north": { + set_north_selected(!north_selected); + get_light_star_data( + east_selected, + west_selected, + south_selected, + !north_selected + ); + break; + } + case "south": { + set_south_selected(!south_selected); + get_light_star_data( + east_selected, + west_selected, + !south_selected, + north_selected + ); + break; + } + default: { + break; + } + } + }; + const get_light_star_data = async ( + east: boolean, + west: boolean, + south: boolean, + north: boolean + ) => { + let sky_range = []; + if (east) { + sky_range.push("east"); + } + if (west) { + sky_range.push("west"); + } + if (south) { + sky_range.push("north"); + } + if (north) { + sky_range.push("south"); + } + let to_seach_star_request: IOFRequestLightStar = { + sky_range: sky_range, + max_mag: 2, + }; + try { + const get_light_star_data = await AXIOSOF.getLightStars( + to_seach_star_request + ); + /* + self.name = name + self.show_name = show_name + self.ra = ra + self.dec = dec + self.Const = Const + self.Const_Zh = Const_Zh + self.magnitude = magnitude + self.alt = None + self.az = None + self.sky = '' + */ + let west_list = []; + let east_list = []; + let north_list = []; + let south_list = []; + for (let i = 0; i < get_light_star_data.data.length; i++) { + if (get_light_star_data.data[i].sky == "west") { + west_list.push(get_light_star_data.data[i]); + } + if (get_light_star_data.data[i].sky == "east") { + east_list.push(get_light_star_data.data[i]); + } + if (get_light_star_data.data[i].sky == "north") { + north_list.push(get_light_star_data.data[i]); + } + if (get_light_star_data.data[i].sky == "south") { + south_list.push(get_light_star_data.data[i]); + } + } + set_all_star_lists([east_list, west_list, south_list, north_list]); + } catch (err) { + return null; + } + }; + const on_star_selected = ( + star_area_index: number, + star_array_index: number + ) => { + set_selected_star_info(all_star_lists[star_area_index][star_array_index]); + set_select_star_open(false); + }; + const update_paa_status_and_clean = async () => { + set_can_start_paa(false); + try { + let paa_running_status = await AXIOSPAAF.get_update_paa_running_status(); + if (paa_running_status.data) { + // true means in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + const get_paa_status_after_start = async () => { + set_can_start_paa(false); + try { + let paa_status_check = await AXIOSPAAF.get_paa_status(); + if (paa_status_check.data.flag) { + // true meas in running + set_can_start_paa(false); + } else { + set_can_start_paa(true); + } + } catch (err) { + return null; + } + }; + const on_start_goto_clicked = async () => { + if (selected_star_info != null) { + try { + let start_result = await AXIOSPAAF.start_fixed_Goto({ + ra: selected_star_info.ra, + dec: selected_star_info.dec, + }); + if (start_result.success) { + // successfully started + set_can_start_paa(false); + set_console_state({ + alert_type: "success", + alert_message: "亮星Goto,执行中", + }); + } else { + console.log(start_result.message); + get_paa_status_after_start(); + } + } catch (err) { + return null; + } + } else { + set_console_state({ + alert_type: "danger", + alert_message: "亮星Goto,必须选择一个目标才能执行!", + }); + } + }; + const on_start_goto_center_clicked = async () => { + if (selected_star_info != null) { + try { + let start_result = await AXIOSPAAF.start_fixed_Goto_Center({ + ra: selected_star_info.ra, + dec: selected_star_info.dec, + }); + if (start_result.success) { + // successfully started + set_can_start_paa(false); + set_console_state({ + alert_type: "success", + alert_message: "亮星Goto居中,执行中", + }); + } else { + console.log(start_result.message); + get_paa_status_after_start(); + } + } catch (err) { + return null; + } + } else { + set_console_state({ + alert_type: "danger", + alert_message: "亮星Goto居中,必须选择一个目标才能执行!", + }); + } + }; + const post_stop_paa = async () => { + try { + let stop_result = await AXIOSPAAF.post_stop_paa(); + if (stop_result.success) { + set_can_start_paa(true); + update_paa_status_and_clean(); + } else { + set_can_start_paa(true); + console.log(stop_result.message); + } + } catch (err) { + return null; + } + }; + const on_stop_paa_clicked = () => { + set_dialog_open(dialog_open + 1); + }; + + React.useEffect(() => { + set_east_selected(true); + set_west_selected(true); + set_north_selected(true); + set_south_selected(true); + get_light_star_data(true, true, true, true); + update_paa_status_and_clean(); + }, []); + + return ( +
+ + + + {selected_star_info?.show_name || "未选择"} + + + {selected_star_info + ? `${selected_star_info.alt.toFixed(1)}°, ${ + selected_star_info.Const_Zh + }` + : "~"} + + + + + + +
+ set_select_star_open(false)} + /> +
+ {can_start_paa ? ( + + + + + ) : ( + + )} + {}} + /> +
+ ); +}; +// 加一个selected star。 + +Star.displayName = "亮星"; + +export default Star; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/HFRHistoryChart.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/HFRHistoryChart.tsx new file mode 100644 index 00000000..e69de29b diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx new file mode 100644 index 00000000..947e5d85 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx @@ -0,0 +1,414 @@ +import * as React from "react"; +import { Button, ButtonGroup } from "react-bootstrap"; +import { + AccessTime, + RadioCircle, + GraphUp, + Gear, + StopFill, + XLg, + Camera, +} from "react-bootstrap-icons"; +import { Modal, FormControl, FormLabel, FormText } from "react-bootstrap"; +import * as AXIOSPAAF from "../../../../services/paa_fixed_procedure_api"; +import { OverlayTrigger, Tooltip } from "react-bootstrap"; +import { Stack } from "react-bootstrap"; +import { ListGroup } from "react-bootstrap"; +import { Toast, ToastContainer } from "react-bootstrap"; +import "./style.less"; + +import { ReactComponent as CameraShootSVG } from "../../icons/console/camera_shoot.svg"; +import { useEchoWebSocket } from "../../../../utils/websocketProvider"; + +const Shoot = () => { + const [can_shoot, set_can_shoot] = React.useState(false); + const [exposure_time_select_open, set_exposure_time_select_open] = + React.useState(false); + const [loop, set_loop] = React.useState(false); + const [save, set_save] = React.useState(false); + const [exposure_time, set_exposure_time] = React.useState(1); + const [in_exposure, set_in_exposure] = React.useState(false); + const [input_exposure_time, set_input_exposure_time] = React.useState("1"); + const [exposure_finished, set_exposure_finished] = React.useState(false); + const [abort_signal, set_abort_signal] = React.useState(false); + // extra ui control + const [show_hfr_snackbar, set_show_hfr_snackbar] = React.useState(false); + const [show_chart_snackbar, set_show_chart_snackbar] = React.useState(false); + const [show_info_snackbar, set_show_info_snackbar] = React.useState(false); + const [info_show_message, set_info_show_message] = React.useState(""); + const [newest_hf_data, set_newest_hfr_data] = + React.useState(null); + // functions + const check_can_shoot = async () => { + // check paa in progress? + set_can_shoot(false); + try { + let paa_running_status = await AXIOSPAAF.get_update_paa_running_status(); + if (paa_running_status.data) { + // true means in running + set_can_shoot(false); + } else { + set_can_shoot(true); + } + } catch (err) { + return null; + } + // check camera in exposure? + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "get_real_time_info", + params: [], + }) + ); + }; + const on_loop_clicked = () => { + set_loop(!loop); + }; + const on_save_clicked = () => { + set_save(!save); + }; + const on_exposure_time_clicked = () => { + set_exposure_time_select_open(true); + }; + const on_exposure_time_changed = (target_value: number) => { + if (target_value < 0) { + set_exposure_time(1); + } else { + set_exposure_time(target_value); + } + }; + const handleClose = () => { + let target_value = parseFloat(input_exposure_time); + on_exposure_time_changed(target_value); + set_exposure_time_select_open(false); + }; + const start_exposure = () => { + // check can exposure + // console.log('start exposure clicked!'); + set_abort_signal(false); + if (can_shoot) { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "start_single_exposure", + params: [exposure_time, save], + }) + ); + set_in_exposure(true); + } + }; + const stop_exposure = () => { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "abort_exposure", + params: [], + }) + ); + set_in_exposure(false); + set_abort_signal(true); + }; + const process_ws_message = (message: any) => { + if (message.device_name == "camera") { + if (message.instruction == "get_real_time_info") { + set_in_exposure(message.data.in_exposure); + } + } else if (message.device_name == "Signal") { + if ( + (message.instruction == "Image Stretch" || + message.instruction == "Image Process Failed!") && + message.data.camera_type == "camera" + ) { + set_exposure_finished(true); + } + if ( + message.instruction == "Image Stretch" && + message.data.camera_type == "camera" + ) { + set_newest_hfr_data(message.data.hfr_info); + } + } + }; + // websocket handler + const { sendMessage, removeListener } = useEchoWebSocket(process_ws_message); + // useEffect + const MINUTE_MS = 1000; + React.useEffect(() => { + check_can_shoot(); + const interval = setInterval(() => { + // console.log('Logs every second'); + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "get_real_time_info", + params: [], + }) + ); + }, MINUTE_MS); + return () => { + clearInterval(interval); + removeListener(process_ws_message); + }; + }, []); + React.useEffect(() => { + if (abort_signal) { + set_abort_signal(false); + set_in_exposure(false); + return; + } + if (exposure_finished) { + // todo, can update some status + // console.log('got finish exposure signal', loop); + if (loop) { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "start_single_exposure", + params: [exposure_time, save], + }) + ); + set_in_exposure(true); + } else { + set_in_exposure(false); + } + set_exposure_finished(false); + } + }, [exposure_finished]); + // functions for ui control + const on_hfr_show_clicked = () => { + set_show_chart_snackbar(false); + set_show_hfr_snackbar(true); + }; + const on_hfr_graph_show_clicked = () => { + set_show_hfr_snackbar(false); + set_show_chart_snackbar(true); + }; + + return ( + <> +
+
+
+ {can_shoot ? ( + in_exposure ? ( + + ) : ( + + ) + ) : ( + + )} +
+ +
+ {loop ? ( + + ) : ( + + )} + {save ? ( + + ) : ( + + )} +
+
+ + 星点数据} + > + + + 星点数据图表} + > + + + +
+
{/* 用来显示拍摄状态 */}
+ {/* 用来设置曝光时间的Modal */} + + + 曝光时间输入 + + +

修改手动曝光时间,可以选择一个常用曝光时间或者手动输入时间。

+
+ + + + + + + + + + + + + 设置曝光时间 + + set_input_exposure_time(event.target.value) + } + /> + + 如果需要拍摄bias,设置0.001秒; +
+ 一般曝光设置10秒以内,可以用来进行手动对焦,或光轴调试;
+ 也可以设置长曝光,用作测试拍摄。 +
+
+
+
+ + + +
+ {/* 用来显示最新的HFR数据的Toast */} +
+ + + + + 最新曝光星点数据 + + + + + 星点数据量 + 平均HFR + + + + + + {/* 显示HFR历史记录图标的Toast */} + + + + 最新曝光星点数据 + + + + + + set_show_info_snackbar(false)} + delay={3000} + autohide + > + {info_show_message} + + + + ); +}; + +Shoot.displayName = "拍摄"; + +export default Shoot; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/style.less b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/style.less new file mode 100644 index 00000000..dee20930 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/style.less @@ -0,0 +1,90 @@ +.app-console-shoot-actions{ + width: 150px; + height: 400px; + position: absolute; + top: 50%; + right: 10px; + transform: translateY(-50%); + z-index: 20; +} + +.shoot-button-start{ + width: 60px; + height: 60px; + text-align: center; + color:#ffffff; + line-height: 60px; + border-radius: 50%; + background-color: rgba(0,0,0,0.85); + border:6px solid #ffffff; + position: absolute; + top: 50%; + // bottom:0px; + right:0px; +} +.shoot-button-stop{ + width: 60px; + height: 60px; + text-align: center; + color:#FF0000; + line-height: 60px; + border-radius: 50%; + background-color: rgba(0,0,0,0.85); + border:6px solid #FF0000; + position: absolute; + top: 50%; + // bottom:0px; + right:0px; +} + +.shoot-button-config{ + width: 32px; + height: 32px; + color:#ffffff; + line-height: 32px; + text-align: center; + font-size:12px; + border:1px solid #ffffff; + border-radius: 50%; + position: absolute; +} + +.shoot-button-exposure-time{ + position: absolute; + top: 10%; + right: 0px; +} +.shoot-button-config[role='save_checked']{ + border:3px solid #008000; + top: 30%; + right:0px; +} +.shoot-button-config[role='save_uncheck']{ + border:3px solid #ffffff; + top: 30%; + right:0px; +} +.shoot-button-config[role='loop_checked']{ + border:3px solid #008000; + top: 80%; + right:0px; +} +.shoot-button-config[role='loop_uncheck']{ + border:3px solid #ffffff; + top: 80%; + right:0px; +} + +// .shoot-button-config:last-child{ +// top:0; +// right:0; +// } + +.shoot-pic-process-config{ + position: absolute; + left: 0; + top: 0px; +} +.app-console-shoot-status{ + position: absolute; +} \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/graph/AF_figure.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/AF_figure.tsx new file mode 100644 index 00000000..b5198dd2 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/AF_figure.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import ReactECharts from 'echarts-for-react'; + +interface AF_figure_Props { + focus_measures: Array<[number, number]> + focus_model: any; + focus_point: [number, number]; + focus_find: boolean; +} + +const AF_figure: React.FC = (props) => { + const [focus_figure, set_focus_figure] = React.useState({ + + }) + return ( + <> + ) +} +export default AF_figure; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/graph/HFR_history_result.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/HFR_history_result.tsx new file mode 100644 index 00000000..7c441802 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/HFR_history_result.tsx @@ -0,0 +1,8 @@ +import * as React from 'react'; + +const HFRHistoryResult: React.FC = () => { + return ( + <> + ) +} +export default HFRHistoryResult; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_calibration_result.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_calibration_result.tsx new file mode 100644 index 00000000..3b714fdd --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_calibration_result.tsx @@ -0,0 +1,8 @@ +import * as React from 'react'; + +const PHD2CalibrationResult: React.FC = () => { + return ( + <> + ) +} +export default PHD2CalibrationResult; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_guide_graph.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_guide_graph.tsx new file mode 100644 index 00000000..45816f0e --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/graph/PHD2_guide_graph.tsx @@ -0,0 +1,104 @@ +import * as React from 'react'; +import ReactECharts from 'echarts-for-react'; +import { GlobalStore } from '../../../../store/globalStore'; + + +const PHD2GuideResultGraph: React.FC = () => { + const process_data = GlobalStore.useAppState((state) => state.ProcessDataSaveStore); + const eChartsRef = React.useRef(null as any); + const [guide_result_graph, set_guide_result_graph] = React.useState( + { + tooltip: { + trigger: 'axis' + }, + xAxis: { + type: 'category', + }, + yAxis: [{ + name: 'error', + type: 'value' + }, + { + name: 'guide', + type: 'value', + } + ], + series: [{ + data: process_data.PHD2_guide_data_list.RaDistance, + type: 'line', + yAxisIndex: 0, + markLine: { + silent: true, + data: [] + }, + lineStyle: { + color: '#fc0303' + } + }, { + data: process_data.PHD2_guide_data_list.DecDistance, + type: 'line', + yAxisIndex: 0, + markLine: { + silent: true, + data: [] + }, + lineStyle: { + color: '#031cfc' + } + }, { + data: process_data.PHD2_guide_data_list.RaControl, + type: 'bar', + yAxisIndex: 1, + stack: 'Total', + markLine: { + silent: true, + data: [] + }, + itemStyle: { + borderColor: '#fc0303', + color: 'rgba(255, 255, 255, 0)' + } + }, { + data: process_data.PHD2_guide_data_list.DecControl, + type: 'bar', + yAxisIndex: 1, + stack: 'Total', + markLine: { + silent: true, + data: [] + }, + itemStyle: { + borderColor: '#031cfc', + color: 'rgba(255, 255, 255, 0)' + } + }] + } + + ); + + React.useEffect(() => { + let new_series = guide_result_graph.series; + new_series[0].data = process_data.PHD2_guide_data_list.RaDistance; + new_series[1].data = process_data.PHD2_guide_data_list.DecDistance; + new_series[2].data = process_data.PHD2_guide_data_list.RaControl; + new_series[3].data = process_data.PHD2_guide_data_list.DecControl; + set_guide_result_graph({ + ...guide_result_graph, + series: new_series, + }) + if (eChartsRef && eChartsRef.current) + eChartsRef.current?.getEchartsInstance().setOption(guide_result_graph); + }, [process_data.PHD2_guide_data_list.RaDistance]) + + return ( + + ) +} +export default PHD2GuideResultGraph; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/ui/ConsoleSelectComp.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/ui/ConsoleSelectComp.tsx new file mode 100644 index 00000000..0c47e7ba --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/ui/ConsoleSelectComp.tsx @@ -0,0 +1,123 @@ +import * as React from "react"; +import { Button, Alert } from "react-bootstrap"; +import Modal from "react-bootstrap/Modal"; +import Card from "react-bootstrap/Card"; +import Form from "react-bootstrap/Form"; +import { Offcanvas } from "react-bootstrap"; +import { GlobalStore } from "../../../../store/globalStore"; +import Registry from "../../registry"; + +const ConsoleSelectComp: React.FC = () => { + const state = GlobalStore.useAppState((state) => state.console); + + const ICONHandler = Registry._registry_icon.get(state.menu) as React.FC; + + return ( + <> + + + {/* drawer of the functions */} + { + GlobalStore.actions.console.setState({ + selec_console_drawer_open: false, + }); + }} + placement="start" + style={{ + backgroundColor: "transparent", + padding: "24px", + boxShadow: "none", + }} + > + + 中控台 + + +
+ + 功能选择 + +
+ {Registry.getMenus().map((item) => ( + { + GlobalStore.actions.console.setState({ + menu: item.id as any, + drawerVisible: true, + selec_console_drawer_open: false, + }); + if (item.id == "phd2") { + GlobalStore.actions.ProcessDataSaveStore.switch_camera_display( + 1 + ); + } else { + GlobalStore.actions.ProcessDataSaveStore.switch_camera_display( + 0 + ); + } + }} + > + + + {item.displayName} + + + + ))} +
+
+
+
+ {/* end of the drawer */} + + ); +}; + +export default ConsoleSelectComp; diff --git a/websrc/cobalt-web/src/pages/dashboard2/comps/ui/InfoUpdateComp.tsx b/websrc/cobalt-web/src/pages/dashboard2/comps/ui/InfoUpdateComp.tsx new file mode 100644 index 00000000..ec9014a8 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/comps/ui/InfoUpdateComp.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import { Alert } from 'react-bootstrap'; +import { GlobalStore } from '../../../../store/globalStore'; + +const InfoUpdateComp: React.FC = () => { + const state = GlobalStore.useAppState(state=>state.console); + + return ( + {state.alert_message} + ) +} + +export default InfoUpdateComp; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/index.tsx new file mode 100644 index 00000000..e1d8f4b4 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/index.tsx @@ -0,0 +1,103 @@ +import * as React from 'react'; +import Offcanvas from 'react-bootstrap/Offcanvas'; +import { GlobalStore } from '../../store/globalStore'; +import Registry from './registry'; +import Align from './actions/align'; +import Light from './actions/light'; +import Shoot from './actions/shoot'; +import { useEchoWebSocket } from '../../utils/websocketProvider'; +import './style.less'; +import Autofocus from './actions/autofocus'; +import InfoUpdateComp from './comps/ui/InfoUpdateComp'; +import ConsoleSelectComp from './comps/ui/ConsoleSelectComp'; +import { Camera, Magic, ArrowsMove, Bullseye } from 'react-bootstrap-icons'; +// svg +import { ReactComponent as PolarAlignSVG } from '../../icons/console/polar_align.svg'; +import { ReactComponent as TelescopeControl } from '../../icons/console/telescope_control.svg'; +import { ReactComponent as FilterControl } from '../../icons/console/filter.svg'; +import { ReactComponent as GuideSVG } from '../../icons/console/guide.svg'; + +// devices +import DeviceCameraSimpleControlPanel from './actions/controls/CameraControl'; +import DeviceTelescopeSimpleControlPanel from './actions/controls/TelescopeControl'; +import DeviceFocuserSimpleControlPanel from './actions/controls/FocuserControl'; +import DeviceFilterSimpleControlPanel from './actions/controls/FilterControl'; +import DeviceGuiderSimpleControlPanel from './actions/controls/GuiderControl'; +import DevicePHD2SimpleControlPanel from './actions/controls/Phd2Control'; + + +Registry.addComponent('shoot', Shoot, Camera); +Registry.addComponent('star', Light, Magic); +Registry.addComponent('align', Align, PolarAlignSVG); +Registry.addComponent('autofocus', Autofocus, Bullseye); + +Registry.addComponent('camera', DeviceCameraSimpleControlPanel); +Registry.addComponent('telescope', DeviceTelescopeSimpleControlPanel, TelescopeControl); +Registry.addComponent('focuser', DeviceFocuserSimpleControlPanel); +Registry.addComponent('filter', DeviceFilterSimpleControlPanel, FilterControl); +Registry.addComponent('phd2', DevicePHD2SimpleControlPanel, GuideSVG); + + +const Console = ()=>{ + // state + const state = GlobalStore.useAppState(state=>state.console); + + const graph = React.useRef(null); + + const container = React.useRef(null); + + // store + const process_data = GlobalStore.useAppState((state) => state.ProcessDataSaveStore); + + const handleMsg = React.useCallback((msg:any)=>{ + // console.log(msg); + },[]) + + const {removeListener} = useEchoWebSocket(handleMsg); + + React.useEffect(()=>{ + return ()=>removeListener(handleMsg); + },[]) + + const toggleDrawer = ()=>{ + GlobalStore.actions.console.setState({ + drawerVisible: false + }) + } + + const Handler = Registry._registry.get(state.menu) as React.FC; + const ICONHandler = Registry._registry_icon.get(state.menu) as React.FC; + + return ( + <> + { + (process_data.show_camera == 0)? + (): + () + } +
+ + + + + +
+ +
+
+
+
+ + ) +} + +export default Console; \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx new file mode 100644 index 00000000..e65c37e7 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx @@ -0,0 +1,40 @@ +import * as React from "react"; +import { Android } from "react-bootstrap-icons"; + +class Registry { + static _registry: Map = new Map(); + static _registry_icon: Map = new Map(); + + static addComponent = ( + id: string, + component: React.FC, + Icon: React.FC | null = null + ) => { + this._registry.set(id, component); + if (Icon === null) { + this._registry_icon.set(id, () => ); + } else { + this._registry_icon.set(id, () => { + return ( +
+ {React.createElement(Icon, { + style: { width: "100%", height: "100%" }, + fill: "#fff", + })} +
+ ); + }); + } + }; + static getComponent = (id: string) => this._registry.get(id); + + static getMenus = () => { + return Array.from(this._registry.keys()).map((id) => ({ + id, + displayName: this._registry.get(id)?.displayName, + icon: this._registry_icon.get(id) as React.FC, + })); + }; +} + +export default Registry; diff --git a/websrc/cobalt-web/src/pages/dashboard2/style.less b/websrc/cobalt-web/src/pages/dashboard2/style.less new file mode 100644 index 00000000..1fee1d01 --- /dev/null +++ b/websrc/cobalt-web/src/pages/dashboard2/style.less @@ -0,0 +1,89 @@ +.app-console{ + width: 100vw; + position: absolute; + left: 0; + top: 0; + height: calc(~"100vh - 32px"); // calc(~"100vh- 60px") + background-image: url('../../assets/imgs//bg.jpg'); + background-size: cover; + z-index: 0; +} + +.app-console-menu{ + position: absolute; + bottom: 10px; + width:150px; + height: 150px; + +} + +.circle-button{ + width: 48px; + height: 48px; + background-color: rgba(0,0,0,0.85); + border-radius: 50%; + border-color:transparent; + border-width: 1px; + text-align: center; + line-height: 48px; + color:#ffffff; + padding: 0px; + border-style: solid; + transition: all 0.4s ease-in; + &-selected{ + border-color: #ffffff; + } +} + + + +.circle-button:first-child{ + position: absolute; + left: 67px; + bottom:67px; +} + +.circle-button:nth-child(2){ + position: absolute; + top: 0; + left:10px; +} +.circle-button:last-child{ + position: absolute; + right: 0; + bottom:0px; +} + +.app-console-handler{ + height: calc(~"100vh - 90px"); + width: 320px; + position: relative; +} + +.console-drawer{ + top: 32px !important;; + + .MuiModal-backdrop{ + background-color: transparent !important; + top: 32px !important;; + } + + .MuiDrawer-paper{ + top: 32px !important; + height: calc(~"100vh - 66px") !important; + background-color: transparent !important;//rgba(0, 0, 0, 0.5) !important; + } +} + +.newest_image { + position: fixed; + z-index: 1; + // top: 100px; + left: 0; + right: 0; + margin: 0; + padding: 0; + width: 100%; + height: calc("100vh"); + object-fit: contain; +} \ No newline at end of file diff --git a/websrc/cobalt-web/src/pages/device/SquareButton.tsx b/websrc/cobalt-web/src/pages/device/SquareButton.tsx new file mode 100644 index 00000000..b04aba44 --- /dev/null +++ b/websrc/cobalt-web/src/pages/device/SquareButton.tsx @@ -0,0 +1,34 @@ +import * as React from "react"; +import { Button, ButtonProps } from "react-bootstrap"; + +interface SquareButtonProps extends ButtonProps { + children: React.ReactNode; +} + +const SquareButton: React.FC = (props) => { + const { children, ...other } = props; + return ( +
+ +
+ ); +}; + +export default SquareButton; diff --git a/websrc/cobalt-web/src/pages/device/telescope.tsx b/websrc/cobalt-web/src/pages/device/telescope.tsx index ecd557e2..ffc4a49a 100644 --- a/websrc/cobalt-web/src/pages/device/telescope.tsx +++ b/websrc/cobalt-web/src/pages/device/telescope.tsx @@ -20,7 +20,6 @@ import { import { useImmer } from "use-immer"; import { useEchoWebSocket } from "../../utils/websocketProvider"; import { map } from "lodash"; -import Scrollbar from "react-smooth-scrollbar"; const DeviceTelescopeGeneralControlPanel: React.FC = () => { const [geo_location, update_geo_location] = useImmer({ @@ -445,163 +444,161 @@ const DeviceTelescopeGeneralControlPanel: React.FC = () => {
- - - - 设置赤道仪移动速率 - { - set_selected_slew_speed(event.target.value); - }} - > - {slew_speed_selections.map((one_slew_selection, index) => { - return ( - - ); - })} - - - - - - { - if (!arrow_in_action) { - set_fix_time_selection(event.target.checked); - } else { - // 提示松开按钮 - } - }} - /> - {fix_time_selection && ( - - 选择手动移动时长(s) - { - set_moving_time(event.target.value); - }} - > - {time_selections.map((one_time_select, index) => { - return ( - - ); - })} - - - )} - - {fix_time_selection ? "固定移动时间" : "长按手柄模式"} - - - - - -
- -
- - -
- - -
- -
- - -
- -
- - -
- -
- -
- - - -
- -
- - -
-
-
-
-
+ + + 设置赤道仪移动速率 + { + set_selected_slew_speed(event.target.value); + }} + > + {slew_speed_selections.map((one_slew_selection, index) => { + return ( + + ); + })} + + + + + + { + if (!arrow_in_action) { + set_fix_time_selection(event.target.checked); + } else { + // 提示松开按钮 + } + }} + /> + {fix_time_selection && ( + + 选择手动移动时长(s) + { + set_moving_time(event.target.value); + }} + > + {time_selections.map((one_time_select, index) => { + return ( + + ); + })} + + + )} + + {fix_time_selection ? "固定移动时间" : "长按手柄模式"} + + + + + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + +
+ +
+ + +
+
+
+
diff --git a/websrc/cobalt-web/src/pages/skymap/framing.css b/websrc/cobalt-web/src/pages/skymap/framing.css new file mode 100644 index 00000000..82a2d0bc --- /dev/null +++ b/websrc/cobalt-web/src/pages/skymap/framing.css @@ -0,0 +1,7 @@ +.transparent_paper { + background-color: transparent; +} +.framing-root { + width: 100vw; + height: calc(~"100vh - 32px"); +} diff --git a/websrc/cobalt-web/src/pages/skymap/image_framing.tsx b/websrc/cobalt-web/src/pages/skymap/image_framing.tsx index 245934da..a151e77f 100644 --- a/websrc/cobalt-web/src/pages/skymap/image_framing.tsx +++ b/websrc/cobalt-web/src/pages/skymap/image_framing.tsx @@ -1,31 +1,26 @@ -import React, { useState, useEffect } from "react"; -import { - Card, - Button, - Container, - Row, - Col, - InputGroup, - Form, -} from "react-bootstrap"; -import { Search } from "react-bootstrap-icons"; +import * as React from "react"; +import { Alert, Button, Stack } from "react-bootstrap"; +import { Card } from "react-bootstrap"; +import "./framing.css"; +import { GlobalStore } from "../../store/globalStore"; +import { Search, Gear } from "react-bootstrap-icons"; +import AladinLiteView from "../../components/skymap/aladin"; import { useImmer } from "use-immer"; +import * as AXIOSOF from "../..//services/object_finding_api"; -import AladinLiteView from "../../components/skymap/aladin_wrapper"; -import * as AXIOSOF from "../../services/object_finding_api"; import FOVSettingDialog from "../../components/skymap/fov_dialog"; -import ObjectManagementDialog from "./object_manager_dialog"; +import ObjectManagementDialog from "./object_manager"; import ObjectSearchDialog from "./object_search_dialog"; -import { GlobalStore } from "../../store/globalStore"; -import { TransparentPaper } from "./style"; +const ImageFraming: React.FC = () => { + // const theme = useTheme(); -const ImageFraming = () => { - const [target_ra, set_target_ra] = useState(0); - const [target_dec, set_target_dec] = useState(0); - const [screen_ra, set_screen_ra] = useState(0); - const [screen_dec, set_screen_dec] = useState(0); - const [camera_rotation, set_camera_rotation] = useState(0); + // comp data + const [target_ra, set_target_ra] = React.useState(0); + const [target_dec, set_target_dec] = React.useState(0); + const [screen_ra, set_screen_ra] = React.useState(0); + const [screen_dec, set_screen_dec] = React.useState(0); + const [camera_rotation, set_camera_rotation] = React.useState(0); const [fov_data, update_fov_data] = useImmer({ x_pixels: 0, x_pixel_size: 0, @@ -33,15 +28,20 @@ const ImageFraming = () => { y_pixel_size: 0, focal_length: 0, }); - const [show_span, set_show_span] = useState(false); - const [open_fov_dialog, set_open_fov_dialog] = useState(0); - const [open_search_dialog, set_open_search_dialog] = useState(0); - const [open_manage_dialog, set_open_manage_dialog] = useState(0); + const [show_span, set_show_span] = React.useState(false); + const [open_fov_dialog, set_open_fov_dialog] = React.useState(0); + const [open_search_dialog, set_open_search_dialog] = React.useState(0); + const [open_manage_dialog, set_open_manage_dialog] = React.useState(0); - const [fov_points, set_fov_points] = useState([]); - const [fov_x, set_fov_x] = useState(0.25); - const [fov_y, set_fov_y] = useState(0.25); - const [aladin_show_fov, set_aladin_show_fov] = useState(0.5); + // other data + const [fov_points, set_fov_points] = React.useState< + Array< + [[number, number], [number, number], [number, number], [number, number]] + > + >([]); + const [fov_x, set_fov_x] = React.useState(0.25); + const [fov_y, set_fov_y] = React.useState(0.25); + const [aladin_show_fov, set_aladin_show_fov] = React.useState(0.5); // store related const target_store = GlobalStore.useAppState( @@ -56,11 +56,11 @@ const ImageFraming = () => { GlobalStore.actions.TargetListStore.fetch_twilight_data; // todo actions need to be initialed if necessary - const on_new_ra_dec_input = (new_ra, new_dec) => { + const on_new_ra_dec_input = (new_ra: number, new_dec: number) => { + // console.log('got new radec', new_ra, new_dec); set_screen_ra(new_ra); set_screen_dec(new_dec); }; - const refresh_camera_telescope_data = () => { let camera_info = global_parameter.global_parameter.camera_info; let telescope_info = global_parameter.global_parameter.telescope_info; @@ -80,15 +80,13 @@ const ImageFraming = () => { } }); }; - const on_click_reset_with_current_center = () => { set_target_ra(screen_ra); set_target_dec(screen_dec); calculate_fov_points(); }; - - const post_for_one_single_fov_rect = async (ra, dec) => { - let fov_request = { + const post_for_one_single_fov_rect = async (ra: number, dec: number) => { + let fov_request: IOFRequestFOVpoints = { x_pixels: fov_data.x_pixels, x_pixel_size: fov_data.x_pixel_size, y_pixels: fov_data.y_pixels, @@ -101,6 +99,7 @@ const ImageFraming = () => { try { const fov_response = await AXIOSOF.getFovPointsOfRect(fov_request); if (fov_response.success) { + // console.log('successfully got fov points', fov_response.data); set_fov_points([fov_response.data]); } else { console.log(fov_response.message); @@ -110,9 +109,7 @@ const ImageFraming = () => { return null; } }; - const calculate_tile_fov_points = () => {}; - const calculate_fov_points = () => { set_fov_points([]); if (fov_data.focal_length == 0) { @@ -124,7 +121,6 @@ const ImageFraming = () => { post_for_one_single_fov_rect(target_ra, target_dec); } }; - const update_target_center_points = () => { if (target_store.current_focus_index != null) { target_store.all_saved_targets[target_store.current_focus_index].ra = @@ -136,9 +132,8 @@ const ImageFraming = () => { ].rotation = camera_rotation; } }; - const add_current_as_new_target = () => { - let to_add_object = { + let to_add_object: IDSOFramingObjectInfo = { name: "-", ra: target_ra, dec: target_dec, @@ -146,184 +141,245 @@ const ImageFraming = () => { flag: "", tag: "", target_type: "", - bmag: 0, - vmag: 0, size: 0, checked: false, }; set_focus_target_to_store(to_add_object); }; - const start_goto_and_focus_target = () => { // TODO, write this code later! }; - useEffect(() => { + // on mount + React.useEffect(() => { + // read x pixel and y pixel data from global parameter + // console.log('image framing got ', props.tab_value); update_twilight_data(); refresh_camera_telescope_data(); }, []); - - useEffect(() => { + // camera and telescope info update to string + React.useEffect(() => { let fov_x = ((57.3 / fov_data.focal_length) * fov_data.x_pixels * fov_data.x_pixel_size) / - 3600; + 1000; let fov_y = ((57.3 / fov_data.focal_length) * fov_data.y_pixels * fov_data.y_pixel_size) / - 3600; + 1000; set_fov_x(fov_x); set_fov_y(fov_y); + if (fov_x > fov_y) { + if (2 * fov_x < 4) set_aladin_show_fov(4); + else set_aladin_show_fov(2 * fov_x); + } else { + if (2 * fov_y < 4) set_aladin_show_fov(4); + else set_aladin_show_fov(2 * fov_y); + } + calculate_fov_points(); }, [fov_data]); + // on target ra dec change + React.useEffect(() => { + calculate_fov_points(); + }, [target_ra, target_dec, camera_rotation]); + + React.useEffect(() => { + // console.log('need focus change', target_store.need_focus); + if (target_store.need_focus) { + set_target_ra(target_store.current_focus_target.ra); + set_target_dec(target_store.current_focus_target.dec); + set_screen_ra(target_store.current_focus_target.ra); + set_screen_dec(target_store.current_focus_target.dec); + } + target_store.need_focus = false; + }, [target_store.need_focus]); return ( - - Image Framing +
+
+ +
+
+ + + + 当前目标: {target_store.current_focus_target.name} + + + Ra: {target_ra.toFixed(7)} + + + Dec: {target_dec.toFixed(7)} + + + + + + +
+
+ + + + + + +

+ +
+
- - - - - - - - - - -
-
-
- Target Center -
- - RA: - set_target_ra(e.target.value)} - /> - - - Dec: - set_target_dec(e.target.value)} - /> - -
- -
-
- Field of View (FOV) -
- - X: - set_fov_x(e.target.value)} - /> - - - Y: - set_fov_y(e.target.value)} - /> - -
-
- - -
- {open_fov_dialog && ( - { - update_fov_data((draft) => { - console.log( - "in framing, got fov change", - new_fov_data - ); - draft.focal_length = new_fov_data.focal_length; - draft.x_pixels = new_fov_data.x_pixels; - draft.x_pixel_size = new_fov_data.x_pixel_size; - draft.y_pixels = new_fov_data.y_pixels; - draft.y_pixel_size = new_fov_data.y_pixel_size; - }); - }} - on_rotation_change={function (rotation: number): void { - throw new Error("Function not implemented."); - }} - /> - )} -
-
- Objects - - - {open_search_dialog && ( - - )} - {open_manage_dialog && ( - - )} -
-
-
- -
-
- + + 视场中心点坐标: Ra: {screen_ra.toFixed(7)};Dec: {screen_dec.toFixed(7)} + + {/* 修正左上角aladin关不掉的中心点坐标 */} +
+ { + update_fov_data((draft) => { + console.log("in framing, got fov change", new_fov_data); + draft.focal_length = new_fov_data.focal_length; + draft.x_pixels = new_fov_data.x_pixels; + draft.x_pixel_size = new_fov_data.x_pixel_size; + draft.y_pixels = new_fov_data.y_pixels; + draft.y_pixel_size = new_fov_data.y_pixel_size; + }); + }} + on_rotation_change={(new_rotation) => { + set_camera_rotation(new_rotation); + }} + /> + + +
); }; diff --git a/websrc/cobalt-web/src/pages/skymap/index.tsx b/websrc/cobalt-web/src/pages/skymap/index.tsx index c2155206..0fd0d6f8 100644 --- a/websrc/cobalt-web/src/pages/skymap/index.tsx +++ b/websrc/cobalt-web/src/pages/skymap/index.tsx @@ -1,50 +1,39 @@ -import React from "react"; +import * as React from "react"; +import { Card } from "react-bootstrap"; +import { GlobalStore } from "../..//store/globalStore"; import { Tabs, Tab } from "react-bootstrap"; -import { - Search, - Grid3x3, - ClipboardData, - Code -} from "react-bootstrap-icons"; -import ObjectSearch from "./object_search"; + +//import ObjectSearch from './ObjectSearch'; import ImageFraming from "./image_framing"; -import ObjectManagement from "./object_manager"; -//import TargetTestPage from './TargetTestPage'; +//import ObjectManagement from './ObjectManagement'; +///import TargetTestPage from './TargetTestPage'; + +const ObjectFinding: React.FC = () => { + // reload all global parameter first. + const get_all_global_parameters = + GlobalStore.actions.GlobalParameterStore.get_all_paramters; + React.useEffect(() => { + get_all_global_parameters(); + }, []); -const ObjectFinding = () => { return ( - - - 目标搜索 - - } - > - - - - 构图助手 - - } - > - - - - 拍摄目标管理 - - } - > - - - + + + + // + // + // + // + // + // + // + // + // + // + // + // + // + // ); }; diff --git a/websrc/cobalt-web/src/pages/skymap/object_manager.tsx b/websrc/cobalt-web/src/pages/skymap/object_manager.tsx index 27dba993..afb585ee 100644 --- a/websrc/cobalt-web/src/pages/skymap/object_manager.tsx +++ b/websrc/cobalt-web/src/pages/skymap/object_manager.tsx @@ -1,22 +1,19 @@ -import React from "react"; - +import * as React from "react"; +import { GlobalStore } from "../../store/globalStore"; import { - Container, - Row, - Col, Card, Button, Alert, - Form, + Container, + Row, + Col, + FormControl, InputGroup, - Modal, } from "react-bootstrap"; -import { Trash, PencilSquare } from "react-bootstrap-icons"; - -import { useImmer } from "use-immer"; - -import { GlobalStore } from "../../store/globalStore"; import * as AXIOSOF from "../../services/object_finding_api"; +import Modal from "react-bootstrap/Modal"; +import Form from "react-bootstrap/Form"; + import TargetSmallCardHori from "../../components/skymap/target_smallv2"; import TargetSmallCard from "../../components/skymap/target_small"; @@ -32,6 +29,7 @@ const ObjectManagement: React.FC = (props) => { const clear_all_checked = GlobalStore.actions.TargetListStore.clear_all_checked; const remove_one_target = GlobalStore.actions.TargetListStore.remove_target; + const save_all_targets = GlobalStore.actions.TargetListStore.save_all_targets; const change_saved_focus_target = GlobalStore.actions.TargetListStore.change_saved_focus_target; const store_target_set_flag = @@ -45,8 +43,6 @@ const ObjectManagement: React.FC = (props) => { const [current_checked, set_current_checked] = React.useState( null ); - // const [dso_detailed_list, update_dso_detailed_list] = useImmer>([]); - // const [dso_detail_updated, update_dso_detail_updated] = useImmer>([]); // extra input data const [rename_text_dialog, set_rename_text_dialog] = React.useState(false); const [rename_text, set_rename_text] = React.useState(""); @@ -82,33 +78,6 @@ const ObjectManagement: React.FC = (props) => { } } }; - // const one_dso_card_need_update = () => { - // if (current_checked != null){ - // let new_card_info = dso_detailed_list[current_checked]; - // if (new_card_info != null){ - // let new_name = target_store.all_saved_targets[current_checked].name; - // update_dso_detailed_list((draft) => { - // draft[current_checked].name = new_name; - // }) - // } - // } - // }; - // const construct_all_dso_card_data = () => { - // let new_dso_detail_list = Array(target_store.all_saved_target_store.all_saved_targets.length); - // let new_dos_update_list = Array(target_store.all_saved_target_store.all_saved_targets.length); - // for (let i = 0; i < new_dos_update_list.length; i++) { - // new_dos_update_list[i] = false; - // } - // update_dso_detailed_list((draft) => { - // draft=new_dso_detail_list - // }); - // update_dso_detail_updated((draft) => { - // draft=new_dos_update_list; - // }); - // for( let i = 0; i < target_store.all_saved_target_store.all_saved_targets.length; i++){ - // construct_framing_info2card_info(target_store.all_saved_targets[i], i); - // } - // }; const rename_selected_target = () => { if (current_checked != null) { set_rename_text(""); @@ -121,10 +90,9 @@ const ObjectManagement: React.FC = (props) => { }; const on_add_tag_clicked = () => { if (current_checked != null) { + set_tag_dialog(true); } else { // pop up a warning - set_popup_text("没有选中任何待拍摄目标!"); - set_popup_dialog(true); } }; const on_add_flag_clicked = () => { @@ -141,6 +109,7 @@ const ObjectManagement: React.FC = (props) => { if (current_checked != null) { if (target_store.all_saved_targets[current_checked].checked) { remove_one_target(current_checked); + save_all_targets(); } else { console.log( current_checked, @@ -154,44 +123,12 @@ const ObjectManagement: React.FC = (props) => { set_popup_dialog(true); } }; - // const construct_framing_info2card_info = async (card_info: IDSOFramingObjectInfo, index: number) => { - // try{ - // const new_curve_data = await AXIOSOF.getTargetALtCurveOnly(card_info.ra, card_info.dec); - // if (new_curve_data.success){ - // let new_target_frame_info: IDSOObjectDetailedInfo = { - // name: card_info.name, - // ra: card_info.ra, - // dec: card_info.dec, - // target_type: card_info.target_type, - // bmag: card_info.bmag, - // vmag: card_info.vmag, - // size: card_info.size, - // moon_distance: new_curve_data.data.moon_distance, - // altitude: new_curve_data.data.altitude, - // } - // update_dso_detail_updated((draft) => { - // draft[index] = true; - // }); - // update_dso_detailed_list((draft) => { - // draft[index] = new_target_frame_info; - // }) - // }else{ - // return null; - // } - // } - // catch (err) { - // return null; - // } - // } const handle_rename_close = (save: boolean) => { if (rename_text != "" && current_checked != null && save) { store_target_rename({ index: current_checked, update_string: rename_text, }); - // update_dso_detailed_list((draft) => { - // draft[current_checked].name = rename_text; - // }) } set_rename_text(""); set_rename_text_dialog(false); @@ -206,7 +143,9 @@ const ObjectManagement: React.FC = (props) => { set_flag_text(""); set_flag_dialog(false); }; - const handle_tag_selection = (event: SelectChangeEvent) => { + const handle_tag_selection = ( + event: React.ChangeEvent + ) => { set_tag_value(event.target.value); }; const handle_tag_close = () => { @@ -221,100 +160,92 @@ const ObjectManagement: React.FC = (props) => { }; return ( - - - - {/* objects card */} - - {target_store.all_saved_targets.length === 0 ? ( - 拍摄列表中还没有目标 - ) : ( - target_store.all_saved_targets.map((one_target_info, index) => ( - - - - - - )) - )} - - - - {/* controls */} - - - 操作选中的目标 - - - - - - - - - - - + <> + + + + {/* objects card */} + + {target_store.all_saved_targets.length == 0 ? ( + + 拍摄列表中还没有目标 + + ) : ( + target_store.all_saved_targets.map((one_target_info, index) => { + return ( + + + + ); + }) + )} + + + + {/* controls */} + + +
操作选中的目标
+
+ + {" "} + +
+
+ {" "} + +
+
+ +
+
+
+ + + {" "} + + + + +
+
- - -
- - 根据tag筛选 - - - {/* Render tag options */} - - - - 根据flag筛选 - - - - - -
-
-
- -
- - {/* Rename Text Dialog */} handle_rename_close(false)} @@ -323,87 +254,75 @@ const ObjectManagement: React.FC = (props) => { 重命名该目标 -
- - 重命名为 - set_rename_text(event.target.value)} - /> - -
+ { + set_rename_text(event.target.value); + }} + />
- +
- {/* Flag Dialog */} handle_flag_close(false)}> 修改flag -
- - Flag - set_flag_text(event.target.value)} - /> - -
+ { + set_flag_text(event.target.value); + }} + />
- +
- {/* Tag Dialog */} - + handle_tag_close()}> 修改目标tag -
- - 目标tag - set_tag_value(event.target.value)} - > - - {/* Render tag options */} - - -
+ + + {target_store.all_tags.map((one_tag, index) => { + return ( + + ); + })} +
-
- {/* Popup Dialog */} { @@ -413,20 +332,19 @@ const ObjectManagement: React.FC = (props) => { 提示 - {/* Popup message content */} + {popup_text} -
+ ); }; diff --git a/websrc/cobalt-web/src/pages/skymap/object_manager_dialog.tsx b/websrc/cobalt-web/src/pages/skymap/object_manager_dialog.tsx index 8affe652..45644905 100644 --- a/websrc/cobalt-web/src/pages/skymap/object_manager_dialog.tsx +++ b/websrc/cobalt-web/src/pages/skymap/object_manager_dialog.tsx @@ -1,10 +1,16 @@ import React, { useState, useEffect } from "react"; import { Modal, Button } from "react-bootstrap"; import ObjectManagement from "./object_manager"; +import { XLg } from "react-bootstrap-icons"; import { GlobalStore } from "../../store/globalStore"; -import { XCircle } from "react-bootstrap-icons"; -const ObjectManagementDialog = (props) => { +interface ObjectManagementDialogProps { + open_dialog: number; +} + +const ObjectManagementDialog: React.FC = ( + props +) => { const [open, set_open] = useState(false); const clear_all_checked = GlobalStore.actions.TargetListStore.clear_all_checked; @@ -23,12 +29,16 @@ const ObjectManagementDialog = (props) => { return ( <> handleClose()} size="xl" fullscreen> + + 待拍摄目标管理 + - diff --git a/websrc/cobalt-web/src/pages/skymap/object_search.tsx b/websrc/cobalt-web/src/pages/skymap/object_search.tsx index 6a81389c..df894579 100644 --- a/websrc/cobalt-web/src/pages/skymap/object_search.tsx +++ b/websrc/cobalt-web/src/pages/skymap/object_search.tsx @@ -1,71 +1,65 @@ -import React, { useState } from "react"; -import { Form, Alert, Card } from "react-bootstrap"; -import { FilesAlt, ChevronDown, ChevronUp } from "react-bootstrap-icons"; -import styled from "styled-components"; +import * as React from "react"; +import { + Container, + Row, + Col, + Form, + Button, + Collapse, + ListGroup, + Alert, +} from "react-bootstrap"; +import { useImmer } from "use-immer"; +import { Filter } from "react-bootstrap-icons"; +import * as AXIOSOF from "../../services/object_finding_api"; import TargetSmallCardHori from "../../components/skymap/target_smallv2"; import TargetSmallCard from "../../components/skymap/target_small"; -import * as AXIOSOF from "../../services/object_finding_api"; - interface ObjectSearchProps { on_choice_maken: (() => void) | null; } -const SearchContainer = styled.div` - display: flex; - flex-direction: row; -`; - -const SearchInputContainer = styled.div` - flex: 1; - margin-right: 10px; -`; - -const FilterContainer = styled(Card)` - flex: 1; -`; - -const FilterHeader = styled(Card.Header)` - cursor: pointer; -`; - const ObjectSearch: React.FC = (props) => { // ui control - const [expand_filter, set_expand_filter] = useState(false); - const [alert_type, set_alert_type] = useState("info"); + const [expand_filter, set_expand_filter] = React.useState(false); + const [alert_variant, set_alert_variant] = React.useState< + "info" | "warning" | "danger" + >("info"); const [alert_text, set_alert_text] = - useState("请在左侧输入框输入需要搜索的信息"); + React.useState("请在左侧输入框输入需要搜索的信息"); // data - const [to_search_text, set_to_search_text] = useState("-"); - const [found_target_result, set_found_target_result] = useState< + const [to_search_text, set_to_search_text] = React.useState("-"); + const [found_target_result, set_found_target_result] = React.useState< Array >([]); - const [filter_settings, update_filter_settings] = useState({ + const [filter_settings, update_filter_settings] = useImmer({ angular_size: 1, // in arc degree }); const handleFilterExpandClick = () => { set_expand_filter(!expand_filter); }; + const handleSearchTextOnBlur = async () => { if (to_search_text === "-") { return null; } set_found_target_result([]); - set_alert_type("info"); + set_alert_variant("info"); set_alert_text("查询中"); try { const found_targets = await AXIOSOF.findTargetByName(to_search_text); + console.log(found_targets); if (found_targets.success) { if (found_targets.data.length > 0) { set_found_target_result(found_targets.data); } else { - set_alert_type("warning"); + set_alert_variant("warning"); set_alert_text("没有找到相关目标"); } } else { - set_alert_type("error"); + set_alert_variant("danger"); set_alert_text("没有找到相关目标!!!"); } } catch (err) { @@ -74,53 +68,61 @@ const ObjectSearch: React.FC = (props) => { }; return ( - - - {/* search and filter part */} - - { - set_to_search_text(event.target.value); - }} - className="mt-1" - /> - - - - - - 目标搜索筛选 - {expand_filter ? : } - - {expand_filter &&
开发中
}
-
-
- {/* display cards part */} - {found_target_result.length === 0 ? ( - {alert_text} - ) : ( -
- {found_target_result.map((one_dso_target_info, index) => { - return ( -
- -
- ); - })} + + + + {/* search and filter part */} + + set_to_search_text(event.target.value)} + className="mt-3" + /> + + + + + 高级搜索 + {expand_filter ? ( + + ) : ( + + )} + + + +
开发中
+
+
+
+ + + {/* display cards part */} +
+ {found_target_result.length === 0 ? ( + {alert_text} + ) : ( + + {found_target_result.map((one_dso_target_info, index) => { + return ( + + + + ); + })} + + )}
- )} -
- + + + ); }; diff --git a/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx b/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx index 65ee511d..f1321e28 100644 --- a/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx +++ b/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx @@ -1,41 +1,58 @@ -import React from "react"; +import React, { useState, useEffect, useRef } from "react"; import { Modal, Button } from "react-bootstrap"; import ObjectSearch from "./object_search"; -import { XCircle } from "react-bootstrap-icons"; +import { XCricle } from "react-bootstrap-icons"; +import { ArrowUpCircle } from "react-bootstrap-icons"; interface ObjectSearchDialogProps { open_dialog: number; } const ObjectSearchDialog: React.FC = (props) => { - const [open, set_open] = React.useState(false); + const [open, setOpen] = useState(false); + const dialogRef = useRef(null); - React.useEffect(() => { + useEffect(() => { if (props.open_dialog > 0) { - set_open(true); + setOpen(true); } }, [props.open_dialog]); const handleClose = () => { - set_open(false); + setOpen(false); }; return ( <> - + handleClose()} fullscreen> - 标题 + 目标搜索 - + - + {open && ( + { + if (dialogRef.current) dialogRef.current.scrollTop = 0; + }} + /> + )} ); }; From 2780bde64fc5a714ddcf8a8d802ed568f9019c59 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Thu, 18 Apr 2024 19:44:19 +0800 Subject: [PATCH 16/28] fix bugs in webui --- src/atom/server/daemon.cpp | 61 +- src/atom/server/daemon.hpp | 5 +- src/atom/server/global_ptr.cpp | 39 +- src/atom/server/global_ptr.hpp | 137 ++- src/atom/server/message_bus.hpp | 176 ++- src/atom/server/message_queue.hpp | 87 +- websrc/cobalt-web/package-lock.json | 54 + websrc/cobalt-web/package.json | 2 + .../actions/align/ThreePointStepper.tsx | 1002 +++++++++-------- .../actions/controls/CameraControl.tsx | 434 +++---- .../actions/controls/FocuserControl.tsx | 2 +- .../actions/controls/TelescopeControl.tsx | 128 +-- .../pages/dashboard2/actions/shoot/index.tsx | 21 +- .../cobalt-web/src/pages/dashboard2/index.tsx | 213 ++-- .../src/pages/dashboard2/registry/index.tsx | 28 +- .../device/description/helper_snackbar.tsx | 50 +- .../src/pages/skymap/object_search_dialog.tsx | 4 +- websrc/cobalt-web/src/routes/root.tsx | 7 + .../src/store/GlobalParameterStore.tsx | 38 + websrc/cobalt-web/src/store/PAAModel.ts | 10 +- websrc/lithium-web/package-lock.json | 359 +++--- 21 files changed, 1535 insertions(+), 1322 deletions(-) diff --git a/src/atom/server/daemon.cpp b/src/atom/server/daemon.cpp index 61c50190..650fa1d9 100644 --- a/src/atom/server/daemon.cpp +++ b/src/atom/server/daemon.cpp @@ -9,7 +9,7 @@ Date: 2023-11-11 Description: Daemon process implementation for Linux and Windows. But there is -still some problems on Windows, espacially the console. +still some problems on Windows, especially the console. **************************************************/ @@ -42,7 +42,7 @@ std::string DaemonGuard::ToString() const { ss << "[DaemonGuard parentId=" << m_parentId << " mainId=" << m_mainId << " parentStartTime=" << Utils::timeStampToString(m_parentStartTime) << " mainStartTime=" << Utils::timeStampToString(m_mainStartTime) - << " restartCount=" << m_restartCount << "]"; + << " restartCount=" << m_restartCount.load() << "]"; return ss.str(); } @@ -82,7 +82,7 @@ int DaemonGuard::RealDaemon(int argc, char **argv, CloseHandle(DaemonGuard.hThread); // 等待一段时间后重新启动子进程 - m_restartCount += 1; + m_restartCount++; Sleep(g_daemonRestartInterval * 1000); } #else @@ -123,7 +123,7 @@ int DaemonGuard::RealDaemon(int argc, char **argv, } // 等待一段时间后重新启动子进程 - m_restartCount += 1; + m_restartCount++; sleep(g_daemonRestartInterval); } } @@ -205,55 +205,4 @@ bool CheckPidFile() { return true; #endif } -} // namespace Atom::Async - -/* - -// 定义 MainCb 函数 -int MainCb(int argc, char **argv) -{ - // 实际任务的代码逻辑 - for (int i = 0; i < 10; ++i) - { - std::cout << "hello world" << std::endl; - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - - return 0; -} - -// 主函数 -int main(int argc, char **argv) -{ - // 初始化日志库、配置文件等 - // ... - - // 检查 PID 文件是否存在,并检查文件中的 PID 是否有效 - if (CheckPidFile()) - { - // LOG_F(ERROR, "process already running with pid file {}", -g_pidFilePath); exit(-1); - } - - // 写入 PID 文件 - WritePidFile(); - - // 注册退出信号处理函数 - signal(SIGTERM, SignalHandler); - signal(SIGINT, SignalHandler); - - // 创建 DaemonGuard 对象并启动进程,如果需要创建守护进程,则先创建守护进程 - DaemonGuard DaemonGuard; - DaemonGuard.StartDaemon(argc, argv, std::bind(MainCb, argc, argv), -g_isDaemon); DaemonGuard.RealDaemon(argc, argv, std::bind(MainCb, argc, argv)); - if (g_isDaemon) - { - // LOG_F(INFO, "daemon process start pid={} argv={}", getpid(), argv) - } - - std::cout << DaemonGuard.ToString() << std::endl; - // 删除 PID 文件并退出程序 - remove(g_pidFilePath.c_str()); - return 0; -} -*/ +} // namespace Atom::Async \ No newline at end of file diff --git a/src/atom/server/daemon.hpp b/src/atom/server/daemon.hpp index 0a7c167f..5cd2d3eb 100644 --- a/src/atom/server/daemon.hpp +++ b/src/atom/server/daemon.hpp @@ -15,10 +15,13 @@ Description: Daemon process implementation #ifndef ATOM_SERVER_DAEMON_HPP #define ATOM_SERVER_DAEMON_HPP +#include #include #include #include +#include #include +#include #ifdef _WIN32 #include @@ -93,7 +96,7 @@ class DaemonGuard { #endif time_t m_parentStartTime = 0; /**< The start time of the parent process. */ time_t m_mainStartTime = 0; /**< The start time of the child process. */ - int m_restartCount = 0; /**< The number of restarts. */ + std::atomic m_restartCount{0}; /**< The number of restarts. */ }; /** diff --git a/src/atom/server/global_ptr.cpp b/src/atom/server/global_ptr.cpp index e6c610c4..66986469 100644 --- a/src/atom/server/global_ptr.cpp +++ b/src/atom/server/global_ptr.cpp @@ -23,17 +23,40 @@ GlobalSharedPtrManager &GlobalSharedPtrManager::getInstance() { } void GlobalSharedPtrManager::removeSharedPtr(const std::string &key) { - std::unique_lock lock(mtx); + std::unique_lock lock(mtx); sharedPtrMap.erase(key); } +void GlobalSharedPtrManager::removeExpiredWeakPtrs() { + std::unique_lock lock(mtx); + auto it = sharedPtrMap.begin(); + while (it != sharedPtrMap.end()) { + try { + if (std::any_cast>(it->second).expired()) { + it = sharedPtrMap.erase(it); + } else { + ++it; + } + } catch (const std::bad_any_cast &) { + ++it; + } + } +} + +void GlobalSharedPtrManager::clearAll() { + std::unique_lock lock(mtx); + sharedPtrMap.clear(); +} + +size_t GlobalSharedPtrManager::size() const { + std::shared_lock lock(mtx); + return sharedPtrMap.size(); +} + void GlobalSharedPtrManager::printSharedPtrMap() const { - std::shared_lock lock(mtx); - std::cout << "Shared pointer map:" << std::endl; - for (const auto &it : sharedPtrMap) { - std::ostringstream oss; - oss << it.second.type().name(); - std::cout << "- Key: " << it.first << ", Type: " << oss.str() - << std::endl; + std::shared_lock lock(mtx); + std::cout << "GlobalSharedPtrManager:\n"; + for (const auto &pair : sharedPtrMap) { + std::cout << " " << pair.first << "\n"; } } \ No newline at end of file diff --git a/src/atom/server/global_ptr.hpp b/src/atom/server/global_ptr.hpp index e94ec099..3cbe8696 100644 --- a/src/atom/server/global_ptr.hpp +++ b/src/atom/server/global_ptr.hpp @@ -22,6 +22,7 @@ Description: Global shared pointer manager #include #include #include +#include #if ENABLE_FASTHASH #include "emhash/hash_table8.hpp" #else @@ -34,6 +35,8 @@ Description: Global shared pointer manager #define GetWeakPtr GlobalSharedPtrManager::getInstance().getWeakPtr #define AddPtr GlobalSharedPtrManager::getInstance().addSharedPtr #define RemovePtr GlobalSharedPtrManager::getInstance().removeSharedPtr +#define GetPtrOrCreate \ + GlobalSharedPtrManager::getInstance().getOrCreateSharedPtr /** * @brief The GlobalSharedPtrManager class manages a collection of shared @@ -56,20 +59,34 @@ class GlobalSharedPtrManager : public NonCopyable { * * @tparam T the type of the shared pointer. * @param key the key associated with the shared pointer. - * @return the shared pointer if found, nullptr otherwise. + * @return the shared pointer if found, std::nullopt otherwise. */ - template [[nodiscard]] std::optional> getSharedPtr( const std::string &key); + /** + * @brief getOrCreateSharedPtr retrieves a shared pointer from the shared + * pointer map with the specified key. If the shared pointer does not exist, + * it creates a new one using the provided creation function. + * + * @tparam T the type of the shared pointer. + * @param key the key associated with the shared pointer. + * @param creator a function that creates a new shared pointer if it doesn't + * exist. + * @return the shared pointer. + */ + template + std::shared_ptr getOrCreateSharedPtr(const std::string &key, + CreatorFunc creator); + /** * @brief getWeakPtr retrieves a weak pointer from the shared pointer map * with the specified key. * * @tparam T the type of the weak pointer. * @param key the key associated with the weak pointer. - * @return the weak pointer if found, nullptr otherwise. + * @return the weak pointer if found, an empty weak pointer otherwise. * @note The weak pointer is not guaranteed to be valid after the shared */ template @@ -112,17 +129,17 @@ class GlobalSharedPtrManager : public NonCopyable { * @tparam T the type of the shared pointer. * @param key the key associated with the weak pointer. * @return the shared pointer if the weak pointer is valid and the shared - * object still exists, nullptr otherwise. + * object still exists, an empty shared pointer otherwise. */ template - [[nodiscard]] std::shared_ptr getSharedPtrFromWeakPtr(const std::string &key); + [[nodiscard]] std::shared_ptr getSharedPtrFromWeakPtr( + const std::string &key); /** * @brief removeExpiredWeakPtrs removes all expired weak pointers from the * shared pointer map. Expired weak pointers are weak pointers whose shared * objects have been deleted. */ - template void removeExpiredWeakPtrs(); /** @@ -140,7 +157,7 @@ class GlobalSharedPtrManager : public NonCopyable { /** * @brief deleteObject deletes the shared object associated with the - * specified key. + * specified key using the custom deleter if available. * * @tparam T the type of the shared object. * @param key the key associated with the shared object to delete. @@ -149,6 +166,19 @@ class GlobalSharedPtrManager : public NonCopyable { template void deleteObject(const std::string &key, T *ptr); + /** + * @brief clearAll removes all shared pointers and weak pointers from the + * shared pointer map. + */ + void clearAll(); + + /** + * @brief size returns the number of elements in the shared pointer map. + * + * @return the number of elements in the shared pointer map. + */ + size_t size() const; + /** * @brief printSharedPtrMap prints the contents of the shared pointer map. */ @@ -172,22 +202,45 @@ std::optional> GlobalSharedPtrManager::getSharedPtr( std::shared_lock lock(mtx); auto it = sharedPtrMap.find(key); if (it != sharedPtrMap.end()) { - if (auto ptr = std::any_cast>(&it->second)) { - return *ptr; + try { + return std::any_cast>(it->second); + } catch (const std::bad_any_cast &) { + return std::nullopt; } } return std::nullopt; } +template +std::shared_ptr GlobalSharedPtrManager::getOrCreateSharedPtr( + const std::string &key, CreatorFunc creator) { + std::unique_lock lock(mtx); + auto it = sharedPtrMap.find(key); + if (it != sharedPtrMap.end()) { + try { + return std::any_cast>(it->second); + } catch (const std::bad_any_cast &) { + // Key exists but the stored type does not match, replace it + auto ptr = creator(); + sharedPtrMap[key] = ptr; + return ptr; + } + } else { + auto ptr = creator(); + sharedPtrMap[key] = ptr; + return ptr; + } +} + template std::weak_ptr GlobalSharedPtrManager::getWeakPtr(const std::string &key) { - std::shared_lock lock(mtx); + std::shared_lock lock(mtx); auto it = sharedPtrMap.find(key); if (it != sharedPtrMap.end()) { try { - return std::weak_ptr( - std::any_cast>(it->second)); + return std::any_cast>(it->second); } catch (const std::bad_any_cast &) { + return std::weak_ptr(); } } return std::weak_ptr(); @@ -196,77 +249,61 @@ std::weak_ptr GlobalSharedPtrManager::getWeakPtr(const std::string &key) { template void GlobalSharedPtrManager::addSharedPtr(const std::string &key, std::shared_ptr sharedPtr) { - std::scoped_lock lock(mtx); - sharedPtrMap[key] = sharedPtr; + std::unique_lock lock(mtx); + sharedPtrMap[key] = std::move(sharedPtr); } template void GlobalSharedPtrManager::addWeakPtr(const std::string &key, const std::weak_ptr &weakPtr) { - std::scoped_lock lock(mtx); + std::unique_lock lock(mtx); sharedPtrMap[key] = weakPtr; } template std::shared_ptr GlobalSharedPtrManager::getSharedPtrFromWeakPtr( const std::string &key) { - std::shared_lock lock(mtx); + std::shared_lock lock(mtx); auto it = sharedPtrMap.find(key); if (it != sharedPtrMap.end()) { try { return std::any_cast>(it->second).lock(); } catch (const std::bad_any_cast &) { - return nullptr; // 类型转换失败,返回空指针 - } - } - - return nullptr; -} - -template -void GlobalSharedPtrManager::removeExpiredWeakPtrs() { - std::vector keysToRemove; - { - std::shared_lock lock(mtx); - for (auto &it : sharedPtrMap) { - try { - if (auto weakPtr = std::any_cast>(&it.second); - weakPtr && weakPtr->expired()) { - keysToRemove.push_back(it.first); - } - } catch (const std::bad_any_cast &) { - // TODO: Handle or ignore bad cast - } - } - } - - if (!keysToRemove.empty()) { - std::scoped_lock lock(mtx); - for (auto &key : keysToRemove) { - sharedPtrMap.erase(key); + return std::shared_ptr(); } } + return std::shared_ptr(); } template void GlobalSharedPtrManager::addDeleter( const std::string &key, const std::function &deleter) { - std::unique_lock lock(mtx); - sharedPtrMap[key] = deleter; + std::unique_lock lock(mtx); + auto it = sharedPtrMap.find(key); + if (it != sharedPtrMap.end()) { + try { + auto ptr = std::any_cast>(it->second); + ptr.reset(ptr.get(), deleter); + sharedPtrMap[key] = ptr; + } catch (const std::bad_any_cast &) { + // Ignore if the stored type does not match + } + } } template void GlobalSharedPtrManager::deleteObject(const std::string &key, T *ptr) { - std::unique_lock lock(mtx); + std::unique_lock lock(mtx); auto it = sharedPtrMap.find(key); if (it != sharedPtrMap.end()) { try { - std::function deleter = - std::any_cast>(it->second); + auto deleter = std::any_cast>(it->second); deleter(ptr); } catch (const std::bad_any_cast &) { + delete ptr; // Use default delete if no custom deleter is found } + sharedPtrMap.erase(it); } } -#endif +#endif // ATOM_SERVER_GLOBAL_PTR_HPP diff --git a/src/atom/server/message_bus.hpp b/src/atom/server/message_bus.hpp index bf5547f0..30a48898 100644 --- a/src/atom/server/message_bus.hpp +++ b/src/atom/server/message_bus.hpp @@ -24,6 +24,7 @@ Description: Main Message Bus #include #include #include +#include #include #include #include @@ -46,22 +47,8 @@ class MessageBus { maxMessageBusSize_.store(max_queue_size); } - ~MessageBus() { - if (!subscribers_.empty()) { - subscribers_.clear(); - } - if (!processingThreads_.empty()) { - for (auto &thread : processingThreads_) { - if (thread.second.joinable()) { -#if __cplusplus >= 202002L - thread.second.request_stop(); -#endif - thread.second.join(); - } - } - processingThreads_.clear(); - } - } + ~MessageBus() { StopAllProcessingThreads(); } + // ------------------------------------------------------------------- // Common methods // ------------------------------------------------------------------- @@ -86,12 +73,11 @@ class MessageBus { std::string fullTopic = namespace_.empty() ? topic : (namespace_ + "::" + topic); - subscribersLock_.lock(); - subscribers_[fullTopic].push_back({priority, std::any(callback)}); + std::scoped_lock lock(subscribersLock_); + subscribers_[fullTopic].emplace_back(priority, std::move(callback)); std::sort( subscribers_[fullTopic].begin(), subscribers_[fullTopic].end(), [](const auto &a, const auto &b) { return a.first > b.first; }); - subscribersLock_.unlock(); DLOG_F(INFO, "Subscribed to topic: {}", fullTopic); } @@ -111,7 +97,7 @@ class MessageBus { std::string fullTopic = namespace_.empty() ? topic : (namespace_ + "::" + topic); - subscribersLock_.lock(); + std::scoped_lock lock(subscribersLock_); auto it = subscribers_.find(fullTopic); if (it != subscribers_.end()) { auto &topicSubscribers = it->second; @@ -125,7 +111,6 @@ class MessageBus { DLOG_F(INFO, "Unsubscribed from topic: {}", fullTopic); } - subscribersLock_.unlock(); } template @@ -138,9 +123,8 @@ class MessageBus { void UnsubscribeAll(const std::string &namespace_ = "") { std::string fullTopic = namespace_.empty() ? "*" : (namespace_ + "::*"); - subscribersLock_.lock(); + std::scoped_lock lock(subscribersLock_); subscribers_.erase(fullTopic); - subscribersLock_.unlock(); DLOG_F(INFO, "Unsubscribed from all topics"); } @@ -151,9 +135,15 @@ class MessageBus { std::string fullTopic = namespace_.empty() ? topic : (namespace_ + "::" + topic); - messageQueueLock_.lock(); - messageQueue_.push({fullTopic, std::any(message)}); - messageQueueLock_.unlock(); + { + std::scoped_lock lock(messageQueueLock_); + if (messageQueue_.size() >= maxMessageBusSize_) { + LOG_F(WARNING, + "Message queue is full. Discarding oldest message."); + messageQueue_.pop(); + } + messageQueue_.emplace(fullTopic, message); + } messageAvailableFlag_.notify_one(); DLOG_F(INFO, "Published message to topic: {}", fullTopic); @@ -167,28 +157,31 @@ class MessageBus { std::string fullTopic = namespace_.empty() ? topic : (namespace_ + "::" + topic); - if (messageQueueLock_.try_lock_until(std::chrono::steady_clock::now() + - timeout)) { - messageQueue_.push({fullTopic, std::any(message)}); - messageQueueLock_.unlock(); - messageAvailableFlag_.notify_one(); - - DLOG_F(INFO, "Published message to topic: {}", fullTopic); - return true; - } else { - LOG_F(WARNING, - "Failed to publish message to topic: {} due to timeout", - fullTopic); - return false; + { + std::unique_lock lock(messageQueueLock_); + if (messageQueueCondition_.wait_for(lock, timeout, [this] { + return messageQueue_.size() < maxMessageBusSize_; + })) { + messageQueue_.emplace(fullTopic, message); + messageAvailableFlag_.notify_one(); + DLOG_F(INFO, "Published message to topic: {}", fullTopic); + return true; + } else { + LOG_F(WARNING, + "Failed to publish message to topic: {} due to timeout", + fullTopic); + return false; + } } } template bool TryReceive(T &outMessage, std::chrono::milliseconds timeout = std::chrono::milliseconds(100)) { - std::unique_lock lock(waitingMutex_); + std::unique_lock lock(waitingMutex_); if (messageAvailableFlag_.wait_for( lock, timeout, [this] { return !messageQueue_.empty(); })) { + std::scoped_lock messageLock(messageQueueLock_); auto message = std::move(messageQueue_.front()); messageQueue_.pop(); outMessage = std::any_cast(message.second); @@ -201,64 +194,53 @@ class MessageBus { template void GlobalSubscribe(std::function callback) { - globalSubscribersLock_.lock(); - globalSubscribers_.push_back({std::any(callback)}); - globalSubscribersLock_.unlock(); + std::scoped_lock lock(globalSubscribersLock_); + globalSubscribers_.emplace_back(std::move(callback)); } template void GlobalUnsubscribe(std::function callback) { - globalSubscribersLock_.lock(); + std::scoped_lock lock(globalSubscribersLock_); globalSubscribers_.erase( std::remove_if(globalSubscribers_.begin(), globalSubscribers_.end(), [&](const auto &subscriber) { return subscriber.type() == typeid(callback); }), globalSubscribers_.end()); - globalSubscribersLock_.unlock(); } template void StartProcessingThread() { std::type_index typeIndex = typeid(T); -#if __cplusplus >= 202002L - processingThreads_.emplace( - typeIndex, - std::jthread( - [&]() -#else - processingThreads_.emplace( - typeIndex, - std::thread( - [&]() -#endif - { - while (isRunning_.load()) { + if (processingThreads_.find(typeIndex) == processingThreads_.end()) { + processingThreads_.emplace( + typeIndex, + std::jthread([this, typeIndex](std::stop_token stopToken) { + while (!stopToken.stop_requested()) { std::pair message; bool hasMessage = false; - while (isRunning_.load()) { - messageQueueLock_.lock(); + { + std::unique_lock lock(waitingMutex_); + messageAvailableFlag_.wait(lock, stopToken, [this] { + return !messageQueue_.empty(); + }); + if (stopToken.stop_requested()) { + break; + } + std::scoped_lock messageLock(messageQueueLock_); if (!messageQueue_.empty()) { message = std::move(messageQueue_.front()); messageQueue_.pop(); hasMessage = true; } - messageQueueLock_.unlock(); - - if (hasMessage) { - break; - } - - std::unique_lock lock(waitingMutex_); - messageAvailableFlag_.wait(lock); } if (hasMessage) { const std::string &topic = message.first; const std::any &data = message.second; - subscribersLock_.lock(); + std::shared_lock subscribersLock(subscribersLock_); auto it = subscribers_.find(topic); if (it != subscribers_.end()) { try { @@ -281,9 +263,8 @@ class MessageBus { "message processing"); } } - subscribersLock_.unlock(); - globalSubscribersLock_.lock(); + std::shared_lock globalLock(globalSubscribersLock_); try { for (const auto &subscriber : globalSubscribers_) { @@ -304,13 +285,13 @@ class MessageBus { "Unknown error occurred during global " "message processing"); } - globalSubscribersLock_.unlock(); DLOG_F(INFO, "Processed message on topic: {}", topic); } } })); + } } template @@ -318,9 +299,7 @@ class MessageBus { std::type_index typeIndex = typeid(T); auto it = processingThreads_.find(typeIndex); if (it != processingThreads_.end()) { -#if __cplusplus >= 202002L it->second.request_stop(); -#endif it->second.join(); processingThreads_.erase(it); DLOG_F(INFO, "Processing thread for type {} stopped", @@ -329,12 +308,10 @@ class MessageBus { } void StopAllProcessingThreads() { - isRunning_.store(false); - messageAvailableFlag_.notify_one(); for (auto &thread : processingThreads_) { -#if __cplusplus >= 202002L thread.second.request_stop(); -#endif + } + for (auto &thread : processingThreads_) { thread.second.join(); } processingThreads_.clear(); @@ -342,32 +319,31 @@ class MessageBus { } private: - std::unordered_map>> - subscribers_; - std::mutex subscribersLock_; - std::queue> messageQueue_; - std::timed_mutex messageQueueLock_; + using SubscriberCallback = std::function; + using SubscriberList = std::vector>; + using SubscriberMap = std::unordered_map; + + SubscriberMap subscribers_; + std::shared_mutex subscribersLock_; + + using MessageQueue = std::queue>; + MessageQueue messageQueue_; + std::mutex messageQueueLock_; + std::condition_variable messageQueueCondition_; std::condition_variable messageAvailableFlag_; std::mutex waitingMutex_; -#if __cplusplus >= 202002L -#if ENABLE_FASTHASH - emhash8::HashMap processingThreads_; -#else - std::unordered_map processingThreads_; -#endif -#else -#if ENABLE_FASTHASH - emhash8::HashMap processingThreads_; -#else - std::unordered_map processingThreads_; -#endif -#endif - std::atomic isRunning_{true}; + + using ProcessingThread = std::jthread; + using ProcessingThreadMap = + std::unordered_map; + ProcessingThreadMap processingThreads_; + std::atomic_int maxMessageBusSize_{1000}; - std::vector globalSubscribers_; - std::mutex globalSubscribersLock_; + using GlobalSubscriberList = std::vector; + GlobalSubscriberList globalSubscribers_; + std::shared_mutex globalSubscribersLock_; }; } // namespace Atom::Server -#endif +#endif \ No newline at end of file diff --git a/src/atom/server/message_queue.hpp b/src/atom/server/message_queue.hpp index 87cbef62..dfcbd68d 100644 --- a/src/atom/server/message_queue.hpp +++ b/src/atom/server/message_queue.hpp @@ -53,8 +53,11 @@ class MessageQueue { * @param callback The callback function to be called when a new message is * received. * @param subscriberName The name of the subscriber to be added. + * @param priority The priority of the subscriber. Higher priority + * subscribers will receive messages before lower priority subscribers. */ - void subscribe(CallbackType callback, const std::string &subscriberName); + void subscribe(CallbackType callback, const std::string &subscriberName, + int priority = 0); /** * @brief Unsubscribe a callback function from receiving messages. @@ -72,8 +75,12 @@ class MessageQueue { /** * @brief Start the processing thread(s) to receive and handle messages. + * + * @param numThreads The number of processing threads to spawn. If not + * specified, the number of hardware threads will be used. */ - void startProcessingThread(); + void startProcessingThread( + int numThreads = std::thread::hardware_concurrency()); /** * @brief Stop the processing thread(s) from receiving and handling @@ -81,6 +88,20 @@ class MessageQueue { */ void stopProcessingThread(); + /** + * @brief Get the number of messages currently in the queue. + * + * @return The number of messages in the queue. + */ + size_t getMessageCount() const; + + /** + * @brief Get the number of subscribers currently registered. + * + * @return The number of subscribers. + */ + size_t getSubscriberCount() const; + private: /** * @brief The Subscriber struct contains information about a subscribed @@ -90,6 +111,7 @@ class MessageQueue { std::string name; /**< The name of the subscriber. */ CallbackType callback; /**< The callback function to be called when a new message is received. */ + int priority; /**< The priority of the subscriber. */ /** * @brief Construct a new Subscriber object. @@ -97,19 +119,30 @@ class MessageQueue { * @param name The name of the subscriber. * @param callback The callback function to be called when a new message * is received. + * @param priority The priority of the subscriber. */ - Subscriber(const std::string &name, const CallbackType &callback) - : name(name), callback(callback) {} + Subscriber(const std::string &name, const CallbackType &callback, + int priority) + : name(name), callback(callback), priority(priority) {} + + /** + * @brief Compare two Subscriber objects based on their priority + * * + * @param other The other Subscriber object to compare with. + * @return True if this Subscriber has a higher priority than the other + * Subscriber, false otherwise. + */ + bool operator<(const Subscriber &other) const { + return priority > other.priority; + } }; std::deque m_messages; /**< The queue containing all published messages. */ std::vector m_subscribers; /**< The vector containing all subscribed callback functions. */ - std::mutex - m_mutex; /**< The mutex used to protect access to the message queue. */ - std::mutex m_subscriberMutex; /**< The mutex used to protect access to the - subscriber vector. */ + mutable std::mutex m_mutex; /**< The mutex used to protect access to the + message queue and subscriber vector. */ std::condition_variable m_condition; /**< The condition variable used to notify processing threads of new messages. */ @@ -118,21 +151,20 @@ class MessageQueue { should continue running. */ std::vector m_processingThreads; /**< The vector containing all processing threads. */ - int m_numThreads = - std::thread::hardware_concurrency(); /**< The number of processing - threads to spawn. */ }; template void MessageQueue::subscribe(CallbackType callback, - const std::string &subscriberName) { - std::lock_guard lock(m_subscriberMutex); - m_subscribers.emplace_back(subscriberName, callback); + const std::string &subscriberName, + int priority) { + std::lock_guard lock(m_mutex); + m_subscribers.emplace_back(subscriberName, callback, priority); + std::sort(m_subscribers.begin(), m_subscribers.end()); } template void MessageQueue::unsubscribe(CallbackType callback) { - std::lock_guard lock(m_subscriberMutex); + std::lock_guard lock(m_mutex); auto it = std::remove_if(m_subscribers.begin(), m_subscribers.end(), [&callback](const auto &subscriber) { return subscriber.callback.target_type() == @@ -144,21 +176,21 @@ void MessageQueue::unsubscribe(CallbackType callback) { template void MessageQueue::publish(const T &message) { { - std::lock_guard lock(m_mutex); + std::lock_guard lock(m_mutex); m_messages.emplace_back(message); } m_condition.notify_one(); } template -void MessageQueue::startProcessingThread() { - for (int i = 0; i < m_numThreads; ++i) { +void MessageQueue::startProcessingThread(int numThreads) { + for (int i = 0; i < numThreads; ++i) { m_processingThreads.emplace_back([this]() { while (m_isRunning.load()) { std::optional message; { - std::unique_lock lock(m_mutex); + std::unique_lock lock(m_mutex); m_condition.wait(lock, [this]() { return !m_messages.empty() || !m_isRunning.load(); }); @@ -176,7 +208,7 @@ void MessageQueue::startProcessingThread() { std::vector subscribersCopy; { - std::lock_guard lock(m_subscriberMutex); + std::lock_guard lock(m_mutex); subscribersCopy.reserve(m_subscribers.size()); for (const auto &subscriber : m_subscribers) { subscribersCopy.emplace_back(subscriber.callback); @@ -203,6 +235,19 @@ void MessageQueue::stopProcessingThread() { } m_processingThreads.clear(); } + +template +size_t MessageQueue::getMessageCount() const { + std::lock_guard lock(m_mutex); + return m_messages.size(); +} + +template +size_t MessageQueue::getSubscriberCount() const { + std::lock_guard lock(m_mutex); + return m_subscribers.size(); +} + } // namespace Atom::Server -#endif +#endif \ No newline at end of file diff --git a/websrc/cobalt-web/package-lock.json b/websrc/cobalt-web/package-lock.json index 6abed7bb..b1e62724 100644 --- a/websrc/cobalt-web/package-lock.json +++ b/websrc/cobalt-web/package-lock.json @@ -38,10 +38,12 @@ "react-scroll": "^1.9.0", "react-slick": "^0.30.2", "react-spinners": "^0.13.8", + "react-svg": "^16.1.34", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", "react-tsparticles": "^2.12.2", "redux": "^4.2.1", + "slick-carousel": "^1.8.1", "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", @@ -1465,6 +1467,21 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@tanem/svg-injector": { + "version": "10.1.68", + "resolved": "https://registry.npmjs.org/@tanem/svg-injector/-/svg-injector-10.1.68.tgz", + "integrity": "sha512-UkJajeR44u73ujtr5GVSbIlELDWD/mzjqWe54YMK61ljKxFcJoPd9RBSaO7xj02ISCWUqJW99GjrS+sVF0UnrA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "content-type": "^1.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@tanem/svg-injector/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2121,6 +2138,14 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4047,6 +4072,12 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5154,6 +5185,21 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-svg": { + "version": "16.1.34", + "resolved": "https://registry.npmjs.org/react-svg/-/react-svg-16.1.34.tgz", + "integrity": "sha512-L4ak1qNFLgzVbHm0xQEpHoIOqb3um/B0ybahd3U2TKoGZxb0JaPVI5lsAhvSng2P1kcsYEok2Z7RpcKx7arJGw==", + "dependencies": { + "@babel/runtime": "^7.24.1", + "@tanem/svg-injector": "^10.1.68", + "@types/prop-types": "^15.7.12", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-swipeable": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/react-swipeable/-/react-swipeable-7.0.1.tgz", @@ -5562,6 +5608,14 @@ "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==" }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/smooth-scrollbar": { "version": "8.8.4", "resolved": "https://registry.npmjs.org/smooth-scrollbar/-/smooth-scrollbar-8.8.4.tgz", diff --git a/websrc/cobalt-web/package.json b/websrc/cobalt-web/package.json index 558fe385..6225c032 100644 --- a/websrc/cobalt-web/package.json +++ b/websrc/cobalt-web/package.json @@ -40,10 +40,12 @@ "react-scroll": "^1.9.0", "react-slick": "^0.30.2", "react-spinners": "^0.13.8", + "react-svg": "^16.1.34", "react-swipeable": "^7.0.1", "react-syntax-highlighter": "^15.5.0", "react-tsparticles": "^2.12.2", "redux": "^4.2.1", + "slick-carousel": "^1.8.1", "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx index 5df1bdc2..05bb0f16 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/align/ThreePointStepper.tsx @@ -1,511 +1,539 @@ -import * as React from 'react'; -import Stepper from '@mui/joy/Stepper'; -import Step from '@mui/joy/Step'; -import StepIndicator from '@mui/joy/StepIndicator'; -import PendingIcon from '@mui/icons-material/Pending'; -import CircularProgress from '@mui/joy/CircularProgress'; -import CheckRoundedIcon from '@mui/icons-material/CheckCircle'; -import StopIcon from '@mui/icons-material/Stop'; -import CancelIcon from '@mui/icons-material/Cancel'; -import Typography from '@mui/joy/Typography'; -import Stack from '@mui/joy/Stack'; -import { useImmer } from 'use-immer'; -import { Paper } from '@mui/material'; -import { ColorPaletteProp } from '@mui/joy'; - -import ThreePointDataDisplay from './ThreePointDataDisplay'; +import * as React from "react"; +import { ListGroup } from "react-bootstrap"; +import { + Hourglass, + CheckCircleFill, + XCircleFill, + StopFill, +} from "react-bootstrap-icons"; +import { Spinner } from "react-bootstrap"; +import { useImmer } from "use-immer"; +import { Card } from "react-bootstrap"; +import ThreePointDataDisplay from "./ThreePointDataDisplay"; interface ThreePointStepperProps { - current_step: number; - incoming_data: any; + current_step: number; + incoming_data: any; } -/* -step -1: before first -step 0: initial finished -step 91: manual start move telescope -step 1: start exposure -step 11: exposure and solve finished -step 15: start telescope move -step 16: move finished -step 17: settle finished -step 19: first exposure solve failed -step 2: start second exposure -step 21: exposure and solve finished -step 29: second exposure solve failed -step 3: start thrid exposure -step 31: exposure and solve finished -step 38: error calculation finished -step 39: third exposure solve failed -step 4: update exposure start -step 41: update exposure and solved finished -step 42: update exposure new error calculated -step 49: update exposure solve failed -step 99: update timeout -*/ interface StepProps { - step_complete_status: number; - step_exposure_fig_status: number; - step_number: string; - step_data: any; + step_complete_status: number; + step_exposure_fig_status: number; + step_number: string; + step_data: any; } -const MoveStep:React.FC = (props) => { - const [completed, set_completed] = React.useState(false); - const [active, set_active] = React.useState(false); - const [step_color, set_step_color] = React.useState('primary'); - - - React.useEffect(() => { - if (props.step_complete_status == 0){ - set_completed(false); - set_active(true); - set_step_color('primary'); - }else if (props.step_complete_status == 1){ - set_completed(true); - set_active(false); - set_step_color('success'); - }else if (props.step_complete_status == -1){ - set_completed(false); - set_active(false); - set_step_color('danger'); - } - }, [props.step_complete_status]) +const MoveStep: React.FC = (props) => { + const [completed, set_completed] = React.useState(false); + const [active, set_active] = React.useState(false); + const [step_color, set_step_color] = React.useState("primary"); - return ( - - {(props.step_exposure_fig_status == 0) && ()} - {(props.step_exposure_fig_status == 1) && ()} - {(props.step_exposure_fig_status == 2) && ()} - {(props.step_exposure_fig_status == 3) && ()} - - } - > - 移动望远镜 - - ) -} + React.useEffect(() => { + if (props.step_complete_status == 0) { + set_completed(false); + set_active(true); + set_step_color("primary"); + } else if (props.step_complete_status == 1) { + set_completed(true); + set_active(false); + set_step_color("success"); + } else if (props.step_complete_status == -1) { + set_completed(false); + set_active(false); + set_step_color("danger"); + } + }, [props.step_complete_status]); -const ExposureStep:React.FC = (props) => { - const [completed, set_completed] = React.useState(false); - const [active, set_active] = React.useState(false); - const [step_color, set_step_color] = React.useState('primary'); + return ( + +
+ {props.step_exposure_fig_status == 0 && ( + + )} + {props.step_exposure_fig_status == 1 && ( + + )} + {props.step_exposure_fig_status == 2 && ( + + )} + {props.step_exposure_fig_status == 3 && ( + + )} +
移动望远镜
+
+
+ ); +}; - React.useEffect(() => { - if (props.step_complete_status == 0){ - set_completed(false); - set_active(true); - set_step_color('primary'); - }else if (props.step_complete_status == 1){ - set_completed(true); - set_active(false); - set_step_color('success'); - }else if (props.step_complete_status == -1){ - set_completed(false); - set_active(false); - set_step_color('danger'); - } - }, [props.step_complete_status]) - - - return ( - - {(props.step_exposure_fig_status == 0) && ()} - {(props.step_exposure_fig_status == 1) && ()} - {(props.step_exposure_fig_status == 2) && ()} - {(props.step_exposure_fig_status == 3) && ()} - - } - > - 拍摄解析第{props.step_number}张 - - ) -} +const ExposureStep: React.FC = (props) => { + const [completed, set_completed] = React.useState(false); + const [active, set_active] = React.useState(false); + const [step_color, set_step_color] = React.useState("primary"); + React.useEffect(() => { + if (props.step_complete_status == 0) { + set_completed(false); + set_active(true); + set_step_color("primary"); + } else if (props.step_complete_status == 1) { + set_completed(true); + set_active(false); + set_step_color("success"); + } else if (props.step_complete_status == -1) { + set_completed(false); + set_active(false); + set_step_color("danger"); + } + }, [props.step_complete_status]); -const ThreePointStepper:React.FC = (props)=>{ - // ui control - const [measure_finished, set_measure_finished] = React.useState(false); - const [step_show_data, update_step_show_data] = useImmer({ - first_exposure_complete_status: 0, // 0 for normal, 1 for complete, -1 for fail - first_exposure_fig_status: 0, // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed - first_move_complete_status: 0, - first_move_fig_status: 0, - second_exposure_complete_status: 0, - second_exposure_fig_status: 0, - second_move_complete_status: 0, - second_move_fig_status: 0, - third_exposure_complete_status: 0, - third_exposure_fig_status: 0, - update_exposure_complete_status: 0, - update_exposure_fig_status: 0, - }) - const [current_discription, set_current_discription] = React.useState(''); - const [first_move, set_first_move] = React.useState(false); + return ( + +
+ {props.step_exposure_fig_status == 0 && ( + + )} + {props.step_exposure_fig_status == 1 && ( + + )} + {props.step_exposure_fig_status == 2 && ( + + )} + {props.step_exposure_fig_status == 3 && ( + + )} +
拍摄解析第{props.step_number}张
+
+
+ ); +}; - // polar error related data - const [east_west_angle, set_east_west_angle] = React.useState(null); - const [up_down_angle, set_up_down_angle] = React.useState(null); - const [target_ra_dec, set_target_ra_dec] = React.useState(null); - const [current_ra_dec, set_current_ra_dec] = React.useState(null); - const [solved_ra_dec, update_solved_ra_dec] = useImmer<[ICThreePointTarget | null, ICThreePointTarget | null, ICThreePointTarget | null, ICThreePointTarget | null]>([null, null, null, null]); +const ThreePointStepper: React.FC = (props) => { + // ui control + const [measure_finished, set_measure_finished] = React.useState(false); + const [step_show_data, update_step_show_data] = useImmer({ + first_exposure_complete_status: 0, + first_exposure_fig_status: 0, + first_move_complete_status: 0, + first_move_fig_status: 0, + second_exposure_complete_status: 0, + second_exposure_fig_status: 0, + second_move_complete_status: 0, + second_move_fig_status: 0, + third_exposure_complete_status: 0, + third_exposure_fig_status: 0, + update_exposure_complete_status: 0, + update_exposure_fig_status: 0, + }); + const [current_discription, set_current_discription] = React.useState(""); + const [first_move, set_first_move] = React.useState(false); - // use effect - // on mount - React.useEffect(() => { + // polar error related data + const [east_west_angle, set_east_west_angle] = React.useState( + null + ); + const [up_down_angle, set_up_down_angle] = React.useState( + null + ); + const [target_ra_dec, set_target_ra_dec] = + React.useState(null); + const [current_ra_dec, set_current_ra_dec] = + React.useState(null); + const [solved_ra_dec, update_solved_ra_dec] = useImmer< + [ + ICThreePointTarget | null, + ICThreePointTarget | null, + ICThreePointTarget | null, + ICThreePointTarget | null + ] + >([null, null, null, null]); - }, []); - React.useEffect(() => { - switch (props.current_step){ - case (-1): { - set_measure_finished(false); - update_step_show_data((draft) => { - draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail - draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed - draft.first_move_complete_status = 0; - draft.first_move_fig_status = 0; - draft.second_exposure_complete_status = 0; - draft.second_exposure_fig_status = 0; - draft.second_move_complete_status = 0; - draft.second_move_fig_status = 0; - draft.third_exposure_complete_status = 0; - draft.third_exposure_fig_status = 0; - draft.update_exposure_complete_status = 0; - draft.update_exposure_fig_status = 0; - }); - update_solved_ra_dec((draft) => { - draft = [null, null, null, null]; - }); - set_current_discription('等待启动'); - break; - } - case (91): { - set_measure_finished(false); - set_first_move(true); - break; - } - case (0): { - set_measure_finished(false); - update_step_show_data((draft) => { - draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail - draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed - draft.first_move_complete_status = 0; - draft.first_move_fig_status = 0; - draft.second_exposure_complete_status = 0; - draft.second_exposure_fig_status = 0; - draft.second_move_complete_status = 0; - draft.second_move_fig_status = 0; - draft.third_exposure_complete_status = 0; - draft.third_exposure_fig_status = 0; - draft.update_exposure_complete_status = 0; - draft.update_exposure_fig_status = 0; - }); - update_solved_ra_dec((draft) => { - draft = [null, null, null, null]; - }); - set_first_move(true); - set_current_discription('初始化设置完成'); - break; - } - case (1): { // step 1: start exposure - set_first_move(true); - update_step_show_data((draft) => { - draft.first_exposure_complete_status = 0; - draft.first_exposure_fig_status = 1; - }); - set_current_discription('开始第一次曝光'); - break; - } - case (11): { // step 11: exposure and solve finished - update_step_show_data((draft) => { - draft.first_exposure_complete_status = 1; - draft.first_exposure_fig_status = 2; - }); - set_current_discription('第一张曝光解析完成'); - update_solved_ra_dec((draft) => { - draft[0] = { - ra: props.incoming_data.ra, - dec: props.incoming_data.dec, - } - }) - break; - } - case (15): { // step 15: starttelescope move - if (first_move){ - update_step_show_data((draft) => { - draft.first_move_complete_status = 0; - draft.first_move_fig_status = 1; - }); - }else{ - update_step_show_data((draft) => { - draft.second_move_complete_status = 0; - draft.second_move_fig_status = 1; - }); - } - set_current_discription('移动望远镜中'); - break; - } - case (16): { // step 16: move finished - if (first_move){ - update_step_show_data((draft) => { - draft.first_move_complete_status = 1; - draft.first_move_fig_status = 1; - }); - }else{ - update_step_show_data((draft) => { - draft.second_move_complete_status = 1; - draft.second_move_fig_status = 1; - }); - } - set_current_discription('等待望远镜稳定中'); - break; - } - case (17): { // step 17: settle finished - if (first_move){ - update_step_show_data((draft) => { - draft.first_move_complete_status = 1; - draft.first_move_fig_status = 2; - }); - }else{ - update_step_show_data((draft) => { - draft.second_move_complete_status = 1; - draft.second_move_fig_status = 2; - }); - } - set_current_discription('望远镜稳定完成'); - break; - } - case (19): { // step 19: first exposure solve failed - update_step_show_data((draft) => { - draft.first_exposure_complete_status = -1; - draft.first_exposure_fig_status = 4; - }); - set_current_discription('第一次曝光解析失败,终止流程'); - break; - } - case (2): { // step 2: start second exposure - set_first_move(false); - update_step_show_data((draft) => { - draft.second_exposure_complete_status = 0; - draft.second_exposure_fig_status = 1; - }); - set_current_discription('开始第二次曝光'); - break; - } - case (21): { // step 21: exposure and solve finished - update_step_show_data((draft) => { - draft.second_exposure_complete_status = 1; - draft.second_exposure_fig_status = 2; - }); - set_current_discription('第二张曝光解析完成'); - update_solved_ra_dec((draft) => { - draft[1] = { - ra: props.incoming_data.ra, - dec: props.incoming_data.dec, - } - }) - break; - } - case (25): { // step 25: starttelescope move - update_step_show_data((draft) => { - draft.second_move_complete_status = 0; - draft.second_move_fig_status = 1; - }); - set_current_discription('移动望远镜中'); - break; - } - case (26): { // step 26: move finished - set_current_discription('等待望远镜稳定中'); - break; - } - case (27): { // step 27: settle finished - update_step_show_data((draft) => { - draft.second_move_complete_status = 1; - draft.second_move_fig_status = 2; - }); - set_current_discription('望远镜稳定完成'); - break; - } - case (29): { // step 29: second exposure solve failed - update_step_show_data((draft) => { - draft.second_exposure_complete_status = -1; - draft.second_exposure_fig_status = 4; - }); - set_current_discription('第二次曝光解析失败,终止流程'); - break; - } - case (3): { // step 3: start thrid exposure - update_step_show_data((draft) => { - draft.third_exposure_complete_status = 0; - draft.third_exposure_fig_status = 1; - }); - set_current_discription('开始第三次曝光'); - break; - } - case (31): { // step 31: exposure and solve finished - update_step_show_data((draft) => { - draft.third_exposure_complete_status = 1; - draft.third_exposure_fig_status = 2; - }); - set_current_discription('第三张曝光解析完成'); - update_solved_ra_dec((draft) => { - draft[2] = { - ra: props.incoming_data.ra, - dec: props.incoming_data.dec, - } - }); - set_current_ra_dec({ - ra: props.incoming_data.ra, - dec: props.incoming_data.dec, - }); - break; - } - case (38): { // step 38: error calculation finished - set_measure_finished(true); - set_east_west_angle(props.incoming_data.east_west_move); - set_up_down_angle(props.incoming_data.up_down_move); - set_target_ra_dec({ - ra: props.incoming_data.target_ra, - dec: props.incoming_data.target_dec - }); - break; - } - case (39): { // step 39: third exposure solve failed - update_step_show_data((draft) => { - draft.third_exposure_complete_status = -1; - draft.third_exposure_fig_status = 4; - }); - set_current_discription('第三次曝光解析失败,终止流程'); - break; - } - case (4): { // step 4: update exposure start - set_measure_finished(true); - update_step_show_data((draft) => { - draft.update_exposure_complete_status = 0; - draft.update_exposure_fig_status = 1; - }); - set_current_discription('开始修正极轴曝光'); - break; - } - case (41): { // step 41: update exposure and solved finished - set_measure_finished(true); - update_step_show_data((draft) => { - draft.update_exposure_complete_status = 1; - draft.update_exposure_fig_status = 2; - }); - set_current_discription('修正极轴曝光解析完成'); - update_solved_ra_dec((draft) => { - draft[3] = { - ra: props.incoming_data.ra, - dec: props.incoming_data.dec, - } - }); - set_target_ra_dec({ - ra: props.incoming_data.target_ra, - dec: props.incoming_data.target_dec - }); - break; - } - case (42): { // step 42: update exposure new error calculated - set_measure_finished(true); - set_east_west_angle(props.incoming_data.east_west_move); - set_up_down_angle(props.incoming_data.up_down_move); - break; - } - case (49): { // step 49: update exposure solve failed - update_step_show_data((draft) => { - draft.update_exposure_complete_status = -1; - draft.update_exposure_fig_status = 4; - }); - set_current_discription('修正极轴曝光解析失败等待中'); - break; - } - case (99): { // update timeout - break; - } - default: { - break; - } + // use effect + React.useEffect(() => { + switch (props.current_step) { + case -1: { + set_measure_finished(false); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail + draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 0; + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 0; + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 0; + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 0; + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 0; + }); + update_solved_ra_dec((draft) => { + draft = [null, null, null, null]; + }); + set_current_discription("等待启动"); + break; + } + case 91: { + set_measure_finished(false); + set_first_move(true); + break; + } + case 0: { + set_measure_finished(false); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; // 0 for normal, 1 for complete, -1 for fail + draft.first_exposure_fig_status = 0; // 0 for waiting, 1 for in progress, 2 for finished, 4 for failed + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 0; + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 0; + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 0; + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 0; + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 0; + }); + update_solved_ra_dec((draft) => { + draft = [null, null, null, null]; + }); + set_first_move(true); + set_current_discription("初始化设置完成"); + break; + } + case 1: { + // step 1: start exposure + set_first_move(true); + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 0; + draft.first_exposure_fig_status = 1; + }); + set_current_discription("开始第一次曝光"); + break; + } + case 11: { + // step 11: exposure and solve finished + update_step_show_data((draft) => { + draft.first_exposure_complete_status = 1; + draft.first_exposure_fig_status = 2; + }); + set_current_discription("第一张曝光解析完成"); + update_solved_ra_dec((draft) => { + draft[0] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }; + }); + break; + } + case 15: { + // step 15: starttelescope move + if (first_move) { + update_step_show_data((draft) => { + draft.first_move_complete_status = 0; + draft.first_move_fig_status = 1; + }); + } else { + update_step_show_data((draft) => { + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 1; + }); } - }, [props.current_step]) - + set_current_discription("移动望远镜中"); + break; + } + case 16: { + // step 16: move finished + if (first_move) { + update_step_show_data((draft) => { + draft.first_move_complete_status = 1; + draft.first_move_fig_status = 1; + }); + } else { + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 1; + }); + } + set_current_discription("等待望远镜稳定中"); + break; + } + case 17: { + // step 17: settle finished + if (first_move) { + update_step_show_data((draft) => { + draft.first_move_complete_status = 1; + draft.first_move_fig_status = 2; + }); + } else { + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 2; + }); + } + set_current_discription("望远镜稳定完成"); + break; + } + case 19: { + // step 19: first exposure solve failed + update_step_show_data((draft) => { + draft.first_exposure_complete_status = -1; + draft.first_exposure_fig_status = 4; + }); + set_current_discription("第一次曝光解析失败,终止流程"); + break; + } + case 2: { + // step 2: start second exposure + set_first_move(false); + update_step_show_data((draft) => { + draft.second_exposure_complete_status = 0; + draft.second_exposure_fig_status = 1; + }); + set_current_discription("开始第二次曝光"); + break; + } + case 21: { + // step 21: exposure and solve finished + update_step_show_data((draft) => { + draft.second_exposure_complete_status = 1; + draft.second_exposure_fig_status = 2; + }); + set_current_discription("第二张曝光解析完成"); + update_solved_ra_dec((draft) => { + draft[1] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }; + }); + break; + } + case 25: { + // step 25: starttelescope move + update_step_show_data((draft) => { + draft.second_move_complete_status = 0; + draft.second_move_fig_status = 1; + }); + set_current_discription("移动望远镜中"); + break; + } + case 26: { + // step 26: move finished + set_current_discription("等待望远镜稳定中"); + break; + } + case 27: { + // step 27: settle finished + update_step_show_data((draft) => { + draft.second_move_complete_status = 1; + draft.second_move_fig_status = 2; + }); + set_current_discription("望远镜稳定完成"); + break; + } + case 29: { + // step 29: second exposure solve failed + update_step_show_data((draft) => { + draft.second_exposure_complete_status = -1; + draft.second_exposure_fig_status = 4; + }); + set_current_discription("第二次曝光解析失败,终止流程"); + break; + } + case 3: { + // step 3: start thrid exposure + update_step_show_data((draft) => { + draft.third_exposure_complete_status = 0; + draft.third_exposure_fig_status = 1; + }); + set_current_discription("开始第三次曝光"); + break; + } + case 31: { + // step 31: exposure and solve finished + update_step_show_data((draft) => { + draft.third_exposure_complete_status = 1; + draft.third_exposure_fig_status = 2; + }); + set_current_discription("第三张曝光解析完成"); + update_solved_ra_dec((draft) => { + draft[2] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }; + }); + set_current_ra_dec({ + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }); + break; + } + case 38: { + // step 38: error calculation finished + set_measure_finished(true); + set_east_west_angle(props.incoming_data.east_west_move); + set_up_down_angle(props.incoming_data.up_down_move); + set_target_ra_dec({ + ra: props.incoming_data.target_ra, + dec: props.incoming_data.target_dec, + }); + break; + } + case 39: { + // step 39: third exposure solve failed + update_step_show_data((draft) => { + draft.third_exposure_complete_status = -1; + draft.third_exposure_fig_status = 4; + }); + set_current_discription("第三次曝光解析失败,终止流程"); + break; + } + case 4: { + // step 4: update exposure start + set_measure_finished(true); + update_step_show_data((draft) => { + draft.update_exposure_complete_status = 0; + draft.update_exposure_fig_status = 1; + }); + set_current_discription("开始修正极轴曝光"); + break; + } + case 41: { + // step 41: update exposure and solved finished + set_measure_finished(true); + update_step_show_data((draft) => { + draft.update_exposure_complete_status = 1; + draft.update_exposure_fig_status = 2; + }); + set_current_discription("修正极轴曝光解析完成"); + update_solved_ra_dec((draft) => { + draft[3] = { + ra: props.incoming_data.ra, + dec: props.incoming_data.dec, + }; + }); + set_target_ra_dec({ + ra: props.incoming_data.target_ra, + dec: props.incoming_data.target_dec, + }); + break; + } + case 42: { + // step 42: update exposure new error calculated + set_measure_finished(true); + set_east_west_angle(props.incoming_data.east_west_move); + set_up_down_angle(props.incoming_data.up_down_move); + break; + } + case 49: { + // step 49: update exposure solve failed + update_step_show_data((draft) => { + draft.update_exposure_complete_status = -1; + draft.update_exposure_fig_status = 4; + }); + set_current_discription("修正极轴曝光解析失败等待中"); + break; + } + case 99: { + // update timeout + break; + } + default: { + break; + } + } + }, [props.current_step]); - return ( - - { - (measure_finished)? - ( - <> - - - - - - - } - > - 停止 - - - 单次对极轴的时间不建议超过5分钟。
- 粗对之后再重启一次流程会更准。
-
-
-
-
- - ): - ( - - + return ( + + {measure_finished ? ( + <> + + + + +
+ +
停止
+
+
+ 单次对极轴的时间不建议超过5分钟。
+ 粗对之后再重启一次流程会更准。
+
+
+
+ + ) : ( + + - + - + - + - - - - - - } - >计算误差 + -
- ) - } - -
- ) -} + +
+ +
计算误差
+
+
+ + )} + + ); +}; -export default ThreePointStepper; \ No newline at end of file +export default ThreePointStepper; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx index 6de4237b..244590c7 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/CameraControl.tsx @@ -1,10 +1,18 @@ import * as React from "react"; import { useEchoWebSocket } from "../../../../utils/websocketProvider"; -import { Card, Form, Button, Stack, Row, Col } from "react-bootstrap"; +import { + Card, + Form, + Button, + Stack, + Row, + Col, + Container, +} from "react-bootstrap"; import { ArrowUp, ArrowRight, - SnowflakeFill, + CloudSnow, Grid3x3GapFill, } from "react-bootstrap-icons"; @@ -72,220 +80,222 @@ const DeviceCameraSimpleControlPanel: React.FC = () => { }, []); return ( - - - - {cool_status ? ( - 制冷中 - ) : ( - 未制冷 - )} - { - set_cool_status(event.target.checked); - if (event.target.checked) { - sendMessage( - JSON.stringify({ - device_name: "camera", - instruction: "start_cool_camera", - params: [], - }) - ); - } else { - sendMessage( - JSON.stringify({ - device_name: "camera", - instruction: "stop_cool_camera", - params: [], - }) - ); - } - }} - label="开关冷冻" - /> - - - - 相机温度 - - - {camera_temperature < 0 ? ( - {camera_temperature} ℃ + + + + + {cool_status ? ( + 制冷中 ) : ( - {camera_temperature} ℃ + 未制冷 )} - - - - - - 修改冷冻目标温度 ℃ - - set_input_target_temperature(event.target.value) + { + set_cool_status(event.target.checked); + if (event.target.checked) { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "start_cool_camera", + params: [], + }) + ); + } else { + sendMessage( + JSON.stringify({ + device_name: "camera", + instruction: "stop_cool_camera", + params: [], + }) + ); } - /> - - - - - - - 当前增益gain - - - {gain} - - - - - - 修改增益 - set_input_gain(event.target.value)} - /> - - - - - - - 当前偏置值offset - - - {offset} - - - - - - 修改偏置值 - set_input_offset(event.target.value)} - /> - - - - - - - 当前binning - - - {binning} - - - - - - 修改binning值 - { - let real_binning = parseInt(event.target.value); - if (real_binning > 4) { - real_binning = 4; - } - if (real_binning == 3) { - real_binning = 4; - } - if (real_binning < 1) { - real_binning = 1; - } - set_input_binning(String(real_binning)); - }} - /> - - - - - - + /> + + + + + + + 当前增益gain + + + {gain} + + + + + + 修改增益 + set_input_gain(event.target.value)} + /> + + + + + + + 当前偏置值offset + + + {offset} + + + + + + 修改偏置值 + set_input_offset(event.target.value)} + /> + + + + + + + 当前binning + + + {binning} + + + + + + 修改binning值 + { + let real_binning = parseInt(event.target.value); + if (real_binning > 4) { + real_binning = 4; + } + if (real_binning == 3) { + real_binning = 4; + } + if (real_binning < 1) { + real_binning = 1; + } + set_input_binning(String(real_binning)); + }} + /> + + + + + + + ); }; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx index 8f2039d9..520f421a 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/FocuserControl.tsx @@ -8,7 +8,7 @@ import { ArrowRightSquareFill, CursorFill, } from "react-bootstrap-icons"; -import HelperSnackbar from "@/pages/DeviceControl/Description/HelperSnackbar"; +import HelperSnackbar from '../../../device/description/helper_snackbar' const DeviceFocuserSimpleControlPanel: React.FC = () => { const [current_step, set_current_step] = React.useState(0); diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx index bb769d43..c42af8a5 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/controls/TelescopeControl.tsx @@ -8,7 +8,7 @@ import { Button, Modal, } from "react-bootstrap"; -import { Gear, ArrowClockwise, XLg, Settings } from "react-bootstrap-icons"; +import { Gear, ArrowClockwise, XLg } from "react-bootstrap-icons"; import { useEchoWebSocket } from "../../../../utils/websocketProvider"; import SquareButton from "../../../device/SquareButton"; @@ -175,18 +175,18 @@ const DeviceTelescopeSimpleControlPanel: React.FC = () => { }; return ( - - - + + + {fix_time_selection ? (

{ style={{ width: "100%" }} onClick={() => set_setting_open(true)} > - 设置 + 设置 @@ -324,63 +324,65 @@ const DeviceTelescopeSimpleControlPanel: React.FC = () => { - - set_setting_open(false)}> - - 赤道仪手控器参数设置 - - - - 设置赤道仪移动速率 - set_selected_slew_speed(event.target.value)} - > - {slew_speed_selections.map((one_slew_selection, index) => ( - - ))} - - - - { - if (!arrow_in_action) { - set_fix_time_selection(event.target.checked); - } - }} - label={fix_time_selection ? "固定时间模式" : "模拟手柄模式"} - /> - - {fix_time_selection && ( - - 选择手动移动时长(s) + set_setting_open(false)}> + + 赤道仪手控器参数设置 + + + + 设置赤道仪移动速率 set_moving_time(event.target.value)} + value={selected_slew_speed} + onChange={(event) => + set_selected_slew_speed(event.target.value) + } > - {time_selections.map((one_time_select, index) => ( - ))} - )} - - - - - - + + { + if (!arrow_in_action) { + set_fix_time_selection(event.target.checked); + } + }} + label={fix_time_selection ? "固定时间模式" : "模拟手柄模式"} + /> + + {fix_time_selection && ( + + 选择手动移动时长(s) + set_moving_time(event.target.value)} + > + {time_selections.map((one_time_select, index) => ( + + ))} + + + )} + + + + + + + ); }; diff --git a/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx index 947e5d85..70e4de37 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/actions/shoot/index.tsx @@ -1,8 +1,8 @@ import * as React from "react"; import { Button, ButtonGroup } from "react-bootstrap"; import { - AccessTime, - RadioCircle, + ClockFill, + Radioactive, GraphUp, Gear, StopFill, @@ -17,7 +17,8 @@ import { ListGroup } from "react-bootstrap"; import { Toast, ToastContainer } from "react-bootstrap"; import "./style.less"; -import { ReactComponent as CameraShootSVG } from "../../icons/console/camera_shoot.svg"; +import { ReactSVG } from "react-svg"; + import { useEchoWebSocket } from "../../../../utils/websocketProvider"; const Shoot = () => { @@ -213,9 +214,13 @@ const Shoot = () => { top: "50%", }} > - { + svg.classList.add("svg-class-name"); + svg.setAttribute("style", "width: 24px"); + svg.setAttribute("style", "height: 24px"); + }} + src="../../../../icons/console/camera_shoot.svg" /> ) @@ -237,7 +242,7 @@ const Shoot = () => { )}
{loop ? ( @@ -302,7 +307,7 @@ const Shoot = () => { overlay={星点数据} > { - // state - const state = GlobalStore.useAppState(state=>state.console); - - const graph = React.useRef(null); - - const container = React.useRef(null); - - // store - const process_data = GlobalStore.useAppState((state) => state.ProcessDataSaveStore); - - const handleMsg = React.useCallback((msg:any)=>{ - // console.log(msg); - },[]) - - const {removeListener} = useEchoWebSocket(handleMsg); - - React.useEffect(()=>{ - return ()=>removeListener(handleMsg); - },[]) - - const toggleDrawer = ()=>{ - GlobalStore.actions.console.setState({ - drawerVisible: false - }) - } - - const Handler = Registry._registry.get(state.menu) as React.FC; - const ICONHandler = Registry._registry_icon.get(state.menu) as React.FC; - - return ( - <> - { - (process_data.show_camera == 0)? - (): - () - } -
- - - - - -
- -
-
-
+import DeviceCameraSimpleControlPanel from "./actions/controls/CameraControl"; +import DeviceTelescopeSimpleControlPanel from "./actions/controls/TelescopeControl"; +import DeviceFocuserSimpleControlPanel from "./actions/controls/FocuserControl"; +import DeviceFilterSimpleControlPanel from "./actions/controls/FilterControl"; +import DeviceGuiderSimpleControlPanel from "./actions/controls/GuiderControl"; +import DevicePHD2SimpleControlPanel from "./actions/controls/Phd2Control"; + +Registry.addComponent("shoot", Shoot, Camera); +Registry.addComponent("star", Light, Magic); +Registry.addComponent("align", Align, Map); +Registry.addComponent("autofocus", Autofocus, Bullseye); + +Registry.addComponent("camera", DeviceCameraSimpleControlPanel); +Registry.addComponent("telescope", DeviceTelescopeSimpleControlPanel, Star); +Registry.addComponent("focuser", DeviceFocuserSimpleControlPanel); +Registry.addComponent("filter", DeviceFilterSimpleControlPanel, PaintBucket); +Registry.addComponent("phd2", DevicePHD2SimpleControlPanel, Rulers); + +const Console = () => { + // state + const state = GlobalStore.useAppState((state) => state.console); + + const graph = React.useRef(null); + + const container = React.useRef(null); + + // store + const process_data = GlobalStore.useAppState( + (state) => state.ProcessDataSaveStore + ); + + const handleMsg = React.useCallback((msg: any) => { + // console.log(msg); + }, []); + + const { removeListener } = useEchoWebSocket(handleMsg); + + React.useEffect(() => { + return () => removeListener(handleMsg); + }, []); + + const toggleDrawer = () => { + GlobalStore.actions.console.setState({ + drawerVisible: false, + }); + }; + + const Handler = Registry._registry.get(state.menu) as React.FC; + const ICONHandler = Registry._registry_icon.get(state.menu) as React.FC; + + return ( + <> + {process_data.show_camera == 0 ? ( + + ) : ( + + )} +
+ + + + +
+
- - ) -} - -export default Console; \ No newline at end of file +
+
+
+ + ); +}; + +export default Console; diff --git a/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx b/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx index e65c37e7..42045aa9 100644 --- a/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx +++ b/websrc/cobalt-web/src/pages/dashboard2/registry/index.tsx @@ -1,38 +1,38 @@ import * as React from "react"; import { Android } from "react-bootstrap-icons"; +import { IconProps } from "react-bootstrap-icons"; class Registry { static _registry: Map = new Map(); - static _registry_icon: Map = new Map(); + static _registry_icon: Map> = new Map(); static addComponent = ( id: string, component: React.FC, - Icon: React.FC | null = null + Icon: React.FC | null = null ) => { this._registry.set(id, component); if (Icon === null) { - this._registry_icon.set(id, () => ); + this._registry_icon.set(id, (props: IconProps) => ); } else { - this._registry_icon.set(id, () => { - return ( -
- {React.createElement(Icon, { - style: { width: "100%", height: "100%" }, - fill: "#fff", - })} -
- ); - }); + this._registry_icon.set(id, Icon); } }; + static getComponent = (id: string) => this._registry.get(id); static getMenus = () => { return Array.from(this._registry.keys()).map((id) => ({ id, displayName: this._registry.get(id)?.displayName, - icon: this._registry_icon.get(id) as React.FC, + icon: (props: IconProps) => { + const Icon = this._registry_icon.get(id); + return ( +
+ +
+ ); + }, })); }; } diff --git a/websrc/cobalt-web/src/pages/device/description/helper_snackbar.tsx b/websrc/cobalt-web/src/pages/device/description/helper_snackbar.tsx index ec76e70a..7edfd7a5 100644 --- a/websrc/cobalt-web/src/pages/device/description/helper_snackbar.tsx +++ b/websrc/cobalt-web/src/pages/device/description/helper_snackbar.tsx @@ -1,39 +1,49 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { Container, Row, Col, Button, Toast } from 'react-bootstrap'; -import { Link, Line } from 'react-bootstrap-icons'; +import * as React from "react"; +import { Toast, ToastContainer } from "react-bootstrap"; +import { XCircle } from "react-bootstrap-icons"; interface HelperSnackbarProps { help_text: string; close_signal: boolean; } -const HelperSnackbar = React.forwardRef(function HelperSnackbar(props: HelperSnackbarProps, ref) { - const { t } = useTranslation(); - const [show, setShow] = React.useState(false); +const HelperSnackbar: React.ForwardRefRenderFunction< + HelperHandle, + HelperSnackbarProps +> = (props, ref) => { + const [open_snackbar, setOpen_snackbar] = React.useState(false); - const handleClose = () => setShow(false); + const handleSnackbarClose = () => { + setOpen_snackbar(false); + }; React.useImperativeHandle(ref, () => ({ - openSnackbar() { - setShow(true); - } + open_snackbar() { + setOpen_snackbar(true); + }, })); React.useEffect(() => { if (props.close_signal) { - setShow(false); + setOpen_snackbar(false); } }, [props.close_signal]); return ( - - - {t('title')} - - {props.help_text} - + + + + {props.help_text} + + + + ); -}); +}; -export default HelperSnackbar; +export default React.forwardRef(HelperSnackbar); diff --git a/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx b/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx index f1321e28..b6bdc86e 100644 --- a/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx +++ b/websrc/cobalt-web/src/pages/skymap/object_search_dialog.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef } from "react"; import { Modal, Button } from "react-bootstrap"; import ObjectSearch from "./object_search"; -import { XCricle } from "react-bootstrap-icons"; +import { XCircle } from "react-bootstrap-icons"; import { ArrowUpCircle } from "react-bootstrap-icons"; interface ObjectSearchDialogProps { @@ -33,7 +33,7 @@ const ObjectSearchDialog: React.FC = (props) => { diff --git a/websrc/cobalt-web/src/routes/root.tsx b/websrc/cobalt-web/src/routes/root.tsx index b1fe6f44..65510c20 100644 --- a/websrc/cobalt-web/src/routes/root.tsx +++ b/websrc/cobalt-web/src/routes/root.tsx @@ -32,6 +32,7 @@ import ErrorPage from "../pages/error"; import ObjectFinding from "../pages/skymap"; import Dashboard from "../pages/dashboard/index"; import PAAIndexPage from "../pages/sequence" +import Console from "../pages/dashboard2/index"; //import Test from "../pages/test/test"; interface IndexRouteObjectPlus extends IndexRouteObject { @@ -152,6 +153,12 @@ export const routesConfig: RouteObjectPlus[] = [ title: "错误", icon: , }, + { + path: "/console", + element: , + title: "控制台", + icon: , + }, //{ // path: "/test", // element: , diff --git a/websrc/cobalt-web/src/store/GlobalParameterStore.tsx b/websrc/cobalt-web/src/store/GlobalParameterStore.tsx index 856356b2..41605b09 100644 --- a/websrc/cobalt-web/src/store/GlobalParameterStore.tsx +++ b/websrc/cobalt-web/src/store/GlobalParameterStore.tsx @@ -22,6 +22,16 @@ export interface IGLobalParametersModels { IGLobalParametersModels, IGPFilterSelection[] >; + + // for phone side local storage + ui_setting: IGPManualHelpSetting; + initial_ui_setting: Action; + load_ui_setting: Action; + save_ui_setting: Action; + set_ui_setting: Action< + IGLobalParametersModels, + Partial + >; } export const GlobalParameterStore = (): IGLobalParametersModels => ({ @@ -136,4 +146,32 @@ export const GlobalParameterStore = (): IGLobalParametersModels => ({ return ret_struct; } }), + + // ui setting part + ui_setting: { + show_three_point_help: true, + }, + initial_ui_setting: action((state) => { + state.ui_setting = { + show_three_point_help: true, + }; + }), + load_ui_setting: action((state) => { + let loaded_ui_setting_string = localStorage.getItem("UISetting"); + if (loaded_ui_setting_string != null) { + let loaded_ui_setting = JSON.parse( + loaded_ui_setting_string + ) as Partial; + state.ui_setting = Object.assign({}, state.ui_setting, { + ...loaded_ui_setting, + }); + } + }), + save_ui_setting: action((state) => { + localStorage.setItem("UISetting", JSON.stringify(state.ui_setting)); + }), + set_ui_setting: action((state, payload) => { + state.ui_setting = Object.assign({}, state.ui_setting, { ...payload }); + localStorage.setItem("UISetting", JSON.stringify(state.ui_setting)); + }), }); diff --git a/websrc/cobalt-web/src/store/PAAModel.ts b/websrc/cobalt-web/src/store/PAAModel.ts index 28233b4b..5bf5aff7 100644 --- a/websrc/cobalt-web/src/store/PAAModel.ts +++ b/websrc/cobalt-web/src/store/PAAModel.ts @@ -76,6 +76,7 @@ export interface PAAModel { // modified by gao can_start_paa: boolean; // 表示是否具备启动paa的状态。 paa_in_progress: boolean; // 表示是否有一个paa进程在运行 + // 如果有相机在单独拍摄,但是没有paa在运行,can start paa也会是false。也就是说,即使没有paa在运行,也存在可能没法启动paa。 check_PAA_start_status: Thunk; // 这个函数就是用来专门刷新上面两个边练改的。 change_paa_loop_step: Action; @@ -143,8 +144,9 @@ export const getPAAModel = (): PAAModel => ({ }; const res = await postPAAGenerate(props); // todo, 需要修改成当前脚本就是刚刚生成的 + // 记得后续修改回原来的版本, all_step_data = res.data.script state.setState({ - all_step_data: res.data.script, + all_step_data: res.data, this_script_type: res.data.type, this_script_setting: res.data.setting, }); @@ -166,10 +168,6 @@ export const getPAAModel = (): PAAModel => ({ this_script_type: res.data.type, this_script_setting: res.data.setting, }); - // state.setState({ - // setting_mode: 1, - // current_script_info: getState().all_script_info.find((item) => item.file_name == payload.file_name) - // }) } }), // todo modifed need test @@ -200,7 +198,7 @@ export const getPAAModel = (): PAAModel => ({ state.setState({ current_script_info: payload, setting_mode: 1, - all_step_data: res.data.script, + all_step_data: res.data, this_script_type: res.data.type, this_script_setting: res.data.setting, }); diff --git a/websrc/lithium-web/package-lock.json b/websrc/lithium-web/package-lock.json index 71641a5e..c87871b6 100644 --- a/websrc/lithium-web/package-lock.json +++ b/websrc/lithium-web/package-lock.json @@ -29,9 +29,9 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.7.0.tgz", - "integrity": "sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.7.1.tgz", + "integrity": "sha512-/POejAYuj8WEw7ZI0J8JBvevjfp9jQ9Wmu/Bg52RiNwGXkMV7JnYpsenVfHvvf1G7R5sXHGKlTcxlQWhoUTiGQ==" }, "node_modules/@astrojs/internal-helpers": { "version": "0.2.1", @@ -61,11 +61,11 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-4.3.2.tgz", - "integrity": "sha512-4Oa4VaYiBd0MatB+rWIU/0A8pZH/sK3c2QkRYb+OO2lPl+qzevJtWaZY8hAQc4qurIOlRdn6B6ofDAGhWw+DSg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.1.0.tgz", + "integrity": "sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==", "dependencies": { - "@astrojs/prism": "^3.0.0", + "@astrojs/prism": "^3.1.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.0", "hast-util-to-text": "^4.0.0", @@ -85,6 +85,17 @@ "vfile": "^6.0.1" } }, + "node_modules/@astrojs/markdown-remark/node_modules/@astrojs/prism": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", + "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, "node_modules/@astrojs/node": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-8.2.5.tgz", @@ -109,43 +120,29 @@ } }, "node_modules/@astrojs/sitemap": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.2.tgz", - "integrity": "sha512-FxOJldIl5ltZ5CNjocQxHkAO9orwHBjqtaU28o4smobp9vowS0nbGp+I9CrPxkzWdl1crSDm9vjL9tnvG1DSug==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.3.tgz", + "integrity": "sha512-9WB5c071L+FNbs/0727lcqbHvS17TxnDRdfXXiAMustBRFlqkCrziHy+MsfeghxtyXp0pFTFO3NjGRfOppbFzQ==", "dependencies": { "sitemap": "^7.1.1", "zod": "^3.22.4" } }, "node_modules/@astrojs/telemetry": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz", - "integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", "dependencies": { - "ci-info": "^3.8.0", + "ci-info": "^4.0.0", "debug": "^4.3.4", "dlv": "^1.1.3", - "dset": "^3.1.2", + "dset": "^3.1.3", "is-docker": "^3.0.0", "is-wsl": "^3.0.0", "which-pm-runs": "^1.1.0" }, "engines": { - "node": ">=18.14.1" - } - }, - "node_modules/@astrojs/telemetry/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } }, "node_modules/@babel/code-frame": { @@ -161,25 +158,25 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -206,9 +203,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -368,9 +365,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", @@ -395,9 +392,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -936,9 +933,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", "cpu": [ "arm" ], @@ -948,9 +945,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", "cpu": [ "arm64" ], @@ -960,9 +957,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", "cpu": [ "arm64" ], @@ -972,9 +969,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", "cpu": [ "x64" ], @@ -984,9 +981,21 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", "cpu": [ "arm" ], @@ -996,9 +1005,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", "cpu": [ "arm64" ], @@ -1008,9 +1017,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", "cpu": [ "arm64" ], @@ -1020,11 +1029,11 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", "cpu": [ - "ppc64le" + "ppc64" ], "optional": true, "os": [ @@ -1032,9 +1041,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", "cpu": [ "riscv64" ], @@ -1044,9 +1053,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", "cpu": [ "s390x" ], @@ -1056,9 +1065,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", "cpu": [ "x64" ], @@ -1068,9 +1077,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", "cpu": [ "x64" ], @@ -1080,9 +1089,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", "cpu": [ "arm64" ], @@ -1092,9 +1101,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", "cpu": [ "ia32" ], @@ -1104,9 +1113,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", "cpu": [ "x64" ], @@ -1116,9 +1125,9 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.1.tgz", - "integrity": "sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.3.0.tgz", + "integrity": "sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -1157,6 +1166,11 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/cookie": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", + "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -1227,9 +1241,9 @@ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -1370,14 +1384,14 @@ } }, "node_modules/astro": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.5.12.tgz", - "integrity": "sha512-xIJcFI2hbyV8+h5pWjL7SKD1jIP0K01fYVAH+gdAt0mJaXy+u8Mj+goD0cPlK6sEaykR+7zxQLYGKJ44U4qarg==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.6.2.tgz", + "integrity": "sha512-Kl+Wd7MJMQFnI3+V0JxF4HPbs8M67eltqQgtztReOwDLSl0VnOd39rM61W/3LEh10FZ0F13xrDgtdgfXzuLVbg==", "dependencies": { - "@astrojs/compiler": "^2.7.0", + "@astrojs/compiler": "^2.7.1", "@astrojs/internal-helpers": "0.4.0", - "@astrojs/markdown-remark": "4.3.2", - "@astrojs/telemetry": "3.0.4", + "@astrojs/markdown-remark": "5.1.0", + "@astrojs/telemetry": "3.1.0", "@babel/core": "^7.24.3", "@babel/generator": "^7.23.3", "@babel/parser": "^7.23.3", @@ -1385,6 +1399,7 @@ "@babel/traverse": "^7.23.3", "@babel/types": "^7.23.3", "@types/babel__core": "^7.20.4", + "@types/cookie": "^0.5.4", "acorn": "^8.11.2", "aria-query": "^5.3.0", "axobject-query": "^4.0.0", @@ -1441,8 +1456,9 @@ "astro": "astro.js" }, "engines": { - "node": ">=18.14.1", - "npm": ">=6.14.0" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, "optionalDependencies": { "sharp": "^0.32.6" @@ -1488,13 +1504,12 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.2.tgz", - "integrity": "sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.3.tgz", + "integrity": "sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==", "optional": true, "dependencies": { "bare-events": "^2.0.0", - "bare-os": "^2.0.0", "bare-path": "^2.0.0", "streamx": "^2.13.0" } @@ -1506,9 +1521,9 @@ "optional": true }, "node_modules/bare-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", - "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.1.tgz", + "integrity": "sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==", "optional": true, "dependencies": { "bare-os": "^2.1.0" @@ -1689,9 +1704,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001611", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz", + "integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==", "funding": [ { "type": "opencollective", @@ -2145,9 +2160,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.721", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.721.tgz", - "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==" + "version": "1.4.740", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.740.tgz", + "integrity": "sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==" }, "node_modules/emoji-regex": { "version": "10.3.0", @@ -2635,9 +2650,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", - "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz", + "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -2676,9 +2691,9 @@ } }, "node_modules/hast-util-to-text": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", - "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -3150,14 +3165,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/markdown-table": { @@ -3889,9 +3901,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -4041,9 +4053,9 @@ } }, "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "version": "3.59.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz", + "integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==", "optional": true, "dependencies": { "semver": "^7.3.5" @@ -4313,9 +4325,9 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" }, "node_modules/picocolors": { "version": "1.0.0", @@ -4571,9 +4583,9 @@ } }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5211,9 +5223,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", "dependencies": { "@types/estree": "1.0.5" }, @@ -5225,21 +5237,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", "fsevents": "~2.3.2" } }, @@ -5436,11 +5449,11 @@ } }, "node_modules/shiki": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.1.tgz", - "integrity": "sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.3.0.tgz", + "integrity": "sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==", "dependencies": { - "@shikijs/core": "1.2.1" + "@shikijs/core": "1.3.0" } }, "node_modules/signal-exit": { @@ -5618,9 +5631,9 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -6045,9 +6058,9 @@ } }, "node_modules/vite": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", - "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", + "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", From 30977511cf9a55b345cde393d668dcb825e4e3da Mon Sep 17 00:00:00 2001 From: Max Qian Date: Thu, 18 Apr 2024 21:10:41 +0800 Subject: [PATCH 17/28] module update preparation --- src/addon/compiler.cpp | 431 ++++-------------- src/addon/compiler.hpp | 156 ++----- src/addon/sandbox.cpp | 178 +++----- src/addon/sandbox.hpp | 75 +-- src/atom/server/CMakeLists.txt | 4 +- src/atom/server/commander.hpp | 2 +- .../{commander_impl.hpp => commander.inl} | 6 +- src/atom/server/eventstack.hpp | 109 +++-- src/atom/server/eventstack.inl | 176 +++++++ src/atom/server/eventstack_impl.hpp | 120 ----- src/atom/utils/convert.cpp | 69 +++ src/atom/utils/convert.hpp | 82 ++++ src/utils/constant.hpp | 33 ++ 13 files changed, 681 insertions(+), 760 deletions(-) rename src/atom/server/{commander_impl.hpp => commander.inl} (98%) create mode 100644 src/atom/server/eventstack.inl delete mode 100644 src/atom/server/eventstack_impl.hpp create mode 100644 src/atom/utils/convert.cpp create mode 100644 src/atom/utils/convert.hpp diff --git a/src/addon/compiler.cpp b/src/addon/compiler.cpp index 336ee903..6840addc 100644 --- a/src/addon/compiler.cpp +++ b/src/addon/compiler.cpp @@ -14,403 +14,160 @@ Description: Compiler #include "compiler.hpp" -#include -#include +#include "utils/constant.hpp" + #include #include -#include +#include #include "atom/log/loguru.hpp" #include "atom/type/json.hpp" using json = nlohmann::json; namespace fs = std::filesystem; -#ifdef _WIN32 -#include -#define COMPILER "cl.exe" -#define CMD_PREFIX "" -#define CMD_SUFFIX ".dll" -#elif __APPLE__ -#include -#define COMPILER "clang++" -#define CMD_PREFIX "lib" -#define CMD_SUFFIX ".dylib" -#else -#include -#define COMPILER "g++" -#define CMD_PREFIX "lib" -#define CMD_SUFFIX ".so" -#endif - namespace Lithium { -bool Compiler::CompileToSharedLibraryAllinOne(const std::string &code, - const std::string &moduleName, - const std::string &functionName) { - DLOG_F(INFO, "Compiling module {}::{}...", moduleName, functionName); +bool Compiler::compileToSharedLibrary(std::string_view code, + std::string_view moduleName, + std::string_view functionName, + std::string_view optionsFile) { + LOG_F(INFO, "Compiling module {}::{}...", moduleName, functionName); - // 参数校验 if (code.empty() || moduleName.empty() || functionName.empty()) { LOG_F(ERROR, "Invalid parameters."); return false; } - // Check if the module is already compiled and cached - auto cachedResult = cache_.find(moduleName + "::" + functionName); - if (cachedResult != cache_.end()) { - DLOG_F(WARNING, - "Module {}::{} is already compiled, returning cached result.", - moduleName, functionName); - return true; - } - - // Create output directory if it does not exist - const std::string outputDir = "atom/global/"; - if (!fs::exists(outputDir)) { - DLOG_F(WARNING, "Output directory does not exist, creating it: {}", - outputDir); - try { - fs::create_directories(outputDir); - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to create output directory: {}", e.what()); - return false; - } - } - - // Read compile options from JSON file - std::string compileOptions = "-shared -fPIC -x c++ "; - std::ifstream compileOptionFile("compile_options.json"); - if (compileOptionFile.is_open()) { - json compileOptionsJson; - try { - compileOptionFile >> compileOptionsJson; - if (compileOptionsJson.contains("optimization_level") && - compileOptionsJson.contains("cplus_version") && - compileOptionsJson.contains("warnings")) { - compileOptions = - compileOptionsJson["optimization_level"] - .get() + - " " + - compileOptionsJson["cplus_version"].get() + - " " + compileOptionsJson["warnings"].get() + - " "; - } else { - LOG_F(ERROR, "Invalid format in compile_options.json."); - return false; - } - } catch (const std::exception &e) { - LOG_F(ERROR, "Error reading compile_options.json: {}", e.what()); - return false; - } - } - - // Specify output file path - std::string output = outputDir + moduleName + CMD_SUFFIX; - - // Syntax and semantic checking - std::stringstream syntaxCheckCmd; - syntaxCheckCmd << COMPILER << " -fsyntax-only -x c++ -"; - std::string syntaxCheckOutput; - if (RunShellCommand(syntaxCheckCmd.str(), code, syntaxCheckOutput) != 0) { - LOG_F(ERROR, "Syntax error in C++ code: {}", syntaxCheckOutput); - return false; - } - - // Compile code - std::string compilationOutput; - std::string cmd = - std::string(COMPILER) + " " + compileOptions + " - " + " -o " + output; - DLOG_F(INFO, "{}", cmd); - - int exitCode = RunShellCommand(cmd, code, compilationOutput); - if (exitCode != 0) { - LOG_F(ERROR, "Failed to compile C++ code: {}", compilationOutput); - return false; - } - - // Cache compiled module - cache_[moduleName + "::" + functionName] = output; - - /* - // Load the compiled module - if(m_App.GetModuleLoader()->LoadModule(output, moduleName)) { - LOG_S(INFO) << "Module " << moduleName << "::" << functionName << " - compiled successfully."; return true; } else { LOG_F(ERROR, "Failed to load - the compiled module: {}", output); return false; - } - */ - return false; -} - -// 编译为共享库 -bool Compiler::CompileToSharedLibrary(const std::string &code, - const std::string &moduleName, - const std::string &functionName, - const std::string &optionsFile) { - LOG_F(INFO, "Compiling module {}::{}...", moduleName, functionName); - - // 参数校验 - if (!CheckParameters(code, moduleName, functionName)) { - return false; - } - - // 检查是否已经编译并缓存 - if (IsModuleCached(moduleName, functionName, cache_)) { + // 检查模块是否已编译并缓存 + auto cachedModule = + cache_.find(fmt::format("{}::{}", moduleName, functionName)); + if (cachedModule != cache_.end()) { + LOG_F(WARNING, + "Module {}::{} is already compiled, using cached result.", + moduleName, functionName); return true; } // 创建输出目录 - const std::string outputDir = "atom/global/"; - if (!CreateOutputDirectory(outputDir)) { + const fs::path outputDir = "atom/global"; + createOutputDirectory(outputDir); + + const auto availableCompilers = findAvailableCompilers(); + if (availableCompilers.empty()) { + LOG_F(ERROR, "No available compilers found."); return false; } + LOG_F(INFO, "Available compilers: {}", fmt::join(availableCompilers, ", ")); // 读取编译选项 - std::string compileOptions = ReadCompileOptions(optionsFile); - if (compileOptions.empty()) { - return false; - } + std::ifstream optionsStream(optionsFile.data()); + const auto compileOptions = [&optionsStream] { + if (!optionsStream) { + LOG_F( + WARNING, + "Failed to open compile options file, using default options."); + return std::string{"-O2 -std=c++20 -Wall -shared -fPIC"}; + } + + try { + json optionsJson; + optionsStream >> optionsJson; + return fmt::format( + "{} {} {}", + optionsJson["optimization_level"].get(), + optionsJson["cplus_version"].get(), + optionsJson["warnings"].get()); + } catch (const std::exception& e) { + LOG_F(ERROR, "Failed to parse compile options file: {}", e.what()); + return std::string{"-O2 -std=c++20 -Wall -shared -fPIC"}; + } + }(); - // 检查语法 - if (!SyntaxCheck(code, COMPILER)) { + // 语法检查 + if (!syntaxCheck(code, constants::COMPILER)) { return false; } - // 指定输出文件路径 - std::string output = outputDir + moduleName + CMD_SUFFIX; - // 编译代码 - if (!CompileCode(code, COMPILER, compileOptions, output)) { + const auto outputPath = + outputDir / fmt::format("{}{}{}", constants::LIB_EXTENSION, moduleName, + constants::LIB_EXTENSION); + if (!compileCode(code, constants::COMPILER, compileOptions, outputPath)) { return false; } - // 缓存已编译的模块 - CacheCompiledModule(moduleName, functionName, output, cache_); - - return true; -} - -// 检查参数是否有效 -bool Compiler::CheckParameters(const std::string &code, - const std::string &moduleName, - const std::string &functionName) { - if (code.empty() || moduleName.empty() || functionName.empty()) { - LOG_F(ERROR, "Invalid parameters."); - return false; - } + // 缓存编译结果 + cache_[fmt::format("{}::{}", moduleName, functionName)] = outputPath; return true; } -// 检查模块是否已经编译并缓存 -bool Compiler::IsModuleCached( - const std::string &moduleName, const std::string &functionName, - std::unordered_map &cache_) { - std::string key = moduleName + "::" + functionName; - auto cachedResult = cache_.find(key); - if (cachedResult != cache_.end()) { - LOG_F(WARNING, "Module {}::{} is already compiled.", moduleName, - functionName); - return true; - } - return false; -} - -// 创建输出目录 -bool Compiler::CreateOutputDirectory(const std::string &outputDir) { +void Compiler::createOutputDirectory(const fs::path& outputDir) { if (!fs::exists(outputDir)) { - LOG_F(WARNING, "Output directory does not exist."); - try { - fs::create_directories(outputDir); - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to create output directory. {}", e.what()); - return false; - } - } - return true; -} - -// 从 JSON 文件中读取编译选项 -std::string Compiler::ReadCompileOptions(const std::string &optionsFile) { - std::ifstream compileOptionFile(optionsFile); - if (compileOptionFile.is_open()) { - json compileOptionsJson; - try { - compileOptionFile >> compileOptionsJson; - if (compileOptionsJson.contains("optimization_level") && - compileOptionsJson.contains("cplus_version") && - compileOptionsJson.contains("warnings")) { - std::string compileOptions = - compileOptionsJson["optimization_level"] - .get() + - " " + - compileOptionsJson["cplus_version"].get() + - " " + compileOptionsJson["warnings"].get(); - return compileOptions; - } else { - LOG_F(ERROR, "Invalid format in compile_options.json."); - return ""; - } - } catch (const std::exception &e) { - LOG_F(ERROR, "Error reading compile_options.json: {}", e.what()); - return ""; - } + LOG_F(WARNING, "Output directory {} does not exist, creating it.", + outputDir.string()); + fs::create_directories(outputDir); } - return ""; } -// 语法检查 -bool Compiler::SyntaxCheck(const std::string &code, - const std::string &compiler) { - std::stringstream syntaxCheckCmd; - syntaxCheckCmd << compiler << " -fsyntax-only -x c++ -"; - std::string syntaxCheckOutput; - if (RunShellCommand(syntaxCheckCmd.str(), code, syntaxCheckOutput) != 0) { - LOG_F(ERROR, "Syntax error in C++ code: {}", syntaxCheckOutput); +bool Compiler::syntaxCheck(std::string_view code, std::string_view compiler) { + const auto command = fmt::format("{} -fsyntax-only -xc++ -", compiler); + std::string output; + const auto exitCode = runCommand(command, code, output); + if (exitCode != 0) { + LOG_F(ERROR, "Syntax check failed:\n{}", output); return false; } return true; } -// 编译代码 -bool Compiler::CompileCode(const std::string &code, const std::string &compiler, - const std::string &compileOptions, - const std::string &output) { - std::string cmd = compiler + " " + compileOptions + " - " + " -o " + output; - DLOG_F(INFO, "{}", cmd); - +bool Compiler::compileCode(std::string_view code, std::string_view compiler, + std::string_view compileOptions, + const fs::path& output) { + const auto command = fmt::format("{} {} -xc++ - -o {}", compiler, + compileOptions, output.string()); std::string compilationOutput; - int exitCode = RunShellCommand(cmd, code, compilationOutput); + const auto exitCode = runCommand(command, code, compilationOutput); if (exitCode != 0) { - LOG_F(ERROR, "Failed to compile C++ code: {}", compilationOutput); + LOG_F(ERROR, "Compilation failed:\n{}", compilationOutput); return false; } return true; } -// 缓存已编译的模块 -void Compiler::CacheCompiledModule( - const std::string &moduleName, const std::string &functionName, - const std::string &output, - std::unordered_map &cache_) { - std::string key = moduleName + "::" + functionName; - cache_[key] = output; -} - -bool Compiler::CopyFile_(const std::string &source, - const std::string &destination) { - try { - std::ifstream src(source, std::ios::binary); - if (!src) { - LOG_F(ERROR, "Failed to open file for copy: {}", source); - return false; - } - - std::ofstream dst(destination, std::ios::binary); - if (!dst) { - LOG_F(ERROR, "Failed to create file for copy: {}", destination); - return false; - } +int Compiler::runCommand(std::string_view command, std::string_view input, + std::string& output) { + std::array buffer; + output.clear(); - dst << src.rdbuf(); - - if (!dst.good()) { - LOG_F(ERROR, "Error occurred while writing to destination file: {}", - destination); - return false; - } - - return true; - } catch (const std::exception &e) { - LOG_F(ERROR, "Exception occurred during file copy: {}", e.what()); - return false; + auto pipe = popen(command.data(), "r+"); + if (!pipe) { + LOG_F(ERROR, "Failed to run command: {}", command); + return -1; } -} -int Compiler::RunShellCommand(const std::string &command, - const std::string &input, std::string &output) { - int exitCode = -1; -#ifdef _WIN32 - HANDLE hStdoutRead = NULL; + fwrite(input.data(), sizeof(char), input.size(), pipe); + fclose(pipe); - STARTUPINFO si = {sizeof(si)}; - PROCESS_INFORMATION pi; - HANDLE hStdinRead = NULL, hStdoutWrite = NULL; - SECURITY_ATTRIBUTES sa; - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - if (!CreatePipe(&hStdinRead, &hStdoutWrite, &sa, 0)) { - LOG_F(ERROR, "Failed to create input pipe for shell command: {}", - command); - return exitCode; - } - if (!SetHandleInformation(hStdoutWrite, HANDLE_FLAG_INHERIT, 0)) { - LOG_F(ERROR, - "Failed to set input handle information for shell command: {}", - command); - CloseHandle(hStdinRead); - return exitCode; + pipe = popen(command.data(), "r"); + while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) { + output += buffer.data(); } - if (!CreatePipe(&hStdoutRead, &hStdoutWrite, &sa, 0)) { - LOG_F(ERROR, "Failed to create output pipe for shell command: {}", - command); - CloseHandle(hStdinRead); - CloseHandle(hStdoutWrite); - return exitCode; - } - - si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - si.hStdInput = hStdinRead; - si.hStdOutput = hStdoutWrite; - si.hStdError = GetStdHandle(STD_ERROR_HANDLE); - - std::vector commandBuffer(command.begin(), command.end()); - commandBuffer.push_back('\0'); + return pclose(pipe); +} - if (!CreateProcess(NULL, &commandBuffer[0], NULL, NULL, TRUE, 0, NULL, NULL, - &si, &pi)) { - LOG_F(ERROR, "Failed to launch shell command: {}", command); - CloseHandle(hStdinRead); - CloseHandle(hStdoutWrite); - CloseHandle(hStdoutRead); - return exitCode; - } - CloseHandle(hStdinRead); - CloseHandle(hStdoutWrite); +std::vector Compiler::findAvailableCompilers() { + std::vector availableCompilers; - // Read the command output - char buffer[4096]; - DWORD bytesRead; - while (ReadFile(hStdoutRead, buffer, sizeof(buffer), &bytesRead, NULL)) { - if (bytesRead > 0) { - output.append(buffer, bytesRead); - } else { - break; + for (const auto& path : constants::COMPILER_PATHS) { + for (const auto& compiler : constants::COMMON_COMPILERS) { + std::filesystem::path compilerPath = + std::filesystem::path(path) / compiler; + if (std::filesystem::exists(compilerPath)) { + availableCompilers.push_back(compilerPath.string()); + } } } - // Wait for the command to finish - WaitForSingleObject(pi.hProcess, INFINITE); - GetExitCodeProcess(pi.hProcess, (LPDWORD)&exitCode); - - // Clean up - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - CloseHandle(hStdoutRead); -#else - FILE *pipe = popen(command.c_str(), "w"); - if (!pipe) { - LOG_F(ERROR, "Failed to popen shell command: {}", command); - return exitCode; - } - - fwrite(input.c_str(), 1, input.size(), pipe); - fclose(pipe); - - exitCode = WEXITSTATUS(pclose(pipe)); -#endif - - return exitCode; + return availableCompilers; } - } // namespace Lithium diff --git a/src/addon/compiler.hpp b/src/addon/compiler.hpp index 5829c4b4..bbe8104f 100644 --- a/src/addon/compiler.hpp +++ b/src/addon/compiler.hpp @@ -12,140 +12,76 @@ Description: Compiler **************************************************/ -#pragma once +#ifndef LITHIUM_ADDON_COMPILER_HPP +#define LITHIUM_ADDON_COMPILER_HPP +#include #include - -#if ENABLE_FASTHASH -#include "emhash/hash_table8.hpp" -#else +#include #include -#endif namespace Lithium { class Compiler { public: /** - * \brief 编译 C++ 代码为共享库,并加载到内存中 - * - * \param code 要编译的代码 - * \param moduleName 模块名 - * \param functionName 入口函数名 - * \return 编译是否成功 - */ - bool CompileToSharedLibrary( - const std::string &code, const std::string &moduleName, - const std::string &functionName, - const std::string &optionsFile = "compile_options.json"); - - /** - * \brief 编译 C++ 代码为共享库,并加载到内存中 - * - * \param code 要编译的代码 - * \param moduleName 模块名 - * \param functionName 入口函数名 - * \return 编译是否成功 + * 编译 C++ 代码为共享库,并加载到内存中 + * @param code 要编译的代码 + * @param moduleName 模块名 + * @param functionName 入口函数名 + * @param optionsFile 编译选项文件路径,默认为 "compile_options.json" + * @return 编译是否成功 */ - bool CompileToSharedLibraryAllinOne(const std::string &code, - const std::string &moduleName, - const std::string &functionName); + [[nodiscard]] bool compileToSharedLibrary( + std::string_view code, std::string_view moduleName, + std::string_view functionName, + std::string_view optionsFile = "compile_options.json"); private: /** - * \brief 检查参数 - * \param code 要编译的代码 - * \param moduleName 模块名 - * \param functionName 入口函数名 - * \return 检查是否成功 + * 创建输出目录 + * @param outputDir 输出目录路径 */ - bool CheckParameters(const std::string &code, const std::string &moduleName, - const std::string &functionName); + void createOutputDirectory(const std::filesystem::path& outputDir); /** - * \brief 判断模块是否已缓存 - * \param moduleName 模块名 - * \param functionName 入口函数名 - * \return 模块是否已缓存 + * 语法检查 + * @param code 要编译的代码 + * @param compiler 编译器路径 + * @return 语法检查是否成功 */ - bool IsModuleCached(const std::string &moduleName, - const std::string &functionName, - std::unordered_map &cache_); + [[nodiscard]] bool syntaxCheck(std::string_view code, + std::string_view compiler); /** - * \brief 创建输出目录 - * \param outputDir 输出目录路径 - * \return 创建是否成功 + * 编译代码 + * @param code 要编译的代码 + * @param compiler 编译器路径 + * @param compileOptions 编译选项 + * @param output 编译输出路径 + * @return 编译是否成功 */ - bool CreateOutputDirectory(const std::string &outputDir); + [[nodiscard]] bool compileCode(std::string_view code, + std::string_view compiler, + std::string_view compileOptions, + const std::filesystem::path& output); /** - * \brief 读取编译选项 - * \param optionsFile 编译选项文件路径 - * \return 编译选项 + * 查找可用的编译器 + * @return 可用的编译器列表 */ - std::string ReadCompileOptions(const std::string &optionsFile); - + [[nodiscard]]std::vector findAvailableCompilers(); + /** - * \brief 语法检查 - * \param code 要编译的代码 - * \param compiler 编译器路径 - * \return 语法检查是否成功 + * 运行外部 shell 命令,并将标准输入输出流转发到命令的标准输入输出流中 + * @param command 要运行的命令 + * @param input 标准输入 + * @param output 标准输出 + * @return 命令运行的返回值 */ - bool SyntaxCheck(const std::string &code, const std::string &compiler); + int runCommand(std::string_view command, std::string_view input, + std::string& output); - /** - * \brief 编译代码 - * \param code 要编译的代码 - * \param compiler 编译器路径 - * \param compileOptions 编译选项 - * \param output 编译输出路径 - * \return 编译是否成功 - */ - bool CompileCode(const std::string &code, const std::string &compiler, - const std::string &compileOptions, - const std::string &output); - - /** - * \brief 缓存编译好的模块 - * \param moduleName 模块名 - * \param functionName 入口函数名 - * \param output 编译输出路径 - * \return 缓存是否成功 - */ - void CacheCompiledModule( - const std::string &moduleName, const std::string &functionName, - const std::string &output, - std::unordered_map &cache_); - - // ---------------------------------------------------- - // File and Directory - // ---------------------------------------------------- - /** - * \brief 复制文件 - * - * \param source 源文件路径 - * \param destination 目标文件路径 - * \return 是否复制成功 - */ - bool CopyFile_(const std::string &source, const std::string &destination); - - /** - * \brief 运行外部 shell - * 命令,并将标准输入输出流转发到命令的标准输入输出流中 - * - * \param command 要运行的命令 - * \param inputStream 标准输入流 - * \param outputStream 标准输出流 - * \return 命令运行的返回值 - */ - int RunShellCommand(const std::string &command, const std::string &input, - std::string &output); - -#if ENABLE_FASTHASH - emhash8::HashMap cache_; -#else - std::unordered_map cache_; -#endif + std::unordered_map cache_; }; - } // namespace Lithium +#endif diff --git a/src/addon/sandbox.cpp b/src/addon/sandbox.cpp index ed715ff1..9df9aa97 100644 --- a/src/addon/sandbox.cpp +++ b/src/addon/sandbox.cpp @@ -14,6 +14,8 @@ Description: A sandbox for alone componnents, such as executables. #include "sandbox.hpp" +#include "atom/utils/convert.hpp" + #ifdef _WIN32 #include #include @@ -27,119 +29,89 @@ Description: A sandbox for alone componnents, such as executables. namespace Lithium { bool Sandbox::setTimeLimit(int timeLimitMs) { -#ifdef _WIN32 - m_timeLimit = timeLimitMs; -#else - struct rlimit limit; - limit.rlim_cur = timeLimitMs / 1000; - limit.rlim_max = timeLimitMs / 1000; - if (setrlimit(RLIMIT_CPU, &limit) != 0) { - return false; - } m_timeLimit = timeLimitMs; +#ifndef _WIN32 + rlimit limit{.rlim_cur = static_cast(timeLimitMs) / 1000, + .rlim_max = static_cast(timeLimitMs) / 1000}; + return setrlimit(RLIMIT_CPU, &limit) == 0; #endif return true; } bool Sandbox::setMemoryLimit(long memoryLimitKb) { -#ifdef _WIN32 - m_memoryLimit = memoryLimitKb; -#else - struct rlimit limit; - limit.rlim_cur = memoryLimitKb * 1024; - limit.rlim_max = memoryLimitKb * 1024; - if (setrlimit(RLIMIT_AS, &limit) != 0) { - return false; - } m_memoryLimit = memoryLimitKb; +#ifndef _WIN32 + rlimit limit{.rlim_cur = static_cast(memoryLimitKb) * 1024, + .rlim_max = static_cast(memoryLimitKb) * 1024}; + return setrlimit(RLIMIT_AS, &limit) == 0; #endif return true; } -bool Sandbox::setRootDirectory(const std::string &rootDirectory) { -#ifdef _WIN32 - return false; // Not supported on Windows -#else - if (chdir(rootDirectory.c_str()) != 0 || - chroot(rootDirectory.c_str()) != 0) { - return false; - } +bool Sandbox::setRootDirectory(const std::string& rootDirectory) { m_rootDirectory = rootDirectory; - return true; +#ifndef _WIN32 + return (chdir(rootDirectory.c_str()) == 0) && + (chroot(rootDirectory.c_str()) == 0); #endif + return false; } bool Sandbox::setUserId(int userId) { -#ifdef _WIN32 - return false; // Not supported on Windows -#else - if (setuid(userId) != 0 || setgid(userId) != 0) { - return false; - } m_userId = userId; - return true; +#ifndef _WIN32 + return (setuid(userId) == 0) && (setgid(userId) == 0); #endif + return false; } -bool Sandbox::setProgramPath(const std::string &programPath) { +bool Sandbox::setProgramPath(const std::string& programPath) { m_programPath = programPath; return true; } -bool Sandbox::setProgramArgs(const std::vector &programArgs) { +bool Sandbox::setProgramArgs(const std::vector& programArgs) { m_programArgs = programArgs; return true; } bool Sandbox::run() { #ifdef _WIN32 - STARTUPINFO startupInfo; - PROCESS_INFORMATION processInfo; - ZeroMemory(&startupInfo, sizeof(startupInfo)); + STARTUPINFO startupInfo{}; startupInfo.cb = sizeof(startupInfo); - ZeroMemory(&processInfo, sizeof(processInfo)); + PROCESS_INFORMATION processInfo{}; - std::string commandLine = m_programPath + " "; - for (auto &arg : m_programArgs) { - commandLine += arg + " "; + std::string commandLine = m_programPath; + for (const auto& arg : m_programArgs) { + commandLine += ' ' + arg; } - BOOL success = CreateProcess(NULL, const_cast(commandLine.c_str()), - NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, - NULL, &startupInfo, &processInfo); - if (!success) { + if (!CreateProcess(nullptr, Atom::Utils::CharToLPWSTR(commandLine.data()), + nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, + nullptr, &startupInfo, &processInfo)) { return false; } - HANDLE processHandle = processInfo.hProcess; + const HANDLE processHandle = processInfo.hProcess; - // 设置时间和内存限制 if (m_timeLimit > 0) { - DWORD_PTR timeLimitMs = static_cast(m_timeLimit); - success = SetProcessAffinityMask(processHandle, timeLimitMs); - if (!success) { - return false; - } + SetProcessAffinityMask(processHandle, + static_cast(m_timeLimit)); } if (m_memoryLimit > 0) { - SIZE_T memoryLimitKb = static_cast(m_memoryLimit); - success = SetProcessWorkingSetSize(processHandle, memoryLimitKb, - memoryLimitKb); - if (!success) { - return false; - } + SetProcessWorkingSetSize(processHandle, + static_cast(m_memoryLimit), + static_cast(m_memoryLimit)); } - // 恢复子进程并等待它完成 ResumeThread(processInfo.hThread); WaitForSingleObject(processHandle, INFINITE); - // 获取子进程的退出状态和资源使用情况 DWORD exitCode = 0; GetExitCodeProcess(processHandle, &exitCode); - PROCESS_MEMORY_COUNTERS memoryCounters; + PROCESS_MEMORY_COUNTERS memoryCounters{}; GetProcessMemoryInfo(processHandle, &memoryCounters, sizeof(memoryCounters)); @@ -151,76 +123,32 @@ bool Sandbox::run() { return exitCode == 0; #else - pid_t pid = fork(); + const pid_t pid = fork(); if (pid < 0) { return false; - } else if (pid == 0) { // child process - ptrace(PTRACE_TRACEME, 0, NULL, NULL); - // 将 std::string 类型的数组转换为 char* 类型的指针数组 - std::vector args; - for (const auto &arg : m_programArgs) { - args.push_back(const_cast(arg.c_str())); + } else if (pid == 0) { + ptrace(PTRACE_TRACEME, 0, nullptr, nullptr); + + std::vector args; + args.reserve(m_programArgs.size() + 2); + args.emplace_back(m_programPath.data()); + for (const auto& arg : m_programArgs) { + args.emplace_back(const_cast(arg.c_str())); } - args.push_back(nullptr); // execvp 需要以 nullptr 结尾 + args.emplace_back(nullptr); execvp(m_programPath.c_str(), args.data()); exit(0); - } else { // parent process + } else { int status = 0; - struct rusage usage; - while (wait4(pid, &status, 0, &usage) != pid) { - } - m_timeUsed = - usage.ru_utime.tv_sec * 1000 + usage.ru_utime.tv_usec / 1000; - m_memoryUsed = usage.ru_maxrss; + rusage usage{}; + while (wait4(pid, &status, 0, &usage) != pid) + ; + m_timeUsed = static_cast(usage.ru_utime.tv_sec * 1000 + + usage.ru_utime.tv_usec / 1000); + m_memoryUsed = static_cast(usage.ru_maxrss); return WIFEXITED(status) && WEXITSTATUS(status) == 0; } #endif } - -int Sandbox::getTimeUsed() const { return m_timeUsed; } - -long Sandbox::getMemoryUsed() const { return m_memoryUsed; } -} // namespace Lithium - -/* -int main() -{ - std::vector threads; - std::vector timeUsedList; - std::vector memoryUsedList; - - int numThreads = 5; // 设置线程数量 - - for (int i = 0; i < numThreads; ++i) - { - threads.emplace_back([i, &timeUsedList, &memoryUsedList]() - { - Sandbox sandbox; - sandbox.setTimeLimit(10000); // 设置时间限制为1秒 - sandbox.setMemoryLimit(1024102); // 设置内存限制为1MB - sandbox.setProgramPath("E:\\python3.10\\python.exe"); // 设置程序路径 - sandbox.setProgramArgs({}); // 设置程序参数 - if (sandbox.run()) { - timeUsedList[i] = sandbox.getTimeUsed(); - memoryUsedList[i] = sandbox.getMemoryUsed(); - } }); - } - - for (auto &thread : threads) - { - thread.join(); - } - - // 打印每个线程的时间和内存使用情况 - for (int i = 0; i < numThreads; ++i) - { - std::cout << "Thread " << i << ": " << std::endl; - std::cout << "Time used: " << timeUsedList[i] << "ms" << std::endl; - std::cout << "Memory used: " << memoryUsedList[i] << "KB" << std::endl; - } - - return 0; -} - -*/ +} // namespace Lithium \ No newline at end of file diff --git a/src/addon/sandbox.hpp b/src/addon/sandbox.hpp index f5043498..929ed44e 100644 --- a/src/addon/sandbox.hpp +++ b/src/addon/sandbox.hpp @@ -12,32 +12,28 @@ Description: A sandbox for alone componnents, such as executables. **************************************************/ -#pragma once +#ifndef LITHIUM_ADDON_SANDBOX_HPP +#define LITHIUM_ADDON_SANDBOX_HPP #include #include namespace Lithium { /** - * @class Sandbox - * @brief Represents a sandbox for running programs with specified time and - * memory limits. - * @details This class is used to run programs with specified time and memory - * limits. - * @note The implementation of this class on windows is not complete. - * @note If we run this on windows, we can't create a sandbox properly. + * @brief Sandbox class for running programs with time and memory limits in a + * restricted environment. */ class Sandbox { public: /** - * @brief Constructor for Sandbox class. + * @brief Default constructor for Sandbox class. */ - Sandbox() {} + Sandbox() = default; /** - * @brief Destructor for Sandbox class. + * @brief Default destructor for Sandbox class. */ - ~Sandbox() {} + ~Sandbox() = default; /** * @brief Sets the time limit for program execution. @@ -54,61 +50,68 @@ class Sandbox { bool setMemoryLimit(long memoryLimitKb); /** - * @brief Sets the root directory for program execution. + * @brief Sets the root directory for the sandbox environment. * @param rootDirectory The root directory path. * @return True if the root directory is set successfully, false otherwise. */ - bool setRootDirectory(const std::string &rootDirectory); + bool setRootDirectory(const std::string& rootDirectory); /** - * @brief Sets the user ID for program execution. + * @brief Sets the user ID for running the program in the sandbox. * @param userId The user ID. * @return True if the user ID is set successfully, false otherwise. */ bool setUserId(int userId); /** - * @brief Sets the program path for execution. - * @param programPath The program path. + * @brief Sets the path to the program to be executed in the sandbox. + * @param programPath The path to the program. * @return True if the program path is set successfully, false otherwise. */ - bool setProgramPath(const std::string &programPath); + bool setProgramPath(const std::string& programPath); /** - * @brief Sets the program arguments for execution. - * @param programArgs The program arguments. + * @brief Sets the arguments for the program to be executed in the sandbox. + * @param programArgs The vector of program arguments. * @return True if the program arguments are set successfully, false * otherwise. */ - bool setProgramArgs(const std::vector &programArgs); + bool setProgramArgs(const std::vector& programArgs); /** - * @brief Runs the program in the sandbox. - * @return True if the program runs successfully, false otherwise. + * @brief Runs the program in the sandbox environment. + * @return True if the program runs successfully within the time and memory + * limits, false otherwise. */ bool run(); /** - * @brief Gets the time used by the program during execution. + * @brief Retrieves the actual time used by the program during execution. * @return The time used in milliseconds. */ - int getTimeUsed() const; + [[nodiscard]] int getTimeUsed() const { return m_timeUsed; } /** - * @brief Gets the memory used by the program during execution. + * @brief Retrieves the actual memory used by the program during execution. * @return The memory used in kilobytes. */ - long getMemoryUsed() const; + [[nodiscard]] long getMemoryUsed() const { return m_memoryUsed; } private: - int m_timeLimit = 0; - long m_memoryLimit = 0; - std::string m_rootDirectory; - int m_userId = 0; - std::string m_programPath; - std::vector m_programArgs; - int m_timeUsed = 0; - long m_memoryUsed = 0; + int m_timeLimit = + 0; /**< Time limit for program execution in milliseconds. */ + long m_memoryLimit = + 0; /**< Memory limit for program execution in kilobytes. */ + std::string + m_rootDirectory; /**< Root directory for the sandbox environment. */ + int m_userId = 0; /**< User ID for running the program in the sandbox. */ + std::string m_programPath; /**< Path to the program to be executed. */ + std::vector m_programArgs; /**< Program arguments. */ + int m_timeUsed = + 0; /**< Actual time used by the program during execution. */ + long m_memoryUsed = + 0; /**< Actual memory used by the program during execution. */ }; -} // namespace Lithium +#endif +} \ No newline at end of file diff --git a/src/atom/server/CMakeLists.txt b/src/atom/server/CMakeLists.txt index 594b29e9..1e7ca566 100644 --- a/src/atom/server/CMakeLists.txt +++ b/src/atom/server/CMakeLists.txt @@ -21,10 +21,12 @@ set(${PROJECT_NAME}_SOURCES # Headers set(${PROJECT_NAME}_HEADERS - commander_impl.hpp + commander.inl commander.hpp daemon.hpp deserialize.hpp + eventstack.hpp + eventstack.inl global_ptr.hpp json_checker.hpp message_bus.hpp diff --git a/src/atom/server/commander.hpp b/src/atom/server/commander.hpp index 9eb97fba..b8d7c3b2 100644 --- a/src/atom/server/commander.hpp +++ b/src/atom/server/commander.hpp @@ -244,6 +244,6 @@ class CommandDispatcher : public NonCopyable { size_t m_maxHistorySize = 100; }; -#include "commander_impl.hpp" +#include "commander.inl" #endif diff --git a/src/atom/server/commander_impl.hpp b/src/atom/server/commander.inl similarity index 98% rename from src/atom/server/commander_impl.hpp rename to src/atom/server/commander.inl index 8a6955e6..86834e65 100644 --- a/src/atom/server/commander_impl.hpp +++ b/src/atom/server/commander.inl @@ -15,6 +15,8 @@ Description: Commander #ifndef ATOM_SERVER_COMMANDER_IMPL_HPP #define ATOM_SERVER_COMMANDER_IMPL_HPP +#include "commander.hpp" + template CommandDispatcher::~CommandDispatcher() { m_handlers.clear(); @@ -97,8 +99,8 @@ Result CommandDispatcher::dispatch(const std::string &name, const Argument &data) { std::shared_lock lock(m_sharedMutex); - // Max: Here we check if a decorator is registered for the command and run it in advance - // Check if a decorator is registered for the command + // Max: Here we check if a decorator is registered for the command and run + // it in advance Check if a decorator is registered for the command auto it = m_decorators.find(name); if (it != m_decorators.end()) { auto decorator = it->second; diff --git a/src/atom/server/eventstack.hpp b/src/atom/server/eventstack.hpp index b788f6f7..65d75b7a 100644 --- a/src/atom/server/eventstack.hpp +++ b/src/atom/server/eventstack.hpp @@ -15,15 +15,19 @@ Description: A thread-safe stack data structure for managing events. #ifndef ATOM_SERVER_EVENTSTACK_HPP #define ATOM_SERVER_EVENTSTACK_HPP -#include -#include -#include #include +#include +#include #include +#include +#include +#include +#include +#include /** * @brief A thread-safe stack data structure for managing events. - * + * * @tparam T The type of events to store. */ template @@ -31,21 +35,20 @@ class EventStack { public: EventStack(); /**< Constructor. */ ~EventStack(); /**< Destructor. */ - + /** * @brief Pushes an event onto the stack. - * + * * @param event The event to push. */ - void pushEvent(const T& event); + void pushEvent(T event); /** * @brief Pops an event from the stack. - * - * @return The popped event. - * @throw std::out_of_range if the stack is empty. + * + * @return The popped event, or std::nullopt if the stack is empty. */ - T popEvent(); + std::optional popEvent(); /** * @brief Prints all events in the stack. @@ -54,14 +57,14 @@ class EventStack { /** * @brief Checks if the stack is empty. - * + * * @return true if the stack is empty, false otherwise. */ bool isEmpty() const; /** * @brief Returns the number of events in the stack. - * + * * @return The number of events. */ size_t size() const; @@ -73,46 +76,96 @@ class EventStack { /** * @brief Returns the top event in the stack without removing it. - * - * @return The top event. - * @throw std::out_of_range if the stack is empty. + * + * @return The top event, or std::nullopt if the stack is empty. */ - T peekTopEvent() const; + std::optional peekTopEvent() const; /** * @brief Copies the current stack. - * + * * @return A copy of the stack. */ EventStack copyStack() const; /** * @brief Filters events based on a custom filter function. - * + * * @param filterFunc The filter function. */ - void filterEvents(bool (*filterFunc)(const T&)); + void filterEvents(std::function filterFunc); /** * @brief Serializes the stack into a string. - * + * * @return The serialized stack. */ std::string serializeStack() const; /** * @brief Deserializes a string into the stack. - * + * * @param serializedData The serialized stack data. */ - void deserializeStack(const std::string& serializedData); + void deserializeStack(std::string_view serializedData); + + /** + * @brief Removes duplicate events from the stack. + */ + void removeDuplicates(); + + /** + * @brief Sorts the events in the stack based on a custom comparison + * function. + * + * @param compareFunc The comparison function. + */ + void sortEvents(std::function compareFunc); + + /** + * @brief Reverses the order of events in the stack. + */ + void reverseEvents(); + + /** + * @brief Counts the number of events that satisfy a predicate. + * + * @param predicate The predicate function. + * @return The count of events satisfying the predicate. + */ + size_t countEvents(std::function predicate) const; + + /** + * @brief Finds the first event that satisfies a predicate. + * * + * @param predicate The predicate function. + * @return The first event satisfying the predicate, or std::nullopt if not + * found. + */ + std::optional findEvent(std::function predicate) const; + + /** + * @brief Checks if any event in the stack satisfies a predicate. + * + * @param predicate The predicate function. + * @return true if any event satisfies the predicate, false otherwise. + */ + bool anyEvent(std::function predicate) const; + + /** + * @brief Checks if all events in the stack satisfy a predicate. + * + * @param predicate The predicate function. + * @return true if all events satisfy the predicate, false otherwise. + */ + bool allEvents(std::function predicate) const; private: - class EventStackImpl; /**< Forward declaration of the implementation class. */ - std::unique_ptr impl; /**< Pointer to the implementation. */ - mutable std::mutex mtx; /**< Mutex for thread safety. */ + std::vector events; /**< Vector to store events. */ + mutable std::shared_mutex mtx; /**< Mutex for thread safety. */ + std::atomic eventCount{0}; /**< Atomic counter for event count. */ }; -#include "eventstack_impl.hpp" +#include "eventstack.inl" -#endif // ATOM_SERVER_EVENTSTACK_HPP +#endif // ATOM_SERVER_EVENTSTACK_HPP \ No newline at end of file diff --git a/src/atom/server/eventstack.inl b/src/atom/server/eventstack.inl new file mode 100644 index 00000000..5485c469 --- /dev/null +++ b/src/atom/server/eventstack.inl @@ -0,0 +1,176 @@ +/* + * eventstack_impl.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-26 + +Description: A thread-safe stack data structure for managing events. + +**************************************************/ + +#ifndef ATOM_SERVER_EVENTSTACK_INL +#define ATOM_SERVER_EVENTSTACK_INL + +#include "eventstack.hpp" + +template +EventStack::EventStack() {} + +template +EventStack::~EventStack() {} + +template +void EventStack::pushEvent(T event) { + std::unique_lock lock(mtx); + events.push_back(std::move(event)); + ++eventCount; +} + +template +std::optional EventStack::popEvent() { + std::unique_lock lock(mtx); + if (!events.empty()) { + T event = std::move(events.back()); + events.pop_back(); + --eventCount; + return event; + } + return std::nullopt; +} + +template +void EventStack::printEvents() const { + std::shared_lock lock(mtx); + std::cout << "Events in stack:" << std::endl; + for (const T& event : events) { + std::cout << event << std::endl; + } +} + +template +bool EventStack::isEmpty() const { + std::shared_lock lock(mtx); + return events.empty(); +} + +template +size_t EventStack::size() const { + return eventCount.load(); +} + +template +void EventStack::clearEvents() { + std::unique_lock lock(mtx); + events.clear(); + eventCount.store(0); +} + +template +std::optional EventStack::peekTopEvent() const { + std::shared_lock lock(mtx); + if (!events.empty()) { + return events.back(); + } + return std::nullopt; +} + +template +EventStack EventStack::copyStack() const { + std::shared_lock lock(mtx); + EventStack newStack; + newStack.events = events; + newStack.eventCount.store(eventCount.load()); + return newStack; +} + +template +void EventStack::filterEvents(std::function filterFunc) { + std::unique_lock lock(mtx); + events.erase( + std::remove_if(events.begin(), events.end(), + [&](const T& event) { return !filterFunc(event); }), + events.end()); + eventCount.store(events.size()); +} + +template +std::string EventStack::serializeStack() const { + std::shared_lock lock(mtx); + std::string serializedStack; + for (const T& event : events) { + serializedStack += event + ";"; + } + return serializedStack; +} + +template +void EventStack::deserializeStack(std::string_view serializedData) { + std::unique_lock lock(mtx); + events.clear(); + size_t pos = 0; + size_t nextPos = 0; + while ((nextPos = serializedData.find(";", pos)) != + std::string_view::npos) { + T event = serializedData.substr(pos, nextPos - pos); + events.push_back(std::move(event)); + pos = nextPos + 1; + } + eventCount.store(events.size()); +} + +template +void EventStack::removeDuplicates() { + std::unique_lock lock(mtx); + std::sort(events.begin(), events.end()); + events.erase(std::unique(events.begin(), events.end()), events.end()); + eventCount.store(events.size()); +} + +template +void EventStack::sortEvents( + std::function compareFunc) { + std::unique_lock lock(mtx); + std::sort(events.begin(), events.end(), compareFunc); +} + +template +void EventStack::reverseEvents() { + std::unique_lock lock(mtx); + std::reverse(events.begin(), events.end()); +} + +template +size_t EventStack::countEvents( + std::function predicate) const { + std::shared_lock lock(mtx); + return std::count_if(events.begin(), events.end(), predicate); +} + +template +std::optional EventStack::findEvent( + std::function predicate) const { + std::shared_lock lock(mtx); + auto it = std::find_if(events.begin(), events.end(), predicate); + if (it != events.end()) { + return *it; + } + return std::nullopt; +} + +template +bool EventStack::anyEvent(std::function predicate) const { + std::shared_lock lock(mtx); + return std::any_of(events.begin(), events.end(), predicate); +} + +template +bool EventStack::allEvents(std::function predicate) const { + std::shared_lock lock(mtx); + return std::all_of(events.begin(), events.end(), predicate); +} + +#endif diff --git a/src/atom/server/eventstack_impl.hpp b/src/atom/server/eventstack_impl.hpp deleted file mode 100644 index 27f74907..00000000 --- a/src/atom/server/eventstack_impl.hpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * eventstack_impl.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-3-26 - -Description: A thread-safe stack data structure for managing events. - -**************************************************/ - -template -class EventStack::EventStackImpl { -public: - std::vector events; /**< Vector to store events. */ -}; - -template -EventStack::EventStack() : impl(std::make_unique()) {} - -template -EventStack::~EventStack() { -} - -template -void EventStack::pushEvent(const T& event) { - std::lock_guard lock(mtx); - impl->events.push_back(event); -} - -template -T EventStack::popEvent() { - std::lock_guard lock(mtx); - if (!impl->events.empty()) { - T event = impl->events.back(); - impl->events.pop_back(); - return event; - } else { - throw std::out_of_range("Event stack is empty."); - } -} - -template -void EventStack::printEvents() const { - std::lock_guard lock(mtx); - std::cout << "Events in stack:" << std::endl; - for (const T& event : impl->events) { - std::cout << event << std::endl; - } -} - -template -bool EventStack::isEmpty() const { - std::lock_guard lock(mtx); - return impl->events.empty(); -} - -template -size_t EventStack::size() const { - std::lock_guard lock(mtx); - return impl->events.size(); -} - -template -void EventStack::clearEvents() { - std::lock_guard lock(mtx); - impl->events.clear(); -} - -template -T EventStack::peekTopEvent() const { - std::lock_guard lock(mtx); - if (!impl->events.empty()) { - return impl->events.back(); - } else { - throw std::out_of_range("Event stack is empty."); - } -} - -template -EventStack EventStack::copyStack() const { - std::lock_guard lock(mtx); - EventStack newStack; - newStack.impl->events = impl->events; - return newStack; -} - -template -void EventStack::filterEvents(bool (*filterFunc)(const T&)) { - std::lock_guard lock(mtx); - impl->events.erase(std::remove_if(impl->events.begin(), impl->events.end(), [&](const T& event) { - return !filterFunc(event); - }), impl->events.end()); -} - -template -std::string EventStack::serializeStack() const { - std::lock_guard lock(mtx); - std::string serializedStack; - for (const T& event : impl->events) { - serializedStack += event + ";"; - } - return serializedStack; -} - -template -void EventStack::deserializeStack(const std::string& serializedData) { - std::lock_guard lock(mtx); - impl->events.clear(); - size_t pos = 0; - size_t nextPos = 0; - while ((nextPos = serializedData.find(";", pos)) != std::string::npos) { - T event = serializedData.substr(pos, nextPos - pos); - impl->events.push_back(event); - pos = nextPos + 1; - } -} diff --git a/src/atom/utils/convert.cpp b/src/atom/utils/convert.cpp new file mode 100644 index 00000000..f0754900 --- /dev/null +++ b/src/atom/utils/convert.cpp @@ -0,0 +1,69 @@ +/* + * convert.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-18 + +Description: Convert Utils for Windows + +**************************************************/ + +#ifdef _WIN32 + +#include "convert.hpp" + +#include +#include + +namespace Atom::Utils { +LPWSTR CharToLPWSTR(std::string_view charString) { + const int size = + MultiByteToWideChar(CP_ACP, 0, charString.data(), + static_cast(charString.size()), nullptr, 0); + if (size == 0) { + throw std::runtime_error("Error converting char string to LPWSTR"); + } + std::vector buffer(size + 1); + MultiByteToWideChar(CP_ACP, 0, charString.data(), + static_cast(charString.size()), buffer.data(), + size); + buffer[size] = L'\0'; + return buffer.data(); +} + +LPWSTR StringToLPWSTR(const std::string& str) { return CharToLPWSTR(str); } + +std::string LPWSTRToString(LPWSTR lpwstr) { + const int size = WideCharToMultiByte(CP_ACP, 0, lpwstr, -1, nullptr, 0, + nullptr, nullptr); + if (size == 0) { + throw std::runtime_error("Error converting LPWSTR to std::string"); + } + std::string str(size - 1, '\0'); + WideCharToMultiByte(CP_ACP, 0, lpwstr, -1, str.data(), size, nullptr, + nullptr); + return str; +} + +std::string LPCWSTRToString(LPCWSTR lpcwstr) { + return LPWSTRToString(const_cast(lpcwstr)); +} + +LPWSTR WStringToLPWSTR(const std::wstring& wstr) { + std::vector buffer(wstr.size() + 1); + std::copy(wstr.begin(), wstr.end(), buffer.begin()); + buffer[wstr.size()] = L'\0'; + return buffer.data(); +} + +std::wstring LPWSTRToWString(LPWSTR lpwstr) { return std::wstring(lpwstr); } + +std::wstring LPCWSTRToWString(LPCWSTR lpcwstr) { return std::wstring(lpcwstr); } + +} // namespace Atom::Utils + +#endif \ No newline at end of file diff --git a/src/atom/utils/convert.hpp b/src/atom/utils/convert.hpp new file mode 100644 index 00000000..b884e2df --- /dev/null +++ b/src/atom/utils/convert.hpp @@ -0,0 +1,82 @@ +/* + * convert.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-18 + +Description: Convert Utils for Windows + +**************************************************/ + +#ifndef ATOM_UTILS_CONVERT_HPP +#define ATOM_UTILS_CONVERT_HPP + +#ifdef _WIN32 + +#include +#include +#include + +namespace Atom::Utils { +/** + * @brief Converts a string_view containing char characters to LPWSTR (wide + * character string). + * @param charString The string_view containing char characters to be converted. + * @return LPWSTR representing the wide character version of the input string. + */ +[[nodiscard]] LPWSTR CharToLPWSTR(std::string_view charString); + +/** + * @brief Converts a string containing char characters to LPWSTR (wide character + * string). + * @param str The string containing char characters to be converted. + * @return LPWSTR representing the wide character version of the input string. + */ +[[nodiscard]] LPWSTR StringToLPWSTR(const std::string& str); + +/** + * @brief Converts LPWSTR (wide character string) to a string containing char + * characters. + * @param lpwstr The LPWSTR to be converted to a string. + * @return std::string containing char characters. + */ +[[nodiscard]] std::string LPWSTRToString(LPWSTR lpwstr); + +/** + * @brief Converts LPCWSTR (const wide character string) to a string containing + * char characters. + * @param lpcwstr The LPCWSTR to be converted to a string. + * @return std::string containing char characters. + */ +[[nodiscard]] std::string LPCWSTRToString(LPCWSTR lpcwstr); + +/** + * @brief Converts a wstring to LPWSTR (wide character string). + * @param wstr The wstring to be converted. + * @return LPWSTR representing the wide character version of the input wstring. + */ +[[nodiscard]] LPWSTR WStringToLPWSTR(const std::wstring& wstr); + +/** + * @brief Converts LPWSTR (wide character string) to a wstring. + * @param lpwstr The LPWSTR to be converted to a wstring. + * @return std::wstring. + */ +[[nodiscard]] std::wstring LPWSTRToWString(LPWSTR lpwstr); + +/** + * @brief Converts LPCWSTR (const wide character string) to a wstring. + * @param lpcwstr The LPCWSTR to be converted to a wstring. + * @return std::wstring. + */ +[[nodiscard]] std::wstring LPCWSTRToWString(LPCWSTR lpcwstr); + +} // namespace Atom::Utils + +#endif + +#endif diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp index 389bad8b..55bcf475 100644 --- a/src/utils/constant.hpp +++ b/src/utils/constant.hpp @@ -15,6 +15,9 @@ Description: Constants for Lithium #ifndef LITHIUM_UTILS_CONSTANTS_HPP #define LITHIUM_UTILS_CONSTANTS_HPP +#include +#include + class constants { public: #ifdef _WIN32 @@ -49,6 +52,36 @@ class constants { static constexpr const char* MODULE_FOLDER = "./modules"; #endif +#ifdef _WIN32 + static constexpr const char* COMPILER = "cl.exe"; +#elif __APPLE__ + static constexpr const char* COMPILER = "clang++"; +#else + static constexpr const char* COMPILER = "g++"; +#endif + +#ifdef _WIN32 + static const std::vector COMMON_COMPILERS = { + "cl.exe", "g++.exe", "clang++.exe"}; + static const std::vector COMPILER_PATHS = { + "C:\\Program Files (x86)\\Microsoft Visual " + "Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29." + "30133\\bin\\Hostx64\\x64", + "C:\\Program Files\\Microsoft Visual " + "Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.35." + "32215\\bin\\Hostx64\\x64", + "C:\\msys64\\mingw64\\bin", "C:\\MinGW\\bin", + "C:\\Program Files\\LLVM\\bin"}; +#elif __APPLE__ + static const std::vector COMMON_COMPILERS = {"clang++", "g++"}; + static const std::vector COMPILER_PATHS = { + "/usr/bin", "/usr/local/bin", "/opt/local/bin"}; +#elif __linux__ + static const std::vector COMMON_COMPILERS = {"g++", "clang++"}; + static const std::vector COMPILER_PATHS = {"/usr/bin", + "/usr/local/bin"}; +#endif + // Env info static constexpr const char* ENV_VAR_MODULE_PATH = "LITHIUM_MODULE_PATH"; From 0dfe1d1fbc246b33b96acd6c19f69b9bff748b94 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Fri, 19 Apr 2024 20:35:26 +0800 Subject: [PATCH 18/28] update preparation --- CMakeLists.txt | 1 - src/App.cpp | 16 +- src/addon/compiler.hpp | 5 +- src/addon/finder.cpp | 109 ----------- src/addon/finder.hpp | 186 ------------------ src/addon/sandbox.cpp | 2 +- src/atom/server/message_bus.hpp | 5 +- src/server/App.cpp | 291 ++-------------------------- src/server/App.hpp | 6 + src/server/AppComponent.hpp | 312 +++++++++---------------------- src/server/CMakeLists.txt | 0 src/server/Launcher.cpp | 69 ------- src/server/LauncherComponent.hpp | 109 ----------- src/utils/constant.hpp | 48 +++-- 14 files changed, 157 insertions(+), 1002 deletions(-) delete mode 100644 src/addon/finder.cpp delete mode 100644 src/addon/finder.hpp create mode 100644 src/server/App.hpp create mode 100644 src/server/CMakeLists.txt delete mode 100644 src/server/Launcher.cpp delete mode 100644 src/server/LauncherComponent.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ed88685f..10b6d0bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,7 +182,6 @@ set(component_module ${lithium_component_dir}/addons.cpp ${lithium_component_dir}/compiler.cpp - ${lithium_component_dir}/finder.cpp ${lithium_component_dir}/loader.cpp ${lithium_component_dir}/manager.cpp ${lithium_component_dir}/sandbox.cpp diff --git a/src/App.cpp b/src/App.cpp index e149154a..3e4cc42b 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -26,6 +26,10 @@ Description: Main Entry using namespace Lithium::Terminal; #endif +#if ENABLE_WEBPANEL +#include "server/App.hpp" +#endif + #include #include #include @@ -168,15 +172,17 @@ int main(int argc, char *argv[]) { terminal.run(); } } else { - if (Lithium::MyApp->GetConfig("config/server/debug").get()) { - Lithium::MyApp->SetConfig( - {{"key", "config/server/debug"}, {"value", false}}); - DLOG_F(INFO, "Disable debug mode"); - } + Lithium::MyApp->SetConfig( + {{"key", "config/server/debug"}, {"value", false}}); + DLOG_F(INFO, "Disable debug mode"); } } catch (const std::bad_any_cast &e) { LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); } +#if ENABLE_WEBPANEL + runServer(argc, argv); +#endif + return 0; } \ No newline at end of file diff --git a/src/addon/compiler.hpp b/src/addon/compiler.hpp index bbe8104f..4a9b63b8 100644 --- a/src/addon/compiler.hpp +++ b/src/addon/compiler.hpp @@ -19,6 +19,7 @@ Description: Compiler #include #include #include +#include namespace Lithium { class Compiler { @@ -69,8 +70,8 @@ class Compiler { * 查找可用的编译器 * @return 可用的编译器列表 */ - [[nodiscard]]std::vector findAvailableCompilers(); - + [[nodiscard]] std::vector findAvailableCompilers(); + /** * 运行外部 shell 命令,并将标准输入输出流转发到命令的标准输入输出流中 * @param command 要运行的命令 diff --git a/src/addon/finder.cpp b/src/addon/finder.cpp deleted file mode 100644 index e60a1a6e..00000000 --- a/src/addon/finder.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * finder.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-1-4 - -Description: Addons finder - -**************************************************/ - -#include "finder.hpp" - -#include "atom/log/loguru.hpp" - -namespace Lithium { -DirContainer::DirContainer(const std::filesystem::path &path) : m_path(path) {} - -const std::filesystem::path &DirContainer::getPath() const { return m_path; } - -const std::vector &DirContainer::getSubdirs() const { - return m_subdirs; -} - -const std::vector &DirContainer::getFiles() const { - return m_files; -} - -void DirContainer::addSubdir(const DirContainer &subdir) { - m_subdirs.push_back(subdir); -} - -void DirContainer::addFile(const std::filesystem::path &file) { - m_files.push_back(file); -} - -AddonFinder::FilterFunction AddonFinder::m_filterFunc = nullptr; - -AddonFinder::AddonFinder(const std::filesystem::path &path, - const FilterFunction &filterFunc) - : m_path(path), m_dirContainer(m_path) {} - -bool AddonFinder::traverseDir(const std::filesystem::path &path) { - if (std::filesystem::exists(m_path) && - std::filesystem::is_directory(m_path)) { - traverseDir(m_path, m_dirContainer); - } else { - LOG_F(ERROR, "Invalid path: {}", m_path.string()); - return false; - } - return true; -} - -std::vector AddonFinder::getAvailableDirs() const { - std::vector matchingSubdirs; - - // Recursive function to find matching subdirectories - std::function findMatchingSubdirs = - [&](const DirContainer &dir) { - for (const auto &subdir : dir.getSubdirs()) { - if (!m_filterFunc && m_filterFunc(subdir.getPath())) { - matchingSubdirs.push_back( - subdir.getPath().filename().string()); - } - findMatchingSubdirs(subdir); - } - }; - - findMatchingSubdirs(m_dirContainer); - - return matchingSubdirs; -} - -bool AddonFinder::hasFile(const std::filesystem::path &path, - const std::string &filename) { - for (const auto &entry : std::filesystem::directory_iterator(path)) { - if (entry.is_directory()) { - if (hasFile(entry.path(), filename)) { - return true; - } - } else { - if (entry.path().filename() == filename) { - return true; - } - } - } - return false; -} - -void AddonFinder::traverseDir(const std::filesystem::path &path, - DirContainer &container) { - for (const auto &entry : std::filesystem::directory_iterator(path)) { - if (entry.is_directory()) { - DirContainer subdir(entry.path()); - traverseDir(entry.path(), subdir); - if (!subdir.getFiles().empty()) { - container.addSubdir(subdir); - } - } else { - if (!m_filterFunc || m_filterFunc(entry.path())) { - container.addFile(entry.path()); - } - } - } -} -} // namespace Lithium diff --git a/src/addon/finder.hpp b/src/addon/finder.hpp deleted file mode 100644 index fb7c5507..00000000 --- a/src/addon/finder.hpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * finder.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-1-4 - -Description: Component finder (the core of the plugin system) - -**************************************************/ - -#pragma once - -#include -#include -#include - -namespace Lithium { -/** - * @brief The DirContainer class represents a container for directory contents. - */ -class DirContainer { -public: - /** - * @brief Constructs a DirContainer object with the specified path. - * @param path The path of the directory represented by this container. - */ - explicit DirContainer(const std::filesystem::path &path); - - /** - * @brief Gets the path of the directory represented by this container. - * @return The path of the directory represented by this container. - */ - const std::filesystem::path &getPath() const; - - /** - * @brief Gets the subdirectories of the directory represented by this - * container. - * @return The subdirectories of the directory represented by this - * container. - */ - const std::vector &getSubdirs() const; - - /** - * @brief Gets the files of the directory represented by this container. - * @return The files of the directory represented by this container. - */ - const std::vector &getFiles() const; - - /** - * @brief Adds a subdirectory to the directory represented by this - * container. - * @param subdir The subdirectory to add. - */ - void addSubdir(const DirContainer &subdir); - - /** - * @brief Adds a file to the directory represented by this container. - * @param file The file to add. - */ - void addFile(const std::filesystem::path &file); - -private: - std::filesystem::path m_path; /**< The path of the directory. */ - std::vector - m_subdirs; /**< Subdirectories within the directory. */ - std::vector - m_files; /**< Files within the directory. */ -}; - -/** - * @brief The AddonFinder class is responsible for finding components within a - * given directory. - */ -class AddonFinder { -public: - /** - * @brief FilterFunction represents a function type used for filtering - * paths. - */ - using FilterFunction = std::function; - - /** - * @brief Constructs a AddonFinder object with the specified path and filter - * function. - * @param path The path to the directory to search for components. - * @param filterFunc The function used to filter paths within the directory - * (optional). - */ - explicit AddonFinder(const std::filesystem::path &path, - const FilterFunction &filterFunc = {}); - - /** - * @brief Traverses the directory structure and populates the DirContainer - * object. - * @param path The path of the directory to traverse. - * @return True if the traversal was successful, false otherwise. - */ - bool traverseDir(const std::filesystem::path &path); - - /** - * @brief Gets the names of the subdirectories that match the filter - * function. - * @return The names of the subdirectories that match the filter function. - */ - std::vector getAvailableDirs() const; - - /** - * @brief Checks if a file with the specified name exists within the given - * path. - * @param path The path to the directory to search for the file. - * @param filename The name of the file to search for. - * @return True if the file exists, false otherwise. - */ - static bool hasFile(const std::filesystem::path &path, - const std::string &filename); - -private: - /** - * @brief Recursively traverses the directory structure and populates the - * DirContainer object. - * @param path The path of the directory to traverse. - * @param container The DirContainer object to populate with directory - * contents. - */ - static void traverseDir(const std::filesystem::path &path, - DirContainer &container); - -private: - std::filesystem::path m_path; /**< The path of the directory. */ - DirContainer m_dirContainer; /**< The DirContainer object representing the - directory. */ - static FilterFunction - m_filterFunc; /**< The filter function for path filtering. */ -}; -} // namespace Lithium - -/* -// Example filter function: exclude files with ".txt" extension -bool filterFunc(const std::filesystem::path &path) -{ - return path.extension() != ".txt"; -} - -// Example check function: check if "example.txt" file exists in subdir -bool checkFunc(const std::filesystem::path &path) -{ - return AddonFinder::hasFile(path, "example.txt"); -} - -int main(int argc, char *argv[]) -{ - if (argc != 2) - { - std::cerr << "Usage: " << argv[0] << " " << std::endl; - return -1; - } - - std::filesystem::path path(argv[1]); - if (!std::filesystem::exists(path) || !std::filesystem::is_directory(path)) - { - std::cerr << "Invalid path: " << argv[1] << std::endl; - return -1; - } - - AddonFinder finder(path, filterFunc); - finder.print(); - - // Check if "example.txt" file exists in subdirs - AddonFinder exampleFinder(path, checkFunc); - if (exampleFinder.hasFile(path, "package.json")) - { - std::cout << "Found 'example.txt' in subdirs." << std::endl; - } - else - { - std::cout << "Did not find 'example.txt' in subdirs." << std::endl; - } - - return 0; -} - -*/ diff --git a/src/addon/sandbox.cpp b/src/addon/sandbox.cpp index 9df9aa97..63bb308e 100644 --- a/src/addon/sandbox.cpp +++ b/src/addon/sandbox.cpp @@ -86,7 +86,7 @@ bool Sandbox::run() { commandLine += ' ' + arg; } - if (!CreateProcess(nullptr, Atom::Utils::CharToLPWSTR(commandLine.data()), + if (!CreateProcess(nullptr, commandLine.data(), nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, nullptr, &startupInfo, &processInfo)) { return false; diff --git a/src/atom/server/message_bus.hpp b/src/atom/server/message_bus.hpp index 30a48898..4b985221 100644 --- a/src/atom/server/message_bus.hpp +++ b/src/atom/server/message_bus.hpp @@ -222,7 +222,7 @@ class MessageBus { { std::unique_lock lock(waitingMutex_); - messageAvailableFlag_.wait(lock, stopToken, [this] { + messageAvailableFlag_.wait(lock, [this] { return !messageQueue_.empty(); }); if (stopToken.stop_requested()) { @@ -319,7 +319,8 @@ class MessageBus { } private: - using SubscriberCallback = std::function; + // using SubscriberCallback = std::function; + using SubscriberCallback = std::any; using SubscriberList = std::vector>; using SubscriberMap = std::unordered_map; diff --git a/src/server/App.cpp b/src/server/App.cpp index 2f5298c3..a32c4923 100644 --- a/src/server/App.cpp +++ b/src/server/App.cpp @@ -12,293 +12,34 @@ Description: Main **************************************************/ -#ifdef ENABLE_WEB_SERVER -// This is for debug only, please remove it in production -// Oatpp server is still experimental, it may be improved in the future -#include "AppComponent.hpp" +#include "App.hpp" -#ifdef ENABLE_ASYNC -#include "controller/AsyncConfigController.hpp" -#include "controller/AsyncDeviceController.hpp" -#include "controller/AsyncIOController.hpp" -#include "controller/AsyncProcessController.hpp" -#include "controller/AsyncStaticController.hpp" -#include "controller/AsyncSystemController.hpp" -#include "controller/AsyncUploadController.hpp" -// #include "controller/AsyncWebSocketController.hpp" -#include "controller/AsyncClientController.hpp" -#include "oatpp-swagger/AsyncController.hpp" -#else -#include "oatpp-swagger/Controller.hpp" -#endif +#include "./Runner.hpp" -#include "oatpp/network/Server.hpp" - -#define ADD_CONTROLLER(controller, docEndpoints, router, logMessage) \ - auto controller##_ptr = controller::createShared(); \ - docEndpoints.append(controller##_ptr->getEndpoints()); \ - router->addController(controller##_ptr); \ - DLOG_F(INFO, logMessage " loaded"); - -#endif -#include - -#include "lithiumapp.hpp" - -#include "atom/log/loguru.hpp" -#include "atom/server/global_ptr.hpp" -#include "atom/system/crash.hpp" -#include "atom/web/utils.hpp" - -// TODO: This is for debug only, please remove it in production -#define ENABLE_TERMINAL 1 -#if ENABLE_TERMINAL -#include "debug/terminal.hpp" -using namespace Lithium::Terminal; -#endif - -#include -#include -#include -#ifdef _WIN32 -#include -#else -#include -#endif - -void BusLoggerFunction(void *user_data, const loguru::Message &message) { - Lithium::MyApp->sendJsonMessage("log", {{"message", message.message}, - {"level", message.verbosity}, - {"file", message.filename}, - {"line", message.line}, - {"timestamp", message.preamble}}); -} - -#ifdef ENABLE_WEB_SERVER -void runServer() { - DLOG_F(INFO, "Loading App component ..."); -#if ENABLE_IPV6 - AppComponent components( - Lithium::MyApp->GetConfig("config/server").value("host", "::"), - Lithium::MyApp->GetConfig("config/server") - .value("port", 8000)); // Create scope Environment components -#else - DLOG_F(INFO, "Server host:", Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("host", "0.0.0.0")); - DLOG_F(INFO, "Server port:", Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("port", 8000)); - AppComponent components( - Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("host", "0.0.0.0"), - Lithium::MyApp->GetConfig({"key", "config/server"}) - .value("port", 8000)); // Create scope Environment components -#endif - DLOG_F(INFO, "App component loaded"); - - /* Get router component */ - OATPP_COMPONENT(std::shared_ptr, router); - oatpp::web::server::api::Endpoints docEndpoints; - /* Add routes & documents */ - - ADD_CONTROLLER(ConfigController, docEndpoints, router, - "AsyncConfigController"); - - ADD_CONTROLLER(StaticController, docEndpoints, router, - "AsyncStaticController"); - - ADD_CONTROLLER(SystemController, docEndpoints, router, - "AsyncSystemController"); - - // ADD_CONTROLLER(WebSocketController, docEndpoints, router, - // "AsyncWebSocketController"); - - ADD_CONTROLLER(IOController, docEndpoints, router, "AsyncIOController"); - - ADD_CONTROLLER(ProcessController, docEndpoints, router, - "AsyncProcessController"); - - ADD_CONTROLLER(ClientController, docEndpoints, router, - "AsyncClientController"); - - DLOG_F(INFO, "Starting to load API doc controller"); -#if ENABLE_ASYNC - router->addController( - oatpp::swagger::AsyncController::createShared(docEndpoints)); -#else - router->addController( - oatpp::swagger::Controller::createShared(docEndpoints)); -#endif - DLOG_F(INFO, "API doc controller loaded"); - - /* Load websocket route */ - // router->addController(WebSocketController::createShared()); - - /* Get connection handler component */ - OATPP_COMPONENT(std::shared_ptr, - connectionHandler, "http"); - - /* Get connection provider component */ - OATPP_COMPONENT(std::shared_ptr, - connectionProvider); +#include "./AppComponent.hpp" - DLOG_F(INFO, "Loaded server components ... Prepare for starting ..."); - /* create server */ - oatpp::network::Server server(connectionProvider, connectionHandler); - - DLOG_F(INFO, "Server running on port {}...", - connectionProvider->getProperty("port").toString()->c_str()); - - /* This is a block function that will be called when the server is started - */ - server.run(); -} -#endif +#include "oatpp/network/Server.hpp" +#include -// TODO: add network logger, not implemented yet -// struct MyNetworkLogger {}; +void run(const oatpp::base::CommandLineArguments& args) { + /* Register Components in scope of run() method */ + AppComponent components(args); -/** - * @brief setup log file - * @note This is called in main function - */ -void setupLogFile() { - std::filesystem::path logsFolder = std::filesystem::current_path() / "logs"; - if (!std::filesystem::exists(logsFolder)) { - std::filesystem::create_directory(logsFolder); - } - auto now = std::chrono::system_clock::now(); - auto now_time_t = std::chrono::system_clock::to_time_t(now); - std::tm *local_time = std::localtime(&now_time_t); - char filename[100]; - std::strftime(filename, sizeof(filename), "%Y%m%d_%H%M%S.log", local_time); - std::filesystem::path logFilePath = logsFolder / filename; - loguru::add_file(logFilePath.string().c_str(), loguru::Append, - loguru::Verbosity_MAX); + Runner runner(OATPP_GET_COMPONENT(oatpp::Object), + OATPP_GET_COMPONENT(std::shared_ptr)); - // MyNetworkLogger network_logger; - // TODO loguru::add_callback("network_logger", BusLoggerFunction, - // &network_logger, loguru::Verbosity_INFO); + runner.start(); - loguru::set_fatal_handler([](const loguru::Message &message) { - Atom::System::saveCrashLog(std::string(message.prefix) + - message.message); -#if ENABLE_WEB_SERVER - oatpp::base::Environment::destroy(); -#endif - }); + runner.join(); } -/** - * @brief main function - * @param argc number of arguments - * @param argv arguments - * @return 0 on success - */ -int main(int argc, char *argv[]) { - /* Add gettext */ -#if ENABLE_GETTEXT - bindtextdomain("lithium", "locale"); - /* Only write the following 2 lines if creating an executable */ - setlocale(LC_ALL, ""); - textdomain("lithium"); -#endif - - // Init loguru log system - loguru::init(argc, argv); - // Set log file - setupLogFile(); - - /* Parse arguments */ - argparse::ArgumentParser program("Lithium Server"); - - program.add_argument("-P", "--port") - .help("port the server running on") - .default_value(8000); - program.add_argument("-H", "--host") - .help("host the server running on") - .default_value("0.0.0.0"); - program.add_argument("-C", "--config") - .help("path to the config file") - .default_value("config.json"); - program.add_argument("-M", "--module-path") - .help("path to the modules directory") - .default_value("modules"); - program.add_argument("-W", "--web-panel") - .help("web panel") - .default_value(true); - program.add_argument("-L", "--log-file").help("path to log file"); - - program.add_description("Lithium Command Line Interface:"); - program.add_epilog("End."); - - program.parse_args(argc, argv); - - Lithium::InitLithiumApp(argc, argv); - // Run oatpp server - Lithium::MyApp = Lithium::LithiumApp::createShared(); - - auto cmd_port = program.get("--port"); - if (cmd_port != 8000) { - DLOG_F(INFO, "Command line server port : {}", cmd_port); - - auto port = - Lithium::MyApp->GetConfig("config/server").value("port", 8000); - if (port != cmd_port) { - Lithium::MyApp->SetConfig( - {{"key", "config/server/port"}, {"value", cmd_port}}); - DLOG_F(INFO, "Set server port to {}", cmd_port); - } - } - try { - auto cmd_host = program.get("--host"); - auto cmd_config_path = program.get("--config"); - auto cmd_module_path = program.get("--module-path"); - auto cmd_web_panel = program.get("--web-panel"); - - if (!cmd_host.empty()) { - Lithium::MyApp->SetConfig( - {{"key", "config/server/host"}, {"value", cmd_host}}); - DLOG_F(INFO, "Set server host to {}", cmd_host); - } - if (!cmd_config_path.empty()) { - Lithium::MyApp->SetConfig({{"key", "config/server/configpath"}, - {"value", cmd_config_path}}); - DLOG_F(INFO, "Set server config path to {}", cmd_config_path); - } - if (!cmd_module_path.empty()) { - Lithium::MyApp->SetConfig({{"key", "config/server/modulepath"}, - {"value", cmd_module_path}}); - DLOG_F(INFO, "Set server module path to {}", cmd_module_path); - } - - if (!cmd_web_panel) { - if (Lithium::MyApp->GetConfig("config/server/web").get()) { - Lithium::MyApp->SetConfig( - {{"key", "config/server/web"}, {"value", false}}); - DLOG_F(INFO, "Disable web panel"); - } - } - } catch (const std::bad_any_cast &e) { - LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); - } - -#if ENABLE_TERMINAL - Lithium::MyApp->SetConfig( - {{"key", "config/terminal/enabled"}, {"value", true}}); - - ConsoleTerminal terminal; - terminal.run(); +int runServer(int argc, const char* argv[]) { + oatpp::base::Environment::init(); -#endif + run(oatpp::base::CommandLineArguments(argc, argv)); -#if ENABLE_WEB_SERVER - oatpp::base::Environment::init(); - // Run the main server - runServer(); - // Clean up all oatpp::base::Environment::destroy(); -#endif return 0; -} \ No newline at end of file +} diff --git a/src/server/App.hpp b/src/server/App.hpp new file mode 100644 index 00000000..69fee2f3 --- /dev/null +++ b/src/server/App.hpp @@ -0,0 +1,6 @@ +#ifndef LITHIUM_SERVER_APP_HPP +#define LITHIUM_SERVER_APP_HPP + +int runServer(int argc, const char* argv[]); + +#endif diff --git a/src/server/AppComponent.hpp b/src/server/AppComponent.hpp index 0d1ec5c0..b43228f9 100644 --- a/src/server/AppComponent.hpp +++ b/src/server/AppComponent.hpp @@ -21,13 +21,10 @@ Description: App Components #include "config/HubsConfig.hpp" #include "websocket/Registry.hpp" -#if ENABLE_ASYNC + +// Websocket #include "oatpp-websocket/AsyncConnectionHandler.hpp" #include "oatpp/web/server/AsyncHttpConnectionHandler.hpp" -#else -#include "oatpp-websocket/ConnectionHandler.hpp" -#include "oatpp/web/server/HttpConnectionHandler.hpp" -#endif #include "ErrorHandler.hpp" @@ -42,6 +39,7 @@ Description: App Components #include "oatpp/web/protocol/http/incoming/SimpleBodyDecoder.hpp" #include "oatpp/web/server/HttpRouter.hpp" #include "oatpp/web/server/interceptor/AllowCorsGlobal.hpp" + #if ENABLE_DEBUG #include "oatpp/network/virtual_/Interface.hpp" #include "oatpp/network/virtual_/server/ConnectionProvider.hpp" @@ -49,9 +47,12 @@ Description: App Components #include "components/SwaggerComponent.hpp" +// SSL #include "oatpp-openssl/Config.hpp" #include "oatpp-openssl/configurer/TrustStore.hpp" #include "oatpp-openssl/server/ConnectionProvider.hpp" + +// GZip #include "oatpp-zlib/EncoderProvider.hpp" #include @@ -59,62 +60,51 @@ Description: App Components // #include "data/SystemCustom.hpp" +#include + /** - * Class which creates and holds Application components and registers - * components in oatpp::base::Environment Order of components initialization is - * from top to bottom + * Class which creates and holds Application components and registers components in oatpp::base::Environment + * Order of components initialization is from top to bottom */ class AppComponent { - /* note: though I don't like this kind of initialization, but I don't know - * how to do it in a better way, segmentation fault ! */ private: - oatpp::String m_host; - v_uint16 m_port; + oatpp::base::CommandLineArguments m_cmdArgs; +public: + AppComponent(const oatpp::base::CommandLineArguments& cmdArgs) + : m_cmdArgs(cmdArgs) + {} +public: - oatpp::base::CommandLineArguments m_cmdArgs; // command line arguments + /** + * Create config component + */ + OATPP_CREATE_COMPONENT(oatpp::Object, appConfig)([this] { + auto config = ConfigDto::createShared(); -public: - /** - * Create components - * @param host - host name - * @param port - port number - */ - explicit AppComponent(oatpp::String host, v_uint16 port) - : m_host(host), m_port(port) {} - /** - * Swagger component - */ - SwaggerComponent swaggerComponent; - - /** - * Create config component - */ - OATPP_CREATE_COMPONENT(oatpp::Object, appConfig) - ([this] { - auto config = ConfigDto::createShared(); - - auto hostServer = ServerConfigDto::createShared(); - hostServer->host = "0.0.0.0"; - hostServer->port = 8000; - - auto clientServer = ServerConfigDto::createShared(); - clientServer->host = "0.0.0.0"; - clientServer->port = 8001; - - config->hostAPIServer = hostServer; - config->clientAPIServer = clientServer; + auto hostServer = ServerConfigDto::createShared(); + hostServer->host = "0.0.0.0"; + hostServer->port = 8000; - return config; - }()); + auto clientServer = ServerConfigDto::createShared(); + clientServer->host = "0.0.0.0"; + clientServer->port = 8001; + + config->hostAPIServer = hostServer; + config->clientAPIServer = clientServer; - /** - * Hub configs - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, hubConfig) + return config; + }()); + + /** + * Hub configs + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, hubConfig) ([] { + // We specify the default config here auto config = std::make_shared(nullptr); auto Hub1 = HubConfigDto::createShared(); auto Hub2 = HubConfigDto::createShared(); + // Script and device are the default hubs Hub1->hubId = "device"; Hub2->hubId = "script"; config->putHubConfig(Hub1); @@ -122,182 +112,56 @@ class AppComponent { return config; }()); -#if ENABLE_ASYNC - /** - * Create Async Executor - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, executor) - ([] { - return std::make_shared( - std::thread::hardware_concurrency() + - 2 /* Data-Processing threads */, - 1 /* I/O threads */, 1 /* Timer threads */ - ); - }()); -#endif + /** + * Create Async Executor + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, executor)([] { + return std::make_shared(); + }()); + + /** + * Create Router component + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, httpRouter)([] { + return oatpp::web::server::HttpRouter::createShared(); + }()); + + /** + * Create ObjectMapper component to serialize/deserialize DTOs in Contoller's API + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, apiObjectMapper)(Constants::COMPONENT_REST_API,[] { + auto mapper = oatpp::parser::json::mapping::ObjectMapper::createShared(); + mapper->getSerializer()->getConfig()->includeNullFields = false; + return mapper; + }()); + + /** + * Create ObjectMapper component to serialize/deserialize DTOs in WS communication + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, wsApiObjectMapper)(Constants::COMPONENT_WS_API,[] { + auto mapper = oatpp::parser::json::mapping::ObjectMapper::createShared(); + mapper->getSerializer()->getConfig()->includeNullFields = false; + return mapper; + }()); + + /** + * Create games sessions Registry component. + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, gamesSessionsRegistry)([] { + return std::make_shared(); + }()); + + /** + * Create websocket connection handler + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, websocketConnectionHandler)(Constants::COMPONENT_WS_API, [] { + OATPP_COMPONENT(std::shared_ptr, executor); + OATPP_COMPONENT(std::shared_ptr, registry); + auto connectionHandler = oatpp::websocket::AsyncConnectionHandler::createShared(executor); + connectionHandler->setSocketInstanceListener(registry); + return connectionHandler; + }()); - /** - * Create Debug virtual interface component - */ -#if ENABLE_DEBUG - OATPP_CREATE_COMPONENT(std::shared_ptr, - virtualInterface) - ([] { - return oatpp::network::virtual_::Interface::obtainShared("virtualhost"); - }()); -#endif - - /** - * Create Router component - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - httpRouter) - ([] { return oatpp::web::server::HttpRouter::createShared(); }()); - - /** - * Create ObjectMapper component to serialize/deserialize DTOs in - * Controller's API - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - apiObjectMapper) - (Constants::COMPONENT_REST_API, [] { - /* create serializer and deserializer configurations */ - auto serializeConfig = - oatpp::parser::json::mapping::Serializer::Config::createShared(); - auto deserializeConfig = - oatpp::parser::json::mapping::Deserializer::Config::createShared(); - - /* enable beautifier */ - serializeConfig->useBeautifier = true; - - auto objectMapper = - oatpp::parser::json::mapping::ObjectMapper::createShared( - serializeConfig, deserializeConfig); - objectMapper->getDeserializer()->getConfig()->allowUnknownFields = - false; - - // objectMapper->getSerializer()->getConfig()->enabledInterpretations = - // { - // "system::memory"}; - // objectMapper->getDeserializer()->getConfig()->enabledInterpretations - // = { - // "system::memory"}; - return objectMapper; - }()); - - /** - * Create ObjectMapper component to serialize/deserialize DTOs in WS - * communication - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - wsApiObjectMapper) - (Constants::COMPONENT_WS_API, [] { - auto mapper = - oatpp::parser::json::mapping::ObjectMapper::createShared(); - mapper->getSerializer()->getConfig()->includeNullFields = false; - return mapper; - }()); - - /** - * Create hubs sessions Registry component. - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, hubsSessionsRegistry) - ([] { return std::make_shared(); }()); - - /** - * Create ConnectionProvider component which listens on the port - */ - OATPP_CREATE_COMPONENT( - std::shared_ptr, - serverConnectionProvider) - ([this] { - std::shared_ptr - connectionProvider; - if (m_port == 0) { -#if ENABLE_DEBUG - OATPP_COMPONENT( - std::shared_ptr, - interface); - connectionProvider = oatpp::network::virtual_::server:: - ConnectionProvider::createShared(interface); -#endif - } else { - connectionProvider = - oatpp::network::tcp::server::ConnectionProvider::createShared( -#if ENABLE_IPV6 - { m_host, m_port, oatpp::network::Address::IP_6 } -#else - {m_host, m_port, oatpp::network::Address::IP_4} -#endif - ); - } - return connectionProvider; - }()); - - /** - * Create ConnectionHandler component which uses Router component to route - * requests - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - serverConnectionHandler) - ("http", [] { // get JWT component - OATPP_COMPONENT(std::shared_ptr, - router); // get Router component - OATPP_COMPONENT(std::shared_ptr, - objectMapper); // get ObjectMapper component - /* Create HttpProcessor::Components */ - auto components = - std::make_shared( - router); - - /* Add content encoders */ - auto encoders = std::make_shared< - oatpp::web::protocol::http::encoding::ProviderCollection>(); - encoders->add(std::make_shared()); - encoders->add(std::make_shared()); - /* Set content encoders */ - components->contentEncodingProviders = encoders; - - auto decoders = std::make_shared< - oatpp::web::protocol::http::encoding::ProviderCollection>(); - decoders->add(std::make_shared()); - decoders->add(std::make_shared()); - /* Set Body Decoder */ - components->bodyDecoder = std::make_shared< - oatpp::web::protocol::http::incoming::SimpleBodyDecoder>(decoders); - -#if ENABLE_ASYNC - OATPP_COMPONENT(std::shared_ptr, - executor); // get Async executor component - auto connectionHandler = - oatpp::web::server::AsyncHttpConnectionHandler::createShared( - components, executor); - connectionHandler->setErrorHandler( - std::make_shared(objectMapper)); -#else - auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(components); - connectionHandler->setErrorHandler(std::make_shared(objectMapper)); -#endif - return connectionHandler; - }()); - - /** - * Create websocket connection handler - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - websocketConnectionHandler) - (Constants::COMPONENT_WS_API, [] { - OATPP_COMPONENT(std::shared_ptr, executor); - OATPP_COMPONENT(std::shared_ptr, registry); -#if ENABLE_ASYNC - auto connectionHandler = - oatpp::websocket::AsyncConnectionHandler::createShared(executor); - connectionHandler->setSocketInstanceListener(registry); -#else - auto connectionHandler = oatpp::websocket::ConnectionHandler::createShared(); -#endif - return connectionHandler; - }()); }; #endif /* LITHIUM_APP_COMPONENT_HPP */ \ No newline at end of file diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/server/Launcher.cpp b/src/server/Launcher.cpp deleted file mode 100644 index d2a75bb0..00000000 --- a/src/server/Launcher.cpp +++ /dev/null @@ -1,69 +0,0 @@ - -#include "LauncherComponent.hpp" - -#include "controller/AuthController.hpp" -#include "controller/StaticController.hpp" -#include "controller/StoryController.hpp" - - -#include "oatpp-swagger/Controller.hpp" - -#include "oatpp/network/Server.hpp" - -#include - -void run() { - AppComponent components; // Create scope Environment components - - /* create ApiControllers and add endpoints to router */ - - auto router = components.httpRouter.getObject(); - - oatpp::web::server::api::Endpoints docEndpoints; - - docEndpoints.append( - router->addController(AuthController::createShared())->getEndpoints()); - docEndpoints.append( - router->addController(StoryController::createShared())->getEndpoints()); - - router->addController( - oatpp::swagger::Controller::createShared(docEndpoints)); - router->addController(StaticController::createShared()); - - /* create server */ - - oatpp::network::Server server( - components.serverConnectionProvider.getObject(), - components.serverConnectionHandler.getObject()); - - OATPP_LOGD("Server", "Running on port %s...", - components.serverConnectionProvider.getObject() - ->getProperty("port") - .toString() - ->c_str()); - - server.run(); -} - -/** - * main - */ -int main(int argc, const char *argv[]) { - oatpp::base::Environment::init(); - - run(); - - /* Print how much objects were created during app running, and what have - * left-probably leaked */ - /* Disable object counting for release builds using '-D - * OATPP_DISABLE_ENV_OBJECT_COUNTERS' flag for better performance */ - std::cout << "\nEnvironment:\n"; - std::cout << "objectsCount = " - << oatpp::base::Environment::getObjectsCount() << "\n"; - std::cout << "objectsCreated = " - << oatpp::base::Environment::getObjectsCreated() << "\n\n"; - - oatpp::base::Environment::destroy(); - - return 0; -} diff --git a/src/server/LauncherComponent.hpp b/src/server/LauncherComponent.hpp deleted file mode 100644 index 21572946..00000000 --- a/src/server/LauncherComponent.hpp +++ /dev/null @@ -1,109 +0,0 @@ - -#ifndef AppComponent_hpp -#define AppComponent_hpp - -#include "components/DatabaseComponent.hpp" -#include "components/SwaggerComponent.hpp" - - -#include "ErrorHandler.hpp" - -#include "interceptor/AuthInterceptor.hpp" -#include "oatpp/web/server/interceptor/AllowCorsGlobal.hpp" - - -#include "oatpp/network/tcp/server/ConnectionProvider.hpp" -#include "oatpp/web/server/HttpConnectionHandler.hpp" -#include "oatpp/web/server/HttpRouter.hpp" - - -#include "oatpp/parser/json/mapping/ObjectMapper.hpp" - -#include "oatpp/core/macro/component.hpp" - -/** - * Class which creates and holds Application components and registers - * components in oatpp::base::Environment Order of components initialization is - * from top to bottom - */ -class AppComponent { -public: - /** - * Swagger component - */ - SwaggerComponent swaggerComponent; - - /** - * Database component - */ - DatabaseComponent databaseComponent; - - OATPP_CREATE_COMPONENT(std::shared_ptr, jwt) - ([] { return std::make_shared("", ""); }()); - - /** - * Create ObjectMapper component to serialize/deserialize DTOs in - * Contoller's API - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - apiObjectMapper) - ([] { - auto objectMapper = - oatpp::parser::json::mapping::ObjectMapper::createShared(); - objectMapper->getDeserializer()->getConfig()->allowUnknownFields = - false; - return objectMapper; - }()); - - /** - * Create ConnectionProvider component which listens on the port - */ - OATPP_CREATE_COMPONENT( - std::shared_ptr, - serverConnectionProvider) - ([] { - return oatpp::network::tcp::server::ConnectionProvider::createShared( - {"0.0.0.0", 8000, oatpp::network::Address::IP_4}); - }()); - - /** - * Create Router component - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - httpRouter) - ([] { return oatpp::web::server::HttpRouter::createShared(); }()); - - /** - * Create ConnectionHandler component which uses Router component to route - * requests - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, - serverConnectionHandler) - ([] { - OATPP_COMPONENT(std::shared_ptr, jwt); // get JWT component - OATPP_COMPONENT(std::shared_ptr, - router); // get Router component - OATPP_COMPONENT(std::shared_ptr, - objectMapper); // get ObjectMapper component - - auto connectionHandler = - oatpp::web::server::HttpConnectionHandler::createShared(router); - - connectionHandler->setErrorHandler( - std::make_shared(objectMapper)); - - connectionHandler->addRequestInterceptor( - std::make_shared< - oatpp::web::server::interceptor::AllowOptionsGlobal>()); - connectionHandler->addRequestInterceptor( - std::make_shared(jwt)); - - connectionHandler->addResponseInterceptor( - std::make_shared< - oatpp::web::server::interceptor::AllowCorsGlobal>()); - - return connectionHandler; - }()); -}; - -#endif /* AppComponent_hpp */ diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp index 55bcf475..86f10e34 100644 --- a/src/utils/constant.hpp +++ b/src/utils/constant.hpp @@ -23,11 +23,10 @@ class constants { #ifdef _WIN32 #if defined(__MINGW32__) || defined(__MINGW64__) static constexpr const char* PATH_SEPARATOR = "/"; - static constexpr const char* LIB_EXTENSION = ".dll"; #else static constexpr const char* PATH_SEPARATOR = "\\"; - static constexpr const char* LIB_EXTENSION = ".dll"; #endif + static constexpr const char* LIB_EXTENSION = ".dll"; #elif defined(__APPLE__) static constexpr const char* PATH_SEPARATOR = "/"; static constexpr const char* LIB_EXTENSION = ".dylib"; @@ -61,25 +60,14 @@ class constants { #endif #ifdef _WIN32 - static const std::vector COMMON_COMPILERS = { - "cl.exe", "g++.exe", "clang++.exe"}; - static const std::vector COMPILER_PATHS = { - "C:\\Program Files (x86)\\Microsoft Visual " - "Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29." - "30133\\bin\\Hostx64\\x64", - "C:\\Program Files\\Microsoft Visual " - "Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.35." - "32215\\bin\\Hostx64\\x64", - "C:\\msys64\\mingw64\\bin", "C:\\MinGW\\bin", - "C:\\Program Files\\LLVM\\bin"}; + static std::vector COMMON_COMPILERS; + static std::vector COMPILER_PATHS; #elif __APPLE__ - static const std::vector COMMON_COMPILERS = {"clang++", "g++"}; - static const std::vector COMPILER_PATHS = { - "/usr/bin", "/usr/local/bin", "/opt/local/bin"}; + static std::vector COMMON_COMPILERS; + static std::vector COMPILER_PATHS; #elif __linux__ - static const std::vector COMMON_COMPILERS = {"g++", "clang++"}; - static const std::vector COMPILER_PATHS = {"/usr/bin", - "/usr/local/bin"}; + static std::vector COMMON_COMPILERS; + static std::vector COMPILER_PATHS; #endif // Env info @@ -92,4 +80,26 @@ class constants { static constexpr const char* LITHIUM_UTILS_ENV = "lithium.utils.env"; }; +#ifdef _WIN32 +std::vector constants::COMMON_COMPILERS = {"cl.exe", "g++.exe", + "clang++.exe"}; +std::vector constants::COMPILER_PATHS = { + "C:\\Program Files (x86)\\Microsoft Visual " + "Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29." + "30133\\bin\\Hostx64\\x64", + "C:\\Program Files\\Microsoft Visual " + "Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.35." + "32215\\bin\\Hostx64\\x64", + "C:\\msys64\\mingw64\\bin", "C:\\MinGW\\bin", + "C:\\Program Files\\LLVM\\bin"}; +#elif __APPLE__ +std::vector constants::COMMON_COMPILERS = {"clang++", "g++"}; +std::vector constants::COMPILER_PATHS = { + "/usr/bin", "/usr/local/bin", "/opt/local/bin"}; +#elif __linux__ +std::vector constants::COMMON_COMPILERS = {"g++", "clang++"}; +std::vector constants::COMPILER_PATHS = {"/usr/bin", + "/usr/local/bin"}; +#endif + #endif // LITHIUM_UTILS_CONSTANTS_HPP From 210d70b0b780e202409ea45260228af6ed3ffe08 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 20 Apr 2024 01:35:03 +0800 Subject: [PATCH 19/28] update -- clean up webclient -- fix some bugs --- src/atom/server/global_ptr.hpp | 30 +- src/atom/utils/argsview.cpp | 70 ++++ src/atom/utils/argsview.hpp | 113 +++++++ src/atom/utils/string.cpp | 154 +++++---- src/atom/utils/string.hpp | 104 ++++-- src/atom/utils/switch.hpp | 160 ++++------ websrc/cobalt-web/package-lock.json | 82 ----- websrc/cobalt-web/package.json | 4 - websrc/cobalt-web/src/assets/imgs/bg.jpg | Bin 0 -> 5146384 bytes .../src/components/skymap/aladin_wrapper.tsx | 127 ++++---- .../cobalt-web/src/{index.css => index.less} | 15 +- .../src/interfaces/GlobalParameters.d.ts | 5 + .../src/layout/header/QuickControlComp.tsx | 51 +++ websrc/cobalt-web/src/layout/header/index.tsx | 39 +++ .../cobalt-web/src/layout/header/style.less | 51 +++ websrc/cobalt-web/src/layout/index.tsx | 7 +- .../src/layout/navigation/index.tsx | 12 +- .../src/layout/navigation/style.less | 0 websrc/cobalt-web/src/layout/style.less | 17 +- websrc/cobalt-web/src/main.tsx | 4 +- websrc/cobalt-web/src/pages/connect.tsx | 239 -------------- .../src/pages/dashboard/CameraView.tsx | 89 ------ .../src/pages/dashboard/FloatingUI.tsx | 74 ----- .../src/pages/dashboard/FloatingWindow.tsx | 140 -------- .../cobalt-web/src/pages/dashboard/Footer.tsx | 10 - .../src/pages/dashboard/ParameterModal.tsx | 56 ---- .../src/pages/dashboard/SystemPanel.tsx | 251 --------------- .../src/pages/dashboard/Toolbar.tsx | 47 --- .../cobalt-web/src/pages/dashboard/index.tsx | 108 ------- .../cobalt-web/src/pages/dashboard/style.tsx | 26 -- .../src/pages/dashboard/style/Footer.tsx | 19 -- .../pages/dashboard/style/RightSidebar.tsx | 30 -- .../pages/dashboard/style/SquareButton.tsx | 23 -- .../src/pages/dashboard/style/main.tsx | 22 -- .../CaptureButton.tsx | 5 +- .../pages/dashboard2/actions/shoot/index.tsx | 10 +- .../dashboard2/comps/ui/ConsoleSelectComp.tsx | 2 + .../src/pages/home/init_ws_listener.tsx | 9 + websrc/cobalt-web/src/pages/search.tsx | 54 ---- websrc/cobalt-web/src/pages/settings.tsx | 299 ------------------ websrc/cobalt-web/src/pages/websocket.tsx | 181 ----------- websrc/cobalt-web/src/routes/root.tsx | 22 -- websrc/cobalt-web/src/store/connectModel.ts | 217 ++++++++----- websrc/cobalt-web/src/store/globalStore.tsx | 57 ++-- .../cobalt-web/src/store/globalStoreModel.ts | 1 - 45 files changed, 847 insertions(+), 2189 deletions(-) create mode 100644 src/atom/utils/argsview.cpp create mode 100644 src/atom/utils/argsview.hpp create mode 100644 websrc/cobalt-web/src/assets/imgs/bg.jpg rename websrc/cobalt-web/src/{index.css => index.less} (74%) create mode 100644 websrc/cobalt-web/src/layout/header/QuickControlComp.tsx create mode 100644 websrc/cobalt-web/src/layout/header/index.tsx create mode 100644 websrc/cobalt-web/src/layout/header/style.less create mode 100644 websrc/cobalt-web/src/layout/navigation/style.less delete mode 100644 websrc/cobalt-web/src/pages/connect.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/CameraView.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/FloatingUI.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/FloatingWindow.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/Footer.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/ParameterModal.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/SystemPanel.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/Toolbar.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/index.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/style.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/style/Footer.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/style/RightSidebar.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/style/SquareButton.tsx delete mode 100644 websrc/cobalt-web/src/pages/dashboard/style/main.tsx rename websrc/cobalt-web/src/pages/{dashboard => dashboard2}/CaptureButton.tsx (90%) delete mode 100644 websrc/cobalt-web/src/pages/search.tsx delete mode 100644 websrc/cobalt-web/src/pages/settings.tsx delete mode 100644 websrc/cobalt-web/src/pages/websocket.tsx diff --git a/src/atom/server/global_ptr.hpp b/src/atom/server/global_ptr.hpp index 3cbe8696..15dad4e6 100644 --- a/src/atom/server/global_ptr.hpp +++ b/src/atom/server/global_ptr.hpp @@ -32,7 +32,7 @@ Description: Global shared pointer manager #include "atom/experiment/noncopyable.hpp" #define GetPtr GlobalSharedPtrManager::getInstance().getSharedPtr -#define GetWeakPtr GlobalSharedPtrManager::getInstance().getWeakPtr +#define GetWeakPtr GlobalSharedPtrManager::getInstance().getWeakPtrFromSharedPtr #define AddPtr GlobalSharedPtrManager::getInstance().addSharedPtr #define RemovePtr GlobalSharedPtrManager::getInstance().removeSharedPtr #define GetPtrOrCreate \ @@ -135,6 +135,19 @@ class GlobalSharedPtrManager : public NonCopyable { [[nodiscard]] std::shared_ptr getSharedPtrFromWeakPtr( const std::string &key); + /** + * @brief getWeakPtrFromSharedPtr retrieves a weak pointer from a shared + * pointer in the shared pointer map with the specified key. + * + * @tparam T the type of the shared pointer. + * @param key the key associated with the shared pointer. + * @return the weak pointer if the shared pointer is valid, an empty weak + * pointer otherwise. + */ + template + [[nodiscard]] std::weak_ptr getWeakPtrFromSharedPtr( + const std::string &key); + /** * @brief removeExpiredWeakPtrs removes all expired weak pointers from the * shared pointer map. Expired weak pointers are weak pointers whose shared @@ -275,6 +288,21 @@ std::shared_ptr GlobalSharedPtrManager::getSharedPtrFromWeakPtr( return std::shared_ptr(); } +template +std::weak_ptr GlobalSharedPtrManager::getWeakPtrFromSharedPtr( + const std::string &key) { + std::shared_lock lock(mtx); + auto it = sharedPtrMap.find(key); + if (it != sharedPtrMap.end()) { + try { + return std::weak_ptr(std::any_cast>(it->second)); + } catch (const std::bad_any_cast &) { + return std::weak_ptr(); + } + } + return std::weak_ptr(); +} + template void GlobalSharedPtrManager::addDeleter( const std::string &key, const std::function &deleter) { diff --git a/src/atom/utils/argsview.cpp b/src/atom/utils/argsview.cpp new file mode 100644 index 00000000..f2410a27 --- /dev/null +++ b/src/atom/utils/argsview.cpp @@ -0,0 +1,70 @@ +/* + * argsview.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-19 + +Description: ArgsView Class for C++ + +**************************************************/ + +#include "argsview.hpp" + +namespace Atom::Utils { +ArgsView::ArgsView(int argc, char** argv) : m_argc(argc), m_argv(argv) { + for (int i = 1; i < m_argc; ++i) { + std::string_view arg(m_argv[i]); + if (arg.substr(0, 2) == "--") { + auto pos = arg.find('='); + if (pos != std::string_view::npos) { + auto key = arg.substr(2, pos - 2); + if (!has(key)) { + m_args.emplace(key, arg.substr(pos + 1)); + } + } else { + auto flag = arg.substr(2); + if (!hasFlag(flag)) { + m_flags.emplace_back(flag); + } + } + } else { + for (const auto& rule : m_rules) { + if (arg.substr(0, rule.first.size()) == rule.first) { + rule.second(arg.substr(rule.first.size())); + break; + } + } + } + } +} + +std::optional ArgsView::get(std::string_view key) const { + if (auto it = m_args.find(key); it != m_args.end()) { + return it->second; + } + throw std::runtime_error(std::string("Key not found: ") + std::string(key)); +} + +bool ArgsView::has(std::string_view key) const { return m_args.count(key) > 0; } + +bool ArgsView::hasFlag(std::string_view flag) const { + return std::find(m_flags.begin(), m_flags.end(), flag) != m_flags.end(); +} + +std::vector ArgsView::getFlags() const { return m_flags; } + +std::unordered_map ArgsView::getArgs() + const { + return m_args; +} + +void ArgsView::addRule(std::string_view prefix, + std::function handler) { + m_rules.emplace_back(prefix, handler); +} + +} // namespace Atom::Utils diff --git a/src/atom/utils/argsview.hpp b/src/atom/utils/argsview.hpp new file mode 100644 index 00000000..ea890d66 --- /dev/null +++ b/src/atom/utils/argsview.hpp @@ -0,0 +1,113 @@ +/* + * argsview.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-19 + +Description: ArgsView Class for C++ + +**************************************************/ + +#ifndef ATOM_UTILS_ARGSVIEW_HPP +#define ATOM_UTILS_ARGSVIEW_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Atom::Utils { +/** + * @brief Represents a view of command-line arguments. + */ +class ArgsView { +public: + /** + * @brief Constructs an ArgsView object from argc and argv. + * + * @param argc The number of command-line arguments. + * @param argv The array of command-line arguments. + */ + explicit ArgsView(int argc, char** argv); + + /** + * @brief Gets the value associated with the specified key. + * + * @param key The key to search for. + * @return An optional containing the value if found, otherwise nullopt. + * @throws std::runtime_error if the key is not found. + */ + std::optional get(std::string_view key) const; + + /** + * @brief Gets the value associated with the specified key and converts it + * to the specified type. + * + * @tparam T The type to convert the value to. + * @param key The key to search for. + * @return An optional containing the converted value if found and + * successfully converted, otherwise nullopt. + */ + template + std::optional get(std::string_view key) const; + + /** + * @brief Checks if the specified key exists. + * + * @param key The key to search for. + * @return true if the key exists, otherwise false. + */ + bool has(std::string_view key) const; + + /** + * @brief Checks if the specified flag exists. + * + * @param flag The flag to search for. + * @return true if the flag exists, otherwise false. + */ + bool hasFlag(std::string_view flag) const; + + /** + * @brief Gets all the flags. + * + * @return A vector containing all the flags. + */ + std::vector getFlags() const; + + /** + * @brief Gets all the key-value pairs. + * + * @return An unordered_map containing all the key-value pairs. + */ + std::unordered_map getArgs() const; + + /** + * @brief Adds a custom rule with the specified prefix and handler function. + * + * @param prefix The prefix of the rule. + * @param handler The handler function for the rule. + */ + void addRule(std::string_view prefix, + std::function handler); + +private: + int m_argc; + char** m_argv; + std::unordered_map m_args; + std::vector m_flags; + std::vector< + std::pair>> + m_rules; +}; + +} // namespace Atom::Utils + +#endif \ No newline at end of file diff --git a/src/atom/utils/string.cpp b/src/atom/utils/string.cpp index 04062b0e..d534777d 100644 --- a/src/atom/utils/string.cpp +++ b/src/atom/utils/string.cpp @@ -18,125 +18,111 @@ Description: Some useful string functions #include #include +#include #include "atom/error/exception.hpp" namespace Atom::Utils { -bool hasUppercase(const std::string &str) { - // 判断字符串中是否存在大写字母 - // 参数: - // - str: 要检查的字符串 - // 返回值: - // - 如果字符串中存在大写字母,返回true;否则,返回false +bool hasUppercase(std::string_view str) { return std::any_of(str.begin(), str.end(), - [](char ch) { return std::isupper(ch); }); + [](unsigned char ch) { return std::isupper(ch); }); } -std::string toUnderscore(const std::string &str) { - std::string result; // 生成一个空字符串用于存储转换结果 - for (char ch : str) // 遍历输入字符串中的每个字符 - { - if (std::isupper(ch)) // 如果字符是大写字母 - { - result += '_'; // 在结果字符串前加上下划线 - result += - std::tolower(ch); // 将大写字母转换为小写字母并添加到结果字符串 - } else // 如果字符不是大写字母 - { - result += ch; // 直接将字符添加到结果字符串 +std::string toUnderscore(std::string_view str) { + std::string result; + result.reserve(str.size() + + std::count_if(str.begin(), str.end(), [](unsigned char ch) { + return std::isupper(ch); + })); + + for (char ch : str) { + if (std::isupper(ch)) { + result.push_back('_'); + result.push_back(std::tolower(ch)); + } else { + result.push_back(ch); } } - return result; // 返回转换后的字符串结果 + + return result; } -std::string toCamelCase(const std::string &str) { - std::string result; // 用于保存转换后的字符串结果 - bool capitalize = false; // 用于标记是否需要大写转换 - - for (char ch : str) // 遍历输入字符串 - { - if (ch == '_') // 如果遇到下划线 - { - capitalize = true; // 设置大写标记为true - } else // 如果不是下划线 - { - if (capitalize) // 如果需要大写转换 - { - result += - std::toupper(ch); // 将字符转换为大写并添加到结果字符串 - capitalize = false; // 清除大写标记 - } else // 如果不需要大写转换 - { - result += ch; // 直接将字符添加到结果字符串 - } +std::string toCamelCase(std::string_view str) { + std::string result; + result.reserve(str.size()); + + bool capitalize = false; + for (char ch : str) { + if (ch == '_') { + capitalize = true; + } else if (capitalize) { + result.push_back(std::toupper(ch)); + capitalize = false; + } else { + result.push_back(ch); } } - return result; // 返回转换后的字符串结果 + + return result; } -std::string urlEncode(const std::string &str) { - // 创建一个输出字符串流对象escaped,设置填充字符为'0',输出基数为十六进制 +std::string urlEncode(std::string_view str) { std::ostringstream escaped; escaped.fill('0'); escaped << std::hex; - // 遍历输入字符串str的每个字符 for (auto c : str) { - // 如果字符是alnum字符,或者字符是'-'、'_'、'.'、'~'之一,则直接将字符输出到escaped if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { escaped << c; - } - // 如果字符是空格,则将字符替换为'+' - else if (c == ' ') { + } else if (c == ' ') { escaped << '+'; - } - // 其他情况下,将字符替换为字符对应的百分比表示形式,例如 '%' + - // 十六进制字符的字符串形式 - else { - escaped << '%' << std::setw(2) << int((unsigned char)c); + } else { + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); } } - // 返回经过编码处理的字符串 return escaped.str(); } -std::string urlDecode(const std::string &str) { - // 初始化一个空字符串用于存储解码后的结果 +std::string urlDecode(std::string_view str) { std::string result; + result.reserve(str.size()); - // 遍历输入的字符串的每个字符 for (size_t i = 0; i < str.size(); ++i) { - // 如果当前字符是 '%',则进行编码解析 if (str[i] == '%') { + if (i + 2 >= str.size()) { + throw std::invalid_argument("urlDecode failed"); + } + int value; - std::istringstream is(str.substr(i + 1, 2)); - - // 将当前字符的后两位作为十六进制字符串,转换为整数 - if (is >> std::hex >> value) { - // 将整数转换为字符,并添加到结果中 - result += static_cast(value); - - // 跳过解析后的两位字符,继续下一个字符的处理 - i += 2; - } else { - // 如果解析失败,则抛出异常 - throw Error::WrongArgument("urlDecode failed"); + if (auto [p, ec] = + std::from_chars(&str[i + 1], &str[i + 3], value, 16); + ec != std::errc()) { + throw std::invalid_argument("urlDecode failed"); } - } - // 如果当前字符是 '+',则将其替换为空格并添加到结果中 - else if (str[i] == '+') { - result += ' '; - } - // 对于其他字符,直接将其添加到结果中 - else { - result += str[i]; + + result.push_back(static_cast(value)); + i += 2; + } else if (str[i] == '+') { + result.push_back(' '); + } else { + result.push_back(str[i]); } } - // 返回解码后的结果 return result; } +bool startsWith(std::string_view str, std::string_view prefix) { + return str.size() >= prefix.size() && + str.substr(0, prefix.size()) == prefix; +} + +bool endsWith(std::string_view str, std::string_view suffix) { + return str.size() >= suffix.size() && + str.substr(str.size() - suffix.size()) == suffix; +} + std::vector splitString(const std::string &str, char delimiter) { std::vector result; @@ -172,7 +158,8 @@ std::string joinStrings(const std::vector &strings, return oss.str(); } -std::string replaceString(std::string_view text, std::string_view oldStr, std::string_view newStr) { +std::string replaceString(std::string_view text, std::string_view oldStr, + std::string_view newStr) { std::string result = text.data(); size_t pos = 0; while ((pos = result.find(std::string(oldStr), pos)) != std::string::npos) { @@ -182,9 +169,12 @@ std::string replaceString(std::string_view text, std::string_view oldStr, std::s return result; } -std::string replaceStrings(std::string_view text, const std::vector>& replacements) { +std::string replaceStrings( + std::string_view text, + const std::vector> + &replacements) { std::string result(text); - for (const auto& [oldStr, newStr] : replacements) { + for (const auto &[oldStr, newStr] : replacements) { result = replaceString(result, oldStr, newStr); } return result; diff --git a/src/atom/utils/string.hpp b/src/atom/utils/string.hpp index 5b289985..ef3eee1b 100644 --- a/src/atom/utils/string.hpp +++ b/src/atom/utils/string.hpp @@ -20,40 +20,65 @@ Description: Some useful string functions #include namespace Atom::Utils { +#include + +/** + * @brief Checks if the given string contains any uppercase characters. + * + * @param str The string to check. + * @return true if the string contains uppercase characters, otherwise false. + */ +[[nodiscard]] bool hasUppercase(std::string_view str); + /** - * @brief 检查字符串中是否包含大写字母。 - * @param str 输入字符串。 - * @return 如果字符串中至少包含一个大写字母,则返回 true,否则返回 false。 + * @brief Converts the given string to snake_case format. + * + * @param str The string to convert. + * @return The string converted to snake_case. + */ +[[nodiscard]] std::string toUnderscore(std::string_view str); + +/** + * @brief Converts the given string to camelCase format. + * + * @param str The string to convert. + * @return The string converted to camelCase. */ -[[nodiscard]] bool hasUppercase(const std::string &str); +[[nodiscard]] std::string toCamelCase(std::string_view str); /** - * @brief 将字符串转换为下划线命名法(underscore)。 - * @param str 输入字符串。 - * @return 转换后的下划线命名法字符串。 + * @brief Encodes the given string using URL encoding. + * + * @param str The string to encode. + * @return The URL encoded string. */ -[[nodiscard]] std::string toUnderscore(const std::string &str); +[[nodiscard]] std::string urlEncode(std::string_view str); /** - * @brief 将字符串转换为驼峰命名法(camel case)。 - * @param str 输入字符串。 - * @return 转换后的驼峰命名法字符串。 + * @brief Decodes the given URL encoded string. + * + * @param str The URL encoded string to decode. + * @return The decoded string. */ -[[nodiscard]] std::string toCamelCase(const std::string &str); +[[nodiscard]] std::string urlDecode(std::string_view str); /** - * @brief 对字符串进行 URL 编码。 - * @param str 输入字符串。 - * @return URL 编码后的字符串。 + * @brief Checks if the given string starts with the specified prefix. + * + * @param str The string to check. + * @param prefix The prefix to search for. + * @return true if the string starts with the prefix, otherwise false. */ -[[nodiscard]] std::string urlEncode(const std::string &str); +[[nodiscard]] bool startsWith(std::string_view str, std::string_view prefix); /** - * @brief 对 URL 编码的字符串进行解码。 - * @param str 输入字符串。 - * @return 解码后的字符串。 + * @brief Checks if the given string ends with the specified suffix. + * + * @param str The string to check. + * @param suffix The suffix to search for. + * @return true if the string ends with the suffix, otherwise false. */ -[[nodiscard]] std::string urlDecode(const std::string &str); +[[nodiscard]] bool endsWith(std::string_view str, std::string_view suffix); /** * @brief 将字符串分割为多个字符串。 @@ -63,26 +88,47 @@ namespace Atom::Utils { */ [[nodiscard( "the result of splitString is not used")]] std::vector -splitString(const std::string &str, char delimiter); +splitString(const std::string& str, char delimiter); /** - * @brief 将字符串数组连接为一个字符串。 - * @param strings 字符串数组。 - * @param delimiter 分隔符。 - * @return 连接后的字符串。 + * @brief Concatenates an array of strings into a single string with a specified + * delimiter. + * + * @param strings The array of strings to concatenate. + * @param delimiter The delimiter to use for concatenation. + * @return The concatenated string. */ [[nodiscard("the result of joinStrings is not used")]] std::string joinStrings( - const std::vector &strings, - const std::string_view &delimiter); + const std::vector& strings, + const std::string_view& delimiter); +/** + * @brief Replaces all occurrences of a substring with another substring in a + * given text. + * + * @param text The text in which replacements will be made. + * @param oldStr The substring to replace. + * @param newStr The substring to replace with. + * @return The text with replacements made. + */ [[nodiscard("the result of replaceString is not used")]] std::string replaceString(std::string_view text, std::string_view oldStr, std::string_view newStr); +/** + * @brief Replaces multiple substrings with their corresponding replacements in + * a given text. + * + * @param text The text in which replacements will be made. + * @param replacements A vector of pairs, where each pair represents the + * substring to replace and its replacement. + * @return The text with replacements made. + */ [[nodiscard("the result of replaceStrings is not used")]] std::string replaceStrings(std::string_view text, - const std::vector> - &replacements); + const std::vector>& + replacements); + } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/atom/utils/switch.hpp b/src/atom/utils/switch.hpp index 261f47f0..25edae2b 100644 --- a/src/atom/utils/switch.hpp +++ b/src/atom/utils/switch.hpp @@ -18,6 +18,8 @@ Description: Smart Switch just like javascript #include #include #include +#include +#include #if ENABLE_FASTHASH #include "emhash/hash_table8.hpp" #else @@ -25,122 +27,88 @@ Description: Smart Switch just like javascript #endif #include "atom/error/exception.hpp" +#include "atom/experiment/noncopyable.hpp" namespace Atom::Utils { /** - * @brief A class for implementing a switch statement with string cases. + * @brief A class for implementing a switch statement with string cases, + * enhanced with C++17/20 features. * * @tparam DefaultFunc The function type for handling the default case. * @tparam Args The types of additional arguments to pass to the functions. */ template -class StringSwitch { +class StringSwitch : public NonCopyable { public: - using Func = std::function; /**< The function type for - handling a case. */ - using DefaultFunc = std::optional; // Optional default function - - /** - * @brief Registers a case with the given string and function. - * - * @param str The string to match against. - * @param func The function to call if the string matches. - */ - void registerCase(const std::string &str, Func func); - - /** - * @brief Unregisters a case with the given string. - * - * @param str The string to match against. - */ - void unregisterCase(const std::string &str); - - /** - * @brief Clears all registered cases. - */ - void clearCases(); - - /** - * @brief Matches the given string against the registered cases. - * - * @param str The string to match against. - * @param args Additional arguments to pass to the function. - * @return true if a match was found, false otherwise. - */ - bool match(const std::string &str, Args... args); - - /** - * @brief Sets the default function to be called if no match is found. - * - * @param func The function to call for the default case. - */ - void setDefault(DefaultFunc func); - - /** - * @brief Returns a vector of all registered cases. - * - * @return A vector of all registered cases. - */ - std::vector getCases() const; + using Func = std::function; + using DefaultFunc = std::optional; + + // Register a case with the given string and function + void registerCase(const std::string &str, Func func) { + if (cases_.find(str) != cases_.end()) { + throw Error::ObjectAlreadyExist("Case already registered"); + } + cases_[str] = std::move(func); // Use move semantics for efficiency + } -private: -#if ENABLE_FASTHASH - emhash8::HashMap cases_; -#else - std::unordered_map - cases_; /**< The map of registered cases. */ -#endif - DefaultFunc - defaultFunc_; /**< The default function to call if no match is found. */ -}; + // Unregister a case with the given string + void unregisterCase(const std::string &str) { cases_.erase(str); } -template -void StringSwitch::registerCase(const std::string &str, Func func) { - if (cases_.find(str) != cases_.end()) { - throw Error::ObjectAlreadyExist("Case already registered"); - } - cases_[str] = func; -} + // Clear all registered cases + void clearCases() { cases_.clear(); } -template -void StringSwitch::unregisterCase(const std::string &str) { - cases_.erase(str); -} + // Match the given string against the registered cases + bool match(const std::string &str, Args... args) { + auto iter = cases_.find(str); + if (iter != cases_.end()) { + std::invoke(iter->second, args...); + return true; + } -template -void StringSwitch::clearCases() { - cases_.clear(); -} + if (defaultFunc_) { + std::invoke(*defaultFunc_, + args...); // Use optional's value() for clarity + return true; + } -template -bool StringSwitch::match(const std::string &str, Args... args) { - auto iter = cases_.find(str); - if (iter != cases_.end()) { - std::invoke(iter->second, args...); - return true; + return false; } - if constexpr (!std::is_void_v) { - std::invoke(defaultFunc_.value(), args...); - return true; + // Set the default function to be called if no match is found + void setDefault(DefaultFunc func) { defaultFunc_ = std::move(func); } + + // Get a vector of all registered cases + std::vector getCases() const { + std::vector caseList; + for (const auto &[key, value] : + cases_) { // Use structured bindings for clarity + caseList.push_back(key); + } + return caseList; } - return false; -} - -template -void StringSwitch::setDefault(DefaultFunc func) { - defaultFunc_ = func; -} + // C++17 deduction guide for easier initialization + template >> + void registerCase(const std::string &str, T &&func) { + registerCase(str, std::forward(func)); + } -template -std::vector StringSwitch::getCases() const { - std::vector caseList; - for (const auto &entry : cases_) { - caseList.push_back(entry.first); + // C++20 designated initializers for easier case registration + StringSwitch(std::initializer_list> initList) { + for (auto [str, func] : initList) { + registerCase(str, std::move(func)); + } } - return caseList; -} + +private: +#if ENABLE_FASTHASH + emhash8::HashMap cases_; +#else + std::unordered_map cases_; +#endif + DefaultFunc defaultFunc_; +}; } // namespace Atom::Utils diff --git a/websrc/cobalt-web/package-lock.json b/websrc/cobalt-web/package-lock.json index b1e62724..53aea5f6 100644 --- a/websrc/cobalt-web/package-lock.json +++ b/websrc/cobalt-web/package-lock.json @@ -10,12 +10,10 @@ "dependencies": { "axios": "^1.6.2", "bootstrap": "^5.3.2", - "chart.js": "^4.4.1", "easy-peasy": "^6.0.4", "echarts-for-react": "^3.0.2", "formik": "^2.4.5", "i18next": "^23.7.16", - "isomorphic-ws": "^5.0.0", "less": "^4.2.0", "localforage": "^1.10.0", "lodash": "^4.17.21", @@ -35,7 +33,6 @@ "react-i18next": "^14.0.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", - "react-scroll": "^1.9.0", "react-slick": "^0.30.2", "react-spinners": "^0.13.8", "react-svg": "^16.1.34", @@ -44,7 +41,6 @@ "react-tsparticles": "^2.12.2", "redux": "^4.2.1", "slick-carousel": "^1.8.1", - "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", "ts-essentials": "^9.4.1", @@ -930,11 +926,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2075,17 +2066,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chart.js": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", - "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -2162,17 +2142,6 @@ "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4051,14 +4020,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "peerDependencies": { - "ws": "*" - } - }, "node_modules/iterator.prototype": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", @@ -4276,11 +4237,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5147,19 +5103,6 @@ "react-dom": ">=16.8" } }, - "node_modules/react-scroll": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.9.0.tgz", - "integrity": "sha512-mamNcaX9Ng+JeSbBu97nWwRhYvL2oba+xR2GxvyXsbDeGP+gkYIKZ+aDMMj/n20TbV9SCWm/H7nyuNTSiXA6yA==", - "dependencies": { - "lodash.throttle": "^4.1.1", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-slick": { "version": "0.30.2", "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", @@ -5616,31 +5559,6 @@ "jquery": ">=1.8.0" } }, - "node_modules/smooth-scrollbar": { - "version": "8.8.4", - "resolved": "https://registry.npmjs.org/smooth-scrollbar/-/smooth-scrollbar-8.8.4.tgz", - "integrity": "sha512-Wn2Q/iE+PE1ef4EfhFMhgaIMfSrjJl2LalRu0hBWSrw5nZKGsUIjWFWHnLB/Lpx7N+a1pJH6+wkQzBr+5nWPUg==", - "peer": true, - "dependencies": { - "core-js": "^3.6.4", - "tslib": "^1.10.0" - } - }, - "node_modules/smooth-scrollbar-react": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/smooth-scrollbar-react/-/smooth-scrollbar-react-2.4.1.tgz", - "integrity": "sha512-9UuVZtQO1V2oeWb1n13ZgXcZ0nM79Tqtgov/8xUeZUWicTIg8xO+tHzhfBrE/3DlvGEQ+keFDX96UGTzICoNSg==", - "peerDependencies": { - "react": ">=16.8", - "smooth-scrollbar": "^8.0.0" - } - }, - "node_modules/smooth-scrollbar/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "peer": true - }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", diff --git a/websrc/cobalt-web/package.json b/websrc/cobalt-web/package.json index 6225c032..5c99d22c 100644 --- a/websrc/cobalt-web/package.json +++ b/websrc/cobalt-web/package.json @@ -12,12 +12,10 @@ "dependencies": { "axios": "^1.6.2", "bootstrap": "^5.3.2", - "chart.js": "^4.4.1", "easy-peasy": "^6.0.4", "echarts-for-react": "^3.0.2", "formik": "^2.4.5", "i18next": "^23.7.16", - "isomorphic-ws": "^5.0.0", "less": "^4.2.0", "localforage": "^1.10.0", "lodash": "^4.17.21", @@ -37,7 +35,6 @@ "react-i18next": "^14.0.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.21.1", - "react-scroll": "^1.9.0", "react-slick": "^0.30.2", "react-spinners": "^0.13.8", "react-svg": "^16.1.34", @@ -46,7 +43,6 @@ "react-tsparticles": "^2.12.2", "redux": "^4.2.1", "slick-carousel": "^1.8.1", - "smooth-scrollbar-react": "^2.4.1", "sort-by": "^0.0.2", "styled-components": "^6.1.8", "ts-essentials": "^9.4.1", diff --git a/websrc/cobalt-web/src/assets/imgs/bg.jpg b/websrc/cobalt-web/src/assets/imgs/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a1cb7beb0eff88b12ca4c17c053899e456110c8 GIT binary patch literal 5146384 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%0AvmO% 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 K`3#jM+s&WZJpv*P@v;(Z7V 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 z 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

Vz$PrLRMXRBb|-aq<*~ zEnFPy!GbT7d+wfDOGm9R(KuQDo^Ub|D0f+~wrMCDr_bv;WaQL7XJxmqD_)3L_3_y& zQp&wYr_V>jwF>X7Sa);wo~NAjmx1zqVv|07LFe}?=6Buob9S83^QiSJ!Pt5B*!A!% zcM;%vYV-9QtDV=C*K*ENCo9pfQ&t%}S}Yp%ISF{f&*_6m*N~4%dbxMUS}!lVnB??s z{Ww~>SIR^|XVU`}f3uu1V0gZqezVQ?zVDczy*$I?ew&f-{b1Ut%^a;X-Bq#ko{cK~ z3B0oHI$_FgfwTgsB&g(utf0j?wR0F&5o;Top((Cfx9M^-$5py#t~#5fZrt)U-6Ae# zpIWcR;pMkM>~V7Z{T1^FCaj?{HdQ7=fX6FVU8{fhaTtZMRb~QpkYUe6tP+V;NYhxEjKt`z6G4|iI*W@c zeDzGLb9bF9SZoB);lnGuWsa0Znp1W!G{FNb$k15_f|tRs#c+ClPL5-Y;4wdgOv_((ET#7kZYZe%4?lv9Rg_5ji`Dihdxd9cy$9- zbG>})RDzj;P_29&MJuZ%x+*8m2zA$>Otg6EOyM3{p>0<%6g6#-nOtD23GvdMA7?k+ z-tUX$9}D*UmHGJI7V+;_hN7abFDmT;1`}2KL(%hSsC+}n^pkUV^5|J>_`5la^KEH5 zBqr{QFK%0|rKsh#a%@(MBBo3xo_k(Ss>YqqT<@!WEGVy!K4X zNmmXi(EvA60|_ZA!x~8L6lkqlRYh}^Vr3@=$+sIAr8Kv}n4U_rnw^XqfQ2f!9JEno zVgt1hndo{s>Wx4`)7Y;EGs|Lzt;2}0l~%eH(Mg+})xo1ggS5F zrRfV|wFR7+c33l8?c2a{71i0#k`!H|17l8|T366{Q=#=ZxajtIL&0@;vXvPzwVR=N z)vHHuR`21b;pp?t(x@%zCPm6*D(hfXJEAKZmE|=vQVwcbbSfyyP)X6W&||f4QGPyD z+m+|7pF&mhJXko+&J}L1r4t~)ETU}2A%1tAK-~HlM0n{_Qp>u`_+X+tv)Tn2-qIw*j zZOPJ_mg$HbL8i+Y312!2(!!ZwELp@$W;OP68Ou~s#C1$Hi=m|Bb;&vvO}vX5ZO!rL ztL5lgfD{{Hu0{hp)>Tzl+KqMnUjf+|qcaC7(-@p2_+zevK}a?#Yocf}#fsqHbJnY_ z0NPk;1iJzAv{t6ot+aCIIGJW$qY?IiBMW3|w*V(V91(#sb01msIX>j<!C{))7(A`h`Td+{cP@gA>1;{^?7%S#Cs~YS zq(M7@<=q2EZ8452vI+l&3SA#FYf1$xAgPLd4Pjty|9W%enM! zvoA+86anSADa~h8l?x97y69-;tmo`@k#$+CLVa>?rSqAVM`TjTP`(e2_v#CAO z*O#E{okNa)o37R(mR)wee6?PGN*p~Q^ZO@I?8?0pU&!wCe=Dcer9YM%s67c|(abK$ zbDulwFB)&IHWCTTS#%rD*^{akot#N|-E&H%&rl(fwYR(FQ25@zIl@to6B>{RlBvWG!52GjbM8WmgR7qr zs>VFkKUx(6?9Wzqg-F7qorvRMHj2kuFDr=yT{1>mS6hCt4q7tHXqu>_?3vP)oG)2d z4<&U-yB>k9h0)8_!?T;W6|+;ENX52+>AhY~d(7)ELJAeu%S@`%Ef-5cs||wel19X3 zu#GmdOdHVj!z{uSL8HPo_WuAwht0XK#H&R%+Xx&+6Q(*y5Uz_eNs)FCE99|tNhzU< z!b_*Jg<=7it+tMYpId3>#-kQVs7qrbB#aYr{=4TsPWiu}tdTskEL$qw62dOubnJ@TWYrecOH~~OB+p#$ zZ7XGK^nLnVmi@ZJm}Qa9zHe`CUK(^MwW1@;j&d;hdTn}S{rT0aC=FrBJ{($=jY?!* zl>w_c4S9NKT|~%o)~#Nl;J2O9hf)eX6mUSbYdMm?bb@;C(BeNme4~q{VAUDIi(U$k zh^=7r_3vZO^8Wx2)?Nmo_Fia8nguhF0fx}Sy!0b9WIPVe7rquNnhc9*wAfa!Q@f_K zGKe!>zU}mU_B}JC$`e2iOv_#~9am>4r%%7U4@2NzV}q0%Q=x8-ID~Q%ZYPH9+&Gyuafj+u0s zEsFSm>DZhf=I^!zv4@`bd(INQX{p@SHV5}mT7Y+bs3-flyR=2qTTSp7Zp z9v{v>J?>VcBePAWMV`P0SjkjQj3YBc1_f3K2g*`Sjxc150}hj;Y(+M4RoZN!n<*Mn z80DF|FayeZFQekE;OXXkPKN4}pl>oTqc<04mHznA`Q6U+^GVhX7MnlQFe8d>B&~-} zEK!<$D`xK_ttq)KWDnhFxO#WVOU{_p7YoYJbe1a)&T5`+xlWVgoO&T;**k98WoIsX z`X968{*up+^M3vOhX+?r>-qernOLoz2>dORx2vb4(+nN(H&SL!&gXq(~NYk{of{s=KhIb zL*|hst2ylNrRN`qy0f0$AzKfv@+&;f#k~H7N(!qFI-=z1&iDz@4r;QB4NDJS8;aCh znucZw_We^b;^0nwop1~uB`p0fJRKGv2TgZ4A3&t&hy%xt(`B%%;I0W`(zA?nx-MgQ zf~Tc0VR`)@K>aU=^XHk{S$l)cq2$5nr8_EnnwoXCs=N(%GfLW3os%OB5|eMHEc4Xf zha%ja4fYD(G2z!XF=WqAx6Jz6Iuk1r(SD`&e2AV3b5G0Mm_v!R_<*hn<;+fpYPGHr(B)6xtjNJ+?bVNqea zW)_N4MNqlJMiq9(3gWRTMNx!UtD&(D+GX4@!EnOMtY8UF5}AhfPjATgF3w+verMb@ z7N@Oq$@-ih4Xn!@Gt&2!!x4EQ#(N!}LS3u>upBXH?r)3D{O zmz~>x*~x3y%NmOEYPoIACrXbhTP;;HYIyy6emA4($D&08s6Najg}$*8!r*(N{)~Wg-DI z^R@`BC@Wd4Ym$I-2c51(V^oW>q`4KxIzc3`o36C6rs$en=FZIaTwR>!Zxu0ZV>#j3 zOr{KxodrO7P%krVC&$a6K>&9^h`%i3fGY?Npsiii1ff`NXnuOuUrJ&ObwN0pGR3BJ zH!w8Ttg?VU3@(XS%wAb)lc5$}Ovno23N&cMn!yrxR#Kngik{fy_h6NcgZ7>3?QVy(EOIJ#ytO^M!vIL8? zu?kNtZG<;gsF0;Ji#Cdk^2}UP*~n9;=}u*G%0)8uC#Nh)yI9kewCZNNyn^a+(FdBV zmo~Nu>_o3 zTOc1q$2zT!Wzl9;L!5Ksz3Z zaXj@HF<|&Lv{Np?MsdRg0v$c4gxE<=(i>a7DZc3tgzI(D3Wo`2iG1{ics4k8BfX0EB$QD_m0y2=dF;Z+t7AhL-nsI9$w_Apb4sfernM<<8R;PK}=89LQk3p*w zm~LV{O=WcGdZEqn^tsUo@I#h`>|B9=rBIDsfRc1V(HAwMt7lTJbX7KbcH$g3W0F?r zA3EtRXV)tqOO<|BcbBHmtBH?FHU;VLJC2xC%HfDUZAi`4jG=nZB9O7*>iM^Y6+?i7V4WVa|I{)!|+j-YYw3)F0pq>K&jkVbaTtmRnm1nO|~prH8)aLKv>4hvRJI79e$K6V@2=JijabzIbIrBikpjT9`pTBE8Ke1-Uf`Z3ovD&ti8xo)V2&8bo6 z2D~ggp+m*l1aS^^xvA54N`fqUMoVTWBou7no^tW31XH7xp4cf30j7jZ+D8U95v}Xf zlh8flGl4eI4^ef`*Hun!;1_kLg+-3c%!6&uEb1pl(#wz zky~Wyfgm2Dt2T`U6iN;Xf^9Zc+ZQ{~G{kLLnkmRn9Uv1G*`}o94L4WS&92FDo?l)t z9xzS3z;ta02qWxW5Z2GXLcX8o{t@}_Z;|J?h}mN8HQ2zQI)H6PHj5>iIF2^Oc^*c~ zu0E07E?1V_H*Y;>E7$>K&(gm%F81B4b(7T=JfEhPZyQU>!Q9wg+nkE_Wv(f5<&}KsqSB~UO)CC+&F{};qmgTxlntvXIAR2*fkD93P1kc_Pz(VI3TkeKPE?kj zObJ?SHfXA2GBgcS&eC)Rx$H^l?+zQz>^%y26ksrxYc!(oC6h$8r6oqrJyP|%H{eQ~-b9`6VqS!$0WEN3SV(H4bCSHig9hRO_GRk#r6)KhBVCjt7 zP`ekkR+BpNilN@RN!8GLMPb0k`8F}Ct{G`=bZF%YY~jT8%}#li04UUMko`;?0JiTp0bcw%&F@!^ndjHE{Ps>~pmIeC>LG;Xl&Oga=1~?KhQ(%8 zTjf(SxWx9nT|7^JBmi7B!neMx{KDsoS6fYr2DxgbW?CboZHBd1*a7Ludm~0#{gMu@b8+e$4o$43n@+fo- zO9w<`-E8K=IBYhCVBy4J0w4|?Wh%0jPMEreyA6#!j5HWF*)5$?lLBJXD#I^}2t??~ zJ(O?u=a1<83+?#TP790|Fol@eYsXF+%CRkC<>e)1`QL0};q8lppvemkHrPiLW{LIg z?hi2YyK5T{X<|hRv1sXnWyVsgF4I(vD(eO;uZ9HV*IWZSztObAplH!0 znJOfy$^|o}w>(bxJb(tUz>7N`ex&;)Vdi={SxU0A=!m%QQPIhmR>P*>qEckE@8_@c z=t~PHoDz)p&ePH78tTq2hBUX!S+IjmtjoaU&i@YxR=usMlILz}L7t-JYZK7Z0j zkF8E;()Ct$8@Tbk-_EZ!jL~zsY52P>4=g$Y+_guVud*VvjONO@Lr0^TUVlZ3%v?tH z;R>MHEEVXu`xB&^jT!Z0Q{$LIoXp>w?Msd-G1!Ytoph?sO&h%0PAl+PF^-2!#TuU6=R3Fb z6U_NK72`9)<>5ig)HT|+1r)2Xl``kpGQzCp%L%dBmYWRZSTLYOM6^g)=2XPa2-;_Y zVluI4f^`mUC@h^(icRmK!Swg3#qr07>qIe0U08@km(Si6`_dQB*>{(3<gDS=*Rk_2 zMb{2%xwyBdA`dprPi;p!RVz>m)*95SR>_u~t9)RuqV>G1S?2cB-KwDU$||KLx%#VQ z=+LT$tUYQ3Ce_RnRjmYMubE&cfH3IJqd8=7z8u2E2E7w?lC1Gq?1dMind9GdLY93T z$2Cn*(M9j=Zl3AR{N4$X}` zfhHNsq(e!n`zb)-k8n6tEE`)Ip#H#WuRXGev(;$qSid^SJeguKxj;omI$Ml zSCZ9f6_;&JV+xrGuC+A-fM%Mv2xTlNK;qfL$zbV7h6IT#I4hokd^Su9o_ae&}76b5yiF5^sO< z`iEBe{{XfRr06U}?7NAh9Uki*d8SZw z`awmSdrX<^B@-f8;vJEv2g0p!@w0JK4ECNlH>6*e&UyMHo3Dj=9+-3sO1!edL~ede4{&FZM^o-o2(8I~Tk+vj-~A9C`2wusU@ zN-Z`9J32(04Ja)$fT~8pJ_g%E4I4v7%E?;=Wp*adWn-l!C$<1vUi9<($J6-q+}81L z6V$GgSP*7ssUgaq=jQiTRXmf{;LVdEVGSH)sA z9K2;*1`R@O_DE>zqcusl+Pwq9my@YTh{>)x)ec(jr&Ys3Up-QVx6f++F1fo)q9Wwz zhn?N@zq{di{{RP};=HzF&+mWO3HU@aNp>xVqsZ=R?i!Nd-ANgh_$>@1R=PE%ir0?5 zlhK^~#`N!{@%YapvzOuRzb8B3j|W55k$oOjJbw8|RRCzXdP?zrW(M!6dFsksm$+h5 zjM^_W#~!6_5P`13$E_F%Pnzu{e_NSe3)e;ER-x0HyHd~g^ZUoI=Xej9>b!tF?s`jI z@mf_~dD*NM=IcxeX9jhfQoeB|vsRT-bjvL_HVRj*v}>nFEjsH$#T|TGrca*Qw8(;e zQZj{GWUNCRl@{uRpusCQ={B5Rb4j45Gs=K5J5`-uIoMBvg7&y1)xo7!>J>Rrpinu2 zttT1<+7zm`87qceFec-sgx)wuDc@HB(mRvG>6-{EP_p{9PT1GXNH8j^ra3WP45AM< z8Y{5T1mKv9JFn6H$C>iyf$QT7V;(wnk=~>0dA!FDRZ!?gE}JN_>jEnc1~!f{T@#>o zY`pUoSIMs=DoQhDQhhK5wl*r6?X!rvp@!QEowm@sww($d!L^$Q-E6q(uUgpFR#csg z+_qa)lU+;J_DiGg<6qCa7SHxh*4*1lF(Y#%y+pXG^kzMy$EfI!OpATU zW)_F6bKP2=6yu%wWvw*LCN$@wpQBdI>tSlO3-j8%YP7X%9X@&U@ad{UlARoTs(Hmq zIAcmGpdj@$M3L)?sfZ@aZ2P5hvWJ%U7fhp@l8C~vncxspV}Ls> zWOS?sEesk?!Gq{(QlT@8=VZX3gsl@bTb!0{3NQ?ee%beYFBbCse;nZK6>{hT+d*`= z!M8`jD<@q^>z7HK7Lu=@4=JF-YA4l9Jkqs51{wE&Qyqi}CN71I-P-6tkFmud&DE-hXXxGZu@FH`iBA#hY5jH`#IePr_V-UQ6ZP0&7=v~dgWu|ki3rC zoorQLGLYb4R@z)iv?w+Vu!5EjTLWXf7$}h}E)Kya1UZV>=nEt$)JS8HRU-#jU!gZd zXLzud<~g6zdiksh`9~*N$<2wildW{xTTH1O%M*?2UYDQfuP>VX&q^ej3r8=AM)wYm zZy=vSX`4FBp0$^WaIz0t`)Rkd*?L<-u5~o&lw2Zc=5+yB#+o=Z785!eKtA{m4C>C^ zA5;)m>FpoXuXn=vE1|x7@I8)4lB8NUX~Soc{+083=Xt1#Dild_T-hbNt93L3*`d*2r;r>sj zaZ~RblifKwek}E*r7{pUy-*zF#o9eAUSK*$B=+49t9##M9g-5Fkfg|0nxl@p^kGZK zNvl@*y_%gFororkpIr;ieDAWAo4@Y!l;OQC9)p6HHw{Q0t2-s1x#wE6>U_TKH8jyv z%kG=$baGO8KA$n!t{Uxx$l`HpE#vQ8NP!0-vh<`-&IdPp^&KnoLzW0`Ve7J zjn-D)-FK%RZ_d7QHSHRsu0_8(eAQ;fM@6}-P(aluCTDJ^+4B0{zJE93?$j!vWadSZ z*rlJR9-Gu(Kk;cbt4+>!HdTi!&DCTP4!9-fUUo+Mnz}s+nXHR=>r{kt3RoF3>0z*9 z+|=yvsb;Z;m}7RypKmlc?R)6TmzJ>S+gB%a!_A*}uD>f&txKmx#oNzx^ILRJusr^G z%W)OQEJcUQX?D&#FV1HAR*;jb5CXCqRMk)`HDJfK4RrRgUYJvpb3M;@CkG4C`Ms-l z^RQJVC60flef1y9`JIH`+w>k~&q{f}gWu+8$s?hJk+z_R35c5z2$2=3nrS04gcvR~ zQLL=eD_EJP6~QrEC`f`-9bZK`2w|uiqZA4&y)d;EX}lj1)JSBwK-=`C3}|LhlFnHv z6A3QSB4B-lOUa5=62`%m#(l6Si>{}eSeN(XHE2ATsaDn*ZMwKGdXvAt;P{^Z0H7bE zbp|?qc{MHjTFKycW|CF{Pg%OpLQ{g+Ik_C&8?BQbjx*@#9+uO(Wnqy=)cEs>N-avH zr3}qLYM6Cbbs^|)a&syxS8ZOX zi!#NMkTQhm(ZOOZQGl;mLS!|r9YxS9oR-cUqb`wQM=ZeFkx`@uA?6Azivi$jE+r?I z6*jF40HbeXIR`Q5{T^zbOOH0xMs3%0^ZJKhCy{Y?P!l=0vSZ_@l2YFD=`Rj1pRrY# zL$d--l+XvNiCIap14EXQbk|IllNjdQiiAtGCe0!xHl=jYyowH)NHmg#IeM*kumDA&L<7NCh#~}RAlcXIHgj zl1<09xz6u18fjNd2pEiQTtRh87!kD*#fDt~^z~(%GRQMr>^4Aj?WvC2fm}Q9x6aFT z%#&a=pxV++TIHK6h^?bo*$E2O1{!E|#qywqa{}Uv7I9U^@W8rC83pr*I2$Ds9^6ZV zJrL$Cf-ODLk#Ysw3#6us;WM(kBH%&hSqSI`#K%bx2-@gTW_DyMRedZbOwc>g4^HXk z@{cpL)dS81Rhiq4HB)%S6jnL~pvyXlsiRZY6QEa6Vs1vjkTt_%v_QS3fS(X!2NPUE zBewAf#{yWcGet zxO)h+T4au;Vb+D@OW`j@fobDyU~QKs!0ob>DZ>f0fFfZw&@P8p2{;JNoMVTQ+JOb8 zu_CCK6z^c}<@1heqX!{uU~P=YWI}DdhFeNV24&VZF0Vd23l5%eOy4Wn_CZ+{-&H}% ztlv!R61on^nr)4D5QM_$O!(@pkfz)QA`_*Jp*sWT>b)LCq-%wz9XlYouFr2frR68C zo7r?u^NzKEJ>AY5uSMC*%z1rB=~;Q*9Ve;Eylf9QzNgUgnzA3EzJl!XJTITSMyD%h z)yYfG(6HWxWs2@8NwOJ3Sh1KFc3dii^zXv+Rn|sr=TY`N1ySS}-q0jmKjdyXeXh2jj=$|_u)a4j{cfs^&`NEJlUWYmRZ(!W^ z0K_PH`XNMnAbj4tuYbqqd>>z%a9lp%ybpGZvx*_& zs61d+Gn{%1d1*eG#b_o2ja}$~6#GY|=JT%pUE=z=RIP(GMbe9&h`Sqdl@CaLarPfS z`h{+9!oLsQ;Jlu&oE@PD8jY~s0Tq&PcUVrN1WTj@(4|0gqWe<;BSEkXLMoZ*%vE{< z>?z>@d(Wq;a=euZ7{X!pcT2<9%k=W^1jsVBS4e^30CP^>`nndv0k+7P7Hk3;VyBa1 z=G{7wJCc0F=g#-CHFWaT5l3?+rDF9Oz|pye`XJSn=0@o&0&Q&WG^~5o&Q@xXZTanc z7Vc%cwZMhl=WM3fYgdiVjkOV#Xx>W)ty5l2W@?}vDiUVFjioIt?Em#>^^DDaFumVk(Q})1T|UAMw?{L zY;XYTQskf-%qXllW~!`g6={Q^wSnlNjd9S~UdXAc6dt9-{(E8|7s&?4lf$A{mr1g`spPvf)LiF5fN^-EdsPLI z*7A0X($+QDxQ#oRs(`J{W7#~s$BVoQ*7le)iBLloUJkuyEqQw^;z81!lp z=th@)weNU88+`Y>K##1Xp?+B_g-V5U3!_|Vx;cpRBIk)+PPEb)iyXbHIy zEA4|wX*M>>9Wc4Jv14zhJuV-aeD1<VfH7T69LH6oOzK0gBl8fEU48fbi0h?9!c) z95CX{iGwZ{J6i`Hh38Qx+mB0R^EuO4go5FU!ED0ja0VwPSZM*=4`PulMoiOQ^iHmB zMLT7fIwNXNn2wsn>#o?;H1@!NFBjUeobO;AEDG8!i!IP*ud-npRvHWerY6WNCz!#s zrJ4=l1#B6xYe_I{$osRkkk>OrZnN0VuR_yXL@Rm=DImG?T{E#R8qXqEzOZJw^E)bg z{P>u;d;-=KN9VcTcQC0QZ4^Bn?5U&J_e!hJvo%bgRQh-dDLx*&ye>N#Nu|^CRoIkg za8@>XWFfo0+V;K|rR2WnjFD1w(!veU(mdFX`etSkMxB-EJ$#8LT&)k{&>n)=OwNf! zqB6W?(_STWcvbm*MWdm^N%JtewRY$?FGB4mEoQhizh@_1=%f?(Cy~sSDrOnTBM0ZL)F2&HTDp~qGsc<`r z#qZ>T8%eO-p)su6Ep_U7^78ts65_}jL^;YX&q_rcG1&5i@UrgFc6LtcwDV)4(bL?$ zj~mj~zY}N$W=5 ztLXAG(+*R|?ef^t&$Lx>(IqF!BY?}G#=uTsg`CR`v4omr!G`LYm1QHw$7;0N+cuK4 zDzgR-u+3)k1nICWSvk=|;AysVRXfZhOoCBW4jK#UC#80Ac<-Ir)t2W`k!{oMSW`Yt(_Oe1+x5>s_B3U619BH0<1-iMR*8` zZ3?8G!bokpIfNcERDq^ewBYNb>xFq&9&R?Ohhq~-6_z2SOT+%W6rM3{1kh80OQUaWXWMQlQy$GV9U| zR&~ael+%V5Ox6<=?!y4CMvO+B##>0(&1e_V+Q(s|C6ufntv7L~IB2dCi)x;;me4E0 z_Cy%qS*cLwgEoX1Ej5K{tQ*RcW-6iPteIzlGo@s5BTB%`H90`TkfOnXU?#^&iuf&p z>iXa-8f&|Zv3hwyf**4bB4E!L(?_0~U>l(bjM$`Fm7|+bHa>*%;GPMJ`Cc;xt z)Z&6>w!FLOo*CX8&t6GL+ZAHjW!M-Cq+d||3F`UZEqMLm#79j|wq#_2w4h9Nj)7gX z2SZ_Pdy=G)1F%{kfmQ@NXzh~55F#MQXbq%oxHIoiE6j>>su#-IvL|Tl!gv(tR96G& zJzV?`J;jU(&6`mN%&1Ep;zb=j=S@0S>=CSROqT|bBEgmg8U#oZV+;~TfvJWS`=e8O z@WhIwk7d%PWM`hs8d~=9Rq=FNbn~mv=pW8?{SII%Skt0*h>ov^u zn?EDb`U~g1@11_btOP_9(Pq>dsj^sSD4wn*fxXb#KP+eDS8uCNO`w1-kX;694&Fv z&i?>n8J%^Dmyx)7wP~%-K!UV7lrK}mo)0=FKOH;kXAQh%l^$!CrcTo{&sDaC0V<;C z=5LaeoLxP2rN|eRR}k0C6S5`etZmO7MCRI}Cr!FZ!WEm@b*j8BZs;q`MmiEyixBFr zp56Jy7WAKIkIw#M-ln1<*E?ILUz$7}0?qU!m%%#Z9{x%m4vlg2gQuF;uOFp##5a&c z&RRjbuWO5x^Lp#~stk_WY&`Y4V^9^2w4E-Qrb&d*J}E|n=u2jwqx46S;qKuwvCC=I zo(XZ;4sKe$7n6g99M#%AR8FuTMth#MRGHXqirahde;1AOR=1a-V#6Uevik)|7bMtAjY3?31O(X?Vv(j>yIG5#iRXEM_82;vmBI6r0Tggy zHofSIa^YR~2VtM)>1KRSxSBN`f1|(&$wj&)rl)|c9LAOG^)F$+hid{ z*cDrK$C?eyCxwlwQ5wvHWzqmiY3v=of0%K0BR7QFWWXv`i$%>X64MPgNMan*VYM12 z2*xFVtEtoL7n@g|CmpAXW^V>j+>#P4j}6I)NT_ov@S`q5!X-|rxLH~&PO4zVvEs?? zw#(qr(vvi*hQ_cfDs8MKMVKRnl&TvfXDuxuP-$ShZih&+AjQ|3N`^|^*DW|sfzdZV zKZS-B&SN_gpk%>B6B=huPMa7lCZ9kLE}hh_LW}^?c@u0~4!J~t9xKo zCJ$?-8oJTQ=eKEAtHT_U#=B=^*lGmlV@%_nHdP|?dDz)`*iqS%zLpqSWLwHFK3`I! z4H={5nRXfgSU4V2Su3qkqdl=HI$?5kSOSn|GDVK6ESWanLv40ZB&H50GBi4qZmLz< zQVx}p5ve|HUSrs^7AW?wt{yxpHgdc!85HJ`Zmo;7=dP&VOmcPj2dC$95UfEN8eA>5 z*vX)yM_aR_Agf^&F3*NjVIaz7-)%{h>6RHuiHP?PN6+Co`gp!xl}HB0oAftLB|fNb zU!FDi^diIAx~1ZL*3jAlWZhPG*M}X&)uqRDtz)!ulI~R)6am@vo0qx- zWe{ESbZ?5R_wx^jqRY^d{ao4O^rs6~dHpVWGUz(^s%p{ZbYn*eKcN)-`U=d4C6MH* zkhWA#vaq5;FFPhxF;=p&%Tdc%P1Idy)z1T1*PL_flTB01er|!$f>`+j z0jiB)`rS$(=Tw?ynA~5b?c{bnJWCNH$<(@H#ok_oo?VZr=kdH92ro{K6E3FHZPfL{ znC5>%ypZX&XBOmPPWsaGaiXjvj6!HxN+!}fE|km=?FP{RNa3Q)V&dzqO4C7v$mB?> zpukhdX2u~D^WCqx1<2K$F0Orl9dg{|Nvy)(Yv%k}RpBDul?-HLmI+i@O zC8GCCtR~I0?|Kj|pP*v#XeUS4g!$SZeeEm@mK8y({tPE%MG)JDl0 z8Me%Dp%vFG+{nzr=D-)3YUcA)BbQjLrDB^^DP|PzlboJ8yMCTeJm>1uEZJf(8xxwv zvPm>cElm32Ca^Am0#p+q^qkO-nG*YEad5{RXt4RA(x`=g;Z-= zu0_O_-fTJ*6J4Q!g@!5t0O!70gk)x$bHT1DRymqoG!B)gG3okc!@DIn20H>xh)yVF zrXfLQ=rdD;rbRHEhC0q|vch0y2AS+BK3{8lDjbhx(wBjF>0LSv$(GA|(>I`bg{)Xa zJ3tD$C>p@8ddBD6%f&tB{9L7L&v5i{E@u-qeI^0TD%Vj=3gojUGb-4@gux3L;ik+> z0FC2nM}O7N<-E7qd@`}gQnVWrh8wcT7}_fOc}`S1t39zvY9(uQOJ;6Nq(fpI(6c>_ zAOL2{hP0vSQ*qCno6^y5;(A3CZ>afN9RfFOg9@V3^IB;&Zlq7tJzqD-`8{#@yPcDd zs%;I)6VuSRt)<;ZO!@gdQ~=_uZ9tBR#M*lxGnjjyKTnid0*U7{3bs1d>D3==y zIytwGNa@Qik=EcYLi+_DX9$A>J*AIKr}PgW&I+!!SYr&b;1Kw3v$L1idU-x`^F1(w z*z`}6l_rEkSZyX$m`-d#mZ0tWV_2u2g=2>CmeLsIMKc!6U}JzQ3OMKD9p_WYd{r*;`?TY`kky z_dPSK^J;FCk}(#LB*g}u==e4ZrryZE+=T^}=798zMrG?VA z9USm=En>!0A<=EJrbK%;*9PhV%5VKYI-AYvNfD~f@r8NTk4RA)=}mHVrQ!Oj zqOsS>mCNyV9@0;qL7l1QGGs0ar6#FIlV78N;u9BVPvklT@~qXH#!YjRUeh7f%y1sc6+M9eszL z_}@w@@mIR-=Hhv*p+i0kf+~#;l9!27^mDu=MQhckI92zHD$260u(qa|L>r=_datGDa2$Pn3~Cuy z7-=@AhWkov-F}he>-qlxq7>FqD4q)`+h}6ck5cLSo$UG59ZmVC<@9j;eJd^@O3kAt zu%I&)k&!srU{l#U;pO~&D5;Dabx;#`Iw;y9B%)3*=3EdMIytj*Cvr+>Qg2aj<9Zy%cKV9o_^Zb3BXm&IrQT~kfb9y|M9F=RYjpI_HJg=Py+fkV* z7)hmxvf5#jsaz3BWRjzwN;!kitCjUT>4!DRWMdmFO2wx-6*V08 zu2PzXGYw4C`j>_7dsmg|{IB%iIaSx^)#n0JIw#!QiO*A&PcziuC0fN%s-~4*vn-sd zYmRwThw5Gr7r^m-%EitOuXBg72?MQ9^AlxHt#?-9+}%FUH{ zI7>!}9Vm*}AX#M>c324>00?bRLCXoYfOgXbXn% zeKaAY!b)^?p`CpgaCR|Vfl1{-jxlp8(Icbj=H$8hhh#kI8EkbRePk7wyn$v6Ri>k( zG4-n-oh41KjF^2=oaoDdNoMRKSZygBwiH$cx3q#0g!NS@QVk+rxrc)B=#ka?E^doM z2~VSu!=LTv8e%chr0B|k+^v>`1ww&?K2Grb~#()V^UXMmkxmgrQ3ctR7YP z%AuLIIfA8W5VK6m%|)3H-1NuJX5?B%lCe|z1%6M2x%zpy^tAIGf}n>X zLrRM}t*Sl0Ap4K&eslBJ<^Gjes{I;qr#ocoL)hD28BYI0nw_Ord-fAzWjK8Y5_qfRp8@VyM#E zBxr0yC&W_$ir7FE#eOqFY|e}ly$UxqK`f;v2Ss)+9Tr%&qgxCqCg-xqY&%37XGszn zuq75Pjxhm@+2ff*Sy0|sjJXWs9gLtvvw)K^woo$SBS#jPX&Krlb=3|-ma^n#c$ z+evmSI=~6K+fSO6#^NfvN@#3jyGyq2~4f07uNB>|R&p{V99gd>_qv zZDkKvIHgMts1(UbTYS}D8y=LJ=w+EBk}kKnd=fT|ETGC-P1~)9M2M49hp^`#o1tpN zoqVyA+4fD6)$)64Ml=I`YuhTnKG!{};>L%|?{B(&7pccZ=g>lpu6viNyK<=QoHsW_ z?Yn1D=2~4MJROxBJwfH@G3REAUY%PUS++vrq!%q|)T;URYAv3W$s8HB;3eN6$%ZYy zUb7x$pxJkm@|BTpZlz70qyrX}5sJ>kp;nV~J|CcNnN)ICpD=5zlXQJCL>r$&mcr_? zt1pw|>P}B(+adF`WMx@^8T82y6R(o1<0hzZ1in{bn2frtZyoIL!0HMr; z?R(KWPFn3y-C1oGAyi>t`W$NRgL1tjmBF{vF>3`hYq})#jn~3~^HtTgO~9#dHZt8Q zX0x9{o~hb&^763is^BB0RH^8a<>>52skHw9Q~iD~4oCQFn)T7i6ef0gEVopI4uqeq z>JhB1B@(@_sm1R8zb}h;9sXCr&=HNv(7G__#K6>;B}0+5!*vO5jbYIWwR-tbVA$Fq zok$&Gom$4jzH;NQp07akz{F!~DOyX;#i11Nf{jMlYc`a^prpAb6_-Gw%Fsd1h_O2- z=wHzM{{YC`9;M~s;GPGn7Y0B8bj&6eT<6!{d7f{5^}Nn)pTqpl%Z{Y8Da7&g8!uQ# z=y$*5b9LVVeCMq~9c&=W8Ir3RhtxjTmGX~?>%fT>4$OjF%7xU;m4#?BR@gH*nOUY{ z(G*^Il`!hB2Qs@fn^|NXh?>mbag*`u=b0SEs}ITgltWaCOx* z$I~m$E|z*{wpQyFY)n?dyyTTl=`&oyT^oFIZR$(&swonft~oO7Yq>!liae9$qNrG& zZdBqqdh0r%oSR|C&DYOABGIBM%7;>0Zi5@1k3zTrW#1^QIk%*E{-4^PHS`|=eUHig z0rY=A^M{Y?RZXaD3$@+nLCaY5D$Fu-QN+jM-4d$zUqUeCIo8%8bJ<^T27S3T$(Yup@OH4>1=+ zxrtj-e9yO85hhiEgxrCpLEqDxic2VoIxtjAEZK^$rP*}|Y%;W)Q8O|ix}6JRoP25x zxf~KzM%IBPpWy0 zY)LSxfLE9%3cocQpp8>tXuN_srnq%kr;e&I8xUXwVKz?3p*;Tpn)*Py3t8@qsVd~2 zyXx?GKauLH;&o$39~(v0{Q9q@WH!!Z;R-=;XpMk5Hug2A5W=o6J|zhYRxz9weF+tJ zSfm7o0?I~*4Jb3c5(=Fu4FQzz2V+Y6kEcAF{ORgKp_dtu2*w1uvoq`+JpNP9cukVS zPRq^csXn4F)GtRlSV2^TTrFNK{uPOdY4h?6F)7`Y_cL@xZX!y6^K@#s07%g`tv^f|VO zYY-@AfZ(9G;7GBVEVd(MvuG=$doQc!{ZI6MN6w!;>Ub}k>bs;3qO^#{ncI!4U)gBn z@*!{zM%AI85Vq4@+RtwD*W>*Y_r81Lxq9AT4I8r0)V*rCxvw4Clt^KHJU_dUFnQtBUz=nuP|YZU4Z zPesq#zpdsS9bA#NY58X(0aDQ)=taqlvkOYkE7ItFFDBCF9zS<8*$$tthdEoB;Pkak z+uzUg{{Wl%D*nY+j>l5``h|XWgabhcRPl3q++*eIKt!C?H-9gn`nDWF1c% z)~NP4iNy9RAlRFmqdNJ;!);B=(2mk|JoPq4T|S2Tf1L2|1K#2JJ1gf)T-^_+#Yy9J zw{-^5q?x|3>WJi1=CPXW)+^VYUQUM``y8X<#HfXMvFZgtC|0^vW#w;V>;0cEm*MOB zGvD$)P5BR?qkCN2ip7-(*{cT(lC5)%flXY=x}>>Wz4?AiI@9Lh!K%I1Jx|#2eb=de zBl%Btl~?^9Dvv*|xk%X&CBB_x%G3iBrmYu(dcV_o-dpqDtxmy3fD-77G?%!0FzfsL z{*%n>R)h1~=Dq!$g;p4`r%@`g(=9a9l{p*8dk7aM;X6n&>43syctaf%r&6l6 ztzcS-)Id12VT2bz<5Ew8tm~#-l{qY{xKzYI2G=;q}Z(WdK{)rjh1kHa{=uF zSOG(~n#C1p&=ykV!U_l*0%V6a#{#*sq$N5^h`w8kPtwTpX<4YzD+W2+MOI=v3hQ%LFg*~0A+ZdhXO~)zRwa=pHX=xCr3V>y_c4Y)=>tpD(I?inZ8k{ zU|?rDIM`VR_d0X@^tCIZt5G8nLqU35b8`mWw@){paQA2=XG2dZb9o_i+s(=I*Dwu= zX-D>yS!rSRuH}oc-46?a&fZKA0Ysl#M{bi17c)YIsVav~M|44)RiN=`sFX%DBPzho zEcIu7*BS_QFC~MiCrDmU=c(H#U>6t$g0{ilO8P9%n|DZ4#iZiaT6CbCx>9t+j7Fe? zT?hJ)#q~a#mq*N<3G+|2;pykjB?Yzx>H6i*^H>{hCADh%B-D%nxj7hsWsLeW*aU%H z)w7h$P!6Q~UrLI~#tpDkv5?&`q)qOAx1HpC z9qGy5VO|L^I+4+3n-dX1PU!55omaHv@j1=Cr|G;;)=y8z{I&9ai^6_;(;A2(o|%!A z0%X|&sZzEO+D45K@~-CFaUdPId!;%GPj+h=Ze(SVeH+o>Vbu@Hmv!Y^*B z$87elPM8sz&Uv`u_l9!{wWz zhvfa5YstH&pkM8hT)h~L2-JuT>GDMmb5anbtZ=pG@54d|lM{@TTlunn#U` zesgq9Sk+k2#)au2+4YeVr7d9wjx)Z5LqTAB*V7)xoozp1g>{B5WQ!_@A za(Ui^f5}ByS6&#i25e$pDy`TEBh&l7S~0h~d!A2fZ}N}H`pCNCbXOsP4%eRlc^0)lF7filQ2c^5G{^Q>ul0KtB_Q*=HQt)IJkjP8Qaeadn zd337~Xw^)ZCU6XAbyO8p_)3Aev9iLVy_!>Kuu%z^Sb`h`Fxq>;gtloGPP2(rC^2Yq zV2VkD`jp!jX`vH|$eQR^)yFafW~FLwY%r-(>nsa!Ge_z z$o&-hf1ddV=e>U*9g3k5TNc8bzVl2maepOjT2xClrI8EsxT-2$S)}F+mHxT*JfD%g zFJ6|pkV{1f+6+aODX=9}EU?va^z7_u`EI=u0rMg7xM|t+bMc%#fDIh1Gia)FtesBC z-05D(XI*5BDUC?Hg0(FaK*MM>_9--DAj$$J!HUh9HsM@ygL55EH(=9Kc5>hL^Ksm_ zELu05<5BE(lZC3L?cRR7)5GL^exypp8Y=q99GD8OF@%c=u`#qo^xAJVLtLq*CoR=q zpUb3rK6^_(nAr`sUZX$WzCWw`V}3v9YoF5j%h>Tcp3V*fpQ^1)Hs0Q$+sEg8T~)}_ zZ4fhUVHvTG83PP(VnH_ah+oZmp%r448iO|bYv??WntYE#&3P|qON7NuNzBm^*m5!? z3?{kUI}x~Yz}tIIX%UPHnkd6yR^F54`X5*Lp0CLtN#b$6ylxyqtWAQ=DdY-~hOu{L zPGb-qu&gr7;S*pn0n=fC+EG?ZL}XoOvm`Juu^C-rVW7b0NlW>xkOQh{!kQtcZ%3>u z`sDur7e^P*MVUxf8&8$naJ@lxCIoevqU)wrk+!e4(=A|UW$GqDo91+@6w;ZJ!t*7w zR7dYMrH7T|>V}A!b*j8Hc&;F`YA(sC>jn_0g{J=iLAk0W&V!T9Gc0>5!`J<8FQ5E> zQ2h~wjKM65=%sUE*T_2-vdrqvUaM-v&zIzJM#yttSbLA#{Fm2KhsGXnt>?ZEvr*4O zwj8ZZ<#jdCx3v+vCU;rra&ta6Q=V_5)%gDaK!>5`z&||6PtnPZ$mLaOHa;(UbUj=j zb$yq}dW|3RFXO(}o0^m6)Vx=P6@E&un${H0P7{VVp(Xix6Z7o5C2%pDum+J&MkiF9 zgp1G{=_2Q7WXoZ5fbn$0x-$k#p)#$2AxPZG5(|iCu5|%9u9Okv1TcjX>Pu>fxPwbp z5Mf^I>5a5HQLhz$pVDWoea3PHOxi7P=t8tBty^HER&pP>EZNAPWEEk!q#OSziRl3f8#i7&8 zdY)TZ)aG?eq_vks1S^p-s_1MA@d-lKyf4o53G|}i0fB+rCXv8Q$ZCSRd$#W4;e3x! z&WOil#+Yr)BSmnQn#T=U+A4!tYdJ-%iiMODruNxfMqcTuo8^CY@AK{Y)5m&aT_$WA>ns+7%h_=E@zmq5>zTn^Jk zJ8Wf2G-qP5Bg!Z-jJA1@TQ4V*DAlpwBxa~WUW=pOCDj-Kaa$t*My{2gQZ3JPm}Jv< z!!ydrQf#S`(k`+h0h>U|>Z)bkEOV-xGOX%2*3$CzHlL5JnC4_Jon5kUpb?yKv`z+z zUGy$tr5fjEdN7<0MnQraV{INTqrkH+T<(eO9*>veUPq!jK1jvXjxEWikxcj}Q-7GT)OQ#%u1n9;+q z-p&mwp!w?L%e9?*h*=pxzS~;Nqyt7~ZoQ?G&Y??_md{@|73Nuqts`X;037j11#Pfq zWR*Z>6lIoT$X06va#S4&W+V#KPLC~lGiM+KWM3F6sx|sLm!0rDnRSr5G*d##yhW8j zmDM}c3_Rr20N6m*#;~NLbs1@6ur@H{$LUf-KIAOvfJK>Uy@%+&ckTY3FUvoZ`wKN- zoxEj-P?h)3JGZ4R#U}aV)blHvWg<&T#to+WKdxUp^U)MK#vr^hEUiy244+^y+c4S8 z61mvBL`-7iab!gb2-e4bvUPF(V{rFzE{MK>)&SPFKH31FSrJj2cx;mmi-mz3KoK_%hk>F^Vjr5AmAQ}W&I#S`G^NT2+G>*qB*Idw#bU+Duyiu%r3BHR~a3oW)6

zB9HJ(bUM9&JdSP?EYpKWA zUC|2=S+uS?MNa0sc`H7SgR7OUey&j$vGh5;>(S%+>yy%mz~+&wU8V{PCT&}t-lS=k zyPBGXW6#q*MpLO2&NGcu8s4@mrnZvYkoNx=?ZThMAr=vF<`Ltruy~ePo^| zZ@GN`0IT*t$NeA6Jv-&ExA|pyI8E0l`Z?F#EcbFH#x2CYp!?5`yT|1(hWj2v&gz>e zXHs2e$mN#u%!ug$UCFIqUtuCyM$109#qrGoI5H zMVx%WZGmyVCW=tRPoiT&_o>Iu`Tby8Kv~nuMi5-h!Mh^C%PC5D1ygzz)wqe7)>j>s zetWY)?f&;%7p`-SK+8ATTofjYi>H>;%KMSoGy8UyEj9W%0 zFSa%=Wz+57f5`b0=lyOxPzkoDZaX^9gjdo$6>t&LYz?aDS!4^yOQ7XcDs;H=HT75( zoZbzJ1=>^VBL4s)Uz)uN+3`-mk}~cH*_BsZCP~{>0+2c*0*#DSwS;z>jjld_boPAD z2l71u;}A1zLJCbxz-S34)g~;)axxbHfXQ7fhB$a^H1-bB#v!)rrP?AHW*SFK;*3?w zof4#z4xrAkR&HhH)$BHN%p|P3=GOwK<}({k8e?$rWZ=evqS!8WbT@3ZjmoUCyS!@C zYdx8J9H3R3NR*X?E*m3M3_Hm3Njjc7W=YAOcrN6|q~|(y3OHJN)d8qPh7Erv+Pc-5 z3pydjj?0Sk(Q|Y!th>oJWn`)o08OP)9)z4NG6gH+2U_A<7ghmxSgOg2WG_QG5&??Y zd5AEi<76>Y&BH}vq=>po+A^U$I!SV;O9@Psa)Hv~*^q)_o)T4ISTxT)DrC&8qMB9` zE)|sI!?Li`2R$4+()+l4kYPzO@BUQ6jP&ipLR}lio*?V~W-;<-AQrb8wEL9@zQW=;}0JSdfL7kFmg7vhEFv}? za~jswER|^Ro8u|LqS|Uib-fW#V?3ENb39g1Wj3@HX^~Ax3>`w{rVJd$HGyFUEq3r0 z5AE&#ub<)`KcHd~W^Xc}Fw5Wc!<+N_YV9on5wN$UQhvAB51+X2P6_tGrWjA9vx*i0 zs%V2U3+vyP^x!SY4o9z(XVGViWsl^!|)2^2q} zC6lHR)@@%w`JbWtv*G>UnC-q|`yZ08>4SZ&-T4RG%^xSWk@T~^{7rVvf0y=K`ky+p zfT_)Sx{c$!C(qK`o^ytaz8==mDs*7>OQ<<`&rTLbo#&`tGgdo!vNx1oT~G%Vk)XwW zTUK&D-BqApo!WJ3@0_cY6|+##S|vj!pQFzi6EomhbjU{6JU5T0&KvMw^7eVJM4N)` zl{wpbc751fh5o)}xvPKa@$&vJp;d^G($*#8=(X=r1s^+Ul${{+Rn#)+nvN^Y)eg=b zdHt0eXtRLE&?=Y|$^uQ-ymhIv49n}ELF9Qa&HCM!o!{u^eed?4C-H?_<$sU*NW9W3 zsSzvB0Z~fCD$Zf(J>2}yEAsQB?=I`DJonA)bdGJn4e?y%wAeb?Aag4?6EKOvrszT~8E&Y&lN6Y z%N~1C{g)ytD~Pp5(-;Zj9Tgx8wq^7p@K$N^z_6uDB+>PO=Hw#s(x#1W`S+rE-j|g7 zUQJjfs~L1|ppuIG=7&&m(-PA|mAYH=P{zS7btVW6v81Rt@3c<0nfc!MuQmf!uqNsV zwkZqdk;G0MG9p8WKvjvTDhG_pGhCupEGH5uxf*$N6p4BU_Q=pqn#%sH09kMu+6X3| zi)a=xzL4d)tqz`Y*x+UtdJk-QPHI(BVOjx5RB6Fx&~><`L!T>P#9h^*q@_@1k(I<| zRG_nCm*$}YSj?zggvGfwi|LeX46dedfaqn45|fI%QGHMrl3fpb*Tvm-uakJa#O#Vt zrGp5ogN?PBxi=FDSb_;?t7p-@^`SVl`}Q8DH~7)z2&D~ghNmQK@~VI^|g7St~3>^=N` zL+5ulnz@q83PpVlydc>484Y0_w_iUg$#sKEG)Bf-))fd~aIrd>(Mz_Jgkue=DW7y2 zeCIXSVSt6O0CjK}KI7W#zCFuIVzLZ3TM$$z@;|FrpUS6Xn{PWRVnGU&YVcZZq%J!5 z{WIdA_@+Yu;$bvxHY;VDU&+#GtAnkI!Wa`~HjNjo>7PB#XB3sPX@{0DZQWa3$~wCe z$V?dpmnF!&*~$eQHc)u&%+Z=nwqs>qP9rm^WVKSV$(Ryn2F$q*0W!T`qrt#=zMae6 zo~G#geA>T0o3tZ_*J3KG(B!JutI4#IJdb5mO^N2-;!m7P+}}0Q>40+0YNE8z&4W#v zVS`22bd94Ro%bba=3Q&9xDQc?AHA>HR< zUi+!O{rv;s6^r~W^1on{b2Vsi{&!6emD|*Iw{hL)aJ)8-P}8Jx=ZQ44pw8J#{*G#X zK9V~YvlPsbld4QijZ4*05;V=$bQ=$gpp^qCW176H@N`iHEd>(;;FcEGkhpq1FkkHM zI{aPrehqU!pZJ~Vkr}qLEfJ!ns_eSw8hCk0V;!vNFH7lfBjD+;RKmNHtmX2NLW$a_ z7|{S~7Hzd6e8M!>3NMURyv$W_bj`HOg27l|J%|oI&7y&~2#o;57*x zgn)6hF$;*|X_1Ugqz32~AcR;}RkO6FVoXRP4LJ_ZPJZX^`F}t7zQ7n^Cj^BRjTBHE4CT3KjY^D4wo5PHQiRtp7bF-^b%Z$)K*Hr%S9Lsz9FMS86E z133b!j;$SfPZ4Lf!&f>yt|Ax3txbiA5=oMDjVEi5Tgh%Gx>(GZm~_n=gtJ*-4v><< zV7wP(4X6}USy*EklQM-9Z@T-#is0*FlNnL!V@^oz1DHa_bJ*DY?43?4n9eFNzg^8= zV&v@k+t>3#i6T{_Or&I{!VY4T4G9%XCzXVXtuo=kD*n`9v>d>);=2hdPKtRvYQDSa zdE7?_XC2SbYR%OtiG7S1h=6pzsTh zx@T@#3eCmnZn3ZBeY&n{#u&j}uqw@rNhCeT-Qe+m57Ml>cAI6{n=e_F8oV*oSX%@t z%1n<1F|@^b#5R2~rg@+8EpgJ*Uf0qH5FPcn7F`6h&QZd_M=~vB;lgO$~#Xrn$bf%s4Vd@WU_b}MjY(uJ5J()sp%=^V4$Hp zvh{0@o#@`Y{QJs1a`Mz(HGI7eS~#n{MIE9ecVdSyDQnM1m0vrp%A%0evvq@`&CxoR z_KSf>S=mH}TWrqK=@%B&l~jwCPM5BJna6K2ysGC#rmjux`j)?oq3)hwYO1Y~u^THh zZ9&NS-3W0~(9n8p1+(v;LvC+N@8g zg5GBX_MJ;or>&QIot|BfvBh1%*-gv`#no-yEpxLSQP(3* zfjtW&ttfeJT9o4#)e(4D?7)g^qb!WUo1OgW!>vveULJX*^SbKi(rS>>z*26v*YmkQ zFVU)@4#?<)R#`QtlKRfw;?pi%{T%8>UOrZ#? zJ3nZ0+?_4jC!5reYv@Fp^MvSbV-kY8Gb+cfb7{c@S>RsT;yJv4w0?eDm#1j)>Yho^ zbs!|nYOdy5+PUDl4hwhvyc~Cz-1ktVX^kqpi6xMt4PH;RGZL{!DM^r{<^y9W8TS|K zJ2^O*+7iHGaZsw|5^aD8*9KG7NRgNfGp4u-UV7J7F#|D%+du+j!x(F5%TExt>Fdt0 zetI;JIxV&X7>*{5VphEBbk2;B(;Ic&0o>X%AbMSAZ?~B9TB5UT6o3I3#}xIj>E(L4 z#H$)9IO?daZ(%GTn7^Q}NzR%@WoHtom!i=}$+K@bV)C&?+=P+=qZ%27?oZtssyf?m{EBtMl5Setth_3 zQo7(%DHj^LRGD@`a19n@Qh2~>Z(TzzlNu$2^Nv`~jF7105%&K;8?0RC*7KRD>V&L#zk7;O`%zq4UL5Qcp#Rs5))!&VV*-K z;kBStY_Py36~d`R`d@b}__{o^T#B+}P&K13(7uNc&Kw=`lZKeqnK@aiRnrRh)N(8w zC18fKX)UU|DW(p_HBka>ta7NXrU%$%EE-F-eJ0ZLjyo)bRNGhguV>2e&nMJb5lrN9 zFr{pbOq6UEdD;#EOhP3#5|V;w;awdC2WTpkk|2;PRBd+Z))9LAm{w;G3Gu(9z5MH^ zosA%+!FcE}g)H+X-11!l?jxOA`it3?}hT}@|lHP=XXqc&0BOgATIqnDoNv9T)!aT?<`mSIOnO}2Ey~b zfc4)?&*HdyISAG}O|}BQCJH7=s}^i3E(|hR8(V7$VFR^{*g#^2lY;zZ3fJ+%(BNDOr18l!m%~;r_&u= z{$t6}<-EO ztDG@9sTqoVq6HEu`ayq?xXLk79bwMH2LtZ0G^*ch5aY7MpO&IbPf8TNKdK1L9=>;Z z*i@S_sVs>D4rW!d-MZe{i1X({rnHPI$D2zY&RzG!$nlm+R?P#jC1}IJDYRvD++jBj z3rEEOB{#g01Wo1W-*d158E7b?J^?6d{?pFoGw|P&Cq=sj@6;Xh}P$~ci))ovZusS-5B+oU;R%1}`HDf1>fbRmO z6=2B$4QgjW$CLvE1seR=z0pyif<+jkR@faNUqK^W8!GC)mgHz3dVH*~6c`-xPUXpTm3}nt4-7oI0@Y zZ6*d9D4HddWaztW6w93^+fdU3m*{slGYhXxvP>V^Ic?_;&(CxaqswQ^n5e|XOaN1@ z2AXV`UMr!D<{^mP2IAIK`upa+pN#&m!B%=G&p4%{GbLqNV^Y$3WFq1#vvf@t)@u$@ z9ejo@kiw{$I^@gtMP6=>LkTmT1A>(_OqNWBA1=7>D6NSm6`Q*9dpWOP&qE2#`ipb( z5$KC6LBy$xO}a0b$9k7{51nxKdJR+0d1#e10o0wU1zIr<6r=epI-}8;@cey?-HOP0 zvoz2HbCSzlxxuUwXmto|a<*?&MCZdU1Aa3?X_I!!N(BTVxoY!VWKR?MbV@go5;he zt5Q7I8wG91NG+-=)*>3yjm6N_?HC$PSWFf;k!+w?B#RkZ7){xQ-%E6PzDnKxZOvUk z8JSuZt1_^mMSUq}mc3aM2u!qd{`P>l1%!&vYz6gT0v1VOHpIYVK^TlqOE>_bh{n<+Q)o62&MvbdW4DZ( zYXXci53v|B2$wK)Ts}JZ zo)lK-l2fc5X5QFPth+d~wWmG3Th8e!-l~bfdYp7?6T4epMXFPC^qH^d-nXgI`}{oD znax?t&sW8)x;X~=o1V@i^&K)>vx>p(Nys|SU&`h@uGM17@?CAwfdMOObg-X6d-(c? z=I8jjRJyVqs<2X0bYiI^Hi=e3%3X-{^2<|PO>auNX0!@dO&q$Yyw1$%RO~a7x^%PW z=`W+g#|`zdDL3Tf>zg$yMv}K76S7z5Q-bj)a59BA+XQ^h*!LzGRr%M4M0&cnFDh1M zcZJ9ZYZmUgI#)3q%&$ zzQoDt_AI>kvHK%i=JZysv-F`JTc-iKoQcFL(JG>6&>oLWZ_bZMW>0C`N{B|wCwc91 zx9j=nb98dPWvb$Dx$g&pJlIduQMr@U*F8a`Nw%&fMNUro6buV}*;c%)QC?cdYaY0z znQ^y6kvOPIo6i0}qdt?t`Ge(tkx3Nf&elVETy%5&dG#JI%D*k@@zLvySzRKt?lfnk zon@>SD^WR%g7m; zQK`LoNCox3SDL4ues#s#eA83cL#DU0lwhcuj+4QcU_jDvHO9c?Nm{hDHZtREJkuCY zIcy?ZU0y-dfs8hV1YqT`aYe{#RzPD63p2J-11BNCY8cP5G}+)n7fueYLlKt5X|~## z5w;BiRK==ov4F8}WUQpFVNY+z)ynnr(Iakx+FCBZ zM13EF?Y%JgCq;AFUO!g*9v_Uy(5;((p#7J|eop)!+jIPVaOjrhT$4tN94C_) zNaS?LmTO?M%?v7{WSMr%{Tem%hHipFr44hd>?$2x$D+I{Icd>ee5Ws3)|@7xS~WbC z!&%}~oVw4o6Np+i2U0TIXi2j9SzIPLnnXf)jCSjdH(c}*Z*uc*UG`ryU%>u*=lfi< zKKaV!7H86dGRY`vD3fi4)2F`seqRCQb@0*YM^=<94xS;Hc!%6mix{BUW3-W>l<6%q zkUmPe(F;#cUvR(>-Nl!SmZl`Cxcq zS6QLAWahyhYW(&zpL^HO=Ukm3e8)S8!~ry0o6XlYAZ?M1t*hDPuPi0YFf`Z%W*cJ_ z(AryUjKem?&<9Q=F@X@!%{;O>;eLy;u*%CR9X+$I9x2Dwyv9{jX13c20X)n&9vds0ZCSPx#%fN& zWqQuZwanbu9Zy2^k#9T>QHqqUuzk6ZR_ywt$?$fNX%uJ^keO1eE(>|5NtTBQF;+9| zF4=G?rEa^=>-Cwx?D8MOuWdZ%a-{OFh0Gep^QwiIuSav~dVLSlcs(y~o#j6#-483R z6C001hMsiPwbId^?rWRJmPoUml@#%-Wo#0(vdHuGMpT`CTJ2bBFoep4hcrZ^wH6 z?tQ2;Cha?Z{(4Uvwo2GrC2*7)QGPN@Olrs71KE6ubKx|Z;_L@R7h6c+$&cB@$(LEs zEd2=4@mimj@a&2nS5*2GNTQvCsAuA~?`X}~Ro_%n+`nb&b~^yU5pt+T~cI#UaIq#Ya`aJ#pxO=H#Mjl9adUhf&$j#PRec%VqAd!KMz;RZJPQBG$cescaco%&|p_4J$55W(0N9H4$hi zaydF^Iza(fJ*u4*e5O(d7F_jKfgGh{+~1n`uaHNjc{~}60@J`FZHI|4S*f76W`9@x z51I0(f$C7rqE|Mt4*O4%Mav^;$j9Wp%Ca-?i2IOr!l{f%O*n_11%AS}29HjMtcV86yBDQxa!R+Q&$< zIcj3ak=I~$RU9;%8zf!z(oA}!SXZkuglwi8YCzzGObM%mhZ|ZERILWgDSq75Q>BJw zTVMoI!x?3ZBWg{Im|79&UEHnSJRgzhg2=#7D;=gl#h~i^{-XEuq(E3gXDhK;x|>K5 z^gvK)n!;s{juuF+<+u$jSyrN`sy{cYexxOiiUCx!r*~R%JpCN(k#$wBf>&TtokSfK zQ6rc@UV+Xbu1hO3BZA4S9_i(yhf64{R+y&-1I>_iz?23WAW=cPpf zP;Q7_iiCO7Y+@uP!$h!svy6!$6&lvu^`^1sc=A0FGa5}!oNB6f24l@0M340_+L|9H)5(tm8mmLr#jZvY%oCqgfVuvG*>YKZqBo+Q8D2p4^`^%P#dabC@oVoiY$t z5%%&Dwp1?{usZ&9;yPw&v&lZ|9t^*tc5`rieJRIfu-ThrLoUP0LuYIituxOJ1Sehe zZBRK3sxg=uOuBG(L}DPYX@+!O$uU3&VN)7U5RD%Gl9^tD4OVENCFnp!sN+cqmTtR; z?*h*CQY3v1jZ(mzl~ZSex{kP@jHHcpz=toHi~*5#7BnkS3lb`;$m5k|S(X0oVT?j~W;PYs(gb@D z=xoZE4fIE`<@kq%>QcK+gtD}Zi-~Ql8V0c9lL9A%4$>Kr&d4@cXGZTmE@y%BPd}u< zwnWvGD*_l&sU-po8yTEa*`hSd+S(jcI!wd7?BwHo-rDBY6jCM&5$#}7Y@^I&X$>aD zIn~>3b!mYb=a;9iq*|o-==M9+!%mc|!BB-If?zgmz$BYCawJLB+@KEA1{gR@6b73Y zM5NbPhhi7?{vMmkwGE-_-B$nwIQidT`6RXhvqqf?fcN^x&lNH=8UWsMZGxYP+ zbF&d`^c>Ptnzx#vzbG(0Lfp5)xVChyD>p~c3f?CzcCpL|RE}n2JI%>G_`OGG8^NmQ zYY6mUWLKS@-fEvK(O_nCM#%3iBhk!mew9@2^SSTmWaYW)R|iG~;cooZ$wcJy)v@61 z2Pv-Y<5QQQ5mx(9Jk|>1ExGSIrc{|qr%gF-g_V1SBJo+Lba3xV^!)x?lhLVC4Ls+r zdJ%+(`E!%88Dm+?q78P9PV?hvbWc!qqQO^RG`eQQ3FPT?#wxLv>AlVhZy&v0ya+5h zgw<5!vfP$GTviXc8tIlQuvSUbL|eGB?uEB(D_VpU?)`rri-)g@<>|C4-j$CnzeT-I zGu1rrNAgFLs*{;$>JbjZNg%KEWYn9@xa^E{pF!w62Pvg!Ix;$$Iqg`r!YsQk;?i^q zlRR~((@asKBbRO9RCL`>Jfpjgu*knV&cj=6RaDIKwbwy= zQkL*R3iTR^+XYaNx3c=)O@Zj}zc02*)p8Q91R8c&?EI@$b#{^~CAAlpjUGp=k%H+| zVasH&oik)CmKt^IMTxnz)8~0uUQh>?W*)oqzNgW>xA}(NSD#hl>j&r9I|Qiks_tbA z^N>^yB!+CF4P%?`&$0QBhJIt{IsX7NwIZr>Qa74~_N)h(CRlY?J2jUz2SN7L#8^tP zV-l+cAi$$VR%%tM_U|2XR+Oy>u^6zqba1{U6s+3`EUTkAgm&H}IUwZIc&-2$jn@Wb zlP1A(TxtY`8FUbs!jCPs1Cq(RIFk@0#uPIryT2C=#nwE|*)RCP8jSCYvnoWpVUWDsnoYAq{W=%?! zO6Qu!h%CjX8W7c4X|SwzK8?}C<@{aRWvy3dVlawrTTU2MVW`S3^05mA*eyPq)8?f{ zf{!rUT)I=ip)#cv!0;k2(@iwnecYw}JJ0L+$I$a-bS}+i&?=(qH1V4tl{Q6?=w!(! zR%Y0>(MR!Ay>UUAMHt{TRdz8-wnDA7fb%(*psMn7bxSn_Qmn{ml_(>1G-%nH7v~F7 zDqhLxGXqWYp0`X)rDfZIQC_RvmKF1RHa0;1EHp1cCqY{IR|j_xK&ns=}N|D zn8sBqFV)_sJ*tn5d|tIWGL@T(!ELaUEd|kCqP&^inzJfw-&U~J!6fOYfSs>MLP18* z*n#Xw$t_c8ReCDVp69T@VX(1y8=9^6M>iGb^y!b;p68kJhmqgQEjPA^?nO9Yo5gLm zR$D^?p$p;z9j0-HmJm8YiU>->3&$0>#%xgA$t%f(b>&QPqN55`LaNyP26&gZh`JpHG<&((D% zl?9t;Jst?)s^6u;vhe5p>cf|=_niQm)x+#Vg|0s%%;`2~MxCf|JbjyWd}j zlHj!yXSxAeY4csZO~Qlg<(?{uZRXXqVOF{#pPhMnoSNl%HP@aL5;E$)w>@jHL%GS+ zm!r%Dh*6lL{tUO{{%ReuLBF<~+{w z9$tgi;hw)e=Tu&Qq^z5yg*}_v@$Ex+PlN0BeuTU(GZ~y3ho3wRI>9NiET5yosb zO7pim%1#GD$U~voT~u~TOeJQT9TO4SnaVCMxpkx_Jd`g&uE=6S;zWTDS5wMFFD8wU zk~1_lB)C-tE_iw?d%4DD+GNY$^-uJ(>ppw)Z{>c6lH_Kl(IXi_nRKDBg3*Qv6-h*x z>zU!uGiCO|tvdD-V?Yv+52?Jc1(5J?)d`{o>nk3Z88(?aZ2`sG%O?HCP@qLjLwLDz8TA`9SvKuSxWC5t4%a}ce9n$nqwdc3# z2*2kjm!4E0ia@$&jB3>&n`RZ_^C`GAVX!i7Ykc!RLQ`{Inr@8TXf#=Ehc-TCYKXcS zN3(i--X-L9(6H7p)F2hI#=bycg)4;A7Me(%Upp>(IkrN$BD#*Gn$I#cX`>WE+19No zr3S9{4$dDP;qPQ%to4aVI|{06C_2oen>R)VCBV+8BI8nXJ0*scAY*Jmxji+eu7rK5 zFx+o3=By!kSoTz=$~v!Ti5mvd!_0JBKq%3kz6>>bR##TCxhjvOD4Tg0#Ct?yI1Vjk zR5K+&tjjP?$v)dl0F~L%L8U&i(GMQy%-NYmAHzvie=Ca zi!NFYs$zy}3Fh8V&b>NnR>0c2*_qBN(C9?s=Bkxj>7Q@O@oziR+ky|k??Qv-QRo?sJbVIbsT61v!jFS97!t5cFmdRM2x zLCM$3#-Sjm00R(Fibd3KQ%S(>?J@{S$cX`EaagH`KyAH-7UNy0Z_Q>JVY&`m{-b

l<^mMym5@ZkPz`CK{rt$y&2JmfPp+Rx`5nITfufC3%JV%usAf$qRCq}a@txOU6XtQg+EX^eFwBzraik=` zymO%qfMY=Iphs!o(q_d>az&&f1&G3(n5u4V4xhW9m4$ikK7j42&9D|nPK49d>#d8| z5goDDMPQX>UedFInw^n46Vc6X4O^k6>%8HCf!1Y4i4$U^&WcPwuUnhWV`N6kXVfgs zT5&R_2-T0VSZ`v@(?$hRfCSiXquNqwRdl4J1vE=fXkcB5i2)*&?28?fX)@RZ>mhzl z!nLtR)&NiqpP>4ux6k>r&GfnID=b%C6;hm5%%gR#nM`=M7D8l;E@JGdWKDgfu51Se zWa40|>vF!K>T!7&pV_$(W49egPc=U;L33=2Wn|e}1XR`~V3@~0KBXIy3>bBo#o9}x z>f&PACbhbYJ9Ty~%XCXocw~`yvb)hGx$lGsXcM%P)M~&;&wGAaA2+2YU^1+S31&={ zOSVsR@ALk1^8G~~Oy@x|lPb|<3U2C&$ygZ-Kpv}1CS_oDEm10bbhf?=&W#3A0x}m} zX6s|l0a6(S=o@BerF7|~W+$^IjPk);;T6*71TN9n1!La*KB!^v1WTsx~|SnM~dvV zi8WCRyF5?S-bbVISH0z}Ct;DKbsl*)CD*eH%Pj+S7R;%>>E`CRI$X9}Hl;kPs>m5< zTpON;=!B?h(vgd3yv8`)pBG=Ac5)e!pqC`ltq>UZ4ZOD|)r_Z?aKh=J2svrXF@lbj zeZfw7lBBnRNoz>$?d&t_rL+a&v z59bo-OzGe(B1G{3%>ur_V#@3qYna)ZDmcYNTWvz^qT2yDVUTPWQqtlv7C2V#3IN3b zxNKZAWtY;D%2F3=&gxI{$R@gJZ>zb`_Yeb@`Ao6CSKovCX zoljpkKf~Bk!jsujiZ?vyVg{7rxpDwzjr#9-d0!o*W6*jqdg;z^c2W72(yvk7&u85l zn6j{0I=^rzzRSEo=mW`a&(ibwPdB+ihdge3H`N!oIw`y2rz5-5C-Z8uZo9GQuMOl- zElX~u-(neBhs_n->cgweRODaj7QAkdS1ZptCXFuoVk{!0)Ii4CuQk^~(fR#l99xiaIj)M!YfF)pmY62OkC%9fXSEL4LjCb#uCg$n|aJr7~u z=i3J1Jl^i9w>i-`@>aYENlh24H(V&ww6lE8~$^|s{mGRq6yRYL#Frq$yyg^)I!5CtL5(MeGX=M+L^Tn zoZ|9(HCCT=5%TJ#r?)ItVn=|SV^H8AV#T3Cu@REgp1G*AvvFkUK7+Jm(x02JwCLjE zV`a!8qT+6JMHw_uuH}~^meM>{V|F@F1tUc(EC|*i<$P@CRJsZ7aMW2Mt&NmI-os>y z?O_)HY(SI0Fj2j+9}XE(E=Bg=2@30-JJtKSe3#Ac8OUT~Q$c>R`fnSjfSC6SO<4AX0bw?1Y$;+?UVC^LjJfcuxH=Ws&)d&AWsw!mjh(!xzt(mET= zYFwh3%&D-}Ik24X4S^)lCL;r42#u=YIhSvutN;qbc}5#qh)fWxgtF`gnXCv?6t>aC z%N4^TWtvv?{{Ux~_CwtH-^ZVy`cE42>mbqFZ-&8SFd9lpip5xEb2Jc{hhyEx$8z)v zZ#K}uf`=52%uyOm1BExcm1_E+(GYCfxz!?ObB+wzNX@lFY}wFa!6dJqz!a?&R?Ec~Fc|HZ;da2V5K*&*y(+@a?7HeoT-ls1q$6xsfQC;R) z*f^B;FB8)J_VYWx0sW6Nz`f5jX+>so(%Y>S+##TtFjf^SsqvmNCWZ4C#V&$^))5BVie; z^ghp$)cr1v`I3>KPNKgrHO1LXwme=!NX)}nc_V<`nHkx%>b&&H5y?U#krQJo8>rEI zqV8ddu-z4P0m5~uL+w$&sq^-C~*bo>4j7zp`Yz3CVb$aG@3v3!h3leus- z)NR3Xve|QaASA%3EO$fxjOaLO_fIcj*ei^vJo`#-xhm9K&glfo5P4NLp{j~*ZrR}d zBq;A(^}N3-@;yo!Q(4$W=`A|`Yq8xLzGqzn_X364ycFepjp1_7Q`2x#*RE9jc9}-@ z$LFwSevP=}BFgf0r(1qgc zu=1_uq$Wnn&!fw}9)w^;rdMd{70{Gt5-ZTcExwiCJ};xp`9Mj-n_TqDNm*J9i*nX6 zvT=I%TdM|cvq`MTLdIPX(rgrI;Gj4e0hMKX7QWh=$x4Q{EXPF9g(%c@H^=Pf6q@s_ zTJ-Y@@b!Jl)V7XYx)H}r*f4eMWHD7R7{L9egOcUT>OpJ>L@NM#_ z%4Kq8iYyCAhPJPfn;qpVVv&!nP!J4oy0M(FHs)XGghLrvT5T|pE!HueBe9Lh5;aN3 zNgs9_%jz233#~{}VDzzfrx=FyQ?6@PS}-CVC%^y(_w|)ph6M0(1Zz- zjE*bd%G(-ZAdGA}CmodYHO>gjWwNZ==Cn#RhBktu3{+a=-$F&ASw*h}X_{;FC5oR= z^LxD;g}nE(pT~RPIuTWdv5PF_RrbQSmz50aWZHS#F!Zkf06)jPk5?VQ%WEdinc|d? zgY~|L+1y!nCjwA;PircN7XV)ye);(9z zr9BWKq#joqi5duWPipy^83=|ZZaU^=fWw;3sa%uAQ13=g+6HVxH363K!O(gyuH^If zH1o#>>#jVUm<3Ligqkd(Tw|7ez|&o`lXlshX4$c_n_=_Sch&?Mm=1`bgqp*kBEX7z zQa;u9{6DV!-=Fx$%=P{<`ERF9=aJYy`$FidT(2w&ioHo%sB2Gq97wP zj0V#YsnAm5N5up=SJ;3$`G6`x(;4BL3>hhg+ifP>nbQ-IgJBy@=zfPMp836R44nge zA_q!x*w-$B8dD*mP-P`tMmgkMMi8CE#zucqHNP+>5Z_->sWK@Te8VaR1oh^^mx4MgRbH=S&-ebv$X2C zx~P%&qB;*p&aCr#`Q(WF?z-hR-Efl!T!p0JoyVokO~%A5 zk1t1A#p%#`9&$2PZ8%2Ya#F&ap(ZeRK2~(d&J|TT`d{fu;eaX4(;8%diV(Nrx`ZB<^i5t$O{ zoe9@EB+Ff+k}! z^J0Oe)2x=R)9J~{&c*A1kwULtloL^CiBTGrPifbJvkK&E#!g3;)Kncqye_tmmbROs zJvU5Y?|C%*wQZIH^geG<5zyl4tm7>8#`5d*AGhTEz2bX)e-}?E6;AF!krdUT%9C`9 zE|ea!nPCT7Z1+S~aJM;rJqpwo1C1d9yS5>oEOrXMEu2-#fY~DQ+S4Z6 zIu5%Tairm?y477}+R)TbRP?!gugvV;SvsN4S63=K4?g?W;`IhkoxGn)u}0Ov*=7V} zxp>lZ^kcB{psebZ%Fi&|>S?ra-g{Ct1#PCxOopnqYjv$sCA7sw1B^P~Lz{->vXiFO zW(wr!qi>a)=!gZv=fGIUY*Qu(?AjegoakD149&U}s%(|+ktv5+)N7sU^2x@Disq5J zj)-!JZQ+Lu2(zr1%D}))tkY829+Rxtn|5rpDB4<7)*?d54mw+*wYu}Lq6*isf6)&+ zyW-xM@KlF0)jT^vT~~vFn@Ya9m2r#5Ai*lLrro8#ic95chb(M0v&L&Vx zS&CJ#8nlXxfeg72Lj^D@p>eKVh6k^m8)<`O9g3my$k_)6Sj-X(J2N(&0(B5wG8l_Z zg6ta(qK(&N)WKQBOxRA5M?lobEV70HV_s228KVgE+ZiO}+|Fu1BB@5wE4N8IH_lR{ z8KS{g3t%aPCSzwSOmhRwbfQjyqK`B)Hc>LMm19NJ$&C72bN3yy@{cdLEaSoi7`JRv zmKCMG6H3*Ba->3RqQRyHP>Mu)odXN5xbb|pDVnO+z|z_|2h|B?dY+kblBit^8h0Gl z>lu8*s#T>*n5g2R^-2#d0Iay6X{D2J z1HjDUo`{)&H7JnY(dzMiXVuI3>GS@yx>MFVq2vB{V)*SOchH{O2(1M-Vu=SvaZ?s1 zsgtTC10SB7Iy6Qy%vVG&S&9zTwnarlaEI#8qwxN;`ac)s{{SD_`A_Bjs^uWrpcyn3 zp>C!$hTJ|cYw1s|@8kNL?EWkD&xewwsrd?hADO;4>3JVN&{v(SMK=}-KU^=$^g~h= z#m2)^LRDoqh;`0$EHbLhHDc(gZHrmR2$)#OP8su29*wNZ>(>d5R0rN3#~0|&Jii9` z{XPu@@UUI>588a^>tCVe{sH_?*l^rkApjI!lBq$-Y$42Q@M8gta(nJho+GcFM_p{; z3jwe~#DfeNZDy>AQR5}gNb8^s7!{i7Az8sjwq>l_tXJpV8^tPZ%qAvuc@u|67gXbt zz6cEAF@WQw!kTTfx_if}y7}KFgSN5R(iwnm7Kl8`b&E$Sm=eHb|02 zs;U*qFq-MU))u=78Jr;KR@NNOE`(Z-v@wp5b6!?`6A~KeSVK9ME~8ht^dW!OAAb5@ zAJ4q6dx-J-y#D~nQHk1hCGSTq;cCiB0KE@VS5CED_9}}F(Oj^Zjfz=b$!9fe`ekzI z#Cd(XqK#aZ9Pg3SV)7(x-+ZCaFXKA8GThx|(sid7(iFQBsxKuOmBg;}>(I6MBTe ztE;+0h})#sL@zZ3(xg@d*~+6l^y*r)?!2N%G>p=MN9x{ulLLnw+c3)P!DdSYt=~+& zE32Q!_&U{iS4z@BuwqFt_AhJ9`gq^-^T+HA+>&r%3nEM>J*L-gEGxK7#1X!Gku;MnuRNEU~kN6RIl7ycZfIVJjR&FeYHYBm>7Rm?q-(o3T^o@zW0iHp(#A zG$)GSEDJF@W)hAgR^D1AbsfoGMNCH1ZH6YzX6U*4InJJ8RV5Z13e3|QB|>zwK{F!) zs=^W-*Y@)z=l1ecmJGriVU8vY7+@BWuw58kSl|kDL>1T}af+DFw!(Fq=Z|UKwyHAv5H6>5n0T#nT^z{AH-Rt1JqQG^ltu7KJ$CW zIqAtJM~;}UMYGdMYq?QyxbxeQJ7mDr?HUw9Wp}1@T(zddZ~l1 zM6F%WmPU1GXU^-AIu=%BU};runZcfNd_^r+9(@v1qx5+=-dfkAF+J!=Jfii|$=Nd1 zT?fF|G#;3Eyl0!y6V5w4ln3zA_P_Rpj5RMBdu^jjBrCxu%qyPm(%0r zIqF1cEfgnVSuF*|lB?2^nIL#M8mWql0nV~2!>9|Ki0!pg5el&&#iV*vFHQLX7qdY? zoXJ>XHaeCsI3g`orTf2<{hRZ+gm>d-e|O7& z5%m0jndv11U9$@5z=pdgSXT;WV=FS#&JnS!B%`VA<>PtoqEmEL+GfFUjB9`eU0GIy zPdHc7wK8srO&wrQegfA@+24%GHr)cBK=0z$RQZ1=vw=q%fwHhj0f@|lv7k1N4$Ucx z0I(*}+6W>;MTWQpoM*OFfh!yskzqwm94rU~Ha6Q}(8|cWi0XpcSc!yY8w5ua9c)%E z0{LYX7sf;phRB+;_<$&#WHC| zSMQDZTwwbIfNdR&cx#)-`MR9^Lsv^bts(iGKQ)EA~R%b&*f?j2r zd#*hZQ=7|U(a(aKQYWV3TkDUw`@Rp0 z{O7b0S@VJS^4hgl;^|pxWzlG_DmB*;N|DMbUh>nX=cROB-3onNxav-ObQk8J=IYgi zWjK~knT^_@l}*zC^WJnr$+uM7ta8eFS3rQ_3dqNu#?Os|s|IwrL6t4Y%8IGbj}W#q z*?wx8@;65)d8!ar<>&?hvOsGaE>|xNedzI$fc_7!$MnHIiNDt~4O_|A(D!nP^Qjv# z#L?`KERI%SMNgXbT=&j$tFmz=rg)=Wag!>^Md)P%nnDg#Y`$vCkEO{1yW5bXIDDB^_1JQ0>jPg2vXo|l@yL5jkCB@ZJrK-EV(7Ydc)z^aj# zXAf&N&S6e0o>E}~z)VL2ZPfKko#bdM17JDHi#$}vq>ZX?Ia3 z?jRIc6->jhq*z5kcA3hykx(gROxR{)lZYijCQO!%jPjJ}&E9OIEaWv%>rTdYNrA>; zj+Yrk-!eeX-r7Mr4L;g7!Q7S(L=?e=wA~#iCH8X{FI1v(?BGhEX6|8}Hs*0ILTPLPE2u2c;*JOe419V(QWo zlCuUTRic4Q@pO9R@|j`K^zzek^dzSPF65bCyvhPoeaYj2O^B!vv7#DQg;sJS=#fy! zSt=!h<0=L4(@n4zu4t=t1nhVY#G3XL&w#BbRgtA54y7JlCS`F6UigxEpj@j|Fmv4X zankd>2Q8Imbub?y9rrxc_v+%26bzdEu@2YSGdkv&fri>#J{ zVBlY)zJtv9_sj3C=X->dEkG#PVTB?&8Ixt}ug}Tx+5NH7r&__KUpoEeXnbOw6p6o0 zg8UF`xnN;bAO}6S7;u%*HYcSrQ z*XQ}XIw_W`fCbI5SPQK>%vBAt5H;t5{h=e`x%q=K9i}7Mk$_1s-8PhyEGF0*G(Z4j zg*+G2&1ki*Sr2Kx_7s0IWK#v$NMLM5&>{?2Od@r&E2D$2lMgloWnN7^nJchBaNKWc zPeh60a!-Ix+Te_Fr<)uP8zpa4Wb%|{$Y%+*&=XdZiQ%)KbnSb&IUa7S>qo6Y&~?wr ze2+zSUGynkVJ3|MFl!N`V`kBS(0K zVf0ny8apIW(mgn;O2RRBF4sQ45v4lLcfIXenQERY+t$i)I@Nh;KU>eIk=@E%^~hF3 zWOB;UjUOhZ*G#v}DuW}+STv;P=-*c?B=zd~62$;pWNB$hU38?>o;V9-&Nxc}d;b7q zhe^*{Ds4J!u4_E}*G&E2tBb_BJ4&=wW;%1q9Z5j7(n(c}km}6!s$N$@{c7Jm4Dzd6 znx*Z{S({(jU)=UMp{Z7l&rPJilB_xHn(7y*x#7_Q+-y0&-4&0 zt4{OQ;twP9UU#6}i#3AP7ToL(_++hG5owWgy;3ufv%arCJHc2w+6>oBgkp4k(t$^U zPYbTdP~dc)A~{}nkRoYxJ#whx>J8_q=ms4TmQiIKs9J5&axNFvPtS#F_`5cVYj(F% zHeN?)Q+@)%#xsTl4dvbZ)eF?H}gL`wy}oQpvfhqnLwnYVN=-< zjkM=WqETgODHATH!lr2$8G9byZu_s3!@N&Zs_9NzXW2SA{GwH;N)&0n09XoXMs2qQ zi>m7(h^9H9<6&2QJX_gPrj zq7Dj6q%N${*x8`BG>S@AN}aHj8G|8+r=;oUr{PisOLFoNs=9&1RShD!EV-t( zAero*!Q1EBarJl#b*OQZMxme^dHNr0JnPBoQjSG3d2cZzW4zMT8JyV{4;RcOHiJ}@ z=I6y}ZCN!{RLQyBAPr1GQKC#UG*F`kn@G1Qs&>`~IaGKCV!(Pb6pWa5oQWEdvszOr z6%j`0!;aN-6}6USixpMdaxHBd26Bblqj*)DsWfc|we&}tmrn~i9j6S$%B=tqt%Fs( zRZ0ZtGPJK?^8!(T-9oicl}}$kJ1fD|YfUWGVpS%aYcwhg&OrMeBCg>ODk;+L@*CIhU6hOYWW%)31@OHSwz|>GPY&v=n8;?8N!R0M~h)s5e1Sbx_e$viTNJ2 zM6b~4`wf%lsM8ojYa}E96lDpJS-Txhxfoq2CB$S|v#+->5W-^H=yRcV*`REb7}03o zG^Es9(VeU*82TUF7;V{rs18S{A)xa&sOxvYhg&Mk}D*pI09h8!0PA7;Zr= z)UEG%cNO2y5}Hdpc~{JeEwpfSqR2|B-U8Z0j$7GspA_j%}1szF|NM6KxDYVUDmS){cNB0L|?6maY$P zIwM%DG(nT;;k3lWCps|L7a3r-S596}jiz%O3o+E|0+p5#T*%O};WHw@fT73G18U5$ z#B6mr1z=3Y7>cK2t|!`CbT*GS$!|mUy#D~y9{&I*^8WzA`Yt9e`N4>d^o}@L6>VMW ziS1m6ZLMWWuq4XFfbK@F_4C|tbX9lCYf;WntAwnSVy4pqLov4wpS^E465f6$v)X zw|#t^FBe?dWtKUWIl@y9JQtfgg3O~+iss6(%qYi2%Q9SRs(>NHIjk*lugPAeoX9lB zA6rKgyu~-z-jyDnG6s*)?O^W(A@__D0%KI z<0L^$44fTSJ1Xkxm~91dl_MB3Ne$cOrDceQ+A9|pY^VY`wiU8?;zg^4 zSqT+Vvqp$HwrwG_t_Bdy!mL+3=(Ox2uqs`rNv;H!Vj1cY=E!H=sDNfqHcwvkcs#d< zu|*=2K)$Yq3{j5B_D`|n{FCQ;H4^C@%#Eu z4!TrIu|ak%K!QCW+|6r7=g4X1u_pkdO)|)EjSZ!yZ94|Y6xgpMrpE^;E2^)Dj$4{X z>Mv```5(dd)ESUOn*$6Ce9$bqEN7>3qimx!AyZ>9^k<>LSHk`)PRq_lk=3n}pt6NI z)0S)zAm14rlPNP6<8f;wT6Rxd>EmiC;;W!U;hcP9hG+$tm>W7QHy zk)+xO6}`i<9bKW|UUzTUKTY$06MWy&tBlG*1XTrbsM1wQE{lv|24hEJjk84KWF9yk zLqHkQdR!?`(K6mK2&UaKU|gF4|?ZQmYsMCsMK~uFA9c^<9wXc5z_y|Z zO2}InHkmQAqAnT;b+HEC(JbKu%6HgByDzoDyg=qCAE>UKG^RKd4wJ8+sO#tCe7{Q& zp=2UyHk{1L5~~TeIIzY+(Jt)H^& zjH>qDx1a4^kD2q=&V3zcHS`g*b3C?4DVXJ^T03SZL1QZlp11V=AG>z>pD*}dMZx$! zsLG4a=xeqS`^coo92= z6nU&x%Ld(J8JV`wCF$m3Oy%XxL#QyJ9VW|5%~`9FS-W$ivppK^*P*8`F&>F?UpiDA z;W;rXp0ViidA~PTCo7nao2QS1y#xnB&=;K%o zMP3es*<__W9@sEDIpBqq$7O>dDx+;|(x;8~q_mpV19U$JbvgrHWzbFqT*3Q-77mBe%zCz`@u*NH*@(5^yV&nAjm-Ek#ybV>hDCG(g9iY*w$yiCO$w9Jg3_{pG&mnubBFr{$1I}l#fWQ_jj?t zud(BPc>G`1RjD=CtLo+B`0lXUdPx*Xw?v5sSBjLIGmbW3pcJ+;z-)l#D;S)@kf`hW zXUoQm4Cr>RI_R|5D(KpSIbUKIo>`E%6NM)8dZ8f9rh^SU-NXUTip4>3Ln#4e8HYFn zBWR3F)qv)7DY`C-!4#&YDz*|`1!0^fUb7k+Pt>o)<{p2b2h${k#X`c7X^oUiwK@!v zWfc}k$SXlcW$in7_})K21q>Y;OpdSxHN!0FOIeBrW|ZW>`ZuukdHyZO=m<2hKG4P~ zw$HgNkoVmje2%?3S85nguS8iw4B3^bRol+IIhQX%D3={{mD?!B)Eak9s1|9@IntAk za;Ay1Luy6-iBw6-3=0udO2cyk3S?8K7VSyn5z_{B8=??UXds}DG>lYas)xaHWkDG- z?TyQc(57uQ$!3%8o##)_L}&+zBxgkvtW?QO-$nsSs8pI@$1q?tb}j=sm0?pvi2y32 zd9?;J>o!M|bmPCP^DotNiaMtg>T&TcAfZ&1TS;hPhJrQ=;|5h1IhHD0qt?WT0#SP& zo^CpQYoR&@-e`)=z?Bv#NYu7EGh#ca>YcqO%ky=8HSK)g%U(CWqfirRnXbjT;7-j_ zVGKf+tv;uvJnM_5S4d8VBWGleRZNPqIS7Vivsog+!BT`dC*2WV-lNUn!7J>(m!HFM zdK}uf+&@p?e1+kAT$dHamuRhm&@Kv5^&*V2gE)$tX||h~%(X-uiSBeX95A`&jj>LL z)8XQ|Jt(TOttWQW#idz+)fpnDJw*#ztD=L{kt?%J1Djj2`n1==i|K)~v05(&!ny`F zYrLG#F4D488&aCiu7j=>E3EcM4U;t|+pU$jy3MRKaCX=jF!9Z%heT+NdUSX9i=E<^(s77|J87j;d zdnLKB(X@=JTXJZ0LdT*nbj?^&mxreCj*HjiNwD+N5~2V|dDbH8usadJF9 zfWvkZN+)UwP*U4vYUiLx%eTAWnMui|)eAeGjIk~AG=xx-}qcmk- zXvTcB4P&@>ifz0W=#=0k(;ahPOaTgMk}6be-D4_=ayi1&8p0I=s;v0INh^4k%Jlbh z_1;Z?iP6sS*pz2EY4tuIEIU#Z3X5Eo6TLS{+Ek5P!#g1c?2Chj&G3o(JTUV3EP=~2LUaoG+tg63^nqQ@8F!g zBz^O`A3SqdOb7-|$3(_$Y`9&>xXb81uO&MznH>KBiRvxY1)FwL9)tAWHBXn_N#Mkoemrxrd%8(+w6PPRpcyN%Wo% z$v-Rf3Z(}4LqT-Wip4a>#PitAvL!?XG*L!SS+yd;OXaFlY84H1FLl??M~5-bb@AJ0 z%T8(;vb5dLe?LJwWr1SijtAm%3eT}Qi!&8=%)#ZUAVQXnC%|(MhHmxAe5oMUh z88Qh%Ma3CR?I4X12Te;#LgAz!AjQC;>M11kHU(V;4HVXGk|iW@52CUZR4`0&TLv6Q9f`_T(4EG5!U`U-fl-;XGh(X-MmLm2OORpZNm<6h zbb>TkdhlN%B$;3fDMC!WM5$%;8qbnSR%O^ASJUZ%yu_+Qn8y@Op2aH7LAhJ%ZhCyP zWlF7;OBH%c%$quZT(pKHV39);Hf&@Z*cDUrwCLMlMgoh0)s@<)UThsUOW}3h9p_oJ z@!4SQDOQUKVmsRHQJ*rKMhwT5Csl}8xRYjLNaeH+jp*E+UweF?(tT^kUy?g{zdb&$ z=Q$4EYSX0IRIGqkKcZWk=xDdb7Iiu3m=4i4+e!i*v}LZOeY~NQ#I4IMfo@0=iO(=* z@ubH2sgTT)y24cHdbxQXcTJjh%t4TLv6;}AsBsSHj)om1oT|ihs>7QSvs+=Z7H_;Z zNzuR-Y!;xrMlo90((td*Ja_qjvO<|1#k`qHCB^yGOVCP(RgD*F30>21^zpr%>(4z= zu37@*(Jhgu3))gwJw)M^s4A9Ry7P2RQby<{tD|h0w?2tmp1NmY=Upnz87fRA3#uGq zgRP{!i_qoqP9H?xd-J_<^lqMdE-s6Pu6A-O&UuvUu2lwAwnUJwDiqysgSJSD#Wpg{ zP3)`B)^bM5sGDZm!OU00g8^}rg@$F3+g8jN!e=()Qee1LV=yrb1HG)6^w*tSTbP6G zgcOt>-_YjgIWN-m$BE+Tu)zibB+Zxrge(ZbiOuXHW-}XhJ>34c+r!~rSEW}bl4&qD zE>4P4UWMPwz;JZy7EY65I(2;<+-E0Am9}#LzzHzMHl($uywk$J2gqH7=Ivq@ErK#J zaq7BUT5A;{ab-Jt%8w#mYq3sww)z2d;wU9%1{pRL%S|UG3m1ArV>L+u+if8$TGnYz z+%zXgGLm6)S~GUp(b`r)M3rRce=75`99>I?kiuaYP_CyJ8_qH<)oiq?X4_;s)@53v z%Q@O&8VhMETiR1COBzK18fQyo^2m;jHN+T5L4Nl^W%EtX{cl zY&yiPL8}oXEat5S=2YhwEhOg=Z9MNs&^)f>x~0fY++6#>k zz;Iq^LZX2N+XXfj4q50+Z$p;a06kol9KGw#hlM(>R^fU=D5_0sp-1}W-RE9SoiQwp zUPI=lklgli^?r{R*J3Rh)og`J7(Nr4cEA_}xEcGlwN-d3syJ@8} zD<(2QiSc5}??~o++D%t=AjVmbsb0M0Vj-4t&=6IDVZN9WOcRBSsHIl+KSzhgyza?)!I*-|_d^{LNKhcAv6Zes#gx z8yaPrZh>uK3IenA4(=Lteh-JK<#^Fwx>;_1bDOl}+4M%niO2F>cuW(OQy7NX3#NAg zy2y)6X^Fw1i4esMDi~~ zLos68*=7tA1j7XMK+`#kN~FwU#8uW%x#UuquusEDELdNO@Y72s)x(YmX~+kG%SRcZB&~m~%z8@D4jg)2tSgUA!kI zix)uN)t1Fq$Aju^Ur_VBD?Mh}%f}oEO~y+-i@6hoTA(E?`E7oW2WzgVadJMrrR4gE zu^nZ&PzYd4jjgLLcaElDl|=H*jgZ6{M4@Iwc^eem=2=aOS6GI2BTP6Abgx3P$ut>b z7nmjk>%V8k`4`Og0X7vEA|X&FMkirDG1Fv}F)G7aWQx?B(+yT`W*8(0&c#geo+#8Y zgt0nf)lSW2hopJEzo?%T^`EZaTl0U4{{S=Yer|nd%<%q)HFUDoVlIUMCr+Ac=p7v1 zDwjbtow^&v4tgxAA$sc}fziM!w@$IWWXV(CexK(*SH6Si zzdSfSuaQ0*>N%FJctVh*OeuyMt)HYpBZvkQ47k~uGKBP$pFK8RjPWK80=^lrNz#e7 zFvDEl%TZ*QXBRQoU;}b`t2s24uTy5r^=G~2{P*ScaopVqDrgz2vcUP+WdaFcurX|7 zf(%A@Wa+Hvip|&Ayj*M(k!uCh9;}dI5y~Eq{>f+vA=Jo|nhCV5hM^k~K zxO7yI7#!x)#!g%SSTY1~i4FoB&$?k64KPfvvY5cdq{-}k{7+}&X7zkF?)fd|J+ZU( zAcWm6DoRx*V3fu}s?6;(8I0K*qO(bssb4ykX2~Szgo3ROh(V!D%q$h?S0Jk=DutqN zj_NpCH=50NYWY*Q?Sfo3q+=d+ZmqhblV$9de1!@I`h=kB9By(>>5+F@jmb8OX{Mby z@tawVweOkgR8yJ0sX~A+7gs2kl#mMfb(1c*?Ks_T?n$8qiOzfz2^`MveOJyFvjb5%}Pd$tKhyG)F(q}XGBS0Wsc;_BqAm`Q>}WGI`naQU zw!$dF2_m!RzA=D2z{Ot@(kl4%kgr`Sc7$}O2jm|3w_p@crU>T&u9z2ft{H}Nl> z_m_E|HtIc&UKhvcBpDi_wFF#6q*-7@(X1(*=;!8n>It;i9al+3amCjC5sJM_w5CE- zIb@9%B#VN{Y0!q4rAp5j2ZDk;=8f%NH}CuJnceXZ*Zi$z;?*}@UB^ViS6R?mG{ocu z2Ad2W4Fod0t;wzCrdVyXHrUH9fYUlhKNn4~XiYU5j9^C^CK(q7#=5;klL?+fNN8n- z+bnp#x=`~6EsCdBUYHIBsy(+ew_Sz`?Hm)Bo83zFT|D6#JYwo?vo??k!N}-cD5UFy zibqA(8x1uvb%-a}WJfdxbxsBq6|AB{!vJ9dF>^%A8*42zgCv!RaK42-JvAA$W_T{1 zWob2ETg`7P8eMV0mSvRLm)h8+V=~+0$=B*gPe}}$b#mzDdU@3fc@V1=@OCXTnNY_N zg>;qURGa4Uc@0$*2muz#r1cw7QWWrN`m1$8PQqydh(r;I&@5C|o-4{AStiuk5k@++YoyrCE~0D6wH7%1?n1X+{M3Bb zBto(p~^}^tAa%a*%d4{#+v|v+i_PqlE0X*Rw|7)9uj0V$Iv~z-#_^s z`Bh#t##ShrRa!L6HoA2}Az3Lq%z^As*JL$Anyk3*dpUZK57+vKZ$824$#Wfa$RNr%<={|l znUNc;QHM<+HqF<_^6Vl5ab>82B(za0foY~gE?T9@Z4j%YO3`+jEzM?vI^gu(e7yHH zcC-r}OKyl`md3>~XcNj)jGIozTt-kd%xluEC~9PisD+nPtIFeD-FEW%rwx=0uq@SE zRxI#F3+Ad7iLi0)e!r3Wo%UZR@COIK@~^`EN(!k`Dy_4Wq*gVhbw%8i>}?@Rs?CQB zk)<$GCE2rVP{%ef6Crb^a|@jtC@^dRRU%`pn-~RI+3fUXNL1?UE_7&6FzN+iD2Uiv z&P~&HCkqU1j5NS`)h&dNF^7vymm*sXnQdabL`w)UJlSVc5au6u{U?XwT>X9r;rd?r z-Nnc)xPA_bS0Mp{34{oA1%WeYD=^s1v&1W!b!RLwA{oAR(ruQ%n(gO1?IOj}ZLME) zy)l9cXw~XB(j05@wM^)}JDySpa;cqxq|h-NZo1DGMyR+I$kSF_>*p>EI~Pnsah<2A zyb9W{QjGJ}RY6vHNQ!JX1y%&uZgYzBsM(cN=zO*Y&C+_xHa%VWIbSody;2!jO4Fzt zV}Wha&t1dNN|_+ks>$cC>C7f&E$Mv|arr!_pRM~c3a00y+;ySpj^OdRu%=wmUM*qi za|f1@A;M&t5}<7Qg|QVUZ)s2+^GT*wt>m3(zMzR6XUgQ?1Q{e1pw#ne37 zn=(V}YYMsn6?DgH{l{+)CmX9Ox~*72$k-y!HbvAJ;x^QtPOuFV5(5z00~v+U@77#(@@U1xC)}q zO_)rD#>y9*@0`P_A+~{P4qk<}WV~eI6QRebPksLY4JbVe9655eo<)zI9F>8*M^?u(s$9!*A zoUZPM4jL9h3Jkpj)Qw5qNXloyTsbo0kaW3@9SRP+zyMA-Y|^0(otUJe(df)Lf&rjA ztk?x>2z#PJBuxukoS!z|fzcMlv%N%w?h(P(wuj~SSH>01*`8q(r>PEw7M;KvZMQ~_L z>4W<&bO32U*}57Eq{)MXLu?rAu?8x13mZIgByF^@o*A=ifJPlLw~R=A46Ce_QbxGE zdt0xXar8xihSRHrPGljlg1*o*4C^LgFm!PUIM5ih5@gyl)Hls9sCzj6Nb@~8GQCwJ zB9d~kgpHzBrm{03NF%VaWSAfyk8%?UIL*&_XU} z-%i%Vs`PyjtCdQk6EZ0?L6pIod9_WpsOF+O90`uI^^i9gEv|7;q(-EJJN>K+|`Q7=Mgo2oU^7v zOx-}H!om_@qqoy59v;ASO1^5JEm7!GUEIzna`>DmEincE`J zsOqD2N+xZjt~{l6I4L7+Vc{Sg!D?k2OyZ+@MP=rYxX9b%NUMgGvGCbsL==>)%P@yj zRY8yuVmwW@AlBMDp`v&FQS(1DuoO>!^*rC4e9uZMWY|uE4j>KphU&W#`^^O|2G`GB98%KSDn`uSqsHsBm}H zG->+d_BV&=eaI{D7p>#`any?vqol^bbc{Au)wJ22kSfSnU{_rD$Os#M?svjBLV{F?VA)2+>0fvUMri=$tr>TQqhGH(@IAeR5(Y(=s~IrM6cp zpjtG5i!~}k8fgUj6G}?%dAxFolt&g?R02Z8s5c2Z8In>-M%w98p}+^WRLzW}Mi+Zw zBL;1z0j08MbrKr+l-iBewg$Q1C|ROOK~zQQcv{P(QGy>tvdgL(9RZGswI~b-o7cGWG zw$KfCRr>?g^8Rb#^{Bkv$n_(XR29fHk-*CsDYNa$^&6zY8W#Y;$wcF0hRB zYR1a)Jy=xfjh@-3^jBvG&ODuq3i@wX514uWg1rb~nM^bm)}7}}ISx*!Ph}XJFv}&; zQI;`RY&c$0n&2R~9!BC!*jt#cN~Gws=u2wtIxvdQgCN zLpGFI;F3LIJ4!%Jm1^5fR6Q9sDAjHvOg6>Xz>Bqj@tN6+>=%r zN$mYUrRRMC>G}TvH+Ww7ITAf7HXDV88F}Km8lpyqXiE|TIgOH4ZImZm?(CI(eJDg4 zjiqJ4)Y`+QHuhe7gSK^;VC>ccca*bHx~jUe#?u4?6=u5P8C7f*=5rGz9aXn81{$HJ zi`s-MD4nogihBZL1+v`br8V(#+F2?*z@6O6Oh#-a+g8)f-%2|VMZ?l%H-dZ*o!MPQ zx9NhZth(0Z=se({6E*U?{W5jYJh}|*o~_9yfmS7VSI5=$Pp9T_UWYHvzd7sExIv9z zQxkO^O;pj%&6ada2bG1X90u!^QHdKmlX8)_%Rt)IE@#)tJPyGTvl)@-o|gxj`Mt0v zV+EEwO(_6yq?{QXECN-4$45*cinl}d-P_H%DfIsU=pPOF>GHot#rb}Yw!hQoX7X0d zO^Aq6s|0%l$yRG)X6OZEHn#(HuW6^TU{NmPt>tq?Vg@ZD5%B%rw~Z_i$9q$h;ISy7ysvsWe``Bc5hOOdo3lCRod5nmP(aTv*a> zEP|SkU5h|9&9&B%<#6;&%~MQJ6)I3JG^Pku=vE|vraETHN@s1AedtdfZi2Uyq-8eQ zJx!}X%-|M`vaX!RV@-%BUgf7kPi~Eqtc*vqrNX#e&tcUj2~;#tzb2bB0>-FVnNZZ7 z6vJfGHcg7+B^S(6HOlfij9^w>0AmT1!wYQe+D*ERM zm=q-QBntp^ETKtPMM=~VGkue~664pV&0o6V=&yOJanH9to?vRZkS9k0wGK37(#3H$ zHbrPnG6p!OKoYyHC{_AMwISz@rV}g96Lmv71Y4ma%hHw83-1-6w)RJ}dtamH_A|KUg&{+L#(;%d!$hoydo*w;8j*#ALroZr zFlewI3@+6K2ADcrWq8p@10V$Gl1v-exCEA%dOvRn*Q1f-=#vR3Dzr%3EZs;OF=K5m zn+}4DNE`u7Dl?rZ!mVmCEUy7vyG}~!IcbM|=C47pR2B{01PhA8ss$f;B+p}Rk8SpO zyqk{pNj@XT=p{MQl}frQHB>fgzIqKSra?)ay7b?-(l@;EePD6{S@mq+_soo67E33{Z%_%|lO{U8Z zai-h4j(FArPe9GX z)^s2xrs>xI0Ioi-i^%#MUzOh@^b0!I)u`a|q^yCjY%!vwCq$E}kjT~+Wx_)jmFe7< z4aDK0nw6<~A*eZM2R0Wi3lv(GSRx}4je6{b+Brn40e|$M42sA?wUZN ztvV`kV_jO>q-da+3*)@oD#HypUR0P};xaa;VeDNyL>sic@oDroufyctcYi4yQZ+2O z%Vu%1pgTac@aE3aYc`Tm9JbC8T97hXClbqqj%4T@2M`*~b+a+pb44xzKsu;dq|^+W z=@F%CjMUgOG15n)n(O9zfi%nv9D6A@qIx`>RH?&7pul)Gt>1bayr(BaoU}hoX}Rmy z_H$kedHT9&pe_I#aNY<_=D=%=a^w-P=2$q}2V-rbx)}REjZQe*cRhVuX%MP)MdCXh*@MXYZ*tqc=H325PX?Q+ng zl_1zG#tODAU@fGtB@!o0x@B>*6K=YZ;#TXbiyci!)yLX_UdrVq7?Wyhd(@%6*JS+P z@6{pNI&qlL2?T*`;80v4nLRA5j~J;?2x)QV|KjEF7Xq9TAq z5r|heBND@7IcDeUq>GGc$^0f;=T>d)}m+_ogyNXUZATv&7)Upc`}na2-B{d&@8T!HlT_yrEnO= zS+Z{1%~jE7UgL2NOx+Rm$Gzjzf#MzqvCCGvl7xVQR6j@kU(Was&wDjowo(}5(=)Rj=wX^e1B0U0d*HU zp22vzNNUrPycI!GPI3kf>R4T3(YVs&xvsO3F*8xoHPajxU0XVh4A**njskTM)96!8$N8>sJwI1fFF>fNR%WTt}Ja|v?P)d`AVSRFOpvRAM5 zc--5}ygvRjqF@*!J46EQvW*z*M~=u4D?D;LDlBP~8!WNpzRp`N_689IgyOtvnYIKF zI?0brhTll`{=OeB=I!SqG#QNJ3RV)EC1uTt%=yr;8cYX0q#$!Giljp}(aGMq=OlPK zfb1=_#3`A9O>&y{tIMgUOkf1;Jdww0;~FdkG$;s+0L;3<3ww8M4JHra>df8Ems`D*>2fRUaJ{4ER2`==uIP=XWy8Ytt$|d#<8E zg^buuSc*1SP69LN5w2rv`@(~lq&rH01QZj2>K=zDnsIfh&R43E>G|ztny9RuakiARMTE~_Xoqhv zGsR+TbtRQKM#as}iCT=bndMitc zohs1iKBilmg8N`A6=sCEELvehs9+U9SKGomW(<{aMK))-Qss?*JyfCw%4H&D+{+|&W}t-U zfHKRL$GUb@PF75aCoJ*RsMjERkEiGP@0aOveF-@dqr{dB{*;dWIr2R(#J_8UnY{4m zfF;<*6QMc;w0e5a(p#Uxx%(^;(o`F^*ba!yw1qF(YN`Xy>@uX=QDP9i0F{hO@(5JT z)DuF6CL3q5T%N6;M=dnTrcU(Iwy2X*{HsxQU`hq+hGj}kv64=GJ>kIeb)iTVopqc> zGgnXxT5fEhtigj3x{`QAGK6$pzz|e+R%T&kNrTXI?XKEYJoTHERiwzy6Dg6T=mg5| zJ+7#~s()$mc6VRPua5fu8zPV`4#Ae}P3MLt&(>Bhl=f zo!;-_`(HAB7l*)Ghz+*HG+QK91rnIBpw(ykIqrF$SXblUp7wkG-d{A}>)2twjG84G z!+E>jj(BgGpS-m=5&VO5!d;&dHK!rz3eL)H_(5rI^=3_8$l8Kze&AkN^F4JO? zQwL^P2~Sse@^G^UDYSth+bgotMjl-#nF=_4SUA|U(?^yu+F-(B%2(YCM~k_kfDN; zXaR+YLC}@6FR%#U)@>CeP1@BCh#l0*NK9v=L@9Xia!IbGdev}hW9YD{e z8ii8mQBh+R*=B_pq~4^)bos4Lr*mt5rNc4LYZ6@uir1gtU*8RA^j-Y)9)Cd+osYNY z^8Pn@m@Kse8tw}(WFTykH{H*6>asdBtdQj=CBnioWAq}3$4u42{M8%ikX25T+vex| zZtqf#^4cwr4_e;epI^pD$!5A#{ZXmnv_ndn=-SrY)U?^m^PyE$hBcr~6cMFLxY!C! zx&ppRfx1q`TPLh~Rzp`NVO9R#QKv@T7QlFpH7G$*K^KCOGgoFGA#1h|bjgTx1*SRW zrFH2ka#dc0js(gyz*j32=rTssHCIP63L2daa9ESxOxbBTx`$c840A5wvT$oDy+!1C z5NyRK>t3gy=YC&h1ggQpN)fh-jk2mlQ0l>9CBw%|Hmx>Tu9}fkM`#U;g@%J`764e7 zFeb~Z33ZTOo73m#{Qipc&}M5I!#J^-zyO%(mrBALN%6UJ+#giN~x6kUO% zpsf-og@b0Y)}?iV$|suv4JPI?Ant!j{;%bIQ?WlNzDwyUeEW7?gOZEQ(t zwmurhBWn=}u(g9WvhNP}v!9^h>GKR%qOLacVu?1vjOo_iRXlxZ-U-I4C}x=XQ$w{n ztGvp%RuPv)JqoXx7>uhanyfao02MZ8Q%LR5`z&ySvbuOI!)i!%n`-66VQpojnVL4p znb2ab6SGiEj!EFmDu(JiG)k{P0bOjtu~ZK=FjR4Wi$ zmSHlzD_eu8Is&!JRi8YIT$EkUtaT@pz%sd2Y2HFsae|U*vk4bY+LkkA*l3ev1hFPI z&myX!$_Ticu^mY~c-9p_t1DdF#&ThYnbIk+%MmE!ZI@h|!JK(+w0d_OI&`=M83i07 z)2j5wbt{*rLUGI~f-LGr%VD0V3&>iX;kOTl^`1wvdii~MxpyIX>NX!j>R?TXK{A!3 zBvpB}VMX{B1L0Lx5>>ntLIzoCG z>}@LmP*)RBdO{d1?Wx?_0y#p%5d;(&suq<*TJuxay)Q4)Q@4ck-{)Dd`XzylK^1jS zHH-rQ0uxprEuNu%vrd1UIa zZ3PVJd(jiTXlF<*vW2{u4Zl|}GtbaYa@9!aYXE+86FI>-7`hWO22Kx_3S?9Tgf`ed z*Z}KjoaWYqP#pyX%*G-jAQWMhFgiP1VzHYa4Jp|wriKiWv!c2Lm4QYOQj#KMb|^Cy zLt85^fXaaBoIpEX&R%1Ss=OB4ZGm=O0gl-dV#2f;LQ>N)4u)ZX3{03zo5aXirox&> zb+N$%BkIGTJoeBIsM#l;y}3e@UM^bcp&-IKYBsdp7EOvYOyyxDc}%MvtEn>Jrq#B> zY?=eQ?&jm9ny%@GDna6NTNlrI9QFJ;z^N^JIKM^o zeq8u{9wVQln2f}Zx^1rPeF;>}4vwn|{#s^zN!sg-dM3A@Q?l0dDdZ+weDsA`d8}hd zxk^ONx1CbXYDvOM!ReW&n93Ql{Pbqw?&$pxCFK5Re<{?p?4XNRutrC1I-WY?W@UJw zr0Rk59*foXO9JOL7^bXc&|Ah++6%WuVV(Z~Uo8)t-nM4x7ppoxI?Om`$Wut}p!0LN zrA8!~T(d^+`k}yc^)gfly(h23!+AZ}Us*&9CgrN!-=Cl4rl?5907-DHvyE0eOSDyj zs5>_n6RuNiEQxL>>fc+*`LE9PDP>eb4w#HS#_QnlIraI6GlybLjM)ZQDUBA|WlX`q zCqpv;s>wV;qc#}ZT-l;73aYVYNSRNrJ9 zuHyF2DceXWOUW>oH2GSH=duF04X7h&E)$W@P13~$ZlRkjppJ5QHA7-Ox;ejj)fM{V z&Uu|2vktScaz1^8+9!3FpC<|pRxGeOA&TO~amKF(+K16ucqD#eC%WiP76)yIgjjBF zz&_>e`JNl%`U9lkdOs0XP$uAVRx|=u;$5Y6dq^50ien}(;?+JHZsU)%`~=vXCpSLeQf^!(2R^1VV(`r5IuNLf*w$oIOpOgaAkAVcs25dEzs%|9`ecV>Nh--yCEMD$l*p18%FZn+tePP0 zGHkYD?Gi?s2Stl$BI?ZOW>E%Qqf*)o%Y+OzI^xjdK7@3k2PXt@Hb z%z+?MwAE)oc4<0lCDQd*onb73dFAHiqKyEZOGPp;=tG^Tm<7gAU}XWLG9+^Tsl#XZ z{ThEy&hxrV2LUu)*rb=r3Q3-Bkvo}jUSnjOo!pi7ZAj^Xl*BRD2H314Dk;oQMFqx- zI#CEYa!InGNkvtfQfvke#VZ9G&O8}#HbBm}*~zV)qL(K^y$Q5BT=k~Fx@D9SvcWW< z$jzf5#X|dRGfg0LJfyBG6fbVQAGBUO{xEuL!gb6li@bY@KP=9qjGH>>jv`l^v=a*( zGZ93lX{RIzBS@8DOs9uw9UEBb(O6mVp<>Mxi>j3Ff!r&Y6-j9ZLxmp!PRL5L3UW&# z{T=63Eng~-%|>Pvw5Y94E?T9OZ6Za9A0%~pj;5(zm6B;N4$Mrj*)y2hYRX`I2%s)8no4F=xZukiJ)H}0aa9)q z&}`CT;SILgQH)PbXx7R8-S@n2i2i@ttXAH|!)F~zWE7ZTJRZdo7|n~G1%11&Ud}hG zkXs}HNZVz|YiOKvuw}Mw6zpthh)w%W$aDO*ssz~E2dZUc0qpA#gq3up+0R=&hzhT3S0!Ycw)x#`(3@M_q@^mDL@_Sf3{$G@=rviSc1tD@tp6;vZfn@APieuG@{y@mx}~j-;D5%D+s^hio62t{OEA#CyMY2Z;Hey1ksxlXqRv;dvVB!jq4< zWn$wps@jK|up%KIo5VG@Ju3R)Ug3++qOvQ`LNe~k^QC;vqJ#HMi^X0Fu31UdtTSXZ zn}t=)TTEOv7fjC>mW-Mt)wauPNz-t2lJcEYZ-9i#;sG@}+c3(ZLjy5gM*mXf zOKp&|>5P07Y;lMRM0V{dUAZnt=!yM2_PmeGp99$Ek(H{89AyhGz%ns#8j!xgB|{(% zg>q-JE|rsJ3i}^Q`5!$X3OH{GZ1EX7DnMTqcD9ikAWY0IQ0Sa-mqsZGGQ1A)kys&S zY{eB*hnV3&!UP&;Y!Y(l)5lotR#lq%g-}cgt@c;bc)nB1Ul#KH8mK(R(E(N{8fAqw zj$Zq_lh3$&VU#MvCdTR2ta()ERdEq7H96+Y<(n`@%uEM!-^Ii5^y!);=|-{G8L>m$ zMd>WKaWDW~?U=X?c>_kAN?i$USy(yeC;gxR4p}c2f9+4HHpn})6)G8PV>^_`Mb#UCPM5c)y`aU zgLW(I$4;2QYepxulx{-brdEA1;`n+ad7VnqbKH8TXE&5_SjMR|%NNGMOE-`dkyvXG zEeNX$W)#GuFm?3w?j(89dR3<&$YP^Zl^qppa+4TjSY}OhRM;z4l_M+(7}Lf4768wb zB$!JbCIAdRCL2=9U^X2w2AK@03jq=qHWJT}Vu-CPwqSx0Bri5V1#w_)kT%9v2F;Mh z8dlyTJ9`KS983eT3ZFC>?+t)e4>^K>4KmLLPYsoMh(XK-pyb*kS27Kiht}%Ik)g8& zUttzX{rq}4@v5oHyQ$w9gAil%Ajv4x#465E$x*ZKXT zn-02cxDD==DSHi*nF3YjN%Zs9DYqxteV;qBqaj=0dq%nDV+$sL`5Rja}?0INi{x!H;&*cTElBxYn^Q1-mmJtXrF zoAoGpuQ@R4mdzv?#0=)^hL+oboo4S!FBX~z^-Vdm?>iqsSKzI5P1l*}Dd_Pd&vFOLbUWRrpA<&p%>`AE^bqYr+pMtlP^VYp}8M3pe!_jrNyMwouo0D zC1GI7;6MW>7rjYDrpF{0`Y&%Eo$z)E4!R{3I6~VR1x|WbPzfCz(?vDKjWt?n4I*|F z$}-D@%?P%VI2}`-inKP>6r{biUL8kYKPBgMPRZ>4&zs_&7p^uz>@1iLnTlFC+ujJp z`$cctKbZP|ifo?)eHYHrgvt+F$IIgAf;uRH7ELzVmsYjo9grYLVd7%4d<1QS6w_QT ziD(!jk@Cx@gdagMBtg+Qk*QUeQ4FBP*g(i(uo=X~&{18PV(3+91`*f;b;@G}&9)58 z8Fb7uf|$Wd*jck-jNV8i5Hy&AkPxhwMU;R@7$F@2l&)0F&{mt}Q%tOJfX6GFPa89W z1MF!A3Z0Dspi?meHrFtvawUP=0~s)iF)~4b*dHb6Y8=tVE22hXWYNW(RA3E>wl-}- zMC&xMh#OEdnk8@;8ktb{;hz=37Rt_7tq~DvE1x2VP z&=V_!)zwB2C8Fs@)Q*!NY3!&aVq7A)r1Tb=8LQ;d8QHX`6DvJ}9PW@!H&H3vwCp#S zBw#v1@jkcY`aU=6aAN`xB@$pP#&MI?Et!KENSmfY3bDiu1%T5QFXsLaEQO^{49;e(rXuI1=jt6&0D zUqe{%vbd-@06@AiUEVPSEMivE$kfU!Evoh)lyO{>-ZAAwq^CH&=Bi4NGpRD~a zGvhxu)AKI$8cGVre3bzKb1&gCKOv^eh7vR~Qa$V)Ptm*l#N0fc|_<*v_`SI%1QbI^qx8c^7MGn zGoS?Y+(xQJeH;;*3aL{*A3ExrPUXxPh`RI*KTGyFJY&Q4RmI+NUXT?9c_&7Yp+K(& z*$h!fLZw*rihwl=NsL`d$ZR^+(y7kIl0XK>Y}X|N(5tHD7==QvR3N~B&jC5>r;ra7I4>fk7o z6vZIThPp}!x-J4qHrW}mN!d2ftK#EDo2XpFYY;-B353E~ql+bGKp2^Hz=kDVF{g=J z8*0|aD(V`HEJ+*f?X}PuoUwHvI$U!2SwOpGVOm(?Vmc7*fensMF|b!P5i|vD0hl=K zV98|`0U1SUOI4FjBn+CGQ83z(>G}HkuI>cWA2p?6>|U=ghWI{!9&@YWu_l631B}l$ z(UxUx>1f=gx%rpLr5Z9KJDo`Gp6->&L#ScRM>Cr^69I&kkbNrRgqs6B${S9&uQEqgTQ2~^TIS z#Hb9)z|7++yR|$_EV)N(8HDtX4$olo`+2UJ_(!GZtc&Ts$Cu??UW#bt0aeyaE2hGt zOzCHmGE|-1m|G!L5O^qH5g^4Te6|B&rUpZ%+Dxg_Ix;GB%&&>hK)Qq&fX*07%3wtC zC}1#i3fXWroK)%4|SPc63d0mcXGauFB;VV8ue4q-YF; zNYX`Bvo3UWMquRzCOacZg|z6d&DJX-EKaJ%GOG@Y1EyFi&FG#C05Py;4&5>K9Pq}| zq&5RAk?>|%<7lSY%aas1z@e9Al$flf#4UoP!1_g@=6u!0+S+b0Ne(6gd;yujxfa>u zL_ygYHk3|-LX9X_VLDhr`Yc%Ml1ToE>T!8Lozk@3by%G++6+|?Wx}ksNlf<4WJEF1 z5n(S6I`Zun6o_CG;J<3~2UrCz5as+j%;K^*Pz^v*eLlFWP!?EV<iT4bqBXw8j?T9s`%l<;beL5Ez{ zNEZkPtm86KLTaFkg=Xl^!HY$K{2KS05nC#2P4bTD(uL1M;mHo^7ZbCf?0~XHH&B#XC+>11l7t}IuV@i z@WMfeMd01s<>ie`XVMlPO5n&V<`oh+ibRgAb5VOFXpzrnFuE}8Ag--(5Ns8hXBJ_o zCsCDi5y---G)7mX+n-j?NZIt0Bxn-pQ*KL{mqsZYVnBKuz>*YgOTe@!(Wtkq>g8)y zI;5^Jr;F6K`WxT#JPX0}(&ubuh}g}#PgBEMu}S&`xwts=1UMZCa5HrJRH#&Bnm*E- zWiwGAyG4~SvhIq^s*%Sh6*r3_nz9aHZ8hfY(3P}Q#(8UIRB9A)0zFG22r_s$`)Ewg zu3@C5g@PWJKRKI7QnDiHGz=r%^HQ_2Ge%0XvZ;qHCfbqJlqlz4J?4v>E4IUI=ElUx z(qtL1)%$NTFq;T%A|E+%rLcn-fDIxXT)O5qfeW2FD=S68xeZF`FbjYjNSUkdVnhXo zgG?4S$5Jk6GI>k1n*as@)0pKVu=bOID3~%Pco$&o&cP#l6k-;G2ExFNt1~w<2p!ZN z&Xp(#qaK9x*_D~)z|yf;*wt7f=bEXwjbx&RYd4=Z;u+$&@pV*{)-;fovRp)=r ztHDcmjCOs911O4i4hGJQoT<4hZnA0VTx#~cDM!UYI9zA#iyblqjDDra?SVV12;q{X zrHUZZgU52Dy49*itDS=e$?4+TmM)sQH`a)AyK`w$RU8-9Yij75&6(7FBFmp8*Ulit z^KK5lc=9-CE9CM9u^!FU+6wkI8I6%*m8?OV72(S4y0BCkDC0r4XElQiL^~|1vDxt7 zUj1jydFK~jjCdZf`lgy&0&Ha<$LgJ9QMXF~U-UWnpPud}Ep|fmPln~{J z-5J`piUl%CKq;F5jKdgd7_2OatXKB`06)Kmc=`VTcRc3OT?`{Y5+TmQaV)!RBc!K$ z3u2r)F0nEdhR4OgSV0;9$&qqPnny&dg=ZsQiFQzIVKbwQfzcuh1GTi&#~g71oSSUr zX+09!WpTu7yW~RdG+vW&rrR1cX(n43Fl}9T4ndcy{DAjWMynA)`*jIBBW4%N1B@;iLfld08vlK1|EI6g)`4(%;4KwGpmZCS+A%{ zXtZm|zoOO2k2=@UPRTTR1J`BuZ)eK+lgIUxBwGp(b464yQnl=1)8oCI@l7JGy800w zb4vvh!KYsqAbfdDQY>PPvn*Fxk&%fKQYX#My}ztrC`mOscVyV~I;? z$ct@Uj)MeT?GA=APjo>u%~EL6Z4kAU)<}V!;Kqc=&E!!VRSh?QTkw#-=9LQ)lpBkyv0}-UoHJLAdbUZA(<9D_ zq|RKDXlp^_JodMW5@@o*3<5^DqeioN#I{wM%2(S$nJpG>tb}bE^1|l_v8k0T2xX=_ zbFabC2Pv|8XJ;P;;`&IlDL`5q-kI~4ebLpM`C3{Vrwgx_pz?-CWNg|y)b6sF8t zWh_=v5cW4Rs2)hw0zl?Kq@=D6*8zm62AfALR(nc_SvDFCLbP4-vy^K3O_@AS+u~(; zR<(?dBD!oNu?~uuk)vMXJSJ7GFU>bd$U*(x4w8~{@qU`3Q$VzgOthRT&37=*5| zx3sHy?GvJM&!?9|88CAWh*fEAiup4q&q%;^SW*vBO)9^!Ll#Ya&MSI9klvN zOrj3L8Xy%~L;;o)H%!%ZLkylL#Eh%VXyUdK=p3dEqsg`@I~-LB!8>WUMVdC)fdMw# zf#%rQxl(;9N6(o>K*q zMb0K|l$l7zxrC^&c9~Fy#Vif1qFoilVIo0{Rd<+j+n^)JY+Xl%R5JxE+PGaTSZP;v znfYp7y{RhAtkRult;NoG{)aJCPC{|LbL%FO^AHSN$~x)WX%*PXvz+Y=%k-n_R}N*x ztl+H~k{u=>RR&iPh`ZT4_`Jh|u9zq+#8b8ysB+OlN@&n$GewL8ZPpuT=&)Qdq@$Y} zs!A+kYOF?8DPGdHJMj3@fl8vy?B?ywRNaB6@eB&7BF=Rpaxlb$5^f3t6#|?JXfdj=>1|A% zSRrxN18kRbRW_RDQJ~8VFlJe{8z}{W(9>bJahF&vir_0^h*@Emql+Y7x`SqH^1eFb z>#lH*Qlk?V-jmhM=ThrWmDs8!eB2K*SFlGLEC`l3F@a?4*&ub4$3tlmfwZ96nIX!} zy3UFh3g(6ZJ5W{DeKS!RWnq$Iwl&z)tfEpzBm+cATL9TIBSh_X_H}lcEj&ju4mwUl zVv^8n7Ofii)T^MvS(yNF+pyU?!!nr|OmbMiyZ>%O@7j)7LLah~QqIA+-rB24FY|Fs%+!$HMvYOn@*K8bdWrlf^ zlq*ei>ltgGPm8{}PnQ09!O%)8*MYh>QPm3Bby4%t*~M@tJ5x!>xGW_i>`mu%xw%oQ zD>PWD?ZBAzug=e(ZU)x2w=~ zK3Kmgs)7EgCL17C31FvbT5uC!s<{hK3%-d&C#3scN0)d$&u!BWDC6m^o1Yh13{9CU z;B}EG%{pFob0s@&2h;pNbM%MB@A=-F;a{iu+I#YiTN%1;iSV43##w`zEo>>{OA4lh z>+!FZ6J4V5!SX{?2v%q`k21S#Ma!sCZ4%O+8!j=K(Ne}*`eJN6F&KE3h#cEdBwf@7 zRFjNG8D*WFuFic>Kp5<>6UC4sNF7SyMP+yPDznAqW1*eb`K5e02B!y6oI z7zC0wTVObYR1G$}WUS_Tta450{;waL@bu_wl&xdn+FMbQcsMB?rRB);*kqM-3I&cX zw%hA3U(WLQzX9d?DxkvDT?^9W;qyrX=RZBtcXM)3vnb%q$WTxRE~dsh$7R%ls!f0t zMNm{cH46(|@bc4i>5p^ySW>zTny}KiZ30X3@d;ESgC3m5bkBQ zqV|^J^LTej7&wuLrby}seQCY09Z4sXsbF!Gj@dRHC1o1EQmVN^Z)2#OsKXEq_AwA* zBgal5_eFAI4AW&XU?VQdRG4X^8N5*-kPp);%?V=ditA8pgE=@m3)J&vpR}BAzV}rgWN*?ebdeCKF6Kq{5>h9fzJA_5fO=Mu~fOxE2dPfg-Z=8^s@?s zT5aW8#i>wktyU7}s%ToNW~wYo8F;8@&>)zN*4h@LXz!RysbM_+(y6S*G-=2%uBz?i zamrFUY*t0dGTf37q_NzrS4B;=nz3ks!W%P#YI=W1mY1KRLs;5S>`N~{tDfi3 zvRua1E|Fo`_jB`{Jx8q8GFdC4Q^s>HwoVQe&)IJsk+&p?O$iqQFE%F`nrP$*X1Zf& zSl&0K&i31e0dJ5rE)leu;G1GcHoYyBo>`E#yk0Uwh@@{n-XYU&C zJG9*IL0)@{N}q$UGiU{yhHkHQBx0=9IvO6XoE~&KlASDV&=JxSDso(qF zSC?`*;bBx+Y@H<4Hj&HKFHHA5pFZ%un~d|ME@KvZdUH2%N6AZ`Vh-t1a&*=e&E)mP5y#p&l-!LCYL-a!qyK9mN#Y6=VXfNregzc#+9=lg%Der5hp zg+3Pge*&MP3Xr=CiVB`uCR#L6?8MqTbsb#aTYFv~#9mLgA3v(KgVhyNX3EBj70Y8F zSi&k|>b}t1b79S*>#7M)We(SAgj)r0*pg;dMitUre5&CjrkNsGK)A~-y?MutrXnz% zA)9Za7S55Wg`!>np2_ZYmx%fODllEcv<@MuQVE?^AuW_!P(VxwMNC~ZbQH7<0T~)2 zVVA=JApm8R%-r^Lm+42>cz>23CG=vBO|vbQC=_PhK)YyhjLv$gf5X%1uAUP`Mwq)o zLI4$;L3N7cu-R1CEMRg`cC! z(+?_*!lz)&>CBPS0a#(>BMdotld&@(CQA8zjk1&$DB=Nzb+Fmc+W-?{p%&MSDw8#h zYX*i(7Y46z%$v}9;llI0WZPp0!eu();$x;XoMM*1rczp<6r2`Vd)Kk#a$NnMSHslE zC=AnUx=xl>uL@nXgyjX8+ibjmTET=w=FT>9frV;xSvujt&Qh&{5dB!MB4HUa^qawm z*s52{ydP$YU<15h0#;LO$_N*d=rY3sW|JxqE$p>bq&hk+rBp1}r@C{g(FmpM2k6~= zU$^!A?!(*hc)yN{;lSD(9R`EGCig;f6SET;L!>M#F;(=dara$`^M9S!h}xYOto5G}=U8oM zCR-U53(ul{vD3@Q@>`SVr0U_KHwJvDO9H?w7S-^2yM-!Y*eHbr9{$*hTh20 zN&$)wo|_|f%`*lYTQC6gKrvk`l&@IT3)nL&q*y*3v{+GMShQ3_wgC}_;tFKAK(N3- zi!llsx)W28i~?VB)@3N!n4p1ePe_wVK>2nk1?WM+qnAaQL(#aXD+D$zs)~ zxCmQ7i6EX5##qHcA1vC&Cw0X`76!y+FzdWqvQkOdbB%bz20pPo9q1}^!^`!`F@Wj#=_b&uFfM(zI)e|iOy1l zcqA6XrrRi&SG4Zy7dr zOtZ>O(*fp2nL4jqpP2J{!#B0==en?^;kfC5rj0R>!=0Q~LnyT_dU@HPV!@*^9QRCt zIh)Vvt8ywJIr>w>Xoro3&^jL8bqE4hO151xYKu?7(`9o109<*FI#zRZF zbWLT*b5Mr0Ms^r=Yi?OKom_d}QZ)LfvY3 zZ|Pn)s*g-dpPcKBA7`CM%}KV(D$2!THN{dfi&f}cB?nU)h0z2gG;+i=N=0=dxX)Qb zjMpv-;0aq~8FXp{2HePKm6JAOr7O(J$ik|?opOvvg8&Uk^V~T52a~Jgdvh;96fM$tw&A#k}51x7A93DyA@!wBFer%fj zCGnqU&2e?sMTK;(l>s1PM7wMT$vvA_(Msu()f+ZeLt2oN&nun$pIi6&pB;Gq`zth@ zG>o|u3joEY6jY^V08JR8VW(MG`nCDIOP8arbo1EWFEK4kCmm7AIG=qYH5WGUZj_K9 zptR?*)K(1Zq-Ss#(*gvXB2>diJ!GjaEwqvi8$orQmPo6w-LplXOG?DUnvFp5=Z%0(awh z`p;Bem@``xrF$W0ovo9N=BK3eN6LBnrh^==$ikJCt*IrEx1UZx$hij$@`eCkSrtZ8 zU39?0+{9{VtUF{t%BUy;a$wRxv5ZNOyYd8bqUq5z8CxlN*oJ!)6Dj1usxzCq>*MX1 z`p?k$pQs%kN8#tpeLn}q);B85+d5Mv;Y4Oxc`-uD>LhNFg-aCI2Dre1TY3#b%2s;D zI;~Q1T#TyH!)s|>V99FEk_fFJfZa${HC)dSrL4_?S>Q|q&DX0VmF8(Nnp3mW;w_b# z+oOPo12YW*^-|_zEF#%_5{%5MOgXdNSymM)x2Q~V<#(T|Ve8#8`RkIK*}OuyV6e-C zj2SwUY2&=B%9YYTX2F4JbL$^7?iI$ z^Q9i|KkX??a9a^&cH*Xh>d41q)AZ7$mjls#-QRb1_B5b7wVCLFVZG-{X?Xw$u z_jeD5a&;*>FvAxShTBZ-p=2xyvh5ZvjW$uKvkJ}R2sx^jl-eraH&s1mvgo1J10lu{ z@YCy(@>NEe5=s;ivdV4*NLAWkc10Av>PDDn)flm_&M8@|NMfKMdp9DoJg5W5L-o&Y z2_32`@jVYqb3C`uO`I}JhecYv%(#t5a6(ulTv}Bq_SyPQu6_@fsx}7+d4xRPu2P8} zm|mf6#`3B#_y^9YtbPesn$y&;7+I$_esOf+?gHvE_7ZOoQ#hOn>a zvaWE90kmqc#iA}6#;RoruHHr2e|K`JU6XylimirCRmM z9SpKNBKq1caDWkP4O$H;-4vurTSsk7-&eAUUEzk)l2g(9p<9m^#?i;zeNHbJ^Lvm+ ziCD1^Q=Jj82_sI8fE)n6OcE7^5rEyL6Pe|D@Ep6f#~xg3BDwPzHICjty&Lt_>0j(Xz@% zO2c71N)&0L3>#~s9wFnEY%#P6<+9)e$7aS^g_7kVm8zAAP)9UKz;ydlW*vRYzmLWt z(OU-VtekW#Oa&q)5X7vcAWTiR+e~hn>C4DL9KkS@*flpO5o|SMvX5+JD>PKIClxT5 zZUwiVJ}p+k1yGCfzKwX2gr3AFmF&d_UQ9v8^XN11|HZn_$Ek5wJ^@RZ*j`x$E=#9aqgc z?mX)|u!7yvz^6JZS%XQL7<3}ZIXT=3mPxDxR+VjfQi!#-)-K6&Jv%Dxv60l?jn&KN zJpO>xu{8R8Plsywd!3XB!;M{VyQR!hj)qG6L=j<7ma0I~QX0-G^8jkvWs71iEZ8nK z>w&RNoXt%3ipr$Y5wz{A$`GCx_~NJijVs(yF%VhZNsU-!!hr0_re;KC z2)HaHTyzXXqQ^yBgN|n^yQwM1RrK!O4>aZNSzTpl^PaoEo1TLRJdJUIZMtrK&lRhg zX06t=xl+T1k;QijMkom;-8L%>PfBBeTr^oFW+Q>t10=6Ipvpi)w83$=SJ}#A5B>O*+A8waeR7=M5xgllG}hGVeDE?5@f-c8^k*rs%KwD^te3Z!Szvm zCK@}nJBU##0I47;uxtpaH59LuIO@exAX0hYc@5b1@bO%|F_x2%AueI%gKXH+V9-S3 z-erS<8F7p@QCFFIgX{kQpz*vO9X?0l`UGJISWdeRI4hkCUqy`chV%rts+D8i;`9Dj z`lHPr&7bI)nG8l4?58Ff+*HrT|35N+b>nu5A;6lU0ZC6khsYf~+jM2KT%!oxF(QIN!l zGZl`o0TM&4nHyHkFtU;5hJGhkRuQY8KnY_e6U*CCIH))sNt+SM07==~3$V-q2EfX} zRP_YpdTpiz+Ez2eaw5QlTl9)ZIm(4v&oCJvO`T^?DvSc)Hq4=d;krnfE*@tWBI9^u z*@_P5zmu2bvH^uULXxm$s^`2YNP-14!Nz1}OM^~DfQra704YVX^19pZ zm6eA(5=Ri5A8F$f(~f4cQh=(vR~v0JT`pQh3LTV~0w%$-5^KJQnJLZ2gENUoPS7S- z20Ey8s;R8#hEV=KnV;w{sQDg;+TijZjrxC|x%=pOF0s>AMbwdWNh6}@Cn8I0!wze7 z2}6jW#I;5dR*=r4CiqoS1&=chhioRxwgMUcO9Qei%!ZhAGi@0?ts`4(e9)ThT+;^Y zO4O#L#G)2zF<)KjO-y=jT=dP+tl7nY;lCE+;($y^j;DjJl7{gfj*fW1f4j5W!DzCKp7HSdZ$-Em+miQpwe^^@2@Gv$J~kM-ZiRw2re{>KPR3POnQ?%QCn{Q*O|yiZp`<1I=O_ zZyg4kH1@?gjxet~(CHp2Ef}x}yj@#CDN=3AGdkbJu9aDi;F7bJ8rv$}rY8Bqz3r#m*H05Dv=|0?^6; z`8Q1(Jnt|lWq@4|LMh5pahZEPTMIlju=Wa%TC8d)obIx76>_9bgu^>IVe6f|elh2F z>Eof?J10Gku}sbr1dobEizj(_FE-$( z(InGkK4#SFiqK(YD{awdBE?-rU9_aFhe9+Zb97aLnQ#bU)WM{}wFz|!>Dc-{e;wy` z?qGq9MkQ9hc{owF7=*P!E0-My48RLBBrBE_>88!Y6D1WwvS*L2o}Og(RuoCI?uELy z2UDg_I#t4r(;>{(eX>${qN+=w?p8lsi#KPoHC(RfD9!V#A)78|W!cJJZpCI$MjW;? zqE6Wf%;s<>(w?;F=9hd6CPSZ~XvYL>)_pp=iGyhLeLAXp+r7UF!#-=>ja^j5b8of3 zUm`VyM0x`jO$~rr#JmR5ftslk1i(9_=ihZB^>bNtcVxp}HcZVGE&_3EE_@ckc@eQpjrBxoj%!%R^jbyTkA`9qmthAt;3)k63|Gety% zn?X+B4b|M<+wJ-Ocg54g@!At>aXR`|$DOIlXBH}BbTrrh(w3U@*SmI&oi!Ub?)S0&tr1r&yY3)|Qv8wj9 zR*?$rUfG4xz(u8&OkCMQBt!#|bZ~K&NNiJ5zS9kX653srK$WE7dF{|l zX<}27$VL;LHu%{b#XKS$OgFKnQpnlcI1FNSqT#Z-uT=P{vSJkxe9E-bVL=l$SZCNT z=KF_@zGe6P{{S=d`qe9F=~S!`ADuw!Bz7dISnhk@eP1?x5%K>3JJF_%;V^n5ARTnN zcSn9%yV-N|y40kdWzjx&lb`~LNu_yPbJC2Rp@jmR@4LusO_X?=OBhf$0tLol;WtM1 zPE?%~2uf7xL1l>}MQE(H4Kpjd#6EXJkERCPNk$-+G9+?&*#d+a-Jn@iDAsBb!WNzz zNoN;rF(}BoADy<~A*|*RpeX`v*8|M)vbE7|3u~BJ23WkIk+{{OA4AX4qBc5j7Lio4 zLUfAjip?odSxD~#u|ZB=h*{BG7*^7#=*ALRoP^6QaHWb(TH}ID;9SmavJ~#`yN~KG zQ_A>P=RSiPWm7^0NECSCrWg(BToC0_hCq>&4u^N&^mUT0z+b~2|5!LOh_S9P_^P)ae#nc4@VnL(;j%`Z}6kNz5 zA&_FhObQhSH!NCw2{;!v>2*}G>3*xDoeeZOYHsd+L&)tzG^TLnNoY2T`q!P+u3+E!AdL6#U0AEjY`pPW}RJ(?}C;mql(rxYV9ufo2!iUyz?%U8pqb+s^_&w zpV7J1-iRVpGNB(n=Ds)(+Bhui9W^YXhJj`emJMZNCk<5NPO<{jX!iOMv$alYgs}PO zT&r>RRN-@L%BgYmeqUwgiqBuqtn&Q|K0dB%m0{0I4#-zXgi;b^k@khBAt(hcRVMpL z#6kk9#nLUUfKNx)&K2C37er-J6mi3hio~C(S5i746h#_It1*!VQ6^#&sw|>GP_f0^ zN;FQ9v@;Z+VcE;Y@pb?Q%X?>`!RMm9XB|g2_lq~&oLwK6y}Yy%aS$pS>#y7Xrq4a$+K2P2{E`X^1xPz)*~JoMG(H9A6Lir7U$L4mMl8m^I^dQlk(aWJ`L zqSV>b3{9rd`&a3_Kaaj^-=mv!aJ>cMpcuY!^*7nqgxk z4cSDDJ((wX69Hy17=s%)+DhXq-S+W$?;mkwVxT#S`sH4(vq5z5n<#t{9T7V)Cq?bQS046Q!;za~BT~qEi0=ubPvc z(^pXoET~93Y=ntb)^PHMq}B8*9DI_YBM9=;-3g@547i{xDJsknGRj6w7jnu25DC*N zMFP!~Y6kf3x{HE~7_@qHfFd&(j4x?!J{o-^R-F<-!p;D(RXp^w;|z4Mg^$${u0k~n zu1f`*)BPxNyp-n4vo;7AqU)|VX}IY1ODM`>1>EY2;wcb`vRh^(rrbueSRBtSQ|yYW z9(;(+22h1_Sb#QAqXBa#5t?&Y)v#!=la8KqvFnc$$##~gm75(!oU9Hi0IAjS6u^iW zI?iVZHrfpqTr^$g!2w;O@&l=lMdvzpR+pLd%b6F8OG1}5ol4Y7rrIwzp-PiS8x=DF z7j$1?p^CK0EvG3`ByKLhOyZ;f#A2ba8j*I%znLCMQXx0bOQH z5S7Dlpel{j69MBiIWl@9PQB-|#q|!C$KFSyQL`IC9$-oEopz!w8|JYqD4c$|FAET+ zm7tlc0c`6|y_&&RZmg{pd5dpB^!fbX=e;?j*0j1CFVvgA<*t5ZZVd|6Tb@%pppvjr z>|H~o*`a1Y)5>T@vBkU2RhXkkc{-M~;YnKcMo1S!l3<%j;x`(F?5rizI84>@)yl#s zH{7ethl-$$8MKzN>@<{_!c%y_<4$ZHsCC+#k)v_8$H*DGHc~X2Q}&0^_@6Oydft2B z_BG$lc%5$3fSrk1)Yl>`WbTJ=V}t%T^35lp02dDPBSCVL^2fvb7gm~;mM(tN#j6LVs) zSb?rlanYniPzr&jaGi6fPlkgX*0BuB18rdK65^2L{QjcUK;wZem!K@G)KzNLpi-5< zfiP=gu$m_3xZp6;7)i8qn`j7U79CCDL(5<=z1oc!1y08S+wVh{Pn=hd8J1jNVsrqJ zIJk6K&7{C=pxR=V8+&hW4}y7}%TNGg<%uv|7Be~XfWb(%mujg!g!>B-0FEdoUFhAs zesjsxsKyKoBZCN1uIxHF_hscgp3PSchQ`OlCL0k92$X>>P0^we=_IzNZ(D`JRG^O#65p851b03uz661w#$GZlvZp zEj^r(uCS02T=72V&(ZV$09QEnSYixXC{*;7Pe|?H@?SgAuEsbptriZ=)N~O$L%p>^ zBC;6!OB-s(rgY-DuW5~A2ml4!SBszyDHw;SsSe!avp|7aTsMj1G!Y zC9pHy14%8E6J!YjWhCl14uK_MRJ@FmtduWc;_Mis7!fg%ouNw8XaVSOZUy!_jag~} zrV-nN2cj=$(<@oRKYtLV4jWdY0_s-%Cg>^@S&OR8&$4jxNhy_5)IppqHcLPpK%Tb67HtCbPx6atR zMlqX4xABPJH1QAI#@w6ch;ns3oB ztN9OsK4<94k;)fYV$RT0+#%0lQXmLfQ>N?ZqD!u%G*=4U zB262-!xh+dS(x$%c9g_Ph|1eC&M~hV zREWEGFj*iK!Dh>&M-_9qlo@3rt7jN0hZVI!H4ag4LFQLzYC`fq;+j`^OH*acEO1W;o*1%q-WR~fYTRwX?PqFMnvA4VTEfRO4;7@zHe91C zSvDA6$EGz9vD$0N)C~q23_u-STtQgrw19q9QnF-=7hg*H4?FgE>i#qCPn7pR27abL zDSSuK(s5sv<-U;UkT%iSpp1e-T)<&zL{?9raN+F112~&z#S8(rw8jFpt17Fa`LeCi zD%7{OgFusPM+U%SOc<`#%oW)W3Iwi{74d^??XV=X3%5l(VjR^cq;a?o#gmNY?vPc2 z?FRHN{!V5sUp|hHx1X8dzq#~q__}r`gxhFhIDp0@r}QKA$A6RZCxPua>(Y1g@%~Sw z2^8+OWSE6!sqmZ-yvj!d%ysnJc?>KOGc(p6D7 zU73a-bX{Eh*rfUC*>>`A-2F>)S9MP7sC}pIe9vv)&+%`_{ZEXuQ*v~#A!6cIPKURL z>i+=Hen<9i;XPl>54-WdKRzey`F|&+erHCMOO@c@b8Q)2UUWQtTAst5uu-Lq@QDEs zLo}r6kx;T3vf+FK5ao2HA8<+vtXjxrc%xYpbW+ytJ}rooE@T~Xc!?GI>oig z;VKBvG*vy7W+2!>n_{%5wB>XfrV?p7k8Lp0mYoMW2ADFy493hlM>g zIWPubfWGQ^>+8MVZ;bQy(*nCLl-t!kGq;<_{NB%6>0dWNQ5$w$5aOp$rf((bUOshH ztA&Wl1!dbCWriyV7IT<_ixM`tY$gFDCXi;R1 z07sJ|j(KDcq{G5HCd$43oS@qiddR zSxu!fR%{8DnE+w5VSxu5BP8N{R!I_dYuvq$XFY7|L(J4mmkz}hTpW2J8?ek4K&WN3 zQGlvq+jWZ*HbGVQP)Ln7n@c1!xt~}h0SJi$!XVfZDZZIYmdb<(;|46aRi+OkT@~qd z{OO>oVk4(iamJ?Wp}KKJu?`l@132Y!^%PnF!(9WRO`)Y&>UG}5Qa3ERl1_HhdFMSc z$o~LDm648iWd8tU`B(VY*5|2hX(L)RT61<@S!bJk^+W>n6Ul&CgET@|m%>z3byyUf zad8{4qVJu!TAhk8Cblz8mzyb2rVVC7qt5`u*@bKXb=r=W3$|^FrDcoyHE#QrpwVb$ zrgHjgQLONV727&_bwfRj7Q+`E5>}_16_GS{k%s9a!)dB$b<)y+sZpV1V=02FmXjta zh%7oUn@%@`RL_>0=~F9R)hMx3h_%waEhYLN?|6R#_+LT5$(&`R*wATofG%J$#<`o* zSs_%AVWHH_sFPE9)h_8_DXDAfHkS|dS1T2wfia%JnB!qQr~vvg3gZ77?H zK(+v`F%%ZLd4j^G>6nm>gA!vfU648F&dt%UMET@mRYo6GP`;f2AhX5d>x%1pKpqMFK)hO0E`Fet9EP!@h;7wNMa4s%G~3}bUSb? zwt(@bPcYXJ(8CdqF2_<~h*_wLv!oAZ zmoBtsqD5TT2yfJ&@=e25SOT&Z6*QEUFi0X(84Bx@5~C5;8JG%esO7S8*H5>X>EQ&J zK-iL;Zlz_K7*#RY)9Nl*Dpm=DK3)6?zk8m@2fHVC`%v2vuH%KpEQ@ z=`NYb^xXPFhnK2D4m8zQc#H*6vuS~jq+%hJ8?Ef+<$1c^w6(>0fwV%{ zmDFjV>lrn(6o`ql@e2b^qnO)< zsE<`^Iq0?%+DBbRpQqnF?R=5Z&GO&9<$#75yi)Fwq2=iMv(@vyPxHMOBL1b>&*B{S z0*QrjnM@&t{p0jkt;6!KgX=CqPKnx5JWg}(4w$RLqjOpOf|%qRZ$?2YPH2;pfYuFu~>>A z^vIn7n98;$0C?<@DuWq~u;8W?&Ji}_jde@9Y*GUgcu4a5x|9RZfZ zTrka*7+hBXGi8H~pkW*poB&+4q`>hhD_}E->e`h-!U79wLcxlz(V5vi&20JI_kR*I zwcL7s*ZM!6{N4GFZmwn|PhqnWlnCywlYourJ+SN;c$c5j@mkjxwO)6Ur(#vrvj^#n zHnHcVYFEIeuQ{L8_cx667_(|>d$pUSW1yvb0ZM{Hs~M_ldg`*GTIjW62LU}|C1@py zup>3xl~y6FP8)^VM|P4{5pX)OfTmcg3u8H!al(6YT)Hi(;80Hx;U;6mt&kIPT<&HS zg{unvMb373ctwtx6-vnMrYkN{WSd(_+$pzJx92r4gN}w02CO~EI!S(B4A4}z>Ak-PVc9i zgHE4k_I#gu>xaU>JMRT?%1;#WFw9w2Rh*tk;cyp8VPG2XlC&Ls%B5SAPSGZ-Op8sy zbRKY~oCs>OU?gWwE3{ct88fuIERLxo?To6J?WGbp+56sl=?^E>6wbn| zI>n9UBiA=iUG4d5EbBgZ*r@dRs5seqw?7+cbn>xKxyM7iWH4|#za(XNg8q;6O{CtNyI!STnU_49e>HHM|o`T{f?nKc3Pd$$L7g?8|3 zE|^ObAvKhUV^nFdl9NL>LItv>u(azW`wajrx#?Y5IaA(xUS|R3_s2L;P4jYfXys87 zuwdv>hJMK=l4$r-70+=tR~ZCnagRIA*DU6wmsZSofaYb+=;JsvXGQx1_Jedw#;0}N z!{$Cep}Dx&ZdtpO<(_jot%atHwl=^8wE5YOQSOtS8}Do&T@1sc%+S8vW6t4hC?YoQW869#Ot)il)EY`f8V3zB z&aR^cm!KM*nPtJ7MFDO!>%0V|bvT1~omv$PRd%GHUdF$n-!b%GclGf8CweL4J^p25 zg+>(c%IusPC`6>Li#`zs!Awf6p_RdwA~@%5aFt@*aQN&o5Kk5HQF{tif<76~x;MGD3i1(i^_$=Bkyc zp+uVy=w? zKB4+Q6K>xueCM&xCW@G_is?wjOm4Gc7E{Ltsfz6abC%0kb)P*hGt*uHP$gqFV=1ev zgPlOO*v}1I)6`s+$Hw=f74vja<`{}im+v2^@pwYNEPT(lIwk^~*cfkU1BW``6M18G zY4p7u{gvnAerIao`YgPC6@ix`Q$`Y^=t!V5mzibC;joCz#p^qH*q21280|~Ap`%Jf zVAu#LmXPRNhQuF4{SSxppM~z#=4lMdcHMlOCqGV2i8lkN`CoJnWwTLBeBLXWkWdQJ zV9pT)PLO3~TKA8m*1gXs$T>X}plh7sF2<2K4BTK*gBTN0mpGM%EmELjWXZKs6%84n z802XV=a#a?u{j=BA`HdnK2{SGRhFO><27wM$TrGtoItTKy)=LwFf&@hkkd+%WYvi1 zQgPH>k+dTQ2MUPP+>CmT4vs6fMk>uFR0Vv*^+BNtK^Tb`*|4+~$tIoyvOxq{T1Hx! zr6x|_Z8GhP$3_kf6Kudodr3lCp-iJ_7L$&EjFWnwBo+0AjS92NO9Gjt!V3Y6%)y$t zt%H(qyI7r~qD3t1n}S_d3uPxo4D6(Q`ZZ1+dQYFRZf4ojl}bXh)SgVwPdQ2b`}O|- zHSd6aQhe9Z@?5pVC|K!GE)P6eJQQxqHqwQ9PNcZ&<>Ng5_3E4HQar?CCx^DHITLMH+K+&sDo2 zDCR?T&c5OFzd7q)L&@deA?W)@t1-5n7Mp2+IH=EJ#npp50A^;o+C+v=fLhD4{c4A$<{dzF%-ogg{aicg z?;1DbZm6JBt4tA2gz1XHJt99kgihLHxpXpB8*@!Yx#!*NPz+a6_{7r;JRX%FdFP8*2C-%XUO=^!u92u5+a)&O`EO1KNT*F81unlsIe@e zI!8$}oV3?UhDgY{GVabG5n*~X-Wll7BJ!>o# zF_5I-Z6k@6PN!+U+NxF2E3P;YY-Y~pCR#j76^z5#G%X;|-4)d~)exxc2!eQpweFgX zwX!`QWawd4!x==J!~zT{wm91Wkm54iYzCiP^hqf_DjPzz>e|@D2)4$Q_Sgl+I1?nr z2|c%5M~WTMW~IDpvYnLhs+FDw*fPTyK(tsBWyWDPR75dnfJO}|x2Sr2UT?wJ3_?a0 zGJ{hsh0q2=3TUCJqQy)=))7Y}S{6-JVTqAPO{IAg>l9BtK#bjUhlH}|?ab+mc2;tw zHx4rkymyvZ!3!>@FN~`Uxy}aB&t+g$st>Kbk0<9}JGQEIJ?GEErIaeGTQ1J2Pnnpos{$IP2`IOB z+0DRnbZ%ySE4k#?L^Aa=nrY_|W+aOWm8Lnht>@m_9&^XmK+vK_o2~BSzOjmF{{uIklpE_1zGpF3if9$7~e4rtE_NfhZy((-9LC(3ypOJEA^U&1l*&o5hql zvTn*KTs0G5^m>!2E+tq|RD4N3vTG})kqmd9Rq`ePN`YCKu$L`2){|FdVqD17WU$K+ zW->x8D?F>0RghdeB-5gTRF6m|OAx7QCd;KQ$(EowKF8?!-f!o6bXc>IAh8V2$q}#* zOxm`IRVRux?WWO6X+bpKY@#?2@1ZoH(5AYUD?*eS={vb1wq2$j)QUFB_dAoObrYuY z%Qf1TMLDORVb{mX@pOb(45nkYLS&acm$>LvR@p}&R~o2YZSk*gS4@)_K8dsgpz7vj z6=`(v%34;bErv0mVr>-)3OP(9*r-b8P=QwjMX*Ruz$GmG2?ag3poafyt2&i%G_@X@sWRr2E^a2gzc% zD&`mov;w(I-KLK%O67_SRlDhzzxzI4&%PI|vXBbxL4#l#cEO3IEZE8^w%2NnATgI^ zCXKQQwwSQa=t4T_%$WSnfkO4MA<~c-pEGn@xF3Q$b z>akF`&JYNQEq9wJvchO|LW@$8GNf#H)7s4slP-ayp)-GJf-q zvxKT8(aLb@$!vQ0+~&1!V#Mr=s;C*@QxK3YBAePp;>4UK>i)+o+pfssiEApjwRhIN-6?Ar_sn{%CUlP^l}r7uY*TVbKmA!U-| zvaZb21fuzXPJkzTBeQ18EQc9ZR+Hu?#$vt#RfZBJms`HL(sA`91O^b#9I?+MAi^UI zt&n=eQc+-Yb1*}v5!(q>)_QjMuG@w7iEXNMHl1*-bk3M&(ikUcb1M3x!8g-> zuLp;4b@MQ`*aNa&%MEd}&Gr1I`}!rRS-7;PEl!L>(5iWULD$^t`5Amo_C0V_e2 zyDkeTVP%pNAz8sd+vrKg%0rk!6NQAGR|TNjDl8pV7HE+L+S#+B#at#d@`=n7YD|2~ zy27g5iR`MYX&W}t1;cHpj=(-LI0~>QS%4P~(v$3#(q+cdRn`Y;MKnm>!csQ{O{LSS z*efO(r$ea~HEJ1^o?lJx*|lv&u_=<`UmA-&3k<470e@m*=%O=Y@F#m%;~vZ0E|+#T?)*pwmq+% zZfC9uS59p`f>GSWWm$7T7^=jo91O806L|#*Z3HC7&d_2q7`D-Z`Lh+D30a43->Z|1 z<>-W|rqTo1{Vyxu9$zGQp8o(D(;bGejxiO%$l_^(Jsy<_-%k3x3W)sO;QK8;_O5$* zEqS@CiK{r~8CaVmbjh*ET6M73E2^B)46j`$R52T!rBl6tWBgAzPgA@?g5=7M*mJ?z&0HbKY zqFq~*3)5334HrO^uER(w>NQ+kw$9b5hKv@?$3O+IwwT*wnEfCtq?zf3Zq6yMs3_Xn z38w?BS?CLdV*0Np~@$txC72DFNTz+-PRj3R~X zKme>rvxx*QV5Mr;Q zuCKC%YP{>M2v8r!^F9 z7A~a5<^hB;*`}bFTQb+sov^70O3XI4hUNAHuDSYKWiSuM)x9t=1)0WWNS;tB%ors2 zBu`u)oKzzW$9M@&h$zvhf*BlA503JTGXUn^-RN*|5w{l(mk6#x$OGJV>T~$+Mz|#!G%FHQ~s){v<&K}+DEyZ-eO2=Is3d^@$2OiAK!IEsvF$h_p zHpiJ2LnO(x24)WqxoioB6J`p{OJMZR9$A_Zt84o}DXq26C zr_%IJgPzg`WMEhkZF$<#6@rd3p%(!LN|YoC8PZl6a!QQW6OkJk4V7I~50bm0wxq{b z%9h=!(A$ul-QD-i{b#v+kE%C3_oFWf`%jSP{U0zB3Y65I<64`epA!X1nQ(|tD;k2p zkR3N{E4X^6=<{4=m(J-~d8>{BJqKt6Yg!KIN?z;wa z0(H_=X;d#F69j1CZPJ+O=)K-gl=%M0Xb&YVnQ#`_rVD_aZ6zd?329cNn!qWIr(TY; z4MoW6M%zaT4p3xDFE|4XNT&+PXmYs9j%Y~f%vl<6x-r1k!zMXOt@WqT_>|JW%Kj&( zR0(EBKrF0cV5>P@TS=Z7S3Nvim+6$)s;oS%%-R{$tpS^5W}{TW!v@phE`cQsDX8hR z+EZatWt-`Y6GWu5F2g}&a|rMt@>4cauMM>7x(0Il2cym6d_7LUB(8hy0W@XU7hxPH zo+BAvE(f+K8jSrH8w`Q4>Pu{##9LH+7>l+wjX~aA;#OcVt&A5oL& zFv($84qZ0eTDa@G_RG%2QkRu8V4UEu%#J0?{ zV-i9GIH)rPVTF>O+KcDYU}GJm7J1~&fkZZr+Zcm9lbM5T+Gj-w-%JkrtHG-@4|mni z%ko>D40yWNn9iA5%;~dOj2#0!u*Yl`%;6AWiH^Z+aZZ8E0gHGCZ4oys3D0H~)+)jf zz5vWP3TCrQEsJWRYy*8S;&=HU()j*g$8AS?AE6F{spedLOt7n)*cC#;3L*g&f=CKl1_YZ(V6=7%!Sr64O8w0lb)7 zf_Sf`lr&ow+g6Os7!PBi8=1@w$t*T05a-CdsNhXxpFJ03z}aQVF#wF*eJIrOv3Kmc zWLb%bjPxYMvf{P_3aR0&UVe++4>scJlLaG19I&|8l04J}(W1*_Iz5?s{Hg5t-uK0C z80(KV!JUFk&_UiMV!LiP2Zoub#Z9%#Sjj^BPNQn@D!Z_-bk^}Y}Ey#5EXoJ5Q1gR{{sbjGDR3pI;22N+$DJh5kMB;tdsYZnMyD#6%SlOUNuO9ZI7vav0VvNa=2 zb!H^x`S-6R{JCgY)u%W9oNXCi9)buyaERH!8uVv`#q0Zv&~3sQLtHJheorDRGr zO+$*%Wy_{!ES^`G7co>SsTP73kxORct6rE;!!tTGk=9b`u_`8)c3*%Yq$bVj+#SA0 z-^5a~D3UQ-5D4OOT?6bYC&+7Be6q`%X>)8qaa5BCYy~IVd8dVoA}$Qgc&*8%+U+v$ zFv%!6mM1@#>mO^$^W^FA4=22M1x6h`iHuO5>Y{0(U9mPeGdO_3HppRcSQNI{ZhA~M z%E8lCh6LJRk%vclM?EYaz~o3flc)^@@@-xNJw;rN2e6B1p|2!4t)ZK$?u!s2r!x_> zCUuS-w@GG}#6zsJro%Xr)ggD8HHkoag=w(L2~f^RwAmv#%1uLK zes%e;Jk6QeQdTkS^q-9SuhPGU`X8x1ZzJ;KcYKffZ^3eXoP(gRZg<@)C1Fm`i#67{ zkPx8R6M-7l{)mXbRVU?|F&cDT77~VKy^rWTpDOabK7W?6gT>So#!8IhQc~xvv7Q48 zYN{ZIn&zI9qV&XLDLCqf8Du27L>8KJ4P6I|ARO!%D)iojjML>j?xawfd8at0x|vK& zsH!mW+847Z>n(x{n;P=0i)axpH30UU9n-5>Ktv~)s|4VQvaB{XWD61{7%5Q7`ig8* z4YtiuQ5#5Qu=X2ifHcr7Q=|%Pu{$v$Xtv%08wfI(k{|(4`j#@+0VQlxI%elYDh z8PmoG7G*u1vQ89%3qEprsF99z+KL0^kNArc@D(>CsYr z%xc2~FeZMEbQPCsjYhoXk%%>IG~J#|AhBg41i>h6jk|5J(FH@Gg-UL-BGNfyu$fp# z*cieug{P+28qbFH3?XQ;gv5%VY6+QrzP0r{znOgQ>e*08cKXIljYAS0-=oXs{Jn%S z?zwBrbtQCI`x>dK(ze0QObTqY=8a`_Q;vwxu-QCJLqLH@one7C%vr%jBybSyM<@gX z&!#yrNmeyUl04W}%bn`%qqNwb3)5O{1=6=!*B(!os}L5Aa9 zH!Et|qfs%V9L%pxP1X~_uu5S)e`lS{%c)6MNbxg?(O_9Fnx)z$M%Egs;;Ph!h|;j= z2@^UAOo-zQy_Kn%xb!7oI9dUW!o<=pvKmVL7~Jt)zJrU1Z=`y-zFg+(fM#ictKa%O zUYl-T9^>x%OSgyQj}zC00(4_cI&gI=lRoi@FwAu;=Q4+^pQHZ(S@NHp-yQW;Y6|5^ z<^hG4M;}rO0Y#iJ>nZCmM0)w$%n*}n?rIL13Z-P$ zWkf}tRYY=wXyfSKj$fR4`zwIcEJ1x;5(q~^O#oQzz%f&zbW>zWT1AJj*GB;nKg0DmgEpVp{{H~a{B!gE{{T75 z&;%AmmZ}vh2W{zTDX0L_b_Tmtu8ncR(j%iX^JTC`)?mn$msOsCccDJF`hPFuzm)eY z`Lw94uwRmd=>)RZ#e*XhU7cjvHKJuE_#m$~B&lc(W#SgZRW(&Pw&wDvRYuxzSF=j* zqG}=`3PTqgB;pN@0D##gp0uuU9;t91dt+HTJ1Pa02bS9m7*8=!iN{d3EQaoU-sL?H zJBO%}(g~$dwG^qCO)-)gf@576Ah9K z#lsNeW>Kq|B)dd(Gp9P!nGj~!%rY!#AOzv5vd@`JFm!Y>yrII5TZ+rFp?-ueqt3kba^T~WAjBpbuTM`pqtFQ1WY$C^IdqbpiIEfNh*ah37qPZTbQJP6e)h25gQ9h}GRh9`O z85>|X=vkh9pMN5ob40lx8 zjKC^qIzHQ5?B~r|db-j|$vRua%n3DQYgB_ ztdAuv>CZ_PSWwJVDoop+iyVD9l$}nX)zU&_bslb}Q8SmH(LR?K&0bHW0vmnUS~how zpK*1Hbu$IU8(A)Ni0U-?xw@tOlc%4}qh4QB)f!lwvPjLeqQ%j&Pgup!0{C#&e-u0-XSHNeF=$r1^`niot-?kYZ3l zM!+tl$cQG|XHRUxNZUB|U9e@8Aj@Y^qydN|sS1W_3KcL6G)clHccc1VcLC;iuY}9V z$4hB*k+-~iK3A4`{+Bz)Ogd_UW++~ZvznGv(pzhZx4HX%Mc!|nJdZ_$VbNnfd}mcY zjJA@6D$H#Rn$xs)+_N1qQf|^$>5rlC{%!HSSxNg2?jCE4yzuDyr-R$q&U(vvJv6;^ z@xQJ4dLK*3T96f!QmUIcle+7dF%}9?ypIcnV@++Pq;#$8tNMA(k^YI&aCQ(g^-5To zN`%!-q5x#3#LnBHDxuk5lu?kq<2;YT@pnDXR-=AXw}%)cap$y1 z-C>5t7Bj|71n5lJ7na?BY`E@b04*wsz=>`ZPKgQQxK_GwELB@3pBRF65F0^tjJ92t zYQ_TsiHsOxot9vMCIJo2k#NgqQvpC|utt_47)(i*LliJrYi$D;$JkRcqAiKGgNGzW z+A}+$GPK67D#Msez#$lH0kL&5#XwAzuJ5WBu8|D?Ey;soV z^Nt>pM$3&xz~u^dl#Cd@)&vSd2Dl)}wAHk9^9%w85yUD4D(uUwMk1Em4fV=j>TiF- z`CGyD7HpzEn+R!)0(Qz+oN!_W3^{GZ^-oVX=jY7* zC3}OV1Wu@$lEj{cQiq|1BD=Gt3K>KrO$r^Tn-Vm#OuaRu;ALZm-BfxwuI@21uhL|U z%rMZX`1n9H?>V&ZcBoqJEG%_A>13*^yzbKU_k*fLu0>g@nX>b7^v_9Ln-Y^)i50z# zt4NE4*&1bC80dWmONC0L=Nm^IY3q9+wwMtg(WbV{R|iayh0 z3|t2zJ89yx4J&QOQ490il$D_8fX8gQ3N&VHWdS1bGla>Np;IBJT{wVNdRnzIjz%bp zlO=dO+ncLZX<836E(ZdNRSQZBSd)%6D9({+z**wD>c^^?#729Z zh!8PrY&r_Ez+*!hA(13-47Msqh!|{{F2kQ(yN4b)O`bknH2?3X>yTL`^#PZ&7l zDt3khL}+a?VT%BI4}Tpjt_AuxWcmJ zuZu)Wom+PR5C(Kfh8r(QI?yI$h*5M#*lZmrA!iX+p!B~(f_+iV)#n~hK^JOI1`;Mf zX@hhNiWG@sacEV>k}YFM)GaJ&FF^FT_>VWNF{uq-mq$qsH~r3Jeq-CP>8)L4&u5EE z=J(TgqjXDP)Pm}XEik)d2h>Jn79b=st9GAR(Hd5oa;lu}rX{keG6XZuVlk9xz*8yh zF`0edaF)eok){~73dk51Yd@^M$K~pUK4JN9quh*LA_Q64bW@h0#dEB=t6FCZD;V|T zdY2zZj&*bL!0pllH7a`l0JG)z?~m#wWCLuOHh5vCQEWuXffO=)aJPy%fK+VLK5Z}r z+A49t6`&5lFv_qiG-rfX3$7Br&*k;_kFCg!5M%^lD1(irnPIjWSuPnEhD5l#Ojjuf zPfGOV<{n>8^TuhSo5m)LCQ_4#It*fD<1hm09lexxX>`CND!>HeuF2@oYK=La%;l4# zspwK(eJe>Bl{F7GPF>OIGBhwk2M@`BKnY`H*hRDmaa3 zR8ov!LdzUtF=!7ku-N-UOp)W5Pced-9=iKz7;zNDdH3~)nZux=gy>-Nn@QDBSY4(P zBR0EDOF*iYwi>hwwEEDBDA07%RmLkgE#Fu3M~3A95n<_Bg&Ph9j*pM^-q zSXgZ~#Kx?MuD!(sHPlwIikLdQcd~k1-Yetu6y;bFH3e46ldPLz!y(`VgrS$)c?*1$ z^D0!6%EwPL&5h1_)*PkKb9t6&;@g^?Mpq9em^2>DpzRcSu9T?|jC4tKtO+SC6;@_$ zGii;q!e${z&5r7#f>bvWuGq~s9);*|P;yyrKAx+)lcDS6@_!@Q3<)cgs_Ja3DW+Ov zg&ktCP$X%-i-AFnw%Z#4?Kr4eMvSViQDChzJ}8=js5L<6pb1zNh*v?`l|HG}=Wq*pS=>>e`c>TlE2@t? zTr>85z9lH$RpWXU{Y|MLTnjCLShEH=m1b~DF0pQ^w=-#*q`EAEi3u1GPz6W|r)U;a z2CX25RmtqNHYXKg7Zv2hUvD=xD+@7zl$501WjbS~(7313t~}aBfI_(-4%=zA!Kc9) zO`B2?jN>twTx@Z@57OlO-`w#(Gk#0y76iE1&Fa~7z(Z)_og`opv9vP)gqiGD7L)^3 z44FpEz7&o*wXD>Os0fH*SWc57`iai-)PP0tF~?Q`2F5~Sx_m@4lR}DW4UGY@mvb`N zrZ_apk(wAyflg&eb4@@PH<(D$Dokf-vt+VE&&B41&5J^U$yX|A)(X?lIwasjVD&)L80}$y z&8|IeS`I#|zHe|ZNvbEB8h{eK_IJU?oS6%oit@R?k2G$O^kR2iJ!#piYT zXQjtVR~W6aQ!2|6CK^L1Rzah&Kn}&Bf+ieOur#niUPV|z6m4ue?d2qx7DzMf3oWa* z+8HoZnX5R;0;*+mK7f5r-gMcTETGd}(Gad$Y{eP0W~-M{0)?Kht_TIpqGGU)+eS`+ z*tdeXlwhM3lq|B?ZHYFM2@FueJ7ZdHV9Uy8DivE84HS7ww9zRr(8MG)HwgnE?tKk6 z8uwde!DQKDCIJy+ zp@u`d1P~)Y1}Gze5v0lxag1Fi7zZ9Y6D(gWLwOXFYSTPvqnLK=dMEZjx%2-3FL|E7 zmT-0|Rv~B1;IMSGHX#OlDV$a8dO6%>;CMTsWS+udJ%n@@6b1_{A5vLdY2>=lif)2a zqt58Z9cR@nT%)@aeQ9>xoV;H@Ox-0X30U(J#!}2-TRo2Ac`%2ptmy%+#FJ@WaawLbw4hf`>(KNkGZ!B_Shh}^YodfT znUof95W;!GJo9#ymoEy`wwc6DHd3}*6^64q3xFpkHd1eC^f}|g{z)#V^+M_8#q(O# z4Rx^8NzkE&j!OiBxjZJ@ljxGLi!PKa(TFsl(rkHEcbtsyIL_0lktL`OcW)}PJyuEg?5fUmmn1bE1thpTUH-3jdF~ipGCFz`5t2r7=r$rFkRWmfm5j&CH5NJy1 zxuY;?(noe!?M2+W=^SMm+Pav?NSRw9;`Rl5N{(7IQwtcM^z;Q71C>`*dD z*cG}C!=hYwHHEQuvTTqRG!kVDa36XtW#}Azo+r~PDB(q3(rZZ=-iZVd!1F-kdArFf|-@UG@*cPEQ;eJj)^nb1igi8*Z7;Xx7|h(A)fDDYo2B!*d7kOlbnuioX3U1J zO$Ixn#d3fVXl=F>tWXU#6{^I@M>2?jeZJp2E6{^DXxd#mB=e`5GtJ>&f)jTuJtMVA zxaMx5lbyzt3~U8(6%^VLklw0I8zenFAP$w}c)E61OffJvQSmm=CnO}U43}dp#>HXP zT8pOWt^=D0=`v^tifMJy(%07G{WSWYoBY4{->K&Ls3ayPWmn23+EV5oxzisT<+y`; zpRdKyXnfPi7rV-5rz`z4$Z%6Lqo3EPjbWK{@p%@_!Yp<0|3!6mg4q*YJ zs#U3by~N(L|= z6>+mi4P+)^KG@m{SHT2m@;HoxQ`lQk?Nv6K6SmDT0yYw5^m_9xdhq;oIbf=Y7oAG2 zQidq9eRiyOT9l^TD8_pYb|~2vY_+QFtHIHwD&-C`Z3kGkU=`*L2pE~SO~+dv?tV&6 zM%EQxemhYbuwXJnScYzkqebPeQ1ca>7eoW2-Nw%*$YCk!;k2Fw*In$cLv5BS6Osl(lGC%Op1RTZzoPO!5BYDQy6cNGJx5gh z-;&Wy-^!kKX~}S6?T{)in`Xwyp`nf{&U3??$F^WbItEK_n9H%}6?rZo7lixL&*rwe zIa-MY)H#UC%&K>YWb)CI+Os4kXK{-|sR-5-RnQrVzz-`U5yJvug_dw?2w}6Lv@4+b zsi`{8HeFR(ZJul(h|_^F8wMge&c1GDT}i7Ff?<$~GKJv43JR}w@Antd{O{*)%>4?g zLc&f}T*y{QtRiyKCDu_-DoGi)9R1hsFQWP1n!Jx!&$;_(`N&!CNF`j`4eL3xY2=P8$Js-25h=uBu z#Z2(lFB~nGIQ*_VA*4xNr;)Wa7Y9*_NZ@(pj51!oKRTT{Qu~#nbQ61eXHeI0jU6X#|sog8>e)2HRjvmMq^u_i*?p2Wkpn*~0xjx1{?XM}~M_sFO^qB*3fm zk`Sz$OCL?_=j6EW&IXYaQ59hW8sp)ipflX>ab@P4O9$jrs#k@3tXmX1FVdJ+!%xzrGB~2N$_T5ro z?nHIRDs>6aUi8htIo>KWVl}hLWNF8~ZjHJ%P#USxNknHD#hN#fg|b)DK8wj(8T;Ry z@;w(hjZ-RJoVDDcZcjp!vyi|fjBLV97cw%O%3$5tLCUzL39qD1}p$< zx$g@`R9Vc_I_*un4xg`=jN|C3V-+QBae30ol|yE_Wu%6!gj+#}VbRO&evdcIem|xS zhJ$FpJEZ7}*i=fBDSYSjkQ?fL~tOlzRSW-3#5Yc$kI zC>XL=rt6n6%W$hp3x}QM7mkGjMdQb->6Kq6PcGDFC3-wvMw%dOV$PXV!eoy8h{V6aa4_VI_5q7_ZJed5IAT~%y!rHhb7Hp5vLnb0Mb@!iSPc0 z2Z8zB)#1YHgKb&d6Kw`pChq1%0z}Q`QUNz~=-?s@2pb`R(|SiwFHzMW7UAuZw3zB- z)ECq#O=9_g)ru>!>4wmfL_wIS#vL#|m&<=S>F1(VUCz>|*?SkC(;YnDAaHdCY;|SW z80~?&6Qac#P#)-1=cbkIx#`69a*-~*#h4pV}zEf;U82*U)>pIKFU&)X;V?~#E2zXX79>W6L0L|6 zoYjSM89L}!o=~mj77>|{A|`dssY&y29msAOr4EU~AMJmk@jY9nUz?vV^dJWnM6ISX zsEiwK6As8mHYr;>HAP0roOzV%)JKWHaq-rdp-B+tS&sp^7G%dO|`|VGs`R|NASLrL&V=D(2 zIwY)CHcdkIx0({B8G|sHm?}`A7M5*k2#p34lSP>Ya*R59H&-v5N2PRV8A%*$PJ$pU zK{C=%(<;kWGwqR0ur|Rc0(p*Q_QOTSB6E+W7Hzd$$tyMqT^*z?;^)>0s?OP0M>yPBce%9*J$jw0txue2y7eQhfppvOZX zwYWo=0r66nI<;(voqMUCL!wxMSBBC0-tIncm!fLjPo*mlH@EMvw)o#;<+tWv%zbat zKNIcu-oGc8`97b_-&yAI59OxFLe?o|CWqrS&rlX=hJg6SI2%XDL%9LuNZiNrrJvR6@T&_A+>K_&;B}R-+ogfFZ`dmIQ z<$6F}sEC{@i0v>&qAiZamq;eR>6hKU*NgBskL}Pzr^{HnXqZ`Ghf!kGxs&N{r1AV; z#`HMOYoZTN(ww&qm!1GRs3FU~y5*%&5ZYx*aGgYf#va$``TiB>dP^>IFzArQb;KE& zHBHr|CB+l8>wkH6wvU!^b!?T?U}X*-64}B~VAwikB+ZJoJ+#paf~w`%%Ybz8WwZ8` zL|x|yk`&CNde&b&bI#z>U}2RyQ5h2wv+b~&031aux+)pPKAk?BV?p!7$T~UEs_5+& zinPXyC=`<`bQL+C*}1YTs;gO}Nkt_@sDy3R^*|^&o_pX?IG)x=dk3M(;+|h}ch%aN=CLuKC`7*4Gr zAz^8ZHVq(HqF<|hE$(=qG zUNfpHT5WMOsx-rDBXFv;)sM{3WCIB^%3EC_nADf&uIHgKB@|_JyC(6fbqlEJt5~xv z`)3xlxl={Tt094#0MhBPLJZYpOsm79*2ro`pFD+jbXj$gW(|iNo%$jRNuqT8wp!^) zXvvPIL$=)QKuq6C>C{=k1?;Ih=6X3O)~WOCs3YP6yol;fh{YS&`K#l$fkOKir^R(i z_-B>q)#~ViARbtj(`OorAPX!`=v$lX4|~h`cf|F%u6xMjV(pdDdxF29-TWUMr={hb z)7oVYEkxBZuyZb=O4!pQ5-MUiMicGIk#PEsmUZp>IedW|WwU6EMi835&vnfF-&qnU zVsN#uLIng7;AaWcJxJ#(DP(}hzvysf?CfiF$ntW_-go2USs)k^-NR3CPc5?ZrpV<=i zkalO7=)qmnQaqYePK+Z?j8qzVMNC~tTnU=ye7cobJ1|uH92ZgO+)0-XCelzWO|W*F z>CDccj0J%)YKo-TM0C^_-CUgS7hN>iWLe^yVT7J-s|Xpg=EY#+DzKnv1_NdAX)ag; zzS80CV1#avsDLdgXyuVo$7O~=Sl(H4BgT{LdikoSs^QVI zjIFoMfEHE54-8yfvL|#_F<%(28mk1E2pMF;80Z8U$^$DIzY3t01SFCs(hN$u3(r zRJpo+S@s_}+oMHMI+8u?x*H$;_J zb5)VTw9sUO;3R3tH1muNQEilciO11TJN%F7d6ifgv}VR&iaL{}jR$)(!!kjjv2!tw z(9Q@uR9z4f2|7$0ti1ChZW6~QqK9=GTpY6nwn1jGx>FLDDIOaveAVlVwm7pJ>z}Fl z-<^CfQ_gw2R+%f{CXmp5Wdlu3w=w|aK;b58PwO^^jIDMVcN#z~paV^Tn|Pf9Zn|K= zGsPk#jCCqeAfjwmI9TbilPj}XrppA@FP8$^hP6${Jt>(1mkPzzXw`!Lljw2vy*&OI z=68ZDN{y2o2&HT`bopC$nJa*l#S1b%9cEBEHW_>{Hja8mYzF!(nHsg{nSgPph91(% zStePO1)nMeK9kqa$n)2qo95U|a<4M}P|>7u6pLYPX_yZ_m!ec0wiXd$JQfXdty`&->#=hL z$bdFkPeY9r0T8UYd|Vl)!pH_qbI?`AIF%Pms1p^8P`xTqbn`rn`E<6@mC9JrQYJHF zD$fihb-|*|UmrC#!nk+PJ^UUE=l536L0@!ZE{##LsLah6&W>YtSye=tkPh1@(U+u- zq+>#WsCACZ8%i0rG~}z%nWmKm=x?OFe(yo@`+jWoxcsZo;sk`8%?j$hEp}8Yom1j+VM$ModDv)592T zTT&*e5|Szt7!w*P9RO$qX5w6|l*MpN%!n+Bw4qgPIGQ+S#H`{_RCxx2qjP1Ra|G-o zm~&-uIs=kMQ6qGhfwAQ!NT?}w=!~uwV!H$p#f@qGGxQ!G&i-emQRj3ptqzIl9t?#> zm_ap6bapz&Rjj9ep74L~S-U>8PrXLs;}mLX`N%FBRLm81i?P_$W@nGn`QR+|Gm*G7|h5~~@RG6aH2woZ`lx^1^CWwUqZYE4?; zF?;$Hl?GQ5_4kQTg>vO}Ws(!gmS84hwuq6EhpAafA~k8m6D!yC4aKt|$*=%RG))8! zoErf)JXn#Y`l6I-!AKQhoE1l8a8oP?Jj%-3FLT_UPv=>eX)xN80}2SPHq#_$O?JtK z8p1%#V1U6-MCs-8o?g;Z6cU1|41*R=M3-0S*V+7U=FiLh51;c~xvd*?Nx7|)qLEuf zXlSlzzJL${DInb>x_SG`B_Kf*$YCiV4be9%dnvkd^lG+a1ZCT+@_AxsQWLzx-9x}HwI(cdf5`QG#S8`1K` z(KW%_;}RqV+c6MELrUSCnoV(Z2(k*64VQ}sh*mFZq9Z98*IP#A?&Wh1>(2H*>+>b` z%2(uxQ{caMmxb-&sEf^%D_^hvhv)n=o2SP-Pg_Z(PBIx)c{pBzn;UH@6=f*ZjCyY~ z(x&wM=4vS#Sj(xhIdNP?B*9gq8P;4eo57-~46_q1ophonn;0#NEESveT=wO9d5Bci z0!D;hHdp}Nq>R{T*ra6Ws8eD9(Ba1b3=+b?yG%k9Bv&JBVeN=^`)aG^fMS)#TcX~9 z+ri~NXQMJzd=NmOg+_L4(h#tl9RZ*Zd8aD&4!kn9ki|m`0_wPJ13ihivUGCzpEcNH z-ST$vJzUT!V>*6?{YQcM_w&BZMmm`jh@CJsCn`TlFR@obuKK*Shq3K?|JZ4wMNjLV!$ zqT#K9mt@EoZ3PV_I&QvdSyD4walwUd596KMW!-X8DMO!AxW2;Zi34cb_pc{4Tb?%35%_|Id0q0=JC%zp>^2V zMh)Z9*mIN8Rw5Z8msA^z(yJERVL^d|?Uy#hCSB9@^YdK20da#z8IUz*@VuZxO;LbZ znV1e6ZDPTxEmKkrI0DWQkYAzR+i^A}lG-3{$Rx#ARk1@zD;1hpwYDqns&G9&vxn|) zh5ApwI6ZH`&$IciDzdE_4X+`ppG#80vovc@SP0O$V=32*^_?8`sYrrSdPG{P8YRm% zW?E>+VF0_%rBRK&ztr=*N6GJ77yxp1r%ce1u<4y7sKcolB)L)yj0UMu52loDD<;m< z=8#1&q|oRYolMX^SLjm6sOnySRXHZO(?BXemUPWBh9q6HaxgQ5l5jj|Y5MMF1Ob)~sJYYIWW zgjQM(4um<~Wn47ePiZO11}4hPx3zVW3z`ReSi#hFDcz5$#mag8YfYJDQPyZ=>D6?@lj7+PEH;82lPA#_ zpj}#Yi1w)ad5>%?R#i~4Tdj%xDe!$yoch<}{{U0Z1EBKl*F-WL8)>xUCxPgvqPDad zStvPwqQ0N!erNeVqiTt&5i4ZGR6bP3hP;Ta-7mH4J|%1VIH`Gh_+Mf?S67u=$x+g8 zi+BBge;lWqA9V+C1T0b6I1oSj*z_E*IHU&?=3^Zb{g=ReaL zPJV(R3##)FLPF8RNN^q38C8@O=Pt#=u7wU#peooVXmp>k^z-=?I@c)GFwO#JVM_Y1 zMW3B`1w_@Onp*=65&)xZVCnTI(D)uT<9hyK#nm@r>2~uqfu_ZRyH<{-9uKGWP@o@jmtJd0rRi_thgl z`D7yprDds$p*@#ToXZ;I#mhD~9M(purbMtBwBKoSZUK@?&~iPYJsc*@wib~qqoH}2 zu#*%Bj3mKv1Y*<_23!C(Hrp;C^seqi+MF*1ml;+`njHwhz)g&H#spFp7|6+G(BWx1 z1ZVQEno3uW#~DEk4p?VtW_eMf2cJ%h2Iys%=@m<~rcNS^P?~HxmPr98E4RvwQ>PXi zXu4}@D`SRKELsC?mU&_rh|$d#NMSLX2G~6y8)0u%`p4AsK6>Hp;NjAo!)yXX+fHSq z3BGy9eHzsCMwUk(R^o_hY%FG~u*|l@hbGfvE@jnaJ$2Tw3c;(D*qPQ_*Vb(>W4ybs zSI+pq!1h49Y*`GAl6zt_@|;)OJx?>k{NDIrH7p$h6&S8p80Abb(b*WdFS8Weo>c1$ zQo>4gm_!kZ(_P^si$UArPIS^D4mZV>Pl<&Q@n*i!!@{2H}Jas{#}$TuTuR(|TOreEYvI z@DI#=EiC#cIw+xv1qPi^F*c8gGQ*aVs_jhK6U<5F$+LIt`?+|&Zi?JUBYc&oXrBu$metEP0g98eT7KQN!Fr|BT%oX`d(+2a(XCjYmq!dIzfRN zWKa=J8Dp-62Bf1w+=(pA#d0pYnT}Sb%&@IWoq#F~4o@XUkyfP9RU4^xAZ<+u3ddr; z?>UtoamN{I-4!~flrLuJIabfDQs!!s-FjBzf%v~hbl7T=QH{J0q<3+7XFp_BSlt~S)$958X2LX13gHUWe& zh#0sE(%Y)U83DQ;l=E<(0Id$^DhtBOpcoXZu3CUTHck{nZ~5)7sf z2G#+@g+V5AsC-bK^j|mG`Zve#_{ZzMWFdBry9ag|VX_^C?^O9-S_A>1W$*@aES(oe zL>-j^FgB599WQGN_;e(Xr$jLEUfL`<=P3x$Ym!XqYCw5Eu{H#da<%9}PR5m@bo zHV7Ex-%GWy%Ht?Ak+c|W=J2;<<+<$_S*}^M@o52>FpL?7!0<*PFsc{D;f# ziP-4QCYz@w6%_d9+Ds#+QNZ==aIDqkS?rgWB8)aj#FU-YLPmp39R!dT8Iu~xg*nc$ zt47ipAes=JvbK*ohpNudqG1>~V8E_9WMCriFyBal?9e0`Y^&ngGMR!l>o}b$=G=V| z-5;B{ZGhX*eb4lsAIKgTtHSbiOtV>HGI&S=P)-kJ(4MU0=-;RCdA>_fOL#XAf1UAm zLmh++={KIvh$0yHHmtc2boxu!^4fO!tHbrdnm9o>M@9X6`wx`-!TH~!^PWC{qSQ=< z%L>A(#AED5QR-aY6zc1tD8o8?4GRun!!Xe?0!YHZphdRk(4v@VPahFgbQ>{@32Ya` zP6!P0#$?R00|BvOlQ3O6?K)g_A_~? z<2cf4qn-$b$yL32y#8@IrOSENaoa>WEWblW$E6(58j5{TRasTFRjgeImVKbKWu@nR zR5IxRU>Ud9E}Xn8w=oXDMC1hIw{tFAPV5~WCDo{qp-u6bnVM+rrYy3!9`v43E0LFE zS!JZ1dv2b7Ta&F8nC&<#vStAI3p7C{JlQp?HJijICs(R6ldenr?gE>xTmusf3Q1zy z!WnYwk_tPJ7K=+Qh*lWXU>paSxxnigqZzSCC(cve328Jvh zH=kX8Z)@x0`Gd~&baBw_L)D#fQ5??TqCTCpCeF(yZnO8_ON+&P&qj+4%Si3IoNa1f z+C6hWmvXR-^!T}eahDNr4H+h~i2ndPbsc=1d~3Z@!$Pw-X)erAreP<&T{`YeI-S{Z zmOS>;A?LKrRSB{>=oq^p)vzkCT0%`A42`a&GPqPvor6;%vqoCLs-#v($+^7Q!9m;Z zZVdETV6c6u1F0Z#qXt;!HWM4bYKA;6Y?bdEpp(2H?54{rXDv0A0k#_BrYJCR5=*oR zCI(TlgHS9?gn4aoM=@~fnK>oeV`&=K;i{(O!(nYfTnr94+f@?+XD%HD;rc`RN5+1! z_&q<1z4Z8N;XbCCOeHYdE)JBkI=$zlY$SLHVgWG2C6c-$w1ujuhErDST*_=ul-&xl z5h=xHj)4+vOdtf%x3=~X(b(h-b9m$I*-RS%s=;AvRIXA{w4@l#TV)M`<%@{+GBwv! zYhdYvyv55F65DH~w`J*ZeXHzwA02r<$06tUO#*>tL2+xLp%hdx!sXR?P)A|KTvh}l zbV;F*uSM0(`oHzxEg?_I-;nxRxOA<6^39dKvVvG+YnN*qR;~$bsG~YYW)=UIbz;bfrktMYw1(1y8)0)D?FS7Z=y^LoW4=e|ekJN(i2kqU(xS+Pofk!#?PqIF zyKFCN9-Jglv9?h(jXNt?Nh-wXUP>X|3A!g1R+*dv}oWyeb0s-7{znMH!YkYKV+9qUfMbQxU@)zoqkqWdCCK!ioq{NEDVYV8^a}Au3G9j8OiguJMi51jLTt$J` zXfq^9jKEYgnSVmP?-$@N589zqA~Z3x7>``^xW9hA{{Wu+^0!aHKRfDq=b7J7g;v8+ zJm4tyB25#p;*F*{*x*XKJoQ+YCC<>Hzk+n>~uwGR;mxv*(Xn-p$M;Du^OUxk{A({-PaLQ%#YAz-dY2Yv}?7*uh z8syp>?O4jrFc>vLx!jo4imkF#G9d$8q3m0E&E*v`RAu3?junGkS za_W^F1)2~x(@(JaVe%|GmJ3l-*`qXFNhDqwq^3qm-%c7bc4)JkH&m@AQrVkzRYM%; zO+wD#%k)if)>0LY?aKv&s#JA#mbjC}!ttD|IuVs{pv^avB|%v>$+(^7o-=Y5nE}8u zZ?lud#xTMNQgFxwrW%s6jWYEubMEpk)cU;N(c;?X23$Nzc%m#XO4{^t^L*W4V*`$Z za;%82)9!lb#dF;J`WDf`M+rlZ8NC&Q#H>SY(kgUyikA>lUm0{ISXO$A1q_{aSkvG8 z#y4U#3`UGnax`uXkW@Mc(hY6{Mk_6)(he9%vr*Cwjua4;7(EG*7C%UXpdyIkSN;9? z`~3BOU*~$xeV_9@ue(t8MafZJlOfhq?rAc2`$bxNP+Ul2JF-V3R0 ziC|Au-p(Xv{}+^<{XLVuIL5j_PeazLVbeQ;efG`P)>)m?)n!4pqxOy;jDB}7UpI*9 z^FQsax_EzA=9$5MDauDj<2kd$%x^rr3$|ZUoqxQ|D)a@E9A29g)^-;yoIEE?;UY|Y zWm6g@w5PqJq(ezOp!5{hEWaL5f;+HVBks4AWdeq=oN&Zz&+h5tV=>Q`W3w|-Kk)k7 zU)rtLwNd{fqpzEv-5&j40aJVOM96RgrL_x+5CR&smxCpGzhvC^YRh=|vDIRH{`AgW zEyf&4*%5%Ja8Jwk6gLyibw}l?7I%CkIqltaT8mX;Cdun_#fZ(|h&W2XAqVU(6h85a z)_2bMqmob0;irbZzEOaqS5UYh1Og+6BVRAW9bbRhI(vG%ovn53e~jxpsynTjds%Yw zzzh~)1BWmTJ6b!WO6mrwsORsSl)n3*U;kA$x;&ALoem=TaAlRe+pFGh-QlX6nG>^^ z7ka9B#RzsiVjWDB9d>D1Rq^B>&T?A^X!-%+*^(hHt?MBX4;{}u_E~)6=FcB#TcA(O z`(zgn?H@EdRrdKUnp~!P?_9TOm7>ho8>iV`>hEFW-J}=yneq9w2%*JKr_%9O}YG6?mzJA<^y34K5tl%Fp#7+`1|Xf z>s9~z7-4iv<;-IPv_YGt8l_&P zB&Cm5c9npj!W`ZgF22GOh4DAkGi!%~;1}{oveN9t0Ga%^6kV}BwABGgAW$-Ic0t^6 zJ|N$Mp)>ZDaeDNvCR`TUBGrnhPm_Nb_pj}7i`v4%;nkGSL*s?BN2H%>1JmP2mv6=| z{I^paHVVypZqP-4ty6bXV#fPr0GvnK{``A#9W z2xqi;qo-*KXy22DcdcxmnJ^Xh@mn;UpetMDSIQfX=|jjiB=SZiSO^%j2_f~&^(z^a zHQRCXGcQ{@PUcGAYQQo`}nCSFaA6^Xz=0n`9}>yJNE9gF*Nby)bTHHaYnkp0&wF%_5Jgg}=7H zzvlhfyPT~*eXiMT{W$Pv+u$f}4!#vxplT{L4_M_GRA&9oy7iDxGdkeU*E_|-ByJJzEu~~(-21Mf zlExJ&*g|vWlQh*qRt|gI6K!ACJg-zmIHOeHOMW(G6C6xI=EXps<59pZ$Feci!xXJ` z>4KJ}Ne7_%-&}#fJXY)`^a#c}H56HDg!3P5Fr`wCkNoSxle1LHCOLaa76lz4?hLsk zd++pZH&tX(C?(+h^Fa6ajw6a^i`!S12;%eJaxKjE z(GE@XNBz4$ecE^b#r?W9Jki6<=t7vja15KY%NC8hIvafKS9ZXygH#ERHukZx!{<3YEAr)4bIjS zIZv1WO$gF$vjuKdd9@V72GoFXLFf}lt_foWRfz!F_=Yo1%NY<-uZ~sq+URPiS&LW| zX5jVWL2%R?hH&$6LqD%=3ptDU$zG*Guxav8yuzl?8Ld6PlDC9jM(Q(JYb?}AT{fG0 z+!i!fr)Ua%WiTks@$&c2ob~fN*Y6HqF@?A3N&)O}&TIppPA|RV_9i|a5EvO~tl^z2 zGzQ`0D~lR5PNh&gLDkjvoONS!wqV0R$E32|JciUmjM*mRTk~iIZ5}~#SIwbKD)gkl zT5Db7M-DQzxJlj!3AL0|U~V_cknVvaMdV>s{#e7yT9|VXxWbm1CN<*8!mEL2h~OWB zX1#X0XEaJrgZ2s;+T4cC0_77;b$`0 zj_&CobWf|H{Q`tOx#6V)CiM6v;}@*qtPP7 zAA8I0kD1OcJqWAc`AuVQ+1b2|Z7}IcSWNpaDYOnuN#knLBqe66SmJd2Bi%%#eJtKN zKC6q0{&_v7&|;RAcMyxQEd4@7Ew#~ZdbMvhJ@0HZ5>PC*gPvQcx_eb31~vHS!djKpd(d!hVjTA)b6 zG}ju5e4tX={aFLD6!S~#Mp8dn*cAPisqi52<*eRz)nl6&p=$|7zr;s=V5cPgq-}gO zU=9L~grni)l6#n6uiYdfQdyct+w++TJZgL6Wt_dz>f#z1F;Y!GzF#sh_+s)KBsOA2 z?b0(vI_!BL_WFl#uN^NR&a~alkNz!>dynEiB5|uUE`K_|-nSX;LpqM;p#QG2k>J~` z$aS#JX&zvY&3tEGYiKuLUlaXTNcb{sp2fu`m81HFcgI?1VX;U=39V(u7ms>+1}WpG zp%Goe>pHd-E8*I1kD3?9x65y~1M%h&G!Ey_Jd+YnU-CJg_~2sIB*z!`d1$Asj0Pz# zAZz2=pJCDWucK6R;bUm;4fdm;0;A6{Qu=&=fDzd`pT*Qww--glLO<#pq~}{g+IWV%N`@3L5%6syTVm2=<1D>|M;ZGP?mjh7H@5`0#?Tl4Y zgWu8mktL6=B}Q0W*ZlVPQ9%DgMmmw0xcSJvlzswK{V~$Cu|nh+V@(pNk9Mp267|{4 zyE&G1m#{Z(UTBl9)zNdJMFYxkJ8|koz4(EZJDca$#kcg*R!vBx%D4$kPGtpB7cvB~ zh{I3*bsljuXSLd$bK9TPHR3vR-nlSlCZK1Ep((?IaYH&O0GPar94pvOQXh$1VFAxE zeN6z1EuFg z8$|NT6m7x8vI^RHN5K26^_Xe%-DX%I`rD@#xm(n@^pC?p-#tS0k0o8Q$| zuU2^m_C4#9mC%`7mj(@QQ13vZ$plp==|Xx<=N8o$p9}6t<{Me3w&xZh(B(zdCH-G_ zPH#xfG5RGmNx6JKe{B40LTl!rag}r3Ih`0)V>fP*Rg`-fh&X4-SMkf*6dGC8qVp;N`x`H?0QR!TX$^g zRsQST{aWe-GoHy>FQkVyBBb zD#EG;+mECnEw~owMx2{$xcD?5X1&6B6y}|ISUz_+eZ?VjF)-(OQ=j@H@AYMQMx%@j zpo8CcU^+5~=db0B^WA5kPAAQqYfT-UoW@}Nq{-{G`jCha>gon9 zYxzl^N*90Hk@p2AC=c?5W+H8^>@-c!A&>m;dpPpAycbk#Fa9iatM&KeXP4&t+P^n+ z!%mjvD|<%5b9tH1dyDh*XFt1kmbc<@M{SD3htT+@RmpW*U%lbL!iAWPiUo1_R2g|6 z)1gzhaui+5YLyxgPk2qg!1Q*hYuML|Vt`$B-o+z)_SMT4W57ED|K=@*2H=-CWbdPrcUi_B!+gmRX;*M$#C;`lXoa-2kTk=%E^ ze_TDJho!!2e%~o!pL_It>I1xmuX`z*qt>7&Id};=&3ur{q^Pgpp@S8tv zy$FjgVz9Go)-jyaC}Ih8TI(eRX^CaRmRRL*UJ(uGu9fF%rve|CKNpZ!kV+A&@5BbH znpReWzoI|h?Yr@~AUfsoeU6*VGPCwADq31|4Svqbj_mXEM#DFWk|ySPOqFugg>qO_ z3r$t(2xjGIUDh@fG1-@%mg^H}w~HWm#5{Sv|C?rd{|(3Dy~O>>+nE3TdLw!H`;u3Hw2(E2G{52i}75(Fi-sc+e$(l#6erpf3MXs$o=2z z2=($d2Nk7&ypp!nD{SzPC0igp&Vh*Eb5ux!8iTT&7(bGUDR4*sRa9QSuSbuS73{;RIK&13!S| zGS#uiMnoP9zKmy|jP+kOl?&ttI7rCS^h_<9QEUs{JvkGPWYR>ZKqc}uzf7QQ8-Or# zR=0@Z)eE_TR1L3gud0lKvxeor$p4vtJbh$z`Nk*3>?)|<1I0%rD=H02_(k@pFB!$E zK!*g;@$&EbgFz-5hu6fp>thc>LT^2O;AyzE_j$8ndh651xIy%57dw!vaQ4^~Cufx< z=$4W68i@^Hh2|#@iLMOm2cGndMx_jqw`g`YUa#01Ob$;_0D+9vppQ~PpI<*Ovwu-^ z`KVAPGKkNvh=*+Dt^92;5Vju4EaMRxeb2kxJjNxE~oL*<-uB>02t{1wN7~0uancTE|;}JinEd1MdwJ8wfa0ZC4T& zao^hwUv^j~2rWo7Ghwo$Y>C1IEJl18q=fh3&cVLvWAN3c7M#JCVYQ1m z3*%DLY`HRtuv;j5LcjfWgK1UxP_{?kk45SeF(yYLW*7CX@0mm5kqOolcHZ1%YrBDj zxDI7GMF`$A&>3oAG&Q5)-I*EVLHgfyrpu2f^iu9zHElUdTs&WDB1h3|knUvi3PP^E zg4$0`B=e%X%y#sdgbu`wAo2+ZyJqGVSRsC7aZoM95MSdS5~(h#G#x$99xBYGRzu@G zKobI6t1DcGrrd0wp{zv$7y_p>?jSvR#sz$bG2YH~s>F$|d|zd|zHE!~uFtjIrN1b` zYWFN!TNOAe|0U(kXtB@U+J6;6qZc*8`CB?7tY;T9NZb^FPOOEzsK0jN%l8e*<^5|!n4I4`!E$fD6^+g8)xtO8-)$>plDZaeJS=DFY$axRAucXmW8R<=Xoh6BNa3nOW37VH63M~K2<}t!&)|inb2p7 z33veuUcuEyt?3(nCq@3)mWKsZ5qy?%xg#Pg(}2QkhR1%=^W3e)(Wsx8%`X zqOg)g?<#`KSeX7vxavW20#s7q$8rg~LNU#&A`>C?v1pm|XT}*beQg~l)k@0FT|C3< zz(y8kGV_a>(Macgynb4(vtt=ug(4uGhNe!j#iFe8Y9eK>u*0Vqxkto_>d@oUr z*r7@U2(9Q6Wj=(D%Kv$WWFnuT{nWZ?I^{xC3K$sdO~jd$3rIm=LAL(n4pWple?gjh z1KX^55X$25=*HmhNA8Q8689q9oWLi0E8|QD+FIoS<7?*Vq{FUTaSa^^Jdo?bN2^L% zPoq+^`Ry39=K*XXFaT_fNXiv&NdUPUJtJ$0AN-TT@hvlI@Erb@M^X>t zqx7H6Kw{4?x0!)5t>)v!3!g%DVR*u!QTDQz8rZQ6W$13`TqvTiRbWn*U$@4GvKQok zeUfqDAlEA+tM{pjwjI3|mq33+w;SP*oX6E^Qt6i-oa!8sT6*wTU#iTo(f;$yTy{`T zeB0aYsP8RVs;!|!4*)kdh?gd)R@J||9=s$)O0$hJT#1YnmwmwzR2z&Hf5xbtuAE(4 zcGQ+Ay)yN#Eb{2n#$87##O%_nqvTBvk7nVS7gGTz&124{1$yCRBv+5S2`Q_&8{ITY zpnh^7zJsnA*q-n_$v1BzZoXx5*kE1I5xI`dRg&xkCWc(zXiJuF;N34q90=~!sW%>^ z(ejtdBEqG#D#wD*gX5CTp$n%MM%AsQMMsZaH(%w3UkR`I!9t7;TRL{Zl{u}q|En0U zmU7HRt%aRQ>W?J#Ndq3ft~}*-2miq0m-*>ahVw;+Z)D6`L2)1_tq7-CuwMgL$pMk) zqOVW=ep5P0wGaBxFTDf1pmAp75-3A2Tob|LB-)x=&_XDss73q*Z|_D;UX0wkp`Vxa z;b$fFOjbX}r*d-d_1%!rCI|mnv=oga4T>TdtRDM_kPsy9>92Hf+T`OUWUG3eNc|+v#tZu zqA4dDc_8Q^QhISFhTVU<>S2BB?xkbVhcP8~NxJ?VSJhj01|G5t(%+w*xi!jN#_VGN zky(^li1@y&_hV8I^vGMb!OFDQ3nFjs`u6j|OM%$?ekUURGk(ek$rvg65UvSuWrpcHpw-Lls*aG53QaJ%Ny{ix7S=V*xXz@F%j4fanYXI6vsBS)P zP7~X<%(eJ5S0EszC%rt{XPnw8Uhl`RB{pd2Vq1kJyk1j(l}v-_vE&&kauY%$7A*|@ z+h8gZ+^vsrWWQ<$vMqedFuHh`7*OZv|8n#JHqf+3TBFl$zJ|h<-d(J^ z!70JT=*k>~uWpAAx^p3eWYit*1`X$8w%m(A;yQuDPU%rycMX21{qnd)+4Fkp8>z8G z5K10{z$0i$lsBe>J?oAlYTkE|-3g3=sHTR($hzq^SnNR8g+oKA)El$q{7)`kn(YVs zJKMo+hxgg<@wj>RXvI z%0VVP?{n$NTVgBRy1pL~9r)%yOU}ASwrdtj1W=^9bZeD2bTczc%D(ipzf5|}Nk(RB zCYgC8E9WVK?WKl>QkmJ=((=#|%sy&X&FN0rXvBR0SPvs$s{AG6?RL10<#dkxOvMbs z_aq0X-Fj11ke=G!a3M)eU`4lNKm(cbK9`>C<@4}bS#0O8@ZMqWnD7w4GbHmR-eRzSr@Z|LX!=i~NEzq5YZ^51-{bHB^s-*++<-yp2fOnf(~(#Z%xN)PbSIgo1TUTkBy`(jgCq^R zDmJHWdhm$BABJ|^oCsN_O~6nbl~`-FW{FF(tRoFqz87^0Z?@5-=%U&_IoC-?bo7Kf zr8!Mm*a@vfo&ROh0Tj7^jEK9yk9f=63eb0lS`xERvJPNuhaRfsy0oSyQfpxFg|d6?B8i zA@1GDrftoXaOch5m_HuIyAdo|Lx;k4A>CH$wCdxKuMIwS#<(h-iz9AdNd@(uQtHJ?hBx12H-A|Xx3Q+p*2$DggXXJ_}P+7f05d!AY&A4gx-qtGSS@Fgf$o&A%4`Lwdd4r8*j__L(9G?To+;4ZmCPZ&(+WcJojpd}&Ky$8ix zre_7dtwKPnh05xx2@GpdGDXqF@|89T#~+_^DBmo+{M(n#QJ!_pA*29h>5dv(q1b3Q znG9Dtgz?x7`jTA(5}AKLSNc@S*d}5V2x^()#kZiFPWn5{Ayt;uHUG(2WiB}gy}4~* z-@BnjP9El<@5Q79(D%%5KNhsSZA2huQC@DNO_$b01>Wf znc#b6v%hV7R{UGUKFvVg`&p1hlhT3}?X{Hr3`^E&hngs1Wh6%>m76?^baC(!V!5u=5e0q{~FH!d1@6241V9t989NlG|9*}ie{^4xW^Ld^>CFYd>iByaG6=7#o zHceN(F&+FsQwV0e+jN^1`?m3LQ~i+a8tC2Ct9#9NmAC8Ag44N&%ymEr2UgO2#eUiQ z{@OCpJjjv)HqSOskSzixM+6 zF<(36Bu!_2Lcf}vzny`9{ma+ zyeKgU?_`!wfo*aI2-dD$A?=w>*vBZkQcAKUYs*eIEw?eYZpkJ}U?FZ3vhLoNAmhiA zCR^xlm$De4Q3WZx=zMB*LsNMb{IXTAc(iJDu|48|#vzKycNgM}(U`IG&(&9V;?i}S z)fBUFrcKUN(eKeeE1}_a@JKg3kYP*CzE3LqEOS7DNNv;jtxzgF z?)x)s#&})iA3Cw?n+(RkRxgb5YNJ*&7%BJW3`O*ih`C4-1?e*CG%hg&AU^eP1P{G? z74CnEHyD!Q%8;{{(q=keoLuU07 zhbZHyEuUYEMi>bljW{!st~@L2z@4ZnrBNx?%^5YA^sy6_x+P6aWsDt$Y0%zyF*(Qn z49x!fB5FMV^BgW@pkDZyo1cQEYdr%}*>Vnk7TMf;m{=EdQbW$m)f|4;+Eq(my6fwt zw3)Y3I`vJg{Kr4G_Gof1|BCrQMIJbEOO(@9^06o}U1`OZxG@$6P=^5l6eJkP5j{>| zpw+5S%M3xIBt}z$eJFvXX<*Bi@+v7rQ0#`EcgiFZqE;Ge?7J$W0~2R#p?mZV3KCV9 zY!{%#YmNX(6!oVcMJM7Tg)0%q+XB+mr3G`|#UTLo4r$m2VI@BvX=N!Qgo|aw4u>HU zkxUd&=&_{_>oC^K;z^)?m@Ka+@TGwpisEI^QT$n)2FMe_SVp0J$r_InyCAHR5~B6` zh~t({&)}?-W8*qEH)fXa2EfweLZTlqAlfvf7~APZQTX;97!1pP!p zJH5?$J~MJ0A-h^_yHutTncp1Z^qdOkEY0pNh&N(piPj_%*P7#h_7a|qXVxg z2vkA+%P}bbOLNm5f(eFL(WOgSb_DGA3kiJCYP9RN>&6r%n@5)b$EtZ)TqTBR$f68I zilRB?_O^h6e=f0^Rv(OeE{44R#9NtHB?iLZsK~3O59vE`evs(xv7a&uEAB81G-+K? zL7^h1a+J6WcjdMyusit-&$~jVkPn8yo6`X_vN`X2n0qB|Z~=D~&kCLBmO)GYgF>;J zypO3(r*x;l5#BhXIC_xNV0#_nt1Cjx|1-<*@}SeZo}xx{_npr|EL zPy|kPASxv4rsWNGrm+ob%u%3@~=kFASX7C7A~c~rQhkeAH#NHlg#%S3XE411{y8@1Yp zF9GbL?jn0>sB9^!nKx|cHC|U$-i%0G>A^Zt^h|(A8C2s{D7{+xCu?5uP#7)av+E;} z?MfsPss5Qj)n|pkg~G)vN(2=G<&bGav8jh)ABY455U-iOGS#SxjHxrcgdU#K>V*M_ zpUqNLrD%-x5yV(s2EQ!A==ROHsrxF|+$vAlbh4!w3;0y+7E2WL$~Luy_WVB!UZM6Y z)k#SMVz{fnzTn*dox=WPpxXND6WJI}hI@%ngI|PD%|S6$HUe~87(t}_^<-cOjyi{5 z#1G<-h+CrSDG7ACYwXosAjVj|t3?_{0~*gp#NLLZtxxOXH-{wn?|pmiO<}z}W==XW zED%An1=Z9;D!exr+-@Y1sM>NKKG@WT)LC035MTPXyzITZBZx>OQQ!{_iBgnZ;*Zbk zRwo>8p1<+{RO>l1wsGP`qyJ|l1foVdBv7}1#hrtNP*b1f@6X5R@@LpOD7<$K!tsxZ zLiV5rv=H^At_LhgB0C0xgdja~Ffx>Ln9LVf&MZ)vY_GU$h%8ly7NEmKJdSTDye$^1 zV{n;q`?K^)OuoyKQ9=lkX^<^@JKL5td~MVSCrTje0#k8L6mIw$O^?VkFtLu7G)2QY zBk8~bL;E^0#_FzJOE+g%qaD~WV1V$a!YQ{!EF4<}(T(BYHjxu<9OA$QD~Ee9<0&*u z3dEw%@6DkiVPKT-raCDe2NVP`jU!l_rtAYTMKOt6GSmqqnCZJM2mv<64-Uq7!q0_2 zAspXKh@p3O3KJ1YYUHW!-re7sM@{&joD!3%qi*GA+m)r{=(h-0Q8$Pt<5-+7E#U5& zn$9L_28;)Zm+Eo^KY`>7si&nT(k5cQA^{Zbed>?j=Kg_4zj9E&QYzrobAh)MQn__L z_z@WE=engiqwq)eO$*mC=& z0vBoI3}8{uwqtcB7KDk4@XKqmgvbpNkWA`|E@HF%JM7{wWbAK*w+kz{Um#u&y;X@k z=};;p6w0Gps&eBAqhvUa*^k^8OK(H?-vL1^lek77m%5;#t}N zLc^pKV$#n&D#Kag5yloSN^j&{FW07dZGQ~v=roepQMuNyD_=2255$sRrbr=(TC%!k z8HIm*{_1U~HR?uaMGcy0i8V|UlHx;Y5*I}GETcl>LsaT~q`^=|r`Rzkf|wfpphRTh zHF)24d&BuOyrxT?UUycAIX`vp8oE(~N+Si;G>RiAx}4Gs_Gv}y{3^U5(*j|n$XHq# zf2F&kbBjcW$!R5BvrRUF+5LkfZImIlb?x@ zY$#N5BJVkAq)%Xe$?CQ65i&6vDvFFx=`#v6*3G4v@sPeF@|GfB*{ka}y%LyW$@|(W z%i5MRwopyFtkjsImf)n63|RJu5k=OH*2Y*7luUebs@KW z>Ru1kK3@qSTt4Yy(B?i(&YQbdqt8gCdV}oLGOp*OQ;Z3wQ64y3I4aNkx$Obh#ES1*9?1Rr?oCx9s>zFs&P|Jn?l-;lf z*3U!c;oGMYAjsTfR@}7>MykgGQW&)@&F1!cX-&QsO*$9{^BXnyx;Hh(rpb#QAj?lN zhi6Pl+wgN5Itg-8MJ6LLo;stZ@`i8i)3`o}Nk{KmUU^2JLt*^WZ~ zV*AvfHCb6qQiYp7b80-6eeUN0ohKfdgpgy_6}dyS6#Gd)@QHw^;&hSmtjG{z{5i|~ zovTplxkqqTBcW;lFmsKE20|w#(&qCgl;UwF^yCNB@r=PQClSGTAo`U9g=1}@(ct8a zwvHOc z=a5+lK^!bJ2y07wB^*^chz=aex!z?HR(ejQ%F$6L!8GEcQ$2=gABd`0KNax6elkKVgaU)+!3iV!3F8uNFf^Q)1eUfY7`bt>S}zdj;%~%EukL#CpMo@) zrh7&1oOD!NTI1=&7(;0hO4J=(=$F;}fbM$FWo>x;V0a^~ksG%gZyfkCbB&gWvcWi2 z)1gObHp5+I`(JW*a!;~Mf%v^8xWBAU?@5m8bi$#0IeO8K4`32pP%k^W8B4gjG&7xf z)U+T?otRV8_8sZxhBWog-YawvVV%_1A=jtY{&%~Wr{d$r2Jf6;{*_MUj~_955sxzF z+;F(&FJr@|qxI(Q=~BH|ZAbs0M57{SdfCI&mJ`=KDRO77ilISA;c5!>MVf&<;H6i# zxlc#i9ejI$TK1+OR7o7czbAy=&fja~nz5ebbh~Oeb$q@1k#PiQ9QU&;HK7*_m%WD_ zljA`}@{Ip*%YBQ@Z6PW|+`lc&AVV3>xy3H}NNH4}eV2D8xGMJm;flRpAi?{B&Phnn z$VitC7;uWGZcA2!pWt_xLR&xn`06Y=0D#+qA9QUg8gwG>I=S>bPg{+CUA6br>#|dR z>uSodCfPPO)V}(bPZ-T+=%5kIAsW%C^kJvsc~yKpcn`h1((Fl?(PuUL=Pb5U}r2qP7)Bfp zO+2WsIKUz26fw|LMs3%AG7Z!c7L^&W^n->IAu!iUI-6r1#3bNwSQ+052OtR_1EuiHV*+QenbP9O!8EMdvReet^U*~(j2Zt=?YE?7Bur;9LX z;WU^?rBoe_J=$EmB*Ze9paVmH(6yDxPneE#5INy^M5K;?qe``j3WEtJ0#soha^%hF zra+a@&u{aJP{TkGgT7|MpNc=V@4KyjCSV}op^sOd50g5Jn!Z@7eg5yGil^Vu7xawI z0cu?Lmd~|K+)ZE9^+A0kGRkR?=r2h0+TFQnjmwHMVeY z5a-p$mI6N1i@>5$`bkU(RG|C`_xDU|up$PG!d{)42q&F^D#!5(I1`>-ig6|W0z^-> zW(6?}X%1gLbQ8=1X(Hh4A4kG|f3EL2C4fBp5Br{{LGbC*J|MJd4LgvFFqSQVNc@;u{GJblpZGP4Vh~sk%_0#YkUb#7basoV8i_EK zvrH%NO{Ikk4Pw4(KN_lg`>OxAsGB(zNQ`0Fas}Op8s_93$nBHZx)J?<0Kkkb67D=E z7g_{YdO@`smgP~O7~h_z)K$4Yl@m>9Hn_-y?0|54hfUrw^sr22x*S&b#ehFk5Q6t>$i`4$waB8f@q4P489lw8->u^l-y-+`vd z3Cw&q*^%wC13IBPWO=Rjdkzk<>Xf!NMK9{KehN7ZuBx*taYpnv@^Kb|6Qz- zX3H+c{0$hHi)158S8?ykSR$g@ztcZ;6fu^bk{1_!^I07YoKdBd6&ET%UB4!d;B;{q zDoFKI6tR-x@`gst_x*QwxotY&*e!@r2Ov#{?o5!gy~S|PfEFCWMhfMk0Yu>-+X)#% zmo!M|jwiygL&gR={z!~U_EH;y6;XG%RVwJz%SI%V2Z8cRR@q#`7&q`x1!usvX5t6J zk4#(pV_)~!U|riZd)&IJBC~eS+P!ulu1S*mUxs^!qAa7r=oNSx-(dGC07MqsXHV5A zu+seCvS3C>XD;k?!*_BrWTS-TeofJnaW0LYXR?tJ&~>!*>V`j_&qEC z92G#-Tlsu78&T=RG|{zLN`)GL@nb-uI2ZKj35u>&E!9yaQ7*JMc9M|2F zDi*51;71fayh?S$;h5Y<#f8RFPU*yvTeQUbo*279IX9?}1k)H))7IDYH2Ir@6Q!B1#I($i<(P z$~#0rT~(ZGPu{qV(}5P+?ei-Ska-w5kpp!;?m??YMM6t7%sYfeI^Obk()~Izpn)vF ziL6Lr|1I-vIEgUw(Y~R3g%t?_lS&717O`kqReC;)JCXavM(4R|>5XUgrlMMI(7 zb;_vL6!egQR8$%zhiJee2nc!?DB#iF?HoIsG=Xg$H&7s=V6@p)anNx|m#C{uZxthm zI{q?49W`bH(gC*fUz&a13BeouV5L3zFl`#hvgEy#hd~ygidRKO_Tv7g{fnUVHe|mdD0-Dnik)YJ`r8t88fqBL#=GxpNn-@cG ze5RfNE|A%Tfl7WFFa{i%;z@KR-?IfP!bIst)ec7xVBi>>vh1y=($Y9%P?Ia%u09B4 zWllklfNwu0Q9LDe!?=Upz7>jnm>PAG=6tMVHEPu{O*55XYm^fZ*>JjXs+Ppth6or< z-<)PQ=8g7_PRpe)HBq?E&xhlIDO4H_M~}5N-&;QXxs=rIY|`Tujg%WISXz90GGu=% zbt7}Qzt!DUx?3eK+QsUL9tXGyF8NYuZ^j8knenWM-ij<#v#F;S(h6(|l!;V_0k}A3 zWKX%BWH{PWLsuonJOHk%c5;%*&8j|l{$OYgR@FsR{S9u!=EGP1Fu|^7)xtn3x`QXV zxx$cZX6FGu0V?VQfIo%WfVo@{0GVkY@ITzSqRP*y1(*1#3T~T}d}uf3U5jzc?C-(L zf}QDr!D++Ew8_ciB_EpCiz4FBp!OZJtF7|p=8TBDuw9j=jTrM>NGC_UlMJDdn)OUiCy<$a(? zXHRjMaIvTs8fqc-(YZ7{^d6?HU$h#mt{8gW7dsiFB?2ZU>>nAFqNvyqk(?xV?_DbI z-H_Lum!3pJYf?o^FoGPuIq|`5f_4}Q&-V*R+!=b$gs0Qy9~7fSvNmklA8{T1 zH{Tkuk>z}F1eFwJME)}&#^XFINg1pZIQ8csEPsTQ!Fes9_hJ(V<+GuRqGd&rwPHR2B z>*4Mf$}YY-(orcdPv`W4{7XP7hVhhXu3<=?X zvge{~pV;&l=Ic}ECg8?QN=)_Ag@ zyMC|IkwW=Z*cb(imED4}Ql-ET5}}&LUwJTUBqCK9K-@8*DB$bi!y?IeC*pMk3PW@x zv|MO^y3`S1Wz^8nS&1J+%NC_f*0Sn{HK2XNiaK|LMDM8H2c$Zd^S1nch3SIKhq&U|pAwU+^2+1)WT_(zQA=RH z0Yhs(~eS&2}DAZzY z@nP0zZ2E9qHX7_Pgkt+ZIpOfd@Mo>$FK^S~ToPvp=s;afFZN`wYjZgXw0pE9!pv1E zeD;OgN+$_G8j~hbtJ3UCoV1!GB)OXIkg^ zReqD)zAFT1*^BhG^bumbg4`A|)YCg=xOT}ubxs(F&ttyuPbc3M7qBmWy~8NGrFS#y zdFn>TRHF~qxR^>QZ7)~x*xQ2OUg-iSrlp=Pi)B}{2ED$weFeP0b*}fSz=g z`|Ml9$49w0d0Av1>4v)6rw>D=;QY_%ClGh#f2jB?`XnjPe$V>g-J*N{_q#a%9-y?5 zj)+#~vIZ|Ud&$K1tuO2GXu^+!b>qhluS{IOU+oam7K5k>c0e;`?8d!?Y9YKU{JAt= z=gkLh)53Kxf7O|1GaGkGz+uaj?;-iUel7(mi?G`C?Apj%yOlUm$`y z*)SGfX%v>VHYyb@^^}Z7`$D^#VJXFXHZyHP=6;#l zEH#&D?qo^sx3mkBOO8uPa%vcc5ei!^kwWE8qH=PXODuG#kbLFVjY?O}anAXDe*4p7 zk3Bwid3|2b>sv89&iQ0km+Gy2%|^ur&%o)kO+v&Y?xCSrsabmTnNy%IcB-EcE31F zTC5A%Gv{XUen?QsJh&L-X6$JHb(fsx?fcWTQAGL!#JMr64AQ$`GYpJI#s+G`T!*Re z2=AO^@O^NonIj9>iFDa)4r<_?;nI|s@YI-YGwp~&xBLm@Rz}PRg9i^aMjL85%Wtbt z3PV*G6yua38xexi?8k9oBHn0K{O?i>fOn)6 zEd{A`D7GK`j^RJjb2c#iYf{XIU8tmrvy$v|tll|ERo5}W0QS;9gnEUL8m48M;`n`RfteISS`Xe(5{;5G zUN7c)-^k8O+NG?-09G|_WOoh;r;=)U>+-_DwnP0Q3<^Uj7Yz4VAe9A1djtu{uy48~ zsXwpZ_N);^9nd)7MlwBp(Q~+Eg~dPBt-mYZ=$Nwi4z;>}=lQ>*aem(QOSwgQ_Ve7m zDT~I7P`Zs=!7R9f-}_DQy4HgEnKC0Z%M{YjVb=>sHzYeDL@w%-w6!gCm0-$Y4#Z_H z^hD&4Q$eY6Vi^>8M`c>o$PzMaLZ$I%JDhv42NfxIKC&P zGpGI21WHesZpXx|0t_Qvr>cimDby7@=niC{|9mC%DI#o6E(9-Nb7e{bb?)wweW8Q; z=tN6)B>HM`#=oX8)IJ$WP)9dqU>|4#u-XkH+^g{|)aF!YX{qagw6xHMx!~+zK&N zZu)CO64AL#x2f34GH<>$)I7zk7?KY1^YxbFZ@7f}Yb93E)(rnBRSUO#{r2MJJ9GJ(ChCjG z@L!5HXwh(Dq8ljB!gOU!Q~!RxrqFCPOtm-qs+>pe@sz*Tp6xI9eBRV8bn1=paBf;K zh}ARN(1BfSmf4Dq{r=Y{UWS*rXLTZ>=uhc}G;DjMs7pCeKUCXNFE5#&UH)RtOy4PN z@0?6v;kbNgQr}QV7c9EDa`JOb2XXS>;pbJSKPn=>YRV6{uLc~as*;wQ3N5#->56i( z61G{QFWF7>l$}f|li#Bs>RS>9Td_#I zUDRFhn+WAlIe=H3Q00US8zRjzE*K9LFS>6erMs0S`b3eCSKk}ot5HnXXs#JOJ2JKU z2BC{p(N0)|ym9=cSFDJ`t_K`I&$2;7gcPh4FujSsX; z(L85n63GozU>As~a8nUZN-%%vv9iEdjgBNvZXxd!$c#dgKYGUsN4+&E7&POS#Yoc z=T>w{ku1?i5#cj-M7A33U$*}_yJJQ0IoEG)0a%&pRKj|VRX-kma48p91yS`&|7%Q` zq|g$%Nt26|1m1U<7J%zSz(uKiX-tiZYIxF-(ZO4VQWW^7;2M9ME~@69B0bJj37OMOL2?P@eIXMCXApgUu!KL|V~~&_y;9 zhn#xc_xDv-X0upkGM&6$ zZy?rDay@;^QKNa{S9(=!UxJ3pgyxtP4i81Sl8_88T42G>73`9$A<*7Lnjg#VJeT!Z z$uo#QMgvJ@;|{umw14%iX-7R|3J!@ zu)=^hDrY0f8+l(H_b!jVx{wxS*zh^J38g6Pdg4GQ)T;a49?d_AeG!O>SwwoIx7@82 zHWd0osUQ-#IYA#jE4QRSkx1N35LCH(M z!96lm%1qy{c1_sQK)t?mB}O>uW#(yCxKOIOWP0=Tq3L;|_Zz+YskwJ9L`;>Ant_NZ z$!c|MKg%&S)DeR$-8Y6$-&_x1R_i4kyJCN_6jqFFjf35{br6-Q^q$MIO6;r`2F`^P z2ZrQMhgzn&H5U=9rDkqpT~tzFy%~ML3b8lYyRrmix|#lP`cosw`-2m56!%3qQ#i5% zeN_Q6xs2s0DFk1F)>&qQ{GGxHJfy<*)vx9LMBT4%i1^*wZO6=6AA0Rx+zY|y#uf#B zGYgE+e&mC7OV8C`G?<$}HMDrY+OcH0M#M4OQ1%PpHN>EW>V&ik9g7|#1i2=L6svC- z2tdh$jwmM4;Om9N!tw{& z(238EOE!o#jV`mc`hh_WJ(&nIs(6j$stS}rK6=b}QTqk*2e?Q|5j-uxClO=i?xWJN zbO~=S69XX&Z>5KgvNC}4C&cQ}_rS;R$3$5PSiz*xf>Hq;eg)yFYpQe8G$Jj}$$ z*PCfReH?oKkSW#}C3KuPjoQP}(f>Zg=${Z-=RXI3)?gDxvLMpXFc4&024_8d6h@}{`iy<>gq_>9)>9@0v|1^Zb*(N#^ z?^uybDc9o^lhrY~|AF>cA(Ib6p_Ks({Zbb zLb};JR%#})ai#G@y_*>b##ZSK+;l!g{=~UKs^S(}c-wDqnyvs(>-}ou+C)0TV>8D{ zt{LcE%Y~aT4*6jp*QW3p$No#RgV6~MtDYl5I+N5p3q_)kF6%of=#R^$cQcIN?Qlg0 zn}rKvP)&H=v&8y9yy$N3?YdX;?2DK)D4Zby|1RM2ZlsYhOUD_N{B8oFv#vNm6%|aA zsVl>Kn5ey{4doUcwZ*(&+1g){v)cAJxLiv%meMMl>sN6v=4uevQ9U&vCw&)`!#Tm4 z6J&47z<;VTnKHZvj@Rq zKf2STZ!NtQYao2qfiIAm9^Xf3dm{0#?5DrDCiJkVvxvQ&-Z}<5fVDaFj!$ZcKbC*5 zY=2m3(2BBc`i*J!0YbmtP_|y%0m>5|XZXQag{&;45=n&h;LvovrNk;LjwrGi?HrwP z`v$MDU^g0UUonsHL-2964}R+59fG=s!n^{crl7MJB}AntFZ9Cr@a(N?bdfnO%OIUF zRSr**>XSj_h~?8il#clP2V#B53IQNlB-34gs9CkT*(xg+cBZK_Syy|=*11EWak)oa zP^=v8kpu#@fWR3ahy4?6!Yke%ZGQ8@*QRw#nN^8X?4qt088~4ohMkDGzsLUrx$paD zDe~nfzpAjO0#@wk?kgX?%i=9n`YQ$I^@-A|d$qPJWkX)?m)#5vR^&JaFbEW1yH zGMN$52y?S~@#&mA?G<;bp^lmQm`mv*LdFF7OgFN;ncESO;Fh9{@Z8gaiDk$p@t^B~ zMbe_TLQs7ZYmepyjXAcA1l5_7`g^D*Sg6Y{9$PF-$_7IbPRg3>GbAJCO}H$cUXz}9 zLt_!Ytj?QIp(7oO;EV;QA-(>VX?=?GZ$nlGpx4ZLVidUj3Zp1b=c+9u06>`Ph~7Cl z^}hS$aC=!NTO|Vnega60RoP%Nbv$>38x_6vznKrWK(bYpoX7N30rwz}RG8EL6>eKA z+dYKmvk^n&%5}cITIMHyjQKgoGV0qWcz5maaxlQYTr>PeU z=tH57FqGijDXEXh#Tpo27}P1F+kA&qo2=_3#|gl8yNQ6aP{3;-$$w|XRh}Ah0#G!A z2F`gj2#P%g;bJBPZ79tnTQrzd>kU3TCg$GyX>*_CT$TgS#|5=BB)pfLLdj&OWG4u5 zeJPXKI@h%*lO!aLal(43PDoLWwhBWcfI+q9?5h_pMmU^dMefBF5EDzI@0*uVHL zRy zsgpLP)#{;a1IC*VW=N$ne@smM+-iKG58EM}PZ}C7>Rm-u%&5rwZ zo3(IUgijZWXePQ7f31pXcn*p4=I+tkPx!3HO+X_XMj)Z2gzz`hX&Bf+{T_qUcj1G+ zF1GCSUG4IuG$ev+TLl8gtB?}i;}){enyBYw+vx(oXuqPssw2oEKX_vDx(mN0x}mZ1^GoP$Qx8n?p)**a17yI;z@GVN)P(#&^CZMft?c+Jb!o>k)?L6i zbSK0=fAtUFIUf2gul~=06Gsp^#omce;Yu%q;_aVCetoz!+=Vv+>;9|w(Kso)^(@L` zv)H@5B}bj^uHRo2V$}?R7WtJC^t&I)C7b9Z=x_F^M7p}Ik90)6i0Bf{v@DfzrzU=s z`<+i28SYIhj~?Kxwi8D`u64c&0CH?s21Jn$seyGeB1k1jIfx852ncM+6P1Jh`?pEMD&U$|dN$ZS{|qhws-`|J0*; z$0;Jc(>b=(2<(>gEh}E;Y7kX;)KWlXdPCF7bp8W9iF@NX(6s0O);2ogMyrK1uyp;mGxzHqJeBm! z4Lk_1`RB}iO*PG4`=VX?U@%fa(xp&nA85NJk^Tp2F&f(AwQygU_^DpUs;uaa3O5zH zt350OsvyodlVN9#Ff>vbYKQOBs?6phE@U%>hFsl1?_=jeCXkM^T<8Rjp=IS6^!^y} zi}3Wg>*Q~=(#tdo;=M@EULi|}@<>*1YdISAsu2wAC*Nt6*$4ve9a3unT8*;-jFLwj zbPFZ7+%)BMwf}J!f3Rlbti^>Qo+H`LkcrVkM&p^lS~ld6B=60n(7wqZwPUR#^5-L~ zK0{nInN~Tv-00}7!l!nIoBZ#F&5|CE-UjsPB*iO5!{;EjB?+!YtI%ZlGa zKp`Dc@d76;I~GdjV6#*!Q?bHST&u+M7l|y9JpF<|%xCl?jiBbnwS7vzwnQRcF$D-W z^x0IF#eQuAb}vLvC*8~wA;3JJs1$q0>JW4qb*^7<%P;J-N)x4_mO zLP;Fwv;{eCrtvjmS?lNyqn9JDmr1ZbCqjOOPM>{m2u18^5^BGxS;<)NSn2wV=+Oi z3epIf4=yeT;b z$|a2S*^o@nvo)QyCe-)qwYvnkX%nZojYJs@uO`cz+A1gG)Q_?unXIq z$FZ^x+OBVWg>8TbBxD^!)CnFJ&G<7#^fk8@I5Y=Y(qmrJj}2IzK87<3M+r%8@slpoE+FXDxUcdq}xO88Ly8vJ+^*c`EZ)^U(y^8 z%RkGO?>z?n-WhJ$9uOD&Lt}@n-1d#yg=dR2BeTYh+sH*;Z!|S?#UW7 z?!ozs_|3xSO|1!8C-Wy?9Q&usL+QxsVL_Qwgn@!Sns}4+^4YOBt#@t)Gj3;<+&5H( zwXQkKi1t(+VTrq7C$cjSEIB8)=q@F~g7bQ+O|9UdGO8YNU%B|_es8y%2%iVqYm(}q z;R|o8)9c#&8|89g2aRRwrnef}gVknDYR=2^agnDQc=x`=Jn66#0TfraN1cu=H~ z9GqRd5^>(!d0g!_ z8pLgduHxr-p4iT^_&g6`7mG0wfLm!BB_KICLtu`F|hhZ^`6q40WzlOiVP+2@UbNhqK#G zHbluA?scSq-&d@HD>9OK_K0x@E(I(bWQl-BMw)C@K|~-4rTl^VM`jr|4$neJ;@ofG zMLVtmuMYJc0^V^HNEIQavaQS-F6)F2wd_-QaI^BYRlo*z<{h9zibcE7p$7mD|1*J} zm59$^Bx~K0K4Jh1oYS%L`v0-+33U|&@{I3;1XQ7z_Z`J>M9N%E-JVEwIaNL*R|@Li zdHu}L=5tNiT!fQM<^jG=x{XTC2Bk*Uy$`u;V}lLu6!ZI-nN@gEX6?`s0Jos}*tmOT z;@;~h0_{BOoeII~{cJ$Yp97;u1fHqj3B>iwWY_Zv4+m&1lo?N!&Z#w>b>!#W8`m*- zzzX}?m)^DrhX8j19v7{~R+quK34Cs{sKTBY=H&3_(}>nH*S}B@Vvx$fmnyej3`$Uq z#t-D3d)}&X?diBmcR)k_@>(hvqao{`4U8ohvM^TZwYFmpmy5(L{{K^Lmc~+t|8%ISEN3+n$@r=-hJ}nk1j)ye-Q#1X1U++8@xMxt=i9A4P zl&FQXy%x;$jp&Wx@xgd$AY8o~c-yE@FAk!p`(wO?M)w zZ2sQ$pa_0Iq;O`P*bL<%^_`9M`^h4Ax$+`YCub?!350@2>QO`pMLV!`9otIe`X5jO zea&vmX6yNDcuUpe978fnFX(t7R!Ww$gE!TTMMCwoF=tS+7tKDR zl^0~DtA|o=GxN$Sze*A$Sn;Ai%ZUZ+*h3am9vDF*rIky^=rAmIVIiZ`wIPOil? zRi0`9>zY&dlQAJ}c8pc#m@&tl^Q8N%Z_`X`M6{XOV(gyOy-S)|*S-l0(;`047V|tg zMS5Y1)fp6V(akcn=iwo=WZ^tYQ;l|Q^ZKSfk4N;zy*UeMWO}!ViTWwZ;HLE@ zAhlE?Wha^y1fDu1oRgHc5UB1K)o7!dB+`weMPHX=t|LU*PznNY;pPg3mv+`z1U>ww z&#Cfag&q+Ng3cCx`*)y1<;&0XHU+UrdXTzgHD0z%0F0Z-yhX0!mqCSZb{rzD@^bC| zZ`gwtHJ4D$0YDz4^+?CqO?crzsN<~CA(g`|N4o2q zcg&l9EqhlSL=}n1mZRt}!vv&`@t?lQT`B5;Y9sF>_1Pv$7J8Zv@d1yP`YcMu`qkg( z4_JOto`vp&m{zzx!W43j3hwgy60dzdmpQMpv}g^3ypo|{pP$qcdwj`Hk_)rfZcp#J;pZ~ zZC$4N69WU>9YBM3wj?j7QObTB`?8sD-XA`Pzu5ZIKKjSJY~7MBcju}m0Hoccn`5ci zn4I!wBWJToT9&SI;lyMAf%N0z1Kq3^JC~CbTTC~K9$}IGRsCqms*Wx#+Q9WbQSm;} zulW+>TiF4SEb^a-hjKg3PrL{&2~Kxst3dg+!h4>6y;)oEqs5YzwNG?pSn#8resU+z zH}CnkA)!vj=d~$L3M&1SU3tz7_xOm%LAeKpkH_P;36`^0;7tvcL zP4`YOWQB(W5G`|V{C_#P8|ol0gxr?q znaI3OeD)vVr~xkoKYVdt5@PvS{*^gTP{uZA?`fC|PM`p8rhe5J9}HU3n<}YIS_`u| zoPRRP@yeXTo9PU;$V_$*av8_hyt|7K>q6B8^TM&89$U|TPHQc@Ig_n47aGsYRASzi zZQ5F#p3H4e#MZ-bPp3gl+bRgNUAhQ@;{Z=!HnIBm58exXNjpv;wa8>UBbix6f$Est zud)d#rlR^036Sr?GSbF#zwNs3%`Uvb)&2(|l~O3A(;hPfE8da9%tt7I(mJXLsCnNg zg%Smk2=G}UNy#5zB%Gc56Rjb<&?V0r0a!;Xd?7y_Lj1 zTh!n_)@mqmveMeMftSf|l7|@1v>o<481!xml&g|+Y_nKCs#I43pS3I_iEPG5D%Za$ zF;)>zd%Ra`rl${-P$(j>mXq?n#)eC=DoHd7Rv{ZmbxKL!eeB#$AeYEfBIF>KY!&_k zb?Pqc)63vXloCEMwYfyD(A zi)^TXxA0Svn#ORr)}sryIrIX{9~pT>B_SQ>xZJ%m+DdBSpHj;{_Pz(%ZZK3k{yHkH zMJi7?LMH%@EQTA9DtBtz+|d zw>uLdBPOUl$HP7u*6#Vu^irY0?7QF*&Wpj&UVsO8;qU+Z$UoNgNtZ)irY-H9%$5t==9z%y6c{#g#%WR?!UKjlgqH%fjXl`_-dVLjlV^pCv0dwg3df;jJ zrT=yQrn9II5?z;=2m&5(bW4wpl0hRCCx3fzSlpvCo6u+(_pQ1Jwqs7{fy<0oi{xH5 z3&3(B=yKV*)4tQ&WATm%FS7$F_ZGo}$vlV_^E0*=fv~e%Hv_vM&1}Qv@OzZ#@W4c! z4IK==ISB&QO2IJQ%#gQ|6qd~579g%Gc>An{ltvved%3S$k_AfEUwt@VbVO8pqE_H` zu4vBjybnzEhOq+mtlaUXEBmXJy3NmoJZ$^NJ!)}3xZS6*y@}|G6G~k@w{3L#G7J-g zD~|GeGgz9NSE@MQ^qN~n(lhaNku11{c%uI@mGtPSXoi=4`J&0=z-Km?LezP=H52l- z5}lH>>&4P;Up5-$>Vi9R4@Xkp+vMvtz4?18^N8Ve6;d*PU*9&21Go3n}YSCQ0k zbp?#ERKyL$kr;$H;>^CyaWCr&QJdTS^Y9D~>K9<# zhE%Pvss>PHKj|095%8d|ktT5 zb~Bqz+{(T%OciHe=#!MRX^n7$+zFnn&21%{z#Dd~(EfRF22)&dKOwp)=EPcuA+x<$VHp2j;=nab z0HanhAR#@kOC(7k7yDna#`f+OhJ87c*-o+IIfwbgyqKw%@1>E|ip{$v#?qq-xVTC3 zxg&y`s~?rS?KpecZ=sL23PPH(S-id*i7;dGpbq}s#}Z#>kc$_q`380cbxE<#lGnFoKlnA;S&%eL-okJCMH zZa|p<7&?15;@z#ZFssGIYECmqD|vL?&wKVA?usBH)Ww$Nbh@r22s;QVNDjZ8IMjQO z&bl2ZeR;dI)XIXH2NtdD={I==%eUIu<$K{-LFmBC&9e5j=PLBgto*0>8l&Vd>_jGAMy66Yce}u%(3XB=7&heQJ;M8hC}Y|)Ssd{&T4eIc>Wz?c+axI z??&6x)Yp)}lZuC~B@;tB7j9mKr(A+AS7+}}4_<#?@ZjgKwN|B9XWKvcsqMGl)(tT; zs8&@p?QCf=8(^CVqz)G_CtzoTe*eAZz1#2B^NXXNlW~EgvhEbKS*-NO-=l~A)*75i zRFbRQ*W!0$y2e=A1`p&F{(eyxj}WfO#oBWQk)1y^a!#JU6HM24&_mK~pd%_h{!WSU z)998f{jTe{1wxOJJQA{jRvJ&+N{6!LdLFW6ZvC&056noe=E!icYt<2T3glch~qA zc&x?z7Ki`&0akhzUv-F&N17bY*<7(`!yXhNNt2m@|4_LM(X_I%@ z5>87VphZ`405ZefErO9f4GALJ?q)o%PX~odEiT%L$}JRU)}%r+Lfc82-{sMNFh%?e z*ib(02&3o!!RVkg)(^aVTV}Y`}`&|4n3#9oDMK zY?rb`sxje~Q(iy+KAFJrJ1(bH?fAbM3N*oT)<19nV8Sk+js**tSJIW@uH@q-J=PFI zolRb!ku)`v2jRVTlY)9Eb^tKVAb&Erc0<&U!RvMDQGy#Ix(`1ptj027p(0P6*q-K} z84y^C1$)ZXflIc@obF+6t(2?_+At&lsB2v@k)h69N1gZjSpel8jR+0eAOi-xOkEsq zd7ggI)S819;RlfmnxN^juyM+q_=|i>0Lqx03t(vVC(0#BR?<)QJo{Hwfknyb8*1ZQ zKt}66HOYK1XbZeKUS!iZZPZ?M))^=OfK!z%q-I428f-59bC2-Qnbu?3pdNlFLF3)g z2CXfKJaCsqAftN^K(!oEH`VO`6Qcj%v(;Xm=G%u#I*;AD|ldAp~+Tjo&WZu^6bUG!G!b9ySw+9K-q8h#qBS69Rr<=_I>rDd$CG%N18G+ zN(8DK=1zr3?mnm8Zo3^}dJyfAu-`bb)+kD@iSs45+3kGqlR^KM6?26>kT2?*Ph;QM zlON;#;)^^Ey)(h4=O2gf+tTZFWZCBPJQT6?z< z%KYQqTZ>sumUgcVa(;BgUR5jzD~C3N8$O@`{NmxfmN*C6<*@R9wnz7(O zg){A8duzPB{)&Lic9Jt;X*@{pf1u;LaUqnV;r5lH)=DWPbQ5*n`_o7aYSkFDKw|Km ze0Z)pqs8pyy9gOV9fUiSn?a(K8OZz-EoxQ}s;zgR8Hr40BoTvnvN1w@GX1!v1%OT* zvV>h?wj(-&bZ{#?z3oH#ah#Y44(k z*OP9i#Rno8g2t2$xT;f(;$@}_ELq>Qgd$?n5P8)&>7YSZX@%&6wI~(AkoA&;-?hk7 zxWDCLneq(h^RN=8UQGgJ%E3Uz_TkU!dvx{JhbA&;>`2b^46v6fGdi2C>=bkMBWCyQ&Ab~3n5R)7-zJ= zyr&)?D`QT+>^lDM`R>S9e_P)TSzFohHo*@*hPo%%uVoJinjH_{@}J$i3zb#+md`+Ue^>6lJwQef+g zd!0``wpD+rlTb(?n6#D43jB<(lq3O19tiB5NF9a=3i&Y7eqF&1<_y0N>1D9u4iX?` z%3`5x5%c=oAUQxE3X*aJ7A}TKHUcEdfy<;=w8OmI+xMpre#63E9;Ml5bP2rQ zv4}-YKX+RyOBSuEuyP*xt$DJHOc_2}qYP)1jIpp}5P*RYu45kQ;x{N_;gMW{3%jRF zsKdKt`S%~I>kpp)ll@6)V^RyukE~JPvE{6&ve}lq$IdC=L87x=rI^2NJ##T+t()9= zjNh&?Qtf?=5!?l?H3pE1$riA!JTh3inaA2{tcl+u?PqGqw$hseTBJRg++NHg)Q%wH zhs%9l_9s#hB+tP7OLi<6JwY=(=Mxh!nI!NMGB;rO3LkvBQ#7!xNCj@>%guDg7&y)d zsoTUUvOrprEqzD!2Ea_v?#N30h6Gc%&4xC8{iG*6&jKcQ`47WSkAIdlt6jZ}y^jVw zvg9DY3c4of@c5vdxpMmAR8qt(otJwt-^xmA&%93g?Pi-xWq4-x?Zk50#bsl7kACdg zLKPFeyf;c@EqxW%RxXpAkFPDzbdgf10UjXz0k0kgXq|Va& zxJ16XK|EYx=dW^>U+jJv+g~mZ%h*U)Vjasr^c9y-pEsOaDWzrULHtXm@`s8VoZ-(F z`__~j7N8$1T<*zBc_oD>8hZLomX&-GrybcgUyT27e$^R7%{m$5)pURAOk2#K&lA_T z($05nmwv%JpDrzXDoQ%Zcfu=ej@o3-V~V1e9oS&O`_)|`*Xn+@PX{FYxzS!PUG(o% z_XV|F%e#+imu!&TL3@jCMbHgABO3kc*R2w-%-(vMH!_-yq!5YhGvLm#z(Ol}yqajI zTp0&8o3K2b$Y|>_FB#2PuE!f_?yG5u+B?T%0|}kh>sNu(X?daV%e>vZA#XAa37Wb> zR7U)83)~@5IZS>jJ2Y=naAd#(c{C^pXlp!UIr~s~rc^Qta~xqKOP&m(Mg5{98E@F< zy&9FvPAy4IkeC)0ks9n`AA9H}Asx0X-DYV`=3UCP0J$*nE%?N!>1faACluPDMG#}u zfYII@@p3@>q9H}Tzly8Zte-=bd)WF_AaT9O_w7{>M1hux2_oRDv-qff2RvbVK$9?L zzU^=xsFmPfBx@(O|N$wbn?SF zn`mked7C^T{zefT)cdv#lS&(u##tXf=mo@1?dafY|JmDlFB)6d{NyuW1z}m`PHT%Z zw6D|fOd-dKMnSGj^zNV=8W|I`WLh zqH^SfcC&&EN?F{8`PUu*@PN&OZPH^tNzMO4i2Z?T-{Sp(V}~QIt#+r~5}`D|TM2vU zdV7s8H#kx-wyapmxPVCAA$Yw&<;f7Po-}OdK-@<4;ne8UOz;Uf0p$=Wm6G(stsn&@z2V1|J?(~&A9HAZc($%`# z48L|-S-na1vA!@f(aLg5<4=b>m*Ml^K-OL3;UOb4TL~}m&kix6uu0>wqXtyb z%Z6vp(Lu4?;65lL?4%VIq4DRx4gDIW;;tZ#Kh~oL%*tNf!*!wE%|dYXZZpYq8gXvt z9C#s!s=Tiew{s&-#D2AO?>%}!*WPls)y!xwOS$;AI_EB+4eU~v3id!9~hrORf#C}ZiQA|*qCP(V2e$D= zvptr)W+Rjmx$E4E8+C)D_;VK1zIx6n?!Dk%2Hb$7<8xT<_?c&ox2GA0Z9M-Bj(16^ z82Wd}!vi>)#y8pA&)6*!vcEt04jueZ)01@(K{Eo#5I&^)T2LxZ+uQVqy9DH$B18Vs{mJmbuWCY zX(J(?|0wKR#D^qYS6yAff-<{U>SN%hmB2p&I-f(1Repx6p~XuJ_+H5uv<=Cd+Sgk< zjQxV+XO~L&-j0`wMR^GoM}6dk^~*2Bg(`vQW2Wak|0xmjh0ptBj$yJy7jB^NLgPSo;sJ@c-i?ZCOHAsQrdX zNa!ZeGWwmQ&~VysR1-5XURVI;|Dd2w1&K#76w(>7?w(N{GdWmGkmSfFO5_AFu4o&~ zZM}14B}K-tSIv$;ciK>;W=91e{ExfHv=&e}r$MF`nNqR} z$r|%Rq=`6J`3Q1T8nvzHo2GBx-0_ZvUvum{04|d)2en(&2DaihZ6Zl>PgvE8! z`q+B=PMOlhe9f52-^!z&eKbt#2YhooRTB{V>2o?%2(gfnsBI#DO2A|8;@u47r_~> zaaz;ynH$DR@(%P+$Uk;0w9^=inqx>cBuJBGAOvhlK?-zM0<1HWP5#?(GfE9iz;7CqHK8^(dFVqJT)H=Z;Dy%ZQBPAu~SwZSv)%ZrgX+y(r& zvW>$HTSZVE8(*T7oi2d&xrf&YcxE;;$F95@Z}Bn1m9{_c4vh}|arie*Q%lR*&eF>- zrI+LE6-u)@E*v|-PA~_N+X~7%No`-cr{ST_bx8^26z4xjjx$Y63)jdts1-E!GGkTi7_r94KkwRl-b=`@2;8ps=AWGTUTx#JN^Ad-gw(v=ff-xVCQd5&l2vz&J62{=k}r%q#GL*_m64D zc?piUKp#jLzYrs!705!HraX}^CqXuEj=Z4nA+G?xlCOdCCU1In^l6sHy?v;56J@IC zu^5<$cG{9~ju0RaC)Swun>oZyK_G4|A{nE^hR)x)sQReJ;dZa!Eb3z!iUju5(sgujyJoeXPSvjB^B>>>GU{OhtBzz5O6tm#Z$LK?~NeTrAe=N zS>9ww?lRuH!nMsTNjWfT5n_x)Wn93R#%ALS))_Rpqv^V5fH-Og_hj^LRlpX zS(%SFWWl3CSzi~aeLR%G)tAKUB$G;yifq2q z{=z(CWstSN6&$%WmeqCCY9wl|H(?U6%l&yq4QX7$sd*bHM}&HVBoC@;?P>TYr4ov{{!vX|IH$; zchNX|5uEyO!+#a!Dn`F!J zjtFcR{qv?wumGu51=*c-+pjC~uC_RPZ=g6Ecv%7_XmO4!p4v<8P`#D&>7m@WtXmiRrik7BlM*nh7Xxw`_;w14q> zcea5k|AX~RUX~f6r}3x%px>}OtBA;X|G?Ea+!8EjIml+IFH zC4Cm|x^hyu`dUB1Q|B{S#tm!``HG$vXAV9d3$0K^kY0{Z1Uu!{SLA-LpRQogG9@pM zqu42b9W%33&g#&eDSGknpiuQu@Y(;P=-lI(-v2nh*)S}|(3VS^`(?CQ0TWW`@-GH~u=c}gFR);mr=DWN`wcUQ5^HBGK1X{hgX2G-0 zFQe>%Z{w@IcHP5`caJT~guA6IjZXEP5Lv115!3&qbI7W@F6_@w=1lep%BR$i*S=3Z zTAZrWZx{R4Oi*>kE+njX$h+2q9tQxY+;q@pga#jdU(-DbPN>~?=&{DR!8I@%M&_)MZ#v6Xy29+xg2^Gu4~g{K~C)0CLWay|9;8`K~4YACp<~s=RHF)L1`sMzz5O+g=T=mf(8XYKP%{ zNb0$^e7(VK$SFcYXa_!!D@kMxNgkEMG)W1GTp#uQjmXjp8lT!HmdYL;LP?w-S6p-l z(cjEBLs?@i{LA(}CP<60-!t>Dwa}G*>6|{&I+)Rrc1(0DUFwo%fWTQbL89Tk9j1v_ z!oZ?VM7rg-Mx`T4K@(yVha6ATXJH z+@}grV$Fhc1;F~9Ztcg6z7jxe`t|oY073_Nt)~;%bPAQCYp#>Q<+kKVPFlc{OC$5h z>6L0^0+X*?Nlv4pFvkY)tkV{!NE9S6UhYvfv$&(=z?2I_I;&i`j7BoYUg7^B7OBNS|Ih7Ff=DD(8$(bKFrPrh zAQ;B7K*v(A_pt4XJiE=ZH5W?dDsUBxPiaH7K}w#iQSxW#V?miczGWM7ddncuy37UC zlGu+;xtMk^rwyIj)%WiKQBDb7I$kNCat*CiT#vTS$w9>MM$`@5|E)mqGGykF6}AJ9l=99IL=Y=bpF zW~W#N;ZHP}=<}3HmO^ZN^v5_Bl0^r3k^n+n0h9vP^c#Ci8|dYlRmqPci=Ewr9nH?t znrY_ZF<^l!{f4>3Nf-d?J(vTe)fg|4W*Ib~w!u_aWM@8aB^wr(0vd*xNv4fadOL*B z@jd9qR!$Hqg=%zT?#P)jL8?gR^U{F6-m=X^t7PGX)TyH42=}7H-lW|q^T+dA9 zp9`8THlIqh*R)qRI2Kc-v-@9_)+M$4PQNu7p;^ZztiC>oej55kpb#`;(asF-!pMsy zn^stHTx@%C45aS!!i(yx#?nC(+^T72pFCPC@ujw{qROnsPdWHpGe z@5)3-v1di%HN?C&c>?LO=PnQ|S!d`e>JpdU5~?DMZYT;_MX28*a;;(AveELa{z(nW zgRc5qxpqrZG?5~d=_7E-F&-Y4Gxd`dv4rX5TF#;+=H=gD^mGZF`PQT7M(9tVw>f>iaNiMN8yQ;wyPryhk=8O;YK3A~ zOD0Z6c%ebmE6ydfAHP$mip*%OYr$n7xinkqqb8l4Vg`rLhm;~Ex0MD6FDk(gHyRM~ zNg{0i^OlIK{}jC}wt`MLI3!b&p+h!^9U5}lj7ZcUjQ(W^MB=zY5UtYr14Z>Ew6L;3 z8s+pt;n8_WNGKO^G#JRL0MSV0MZq+YjK$z`1ZIO0l0?vQa_vC^bRL=&kaOV7DW(AY zeqDz`Hf@3>u0|>OB|}l862R=V|G%VtHCzowE~A!`8ipSz0Gq;4Ags~NQh9i~QbX!n zrpO0z>f(!y%n1xRlY9H;EoGaw_>OSeI+#6xhg$?RPT8L-Xq|Qsw#m*)no}ZNH1gvA z2dY+CRU{O*Q_1=>xdad^`Jt_3kb*?ecMxs)3TII&=rdHCUBcpHEE5IkrOojl5=rY+ zND?bZfg~WZU|xw^4c2wuyFwbrbhQRcG&G zS#ft%8vH%7S4+ZmPAP-SE_P;_(~^uxmc~~|R4@T;MWP&5FGFH%&wM`+?;>uEuwW)h zoIa?cYad{T2Y9&*rGZ6|b+b9#UN0Ebd@*D0P+ZvQ{dk(d6nLC$2-rHhy*r&?dpc4<^1Sz=r>H4dy22$ty{;zQAihSINI+Zm}hFJt)D{P6EcQBQ}G zkTGo~?6M38hffqJN~Zxh85V|&9+K+N7K<)y1RG}k_4G4o^tfRpYIij)zL4hm+T;63 zKu5g9)<#j#3R!2fL)@{c`I+`YcxaEoYKExzwH}4WlHS# zQAo2Ip*eyAR%_hu7u9d#M*|A=AAUFfVBPu_^Yd265rdUxbC9(GIenc z@tb80k(=P*)dV;H2IdyV#^z{WJzsI+KPe4zp zo%neoQs86G2e^@!hsW)pq^(@Vj$4BF-PYxo8_Hc<$77pAZ)uGk*CL*7D1fI>A2;}& zwyCV^*Pp8R@TFt=H+i3kcsaS=s2}}?2ppSnssOS8CRAE!o*o7TP8Ks-UTcOUFn#k!)1s z{|z%}=_MP{Uni6c(PQNZALWua zm5)Tf9AT8^SQJwfEjE`u+q7eyx!QTsxK+Hp;3+5rB{TED_=YvLq-W-UcWAOyMa6|` zQHOCVn7t?!{j@+Gk&UT2{jq3;r+dC{MUc;@YjTWIh-;x?n;>V;+l=Ty+kTMlnC zE^Iv^?R(S12Qbi=SBNX6hIi!BUIp-NOoNR8CXdL+n@iSQ0SG89co+THF`)NGe~e5k z_!HST!pO2n!&V!el~alNOql$Y+|D;MRY#f;#Q-nL*@`|yeCCWvd_xZ39Q&C_1Uj4$ zi?@|ABK#FNBD;&$PyYP;4uZ`*uK>Tl+E`8y2eNdf_@7*XnA^V+Sf6xSUoQh^6Yw>p zu)h;t0!QL6H3+e!aMJIjZ=)vrFNk-8D6#=$=PcEAmm%;8OEP2cMCT=OV>J6a{CA;W z#Mv8J&lpht3h}i|JD1Dn3*$Kwj>rOccE-6{ZT}h{<#;x2NFB{)eV|e?lHs~1LPhZB z1tPrtD&N;P&V7(S@v0ndLqkOFjGZ({guY1%QdRN_^fW)yG+K(2&Yb;;-a? z40pVDT)%VkE!5{lk5PXRGFwR(k_*{USO*EViGe{(;5vWUoy{_{7zLMO@T3c^+~ZDQ&TBy_>$0t(4599!zP;GvmuGtu&hv*?=>^2;?+*g-ju$ z8W!mg_ph>Tn~(cH>lQWb?7wK!!G4N@kE>BM@C+)YlWOwT#l9TR5D%08F%b;K?=6ET zX;nrHz4#8lyiv6{B4HuN4$Cd`xpqw*$Gu`OSZE@$1!e}t07n|AZ(JQ9o;7J8ffwOE zTM{P#o#4(~1@lDznipF>M-rA)27pVPM6?`M#Qw9H*}%wVYWTQG*LvNelzkwlfP<2` zS(FrmlF3-OZBG@vd4@u_$c**b!92Tr-osW$e*9Y!5U7LZEQo<9Mm|IlmHao;m_rxq z35f@~o@FHYx}pnJ@3Hz@Yu<^q9Z4T{_*GdUFgln|eW?M`>FA(sh_VDeF+3s>Cr;%} zJ~_OXv|XMS@7h>(^kwwx2G4BOUvU>6Z)lT+Z@;Pvp=H)T+ZIO{Rr``thy~LTg7K}l z0GBbvYuaOUxI#qL1;PKMkhq`RXb9`5QH_&L)=?Jhc6h~@5)8aP4Wh)#LQU^3NczJs zjqdA#G{8!+pTorjJc6s1ePE^eV`_z;!-x-KIv{D+FB zlz_l9o0PH6%uYJ~X`JtigszikwVM6|)%K^(n?Lf0Y8_LX>e7)fnzVxoX9?)EB$MTnF=MjQFJnS zCg?TL5wdillFZt%4Nvj2D(H!qyEo%cx?3YN;Olct)B1^m( zegj7(aI&4GnkUir+9n`STKt(IbuQPBC=Uk(;lkp;$A%BFeElB19y)^0XndtxmvZ+7`E7?P9i3W{X zY)5l$UI^q5Do5OKzR|o_>PDf97Hg{s>{VO|^5JNnCPI+zDBhq-j(HQ-9CuPM zd0G7BEwn?LS!o{=Yjo$&(;0edgVi>A$O6g(q#;2cfW^SdOCo|@@)XgI;9H2DUwdl? zod_@|idzfgng4;bG$OJ(4$N5W5n!x)NHgCq?(A}1`xJoKHX|7AjFXw6`gg>NTw$~U z6nab89l9pb55G%2Qe^l^m}E|XF}vv}+ZEtaw>%;g0)R`F@=?rbCw3&#Q`cr z%?JX;H^Yagk11hUtP~Pwx(LvIWUd8wUt*Y?7l;(1&c4}p_Z%Gb7upt%??+x-mB4;9 z({`2fsjdrP72H!L8-|M=jBC1}?3eE*D+cE(VV19+sLiNs4?ohP+7Kc+1x9sR0<~|R zI6;<>L_YH$=*-!G`vV{@a1dPJ?<2BEuKU|{@Nl1S4a4G3Q3gH!y=S2mhzMpcX%Rv< zAz7W$=rhkp8WqP9Wx)iNwK@`SfHgy`%fsaGzgR@0OagoyO9QwkFOh~Rti-+;;BgOT zl0;zH3iDTFTI1k`_qLeNjH{aiEpsM;jjlOhS&B-kG|3fLnr7EMi1&{;`Ewy(b1r=F zmYf93Q#kG={>Ltjw0vbyKG=pYgp?Qw{Kn2jQTBgn(y2EUd#mb@f2Jqk#Wk|;m}H-7 zI5hux$|mMCvg)|h%x)zgh0dbG30!xYN4f`^IN)U_=(MV zG-dFGewgZ1i+fRGgjf23PlbgA??%0cbtqk(ME%d&E#Zp6;jQ!szeBlt$;l%M!#J(T zA%$k0;N!kQTcaN$l;=-Ak1)`&=QLUvgpWSAH-G(Z!zJ%=i(9~N@fiP_W)pw%h0S=QG`MIp($6{L*^w^?<4Mo`e%)POqALU6Z%> zZ|q{6rR~-q%{8pOd2@uf6XB-4dY2H=Gxgjf%946J{PpDvfp0ST{)!*|@M-!KuRhV( zDtJq-4>aEz7eN*c4d*qs3&aHOw16s=_>v8C4 z(g^mJin?a@=VF@uf1vttOHHKGe#FMO57ks@8VrZq$cT3AtA4gppzJScK^-m@NSDuk zthQ16;MMSq!R*4pk$jvpa-!25LT(1K?4NZFK}>kPg!FQ7!D?s&+x-V;LfkcFX;|BI zBr`_7GloqmWZ-qtGTr1x=uqUZv5;5CYua?kEr|m(9|2q&UT9FXw=>d?R%4l6S( zEc3Beqj(2dIysa613|X3(_;BHM5L#C;T?LjcTNgtk~ARk%}nb7RtU`)U{x^K_?)0k zp};u)Y*)S$zK=`mpS?MdPU2etFW@{%(*=)}VUiUv`!>+cIhB}}SW0KuX|mb7G|JiT znhTBFWrpktTV{;JB`zI$xlf1+VFR`Jekz%e_)~xqybF=I#%84w2?QwOXLaF`LnX;jhYqx~yq$U#aXerZ4r97AavkI)H<@u!cKxxeh$ z$oK0+(bi*E1kCatJFDLDTh1#dE*s*3dmS&9j!+up01xw$v1*A^l_LN*V_Al;0mRg- z8(L8zASjTS>&_wz7MrWZ$aRma#Tl6o?W0+r@#W4gey@(?ZC<-9$S=KrN1XD5>#-uR z?(5qK6b`GaNEGotboS~xMQ;$DLRuF8SK?AOy(?@_WK{S@5Rlp>0a?9c428;|K9qp? z_oW*qVDRmKEIVdR+f5m_0+XfHCb94Ow{lWkFV7eaI6ia6&g?BIWA8^GFtRU=V7YjHMV* zv5|v@H(DEIHSYb=h1m6>Wa+K#k|`=6bD;{|dUl36kW%xsS4|V(MJe?d2_rz2yk(gI z8&x03?djaeYIQ=u;NJbswO;c=a@jQgsQTZmLLr_e^hmJIyv#94dLPo|v>kdVr+&@f z@L?{)QQXnB>APxSWJivTTYry{U5ioF8D#-6O9#y$pCd_!9t1?-5N=Sa)^x;+lagml z)1sy&?GWORFJ3u^cD6 z(4pr$D%zX(US9W=PyOzElzrc#d8~ghYdc0(C>9knRjN`sFAy0p`qP!4`J2A#nYMaX zNN>nSs+Nbo~mZCw`-TY(>q30nF(p6{liszTQ3J> z?)Q+Zp`GNqtqJB@MzEl7NRwcq!9Su`Xr+g>Ei#tV@b+$CvISPF^#b6Yhb8MU?ggtQzh*R9f@ zpw+E5X+Isi#oM?4fSBKd_n6{w`HHAf{v~Udq+5t9HGrabM;|E!#aXm>*c?Ep*`C^x zfuNTHm$sFAMG@)lhC38%4g5c(=kIW>kGjTgidcXmHx5Bngsy!k?SFtbyh&Bs$;ulF zQ6}dd12fz3YOCvI*#IbnN4=i$RoD`9b5Z;|P+KJklbm;v%T&eNe{MEA$lzfyx(2F! zR!5Cdq+MX7RfEh?#k=X$Sa#;+_honnFw3IQ89d315&+e~SC$-sAS{R_smC;|-5H9C zTenmmq5-QWpYP2#1LD3xEFhd$i7}-vE_q#TRC~tJ-qCWZTyxUaz8xhii(rrtd=4lL z0$j3SD2DZfl_3PU%<%m@i~u^{-s{p2Bq6Qs1729bL}+jb>h~~nqgoqbf==vzDO6qOUTrp(xU*kkkGl?o^%cuXqsy1&+d_`_NJ$3L@ zT?7opw*a)LfPa%G)v*lvT+`!uA@RiAmwFamFZRY9&>A}fkmgn$4LAF@A{LV_^d!P{E}`0D8F z1v?yK;rj9Fv4J6fCz-?bE4gaI10EOl#XNN@)(L@d<&&iv{<6(s0BvM`4Qku|6?sfmtEA zDA9$R4c-=G!?px>1)K1h(V1!KEXEXLp>Qu`tY$q5B{OC5x8sWTcXBhsB_HgZmx4ctZ7DxP(75l{e>LFwf%%$sjA+}v#smh z4GERlTRyKl%qn`sEUspL&iI`}=g`}N`Vw`P_O8(RrG7(zYAJLvZ$q&?&hL(@K|@6G z9q@SK{5i?tma`XPpRK^HWlOy%$0J9z-FDn}o8(S-)g(HdKo6CtreP4wiw* zl+rG&1;|etqlFL@R?;xC41S7=BF(ju* z-T>a(BBSg*yp5|htnIYidwmXhqFAX}y~U6jqZMfrjDAfI76Xqg3Kjz z@c zs55K?uvF+TTJLB6E{0m&JlINM~D?j*AbV)b@MMkIh9^(QPdL@x!fUZ3Wvooh= zKi!dwGk4LAUWM6Nh|qQ5ldrsj5gfR1DH>pNyd|T8Vu|Zozn=O= z$b>&GN2Qvlp?Ha|tNv!?p8Ma(zkPI0f8nQSCmV>{3S-Ct{1ay{v+ZeCAUegXH~VeV z*=Q=|hmv?Xu*Kz%2VEgqK)C`EcMcW^!AQs=ped1D?wvo-^}!ifQog=vF*)iZa9s+> zaJ)j7)JDf2$$O=S8wacd2{Rci05>F^W9MSL9#$nq{tX~JibXdifKeXUVpam}g}{nd zpimoXJ8;4NQ#G_MKv{8XKhmpd`_uynu#5F}8G58MMBJE2nSJ1EP|XQ33}rDB*MWkm z!<%TLnE6ch-i^>IxT1=!kTMaxASe(f*^}}W`dX{0BQ%PSO+hd4ca*#I?%oqIT2(&W zgj|pQBBX{TWMq+-$AqJbe7Ta@NkFZRzf578&m_gkse!0UUOoh)@i4A{B#hho+~=Tn zl(K>KR9PJzVXaUZqo=gDEckWnVDHRJzgiz*3lXkFMri)1eOjylaf|(-U)z?=KPXrk zL_0q+M(PVf)69XzNz@k}e>(8?Zdmiar`v0*JZqF%d*0KrXgT)ewVL=iTH)+}ol-DJ;P112)EXEotHrii* zT&+_WUm6!0xmH{@9)?%S3F?ULv&N~5yXc0|G(>&UQSp5Z15VeDZ|rIhj*Ua9Y&={d!6I8+ zrb>4WjMY2%Em=no6+_G*4u_JJvcCC_vY$ao_wg0Y{<;}lE;dc zuWqkA!N9@l*jUkQ)s&%7d?STvL#8TaZ~iWBb%-^%{uZ2iwRGg>uAO`-M5DDWnKoFE z9F1}7^{6>Lv~AXBbf;t>Pgh!bRS-JQ&1`=0?>!tG+IPkmZ2gvAdzjTJ!=Cu|INGeP&`t2+KgSw3o;x=M zy1)MCa!1`1?^#lx%=8LlHHR=sA~|QX>En81a~vR@EJ=_UK_vyh7$(5^fM6YN_D2zD zwGt;euSn0dKK<<+^|-Kk4e%;Y+9v;ouz~E}g*8wX_=7qQSOo8|0n^Ey?AkP!SMm@W@a21z@aPs zpDMR3IctZ&euW~@ADM%0#yDUNoI@}{VE~_~^)b*dwP3uJM1maBhSN3^>E$w!Vf)hK z*rvl0pzxD=wOwN-?Whg&p+EpW49^KmSNy(yeL~k9_NI~m{`g%X4(gOG!fbnTg+=MB z_W9VaI06>>%HMAy6QQ!LJhU2^F{B{cKf|>DAWI|zTur)0date4 z@aqUSud0f^abv}o>v#ZY0%9w`xGO9uR}CzD`T@*I`67raW!(&Dn7sfisEd?ZV(zFY zGxW=;l;P9B>nG z6O`9mX>ENh$OG4b*gj_i$SM9lNvF?Zq z@9cMxjP$BWdtUz^=zMeSR`am9=4_ZoKPP{PC$A%@S}n6r)CRlgQLH+zu$X`LVt0e~ zHR>otTC|G13wax%f9-HYZW9w+lzYRb?{zKbJnd4n9Fb?;CFFMR#=DXDwGp4>6;NwZ znt$u)rkBiSJs&~;2@1_dR4B2F?|fd@X&Tlj@9!+|^{+m5L$(=Lkwu@ogA>J=&0PGN zTCpg-Wnh2%7ltg$Tf7`WV*N-fGJ<>K8jS>`TYLS`!Z*bzTY>Uy?QI<+%X(jhY#SE1 zO`i1y#(49rcmS`m!|2Wi6|Pl;hZcMCsU7^qrL>8fo<+n+Fdo4VAuf5nTc%T&_lU? zqxo#gui>oUse!~Hx=UDyky{1%3$D8%l7mx8g<8&lWN#(B(8%5`RE$$Mp8kC*Zbs8B z4t?o9Y8M~Rbfi7bs~7GEiEGQ#xH_q^(dm+D4)M&H!o^WV2;)upvG7-n>!?*!H~y6f zgpnw6h-`Ts#qFDgK))k)j(x))@6&iN5GaBwk>1LK*GuYQq}rE7v@FzQzSxr6TAL*$ zt||NjaC_ua%(5RRotl|4I+Wm~nweP+-Sq0{+ZvbahCR@GPWPy9>+&WRXeKXkRdTm{ zhg>Fug#jEmaT4A9;rk3o@D9DOLioUj=p`})&R0Vk*)_B7`!>E#CcMN0*Sbmmd8C2` zw{6Dc!SAHXxXJTG1b-RAz(K!#a8k$h5nrJhjKEV>p=1VJ9r=&>flhX4(f;&aK7fKm zv$RBoPs?hsK0t%?4Fo;&^Df7Jg8ohm#{a;ZtE1Eg8~kdDE2@-dFYYf3yB^jS{^!T4 z`|CP~3nz$v-^oH(fYJfqjdYCnz~Dgm>bck9W%RJ$msjmd#@js;eIG4fIZs3qQ6G8H zUnk>PDHnhWSA`;fWBPiViFQ{*khzD&!H9!UVl=c^eG^PuBcLZSuXsIs3Cg!Nw1={h4bwbVT~?E0zW9oOFd)Oz^y zU%UG+f2_Z$cW%D?=W55PQ-7ZQxt*w*6t>wJZE#GF#Fy+LLBs)Kce}zP!M)sVCNSGu zs`GiOrpJ5l7q1^7N1_2b%jK9%33GKWAT;L8Hxi(j{y6F7D}BI>sfkB3VhCWo_*zEh zCCeDpuTwloa;7J0r)e8Xy+S(we+v0CWN)2?soItEkaCMTSR%mv6;2523(TZqiwP(p z6^oX4CmYfp(+B3RSORcA@coE2G4eLwYh~XGMqWP*XW2iC+9*a!aP@eb7O}Qr8nIzG z-dDsj67{Qet**Ar>n(GmjrFE77;qN{WSgp%*#|AW11^o+G%)eG*2N>A40>Wm&iJfA zVpGUl(1!^Rf+hzUYPJA$gCZ-1(kZhNUr5sq5HLy!qD}75maos=0iN9kV%x`q{pZ?O zFP!?b^UuD)R=)-B?jkQz%d_YfCdcBTK+AlQl^4l@-hUs$a%sh`h%r<76w4QT5uWF*Q782q6w{Oka|$YJ-$p3=yL1#nPWVGTWc$E! zOS$G+@jty|AAOE^){!$k1#gyDs|t%!`kYteE`%XEHae7YyJ8#c_4*usZM_LDJ8{dV z;zY3D`=#rj+oH=L@~P6T61Za-X1wn89vLymPJvRmxc^Y9hxnZ+!;PK*arwpN;Ua0; zwssT4qg+2~`OzL_!%+L|Lp9U;rK?f6XRVrEEuwy~qApjfIj2@(Kb&p-_1Bv=+1>OK zv1I|tx5M=a&>>w&qZ2_vBnm9%g+pnKorVuPdiy|3m63&>eXk5`uGu&5JxZ2?6}KW* zW8d#%tA2}xZ#p*NGp)~tG{_u)%x7asgA_3g#SY=YauWT;gkReo)CvBUKV#Ip>gMD`A)(w{}RNIOjP&h=YrhXWU>-!%XNi zMZuYs%0Lnh^dNUppE=63URxm3+6-}y$gn77QG${4KX!ti=^7?Nzq`Srp8YXWT*C=G zHHMfz!#_@m_Txe5_XmUZ{0tH5i71uxOqhHZJ)vdu_z0#;m{4rHM}~^4a2ADBDuQkp zBCfgi@a5$*f`+%vFA4g<01w<-BCpZ6M=6hQnD+S?_K>QjNH8r*k;one>j+Yqw*tg; zOe36>vxCL~1_c@*{{X}jYTwrO4RiZySwP-I{=as>k+YPIGOPdgL%j+ZE-wRm5sm~2 zkQ3lxz`_=5$o@daoVXnETJ<~X+2z6dkKCjThMk3(=g5hY=@9*}cEs2Z8~!W(U_{fY z>^nOh5mv%pBN!41$UFlYg!5vC9Qf~hX5bVK0hAg8UCB-%*~(Y`2Wm|8d+SmCbXQyM z74^(U%l?B0Hk$N#*y75nrmIQUS{}Twyo}!XFRh0S=h+L*~X>>yZ(URg@t>McyvK&H}g}2?&0|BL5mUUE0*F@diFA z0wBVB1b`=L&CDp$(Lzo83R!BUN)yV)U5}W`yMg^IGHp`FcfA>ZQVUM z|8l4|XAOX*Lz%j@j zq)`!2A*$k}ITjCW;lbI~2ZgsY(@;X8#>-PLe~z^3{9uZYv+a!7wDpTwi!f`%ui`lI zIvL#SXMIaYdTew)Lq=aQpxWp-M4@IJPG=WHT7!*X`Z3J=kON?r2?=b{D3wbT6zD*gkh2Tn_I#R=({K9O|~uytFnXI~q*+4pyf;4$TIt#ww`+g>(L z;^C<_rUy?2ctzfC<@AR4HeWzb(AEe4c3ggVL!=pfR{Qi^#bPbNPe(<}r>J%==f(Q- zjzEt`Eq?5ihj8=KKDH0FBF+}ta8%qPBFxpjz8!cLU|pBduAkOm*P^*PD&ye0>BSDZ zn&BPVJxtSXNDUWR_4|3j*K>rJ4Q-$oa6V+W}1R@>{NMkMg@t-nV&h-;x?%ur=a^0upRfB#} z)&weIU+TebRjX@3b=sQIeyt*{E#!C!#kQ$h-@ni8;- zSb07%;b+^p>InIykKgd5)(!Th4;-I zhJk|_@_E`u`)K}>+sB<&k-~$8AuqnBVHDLh1O28q>ylY-3#ggp`b+(LWS|hmO0T3+ z$wf8p3@Rq&g0dN~>2Nyf5i;Lru_(!aHfB@)jeqdNjbuj52o?0Wx%~J&a7tW;{7hR5vol@Z7H=fW^49 zV5TDF-rdGK7o)6}znDUJO)C^0^;XpT$n@^=qCr8nVO?SnX!Q-vStZ zRI2O*i7GxhfmcCUZUM@MKI&!kcWHAB_7O#VlFuLaVbl2hfkkoJ3Fm-Ysx>Prz==Xm z5%COgU=B{X6?u6SekI_^Zj%6z1egI4w|@3% zz@L_$iCspCRs2KxMM4;4XgxM_RrU&}B#rQu*{{SNg@7^na6kl)K*?3cNLU83_d&gU zgvb@G)XQNC$3K3vU~dXrO~RV_ROB3*Ve4cpDNx*Wh5;07Ioryp6{R+bk&hXTiJQ}B zFF(oM^g9BE_V>fjD=EIg9n}cq%aV#~zU{JWiUu{c5@~+wmq1hREUM+}}uwF|vQf=GSj+7aNL`U{tk*F&EQ^?!&#q z235o&PuW{A^$Tt@|8*@H^G;#Sw!2Nu9a>H#{{L77d(2(Ik#pyY}>W1rwpn+`MIL^O#MS|cR7bC zjRucX!Ai@EvigD>M>dXWVj-+hhr`~C(jY?E9tzhsNbD$0KRQpG!0K>qhX)uLyW6ep{((l}w& zTlh|JhF7o#)4Dzx)rTdQ-$XCSJ&|kocb2}w#X!=)dIUPn>3ROcVNET zAc36yf4h|6?J)~XUUdEE956ml>8aA6zXnvi@7uqFtiu=xWnC8Ix2oBsjJlf={#~>H zJjS72`SN^G?*>XLOcye}<$rO~Yjs@{S|heE?giml2Wr2R`*Sk$tK# zbwG5OkLV`&BX&Myq9h?UOp}W&I!H}99^}j@MBKj#-}r{>R`Q6{bjOWHZJK|AtYKw~>0R*5R64J?a(r71t06D>I*4qjWmQ zvjk#rx(9Es@|iEv!DDFw4O23jr((NcR$`ro7Ok*f2ck57{O!N%_2cQ?c1^7txNAXY zlA;yH3VaK(O#@!+BloAmHOW*pjTKaD=i|Y5d*zxzfwJIHLC!Ksy!FQbUgucTfu}=u z0mffGy{oHZ*dn3nzqLi*CG0$)P5YGQ>_tQmUQ+gX=6@S%y;PPYcDltQZ@)@ywlyVO zG3=;NRpM}anMa3xWB%`^(DO|tJ>NY`=XN$lpB0h+%=ZrZ;G<>OclV728>Ba$s12Xe zJPWt1Nerz@dg|8R?A2Yn82xG2ZQ4)$pn~UQZB&^49YOkw%&a!gc-@LK+KUeLE|(PM zHg3%htICV|u4bpJ<097lT4hTPqFbN#*K2iTksn8o4wkBmgg|Eyztn{u)s1zEP{itp zDSW`g%oy${sy8$sKIthl{?lvqoU1>z@YNUK24<1SUETd0XN|HFPL#B)jf~1Ga{sud zc7^p>*Q9eIEy4IG>lnTR{T@nxdN(!ZygDOnjYyBe_y?(te^axZ22=zv@_R~O{{+XA z+@!i6^dIQ;2%&}#dRKr^hjTST%pbinUcJ}`KJp=n4{G9cxV0{J}6fiUD*3@Qw#vV`!m#}KN1 zVJ|dlLNLVf=;;}2^R+QuvhRXyWWlv}5WO8Gywa5tLw0d__BcCT&A?iM_HPm@>G(0p zB2mjh)3n5zFSDs#qkkQj5tTZ{<)CKq&q)U*v;;nSH~GsOobcE-@XUM90Cihh$QIsO zn2;7`@?=r^7j-~ieE@$$$Q@Ll!00{6Te$#Q;W!O-w<3MZWfqcqek7nIjVk%-CqDiI zPy7u4){}e$-hYxsLA4Rx15PO<opBoWqCTFtV2w*TZSjW5s++Dz8*__6wq5-#b z5FKdOFY$lOJmf;CR3wy-Brt{XFlVPXgh@AZrQlLCIRAHM3=wWdd}(GqWHkp2iPX!0 z79L@HyRdw}GXDIlAjf~iHXbwopYLHAzXzTGfP_s0&dlUG0Kw|-2p8l;M#b2Ggu-aBfrf@{F4X&yfP7myN?9(cR$>hxra2$ zTGaK^PhfFf=>rJX-6ay8i{>dlx4(zq6WNmM6_z}e`+>9zqR0YK5^5}ARx3jFkA$1m zOc;V^bPp6}TNy!zZ(TF^%^hDJ8v8y64CJW9F{I*$UG zS1NKlLk(uKxcJB*B+{(glCqN)+yyZ4GQLkPL4C%M>yvcPuAgHfr*T4%QLz4naZZDf zf4kS1q-nG!g6X`A61>B9l%c=%6_~tV2ikwiuk%^1dn?@Pw=jTZuvk%?nwmfNA1JKw z#$_+BpZ^Gq%qd+QPN4CQTTyk{*0G=W-H(XDR4R4(h)avR<;Z%hjd!TLd0bgr*@V;P z2IqzdD5o==Y>ICzh)m6gr`}0jIBD;#T2HaBnahaw7H$jtt2v~coRdnc;3)TA)Ho4R zD0t##Qlp;S)_z%wx}bK^JB*&>qXQzr##O-4^+rInPR@B{rmV=f9`-4^%x$YA>`(jP?qcZEh0vsV`R=L)c7NXW(p*ufuPL&zI)R z&7REs?epnFLy(n&=(2Fbr#Ag5P*G1$hsyLBjnO1&WsgQ$mM7Ii*q|vZ;!4s;edF4p z<$b26l&7jQ)h2+!N~xXZ6YW2=BX#rMv+*8bW@(%ENUl^5u50GpsnNOmR)eSD(4(H= zae_hp7h}aE%K|`5(KNWA-Wb^LcK_Myk~Z7TWjHTWa#xwSm*FO&tSPy`ytS{e!2ut< zv1Q6IkP$oCCD`qRwE^D4v`SQn{#--oC6oU^gFl2bQ^|W3x7W+v^5qYUdK9P><4%u~ zAg#ZcpgR{r>p&A4E5|RR5WylV`|W-_i&=dA_fea!Rv^Y#+s$VR8({IRGd7DX3^cmq zh6B|IBlWC*DJLl zx`sbg9kU{w!K_U9M@UG&FK+=LGs_Eb!%JXn(aXSzq`cN#`EU^#A|= zjbT`f8CwnwA#-T6$cUIjg`CYX?ZC*X5IOX&IS(TVZIMvP`K*!-8*^ULJ7+5A4yfp; zw|DQ~>+}8n>zZBHu3gu2kLT-gzu#^n|AF5AwqZPS>yZOx0KgJau1yPszvD2J^YTSp zlzoR0&uUMBEP57^Isorzrjq9SdoE+{h}P3*kbvq1zZ9wi#aRoCR<_!8N939OT?hd< z6(T~elR|{6EQmk?4$yeLAAPS!b1=9E9=l3ill8;@+_*fI31*oKofzgwNiNIxJ& z%~}G(q*>ZYXl|oRaibN`Pm@~1t{v=fJ*=aj}?Qvn^$D>z`A!=O?TmK1ng{Y9-~m2h4xut;_S00?Dv zH8XpHscDtCI30kUHAYIJg}^yxl5AeIjFTpub9|Jcj*}U<$7c$^iK}teS<3JL+tJGf zxOWzs!v(Q2J`61WCE4#0)V!nv@l@G83Z zd0!3*k78q$AFD3ywyn@E+7nBa8e2HsQhIwNg##B<(ULMk?8ZRV;qezIF+ zN)UPf;vYV3AKwG!vU}f1@Kzxh)MN}~D_6!zBt%vD@hVG(;v+%*5+ZbC0nacA9FL}M zaz#Vbmv2HopwFYL&Xr-xpIBQ++h|I~tcFUyHKJ+?JvoSKJw|5xCPn%hGYmxTaXpkvUbZ7Rp zYXj&YJ8PN+Px)q{kuh^>LApa>he%3qeI^B6?56Fnx#@yL%mH%$dSG~a`$|oZ)NSR zdHa5p)TS-Imo>d60`2@-ZYkb8#O$?1>BWfQ!Z%UkQvB4eD~X97l#HPWK4Y ziP0EW)b@*pGd0o-&b9srA};fhn0i`{i9t6tlEQPr;C<{Zwv<=HmkguqTRb_oNA-6} zR|I9(sL%H?#l_Llvn}TUUWuEYeBTN|YN2S`ib+~!0yLP*gMf0kLlgm0#3pkK+9nZ! zx1(pjS4V_Rd69pf9;#{>rJm#c6otr)<$It~DB`+;j;*3w7_9Ywptj{ltb0wECISXBr{AhyuMKK5oID1chOC>PBr_wOruPbnzoO z{i@@mU^@HC-mAjtw>yeOLV^X}5{TphYR?{Zp(yxTk%VgW7^hl|`(9hy3=PUmX;cRgrG<2G}mce-zLDaV6j-NM_Mo zAp!tyi2^j#HSrH+z4+-#*??XGwq-K1qYKz|Q?9u*w&rCoYXW^pETN3AKnuaK@PG|b zwG|tvi74x*x@xrM5cakLsb&!|oS_RkyR6SuTm3UAgP=e&S~?)C$RcW+KsQDcmibtJ zf7?_;L~_C8q#wL|Ts^^ipWc9T~m&b`G+B!0MIz*zly3UB-k8B-iHA zUHY|dJ(;yn!>b>SuU)$_gVJ}5ne8M!Ty{bNti}oJx9n>EW(;Q$J+_5@hO;f*U zbqCpdor0`<6%e+3PKYUIN3-6yP)e2AD^C6~Ola?Y(7x^Z!X@vp$NHKo#Q~}}d&AbdJX^n@ znJQotMGqj^nK$H9LAo=dEO8^P3|hhR;f25osJkI?5IHbZ`dFYA>v+VHU+I6K=FfT^ z{b2r?va1}IcnV;Np&*4*jS=P@kRXsaI2D|$+zqp((P8qvy3=bh!UeFw>lAlyxJn6n z@2bznc%2)RyHS;}V<*+q{n&n8LT_KT`fW;;CP+f_%Ncbhi4tWCI+Io2xoc!GF!uJrm>x#J6?2Y zedcldm=>)k8Y~p8RE^fBROLQyM=YVszPnkPg;ab5a0NIgdIdU_Mu&e>ebg%0hwC8o z=UP!~3+#4q$o?ZN+n(EnaxURCdIL-CZm!P6VF^Cv;|>%7T{&(QQ2EKt!*YNQD~ z3&Jqnc(S-@X|*}V!PF@bHISc@tpH3dbqDD6$-qP_iq?0?zx}E$l;C_2Fo}y(P+6EX zLUyFaLkc>h)m)9k;WF)Ud~RS%SaG(93>!}*Q4qv*pg)+K_OfzQHqp7>-{b(YB=imn zlSLqZb+a5E$*W3j_yusNrJ+(Y*cm3U2ijiiQQt4M1(t^BazOC=RCF28F$Kp4JGUN7 zz=Hi^Fedwn!7+2HW%?7up)?a?*ikviFRhJ&W6 z8R70ZJq`*D;SsQJ?I->6+-^om_1vv>%@pb6yTzWO-@Tamrf$QquYTxz4nO>ym(;Lb zbF$Ri-xvE1=!flc{rBb?PTNVr!45SH1~_kdh}Trt(M|RAx}WGxk6s=Pi}+Q(`EgS* zApdOF$Kp3cpQmQi*LA3&2VF{{aG1aQLpY}*jMKftqKtAAGAN*$rw6+Y3FVkhhldR* zxNvXmI~A=bce8ig++sS5OfFg^uqz#m80$vvC3Csf_^UNqjY*$>8jDq2K9le(o3cIE zbC(>OIi_^htIRm(+8;rxcsJIdQK$#<$=7;JnI>!M!i>C}Z8E@JKz*$Q5?h%$jpqo;l!_MpLu{we_iF2NXW0pvsadpdDVIx)S%CVvwUhg8HQ{F@Hay z!CsrNqpDJS@;-qcx9Q-iYw9!XDq&c~v$>+N?zu5~oLQW+Q&i#ZEJbnT!QlX;2`0*2 zQOXa(Z7SGX8$nmau8Dv^;o=I#Qmfe)c_;LV1U3nB4hEW4{-Pf(=XRYfx*w#`wP)nX zu#pec`9#1TFLLC~=o1kgtrfE){p$+cc^n`1VoTVX!d<6b!#=<@#0h-Nj4R+c z$*kI3hy|GY9$+=+KL?9kS+Zwn8q#VIs(a78-+9+I<#3#U>sTe=$Ih$9mS^H}T1eVv za!MV-kY$;@=q(5^bL4Y`(%ArTV23Gm$u7S!too#+&9f_IF+zaJ+5qm(-Hrb;Z~1TC ze?T!mpVX`73MhNDOKobeysfH?aZT9*e*_{s%Ul509NcM8`~HK&)XaFzK-1-vKN6MP zqdaJ`v#k}CjY*-Z5+nr@7I;qm>y%tsyMX=x)r@#BTU%82iz)#KH1c7j6CXJ0X-(?d z1YmRo8Z2OLR?YjPDL6KpM7;=DqX|-LGG&xo@*OLuU)3m1ESm!OX^U8n%c-!E<(PE+ zX--*kE6(N(nAHPgB{RFyN&S8eVoIHn&o<|RT|!&gfI8%>a;s`)k|)%Z$s@paGOW0Q zdmU|k7iM2KREEA1{ROqB{j|L0FS+s2&69rg9YDg)h*etcwmOGQzTztEPBLgB+Rp!V zroH1IJ8;^9^)=K&$tOIKrpEw!ftoshz+AyQY3s6g)zRP;NoGF{z-Osez&SIl7>ytA z2W>x@9nicdltwKjO63QSeqEogLg>?T1L|u80H%6PG(WxHsKrkX0PNFY{9pZ{doT8* zG&?L7Q0Xj7Q!x)p4*%`}Uw=&ZRpqc}m{0cjQ2ox|d{3Zwvg(KR_86aOIIeG}MUxfm zn&{B1QI21Fb8#SfsM)%&ck`3D=cD@A#xunaVp&S++zmehuNZtf*MMqG>F*z0@zYyr z%=x=JA?Hb&PkcOH&tJ0M;j>oV5He9l*i-EzNNKHZF!2d{E}f{cp-a9fLo_&6B1OPa zAkw8naC5M&U(PK#*YQ8riMH-NZR~g>63k&kv8jK|>tRd?PcJotD0pIc8C|@Qt5rPb zIrGHOt@RW;Za}f~20&t)Q`qslqnNAEzWGM)X!hYRXCen3*DaVYubyd~3Q#jwy6e(( zB8-^|eRM6}4RGGmgDt1O68|8a>otL~$p06p_6aC})Q?hNmv)qI=U{aCL<>9uBY(b|f z>#v-pA;(LVj?9qS=9Ub}_r2Hj`mFBD^l6OOUzg%2!0s44XC_Yz*a)STre4=%h0c;4 z_2&LP+V}5G`?}AZ2^9v1Y$x$$5?Y?}B8P#E*jm^VuNjJ6){(B55*+w6cR9799}N*B zuENUY%8|%TiWcQgPL;(m_IXmzD9R ztmB&5)NdIgx@`*gl>$42Le~qMlK&hU;6Q{*csC7yK^wDI1)4 z^fkn(2ZLDBeG%{<2r&lZL4Lg_8wYDTSu5oZPqn0w0$fcr>#AX^QmrGb4eMY2P8 zYQnpA5y)uor1t>$`1tfbSJ*GE5ND-*IpxNX|FI40bRICpvL6FEU>b1Cw|3K9(i6U5 zB_W+rxw8mxo)N%2bg{$#RRbxv<#NlMJ+u!HmYWC&J$OleS6WNjQl7HO$)e5>9BQD8 zke%*evbQk8Fhsbcafm*BAw3P63)4VBB;eNQhisro=g(m1GY~4k9IXI09F)E)zFb#5 z(s)ceW_3)Z&vy&O5P=M)EyjTD|GIpM%f^Ew>dI_VAXq2R`Ossb=6s0YR~EiR40r$v z6M+aEM)(}Ix-TAQ;7+C>>$I89_xSDA4nFv# z5o@&XF`X6BtCyzVQE3QEhPt~b|C3uU(`k;v^6FdGa6_CDya@#a;75!Go`iXt?wf7g zJMznJe~(;Mh4}m-)!uZtd%6O)(SOS|(5yg=(oZSeKw@U_h3V+l$5E~``U23*fv&^r zIphcEMr-4XUw9C)wu;5pm8FeXe#c*Kk5wbt0NMnGC!({ffA;>t@mn6fSfSDIQxC_Q zu5TE~5k2*59@R@}M9#z|7fF4X*xh{eC_<9f{dv7}=r1t|R#i^P@Z@NCN^rdErtv3m z!&I%7N`(2ztIoZ1rc#AZoE&)Zr;2M2gFR0*V*{QapS&kYSITP3^E`G6E4Z8B_~~S= zCWpDc?#9ta~P9_pH;y$1a|An87xtUL6j9yL5mp zCA(iyRIgc}+cJxtHq@hST}IWxP??K+n9`9;v!CDPwKY6)TzN);!H*lByDOad-m`eN z;eNH_bP=NotiOjcAW6j^x2mAJAjv|5=VBanE18Q|U0eU$-(wrRK?QF#2z>u&n`~#a zopPwxc=YO2aC39E;_&>TJpxZhaUFdEc0@(&NVKIy5iyjELoHZ|c3E88O}QfC970#_ zV#s-D7Qih-Fs+Rkk6@9i`HTcm{<(!?iGE_@Lc1vIZJMrnJ>L~&JTH0CVVlwP;Kp0J z-&l_Iey2iWnsla0yK!9J=7T#2^nc|fTE7VbWMlneNj_5f5T_rmdwuV`FF&FLj1P*@ z?AQG;52$eCBwJBJeBYqPg>K)l8g}8#EgZ+T(f+SJXIG}GS34Wm08g74FD6H`V*g^A znp>tulT7hbWs@7-Qihr^czRF5HFi7PW(~or;8jC}0Zf9Z7!xe*w5?(k2~KH*h48n7 z2-{3KF{T*aL+ggd7vhQ}gub5w@qwKqL(omVY1Fii%8}wq_rBqNepw6JHgJ2+)I~RO zq*^`Y?uAU+(G)n;$%Au=viS;t?f!K++h?JNuy0%K^>ogYx9G-CDfCZYjU}-VaWGV% z4V3O*EdgSoP(aWuISq^Z#eH9WNW-M6eHrdV!l1Zm&s_0@m(@p8Ebs)bfODgX7tRrt z_{GVT`PWvk=1Q*w@`N7fAyrGtEd;R7jQKzLbRLT;im8{c>T+Bmt>GfB+2{1r9`Rd6g2ccIP~B66ET2 z+)-T`2WM4$bczGI$!WJ?!g#ck93aRiV;`QIYusg_B52|j>z52LM)VmZM0P~jks^SY{s1_ymM z98dDJc>@9p=uR3z(0$rM9-vRx(SUYy|LVv6Oj};MfWLzADAEWK`;AhRlcjD!oY!8* z6ztw&9w*+yPr*6NGyu5uRyEzCGOdL*eb|5XD4Z7}tedJ)w?PSAyfgpm^zg6}h^HZl zxv$t7l5tP*?G?i(R0#w;=gDIF(m_D>s2(a#)wx>B4CFgY%2^XSUV4VSUQj0%d#V)W zn~TwrCpe$t(I*;XujY)WxutlvUCV5EbThu%J!5IxHJzJDZi(6RJgrM?y5&xA&W+Xo zKrFwLXClk`5;6G(>^)Chj5~GZ8@*@p#qc(dp(Ds%)tgkxp`9$2J%T@3 zS#k%Vy59UXEITsUC%0ZZ{9_*d!w0{3eE(edsTf)HB~V*&@!Y7}5WikO+!XU}sL;E> z7G=Qk^fqo>@TZqK5xXA))oguLzv6_E9`A688DnyOqEb_WRa%#XmPbJy&>|oYPX%9( zJs^2yUhPYZuYV?tC>@!T9A5s&`rFh9wCkXM`ta<+3KfSAOMtuf>L8y z2?d^+cEY0tP83#z`~zW!cwQ#cQJE=WA=MY4Vl!83%H_USXRbk=#4US|=)rcbSY+w8 zx+S0eUEHB__jlh1a&>?lGARVH(sMHf2wnISfLNR6E>t1TqT-{3dn`-`q{1fvX+bzD z*$Jqb*eK8|fN@3rlL0c^a^moMAmMQ2A#V?@;$^W*RJb*^7IjTP-hqV(`$GgmU}IrP zg$uv6{(@6-`jS#)t?)3NO1fTcgL%@i0KnH9|9|siepVBOpbDYS{8bUYRh~*imuEtO z3=Bx931=x8tx%4U=&-AM_ger*Ell*WK*z!wfK?1DzSX9l@t6A4T6E|@5b|OD1}MPpr@+6jzOs-2sw2UBuvX5KS2E=Q0RVcI!9W2GKT*l7 zCg7bG>t-iJoGnK2{V4IILqfRyrYLE?nn1{YqsaUrPO+kW!+K&ijx*PMGAjRWYx(nN z&aT)9_X%$ah->NcNpzgZiA^Y<^J#=-K5CjK7ajtGrqXDl63c{{Q5vj&Q=~6K+K|Cq zlVer6-Cb#D($?0f)gqUE}I9yC4gyf*w&Ftx+Xgy6vY953H)M`WJ&W`yo8A$5nevk z8-fTGGh7`0#6M;nP2}W?q!1)O4-hzzKlE(enx1n&-hCC%C)u#TtCYnOyU)$dYbH~I zZNJXTRZ{n@d3>`WP<)I>CK;si&&0Xs ztl-v88`QQwXZi)+F)`_{|G=mJ8r)oloTix~8HeQ~r#`zy9lfgSbDXLEjJmWka&)6= zQmWWrZ@=bg&$;=qSI#-W1-WCDnrz}%)K$0@eB|Rq-S4|(b&~*AT&~%M51E4LI`Sb` zPQS*RynHiRW-^$M^I)N>o;yV;R&@PcQE!>`Bltk5GEyQeyhD0#&xuRk-QkTtV*Db* zZC;LA+;RLIw7*ki!noZmW3ml9>!QADF8zGnzrfGn#!tWJ?*ep1{2d(Qm9NFbHR48& z)1EJv;G4`$^BZWZQ^D4$?TN8Fk5*kF8D0Y=_c0mj!;TS({ShKUkqfYqnESq=?M&Gn ziC%zd?(Z@{em$!)aK!qET?qUl4#xt6 z%5sE94cvT=g>_!b($M@9b|SOspYsOi)TRYNatit|eQhAPf?{n@Vp@oUAg2=a(u|nZ zLhWVKC#%-<I@iC zcN+Ic9i7?$Tue2_hmaPq0)lDL2~;t>Oi00+>2Bc!=ynWsj3dJ^%g>}C@IYjG6e13_ z4?#ghjmDR!rvC#?MLv(;{HyMD&NqvHC%qf`0M8-#JN>1P1I2B8F^NIIKd>?dW} z9-o5;eU2&hCiMp1FIn1HpSMw{;n1x(oU{)9{`j(cm@z}(0Ap+9=gRlAmT^2Fq~sug zuMxnuesf?WxnE9PLZE@V-?3lVV|GDoA|MXX8ABZu%PZKPL z{1&>{o)0i1gwkjz2=4vNX0AdtT7r5FPe62pn)jiy9ync~S%d0Yc{`kq*Z^;7Q84^# zUV731nqHva@Oav;=gIlozJor}261h;R?jV2y~jQ?pP)EUCuV+i4TmjJ{Ge@o#22Nce-sXQYQYpz zzn?YAd1>A1)Y3Ubd(?UU`i)K_<3557;@}VOX_NSeCcV;A*E9O=Jm7@{!yFAle;6%J zOxOMW)IO4YclOx}ukoC#oq3%#itFw5UcUkqM-G==JN0Da2WwAqj>n|dgOQG_BLR=k zsvUEo1P)vv9lT%i=%C+`4Wq6?tZHFuvy-o zTsyk+z4J45W6!1;!Sy+T;fU0kgAG&UM$)wn<89(4g{k5v;d=KULMtYJr|bp#O-IHf zUir*CG;gsvdf%rVpRBh(=+R3L<4cy4m!~7xT77w4(te3vO<_6XzI6|-KI#t+YllLl zr4Q%okAK1L_Fdt0ilY14uG7FPHo7Kcs9(0slh>z?2lO`(t$$5Wj!Q?M#XJbUT=(>d zg8NsdTd;eJ=W2us-=Iv!cMD_>#|WF+gY;6p4ZO09_26}THPs!j>Pw~ATWbpyqR!Qb zDReZbJY1C$V4j!u)lwF*`~w=uk%^&eSm`y-tF3OWUlM|@FC!i^N>BcQgkt#KgE&?lpfQIKZ+>We>5`Bvn#B=pE!I4XX`MG4V!6; zU;kq4^(Et%I7JeqP~tr(wv6);!zc~;?Ks<0*6J^2NT&f}pu$%u^>)b-MJX2^D#r*- z`7CwPFY?jrCwnInIL8SE39sL&^l-|Z?M{fd&tn_fDaDOGNP`j65_TV2?}dy*6LG|! z?X}{6*tn17Q4Di}O13a%6ZFJk599TSncOAcgr0<)k7Qax39)Dc8UF9xZi(RTie<34 z&k0zSxOmWFzPbgsiL|FEGU^z zS`FNAZC(*m8SXrjP1a}FJ^^5RTX}Uq%qyUeoV8e*0^$z#+;Q|CB#9Nz3>y?nxsZ~; z5NT-o$x~O1u0ep)Rh!EB17_*ZSI3Ik)}}Kq+7dGv(4=-nc5)^VSOEq_j*|$3z9aL@ z0uPWL%IrUj0HP&PK+(GlcCjW*`8)ZQ-ssP~1-}4v=4c2GOi_eVKP0k5LqXb#L%rMX zp(Axe8;WFBzKJs!2z-Gqzn>aFQfD&2vM%L$U}jG&M5u`m-%pbpJCCsNe=H72=@?WZ zC#}M?WRaEk25r}WyFIZZbAKu&4LF-+za(;)h^|FX59I|F5x^OTQtFaxhxsJ)ISqhD zm}MWVCOC7i`NxOl*#Ybi2VH{7J=8Qj{zg7)(x|J2hP4m8nJvp@8DLTIIMi`m4*?I4 z2WH(1%y>AkK@ewE0_9xHaNP64KJ2k2ZLLdPpPPn7 zaAcv@+TD=Np5yG za+jM!>@J8G)7GZzxAb%LB09Y+Qsx^&>v(Sl=e&Jsug-vreEQcIw@;igJ{{kAjPZwT zuDOvy^YBsJRwuW{{+=r;Z48k)9cu8|xO{%PE;7UzLR*gvJki)h4iC>6|GP3`%5bA@ z(Z7F>Pvj%#vhPLzfg-O5r?*wdztmV9coBTvNAY)NUG?CwZj1}gn~;6x-@?3iJvqba z|A9>15CNKm7JKceq-2J|c6bV*|i z%k&K#(dg38E<=8fWjgASs)tT7?gzb7?W28qHNq)b`7IRxQJ1Pq&V0K6>BkR(r>z z$ti;|BK|!_+yRjK5Gv!Ji*^ukLGX$-@;b5HlJ^rM-{jPwf^$`yIL<6_UYJ=fE(vb9 zbTQ3_=!~Y#yYQW?qD@77SS#X9t@(q<9q}l)e5n%lm%Lb#;4 zLJ>Ci%C9hfUS{z$#D1+IorDXcY4@rhaaLF%3QxMWmBxtFirL)*Wk?14^?N>)^#^!g z(_H4u%LuPckIzx1h^ydChl3z*f;v@wmC3PQNniT3=#AwK574+}pxm9z*9*wMS5IA3 zeg-~y8MxZLEDf5lnElu2Mm3zYU z!lD{aLQ`c4*2B%srj;K6rUR)J<;@h$p2E9IG?QLSurOT$N_hC-WN7iTSP1SyCLK;< zn2ExC+0G%Vjw-uWW?)vb(1n%!A4uv60H90?324cQm7t2G66Tk{vR`ofR+7J|Ix-~l zt7AAq4F-cDs&r;uDIn59rA4|Bw!_H-QrSes4NJ+-dvytLfbq_fQIC4pAq1S20B`_! zJ;IXFoij(<3Rmk&chFNbo{*YTm0CkP_j*eTwP{+xw`<))08=hZ2$T>p??Z$ZzpuSS zIegl7qJi-c?>%GRrpCi_n?=;q8K4k>DBO?=w&ntkEKfnES~>|sWYTDATed;MZS)Iu zEW8qTA$MD|+8!^$o7V1cgA&RZ@R)k;mN@B)<~ohCPcuy(eEDo;nQ!x`1%Y;{jG<+_E?UKYfWN zCy}_iaCYA`d-svoX`?c^7YVi^=+WpG_M2cPAH=kWKXCfC3>JhQg{rfsCEth(!hHZ8 zOqWdBMR&BC0UX1CsuZqSa4i;I@2_z9c{0)$o9K<=cT~+c=XA5a_?42 zp^%Nf7`E!E&k%rgd#OqsKaTMgk9+dzx_r6Pk-Zy7)#hd8@fMwxlh>E@R~9PN59|Vg zS$y0j+8xo@w!NQ@xb2i{J+DB!tkk+4pZt>xT}lcr|193$ z+LJVKcYdARm>Ml}GDz+r>4Au0ON|#Bz9>c$K3Ol>wYksh#!H{5 z)q2?F20xDt_vgh=;>G*cNv|41402>v9;MJS!`5xw4E-|O<37lGzM44^i1pJ86ss}$ z{KuiA^q@IN*&`<^@{xZL!nZ*w{OzfM-?jeXx$7tE_D&mfk53-TtgRCbj&QiYEB9}X z>!J1SsrKg${(pCM)q7(fPTLI|HudHQ|k8im^n#~+wh=5&^YtEZGA!NkJ6e)Sy4>QG~YXWZ+X-V_gm_WqM) ztQI*hU)G0a^h1Y$%7>R}ttT{9$F~%H_PR2QcfD$i3r?sfj9k|B?O{TKgnrcKc6IT; zooW_HW%-&xB#7}(qEUv-#q1#Jj-oVtrGco$Gpbt%lw(qb&@CumC8f;Xl#N7WTKBso zIMb>_V8?ox))_)+miM!0c&fvNFKzOvNO3xj-G_gn=>tfXu~jicz+`AzraaF}JO)7` z%1LEqJ*Is=5-7(QH(~Qq!ph&dr;0rF;(r+Xy9FqET*{JOo56$bf?qE}5-q-F3X=`0?Lh@}6e$gMDYd-w)|lNR3If3lP1k0K0G7XvMyb z61o*wjr>%n;*Xkc=xE3m5w|nbRVKYnRN$E1+ory>!pBmO-Cj?la9xv^$Z_a^gwg0b zkl3!>a%TuWK=M-0hE4#<>>2@Z;mSdoD>AoK31AL;x+rqOOQSQ8tpV%Nu4s66|HrdG zw=T@(eat2bUIYlv^;$@BGxdVjM8|lqze?sL<=^WVWh8;evN^B;dz_tn5)DBxAg{h! zlX)$f(!HjS@8)3;1ONm>FfG1t_<#fsC2I{6YKxAk0n*{zx!?anEC>*M__A_`LLp@Q zhj#JYoH^uY&aO3JMW;b8r=*G!#=Z##TsRD^@L^;+De0mWHJxE_@tDea!9`9xTOjuc z*j$&ldNm-)5#6w{Z1yNl_^z6Yu#iaP+^%FvwG#;USK;s-YopCV1 zmWCk|p`X|6b@TQ5`_-e5lT{&5oF?d{(+XsV^^m@=1(%ktQ#F+$xdJ&_WRH>A0{O_I zZHx@2AY!S<9;0f=ghoBb9fcB~i3RUAW4kNQH#+P6{0rQK>lIBAOLE!Au{~qb4eivK z<_Z6ktog7(C31vk)c%;_jD|njI*Ey1d7z+R*zg!pn7Mla&TX z(vfe6561pQQA@6j%ez(pCBJOl)Ad!GC@Z^+Ws2&W7X@{^syT8nR|t9p)H>` z{{sbtMbXHM85<22XA4K3wfoOpej3uY-Z*_S?EC$q+PK@^zqj9>9-Ip)e0~zyWKcr4 zzU5mahm8#lyLmTh#CqneL5gIaH{>!Uwc_8Bw{nLKd#cJK9UeW2D(vt~{&YYtH&^#a zB)PFbS$v|p=z-U%`ic##XkXY77vtmu`u=VT*CV=UzXd*LX>~`?~iYzU{lM0jbB(i}JIsMI!RB2eM+9Oqp%<(v?%<3d`sd#c9kxX9kJ> zc&s*(-%U1gex}Y&^asYeTS|6<#;C#*6Vlh z5D}4GODE4|kf1R!Q-$hwb-s#rKxk9QV4Tq6X;A`g#t%4jDo(V$9{$mA9+GH-#f6$% z&wH0Wu^s+LK)V-qw>Isk?M7!Im`y;HADAwK=?Q8K^c!q1m?uK zg$r@|jyQ=P_T~M7I2Z{)h)Qk$@1%tHR(udxY2_&7e?@c3D5|idIGOZb5Np*6o#k6- z@(h#|Qcd~a2pFA;z`s?EB|w2Jv^@=vSQ9J5OPt}rv_mQa-KMe;IJKuO_pU{3*Y*R? zD+%bV4&aap`$w$0?Q%*cxKKwF;2r|^WELf@I$Bg*H5!`MA&#&Nj=P@P=3M!3h6T|O z*c)_{w% zR}&y|BjD_~|3GCr(vebzL6jwv-<@IL=UJ;74!GP6o-(z&CQUW{-y5D)a;6Bt_-^1Ib&3Rw3DYa;?FaACcd6fFmufQanGtPt2{>>d3nF z&1#WFqg^ZbWiY?fHYc`JDBTXN-0(DQ35$`Ywnc39DFknvMH4}X!mU}8sS_jf7)7Q* z_t&Q{N#u=h+q@Wg>{rD}g9}8REn~9o^~ij(qC{9$aO+FEjxE?Oqps0uD#oit_neNt z8o0X6z#uWa?A2_yk^7`a+$m%Grzwt?Cw7X2Uq>|Lb7WVq5?XZ8``gz1AHm4 ziRzhdU(a7RZhU4;Hu%8Wnm>9kDeQ^PY`Yy?9@2YGd?jp-hgCW&X6E zH~-MLDp4#2>M3)7b%TxtX}5>xmHyq=R_)i+ojMmb;T|rBCaGChe|oKkJDvX;HZf8A zrj-0{uEswwMb_KWE`G!2LW=^Bdt^+ECO-e9AJB56?=y7W(V#lwK~kF7K-A*>h;w2k zK2eP?Bb$FOHQs4WlObzGxkhU|l_tgPeW3X~WKA!2Xy?Gfyq%a944Igsx6+rTaqh03 z1Jjiv@-ikxKc;b&*w&y6t6yHkUUG4-FK&o_;5s%j85oIOw~jSx9fIRmcH}M}@Dw}U zpQx_7F{G1EDu#+j4((4RmYGNA9e1ytMx>g@45E1L&oE zX1W%v#%tXuZbYe_G`tVK&Iq!2R{ z4|xz*O7_2u9 z_7No5pDxWK6;XB#pL+4298+BVe)ua>u|?I~ob~U_={ewgm}=Lmg;BcaUtQv$xRQBDf#58D6A&a(beVHNCGKGKyrNdIa)Hx`TYD%i zuE}_$*~AQv-f`kgTLFlL?;14lF8K3VN)|q3!0CKHfa&5XJv({%9ev z6wZ|SA_Lehfj72+;CcZkNnrYS!LM}QbjlDrhRP>T)PeATP?fTuv%b;{~UG`<3== zOZdWJ9P<&AXK5BK__mSD=wI__dmecjr0s`~^NdTIkQ1rqE`B2z9-qQk9jxP?c z!}OhXi1;(nyujVqO&bmiTX!BLEgWaf$*Ba*I~F43zA zfN{#m3}uGcjW+E`7}#$W1A1>e;PFPXJfjsjR4f7MDY@wJ+q-%fn0B9`DV09<5-59Z z%|4>oLmmd>!U5w%+98fc8b8tj<(&?iWj+u9h*13jpZsT`4Df-tfP?Sg0o^11k45PC z>o}MiF|A{8)LbTg34#17*N(2(gmQA6R2OKi4MbwDkM_9ns5laMDVPv`+Ne{?g}RLE z=_(GtYs+KM)s~5iOlPgA;?(&(WmxLuO2QBLg`CQ?S*K_sgI>*`nlhdEvtVv^ne&$) zSsj7fPm>fsRo zz+&a5(zf1-l!W0gZGUW&o>cnIcP4sttQ)jnT^5^n#1lZpu#_&$5I##cEXFH2psrLb z;zVmo%BV8HkOa61d%yKcZI6@OU1bw{o%_I4t)h*n?%kS^!m3@B)pDhaGXOS!jBdITFNi>-%8ojGpb5ZkCa zc9?D9m+Y9d;q`BP1Ff}-%%42Hb+>vXYP)N!qTT;}eOUZ~EiK5ka}nVm=FUtlk@-vQ zj27xKzfW`51MbGvC##Jo`FcQi^ZuFrJ>K+iDe#rgDaM|)=9JS1?4RU69b(Lo*Cwim zeT%}s`Atvc$m#hPhnqO8f6>xAmDjd$8@cTN*Ura$k&!)l{yTYnwvJ^ZCaO&*)2M%$ z?|sl!_SOBHK^fK^SsbtPBO@C3Rl;OGOr|$mY`#YQW)*zznz(e9+!>sqzRokPmKitK z?<>ePwT1oxDY?`udg_k5%f7SqCKu9fH%S^j-j5Pv;iy)Dwhv{Jt#|A}QeQ9$>!Lvf zIf-Qi1QcULs@6Ui{n|?6%H>~V$W?`r7nd!iEtUP=YT`k$g8x7*=d7YW0-W;g{Uxl5 z;(B;$_)h0MCVjR=SNHQnjU{~ zq)u@StJ?Btw%(&KrV*%ME=i@Q_w>=^DUeYQZF=V|WWH;e+Son$?+)@AH2k#^UQ^@(+-Cr5I=2vXmD!%9dupD{-Z$ltOGt70p5D{qYh6 zzchM;#%fC9rg7%0&hRr+HN|mdv1rMl2#BWSIkpiI0YcH43k?n;S1?9@E6QwLK_RrV zscxV8PQ+!l(KVs%s9WE;Y+KdE=KW7K4^n?Ql*xB@7$@vkK|yV1u}1y4o+OzsfIm{3 zK?9rq#Cz_CX(w?x{!f#B3gJMH;X+!+G6e9fjTK69IhrW*7c9vSTZAK4CKUKLi#1Js zICKu?O~Bbe21wfKoOJ7PK1A~ug79ihELxTba2sN2RH!&gs|reUI1W-+FoJ>-&B_ z&vW0!dwg0}Wc{CP6IL4$O*&Fz`E)4p;0ldBnbCbp9Yb&RJi>62*R~}j@_(O#v(*5C zzbv2tg#j=IMI28?A_NY6XL;F;wh=E)W$zg1So+K=DFjVIa~vn-_xBF@Qodh7czb z4BAa&8~)@{Sp_pF&Oix1sk?czIyAmtLsg>*N?~$=3Dl`mvmb{r1m1oF*iu1(YVwsX z|LV}KYp>ReUPOHw$9-gEdl|jU zV@luvdPihNbFQ6gXNEa%lH@$QxfWi50WwUJB{A_v1biX%T! zfn8})d0tK=;Hiqn{zGzv@X7tF{U?d-__OHKYolY81B@S>#;<2xV&TtyZhzvVjfwjl z{VFDS$(^e`th9E&8elDw6+%?%DDdEXcn|B)W@Pg_T!!FpT_80U^UN|_;q2zZqARhJ zu*|3mf-WlDZe>NMr&$A+gO%i1sqG#a})>AtVMOMG$Hn3pi`tvck&m` ztauTFR;=!ER?2vK!Qgd&KF;(g-jTusHJ@O0)mB+2WLz)Zu-3%Ep)9k?d;E{EidEn# zlAY3zM{aLiu%KpdHqljD<#i^`=Ol!PH||Fm zKi1-{hS9mTdBdlgGM_!TGG@24TCDJ5(7I{XNi#=3#yf%|AThgMLPzCSb(+f>ArXer zaO4e%V=GN6cnRI*w+Yx+?{S&WSMxWxnl{tetNl^<=E26?twx9hhl5^65b!wNXl_!w zF2fTanqcKLJeDeq`=|(1&RDoQJ5IDm&Iqz#;p0!P&brKFf zNVJ&ki-O?sr=761?4Q7f_y{;18-m8R=G7iEfFAA_089v+A7r-)cdvFyT6LJTQvA_E z%g{f6&4odxjkG`2*VVZ7#GT_n>fB@kB9$LBWZuvn!$ueh1IYv8ibxQhN)t$=QmHg0 zwnS_5mw?oKl&NfT9+R9v`_D*9EqYdQFC%IVWoCfv96u3Xi7SyZU?x(*;2fNj1X^+u zw_y?wT=@0aK*2<~UvYG4;iHOS*|bxegw}g z(Xx0caCU=SP>n-zAIfSACG#I+<`%$g+~fkjtf23>46d<*8gkK7S!gghL}bAq(=%?l zGg;R{tEjOPFH363I{i|5-k15F9@jl(wR*(H#zNH=Bb;18+Q`-=+b!wxCViUClUrk| z7?2B?F;Biog0!7;_Sa@Xnh*jfZ$^c!goI={u9%9&^Y{!xE4cykk9O=!yxWmeOA<^N z;9qO3O$LUD3{sGcjOT@5FsL{b+mYPD$$JIzOAYqEh!IFY6HB_ZQTv zoFX)*w&rCfv0paG&NbR!m+dReZ7gwvslwj2>dj~2e0X{1mhabh zEgw7o@pLw|$)>t3Z6uBN?AdEqINj+vj#I(=8q;wUUyi+a-)i%lCw!|$O%`+Y9R#GU zzNVu?gM7iVaDc1neh}Z=V9uJm68QsdcVlwmF4YfIB$@l_>F-Kg=?O2|i#XYJXM93B zj5_4%CEkr_-Lac&4{h6nn`JFdwO1*>9J&BA2sCI9uW6nQXsa25KW(u-EYIk*i0$d} zFgvYwYAr}>k26QosC_c4ajI!v)OJe*^b?(Fa9E$%)l_zAx2#%j!PeeoYqawx{O48g zglxKlN^_e_iCV!mgu^~(@zQm%ucK2MNou=2=1M!y{UHhaVrgIL=7q^w%4#i6^&(tY zsN{dcf6y~LK+d^}#JTT!cb`_k3pGBC zy$rI_!Jwg}?@0$t4n;te=)bhJe>rL=YNO7PUzl8iMdifl0FZfP`_Rn*CTyy|WaA>y z(9|FaCuya_6C=jQr7CyMMws@en%M1LoaVl(fGZfppNkGl;ycY5yQajU!&aVY`+Jo=Xujp3}phIXU%&@vt1&+$B4Tql)@)DLgEm zbOj*WozS5sDXE6~4DX+uyDz_j)(X2yrh3Ur*v9RP$$K>!thj0G%{(^Q}@7{=%GOjcK* zxNqjZk)+9Qba;L9r<<4F5Lx=hIO#OB6dsCW=mDku1aQNMzskEfG3q?u1}Fcpl7#q{F5!`#CUrP6OjgNt6@X)tRkH#w&lu=_0iNZq}w z-B)vp!F@N-?)lw}2McZy`X4=3*Mz`@BiyY+)HDM)H;!SDLNa_rd5{S}W(bElt|PxD z-6-26*Ew#R6awDIZw|z)@`;;p0dW55U7`lPj`0rP!DKY`v;{hx=L)Y9p?z66()3;M@3#q0EPu7E>*7QD^4@)- zxXpiFswR8706YaQo?HBS6U3NsTvd&F_!xls*>}Ag9G&EEBKIUX2Kv>gw{Qk#7z8yf z*ZJYh*9NPbyQ+cHwlb!DFxMl2=vGmM)YdB;oniMRRnW#s9OV72_e z-RRFVd9G|KFhQ}`5^f?J?*8Rt5_CP`D#~+-ISCQ6K z=@UK0BVgPhCJE<27&t()VT4Dn8L)R*m3e%^q6vw_y$wdSag$EWSml16HRjHce9B={ zXk!{Dw?Mz_Bc3m1h=md4qjepK(BHodbtW~$2-rFYo0pfO4cX{UA10E?8q$E)5_z(% zLq|0JK-!4jHxsKKgR!cJ*u}ae%?4S6G==WcmzWt5SJi!2A)Ql*$VoK&EYryhz#j?4 zL_i^n98tXA*n0Eb*>91#DoLC*pMXG2KizahAg!^G7z$Q_ta0zfH~E8#tS!9yVz3ty zQb>Hsu{^x5TU^h;{X(n72iSnPcV%};L%1S ziVy8aZR0+i!J8DudTko$mwP_&>Ujuq3UN~#Lo!V*J-L%Y!718on!25Xk*R`H#xcPW z5R8*_q83neBkn(AK-*>p(?!LWcN3p3ZjKa)|5nf2K{Iy`F4FJ>CQT-Wg4$MGXBZ=h zWZ#;nYL*ib3)H9p$4z@T;ve)x8dWqqbX%eX7a7k!{%`FGxaFAatI6L5?NM}^OV zdS*Z$=z>9qqJEj?NkN5hq`|!3T(DdbfnQx2@oNw$`*(rH`%5-tLop)eIT2lqD4mI;mR>0kc8}J*M+B%?!aQE%7*%u@LYyhi)>WCoxK?r(6FU z8_W)@plq`|rrUkk970SkIcc2a(T}`TAarjUg^+P$!+@mv{)(z%k1M|&d-hfDNr1!} z)0kUm>HRvyba!a#so$7d*CWG&>vM~`eP8^elv!oBt1KT^^w{4TSO$axf61cREaVFl zzM-G_o>!7OfX@*0g?5m3mQL>pv0bi{gLLEbWNuvSr`5_rGu&2Oqs{x$nf#RK} zbOa3<$AlXvfSIx~0aRV8_}W}=0^6lCt3NgrXhj!#UgRr6Ya?7HctcgVM7ytude?(o zuZk7WE6NfL%^tN4W(NlI2ec=(8K%0KykML=B`mp6UujpPHNR|wJe&_~j3?VcGzz31 zF?=psZ;SbjY36Zb{p@amYa(jx98})g9gd}(5=)`ar^Y}W4* z^WO>_`)f{K3-*6qou$)c%Zv)tbD3XGZg-xW$)<=GJP)X-PdDtjcBSEd;M1DMVZ>om zPo2YpepvbL)A^NWw5|4usZ*MK`O9zpW;8|Lb|?q3%NVz?E;XeoU!_&LpUPRLCYY9H zORbzGE1$kJXYV*u@Y5Fbn^i$iqI8?)cu0$0R`0G9S?m*0<9g^Hz|qt;i(RacL|Upn z*-MCe+liLCA+9+rPyeE_s?zEd^!04Fbyr00{i=_Gtn|AyXYwl6UeW#6cp-1icYd`; zhL7V;=l3$HzdV0?kIP4EOWRBj3Iw=hg3PbCX^CA@`em8sf<5@-FjQvmHWyfL`Bsu` zO0KHL(=?-;lrpJRv8>rKYZx(%rL1n0H7>^`V>sb*uf-|&(XeO~il(|(*yaHiLSz4ppd;xf;)#cD)~<-g^>dN-*N zuf|2x-}D40$*eoXg#EEA@E--K6r?fc6F zDmZ!g1){{1GrF6L3p7f*Dtz+}&$~1KkP_sLF+y(>XG$m(JF^BL2L%Am z0sur#9-?x_69Gr$dvO{Bx(N;Rb~(VqrQrNb&(3SBl;2{pG+*C;L0^#!BbF2%aCERgl|c%_xl4XWx&F!H z84CoYeVJAm^CtjXFOPoA=Efx_GoZs)m+c^$+sK$a;9b3QB?J#2Hky{svJMPPKLcm; zhJa#9)nz;qnjl^bD;Z$ekEa1cOfL0dZJ5)a#Lo=U&qCv9?Mdry!AFn8)r}{~LfXlW znE_FM6&uZnWvM)(@LtlfUvu5~^(*taHcRTG5JJ*Qf35{eOIZ@5Z~5RVD1~}=fO;Hm z+7R?a_UTq+m67&&E^F32zN9)Cg)sjD9X17gT+W5ckK+*y#4tP$M)sy6?zdtN1q~eY zYRMzS&@d)CR#j0*Y}=JnkG;yvX1Q4b$grMO`j*(k)3|!_q!9=2$tL%$p7ad&@9)27 zzFukxYN}VsPE4}CcBnuS6h6 zYR*DkekHb#w*E-9%StkhT%Gcld0KuiK+NTBkaEyzHzWeCXw-o!ijtbMbHD?!;P;RGuT6Kie9s z#vD~=zx}n`RadgSqV&S_%}KTzXk*+TLex0ikej)=!$xR?TK~>X;?@%`4=>G*MGrfNZ9vz zo%;Cpjk?tG%XSye{x3bSoMOK-aLuWCraFJLqaO`8;u8tg z5E}=}=IX<&cO7MMzU>|UN>5Ac^HJ@kj`uX{YR)U!`&!cHi*#ok-Dgwp_!thscAhRw zY>p?EJxk6uD&iM&!=A2oI-K z^KPk|R?ZbKe;0ndvvEsgz??lbbSa3%4Z6aGsE zXgVl>ONKwk>${joUxuQxe~eTH7wL~QF`*F$2_5c$oM74KOg@R{_J}l|;p70XQ#>}W z{rhwyUAT-*++5z-gOSfswhxFrb*VhwF=zne!M%2^@#9c1i!DkOIGi-5dsEqU-kci` zk{96;JcEK8Y5h@I74s*$u^k(ve?i^fGS#0ATsyACDLV<6_3HShT}ExbWk5i#E0e~- zAT*MgR%{}x!l8Nr9TQz9LXZ3-P5V@@`7rDg;%1f`@~@&?54YhvOq2|Fp>z)EbAsA0L*vCK`1qMtUyLn8~=9|*u z=g^0URUT?^JXPRZA@H+?Kyi|WQJhl-VIeVAu)Zm`ei~2=**4V$ma!<{0X^l`hqY@i z1IMocbH~pt1MslXYvE)DNfyEri^5O{0LdQ}3!Y|BQ1pJ!M;yo*eS>Ug)_ydh@uF4z z7;Fp-MUj0sL0H=P+utCOYBNpoq<&9J?3?VDD**^dhd(xP6Z#|erb33yS1|~G`odH7 z0a&H5H0zwa)dT^Y?Yge#dcz-O<%yCB#^5hT)p!ZSZ^3Aal58Rlw5=D;A^0S@(suOa z*re{6m}Tj-cP0icfT(;3G!!(jHEuzC*Cmj&A!!6dCJzF$l|oT@@S)7U$_3hFZ+9n7 zl?5;wqdf6MYcy`{4iOklOj0g&X5?wQ*n#2vXE2!Ho{|8oV4$ZYi+l$s0q9ly3&T|{ zxV#rD2=kBSn8MRWow1n0=7)#oCN=hTdLo*n_E2oJ_d8fXuPEdK6nsst&4A)QS>u{3 za4XA-AR~*GAJ@)R9!yCE!^?3-m7NZie6rmy%bP&t7c#*oyiaKDZSRHBa~+yrDwP{u z)_kRA`C*^G-i8j zSEI+#;aL3^K0l!%DX0?H%~Aj2_XYmOCkRjX$i4IVzP`%?i%O;HB5ez2%>d$8qRm)# z=H1vsv!<-~F)AkLM$Y>0&i2Nau@<%SRdY2hu{bWfA~}l4(745y0H6GxNTCW|ael*| z0_;tZdK^XDhh+!t`li(H#4dgOvC&z?q7Zv-$g|eJm;OqND%W2+I-Klbsl9Qgmvi6J z3qT#9GM2!L1y*K~xlY)T>X1`?r@Ac@t)yREZwXbSg+Zf6Q|_exu+uqYvbTgIuSc8d zXOl$Mg41*?)gIcc{3<-5N6I}9c-V^NBssm0bsRZ>p7ic>QP;dOr{`fFuiaFksEK!x zX(Sb#6QdUewPpFVUlR0pxtyUy6dz2D)(aSZ-sDFGtM)6$7p~*E(QcWhWHIJb2R4pn z^z(Gc^(~$Aqd@b)Vf3ep4mVkbTautbL0ZXnYavyBQS=wroVsH>P>!Gq>Kqf=+%h6* zv?A~=G8+e(fA3(|&uR=j6wVY}SAM#z#hpG0 zHsSTVbNOEozEHxHNTg^hEyj=()9S3Cky`hq1!Tmw^^nsHMWy=7;EYZtGuwXTRl{v> z1zl#g%Bd*Ha0CMnz)hmV5vB;(@j+6(984xJ^+N?2=ipQ{T*i}@2CT#NxlQx71#N#F z%mSqlmX+!M9Ev+Oc?ws*0xRNsKy?mC6w(J?zZgt}3;}mQ^KE0qz;(a`57k%slY8;Y zJ-{te!r?bxd$KCIrJ&{&q2hOTykwui!v^>R+a!G+<`V)c9s)}G2}m}7T>=nRGix*; z`q3LQEuHOBa%qRW?TG7JSObIl^63A9&J>jjVZ)|T(MMtLuY6XKL)+^*N)Cx4N zu#1LRh1azz!G`uz#M)!L3K?jYB9{O|d zIhL^EwE+}yqR!;##C8Ap%%sBJyoeo_#M^>02;eUcAsiBP{rJti?+a^4ju@Vl2eBAM z7A1M)t|}^~jpQnJs#DIh{M|*hsvYer zA58rpRUTT)IjMUtOYZrhF5-WmrbKLuuX{8L*Izz#{OArp&eq&pi{?+%7=I#7C}^c; zadz>#+dQ_IXrRv~*1rC29_Uc{_G}Y3XVEZ2dd~FC?rfIYvip}Me;0P;3;$tk2OAsd zpxOK)bThEIZOg#S(mlYWa&<1KJpWk#c&Q>G;&Y4X{ATd+ir#LAOCrBXIBv0uI4_~+ zvi#X1#$hn=)zCjR4!UkLuJdnOtlC5Z-&<<=Uke(hl&$+`fIkrc$ z^zqHW)}9$(P)kT)b#8qhakM6T?qATAu^isub6=dFH<};ME67EMh`;T;dN-nQ!KTk& z{=*ziWS6Sd~z&P7Z_u6 z-UdBMw#E8yb8YWSi=P z6k>SuNJEmHdKG1u8;QLjQxs=*sS1;!VI^lm?9~Dnukoqpdy75>-$B=X$j7rze&F!v-9AZY=}$&U8=Og zmEka|kb~tC&=GdK{NMo=Js*8SIe^6RN@i_dG=d5G3o7}up2-KZjD;4KMJoSl$F;nd z8WBW~<^Vt)DC{08UbXSBEuKBu2GlBQbOanbAFN08OSy4*3c>#hOTOeF3CSP|{A6t| zmA0F~2c2qwROA;SP_~YWs9IAY(v_*YaS?5`O*kW@s5C4FMdPy)RK$^sMZbb!7@7F* zIZE-NoV^T-0zW~O#b)Njh?0{XF8r6DP>#_mK{|}%-crDx$=!U1%f@}GJ@Bw4RHGCe z_ZKk4kAe*=7S3pgM~hB*-5bw{h46fSv0-1@KR|GJ+L+Dvrl8woN)`%;f@v~Ny3(ET z26%$z`EDcXS7iVn6Rr=Oi2ay9GBCOXPTnx_(qf}GJ&qCj?&IOtq3rL!sWfS3QY)80 z9=#t!0UqQgRnB;ByN>v`)$=bK{$>L+$@ssL+&kA`q)AHAt6=~3-y@4UsO=~i7ez>$ z-ro)6Q{s;hc?Y6mg?(_uPz@i;wC^{HZEKd6oCc_uf#+v*Z|63ROu+re)aKSVyQTZ^ z7of~r5t=o`;9)Fa;k-T2bx+uk_3+V*kWQK${75Pcs&DYQ&eOV;^FK(eNDrR8|m|2+21%VDxkPi1oa7J8k_P*dP9`F#_ zH#uYcJ2RRCCt&>FPaVM6`uN5Oh&pFmM+aQp0P}Kr5Gi(*P8wzxj(Fk93|H{z+V05N zHRU-KvH7z95nN(^x@TBi2y|CJh~bZXCBpx;hYwWy zJcSv5;-I9`6ewApU!u9|(x;^pQki3C;+J-ln4?m={9}^^JgD0OSuzk3&b~!KO;x=u zEYSOXByNCGEq;QnTPRfU>bcIDzy1%nuPQ~Y^r@^@(!!Ef=_AS#wb*GfaKpT=^VG!S zb^kdh$0lbEE!CGL(dgCwOj$p*vE{AGVwe^-`DTJ^P>ooi%W7jZDu2AbtNqZl4Y3#K zSms`Ez4X4{3*p;WCEk@O9iOD9n5bH2DcpY*sM*olH5fP*7(r|LpN4*3`xIHZQ_Vsm z+Is2S-gCk7CCgHYQO!tHO60$wj-ZO-;@!_`KoD@ow>y5>J*Vm!p z#y{1I!pduZ$M(&%mj3PEvVe0{|FHP`L(hs$|4QJ5)86}DKezfDPhI&` zGAHtF+afr#bRrg>u9y~=x<$OV6}_BAINPAC99rfX!Pe=sVlTS-uFaj-4nXUr?K*o9 zm>{RKUZPm1fYyZ5-bunmq#Tc<>43oZS_{-L&gU`B0p((~txc7o)M6pB^#EoprSC^w z1js4P^Hi*G9mUR>wX!j&&GS9bpVFvm6Z||aj5paw6lAfdFtHe1I8w{_#I${$ils-dK@1OvmMl8O+3M!a`WF%ZlrN}R25)x5b>S!5n|CIpT_f8?Xy#zA1_HgjPy z%@T_90G=y2FBbJo%6!KKLLl(ORYds|19uc$xQdwp9xen3?dH-BeuCz7`vNyqO$;ew zsm(iiQ>5dM871W3@}zJs8dX1rELI3OOF+X$-_s%#acD+2F%cqY00aKyFu0U^dQL+&NU*3EGv03X3vJ{M6o|oliC=;tWRsqqma*E#q<1f-Eg-rm4Fg|=3 zI6Y7_2)B_qC!0gM;?B`j*gItM{nb!ehM6f)dRF8D%)HE`YUh3jQ(Yi2qdpYC<}L{F2K&uCB+x9LD|DIM? zWc|4+(2E3do#R5{34*|v&&wOu=K~xjt6U8PspMfpjf+uAvU)TdlmOv=a2SZ*A4&ua zf^PolVNRaJr~R_+mbybf9Md2|$V5dJMgvGx!`Vlh3=(3mi3rG~u4W{?vi)QKqO4ML zG_OkKCp<8i)aQ&L>ZA#hh)rY<<39=b`v`$37%(sFmsOPYkHh_k_v-c3f}GcWo)Fza zRZd;LIbrXVW~{~#R4z0jq5&=iJ8CrN&+Eam4-2z6VOA*bQ#a{Az{3s=@`oZ-PGjQ4@hRb^mK>xsv=!wM12Q zOvKltKYzy_8{(Zai`ad0nO9`6i(Ouj_jaNExb9I-y}Mfdi@kF_nG4pnb9)NjwYlhz zn-Ls^S*>o>P};@?MUh5NpC5y>3N{lIB?nhNE&pW^!N{aV{>X27)UtJZ>9(1xdnfX5 zP4jBMh`cValZq56RbRkl*Vr`FEbSaPI}2#G2_-fw>+1a$YI^*HACQ>(R%$L&&MRY7h8nMP7cCVCREy^O-dE~iVfL3YYl zt~KV&j+{tEH;#L@rOeATO<0y$VRh;pJ^!9Rt<)y1MR7mAJ2o59Ge2@Iq{9{S2I>BS z$LYMvWr#)#-C?larcC{kNT$KU!SIjfxz?Se#f~uR-A3rd#?9(2N#|SXU8aM+MOp;Z zmta%=J&T_@57x?26ei?fI9*2zY&8f)j60Y`RL0;)d-h-m`OA-=d%r82e`X(9Zj96kaDyT9uC6GD3rF44Ow zjD|;2eV2Buz7`S+ZGLC*&62#N-q64L4g8&lkgF68 z_K@xDcaRB?3M{j;F^J|QFQP(ODsX#k%}3xhNC>1`o?$AI6VjVZPKcfCMLxQAdpNDp zt6}tKR|$1tcfK-^rkTMuWFwJrIr@DJnEZzBLG~jE4G+HesVPY{)UYg0EYT6#Lgj=M zx5#T5cKB7bIxypT0V>@i;Q=F^sLl$wOXo!TJ)sscx;b^MSKeV0LXH&;Ks;3Q!)#XX zO}!8J;>Y2@WPnw9VjpFGcei@+Vxx(lmzhJ;*jRo%!c63`uP%Nb1e};S6j>WMC4862QyXAi_68*gg8^)8M@ z(x2gmv{i^XI8W7v!nz+)J;O`nXKI&~Fu?py`gvRh2E7j#5(1>fBm)o=UBF?ul*k4O z$d*M~%iSyg@>sJA*uVvPAEBc z;0g0|mXS6)65!jqmLSeysM0ft)+x%0vXE3CV8Eh4DrgwF!tA6He88x8JdwN)Vh$uPJpaCGsc-4aQdh-XjY zeNg(_GIeU2={|@pRS|7BSl(*uQtrl0H0A*7(75Hd2vqAn*SouZ<2P+DdY&cAkOrIu z@)982|-5UJtsbt1tew$|LzaY|}#P7+UDR^xr zFur|wZS4#+WmqNpG+D;L>rART@uToTFf*e&`;yI`2=5`Et5SQ7U)`*672)b-O#KYV z3FT`u8WlTssVpSYQ$Qp4K5+voDqcD-K3*+w-4*LtF1b_>nYJzHTAu$$+~F0%+@j6q zgFHo4?aeapq{4K4aD9 z-{LVC_$qqhgQv%X`MT`%!W;iUco%$VV;1jT&}yD|*jKT|uMI?4W&R5aAg!!ajMgu2 zFK6lXxOnKiaFVmxzdPd{kh6O)Gid()wajg?y8BM$5q2&eHN2lIRhEi#dNOz_$|vWv zuHKb6v*?l+=ITDWqwXuom7O>|U(M?9z3O>?kGJl7x!0R1KX)6qdCeCHwPfu?z4kUA zkH1XHGjPT&4$Y!Zef^c;U)TsI;R2A1wX{IVku)V#Ge{w#!SrsccXJ!d zUZh_m(3}1(gL<9wv;g~m`O`K9SRY4T>)abxyu)2O<}5xq*D*sdgMGyB_ru*XwHs~X zaeZG5NmQs91ls(a*Ccf$Wt8dk;R2-vK5$rdsCuWjSTLC;V$GPR2BSZw(Y{E48VOv^ zxrN%NG{kfS{~1y{cj7qwyuICaBAzC|_kh5tkVLtjdiRi^=c%0nw!iAO0i^=nQt}34 z>YbL%SE-f@K9Arz9@ewcHcIp~ituCjdRUIWblE7;D9-olM-m1evD=NZ*UNPon3_yKDhKk6*JH58tp(C}E zpoBh^_y@g%7m{SfcDcCrF5#Rs+6{Y+#ZA}=4Ka$t-*D1(g4Qki#LoabbxQ;5&`Shz)>8V92mOzJ zzy6}l9yY-Z{0id>*CzpXVWB+cNxVq&GGRI#s1Dy>jhrJ=-J`{o1X|^*6 z(g1J+W&Mby`bCvBX8(;V9-cc{AkiAgerPfx;R`4hMJEsd)MvqtNF^Pwk)7IsfT;Qd6F42 zIA&ReoWVsJ8WEWi_B#G5_Fa@*`z2rIpI1x~Ck)S}w`*h=mJ7)!OJj2gd=o257an-m zloBF+5-bPr;{lW|y9`C;Nwv9RS)SzNyxw`+PBxa=2%Af5xGsp+n_{*L!2#{vq&B1b ziXlHxL5x#Xoceic&jaMnXndsSAc1-V?PZM z5=)Eaz)pLzm4x4!4-B-f!`RW*_>_~*S#_<-32M#5I3e5R?!gO1r+zNU z2+i83oB*tb2D{(GN+0syeKx3nskXHrr~*U^+wV8ujg4`z528(^ZbePrp>U^kr2pwG zKyIv^Z)yJM{v3P%K;mu++E|o#SkB!Z(Jtd!yT-l@wB`a|1m<#1sCJFI)#Rm2=DfWw zWAM>daz19VO7uP@YJSd6@o2B!&qdYZfqq({(VGeFH>s`8nH8|0uRd+G(&%%PD|P1- zxFs}~pXA2AJ$=tv-OA#Vt4~ZwUAumCfX9?&f>K@8>rK~dO%bPR z=7)~$e_;M@zfp&}Ry|fnq($!;L=GTpn!FvBsEy~tda&brNSAq|`&4HBTP=rWt(24% zh-PnZA92CK#oa*i$FkMvVWuBxxFO{|Ri^71ZLZZ@M60GJNy6?x{djEmtN#Q4I?;gd z=(Q%-gfs8zIMc$64l$D^*%nI_u6CW~`PgQ|`-6U81U&Dh_pdqsG;ZL98WQTF=j(4} z*B(Il9P6uDk%!W6s-J7EbXL{ek%+J)lFQZDE+5Tc);`IF@xgH4@1XsdiF} zOq39uq9Y*B8RTtX8wXQ9eMnzmHQgUA)kgfK8PF0JLfz@zpnwU##k(`sLP1{SMrWFF zZGvhEN$C1ZrNlnrno6xj7p^f312$p3!D=Ry&{U_hYPV#@#K zsnRJr>ca6`58n2A34sAchRu)L8!o&23?h2zQ6?Yi&#S%ZPJA^{^MMPnKhYxVHV^)a zKI?36?mFCGQm&&!nl=b&1&90qHu7m<1pfx zvQ_f}C{YaPdjJqp3NzNH>?EBmloKToYa^W5GX@d4b%fzzkkrl{Wxt+DCJ-L%$l|!o zBAn0v?@87p08&H1O?h@6YhLIqJ=`V^=~9J~51@5A1;^=}6*6CijbPcj)%|20CeRpx zIRa$UZ8#vi*8?nnA^2ZFK_=tLnclSUNlcW$_ucVFptf&Zr|^44uRLk!zQgLGvKfuHbid^-Ifq_3DgE+ zk0B81*>wUSim7Y=``}&Pf$)&fdKnye-lQ&jvHK3A*(OO93Q@JMCs9l?>rV0kC?0-u zgl@2mXW5Fs=}R)=3n|)-obW#GXagjq8pdwy!TmRFn=sY}oST4*W_wnE0kXu}nK31n z7!Z)ppEcD6NJ2{mh?7K~7Bvx`*YWzg`oSI*7WPh*<2}1krNT|Lq+5Kb1a=eOHpy=45zyZ^i|0}34g_wjTX}iXRA8Rh2V2@PU0mUn!heS@!Hec&#`&trnl?o>RPVo z{+fwtOObI^Ne+A05ftzDptUQ;@3X+{Yl}CP_9vBB_9|W-x$GBPmCwny$E@nM1-LgE z?l|wxc#PEqXUsQoZI=5*EH<}b4|R8T6)aQ_#jnLLd%Day>Z#33INW~iJgws;YhP)+ zWNHx9?{+l1Srx`POm?ms0#>PrpvYQZ-HZMq?jw8j0w zH;M{rmyPAE_IWvc?lX;9+zhyZ{5e57l=Pps!=G4~T zlKl)6I2!J$ot=H^VCaf!;c5(jnPm2$XL9hEGErm?AwBWaGTb|`D{~A^!`vF-6Hbg5 zwUN2N>5qN7RjI%h*Uke>6L7h^bG&V zpf#B!jLzW@q_d|N@&@n$YeXGx#QYS0$>mLow)m#`vdd4Q92@aFIpk*#ZIYU(#9KHS zbUe|(O?oTzs|U69#^{r844uo|=uOYRv%Ri3+Bmewj!X;4Sj+oBGjXRu0@E%$c{`*j zQxx4$SD=%HGgSN)^NT=0g|k@02P|Oz7mm-6WxC=dFQ4$w=rB`S0Hw+_QwB*v+$0dz zOP=Tha|z_zEUB(_eJBP73@mxlSHR0i5Hsag!IL~?CX}#+gv#mj0P*fAm;aSB(w5{0 zI6ZT}NtF>6>J`%f@dhpYz7FuF$HNir0AFwb z{6rtl`mg_tVBeF0BNz%YsAl>VKy-&Eyfe}0shF#beqnUu%g?vDfGCyw8SvT#K9c`i z-sJ6Ear3N?D$4)I(m+vPDomJ6GCJ%j7Tc!8RVXUy0l9Nh{~};v{W{$T+n(kb5h4J~ zdHGlgeNbA6_%Wlme{lyB#m)Me68-s~a|Vs~MtVN}lq%6b0LcnzPbL2ga#~79tm!2B zAa3TUTejAW0U8rep>;qpkdf@Wwc6r|I7#tVHY`tl#DF7yfq_o(JIVfXv`*?W4a^jf zp>J>!IA~ZJQ16C-0I~akKF|Y_jyJ`V*oX%2c&neA(?vfvg+&TWaA{M?g`~)ExU^)O=(&#?yO zTrO6W?Q`sT+>g8MemVb0we80IU8eypPI^-J~ik=77?n~yt|k?;Qn zX()6j*dHX@Dx4QyEb6(}puSZ6zOu%=;-A`u;1k>bQJPn}au*t$1Gv(;Y-u@@YiH{$ zBbFK^+RuIN>PZy`P&T%g2i@L0b@_6emm`3`;*&){HD>b7n^R?m`e&Bv@4NY#zTvxU zw>-UA>ZfbhVDA#UWBAC`@jUis4Y{o*I_|=NZo%B16!+rlTX@HU38gbcJf}t2;UAg#%$cetYD~LDU9ZT}_h%Wb`&TK|i7%x1PMvmJE^hDnH5Q2FyT@*8ams!k z{1mmw*HBoV*x!MNYcH1b>4oLb9(ex9m9*Qu|NL^q;OUh>IR&gY@9VelT@_9PRF1dd z5<7`~5Xs%#q}ZAMqrW0FmGJ?_@3X+!bfR<)euPu%4Z9isL5~UjV*?hoCY?>EpqMFgrSWW5kRPvAov28e8@y8vu=MQNBi8C#@hS3#z zizCqhY(iYOEi136lg>W=FM!U;8a5Hjsj5EzOzFk4;ls3W_8)!4h!Y?n#+lS%1p1r- z9I`_I-=P1w-wo5tm`+fTN%N7(b|d9@9{v3MWa9oa(yBCYLPY@@>3wG0v$`e zV=#>}minZ=j>yi2>*{e{d4{<@4U}AW@kE*uwf{TR7{+LWUq%KixI|TbSc;6(X~lz4ZE(v)baNOp z{lO&!sh@!J)S`SPz$elAVFc9+$@ok3UJLPqxB(yG=lIJ4bK`Tg6N)Q zFh%WW2rZz-1CHzFXZHS|qBD>glNT)9K{e6D^W**xfpZDW^yk5^2I}||bwgNIv^5ru?^nys5 z_k>Cr@2Uw;cEbdvcGdyNc=3zdZ2LX_j`?}8~a?+fCLfhw|NVvOOa!bF{v79@d z6Vi=6`b(X%+psx|Z{)nMOzACuk0FMZ+dAd7G3lJraUR{&D}Bm4vFoCkW1U=+`ZZsvxol!by|4Y|2X9U*_YWa zeBsLjx%d7HhR(XEqvh$^-r zJB%)#0nbPN67M7D2-(lv!bv*e0Xg=^3^c#Lzr8d@cX_$_&#_E$hyKUG@{fS_d|T*i z(n7-IgockJsTT93IK2Mpd}rP+&rW^uT+6cV9J;fCINYiFD!hs0pl;#vrER{y#LQ<|#qo>N2>?Qg)NbDRR@^JC<*@1Q&=)jCT_IwRSTZ)4n76)F%dC7F1Pq?Gd zJD(8PvN|w!qIvD861kFbI>`I!jh?4G7U$&*HMvXmf9QAgg(lz5^)zkhr@mclGH*1! z$j4Ke!e6GtbdbG)L6C!ZCf?@UsRFis57v8I%;N&rNBF}Z&q;YlX!(uAF8~SfWtgIV zr8d6xIAn?;`MQ#MiP5{%vD^3IIrcgC?!4KS?`z&E(=o8=%9A9VU*Sq&wv@BU-mSjS zizseJIYKPYE%h^u%Rn8QJlyo=d%Qe9Om z=J02Mz>_-xA_ZAl8=521Qoq!cK4DS?#e?g{HniW9(VtdP+}p$ba;|XSzOy-b--(#GiG(AD8jo0; zhWwdGl#%RI4Xt_7V`rJf&?($EAe+U{YC#@z@FY<> ztK2+PJ!E(?4r`QJRg%G1k@=HIj5Xsc>XKYs`p51QY1n@mfV37l^-l?D9Ezyu*)kb; zUaA#m zu1fUazH!S9hh_fXUnA@U)WGE4&_m1trTxsxz3Klza+UzK8%W{H;K@dxxg>6b%m{sg zfw+o`=~-V?DO?Fczz3IzuAT-hJVYa~G@I=T)cNjAB``MYmbNL6w(3Tq-e=aR$jQJG ziuG4S8wK4IbOlV4q8>7Q|Ch{G;-i`yU(7_vF_UO80G<;|TQ}d$q6DUh(2^{^PM{Co zVFIN~`myMeFV}aWIABmln=8uyQz{>XuW2n27&;7B1a- z=||1NWyux2B!w%dgYxR6cR95lj;$S~;wl^ZTMW7N+~>n~a=A{r&^XP0h+MKn>Ug0f z{c%f+GvRiY&jM634x-MKVWO>yAgwL|Q4#!arH}ZUxO%SR>Ku-xLD#scv)!nT3dYz7 zkNrW6*2QvLMwgqStb32o87+~fWxr{{NmNoli(!o>r(8F+KKy;f2+w#_UQXljd$lg8XtE)Yy}DvS65HNiK58%Pv46c zdwhSC?~+8mXipm4c`vlD;_lKj{~|Q;<$s`%bIfBY`on^qF$O!=Eaws;rV4&Px^D4N ze~VtT80l0P7Gbc%xp2XabnDvlTHBs4A9px8XPfP3CjRo9Rzykd9=rbYuJSuc5w97`3;KD>QGsS1W!RbRvglWW zQNBXox+tf~(M7vXEDmH!(HoBx;v?LLh+UaW&SyW5Z4ee42;;wx4fJ!?o3$ zgk-f@J}NsPs%SpWay#0z^D-F5k-Kwk&D0*^y{Ox$fUU=AI+yq6ZgcMuO z1;fa$Qf$BF>bP=rYtqDMR@Ns_{#BVHm*F)OguQWtvq{yeC=HpHdn=- z6qG6kVQ}NM_SbG-6k1!cbBpzBRNx_&9m zohetN6u6UAu**R+QOp>b(RSi_u0%5NfMybZ0DPIych{3rGC;Q1TTsZS@*9Qmw`U192ZffbcgKA~!`eaXD0EtFJ7Q z17V3tmvRp_N59LylQW3V5GoG@l#X{rb^r!$0x$4qoz6 z3+Lv`%@%fj9UUnn+F+y(m`!pkzll!M0Q}*bGWpd6mqc$YOI2v5ST&9- z?F`LUHPA5gF?UQFAqXp7tV%?o6$ZsZgZ(knp_0qPd?lYTT&5Is0zk!pv#|fH(bNlO zoA}K3$snP19O1~MDqO7^xT(YXZam>-gAo=O3dF3EmdfBPJ*?Y+1G9}8j7-p0ZZW)z znbE8NS?qT@@$oZ;C$*9rqgEZG@0%K#Slu4!q?zDc6jZv~Eh!Cz_gp&QDPO|7K#&lL$mh7w+l^I!S@P@A2E1zLPNir>0Wi(w1Ff;oV3HOAG6 zP&2&x!rO3(|C5|v|4)NwDK!gA7u;%JZa1|<;RAOFgM{?h&fdkT@#VtHnKkyW<}>Qo zh@!cdYJ*>J>kbbz$fg$9>GUPLdif|2_qJ{QgvIy$`*us~ zuHH?yZ#>!pTC<{Wh%e5x72nZ)ai>%4BByD>)k$xmWl8#DsjPusIK8TA>EK7C%$G_7 zji=U+Bep9#84ddSjH|`o&7R-y4D?aWIy`$CPIdo8@RN=Qg+wnzYIX$FzC0Nr>s8%T z-Ezy{(KWZztd!3XZwz3KFe-=A$Kw$67H$;#?9>oRs^67*9BKH8SH z?Yc#}AND?_Do>pV-_&@ZUO!#H^ydjwNq-r!w6AI8C6(679I~f1Wp57g>#l2d6uUA7 z=jwcF5-DnTXia82!yUPAy>oeLG>xP;P;rFn3d><^iPw8r&1#3V;L8e*wriF;toYy; zI)W$g7XhcrKY0c3Fy>q=nOr6_($#uiBVptrljd?+deIv5meavgHbX+ zx<$wfJX{b1PL^iKqUw|o$j*~r2_CHB$f85H;6o5|D;)CVol5-ka#)a@tzr6QEg+Up z_>~*&Kad7t{HZivRStm>dD?rs;J`{QC5C@JH3cf2HO5B04R>-6x;fs8`<2RV zV67V)ryno4VIeZzsBLYK&h>?jg|WMW7YMbOQAH$z9jcFz8^KVD%7;Lr_Kr3dT&rj_ z-n=h$70k>##VeAb7*{5hhjgmk5P6A>z0v5TMQMu5n?6VZo^vfCW(6s!_0l6oFP1e< z(;!J_qrBjuN?waavu_*6LI#I$<}xjA(zmi7*_>Cs46(F;9HPKf8rJRp7B^uH)gB{C z02owt9B&vAwFSWY*~WZE(g=$ycCEirHB^&Y) zLQzbuM>*dAdBqWn*auvJA1L^e_j>~>?EBcW&YdbnMcR3~C@;^$`(z8g5_Uj!(63;= z691655Zn)Tn6U;M2rvN}9t`{*Bj~IXoyyV}1_M~_&}%*K;c7MP4kL)881nzgqrlY~ z2{Bvc;5j_`zrLL<6SQnf1GazE@$D6EIT$ll*up?vU%@Cj2J<|Pr3wSk5!trK@fq$d z->I7-7^CZO+g%8_I+3pdPv0-`CbO!38tf+L0&kE8CBTHw{CaO2*yAmXvzkVZpee>; z5FildE7$vL9zkOHUOj4PbG#X5I;-4Ht{RWQ>A+Il$c)+Z(f3n%Sd(hn%;$HhSbxN$ zrN~I47)><@3m&D3+XZ6BV^TyU30JIu%^xucKr+mrkwFRN3_!m53kCD7(f-C>TGZDx z2s9#pR%@3BtdT;2d$KL`Rx$t4=;$(dCZ62^>0)K=0;V=a!2vwrF}E zZbUXQV*PtU+IM^;!lb+^Rj6HN_M=11J@pz_%eanu&uP_jJX-g+(_7r8OuYW6^Sg7Jyax2-cC(Hi2f2b6nR3Im;69(~>V40} zh0oq~E}Sx%f$9e$N8DqsR-KY#*21**hVmo2I_C~7AUX{{?@K^)olv>vIRQ%V4Dc!Z z{VDd{;sFb)Cref?Q!FlZT>QwLkdtDIR8;jkWonYma>tI_x7?|eCbvrlixQg5ceNb# z#vD)Ltpji2ml$Cr$mH3_kP|MA2qh%p@Nk-YDFY#zkhJQb)6hDkp;yxN`kX zlE+c2ku65SZ3Y|?9{|64-0;NaiINh-f;v^T5K_%P0$TI zJf2CY9KlVRo-~52isX@DLR?1pI2{%*Ra>#GcOU)>&bcd6NNb>+e^`c*rK&+zQUJJ1MGFv-*~HyMJSMYH*`MN z79RagUKrOuoeRjap^|yds<~92;#Cuo5c%Gi4;16j$E;yv zg%Np!Gf97AJ;HY20B{kQJZHqPXuhq6FCFnNyRmZX>rB-r6Qm+lE*LEZ2w(Z91mF=9 zpM|0)t(4mV-}FLmV$e?_m~YB5j*n?+9Zkg>kfmB_J z!o5)Rj}#Gr>LVsV0G9wxOyI)NzkFZLV#)1c?)+YIUk}f(VIW)eZLw;oh$nDC2HIIz zQr73`eGn7KOc_C3Ok>7j;Hv5@<$GVyjXLDCyugFd5$luIYy6wqV3C?po3R!il)0kc zh3HS|&yJ6eKhFi$uLJ_JAvcYJpfU042;>=Ckb{H=nCmXUDD%PR2fT`Qi!C$Gu4_(m ziSFi@vy{;p;||*^%2c^kEgNOEV$Zkau%!H7{pX^5pF#eh+G1{SexaOc%+_F}T>`3g zKj#+T`Xww}-J zy-4|DZF%R>Wb1>qfC=|wJSKvypCEfV)IoX)QGb4Eczvfy%dW+j$1g;`Mbeir^zO0Q zRRb5*CG~W)PpS6Cw&DA7lR!$kT&!=;#@Kw{FqdUv7 zw_h}EeW>|U+y03EqUllh?f*b#y#?(fMVfo+dpk|tT9%|Gf|;N*V6 zmshRr&8|tKWw-N4oQR57yhCG-v>GqWW;1u%(dF9&bZ()1v5tSj+oN5k#5-hfIt1hq z&Y*XlEqK+c6|qN8$DLDUwhl=SdxSf7yKf4Xei-vAOP|%%YVqoQ51ETSbsRH_)CQTQ z@%u+9`#axhb$`SeTHWmEK+d=mT0Y_|El%V?P#esH@_gy6^cMG@`nP%c2(y}vJSc`c zzd)fPlfp^PIID`@xsK#0PNEKv7?#(tqdz|tO?LazkIY^yKLv13?5xV%E0M`Dpq;Z+ zR4Ube5-*ohpo&3mO0mxrOd~+QG=uiZVDRm%#*Fe3NNq!F-@bhq)I4DC-hG@HVxBR~`7)#zOibbpdMu9Xjs9KIzi# za#fMz%b=9!Z@?pYQXmAlf}_ecs+pd_wwBIGr)^-E0rsVh?{xf9R*tO|9rPP!cc(%n zbB2Q87UsEqk1gFDZi^w6nE47K(x0S0(+r0R3?~(jOD_P?Tt#Zb#T23c@AjnI!kds8 zA`9e6RaIl6$Se&?MEx_3jRCYhKT;p}-uE7HKAxDrV3tWix}H%{3FY;7j47 zC2CYW4G)u9-g)@Q4!Cs*p<#-5<$268@9l6_(Aa88wW>5i?3Sv^85ZYY%0}8?o`gka z{uH9IpW5YEiU7<+D$Z6q1z^jDM|JR$B8@XY!U3xx3i%=TDSCFAD3S#v9RSF1nlX?K zEhp;8%MO^P7Q{#*0au^LkbvJaLF%B-TknhOfe0qnkmm+pN)SS$B=zwmUOGe6Tx(o^ zp!-Zj-8!rvtt|pl`R)ZuOE(8!S(h&V29^io2BA2yRZK~?Y8>w+Yef5rLTBDiz{ohcP69#^2jmP2L0l>O z1oVb!4L>f3HbP|ydFSK+r271+hK`6cfxTV4(rI9Rs{+5^7)jg9SMTXEYy~JqX%h2b zAGRCH1?EK=T?zIWZcV0D0Wj-9aGVYilX{ z=`us*!FdvCz5>%icg=gc-fd@*>$u_;vg_ zE_#HA{&ZBI)=g3!X`Ou`*gLLK7ZsG${r&ZDjaxEb%(an`5r_uTgLkOvVvcNN=rmCw41e1~1N*RJb(*zAA2{%e!^%RZH} zYiIq&2RZaIGug;R{RaES>L&d#$c5IgLE#VYJq;fTa}85sF#`I|ju&Y~&;R-8?M`uh z)__dJ;K%u~na1sh3~X z*_j=EvGj+&-WDHp&^HpL@;LcQ_UBQj{W^#64&`gE<6b(B4A$Av|3I5q$r`~SucqCh zs7M*l(c)uN@5?HYsOM#8V++M7A|C`LQ%+6FU4}u>#ANe~C;J-DA~rEJw!46cz%B2_ zuir)?=*sQ{#t;zmsXb9;gA=9_*t zy?@KAo5V$l6F6_E6vSogi1tba?UoNUtA%>&kE$ttmF4!Tv}-q17Hg5OQj5CQ)3;Ko|%|3DDw z0{>`;a#Q3P5jQOirQQRM*l1sQ#zcZ4KXx{LXc{kQE!#$8*F#wRGQ>(D=Y5-~sp;P6LFuwK} z?gAUAaR?9iu&NpxTxDihWCSQ*5PTFmZBVQbK=uG&SXJWxe?rk0UMzi*f0a)n>Q9Bb zF2w@z%{cY|R@>7;4D`RZIRsH-tTY`ePIm-*vj!DwxM$D1habs_>3z|44hjb6$`pB zi4tj(>h2e9U&mmiW6fE=(pGXaxQT<+&_HT=PW-~qqd_dhY{L#(P7j!~Tq5A@y1lsb zu{6g}1#)b95*K6&X92v_U-(D!F(V);JRvO}bEvJnpD#O9o$oGM`s;MdoitUL8lddH z7L)qvl#<&^$G`n!ENd2`k)6QQky7l6OP5O(+9@F;VkniS=g->`!0D@}n?SQIOAjU@ z*v&!X_2(VYbpBNdlqNxf{W-;#^H1qzOSF9-^P01!QLO!3i;hyO_v3Oew9jnD6?IFw zKEFbbk1kJ~cD4HSL33zZ#$|^HCpWGm&nRH^`qqg$AH=wi@%a{I!`A!K=^CU<4Rg!B zgZ?3j%RK2Oov#OKR;$xVeEgmFXuiW?&8cQQ58F8&c^MPzMQwvl&Cw+yJ?uG2vM^Yw zSj=b1#{?{({kDYE*^cTfCK;Xc;gj;-D06#A$lT0{c(8mvq%ham1LNylysY=ouVnkL zrngQ{w^w?_E14m8(2c*bZlW&^VEfo3C8JSkf=uvr!nv>335Z_xg?7|_ug@P<`g|w- zk<7+s_;Ka-rHj?YeI_b|uvA@+!}8g)lluC)4rT*7q2AfvSMSctIu6vErS9H26WssH zy|VaW@uEBYX7kk~gX%dC??Qw*HANq67*I2zd{^Ptor?%PK;y&?~`_F~bcZo$UPlrjf8wQ17MpJ@HV1#q) zg54Z8tEc@txzto5q9bJ{?0jci2K}S2eApSClXabnbhqaLAY0YlIKpy9(rC9IbEsiN zI$K+{a_=T6hzH%UUjbdb%OqoCwqxJRhoD-uHA0gdV! z?Ghnd6nlq}D=w|pm8m4Bd453z*+@&Xn2-YA3u&SpTNZQ|liaCnpR_e2xfV=g&d+aC$O+mg{8uKbX9wO}HAFgyC7v=s zgU`jkBDpYAP z&->>r#9iTJK!EWLc{`byvmBpkw^X@7JU~J~H;jaQ2KM{#p-A(dawa!(m8BaC866!v z;uM#ntSaCw&WzJ?Y7x>N=9N#vg~`CY=-@R(?mOCHGRRXa&Lw?t_X;$ zwWvjz?Y#G>Wn!7OZ3ww<=oRXPz$`%14af?ClzuP1^BRpa-jdaGUfBZ zzpN>jHsa__9(>I;gZPGMRC{Q^lNOvxGnS;iM`6w4{?7&)z|QF1upES?c!fkAz*UKW zUnl>xU5UU9fOZ6oi=X*QQrp?Ufe0>!{D@un7$%yO&7)ytOvB#E{h?emRdIJ_C)pnZy? z{YWcpiJeEfdCj|0dYrgatdPv3bG7vX5~FHIQT96#x(4cX+0V${5sIe|n@FJ^)+a}4 zld2f0DTXY8)QES4$}x-U@*W5Y4pYFv6R58CW$ED21c~tLyG6q7QP2u_!nSp5thv{le!>5aHS7 z?R~+4ywQ$0kJi-PWZ@KcqgSIt}CRTG28l|rKN!Zm!%_Iy3Of2(;N)<}a9^wGW?quI_Ol0o*}A-a#Ny=qrs6}&Vt(&trT2UtsdUsi%+ zTDxuAy-@T)#kPUR{thkmJ^GUtY|;l-?M-uJ({&Q}MiEAXIf)O_VIOK47P4l^h{)WGSYo zK&_b(t}qxFc`XVO_+bW0*b-pcj>Z&+c@xc@f&q($_nywIc0{#WN1(y=FzGxc4L z@;hx}g$66CK7i$xgInh-0%V6t+*>aOtR;sIss}%(Qskn8HPp}JgT^UiBpv;ofy_e=r7fdwZIkoghv85FtqmtnDyG|=uflik{R z5n^L4Op#oOWekYQArE0ibTmY(yqFk0a~IaWW>1DX3th1VOw$K=U;}so3>;aLN)}Fx zBB#rN=lbwFEF$5(B0#O6eE?Y4C;*5}RYbr5dmm=n(wg_SWek9tvUmZTwP>JHrx>zvLtBby-TXwrwg$^0cHBo3jGa6TL}w<-lsXDEdl1@ zW#Ih7nzD@H!df|>HVIz~Vw7&GjaV87iJ`y!KLBPFT=V~bCVvVT&(Bz5XUt&9L{w^f z5CwpNK#)Sj!1sg7)iK8t`6{Y|DuLSnftF;xF$`R1p2J;%q!{*)bg}y|EGQw_5laD7 zL%d?4SKUWqgu^SCw6neKI>MKd27S3+OM+-EmTJf(M<;f05Jc$J+C>n~3WOCyriaR1 z;6;?P&*YX{|IC4?A@GAh9sYUFjb1#b2hpl*Og>wP#J7d(_FvweZ{ zSvEm>;71Nsu~a6CVX$@7OEL!Xl$ji=Fo3j0q2UD>u8;4L={Jg~YC;>f-c}>yxuy@F z<~0u0dWKYGHFo;`8!Jk=Z=mgNO38isP(M9oq1D;ja>bV?Si$hd`qYIRE!Af&*3Mpj zd)W1!{tmnKqt-~t+_c}$_A&7Q3r$O~r~~@Me6+jP*DmQg$x%p%?i*)YV-P~;6ByXLB(Cd!>n@ujgA5>m*l$sVDor=(aQKs^YQK~5seAU zZ5&e6&1X>$srF9==ul4vyO&;f$~6cPQo0pVT0;KC6aVXG7D+bAvd%wJd*!xVItiIE z7ysDXAyTdN?2c!^9#0*8;hd63N+&~R>DTM^5y?m046UeMwtuVp)X{l*eVK%})XDTJ z==HX>*72ov|1v~mx04y|RTDY9v_og+Owf?O+x3{MXMf)ES&LbmPyEN@< z*n>XxuUT&hisJq~tNy##DYDCb!2R5Jp@;j2TYCc@na+woOprYrdQcqh9rs&cTz&C~ z%TFq&PqNcBu-4Nj;F;@|hOf-0A0OtT$IeR2n4BE(p7Gy%?P_G`kLHnB{F~h1HE(Z_ z?D@vv9(u@x6#RN|#mqfS|48dV{QL8B_dR){oc@j1fAuI9w~DLuHT-OpJEC%jpfEQN zzGmTSy0j@Y()sKO<_xFV&V4iBk$A08<4gR2TBx z$ib=0qbIEZ1S$GrE=Rd1Vf|r7)LF%Dxp(N6;tK9|7T<+;4gBdceEdMx06%f{A~Ubm_I``b`-08FO(>P1p#0m zUYvR82rxcxDINwu5@;Aa2rEvG-Vd1_oMtM1D502GOn*bra%jAtxV2Sb=EI3Xui~&X z^5XU#+YuE+;T01AW%eVPsJ!GQMk4|>P59Fq1@e;|&n6mC&jTmsX>%nxF&Qv+W>qi) z!~s6++-ib!1ujS6-J|4Z=sK}GH7y{vB^Cp$gE58e&iZD__0hh6Z_D4e zG-)um^&;weZPRN7;Oe5&-4mgC(3%bK7eg{pOe8sZAg}+v5B#a7%+tdRi)gQ`h_5}Z z?X8^0qcOywBckyf>JMG0{&TsYi%zZ7FlSLpG@ zNbO`eZeGX3xHp>AwU!|DW!}5O1UcFFrgW!*iB_Ka>O7K#H=?FEcGopwS*5YHI^GEc zS~-F4f9-DGJAV0%G{v|>#%6zI_ncmJ({g0ao#aL_N!jo(1DQpq2yM^TiUM6aApT7X z)s1=I7mwN+w#{UUqm#eX2Y z4&!vE{_Xo^M+LH7UL`Eg@r5&tB3<;;BMJ>Vgv&ZE(-pegjPy}PR%4`FLYKPpSX@UqMwd(8_H3 z`+)7YKHYJ+l99fCgsuOn{FGa?tNbT)oM9ewr50BGP^C<@MjParZFfj2aak?zS*TbR z#5DF4+et1>OmP*Q?j?)O<8id|PEO9;m4(J)P7xO#HYcABndX}iBJniEkvy#5(%u*% z+$4>5_|hO0bku~7Rx%^Yoosc>FaeK%2#Z!WzIrF5ta9>FqnG-aGesttEGtHabOup` z4$Zl{k0nqRJg?#2b!L2t$az-SZdR_iC*j4u=rwGdq9vV{kH)Q-tBRc1F}>mAwWg8f z$w+i#gcAUA)LKDmTY2dl%o*j5+nPwOU*hLKQPwcpAykYc+oHm1UC2r z5%m$p1u?bKZ~I8he=Sz5d=UHH%e#3uz9Z`8qg(eAI!wu{L&~kXf~on9tEevu7!zCR z8>#%M#}84}M4Y^kKc5RnUp9^56K%cpP9=HNFdFkukZk?v(KTlw#Q-!o8-cm*e@?3o z_Sz!SeU*OzneL)!7;KdB80+{|Y&Dj(QIVl7FLGJ-Tj@hp0v9Z^ovntxfEBHun4%;m zQy_rUdI4+ZKfq(!8w(87Q=dh9OGj;uDQwB07FuRhiWF;-FbHCSn*ycD=BNyj5{e^% zThUDJXVCPxF%WkQUO>Yq4KrZ2Aril2e&?K?!J5Ht%nktQfyx+L)x>1Tlyze}b`yxI zFZpnHMdk`qQT{ENz-6F+U{#4Ef76;ib9dcX?6|G5$igOO!~!rLzN>woNED;^R_?;N zVMOE56HMITalrRyB?a_q@hl~xh8RX86vB)H8eA+Qi+byTUjpFkVlmSff;T{{FcaJq z&CXoUy=_{~JW-P6f#Pfqeip`^K@1NmDA}t04O9xn$_4I0m{W3WOA{?ev!9#SnVBMd z>$u@S^u@b~@@H=A`@fe)FHMRn%xn@RKTrp-*yo8Nv}&PgA*RDFMCj81p2i)7mH({G zlgRfU2$7&VAC@S|oj?V=>{qN_4k8Bv_rO0kjwi;lphC}YCT{D%RxdgF&wa(d!TyVs zrh)P-0%nSXK!JN03X^<@fk7z))G>G*?W_nLG}|8%4cB>fR}3}eB&=XFqo|58y?*CH zdsnbhc;(`PyY`9ZezK(4Nj=80%X2?<&FoF@7Lw79$ppH=_aaWhzK7A)rFW7z;30~E zO&Z?5A``W$VJF}(;UPKgYrEdP2c#Ex`p%5rblH#&stWnE>DrhpLrEVYY-h{MAnU&zk=rp5VR@aau6tV2B93JKSAIPwG-fi`543D;Q(D0kZ zFEVru37LTlJw@(~)25^y%f-Ozzqft7L7%=>7R-4`x5Pz{dJQspsEon}?=a`KtMPqh zszVnN=j&zh+0&XGgv6NUiRe--$)!n;chz*kg+-H)qB}OlzE)WYw`6_F0)9Ui_nVh$ z+NdRY`%kcZE?%JZ<;1Hk{~k(s_3~lIzE<<_a{V7;gP)>z3B|8=elGiOL|zZvIni0x zx%ED~v$f3QI@!rSC~Wa>yrh1GNkXS~Xbne~@hIwt?)_U0@W`ET#dD!s=_z;G#&dd` z3}QcdK8DndB{b!9M0L_TZ4#z-Za@6+xpT>6c7?ncWVlM&->|1c zdDMG<^uepVcdpAuISn1VaIV9EBMU&`x%}a<9oPEeJf4S7(iSf90Fdxm7_- z!cU@UlQ_X~kJC-rt1{(jwT~x|zFI8@9*lA0mGclEVO7J7C%?Z*9`DfZe0`$i(tEl< zarwziRVZ6$TyNcji5oc2d;Wm}1$|0UM)P|DugpV5X=1{UiTP1V*;^ zbCvu9T^O;6RZNk-yOx{5H6w2j=KG>PJ;?01IW6TVd&-9JbWpECNTMirZqyn(LaQQg zR{(KZFgCCJnKN0rr9Xb=eq8B`<4UbUAOq1BOJW#an=7`FY#<~i16q>J$-zK?ph0rb zPkOqdQHmIacp{fbOw5O{5V%R}R9-90f*A&s7Su!x+yj9Cvx_usUA?{^FE1R{f+I?< zo&*@UYZ#hI{1m|X5&D!{x}o>x#Aw2Y3Se?KM~R(@s=N8JQI%_YAQ6WDP%^qIQj$yi z@YSRri!s4dWQdYLz%*}d+5iAJhbyUEdB;-g(sn#-X=K06Z+MZL7>ZDMe(em7fGJ@? zVb)ABMyi;IHMTqZ(w(RH9ly;;Z`Rkt;5=C@_8;Hf|66JNL@a=BIS^UG5~NupXoF~L zqq~Un@e$d>@9+0gEHZxvVa2ShcaQJU{o_MEP?B)(?&B=GX?rvPHZCS|O`xd4B`^|P zQ1_aM01}1}XHe)X2RI=9M}bMZkKRwGNGPy~LHS;>4xTr7`p`1IH!BtTD52YrbK971__AYenT4{ zmff8v?OLAODXsOw7~dyM+^N%D3-QX1-t6=woR(*_8SJ^A`>X6-eIQ`3wUmCQMJHk* zLfyY~r#VE-hhFwMBx)$1R2`MXH1nyx&+A-~M54ZvR+Eb;{DsYcF;>e1igd z4dy)K7F@(^oDXq!JU17X@AY==^trkBJ0tJh3@|9!mkNto{41OAH*wc{TlZe~vZ>Y6 zeK9w6*(GqmE9&nbGX}FfU3{G%Y)TWJ$Mkt5`3%MDzeRj3jhJ5uDXvkO;q=Ldx&@Se zH}*K8UR;Gt+@v?Dm=J$mExI)Kto0RsRHWqRXWb`O_i}Lko3;P!B_;$rj>I=gT#b4R z`rO^#eVz?em9g;H(@o>*Ax}UuW{v#2aXv@u?=45zPo-w7WN_-wU3lzl@baZYun4&$ z?HIhTQ9OV~**P_u`n4GC3S6p-+5^E7`afJQ3y5>k@3k*_v4}|BkhI6{J8$^XNX>FI zxhGuhV*Dw#ke%nr-W;1C7{*OILF7M>GOae_>Dj2rb1L3xA?$$9o=@{^c`8wd4twrI z3V?|q+{czH-hsSaHK^w%xPMn)#%P{mjgmoAF@)5^M9fE!IlX|-!!m|RBZcuILFlgY zCPmn#fbS3K5vP;j!as}eem)zx)d8J*{am#4hGhCD2T)yjh#~x6k1>bz#lR4DdCL11Gi;TEI*eaud)&p8cfa(BKjP#r(7{Jg=P{} zdo%umHyK`Z0GOzH5%tY|#8vnbN**%hdi;8(0^sVy;T(}AA1bo8Uq5Fwg{!A$A-7a3 z-hF?zaM@86pW^Ox$<9gf#w}i}8HAUdEU(&5E>D|)4Ayk2o__G-v5XEVA~LoVCK7>VfOn_J{B_anH?zZ z(EaWwsaK;T*^q3B@-tW50-V;i(%Iapk^mCJyoZW`s1m{dfdbxoQAbc8oGxQ!~(pU@wVJV66hF4^0&{AO5iQd*gO15%0 z%0Lk)-Lfbcosa#Cyb8{TWe0}A4+HKS3VQramf5B%UI|Gkhwfqcag$1#{aE0R9fT3_ zy=}2vtu|t{q>%bJlp9Pj!962MpFPJBxV;&ZLKG9e1lhns;n1*;|A9Or&k1-UX>2xH zVS5Hmo#Y^X-1udKEJR2#5L4SW&qZjmU%}=GEX5*1&noRiUr{YSuHL zdSL#Q&#QE+i?o?888s(W>062S0FQ~QXH*Um?Gw4^z`2QLhv3~l0I zhf0zD-a$fiVs?_&=^_ES-IwaJeDBVBKT0U5sq>IY-0TQY9~aO`WT&)?4*PD;HNLoL zpsm#;i*FGZ+&#?kY>!r%rDw-Y`P_0NLb`oB1bkBd$|FL3Lt$JG5v%LRO{0SbP3P z$F#ji4QH9-Z?Inm(AUz3?C1+B+Rqc4pD&3wY-5EFdSB<{jM(^dZ-+?Em-RY$4AVQk zMb{V%e~n-#$+rw&;m{|4uy>8WOM7^_cggFG9hppj6m3XXbJ21gpl{)&O?-8%Lnfk+ z{F{?&><)5?h`3+^in|DzvqF#+ikFZz4;*lhfcK~6oXN3=z?@0z&m13e9E*d=<8 zZeL@QUM$1O2XUh;zH#A((*@lkkJ`6+MZwKFR|%9J7cKh6^%U2@n4s2S13uprmz80* z(Y-460wv0H7QVu_EF7BH__^#4v(mDhkbHy}ZqJSOishmLs|nOQ6#v(;LQ%3tW4<;* z$ZDh{oL@`s6!V6c>a;oYR6~&W(eJ>o{U~}jMLjz%XHg6=!XF@4M9oh|Z%T!VEa%nV z)p}!Idy}P;ulM}?ed$aM&3OYmIH69AIW$HMIuY*$RRaZnpQE4QB(uOYF>EKqU5Pgc zLy6<2F8&PC2toomP+&S+fY#f9#zW36xKGpKC( zy83>drSHyvpw>no%@qwJBFkq$1C_$L87fjVWaHx5?ZmsjI2JEtcWLAiQHm)nPFqwR zALOTb_$IOHt#0Ods<`7YZm=ZL7_B{|DCmn_0N^jrK<$Eqn=e~3j{SBv*X3R^>OH2e zttBA$^cRmcaxd>`VLQQ1KuCUMgF8L-F&s1*n7M|Qu1I6E%@y~K8;d{(b<%FZgQfw3 zIASP+z=Z*oCmM{?Q$pq8+<^LgA6y9>nsJj(2df0>=H8S$4W}oYoZkH(-H4sVeVZ~T zDyCKwLp8QLPP9bN(Ip;P235S?AfGwA)x0k@ALrZAYLWVrh*Xoag%ZKDRuHrT<)!26 zXgN?VQ1@(wdrn6?lHynmP(`7>5n(0`z}SrfpGN33v|Xbi()F;eBd zseWKF1eM(%2sV1JWSC~zh8}jbAhCu~Xmg;$#qwpGOM=$Ee;tj(;a0&VlopEDc%!gz zI87KJ2EjMD;XFpEm6`1T+TsUr--6pn=VCX2>wg@bXE@vM+lLc-goYR~ zqOn(KB8?i=+FGlq5j%nyL5otQ!xn_9qA{veQG0J{#VA459&OcXYqX`MI)Bgi|Ge`e z$HC#no%_D7&*wb7#LX#$rqNvMz8Z>IbtxH#1IBz!~6)vZa%=Q z+XStZG9S*%Cqk;<9e@9jEQ7zz`%`N*}f1Gh-`;B;5B-zt|Tur z(?&AXLzHK!+12NRW20%#PY5x%sDo3$QSW}#<%Z#1@)G5 zU~Bjk&#$2Jbm=6HpF;RP<@$8Ne%a)owbR78*4q8XC7TL_X%>o0mT-nW- z=Shx69WQ&(d#9ZMu_sfb_Cn3L!^9%dZl{3Tf<_JP2Q}4Ua!(QJMq{|aj^h|HccAN) znrh_JdC+KIW5ogfx6Fd*@5R)-S6UWGaSc@Hm#=SKaJ_RV9NAeN8K(clIZOMt`k6ZO zj+y3Z*L)UXw~%NTb=}1k!ITDnHc6vP_&sHuLv~>J`7dD+S+lKNu}bql*{SMYvN3Z@ z@xag$+t|{&HJbTrr?Qtk;#N6oCOT(ucWA+>j&N;XmUwL6{3+ic@$#iL5pqLw*ngml z`#EA#^Y@zt@(YJaxJr3yz^aA1zcV=?Z>Mp?5l2ckBGEdRSEpYLTAWx+ zVEogffImKKj1qNDCod3e8ZcAgJm0Kbb92=%FvovSOl!ja$wOj^U(2Vrl_hnx{Pt5W zowNQumxUefKK2g}%YNh_kfx2YFZbb7u~)o&nXvfmomuDp%vfOQYLENPsDa0+qAO=S zTpHKrKWi=q20j8e8|9DzqmTIVBfH@mr`?8|)$|(9LL)(^fwGRAQD2Lg7N=#UxjNxp zDZNWq$u$r08E5qE$Ms`Kgdp_uLqW}sTU@&Q^XHdRjhw}=W;yMHVlR_8S@rb!_}|H> z6S9Q#BgR2CA1F`b{G6OxPSV#|K7%ifG)7CZ1#g=2F-_Ds)FhbpQ78M@a#>2HGXuDU z77o=zPkZ>WY&u-QHdN2m2c%?Zw!g0?^mF>X=hD2na8E4gi`WD?cg=r;z|65OtWm=( z9Ad`rw(nK#W%8%wY()s17}9sHv-r<_6e~WS<4sDq#Ejqgd`PwauqNmxX+xNAQdS9c z7@W|=*Pu-NfH+|lkBPo+)n|nGT_M7E*;fePoJ9J z^ee3Urf7QT5Eexk4P(M@i45p7wx-%?c+>a5;L`X^kW8&SYN&ow&Y)Or;k+2Af`46n z-)(kTo4-A~Q2GJJBM40~tcl75OJ{KovoemA{JUPyd2>lqQx*={smdapu^m3|RXpS6 z6`KMp)jXt?Zp9H~Fx0I_QRhMZ`}{99e}ui%wbvH3b(ut(UCls2B{tui-Ik<=^69eZ zlaL~`9TU@}dw(L|x+I7}3-mD4i3D0w@yA|7D3%2}5Yy>d))gOEWmE&`<7eFJB$s9c z6=CpC6mtZ2Mr1cVH#h0|7t{v(0mkVzkdx$KIr>eEY3lxg6`@V&42wEg4tE?mSs2*F z81g86Jt_WVM-c{?K(BZym5~WM=5oxSPY+q7pGWsIzgD6}6WO*N9p$2~LkoVoG+a6RlR^CS6_k!2!KUm=&adHXBCfr0yf<+ngf)> zJVLl0T^GDk3m8W$;(Gqhl)B z>T(J0ab(V5bF@kTU*W<+>%d)gA7PXE&KYc^IBh z=V=6gyx`?6lgPv0%lgB5libnNW1;U@`{M~>ev!Jiit6mqcJydSb?_f*pm-fLZ@??TC?);b>Ii}`dN=oK9Q=owK$E;=IiA~-Fkj#?et-8L zPTjjB%dK`b6kzCV<8C2QD$&mcK6G~0<9?W=uKGs)I-a?9x#e*UNELKCOOTZV40*7^ z-+A&xp3kk{;O=xMM&v|@Tr>J zM^VfhH#g*Z;SzLOfCGLqjhw@V>FA3jtMSJRawA>nb|EKCi*VF&43rZEoHU>8;lC3B4Y9W3nhBvc)wzxtgUJpABT-(#5Y1`H9EE6ZhjG%YslUyX zHur~Nw0nsd03-~kQW2*Zh!1M7&N7hS0oN_s95{%8hBqh05R1UDc(5?0tcb-P7*JAi zfbL05oIW8DoJ=tU&O&oGiLc^EQ@TsE_@Ve=%~(!KwQUYV8k?@g$NABiz&Edu24qCz_!NqB4kTHyEejx;~U>Cj~n2K)>yY?icIE!m>0|06H*=MW(~@ z)!G%BQ1C|~A}N#&!_XQTr___qc(Bm<(vg@)Xmj(an2LKTm@RB_ zZo%;5Z&Zc>h;9fxGGvZ(A4gAJBfuTrkUWC08S(4N#z4W0!Ew1{KL5cTm|CSuC?*lK zDT~Y7*1o!T8y55q8=8V)Uk_2cE7E{@nK`hLM75=9gC2TB@vp9T2}&xIo-pIbd2XBn zYd(En_MU*oC zR_#gNcHiN&(Z6qi`|Qylohoq`;U9R7Owpo z+)r)4s3&g*Dl8u_ite{MNgl8o_M5d8J^lI_*% zPrmg(EqiO7N;+%0?4K82P~3HZtpwuoaT?X+p#MNYyI~Kl|ArM0FYoS^JZy0~wU=6> zMR#^*6SBTmd;EEKPqlZ!q1<)lWtCBsQ_Jj;-JJpY>$m1XpXba1=KSS)a^rW4-!|lo z->91Wb)a<=s^aQ2Rhi@L?bJEfR{uQU{%5?(pG?QbEJRuTiy`$Dx12d`R+kx6>0{@| z`V&*1aFN9pJHh>~nOmp)=Sy1bQf-afeyzD@IDF-Pa0hP@xV$ytE?Yaym28uG6~d^A zQVbB3{1aOo{XwnMRkc^uF=5`Jk~v_}n@q#2o!sY(;mV<*P%Z-}R#fBG=d}XsIL8M+ z*LBwPiAv0jxGk27eY@N5$hv;d8*-~EpPXvdi^}e+SRTFFRFA)2x<5*EQpS*ucA7Ob zA!uc~kF8(>y4h0@E35)dAcbnXcsK3pfm%XkXmK>g1>4=-sSG)p(OJRig9X0|#6 zXB|trYb9}Vp7K)U5>|sLI0lfImtzXNK%PGY3vDW^6gJN`hY;E?{_IWI7!rxW#TKm% zG&W^=xD0@mrYVF0d3PdSF!86|cSy`Dv#YrHfXgD&M$ zocBXC-;?|j;PXmJ$Wo`w8GVuefhM(B8Sg13K>1qd1Kh@w5853>KeA&qwpx~fxfnpT z8=?0EbHnvv9XJESKaf#qm|U1h1e{*=I;SG!N6Y}Z0WcjLD3{_q-~{xoMN%9rTr5(Y zxns{GGx(wl<8_NCm}^T_@rGT6yb>mHRALp#c)p{CUUw^eV zt;=FgZ0vz!5LGO98$*pbR}WNsKw0 ziuop07wLx9fKlSNS!4NL^@j1kwsr8qF@bZJN=T~a(g=88@XWRkOL$TZWf& zmb}CL&EH-IP1hUYSRegbZ&`BWWs~=HK-UtBz>hEln+L|S+NkF`OPy6NE)L&RHTvEc zSsqoyTv7UG-aKpx-@B$3iYh4g2Q4-CriJIzK&!|FpjDSYX0%X#q+XBrnouQGFS%pOLUW{3T5aU&G5 z_L`0us-#}ya9%+-)DYDF+C?Ro+8|e2fac6|@#STwx0jn^WG%C+cD)}uz7*Y3At|46 z>aDq3-(fjK;(Bxze~ilsw!LdywG+PR z;}NMJD*l!hYd-odwdDjnc1o)`imQdXdNw*ZymPskn_E-@80|Zs9(MPDTvDs)!T zId$AlSd*ErYbaTVZGF~pkE}Fn#q?F5!WYt!neI8kS*akQQcE?x~OHR*Wf zpyuQkIzr!A|%zzmi{vDsPIg@_wNS$yNHwWK+z;(^&85ENY*dTf=;5V7F#`B#K`o>LvB!T^dM8i zgF;NvAShVFOb)O(~7-gfTC;R-nCzIzrGOF6U&ZnlpU>au(;<31Da`P7_XB09Cz}9Wco4`r4fAFfq8H*oz_puU;ZT+QQSv7P@e7trsfXxFCY1rZ z|HRA*s&PCVu<}GRbQg0!0gv!Ezu?*o&k|jNFE2?8jt4SUPxy=_VQiQ_b1!;RYCu#~ z5EO2BQTeSp7)Y{8oaAMTJqdqs)$;`wy9!VVbTFs<@OAW_NsW;Xmj@iV8_YgMm^`I* zKGE(zP(D|c*qVN*pvOmG;YGY1<_StWZ0go|+Dh_BXkd?E`Io;&{r)r2tDhpN8Pmi@ z&_tg6$<)vB_r`=MJ#v7tHP^JGd4L4 zbvETB-hB_`gTg=BAk)3&u>g=tKmbSGOY-L*`KZcCbf)~@u`c{I6n_$gesG3-mKhqn zot4smSFTL9w{|Y3VN2+hb(Q`WS%rN=b=gF@_8GA8wYj7)I`Q|0UsQy!-JqFuzu_VG zxOdASXo%eU4mz_K@Hp%i5%habQ(eXObs&TpCp|fjHvMR)z{pvca;#dB7<8?2y<=M) zkWbF9ZK+XJZQbX)y3gk5_g-oIzUP&kPJCROcf!jsp=s}s9p#>z0R+@tvV|GXKufRh zvig&>$mPqfzi)0P8KIQ@Dyod^FA92bjXT`1S8e`cUvkYeo_tA6JHdN_*?Z@=fvbg7 zeQk};-D?R3UQs8{y&Ju{)W_nUoNW;F7LUzmd+Bbo*Sw1hS)mDNh!~&ivgdz2PyY43 zQn8vWtrGQg?yFg)g(m6s?Aw;t@k_PGffv31iPoA#xlZ3`tNOZ~T37=;(7E%2r*B{R z=pWd=L~C!_X~n}?4Br#@EDIHQ^G#l1Mvy~E*Mq@-M* z*kv)t_N#u8I}EpnwQC?(MO|@fTiE?e+-(ug5#$$G6~L+IxH|{p((a=0O?KnFm0+$B zd=k0a|5JhE30;;ofpW+iyT$an-@SVfuhb;<#qMN2rR>cEN2Q1*2c}~%xWAsn#u_jg zyc8l25yTT^HU>0GmCX5H_le%p5EH+yILtok!Ze97NCK=mNUB-xJS)6m1neeD!}vj3 z()lj&^*cJ!u-nr0;!(XL{CzUpvLn4hgY%a>gf-tMFPbU$S+xr$rp1WE#EH<$oza8$ zp+)UJAA~{ddmpkIW|?|2Lad%TaS3Up(1$hhg;V&dN53S1xdhSkvSO;t8Q(xu5^_I- zs4Axm>0cM;H6j+utyCPK`7UGEyxv=SAfmaMuh9B7i)iV*oS#h;-${Qv-v=;x{sTQ2 z)Td9;bVu&X*hl20G*~_Jn)E2a5V8+gAcqW{a*5rCr4o{i~41i_8 zPZ_*2x4g)J8~bo*i4;;fVoKmz+df5!!O=H!KN{*_Fpw!dEOr4v;OamS0P>fir{nyz zx2YpAsZ36u%I|=t2qORzrLLSjioqE0_EdW-9z1jLWuo!_qM?yQ4uGEi1g$RTBa$8; zj*%mJ8;Ldl`70oAn z9z>+3L@z$z@tBdh$rTE(2l}k(Pk@BPPx$n0I%-g0DwpQoTgO3ut2mC;r0svhP|SY< z+;($gCV-;}O&(?iVzgFtMDY#fZyeF<_kv?%GAucC06HdJ8kAhXRn>esvB^BX?p6X|^wMhtTWx2SJZAioBaQze(>tTBqB83Uaoyl_c zE!Epqx`pj)gPjsNioMf*21Bwnytr6izvz5&qk()Jp|#~|JwNv8u7kfaw<>E;6XzX> z9#Dp?Q}JFNw5#)LU+}M;!UnRtVdsL6vKFeV+LZ$*!k&ulltqa#kA1h2t?m5UDq43C z|HfbBhnVc`{_A@I3gG~%{b%-3**u5cWtMw85rcaR*)K+0@44)(qFU!{+%hHz zS1G_tobn#n*?Ikyh4pn-TN>LG?z!nS!7-@5!v9U#Q0;I{U8v{&T@wlGrmV)k<`%`A zl{o`k)wy|GTwUctoyDEE&+puE9d69_sIi${lNE^!tDbNwRaLt-KNz-og)c2guka}e(RSCg;)0w zH+GljUwJ zhfKMOPK{|{x4iwSSCfT8^5_d@{G=L>>hcBK)a!p}oNl@@oSVvsCCZ?&22xx+<{{HM z==E~;h`O%>pUFKayQJCbye<|l{sL|d_=TRSz3?#4ChD<)E-A+mU=KWEJcIV>T;#tD%i*q8UPPkn znNfPO>A`CFKSlvDw847lwy?;R;o#5qP(!m2PbMk4+vYmxvNe|%SN!BDx{YidWnz-w z9z3REn1KdGf6a{rYFa*5K?Mzhme&Px67(*pTW4}TJR{FxHg=SJ#+@yIxxrauL}BEG zB!OGQYSPd_56>v_%a1ui`AIa%&uelyIzYFF9u*4 zP`eGTXH>oE5d|dT0+KJ$r*6?S?=@oY`7?%)I2$dInPppdk_gU}hha1ZkW`?`Gwj`> zj^QW>2GMoQbpWIqkdOxqvz^8L@I;abrKjwo+?Q7npz%q^LM387OF3NcSJme97)N{u zB)CKv_@m)f0F1&P3WB9a5<|G-N;$$bf0)=2AI3)}2fBO*s-9;?%9$QJ(blJ_exirIg72en1m|aWa=P=w@8w`-fL3*bF2enc<&H z;KPke-xl8hxJsbi++2$=v<#d?_`*SFm+{LMLe-1k9tfUUkir}*JE~mpj*gD+JBdGz zN-ij-{E4N4ko#a6kf9G9T6<~FbW@6;HS#<*V6(MwZZ|k<_orC`yMzB2ABXfqbYT7a zJ;5IKJiu)I8)Wp^nj;Pp0SN&=T)Hmo7Uws3oG#@zu@FyUOHmuC7P3X|0Hx zf)@E)fP?xN6;5ys7m0^JBaaUj=MKoY(Hv!)AMfrk?%V0AWrq@5F0EK})Yy%?+I=xY z9dN6=3)p^~#qT{XlqTuCKUFF1eUraCV7GMQrGIL$+7I3%Ve6=TgwWjC_NT+|{`Ffl zcyg!I)(#xjA1|#}6g|ny6Xlhf$g^*&&O=#rj|Y-j{R5cBZTHEJ0Y|ef0fC$fOD$qe zvdsd5@9|HQzShePOjU0$UHvgLQMPMe+3DQ>w19cZfC_(-^|-lMW>0iU@~9a^y< z>jeG8W&H?fe@{T_ zp6lMRIL;)0+^y;_QX_;mYVN> zfy_Bx-4kQfm8r93+BN|9`?Jb&4eH!SO|G~e6CZDZ-X`Z2AIIjmQ^e0Jm+H>D8EoOy z4!Kls+L4$^jrwPjE86HQ;dX!sa(#|mj5>IZJ2h$s_Ug<4yP+H(r{KJ5{4a8i^IG>` zI*vmHNx~;?I+ga6rYq-!J3Yy3z&>Oysju>Q`@y>p8?ts8w9GEI?nx-b7oKbNh^~2g z=4&;F3Vd6u!wX(;%ks8|Z|fELjm%BzBYCc$U{KOQ+6kQ}5w@nK=$Qa#!DQc5A#qcg zB8F{z{DxakS)_TEgo?26ZnZ->Q-&O$P!E$7;xrN(-NTr=Ec>3WIfU4UCp$WdyAbC8 zlu#}2^fN9(KnaQG<4^HxYHSWbl7}yN5P6;%ES4=$gFz494zn;*NZK1+RP#e_N7fM8 zxR$VWK{jE&m6(wbka+xcAL=^W)~ihKcNr#(DW*4TX;3phbO$vU^$dSLW2*!WrYVw= zo#BJYK?f9=%-~O`$fdeJHv{ZNltS1p)j!}0ffRGBe^nT_hn9ILy?XHIY679=Wpe9l zp1}sN$9a$Io<6+MTnq9V1?`i;zeQ&#TVwe4ly4%GXQt_9(|y@0nnYn35~vh%==#;| z7WR9~nn~KA%h3`~bS}0QVjqAsy`=<|XMpHamM@F_hPry;zmD7;Nkph%6QKWoqV|lj z?s0LT*M)kf`u@Ez~U7Lk@9%klSA784cAA0 zc8rcG3&rFP^MTXe%KHv0(yzjgPq;uy<>JH7D8{UYeB_k*Mz|+7#}Wy6&xjXcEzR>o zu(9jJv*>y;^QA; zV(B?XNFs@ExlDtbn|NyU$)SOjdo^q>OJoTY28(Jl{}8yv?7K5%RIQ?h%TC#U`^_?B0JBsWrw26i%+XC9A#=2 zIsUJ5h}Gt^9RdEaOUk{Y*}am1TxEZ|<68Rfq@^c06Ywtv@~>6<=VX1HsZdw&agChu z-mNNFbSOG^E_+W{YYzxH&TN*3T(xCu%Bkc@Hy*aTqU@pW;H~5Kn2YJwMCYK>82cpO|;-!gn`&XYb_ zhhHjRAeW>Z@ukg%P(C_)7+u*FOK=Xa@IPy-qa|1sbS^V+^-M+Gb;e%HZ0U4p)`GX# zlN7f1euTXeYTKWXDX;j5n$Y5Unp1M#Y>JOei`z3h=S9PM{L{V}2chXJjRFn(-ci>s z2PVC+#+U8y=KT7B^BuzF4fn`AzC$j26DF3ki(fwYQZ^zc_vz_=LsOLF<9y8_$Okj0 zUCY+@&bYcoMZ3GqIJ$9 zwO%>jZb2wNY>uWqKTzS;_smyv#*9DL6_vJAX-L)ylyWWo%N6kYYz13Yc(_IN@-waJ zjG~rnvDwd+eoH6@zK?Z+bnqzFHCCI5E~5F^ES*&%hETSuh6Kq9H>rc1SyW(|)zbzS zUfXOH)Fr*XK?{!uO@4S2xY@qIq7CY(p?k~FrvAJt%MH*5Q3t@*AgL|h zMpWyNt6k1#6vWZ~Qluc6G@w6%9Jq8*2KI0{WJ54E8!U}x*NoApZX&LO1~Q8ZJ!D-+ z@y1feLd=M$1G-8A?jW{b`2Ae`4LKxI+bc;5mdWn_dw?@1qgV{8%8Zu`$Qc&AuWHEO zZ-PoUv{dUduithc=~s`&G>J4YZJ%4W<4O`q&`o(Wu3SKEk+gR5d~lJnjpPR;Wwc=T z6A;|w`Xa=KIeIBu;%e-6m060v(|SM)+kRq43XyqfM-Fv5gJ@{n@8laML}Ky~r-(2& zp&CqwvdScH4{0VUQBveV&N4y)MkCV6BWx{Jr%2<>W*UO(-uEfIW>=KWW6NDsY=4t% z)rF-P52tZUN%ScL7S|i4;p)4UD?x|qk-Rfmz`opbAqKQ~2Y0nWmV1&j&;cI?opEDJ zaly&(C(tzyK6UE=NR*Nnh14+%Q2k)dD*$;u;0Vh2Zc{|^Ec${4XdOtJbSqits3OSITVV;?XSHZypDf%CAqq&^|-N; zUw+D^5BT@QD!~EcGR7HpWm(p*jS!A7=Z<^TC)I$DB*G{VIba~bfz^m<0w^O)Hw&#e zXbEK=XpRe)H5n}Cx>2OFlb#PXbukza`WcAg#0*ZON#Be+VaBW!Q5MeyGP{JO9^YyNcMpFL$g{Ah0LT!pvRZ1+*yVudf`u6MV&!7gil7%t$~wGfBhkU4T< z4q1f~a0ucdC_qYhLMqby`O%!~PnTcbNg>ah>a?W=s7}GbW>-yE@G@`Ck_SoLg80!S-r5Y2cVZ{na-XM6eRw zGrj$~tiIIqK^4521|k|PFo&qSXNUg1)e`LKw(IKF)+R9VI5l^-vc+F9%zq)p-5}t! zL$R}24`ty|PurOv3Uk-I9PEawPgO1)idAZHw~x+=?o~VR$Cx3xQ?Y(D8qlS0~XcP7DxN)=R9xv zq?$F~y$KHL%~sI|k+D3w!hO+H76z8(;mP3J+xloQqaO*M!NmKBNN3b&ECBk|lB~Uw zf7oQtb)_GmO$gx0V$E#KF2vkdSR3BwREnbI#w7Eu#%4BlQ$A3T@YLbpl-(R6_)p3U zxnML44@J~5(Z&q4c>Xdo)F&sHf7*H_tYel{sBkn?AeiSm-;5N4Dat&KjfI&H4`vw4 z5r#Fn)b#eUQ}y_+C`Qk~@B3N_1%LiKpv-!DgSYsUrg2C6g8L?FljCzu#$}|COgQk{ z`}-D^RokeD;xEkOm)VW8>c2#8TJ>%g=ur!N{4yjz+o-FF!2)=37m;ix*RR|D2bx#F zp7(IuyY7GWku`ryzu()4LxZ*Z1$v5a{ik2(?#Q}LSGlJC89`hct*sNszwgkMR*xk4 ze~vJk{|SfR4P`d~0o{8920MF04sb_+q7D9FAOLkE7|2mZvi0eh=mSSE=cjKVS~Mx} zqk5hBe;|~(fq*_{24ix1&75IR567tKK_TC#%)`(U?XlY5;&0GL6Lm`0(q8c<`jnCG zB_b1k-az0SnF9_~CDHnXkMtpz8-NE>UVO*~mp$82)SidciJK|1z zsslV=qT@6m1M+mX5Goeucc}h0Pm7#g373;^5ns4eet*Dd-<|0`O%f_@@&y#vEL8sl z(-p>qqe(I2TFH?|RW%QG*MgY zU)4sk$}EB~mYnU`OrDrW&;}V8WP|liv_=?1%5R0-g&tqp$orMz>p>x)Ify@~i)mEW z0zK|S!cSi|Vmh|DVc0fzz_Z?EN@P>G9eN!57MX4(ZX%5=ILpSwQPYUJoh=?GGvAiH zxTKD#NB`RObxKyQo2Z?Od}90sbR57)^9^-M(iU7>SQL~~;~*2rZ6I(gSZHE z`r>=Bkv~sZ>?u~1UJ_ox%jSjuyh`!?3{c0@SLqF1vm_72zNvkGL9an4@OKFp;Je>+?Ho87N>xz*%!`o2=pP7BFvwV1n? zd9W9;YxC@uqWaIu@1ygww|9LGhJ)inGQW7NXRS^tlcL;xrGtKlzv#-S%;&0!igsx8 zPY!zNU0I+M7%eeZ^F?ZifN0g-@;k^De`KG)O=P=Y&E=2(Lw^3jkx92BpKHwT=Jl?9 zzr%u^K(Wt@_mtn&m)_VLda_XGRwssTO{_3YRVLNh;Qz?YAGJ+ry`8IJ7g$wMZ{1U? ziSs}0drNNUS)ge0f@Lu7q{SiKV-f${B3u4wcjLX;-g{h5<#u6CN4^uPE-<3XvGO&} z->xa}!n6_YRf=_xx??Hh?cRQa$?-(z{)C^Y;+uPWIA=qwO6p@xF z(>cO2`Pms%YEz?4)9%Mg|3w$oem%Fbm73izDDqXujMB14QdYgw&c`+LLhp!A z->mybKi~P>1IVA}1cSAe-vt&j17a;9#wwI0s24qJzCqeL{+IWVoemzJoRFiZr;u)t~m%HH0LN#W{6g(z2 zhoFDgs=}9?Qe-6l6a<$K6DJ|1Wt0X_`Xcl)Ng&C@D2^*oX-E>tz|w~)gL8DN5h*j! zp@6~U#v+6CIH?iF`ju=xe7pjJDH02@5 zN_u<(#-K5p!bUdmm=)N@g2D0YikR6@E)}U-%%XzJSwgK++whsUt=lXL-U>0sQ50VN zo3SOSpS*1Lso9cExLV#vyAh{GO99vlQ*PmT(=3`c)G~N9lg0Dh$b&r{+Kfc`QY`}t zm5Y2O&^l^0OuEf5hU!5|HFI8F7l|ksoI$`z;OJ2wDI~xKJ{3fTz+ikW?Nr_P?-)xh zI8alP^1+x-S+jqY0|QH>dQUcqX^4FBKg~o=@8P~H2RcP)6B+O-^V^;FdrVsO(dJXR z2b^(bNO)2={Uly*@gXPu~@g;YqM&tj@FO&>1$c$_D%%tEJ8rgR|A{60d9qLbA@pIXIeJX)Lx>`XPWKyU#yWeqEdS=AUh30ndSzNA zBvv8#0>YWwqCcm+WK_HR=K;W3-96w6bY>SOY?^PwD8jt}Tu{-=E~%MYn8^z&`?x3o zyn1^8!}Q<+XZ!$!dl(!&QWk{`A4qm?NH4Y(kA9PDW_C2uFV*lyJ*j>s z@C8G#Y<8uhW%p)Za8n~LHb5mao-9|}Nk+alEpNCcW|w0z;pwDWA$`?y_46&Z$!)otv9?2QE2nZACHC{qGk!66 z->KsQ(>z+j>WDw$x7u1QJF0B4*1q%ppR00S*}E%d;qp@VzMcTV-jUuM$wMP6;_*f_vf~Rgvjo z0cR@%g*#d&CvMDVk5}7@okeO1+LfKt3Czn8wd}ckRA0J+SXkP>x)G z_ctnicydGa*Vn*{dvAJMZ=C&m_vgW_Y)8(+-zss}O;>xO7d&@s+yDK1Dygnonvj`4 zkYDq1@qnhUiGG zz|?XpR%0NXlAI+Eb<2*mKByO6_7N6cj(tzSH7UHjJ?UuYhN90ZE#l0^#*a|kZH~`& zO0GGY3MX7nsg_#COH9v5y^w`c#yD-cPWkSL!ZON&`#fmSK_9+v!g5zFr3#T5Bb_7S zvGO9hLv9!0q(f$)KBFA5M=Z~XJ7i^12Ffq2x`LT{ zngwN&NZpf!nDkpl`yBKQIJ`Wg^cGh^On@}_%5BE5NJ=QE&pqMK2Jifj1OPjH)_#7t zE?HSbBkvu%lpvEZChM#@iQzp3jo$PD$C<_139ag@=_(6s+f$_vr${ofcRg4pJ>(hs zPJ(oK%t8V88#rj37By+0GLBoE!o;~&H;!0czABVCG^-$nv%WCotP-P}a#2o`!X<%E zS1+zS1=NtM^l^HjILdXAFd5l1DIIHvkJS$rn@? z#u%QY8+_FgNvGbD0DRw;(iqQE`lLtzHzG&!L;$r;$VpuH?7YbpPt(~qR$lu+@Re%= zT3BSTEJD2jAgO>wl1MHkk~2N`pU6i^*y%wi%@7gFBIkqtGe`Ywm3{gHjW-gQ;2MCZ ztXb%EcIeTRz7~gZB-^L-cwqA2!_YC&TYXdZy~a|F&OeCp01~CTa>&zvP60erT2HZ@ z!XtwCwyNY84%$a^XEc6W)lgbTd6sNTr98^wVfvwi2vM#e(+VW3?GVzlRut3*Ur_`e z?#_2L^8@teBQ}ikIw-EzLx+3t4C_gFLQW&)E+#_-EZE8rJ3mz`% z2ZkLn(GSGeZ=a$)zR$$wd8H7bUt!=kSo8r!F|>gXwFTey%sPpM-!<{0{au59WRU`A z8hQwUF<7qP_`$bC>_e;oGZ*Q$Q9%8%)b72yb$cEVz5nG;S}c&RF1Y_|Y#eSWM*>r& zcy|-CcUt?r6xBlDaC1l~!LB-v`a>7}ckMI6T=1YE_vx(Axh=$DSi#vkkJp+mYUt>1 zf|*y;`pIBdtV;c}#RhU-P6tsFoHAT;YuCSVZeb~4=r%=&_YyPPg1)mS{(0G3G_TFZ zhJb{;gCD9bRa^5QrDZ4~!yXsizEWMM{=9am2Ce+(Y4)Xj_f7Ke$N8M_hRn}|5bv`8 zKx0Yj6OZrj$!FP|+Y#ca3HsGZORE{;#`%X=bv87k@>KL6acXcIPqybt?o}S$Xt*N% zyp*%0a3x@$m=O+&__WE&k3<->g=I+4mAxk}=R@!AELE)Nc8S*%w5JAE*#8}JG-|akT}`{= znV((Nu%mL?qgpF3?UqI37vqXjKTePKo-3p!b*tmf&B}*X0;OgaxLZO4lbzX!DiOXt zT)MIYd*DUfaC0@;rc$-HYqyOn>}Ttbn)T+rs>;m9e2y?Nm7ty+|2H)|3r`wmH_o=` z3gEkOzO^GiC?DtE*k~_T{s&sEc5tJ$c81+H(A#Tpu<81|ybvWucAxxY)zk61$NZRlclc3`l3WcgbYX)WU6V_77lhrjJBKa_ z#|5>owcKL%%hHN;!!39<_}Nzn^Qs5#TcDC}3F`c+ux`8V$em*eX4dMV+O{yb$;H;* zLFHzVb?&?i1+oR{&gp%hd&<%%j%52(yxIk> z@~3{OO+Q7Ki=$Rk{O^;-e`7c>|6ddAtp5d?V50kJ#hBPPRdi%*(Q{^G{bZD)Rrer7 z(u{+@ig^f5+aCtgHc^Kp(52Qs$@9qGd_gInLoP#mne;w&{O`P)y1tZ&Y;fYmwQyWq zzQ7Qg$`*GRgNA4F5VF2#w3>3<6LCtEs+X$u`76(>Tgc#GVKP9~7haOwO1wA14&oO< ziWgnY0tpAHbvI~Q7h>{GWyx@z2zbYKkHC`)Ds$qx-Sc+0;L(oBN*+Phd8`;04*aBJ zY=8Wp5{O=bpsz{j$smEXWl^%Ow?Tcjb8L@U%ZTVf?VxS&6!(jlQ#IDW*2DasnKL3Z z;KvO{1NV7DcEp(1uCnHTpotEH6$(AZaW4)G#_wJ4d9M*G(T{Hq9oEJOY3LR?v9X|_ znJimzO|_FRN*0_eg}IgQiJiXjR;MQa+=JP;0wJQ7{D#B;a;CxCENAg~H1)bInr=fN zZo=Svyl(dJb4a~JPk}DJ<4VeS>(u|iM=_sJA{Ph_j%)K?e` z0scf0KHZ1EOpDh$b6Z29 zZ+|Ymz`k9Ip$t&GdGTf7H)J;g8wAJ-#mQ=yaPPmiXQer zJ&R9_HyydAPOiQai7`Jd8Oni$%PH%J+wf2VhUP2=O6f4+rZKeL%CH1W~je=Tgg1Jf0 zNZE4=jg6MC6MC3&+NjIzFe3uj%a_m4hd-Z|oNaM5zI1V}XNYq#+IIKfO+3fm40x!c zqVkQ9=^I=^m?EkA@VL`Er)Q&nAoeIU)Sa5(CDo~@USczuZ}%U_%l|54=htU%W&gw% zYbI|NIZ5fSm%Ba+ym+@&*BW{i^JuMVSpbn?c8=42(s>{&AK`m#uc(6AWp-BTG&!LM`!7~rWX1zW*Ptw$7ZH+x&j4<1?03R`sLy zS1M-g?cUTcPNaLAFn;i@Zi&dXU(kA(vNPxXveqlIndI2A89};Vxabu$^U`B}nVIxH zusWcWE>y#}v3u~#vMc5el>XLmynt#XShFzQy{??~4{Q40n5x@73;m33V;w6#HGWRd z&?6NR_rXn$-b`_MYz~kPqeq-0e8FeWb=y`y5S)e;+->|h8T<>Z?(KfbemftCof^LC z2WK$wJQ9(-;Bn5~NFAeZ^GU2P>*x0-Ue%3)VJ<$S5#?uUKz4qN>Z3fNyVJZZwve3p zE;?f!L+}cz-GCTg$`BC4FOc8O zKufL0yV&}WoH`8Z*~CJ6fbfxrh$UXGYv>39yAxb4O^cnrsW39rhB?F|#8pK`5*-#_ zCZoSjp+F2*W5_AuFmk_1s`R>u8r!N`dUoT`t=C=|d54#hokHn@i;^#`iH8-1>J-0u zZFiz*8Hy=UF7NQ?Q`CD<=A^M zl3J4%KRxxtAq|<;CAAVgin7#`eB9O4V<=?f;upR?*POVzcp1~C+gh#h| zmV>^C###0$ zrTT>f?OVXC4lu0=FOf--hA7}WJv>6Q(2`t1;3;7Vv$|$wRkvf*wogRw_B2%hZ~$=?p<${He|fV zgB4Qw=I5B<4ow^Dy6K9g)-3V9DX&DDQA=n`%yYzo-+R%{j`c0maM7Yiz`>4TRGuP8 z!E0H~Jfw?o?)mvZ`I;6d{2d;T_+9i;#^%r{W{8gv&j_antO1E7S{x(NVF0)m#^}l1 z4>jO>a+L4%I4$_*Lqd$ss!bc0V@PY$DAQ~1v`HIagdc~3Xk{!^*PN{Pmj=sozdV)k@c#Sj+=F-vu~T8Q0ix|fL$_;QJ6?pGf`a`rxOHh} z_MB4vj=$WN+(cFbi)=}Epy*a4qsvF8^;_7Y8p^;ox`Xr9YOL;5N{@Q1$x*`^gLaE?;c|vRKY1dsOt8+8%ZgP;}L^dOldPM?(U5fkIuLn zy?bwN3}x5<&26H-^5cDM9E4ZesdbfAQJ)viLmw4L zTyOmtn|E(FM7*B=aXqn+GFaDSFI)f3)zbRfd-SNIsloyWMdhn@{zbo~$H=+@M@Sjb;r zFxdI#^+beQvs(s&P+hBfe6Hi=UI|t^51kX7w**!9j&??|k*=_UP>m17uyp8q3kKXGp z_igH&Q?b}1FD_5^HmOAIV5LMNtBw@-ch>9ELo9Jk4e9>U5eE~`UzN(XE+!qaYxHfO zK7!4=K@xe!r)w`bOTg|*pIX2da@{0p(qg#pWlfNeIdM{A2LbFnB;UEBjyP;)UnO9hZ}jE+TK>zG;G(B6kOL2py?K zza}0NuUtCm`nv9YG?7WE4-3#zsfJLvv^fKHW4Hx*iVQg!9shLQU4NQld&3b=KJ=0g zk|t7{9!icQtcC(@vDP@49D?PNXHhREmOZXJ8Qpg<;yZ=-!P>JrUG5aZ4uinP4Fz8| zu!6+zL-a2Z#0MXO(zJtvMN=eUC3}Jx^h%v*g~`AxTlu_dIh#Crkm?;l<4c|yYiNB? zD_!yh9^3K-rIOjcNr~M0^u!GHyi2CJw!#PSHTWk{mZE#vrn)9C(?H;aL7_c0{Bl`* z+$Oe_iSq-}*uh!3Ah(bftf^1{uVL+17VwXqR1hyhX=HoF3cl zrIB2~$n!pI2Y z#M@AhwkX_NK}k5EAJB~wuG0uBYLQpJvIzh4wmAuSzs3n)Y0lk`zt*@f-LUt3a3LxU z9ZQ6md0!bsqx+z-|N)l6XD=vtXf;N&VY^ z?IgurosR(6tR4-$sikrLnuzm-sbi*DmN~D9Bv?S%%y0|?q!6ai2^yOr{EP9VvI&p^ z4kB+z?D`V@VkfV8b8(

EM$Pxh;nZnG6(2r1=oQT@Ws2)t)tvorzrYj*Pn(re18` zR4w2_tE)?~E3!33Sj_G6xy_!gE^ZsRjmn>khOK;XHR-`^7G7SaG+N(H%!}tLX_9gH z!Su{ISD-e8Rz;hu!#D=smWCZEn9f5l+No#;VyMgpq;pX?PklfJS6PeidH)L~- z|3Ec)*GS{Os-VJFJEO&xvCe=~)!{Z1^JnQv5B!#=*?Mf*hYlFKbAe%o?8$6*0A51$CFZqoMy{cFeMl`MLj$4+D}t8QMk7^@kU#gPOj7K=Uke_eU^bH+44LKB=Z zKSpwr|KqXZH}_)x=NdJ%?6gBAV$c_jr;GYN7B3e$UMrT9oH@TbpFpHUN?7!vesA~l zZ{unM`4<9}s;)OIweC#+(K8OL*`U5!v72Z*4&uc9Ai9=TJKgh}*SlzNJG{zori6d2 zxUE8lSdkkkvk;p3{+YlD+lR7!g?aI|9#aO?o6#!~<}Et9 z*H4~}dN(_*)(ocj1>aGdl_3d56g>9!Y7Mq?_gIX`&9RhsbR8Qbt^41xt><#I^jYjM zUwL@LMZtPa$l*0ZWV?eJtBcHno+EP}wYpgC1V@x@e%Ry)))3DD< z87*vsF~o}Zh;GxKb2_`UL*0eYn5oUJwIhgeIS=lmV;&f~5tVXBo{+EJ^aHJK$8qIE z_>UiG@~X!}BrP`EeP8&k{7pYUr=Ag|mOZ$T^3H`jiWk-{-F+a;1Wp05IMiwO#T?tjy9eEVXqO~8v2Xob_FP5YdyVD41pKSgO$Z~dDfIrD8s=s& zJZ3pw(j?2~~iFsE5XP2fZW8>cp>Jpls9x@Xy!FTMET7g7GMM`dlibLs>JE zSjRX5TETayq4YPJlW;;vsIs}R^=SESv*6{*c8p0`NK!Mqzff1+XqV#s-BkaikXRu* z++FfL5I9BRF*1)1KLF@P)OU*XR_RbE@RulVFu;UO(FFJbfVI>E%!I`qEnIw%e=aNm z`%-Z5IyqcY>24*R7BHH{5Oy*uOTK304*;ntLPEr^A`k(fu8J0Zv&wFHDWeYcA-ZhQ z0e>ipI370B7R~?vyp*GsIZ0lNUQ(T0mknQoL~(-f%6B5J3Y`ZiFost#UtXes!rRMI zzSuBG@#BW5&z;w0^2g*D2{C3K-lh4&W_^-TK;G-~Gi?;}fEVRlauHxEMY-nQqJ5Jn zVbevaO=ZOY@&FRTx*DIlr2z2tJr4(3p{hr;T)%k~|EK>z@lCj``0Xj%Rne-ma!DD$ zinw?7@Ool8zJiXQZUz`B>?1P>U)652&x^c>fDbcXqQ8jXAnznJ#pE|Z+Lv3zH3R4?aRRn@a(Yy>L10~(;bg#N}yNOQSQA_Cx&#aBu zUO8=P8oqqcX|AB5We`l!`s@x15km2bq{TRA;#lvEXIyZk%rl}lO|^okjHd#mU48k% zgS>W#^qO^v#ZsAKwJN)3TT{Wq$TF&Pph7sOZ61jw-V@Cfytu7EwR9RcFs*k)-w!D( z_MF$bJxL6*-V3>VU;I5>xylkw^K%c7`xUs_DsA^^IIVhc8K%wBWIsafP` zBq$hodGu>Vwnx0H_Dv)U*x|HH$NsT|VE8NK=_KN5iD6jvXA6D4J4YdPtzr!vR=AmMAY9799RC_SRMg;)~FV?QJT{>95S4)Z{?xOHCthA_8X~*9WT37e&l|^iQi}=!_$5mjgS0ba^|#HISbYAmC(YC#S#Z zHuiM}H>0)G7Fy7y)avJS;-#*-&^lY6SF80S-FK`)U-C6Wj0QE>m$C~`A27|dt!7Efpr8qipc>Tx4@wwy|g|NFU-R<*z3zsDZR^&UM|6S zB|x=b(3f2DinW1_zBo-k9k zacuGac#I@7>>r4wXe{_8>RE)_uU--6c}xrs(}45Mi_Ux2iL@Wf6=XvqXP&c1>n8## zv%6AqOp(!RAO^=_OyTPdfQby3z;k09+Xw0CSoS0P-d8Qew>F9)_nZBpZzK|!<8xf_ z-}%bn+75iM81n0-$xTnKW2sq>*zI^eCQx+c) z<(B%})yz zIL~X4%y2_zS74wYT4Z)iSMew&#zZU3?c$sU2mF%37o2+><3G@`RYnYu`<)F}yy-$& z$Ke2>sak3aS@;OxEu#4Bxq+6()_t>e;qL&)02&#`9Q_{%B8q5}jKbl(D?|Y8YRTRi z>g@j|IO74Kk3fGo%EJRLx(6yaemVXhh_NSB_3>?t6qWpsOm{I56F6PaLFd>d9iyl2 zU8=UNPZ8tHj)FHhp+XWl!1=kN_dcl&pw_wJlec=m%GPxdzBpYm(-ya&Ax>i}g3o0- z8q=>c4>^uA6T9?@CW86N$=-uFY$bD_Oj0PfdVDuK)RSjaYm|_%Wux1is?I5R$N6rI zrhg6X&3H7+E+3yf#>hoCOzlvrb-?Yrq`MovJQGOJjP6`WynF~slPt>j;)HKgEmEjg zTx3fetgKwUV!?i;nhtIU(Mq5s3Lfw}4V@n~oF|3Pw{3wDYUyhp?<%|wO-^Nf-}}D73fvUUMq4z{6M98@;MR2s?JXN^{e0<6x3gfLh$bJC;(uqP z%zaP)rLP{tAXl*U`tOyy3s8ES@QSy5BFV0+MrV4C)_#gT6DRC=1~Q#jeZRFZ-^#?SHh35raYUanSU_x7u}kP-SGmR_`8 zu#%o&aIz|=R7WJ*Ir`wFUD~}65T4%*wN1;3cRCs!dCiwbWr+chtzacN_6Iw53Zvnx z{bav{OIdPMh;6S}u5q2ykkkGBHSb%ln8!XVT5%EqJ~r%(L)R2B4~JOveRn#1lgK9D8ft!qE{quNH#L4IJ{i)D&>4^=APz`nPvw zd+UQE;t&_?o&6vEiuC7ivuo1k%}e=_xZ-i(n5lI`x+F7L?@ShVy*b zy#_T(OBU>u@r`xsCE-Jg14t!LT@9Hmnu9k=3#PbV%2NZOp#MbRvE=xq-XKc|E{uQV z@0KoudU9gXV3sW;bS6f5P7JXj)6^sjPw6YXzC(t9t(s+}V{{fpkj7k_vRbQi_rLsz zgw2*;%|*+k-WK=v8P6UQPcuME(ci!_Z8^8L9HH3;pLp%Tzl-RuV5Vet-e!(C~-$NJ{lgLEI2=2q{ZJAz}okg$Fu;NO}4VF>%P`` z{+6=_&;J8`yLWf&4ueRqu*Kein=wYD_xj=7Rlt|g#!o1X%ho?nK(OAq)W4jVFA}f_y*1EqG!i3kk}PFGV4WW5NdjRO>?i*8{Fy?Wl}bW(Hr-$N>QK{d0?( ze&FX9Od5d6e#9Oa(bHJ&k4Pg&@eO%+fM>(Sg&uIBW?I`M+oBjoo#>pc z)ts(kWAE89i-{V070Xn2KXD4sYVpXjv8i>cg0x`RFRREiP7teI?>G%RUgwY4WlZN4 zYs#s)?(b@SE2J|z{ZFl&H&er5TqE}a$-kO^yx%pr)VfXOg2qm6bb4st5@f>Ug!_-E zBq=aJ-MD6O>&;kF=j6Adq@Fzb=(yBCkY(ma;Q_zlq@|~NUUs9S!Y>B!WhXVH^3&|? zJ$ZSJ+#3}Ii#tZwE^=Da2hY|7sP@i_tsNg~YJB!+N*sDqU43W&g1*}vjPcArLw@M9 zKfAX0yM}G2zWVkvhG^W}3`d?7w%eIMah{<#_i90TgPk5-pafY3{bro{3+q2G;8qAb zmQ(z({p{utsX5oUwsy4pgf-nS?vjV0 zH;Fq2hPt3eitPQVmwl|@{VKHTanu#|JI~I<$!LJl^T$Tf>nR{~MI0mh1v`R7V-)dMgVsgL+ zzA^fhl6TuvIRGnShLurJ3R2oI*Lm!ovi8V1g6#zT*6Ng7y+*SrL^+PP+m9S`^QTay z*moQ!H#E*&#PkB8U!ugPhV42m&CmjRMPwKR6&I1X3GYpiLa^!Y@kSKXoGx}atEbc2 zz!4*5Z=lV|8@rQ6mN?~`n+WES6d-42Ltbg4HfNv;Wy%qyF@hactT9z}YOIAk8%*px zFQ0Lm!g?8=iU#-%T3}0k-5OQabvF4YFVW~lkkKes9^q>-FsAh~CuJU4HcNLshPB7F zW96Z!fkR5eBzMkhN$(EJL2kSx&I77Hr{ivm9{jtbHTON5`t{aLj|)gtkPW@M)cQok~HKKcC{y9}WXP?tk!f zAI478IzSHtrI>ky4*ZI_Q@QYSYp{Efd-gvNn9Xan_nD_G@RYSdP3y4HA#}rLpuH&I zKZyT)%0_|qFEXYtALQ*6o?m>}9+CIK0V)}ba-L7R?)JMUuRuoSx}rW>Qsm17o&y6& z3q=5(!ZAdnC>A+g_cJeh#*Jt>Wylv}2DClEt9%Ej^SV*;0Euxq&bXq~(|w3bN4zUu zb1Hw4t@k?!&^iu$TD~06JM&C$Rn|i|VN1#5CBnyH>=UEsu+RZsQ+xVH{=ldB5iSS( zW5)jcEKt#u7($ox+#SdjA4ajX8)~UEq9h`9(Zd^5JQzntvgr+h#6i;;f49UcW$Y_d z>raEmSIaiXc41+ywUd{4nsUL*YjC{+xsVSF7XAWH{AbwWcXWG*Rm z$khf2`Hi~T-uY1KXh=-0{+lpAU;F#tO~L#5mY%M0r|1&Cy7his(;K^{@|{`w1*?X@ zX$4pRvx<`=36*x-{S?2xfKvU6;nIM%VSM+*F}w9KfAPd)gTrTjOI)=OcCRg0Fr+2r zg%oz6(*N>=)7@J1-4D%yPCptx>XOb8Nl(3-ybF1AG#9%0exM|Jf`9gKYDP3mB^QmmUAm2l5*yg|E2y=+3FHBVDWl9FvFzjvak zfjK;=;h(b`O9hxRt8$(bt>7faY0^5TMESdhZ5Yd~#J&C@qEFxxfwDD)wnP3+ zlMYW_@p*NO*2>~;%vp&Ql_Ci!dv4V9OCk&C41bg{LKdg!8#%v8Dz69tGXaG zTLKY*kjl^w_9D1j!cwoxID7&cqGaRz4GTTg5IW;ku?YB1v}FfRXi5wl>-xvkH2qrO z62Z@VsVJEcEUrce#=FG3iFp~=wm9%+d2Xtm{*1|!^|HSU?kYlG>ddA~-aI=R0x}@h zbdy&r@0W$-UFvlN?r_(&HBBZhre*aG z2?O$A05l-DrIw4$VRWd&T*aJWg^^vR4sj)Y?uaQzlkQVkjr!x(0d53vrM&@kae)Ny zgtxvV7JzVtAZJiEVg0JNkFF@DgIL43D`A5?R`wDY@^Ed!I7HuBWC&JB* z&|{8og)jpr!GIM@{tHBLM+%CMEb9*J{Mmrn?o|Ghbqz3cJR?{cp)|e@_4>h@RI#&w z8ueQkHX{Ks$2GUE7( z%qT;_O$Hv7Ky>PYJFpBi6xm14q-}!ZyS?%UWSwl);yTiz!ARzOxMZa7cTv8?O2L7> z^L<3+d2%gVxtT4QY8YmxKa63|Qop zGkS}>!)sqKnU0U7_sfCwpSQW}cPLG--&FVEEje5|fRns8``YC1gFM-7Ey&o)>bQ&J zh=YH*Ez&7P3O~~ZU25_#ZozF&(?~hmP)RI;N5$<@4biFna6d5Zb=e9O5Tg&nWC2Amz-?G)_PgJ1zo3T>M&Lf<);HqB_0 zUfiM-{QegAairO!R?Sw)jzRv2)JA`~21WIbWet7oYB{sFV*Tpib*4$6-={}8adD2f zH!|jx@UI;0l1f{719-R&>{zzy3NH_y&JC$-XY8{6F~<@wpRg*gmq@RxG|D?I>qXI2 zFYkP;uB+3}%R4!CET)}WAJo=D zlvKBVtJbu2)Ncn_ne*J6h;#^0z(jg127dN@(;xit?uDPSCk_4=-<#9~-iEKwzpZ-H zx%KmKpflaLHDkk%Gt6H?tkwq=y)12B6B^i5rYXDQ+-1_1wKZ9p(b(J)9J8@t?F6}7 zy3CfCsgm|uz;-Qc)1)^{*on0jC9no4Gaa;y94#ygG|#QY~m9~PCs~a7N)t$i=^BY znQp}S&1s#Q*ObHx0U1~-tuMzItQ&LY$7X9x)y z5XqcTF7aC67Kt;a_Xy1+A}?mvHP8)&2#CDBm#K#si=-zL*oFl7ouk#*=)Fg_csO&d zjXdsFh%-XZU$Fi5P-h&(NgRMNhJw)gmJSEpEv9O(UTy*#Yq_0Bo{rr+kD4Yj`2ZNM zE^&lw@vKz&V`h^a{%sm;i2kWVE*q5Xr((1mH|roasgJTnzp2TrEa`n!SZi$Ps1zRXUnFE53k?@9K@da}v^BQ4-`6^| zTX;`>heiNp;NRFw;Xay=fR$0?whij0(Ff_S-{1Bq#}!R`KI=DhLzsY}1yI63jf9>E#H#PjtgTgcsBxscx>$^u(`z8SY%qR0_YT660{( z*D$doI~g&0wD|ZUAY8`r0!q{}?$wfW)1pUlT0~_b-?y;_Vl1NM#W*2?dTNuvFC_|! zP3?jOx`j$mY6-_ea<3MU_@2@CkQOFODIWlQdEQJL<7VS;I^ti7c8t9my4aCIDrs=7 zX-hY^aiMF&XaOB#ee^(2&aoJxMDMLkEOTtsD8ioCi=}EWMOToFwog zLYcX`y5}D4ko2-{jALleqE6W**FUpNeo|y#vmczIHcX+Qk|mNbfO)o$rv8E(;^Eq$ z5QD8&BP0nQSmJM*O{(V?5vN)H&Q=f)o#_Ni_RimH$}svS0#9F6!f5I#o6&KLF;a-e z_-;MEBNQHv@BC>0Ct|*Ba|zDA$esT*ZUMGHumR7)cR=j2f?g39F7c%eYrVLc?jSF7 zmV8Zx^`3;NLAeeZix~K&2`W?Kuwyf90-NhlZJ}@8-VaFMd&@WXF+}4REX?FK0mh`o1e% z)}bxqvWr4s3KzMR>*4`#fT+fCn5M8n0hNLJit!eR^~YQQv50E(hB&ii8lNh!LL-5e zrHT%=X6Jt#HPJ5Y{3b0o-nNf1PvTK1Hi(k1*ax-UYEYSvIpo zdQ)TPtEzm-a-^)K^dKOzN?F-3yY}8*?v?#@sf2Y`jPATj1{IdOmG3y6TQVJ0-6^r_ymAqn)OCm3yw;=eyyK^p00x*nCf&KErDS%d(T+i>p|T=9g_PVO zUuaTZoYUa9*mybce5ixd+fY+_9^PnPT!3XS*VDGU*LvLMCqt*4ed?U*B2~Vy)K;Lo z0s#ZqD|_$UA1X5nRj=OHKZvw*-5kMn0OQ(unx!jooo89t;lxj@+{gwaa!3+|rLHu! z(uFeon_K3J@vxnWAf;LPviCHO%#V4Us06607kfW1h$FRSS^L`rrv0mXRVQ@sQEfYW zx+Qy>PHQG0X%u>0729L^s+2fik|@_3EU0B9l}UT8DDE^W$dgkmB8?(*^^_+hwKT!v zgv^F8vSoYEFlR12B8mYZSW#EURtSMyCC|2Adl6Q}rz)!ab_78`Ut7G+O<~Qs8AtPV z;vW&jf<47S#1uWIAV}*jnC#Go`9#-lXR*O&wQjsA&>FyVV?@_%onD;t)}=cc?X248 zXkA>|h#yb>A;(2oP(vW05_N_!$dN+b2}2WfWvlicuUgt?iG+HS81k@0%IUc%Vnps~ zZuOMla}D3NTV6&dY&^9H8Bk)Hy2Su;H+bNme&|T3$2|QyTLhayPimwLLchEY>u@*( zkxe7A*#+ByB$7a~%oJ8zm7#^)ipU!;ps>=)4o#oM#LJg)-HXJJzB6Nw60VOb6Pai(E_$KR;%8=6@xy*~p!g?-0H)nVCf(<>laqUo<$+ z-?h;2Mwm^COnwhX&;eM7DVO74k1Hwb^g_%r;r8p1N=HD)mW{K{<7N33l9b2(C8me4DnxXT@__)O1t@oSRZ+AP80z|Hnvqc~`Rba*w&?Rfi@4aTs~9lP(&5F!ha@$W z?q%esq0amM2T~tB2lV}np?vYo`v(9x93#q|CpwathFWLVUmwEph$KqF=W!wkvXR&G~#v&SdQMPY_R5LnPQOxo{}XkDDb z4W!??aI=v%9cY^Bc*Xe>EQtC_c4bRdPW4UhHJ+MGTyDjCN0w@K6j{+!^*$Z0&my-7 z+)C(wnq3uC-B1us=N{POXWtDkG}|UY>t1@DEb!m5yY#k!<6GztTUj?zscL=pz+TD8 z+Mi?Bnje~smMP$1qJdjw6TRf!z~E=1-B!lVs!(t+L@L!`;l`!rrgx1n$)R7K<}a}} z&A#!6f%Q7>)FyOQD1T|K*E80+w}@629PQp`S?V8p9lb)(A}kejrygce+5Axz6*Xts z7x&U@ad3_}dzXBnbGA#Cjy0aC9@L!n=5<5;WDg}V=zv7c@oVV_PgJ^(6C1?mjTv(%Wbo-9e3M) zvd-=*qlL$F0_Pl@tO5h`4f|{hK0RHybt-Dp;WGKYaQV}r1~dHb}DNrUv9$FemzHTov~TD%lzF43sB1tiCq zX7pG=t`4m(m^FAWK`<2T&KgrT{k>atT|6FgnAawuisR1PbQ9!cT@SHKL|uTz0+Dov z7(@5#yH~ODcPU%yFxuGS(O@OQ|5Xv9w8Xw!WXa5Q+P-3#&4) z1J(_2oYYeZg8n1}KKmcrl23@3ASk;pgF2mrp2NhYQAF%lwh zA5)2LzNHQiGZF9zenT&o6P(DJ5`E)!&X7nD+Z6t7jyHk;SU*Q5owInDGgxr>lu^gx z-XjkEUMcl-oS4jzCWD$KEOrlQ9N8*>DK$=zJaFEI$~i`DkCqIN(>x^^fR^7|?CW3u zY_IZEPD(zW6U!y8y=;65q8Z1p$sihfv18WCw|UVwuK#Kx?X|Q+6B9!Eh2mS;Row*U z*EvZPlXuC3B)dHtZPZbsh63>>iacG#a_SG`;2E05F=T*wAas6M=be)0vpto;vST)c zMiv`%RvpWY(n8^TK2yjEfKm`~41tTjK<41-ud97w6JntNX)l2J3IRhs6qnE?>wvzM zIR@L{Eq{XEWHN9ml=d6Ug?*9is1raI_0vHqQX-Y43i}Q?i z%Xh^UH$;CtrMJk8;Yr9VJ5Ek(Vc%CaQjY>N>D-~0~@KgZ#< zu9>yCfUxW*ER-gwZ(WPkFWGD6c9+#svsf^7uzXF!pPy(g@`h;n*o-iKG7GC@*GK2h z#?PD%+(M3t5y5Hsc@Am5x8TihWvG_8$+79@(^Q8WL03#?UHK1;USnEfC++X~x<-gZ zL9}EewgxvBo-tXsNfwKg@!)0;iFN4KomkUs#^UBuTkB)0_49PF)54oyfn5ROfim_O zsmA(%rn~4a6}tsHe`fPcTamXEG+BOY59{+wL>K!S9~2a#a!tFE(2#xP)Y7Qp#|QgZ z-y#)qubz)2SDOMJd2b+7-=Jtm1-)}*%TWgKGZTN@S{nWR6)Y(7Xp^Ngg=*4f+gLmO zjI;Zh$F58xpvv()R0waW&toKhF~Hz=ya*Y^UjK-}+D%RkZ3+jGu)# z);v=7aw+Yi#~YRT@;#*}1dYU}R8=+4L(6e!=7FLG4S+561)j^9L<4Wx|zN&*M#I2`1VJXr3>6)BaB-kgLE z@$6$a7*uL3&qDIOgW;e4Ik(pfWSvp-!GfXEp|8-PNT(Rn4DpRLgT@x>pbq_kNC^GL zMuW$p?p#rtG#Wna_vHU58+qp3YC5WQMqo8+<&(Pce<11h1kY*K!H2pp8y_b zg2U5Y)W&V~Vet(2wHXL8WaenoLVVSx4x(vTa7fgMCVMr8OV6JZ$FUDR{W0V~<&{O;m zB&wbm0yh^hH!~Cw^vduiV4MPYB8&AB6WfP&9gbp5_80|z4g_RIOw(GVoC%dG5BPj&Adx^NnL;bpAiTj?&Z*&B4SA#w(?p*R#B zggyVU2u!4=$P<`#LL-8vBPKOsnRI{#FDMLoO^gh@8f$F9fe#?RMTk=y)?)##pvMDI zp`bWU(6BZDIMAmn0bYl-=&{L5RSDW2(DMQ&(Ov3G(>JbmauPm>9Ir=ZOv9c0sT)_K z@){5^zyyLD7_b(Xc-#+1aSMepeRq4mWBwH2?mY%jH7LFum8*e3U@YJDK1;$e4rsBy1Vfmb99r7*EVP&f~s*OWL_)0HqPaC@x5z*2VyO zVLJi}_2m9K&t4I@VE}_4<|5{|SfiQq^NVnRfjF*T^jT(OZZM4m^evNoH0KJALo0NS|MN{a?KXH&)yTqzWyRDaF;DCwmh{3m0T?9Fv!>rB&Wf+?HRNUm$ zJuT7ghL~u|O1o~UiA%|0q{=@lC{)_nM7qHt&43P^sjqMHi+{7&T7l&6?DGk#m9@?2 z+;`jC!`bLkH9o1-uqG~mm)G4Zhv-LrZlJp&$Hp7ExE&Y@)))^D?5{E(dgoDOd4}CZ zXx8m}J)=GSO&J=%%AFO`0$F31^<-TNv)8`-(kLETEJQzUs9cN8&A(k=le2SfzDJ2$ zF=A^fy|i)QSwKl)4c}|&fHxn0_RA=yKhG<7%Z^#QYPG3=p>qZ2#bR%57&M#?{%|yF z!7VN}2F#BCaK`zgspIWcrOD1Jn5L!{JHop%p9r(mQS^JrR=dU(VZ*UAR9`ODV3Pg5 zv5B+ec0_s5n_-PV=(4t!=2bQQxplYct+6qNRXGHl#F+9Gj2r5$n=e{jS02GfG>G+9 zyD^wsH8t{fJdfzUBatG-AJ`6ewX?ET?=9F7Apl?WdsWWoJmi3&3Gi;6Z7CO zV(2!aCm`@a4o!GKrtS5*N&pX<)Y4X%pnB_X%|ZZfk+p6P!|LB%Xr)+oLao2kLHnUB z-BiM|k>}6k$DO}cCQ$45Jx%4SN|w*W>vg|q)w&r=FO6?v|AF$`me zB5n4X5o!4{#zehS$EZEs+2 zAvrXOp=_~?Di4V$G-C7sIiY3GrxN6(xbWaT4hf!2P=s71R(!<~$t zc^^dUt)S?>OGf3Ldx%&fRG?xkgb_$NHCViABy^Uoel+6BO*ekZ6J?Il8D7O$po|&SD@uWpkSr zBx4bd<8K9r&&2wgPGehygO=wM__qf|>0xJ2gg3EBy@8?opyd)c4`CEQbAukHgu({Mu^5=7X>0%;@ndFNRv&a`6+l+q87yUbY`8e7V5WdMK$1&%(JqgjG; zH#Z+phRx59uKN!akY1)EySuZ{BHidu zB`CxFbKjy_mpPO34{rhxE&_#)t7h?+-vvoJmN*t*MWj#14b@p?9Zh$Hyxv5C^K-0& zuFQQBFHK?qNN_VkMg(A0hGGNY<0UART9S7KE{cN?4}7vDXC&w>0`gl%|AOxr=%CR4 z{N*CDDB!$7@ExcFC&92GMx^nXP7#Ho!-gy&0En9aPS;FDQ7u&dQUlOX7AF*}8P;)o z=?wbWnjMRA0!~*bXGygY1gG z7H0DPyQYbm9o!q7*_Ip$@CxA>u}F;aV6%57pVPs!d9|moyMtyqVOb7SX;ac-@tM}P zH1SI@aECR0P_I3&9c)-Rj;sm?Cl7$;R1L6<0=HZp8Tu-NK&K6ZJ#Is+oG}Y^j;hdu z8>Tsr3VeY(k9v`vfzz4cWHs0L)im4Ej>XhcH2LFMkAA>Ql*Zc*R$PZ<1`YqY_vTC0$4+X<}^-&U3@CY{u{i=HFeSK*!~mFFEc zclulP)TH&T`nCS(@~JN!99NsHFg{4Or*8H_@Xt3jT-Bzk<Kd^j;<))up|wEirOP$)@+T~p;{zHwQ6;sEp1hw_UZ4vUw=7{oa1(q@BDnOtDN(keXUWZ z4fvXo)$+4{+6aY%7uLf3pTWMCnQ?o%Op(E5`8?x|pqVe;+Y|H%k%CyY5QnrUPsyOy zK7SMv(K$-@hI!!VpZdc0xV%y{{-l{tp!Xu_Zrpr{XD+li6+9seuC!C`>-tt27gY~v zEm>=m(@fb}a<&AbTPY`HAOA6AvD7M1ABK&-uFl~!NTXk^;6P}K?`XrQMg&mwRO$(h zx_P=Q`b+6=_bYYjmARaJv`LQNFkYHwgbkj|;UmpW_Y$~I%Y=0X*~P$8EJ~Kil*_@m z9kp#RhcJ6uzwEbi>ZXRZvVkjyecSG#vakdM#eP{L_i|ou)}X1kEDeMbviGmhUV-20 z5azpGc;hT@Us5}lqCrv>IQ=tuNTVv0-KMDSN-pUacVAIH{=7I04+RJM@uZWiK(L~{ z=urXqm0JWP4o{N8KY&arcyh3DCJwu-;INmy;N@1d_o60j$xc7bCE6isqNPus;dVGY z6KhRCo+Pf!*T?q)1FBxZr;UeIKzsbVQ!c%85v1t=bYX-uycD2!0fR7N z!IDXEh0ssaAy$6RvjLuWJh1&H(*(G@A~YqZ?xw3~1IMp`@{l$CLxRKY6dT0{$c0$o zN6G;J1}M?eT_j-_G71!KaY|`CebLAThp_0#wI7ET#zxK6(` z48-cpE}gQH*A-O*D0-)N9Sm1g~kt~Ol_y9}CL6z~V!yf%5CVlCwAi6wM8BmP_ zPe(s$tgyCHhT!%Bg%SMxd*hDOQW7uRlq;o+vjJM($@M{b$Y$$A74^oV;_I#NGzEBU zGSmv^F`hb4hy>Gixe~WnxyqlgVDpfiH*-cKx#-Gx>IYu z4kjQ$*e0qSB+#$?;)F{~sHce&QMpfV&wQH2_(KzhRW!wni;^;w1>A%zSmhqvci)vr zm3;CzH)m}*1kF1xk=HowZ4xPvk;7{LGc=3lsQhLpNz*meiN|9))WyyqiO8EoV=6@iq+y^Cxsx6&s z=InhW#c1OL`?Wb&xxd}Mwww}{sp2d0-qlB@dg{#oZ2sHa@7s5;^JNsJ3oBzXb z8S+{U?fG$?8N*KU;M=*h@onWtfBO~5&L`?G{kp!@UhB50P7SPSoh1ZwWf!-02yJ%T zqKS!v^Skup!H!i*>VxgDhn8XJy^u<(Ds z=S0KE#P)_=$l_gP+wYbE&pW<*#XA`ZEm{@5{U697_EFOpt1OYBnGB}W$-kK$5}3vC zIYZryiv!-T$}YCJy_rd&mWi!eFjtg%T3hE2bF=lXM$Ly}RtKM%`q*jPeliN}{!_($ zOsc41SfhuMn$d}u%xB_*^PySs9+9LntD2a6bJaq5-UhO3D zugRg4kJNUk*Hr(TA@>*#zG1YgZ!Gap`Ws@_Pj@hpxz^;R$0GOT(r&o+#49^uR2J%G zFg?~lbB-_a9>?ws!l0AGH3cq$O6a3S{^Es>2_Cb@XnT&C+%!GTO*4Iy4ISQ1Q4>tC zatypbE6peKLOA@lwl$|{4$yxE`>K?;rwATfu^5c!iR2w)tc&;EyVMPy19fIhr4p;&~uRaO#SCBD5($C2XsdnW;l;^Nt12+& zB8|o&m`Rp8Zp%TGu@=Yk6+_tE(;|712rqbPW<^TfNI-zWrwfFeWu(L{VUnb5B>@Nj ztISFU!>a^63jMbs$^5iFB~CqyP=y%F-}X4;kbc+V)}+XbkGF`oT|F zzw}d?W5+B{`E|HCrzwc0(Epyb-53dHqq`!2yn?WRiG^}h>RuF0cu)3gzI^$-6Ic0} zKl?`hS4h_HKs0%eUsBZEoN*utCqOp*4!Zs;%iPXG{^4l(eZ9gkO1Gm}PtLH3!j0TD z6p)`YH&8qxbu=Aa^g9TS_6)6fM*#DYbnMhzejKI9>pT$6yq6-m?TR*(o6_sriz04` zRo5Q6>kDe>_spAP2DDn6V#@ArWqq!jL60|}L*@J2ZrVCL#D5>Bt(2VtJe-up7M;FuKk#8*JZD402wuw^Z!) zbX@DsRs&;2`e&?ji(!{!*r1^^wuM+9maVTKP6_##2GDjS^$^s3L+e-Zg-^L+ZQ@^u ztc95S-U|?y-e|-%g=X#U=&a+{VvxO*!9I{5j2qKuxKHICm zE3DgXTT#58j+VIbhu!zJ-smw~W7hesmb+(w6Sx?XZ1L^;2Qdt0TV}X!<#V5uPai7_ zt9A*E4X-MkQ6n)F8fERf%whk8&RTh`*iFgx=8#54i?J8~;%`VmLTktDesR(2hJ`gl zS}VX>ZKqqPY{nZS({Xu)!?m~TZKqS;Yd4nvf!5weE&1R)sRR5L%QvWZ?K%$_vTsE* zsk0$<&lPQT+R)|%s-I8pM8>yE)YYm0T@Ty4yXzqbNPX=;6?>QG{tIBQ?9%Lbwkhyq z>%>y9sjK+O@qjD6%Z<`%GpGOFy-IFkWMw?`oqaxU=vQIT+U3Huy>$CsB7%azYvYbo=EknRR5%nOqbMr4j3$3Q^J{Ke{`I~ z=3+l7z*Qj{cUkzV;ChY|JW@0<8+ugU&Puo#b-*@HfM`}en34&>jI~pi9+PKDSN2Y4 z7@*F3;?XGZPp*e0QlcwTO@hJiP#l9v#R9=0S} z>8IWod-lEyi!~y*T#}(hpg{1G*q6;y-}@TY4?>Q8dV8ATu~Na9jR0)Eg|=z`*TtMW zlO=&L`y#feOkbE09?PA9Gn=*HX_D-YoY9ENvmxn^y{=e5v!U%}#)K9a(4PWSVdD=< z$^YIk;U^%#*}gV>m-a8pZx*?9mKb2tvU^!Rx@bHN#H?4gHu1bxi1lM>UbNT`*f`W|Ue3Pf6Y&HRcmE@CW#Oc@(!>Eu_Wz+K)k0Ag?g znB51^zP~SYFMIKht!c7A6J7w;?=$wmi_MG-m`k1OXdsEOL_4RfIFgi@FFl0%9oEug2?Ioq_nCQk_DZw zG_%xUqHg6W{jGpB@ErEQx^!?}Ihq4*&jHLJ)#_sl<{FJHu*i%-<0tVGZl7VEBqd3X zWxr%>9NxRhebbo7Q93hS4yflsOUp-*qLm+AQg|1JB9LHHPEsj-D4kgG{_NVm_qHq7IVX2`hT z__&XWXLa5a!(O=0i95>O}hkKK~7a;1#F*pq)E8XdO4&W!^~Oy^RXJb;}kuxQIut)_Ar& znHhMPHa~R6eSN0e@{EO9TFe4r=gg&EVk4_l4@xws#x1;lhUjAJ5_%05*?Yop+?e)t zW(-l?A}7YlPp{!N(wQ5T=YIZa-beN0{s+qW6s(2&H#UV2->K0aR3Fhr*F^%J@-afKn-px#ty8QT`n)Y_wZ13T-jhe`@z z2|Kc(BGhACeM(Cbu%8&GwP}a{9Ok<`N%nLwo3K5JmY7vl&#;!(JD+c1GLfCzF0Agzv364f5aOh?ropg~zUcqhAW=z&E^$NM$c?(N!Gk-PgSxSqKTh5DJ*kKg;-t*n- ztMw+flE!%|T&fa1CND< zYRa}&Dw_AG{Pk9E#&h1W6}KD-lAI19f+(F;HHodtwm4Ahdd2ki-Z3$d-O_;kTMYclg(R@R2!J> zdBE3QjsR^!*jR;L-d{WCcQp=$sx<#)8C8WIcT{OlwG$y!;t@_en%p`jI?Gv;Bp065 zQP*IqkMqpD%qPSPVo{0EdG6;oFi0{#+8^A zHLDZQ1TwjN#165gInrM?V@=^*tPOv8BO=i3Cy! zBa81VOG{I?>wtCcnN2Wa1Z|TXcnV&a-LR>Ia|9inUcG^znSgcz9k7d7XzKOJuk!dh zf}gMq?=EoM40IQkH@<41Y*=;H9IQ4b16Xd^(?@zg3}%+nSg8_H4<}}ZLeZTFZ!>Hs z$N*8k<^%#|RKcwTq_6)WIyga~gvt5@Z*VB@swwet8^y z{7~l9@(To!4nsFe>MP^qcNE}Ga?=^SlCobNqrE)n=PX^s*`@L^eP+XnkFta{+8e?Z zO^{k&jLID{^I1qHEX`itp(TyY>YEK)bZ{lBKBs;z`b8tvLygk(`K?FPaAtewR?j&0 zb)=@#nUV=3u3*d`_kE<cr9K-7=A4$Vo=t1M%}mA*$Ae)ywC* z^@%*Mn)S{dp?=FcKeZNhzCVR%Hu^!V;hRhAe%@2b0M~vG=?)V-f3520IlZhyQ}tNQ z<-!tg)LjRMfw|GRQd@z=e~S&;oTA?{bm6Uq2mA11v58T!m{iZshy&!31mBQ^1P*PBfe<0TY7enO;EDSzT$us_J z@4ep9;B7oz>C?vY>A`hF9>*}*<`pW4U_ENKWl5qspee8S^$_~wr{MeN?e z#bcHeHrxQqz{#x}4jo#djR_vk&EF2?w9HP+JR%w-P)E%xPW$IXTD>_7Uk{6JEpL}G z-BYPSMXA;tAM3bh-*ShFadffd8F*4fbSa}VjO{pO7c;qKN6f#8Z6uUYYLUH+dTzm| zdEy;Qog=OZce^zak1l!!hb}DZBSdi23O9T0J$szHevweSp{>C8&zuqVjb`cYxLOlc zi3gb|n1!!8n0;RUj-{qL5qAIv8Z=`1ir+Gi9_S%cPXj=zeB3GQ*m65J%gY`h{&%LJ zVxCoVGE^d;`y}V`y>j-={*#@40w;P(Gpo9n9}6qMm5-$*eUmyW202(}qZ1#?nx4L! zadi(7>*h2_v{Y}4;2#F4ecP2(u8k^b+dBTsTDTR=U%Q@ciyyj#HveX~A0jJFUZvWy z95k)W8hA)gOITC7s{Oo`#RXr}0IO;u?QEeINg665M3h%e+(MKpW+dFaV=q-g3C8d^l2CU*+m=@L{N#TIsI99x;e4mk<{vC4|C4M?!@ErIt&pBQ4T3QFNj}vafp`fjv+A2=`_3s`NM|;eJ_lDCKLc)m zzAHnppX@oCD}za#z?rQuupuw4Ag4nNziZ?drLsWfB?wzO=gpb$*z!(LvR+x*%uuQn=D@D9>|w5X_JHpO+w2Zk>u2oH83|r z1Ca-VLzU_{k_r5E1Yu4Sq-@6{$OpNPrDR@V1QwAq`4#BoUL;I1wM~eSb=lF!=LZ@c;cdZW;lbLaIA z;A(QZ;|{e67-4V5Nuzs}Ab;!V@`_S`TPa`(vb3z5k@7RttjpX?68$_Ghn(wPNbjclm>W=37P0v~#>3z!SB=Gbu_j zxt&^!L`j`UF!gphsssYP`F+9rG}K88#XtU(jlu ziF0n>y+pzYBw0nb^^Qm$tTEoTY$Pn^b5C7fZh7kid1K!4?!NvkS(6=bTLimX*A6K^ z;CRk_HXG8GrW?E3%v^8!cYa3wNw>cnYA&ouNk%tKFN&Sq8orr;F$($^Q18cXzQW<< z6em=IyTLcSZ&>_fbP|75vR3n3rhX$VMC#!MMipORrrOq&NC!o7oNdMT^*IhUgwVQI zR&_~(t_AZoO1V4l)x%8HR*HxxtFalRpQAwgf7ByiUrT6_%SqtOzxs74lfwcuO&n0)MJJAGvwA4 zYYy@09k+a&03PvUbx3YtEKw?pE-;CDTJa)Gu;=_7HtcS|b-f=OF+IR%tcQyVNKR)8 zp>GulH;`LG7|$DO4>*HEw_q%S+?!y23xf`0Zyw7pQrx#nwKv{;W~*=&8mD93?v5zy z$-3PX(`oHrKB%7n~<&$jl`Z?9eBXxuMIO%UZ(6r7;WFkUW zu+a>DR-riX&yyQ8!H{i$0kvh0i`7YX!Nl= zKFlv*Su}6Zfgy?+Q)iZ!8CV_28FPN+qyWv&rSCLOW7E$cJgRh(&@ReypX732NCf`I z2gBcePYGw*lW*B-^%B+Y|8sM?RflJBjT3CTGehWGW0LcyBE$_IyDQ(V%yFj`VCj_F= zC4>d7pqwvU&ty%I9}H+o3|2w?$Gk$HxB<@Ot20(13o<;I1{blVjfUcOwzaZJ`3$8CUi! zQVT9=gK3Yx8qC^#qUK2%%he<3&iQN1=o;brGZWe*dmOr#HYL@+rrxssqRG&uUT9uw6Z9h#5GeZItVAVYNNWaktUT-D9^S zM;KQ><2!QeVszWJv~FGacgBJ7gPYYCIzwI)`6JZ*Cg$$v*)9eYn%EQ$5m1ksASo+O zC)|VO#P%Qi4v7n^(v>Vv?FixYFwuha&gp&V#qK<-^gGXIkgxtSPfSZEdK8WsR`h zWDUUjyG;FO>Dkf+Hzo7yLQ>!Kh(i<9!I*t+t={U@?q8wj3cQn=xuMH}WcRSa^bLtN zzoMpVD@|-eZR}L!HF>t0J}6Idao3bFaCRX-wCP@_jb_KP5|;Ixl>Ul52O?eP_CwnN-Sf z%d34Ovvl1Tk^O5wYJJ_Cul$br_t45Tb}Xc=P5e;%*L0sxE7QuP_Z)ts9|*!tzSgli1b%y+bpKJ3@|FX3EKa`c;qQVL zs(wsErS1KPpKi_OEEPAEH+7SPU4S?9Hg|?v#`gKJe0pY<@^@z9!nj^q<2dJ4462BX4%?$a*P-RNCs1?PtnhyBv=UQRv zyww~XX||1#nhZb9HaG>(Z}tk*D&I1%fRYBW(I@;y*en$7y!(u+a0;YL&=x$r9Hn7} zlk?q3HLm^(*E1P2Sx6F%hWly4;=qV>xzC`aC`-ReX0t)zgvIqd@V&3(?X5;p@gxp|4e2A<$&00f!hA*+ekRRo~omBN2*l3BU3=ykKr zA=6~~3wyei3~gS89#U!rlewHp#u_{ZlwmJi@1m#%;m zhF_<@Fc-aP_v0a@T4FC;WsiHBlQO^_T5dpNJfX*acaT>Tfb3{CjZ;l|<>imq2snr} zb_jv^N7e4}YG^I5z04kB0nqmnz>rd!D_1&raqre$mcSP#8=5X=EGY&VbqGe&uSbu7 zeO}_^&AWg{v^hLGH2e~E{pXveEY%+pT6H#%bi6QpSQ#)xUXWdc$0#%!BZNA}cAzSB zWiT5}XZ*0uRTC%B#jfqplg_vKkCY&0S7+vIEP@arclXar2iO$~%+a}mPoBRZ%I@HY^%Dj;^WR+ClD zFA2NJE#EKNX#2#i`nOn5dmgQ-ml|;-oY{UH)-gPedQ#4pRWYC$>+Cz_k5kg7G)JM- zBig0J+#G3FWFla*=fTbC96K=yaeP{>+02lV#?~ME9qYk!YQ(H{o=)#2>)tQP&AV;R zZi3o(rB`D-m~GjTUt3#pi2becrHqf;>fD-bo#5xVFha{H~*khgk7100jjqcsKH&$#ecT_c{hg?@BbH0B^@ zmBLV+8DG=OEpw@AMBhx%FMBFgDx(RJe%NPmg7*$ax1rujd3i;;4E@I)vBu~5dT6P& zLiNNr?H>uD8oXYcX7EaT@%C=H?<6B~8Z(<}W&qq}YCf#TQ9=4yBYyGp?CO zqu6hXZQx<8t8tX>_=M~*8>$xg*0^ZX?MDx6>@|x1>D_$N*|gN=vw7677$cF?N!*x<=cF5vblP(y`i|itpRm?$nSaJ zHKzfYm>Y|IkA5;|omNA|62DktU9Z%xOC`zHmUy4Ot@O}%@=cG${NdILG0gqE`tmP* z`ZCmgb?@0FX=^@>*7B#S%R>FjsR=wBv1r{~Ts^m1pkTvZ|F7{&C%D??7E`Jb#pEBN zM(g;ayG_gOe=c)Rdf}SX4{EA{u`WF;&SewLm^7nyz5HJHBZ~RGse4k;ZCK0RWxGt% zoRyW#a0%jZ#k)tR^a<-0xAA~jNs*tWMGVx{4weB{j{BC~JoaGeEkshvyx?P`QQhUF z0rX;@_ONLY|02V~b?y_>8>S25KzwaWTuB(z+5AKLT+4!*!_+}%wY%sJS1f4Mkh1%Vvn06{ic$y3OWYXw5+WM11&!m zD`htd{o_n%T*WiC$?2qlB03A0h0gUlMZ9-H{)YavdBG|fDKCp4Z&JxbG*S>LMS_t_ z5t(SIW2jKw4i`}RNf%Jfc_zUR|Z5;k@C0`!VKfqw%5`e0$8bI<#=B)$%o&V?@q zjE#n)@vM0nb@739%5p$@f9%f@XOIp2@n$D-yWtR!DdYvxPgD0IID|7->*8HKyAD1M z$v_?h)vfPzIG1~?C*k8aUU&@JLIGGU3-1wF0c>LYVD9r)AC)an>Ir{JWjg;$J?apW z%~-d`h_Ac%+9gFzb&Kn}>J2Dm0ur&5L-R#?S;`Lmo2G3cEa=F0kG>_gjr@bW=r^5s zmmevEL@v=|rApLGUjffGhbQR@lt~Z+K&Rd#x`&o>Y#U?!5MzL>FL8)TqGm} zB&Ml-ATu`MoklE{FtiWu3u0+A_sYD`7$(cCPDY@9q}`l3?*0j|o`eU{cK2aXEf z#c6b@PheV<2l}ba1+BcJza9M5G(*6*tR^d|p>aC*cXDk4mU&!>PhJPDIZCd5!FJl{ z@!b2gI%Lz~VbaQ;wbwDov9InEcmgu@j@iCcwbwk7;uN5PWqE(Zw=XogVxSgdgQ;_? zsm?$Cz~Biz`S;7SZsG&-BBILw)bJ# z(>F%0Vg)NrfFojc;%pkKEG8knzx&OPccUNQayG{%*MksIlC;9LL-(xcZ4ob2S>W*Pi}E zfn3S~|4`b)Gy>=42VbHNNSH&tNDfbh&h#e=Mze`7Zq09n>}r{Lklij)bfS>C-=@M)M?+g`GM@# z(JVUC^#Zdl;=}SxYam8jmBtZJ%f&$~PTJIHXxw+2nrhicWCT zcOPwH=Pw_764{c>9i79AGnrQkxe3cnkx9y7i_-`Ii+*P0*r)Jyka9aHEyYXPa5xNx52c((VkN zV>Yg!#(YKBzdIPPLF{ObT1J*gNb|bUuokC@bRk3{+RsYqd5%>!>rQu?TOCK7Rk+hh z)}K7bNCWA0EOskWInG9m{|&sotUt$W@JX_1;+SaGyu~O%`2rTC@&|eW@H4nvkWHx) zhD%HRd^1kh$x5N`5pcqJ0J@ugoenG}7vT=^`$0d-S$T!w-_H(@UP=#y#zU+K7x+tG zm;tqVd4^Y|us~ko80aJVSQKv;{`uEl{H^Q8h%>Hhf)79+K=A+HxD%YHKuTbg0Fxl6 z)zbuosO@n2k4e)rCTxJK#%Zgk{TI}pK1D7@n|SOXfwuqH8=!#DG{R#)bKduUXBV?r zKWjBvcEL=ACi8Es3@>Ld(3nUBP~SKb=U1K9Xxw*Y@ZxsWr+BVOfy^TWuchYgd#&d^ zuQju&H1J$H5>2OcR)dk3D3TqZq@;8)VBa4D|M`(z2VTf4WQ2u=gv`gwW-kFj3c$ti zzW%1)`-SUl^XOz&a>6(?Cs6Z&Fi?G1gqEgo+?{)#`ZT5$wj-EqXpZEMvggT1la_Tx zBUyG>$q`(RmO<>cTX^`bxK7as!$4_2Vv$TK6-l;|qbtCnHXs2=5GT?ly(IZQ(1`&L zoPOis_bL3?+^8{KJ^=vEE@^Woz8h{~`EN=NW*Jlzfa!erAXA(QsC3Tj_N=p9xCyKVjb+gm6l$`&0%o#!^}<^@gPdXF!Oes zn_Y9j#>6aoO6=b&XFc{cbvNoajIlQw2wp8=Vk;826S{A_y{1&fdN#QFb==PHG_T_4 zep?S)LJfO{0;EwNc;+z2{{#K%Q70~l97a+%8*f)=HJzOe+wAZPxaT{9)_L`Ba#nYi zRQHmGVRXZ{C?nk3t!=BVksqH{3?JH{+t4XE-Pzl+2Gs2f7Swg-7HK+u|B$BytCW>w zQ`gb_V)~zkmco|mGIo`jKc!QKCA&dSxaLzi-9mkQ?!M(|c`6zC&f&rB@Z3l7i;lcb zK4tDPv9hD-HA&-+U=y2`zQ`@(#55N_wh=VmCt%Mc z{YfI!k-h4V4a-z^fwdq?w1tY#P_SBvl~Pa37wbMF&c@uwWU(*7*>DO``ZWDvUs#{> z76%W)U=Mj>IhBT0G%3gV&nu{|Bt;=eXY#b!G^4CzuyWz=2YcQ^trgY(nogT5aD%9bcR}`-+s_{XDNr+)ML?H!ums_|Y9wP_+W>EDKGzm_bQv&K&s+f^s zQYecSr9;%o=Hg`?%NNYPQi@3tOH-!3GmdTb8_FHmYEi?1lOnkxQLHS1vf13Da5n)7 zs)zEqpi4@zBgUf@CPu46%@6Nv$SNg&6+WJx0dWhd+!^Is1 zQEbpeCxPi)8x}k%iGH`n-pDRI-*x|g5l?4^(`d~$xV%H4bnN~}a3UDNg`Ay|CBJY! zV?VM)Is?F6Qcgn`7(H*EC$;NWWR>RBm;m*#4`cPR$-<<&=}1P;R&0+$C-koo0T9{7 z%T`1D;MX~g5nO%v>w_A15~70{Oj=>G$;a(d&d67iK8mCF37Tdt-%PE}Y7LRLc3jE}j2 zXe#-!z<2pb+6znl)II(@Ksy`2(Ix>4eCUltJO?jn1TXz)n%G5TgWzVBvYAfr6BC zh=mbpf7Rjem-cXycn%AKCbNYHbor*IB34RHBY>0qg6aWI`=f8)IOAZcQ6PcK z0+1(yOoVlWpMD~J_FSl4uP51J0%pQ}M`yGaI|5CH(@)EjvLa=NXUok?j|>P=yn;9F z)YaX7ZWqizwpj$v-Y<_l6O3YQ4RziTd5L2%*YeQq89QVv_G=p-Ez?h2z0&Vxme0e= zf|QCoEH!>f!EF>*T71-}MA=0bQa$b}U?gjcyT?4ZlRLeFvw5^E?0y)s>DT+$7Kgz= z8hqspW>_j;{HN^LKCSF`VPKzjt*?j`f^CzMVZN0(gBj`*+!Qsy!Mv5UTa(dztAc6e*;e|I`QJ$$4U__Cu?Q%-1N zw0%yIi0X;9I|uvnTjL+ynV#9tuST7{URs^3bn)fA{g;n;)tl+zJI!#Y@7QCk9J5z7 zREVNh*C@2rAA3pDjYZFMn^wgzRGNoJg)spgEeTC&kAJR zQ=5G_lzYE1pr9;w4DZd(o44QPUEf(=UwEA{ZgzbWQckZf~qu$b4bFyeQi3a2tYr;D9bg})Qw9RlNES1OJ;la&_# zCRU}_n}1g98LY;iu8K|-R=i&nfZlj#U;w)}6P2SAz0xiS9>bxb+=pL)DD!DL+8i<_ zNPbXHS$A1`*jRu+PtfO$OOx9Shv)l2dDfJjszDn1kF@|$cU1qp>ya+v{ehl(%fJ5v zg@@!`%|GHftIVMpVqAJT04q<&ox^dQffxuUvqE&R0@_O4wLekRxUFji8n&<2{?h?F z1PuVOFc*mlyWSl66-w=O{B5g zVaG3;mIJoyD3vZgGQWw0W}m|DSCt)pleEhUUAvji2A!Idf9Zy(T5}FgQtk>K0mbGN z=h#oPYaTlq;X$?)h!&`1r2>hfaBE9dE>)Q;@3BnuAMiup)>w{R`3wL$P-4-`l-=5q z2pCT!jbppm|8lTuEVqgWa{o#Njut@W0DE^k7JeN-#00XJ_w6oRH@0W3@}|G2AZGy! z-|xc00?>aCn(PHmGI~!X5`WMq0-j8)zVMFumD>@=S~>$ztl+V!bKLtKXpnrM;5nG= zw|nM5py4Aa!5pz@JZWxV63xuvq!2FPfG;SOP7qT!e*QFMUv>x6dJy=xpyB)9=`b&? z9qYISGbFgMXfDzIIxFH+Ki?ecd>R zvohnUf0vXap4N)*JT)HuZT1A>33GfAY z`9|HmD-lJqfppZ^-=IR#tXrX7GSaCDCYnHbU48$6Cyg?57%E_`g2Mho+0!kabN}(I zGGbj;ez_>*htaFKK&IGR*KV+8Sge-dFCGL&LAfs;eJ-io*mP~o-|DNr6XrK4yM6v9 zyb-r@tA;YnqkWBgnaXRT^Ye-B01)3YxB|Db9TpdOwG`~SwD)7A+pXL12jib*6UHiw z5V|%%BuLJRquXNVQNB-q66)*0l*VHQ=uuH*_zVgN^(WZg;6qcx?uocLs;)Scp}XBz ziDJ@f(mgjgh&7*eKy}6Px}vXJ5BD#8_gAjCzZw>jm1~>rfY=GqQo7k1+P*(QKjF_A z&n&_W=qj(XFR#R2U(ozf)Z+e(i23f=*I3+p7S4Zdq=n?kUVs1VF6xPkmU@aW5c9HK z7$59@+wriydrW+}5Mv*b*8JWr*Hhy^-I_Y8duzqWZlImfZudt$OaFGEfB*1dwy%1U z*EG4Becni}C;NU{rchCa+#K5rm`X~w2w(4eXKm)u#*ekoYQT1q?L^%0S^GOb5D1`u zHbW&{ql4XyOHWRMRBeY`+=xS(!mA0EYEgH6G}f=4{m~L5dsOW6D@It?qnih3XM$(1SW|xbL~i>wX)xn3qe4oT#X^!iMTIq6 zL{Lhf48p=<`dc@2ZI@-Pq@hH0#q6_f0-guFL2e2VRWVNjOeD*)&Q1w&g@QsZyPRcj zVNpuaJ20Me{%lKKZZR%VCuIo2z4NhPr5p?Q^7jRou#-X$XJsCtYV%X2V#;21=47PbZW{jVpVYih8_CBd23svF zxAI$OSa>~zJ4b(Iew|&HnVxoG!}3l>)Yy+cD2X*b7zuGS(fRD}{>HT=Nr8$QQ9McA zbB{)8cEX;SbRu^c(U(5mi~_2e5VoaFlL!%<^spQ6j`)|nlRIE>WIDL55V&n}KN^Q- z>~boFWN}cr%F|_j5zf!qxzof_w>U~!Sjk?(?NZ#{%>89e3*AEO;*5DQT_az-aMJ>o zxz1BwJT)wk26j^=`f0KR3iOy5nP!=2;>O-cj~@seYg`QsM;fm!`n`b4sjyRRIK=3} zFi2y{SfSsHUQ{j_-Yx)n^e)RZG0Mn5=61p4-v!bg(dd^Nnyego^->S517f(f(5aBj z6nWZRkMnrrd}zy4Hf545jNn!ERo}u_ez1RW#38lL&tn2e z2Us+f1D_!gc>rGfyTBNm+jPJPpwAulOLn#C+AwLk&*}V<%tca`li{51+JboX3P3Te zrQeV*F=wZM(}f)RFal_@nh^+oiI%{P*#~=s$Nz&aKaws;0DOgCiPvA)TS7m`1sWq4 z|AsDwiq}Oi^(EZm-CcG_4r+)KB zY~C2mq%@;mf@C2Bp*xe_vII7KBr(qe+6AOcr2d$2*Xtt|f->wQd0s5)g(;`~Y?x?n z*!>QmOhL|N?%^vXaw(etOVQZym6=f+39ur$IFq#7T5I|5pL!Xzraf7^?=G)t_pG$QBk2 zM<@3w>Sr!jhv8y5zk$({^on!GS-mVt;J&0Pmf4hlU`+92O-O|j$6zzJc~(r>12IA+ zn^PRz*IA8wZrbw6pP&!Q^TRsXt9*g;F2$4q-|_aZd(Zt(Zx?vcWj*@4w4REI3%|JP z?bbRiT_4sO9r3k;Ht3=@G?-bS*!*!ZP}Agrzz|1Mcxj^k$FmrP5QIF>6bk}Sv$WBwwPG*W>V);YZCweCHF20wT%S{k# zsWNIBE0f)JwJqYKXz3>NKZsGAcB8GQR(-->@l9C#Qw<3x_d2!Tx z!ul`tUq{umwYzSRP><*>6NeIZvVvuT;T)_JNEQ#l5|G&`X}lhq{a}Fd{Q|>cO0l4z z%pkE(GeuNmY4}9bf&ei{(u_!p`dYxsq96ya@h1IJV4LMCr5R7kcOJ8yC&(i=l_Q*l zL{wo=7r5X$Ty~cl^?wwddpOhY|Hp@!VKio%V{?{Mn?(*OXE~HJV`zuWVU$B8I?S;- zMmdulO3utFr)rq({r9Fad@6WYZqR~ z_4DLjm<)R65&!;zLXiC3o!Po~S@_Ey1s;lKd%?xYjbMo5&z^2G$ z4Qw`wB4IFax`F>E!KBR>v3E`0!YQKiOwloY&Z=J-5TRuco;{SEd~|r{5UQ*ky~>|_ zVec`aA^Hwzd9c>fE-1Dqj`o2wd)(D@b{h`Z74eX0i6`Zem2>qvV3f`ugXv&Bzq735 z41jdARvia{`0?S4u#>Q>+yHzAuzita&YVpO#TG1;#y^RgN#e(wlqA>z$lKd@*xWLe z{K?5_SJ{+U=R8z#=%jFG5}@`qoxDbmH0mPDP8kVaszbEO^V0iu=u!V(*9Qh4=(Jfh z8M7%#1YyKDp`sB)1`MzEx)i5g%9A=A75^HRZak13dC{x`}XA0y?6>;Fs(D z(aY0&bKCXe`enf}Pfzn*32@cvRLXPSpuY0l%<&`5Im3R~94F_#I5pkg9C4bae~aLn zbHvo4^;ALC>k~%I^U*mP*6YHYkbo(lTh@!cZIn65Wxl5BuEA$lcWod)l1FEK)2-e= za_XAQ1vM46KWDx*XYP09Y`@T73k!}pozsZyOU5IQ`)R&c_Nwda&)=CYeAqV^ET|+` z>we1_R_b~<$zIkX+H6Ex3PngN*+gZMu1LSQL@#J{zWu{Df!}+zyt@(${%3P_x^BAP zHrQtFPVUp5nwj=lr347k!K3E$?3*Lv&GeV)Rc1G{ZYEucaf+q7VOy^uZO zKM>K-(_8kLpW~{9_hYJ{|E$B{>nj=-9Vw1(FR9I4Ri1v0jVZK1Tw%aXQioGk%>jNX zyP=*!B&kPUp>$0zMCX6j%57xGbuFsZ{>hwIy?H)yy82o$WczIMyCssAecxBn$B(o< zoEOChYl60@ZJj$jzSc|2C$+LPv;|$`wT&Nn|`ldzU^vSsP@LE`EPvdxDUslSvj#Hry02L_Ee2{IxU{xY^apCh4JG_mCOnkBjgIbbnQMshaW?XAtE#WM9PBWsvi}2B zn~n0Jns^g4G^8uF#eRZLen<}AR6j6nYjLY5HLA$WUqf!f7=vmDzKUP>dI!q%&}kGo zC=M+hCTA?fc$mzbPb<~}2aV=2K>HEHy%<-97N~_auXbArOgC(<7RTa)Qr??vWc{)* z{rWRCsi^DSf*9@4CAm*dNUHV78%BJG`eLglbdS4i^*G`o4aI;^4XeIPfI4`W((Fvq z==kDz4~_~VyLN>?IH?apuF4?as36MjkMF6;*#H0lLsq#+mUmQax90~b1MV6#n6yMb zYGY{_;XbT2yP_uR05QXwRecr_JAE}Ch@SOO-yHWX5^LT8yZ9(t1zGeW@5!55gMV_1 zYjUrPu;bsnQ0;IS;^~RxhHx$^9~sr(6+BOL{HfcsvmhEfyh}3*NBFcc7yH#c^;%@%K%2bt{RHFLw!ebH-W@Dsok z2i)tUS9y-ueV17+!G#BFfWET zzVWArsuz62!Z>G9@udKcwN#|;1MbN6K{E6>RV-Myvwe-kmOpVhf5L?SAtF~fS|Y9Y zEsB`L52V2wl3JIp`=22mW9gD`I3qBG=RR--n$J=Bttnwhb+xL_M)z2uBiDBd)NE`; z)jCtXe&{v?d6_H%Wnsrar>9Hy^vL3FU?dGFsi;l`)Mo8~P_cHDQ2MbR4D@J~snG}= z7AU6m5si%hNu4`&xh&8@pOeiZaS#eOJ@W*wDK_TH8V{%i%DphzAfL;v2StLD$wb-@# z#4D5?x35E@V*=?hGT8?LhJJ|O%YiK&^;n6H-eF@_(k?O_%F)Mv8Vyqi6%_wD`Z=7} z9I|6|J-9~*eNrn>YXLb2T}9=H&xUaqxHqWVHe!po#EPd_4;@Uqja<)6tVyy|L>`2w z6Y09o+70LL-O-p?Nn?7_gO4aT?-SzHf=^_7G_(svXc;v(3*O11P3?6}%YxUq z#lT4LH;o(Ny3&^GITrTq;; ze?1&FgXh)xM^{$rY8nE%%;M|b*ZNvBueUmtK9F%7QQNCOaZw?XvftaHoy8$M>htMM zd<=KIy>@e@Ezh8^COCKT#}m(0!|ji$1Ztzq^UD7~BF`r`bYph5_r$cr4)UbxnxF13 zu&q{WR~?==-6mPwqU=P@F8;U@X&V`|kUO8ZwEgKOuWR6ATCZnCsyeKSyPx>1C*8N* zdo$kkjavq9u-_FB$@TMY+Y=&LC@`+wd@Zz7%lUsvHNiWH>i0E+gl=Y>Xqat!G8CQj z()JwnsiQ3oFXkMq}nsdFk^&@ycu0p-q-l(TXOc3&e!@PW6uGYb! zLFDJv*#lmhO}mx}bLaea=Tp`U)BDqHX8Xd5@>uR*k&usSO{>7)F`D|>+F63s{Ac)v z_(+6NT}3?C#zk(N14ta6!F_4jEnIPlA`+(4JY=)6qg8iS^+l#leVt}O!-KLR&kt>N zrl~aXnj!@0+~0;}$J6YhdNpKI74-5=K;SCw_I^ltdexnAWd5+%uv@*kKP@KfM@%rj-QdXK@go)>=qZ$r^l>izBhbCWqV0ntfz5NMi|-+ub&J2v%sD9 zLzB+gnZ!v`I@Dk)Ls~7_yCWX9Nc12tNUK~k#!`5)-qxUug^3Y z`NF+Pu)S2W(PCJ~lO`0;Mm6s*(Udk21MfdC1qC1G!f0es}1tlbM`jdn>QQl ztB3wY=NtKp7?C@E-0E;AoREDq5M&&xp=gZdi!x^e@ddB{Kqm_R1F5v`$?7aR?0o)K z+%g5sv|Mx`VL|+;AbY3k{{y`W9TTmSm#5_YTMecvKmzm&~El=R$>)ea2O_0 z=hVV%&=mAfcJmzN)t(x?rC;G~8-B809Oibz>7GEFKV_SdBCT5{?n)-ttLq4ge~7*a z9J|~)txCtoVKX!lAd#y=xnOLJl@fvr+G5(ciSJqUrlmKikU%N zbgtkVf|pse>uO$~XLk^qJE>JQ??Hriyo`&QW@C2WjPFu|@3rgaQ&0Or6cZf}pr z*OY4(@Jm;GoIILVXQ$c+8lGD&I!+ZjT<)3ennehAJ3N0I8(OnOqbe!+XV*@0%~p$# z2ErtU105OYAep<`V`lNrf}Vv_9)WWWQ%`MTeM+6(83JbH2)jQ`FM;u@^? zFR6={n0Xn0E^&1tWZlRLyk@trdGFwodng`$l15p`x3l=%8$VxaW{*i`sRJ(4Z@DFo z)Iu`J@%x$Dbfd$n1l#D+Txg z)dFdoR1f>iSP)Q|m7uRuaHx-D7#DcL>*`q+=R3yCPt@=`2Vls+zfag1cP1E<7?|6w zDcFqS7Ou2#9bNINXbMpK3gd7i<&o?O%U#fx0SYWnrutPz$4fM+&!gRUYy^Whqvw~E zyIU`RU8Q7Kt@5n~^(6hG+g&hf{oGJFFIObPV+Vv5V1SZAfcO#I&|vWgCHF=BalNDU z^@tN*gAg=uv~rAaIKTje1*M^PVe(vDY#f|Q4vhnUmiq$Aj{_v-`G&pF{7=cnS2@7@ z#*_>ex<$g+^>Ph)t(5|19jxEq59oYLh@{AJ|J$%(RJwZJ>&r3fyY5Y%4nb0{?@b*4 zvDq2CIjeK$=#CK^W{MMIC1k&TI_Rbmxmwm~^3@$%#4y2erT#L}52aK2Qr?$I#5F4` z(7CZ7Q4f}Xz8rgh)j8Z`-SQr>*TJ|M^_TD5!>I#v}$e zfoaQr|g=Csv=g&IOnH-XPLQ%ba(6`bCFeCJD( zjck8F>-I%g1}Ej= zvd--}?;9h`t=uJuK-%hS(44^PjG#udl*G9OofdWYiNL}aS19fmUdb=nj&_WypQg*7 z=?!q8paktfDO)0heW9F_-TZ;ykpCcT(AIRC!`_+kmob5JR^i)i-gC6joXg!fA2$C7 zRi{c~Ta_I5=kO{@3W(+8Ve^i@ouJN(tP<%E;jSLR+n@JhZ^xMkBxP9SZzJNQEfFc z2UUcH8sFedmZ$4RPtK%XTHioS0pz1E1;6I4zJ5L=Lv^nxBFH%q_t-_`l;*YINSgBC zv+OtI`Bx8sNU_vQUAI|-mbUHVO`&at)gSsaQ*7Fd z|AEw^`bzMO94@?ak@)njHNX?S5tGDrTul8B)aW)-J}A)PvT=4x8%B#c;SWkP{AD7% zT=78wXx&s-$6OP!)*jac<)gP3X*q7DiQH&*baKIaX$vR*FM=W_6J|KF&E{YA&7EP-(%=G1m>1#iL^z;J@F27 zIu~31zVcl02n@@`w)}90} z71?lq-~&KAeSe?0^G-o6eAHkiF^y%~R4is^3Ic5&1wn`}7v-x@I3@~RdaB&;Vk9|v zAtheM%+gr?XZ{yP@Mtp#IXx~N4@GFRICx$_-;$E#o`mMsB-(uDy*m!BA|vvD$@L=8 zYVeADVhUJZf}QD{rt(B~6LH2MAI#T4x>FY4V+7{r!UFq#TuGcX>8_pKRipQ!cP#MA z(UilIC#CvnpLYb;H5NSl`K0cQBsciWE0984&4=_ z8pM$jOqGGT^hXlXogVGsv2KDeg7F|^uwb@4^dC#|30rh*%#;W`08e7~8wSk$-Yf?- z0iOc&0feBT1a42}a;H$p9ud$$bcH zpIlN347fPxmO=&wv@M|T`v_KXYu zvkhWq<#FHWWoWIOSUfcdhCfR=aAtGmZ|6hg9AQT|Gt1$3zA05mi(`)}WScGPnyt`5 zDNxmCyP=w1#&z*o#kN+M2HyHNXH}&c&S@83RYL@!y45`RZmSkSW6-l3y%$tQhL0t* zB-gfHIw9q8*&eDS=G)>uaX~_7ysMnQmDly~MzXO+)Gs0A&$-vGd0Vl%Iv9e-y>}62 zCtuZ9c|X>vT~w2t*X(Q(qPAn(e6*O4N=|4wnQn(jNhOutdNqG@;9tw{!A7q*GbOLl z=&!l2&NVotNbZKETXvz_dbl5~m~I`;FVc#H4+@vmKATq_oTII&M_RA@#iZ6>2@UBf z(bh5xP1(*is=syIakL!JCOvCTXX*|EnUb16c7e~3JMA3JM_G+6!FG#%PYDGoS;@#O z9bGG#n(EvX4>f{-}6954fy;a`rOmku~#cEpgZ@-B(jblNzJ0`%-GW$xznhNmtTX z9U&$1#Bf`;{P1@b&2%cs0+v$$Hlfi6_e}fQRmiA%PvBF-Yen&sN*>~i%f9}>*{*%T z4hLe-;IB9P*7niMb-aNy(t$4mj};22MO3C79Gm^!He+StF&6@O{|3(}5!^PKw>~xo z?Hjt?j(oX#b-Thp&~R(6#j?Ml=~3^rVPP^JS-K{>NwE8K} z$J^(22%FjQwBP^3e0#IkzL4z7uE|^&SWfD{lp2R{#EmeD7x<3*t#pp2GBgSl1x=N$E4ruo zD=S0Wwml19`qvU*+Uk%dOyEn>yEJzV(0T=P)ttmmi>E6zr3ms+kNj^{nm3dm7Phc9 z>{@;}q3447h;hK`=_?&D(_8U((73r( z`)CdE&&(t_3UG%z=YPQEnw^omykgFz^CdXzgfNqV|__-NbJ%UV?J$jxjbCnJ9pgZ0ecj&Rw0Vsu{D{@sKjult2CC(-4sd_%y3`|4y+74%A>E$ zHOXO75ShvfFqSe&q?RMWhf*}b9y6+_~fURz>%rj|fputf_E4I7z9qJdb#i=}erhck0958MlCy&X#^@e@~ zvwsj$8(x0tZJEE~8ig??0tYZx0&5D`b3yHlelyHPm-n7{33q(@CJu!uak zwk1-)Yq8NY4(DsHCtMf}#})vIT{2G`AuOi~4r%yNTe{E2Hj<0v$!4269~V zI*@b!fxh^~-r65KM8Z}}ZiJZ4mz6x$J<40>;7Leud!d!vbavS`Z-lk;b>Z&7_Eedv z8r?l5{aSCs%v!6V*UUXZYM$%qTxMO*!UVGBEjc#lys6tu%=@eGmYVS84!&jX-mTfT z+YvS*^;>6^X2ePkomQpHb>+*u38McT8?@Bk_O)!(H|a(DbOb5Up3qO}-wfK(ojKC5 zbb6OU>#-?uV{1i?Zi59Zv|0E>K~*_>*x(DH$iB9KXXN{VF0-UW&uXT30rOS%gFtxu z;q0c(hWd!Xg4ic;I>BuTO`Qo`qV`SEsjp{rk&a$X@@1`c;v3#~)zmh`+mvcPt82gy zIvME9x7JUth%eQ{h4=IR9=lSs&6YN@8b~+S``&;B28bEz z230X!ra&+xSoj&*$wE zQgu3cmeu~ZEdSRKTw;6E%C|3SCYG7(Tj(~YyDZr5HkxCVT>GlBFWjVt{(7`8A(Ut+ zduq;NgXuhdGj}_&roF@K#azT&SDyK{{%hAWpCXeTMXp4|xYA1(?o9595aMk%ov#(| zhVTit>ujGCi1d0HQ;@ZFsz|J=AwzBETW%2OC$5=Rp*9olD!S@LyHlJPYz2n)EzmOC z)wa3q|c?4^2yT!LDEY_YzO%@Mx!BCmlI1U7^ZI zQToR!EEx#F&(`VJ%3`zWyMwrF_af^L6nO|bho$f|BDMH0^4GPD3%L9Eoe(rvY}DOM zVagH%tkPU^D00iSh3B4YbC6R#VSEfew8SDVZ570?$&V#G z4;M%PZHBNx#P?RP3paYh6XnjwdfRY`5f|U2V&bp*%&#ELIm{4!b1zdn3#j|ISmjVb zvh;ld4_9&T9dHA1XKilM?m_+XZyauy36kzN~ha?`3lg#d} zWyF_#RL1fE-wQ`ellY5!aZ_;PXhcQ|kCel4gwak-qm&(sgphcM_)vOxkw%_8_t6eO z${2w;I7IPAK>>wc?cqDqUD$iX_*dcY)htFt*dt2m7asF@UtusCBi%FzN2oE1Ku;o<5!_P9|gIF~g2r9Gnpk zS$Pr~Es}2u{Q@0!WfR3uMX7KGm5FTN+(jT{^!DleI13ouI*oRn^oZCb<3!jltGnS zsf#C%34{xpY|LrETe)O4SgT#Ozra_YR?Z{MbyC ztf+Rs%0JY&9=bS{dmy0p`Qqwo5cL8k^0f7-p9Lc>zK|D+4^T*L*BM^PRT z4a)@hY`{Wo{PsGU9Vj4P<>bPW)5R_esxfubWuasdWqbedp%3v6^fyoynus zBj-$w)Cq077GE3|4&>Vc1&^^Bs(h{nYYvg$M(*zf2&fr1HyjCmZ}ZIJUh%iL1fHEY zqc1)dE(g^P2-W;?(VXzkIIooQ#&f#$A#7bUo9ga_Pr5^?D2O(d}zPk>d+jt7|E? zqYl2jE2df;53?zH zN)i#XcUE)6MKzdvup15FvLnQ0Uy>x@5HgRN9lBC}o9qt=~fi(q1?O#?avk}7)yij#KmN)AV9-> z+WqWmi1vPNz$rKd-qh}E`)2ouIu}J2b4%{I^~i;RhgoZ*O6JujNWG$nmyXZ5lJ7%T z;U6l<5RihcI_DRFq5~zcK&tN<7zLQHpWsN@U!wGiQ&tOvq3H`ktLWm!;pZ(Z=<(1Ustsr4Pvpyalm!)YIyt;c3#wI^-slFe_na7_TI2H%%vvmPLEzLf#qfm9sr5$T!hf7 zPCVQ4zuJizjxsHd!;4;?b1+%vV&JgDExZi0B78ZXK4tWl$*$IJQYZ`fCa{+lHQ<~z z&*XqXj<%N&oRhBfe8Wu4fJp}Vsf1IG;!i(8#J4l2Ey<*h25X0mwxc<2h>9wIIlcH7 zb|!zpLuMdOi#@ww!UQK(x&2ciK-oFx-x2+jtl-t*x;ANX z!J*D|4f;`K$;U@jT70{ zFrNsWJSg(bGK%;TOx%llG%t|okQJaqV*dOHidPz(7GL4scRmQ%tX<5YZ^Hx|y z`>ef$>&(*L&=JzYi$B~?b!AeGb0bNS3O>`$Wi5Trbe+0>%sK1$?}=po5%gC5SD!0i z%kvQN&SWlRtZ8{fsHRU&+-(h3n-yM@S2Idy+SH4-v3x-b4$4pV&i8!#H{y3qW8~cG z#iBDq37%2l8)J36ZLv|NlzHpVx=g<0~hI(@Eay7Jn_S47-gLvT&r?wwNLh z=Q(;|x7uFB=gMb+^&c!!O6A}S1uZYr3FW<(y#XF(68M(HP&0UyfbC^F95iFPsM-+R zr6A<_Hu}I)s;%C#zVGF(l!E6#yJoD%6%+6DxBH`AM-yrn98Of0T@xa_lPW54d!x3u z?Q2uBFXw48M;4k^ONc~Hm#;oe%*CIe1qZ%oiq}e)GTla2c|A5P%uD6aw{-v6J+%n; z=;|Mfn-LOtNqAqgXq)9)?DcoHTU*uX^;i6pqq#{gvl8OB9Jn`ET$WmsH7tkaEDr?Q z^olXM9=}|c6Vp1zL1dsn#Vt{!IAfD^YmzANdC#VSCO(b&R`Z}7uH-vYvv2zeB0rW5 zNL+ki&g@HTV5ykidBLb&e;$ccqHzP}3F2;Knz8V*Mer!xOnXzB8zNMlr0*~m2MS2* zultciDqiVg-!kh^2S-bBf6cDZxq}v>8(M~PR;H4;Mlk0wg_&Db`xv@RUz`3ZEFY;J^RusdyQc{%!c{>FK)5) z;V8Nnj&%wn5kX5)>)7LOVoKz7%_Y`9LM=i6ERT%yEbGdj!j>o{)9=+x=^YPu>p%Ys zfubse@wAfkH;KoQuyqR+T^Pg%gO!t&-B0P&o&H{USM`4^UK{2H(>*=uh}}<_s~-tP z)G~s70i(|RO0gZK(g4^g;Q;P+bjjpA-sG(aV^ahx_I(hY1`w-&-vSB&fEfI@Mryt? z2?MP7lWW(U>?T5Se78D3`u&fbPc+Ig&QJd(3ET+aCLDy3^_@~9yK!YZgbbANZrC*R zFOTU56oA|XP+iY959O70Li~3z-b%volpDuYbn~ zS9&Im^fR4aAv48_qeB73BG*3%f5x4j!xXzg1KR5=!6`z#NmQ&x$HE!qa4`J)Msga* z&Sdfj$B8OekR-xAAY)0%w0FkwSOWIO|G&uhk?2=B*cf9R{}%BRAQ3Y_fHw-h>HO#! zu!5RQBvh%1W7*@x%YBBS+`^M&1d0)6%EXl2X{BU!65jqoWVc!8s6Yw0e{zTVBhq9T z@X@kRXboS8_Mq3GoaO&38|cm*K^Ez^DCigdgH8}4{@%sWCx!h?9&pu^+ zB#PH;Q2GO;*+A#f>sqef^4L&ym#E9Q~^bHGCl|Wj!tHy7Ph&00R)xQ6M zBq}$++fn4@%bHd+o27`~)I|bewEVdaz8=bvWzp_l3ENdU$lq=XGfL{mb4%XK))LQy z!QaPd9zY0JuGf}(`}A$Kr3#1exAN#u*<=pSBf<`1F=Z5w08zn5z3Z+@Qpa6YB#&#sf_Tg&I03p5PfV_c_xKuQUliG}Z}?a<}ggB=ztVqD{< ztmkjrTdFW;ElGr=z}$`q4M8(a9;>M-ix`8gn&0KQ@5u{w3A%CrfkIO5J=s?b%u9?B z@W=|(;Pf8MyFCq0)Wcn5*DoX7J*06{&TmEv>vM%J>bJ#Y_bR`6)a+rVZ-d}=!-ak0zK=6Pa^8QIZ?=dnk&MZK(yZLBoj~fv9iDOZcODUM6#YH<+;CEz zCvKGg>rWEH(x!SnIsRf)KSmYjg-Hw->hT>JcSta;kY-zsgn%WYo}>k3Q9`AgCC(X0 z_J;*+wYPxTtJZ^PGU>9FzCusSe&IM<;KSW+*bv(tHK^d4t5g|s{sAK)?G7YlL*S=f z0XbfzJB;JtDI%Teys~OAps&%PCU}3jZ6Wp2#p0hJxD?ktImI9s(;1pupswC$=7hG~ zFh7Y{N`A!{%O3)#NymzWK-t{V41&myHxyZCh+o&=r`JcZ%6bC0QPmNnRTYW&Y*hLp zCfUQ^owr+nL5c`U>wwGt;-IUJ+_N5T5$(@sfocoxNw`?*p%i6}@iBg#w|?TlGnRuP zh@R+?RQt8_7N(vW(&P-eKkUn<&nL$;-ir??wi7`Ej=5f`c)NReP8LdBJv+l%2Yv1( za@-`qYwJEcZvpgwG2D(# zW4e*2*I7gWSqKvW93DMkZLxue@iDaky#>tX7SWRy0VPpNfwmSOFU?Gob){f1w17?} zQ{XIWG+;~cw{z8$fPN~r|J*J2Da~w7?^C{SJEjc=@ni7e&a%1XjF6;TQ&tge{Vx=7 zljC2DuMUzt@`1v^#|s8K-m5%45ZNS=zt(YFB?X){K#*uk4L`fFgj@NJ&{K9Bul$c(VG5H0%;_R`Ba9xTRq<%mxdb(0u)KGvUZ!ljOOe>4 zB2(E-7?5O4FjtlSkO5O_7n7W+`O z*@YMFm}n~2#mouGSs$wxfb>IV=cz`+8g2CV6I>5`QHE(6jiJ|+j8UqL=b|6CJU?4q z#CzzT44iLFnXGm~uW6bl4f-;(mwA!uU%Gd5D+hFbZ*5yV89W7F7S9_`w~B+;;4v?} zO`SZ~p5T#fobhMriO8_F)FAdZkD@PPFUvM*_3kFV*Mw%jDnDEg9tVQC#l*H*HnmPr zFz2t^kmhk>Vjayl15mN#q(XDz1aDcnW|qkt-q)1N3vf<;T5wsz>2gO}vt8o={W6352L_9|cBVTOdmD3+tVgKz9wJ;a==fXbo2%di6xP0P z&He}aA;hfqM%E*3e;~#C)C^AVG;QgqT(onN*tU&~%ug?`TukiQYHgi=CKMbd5*B)T z?rwS{vQslJ=$CsJTe-#Tc19MfV^!<#uH?em8E7sfFHlUat}oN}eeEr-g18>$pFMBD zYo2gRlS$G}cQKuNqWijT><@Qi*v>m=+Y{o0T^mvdc-bw9WDDc=C{`nKr)(nO_1t#q zy)JKCN4BhMbtKYgxWebPSltMT!h0H|Gd*jh=UAzK(VHV#1gW{`sXZ5tpbVEDLj2-mHPx zA@Q~0(7*Y)Naqc84@54>l;aZT&VB!$M_S}(_iRP3p=_ah&Mni+^A|GO6)Gy zecmLjAa81%9<1vUuYTP@P<)(4L=?;JgpCgK(Pp&A+-qPI1igf}s>v zQq6X<0}K*Yfj^GLFl5rixF{#I+tyQ2$5g>DP=@2)yp~wD^YFDneN*sA$^!k??Iq2l zP1J%NNOTy-jUMTwt!=M0Ld5;E6_NRRjx%`9XpDX|1+%0~#P21~ zSDq7)zo!y{p}0X^d#`@r{<)*TlbG%&QPXE)B+U$Qb zRhn{zH*BTuTEuyWHj{4v@0W((2dRnM9&es6}fhU3s(N5__1vTPMZd%5_{y`8^2zV=jA?`JypXq#k+pGVr z(qlOz{@8FV7=G{%bZuFz$w)wy!!}0eHG*J3Dhn%Q&K(NIn7u0-0c<#>nEv^U{3Nh6 zV>iu2Yj#gn#ttU~%KxW$VO98lXMi5%*YWd)xBD(wBVjLGq+*tMTfl~BD^EW3W%m@CPfqEGWv8cnkc7e1Ht z97~1X0T=r*lzWE-qX4(`=%+c=bn5wF@uv;1D51*1)uydVjFe~#m+DA%o0*OJ^+4u9 z-16J#PbAZ=PxwhgC_Oi9UOLr-`CjM|r*^<%vD4-|UFYnn=E(}md{pp{X({Ca{oJ`V z$*mqWvQRG4ts=Q5e#o;2Gb3_o{YAtq_AEYOPSp?+>JcbDa9l^t<6EwU^HH{$N$?LYjLC z;%G*{=KsRe(<4<9ss&QB^k&Xg3Ys4&*s8vHZE3kaY3Z=CdGXuy??soOC8r6w0PlF+ zt-ND%tuGC49|_oj-&q`M)A^$w5qSEC5VEk~Z*HdK_)BKP>`Y_h{~}sleNXL}629Yr@SXl{C$!h&IG%VfBp^dKsQAnRalcjN?|Yod2;S!070`))H(&!nlp1S@$I zUA}rr6eH)Ht)QlF^36SCkp&mWC2)MPVO)PJXOgX_-hRV)jcK319@jF=z;HQzJ&5lZ z!R32m28!$G3oUmPPIR3ajUCGhCwKG88s$?U&q zH-DmLvf9}&qe}2(uP(4T91ezKpS+DqH7a?n5Tl-&v^xc)v(|t| z+!hSSv;`GkDM#-WQgi49;NS%ue@QAp?dl8FvLxGIFX?1Uof~!$HORN5%00vgCx%a& zlJpBceVbAOg1h`5<>$*tU-Vd|rcGv`f;&~8n1OmYcm?PJT0f3VsWOt;w>vCgtKiyU zgJ>^H{lYC51#YQ*IzZOq7wOK?OSmt_QaC|+EBkGTmqZO$!#qX((jE{AkcZv#yYUr_ z-b<5S%QD6LGH;lmea(D|RXj#>wXZcXh8 zch?^OhLFG*In3MduSB^Uv=(w!>qM??J1@E0v|hPzw4<}ycb;Ju8=g}IO5fKyqsLE+cksz z7fxHYm7Tv5cbq1+TCR%;Vx9~7;AN;?X+;F8RMMNp$L-bjPu9MGe@Qae9dIg>M*Yxn zc>TmH4s_}2GBLAsOhv*1Jy;PtC_jsHB`K-;9+X5Zk49e6#e6pVRy;j+DyUUfQ~j|` ztxl$IL9B=MCBx?vgFl1CbI_q4$n+DwPVO`*sSIHOTy@w8d%85+?!h&+BH=Bat)v4> z!^ca58m`lUM=f49DRnVV`fSd(aoXodRNz) z6!L+eom#o%+$AwukaU$g8B&XEp+8({XT7z$t>Ar`64o(wF}Wc7C6#5yeh?Aq9YLP{ zcNyNMKc{d>Ra{r=QDW=Yyc28QHNM?(IrTDXj~*~D_j?_$$9iWpcPD1<9$GA^;kQEr zXA0_7#9G3dheW~&>dyi!?6Q{j2qw8Mk89oi(?{L?kj-_1D2(lmxKb^#d1yQRalmni zgVy9eSFGuZ4iSjv{;OKfb?zf75U7#~s2g?rHKQ(w2xX@0a&Ec&i~KV#v=h2Nt*Em3~UOaMK2wDnhU41mJ&$(^~4lz*PTii$jv zRcy73Oa;x;UlQE2lv1ccmpz9OSYvB8v^f)CneLT&MOQ$&wmdzyhewRhXTIA*NZO^MV8mFofkQu76kNDY;XfMD;5bi59_PVGuyhGN_FHsBEBR zD{X><$vpWvTxABLn;kLr)s-y!9Q7Ts8pc+9xE_7OnD}MtEDNxY8_OkR;imh}<`Tcm z;Sfgr6DB&}U8lnFlUBe!tbv@-%fwCg;f|Q$xJsB)Id4a6kF+h>@@f1Sviv`a&OMsx z|BvG{cZRu7?sqn_SwyJ0%PqOg+_FvPGRh@Ny3Dn?hR|FpDsnfMxht1pm?(0up_*lxu1YOJ5AVz{=5KggT?}g5XF-g|k6=}l?FEX#P5>nCB*;R2` zQu9-hFmY=0e_v#OJb*&^j0!uIrJFfrBJ7FWFdoU@m9uRIJ9Stw0wbk$2df#O> z=87t2_hy7xY1L&Aw}nHjCx}a-!Hn+E{`P;M(fT%bIBt62RZWfAQ}y_Z42)C4^C<Y75F@==l*ue>(KRMnJQ*2t-L8o=O}4}rMg|#B#%M-( zGRAobUo6YZonjAaO4BwURQP@Rz0=k0Di89pu8i0)$z-k7uz4NB(s4Mf>rSDgK-z#7 z*XE#GwCZVHldCZg>-Emh)v}&HO#XiV*>9=FhMK#}fdL06WHV;HVoF0!cHeZpy|sAm zzvjx@|3I!4e_S`bw;Ks$S*h8r8!z59Mf1A|mta$PQdD|VV&)b@=PvvDxN7nLM+!Vz z6;4zstZ;%qT(Y!$9kE$G*G}Pn9eo-7TdN@N%ty8oAlo(AnfY{lSDnN zNA{mJYB%H;{`zg;7UY5;i?tyU2)yd9d3bh3DtAp2i+YB8A3$NB5w-L(=sh?bJm*sJ z4^((>Xs94|7cb`S!HDp&Mg8P%croO_?VzRldOI$7dg}W7<>~7tX6i-tG1_}>WbO7# zNw<&CH3GOEsKKK$Ca$dPt;;9ot=*AxmdWOayq>x2pJ>Dg0_gM65LYFRNjb|m!h`Ec zujf!90wN*f`TY-2&tOvGEaBZ$`|Qug0A3hR)mJIa3%Dj{^F{bHJvAYN!W@XdJ*-^_ zeqqDM!zr@PUDrR|2^!|XXIFkkMZCBzlR0?UUz$2KkIpIF$2Tfc)F*SK5BU+He znM?D@4}I~-wqgZ|l6K0Vu!9@M;`eP# zICAF)o){NUM8rl&Enf9ca`;SggT$##_b`^rl%^R9-B8d_ox=AdzussdheuNkHRmrarvUaXB5i`^2zU_1Wo{h`f0K{oOAKmc@&FG_6tKGnWZ?GXy@HwM zN>!-HhIh1~ruh8|Wb}O+&1lkbpZ5{W1klNTg;_xlD3>02H5Ps{PzAByS3&#mGRgZq zGT&y*(Nh)xs|tVXCyWb-ZJ~i~l*W>~!oVf~myJPQ`UgrYD$49Tfi>z2P&g~aoox9c zS)M=9loP6uNaQp?Jp4%nI;=tEMu37)1k*{|Dx%3k@9=}bBA9!-s40v2k40&&vNFB8 z9Zg6pKy0fOY#Rvx!hd{ZD|CL`6}i&;?t|@DKt3iCJfH(*4*&o}J}V|t$IQw|tkG4c zr1;r%a_r~YZ%BzCPB-$eoeST*nIx=zj@P5uf@k6_&%&8ynwhG|8!lo&Va6a1*!iUz z9Xu1$2|-Es_)|KB_}8Qc0!~`4r`K;751BqPYLLI%)^vw7Ot<)8S0DF4nmgVmw7W?6 z`BBxIIc|*!^{%^C5bx$hCaQ$1T=lNZn(ODvf~po3SC0_6tRjMwn)Hl)(VciIcW% z>%8en(0g#%IX}B5q@*wCw+el!L@TJ_X`jNr_22uwwJ`)CZ1K`<)D4$6Ya@a8Em&s{ zmbJn+3U4@!=S*F2UAmIu=~_H~*2gJ4=7V}NMfK65SSrU&W}U5Q1k_JhH+$a1b1$$3 zyk!%jWV5gtCQ~pQo^ngT!{hsZxAwW)GEc1=q~d|$Pv$zNh43&B)LP}>=&Pp7`UlE7 z9jmgGE})p-@{OOCS=ro|^hVIg0oUzyk^9A;#x4f9mhU`(#yM&w1W-r~@0O+!3~+^w zKEDOt_kFf-GP7yB`o(#Ucdl!C>-&XO$7@S0nC;nr5G+Zit9 z99?6Naa4V*RC3hy*eQwa*8#Sm?q!DkC)a{X4VF%LNrGZnerx%Jhzu9<`6Ob6}}((=+@2Qf;VPo&Z#oOKpv zznJl5t0Kf(KH++0&WkrglHl6v28sC(^^xb#ad`JkT@K^6p|_e@7WU41>fCTlU#aIP zVZN$=#7F>D7xdRty}{`p_PE0)YOkcuGJjM_ToCqX@P z9?xf1`X0zeU0@&b8q+VU<{K0Uc$i1@uYt|wc$w?Uk*Q(kc~@4YVZJDAKQHpHRke<1 zj)1;9*q^H^_@pIF=gYWe=|50YCe6g&_tQy)UQrG|k{;p$_M#%`3NBR|iQyzUk_v<) z3AV}e9?XtPX%V1x43=URZVB*}Sm*PwZGE=6{7fi%7Z=A`)K z>`5j3e#UaOUnrVH%g<1q1M#HAv0E1QM%f(s;bNS;=_cwT=hqBkC-}oDC8v~udt|zL z5S%U1RFu^7ZWt0^OtBO=zb1e31fTLJjhhtI?P!{Y#t8-5hZ73GHl4P0`(1W2ep8$V z**|!NX^AT14605lPmkmuRUr{i^j%fxA)M-i*<7VP0({zL*RiaJ6R&H=st_EBFu>eO ziJ2+$opWiWT7iSgQMT8ZGRMi&etsw}Bv8^4E_fr!{{XNZmJS4-4~kBF=IHEF>iC_v z+)UIsck6A|=$hs;jHVn0psh@$rDZ>tmGnWgnG(H!pf*)G^C?F_r8@_O*iUudJR4d|;r{^Pm5-hph&*YQ1LP9CL@+zwqI;u;A^Ha6ferWe~b8(DiSD=kZkxHpXmdnVx2DJY~#{Z#(^Wmh3YIylBo|mCYv(lPcp#mXrPTb>ElB|!f)R^~1b4%y3>n`(7jo4%|-D{J_=Wf9% zPJ&eWzNJ_AKEiOas2=~a#)||x$~8U5w@=(;2)X|D9@aG|ZC(g$I0fEnVm7=;qc<8I zX0;a-w3xyp15@mw77b3n1_o>An`|UP(Dw$hy#c$0f?nP)bDGpa>ZgVk`bRtiC@lfw z3NNRGqc-3M2G0DVNTq6l6r>zerL3>njD_*Qs!3kcj@gVmSZ)gS^D7K=*x~*G>UPa` zx+2l#9&U1M>?2%oeJ17MOICG!N9%Nx(~X`W>=q*bBBynzZ!w(bzvR({(Dy9|ch#1c z`s$PoZ(u)c{mgpsu0A|~4?}iu4y;iP8Z%2t;Xa7tjvJl-Q$yUbPY z#OnQ4q*F|N@jd`nB^@g_$ByC{(dkdkL(^?~6FdFs4q_82)d;+MtWWHp#}~K^{US7m z&sJ}doBrzsKVrmj54>x$7kC|sZ)Ob6$23ZmSqH8*cwis4Muflepw{qAKb#1^5jje# zyE38YrXJdcc@xrkG4pEtNW+OYv%gbWTK8Sa*S%*dPe;_P(uF{A$IbG@`sXR`yuJ-B z`r#m_h8m%CqAzsAT#1x(L~gI;kHr&HFIq>$!0cIthif-yvVUQkXE@2<>t za?T%$9<}O-x2j%1-SSCQ>q8f$4Y3_oF9+fwo*%M1nDbUpF@Y#JB7DWr^6`2RY-s&C zeb0RUq}S%=g?Lr3VO<@JU5&&c+n2UA4@rzhx(4Oz4ruhoKV+^vH?s6nm8(b+zYl&& z5I6gY_wY^&cvk=rLb>{(N&L)UI~orM#faY4lb*^8X=w=JO!5!%A4xdtEhop3ZA*N5 zHdN{6eB|vCRS2l_)_Mc~Ay>fPD@pod2$C|ZHFj7t1G&<_{1u(590`}UyTr}wm)JxGE#)P6>&?H95cNkXm7tDt@GK-we zvhC8}rLn=Bh}Kz$%i@ZINSm#+J5nj0R}&i`%#p8?itlzID#EY1Tu>KA)Q}KM<4eS= zG?N(BvJbb!jc@e`X#Oc+3sMPa6o)8-ris}IV)+j8Vy^OMAKvOQQ@ky=RxU#!a!kQ& zP9#kAYt8J{!Zc2$Q7*{?;#bReX^vlvE>HTh*@G|QZAN@At)XaFIU!7@hHxrT;Tx=o za=_&MN&G*G_Gj{?;j5f;=)0D0fE1c=YEWe)Kw^Om(UqSqJi2{9Q$q>3ILN+LUX%#q zLQriT2MufDNe>I$P$+&T8~A`Z`7@&sECb&w-QuU#HaYlM3$bFABmjiTKa`+udnFN0 zyv8Za9|7S_<0_h%k?P0uS!LdmC|oV8(|vA`bsLINAa;VaT60#_%(uGBXQiVB$YRdcPg1j07!!9{;DO`P~T2caD4*_AQ>k>@x zb11fW1Rl&@B)PQJ(C0P;zS&gA1&13x3fZ~$+OI3M^zRa`CdxqDMpy8rgO z3kp~_Ig+n1GQYqVAYs+{hs#2?9eOB2Z{O`a8%UkxU7w#vKeec)a`L0oqGGEx25)+~ z)G{Ob4Tqv5s|*m0x>*eYZu9p}EKbL-=?@n)VZwDeiq?wu1UB%Ra;{Gf z#ft?W;n_PWjczPHm81VL9KsjLhV=#>!S!|%Hnp{Se|2M?{#wS8=lwEXDK8uyBqzr< zuTAI@Wi}^l14YP3H&uOz^!oebuXBfz?;)3csbA8o4U)ZwT*uSL5W?hoDJgBvUCH^C z2;HFG7vA-cdl`%T2rn;sihWg_&1(ap*DDiiB!SI+M`e$GUhy*_$39-2M}^&+hz_gC zp=4W=A=bOi;NM&!ZvYaPZ%WE`ae5o6b}}9NL%ZrF+}WdwZsHcC+BE8`K>lhYCF|GgoZo z%m;0FOY%T0j4>UcO=FNWsH~4ybgJB#iw33P_{O4}A~AP)lO8sb?d~nQ(=G&NJ;^WQ zG~si$#d~2OodTy*IMSI%?xc4?mkJJjMy2me%GJ=p*?lYUy=+O3OlamfC@p~#A3gdH zly8)L{-IX-Bg4yS=adU8@#dnt=!CrK!k}9k?HeM&=1`(IGk{ApvG4h?!Vq~K1cI~* zSG0dP@~|?{pcbb)bv?otR4)tC8&L^p7h~`yHo$oT^hlv_R+#XNzLCp_s zEM#B?ZFzaXo|iwuQ`83)t|dv;>CnkFSIQwa!pw(zg~;1v`Pk-$SKtI&l^CWO3n21E zsKApsf;e=pVHO0G74Pnj_?l14{FU%Ugij=c8Gvf2t_I5cP`)V`fbwhAAW1PN&!mkVdCmotpwQE+q|jNNi-F$% zf3K*TaeN@%Uv#a1b3B-UG$-`Ql$;n&w1UdexR5l%Flj!GAT5$+7;*=oVj=mwIlPX z=69MZ*1V`!Y3gM5TmP&C=KQlJl!KCD9^}R*I1{3TzO2TR1qAXhiY4Jz4eNuH7Tr8? zDg|HeD}g0uYqdSzb)9ST-!m}Wn5?%}X_l%G`0#^wq1998oFNu$<)9PoREuA5{nhns zzVPFm&BU95hm&OK3fclWLp`}O7R1xv{Pj`Pi`)jolAxU9A%cC5JPS(7U)yK{j7n*Q zY?!zFXsA4e(SQ7Ha@)$rTLEipJ>!I;mDxS(s)1vh7+~g{ zD{xG36BODRCN~7;-{m4=12efi)Ru=-_6Rqkt52hI5JKiw}(bl|4RJv`H=O^fF#)9)v}<5X^nzwhfkdKMl+*-yK~1vTN_V7po4RSSL$e z6v=IW{VBuG!KLglzn~y0q^Yq)>cG9_3Q9oGzcH}>zbJm-Jw%oy>gg+SB8Vpw*xDG2ss5b)W<3fE2_XZ zjYidSBBn=j(x^}j32O+k;Np=6Lu`$2pF6DxR9YJFGNnmLhj~K}!OG_}Q*9z;bpfEu zCihP6Jqzj_wIU7eo<;r`K_{4nfr+(g|C_8u}&28sqbL%vDUjP`2h#x z#UL1Etr7)F?&m^&KgHq9@o|1oCK|+CLvsKF?eu2QBN$!IaS-*wN`nY6XSmFGfj0>d zAyAS@CaDa%pBa;(M)Nvi@WIX+0NXY8R?p6@kW4Vz7+*W|WlG_{LXFeL{lv$hCT9ZP zhI1%mo?Ap0pa@Y!w5uI`t|={z1#lL*)CAz^H_!{}6}`^6)mm!l+i*lholmtpK0+bq zeE@5p97>AX@l!&BR6w`8YQPF;;;az4Mo^azI~ZkR`iq`l%6s4L>-}2aSJ$tvw}jY zN}HYyeo3gpwm_X~?$>~%?$F*Rr>nWY27|CX8`u{J30v`)z$qkN5%9Jc|>Y`R2 zZ0bBtv4F-|y&5|ap0U`f;oYgyr}+Hy@1>OrE7`l@A1<~3me_HTBKt1B__BH|bllT* zaqetVXtnn>ci&k-p*g}ep(csMicZTY+L!f~lcFQ6xtaV%(2kc>dWO=Io9PA(zHiKH z=sVRdUZiUpuRP)f_G7Ipw$;M}7hSorWY2+kl3wUbC67-3y+U$9VIkD>ojZ2{*)y?) z-~;9D{SesnMd}|Yclx~3*tN$00^K87io;={A#?_};~E2-DmmR3TDJacOmHhj+l8*K zLjM%zqr=>d4pgc=u{?KIfR$#vzLbd~i!p>?Jf$xOW+Ba5cvE~eZ=gfXR+~hQr-qoa zTtK^OUb*gyD78d7`nKy#xD0Pej)2s9yyJvY z$H_x?r9a=>chjRpjfB7E5cOc=H1*y|IcS8mvCtTY;@*9I=O=aF=3)r4MWQt7M~NRw zw23sz%O>Dq&6Qcp$(P<|Qzr&Dg6prto=J%jdt4)IMZZb5fJf>;HCAi$Rr+0>6IWr? zatVL%@^3q?b|%`DMjvTbYEjSUI}=kV#|G$nj-W`1%XCik^GJ3`LZN)|AG9_Kt1Pqb za`(L?-qa$m@*$``5-pS(wQUn1XKw08<>Hh^MfKmlwpXN~7q|bX=2s)Z`Q1U;t-9)y z4JoaSm6Ea)uRDpEQ)wemzGwN7!vP(ib(F-HqnPe8eO~LI$Em&JItB%tY8m_)2}ViM z={z!-NGI<1Db&WV-~oQT#elKn9!ER{#iD_r*Omh<)At}88xlFjAow-WH&BqPondro zB!5y_R;J>L4W5<=u=_N!X+57^w1buZ^6;HXO@ggb~1@OYf+YiiZOgMTSTjbT~#QLhT*Al*{LLL_Qte4?7*#vy1z$7 zDjWU397}Tq%cPBzCGQUtcDR^oX+ZG_1Aw#2k}m_HsdYPEdHz&kS}~;N@AR<7RZ%|R zjuUGBf1(xFlerQxrpQTUv&cVO$UY6!v^?Jjs}aZV;D8#a>SchVNKFEbB|U6W{`1H*&jf87t*6iYe_aeOt+YB0_+cg*;!-c69g>JEU7p0v%pq>IC15LmsfW@PvsBp8ic{5ayThbZ=Aeb zPg-3eKWgf1(XJ;G=ndC1s{Bve8+3c5-f!#rUfYXZtB)cJF8{oK{du4kWdZ+KPf5FR zSl2SNd_!l>xY4(2iQpJ7pPgo@(~{d&K6H?ErZsWw^E}*AZq7%$JJ9;s{N?M{TEc2( z-G9(`-G>5bnk)=fP~VrI5fb1Z?Hpll{@U8J_07Cb))mW`(*8#yoK-#-_Qu=D&-c>; z^k6PPOfddDvNti$TXal4JGE=nAeCDBKH1zC*{(E^b3{4~?;^qHGFx^4arH)X4)+vd zcLGaAm+u5C)!!+F@L%ftnuE>Bt55K4`+PS1PuNU2XxLrzfh@M6Sn%35)ioZ!v19*87jU`Wrs7+Fl7{{8y+( zcn4ACWF3$TbdUL*Lu@?nP4dyz@;t{Nf|X~RT%U;}8k-w^w?4ljIJ~ST4SU26YE-fs zgTe>%K6+2LeVz>P)UM~0-wg24G>MVJ9$+miYP$Zg7RzUrD7t$}3=ZGFQu1)_F zS@`Ey&y>ETe+k|AUU=4y?q)09s^xmxUB=-uPgkYyk%-X7wCW+^ll5PPO`##}gvAOW zSGxBnHL-eKx{j5~*~5_zEK_%NkhY)baX41{PW&r3=cKr*@OvY<#o^|ZKu-fyZ&4b& zoX_+MoWhB$U;YL$Eg$saXAbx?owdStMy*sS4k9m`{vANUnG9C?eX10Wkm9ft#MoIPTKFBN}qq>w#H z3c`Y*RIKFou2@xL6I_F&EKqlS08AasF zyGi2E8|de(WE<}EAj!9@=^dGlE~i(Naf3)XXA*0&XajryiC5g`vQ}*tRy5PMkCv(W z9JylQ(04Druk&6GHkzLehlmK0B&BRyI16n|xIcS#(BEZx$aKW6Ez3P$KS0&`$QsLR z$k;?uaeS{=qO}6?7*Sux9KmEh2TbG?IP2r}loJfa=z72Saq2|>B}1_)vjUNGFIQT1 zb6^N4ZY2S)B02_^0^1RTgi*J(9uHrbU%&V&lq?K#2HX_ojm?>0fkM~a@X!HN-DPzy z9%E)0-{Tyrm1c{cGWD^Tjf2Aa^C=w!EG6@?l_Ld(FgDAi;}N_v)G?u1-mvdH|JP^- zNRd2FcQh9mec+l~2z8n*aaIPl>!h2hSNSx0Q+(#hq4hTwyMk-~fs9I0u0UD<@;-CK zIY_Y&VCrd3FlJhF@bcfNfM*-H@qCU?z0jCzC($hY8pZo{(yB3EHH{akxQa(Aq>6)| zoAF*zhVlVLS@So1B60T<0j;)KG{AyYH3vvA|3CtatTbusF;O1PKkU9B?eQ}CZ-1gu zbMMRKO>aH20B(B~lAmAi|A0^44EjkT1vQ-5zf{);1gddXTX}1vXik{fnX^U)R#^zZKuaq4^$&8z+2w zQT7FbphA36aHvGl&Yf)KATZ}qi#4?beg38aP;Wl$loHo^^mV&}5@Q8?zH!0A9o)Ld z@2>S)IkbaE3l?&ofcQCVD|UKL2VNXZSPf3Bi|v5ye#? znif(jy!V@@E_EJl7%I+aD_FjMgTY9*s3XHl+QiB`|A982;EpW_5w~WgdXfbyp}yk% zaoqkW$d9L&$$m5mt%|V+#|@ef1TX(2&Cw%xn$XzE@z~w4OJFuaM(lp zy?|9EP&3Q2&a-x<_@w2~h{rS$C|3TI3`r2g)mxEpQEgOR^@h^%e8kw6mbDzoSiLY$ zu(S(GhY#W=#f{dZKz^6x?5d3&JWIUwZI3*3ckuE~zpyA>Zn#CBN&tuFT#t0UT)-Hg zIV!y+pi%7%N!M(w4tJ10TeU!vl{G{)_dVK!FD^iaQdA6W=WXvnH{0Y9!MQpsJ zg~s4Ak?fFkW8Z>9li=OMOG}#g`Y^$upq>nCUwv}gq4lh(4EMYFMJ;O>L*iQa9-awv&W%7u925|z0Uc>B*H!W?0i zXMR1%!>ko8>K7(Bx=NtH;&AAkY!6T?Omm|M`*#Ma$n|H=cTgW=Mhq2@bhQS;PhQog zyE9=t+n~pTIBwf$uPgbv!V1@hjI*c{%tDskLW;5Y;SgA{bQKYmiI=Oah|2~QvEVpu z9hpq|)!6Kx*{?^FS}Xo2aa$xOjf-dUkc48znyAyWAL@tyfxO-I);T4!hc#FA9oJ|+ z$dk(3m`z=~qHIA))5O07^r)Td!HkCu=8MsKp4BkM1uVzD%tFPpt;Vfhkt=R=jdSN8 zzUwbS$YgRI>mMgU`s{QsYWX&KXt?vq7}KNDh0ke!Zk{tbx5c#Nz0%kE^aail_K~(< zC8=Ha(;5AiJFv{-7-Kqckq#_L>jrZ>;~+U@Kfw(Gd?)?5xcHngVIx0l_7ZlD&j0Cy zjEaVjs#W9ploI@-#JOE`5JiEy?!Z7MkFa3E6Vu=33}Z|*{9^KbnU@yxTvL6s_*H^mpDCU@CxCpA@P*q9TdC>f*S9Tb|s&|OZ~ z{B*F=Usx)UB%Xb%-4aFX6gM+ZW`E~>WXYvj9_F}7B546Ktn%bZ0NV;Y)5^X~>1o+0 zQ!F%;w>|Vvs?1x7|E>!SKu^m%zM2V7y|n7coQxTj;@*)*7l-jUwienUUM?`?QTtf0N!+OOV{v^EEhRcm@J09}@*#@1pQz zeRNM--l%`A{mbv(LkE<2WkbP7^Xp-=x_&lNM{F~90>i>9dfK|u{8$hBSlAI#lMm}a zt7faY;92s~M=iiQ(6DIrM#QK3jO*!jDeT7;0U3+d0aBSv!q}Vfz#0`?^S7VwT;Yvs zves|17RUYD;-3DXdJk+0kLqZ!I?pZ&M2$8`oyFDV1b(i0yY#o;YC~-0P-$ zPBB@q!WktRAdwAV9$tvqQ)koczM}0@ny0H ze_z;PsRimBt-4it-<8St6lw`}>IqdBUM)_?{FFG$^6huBlk@V=uQ&BdO?wF~orQ8cZ#8rx?a4Da6rk%HU3~*6*QZ{2_?%xdzO3u~S*AI}hDZmw2EN@2W zUX;JeZZ{m88+C6w@2SqA41)9Au=5?rEem5R35xT|r9R5=DW*04^mLK@Eol{jSF_*2@h^Wj&Jgm3ecjQkZfnO%;FyS!!6U*6q7Wbpj02&z7 z{i7f;pi<>1hcmL!VwRAe1U*p96t?=_E*iopecHLu{BTlYJ-5h@fd3pxd4jy0fYd#w zKQJaO#F4*ckoSDO5lBAad`S$`H&K1F{@V`u;6A8geyxtw6S{67vEj6HBpKv?dJx&H zjX+cVHO-zAZk$C10Onuw1XCQCJzQGuD~H#;a%x`%m2wEYB^njBEd*$(^F8zIdYEJ> z`(0YhFpES$UYhNBxnyGV4Z@VS*c7GK;FiwT-KTx9I!xtwneJ5iOGvZIvELt7mRQdT zgJ_UM(`b$WKCClj?Ajz%#Bv67>cOAeccz?G73EPy+3Vj&cG)B55U@-U?I97upKynZ z7a;j3e@80Nk}sj~NI5_%z$Qg04vND*I0DsCOD=gk=HUk`=%CyxCa%UYqp60_6) zFRW55lpWc`qkPXvPy6P=cP6*L&mSNxt2ekbuJxnQQ;oq&GD)pKM3%`kD|>({m(M41 z&MC4KQc|PkBDLO?(RG%4bvVlt`M)VljXA574o+F3VQb~cK72ApgQS6kw0TR;GD9tD$)Jsrl8#tV(rBh%^Emsn08OVB zF7k(xBgH?+l#jXjmt6AeX;(TVi6f`_Jg( zh7#<|dq*bBo6J=5bmkQh9q_GL?|6|2-B;ZgMx3rc;QSKL*)GJ%>uX&GyL4OPF<;jq z_OY`sl_lALud54K8XZ2jGVYgbLC)+au1l9bVkBSa7?Hcd3Q@+KIl5>X_iwNZCJR#jZ_>zem{*Tk@r-zQHy1=m^^y!`RyD6`SA`ntjC@EiDF+|=^?UT5q4 zY$;R|&P2fLL%e>VaF))ra7qoQJ@8u!n0~6sJlGZszo>i+mDUWse(}W&BVNz%TyNJA ztkl!?zKT-M_DE||oyK#gKi;xnT{Y3>uZsNfP7WQ{p7;l11V<5&M|WmJ8Cw7^;jYN= zQyYU?-?KTdZrDY9PZe97W#K#&M&9{=J$>Q6S-SOg)&mbvbhpQl_@1ECV=3n%ULqpP zW9-_*;Vq){!Z>?}Hq*UkJA1E;CcDC~Y2i6dai;|sM1~-{nlF4j1wuD9rTqit$ihJS z;Dh8Oz^0=F?d@ySbes2b?;XF3dmsahp+5QEq#$O!b97Pbgwu`o_}_wi;2&;@NMfr& zUA=0DIwklB*;`weFj$VVvh9yJZAq;l_>M94hGSLw^Q4=&9CX_`zP_$8G4*axgLgtn zUdtjW07Z^gK*2D>bk6P8+JMWNkWM%DX8ba;l7DbVgH(dVmTCHRvYNNFz4ru?;qSSi z7#=0IYKBN@t_kh&(4)Ne4H-1-$}ll=#5W@Yo52VqxDYG1O)!rgNsu)o8uR9`YOFM} zG+QT%QaXrY9_bVMc_yvjj|RR$$kd1ywbC|>DI8sUC#>W`aFZz>kcR#}n@UvE3W`L@ zL?RXf@0!hIOx`;XF`}^rhFxe!-xi{HgJ;Fyqov>AX1m7vElHA0Rdj1T3Wh#I!?3vf zgF8bKE9e>=sXZ9Y{|5@oF}8q^sByOA(!?_F9WFLgRUG>NKtKDE1_uz=x1rN) zzcNRBSI@T2jOzrY6T~VA@RkHkv`j(}Qv=2oP}JD)!^Rg_WC6fwCRm}A1jzhW#d%%v zMM;N}4@5J?km2@CCGftZVmqFa-i9uge=M)&|VFTCa9%- zLrp`ETSW4Yn43^NRXHDi=YmBVO4YOjD@)-1X%-C+{q}XWW~AAYScg zdP%{a;xFASZ>hGYV=qKTn>snArJNK@JF2KfTP<2W8<-YI~6bCv7ii9pZ zHgyVy!H;~l7*RtI-B+|P%x1f^2`T39cc)nbbx6|ntJQ`H{`>)7u{!@rnm;&5$-ixk zI?b|ZGUO&bS&tj}(CtpFA2Ii+ zp_2yOGoG~R_!wHJ82kf`IE7ixhZgQ!S+QC3thXt?pYP`O3n&2j8tyMM#I~Br_&{mt zcGqmZDBkevH+20H)_m3;EXgpa1RKk5WjpSZ;SW|Vc8IB)b^9%0yJrK^mjdHM7Tx1g z64D^W+xAbytx0XO5qqyM>O6Aj(px3WtnnJ}Z z-hoK7gOrlSyj9WQK}HBw2lYS{po@xTBkB4zeM+n9*V79M6Ri=4L1NF>M5Rl@Lp&SE zuyiAfp7(NNeH=?@(Ly{-T&(}i({U`0=L-&RpKD5ZU-hu}T|3MBq{C%KT#a!e%Z_6i z3u13jA9K;8QX)BpRp2SNR>;C!McD{D(-{ztO3pM7p>OTZV7?9x7*%xO{7ja( zv7ygZ`#PftIZ$+_MZ!jH?ztMlFeUpd)iUO;DGF`*T^BvqVt5RrYBYw+%Xrz_1hf1* z0-LDa+nSfRHkdvjwWfABeIrcIorUB+%(-nVU+hNH(9uSE$xFegp)KvLT?=Gc;^fT6$ao z2sV?64?@X1%UGnBbjsb<57cGd9F5MK;)~FfW15z^=9(p`YleJ2(M~!g>lCM^7Z{NL zIy8X}G9NaPRPk{$-JN^4llLN0#}{d~$It(^ER{o`53N&YB;N(>)wO1h3vNj!P8X6i zl*52^J)lNq24@wGH<@8lMbU_UU8-Zvw67-eAoW_G(hk?p4~_sP3S|*twgUYwNW=2s zQ#q%h0LX--kl1Y1FOQ~*m_yKOhy0oQO`Jl07r}KJ0mv0cARxi+yGjJCE+v_3**(#a zfb635NSSd<#pbNLW5OLDG)#6W-wAj4fov^b$$?6Dq0)D;2?fbN17++>nxc>+9t_96 zJ1^oVi!v_(ov#-Usm{uY;!7yGMn@6=k+qh0gu;kF5@qiHhvNI7ag`d+&cnj~tDN8& zbuz@6b3R=EK8&x=ng$5-9JGvXePiW0~ zDR)KtQ9*JR(Ynh95A^9IQQ3SRFc%OfK|*X7PwEz4-H--z@GYI25Zr2)6yg925#f_i z5sfgO8$>g|hwP1UGc#d5kNi1B?mnsZDdaXy+ zP-|W{e@?3LyXj>z`CSpqa0c#1ez^Ea{xq?~8nO7;(^%5yyEWPQR#r^RD{Ja8AMEX& z!~~%q+9hM37azOZ^tCSkxusmtKK$yuEI|MLw913^Bi5Ziqt$clZBwyFV$8O1w>d2m zUXfulkQylPDI8LyRq0;ORG3?0Rrd=~CyN4;*|zhnv9`?%EYzq?prvskc=KiS9n zqUfvqG|6{O-Y!W+Z(t(Oq8#j?Bd~O1H`e-fT6@y@p6$v34keEJE?CW5Dk-c;HX|xY za<6wQa6#Ds@t)7dp1j(6_4^Z#qkpT)1n1A?kGn4)ELIzq_C0J`zo_ap`apOc6jBx0 z4G-4Mp_zD8Rm;6H2=`Sw)-FEL2FedpMIh+hmRs8$q?b`hE(6*3O^**5q3c?5!i+kd ztDMq<4(_cCfPQxUX7ldCvoBNaZHwm%wkvC2HDn735^4%K3@8%wOfT;{_68w+@Ne6N z0$Xjv*;&_OLowY$98$gIJDK*1+j($jM+W2NxBmLs;NsP0vMEEH_513xISzj9^qrbb zP0PqSSs(Wfa?1IcR~fo7lJ41UV0#s}>SRQ)(79gq+yp^C-_@me7Ves98^!Zce=QlO zcPso-I2@#ERHHQN=!f3TUYR}xl_=Bl@*PE`Q)|Y8G6;@rS3}6^xQ_hz9yga!!--X( zjSY2-#6&iiY_gT{US~B~9izac5F*A2R@TA~+ z3rU5D0HC}riw_BQOnFNzcK0m*1ak_x+g@-jT#Rf$? zxql*F|DNPuFCz*h+12&xC;@=(#emw}1a?WZCU zkrF=~^wqB<6D8EjKAZGKoJ0PhuysBRai# zbtf?JtyRrfqr30>h5&3iao*Na0z$$ME1_VCq-z$$`>DhLc@#~yIqQ}3VszZsb0N< zk~HGvVyemmrYbHK*dP+d#pWToxgq$eR-DL8bH3zp@ltyb{{NB|q;m46mIi7N16Wi5 zE7p{7&y)QH&*7=>1e#_}5uo)$Bk$iXjbyqNCFz7=0_51hD1AaWQS{_hfIbTu1`t{h z`G26qLEyFm!dyG4^hG|-_KReb(MrO}6D0DNvig$lHaqAL&@TX@U4BpD1LxV+#zrYu zX*eAr8W!KDgevBHgsj7=_(Xeqbz0zQY*n$bL9QM~akum4(`nI&0BDf#AFE*@HdZ%5 z^CwxM#Sf=@jhGd0I|xgI}{jE2k} zeD*+Eg>_3qpqa-vJ-ib4tR*;(yt0YiGsktTF*{ieUwy(8L76hq#4^x@mNaWe&iTjy z$^0ZZ1bu zxk>i>%CFb0vv=eB?SD<5+q&s95H_!MA*R)(Jdn|-#xpFTCBPG})*i%Y|0(nY5mUz< zM=xfjzMN|RA4TUL&UF9(@y&)|*f8c)b3SXc$dYnSPC3q;XP7d|Arh)NpGF8xB!|fP zY=~-@^GFBB4!4{-prR9Z?!Ldz@1Om-YuB~w`n=zt*X#LwJc^Asa&o<^*IiRkPMVIw zDLC87MjxhQSJSBRtqaz})ygZL!H6S=5Qi15u8>Ko+=OtFtI#SbRjW~_*`vlDmu9}M zTN2#(r_bwUiaV!jZZ{t9rxWj?NNSP)4%saZs)(JZsxSrNuOdGe$%;15d+bENsO_zQ z|JRFzL}V{3VliYQWb%`g!DEeyGV#{fv#+E3N@80@1UVVnf~ebqbdBb7>O_3(Ncx^S z>4g5>&(DI2^m%P@zwS=7U5WOX&$3zi@4i4(36UMt14vi1N%~!}&qG(`82@?+^S@&( zUT~AkB)_q;y|sNR+$pE~;M5ZjKfa>EfbMh6O`6o|J+GMY@_z3nUB1B^Rk-<|bFO2A z<(r?gkZt`(h<(GdG4khE=fdvmz4$yL4NnjVoAjJDd|aYU;Ntldrte7F$1V33KN?}T zgPI~ST0wnLG#w+b<`oHs?7e!b?l4+%UgvuJNC@y3G=<9Y>(}lE_Bd&G`u?oc4$%s# zYrk&l?Kg=`J<%|-IMf%Ej((v-{v|_es4q;}G>%PTS8CCw-|6d%c0L1*pQ7-bWTos}=XEt%(9q=Q}kFoP19@w9N28U+D~m~2~z&(hm}uI?h; z8RHi@d2c$&8&c@=>HZRSu#hkHqd3)@f99H^*=Lgh159k_&P1CGflh_{znsv085TRe zMC#heq-^T#rBIPV=n}-*T02O8!D zD`sOyDDCN2hd6^}rm6b{k-f_O5h*~hi`W9& z7*zok;)o1B%tzp6{IYGRx6J4#7w_lC{i84V%=;&{yzpZ8>V4w8txF~XaAGg4qRF2v z{vX_OAtz&J{6ls0Ox%Y`>E!*)@|54=c&s@n`QhQPz-Ku33^-z8?clh}q2Oi&lm7n! zgG10+drR%V!)`Qp!$c0Eyd)`jpTvRw;@$c?*vwlJ8c<=319V)96p<(WPBE@=MN0k> za^_&>N5D0BEw@&r_b>lCQw1j7`qPa*J9wH3{1})W9=S=$IJ*lOh)Q%{e*moXUIO%% z;eQ_fyah;CIRMm(nG~QFKzcDqRX}7igQd%?(ufWMiF#)*C>e@z)_?!|I(g1d%G;dx z=Iw=XF*~LH6Y-z-5}j!tL0j7!$E(gu!Nz#whph2!z$xeW@@|`>1qR(b-iZ(_*MDj_ zk?)l*>z<|c;`QI5HxE+$rv3-=*gySM#Ws9yCoj2INqC(11cbN2pB?1*(mUNtPO{s% zeM-TjEbf~oZy{8!rU%e`2i66+M zg5Le;?jc{ZHnRM3+;!Ebt>RvizYDp~v!oc?%hHs37@!ooxs#kQk`dz@X&)1MoHh$WFj+_X_+)E5UW!ma`@-YjaLp$ZaDB_Xa3lD|z z9rwOI<)Zbs>z^ z(Xe;VG3{T=s6Wyn2E(EdVsttH7B3v@+}*?a1fRO^e@Xv~UsjAj@e6L!%aA^he+y{C zRTI#erF#{+#x4I>Zq~0AvDM|I+1>%xjc#=kwr=L+Cz&25`boP%Y1@lA+t9vo3n^hy@Y6 z4!GZWM7|}NK#tfIeZ?_raR>||(@`W+Mht95A}Pga_A;s@(d}+1YewvptX_p%Hu;T% z2_G76oQYLi^NA&&OTCtIdCJdk!e=h_H78hU;#M>Q(d2n_oDbV0emij)$Bmd2^hr{+ z&BIv#!y6?XZe^CbDb*W{WfU79lvT+JcgJQg(cR0`B?Pr9`9~DO;8;LQ)TQ=Bah-0G zYg+DT1>qHINE%U$KnsuZ;HN`VctN8)CnAV%hPNR_%dsq3fETO;H*BP54yW-FmSd&<#|G8ZW zEzyh{5Q=zW!Qi<7aHB?NZv8`xzcEx% z9Q=8>x8xQTb05o|Wh!7rdQ*dARe`G~enEV#5|{z=QPFV%8Bp?h6Fg5D_lM^`SRzq` z8U@vRf>~lDLIFTbaurJ`a7a}pCj3_X@jjuJ$CrKRLvi`{*Oo8uoPM0X=;Qjl>Ah?o z7a(_+rwqD1nOui0V?)(ifi^5Z{=DrU z#bsefZnAMq!}f{xxo;-VQC(DPE>Mbs{<3CAZ zMkn-jL-z!;wTOpPyaUxj=vO-T=T`^fRU3)IAxD8$&M)ofw%f82275jaIkjypS5pn2 z82zn-zQ7QYlpZ7^FbddE0uG|8J&zqQl~+L>J5>}R(=m176m8+y zvFf`u2~PU2vtKnh4~;Do8lDE<#G8v;c~s;@fG0)&M;^F*(WQ~%8Ddo0++oiwdV_2x z5I9_DMwt!ZyY1u&7Dx4#8VIL&Fo$cj%YKFVUhbyLbv^hNR=WIJ=S+@wF;!= zzAqg0O&IJiS7T!e8;=f2aA_TV^z%^b63z^zH88I;cT2||8Kt<~8gHNFQS<1tNbblx zw*@zu&;M36C(Y!}cki2(su73EsxYhBl zCc%3)R=yo#{06MKGXDP@CSBgo|1vESo7mh4AT^?n3|igms>UntQXEe~{EOQg)|1}6 z0wGfI(pV{{4-!HUKG3#v$=fs)Y#}yZKpF4x}$_vPxD%@aZdNw4qK*vBkbU8!9 z#xTIQ>Kj%-8rQYlYfQ*Vb$-4Wp);-(7=Q#{h@X7bG^1#N8NCqp<*A%$5(~?I!^7;o zK;*r@=ZAph;3l!s(O+kdr7c?~1mLWPaUocq_K-Clp^-BnSBt&_J{O^@5bUuVIPZK8 z%ykX1QWhb6!Fi-iag%qPpCKp~nRqT^3C5l=Ved27gs+uZ!=dYx6YFDY15O$1bcV!{ z_d*e(p*9Gu_PG%*0Rt)p45V2JYhbViTns z${aS~nx-9jHw%`Q6FLqT70Uvb_X)M3!0*FYH8QmXP`Q z-K`JE`B7ZV|3IC#j4NV~Kh(q3__0^F7-sQ<0`%x-Ce)jWY3}5Sl9H4k$n)3VUHc3- ze!nwoe(2TqEC7>4s_G zS2y85@T-v1WZ&kpP3f{9@`mJ1G}QlM6wLz$B_L=OSv5wYzj9-`T zS$!+j);)WXd6I$@y`b2dgImx#Bo1{ny1o-e6ydu9CRRszq_Ttb%NJ#4YTj+Td$gsp*``2~O9 zrQKJnp0(o;o9l5>{le0BP%RV*H+ZA}VQ`>+IgLuxIednAZ%RkR9y4w}^Gy-)IJ4c> z!In@&H4L;nB4_`zfzx&h4pMhk|FX57D-3`#x<`m<46|%)&leju_BQfv{25zyJe{4+ ziuIZjCvqE}@AEGnzqKPgT8)yjWXaV9n;mY5U?nEs_I(MfbL+_?hLuow{oK0$Ym|J| z@IR1WSHJn|_>*7Sc9ia36&CyN#o3lR*Aqi+KTXaD__rhJ+EuRW`kCqWoudok3$WJ; z>9=(*Vh)~{zb>A8N}D)JUIKeKDF~+IKCr?}E*nIKvOD%3Y=i9AA!ICxf>TACG7~Y8 zLVkL{jW%;{<_X zJnH5_0U=F|WvUb!#uPgO91#m4C2_>>&dKDS{4kv&a;A3oxj0#r=bUlSoJPgAt@;%m z|Jv#6hZ;*$v`-RgB|cXct4Z4J<|&IPp`uHkzedkeEKx*b)rbK5RWP6I!?;Y!r1e!1eEM-x4P%Z;R%9`|n9mWRR7 zU*j%mO84b=4e@iE5weaaI~AcS4r2=HMBc5K-UaTPpKr>cEgCDj+foWvlQh+zUMR2e zhM4A%2ko6c4PGtH+O~#SET?2(`b@U(J^FWNzX*A%@@+|Mf!;@R_i>9RY0l(FUT;@MJI7z z#-YYT@G-kV-;)u8-BV|+PZJ^x1^ojiSzIcy=0+Gd5=zEGukh%J=&vbH(d51l9Ve#1 zNqC7wEyBkSPt54)ibR<5)l1)@NqvbTn)Otpt#TKyVDnQZV-z&!#$eN1%kwh2U-l zaa`WCVn+E=KOE-n<|;CV`WOi|#gdXp!`nEz1d^l}wKJx;72B*Uc&F@r?&JMb3>e3> zQjovXg`ya8Y-)ZcNt;`70eaUSC?c&bzmzedR4iEj*+}qDhNLQHP{L)JrSYu@VX2Bu z-Yp_}V+8dh?%VnXcm6@Vxaqfj=CNP5itv1-L0Q_k%+CczTF#pj>o!C22a4hai>Yw6 zJ|q~q3b$;gMe}RWy{SB~NSw!n3Gu3R&UgePNr_>cV8gKaxt~`RnXV&kH<1;k^HQo? zX3A7~^Xs*s{EYFU9;Cm|k9ac!3nh#N?FGBzC*(*pFYYZ5~}K zGf_R6FdgQ19I&GOzgZyn|65>qAf}c3K$IDG^p3Jg)a(^NRGouoO7+Jm$}mL%-KscX zRgDz!muAwX!&KDJ4}BXAKOB%7AKIh2|*Ghy^rn}y_`6g@}X8WE?=Z% zT|zz0bwg&#K8=cm^SC&5?KrIl8kaw@5}#$M0$Vqrvjsq6<+xO&WB@Wn{$FrLTv}3a zV=Jb96f$S!f1ntZ{ZHjbNf^`^KMTw{v|CH~L1?PkP!#@jKmp1X<21?3fd&%5|KR1H zcX%Y~JJV4#knfTvZ9w_RbV`g$(RWmq$$GBlhMZ@oL(8#_`?ob*0#Y;ul-hlVrmMq) zd0nr1R#z)~rRE>i<7ywzM%Ayg+tdewmTNh#sAp1WuCFJLM&qtrh~S#8R5p#TY*c2> zv0o@C?lUUP?v|S^Z^vH#&cz#5{mnw>YW8blmbKnK;*`z7TwGqa6Z^siHkltuFBIswmPkU zXVo-<|7*N7E)rWXRDro+mcN!gfo?5W*f25Q(BEoKdv)4kp3u={{kyTK<54P%gu^wh z7A7Sv&;-92LoP2bv9`+{k9+w)ZRKpak<>p0xCMERYwrqv(G9EnyhMvt(f+OfaeT9) z_K_QJKR6Y|6Y|RWPn_|9+w!qSeoO3`mZe!!Z`Q1ep_cEXqwP_CKj6xq(c)~+#^ z?c+wBAXUu&bB~BHQ4T#4PW)n-;W;W2{l}vtoH*)a#xtKAW^*sP^+FqKzCri>#ZJeIN5-fq8y8A)0|7pyFwxAWK zae+Ht8L`WQBU12G=ZD{p|CS27N%0g8sn(l9^0N2@QAK+>{;HbCMJGj`vsdpn6l|_% z80k=f$M4s&$Z}pK8ky7>a-5BM5)98B5-)}aD}pZlI?fLbyyG~Vk9(boi;}i;dQC{Q zz_w4}RQ`Z05=NTP55aUj4p&g(yA~mEk|kd{ zuIbjQc2iTR$tsT!mcFV-cO!q*c@gA>UunL#z1%WcI^gJ9o%QT?p&AHnG)9k6Q%<~< z3V{HB5+PD}8N=0Ld%p4i!hZpuO3>Id<>%Ajeo=5jr={@NtQ(Bh_^!@?Z0klY0-IBJfRhpi(LyKIHyB>KFFfn415h z@vYayWC|0pX+%ND;2~(HEWg+`dMeYWV(1`|!B#jo?9QaAy7@(al}iyIL=I+}TRLGYiOvF~s=@vbw3k9KEx zn#^&tBhn}gb*YZ{5}}S5_VBlfyzF1s)&5t#ruyR&Nfm?phC>h{0GA*)y$iwR z0tRkXJS>rH{LGGBQwd)ZN9h7<=t27DP2xt#+%D>o5IGO2paz&-)N=smcPRVJ12;c`BI)&WnN|o&5qK!SrB?8V<5v zxD#|OF~UH56+J_uZ}Q@f7Q)Fc*&>jHP9#E7>kUoS>t+Z`0e#D@HR*0&yz$8n+V)GI zQr|i1#(U-)P<)iopv!BI4l#@PDYMthIR>#{YEGA9LWOKk z=0v(nr}7bMJ+gA%CZz}UvZfmA8&iC)UY(0ZeXZuZ5r(c$L{}_!OJ--~q?(>*l6?N$ zOAhqZ8=yu0?QS@}Fu{7>J=XFoIma5keM#}PQ}_AX9o76dw6FZ|9n)8d3R`~lvghBq z*V_W|JA@}};Zh!-YuT}Hy|OmDJ?+Q4+?p?TZ!b5^NUPY|N+`FyP#v9R5mRJBIcG17 zjpNEqw)%-h?Cn<(WuuWG4gq50{a7ocG`IRbyIXI zQjZ1N#1ju8`4_I|2e|U)H|{B-h#E=r`KLrlt%BM_h3+{w&zp;%kBkmjDW`hd@+3O} zBvaBD(Z986q48LJREl%b927Ddskbf?yD}dDn$Rf_eNXNI)BTp7x5YAO(rZ|YDh6k4j8^OGi(p4c$ zJ41S4!g=)IAc!LPYRIHy@W!s1?hspnP@KmT7(ZW=Y&zuZRL0t z84kXqu{i}+_E+@Vbd~l<_*`=Ntlofe(h=pd5$Dl4m{aVORd8^!SYt0hbj6JNjopv& z!#JI~$6R@TH||zIY|yV^qa$C1&$a=B#`B1++f$$;PF8%-fJu@Aez8w2U$NPuxyUYJ zRDIhNEK!in#0l++u(Q}MQ;*8VAV*9IJ=l=@Y0mE@Htzn?6l zw3|Yu$PM$yj%8Js@`a5-9%-iQgnCYO1{R!Yle}pc3d(KYnK(+XOVWv=%ZK({{9Ixn za~UPs{#AQX*jGu+rZT)SBPFOFn)Mx}6nX2N>`k%7ta9_K`#G7D#}86rOpfGL6Hh)4 zH5CgGW6Wf{Jm-rZSZrwaXUf8>|0IYPe%fMZr1JHlxX=#ntU9lGUwY>toV9a#bX9vUr$U<%{$z?%0T( z4>w}GcNh+@$Z{CF7&Oup1Dd^NPsd-53fX968)q#1+@A5uCcWTRhKwswrd^tYQ0^>3 zOQ*>3`O7CrMf&j$dH9MG(7P4b&P(i{6>gTMJh?G~t)3yUFtdV2H}^|(Hor{k%WG8% zr@$-m@;8*9pA`>EFjMGopKy~c-Kt~JLS(kzzN=d3rU$n-Bz1K=^!zNj6kO=avc1r} zc(P;bbz;XxMYH!;qWpPT)J*U%B5P4cI+Zb%*2a0IX`nHxrVNgvcoV$2saCIbv? zVp6T}U`5EJvKI5+Mg@8@+=PU7@UGRfH8~uS3ATfJ_eQbW45i- z1eS4YTAdRxP7{g_lC}op36Tm>hDFKRPRS{9U_^nU=)_hA7B(muV+Id0)FkpMKgu%^ zG~pq=9pqB%jxm?HS^oopS4`T}_bb0!2F%~JC7YJPw9)qICkj3J3xs^ON56IVy z2x3%N4V7`>yT~WVOtCjxZCh zD$S7jvi^^}9J3Rk4;tBw{gU-}JYn({lp`9e#!=(#DX$CN8$~lYTw|d4wg2&~>B~ay zK?)U|Ifl&~1!q(vGVF}G{AUL5(8K0<&+9&*ij<^*HJ3uponjoMnDg76&m_UGI&DQP z1CYY=fV=>p);~SZtTwh#1rP`P;;Tv&)q7z_qfOd6%Wgt4%j^c<@fOe00PRw<2HUS-u|-dYo(|KRz1WR{}OrYJk!VukCo#F0JDa@jG!A6 z2+#L3qy5hKHvoYV3m=v9->)M-tWmyv5vW%a=xhaXKtRNp+{*oEp;h8BW@VUtAc;H2 zh>}=E@|#8QfTGT!=qn+6+D=>#n=o6j6F zk#9{h0KPN6s3%OHoMRGr@2Gh2>%7f+V^p9+R+Pl)!tI;H?sK&ywNqriz$I=5xj2=n z_T>7DosjET)xGF*T;+aHV`wRaul8|PGp3rC)uZLx-J((B7TSm<)#@jGrz}cr--wA= zNNwu==)Bg3y2K}Z8S-VWv*pfWdD7^#to7X6FltYHlfgElv~ak{3mYW4Z-$Lpqb&UU zVrXPnkaa5moBjQ=H*Xsqdb&!^X-U6LH7_$xi%l#*#xF)8c6k}ns$3W!X8)K-5R3OT zc@`~ONKNl*+4Pvwdnveyk$xD_;9xtV%X7^t#I#_sSj;>#ghzq`6zP^)HounSR#^0! z1W}KzpGq*-rGgkQMzRzLhI9e1{dYqG?eR(|b(r+3Pl0~GDOkA~x0!>F@lT{b^!>fD z#yNJUV>7~SwA&!pD8%g?=K-{|P$l{%4JoC%evQ$_vn~=ppLeU zr@b-QeA0h>sV-eVl|~~bkGO2#%rG`-PLwBBv=Q0Qzuc^qUY_qE7b#;~1K43l{}s2d ziKp9VTP9`g7u$-_LrEXFoT1NU_rd`GElG#he z#BKZcuI`J=huI&ByH#?hbZom0@3M*R?$Y%k1Feg%1O^O&BTbso)%@JL($AiS_$-9b za=y^*9qO{acs)Pz7L`aV{h~4um9e{&W!cDHw#j3c6})q>=XM1iHeXh#&F9=#*Uxh< z3i1lbbSVy+G{1Alebw=u_3w86Ql4t1OcdR|kZ~>Cmu(#?$rkmsGV&s|%NLnMF!1f8 zq5K2@Nmm~UH=HhtUCNH^ZkJdQ86Cm7XK2vbO(blPyOe zrTmZFL7YLhd>i(Rx~r{Aq8TV*C?1k0im9jbsWJ3k#oo&X@E!EX^nlSP?JnfEL058O z8ZX6PKlzE4r$CrwowKeA*Om2{9NI93KdFsJaM5K@g(@atPe*_ zi_L^^%EaJ9-E(f3{asWFgcX5(E|E8#7?O<3>qSPLBFpMgK+ng`nNSE8ww0V&UQ4B- z!N%af{Iz6;%JmgP#!KuFc}IW_TtBH0p5m;5oX-tINM5pZIXxQkP+jyJL|lCJDv*Z4 zYAb3*WH)5pi@?poW^ckBurVn=TyQ{cD(OV*V*u9z!E#sQ&8B^|JZxgw>H9}ls8pOl z@(19heG`D_e0>SvV5Kw5O!q|1ae388*~3sEN2Q@+d1G=T_nO=d<5S7fA1%Z^lcT~u z$zNE)iqt}&&%SXu&n{*dJYt`oPSeUlN5m|{#s_M_YH|0 z$_6Fs86G)zS+%A1Y}>BkngDdM3A4aKA&_%-s~V(qbQ1EvYUQ#RGA_zIZ7#d;w^bCT;eCN3!;a6Xr%)x~ZGs@P7Y zJ?UAC6wCap-f1--#OvkVC0y?`{U7WE@!DTanGD&{{4~MZ5iXy z^7QVk+}C6JkDlt$mL@OGO2*r2xB0bci%-EQ_|N@pZ25z5OLPcMAR_*z zt=?R4hD4Vip~{ z!)JO`l^1RkCD$?FW-HE1m69e-v}Ze*SUKC1>8yfDymkU_t1^qkU~dSV%Dge{XNa^g zEqKs(jB_mf?b@**@1(wB1G7AHh6p<2ZPlT~s`O|Sed0|_>UROQ{L~3DOs(z4I;@v; zhu>^5tCz5$W!#yOggPdL;T6(YJzuMsxP9ej=h=n-XrDx{5F|Bc9}O>`nFtkZ(l6~< z-pJ*MS=~@OvR#oEtZl|N>v+I@l-qi0RxF#o6w#{VHmXO@hago_mZiWw1ig^(% zg;16?T@GOi%80jIa&0WPCVa}UqQ(VOrte2`d{U_ge`Ws7iFo}yEFeRz^_A4UNy#+h z&44q~Q&p6Qm${kdPwj^cH?IauP6vz5>Bxfpyyds|pB!d`251^3oXeiSfgD zCA|*6iJa9vhyIkI>VNPT@|2j?M%hvr_Z zES7b`0S0YmZVBC7#F}ImF{!vp2}a(!WMZ;ZR^wHpbszf!!BXSS4ZQecl(tU>&@-O4 z^?!k^NV>eJ-Ln#=43-a^`&8W6Ay|(bYWn)&ky+HcGkC)^B!WqVWB_o=cL1g%cXR9)TJ9`S zxAAS8N~pJ2Iz-bj)pJ|(F&$N}N%oh8^5g&dd>GeAGtCI+FMQAm?@AnP3$Bk^dT+) z<+e;tOS3MPBcm3CZL5SS+O)7ofAt!cDv6V>l`-1z?V6QPVaJF%Tt{w`G7E2LRbSXQ?B;)?#T;rx<=*NN_847PK+1y(Gc0Pxiw%PHM7dm1^rp|U=nQJm6qEx;Lf4oU1CeOG2N|8Kk_-!f zZI?2jN?>Fp?7#5lI<>phzn60^_Z>dpyOVT&t0>!52&Sr@i1D_tJ8CnT^EBB@IePcU z8k#~}x9Y9;zI`r>lYRg3C5i8Yi%m_viBds@wWBEhxX+>4*jO?xELSrf5e z^lM76euC9TTrf3`t1qn&N*kJMj<>(kk!w%8CbH3R%YT#A^UFU-cPRvgh@bM@Bwd5t5(-ZU?d)dyN*ZN1(w9gq{JSku1# zz~iDj;i5AfB@1e^?2>GqrYuw!yLJjiOe~n8noNDlpAE4>jm2#*4IM{^xewG^FJaP} z>G9U*FLZ_8^OW+@lQg_|Ir1o+zP@Z1P4v>n)Ulg^(fyFI$-Q{bntuP*;~2qbr%F!y zI(@V;39TS7IV$J6u}{-Ktt^5Nbrn^EN~x!%?RHKd;s-raRuzk7c> zNKwqSCNZg21lpEjVuvRrQRUhPHKj=vWxa!$D}3r}hSzvnqn7o9Y)^R;wCGyvmrb4K zpVMeHyb-S~FA$Na2wAl0TPu}Zl`|=Rw2-&0J1cDq8riJ5dL+eg^6;hR?AYC%S<+!p%C}b`? z%VQG)r<{yr^d^6o&sbbs!7bKLXIbwgjbf!CVjJw$$YDJ2s9{=z2YU)DPc`?{|L2UB zW*?sb8;u@P&~GOwmAPk;_k&rVuQc~9&O@8ych?031h{RHg4RVW{#&^7R6;r~)5E@M z{A=bq*NqEF31IRGh!yT8VX$(eUkwp}hLUB?7{w{#I6|n{ySC(^H|Okz%Fa(fz#=M% z*#ypeW;L=fL)4kf<*!Hl3|iN}9=9bo%&ZdE|8@6v=Tj<|!?DfckDLW6UhYpO4eflOalQ93Mifi)!o&r6kK<@B6@a*6$!1xj` zjtfToW^$s}c_@0D;KVYvssdv09TM&2K+4S=%^r{g@wX@lH#i~2-KjbR+=rn)1?4k0MnT;^I9bVce8LWQIKfN{5jEy-(I zvcr(NzF8(!H7M3cFE2gMKYcoHECRbhSuo3W`z#xN8Y0o)Z2PfXMw%0BR zF5X|*yKRD#%bOSCZPL2i7*Gd5+RNvkw1O8G)#r{H-_cky4apeJeDa&Nu3(BbwVW%}A`}yl-|9^N_mJXh zr`7`_x;t2#mqSD%WV>K+)VEXZ8gT)r?ucPUfoM+MKOnZGlWUSCSlSBI>?uneZzl+&ag|nK> zy??rD_~hK&Vimuy$;904IO;M=dk}=+JNY@=b7hVk_v@IK2CCCOPUuNTYI}5USmT&_ z&rr;c)iK*%$8lL#owz5e^^U}$f4P13wcqCNKILCB6GW(-Pm-2yYE)iKJ6T-hD*wZS zD}}r6!`ZY|eoz})pT(1FkmTVb8<DDdFXzP$|(hYTP{B$`e zq+t{Fjn}*QsmHm_?k4>||9-Wn-eX`jho&^aI`z)FZA}DrjUKncb^>ey4|Tiy6IG~z z@1?F$)Yq*sMSQ;R&FXXC+mH^Fep0b2>sj}uZO<6$xytFGiPzS=RDY{zinw#U?oqQ!<;k^C1PDuk@*XE}m3ry@i< z+cdn6j{8<@F@_fT@^3FLBp-#_Ut9b*Dx zIn=x)c*)3&iNai5iTgaEkTLFkRvKRL1bTA)@ch3+Lxe$Rbk(MQcwWcMx4+J8*J9$ay&xRhY+R9~{lhXI{Y@pt!bpNo-(uD1k$Arvav!9SpCIr*F+P7oc~zw&*u zkS}6~8@x(-d5c`48Q)g!3pPloXmh@|LP)VirL^rT0z>58$3r>O%B<#_-es}UWhoZ~ zCOAJJ$o8a%pi!(g1#yjF7T*!$ zEE8Pl^w!EMmd~3(7aR7k1iRJMp|RzB%Y7*gC`E&~4`&8*RRJFh2g`)YnIQ|v!@F%TzA(FwQk_jao zVIU4$i%G9EhK|eQaE8B)^$YDwh0qG}(&QqKwPTM1&VI_w%zz%y%}xdw!{y%_(pQmh z%wZh0O1v@7a8ol}QF3Pr3xh^;f$KM8D1!gmSbYkWfM6+(N|$R-E~tDyp7sS_@Hle^ z%yl1B!z0vl7bQupgd`^$-f+{ddZ$VC?UbOV=&UGojAv~Alv01fl;L`tme;0^WwOi6 zHDW*tE%p|yyM^3-Nt(ZJ9P`%*%m6oE8I@^zcD4Qe-SWxT+6(i0N{E7N8s+^3RNYlp zrT0}$37G}g?}em+6H(XRKp&TWatXU-@I-6DHs((8m*>v!hSi*heSC*0U9e`eCC4{X z{E8pisrOWeiOIy4)VXk#UxM#}7IDWf;;+tzz3~)oIe197$KZ(MdZCFf`jA1u}2|OnKlS*>B4$kjE#LdtwidvzSyPd z##ZOOmM>zD3P`JwtCyfki5{%4DshA3wXNIw#SNB9x?er28Yd5yil+-Ko91xgHTv2# zl>2S<=HmRx)ok?#x35zxvOMt!($!tCZG>l?Ldh4;+F_ldg?(rp-sN+t_dA%EoW+R+ zgI*&yrx80id6IePTOIG`4;igBn1opu8Ff9-x@F`Yc1g8z{ES*zAEHXZ{cgy?RX1>H ze!__Nq?=Qy$y76WntQqM)j+tU_XaUd%iz{p;{eP3;-=+ihJmB3&Ukd>#+hTj#oO|Y zM?Owvk__}4t|bNQzQd~co5zl7HABN;;ca3CPrkMBmj~aKg|-`tAD9gQ>6|vn=V{)i zo&}Qv#{{E_nfLjU% z@mw6)y{IvoU^Nl9AB57M?mYW5`;4L&a$<;OJ)s$;2dqIS0mbL8U|BUhkEvb3X=_*N z1Nb%rx$tdObFo&Kn&iI1{*Q6a4d5(9nF+w%4ZocBxyjNZ; z!DKPD&+fOnU~{a2sI(g&j=jb-p*+t+Hv@|pXEx$zq=s~-#Ck8E27@zrAPdw5`Rwf7 zck2$Kg{2I`VK1BJtpa{$2r@W3f&MmL z)O?eED9t>pQ8x7o5kGRtY1E8)HsX@d^Q;BAlC;=OU30w28F5DhQAxx^j_q)>4K1?! zPlg#Z+*8LwbHzece7uq`Fvx3Hr=WRpJ=O4((0K(&x#>j8Di2W>FBd%y+~WpcX#<%p z<8vROkV-(p3Yop)OAo03divxh1uRgK+(@NRjt;rixH>tR!;Hsr% zWJv}eRaH%njXSMa-V3b2xZ=j5COF(HGX=yIXXuQ-*-5nBV5)2ZY$^lu@q<|Ne6vdo zCl^S#UL-zIFO&MB&p&-TP5G0hbrRuD^jkgQeklvFrG=pd;}ERfI~~! z(i>QcURG>`!Ep}$B&a4)@s}|WGRj8njYMd?3>N9dn6=s2nG95-wQuz)w=J^ zdL-ZeW8_qnmHTp&S2;g7y@F@tcJGKdHRz7MbGoRdZH5MY?gx3q3qgX%=cdm}@*UBell5p0^RQ$se(+Z> z_52^`t;Q$5)Vo)|iMoW!>L*Eb`w%O`uF8pJp>$9-yIx_QUA3E!r*(RlJqX!^%w}>x z)UFJRzvESu`qxvF&+0q63`%Upc2efF=ia=c^?S6{xIgL-lbKo+(@WM$ux*ly_WJ|< zRZ7&(fnED$zPK>zYbDYO>48EWBoG;*r-XDU4^X+ltpa8leH)9^IQj)^nVnu%%^yH?U~LHIO}k@417{wI3HbLWDC0hub+;> zksz&g^W9yA5--kGbv(G>y47FX(EWj5(iU|jR6<}M6X(EoL#h2jQTy-Z-x6}EwV$JD z7~rvw*pg|Ie4#34-8S{XZtL3Zg+-U%u^xriL?12QB5rvWIJ6cuHaQ&++wdLjzH>74 z!0c61jxBp~@?+`oP;j{0@tl9yp#?8;^r_!=uSyHF>mzD@Z3$nv($Vca^!lR8WRYj{ z>Z6a7gkqgk2Epbt&bvS>RI{)IF|Bv^|Bz53U~KGo;RM4! zLA0MSyOT3v6>&LNW=x-06a(oBeM*nvfT!;qkm1CO>qin|Q@ZOUQQ^`0<#)YHPOO+N zx2y_3>~&bySIRO~#O7?AW|9e_w%B{>2=u2@6>qO2%X$H7EHb0$r*2YXkD-}zA_x_& zwT=+CzRFe3jnPbY-GLf4aCnoN)So3udn8Hi^z?x5d)E?4I@{(fuJx*RpPKZ>Sy9z$ zHNnxt#+51`HfXaGXJ@)A&qrQMJ5AalOM>YAmv(Qd&ON2+~-U)fESia(6LaswI8$c134e9SzwE)YrnT zGiy0`BQYtlJmY3`>3-DZU3B^7FRr!*ED6d!qc5v_kC{?&zmX7QYl=hWV8vVmY1Ajd zQZiP*Qt@Cpd9$1ox^$mN_BcBK##`NuP?W0`QzAmi3BZ%{C5KD`%E`ei6wvk4PQHPu ziy4!011S{L9~)El``{?~Ev~%JXp=>&T} zztN>>XYYY&We7mA`jPuMz=Vckzh}4}L%RJ>JOe1Mh-Z7BP^m~%x)qGg1|%oAC3ePs z4`G892^{#l%#7}KC>TlDqz3=m{hzh;U7`y8lG?8$4x1t#)AIKqOq;2^O#%2M2=ntj zgUrrE0xFa#zyXl9ary1>NJ>2Gx;5~a_ASXhbEjZ7Ri-xuuv4X9tdyN6Ubk6Cyx#E3 zyJvX_^}m)cp!&O{#dMPj?UX}i^$y#-5fBr=?c=5lDHtdXu(4vj>DAIK0E#0_Y119X z9k@-bd5if56mbb;xK|cym|t&(83tO@9O?Zyb7=piq1Y*vUwpF+AfG$iTEQMevoJqX z9MkdgG#3Zp4pFgECX%JZ{o+sU3c;fTTc{G33Bp?BS)mDvOx?W@@?+dmwXCmym)N5| zN3`)5Z=*Z98wa>*I*yEu;ui&zkmtebf5mmgN!58+Ka3z6wEi<7Vy9ai@}a{g_0P$u zh5)yFX2a4_-It4lo)gv~-yf^q2?)~td*xhr)7@iqojUmJ z9G4>?yHy_Md)dCVff^(4*kI7+e-AO=y%wL-T3l?k#Q)kv+!YhBl6(oC7IK|61ntEC%Bc96S>2@QzqzouIVWGjla}(AmajBHCl8Z@ zs{tS7nqf@vCD!fV7Q%mbohx(16|42`@~*5Iaj4&H7!PnMm{%38`=cHOaG$jk@BaGB zp!H?@wIuO0^Wxf!vQmAAW`;p(q%amtoSL|3_^jaEn6v)!(r-J}g^gOis7~?XTF%%6 zal~=#z{|T3XFA3I1@WuJgQDC0L-XH99ewrN7ncu4DmGjNh7r>}@kD!GqnYKSK=JE$ zluyR`cR0sId^v8U@WbNk1abK$as#~<|{aXPzIC-dUdV11iOQxCEIs=r?2 zO!#(LOAtL?|7_1_SD2|RlgJ!O>wo!I7P~`FUD3s^)l}c9b$gs8t5Khp#G$+9eJYc5;QTjK&Kt zmr4Z;#Wk-eDqUmVh@>SEL@@aplnQ?hR`*x?w??-3n*a$pV#@8Qs8XK7 z!n%oy4p3HN$@bq}mUw555iLUmbx)#YPYeEWPaSmBt1qO&pXvB$wuNLGI~WkjFzfK& zM+|_hh1_LTY|}wAXO6>ozMzTINC^(hKg7Ga=UpiqQyYo5a~X8nDr1RIvABh58jKzv z24klrnR3M!PYfx~bS4mfUbL`LL~jf5Ttx32Zsn5N#j@%6(d(heLxpXv8Qe+mf`Xv3 zQx0Yh73Nzg$&=#^M^$tu3A~B&99wtAvKX#v(B?%32AhMX?_Ar>652A5O&E-{->>+Q z(`&Vj{NcKiiGuLg4Jyo5FDo%K;n4c_c$jgI?oP=A3w*+@(@Mh!M*NS;(cyF}6qJv= z&P~pbf}t)XDdHNF0ul0Wa2e^#GNXc0^HND!7F2(Q%ccWqFtCyw@%jSMN~`C|XT(KS zVhoJMGz#FH(sle411{+=Q;IHWjf9LLYFztT5E2G&^a$Kn)@gpiDm$*h^MZoMCG`i* z#D9SnvkT-?n7vt9JL<#RirtYE!fHi)Y79?=xq+LMW{s(W=$F!$+gvrul>mUvkXG_4 zRSFIS`vm~Op72eNRWCm&W&>2M0(E@E13W$HIn|ff*J(H?E8Q+rnnA(Hmkhi)`$G9V zSDgU-^kI)5lVWEx$Uq;p^xN93GCF}_Y~~HaNlQy3&|%UHHWT0kklActH5UNZek9?q z7s`iNdw`Cmd4m4_E9f1hB4^=T>#a37A7^>+7cF_zlR;<2I7$T|fFu7nzrWYsb9O?ml~GZ%YE70}F%BK>3d;G<#i zz3Xp)&tdPiqy7!=Ty08gP~jg8BzJ{h+MyL)L(ZiBhE)wd2w%V z-kv}5)p_u^oqFZV#D^b>!xnem?;$^E6-FeM75s}DOsM-!XiuIO=5*ZPT_o*EnIvHU zmKZMzxUh4J^L9jbLC%UA0R!ZfS(~#v-BhX3_LwnTQysQKY@m(^FjSoP0PT zeg|1h)!|>+0k3w6>1q!+c>Q+k_&8`#+qTjcGu-jK|Bj;iB^7;z_m={uQobJ75+-}s zHpc2VplO<_isIfd|5y$A!Ak~{Zm7;m-!6BG^RhUxM=x2yEYd)B4^^B0IzTlnvf^lO zN7M1n*}CbD&6J!wx!p}GxBG~X=2QdXYg&hgcyd?CAO7}Lt`|BPl2>ov)8b3^4u9^F z^Unb3ly)vT>f7GCs4`ujYi_4~o~1RD7j~tu3Y_{L`LeiiG-yO5yS$w^*?Pw@w>u)K zUexKL97^n*M0K&Sak$3S!j^1VETVhhNl08w{CHoq@KO>+-2@*1l6}3dPzH7w`ftWQx8;)j58r z9Fc%3Ai_6T`pFJgHlLgRplO$L?*Am)LP9rbQUwu>AKx+*Na+Bo&i&<&c``EWzVnvx zi6YkiID$^s8AU6d;Xr<-tuI?;2nv&Ua*^qvi=Tihg5?yJyyLG8E1DTbspfyB^=nbA&AJ3?oW}{GLJbK0RJ!e%X{8@$QR$eLZ3km)!pqw`nNT!*7UY3gREYdn;8iiQkjt%1P@^p=&Z%>|^*o>)=cO zfpWbB^kiLpai-TVTr@LfXYW1xr;nU4heg?0zQnvWUbgunK{>B>1I-6+RgGkbXVrfo z)Z;aHo<`X=_-EqYVDK$huRr^KB<)H$B7luHP6O3S~ zJwp7t+U6PPIA0Ywbez!MlY(iqTB}&ut}PZPjCKA=3vaDPZ{u*#Oo>#rX!A>r4VqZ& zaa4LgIq;&U;BlZp@KgH^b^RNLr69MVctScPxO&Y;^UG>`_%fY`|g+Q>>3N?=M{%>deLcUG?;E)!+SFgII+ zvB2oJ5|ANHqZsnNTUwU&F<Kf04@K=sQIRrThm_r})fA%X63 zuc4=Z9H;&REmf|adpyiJy2@3wySP)lz|%mUL0OSFk9!sUawPP~i{d07IeK#dNswoe zrn;nb>153G!r6oNvnz&HO?CH;kChdg0UgvjMt^Yti9~ajR76cwg%lJA(ogGj2tXtR74jg zzXsxNTn>|O9c|F99?*9^3j2x`D9D$(`*oE_& z^Wc(lTokTYBQM5)-!jH~s^t)J`M2bmhc6z@+%bR@Xgnxv{FSS}9n?59?qsOiDfY>O z*8N#;Pc%~PG$!Kq;9$M+tD35rag)@c1(J+(Q=MR~;Uhu)i~!eJx%9?dl8q&0V_tM< z@)^5vQQ=(OoJC_m+Bv`I8olF_az6L(M4Z2td+vLOYqa0=On|}S_xP6AbAMW9Ih;ph z1{Iq|cZm%u5@Vg0~B-8<@QI@{v{+{aEmsApN{`S}dS z3`{hS=rlP2=7v+#=Nq%WaOlh0CV3-JkcJKXzUXWD$)0w-j1m{c6LQq3fsu#KhCmru zKe2x^(65~!o9^#H2p^?A{(8l_0J7Aug2?p$Wk~AZpwEjc3|^{DFkn9%Z1lKr6`5of zF?)Y#DT)~=&027jkARlA8U8IrBA!l|D-t1htXGBC+?U^xcjgF%vO>rEJSRO~8qx6` zyRtcV0$A`ECUh0(XqBmH_)WtxQAKb*88A8z|oPm_Q*DI4yG!k%+m-#Hlz}n zWGG)RyVSEvl|*UA$?M|eqmlA#=Ge6K^{53?DJwP@tYuL$9OkRO$n}b9)#hro34+(( zLUeL$ZU(uyY?TNbAjvuairDmL_*ZZY^Yy?15z7B6S|&dVuIDR(^jPZ&&kBI%#AxLf zM8!2cg6Pok*Z;J>safW%x zP)RJ3;jk7&Sux8lKH#g#g7{S6L2L2P!FK&tMGDiyaEQYCY+0c~#Lk z0r~(AD{@M!7PkpwxuWP7`O3~E+1WcdmWbWm2QHcUDUYMH1>i-O%DC8C_t+|M$rQi}eBJ@VsNeVq{#78uFO*KW2u4acX2O`(z`UCYr8a4j zF|v#pELMc@_7^~4KxNX7fRp()#_#PV%Gf3NsZK5ZZ+wwX8rgGq2BN!+TogJE*Y^zn zXi(%|sy23zcWMp8cwN~^)&wj7beQy?>2!>~t`^0VoVL`3dP95xf;@=2?*dcpt>B;p zM-E3dVD!m97rDgs@p|>?|3DG0_8q+snC%xO5v7JnI~)2fVa~b%^*#7f`}QrB1NFj@ z#EJ0Oe9g_52Jb$eZD9+g*bv)N{3tt`O)p7y<*AW0S>Hr@SeJoe!#O>VP3M|Q-}HxL zy9O>2o80mMaw`fxyHtD&AMjhOSv+-PzLss$4bi`FAr?Ph_~PWLWxXtGp}44dYjA3GqxNH8M1ip1`Z^SM(}Dp>yc=~1>% zd2qYIt0O-8=WFweN~peijt3F?V(g*l4B9blCf_AXRT4R&GFrmtZ|dGWs6I>7gk_*e zK$rl2w9R?=;t!vWcsK%u(K*XY9oOSEyNxUODey&q^GwrOP9mo2%cSm%9v4GIj7DZ? zeC{dg{fF(aX7>qmaT_5oAD?L1U~-K^Q~F_@N`q6~s!PS)#ZfZla%fwf8uZlHnolz` zk&P2Ijjeu%yUU);o%M=3v1p=r*CQh%Bd1%XfB#l!GmpFHr}v#~JQu!qXd$!4|Gr&U z!Ta!B;ilDJTjbTUl{;64-QG3A>Q83g&E5Z?-Ox4_QrHk69vKO*7{qo4TDj1MP3&q~ z-)DIwtO)lnWWWAi>$fHj^9)0|Alk{Fv>lorU)&X%cM!N{B`qGH^b_-P^dQ-L@>g+D ztaIw6v;LW__05d&17j}(Bn;QWdm<$2&HQH;M9GS~U8Y>!{7n*oV%2@&j`3E!y1oG5 z3>Dt>t4!0Y^~5BplYJ-I9<75Z>U17cP+(MjUw^@}nI# zuTjwTxtGvwsn@Q-@g+v`zs6*2eH`7-(4io=8{v0|RbV+$yT7)iP9Vz$e?g~(Id{{r z8DFF!*}>A&@^YpmUyL_QhcTrx3#_3s8HEQ*mWQmw1Zhzc6Mn1rn8`?%lx(3iyTdyoFm?(P(ZpQ4*-*%hLBSNHWYUFtME{tx?iJ{K^2I$Gc2!f(O4tF`U3{PtO?yqT z9RL-s%gBuc2*n1UjkJ^3?>6HrTk$q@+vi9z^oszwPvT#oSZXNJ>WvhTX$QQSj5g#u z#{-Y-(f}K0`l^6pd*F~M5~y(b6^cQUFTKTr`?1qf2FCrd(+K-__pKA(mSrZpv2200 z`Z?{GL8)fz*XT=!XIPRpZzS#=$l7@_H+(mp4-lkb?Ds4(eKWW^7Kanal+vHnu`ZKb zP8t-JngTR)ASTW~l7Axee=I?&9M3CXP7ums(XUEaUP+`TKKP>w0Z;Cy># z{g?@jO2Sjmr z`~vZW4nZ-gAjA(Y#!&0K&+PY|<%Rv8ej@*p*$*Pv{lm6YmUbOYT`+AyEt0>dNzuIJU z7e5Q~RlMUUUX1Tyf z*yH38HZvB$!z=YaXL?!2k4^oVkG_yeC2EAD5&D9a@bAIdajcTcA=RUohcW8@PA6to zuYP6Vg`;I+Zn=ASv^r*1ppa-XlDU{ul^b7Fs`1RIP77vtewS<2Iw(9O?6c#?_bE;p z8@LG!3X(L_^i85;-m8l21^n}?@*nksLKhYSPCMW1%OyrUZfn@uZnDl?TAq!F4*GLk z@A6D|nS9XfZUET6J@cUWS=t9}MR<@CO)h`_)lZU})cO&-QJ;pHQx$a)o3lNdje6K1 zpyvL=PP9X+UsB+#4zVeVXxFhZ=j+4x{;HYUkz3){`N6m-(d5mTymuna-^+{FNa|>^ zu>uX#9s?BrshYX}Kn3K~JSRBsx!>AgN^jB8KSsH;nw#$oR*7OBkSv1$xZl||&brFZ z&Bv0fhAFqlgkIdBhuO8we4N|n_>P|3>~ZDBIvFVBiQ7^1>VtFMhcDlC@Q6s5!Q#@( zU)516o}P)l1M58Jcl!E2+aW-C*;!vZtE%FI;#BPmT+8xjDv>Du^7}Qgg_sA~c?^+ye!reGVxIQn1IhD~hdG?8x61?2xPEi4R{M$)2rp{qa}YZR81WSu1Y>2W3W zG*(e}3@&m*hi=5>Zyxbr4;iOWl4Y#Req_+BunbSqNz24-fl=ljlgD7##?t@3;lV@1 z=Jn%#r3soA(@o(ej%3v5!;7>=hcmGSu`u8isF709gt8Vt2NX(}optvgAZ^twGR@rR zYlSGJ6X?jUl9IY4JD*yMkPkT-_;y4xS5h^}uKmbc7OC9~|Cetev^ zbz9n~6?#5TkPp77eD<$;**h+$`SH3tIJj#l9Hl(cwU0CdvM~Ux zs;3d`F;b;4tI>H_6-dj&mq{(l=Px<=FSN~V=Xmnqldm>F!Cbu0zFWe(!T47V?nJ*< zKL+9$BQm7TXa5@K^ZmCk(`A3BtIhrvdHDA>Hp0MKTfe{VW6g^#WuKV}zdHM+j|RW} zJF$)K9Ulq%ee+8uI^q*b8Baslo|7{|FGUqPG#~r*w00IYGUscS;=Wl|cUA_3JX|N@ znm#8yMEfWbQ}t87ApVd|DWRJ>3(z|zZ6>8p3zt&Feb3}L$)Sl&EufWy@N=JWL()?v z7lYYD!EG=GlPH@JinMK5ji~e|kvD0AFm^^&C)Iy1V@Eul8!M!qV(X8>tENbNrtHdj z{=xlKJ-P-K`X3`P{bFtR9sNpP@t{3Tpc?p%B z;zcu;g)81V)TcMiHBO9eayofWc?R`h?m5|yt#)N?J-yYaWs zX4kUCRtu&n?dD=wdy#g~D}!4cTJX?PvTBjOiE(oJ{0ONerzZd-CcQ{k?_xXR%kXm8*ucAICl_?>wZ=UQx zcd(vjSI#af8}wsn3xKxAxW!_4W+rml9k7b3Ha)q~lq3Ro}e}0sk!f4xv1hR)1th1p0BB;!=T`0^bSbM9y+1%@vY?Q)eWwY zUY{W1M=2p~k2!p0kw41KOW?I(1*EQ!sE1O^D@v>d(!s7V-V9{+IHJI&CFJdED283a z#UAX{%TI@uH~_DGh%NLSNLX%+;mGDOwuppBnQhYu?e_!~HYxwlrPENPDbDx;?c z9BFE`7(DtN8b~z+mt_JbBP>qYd41mw1mA?BPV~)p%muW?XKYgd7bX)YWjY{ZV+wSm z!m@tBvi~-vUy{Z?vU#IS4pFhS%^XDe0!~$&sgaD(mLCg%Xas09=@ete8T*7 zGIcVl6GJOl@1n*C{9#XO-&B9J*SKqinn>J|*fpSu<$PzzJn;bNcY@F1`of$FT{LKW&xdH(=)^LE;J zxb~Qu7MeBtRYDYO8*%kefF1qjVz&MRqYq<;3+GJEeyy)fR$mI6M=xSbLT zeynziv-!LrGF}c`58T=YHGw~((q#O^wns-El-R=Nw@PGLP|^hw%+*xmn+#L1Qn-{`t#rDvp+Mr z>0>i?ks|HwCr(HgZipm^(9Gzo;?+8*Kv3w8ah7Xp&UewVy2Vo*JO55t(z*4&nfG%i zK&-9@h>c;5mVi*kpDFxl-8oX>!VjsFRP7CJ!1b3%LP!@yIzT6n**L+oH)7m&*sG&hGqSH*LZBQ1UQ+4~^2uEP48P&>d zoBufX;-x@~3El)m0W$3!!-krpsW$>f^?Q>Eliv06;Dp^b24tq9cgBW zU!ExXWB+~hid9fuaZRgsvQa|GVnJttpQ4;c-?hk!>BUcxo+pSAF)xynKB;;b<$}C zH45n04s`1+0!)K^R^$NlHz=o4l$*BO5F5N6&DR2{cwJXDD7}LA>e4TGUEc>c5_6H$ z3JJ{Qd%}inezMk`c$)&t@HG~CpJE1yrUQzQ9*cLAE_w5Do{YqfE#yd;(cerH=rbVLD=|b(qm3d7)P0TYeyGsJ^xm)2LyAebc=4iVs@`X6u&1#Omr$-Adc3tg z-(S)cgOYplx$fTayp1>2q2f!@V-iETC(Nn(>d2>%j8p`9C^^;ilj4DKXzm$7b!PrT zN=SM^R$=Q6zI5JY&DN87u!dF4sL!fB=x{+9@@}PO2-8#TfVqRJ?53<$F;sum#lBB= zd5D}M-ASQICH1`txPVl|iXd#Y1S&Z6pPtmbAAW#RXOV8eYgvy02qbN_2cEKQm9f(} zH&WnHJy}yz_6Ceerhik0^8jPKgyZdhP9|HH0n-H*3kM@19&!qbfSmq^@~-|S@JUGr z=pHsxeCv|bCQaaxleEXWSufnVXx!#Y@~rIT^Pky(Mp+QfDc`BHSx>#Dr4bSUhWgZ$ z)J!Qmt^D$M4L!Jg8wcaLT;@BMpkKX|OI3v?2ABOpTzcnlrL4dEeb9!+9fPyVl6LZ1 z?ZCgq`dEP4hSxp(wTAe{Q-*0uGb9PXv9*$>IVwD4=-jsy+(UO`XP1mkXW0$K{|qyh z6Bl>~v3wY+e4y`}||sB$+Hbi^ztrThxUnk-bg zL=s@Yut|6zcyC<)sY}bJ|20iK{=ii+x$W~2aj$Mn7tTRkB0UX9K=GBQ^#=V&Fw$-R z_tXm!39nMuT)z#x5|iDWCCcXRMmC<8WS^6TRx>w%{&b3kO z4Dge=<4_V15K(F_%eh|NSv6ZHu4fmXBXq}wlql=zQ+u9QaZmh?T$BoyQg1@MBfC}K z3b8wksVjX%ike=qev~w}`!f6VcA@5u;c1IMPcuU?q>n-6){pO}abRuxnG^A6Pr@6# zTAOuF`oV3RrmV1d57x|Zpk1W%6lYiFFeSKT632`l6XNqQM2*rG{FzU+VD2$_mcQS5 zwMEu2)-xI$@$pXfKKbmVu%>?sl{rY@$CIX55Wk2SPbKJ^9wFcAV05k@R+>`-z|G{1 zB0Wr5wYu#UbNk|FtfPR8Z%Q=0>i5mRK|I3Heu#s>E6ho*?>PN8{+hK|Krk^ZUT|_w z#efuN_Q1&xZ`xYzu#x$u)6&%WeYoyv>ZizhqxLPR=ePBU4`&{MPM^-z6?Pk`%6*&q zkkN(n?>yVl|5CeAP;|`srsmk)$?C4#&q95CGy*~b!Uq>TS{dQzzsUxNEFe>VKXR zYT{6yvLil6=-P%%vye$ly1kiN>us)nn!>z+Os>U^01n3@NukfaZ#)T{Iv?OS)zcPe zVaMehuolh%v3X}k8sRfalmCuWiF*(S6a?Jawx4fjR#b~k?;`0Ns%4KuF0ntoACnc< zrGg-P>1hI7HLVhpNw1qnytx-ghC-R(MwS`=3zM)+GXq`E2pr6qJ2YJB#sZz~>Eiyg zEg1IXDTGSEusGVIqs#~TJ8!wPzKzt=+3K14-tBxIjDfz(i{qXeWKahX53VwjMAlD+ zHR`wP2cRN_HKk>!hspKD(LCwwVWSo?JcSLY-}yKh*XcaU9&89?t4lFO-4IV#4#h_b zs>GV}V=1 z!kIzMGl+vMVbvJ#2G%k?J@sD(MX5L^qkR7XqCBZ+pJwDo7z)uncdpUCY-c?@iiFU_ zXYWZlwwT22w`TaysMyk-V!@kAwb5*s81|>x5;1#0J2qUIJoWu=_~RhyEOfq@&kTdZ$B2B&5)y-nW=x91OU#5O1Q9h zKz^v}nSAp z9)jOLjUcQFDhNysfVN?UbLS%7hZ8JeJV2*MooAPh2Q}RGPRO^KVyU5ky9(pqx4c8# z5{HFNAggpZEXkS%M}0#;9Zp^)f6L9v=M$`y+hqF5h##zy;IsozP|s7%3HI*d5sZFe z#1&iU-?{2szg=hY7o624Z{bCrcGD>=@ zT;AYdmU}^JL8t~w0{X&rgagmH-&&+NfL_QRTxrlR_hvI?w9w8LjJz%`OA~TyjcORixB>P<(u4Iy?87*6}4mclvb}BA6sWR6X+cUpD&whOSU8t6!fZx~6BH)PbQo~3?!P?->Ao4fz7-ii&pFbl z7wa;v*jmSUy6)mMeyY|Y-2YWS-n+K^is2alLZtH#v$6~FlB0&_J(qk2%Ub1`fXp-{3zpZ?8xTK9yO~mZx^&07Q%V?5bKfp5X0! zFgZgNv%O2g3dOjE#W)EQmj@Q=Ru7fBcRK%M_M{mNN?esTL&81br~<2NeptRcWQ~{X za$4h$8C7>x=$>$6byMK}GyP(}Qm^GgRLWQYCE+wqKF|4jKE>=>hGuWy&M>A7!yNu> zp#d%yo|hNHE}3mfUS%cOlcK6%LRn`%i>{Zx7#*RFeKn0?hciZt4?vZyN*=*`f&VOR z{zDDr_yC+L36`cR%iCbl&150yLHbW~edl$kg2)DVS^CXt!-v@!r>$`s;XJaks+9NX#DG zdWX*yev}*J&##kxGO@=a^|`iD+yO6rt?FnXNuSj&$-aRVNk}4m z8=^Q0qk+H>k}1H%3I3#M3cQ&aSsO|Q_EKqHsuD&xR4C8d&~-a*nJEx@NvT>GI;wZW zF-Mdauf7gIa(R;)abL}kDD*d}osji)fCWe;m^$0rcY#I7=7OUQT{q#xS%&wl?CqgO zP6WY~WN}a@=4K0Lgz?5ILh0-+GHaYD?`Lse2>Q~o^?Fph`1Rf4Igl*es^0EdYxU3q z%)iB6?!xWd9yMCpt=FFOr}r-S2F1-bj&%^loXi~B={(J@o0K1a`P7=|kG}a4aVEU@ z#f9}(t^>sVrCj0Og&#$}j=cqw_al!mBJl->V-Q_LrE*cu`i`*?wJ4|wTt#Opv0U-VxwJ(i|4G@Vp^Lc_6D|c z^!)t?6^f6|-hX%dr#2%^z5Lkha!TgR8`R5zQxhh3a%FG*4X|fH^Gyvi+7*7}#<<5t zU82TF@x%Xt9KX$vmU8N!cFr~)%&p4hepvc_jY}Nwe0N{Yq<$gr*J=i}sD-oJf)uOl zO7a~S@PBoBwJ=YRI_%+mKniB@rtHUMeL?2@DK&1cUNFgi^y1E)JaGtkGGq(i%oLIX z>0hH!Fz6i%2yp?_J3-DZE^g&!wR>#lgWga)VnTk)djVV|KV zf22lIj(A%C!+0 zI1xGq*s_I$wmD0F=_n+kCuAqnB11SvQ**`tHNS%(FKtm~mesCYK6)HeK7z{&H5-03 z)Qnxy)44-vn!A((HSt-KljyU`b`K$YqgND>Hknl18^M>^Vb#%npKgSynpDLYCNFEDc8$$>-% z_k&G@|BTk^EbL0E>lD-hF=*FUR_em^{_-rH0*%f#!-Q1VilH|A<_9!eH3iP{qxUH=iA(**=lQoR4i2d*cgc|H4`vX32ZH!0bk?A zgA7HR#9E}YwAWXhg3qcVV0O!Wbd7YLZWKWcf)1Ngisk!^Qe_t1!_sM;sN+swQlunK zad;TS&#Yemk=#>IvlAMR1~tZ8`cs3uq<16F=HVAGZrbz}qewEX

<~*RfAUz8 z=;Ez;B0$0dyo(UTH$9QFz)?fzwD!Q$eIXuR^kJ=j_OmN=J?)4%BhLmNg*8d(*Z7$)7o=|)8NTIckQYA znS@I$o?6$eP}x^vD(w z=I*Y`BmAlv?<#LoT8?->AN`0GfYk%Pc$>Rpa5$FSl3f}c7+g@vYvUVc zN1#`3T!=?k&JU*U93(~k)J?t2P05>p6bS@Jdq%DQNITHBY94Sd`TI)?gEv-hm8-3a zpuS9z>R7`@Q2pu)pXY5dCG}LnF`?~x_m+llA%lPNmdMs>O=2O{plfdg7fJYpNfI;K zqQ`8*6t4Tj-IgdSS({YfVqg1~SHoAX=+=C8SM%8WE8}mr7BapfG9`K$p3g@}@Mpn_ zs_-M4BA@>QiPJ!UrOaQCCdj}F@J0Zcl&mWG}>gKUzF?vCvv1ijN^zMux!Qw-xT>TFf7`ghBnnxc;b<+5A(Q@ z5B@>l)Pven)Df{pD#XE!qnKll-hG;>mlG&gMF~@7cu`!B$Ha$jaRt)@Z%CDI(4E-2TqO4y3nm1o5=0TP!o(p`luw(9l78c!NLS(GZrPaKTT~Z- zNp<@EzX%I)31v*J-gT zyYtHr%?)Du7fPyWiBJL`p~7bIXD>RsLNjsEqQQ8;w$8Vj%FZrj0c54)p*#fZvE>yp zpYhDje<#jwo4L3{ldOO`W+;CTDA%*c9GRq;0*pE4pzJZBflemulst=^Nu|O7zmu|Cn4}f-9YL-V zof=$zcD!6#8L~00tN=Y&D2hr$txBjA#dM6QTim1};FqIqXeQUj(^sl&^7ef*wmAw}7+e~mZxtJPi}TM%m&HzSE|7+L{c^vq%bS}}6^;xFaXQ~< z#cuXbd%f=2aN~DjH!;2|ZzQVB>w=NYGr-FbV0H%~1RKKvZnS5BoWmzrQzE&*-}4}* zfrn#)1!OND^sJ^y%U5+;!*YQsQx|^>shRCz^6Qo=6_Y~K4Apmy>bjtH-Vbm+B;(ig zt_rj~oRF;_r8 zLpc$O#D^Bw+{#TfZf^%Dx>lL<<6itNZ`U(+JEP(DPthONYJO{Cu21ymApY?dQ9IpR z?-%N;4+X^^6xc1+_{4XE)NTpC-i6N6WIn*o7u3!FIq)G~{w$5U@7NN4^gOAt)+=z> z$!xB=J5ts-wYRIy*qdvo@s=DU?>Has+TCR$QT zqv8LH4x6lWf0};?S|-%+wj=rrdX@Mn04_EdeY?TY7fU$ukl)(om$6tD8pLg_S|y6&bR%V>dmmq*|7Fw?BTBK5N`}#%#7>)>XBWuckXpi?!hhn zk&yd`hgD&^te8*%b`Iov?SeQo;ksU*ax_U^9hC0#4)l zc-uD6GK){Xz_Zwd^M|ZXZNTpGFY!L{tgs6u`LD{PFs^XlQbPY_FiwdkNUxCL!AzOO z%Ytr*6!@xOs8JPA_Z5&Y`K8oiES(r#+RAExCEai`6~Ap$>qD4I}rn z(3v3o^bIs&0~l;Bjp(r#WKEec^&cWV5Eml}nEH-kv~sL`Hs}Y6W$xT;-0^H(?^XPW zx`ZYI6d-H&EW<3!H6&;h;7O?tphZj_`_8{zJ`vAF=1e^SvawChof_9iYS#<`^E9Q? zN`E0rn)UH9B5r$XfDDZ@W0ILL_L>+#OWI?-XGywcvw&mgXOS-lRzb&1vcBJLY_P>4 z+1EfN@D+MuGC#OxTf`bIy-AZ~0I!i12F4twk|Xcgqj#zng!1e^_pFWOEmNfr_ALAR);%0Qt(@^#9B;A5Vh`Iu zG^GXJ=P^;1(J3W-H-;;XMt=9)R{2_zPM{X{4no31I$M`U1FWKU`?(LK84zsQ=sR>; zJ8l`Qi3Zl~HAb;&M%3HFwE|q0tA`sBrg7`W@D(XybPh0SOA4^E=18q$CnE`zY~Qfc zH{!PFjGqs+_x_Kh^KeVLf7>wN-r&R;?rk7x&T?C7<`!pwirZ4tN*lOQ(cFQVsinF1 z9)*gyaFshNb5)K?E89Kq_jkPh2YMXB{kiY!I?u-y({eYh(C`#}OPufy_j<*s<$+Pg zrwt|LEtNlVDs1@$Hn{8R8d{HX)WtMTTuN?STIUKnaj2^&pV5@8E~8Vo|2DV|@lPSw z`*uhvbP*17NpS07e}x=&1#YfKiG{g6OIB)r| z&@@Ls?$BoSYR~X*u4tZz1B*R|rNh4#MVYPhFCD8VVpI=Xi-2OvUK_}>Pjo>vt4O6| zAM(WS=Jtav)VnBC?Ts;&np>h%&0Dyw5@E1hS^%W2}Jp}k*Rkfhob2{ zDbTB#VfYLRO*&DH5mnn^D~S_N&rSsVA(~vtjO$a>;eyZDWcns30qa{KG)tM%H}mr# zO;I$mf{~{J>0h{}Jtt(FN#R-=7*SWjKvY^(zxgV@>sDev_3(@zNRF~AqwMDy#p50m zp*&p#TdA-14cZisnC<4)rlgX`r4A>{2J#kYkVWI*UxmM zc#Vaod1%G&^2_vJ2p@u}Z`@l+kG)>{Dd4uL(-(ZHLJji!;@hwYd+KDJ%l1g#i!l*? znI{?^KY#tTT)7}5MrasccVteSNFJ4QtJduanZ~|d{4ROwn9v*5Sx3`@iB#!FR zjV47LcB;5*T~k~oE1aZOY^Xt7Af@mRHv|f2`tI5BO~+RRrCJ;H}px8Rb9mOexW``&W+6(=RH7wo92@#(O7(l$oP)?*(rG7e8g zyJ)pe2`#$Jp)26xFql8p7lh~kJq%M-Cf73y`3+w_)WTrfXq|^q+}DV zr4fzZ70GG03`&gx%rPoSbQ(l+JCU5;xU$4!U($yn}Ny;jQ&&mV^$3nO4CyteB{RK zg$6UZwfCqqFk#XJ%{Tz(RL+UY2MZfbD_QCJe`b$X(99uI3}li=P(A7*O@P91N z_XFkn$%C_2AA8x~%Q<;RTyAWsIJ~01%xgM_gPKDISNZBh)nercDomMIIT^v z-b1x%IS+flV#R#4^7iDjNs*)!@4;0q)>ER5j15By23Ys2TroVwYrzP( zF(Zg4+PFZ1Jr~M0Dw^wil1KJ$MC#O7HT0y&p7Vv>CqW|DW9m+uJo35rAThYNAZVm@ za^$$+5MRF#vP~&+;8p2Za!SsATb!w;e(S)cine8a+uFOXkbi>I!MC6v?yliAbd1*i zQ~YgSXK-Oy;ksl@+2Mp6gLU6wori>N5UW&?*0}fS?1| zOEen|(v)tIsqm{pp!%#M-frq*la$mfJ%%EQ<`P1)-;~RP7=B0v7Yd~$5TF~{{XFe%87p1<75vqEYDF*#X1zwkvmlgBauKuh1XYxG#=w4YRp z0~RCKh=uDcy)F~qtI2rdQOg#_y$=c#?7~dnsgjO0#>Fh!1cxRyJK6elM(!A8kR3aJ zJs+s3Ke@HI{iq_cs?qws-*5Z9=7%dO5^cVPg)a|I)%Sc@z!tw?o7!Eh ze$}OSq_eZ7seegytz#fDR5x6s&51cF-DW@6&=l)#O7+4$Nb#>Fg=lnCB>b&##ccft z%G&cCOQ|?UKo?X@EpG>0_Gz*VZhDjCM9cFytJ#Wr8>sMOBFFNW%c(h3t!3&*gEI3@urUv*dR$F}NF?}eGak}W%iY=OKQ+73X8Sc7XKpI&QR9>!h=6`bE6!B7cMck zNfQsf){|KEu;oiDnQ;J5Nw77cpVnI6VG+~R6V+KA8AqOskb{b{WAfh!BZZ3OKHNkz`c1Sjeo+C48ZS^4~x? zx^)c^jmuZipMUNBgB|2Tj1?#xk9ZaV6 zD)F6~+(~Tysz&AY$Qkj6lY%>8m;D=S+dKKn%CC*`iXV|rV*clq~tv2{rLMpFU zdcQS6D=Hz}RHdQb>nfPbX0cNOgPMRi*FXo-x|G?b&rD4o<_?|>c;_ntOc^04r~G9}wO{Yn@PN;o0dZR@BG$`kG0 z^x}mCj1fMvHBvyQqiDYGf(oI$rFvper+DzjDcf+DtRI=2o4&LLt4^y{ox;7{V*crh zz0N}`RUDxy#-n4XO|Fjbfp&TDzy2otNc_FT%ibB^PUg6kE9HdFdGB4&BrL^cQ0<3m zj*W73G~V|zjtYwHza`G1yb0o65qH_d3QqQH`NYri+3>i#6E8gUJ$X8G;W~GbZs%cj zM7P|?q;GdAGN%{0Tq9Mp9*)acfn5N6kZv)dgPTdtJovn-etquh#RCc75p4USct{_~ zOFUZ}0^tY<9hVv>OXft_A!p~9n?oIjND=j^;ve@l0u83XqKV+55=i3{60Vu5d8O3% zSW3j6%|-U=7($^(m@lrbHk$Q5hDRW$&;dLtmnzGQ_*})+P3mM(zoOK8l-9CMNdkwl zq6rB0(<&KYzC_F^9Hl}1<2fc_f7&JV_i*jY_}V={0s;iA;OCKUWzFnSTViiN<36F% z!)-<%s!(AsK~K$i?acM1lIb%M7R8ChU&f;Tq=Lf|EwFZk1RA#@@ze&`Dy4--oWcRM z=jW6nCDXw;dGPNeK5aWS)=Lve>{!Yp%OCX+bIU7p>#%dzAMy1zhAz~OhSZa{GXqF^ z3CSSKA+xB7^J-PY4ZDSN($o+*`HDW*WT&6Mi3Q&>uh>scN7IBJOYyX$Of2_~);T^> z-5Ebv$&T=TN}$Z2s3-}M9_{m2RGqD27OJHa~9Cn{k44d6_~&c=j!LokWiU{}^CIm{J_ z=V?%nbPr8_;S?n{efRO8ChD4)p7c8@CdCEYB>3?LJKSne%Tr?523dK(U`N&=z#mdt z+q*YIFyeeP&du3*q%oWAr)Pxb-iX>hrE|8s^SxWe0^Y1nQ_E&c<4Ewy7QpEc-_zOc z2y=MMX&*=6|9p`O805sWdv-Az0BdQOti+!T9ExOKn~MWYAvmiN|6_s*-5AA{C{9A4 z$PBE|2GFWaLB4^zVbD|q%-3@mx?EYUl>~lldm%IIO^CUKS-Q7j1t#&`3j6ga*zQKQw|?VWDdX3 zqt2KDH>L?-O4L|6A+1qI`aylq;1syv=``Hd*g?Lkntyh^`pP2~!A#4r>hSQK!S)85 zsqQU1X%?$pe!0B3TuLZ?lahq043tg78RhLJu{I^v(3MmV{sZBbO;`O|^Yy+vu<~(S zKdZ;Z3bg?a&>EZCp!ftYVWL>GY^7_I;p(29X>PEZQ}fUyi_NUJ_;oAhj+Fcn9~t$> zP3wI8jS_ZIB_L0O@cjKzq}8nyIr-DMF(mY2`fQFm?{@4QAiq^@yw4bHAbHJY6wjLt zDoQX~!`3^N!-{{^HS;LS2b&egI_~yE8$}lOxpdWc7?Wxt=LLWBUvBWxY|8r-l4e`~ zxwxoV!++vca8t<9l7o3y%^cxAYbgE6Z|h4AQ@Js*d>JwK#zGO1svTa^eMLK=Y>!+` zxPs+ZD%=)|toqu}E5V+x=dp4V7engqVut1w)1D!e@1Y(d-)KZQTzhX9khRLLrw)r2 zi3He%z$!_6f@SVA58NJ$5sjq$Gh-nUa6t#U?#RbiOO&;MxyMBBk@;(XQn;KULFUj4 zDqdoF!&2kD68@>8gw$Lr&$HN{5uZthCTLKx=ab-%<<*K+0~fq6W~hXn8AiKx3wzGr zZ_6?=Eek-E+NoLgp7uZM0}{cfrx?TInyPl)}B@k6|AS>iGP; zJlYp^YKj*A1ATq|_r9yw)q~n!#X}7o4-%^+SO1;+27G>!SC4Om$p6aR{pb~Aobt!d zv$K1swL1Evj@x~mZ+-6Jg!_ME3NhcJb&SXB~{cu&{4c#d!);; z)$Qyf&Yi;cP{d$K>oMjATSWIxmqI=Be$^ixLNIn zDEIRPb0k##&|qODrhR{DYpo??_ak3$Pq!{+g))3!zL-4IrhSH@S0npe2l?q!%K zg|TVv!A!lLe8!R~HcV3C?uI~xIiz}ayngh_3(~Bt>N%tyKr;Bx4Otq!^>t`MT(6FO zdv<#{7sG4x-n$fZ2A@>SB&0GE_3!@Ka&M&tSe!zbp*e!4UJ2+;QqtN4m8GVK^pV+C zgLIaylt_`b7sh|g6$pN)0`Zc(SNCC|O!;RBd9c3S2Gjz?NfTee{WRXl!&Aii0xZvs zoaf;jZ2O`NC^JW?Rzetl-<{r7So#j+#DqH5$=pOQk4tU&{Q)By;NO+t33_Cn6Ow__ zPqEUg&DgGlt~GwCBTnMcgL1ZVEJQ_tbcL;!)8?7FIYei#g;idtmBA3}*W#5|DjjS^ zD3Gm{Bm$wyz%XC0AGpY;*)=in=_WOFy$4=LwS*;aA+poErL zfX5WgnW?t}6Nn&Q9Up(s@!66+9G1^(yo1oAg5VYyYiD>T2gB}XBL8RL;ZLS1#Rb-+ z${e}?7p+mt_xw0%lqlT7_XYAB2lRVVRpbjay1*F437m)ROo0FZ$?nH{1BZXQYp=z4 z?M!FC{wR5tMpq)Rz;0O86a@cI)G6)}Z-M`mRf`X$Zag6EC89Vreh zhNLTV9MS*Gsd+fKY@}{N@MMd22cK41s0|5syQ~(Lj^7TSA6mdqta$3+E=tiFkLXIS zKRRs-ov?KsA)y)Y)OwL0rCP|R0Tttveeq14+z+~yzdgb=7If=RWwVaZQtO5PFy0x5 zmKJIkL3#N)FT{O~$vXTtw{nkP7bdeeQhqEv@bb3OmTvg-`X$}Y^Ok?$b6Y-zjTM^w zi{7@rw!NzIi$S8E#S^=87bm85WPu@+;uc$bYpAH3FJwhy*~=}XP%%qKXXxpRHjkE8 zEeD=z&1{dPkdX#^#1)T-!-*3GozvPcO>}h$Q64QPj9g$MSn{$;|I66IYP@D-9{()d zARmpEE=QUWaIm8PA5IN`ZNPiGz`L>X;ixlapWP`sUo^{X^Px0^F?}rSwWj}Q6B$TF zOZG!twoF!%w+x}7$CsTd|2)azT;$ryuB-qN5PA~#!|Nkn=}Oom*aRqCO)b;Xv5IQ+ zt#e%-(e}bWIh49&>tn*X%^&U7rNovESSG2v!SkNwOG`@nn9?e;EnOzQpKY99ym00e z-(JJ!NoS8U&-+ST!r1GA8}C1>)x8xPR_>HLEEYPiQG5?2>8jb$qo&!vg5Sr5w$ztU zix+o-yE5)etnB;tDrb9{b{gA!urW{!JO6x9(%H_jY^wZkyzP}DUzJkX;0`gJk6HkG zSaSH0V%$PYxUq2SK=F`G_%>2Y6FYL>gmyi3+GVR%7{7bO3~)%lrbJ}Jtu^}xeiEFA z?C6IUST=Jn&WtC}lr$qYm?>MltYwWI=g-{>%vd#b!XV+*!dyD@m6=ZNpvjkcs`&Dd zn83%~;)tH0i6~&TggQ|8LSOM~T|jJnqRTBdxYn7;3A05?Hg8iNwWi}!9{_)!(`0+L z>;X%vJ2dxNID0yQSP5ZDV?D0&%wuHeG`IaKX0)P z8f+G0i$7!sQ|hBvPY?Q~VddW9t2L@8gg2su`p*JhJrD=xtO_qgRG~v589#fHtVu~h zL0|%YbVlZDMQ_X40(p&i=CO2|hI#%89#r};?6$;fMfV<1Vzhb~yHo{BvPUeX{={!^ z0@-qC$XtM$P%vzAoqt{CMbSCgK!wMV>*D%_^(r7Hc6kl-=kCO@Q?nLc!J27I($h!9 z+nbn)8R4XPooB6tHUvrtoE?eJq*>X;>r4lZPrXh$4!f)MkXR8@A$P|n z-NjJkAMnc`;1@e^0W$+YAD3)8JM$CbS4K%I2lDaevozWFyew6~f0&Z&`?J|fi1+gR zuXZANOi^c);_yOfDhYc4oZo>>n{(=NOQ(64iYgm%)Nb>~|5kKZW4EW4U+b3w|CCYb zbRo2{cpI8ElGKyRPi4a92UoQtvqyGhi7}eOsqcAzCez~WX40u73+YO-uX`>l6H05I z7FRGupOHNPQ4&#U{pznd&lfeiyDlC+`q8$Pki;(vkvYW&FY)VLPc2QE4adX?qYD>Kcne{uv2fdaXim+(TyVM!<6wi0(>F|oh?7zdqMJ00e z{s4iA!+DPEhXTDf!2A7_`42>=97tzh-;oX*c?5MOiTW&8M+^&K{Zq6*b^ z&U>ncYWFVmi7dGXt@epF^D;k|H{=~|2J$AjRt*GDb?y@u=Y^N8B*jDKS4BuVGG?`B zn~V0fFVf;sTO9X8BSl_Aia?8H7G707nPZ2+__|034YkZG&6Y-%5ia{-Mf~}$ z*GEQ@B6FViv+6a16OXk8{{-CQ6tU=8qsy&a{;~S${)waMi!#a+tetb2=c||FQ{d&- zziQl&WUrfbG+J^~)+|B*(Y-`X%(i<`y6)8?vfLqzJKnqhc z&CzQbJ=fVRgNb>?Q}x}%Ep{PS%bAG6;;=`#y6pT>Y`3yqI!8IY^oDj>$SM0g1cOBN zYr%EB!R}qTPFGH(E1<@~eS;LcZ91CwJ0^2mBO?pD|D-tOt?&?iqC4@A3s!tW1>sp< zcn3a^*a92Go)sGO3{+4-OD{g%M8Uzg&X0hpSWQ|h;=qqOd3aOBjc7*XY5Y?jmir-M+{@q` z_k_WlA~zXr>43pgP#@{kLMH4#WNSHtdv5`=lP`x;iPH|>km8l?IxnMxFOv;8dHPLD-~zhAdQyIVcc30TagS2C9Hy4+S4g zhqpXtxEwnbybe!@L{lrxUdLXw#FFhT=n?xoGZercA}py`9jY{x&D*`tokO1I z?DeXw8YI1nXT9?9(vgI^Ioph5e0}uohcNTVl5X7|t$rb{<}5MSP|LYqir|D_SZZe$ z)Fafc)lF%rCv_cXwQUxu5!LBAe?hYeeVtla$m=w=c&W|D4dvPvLCd;5IN+g2?r5pu z78Wgux?mQXY%Beo(Rzf}^247ECJ!HFrH29{9iTcWs;Qry!Xpm&R8xhx$kDva8Ph*J z_71>aRN%85+$zA}wb}e2drZ?8HJq z!7d=7{pf3)!0(M$rXJO4%rJj?RGg_xv0x*dO4(Xc0$Ko z=a*F0>Xegv)OE{|pt>vEZ!QZh-AL#PH^w|#OS>01-ux%^m9?)P>aP%5BbWp2KQ9k5LsfPnA zkV-hZKG*V^p<#}c8ZO3I)w}C|7FfA?GWfQ-7_S$Z15&jk(Sl_qy=&`){Q2@$#i)!O zWbsAhzSwqRszyH+Z_;e;F~d8VP{03jM9of3*Zu~r8w^R-Po1VQ!YuVuOjGz>qmjPe zeBnpjpo=paqb=t=vXSLO#~iS15l~8%m9XjZ>FehNGqaGWX6=&0kIM*N!9kl6AlEmt zcqEFrXYbfHLdLDI_?MVP!x`qOiXH(G!oMwRdweW6_*v3}oLTij-O2u}bZ*ukiPP3b z6|M|yb$OO`I-$W&zb$?c4s5KHPB~K}nSm&;aS#t$JL-If zt;tH!wNqj^N3{;osr7z0+IAA1mSZW)i1!yi(o50<0La;(pGp1B>609#HkUj>5L>lv z*mP{n%}@p!bVK~5%Gwh=n$*Y}3D~t(YQt4p>8xhu_#wu?uq5 zK}3tN_Q-T+HU&Exj+)f3j5GrVP$lt0pi-|#eQ0bat#^#RXNm?NeQgq@kWorEdVyQCgYQF%s}@WOq~F8^BPr>Dk#d z(^VjwM8yj$1(x5FS%^zk6z0Sw+dOc2NSWmY;-)O6Wb8v@F6#Ty>VF!M{8(u)^}Xy5 z{bc6Uh2q_she}d|p!W^*gFaui=l(h_YR)BxOH{JmRb|*k0ClHM!5M?8X+HpN z-wWulaR6lL*tJ0ciYvkT-V-bne(xPE9RGUa_-E|xEk;UOapDs+D ze-=Ic_}U;$jI2rA%N^!(O$m6CyMgKS)O;jmYu1m@rk#@~h7-#lLP2;e4>8&ibPaPc zlrxBl6k~H>tKEh^zdq|R$lA6l?z4i6Z8=*VmGGb`*wyN$`f|0frb<`CiZY0ZwGt&`#U_%S{#_dU`^Kzx{cMDfIn8e54|QJ;37Q=JBa zn;tLm2zDC$8k#uxcG=5`W_veIC)l*Ix*{Up>S#Bt;cjG;=gg&0L1E9QGl9QcG<&es zd0D>}USc#lcj`TYy5m+wA6qex4U;E^<=q3b!%pkA^l*T=rCLFQ``USSnq#fhmJu6@ zq|g}Wj(jKnkIbBfKfABL)l=gce{6UYyGx?k9PdHh>;g)$xVQB1o}w1NnI%V(pF%re}ggjF7R|rc$Dz=g}c}bfwUE^ zOrI>qZ_s^Fx11NWJx9mDRey<>g5)sCSm85_Nx^R!L%(Pp5p@cyj}eR2KQMO!V)f?l zwFFlDhODwPMY^Qvp4<1_y?xs7-3WIt%6^&dJ&_@zkVx~#g6oM-GJFMdw;*Bhq9HH1 z7xRPuy;1hjo)|P=sCSE!eNfy}n;<8%h#XcosC=ThvQ6?Z^S_O$9pbwILuGn*z`>S?InOg_g6qrW%EabQ1%}NryX54&QZ{y^&H>D99Ch}1S2H7`AZJbsb-1hs) z_UCO=!3L`rm@R&tbQTWiDaAGmtkuplYr3T~?SUI0WlVtLVsf4J08PzL9?UKS^(gj% zDP^jTd4^_dL^#V~Qvad6Dy(4J9(%wA-x5_!<7ju{RC8friP9g8q^_kkQCde#nMNE> zuZU@QJ|DcK=;r0<@DriLr=wH#L?JgZy096kH|ESmH%kA;E!|{O-ST0{W&tv7#y_%s zD=9HaY6qAR^#N)VcWTY-wV^GY^J6H~z>Sc)>eLg-<0y5yUP2_x?MtwiWKazs{3y#K zef7lj$r+F>N{EQE&_mUQ>G)gQkvAYDOG$*N)1a&|Ds3q68{E-H@=3R zYRgssiR7GGInixY_K8y;YckDN#HKX8AmcbT(WUo>o0FrT1$EWuMY_XJ)~RCA%Aokc zFF@0n1<4Q`qOeaj!Icz`2UQl3mxB0PQMqalSw zn%pTu6#u?(PDzOMSy(TBH$@4L$Mb)l$fw@i0)nXx3<9SG-MH+NX0;~=T`4rYSYpqJ zOhC_mCsn3<+g)|lI0w`=fgclj%L4&m3ktoK3}=_s`*6tNZFljfI+#9lG5yKoSe_;p zR^xZ#rO6}jXW^{!wQW%!W}s$qCxOCLBfkOM0u4~%8WW9yxh5Syi)+1| z%9SQ1&igvub2bjRtr)9#g~jcs`UHYcs}JgC8aia9g>jhBsIT@$s;+a_K7Zg?Cqc~G zk4Y+5<6h@8mUDYMay3Vo8y4P3zr+(_6En3K9MsmheOvd133w#j=BH=v0^wiJHLr=H zm8QrymUV3XE(UEGA+-}KZjA#MTpuew6+citt=Qgse;|qL(mP=x*dE(gw$OmY@>_Es zWADpr{)BtG2UMOPA6g4b9|x;vga@cQclRjYh4NZAgCq;KDO@mnj(q4@RlHgb0@J`S z3@qEVQxbYkGe`jaV>MG2XGBtfr14{brX@;EW-^BeaRysH^}PR{2|j|-+dp%WCeuTl z-$rU=I^~k?lA6}OQ}!+72aY)+hy;!5Ew!!d4jBdb0dQ1U@S*4LDR-lR2Wx4G3m3f{ zhrQm`7LEz4+`S}j-jdMwvCuQ)(5!#R2p{6vy|ewrdSx;keIWhd5ynfjyrU^(VC%ld zfCVR1tGD=j?8v_Da#vVuLww=vz5V->0h_@d-MxMGIt$$wT0e<-)T_|U< z#k+(JNDMowJNh}-Gy7IS(g7~4#^lH80n|I{>fUR9&x#Dl%0D?B8mC1)>O)cvjr^xd zI3MLI3l66aDl9OJ|6mq=LOm!PB)z<4Qg`-SM#oJnY%}QGq<&DNM~Yl`2hoE^J_n)% zZkOdDWmIc=5BiEdpRfFzTFbi9(cK4yu^ai@)cUI;ExIuC9_GaUDgRAES%AC0A4m3i zvxY(;*$m|gEk2`WV^c5k^!D(*t`Z&d_FMYY~X_wTK?W!hZ}B@sUC~#=N_S{qA=hYz7-j6ms z`^)O{IzGeYjEA}VE3-vUOvp#2i94Nd_iwPUXzFVO9jG@E%|K28eKG+NbGKuT@6`Ja zVzG8^B_@Si_eES+dMq&axCu?oaZB+pwN?T(OcR@F-!p}|vVWAsFN7?iSat8+^;M?p z!_F7wh7d3a>>Q<@g)#FZ-jZdFD1et=SB#NK=^dI$NiHJkvQrNzrH5%OrUV^14A>>^>?fvpl%# zt*Pqax&*0qF42Q@fv%N2VO|ajeXJzQ4trC;R0kUVC--$16E*!eSkB0s3YZEw5o8}i z&1bo~J2a5IlPc?v*9rVzfH^U#3XPf{o;@ah_2L$qHN#_^0)Y+`l#^CUE(gN>fDMl{ z@D_SZoKQU)R#`iOZ{7uF#Q1&DbSgy_m~^2e1gur*UY%HFI&FjhQ5l>{XNSXU=#B}q zUpHqD9*x#Y2Ci0Q6Z!`b{Z!Ra7}GKg>0wgLWGv2nVVoH^ee{` z=9U{Ijsl!`QJjf>KPc>R!iiuiiB;~Vovk_#T7xxt8ntj%m28cpuj=_BHE`gM1DVfc zkF*v}3g%UHZA0<;pDtZ@Mxy=Gui6aabh2= zwWu!SoEQV3uLU3rSb-k0IhD4!f_>lsF;y zS2_g1;sMVRJG+>(!)W7kKuzr%ir#$95vb8@h|pTs!ClZ5YLsy1Yt+7){zf3338<^w zk(|m#bnQnJsr0&*OTs-C-^z;r*49RBoO4$DA^(Z&8zw!;+d)ekjP0TBfa!p{B+5)-Lj0uUT_vk+$-& z^It+r zMn4JXK#DSqA_Y_=&>O}!*gvKRdPEQ?A9_?0rT4w7pFe7gBnCwypU8)oid1~Rj+uB_ zpeB_Ma^_PzFgX;{lU?L}2hSwBvU}&FbChLJ=RqhKc`zX`xF7(JKl0+h2AWkE1+H&l-bK%9v3EMoqcCacT6V}mx-}& zlN|pvh-_bsb)$-NX+U{LSb>KS1I)c4hxhP3e*nkJ3}>73THbcJnSFR=_-?HCG+GgR z0Nv0b(khTf=|EUU5e+99TA3%5YS2wrBV})Fgslb{%B;BDd4KY(ZL8B%W>51Vg}xOT zvffJH_r0?$r7?beTt5~Bl~Up7wG=YKfvfacv1Zil-S|SL>Iw$Yx()(O`?QR0k+R_n z9_{;~1MIV&vKyBzK{8rG4{pc_V%W11Ln7WFQ`v|lh8KVuG=8KU>3>ok?5B&s&)F%X zZlAGLg$~Y6@jcsnaPTF}cs;E#5P*`<<;y>01Gu9=r0J><#o)wS5->PQF|X2R?5t2; zJ*fLa`jiv`g2LoEW3YiI;QgL3H_n-lmP?EDsu4};3VDX~Y6$RphcZpksAZElJPW6i z`_r#=&rH!2Y@&`guA~nzhv@GT;_?9z5-Grh7(axckupYu-v`#%y^8Yu);*~Fgv2fl zqEb_O;fPOMiEKohtAFZ$iMsqRF$FM2=nQNG!_OFvp6mO{QiV-wH|E_2_|SfoGtneF zN8kZTa&8v|qAsdBv+DjzO#RA@*@98doqLu8B{Raz zmQmTZE)(3-dc;^)<_V7ec%z&|xqr%3wtd#jX0MzK9>^7m9{dq+D*cpNC#*DCsxwWs z2_skKxzndf{1E%?yB_xqTUVTMOX4m=(Sp4alL7Lxf;@^28M*w(ZZ> zCsEND;dzkN#XKmt>+-Se^6}#t$m;TN&(8Vv^RD?j zjHcpc*-6mpZ+o2#tQg~DksEx^(`;U*cc731|LjteS+(M$r0}@-3BpqIl$YW7)o&xA zO}~Q{ekSM~uvy?AMYRNJFehrCk0Q#qCTvC~ZNs!QoLX{Fh<;tXPcVDmJlZuq zrRQ&tk~0_f!=0Njv5%4U5+Vr~0-OmAg%uv@@ggK1!_*dURwC6;O@|4y?^DbkbNc4F z^ZH?m+jEi%e`lG}?l8ShDaGjCRrbg+sJZ9hc)OEMY)yMS&ehg|X6w-SKr!`cPK%{t z@l?$E8JR|wB7&7`k3C2yGwH3uT0i5C1mCqYzZ@I?HoF)F47-g~GP&v#J@e11(gh3o z-JE!x8pGQP9GR|G9Gp)&J|&7FNq5JVlEm2c>EqzK{ZNo*2`K8FTIF56OUVrhn)*AM z-g}!9O1_wHn?$TV_mFn%BffkH&towdMVj%pK)zkF~-o5-IS!f%O9*K5rl;o-?dpq^dUD*-^{w zhGj?d{t@^!WN+(#w5fYixB{aa>RrE7_7c)N(D9ipm+cUnz?H_Xz5_XLcS=6pc??Mt z7}81EsPY^6V=^waDLCR%7MzVF&gOA7#LaW zJE8>M5#<~QGdE$C{flx{XKy5ygD0U%(W=ewtSXm7+lLg3*Tk)Os6GJ+^|`lKL%Wv# zc3imAE_~UHCb%J{_tDxY)lWZ?3rue^>c0*klM0&ER)XmicF-TJ?+>8@1#q}sK1rFF zVSyu_H+EN`3~T~%Vq@_{CJlF%mQMZhyw2QAN!C$dM3y*X3SxFX6IbHoF#iLfjCr@B zOBhVfi5oE-jRt)X#6uLd6)3q2aRg7WX!GJo17Nb!6=$T&c*A3~sa@OVFIE;=88 z$RptKB6N=nHzz-M0Z#RNQ6b73dEfvgE#Q4sU9z1WOr_WBwsDor$grb0Y(A;-Z|Cbj zL`&P^SzZ_mm~)uxgp0JDzH>3I^5wlpF7|e3)mMd7yBM)rM-S71iFOA(D^t}9A|s$u zwvHz6-+=7Q0h%8g3AFV;>1}0yfdVmCG=OD1NqR=TstUNakaiZ#h52^RrwU!cCWJ6k zP}Zt^6u6CN2c#s=o7|id$PU4SCWoQfAI~8+4?_E3RLDD|N8aOC(5M%t?y#J$E}pu`kP_$2@Q?!uXPP6J(DaN^1gJvVya^B zpV584v z&XaOCh8WADS=)RnZ(W*VRDDi`=L6Bu^KCzjJ-1VeFZ;wxG`?`F5z(3i><}Ao=yO+^ z?;A~%xmK;+v=V#Ur?x}ZJ72Hh(!B(qbjQ)Tg>QV;sA{bVgzrM-Vm-;vkIR)_j~-t* zC|ap8`Bwhp&e+O9<++Xq9*RqA&+5i5y)-*l+-R{6RyDiyuUB&-Lq!8zL!0 z@sDMv+S%lL{I~T8I(IU8`E1$jj!O=i<1kD+AH9wMeyIRLjLF6)M!9eeNqlzMaQnN= zWQ@zV(_;kGs@*_Y%j`_dC>lz(sIQ5NG8zBLfhGoJGGJ@`A8(kHv3Q_~vUdcpKzj4u z^E!{Qu%8!BePaJoQ~fADE3Uw@`mq`-9{FG-5XBLOkEClUEvR3wDy)^GJ`Qb}v+YRB z-DU_9c;$OAyiGf*RQk9!)50;^WP;(sYl+C?%J`=@nu~e$L}~>3Eaq;W%SeQ!roN~Y z247+&o*w;}@M*GTP$SaNzeoNq+|C7}4q22kF+`24=jV9RWDyhZG*a*quR5>Rc=(-! zX06PwEAcnT4G-)sKHgmWL)HlVL?&pzNu9wI=q7-_@wT0$d3sMrW}Z&4ZUGr~;9I z$9d0ktq@=EBdnL0THua0P7pjGHe*sMC-PLT_;ILZ^b5hi0o{HeyNl^$DwRY~LY=C& z$im*BV0W>|eDo}HhGI~_U9jfsvMs@2rQtr!0{kY6EsraaOHi`iyDFgco<%^AO=KOE z$EsQ|D1t#?Md~)1HR2VR3Rpz$@Y;RlcuK&2l7uKG2sHQWSixrD%7R`1i_enZLBf;nmif_=H*H!10}0;=Yr5)stKn9k`vi3Ln&Y*3mIGD#oXLbKEx!wn;$ayqwVOw6_>?jLq(7g?CETpp@5 zgn8V1Zm|SdY08i4HVGVsR|C9UPu_}~I9&qoxE7ynlcW~u<-pwa7UPjV5>9rYKU5vR zKD#HG>Bb^z0m8d&r^ss$j(Iu0t$!l2rcuPTF2{%UOQ=te%4lkMaO#63;h=1$TB35b zEw{F#MQtT+zv5o2Sjb8zTf{w;OSpbUNa6*>jJ^4ET~$!)&+Yw@7>YudHPdHtuBEl3 zBR<=EKgtlCP@gaC_Nl9uEkSh9htTnI`Csc=^-&!+t^TNZ+|$9&zP-jnxQlH2!7*UM zO*=Bhj*BU?(ffI=HA>zJ<=pITC0ME9neRbAF)YoC1WLF_PT*tJ`+r+*p#LTdC0T6h z4ZkR0*P)PB-uuB{AR7ZZCZ9&C3&DxkOoiUAqOH8mmea&pVD8!vqA>%$8_=4@X?dHj z_Tu944?{vN?kwTAPdl9?n8KZ%UM7ZBr+bP4grkMf_@(>k%#<}BZmi;>;LET}mvJ&- zUGjgsRtolt-PV?OUO4}TKpfsrx+(@pDy0v`irLpm#{>;M-<@n5zu@Z>b3CFOH;^B& zSiRY?&kUu7eDwD}7Qnvj$G|@6Zub$S(Fr&A< zsRghY#jV2ynn_!TYbXI|6wq!Q3WsFXivo^cd^z3P+D7bV?LxP`9txw#o z@vXr-;KLFTDbH8Wcb#)@QXOqx#-)}W>ez}=g^!y6YAkbozBym?|2R6&xTM?n4TB(} zl7TBQHQd`k(y*-Dl`FS6Lr~o1NHcBVMnzL|K$5BD-ZLvJRNQF8J?b%6L#=F>l~2$A z`}^~j54_{cecji29!Jjs<;P$+^k`s5p5ankE`&`*B%v`>JisfvukG?R58xXLMBd5D zWF10+twO(EdN!1f%kV!=-Sqmk2-$_IigifGh@oI% zp>vsGWpV#lwjJrXT^=IdIdox3U801HJ){9{v_!zf%p<)L!+8SE%`Smb9)^Yk0a(%1 zaWr}b48w1y_*j;LXARMeNIeA6eG$n@fk;xs`jhPhU2Z6XC<795WgufqIA1Xq%v$#7 z&8=7Nfqr&O`fx!E1_%_tt1U%sO;IB&%CU6`kFym{a$-(~I{_~v*Opd}O zcjXX-6JVZFC7I3oi!Q8bAgv?#rpJOO)~?+)vgMflQ^l7v=jkNI9S&k;CS`M?h|AtL z^1!UxGUMlF@TB(VfbN&b*GXc3EdoLP2^^n7Q>U9PRL0TJ=B|ICHhl*gkD-s- zaHE9zPU&IU8@AW=`OodXp+NTUBxZ=)e}Y{Ol)X3K<&@X_j|gt38X!vtzN9A!4LlA~ zQ_3)!T?Wp=_NJ`9u07kE(h`hLeDEYYm>$c0OaDZ^{Ww_q1$w0gWG$IjkYdzj8@ir# zUQc9XBqGg6v?efeC;8Z9f%J#J(et593zNbVcQSVjBGXEf`=t2gnRda*}?IkT{y z1|Jpw@W$B~&8OW`Kv%?rdytTntC-U zQ@W(@(I4{T53FiuS}0imRqAYGJI8R}SY7Bj_oo`R8)hBa@~$84o*3wNMtb7R?sLegzWBp(Q=dbR zjXBEg>((s3Lx_7D_}R4yEr_GdX#*YjaCCk2!GCbnXMG5*1aqf33s3;BxJmt#c+yH<`-VZTd1tv z8F*sZd=Pgz`-~xwf~-e?Dx%)k^>NT(oK{ zbl})kD|*a)sq-gM>TD`@Anl1>btYMUIW25-Gg_ z>N1h^9u3NVCC!ScxYgV46&A^EDqJ9s)*#cVU!eLU@P}MVW0KcwYnj2%e!Z=12~bg2 zuB%qj#@p#v6`Pch`PPw!xth9(iKU}kwpUteWwsg;t&`kEIx;?M1#fEJj?op*y5B5t z=AlKjx4p~EJb2(Sv??~;Wx0&@=-bW_-w!oGaX(UOIx{J6N}`v-Zu{2R$LpdzdT!ej zE@10d6WK+Z2=BNr({sxgyIKNzPUA{UH2tAmf>c*wTdorUAYl^|wq=%Iux{ia_rC=) zq*XQVeUr@)1PP`Z@|hykJC*D~dRd?G@2ewPxwNg~WAPfjVy_-HRck{p>#znTFvk5GNlS}1m1{Ls}Fa75mO{0;3jOxtrVgE_MM-B!G3`r zf!yFPk{4pj<3;5hUva%0F0|u3+-JQ!^mZI&yhLjyZcnZR%uqVy^8Ez2Y?Hino}P`i zY6+!`Bv=%zK8_hyaJB@DM2T(g=f6trO37Q8jTW&X149v*mcz}q!Pe8xiD?8%`KUDt z_wc$hjO#Hj3q(p?@>K4Ev!zmlf69uUDrf+M0(Jakl`u@Y4f@PruJY*1RDy5t8o;eQe2u;IPECJ<(1}V#0g)4PC zfwq`j)70kst1?H)m67~USVoJb5^gk4=iV z*zGM-hVe@qvM86;2`j2CzL6|)T`zI7+MG9pj}WxV${wd@iqN|V&?1xMEy)Na)Ff)9 zM|lu;)DI@VZFx@Dyb8k`9aM1Kd7!TQBk}!kudB5>DZ>MX71R-xOh_-74=UX1>{${A zGmuBruy|6kCAMH#q;>qILqR^!G%uQNq>pC%hwn4wS0 zv41qTIcJsHH(w5eC;PoD>|f;2z^Py%GjOsQxM12#f&k^AhU7q>rjqoJ+#-QraIx>_ ziX2v;z}@E6?|gzB9vc5LhYjoudwmnZFaM0mqC%}^k2lx*v# zJIEYbK5g;_vIjcV_dnsCF@D1HrcQYUHziKEgblosFFiL7;5o2*;S@dveG>55F$UXt z{2v8E#Xn*f5#J@yg<|&VsGAmEckVbipTG}*;e5GDRVoqenLiL9%lAW{rV0)6j*8io z8doCVK%ZF51j23^HHS(OOU@>NvlB}3wPJeqRWyxTVOP8(r46}Kg{ggd*$HcI1fJ8# zhJZ@Ez>D^y%J-X}3(bN}HJla{XM#pE@k*7xK_ig~(wVtp$1s(Za$3fGYQ`gTNf6{N^aUtX9oSFV|(X%Tg z&rXjk-H)Yoj_wbCwi064iY3*I=$9Os@(t{K)yy=77ta0T(=5#|YaMrdH`LVfr0vvt z3)|Kh$a#EKVBNmm`<4lu=zTx1@BRlWIAMdo>F8f*!O9fA`NqiI$29=2>*5fP-SODl z&z~x*Pe`7czV=wRqWS{4Wov)zabqYZ^Q*RY;Ec5;-R0y!FRgds_#eIRcl-X}SV@H|V?ilDSY^$9P51jhD_Itje`S<+t zt&N@9h?Y3d=;@QZ+R}!m)B z91=qF%5tdvgd|{GFwdwFjn_U0YCdpplm8SE>%U_)(B<1By0P=B2r*)xIEQuRjeeJQ ztraxTnE*mQ3sW9rJEHpng{w&3M=lLa6`y=MuT6!?>t8nx8MYeYn47Wa=&cb=|BZpr z9i1x+b%@A`yBeN2KeBZ){n^p==*{;ZZ@g65)anRs{aE{BOlKV!P$ znAXr`lSAoF3x(Em^PF6Ij`*#?Rgf?pJ|F@*->saTQvN{w!w8BVPDd(TPKcLXMXzwU zcjmELlCZm=b#R1~AzwJ}5R6W0|`3h@8Z6F9ry1cYgP0{qHG!o>H!?ncU^r!5be+O=M?*es~*+@a{h9pmW6=3s> z6Q5f4bL+6u0AWOM4GpL`chb*cr}JzKRT5C~gI=kAsHN^YZ zaMv-cIPiqr{y+p_nIfo4k=$aDKNA?|Y@U~tUK%`?p1uv*Vu&3RX26cgzrcK(K+3aV z7>*QGJ8~Nlyj;e_Lp^?3JBx9ey+=)md`q&LIvK?f`7l~)lEbrT?)?HGK%=A-pSS)=$Ul|NtV_1t($ zs*9`#ajnssGTLx?b**7agf}M|+c&f3Hyzw>Wf8OdqNpxw{cFNmhZxeMC=JKv#uS&o z13^~tA!RE*Qk@fg$^KAtqOO>0^`6#w-z&H|L3T!j&IJdPAS((4u%r+*qqOVN6@?UG z?DuhZ|3dx)C47tv*hQ~j<(tiuc2gc&T(yWryv^|+a0#m4ydc-PlJ1{E4U0Ii)$xKO zd7V4%Z?%xR<1_YimisUv+`**eqzYq9f8Dc*oBG!1sfp{uhj!_OQ~xGE?e7fvbBM6z zIF)({7q2>22+^9Q=sX^pugL%G;!x$fv(or+C+wA}%dlNvYe%35@u<~%%}HWQ-uKBT zW5!wsrTS!QYF>X_B>$5K?V8r{7Y({0_nVv9i4n-X`jD$XDRRRab$1{IlVUX#JQJ6t znewDU1YQ&35DZ|=Rig%7Vnub`0%^LECAyylEH#IXo zWILzNHmSDj-fva!n!Y&Gt`aS%Q7b1qpuIg?vm^tG>ToRB=Ipo-YXbM~`WO4gV+G9t zOhrb6wU&Z4GOPL7Y(e&7;bH9pO-uyna~R#ui+UKnimNZsHY?T?#o-l-dC#f-P-d0XqB7G1ls5t79nb0qkceu5qPU|&HC6rWf7uCjDMzM!{?+Q9S zLp!fm@;j1vJb#`t5Jh>GFNFGQYD~AR!&V}mV@6^|5ddq6CF~A`43%QP@qXRRCGIG* zU0f<;r}y|bUe!#%8}(!N@FsPw+Q&bNqNV6X)rr;)9^@P?DM_b zdau)Qmv2u#!V@`dLO0%yHWH4YrfTEqZr_aWM^Eq2Qlds~j32wor4e+>YK>^e0OK(V zzel*c3Ofd#KypkFzgT|-G~bn_btBQ|Z2CZS!0i5kQHA86c0BfOSBm?;Sj%t9;R}h7 z*F*ROI%W_FC%=CY&09VOK_Jm}2+Zx`E#r>S5>_fu89GU$%J!oY_!2V<9t~-#PntDx z=?&dlrtypc6zjOnvJ3x#&kJ2D!p@Lx^R9}|+fC;8#=*^z=U8u^yy`@=k{-B>?su&U zyYX$LSW};e0LuZyJzNw*uE(7RgazC=TqVS~p>hlc*NG)$tE!2OrWj$eif-9IyeOMO)Tk&u+^YC^e506*2F`uSnIw!?U9(|#_jQj;DL888q6-J z;Z_t!cewwtm&$Zh^0LOTD@R42hurx9Sg_zsEZ&BHB5G3j=F+KMmT%hbEqP78waT5h zTf*s39rWmNrqwyj^Ukq3&6R?BQHY`473N$aX;^b61nXsvQP9)6Z`7Wk-_fV#Yz`XL z*dB9sI^z1sK{(*Dg+cB7W@6>!f|vm*>H46m%=#~jDlZVY$uB>wFsRMU&0DyaC>Gt| zr@EI=i%}r-ttj{ZZAdgpj&$TMy~ah z;~#uRV*cgEz07uA3Yt%G?h9!s^jdQYFO3%vZF;Ba(&^@z|1?`V)WiQrr2YfHHa6LK z;)SlxUJ6m^!epz8(Ue5KK@4%VpRT{HUwg#>6B42uuOAyPfIW;I`2G0(rdZO;84tRi|gYIOx{=qN2-Ns8?cr>Y0J zP!DH}dG4zYqp2CnW=n$HTePSgKf}$chZIY!VQRO9sv+8f2hvc>Cz8UXP-F#`#EPgK zH$lmY8+c9}XX1lJH?aPtZ^;4{8rdrn%qHqAf1Qd0NN)CnH<7MKBcD`hn>!4Z{JY#q zqm=9zV2!G%+I5Px;edN=qD$GXS5U;8ZluuY3SALlY_YQ7qe7^=$f__~LTp9+C-tv7 z0V+|#pFo1??)-q_Oo3&RjlE)1BxNbfw9tLiz$M#6r7Wtz32}X!aGb$qb4Id3r}AQq zS|pQ%i4qPkV7yQM4LPH;@+vkFbEm_TlsO43n6LWxO5DjDr%X}OpL4B<;8Bu!1Pz!}pMprTf^$=kx07QTG zfyDb*+T4rdC`O&=;HDT3yatKw;Y2*OQ@wO-}dCX z#;$d`ge}_^e${vNZkh>puX^qsV}C)DgehV6m!7augiPSrBNFt3ILtROK)gYC!Dhwx zuo*9|MkWl!0F_y&MnYowYL8GLppyIHk! z)}~Gadqh5|>iKEe#O#djtd8Ar8i3-uJgU3aWy7~b->JAt`W>7g{U=!bp8%`!Suvn{ z?La}EWh1lMH_xMdElCOz#1Esmon)R$*@@cb_5e13Z_y2qwNwq+xMH$(p#9VSy*=)6 zL!MdU=hrIWP1Wv!3uEqhCuN7%#X`PaNzKxt#|=gFXGePzTDxR^bV`bM7u-889I!hT z{vcyD2a8R>+r%e%f{DDEbc;7*8a4HD9?c0GR5Z+EFeA22mh)od)ksFM5UeAy zFjCCyka}x4@9Eouy?gRgOk;#gMtKBK_Yr1grn77aOa}sjaEdEy3gn$9zvKE|^itt* z654uwqQ+5@%P>xx3_f`T@J5C8n;0hd0zn3-c*ZZe5R1dl9PiyLP`56;THb=!5zyft z>}t1>@M(q>_yt$vv9h=#%7D$? zL%FxpYKTPVibe07-*N1YOBOzQ7qPRV9r&Y(BfT<};NV9fG#+}Rr zPtA1{(Q4y!nCUSJ7UX6eNKCSqw$2wk^2^QPYrZ!*E|^=fN8XQl@}zf}WP4D~i3}k0)ysd+I8egu=7yPX^cZduKBa?mFCO(2Gsnq_2QU{$1bLTPn{J?hQsN2TfZD2c zj4Y_&kbx}^$RkQmX~Mr>roAFdu4(}R;2%vM}m=9rQr3b}?7_{I8*L(P6712HMw3^KEe z!-vZrU)t;6Guw;Y>_d^n2T?XB*46k(w_XFJRvP4?KTNnknVQon;Hh|=eriQoY8Sg? z8fn4acixa|39<|o7tUfBJMwZD^Vn&skT;L4ds%ARViD*aA%(|WuH|PUxnFKH21+;C zmw>XvgSFj{@AX4Zf5s%%%!Os1(Ch@STKm;4DUFlp6j|SeWTAXBF<&okH<`DVxJ*S2 zqYi);MAyZ>$rZGLv6JBhR#p;4Dus_>mRcw_(|hYFN0D_5w6>#-4MXVqw^Xs%n`#;* zBU}y`oZKTluKd&&zaee)!(qRdg&fo$7O8obX=o)o9o98#Gia(xMndw`_=9GI7mNdy zN*W0f6E}@%<7t7?8Y3V!%fTU{Nmp5xG$4<+OYbEo%BKQH$4hE}^XTAN zs0l&>$5mB0#gorW5Ke_VNublJKLFTD8{lYni-6ewf{RBl3ugl#!Ih+y0_pf{7K{Gf zcjCkuzLFAiWy(&C57GOW5`GCrkbvJsb}DjA=Q7S1yb1wlTDUuW{!py&?>;xrtu1tS zTBaMkv(>bj+1mx5ONauxnmKB+e3N;xFPwfa8#bGMjI?KQ{`Rw=JVlPlH^%eyq5dd& zZrfkH7&KnkK3?pbXj<@yj{5L5O3ycgBXhHe(^$FWHO(dguKD>P70!}H_>Z(gXP1iz zW3behlwy|0*e$?e-v#pFokqQ70n2#fTnUu92?!51o!UNbWnSA2I^%g--AyU@n^#?Q z7{Vxtdd&egh^ns`GEjddCYT^es=U|IS(_Q0duwFlRHfX&?xb>|*_yv?V$y(CSIXgn zmJyM(J2TFc>z_wsmU0S3c<4VDFHN^cJ<92Qyid5ry%p)>wpgPqYA9WuHz`tOp!brc z$&cc>h3M%~ys7oi1RuhoE{t-`b+H%cSY$;AQ0S^*Gxr|t|EmOy$v|ZC1Omqbs*~D! z6PR~Js8D`t7xO0QV|`d~wL2>B(qlhEn2b0y|U;F0M^PCnxnR$j%@TGl2e6(M>He=QcA zr8eYsO1HcpY=SyN4f;g(vi!~L?JK9eEiArd%KQ<3m4@0BoAH`D;2RmLraG$-77xGu z&)*|4Y6IXH>9Hf8V%7S^fzfStpT&=7TEApG+ECw}o(q27e1TG5A2-?WS6>0`w==%# zKw6$!itW9-!O+r>W80FuvCcC8422a*&B6mjbxnfW1VcihcHj_f0;67rwC5jt#a9tg zuU~U$*0Yd4fIa}e8Ts-b*!<9mLYzCTE5byCM3b4(T{Kfd>kK=s!Rh9*mIB;2XWzJ- zp|+G}Mqf@JWqcDCSjP>Cg}Xh_9>hSC(IB^92BtU%NpitE@t$li3TJ>cIzoOZ9i@hf zAAga~a*~iOBP$q!ep)EvKe0J&5JZLQa7)A6qOf90qp_FCV#${y*71>idnF?4(+iZq zPk+X*EI*t#rMOW?^zwl3-7m*`70BdILOu2D#Zj%V=7vm8`CBYS44z#XfMx233@uh1 z!YIUNBpkwWxbb4!fgssBH!*Wd%*9NJhYr~oG;foJ2Q&f65F`_~H_r!)gdK6lDoos`|B#v8@WmK3}gU_If zI3V@5W(Nq(k6rSsK!MVi-UPqU+KOowg=HU?8nRF+7Oz-7w}!!6V}k;3|Jm0hizw{j zx0JgsMz8=cgef-%4_%JL!EFxR0!~==V6}(7x8At=7sGO<437jmIhK z;!0}Zglrr_Y8<9_`tp{JS8s{IxUI|@doooSm|1r+C(TY$4`Vn37}kexP)I4K1qdWA zowkax#ovaM-2V}r_ygJZhN2oLVQA9>U6~;KU0-v-{YO=(C{yM-b5-AV*Ud) zqe>I#cL`_~JtnD}w^G7R6-(=uBM4o|X0d^<#tV5pXQyX(y%&mEaFTl{&zwz!n+w$- zZER=}EY9&CieQF~+`0lgQ7ZWoF6P4s4T3+ZrptPNY*{|l6@jyefeo%f@#Iu$rEh2w z=?akgkk0#7gx=A+=^cH0<9rMD;)U5!YyBS&fjy3a#bwd6_j5M2^4<9oC3jI(&rMbI zBUnUqF9)O)!-)bFDdGMDbvp}atU>qXI0dXJd*f;NA-402_R3~{0tF%Rp0O&Pm%?G`4- zNPfghRV9u}PUt*%I{s9lOYh@m^RZ{|Zht=^VY^ZJx~^B`!8u9$msdqqSTG@Ndja!lFwgD=d+vYwaq}lO66}V{M0Ub0P^Cys)TS#S?qI6MT7QL zYi<6_Gv?PM%v#|(jI-1#&F4E2B)^}#%P6O~q#ciTtuOd`Wa@Qd{e`|E_>`vq5m2;2 z+KDQui+?!kq z^)~Xuta@y7|4j+ItLgm1F$wXzH)z6pET+!cprB6oKTzS*$L`+Fv4g+^-1BSEl!Ha- zZ177TQTxb)zdvfW9UJv%ZT2+iyi?@!<%hG;#4YXG$yxoGHG}!#ecdTBHM)ieA3ln` znz!yzAp5AHD}!HNv}#e`JEa)zg&Mg$HsmP(c2d27sFIbIG z)XLIt+E2*?fFp*g&>k)Je;}zxER(bf@&{=s|&YECd6}sLR>Ar>;;ep;xhq zPy+C52^rKR$g-bh5UKE%47XWUx@@;}*^z&`rT)FPh~c{G83s97Td&P>~O&pNsXflS?p+`IH8PVpiLh)dq96zqTPp zG!4!%gwO_3BW2m)5Qs3*i8Ubd>+}T>B;#7peADG~zqdUlvT1nKS0~*W=flRLrd>v7 zQ+kX7c<0AG)>SyA!`it>R5mIvf@r8bP6AP=OfOm=H)=@L87DsB1%-2S5^qd`2ZZ>b zBaZ&j5}3%|W`(QfEB)!f8CL+AAdIFF4N*mSyK@L>heK}x%y`1e8WQj*)vAQrI4f61 zRn&%B*W*J#x*(;TVU->QH>GU2X@IVSi3A-P!J=iejg;_B-J5lZb|FHJiZWMvxEcZO~NEx;RIp76Tr%$b*L=FJ4BONsc;42$AX_g_ooc6 ztsyB8s#5qk619zKwH(#%2;g}^Hs0ICY)pDC2E8ih`$-&FixZppYYj$5q%dPX&x;N8 z93UzwTiBQ7k9pNJc~U#Wi)SsQ7>v}V=0<# z;cNeLV|%7CHe;y$bJrBr#W&Pp6ysx@*A;LfGz^(@=FCB6>x&*ZJ_II{{AI}%Po%lt zJJJQq|9a5AM)iCEZO&tQG>87l%0v4oseN`@HaL{D8Y%MoFM%qG4xRC6wD;`ZRTxPI z|7z1JthjdVaOB62h1dQBw|r8*<7RDHkQKCf#&r7pjkm2<)5R7!g>eaRpHFY9Qg&{q z7;J918Mk2Smn(Ud55g$O`Q=|O0I}CLb=_?{v%TD#?aP0wMlkpXtmMWiz7%B6u)Y1teO9%DCq>C*CbrYz7d7c+4js+qRqH=EByw7Zjow72eEA zKazrHBmb!vN7|R4jNZ@Zhs_Wbot5Hv5kMO5j?{uRqA zuuoYSilxQf^?B?RlhoMJg4FUAQ>kv$&lwF3{l@G36nVRM5`;Be?F`RvA|lXG`WIPK z5S?5uDEP%1qK(C4P2Y|PBovVR;AZfiucPUK&?uraffFA)fUCx-XAs2SAYCPsSB*-M zW|kCx^LkA%+~#dBR?(0LK?+kFLz+nkSI|1Y2GAM2aWo2~gb`?5qpHWA#-4HF2`A9O zne>o4Q$zG<`2W)zRfLxzTMH=%2>6)&K zO&B6}6FhG<`iBfaVK^8y--W+qW5HX=v+-iY^Cj9q4x&xdB8P+tTA4g z%|m9VH@YJTKqMc?fZKfMhxWWkXHW)CoJm9j2}55_1XNKNAZFO?2Pc2$J-3fT;r9m~ zJG3NZ!~d=dL0={*AY*_;O4y>L}k1!8j2OLN|;c|2wbo%OAReV4GTUg+Vqf@@SoKyVoUivBR34y)wM z^SrT=f>Sq0`v$3#LTwAxN=w-jn1nO*ey`#VuICRF3m(t6%!p+&PDc|tl?teQR%yLZ zE;Vt#`k`%IS6%;$j9yrBBoW9i@JwEA|D!e0kdhDD!z8ATgVXahBcz($!3mfwuiS=W^> zfz`BT)*0G^nFFQrdZQ_nf0Il@KUetv^e)VkCnc8otFLK?->6O1?J0VecYZVx*8K6! zeUDUiEs3>Uj)zge;HrAEX{2uS_!1)joz{7Ei6?LE7uUvIFk~P~I-tp?fL{QBleAr$ z^m7xT?L+*&89YBG!&<;**%cr@h{K)HQviCl)r`Rl*nHAIKo4?^) zEPY`rb$c~fTr4GYkk&a-@U=ctJMf%xc@sjneo(UEP4Bu%^WKhT4@hCLFDb;RIi(

`d>~bVFWis2CzLHg5scEf(49Yf>$_+pcg}RlQK2VXJo35Lp zPVsYil~EQ~7$O!8JY$E*~z60ot+@J$ak|K)0qt4aFb56+ob;WT*RktHf&+>~l_OR5PmlfHy~MqzXgAPoE4u zZaJFA5jlCrUNn*UUa!gQFbfe*Mn{J^zs(s0&7TqF;dLY<5{R6ighe!uH7AJRQtD_oxR$#xb!Yn5n;KdEqj&%p71Z+tg!WF zXU$?2Vr5^&|$6Oj}gF$NWC7@~)12K6Z65GDyQsDQ}!0Yws^ zT1##3un=L6j0*rjHbQGsUIg1?Sr0V3McQNIk(?;5lsKv2y^YI0fnF+$om8D{Op7#E zD(Cb9V)>qh(qtyC2Uo&)XfUm%D)s`y2D;bF&VU~T=g7MP&!n9Nlv%3S&j{5>)XYu5 zG_l{N51dq%R?SZCPy3%Wy;rQ15AfD5vm^{tfxx3Gm}M>yP(BIYP3F>6E*(@=1=1?# zY?f&h@SZe^q3~BWozCw;{+yTWIFDoj+i56JHdG)O0+b;ZBJh|zeSmIJD#a(XfFMwb z6NuBQ^552JvE$I7Z7_da@u}*tnJ}F{j$w2QX|S?*UyH=v)XtQ$?iylQ36fG;uSY40ufk4lG1cOD&;lMmTWS9 z3}k&vyCZR0m_iVg9r0-LzeK!D5e!>MQy)Tp9hM~M7Z^Mac}zN5Jn+bQ&MQPDIh^~k zTEVXQEv5Dk)teggSWp|$5_Ugsy0YhS*UW-jvxAl9bd~PDbEKv)lA4%x#Y()owBv$; z)#mQqKdN8fONG98>r-1+Y%?=cSM5=F(#fLYCK%Y+p$n@}RM*VQRl~pU5Y zSZaR7RtGZ|-O%Q$cdXuIcf~w zYt`CrI9Wa|0*0WEc(}WxtO;Q*9^;1eM)6nuMXfb>6JYo8E-xIWN55|J=_Ck-V(j;q zEhVBuXS*w>!!97iVza#hRB^q%`dysmPQm+Y1cYl6z8>!=n1D(Q0zob}FP&q#J(ew` zP-RP0h3LYgIQaqGFidI~nTuz?(fg%fYLQGY0G%nAmCfGHRyDM^`zDfIh!DKM7rx*X zF!WhJM7ncL>ns`MmJt~oYJD)@?K4$6sauK@LxL$pFmpik9bk!}qlFk4P;TMR)GsbP zs`6?G-nU>rdd(u{c(wg&uH3goJ0TW2bdSC!3YPlQOjKgJd>-t8d+#Pd5CQ~FKTnIH zWM^#aeQG;rj>cO_)hQIpUzLem3LVY&SpgjcoiyrO427ugsRjP{$~i6uSUG~t2jVS| zF`Uc-pc6~R294s+pt8wr`S<2JtDpHDce-F=uS)J3cW3i{A^Oj01FW3Wp%zKqrxB-= zpc*WkQsUxed*&_cFm^*RYRDS;rMIM7B$zizZrYUZ45ZNj7@UoX;iVI2lG;@?a~4(ua6H$}ArI-^w#=U2nnCNjS9r-AMQ+Iybi8HK<-po0Q++H}R`=TN;vBIh4tr zq7-P#2P8DfHgKaZ=70yBJjri58fy5ddqKlDeM#Ee&CPR~p?5O7*9VE#;fLo=(k@Jv zUV4({ICh+6qEA2 zqC@gn`}@SeiCQemne+K~Xrse(xhO`oBR#spV zWA7j%B|@v;Ap{2E9op{QBzZwYAhx#!>ZZZl%Sx;6Z(O>o(gx|G6ctIP#hYj4$FO00oKYp|5#TK?;H_in}Yium8xz|sGKW~Ao4wRK)~ z+<7uq;5zyHTRR_qj0rhE@Oz84D4B0jXFi2)DRiB)eU6&?iIuC9Jk|U(>B5`kS64^L z6K%YOqaDMQR?mMKNek|y1{I1)-&>Owq>OYlTb|p;gX~{_?407;lqWEMNU;MZ#7~dfF)vltnO;-xb1R}!BRD-cC7%E zQ5Fzsx~wD%En)FY(KWYVzkRmIkikwZ;GK>J)Lvz`dU^*BsM_|Z^M=&k64gpOl0$9)}^pqge zm(3V=)m01Cg%Yoe_UT=YD{n3R`9r9Mp`aZeB1j)s^<#)B zH07Fl=x_iUi>n5v*$kGUC!@(4#lYQ^54S%2DBt);_wX$OoF6VP_Nw&kl2n1+S-_{z z1$#BK?ww>DpM-`OHSkWU|8t_%2~r}Y3x0lC^)MHcqH1OVN?Lr!qOCw9^3FomBe5Xq zs9~Q8Kwsm)!oBp$iO-cKmwdw(8s7P40js%AY&xjrzbwp1Sj&J8Q0q6bss@qAEy5`~ z$v>@y5j?wr1F);c$Evj>@QBXkG&#cl>%dN>B&qE7A4)rw_5TJ|Ibq_jRMbfY03oqb+JYAm6=JWBsN!0+-!WiIA zK!42B$0nC{|A%rr68>5von^z4Tl*_9Gfi%)$s zzxi80JDgxg0|9qa11pXaxop|n(t}GM5N4@HfPn==$>!_PrPSn}g&Jbwp%kRpGFbmf z(ne-ydi;*}rWmH>6fKzb3)IKVi!Td1m&;j2od zN%;>qB`YU+-xq`!xT2?tnc81RW=7D=V>A`ey{B0F)^ZSbG&)VQ!SCYHfM?yLP|F350@yvB)^hD8B0Z3A@>*uDn87N-)^ff7)NK=AYiU{PJ|bCzGLuHaweY@}h47Cu`G( zf6+&H5zR+l0*n*D8UKIyAAYYdA)i)wQfZSscTs(vMw+_K7tkE=GFC&Ehor2)F_WJEqv+h@ncn|6zMIP!=03T!xy)^}SwvCpm0RxSlD1)UEtgzE zHTTg-LKDd)_uJel%4P0Ly11r}+`3UwiE}!g-}mx-LX8+bdEl`fBov$}5Q1vq!zU7|y93hQG6&x8%I`vm4=6_p<(Oh;i#! zN~L7lYS5qm;mJTn67TkHmf~)DHfySqRz~K$Me@I0Vmg4YP`J}jK@!{#sk11A)Ux6b zHP_4I+Da6`z&mG=r~g_6u`kwue2>EZ6$xA>#D z$lXG%n5zwOa>IJ80%HoO4a!)iaE#QS`02r>t*^kgp>Qs)ZA3glVH3kUl@CdjIFlYO z0)ohhNTFspRul+CY)xD7W*lA}XWn1mYar-Ls8NREi6*V674TnoE}BPy%JJ}L`HpAY z`3Wc|_9u{2@?UZT2v`IhuOS}nk$H|UfY)R*7OBjE^i0x*A(3Ro9vZ#JNcWu?A)So2 z`;L2H1)Ju-VwC)ZIgxpm;x69AIVu|)6JCbQZEQ-oWS zH(ZbM`<6WLa#bSI&VZbENa{XX!L;Vk&ja5{ufkZ`eU)6q_OjrDUL{kW&0#D|#Peu| zK7gwG#NlxyNmECGoW3fre4=5_b+Z#)vR;xEJv6n*dNm(FyEu78=rzlb0Kbnfm{4S} z4vu#g-$0BWRC6%qWq&Mgn#~NtP7VBGe;m`}yn%C#KC|uii;~(w{P>hQMG!z$mtVX;35OyrGSq!U1JLnrUZ zQmY8xE;zFBKTsV)N&k}8bsqgT$!?*ePo1E>RkjO7&Y`5mzW~)hm`4wAk$&9-^#;WL-)g4u@ogulKJiS&g_cN?CBKKmk57h)XTl7gntW`El*2Nrv; zNX^^4yCyNGi@Pp)a>`xqoa%od@m*=oKC@^4X*AKkvZ%UZEvC)2=_0w|29b$#5h<^^ z)ix|NJX+$pCgJe+ySP;23atIv1sK9XC)`NHZ|6Zb-iwM{hyuDzkyOS=P&2 zJJgUePpe=RQu+NTwgO`X{Nr_jN6f+Zdri4{xq`3WI_NK4Dl%1Q>BHAAFV>HDCFHdRH@_IFPd7g# zow>pb*|?{z!Z;6bk&7sQ1rE}&37NIE+6UY;)GD0mqLm{rpWFJoWUbU(=U@m=woGc0 z;x}QkWNs*W7aM7O{fkL@i`s&1_x!6`l9dRw%|3>)IrLn%c;m(aAXERKYd5)Xs-CmDf4!}SJJ24qo-U>md|x`k6h)N!VldY z-9Q@$_h#Ly57ym%8g~DaeT)Ak{ueeQiHwqsi)TjF?uZNWCt4X94-~syCp~0ZpO&6B z!z3Bry?i5peJ0~!yG+0qw8$;nY;ocH`SBw6g06hEs+1xTIigVn3ks^D#xT-ScQFo* zOrA>4JMucH(}pu1N|(EXL_7QK!7}qOKGUWnw3$SySQF{ze z99R%JlxR*N8Uaams`yE@_^^QMiUjxv+Hoqq8Ccn*zOMz`ITkSdz=Izy0&!#(8i4u; z>V<(FDEQ03ub;8~6kwb-p4qE`H^iKDDh=3wM-&wmIENX$3OR-J9~~@8c~8k@4N(YU z7~uZyn-nD{^aG1XI>%9Ks54JE!Jqf{zjHmuq6kboVGx8$??GA+2suSbWnWJoPZ0!I z-MoR9CJL+CG?I~S=f&Y}VD+TT_vQbb3U*5pYqE1*=YnKT&z2q143Go^i*tI_MN7Xt zV4;4CIek|6)Vc-nEmfSoGT9(>W>A-GboXauq2_dFde>{qhh;{>DBOECenxdIr- z4ZatMYJ?c*xE2;13$bX833r=3G=UE|3mYBC;g4w`e1P2_brPqTWG^t6D>8S4kU$lm zTe&%@?b4AXwsQ*5rQY0B*PsxJi9`bH2s4!Rt*>p_`pSCgMZN6z^Xh%w9av#+h-zyO zW0^rDAUm4Eqx-M)3Poh}+U)R|FbB+Tc~jim1{R)A;Qcv`xk(zD@^@!Z7cq1>d(@?9` zPA6C03A@o?%N7lOYCWa3*kN>ugxKB5`E&MSfT+2*i}at~M)y9oZj<_{^OQQ-iuTk7 zM`zuJO#9?Lu_3jcZKw0|tJ-;?d}LoDUD(a8**J7N`kK*s+U#p{htj3vq(!w}ey!Q9 z&$Z#QpRX^rD>De<)dDng`w68W@abn7xWwASTd`_!YYmKND zkec_iGvMM-=Zer1BX6Cog@ComNNhOHR2Y&3!o_UYbN>{lwAeiO{;lv`;nQ2x>$5mV zp=NMHTh6BvF-U+kQjh1DcIR{4J!#kN^B0Rl|ADNr8}s2?J|CGRG~{07VeJ$F_}D0x(KJ!)A36!~)MurAAp_B#@OKp(xJs@GZ)Wy}!u1T$F6)RWdQ_hLktFqr8f# zx8*zJNZe-!0{LHr3aDqudKNBu0)!obpf#QoQ_uFdXRcLPlJ6OqDgJ^&&ra$d6gdns zBEz)b5YtVVlXb$luaF&Dq7`+-7Qb%#EI{QpVu))F+}XJSM)RiF{wH_RKYjeg3YKrK zP^=OU#q8nMHLgXR8H32*n(pST=xC1T(bDS{ZZ_)65>blW_Y63`j^KhU#g|3G5b*b0 z0G+-uMaUWw;L@^gfzCv3&Y&KzhNLL0l2KxbgG+=|Q_-j*Dip3Gmq3!@YtLPqj9~ryN)qyneHt~4 zNw_Tsg*+%(Nf{;EMj%v>Lj=V^^eR8^fX$PCd_40$@DshWADLuD0c#T?%w&`Bs)$Wa zPvmmSEH^LAF5e8GwIA(~?2s}RM|ND+eq|vRDC1WPL^Ua2PonWhO<)wESV_5LX@;Gh zDdjU8QAw%8E!O}efHFWQB;ZUY8m9E|4nA1c(mbs6?@hj)(*OBsNv6ykWB9?6Ut9>e zP?RhQPbZ=>^0}7WYcmD_1oNmO;icrJ*ZvI;lmj{xNhIWCJTb*$RHL~7#=@L(&2bpS zGZFYdbnPSak}z~PrB4oU{f=UfYcNyPBALOa->A(Bvgsj-nzwpP!#cYD-v3$d#7vzXzUqkmJ27-d*k8*y^v%Ul4lJWnnO5d4YTAhVJ9XBJNGM zQ<4kYFdet5qT?Pl zSm&xp|A9#9v+GyW9Z9jX4QO4pr||sudDbv~&Mon*pEYtJpM%=oP5j}P1dr_~KH1-- zmn*_^{McT^(KaGY5`G6y9caXQehYZG?OOjL7bWVqrmT_0fuH6apSoI7b%C`TTQ>-! zDJP$5;qm((?UsllwGG++a&~P(baWlSn$&29cP|<)z7{%FYx#PP)6J*TdQEewO83yG z7?Dn);Gd;`4ZF8+>L+8bvO8Pe(({)>jeEuDAxq`IX>Eayw)XieM`QXpHQ34yTJ5Wh z%&xM=PGx(okxpSg^`I%E`D^xR%zxijob6ocTeygD*q})bR6ktuO>%3J(JAcAYal9> z4c5}7@KcX$wR4n0EL%~3OBP=HPPk-^T;_8iz zF}Jfp^FPmM&wFcypE)LN@gL~R4a31D$%7N?@4>G5vKsoKQHtD#KHM4K)he!x|E8m9 z*g$P)qGbc7tiAW*RGv6&TCLs}@Z&xxj8vJkx_N26VU$YXK_oz@H>9L9I>>(4^CDCu z5J)mcnUCkwXfoJa7J-qc%-4Jsvk+_22V) zB6aV8#BAWkg7M^wj@@#lE*YpXiR`wUv7N0Of8I2=gjs#Q_}5RllOqQqzOjdW%bUf5 zp0ZZGw1&znMfHk}oqw&@F((*L_=)5??z-AtKr%ckY-E#^3YJUeVum&1q#Csl+S+H{ zck8LEC-IshwJ!1*d~s=wy{l6sdyR57tp-SP!^PR63~@~t?i@yMR17w|O4X$5iKslxrh6?lr^RjB+5l86jjggjnEUU*Qt&Oql z58g~HG?QIT^CNn-5HGzdP zs6am54c>0jtJjVew2z(%@s{&CPkryQDCC~9k>OJoW6O7_$ySV8?BdvIl`Jn2s@8RP zH}7*+^&F>D>)fvH!?LS2tH0#2kLqpDC7Y}k*`|uPs00OH(VAbN1#h`%H)fo>aJIQ= zbZD#o;S$0$M4D6$D}syMD;+5yb#;Ci3jW+y532uU$)SaYUHAMC^z)T)f2HAR!zOCC zpzg+@$7VsQFCCEx{!f4{N^UaplOT|wz+eB)pd;_77qqLk1$B zFB!yXE6apzTpYbfu@4R|c)6Yv&Px#b*8N#0eR3A}0#OrffBSr5+C~3@7iS)~D9rV} zmNOcf^6W5~dT5W|R-V&c^=Yc;^ctK3`>OSNhM963isoxI7k)o2F*CO7h&(P>)xXhD z8~sz*{ZH?eu;ABa(K@o7Dn)M1g>UOVKORBr3sbt!+qgWXgZviP3O=3Z6nZf4t=L&p zv;NADPt0!l*}e1pW0U{FD`n3}jrc}gr@-J#o5oes_LM@Q92*4DAFtNj0{1FFL?&7( z=cs+ay~Se;@8x-$Qf&CV6BvoxH*hIp>g>PrdRjTqiLUV#b$;1 zB=diK?vJa*2=;GIv)@l;y~ktl9?Svr2kD|vbGyUf6G@{!4@R6$;1p}{nJf4j2~g;EMPnxaXLC~4}8+%n%bE=qSUN>jT}EWwk(S(qke^D9)*j9 z9t+qOh^ru-P~WtQC`PhGO;{>K@#1n!`9P^PwtYhthE66?!N8_x;>fZcO{mon?u8H? zR+#WHKM~0@V;@GA+>|rVkW42#e6b7uHZo$N0{$*l%bvos`ZEGgI>3~rCq~hRM>5$C zKzJwyL6F}~?vwt44cB&1omV7i1 zzGqg}%6>qAN^)LOlI5f$aI>+zK2e}_?z66a$nV=7I7^-iumcl>rw_fv3l3NOx)Ws3 z6L{ROf@%2-h+CO10K^tlGQiM5XoEh8Qc}8|gN(IwJHt!2r4#zRT(g3YcVF%#Z zWUNL^=tD>nE+}_H9AX82gn7+~iv0`T+IB}YjuA6zZV+%bZ|~dDl+jNkNgm>&e#g*K zkm-n;VB@a;K-$7K%?k+yhm~6fntt0iE}P%UcCAW`99_{3AH6qY<$&rZNjrY&e3{W& zEF&R0Aya477Wu7q(Lkj0v`m+2W6x~$Ag$+kiXX)y)U|mbjQvSwfR~;V+}zNX?-ghe zL6R&e3~jv=Y!sZo@Tj>#mfZHJU3&?I?Pt&b_S&xR2~n8~X)18<6Am4cTJIZ^Y+{S$ zGTdioZYq_tKXZvsQTBD)`1lh)1Z? zqAYT+r0gQYOfVhFe0sZx?M2@|{Ku%MsH8lI4Gd}};e{u$BMUOV>k7Ff&E1B8;*N^WVDIcO zzbDw;T{xv#uU+D+xjuv7s6tTH6%Xc%PEv;yHAm^p>*{C#;0eRX>ZSicIy#&h?P3Pz z3A%vAfW5vnG`Wx+oK2BU{wp`81Oy@245TXPY^diNlQ-^7O@YRDP^($-My>`P{0x0`o-Rx;Nziyl$u&!er8+@AUlch983`BkAWCd1^Ov+KP6*jT z54|OP#>!08_1rjrrL4K`>bQVp#;_GeS%&nPD{*E~E#)5<@0(QV;%n_D*ISQCO-WBX zfF>p`D*qL#9Ru)zuVmpR5g4|!SLpLqG%aSr`T1!-_?Mfx{8;j|?T)CQ;F+S06Yw+H z%NRp6$}SP*4F<*4^^nDZNG2ePb*qh!<+vs&=Y=5^gsS)K|KLQniXL`Dw~ghqT<{gA5? zew*%PX#*e{bo4xpY-j4{&)5fT(h2PhyLQn>Kf9hQbxo-^o%^)-`O`7|vbpI4p)$+B z>vE;s5;R_8LV?=laJGcV5A(tMZ@>reWb*-Ypg5>#_8|p^$FoM9l-kY-g2+#od({o0 z1^$H9?Yu>T1I05%DUD!C>XB5@eXp=%oNj>rs*vltb7NUQiNUWi?z=jQb?=dvv#KO7 zIEEX7x8LKxglvHSb3Md)ARW$AqEqGXhq#mVCl6I{5^K=0ip z>_O{?x4EaoDRLi~qIBLnKw5Yi!k3}nf)(Y*o(;sGi|Ilv%f0seUF zPKSeGQme4P`+zJebr1&nF&a>wZ!vSO^v2Sa|Ibms{yqsv+AzrffPed$p?JEY5$o{% zm0@4+R%e4OibpEiT%VkB&& zLOqJF%A#0C|Gq|Bh^ux6GMS5n0F3+4nJ*n7arJ*5&1E}2J)Dvq<<%Lw`N=6Qa3qji zy{>THRK`#^P+p|UtF`_XX*Ie^Hf!VES?>|^(U_2=LJdgkX7f(+oJ<&PXW_&>n}zoC z8vYbF1-Of;`tQ4IcbA~4?V}BTMIQgAwM<+*l-yq}x!~!uOn!gPWm0!`XwH~kOg~L= zY!5F8(@EkhG|~4C?6j4hv}d*5KusI@s-rd)uUI-t-&{Yy$@1lh5$@iXyj&>CwSQz^ z)o~`jCiQdt%B#*X6>Lb$x{UEU?Zgirzog8x!2fZ5(a(0=xxhE@qEB{`_zoSST-BWI zg-XF2M8#IQN@I1RWQPB|n&msD@(&SsveR-)1XnJ=u;dXbp%S8@H+6UT;+*x!dQ~(r z3+E(Ua@V!VTkLZ8Z(J`iB&g)WHb7K&crhQ>__E?+*C(&6#=X6W>XEJ{^HP)971?Oq z`40V?Uy+ZbI>*b?+(>h_`r}@^X*m5>zDd2;B8H+x(n?EnQ6Zg68|7w~ekb!ie1CKy z*y|@!+sMVCIJE!riMgH)i%x$+o57i-ciLw??V}q=3%H*@Ur0KcmY;3G&=g00bV>2u z@eZEyIpMSXv|geq5q;W-!mP>1f!lU-i{%O;tzj+1HxCOZn_F=mW+ZoBsE?1OXa)B^@YN$d7YR*TS_ zp}L$H`*iS^MoH!un0wZ3PAV`6!3I2>?b#uNfKp*7-xqN*$6aJ2QydnM6wXg{OMF_1 zxK~bnE;a46Hm4SfI5H~DA0aFjIK^h!scu+PzQVH>U}ku|Qz+cPsO>2^pwgO5!?Zlo zL_SuIO=F~jr5~-aPVk4CXUrrOF)(ChQRQ~VSnIZ^osd@q z9tz^B%J4^|?I*`2vD!^%m|~RWteyfFR4j}MS4~ok5*x?Sl|GZv3WM^(;H^ql=x9ri zuOo;OJMOM&R`gKwvO_D}M+%by6cQ>jnUh+PEjA*FbcGlNIt}x_}0fA2svLF!? z5w76cCD%?6vk)xe;t>`gRy-J{lgU(IAk|?8= zW{K~R`(sX}ioZ00=}K+Nl^*bXUn-s?r@pTlGwsDDvVQS+i33prcAEhGooDs7W+!po zZp4Vq{zQu)f_)M49M9jp`bc0gE^Dif@4?-=^(Lb5uMGxbLn*nkP?%-OSuoK5 zUFnrv2EmwoR5_*x7TS~nWOs$|uHDP`#GC6v^VEw?>Ei>dx6^+Ddt->?w6Mn+05Jc9^%oUH^NbfEYe=m5&iyD5Dr0gJO=StXhmeIKX-DYiCt9q}Z^aqzS{71PjLTepXJBC&nne(bOr^%HRBC#YXD>;RJaxOf+R<>YqN|~m%tm>B zi-tv8;?sb(=MA&4ICilo*wOG~)*B$>a?7)!V>ZRC=j}5;x2voHVH_f^ zDRIcqH*CyfFiS`qqW zgMAV0V4q8Ib4qAW53Dt;fXXF{elt&~mwQjmUUJE+GBPL1O3G!GB}I(9#y$T4Iu&?9 zg)AkyoOXHchhY-A)SWy8X^>`O9^p5H!&w89ujB%*XR28T&D>3%50Zw;#la&2DqV5x3^HG!1fqi@{ij$RA zeF)+eA!%5skiQM*>caeW;L4%{=5UCNkik)Vo3oPbjCW;&hmq>nKDohhW;7?G6jVgo zcOp~v353$p{V#QW$nRM2E`=->cTKi;6mxO#(QUS+qoqoxEnD`9VU5ZrA3$xw=c*p? zF~OB1sS!o@3B?3g)UBPQB@gyf$ukx7-Iseu8pGbkaN?igo;a}$kCv+PWs|emS^fLB zp=9NPq*RabwLC$>MAjl=2bCMHf;cn|MT?QM7o5C%6IGOa6F^y6dDSYH3onDobQMYk?ys#U;~F^{HoG}%Mj7$ zk9e1NQ9eUx#VDf~z*1)RYFI3gKi&_&BxMfRBhp3F>B!g*qVe#e?=!!W0Kb`hhsg73 zGH1#zgA!HjxNQ_rpK? zvS9X=z^ttOaN6RpvJccbm}kl8;ekP1cV-qHmkX?rTe5MXMND$>u`KJ%Ka))-F)vr8 zCwwdG@Ub5dP~aX;1DaWZ{OZ50QlCcFr_wYAu6-+C7d=kXcxH_h9Vjuj=4s~^d}DJt zzn~a`sNE^Pgo1I|m02v=(d`cY_NkRpf=m8YD%67^ z=y_hrdKDIIi!3_yaLnsb^Z+vo>}K#nt?a1agXSk{9>KFqC(Aq3lujU7e-|v&h1CU1 zYYkKd#IG&{eG!nm{%^2?#LEr+Adr6NtWxV}7*S%}@KgMEzj7J-dUNqu)T_CX;_=t; zRrjW%Kz;W)z2l2PPR{(L3wK|6-mX4l;JvOd?a_9d;()tK+c1mO5S_9`m-TIy?P9%z zDtb&qiMir>_I|`zpVgYd+H`C)t=|oCX5!lGd7?NCt_*%#59=zi4X-gODDq_R*f(-V zMOhRAiH%s-(=TR?`3%hRv-!GW@^nQ}Z+meyYF(&$wPGOj_;R6}_pN`a z=_}hFvaSy1Vv08@n~8nce;Pz|Y+4%33)Sha&%>78kKbcx2+o!V*?&BrZ57k`Q_>eA zPHA>rEOyHaP1JoJg6r>#T$z%(A?F|xHtik7sqsMvFKA9?M_=^V5?)a;UgpMduxIN# zV;5_+J$B2hNTjurLCUo!!FNEej^AO;5pJQ}Ml0?h(f4+!^mWr4Amdb*13Wr-s{muU z6_Ddal?NVAEjv4$uO(gF7tK{6d=e8eCcWn$MuPckK&?JK0jhkfkUcN<*q*+(uf?Q? zBzb;ahg}I>SbXPHA0`$58WrS&!w$jso&AosjS{0F&122o!J|KwCt_=zOCQg?6SWp( zMHu(zsM9kb{A)ldd~Z!k+Z2zAWR*!Qm)R-MG||6DeXJeVkr=2T0Y&BKy=Tbg3)*Qe zb!wyh*CbaZA*e{omIYPgoxqi0Bu+7T&XNZOko02`Kx8zp<`zo8Z)6M$a>t8+GGHbQ zC}jkp6H=mim=#3;S}IxQ93cW^J)9qW@~rCM690xE*AcX^m~eK~Y{K5_#Sk_3xq}LM zgaZ)K`7Ek!_X_HCrv}i2mA2#e3i2XfU)92*!iyr2ZRWOW5XJ z*b{!G_1}@HX$oA*0y=2G+L0Q|0GaYQ{yLVXkY(kQDn z)T+Tmt4EG>jw~HNL?p63T76PkXR{uZsv`)35dKw^%>D1<=G0oJ0Yc2GQ_|sI2=$Z7 zoktWcTDx1n9@a*F=l|yXKt`Y`k96wLeY`?ebUV(%GX#IIo@LK*_l=9V8Zw~YBf6M6 z2%L+@p@6^w@aF<*LG(8G13H~XFH>}vWFDuX#C$g4Opj)4(`-G8hDLozFeRH15dziZ zD)uer8d?J%lkN^{wYIR!+!0=-m!a+>OTR4B>-w#VyLE1|vEdY;5DM6XBE)w}qXLw=%OJbV@(}F0_uF zdW4W`Z44DOZ)m}n6>&$cOAh6Bwl^)6TA1sQmq67!f!JZCl^W_Zbnv2Jr|ZX%+|N{( z;0u2usGj=Kg`HN;o{3RG6W;Y3eA$#g9MTcAJbO}9T3-y;kNc-FwDtGsQ!8EWUHv8x z>@F!x7~C$AeQWCC&&8wf-0uV^=e_uBF59lhu~^fq-%oMEBXr{52PPb`(Yl-En6ZIW zC>vZt>0D4=@rPTP=7+1C=e~W@`!q_M;MfuWlx~>135By><_i$<=ZF#i&+F63fEVwZ zj?vIgW667sxmC~0GN`9Yl1wj8{{$lVPVn7%q}4~SO@H&n`-Bq?=f5vdsc@29O+mng z@%h{ts_TO^JKGTF7;P<|g5#G#MrF;Ppf{F$CvW^a9Qr1}BFv9r&R_)mRO4oSz2MYh zWxMsJKH+@9=e4i|-=Qh%j~Ys2ot_Kn9Z8dOPJw5y4U;a;>(^q0Ue(Sma{mK4c6u%E z>0b5Ly7a} zugrN#XjGQLfHp`ccmo?~EMF&wl{payLWb^rd|t5CVHDE>mGg``e2yAL$bFB#O!|Re?R+#=wAv z9O#4BUY24pMPClcAGK(!HT^x%o7o{gAUz9lxpvelhBt~HWP%QhpCN$2OkyFKax3}N zYHx~BtmY#_)bG&(zEFU_Oyuv$S~ysgvMnm(o_Z)Sg!<9YT|p#u z@)Z*#ISQMGN?;U=a-h_(nZl7q=dxJWA{4Y2h2@Q`J->r?TXaQ^!?n|$jA$nivf?QA zVSLe4ewBqa|M?CrMstXZ{H_uA-K3Ayz+w*nsZUxR^V;QX@i!#+dmTb%fX!+(#A{=% zd?Hlpt5jO)d_;ZoUxBrEi+L};#=6nEIBM(>+x^m=JIKq*xo{vf&}{QYT8roeHIf!F%E=ha+tj>``wAPyMU`C4Gj0r3^x`^j=S_e}@_ z7c!?L?iJQ{rd6U~(uIc!dxc&6G(cs}oeq%dd{A!APuUhT#dcyhpZL630G^`~0L#uE zfKb8g(`L_;kP4Aiq6d} znv@1?ZHPCmvqy#R&Vnd^l`B35vbBj;L`lFyYCzc*1cGHK*17~x*{ax8H!P)uDo5~4 z%I@P=b$Y=Bnfi&f+`m}oxUG1JPYujUNh20PC_PnSq2@M)AMcrF(IJO-KO0OUjrH6t z$%EBD-ms9YF8^c)Xv4nQ+)9Y$w`#QqanIY(BS25(c<7HS#Qgks-#zSjM$+^ z$#uAj+YNX0UrD`eD`=j&m-eTqaldE!^huv7+1&n}L%h4Mk?qLT z4$Y!4)s)67P7cDZuvw0K%taZ*Py`X+HX%kNCGkfAq^sZuEG?kmn;h^yn>rc@B&Fh% zykj6szTyOe!fBS@XciWR1gdMzgXKkS5d;FvXFX?w+F0Lr_cq#Nz=SbKkAIYU($qmf z;yZ1*E7v!{AhIwfG`A%>=E$n6#M*7Y``D}Qs|pKqRgCx9vRisx1!5eX)mwd97h`I5 zqilB&wPP;#W#(Kw8>yV0QyU7&hn^9r5jI+fQZfpcf*Pe>9-R!badr_z#2$IVFXl))k8ea;N>QawuXY;w9V%gS?HP~e&|&CV$08*65x1}ut@UaydFPmNBL5X6hVH*(!tx%EX) zJ}M|?tUlDuOI~!e;T80@!muxey@hc7P1^G_N|Nt6{dHRO8x3TKXH5?wP_C%8hb2Sd zUT+7INo*KsS%_51Q*uEcrHu`9A&gA%ldb4l>k{iPUHV#EvAe%Dq&{y z)N{-X1@)As@x2(=ybIz91DF9VLD4Pc$9_tVCAPA#5?(q?LWp6$sV9L~ms=kUwX74* z-@Qp$eIQZ8F*!i$&rg{6vTY3}7o8k2q?9BY*ZhphyK6WfV_g~D@ko9LA|C>L5&!y) z3(F1ws?C+ua-AceGQ=qktF8DmK7tdI;XJSX+!9-;TsXhoeClNA< zk#og%&uis4RUEZKv@V6xe%=A1!zItMsNMZBz<`WybGRljucq;MLf)q8={ zUYlxCQl2_2U@?zJ*&X~p90e4V&4HI$IS{)LbH(?r2cHn1Ssrje&!EWo0ovpFblrEl zH9*>wQczob!Zwf`FR6WzY_Y5g#*ltc$TKoau4qrd>y`h3@8qGql zMz9Q+sXI4h4!Wx#nup=vg$uQN|Gg54zuXQ=LJ=~3tqOLo(&^F$Hl=EHIdTyBCgCNw zMgy?}^$vjd6F*q2dcC?=R}yY#ntz3pPCpbgmAbc;=I8bgw7{2p`iJX4sr2xZA%H zaXz0!!v?S0e$}1rCRpT>b}#)NvTFI4G8u_(YI5Ql{LwyPzJTcE6R~OC_!wrI?pGM-g7*+44>ChDom5t1xy1UJNxOZGGH8r!;ZlrE{tr*k7n1hnoDQmD>e zSN-|8GbV)GiF{IA@%q&7h>KVx!n=@j0w^_8YV?~8$5p_KB?9jZceDDeULBvbsdYzw zE)^!HCqW|k%cudTbzSb$>W;@#xj-@AA2c$uA2jK9(S< z?U#Qp^3jzR)``putnMod2vkTB*V<@tN!~$6^*weNtom>mrg@9=*ve{EI1+=6GD^pQ zM3>2PwpQ1ATstaXX>`oR#N79<<(*;$wzB9w6vOkPi$4u;<0EY=oopIR?5T>uPh zKC*+EZ;jA^FWT}N>Bs2MxL`>H7+J)H9CBZ{`JL$^?yAv^jl^pGS`!UFiHA9{wIE3J zxKZ{6&7tc{U>qvzY#K*;*m}zbp%aYZv#CLsO%ElSLq&q6KIa<)k;MaB2f^`@UP}cV z4iR*VQc$9wq6SWTRY>;Eu|CnGdVNll>pz(bnh`8aurE>bh!ZBEDpvi#1B~<%htP|} z>x-|eXA@4eH#KWZyAAolLWwGV%H5=MNM7%Fo7>nihG&AN9K){Bnn!cLFYcj^%CUnI zjcxZbzA=BR_|8qvi@zp>55;Z(kW~=94McNrnyKtkCYukd^!apL;zn{``iAw}M?b&9 zA4VE%e9-w?zVpq6+V~G4kq=f%Ee9_cEOQoy_eI|bm}Al6k8J+B1uf5a4U2Vv6#?&& z5yYA6h#~B3a_hhJ>0k3r<-r}KBYm#*%VTi}EDa?}CK4r)Y?aH0hffXbHLGs(xkJlI z@q$2r0`&3bO2XjGQAM$H>;zLvAQsT8rw)>lCA=T%l12Q*m zG0iWF*+)m?HH3*LOZE;gV1BsAm`8)RfJ_jiGDtYdE~bEH;^Pu`Z{{9 zbz)~F#ki#M&5&o1h6{{*hl8^PD_ER7!_;fYY_L^*?HBr(lXan_o|i-u(Bo{^&$^Tv z$XcCmsMn5A54_?{-SgLPiWVuZr5*a&*BbuM#pYnhK!MQaTUX4k zzRGPCwsNmyN9v8jTCD0xH01ZjKpG&}ukVv2GhbDy=mrUo3X7+PG#bxeoo9$=7pz4Q}BCfBxuk{gJ(Ee70M@ z3tw81DPO14<^V)r)m5`q=S#Zl|Xgj>}X+_80Q9`Uu_V(}6xNt0GZa;t5;v`}k* ze!e>Q4y<}G$5Pn9lX|In@i(bdx1zeS(B-^;Zn0mA45-B9pOZlsMnVtG22i;Uq(Tz- z{rHO9+IaPSRpGUQSG2v>IWIQ!+=1Z3`mF`$nYw{UGuq@YY7ZkdKL^XxJiUR#Yo=f$ z#;XX>Rg(a7mV>E9ve@95%|g$QEz@7xlLPmbV?^DJ2p)u_JDPsHw4-^DJFIZXt_&vA zvGBc;DKs)7uY$|(w$(UqKep?z64R)+uC*#X*cKD`dAZcI28ACy9m`u$(_i&567Cjh zSo`us!A!q(+^__m6?t||JF&9}Et$nAtcE?C^Htu|(VLTvv8#-XuKnsPE2gzQ;nVNEx+k$^n`=CwNXHsu0HG z(TJ!T6)Xh3N>z~dg>q7vPyUq!Uw8 zQ$X{Bs>wCPvjx*Oqrf~P@nuvs9-_3~t??8ZsrHDOJRJ!;5eSZIb{@5RTZ0B>% z`@CMy=S`B)4T}HWr%m6&e64b12Oa`gL(zPN9Bd63n{Pl zpS~E3+rMz}^Qxn){gv4t2ZP;y&c7o?c!gQM5B__!}(_=kK8pd|(MrcBa(-Hy_u#RHy?c2+ZBM-A`Xlgi@ui;c5?09IT^NLeBiiB znU@#|Dmw#DZ-CemAp%RMRlNjtjz@XBzN;6dNBhUNHMzV*Xu^L5d!OIqJyz?@4^i@B zX_1%m419W}9;4i@9N`oPnx?Q*nVn+Vi*E!wVe2Ga&j#mk-+vnS$D>`gs#~jE!xZZt zG-xk3)i+G#bF4^GGZcH-yPU;Jj(c^_zlKKk9}NBjIaHXOdm6BLGpe)u`t{=YY@O3C zeFkbDUYA4sWYB@yXm2t4QK}$B&tYCATYGR`+ple)wNX^?2D4>{GLX~bc&|?5=l9Dl zC!{+9l>}s{s2X|ECxp=Md78PyhCJ%(U%+^Jdx_AAgMAtJ<>g03yV$qIl_IsYzXr<@5TJ`dv7k z+=74yn9iM}FZ$j#?!VkJQ#URr6z)nAYV|**?4kO8`Fu<@ua@5XM6q&V<*&r??Ah~U zEbf$+u_QTE`|D8eoAbm9leNpk#Q!*;OnclE782J<;;M($kbO%sMR4 zrf}7cXR>Dl5gPPJ6JgoJW3olHlk#3GkQI0GB_u4;qOvP1+;o$y{lrc)*wN~! zRY4u$_=>?#5*Q#wL?tx0uO5n*%pybg6@vo1?93hqa$VJ;BrL?Z)%wmUz_N+cWnXZh zYEzN>*6}<9CBg!R=h2Kv73>LW-t-bPG9JwVIoU#!P#{Lz)Fet9t94=8R!}Vxc@^!$ zv?fzqae4oNaEA|N(T3Jr(j7LjM%g{-4-QRg^?)>Uz7GQ#rL0Myzy(FE;oa^cT2aI7 z(XNTz-1_u|hS0KywaSP%<@{0(Yw2rVVdn;D%NhJ1=%doA(1w@|R2Dx!HgCdJ1_6%9hyf6Z2f0=NH_m39Jm&X~MB(;%>zRnE@FlGM~N+fc3<-kh$Kw|*|- z6O3*Wa1;CziF%W`zH;yt>zp#KMle#H3v85N4q{Nr>PyLK1CeATURxIoEdap#R50`5 zFd{0=0SIvMsStH^-Ut9@?apr9yr9pN%i2KD&1E&;$aN#lrh4qHz}!Kg+81hh(ufHdfQ`933Q+vN$yM`^_ z1zDa?=qkDG-SXk=mpubsjv)0v5OpC}#+T-E8$*7%D3epQG`=zGs=u(vZ~0U}}(IRJnuh1)Qmy!JCuX zt-bYhZ3kYM6*=czsQMLP-zhfm5IrHANA{cS> zY*Ulla>#z!LV_ERoukkCI5n=Z_Q%?EwO25_rtrVO=LJO>o?R zB^^L5t{-i5U3_{@tJ?;8C<&5~At&JxMhd2Aw&--Er|xD8DOzYeFSVef!gez|v_<$9 zi+S(AXa2rbfS0!Y2uhC;4Ds93yQv+>)P|6)~M#_J-oT!(8DrokRc0>BPBikEg}&e1q9v%gTNNtX|axjMQhB8;X(pqxEqyrN*}4S4soAyA0yl zT%Luqs=Y{fNI(V04l{Ytk)1t?9`qDagY6`vzmKr`hgJ=tPOp$sL;DYnO5pG$o*e6F z2A3v!3O(>!Io7ltMWhI*Scw4`=)9$DXuA?b1O$7FTtn#@+f+at#K+`~PVQX`!ZRv% zsP5q}gQ&T!(YtBv3l=|)hsl0FyN17P)I>W#G!h&{b{DU+$iIg!sX3EB8g1?`QGiwJ zZ)$DI;#v`@Vk^6RSL+@Q0T)yoFRLO%Zod}Dc=UeXzV(64izi<9ndL}P-l$#>C(%mT z)(C*Zy#1TSg$V3(5snYhMy+ZLyrJXq;M9)BfegugL<+t-M))j~j6^b0D+oZv5)9a@8I8iYvRK;}7LDZCAUyKa6s{!6;?DvrPlI+t&?Ucqf@xTX55fLUgOxixUZ73KmU1|>v+gMFuyg%Q!wvy+N z9~K*m>ynghklpaU*+kk%rofLPTHj!lxFs+BTQwj0(WQBsCX4ra6CEX z@EL~ zG}g!O4qj?#GE1oU=wE1)TMAD2Q{v*SUmSbL`Bi&lYgj|W;wh!2tg}Gxftg8W_N< z)f|RN2jd&~9s@M?(7}{r(#ERErWx9G(Rp^J)kG)~oudy5hBJ&N{OWd~#Yk+*EBn?n z+*cRDeBpdg^cwqg7OMr)dYty+2yGIvmmG!M;EN7&u1K_cg4Rl?c?(#n3I`ZmC;D`E z7%%skXTg(p_>hRwV;ejEcH+yopuV6k;S#cCcglXAM>HxUvtw1sJ8KdkPIIFmbWyG= zxt=M2_bmceg>i;Ra+(oRS>y+VoaP{t9dvz0Ak&o_m$QsF7K64+=(|frW(2|%t;wRr zT&T@Jnv9Nsjk1oKG73ym2$aA@QQzr5?!XAHdWoKdm$i%NZ{UxD5=Pg|X~wv38dVl} z+hFd7F-Rd6DM&LEVBaWe*J`lfh?GbSlumXTAGZvq1`MRJcoEpvJEZ7w)B*KNV3&TO;>tmF|d$p?^WB-DIdrOC;R7lzVP$U&_h^ zTk2EfnH3$c3`@ZgZos+bR^U0lkkA|Q+W|Ik zl+Tns2l1&Y7J{&@U$?CQjJagVYe>8w^FL4#_Z4i^VWyM`SFT7Ke1W19%tgbWI**_I zq#ukC>)|z31?UzNr|6_TpEih_BCVt?k2BzPXy1;XD-T0*#DRLKB zsxM2ruQtHu4_)CQmWs=9k6#CckoqcrxkIk!Sh`o-N-#QzMtpcud8!tZi*wh)H?;qmB;7q~&=#M+Z`Gp}QlLXlOQPX>Eq5BZou9!e$Kqu} zn$+vpHGc_`+hK2wWH>ijL(0Gm9L2XG<>Yk(ni!+0+|BRsvM3?1~H^5>3wT&Thk)QE=;v{S3Q^^sJ6%KP^G zr>gN=ccom!pL)3K$?Co*?o29vERO-|1Jj`mpKs-+j%N5@Ng7WX9yzbmd2Bq=eq4HX z94&LI@kv`{P;haL#asg}7Mhdf5-u^F>)k>RM4#^q%7Z$~n%xr2;w0z|Z)ks&b=P=i z;~AtZ3Tnm@GCmls_cN~N>>rX-Ws5|(2ZO~BWBOm=u2mJ8yU7V+9l2BCRf~sdrDGav zFn%CkxxI^e+|TxdT`6Dfz(WP-Qjn#E;4Ovy-VVn!xYIl}C`yHsA1rx|<3UY|=0{uG z45;I!Yg*_S2ndxiI4&rUFC#q*W}Uo1jM3q~D&-w`6voxDpzcp%;ABpeYE5*D{z&`w zc9rLWAt31#Se;P{IrFz|L@D&gKCu$FUN^`isdEJP?QI0nG&93FILqmR? zI)F{O+EB_SG6vMK8Nj6kg<{Oo$3+eaGQLIQS&(RSlsVRN-bX@uPxwALl49z()*ohN zz&3Znu_q_AuAl-#U-BhBkvW|5$K0{oQK>teWKNqgT|Y%`$#Y&|UREq>|KkCL<0=PK zUs=ecVVF_e77G^7nM}ooDNH--5mhWHM(L^WRe|Rjlt@x_P>8Hs$Cu7h>h&?t5>o-? z9lSr_TAlJc@l!JlV z=<^5C@{Ni8%{3y!_{fLf6d8)+WLT1o4onyvqpdiW*PsNq`Eb@cxT^*BgFIT{Dnfc` zz`!bLVDM{4Q^zDZf~fQze&gfHRV%^8aP|+|EV`N%IH$vjDLPY(0R-+1(i(`*6C?7(I zk2(d+n6AFv`U83#* z*|pDsswO$(_*?Il1W5^;GoOk>8)ec&8`*Dl+7S;lwE5B{DGjzwg4}tY)9~t~9e{zx z0srXQhA!qOSS^}bO|8bD-ZF(PDQDw%O1feHNIh)__^2P5J_kOtnr?2eD~}J}A6SPE zv|0;A-8fzE_o!ROUmnjuA{1=UjFUPlV1xI3`}Td*(>TqcrBug3rDH}j(*&05@8zeS zVT)mhaipKWZA#*+)88Z;^(qG6(>6Q*X0F+JPwxFz?c)s^Y0fgY1b_x5cgxDUPs!Lj zg-y6GG7(cb$1ykZp5#lEwzyPWart5BtC4O)E;P`wBd@xD$|2dclpmRmaC8jJHM`~d z^N;U8$2&-&&CGKl%e_yJENvEFj1pC`D4^2ayNmtT{mX4aqo4c|tp6+^6MZu7N6HJO za;=4rF8yw<+8XR~bCpG?pDoaMzNO!!D`>3gENtqy&>7lDX;YTL1g5_d;a+?t0zzJO za^0|hq^~4__-oB^;PaqebUJ*K_!`A*EHsJYj)vqA%6?3%$ngIeli3i}x{=ykzj@8O zrpdcq_N6kZx<)=<0^4HUz$V!iGmmSMUZE3;BPJF@`>FaMxBQ`k#Br_Xm*X2SmRPCQ!eLy45U^}_CQJs(==Yac6q4BkG!g#6f>%%> za}q>BU?~)7n)N}^e~<2 zy?sV!F%K_IKXk?^C>2k{Bhz@8-wXwdk4CFz4MUPoBn{vDWM#$2%L)SWV6Nh;jH>lp ziec8yHIOX7&ruYNe}gJMmyYGJ84!mjyq=-WAJZGnArJDy~>t=Y3EXa zh{0D2Rs_9K1H$>27;h*k0>*%BFSP?v&H!>#8lI95zbLN3Fqs_?^UwOld;ruh>0qd! zJ1TT2-nw@wFLY5hJHd%0U2`ph1%!t}bG)AX^p%>e%Eqrpff?&`0pMe_$<61n;<9A&qr)TKS-@vTn77{u_Qd=zaf{2&Jk1D)*nSyZ3y{ zM?>cOTDXg@7AHdaWN2geH61uni1f@x1~GAa^tQ2Cr4f@Pq)@@Ziw5eqw*sCIr>V9@ zS#2cCz#!0%GhY$oBKjwtO`~|5z;X^?m%9r1bq$_At&$XJx=G!dIs(e~e zY|%cJz0wth0^U|l(CuJyHZkVKu)%ZdHY4qQYhtTD1PH=?&jprF_IBpZ&~XiB6$lv3 z2cvNFHU_qyas`LNAlL!2y1El`3A9!DU?U&1{_HDSHKsDG7WC}Xe?8k~lx0f+(6mfD z3)nfZ8wO+;Hi$ijeF^mAkdoBd-_*ahPdzSQM!awc^$cW=*g+>VRD-lVBEJ;sWK;=V zbBsAVeg2d(u>Q?y$=QF4`QWcx782ez<$E~v{wI)X)l2xsRPKc5$-z4A(s#!TL&L$b zeh2rJ#-5kCeqP)ypy`W;M{+FDo*nG1u~z@D$Mb*7V{65;8r{TnVy-7H3C5{QM%cs> za!rz)JF&hJ8+x_%6I zhk;Z_7*}M4SptXQOx*2HyIR9KTPKWk(!`FI)L-dE%4#rwWWyAO zhUj2$o5%-;fo{@TMh&NzosY_5;Zm>B@rw!5(Qc#aKWW) zk+hxcqnHV; z!Ta(bD~T0`vplS(7E^n+-tF*V!=xm#;xtGYpJ5X`_A3OWW4+=Ne#T7YFGgoH5OUNh z-o(f!Zs6a@VJ$GnLM%TaS)4<0{+yL#OvjDy5^=}Yn}UDuOXjQwtLK9Ptxbg+zuu?B zRg0hja4}HN!%{gzv=&KU@kY{p0n|FO)CVk(jBYg^`L2U)tQ@;OsHVYH(RmHZElD2Y zg^fgeT*C{;j+NX&RdkrG4ULd3ZH)#N4^RXOV$tF^mjS z@~Q^u9cH5KF2?H~!#;oCf$bNvI4LXd2~Eg>M?OMI@idTFn1GxP`qKXEVG8=_NI`aX zQaI&^=zEcUGc8XO5B;6zRnGT&%c<1c04QOtCDR?)Yt*Xn2D~O6^^qgAjqb4o2At_J zu#^@U|o)Y`_SQwdfWk&#h)! zAw%V#aUB8#1oOfGfT7x?A9!dXm`(>?458Au-qjnYc=pjsU&s!6L8BPt+-oxFX;*71 zG3UO&O*Y4%S>4$bMBEL@3!{p?BSPAU*rwRf4#BqT#LmzM*u;3C*&sO*2K^6I*06Tu zYWhDH1ZrbQKgTRv)J)jJ&)12>PJyG@))S``U*SKx`&kpCRj(AKS z?T!=*AJSveB|9k+>)H}{4JBl0-4DvPoB+kY&f0vK^2GBtrnlzry~Byev{Cdg2B)+! z)G5t|jz?CMuA4LOzxUR773m2U@hY{ndfQlZ)l9NAKpSV zkxt57uj3~&GP}P{$*x8ifZb*-O6p+zbVg++%|IKU%4(oX{bb1UpZ72qXvXJVO=;n(V z4YlZD5M2K0^b068~#WMqH@ODv_av9m7w zZ^(nQZvNgJ;gs<%9f~x~%Q<;OTYK{dY%)Gjv%vqi^A;<}|7CcY2dT~1rRLK2rI$PQ zj({OHv?)JUl0I^_nC9%CvFO+s2Y@+q4%h|phO4$bZ*{LecGr0I+=I0vTMR;H-Pr9> z9t#a+zYz3itm!D`Ogt<7tdOeVa<<3R0fx6@t9ZsYn>%-)pm#N%zfxq}Kme08m>(ng zWS6KXQJk#@v?!ktijso==34>R7Qc^oLk<=R3#?a8%r6E19uU(XxxX)+#gn7`76Ewv zE&I-C7}=6{CvnHu#2i?DrgihO1OWxWSYv4}sF|^tIH535Ek)pV@L)gzQc^iC+qf8% zXC#ath>TPwCok>}OiBqsO7p==IR13-nb0jZX$xvlC`A4sVf}%EGZfx?!fT$;*VB&# zP4LFWWsaXjbdYA2GN>sNEdNl@2wK!hM}@di>7;H}oB)Y*eJr@@Y^04nL$XcnfCi-* z3v3!2xfLRj0401;%g;WY*<+r3U~>Bi_1yq{ki$&H-?#YK;h1^w%AI`gmhdbhY3%mr z4@(1Dk1{a*4Z`$C#&Ur59?XQ5OxO(~@HqVX%c50~Fi6Lb9ygTrBPjaBe5`Xp`(^8h zrkS_Njc3-tTskCrtOkUhKA9oWu$!Grt@o8Kr%yj}HQHuPh8v{x1$jd7DF<7XwJsR! zUIC5~EN!Dglz;*>otYPfio8QcSN*3~|)mC}$DQ*)a;_0osEEO4s zH`5%SA3qU6_utNFWE?VH_bO%Ds=cnG8gw35=&C3o5li&!n}YwqBJ^*KGzqAtoxTb< z3+Ap|{&DZ2_bE-bgV`!mZKSyEx5X2)7`X?wDYTaNS=gU z+c|?!GZKFQ==@sG**|I^lQUpYC3^7xV>a|-$r*I96CfZm3eq`k+a(*T`yy#TdC><# zA#7@7b|}GSm=eU&8LI`UUQxM@p3)nL^T3*kWplZbqLCDKTFTY3!SP(-izUZUx4OD+ zy+lV5pop)4ZptDUeX-~EAl&0)?UsztlZ5@jRgC=p4DyF4CVV4xlAxbb@$z0*kE zT&5lT=9I%Z;ffo(%6dWPchms$I;(YZNKJiw+nj<@oZS>06lcGGPFfe?$?#`qk6h30 zi=4+Z)KTUq5po?zq#)4-5@UF?E43#L7N9_YDUkeJ1&#DDNHfY?u{+&wvEF6bpyOO`xelyiu9FR|(JA19o- zP;09=r7YwZ&FAz78-ovFgf@4QcO5!pd1v%#kp12X|La5aLCgN#YI&n%n(J9~%8XKp zmJZ6}u4Gm`2!Uw5aV^BJ>@|JhM8ssEt3zn~z=h|F1gkTkLT`6+EjGICA#R`40o73$ z(01NK8f^;RkQ!V(7MnDn^t+f3k%aI_RRk*L#Gx1~CnbSe{j--Sxg)OLNgK~lr#Hywbezp%W z)H*Ax>*yh#z1*#v+tmH}+LPpH)NWVb-N15Ca+t>vL~FB5qfK(FyY3p>WuW4)sOIj{ zrdHW(BlY3f2jkHQ5NS?&&-T&Ey}|HYQbpRn6B4%_bK{=M%ua5Hy{na-tK9gRJm=V9Pu$CDMMVGHVE!FvkU4mTF_(DzXMuRWK^V6OXlw*@CzHKwShPwd=%(r*WR| z?m$tIN-ASGso(=HuKMKH1T2l=7|LAJZ;O-wtPIGkGj4c`Y-9TcRxEesf>E(LOE+Kk z*egPb7%$Lx`zWmOxjUedcK3bN`$dREO$IA@j$%^xHwg~XY)4@ck-Uc+p0XcUL{Bu= z80#c@-*;U*3JN*CA)3xy;eiUAv!6MsM}f!G$TmNK5A2}2L!hb-6h9sXH-Nl7f1)p{} zjQ9L$3!K$MRH6i9_z6-GmfE3~^u>KWR_kz^CgIp%sCp&)P5&!`e!bDje>+Q*?<$=- z&n^L%Ab|TT>#l*6yHE?z8#>(t$?jiC8{!VmPR#b4TOo3Fjp?vc4uHy*L{wYBb`Xcu z_Qx}nRJSU+$SFvm&&cNstKs0r!4(9Y#1HNUbKfT8 zcmh-j3_w?t+aJOlEv!2FIi(=5h z%-hsf?IgMCz54h2?+;&~bb73vx!U|TYb)e=;&0dak6aB(irg;AHwz|xnd{x2-?->E z14D^tPAf^^YCz;k4vKULBd~QhVLL@_P|8lyE?mo>*8syO- zK~k|!|CX!jQj@Z*uTwy_n1O-osQV{f8_$XB(R<3~&uymfMPJiVoD+<&b1u=nlYcw? zxO|?o*T3Wb-}dfw%ox{4-?}F{QhX_>shJz08?D#wv?3O5dD<$N)jo|O9aPHz=IJykJTK7Q7NbXE+{`>(iJrO2%q`7@BvrkvtJI4j2 z)7Yv#P2@X6Y0T4*_p1OW#GNmO2eES%_zq4u*ue2?!tDwJ?X1?keF;m!I)k8Ok!0&* zI17L-EHbtmP>Q#uGz;w~1`H{5fS7NYwpdBjl@LKCjm=oSM#X`(`j%$#J)`+n!Axpd z_|wkWeB*@W;WH}|V`twM1oZAr9lE&YD^PE?K*O$3 zB<4an0rtv`x~^9?v3+>f-7N13jFjII?J-NQ?b_cm;qPnI|3I)a9A=vA#)4Z1B90)k z6fYEkG#GHBt#>EZlI>Q-OF1VlX9j%_EDo^gb*M|ACg=;%$y-t%B)Q*j;Mhumc?`P# zrUE2|5SeB@Cec5olKXFgo4k07AY)aoREH#_6F>MOYSsTgkd%}60CWc&16r3}mH3QG z>2p~3YO`mdGK_wwk_*-qegJ4>)L9C*1ND?xwl{3hD^%dfn+@h)V!#ec>Uds*)sXgV z#11?v9LZ6D?__0|CLbUwFFY-`L=?1)=82^4=B8^|ho$cN4d{z-PYMV*6pyo_r1KNj z3xJgOZ8y|3L4n4xOgMFAj4A!f!Z`!r^`8;#UVPUi`8t@f14O0MG65d(ypTC~%NFbCjEHED1Zn!XOXw*{)%x=3brr^SAkNDv*3+tU0; z;qIB|@<#ifvr#oMp<4s-6 z=`klj>bAwC-Hu{kJc05WK8zYtvx5%@&*yAioLE9ME4kO~M&(&#(;L5LXT5EVthsxU zom#OiGePkE!xT!S23O)>^!}4)lLU4MaIU2F>{FAE54sKIk&+xB>CIP5`YJ@jH6Vdz zYUw*V8EE>?3&!Fhrn)36Ka9gZLnsUuY_>ZyD3`M#>MKiLKH8>k?8 zMEHWQ%l0*I+hL!uiR_n*`8{F({*3ML{R5A-6fP$W<4;KrqR@eSHBEIBU{*y+Yzbl3s0I??Oh@xz7 z3lw`dluP!6u~u3%^V6N1}1=ihx+DBHNcaRZ*=%CR$JTfua- zYq)nf(sByK9O-GemFdM#tg?4&c+gwG52kh)B2-$Mx3fJUbM12L*UNW|sq)H(VaFME~aWx=Noa(9~4oc2N!Tyo^;yS^y1elX26(sk7z~1^>P8JoKR7Sao?MMqvJ( zm-W-d8t-;8zH=lt>@B3|-H*ANwn~5O<*%2p!K^u&T=dj|R{NWq@sP3!{rB$ii;`KO z#^ODjRh_%n!U!UFq^hfBR>j{5CT+=WCwTQ|OrEBQzx8{eNw&evuBW}Ap+z8l+Q#If z6m7HjcX%K}dEsc!V`uGSu*?!;ObW((-6;Adfr#-NN^o#8OV2m-97KTd%qE!G9VyBW zVQhvvP^4~9S2tr5BOxh7E*0K{f6GZp=G8UlWS$?_!YF2c1J1f@&x@D}Y`JbfZm?LMcVZs{plebf_n7y`Byu;l&FtBB(~& zzWM%b3EwUp#b;k&BMB`GrZ9SJwQrc+zcKe&%-Lm9SSSu>s>xoT#w~+YTK#lDunWa3 zf?%fc7LIlZ)jx>8g#8aB!qQZO4v6LFvX_wXV7Sw#daNP+((D1QLiQlyTS~>FJf$mz z7fQGrqF0QlF~%XO*H8IedlF;WZ&C!iNw!Injl@doQ;#G{`gguDS&LqFef;d|>4G4Y z1B9z0{sBrl;{m&^SAy6n0?*%>I`izJ3$(gHsE$UwFcp+A%m|tGuv3kciiQY7UxP?6 zK|2Zk3A+zU3Ioq7(br_m#V`j+3X? zZB!Y2kMgd2lVM6E&z1r&$*WRrb}F96uwH8CIR1EC1U8HXS7r*UJ}VT0ndaaG!|ZSA zsYbxn%^)!<<$h^f6wfrO0MrbsCi(C{MI7RsnM7iFif{fsLxU7rE#u3q53?PuM5R># zmOgD;0-8N)0W|{-Jyek_W>(?f@)t+V`#a~zEHaMIci<1GsW(N0CV*STsKM2Q-=J+g zAmd9xmuJugL}qNaK{phEc`7(V_lOu5*oET0u^E;o$fps{4t2GE?tMqU_b+07ISa9g zB*0P|y~?VmmpX{b)c}Y=!IGQ-hR@H2Zq&Fms2@WB%RLgtzDgR4*>{ms2|%gwY~i@` zcocgj<#-HYNAcBJk8}Z~v@C-P+$`bZ(&Bz_h?)woD~;0PJh(VieB1X^sh&I^?_Q7enqO)$FjMvl392MI-i_NGiaFBZm0))0&SK?(`%!gV zV*=tznrpC<`l8nETx~P`{6co5HhSE2_X4>F*{#rWaCP}R)QV=7liuE`13$^CyD~9X zQUjJO_dZ=15-Jl07X0h{kGa`}rS}`9=a0+12tDGHJ=sKhQoZtg>pgL0$xvImDR+wZ z$3r-J(BeUuspHF?CmlDvI+kl~o~0H<)=evW4vj8JDc6#3r>$&jeHr4`HOmKCB=(3k zuj%v^zqr?GdVA!fI47e~@adrMoirr%Q&^ka#Ym2=*`i=ZOGOf%?jIWni_ygp!5Z+G zEKa81NC1YY3=8GpHK!HGeIn9St<6i6lKVi?#xy=#4R`!(Ij0g|(BgB6yK5D9L8rv~ zSX*d#iKM;|XzpWcQH) zGw10N{z;EpJL^RiuH9LSSxpsX2Y(KJ2w6@^x!|vMe&uyxakmTy`1ivNT$JC2-jqWGOUpw8bC zHF8BFRc{8&UHcf9mZ90A&AED3Ays6%{5v8pZM{`ndRLUF9MrvZTG{c~PnrKf>-!%v z)Y|c`ukQ;5%Kl5p6gq1t%Q9O;DI)woGh{tv=%OM#toOZ$Un%sK*Y8mg*|@- zP5Z8!vW62t&}jvAg%3Seb)1MF-s$-38c5~?CK(}_9MZHMgH`v94if{oB=8LY*Uy^N zT!k?t=Psk}D4|SNB_FYMY}Zi$i1-p9dAguy+3JN$3=V3$FGPqc_Ui%zTxcJvmrI+( z69OlBGDQg~uWX)GxLE_t>= zs2t~(=-2wd?bjo6cBJHZ(SM*k0Qr)^pT_(bo1hSeY7q3ckUM=7MZ$3V)6T z)cJG;>v<=$Vgw5(JyLySd_K_V8L$ETNtFE8uZcaK<77*nw zmo!duW*6*dS{7AudQNF}cIje5e0*rT5I+Z(mp>b%A%h05r3xPQnOydBKnF+p+pIyv z)F_I>152fE8m#FYYQxUR0IS8;A_D=Vat39ho|Gtu9Z&&$kP(lE6?b%&#zRH&mfn8N zt^2z5OKscN;tK1eC=WPX0NxuBQ0W#xWYI>bjM^~4sxbzgHraB5DA)-CRBE_veW9EMT!T z*Ed?Nx6V9~YC8YuQgZf{L%sX9%tjAyjNPl%u4&SyHKR0(A5D1Fx=F~o2zr)nqaXu< zao2*n=sqKPLz?dAmFh!7o}LC2q4Bm~d3! zG)C3VIBdn!u9WIirOu|%qWv>kg_`R94a2m>Qunv;ZWX?N${tp*N@rOlGl4#;(GdmL zy3s7pxmBkz=NZuwnfc{Uaj7kGRbOA@q%Z-5{22t5MO5CC4Ns6h@GYb&EtNS;_}dya ze)SIjjJ^r!5fOx!yox7E3I){{@O8vf3oY}hoFn-@&yq`;HR_+P;*)zMKGm@CZUSi7 zm2-rmFU<-6xL1p-H9X!Nh)QeL8q!eG2a*Gxwz}A=+~ja`ll&Ek)NGU_LZ0 zc3aMiUHPM#FD!}nucuDq)Gla~KeLRTc%BJFh8%lK$Py&~G@`L%C5SPiMcQ(nEjOjZ z^b+84uk;Db?-+#4g(3YghyA^Ik9mHz+>_FZjXv+R7Sq_ruw%Ap%s02^>_M{gd&VSF zPV&NWr>}TBFH<^JmrzO`6J~-?4tla$d$zyZU~{ua6sHUpLS-Wdn)pyvao;^{O> zd=>(phZ!yqqsoifkDcWQO@q{R2#9GHmbUg-$&rv}h&s3y+|xM{d~wjXD4uo^2Xp^o zB~Ze#MyCzt+sXzL{>q3PUK+pA6T~%nq58YTBw8U_MCHht^$`>*Tm82hehg?I3-l~5 zB#!;?gP{sV&g8P~#*B4{tR?16FXqq1hE1Frg4nUnGHPyF%X+EWinHSpQKFS4?cAld zaK<_VRli61{s}I!CQKE=q8R+Zdr*;7eOcT9`z=r8Px8Q5fNTZ$qoUttQ8Ss4Oya}A zD^NZ`5&SL@^YL_hQ)|LFAISr&OFF0po(z@Fj@@6%8U7vh1b;Bge?ba}1KR|6wu*7pbw^SBkBU>0*n_fy|r4El`|<_6y4;4p3| z3Y7W43X0${h99z~ewK}ums*>*O5bo6nROfB&oC>DLMG1PPL-$ehrxhyE<7}B-3QH+ z1X2l<;lq3`fq;-$mH2Z}gn(o59ZuyXSIKLK(b#Y`^;4z(x{;#pPfoPx)0I|L6)K$Y zPSmF3gFhHH#y2FBRblMGX=;ZuP7mu~^E4z|Q*e~kE5rPulN94wg3Egk8av1WNY~&oQx4eOu#G7|0p`|xTN+!jI&f!R1gQ`$h|d?G|eoWIdJb)2#UKL>CLnP zT&QI3u*|g5+_}@VLd8vHx15b@I9i%%WqRx0`#ZmX;SXNC&Uu~l`F@_~c|WY6b_&MU zJ-pY~+PzQMvQq2$DU+8d7mdjuOEZ0rA!Cximl_v2zOo%MNRqw4a8ItQXRb#U(^krW z>n>J3FO(54m0gPO=suDk1&N8O%{oaBB@**j;HJ|ET^%wQm(@&rN z0~tM)^%m@wo$d5<>-3CVtc|)ezc>9sZK|-bXX0w(E~KU9bZO(?|J06kzKebJGThHA z>x;t|;~67~8-{_ehjyY(4*Um_e^_NT(?C(idmlMYIj;Jk+X5jsAZw#%?K(F{ytMZ1 z@a}JkWacPlq&hW5 z{Nb3EYnKKC(nL9#$pnFU-d(;cPAlRn(g2b`S7boeg-VrG-_c37o5!iksJ&Z-A}LKc zgx#s987N}zU8fCSaZly;|B*r})i+DJ4TU^FudfcBAtMkX< zrn<(H;I1DF*P~@W9Cwz<67P_nJQIc)cO{i|u6Gzxyj=>ruX~ja8-HXtZIr_1S}a+5 z*S%|3+ydK;eCsB^{NC_2zGe-P_DR)E2{%<%2bnI;9g*I^5}U)i@4|fjg7p^yYLC%d ziwBF!{Z5e;Z;krK^SlbbCzdBZ`!Vbm($;0PJJkNp7!*2*7!D8`B};$G(7U%1qM5_r z=7F8zdE_(p2a5?ZAk4C1I2n_%4emb@8GnIxwB)!NpR4^Fs<51rztFx_Im$mLWegKo zLHqrfy@M*;-&T<#DO;jgS&&6QQ%FHF>$A*XQ`pyt^|A;7f?%k9qob=^M>4_pGLDfdqJyh8i5Da19m-z22 z?DuQ>oGsH>qJw661N1=y2XZ0-&O5jYg;)^dl~U;l%NlFzMP@TD;hK3KFneL7Pi*S# zk7`RBFbJPpjP-^gh#tS|(kF z<%h&^BC5vR-F=7*Yr3TMYU>MC`9jykCY}PAou)1pvOB!VA#VS!U|^KT`eh@6^?2R6v%tu&dQhDvK%0tk43;;I&| z1^DHcJ90h)s8kvadP@Ln?F>sX6F5|48`7slwXqD4SZ`%-<^!CSFyQ1mN>QHq9zNbkzj+)0FzqqmYx0ra^;}-x zz2o-kWo)zZ^y{w^7X){KS78fJWju^Wf>`iEk@jb}>$1|z;TP6ca=V*%i%!Wj;Cn>H zX3*k=$BO>BB|gEz#q<}=!&-nhmT7PO7k`w*&79SP`pQiP7P4gT*DLV&@b{y4^u(1- zU(dD#soV%c9cCQa*z>+bn{;mJt$U&y>N2@Li`8Zy%JmUBWYx0!W20Ht_iB1)41sp_ zaBXw_<1v-l+QZa2zTu<+_tELInE9-7rP>a-BX2;mnUkrH}? zNHNVl;FBG9Ik+|XyT4LfPtU`aWRQDs)|DS~TGO{XEEPi=oVGRoWV?jrsQ1tBhXm=K z6d0T`UN4v#ScggI#@co<%Q4MFi3*lHp+M6>Km6V})>fAV>v>FhIK(Gey#-rdJh)(S zbiMv*MK0TZ6Rm~LS$$3L~|DR8AUHJ#r?cjDJfDm#E8B6*jV zpzg`r@wZ2zl(~e4yFV0CY~F5#JZ~a?NR2gmT3Xlr{%ZS6ACLXx5*@z?dJS;}6(Ntp zTOt?YO${Vt!>5ej_G1HF9|>Q(FZ`%Od_z7yP5h~2+|!YzR0Wxt8*Iagi#@)!$BJen zK=*V;C$BU)I@LP)$LeLtC0;v(o1C)=l8d{Pa7}X_>3iV(Qd`#py*HoYo^EaGv-RF7 zVDf=#d)nlK)Jhv#_|@_BydQzzw&ZU9A;K2r2x}MWWr37O49rA1xjZ?Z$0UM!Ej(Rk zczBP`k<>~<8N=2NU|BHz3bv~yKdPeO7I2EUh2D7pKQWG6hO!*Vyn1nq!(WKw6`4B{ zON3DC%CFbvV%gyQCBraW=R;5^EZ+}bpsL}-IrfLH`MU9_l_*;>bq7{#y{*R`o5)Ku z79>euAGpJ4HP-^m?!=I>t~S82pG>5!<7`2sT~Ezh+Ffgflq&q!=V>F@D|+++^I%_a5Amp%B{HzyQc%+%8lP z;)$?;Bk$)DYAW2_;gxvMlS0NDvBII#C}Ty0}Fkm|U$ z;5A)D`d|fZN;=d-tVpJDdS+EtHAhj-oy$@=GnD}uN-)CY(IpKesfu>TY#3SN*-*|b z4FV4G0}1pfI9Y}{1zj?ZaYs%q7^yP=P44tcT{FWq)JvhTk^rIL)Xop;GZPkr9stB; z4>;d)MUuxn{2*}tM5zsHrdp-o9Rq(=CkO}BTNhTF;mD-bYa7*^MRi37o}U&O)4*Ve zW#;v5QMMd!nx>_0s@6mNSe4Vo$IJJ_VWV0JgjtSg{U-kK&l9am9aMG}<{$xy7)Epq z@XSAurB*q)UWZ3jKUQ!;0q!fg;GK2lD3-&sgh63l+5pr5U8KUYCs$NK=s~{F`2Av8tZrqAd1EC_`F&_X;6RnX8Em1_t)#N8TI|`=prS+5 zDb1k3VBCSqqfZiBYq=vD5A(-mk@b~yJ8p2+g(;_Y_lJCw2Nt$8yqn2ld{e8L%F;RQ zl*U)*o9tThzUi8L@{KukBW|(xaCb$X=WN@Lf{9rzXU_oN&v1 zeB7$gk@UE>>9M3ger5bU;8OPBKr={qSwa3F#{aPF+c(Km?yno#hs6g@x=~FDVV`fQ z_hLH!B)U?ExCtD*H>Y8#i|@oJQ!BI;2W66Yzpd||YtzNCouYP#2?z<6tBZnGMR;xX zrc5H1uYyUl4#oXs-03oe(&Vqkra1y(<1wxsm zkxdLBO8cZ2v>IK!smw;><5=++7N8)iA}Gx4h_QBKz?I?l6Hs>?q2`MeBE`=V(4 zTuiR_+u^sRw~~_Hp7ZY5XBKcb5uJYg&mOBjEk8!99)*R3Bm_5iKZF%z*G{q_I+XyKf#bzi0c%o#)S za7c2n^rBb-_^KgAGeU)lVGc$K90pfd87K~xno_@`X%Ch#Xl@W9w*S&zGvWB|>iCUD z{FWTy*nC^zw}?L~JMfM~S`7#lz#!5HZ571u5*b-NSjhmJ_f6~51m0M>RubVjwZL5q zj@2FzhZF`dj=9PRpu#Z2@k5c4R0Q{q%3xW>fMRFW^o?s{Q$+qtC?~6#qQ*Yc4hZ*8|zDatUA{1@DkJ=ILp!t_i2q!Kq<&>K|$jDbm zI4DU+9Y##UA>p+1&y-!FeUtc>Qxxw6r9>-nj3~XR@SMjBbE$7U_?xM_hOE>+sXppd4{58ZNs87HE>rR@|2vW+WvyCPKdml#i+~i}et{#=(rw^51E)u0<4jih zgZLQ$gNYj7^rN*h<8vZ=8JOjQ3Z9Z__uJt>vd|cbL_=|4mJgvbmBc;{kFSNXu%?_j zQ9wcAD{=u$AF)#jYeyHYDuWi_GyQ1|p!qfnHeJK_K% zNlG>x2cTYkVFFmx6ak&9Br7S#X=1!4!u3y4?as{3iQNW)Ih9GWwn|LZtb9A}^;RqO z8k^FVxWlSAx&&L!i`;fd4FL1|w?KB=I}Z++QT)*Om^Fp>ZF!>!Ql@#05QB2L*06Ri zIw`bShWQ*P7)liqt89j*ZF!1Re${w^BXhlt9;=>{ovbvy8TI6X||WwY-w(23hxJwDL`Yv_cbM9xmGP3k9>lclJ$K_J=-yY!4>tP7Og0gJX^nFRGW*D`1T(tDkz?2UUq5%gFG1( zBx~~P@7TH*`w0Yg1I&f^F~rVg>{tC^$521L57;B0@SWMLH^BlMvH1 z6=bu%$%5`Ha?lfE=su4d8akdZk$zsNU16J@pOb_h@ER{!>KB?p*yLP&eQ;Etd?YG2 zC^3^0h?J9E!Qu(BNk|%sMblPM*Uf=w5qJ;}nX;)rL<*?K#T2dP)T8ph z&)_j-Y-<8S4S^X0J4pZOt4~p0t-_xs0Jko^Xo`^SiZ@n=TQJG^%)N|Wah98o0|;@o z(49kMn+?6bbB~-LircO1FX!u51g~wuIe;7{s~rqQ}z+OP+)+2B~d8R zJsy#!!-s%y#4#S|omHMX9)||=Jpld(i*mjx5emxBcbX}N2LxWb_NikOn}>V#vv&1C zycOq5qFUwE{Xa0C4ySKvS(zQnPQvVJu!eDFVE@8<_#30$yJEvaN$^3QexW?uW>j`O zB5H+d;g%bz7c=H`u4=@*RsWB0h<|0Z+t@g7ZXqx2K4t@m$}Q5&#OdX44HVKgXBE)0N4jhb^p+s2@fY*` zJff;HY2cZ2sLbyVo6;6Pe)Rfc>2jf+4csm0Y%1a$m8GRpc_Ez-@KKcD9|Pr&c+Mgt z_&$WdErr-8T81o1>L1q~lyX|`-eFs}TR873e~sXudgH*1*rTMoRh56{oc;CzkjT7fZeGI0aq~@K|sRC&^YCpWQ462E&cmmHk#9E zMjvS|^b^5UYUd+WCyERR$!j?vvwa-2g6-c0{sn#Q~*D}L4o=wtBWkT9OV!r6yP0K6YkL$)t zE$^8k?>>oNU@a?E8AXwdo*GUF2mVMo@B>-@X0GGUyygze#ut9UFPq}qe5-l-qkO%a zSrWd2+by$y8N7ygZA`Vu@4JpGzAnCZw&G8)O&leLIrCyY^mE)B*%_bKY5h4h&zSm+ zInDeP-``+$+0dptWq6}4^6zeX2?-yjLI6CU|}C&q-iNwW{v5Sz^VKowG?)T4~G4TLm`Enbpf&sg?qCosF&ps@}) zK1$EP#Vm;Ee@Y}P$&5V5RSqby<*$j4c39Blvjtki#&YIN)N42Z2NxZ~$K-pI&&(>? zBDK|6#&Tga7>Boam6eZK2Eb~-*Z}7L2P&j9*oIg!Yl7sDDuP@3C+D*Yh{PFXkKG05 zmK{QsboE?o-^7dMO@D-M^{08XP|eBX$unzDyJ<=A!;4F5S5l7L@o6>-_VEn766~B# z`?F(8b`nopS_?m?_9sVgRww?8QCRTg8NXbAL}k)v)0t-%vIXVg>CI2$oUHK)(bv?5 z{`>`k=efM@SbAzmyqy(A_Vi{=-}TNa#Y4w9d=N~!n_v&sKzjVjf)!2T2RpiHeF~!Y z<1|UqYiBi`>B~Yb+lH6G+2s6vk|GcQVzs5P*Cl7tf0t>xJTS@fygZ>M#MgrvR%HsH zoPTPtT9Pli>;+c*?4ilC~w{q`?#l+dh3Hv=B<< zJ2D`%aF0Z57LlbZo~H%CWr`#O-p`kC80ycofHVtiQU+iSA5SWa>c(4__@RDj8e@exjOtJ&tqYsRU2IPP;zno0D z-$t_Y_fvhMauPd@L@2#G&xaWess3hmWGgc7f#|e>!`^DAUI+b|CepZ-x*4JrOH&lL z+f=~Ft%vO-dVd`^0&TAvFH=Da{yO|W^mRKxf&Tw&zpeyK#;TdbPMg!y{|?W$fYKj) zMRp;FRPbWog+(StX{tE51^0pgJ}R8kB}_9t`4y;RLh4W-Ir)-s=g`<&r<>(oeLr>a zYNyVWk;;cUIiBU;aG=o-#D^-u#$4jgnkNeqbO!!>bt5P0;e|5a?u&LV5pBeRA#iTR zo%6Llmh(kX#I3VU^);3ok18S*?LK~cZk5q`g2AL(lBQK)xuY~NunYKCI2}mrAN72z zd$uEufvf;7t*aLK18gsozfPf0B9MxsZMwk6V*KfVY!ryYGFQGlr+K?gI`4x?T1a?9 z8cU(y2gD}(ch{2vaf}ugp7|e$PC!{tRr;Wk%+|f>d=eC8jDtxG-!6ZhrYbWooRIs}#y6sco2 zI~yZBrY$6XLviVQ%niRlL3eHA^B;Ek9koKC%>O{t>$C0esFCEwEX0MpvAfl9sB~>? zeOLQ86ew_r)qmC@K1KXFb1Bn~WaB5u0Nac9M06+)m(lPR)_qsVNF0E|S=R-EGrMBK zDkl@wF|m206UlMTX0QyUZ3*sRL|Uv^dIfudy;xDcFjvBY$&}#nkaa`bX`~-0r^{fj z{2m);Kyp*jXjN+skK#R)tKj|r9LO`f@-~6DDT@=!)_|{6+%>8D$3oBWb`<>4o5AaH zmSB*I*_eh`9CIRmPj6@+nxO(ez@|BpR_UNXq)+4^v4_$K%l8v!x6dkTOLtzAmQ$|a@o8G(0|p<;`0GHyC9Yz8RBe@;N~DE; zcw`1NpQGVyJcx&HR!bKmn9+v=kO29ftfR8jR}p^9(R;k=SiXhOsSUH~)JmLeJeZ%N zg5o&f?vqvb5w;$$u$=9jU~3f=;G!xNR&B%N5jEb~Q<0rlbtZk<%_`fzlj^piHfLfHd48j|1N}ZRo5`#+Dq1$im%DffTW_QN@POgDsD!)P4D^DVecul`! z{eb<;B!kRI5H=1M3)v*M2d@Z{kT|BwCV3SyJ!FQ%T-G$qt$eD~efyvOxv8t6Y`Oag z$`n$meCeyNDkpBuE7t#(c>)>3`=PR_4ds3uDa`hD2uwUTIY-rz zftLfb$oKoro;H;&sD@iVns7@tzk>Q#>FtQA-7&ZD!_VJKE&Kr);K<{fR>ubPSqrL78u}&~?U~=rH7`_r1M##x zQtLOiEWfp7KI4p`(g1d2o|0AdT=7L6N;J%6wUk$7K~si`jJUf;n0CrR;0BG=bGPI;1~UXk1Q>kYIX$Bj!MIF z)ZMDG?(um_HQ1X>!C?qRIn!>_>?d+0%bu7?X26*=b!5;0b&0O*)8}#LY-)=1>z%#I z>Z=MXS9K1gb2}#MsLHA*RC=itLps7Lck=Rt|FgHXNe1^y6+par>n=zHL6s8|?(Xa+ z`iy`ro0m0~^;0&Da5pCT@Wcz#?9J$kce2ZngRa(`f3lyxH}Jo{pe~DTTiyv5t}gyl zKadk>=jIUo**@?p%1ftiGL|(@=z3COG^ii=QZc|O zR4TVy{zmjI>8+5}%cpz0?sY77j9iX%kP9`9o49X^4l<~9H~zES*tZF21AUux9wXbN zno@TZe?PbY@*=}A<&10NUEf!ln)Ze(rWV30g$|w@;u?=eWyS3%){)OxO&8Ff+zez>0C-toJ$ee<3D&97EaGBhMDqYW-5M&XS>b5p?obn}y(NGL; ze*R+i1D}tEkX?r#0u|suvRfFlu=}Vr$UsD`MQ|*`E*yPo$6{_zPsK1Wp?A7eG#d7)@^c~GI3I8)60+6U9a@U_x*n$sfzPgF1eJ}M*~0xahX8x zqj~aj3q36t>VJH!Z;0-WYc17WY71?TkzFzfoMgl(M&!0`snx1Xy=2}i*$j@%dsNt6 z(xGrwXHhL{drB%L*4`Sk(J!~JF8zJgAo1O%sklr@;7@U8chkXeJ8vVJCdmfle@7C7`M9Y@AbLjpc2nwBU8!n=G$UH35~7vwD>Uv;YP|F}v?r@1=hoBVYL0 zQA-qS4We2V9^F@kdO5;*I%+XuB&H(Vtl zS(-JQn02U(D?ZbUGptc*?+<1OpQPNyh2a2Wy-6=_tL&8L*0|Mq~X`Y+-3E*%L)SF$aAtc*_JiOXj-CT)z;KQ zlwPf7Yf+ZD+b@?ZCm-It?3nV@@x!?Ci`h8b!#4eTW57?0DWG#xh5h%n+r+;PWTuQ; zLsoSyhZLXf*|BflP>iwcv)}Izo(0ie0p6b#Z2yD(1z9=?AVDY5hqQns617zoM>;ol zxdJc;QEM`u*yC)?4(G#ulCPmx_E=->*sKfi7p1~T04ya)AiNO#pQS2*;^jJcY%2$? zgiW!LO(;?+H{*%>g+q~}@E#e(Z!m2o{BJ^T<##P8n9p~bdiMEn_#oQSjr83z=>-tP zL-K822xv5A&IhvP!a7u8K&kEm3ZM)^3AjN3;F`RVgMycv;X;GB0Hs3?Y?rC?C zoSs0KdnbauE2n>J->||TLV>6n4DcdsnGF zDeVu+tb6CKOII@r4L+GJ7Yq5br0~sJ3+G^mUd(m>uC1w@f`CY$HnQi2N*_z8wVD`i6?i7U`F{7WRK+G&lV=v->S_OcAc6g zQXb4m_`EK_dE2&?-uyWd8-aU1Iq`%HV`SZw@(dpr7| zqDI*D3Gn$5Gl^I~z9*rtD>x)7DPr`|^H=S^okJF0Sv0rvrFiqHIP+_ZxvP8>K_;b3 z03oD+`C1k<|0ESj)t90Qjg(h8$z zPQHfofap`@$#_gpgrd-$!kOJ8kxk|)FiiDyu*0R3!8*sj>7U4HIINFfKCk%qql9pF zR9C9GohsExD7L;K($mVOr6a~f0TUfVKXyC+K``{wqnm*-4<5goRrQIpJcRdF?WAPZ zM0b477wV!_zPof}S7<8yPN<%>!rxi192Dxt?gr{T2;}BEX~g7R(UZnQ)U~lo)jp{BLOAP zM?Z4jHt{Z6EJGa2)29*&r%<{W^FhOkXGkpTHlWlVKP5W|K^*{TE6PDZf(V?VYd{ux z6O5)_Y>H1irX<+?5SX~h<}R=;U_1#t{1#f^T~oUxNmsNV&--0-iEzCaFoA1>?kPH# zhzLMZBJr6G3A}~9<4CHsMA%rs*uz$}d(mG);=OW-IKY`^Yb4WHgb{$q#xEAUh0^0m zgWwye%cE_pE|lBeZ@$QMr}R+zSkK=h)e2`6?dUdglG~*uct(3$^W0w@8GXHH()@Kn zT?Pn%lZ-SDZ(;SS%5c1)Q>7`q=?Ii^d+gkR*L@G+1J39kr}nMk&c|B48_k%u3`>Ns z3YD$rzsJgZuL2g^$x1LLCIFdaies|lGj+u~lK<=&P$dH`qmfa&mRg8H5*!Opr-X?|K$H0vstZ z;!EZ{BC^lGhMd7Teg5eyEc;Ot$*MSDuLw_<1B-G0$@pn`d-n`Jh+uXjxpF=}i7P$3 zu1$7C7Q}iiMdp;j z?mN%^Pq_~B9)Y~D&^N(_#WS*(KREDJ7;n7)5FRM*W!w(P{ioJfV`xz|!QjkDt}MEE z^*j0mSMfWKfFuD2XXWg8z;g5(W=W9W0mLTj3$lDQDo&E~;mZD@&YqBtxm?ys(su~< z|5QGzfotfa`kE&{W6&Y_xg{)DmB^-X3Ys9AQP=bFu0>eJixb1OdAk=#4KBq zld*?>PEscXahS?qU4n#+T-}-`+I73b`=)8ML|7CHrjD$rv<4EP)gKEu6(30Z91hch z0_E6}nw0=gR;=Aejw|`rH;yo+O`myBNibM$EIZz!t^0*%X9`NZ{@(OxQs#Id%A9rnA1zBfFGZ5%Bmq=dSKXr%6$bP*AC8d zLP;^%dJo3MlnpY8ID>}80F1CXTU-z4-y<1h+L^z}d(l6xTr7B0Uj1(Nv*#4$JS(=6 zp?@;|(|wFi-~v)~#CKowmzDpkz1RPSi{|$E+buMXT-WUE-Ef^!&}#MHA9O!9`{`3l zcP!mEZ?GWtMbO#Alp#NZUW{9`o+-nw`EYmOsEtGY&Hra52J(7r5M-^5P3lA!>IziU9V z-uyS3S!J!x^y&A=`%VEH=6oeQM_$t%E)UI)P&U4c@CyPJ2)B=dK;aWgE4q|DoT7}f ze42SXMIAxZG-2J%ZExEJScJrac%e&PAwpNB$@Yycdg*2JZo8jvXD`TpTuf~HeYS@A z=hMm>WsvftOZ)mLp&AqaF(1c}nwZsCi$L)vY|Jw))6;n@gY32_i_>|50lAtL01sRN zYVF6GH_j8XzNhx4Okc-qjP@#EK>xx9!9Zs+=I$L~-D4S7WUm)YzcY;MW3bbdc|O?g zJ*!an?~tCiKIe~!JvRq)7$1CyZ4HEH`}xP{%9|YqQfCu#j_qAl4gC)k!0o!w2F9d^ zHhF^Z99H7!tT&xT?ZcS-i+^40khgei`^^xWIBarZw5!KALe*Z~281+%$*odk@(4<) zvM^!1W6ts+3Wq7rTbqQ^Lvff)W*~Yg+f?aR46hx)O>jqvlwEVy@6aLWvGX}=Xm;aU z{H;pE*X%Mys*xC7ZIRiO%VjH|GI~U z7h4y8hqbX*Th7~*5M|>fNj*j6{@7RMm<)UqDyhGBkf4HSfLQ4sA@2kwL_t5PCy7~*tsKqE)*`Q2aJ$<8ww+(Fr{_&$_sr-TW!*x>lXl<$vUZ zjipwxl3m61ci3Al{N5R(2iI;PDJpR_qIZHs5CzL8JZz0su z&iV9eo>*)qi*l%NdAzGS2Js(=Bah_2Z@{07Pmm%_nqJZ5wC7X<=k{}ec~sx6sv?^v zT99#%=j>$jc-3M@i$bH`<7q|UtW|HJ$p2cS;e*gS7%lBF8_)+JqG(}<`CM>|fbzuU zFGyd|#aO-vaPgr8_A_b9A+?t>Lj7%Ox_qB6A}OdDjxdO111cES-zQ~drTNEqvxQI= zKb-n(=Y*33kZ6Ea3=Ui)fz zBYanVcC{=}pkK7GCbNYbC=jrHq6Pu175}&5IX?^);BBK4qg8I!u3+ED*n?lZn2p%@I zbUJm%kdJrzZ>WC;kUDuU7t>^0Kh4cKeLA|eakDb8#Wc~{o45BLNGWaT)qopz`th7%u@&$mf4 zi5rHU=;=w}kP@xSFTI==Vu=xLyQXn-uA*kyuk9ZgPo-Vs1JSKWd##?S&*j2Y6>cHI z{vI0=6@ByC!u;V5??9NA-boR?D(hT^>$_?h<8p8UgG-r%yTZj;!jyKg`@FuJ{00ln zr`hx2Qk*H1Cd@hS19>*8+cFI;lDLbf@0}%I^JG2iNuurQ8#rpP8ujIlE!-)(J?$0S z=oHO=&s})yl?*nlg*cTmY95>1iinE4tk`h<+JgmQ;TIm*Rbhq1=fP6`M|~udjq%Ol z!Cy_i#xJ}n36XyleY~lyTy@pzHbQ^4*~sZ9Jm!dX?fvyIk|dZaDW2StZx+PwbBKb|j6~pNNd$YSS);}&0|GWUS z3Fh!3EfChdIn_!->q3M5Y2$YhD+DZ5Eilvd8_=u$aOdi`s*~9+O-tSR3yLb_1E}Iw zbw#_<4<@YrDTE#W%xcwIyn>$MvMLYS`5*#RwGH<7C14wR{w_at*JLhlniK=os}Y`6 zX;NH<-(11`^A3~K7tFHtL!?ckADhuccnE}KV#}lsDqf{c`aZ`M9!tMt+GcGW3fxP@ zLkR?kuv#L*$Htn(S3&XY(Er|JhrU)UcD0RSPkWVvVMBK?d8sz1F_2 zq^9*>8-Kt`CVWANa4xz~0*E{^rTcE7%bml9Wk7b7-sZ+VX5z;fL278`nDO)RYB6JV z(5G%8hEvg7^qaJyKE;T53sx_q|2;m59G=z7ygQ^8R%~vs8S#(XggTCGWzJs3KI4c0 z40@Xiwp2-b@8@VgUK?H?8(J|Yy<|2dP7?Spuo7gJ+teV|Ed%3c_EkDLB0BXTcaXRY zpZ165FGOPY%Y3l>Yi2ZYwI~v#IQSTF;Sx z0;8_F-Hnso5IU3?IBASQ;Q|9nq#vujg4w*jD^Kolj+CnHCmT=n-+~Q#g*=u0E1&;D{8U=&-eJ~% zXy!4*cFtfK37DV97)?P2r7}nKblcun-_v^O9E*TkRd_nR3@xnx50o>gA8+{9w>n>B z&1r|xf!UVI&?hUl5sf5FH^})>Z9X(~xg86>6MD?tWI-_?0PnxuPM6UE_DYqFWF5UT z_X;;Xzn<}36?^&YbE3(NL35(dO5u+T;i-;=H$95j{`N_|mV300tFH4x4{x_Ec;8QL z>3aBaBjx&jd+ka{;Hlal>u=7@_kGDjhkVwJdfffUvVb#mhw6E|XtvqftRv@PfMfi0 zjCkMrfqv`DG5qvY(E0o$oa0>fW3$G|IYnm!*qy9{i>Bgnp!=(sOm;k0Yz#!WWPDpO zQ20#qu$xYFcBx(tOUJQ4p!C&kq7U4wi>PWQyPY^Mt9)wxw|!5lX#Q*W4@ECBA+kJu z%*jVBbo&ex60}w@YtS0DDqq|>d{}v{=VVm(P}!Q6Y=ic zGOXPvTvjfwRcEQWd&-6V@VCE--Ic#7?~-1T8cU*I)!+8>7^!cpCc9_-mFEA_2|1DG zl9yh5oioxjIv?Gy?zh^GHtxD0Ft1ZizFk0mHDt*c+s!wOU2GRk`>}J^&}VjU$l^+t z)+e;HRN`;(E4G{LCegYA^GMYZPH@u`_Srh9d zlKjK_;g_tI*$g+2u-&rzyFw>rnbo7Q_87WA?_FkmpvU+quv?Ab#f^oduO%jdGI^8j z*t{e-qfQIVel&M@zao^_j zm3bEXizD`Wu;HzIE2ew=iN)yI5}^%@HQciL*`W$@qWFm7)M5#Pp68ed-+&u|ggj>( z+Zb8@s&r=y@`!xPcVOba6k$?wM%wDPOSGD<_BrAHB8@tgElieBqLo(6-@APQ@Q?q2 zPW(Wer}uFnN7s?6TgO!`_ici`H%^9=3N3!iE9MeaH{}h|ttd=YGZnzB7S8w4iHGSb zAr4A~YC(Co7?^Me7LG8fXh(LKPU2mqJKp*#DHcw1Jmp^XnHgyt_5gG*;XjZ^sO~`t zC@3}T{N%NyGP6vIfiHjj>6HpnD0tA4wFO~F@9Uvz>JPcy%Du+wTVFnLA=^vZ3>Q>%vj3l ze?45^HK!gcS<=ouIR8lW^sUf~v{|1Qc1^NGnDpt@yO(*1dQ(LPHrUk3k12=BZ)qG8 z<;a8SgO)JMYNk)yOJ)*6zkmtk^nZ(P+_OxYM=EEh56-X6i*eeVeZ$p)d8?(W`SO?F#s;UgnNZzKP=W#}%AJmru(}z@> zX*7d`Ldl~vGz;;Jv^ta^vo86Z^dP($#W_S={Fr>op@~KLUGHUN)gb6D|p(dgDO?~m7$Re+IWD( zAp7-zFpeoU&w=e-d2UZRp|gPh%(Laq_Yci3C4{s5RC5qF>JPV+t=<-@yxmv9Pb9U> z!?H_foCCasS4QJCK(HXjm9+9BxGyFIkg{}_9&w7oSZ zN2Q4P@bX(Pr?M8A$)e#QA3Sl^{kIt=XK-@eRQ$Phz_`t zmAKKHcV0pQAGI{=l8HEQl#)n0a`bM}IK=y}iKUT=`a=pq-TD)GxM-pQw>TQNtFarT zUF7{}lso5&p(Ci$9X`yABfl2gYJ!wXmu1&XF^5f^3sjTz?At0??WDgJT7N_m%=pBL zjJ693dG!p|Exh+gu#4D7lk4(Ff(vAXRToRH#lUfFSeFpE^fN%`VxEVz)z5}^mAB4Wmp}G;nffZV$!o9QdvYeaZgall&%cK?d$6be z`9bE(eEwuv^0%VOqU3>|_Vje2xyGT#(*0GYo#6&?owSkCvJUT0;pF<*!?rE6h3Mq^ zKe^qu^I9I(jV~@=X-+OP>-|#W@JaL8>r?J6F}zBh(69@=r5IM$V7;z8;+$%ERzT{p z=(}of2d@S8geKB$^u!KMzDj9Ry!ZZ`Oud0q69Mm0_<2EF&8jl=VBUgl*y_RrR$Wmj zJbTIQp>n^+>n{S{3tQE3CI9M{(+k8`j58exqp)$PIrGA3v&n^XH~x9tTOSCz z$@ef=90^W<(x|;rQ)qK`+IqSh%Probf|K@)*0xhD(BPw&w zf1LDQh57?#^j0aAc4wq!8{1xyqBw*s)_sjTy0#a0thD?D&{s)3}miGx^`*BFZ% z3Xbw4%ZNt32lJn)#lYGy5~E>I7(^8Z#*7f~R_X$IKzYDlf`!U)g)U8eI<2a~sxzh; zBW06}G234-uI^~~IKnDrO*T~;!_ziMyC2!W-GP|#y?H6HhFi#t!j1=87KQqRa&=_8 zF73egoQtJ09lt5Q2?~ag?PKxy+|=+8=Yc$jiBlef{%J}fgf7#rr5t1d*B)P>sc|?a z(dQSAC5aKrvaxlA7EZa^N`^Dc^0!~hQ&iOaoyD32Qi)R7F%>%%5=ZVxj;)Vj~~f%)p7 zo~WeOHL-@e>phL<;OP}v9oT7+6$K>1dZvC5VD5cAE+c@wC%nma=zNsV=|evDXNF>g zjFGDid@8GF)jKg2WPNfYkz;5I^VYtqteCoC7A`bqbyrJPcx24}-_2RT%BZU994Vd(G8X)VwiLT12nHN8d(O$7#G% z?-ezDMZ`}hTi?B<8paJRG-cU%G4sgSy!O-5pA*alzVGVhAKv#IS;*>>QU9`|}a*sNR_QkzlnWYd#H> z9fMvyz2n}Cl2*+w*3$|Y@5CyrL$CF|_fDEV3cne5=t9!ZS4QPW^ySA!)!CmvUXDw- z=;@pMeReI1hdUH*A?kmbx@esy7nG;zcj;)#efa_OxX$h2#CB8R@YXZEZHJ63w2M4F zglq~I+)Yl1{QGU7Kiv86pOSB<5`@wk_y?>Caui9?8QLhrQ$G?`2Yh0Wn*xU1Lk2du zaGe8ZX1dzO%gBQ}K_aEKUr$Hz7Z=veiN<(rk^#;vJSI`JH27s%bJwUU(jMgW%UT^_ z*QO)pctpCFZ#w~RN0$m5PyIQB=*c9ODfSmG@(pg zY}M(@)aNeUJN_ipq-kOC-`OjtM06v~1P3n9R<YoUJ2Nqw z?Ky1~OnheMSV*aY>p4lFQ<7v>7Vz>;$7y-lkAEK^8sjjL%8E1rd)-eKTm ze%cR?lCeiVE2UP-@-Z1254@7MGBc<_wtc@|VND!YaXv4(((A_i7uDbkAi zWQEZqTrFk}OG`IdaY4TCAVSA{mURGyMtxpBBz{)X%KklF6@o7qfp2ESlhE&r_p zdfJ!DL!bYmhu1%_qr*H$)6mG&c3`*k{>GflVgRN-u;i`_9A&C@&)AW@G^8T1M7T>7HJxXV+}cy9cC7op|cK zm1dv@Jc6eR3T%(dF4b4>YdmfZZ;p8NoYa+o;#ywBCIhJ5<&s2&5H4{-p?|V<#x8P$vRL4V-1W{ z-P4pbSfzd%g;hiFeu3)YI_L0ic@vdD|<{FUU7yFO4K5v|E9rFXi(!OpKM zyy9DDNyq{#j&V24QtaKLdv?ZJnZ6uwF0ZHokNPV7A_r4%>ylPWDOY5`m4%vk&G2Us7L~=g9CAB^XlJr#HrK~gaG?+S@P%qnNHWq zW%UY;XQ8t+rCW(Cd$-;03Z>R00R*1_L%m|ZP~;O45KO1f01u*7Stz=dNO^iS z;E~=C@d>HjyDi7#9@edD4(ExVM1Ptq!j=Or*5fHQ@Ld!zx(dNb4{Lff%T<@BKiMzO zpu};e++nL&2u__MGcN;&S&4p1VnDVi$J2$+w^yqOb8!$A%R3)cJ!t@R6~Y&`R6n9K z#=z2tx6H!-4@DsSDLBk1Ny0W#;ys zHkC$kb%Qk@-LJj2x+RF(4ct4p>9)k}$T%hXt}a1tLAHI&4RgZYEE6YtHDdJc!FnWA zY)tQoqpL=j7m^RFYkyWckYaWHETc@bD3ae6q)z*pl^2c=#OzfbpEG8$oBMW4ynwB%TZs-k}U)9up5gz<>Hj$kjj_|&?QHi3k zJ7yXj!+KuX_({Jz8}zH@g7T#q#c$IwIZ^cLtZ>%!@8Qaa5&rc(VEx{LZh=a_dz&BD zb@-|0u3J}3oul(}tGr|aq@UNO}vM3EY zP-_mIQ?6ilzEJsYh%60M4Q6>acyvr4H0I^{oEpPDoC@NRh0w5@%+>dua;sF=#93Z=NbG5GLW^P%pj%*uSF;Q4!L!E|L0|S3#Yu_CK}kPiBIH_rRw!ji3hBdRj=$3x>(3NhV%qZS2RSrM6KVGoR#h0c{>w;pXx0e5? z1<<`XVsYs*e+t53F77l>+Ne;aajp6@DXh@*veRX4*{B=x1nRis`9&>Tu11tB(NUyM z)pb%z+fm_Zx+dv#3gTcu5`yk>f43m|y#8OJ^3nEM<>6D=u}J9{SRnHBxX45KcwVA| zPIW{0DoEKGj(xi>FoxQ0Vz@*-CQ`do&8}Lkiu#gWL$2P`_F#%icTSqNq$V!Ep+k5q zJ+2uuT%*cbkR!JiTl!;5*BRmVJn^9hT!Yp?`{y@+8jZ)M4Iw((@8WK2oFS@$9{x_( z8IoMv(2Ki;RfML+-c^x0?|Yv@A;GP1(^oj^K*^r@HwFolfecNbMf|@Tg)LLLFkka(PtZ-O;AnT?Q|3sqTyFclm_O+|nM^$pMK>B-w-F{E5v*u*rX zHt8--#wK|5{a{z)D>dA$6dTBh%g}4KhA8s~ZUd2@MF9cwY6ajT)PnkQk|cqrk|-a+ zL9DPZMWAm4l?SodqkAb5SE}r}hfz#!oaF^NuMnbXptAmOBQ}RLPd|2=KLk@nwyP0q-HO6y!y#kp^7!4PQSLt}&W;28ijU4Bqt>!xz%%@ObKcLaGZhQ1l|2J*+c!(Tc60{42)q3qR(_{%wr@*v znBKHHTsP>y8@>26KIo(T;-ZgK2f^M%Z+881fa0SMSBIhI6}^g+epxJ`6XL*!^2yxN zj>qkvkueFP`e9iO-hH$jNAoih1^<-AChZ(Mzw7jC5;AF57f_g_ShmHmlCIbM-BdDsM|CPX3$-BXWP8Hq;ZMF*$y{R2(&6{lP zp-+V8kKP;(ltKCRykupx?aup>>}xJKZVa%!-YY>C)Zv7&exq5Kf9Y$dW)L<&f8On! zr{w?ADxQfA-XNPDEp;0$%gNftIf>hiGo!5fP4spq40oJynO_C>!ovM~Kt|bw#%cbN zQtqos=Wnzv^huNXAHj%Yc7gRyHDeuw0{N9;faMhvRhhM9H@0a(%iIhIPoF5$M`8Izd5gg&L#}(`nY;1EmToZpYz``7%^#mhW-&`27a!|> zG%*L@q9;}z;h7=S_S4nqnTW(y>ij{+&ORF-zzf;!9jQ@a# zOnwpOE616yA|Gfymc<*{*!a<6QSlLK(Hn z_eZlraLBUj)^|CGcMGHd0p?m8Wy^~K_di0cgU=Q@!jX|UBvoE$+3=;k*mK=zVh+D* zIkcDy4(9e~HAgFWu!2A%2FaLMr+(D=k5+88E# znW(Rlw^?d-XT#+Tb@jIGZz_`Znd6sMxIgKZl3O7oOMz2}ATCf0r9+7aHswJ>AA;7Q zb%YSPNAc~87k>DXhX`EtpPEw#+>q9=;MHLDl}lii?va!6 z0c2M6b|hpZ%8p$=hPK9u=*fwi|9aXI6)D2lx`7t;8=JI9p}J`-Pl(2@aYD+H2wL|9 zCxj*`v8eBm{ZG)a9EE+v>vqOnxD7-*#S$>~eIjOD@r0?1s9!Xmb4^kOq69EOASM9# z-f;7npHvqY8!TA04_I1(U9sQ{U0jsG6NG2e!l$ehMHvrjhj7{7@q7fRydvpY+~%sf zYJYlrRF`;m70~Km3FKYIgj(TdWH!jCY;UW2`TffH&_FilI_|cvrBE-zyN1d;%TTj` zS=7?m<^P*d0gc$BO4?5+ANU!aq1FKvES`pnizf^B@w5A#0q z@ixhl2|>01dl<*I^2l$dU*H?BcDB~=gIIkJ4x_Z2vsd+ak#Ns%tx$~PSBL4sUQbl+ z&b*y3C4<6BD$0En;b@B|1esoe{WL&(Glt#ND-RRQ7ifR+zMrR-aoj74teMm(0#=v=v77(%N7lcu@LXElD=(&ooLq7SILb{$NS=G$ed9AGlPQ=ow#3*9hne{A}ziPVpN-vu@*1PB;BcrL%tecnuhQ zR4j$m5Nu{yMlJtKZo_y>)aQ}`&=sbX9)icGa*vKq%+)-r)yL!&e_Txic_;h%!z_=oViX zi2iCEK^3$=X7>Ru}>pq|J>2$TiQQRC!n55fLD z5X2R)js<}4yvyYGBzzpbHR`q*xOM<8pH)N zyDwrto4U5ie=LdCZ_|}|SGPhyz?a|NsgxNmBMaAm_=Lib0okjI;{?h2Yag*$6k|7g z?}R4%Ibi_?v2lk^2D~Z})B_l?G)7!P% z0KAU;?p+98=(dnR&Ptu6dkL5>(6w9EFU>9eqfxTTJ++DmzZRCKpxIe)numh(&5%;G z&G8WUedqV)=5`U#aHHk3)KVSISY{u`y3WCC>vkJA%2UBW->Q^64Vw&w@%=cGgzSL! z=(yCxA&?#z*0I+(rQCHJoh~xgE(-dV<4Uj+@8b51v&^!dg|?CcBz3&Bf#Krd%~)SJXx6w(KlHtdwO^cuf%XhI)H@@rV0F3n}~d zM8WAFBQBOt|ET>h7#&37*W**V`;Q2IG<2!nXiMAF1l!ft6~Ck(y<&iLK2Kv@f883LQ+grk8Z z0UYe4FB+iSwxR#9tAqMr?!ukivQ{lA)H9kOAs2E4cLpyIWpS~ zdX2|_7cN+r-s|>uo%@olF&Qvk@?H)T4JT~?qzH8zbvEv@*s#kRBlVLgqsdtI@(IWYU) zf4E!!W}TrAYk?N%r1DBbab;2AMXnchqq}wN-&{g2-0-p3V_}o6jMA-m)u;)40b|U1 z_|r1Hy7X1I*vs;0V!bR_RwI#m`?(GhJQ)|IulPL+t#AKDFdEB+KQI&QCCUNNxiK$ar&?sMLCow;S6=(Yv-S9>)rtqjmL=rErN~Vr&iRVA`B| z!IH~#)z621(Y{_wp}O%t`V+IumtpSpiq%cMd+z5&j-A51aoy>=ckdBa=rF6@)U`=g zvHNF|G`maZod2tK%D=sN6+WwNt&w)q%hEHeeL0Rq?`DIb=b(A{ApN$CCv+IH4xoFQ z-ol>cA4wd`ir_tfoU>xRw=T0I&aq4$%d_GPmxQlqP72g7KvwR&CRZkk-_XhEN@+II zx>+Jf*N$B`u&lp@e11v>udrmxLt8ERINPMl4i)M5rBkxs%>AX+c&EBs&Ww>ukl3_H z@>HhA(ry(Osma{Fk`)U83tt8zU4C@e4=s3>^q z*f%8-O1o(1lU{LD;@wm?YG#!uk^<-IQx}n8>mql*bqs5Va)996El6P*hz$|J_!(>y z&j-^QvQeuzhRawwf=g^GAwwn|b2LtZFElixHB?H7F#vN)r5Y-q`yRtPbZU1mwlo0- z2}4EfDs){M*AGpVb9RY6EFmfmD5VPZdb#Hg95e?X;EJ2uC#vug3#)>E2yyz`5t!?k zV^_W?gq5BiJBSDL{vw<~4k~+|zpa zZIf^W%ep{Goyc>=q0cx;+zM~;XDerWR#A@sA&6o}YKacy5Mn_=6^5)c+P?2>tfoaZ zuWxqY?Sq!r9utB@+|-TK5RS2Q>%@Y!+bA`xEI9<%cM}x16%6>V&r52XWqC_?aXK&1 zn@$V9xl+ytq0j(5RE`?L=`|NJr?o*0JPz|rW7WIELdSM~YA)+|j9_$xk!CP)z0&J% z`-j^Qr^2%&!(z;B#`&xJdC$) zMhU?v|IJNW#aNOsOaR{pm{9ifXDnbC(QF3K_JF}LoY_!iWJ!L|1{&wIOlPa*`S%$zl6H79f20yk?$E}l{1nS-F4{W&WhDAz|G~Px zmh;cj`PAV3Azgze?g>ol;UA|VOd+-$(By8fcA@r(q~^|b51W4o@rs!xwG&cq$%jja z__(z$_;fBn&thXkbdQhzxap&L1g?*M`^@-Z2S+nAv{W*V%~hn8UTQK)M*5^oxceKY ziEPa(oRE!)Xml44H&qtp734%7GmEDbEmB6%`fARz>#6CAN#4o3q~f?|t6&nV?N8q!K3fEH8aB{0NRo;+pIqHw0ow=`W&oL`7gK3N-t zD^q(Yzg|uol7R}+&g#-FvC4Fh=$4ilC#t4l9%$5ngkr3k!D=sKU@liRu&^)=530Kk z;`o$r$60+<)MKa`7vt9+X6|$1US@knFo5vS{d&{+Ejb_dTat!&F@6%6%94K;`LDiE zw8Ac(bRePl%oA+vV&~S*lI-5}{3Tu1kpNDdt=+60|7*@?WP`J;50hVmGxn|u!=C}# zQp?n2=A^@sq5+&3aluOYG4AS!&KIr_J-qnoO*KnIyO-3c&vKfVj#_OTc1&0~+oSL+ zMSfdpssJ^Cor?MiMWjbH5$7)LO(i{ZsWbR>z294qj+3-|jH4L&3606Dw|b6uo=7_Z z2dR|da_X;C28RR;a(03!u}m||On;%R4AJ6(YY<@=4#f&KOU67r08Md@C=bS5OE}0a zC#c83l)xD5Yib?%iL<3!qv%T7=?nSBooRCvFK!4X?C|*$pv9=TPp-uC<=Q9gv?$P& z^jopA%0Q1bq%{Qj6wBBXiu#*(kU>si|647cd&c3?Up;DY10VIs^G#kK`|&gzXfstZ z2}v#-fnQdag9F)9Tz>iH1YG&=sX%MWaZ&n!*;U?@3vU2ap0R-$wLX6Iu!?ATnmlzt z1OwDn?X_{RgQ}D3Q1oZld z5I_-d7l#Mb)+hcx$Wc2;BP>K#Ik{3u3=R7 zT_2e$hYoVnwr_V66Oe_qQ=K-qZ&Q(Rh6L*`*+u6(1gY?cQQ7%guiyHVw)#{HKhWy> zMQDY@yd3kUR3@FYoo^f>)C6ijmwWa-K*1<=G(uOdG76|pk=M?|#Pj9z?gsx`@#V+< zbr48O9Tv>RalfjF=Fipl65cs2Mb8{v_#*BUP+)T4za$}p&&-PV88Ug2KhRKc()twA z@x0zgg*pERFTW6Km;M9g0#xt8?y|>cnwT!B-~z+P8IQ6sb6#RO>Ezf|&a=|QxmPPk zUMJi1jpXMDlt#m=o*8Zt&U=2(W>MfDwT)Zo&r8FM z<=mXgZj49ugEN_*b84f0%{}$@8C;AFX0;TG_`NyPXb^9B(e(&^{R6`$Kn95rY|M?) zF+PnNoK=}L`VVA$p+}tRh@{thJA-)VA}P0x)P2YCqx;NGF{ptRbG%|p9m*aJVXxeZ zN#1sgGU?T2JAl|2&o0C4;xwE9eXVHGNTg)5Qrvr$zE3R#*4P2WfVTYKHie^eYjm++9 zq78oNTgRTXh7BwkXJwFeIfKpOsAQOkSC_6J(VGy{vUq3$o-Q8CJTYg*#KdOr$UW{4 z5ivv4q~d@En5!Kb^l|{h5)eVJO{LkB*UBKnUj*o4Y~#f1<~tbTWIXIJy-giF9Xk94 z#N!)3KfEifjlr_rSajPldVj{`xa@9vmrBh|6cKVn;mO4vTQm(gauv-}Si9~?6B<>M zbPmlrFFW`}-;#BM!jUgm*Bs%-&)7MK$93}@g{k!7VR_6AEGJH2!2Bbsev z?mNPIauSDl{Sds)|e%U8x600wsIV2YLW5V88dovXeU zgVw-QILM4cxvIT25M?6#h99Sfc&!5gD8TF=$2n1 zj%fS3v)ZAimZNNB`jbP2z@A3P0p3PhkY81X)yUpIow`ej7u|+9P1wz%fx(f$@7QS< zo{QzFTRfHOzEly~6TzeFX-NqD4-FL^y^h8}m&+Otc=F(d3@eB_V28dHc$pK+xTpG{ zivveG*vp{)$L3jv^A6KhHi*=-!4Hp|9I=hGnn81s+5m3K^hPQMR-V6@u?L5-(bSLo zWM5yrh2dfxa3;$={!s=8K&k;uwXMa;aL$w!Oa%**!O7&K0dB9#&Pg@k0iap~|LnsE z$23_;#g5WWl^e7u1{F;6z?~HJF{jst?#6RJ9nDbd}$#^}PyYNxl_L#{3K&bY9Rgarr!q%Z& zKF(O?P?-1Czp^7u{9<*~YWe8I>fyjc994(>7JdQ8Ab_hxq(yDt?)s}%aI43>zbv>wGNfvx z3za6%6U07qVrNX^)4MdosG7cvS)wThM7|5t(g}QM)?Vh-pG^@bMfaLc*e4yi-~_2O ziud@Q|1p=aTB+1RoDk_B*!Ir9@jsJ>@5i$Evk#1)<-aOPz0+~-N|*i9GSy2q-%_(r z+6fd(Z|sZ@cFm2e&B>@L+T+j~iV6={!=*jo-l^hbDY(FU3A5_9W>2>!r5!Q9} zo%_fCw~vPKf^yJ*AhLnNb~kq-`rb|D$qD~}vxD`@l_d=Ur}fWPM6X+W&DlhFoy+X_ z*e-vQ+;te;qvcVpy-^%_a(q{VkiF1+q77^s74af7yQN*a8F2Cp^5s*cVJ;m@CkzRp zj`rXNwP|o837PkOgo8W4@~_#lcx#U~5(moWNG>G{&AvdvwW;mj^!EGXK}9|1XB@7q^^$eP$CYW}9E%khH|iT$O*+7`SeHtCV!08|97LCA_D!7N z4T$hU-ZF&GORD8KRwkbe6VEPBFM{neGt`AX!641vJidr{c0iher+N6{-Ap_O7UuI) zCH3Mu8$=c?a>SmPI6cs-wZO1abB2aMD3k3GN1k8&W3~pv1Qy6zo4E+g zWQEY|$sldg7E#S=QjF13NUfi=W=^Vcu{egS)Jb>Gj^dk>l5&<`-&&LDgHYS3k9|OI zigOr_m0&o+>17Zkyb6Y--@3MMi|5VZ0F8 z?x-<1&Fie1T1J2_RG#eZqw(x3tTo$|7 ztRdpHJTPMhz*TuJmpSSwmnV}X-w}v{$nsB;!0Bo^keC82sw!aE2J%$e-pzeJ$}UxM zIOhuub}4^NF52vma2E=l0PtU(W|(hY9d-SVbvca4N}@S@JNRGz zz44jD=Y3#2E=fC<@!1h^!dZlzyKwb{Y)rVjKSB%G?oKM_kK-+sB%e$ceWNsEqEi~d_lG5r zu6`$^%H2&K8nNe8J*<_OPZ|rYcfzg+Rn439HrC~?iJsw((m@?;va<6D*eQsIn8;oh+d6vZ2CHJE z{-@mLy#0>^)4B0?*FUo4a@q)8vd*7}-2b?pEvW3Mipl#JpcFZl(LjHHud6QB;FeWu zwEs%ap3tzYL1)CsZFz)|w*rxq(mJv%YVSB+z1SS39CJkgbDw1HbdD{-l){xePX(L_ zkb2w}TvXKGogYOcUGOF?vOPEdy|L$+P+w0Q2xDaMr3!6~`y&=$+(3J=unV-miCa2; z#Go}!vrVaf&Nx%AH!1SSv7b?IkNGJIX(z^B~_GRwuNwTifFYN?K^`eyktevln}Q>EG{8$?gM3A2F=0KXys3^-f`gZ{xh|Ly_ok zai{jbt`H7P9zPucO~eb!G9?~#bZPlq6U<8b+S)BQe6KW=65405x}ogXoxhzsq3~{y z@ZLjAQdpo}&RXfjaNoyl;#a;vHq&-LGacdp%UjDGyM+P$c3Ldo_;%+_F}d;-;>Bwy zB9aXV(&C7{%u(XW_+oO=g(tH{3(2lnT}V@?OH9@PLWGzEz4=6(b_6XzJHKx7SHS-K zOM+>)xn@IZ{HxvuH%5Ot7$K0FalSUZAD`JSGKzR?NxELn@m+_3LogH>@CG?t2D6tp zEyC4d@82Ryuxpa>C4K2tp1H`fuJDNn^yz`B<8kOBFF~m>xanz-{q<1>otVKGlIho? zBxkVMG8gar1g0~gU&RKNBv(@5u-nM=oz#ImM$c}}iM7FZJ0P~uFc5Lxu69`k{+{7v7~WTYr>mPfeVNUc=%;m2jZ6b`Uu7b%JQyupy+F)=ixR-NJ`T zataG#gx8VZ%*RKf1_hXEZtV~f^6D!A$%%$XvsSS91aTS@O1bCR|>wI6g8YqxQpY*WB%r?&Zq#bDBLs; zFgxL1W)W3HHos4cP>3kTCl?-PGD!%>Crg&+o&+Knyo2;7ToU6p*uL$gI)<497>j=b zU*vHBIX&fxFBCCTIWedPK&qby4q>sck(4=ht#1(;i39%1e;_6*pYcgj4Yy&uy04Wf z{^jZVm)%JmKjc0o%&SryEah_9&x>20hJ4V^;DP0~mEf$q2%4H}l8*r7>VS;4?f|EK zUwk`MHcDKfOvtP|A1=8wR(k*J58z$BsHk^>Dkvw6*BDYLww2paAs<&NYC?F0Q z|6`qxH1rJ(w0GQOFffag*F>twz87eDrUD*@2L` zT406C&tGYBO0XaOmgXmI*h!aUZrn5i9yW%BuzSG}Q| z$Mo9<3F;7u|IzrdQhJunx%arW?-t=dvYztZCs`|S?v99K)KR%gT z6PGgOE5wu4Q~a^3XB8UA0riuVKv-I-D{?d14telLn@W1vzTuiTu*tq48y(D6MXQjfSD@!pc? z^D-1+*jrX9z?$9YBYj#>voLoi?mI+#pYQE2tCG1k z#B%*#f&a>QZqaP=KJ~YknMS~c?spfDy*M|unfD)vXcV_XuCnhrhEXdf4;r*g3=zhB zZGXp;mCZOF#OCbaHDu24Sq@bk^7{!zkM?C$V{Z1To#j~illgx4z^YJUO-7mk6?tEf zR)?FL6MXZ(hJe3%8a>(wB}<5&LzOab9q_sD<5%IC$6riFL=l2|8$a|$R9-#=yuw|k zN=q;V`$%hj9HG>! zF+^OMQ5plS-EA-5LGmrGJ35L7w?#_#fCb)%hQh3gDUxOx_${0uy)>q+ zEIJ9cB&At;j#@9nB~MBrWT%S1EAizJQ5;In0pk|3Sl$f8+J;H|v2_z$bD8uQ^ioc( z-_mb6BD6^Jn;P`8Ihz)MwaN<@T;&CVqqYatVB#|H4b|^|j;Pfqj%b~KPPbs2lLujj zoV3$0KOTyJK4I+i`kiD)ZIz|!PC);NH5=ptDD&hwD7XNALyVtVB5X*6r6b&yf@<{Y zcu{9XO(}`XNL23bjCq<75({4R++~d1dE|bbDf_SW(DAR=~IBFaV zb0$5Os#Ayr8!>#+%TKBV{Oc)1x)DQ?25V4O00l;_gS$b7^dx)YS zmf_%v^@&sW_ATg$!82pApil2`@46QyK{M6_KG$c8GV*O+FEdb0+msgRlApcHn#= zz37D-qpC?1yo?Q7%lI9w}5l~+rcHOg0nE(mQw)r=h%9#ZUt8Rw%35!J{ zX;1u@VG%6hwR5=~*Z4x24KLZ^u1^pBzbAZ3${e2PzZQa(-HE?KV)~=xr(_6eKHtVy znMT_e>J6KVNan(wtcF>Qw1yVD`?G!frLC(7ae(iQg1mlXlJE1nn}y0^>4fOWT3@QY`X4J6+Jyu79pw~1ji0d;dLZ4k zH7O7p=vO=J5A+$IlI{NHdp9;W)+_FbmFs>NC3Ye9Y_@kKzGzPxN3J@SN*!R62A${%cch8>w3 zJZFuc4@*As-oNbWszosbrLr?tKzvJYpB&9>e$l!cniFP?LJLJ!W8 zCHxz5y}|HG7L+(o;N(m=i(6-&X&N}%Taj~7y{}=?*IB2h3G4a`(%)}VP0brSy$n#t zU5C>dt-7~$%F!BeWy@)4;fQEY6b=S8mci0q(4tTlAIG?`WBjC*wZAH^v~_NIH<l_|5o@N+p~LMp$G=F>Is?o*mBypJrH}w zJj8!at|{BkAAzO0YM(&S*~yZb?XXErC-0yPTu=nMk&+{Mt{yW#1GVHekIF zOP`R@D~(Z(6^xVSgzBi_%ZT;@%ZLe#n9Dwu9|ymhPZA>6&}y6sOTFvHYU)w)gPPs# z0MC{NjS8IfOGmh@((0tY2|!khkqrm>rQurq2S``ablS8Z@GAV7*zYFVjw`upi;Izxfm$TySRPA|`>0vu+vmDF zye^Q2&RYt{%`i{aJuUkc`Y}30vo)kQWgweosm3thQZH~8l(ZEtfnWvOU7V)EFLH`J zo`omR-?8)SXIf^2{K}lOzD=bP)hhjUitsOK z2$Y?jpJ4^#z)?)=4-?2NN{S1QXBjKXQ`x9)ow=$C+yG|$eadXaMxgv_`FjEIB$kVI zBq~=6g}1#l?f55GHacmeS{9iMt{m*}5%m`?xG}hAe$(!PUmk7ZR2#c?Tz_Mt)!9TM zuumbU-Bq1Q-_3~8n|?<-r5k;T{8N0m)2?>Z7m;l|;_v4dpDbruY--x1h18vM5G;18 z@I5Q%B`#uizoUo)xe;g}DwIFMmsvgG<4d~!<(!k`xQ_O3_J_RV%@2g^X457PKyQ(( z#z?KU}0Kxjz zl!0~HqqO5&v1M`1@+KzRi8EKTPF%Ayoy+^TO#6+wm1D=bJ{)DRdaj$(7TVk~EYPdp z{Oas+LwSixGp@(0Up|IRG{HYsn_nG3o3w4@m9;x2pU#}Hx(NFHQQ11i)~Qp5Mqgym z0S2rwX>5 znNE?BgyI5FsW&o(B`+%%I3dn_#Z^4r^;qxIB|_k<>sQ|Y2P%w@GV1T(diUIK@9Q?6 z{Ql1a3IE!rI|+3W<6GzMOD06M=(jXRFmchxvP~||D!!2_i$s+qqzyyn*?xD+`ge0> z=rz#`B57SM2T#vOn=Cv^4;60B+&z<}d@&*U*k9)!o&HQ{ICD|&VqZ4r(P#hY5XaLb z{Jl7D$g{eiM?u}S*hnx{LVfaxL{`t!Zyb~2z)tZ^5Wz>Q7YeRDtZI1(A=jX{pnC}~ zOu6VL;AY?==5m#fD^DgG`I}ldtcaV03z0fI+C+?>;)@l`2Dned?uIE8ll5)(nZ-D+ zcRad@m>pTA{>oYeLXzE(CTd$)@e}0d%l&sGD1y3)3fX#AV^hCBVhVAL|9_VSFw$hk zztvzt;Y3J0O)(s<3QWq-2tA{DZ+3cBISxfVORYs@Gr3>nI-q{fS8+vjg45sn3@?#* z;gI(fER_Ni9d#N>js{_-&K`_ES44LHRZnjH#CC35}@Jbd1* z_rEPUjZ4!q^Ou0WKl$|NC?vD=jZD8Nj$x_Z#>u^{XDp(fLOsExSy}QRob~tZ3sj9i z#!m{W9W2RizRt}ZIi`4Edxpy%m()o&9LMqX)=JrKta9YYo@wBNex5frTc)qdFK^*K&;i&?X>Jnoli!LpDPR{CC5K?D)oz9+ zR=-f0oxemHxP{z`p{|OLxnaJ=P7{egiMY#x)AfcH};Ao@S2R7LBaPTWLFSeV`@!X2k5g@Y%&~F{;6j z3Wta((&se)#@Eil<9-`@Yw4v9dYlr6&TOSTZ>N;PX=*U9%bOqImicT7IWJW3ZZJ;F zWP7J)d-iJ9!_0VwLIy-gcDdA4BG2fD$ESK%=SS%YS{V&uxOh?p|K)bL+1SNlq)74* zA*&+{?WfnQ8GW7dCB)B*XBua*;z4SX8Q{dAcd{>lH^(xE3%^&)VBd4a-Or!MeAt+G zeVoS*lvh{_8eEUoK~d#E;_#QBI1wTNy2$$<@6Cs6bl#SO4Q9zp-wUUS=6-IqeSbst z=)p$S!{Jezy2>+MH?zZ{>@@UKjhbUyYn}A<_T`7#&RjOBl1*Y7K2H4~y`?>GBQzPVR-KkddRW`(wx!3-KokVZvOwR=$o`LzHtBdCz zTM&Oo=ygv&ZM`aJt0xiG@}k-He(6ebqhT^=GIUDn<8spCGectjkDuP9x`-yVQ@?Zl z*WLIx=Fa(tpDmQ+5d_qfxO!2IW`Za&sxe7$g$`vNm)X+HzDj38_YtCvZBU5WYb9U*a+2%UFc{ag7a(r?h`+4YEAFkMve@ zYe66@PCE%vPPdw#w4g&(zvUnBM8Q@{GG@7N|M~TKzS6~vwwIYN3*3IS={x`;S83NM z;?_VQVDGP#@tblKnI|L2EfG^PIPL+aH5}<6Eh{1~xagoWv%H4-u0jO4fUvYW43!Ar zv^btc!%k_&cehjcbLxg)|jGex63!YvgylXUc;(sC}oHCb5sS4S>?9IARGMhd&8)`43`%Z=^de6nz_|CI9M z&_bs2u9BM7(UqQSwYu66vu;O=Y*A_pCxED3zk&oO9}U}*v{(NqVwK7-;>>_|v^qe1 zr;Yek-5BCQ*o05H_J`pJQ&%kY|2R7LaHjkJk8d+Gj5ep{*v$Eq%_2fM=aih!G#ewQ zjOf5!a~?*{ZAeLSX3j)4%y|waXO)~fprTUU9q!-0zrS6V>vCNmpU><4dOx3!haylt zoWi|JI8ok?xRk)Y~If#AbL<_br|iqnqw%zS{IAXSe6)t z;W_5H(Zp&|KO*=u@8}6V@ih4#K2g$NQtixB1-fa%9^G%o#QtN#8GeOXzB0x}v zhpo^8O|?cUbIPIsr97fX6u`ez@c25l)au{!X8CLmrmVY2`3k~H85a2kW+TfQGZ`=d zNq~s(r$}U)08Ha$CKYL$jxGY=e(Zz1iTaKUMd@5ur{z05GKDkvN|FlWaP~!d-kl1@ zn67Z&jhEK!g>W-S!vW>%Yg}snF&2z-6B3E8>xRHJhfk4^r0YD~h^$(!;n@bG5&QC@ ziyc`24jPeU_>IG@e>vl2|K&Phbd=>0qL?Q1jChK1JXg>~NU+sQz{Hn69G>+DW`hRM zUjuX-_oaOpve;QTRNfd1rT+z(kY~)6l7v6g%oA}lIWI@-NkFQCXe#dZO=|mJeKv>6hL!)x!PM)y&KQ;H?0^RDY1M+4Vaw?ur&(*cQxwm$>O99NOSkZa+S)6uPf&A~mm1T90^itmsUB1*RsOe9=o& z4bKeAYFrebJG0^4M2<5GNYrwcR^HMucjjSNxP|?aEnNDjcRTPyr19J6(nJ53H<9On zTn?FnBl6X?Opner+exXjN7oPkX`XCq&c1OL@;-|5PpWD4->A_2k;?*!yLL04U13pK z%%uuJCD;7eX?{1mq1|v#n<6jP$6cK4Kdzt^iMcLc{=K16&@Gp9&VO{zHoJYeWF`a%ve&9)W_cwuv`VX2|nbG(aQ&9#5Vo;EmlElJ9jR7>Qi3Vbm^nlXI;>Q<87 z*BflmGYVLMoNbg)3f;4Ym`vD?Mjf!b+T+&6LCIy(WR0#)1Kw|Y30;mJCw5KUCzFfg z$?TsrCTvRaJjE&~-bn0eEaJrpOU@fAYztek4-{PoQZ2yzWdr9;A!MotreT;+BWi4u z@*VBeG(TXN`pyFrM>(W(ZfstmT;ap^PE+-%)rBAgU&wt)Zm(tzwgEWJk0(LzVt#8_ zAd`iWAd`2~f}k5Di|akds6a*7;1AZ!W`PIln@j<;pM0!GA8|x=lgYz#TfS{)-(LZQ zGEnIAe?vp~aIZ$>Ws}H4UeKdD&+TLR4U(bCpddL+AttJUKX40zASYRw3=`#W#U$&L zxEkmKTUPRxsZaohsr2M1if5%g%HEaZj{7@vnELr>`^GAK2D)ovo;O0(GGrA<-f{?r z;Y21r?ugFDcYNDx>-sbChd_3$6euGeQj!tY+GN;GWIcW7r2}_r&XeKJZTI>YiArr{ z6cFWXh%0d&=P=-jLb{IX3yNQp0rGE&uv9{PXc7cLZg3N^(2Yt*p2$H!Q=_?8&oqJ_ z4*{JA6u&3Qo0;~5l%)^yP!^>}1)v66Dtwc=Gh=3RcmtvF_LfFAtqMtxSuj`!MZ9H< zPdS5bhlnfV$;KOHB?k(&pV?&&23c%7WLiS|ftca-$ygRYfmQY})!#I( zk=2-fS`H zW*SMQY3``(AGhj?)EvY9x!cAD_TM1LZX69`&+W?s0u1OBGkJ;``s)UlJ@8dQ=K~^a z+U!(Z`ZM01`Gn1!Jr>;M8EJRiaPYWgs*Io z{4@JV^0NIY_9k~K?(Wl>?QR?mA;{QOH@>C-#=Bs)vf4WmK7|ydpOeD*o|~jHDOahq3Y3terLApoAx2 z(+^T|)gZ(BQQ3KXSJ~^`l(!VDX$p^_1-@YWxV-Q5zk`l&d0FI|{=|iVn$S;KgifoD zDi8Oyf-qv|pw#qX<~g&bON)bd3mt^m&JqXc7ZwdssG3v%4i7sFPX>2BGIy^?8fqJp z`D?*_rqHyb?6V}=lElhb9k@zLePSqxV-Zm*75XeOar^~dV_BNd{}Z?TllTde^k}=^ z??LSir^Yec3BlE^76Swja?{V=j;is>RsV4#bzAVPth?Dix0*h?C6XU*->Z5!T+=ET zyV@$^=n0M=EY-rCR0=aiGp!ct{|R{OFX7u##y?GKRxi39-|0f}+TJ+cg=MPzPNgQ6 zMi$sLCR8@@oWyjTn2X}wD7>sctQ2>3uKCUJsDn~^GpLG16B~c5{^H3%-Lnt%h4T#> zSEFj3#$7VlAd|vH_?<+-bu0;Z?~zB#hF|7#S9pL8Kp1c^nYBqN7T4pwoUBpRoSE%g zlR_Nw@c!#^W%kF%2o1G}JGTJ}{+*_xjCheAm+Y$HXhjxMs-C@@YkKRj+l2{-;zx{aMzfF30QZe&xa{ZMttPaq5E4TIG ze}Hc}ufF&kA2VNEu)bPn&~erKm)=!&SJr=kUrkt{gkU%Uqcg!gKP@v@Ap66v=$i1C zzhS?t76Y2nhKvWewy8;T+N^7%aq;5Ct6`8B7TAr+vla6I=Kp z(Mcyja%%~&!BA*%7T;-k8>J(JI|J)Pco`=SEuP#*%+g@10Q!7Xb~HrG0eCRp9m9tX6G)NyS=YWXy;}rliVs5aE zoiqZ9DgW>?LkI*Bz#4X%^gV_%I41M+(gs1&lYm>+)!;-mrv|3rU_sj&~QF+q{WDI z4c?QQbd1i05rZH8>;0`(A%}$eQJLW6R?NM6eT#UFDC1Sh{Q=_SUlU^z87vjW0Wwt6 zryXx^K_Mr#75O@B%Rn6we#-qL-L$?6-&EgNZoyz&ucV;2b%Be@=FegL1za{p+AhEu z6DkW~N|iTV{@tU3@7+tkmt2u@o|;|6WfZ=ran^%n&zr6^U1yFuEv-=7eCJ8Zr-aj+ z@WwE7f{BAQWe^ABfz$fuZbh6+Y&rARC!k}gtcAgNU!F3Q2G!K(aLr@f${8-D`HLd4 zdc=1m((y7IQ)Vf9#MFQQ=a1VsE$=&Jj5}iQ;MjGOLA~#>Ax{h5l-4wWKj|euH;h4j zpF$gK?Vk=tp}(sxrR0fIQ3V<|ct39X0B~5?dUsS1-?0B+V8iW85}q$$-oY~FlHJ_z z(men6?-tcdGA_6y7bC@z8KdmIlQ!!`Ujh&0|4u1aYNapg2~R7PG|d%UC6v4ga+T18 zwr)=tIEQvOOk>pdX!Z!?XZIz-#dgJJh>V@gveoOO_3gIY)iA=53%;vs(Jj#tR|yDp z>xm2q&IyYsRRfLOez~c;!kOFk%K3$x{#`07Qs7!Yht{~`6Z>vxFGehMb}H`ODK_XJ zYsjr_8-x5-;vdtp<6L)VLi!laAS1vlxT9yNh<|-Mw#eGYgt}efcNSb$D$MVGiRzXZ zUlewFc>=yXt2nG^>HqJ?+JNt_FG{V$BK7qgJ%8MSSLf+uW~J8WHa#>A9oN_ro|bR* zpZPArcdfbU5|n0I)6$4`w}|kUuLZnzKIq)xN>mgrp<$@IJ70|Jq5KT>;Vtmfe2I@A z!;aJLZ4NwsHd-u?G6XD7=JS$X7Nn3uPB0*k??0>>MNfUWrpvw%oZ%*9=|C6w8rkuw zeapAg|NFt@dAl1Qd?q|S>V2A6|K#l$|0587sB2J{?A?)=|6zr{9q`yLJJe0RqpvPD zBi#dh|4Ufwgj1(3z(fFJ<*A2rc4c`Em+XGq>GJl-d_5Y>=j76M&i3xzMGXgg{reI` zcI{&=ch!Aa$&%E)usPWNN|K1yIb?99vyT`vvQ?{?`5`Xv_L0QDX%{a*NJ`#XUr zjn;?st}vO{=o-rN;8%7rV1H+f|MyR~tG!;a59hY4nC*}e~9P_h^vJrww(L7Tore9b=u5<^Kep!WnioKb|l=7*VkM}Z~nR61Ku=D{n zec6o!`~GF%3ETR34fhGK26l0?UpT-8hs8n}=}e9Xm(v+OfJdZkU}p^&cX37*D>Hw` zJkUEm0MMvgwG)GVn`TnvDfNB4Fji?NsnJ;WE!=3Rm zl(44(U^D(QvPLAa-1CNgjf5z}EhlxCWy>e(&Rh6K!&kS{Juj(X{D$Kp&E`(^Mv>ze zDk3p!v3ITV3t+!+H!rAxf0QVI5Clbo-DT(mWY7CokX<+X;C^=w0BLW$<%Ph>kX&Ix zNmHf1B#Y!&^DhbtXXFzjOFiV+=-&ZUMywrPV_Dcesz;j;<{#cH?=$0@woex0InWf0c}&c^Sr>+xInI4%KtcoNZ1*{KlStCYiS zz@xUnN@q4++^(B<+4-6o4r5jtEy&bfBCo(PyxcfHJDj_oJ)lKR1t9Lyg8PL=;WEyk z)CVWLpQ4~*yB!K6EOXrKHsR#Jp)8PQLud2Va*GA}DPQ43@3@Z=zG$yQXTr{md+uPo zQ^sRB=lp`ECf!!trbpB0X-+q(jGWCW7mO+PSi6^1udgSWPO**H@7!KmyvQg|xjf<< zt3mHL&{USE{09K#Qk9iSxDz$v9j_h>%B%ZG!Vgo-boAGeVhlF*vUDQy9Udh7(rI6} z|H}M5K0Z;&6mzigk&shl?r4mIvDs{lB>jBCWl>`bjw4AKuTR78omTE`#OI&qR;|H; ztL6Xx8xdU=2sLW}0rh)1K{s`)71~T|me^JfPF(4^ ze!n)C?{I}ru}`5_)=<3B|0f+D<-Hsxy%)HBg$^ zOtmi7COj}>kM9uGdP04sf`&t0E$?xc;!Eu+Jc*QRwowg|xlIw-``vbWZ9pFxUYX(@ zxtUCB|Dn|-^$uK>6Z6+C>t(Gb9bZV9m#Z87?3Pc~(aYD~9==HLXoxhDdukawVzQO3 zJ`zFizu0=ot2rWGx>QE1G4^fK3NU+XSDG+VSK0oXce15Zu3bnlk)u59p15h@r<>i;ZF(_LW{nPI=y*Sb|>gF;piju}R;DVLRVf z@8I030Zr;@7c{;XtU&7JLoHVm>fb>xwG{;`I)z|%5_ti48p%$4c@g0}&FiTuRMk;J zJj8i}@A#^SN+_QRC zIa*n5k8|)Qc`T;od|?SiJYk~;sUEF`uW)TwQ0#%FVMGtIf}^*!uW=-aB<&C>BYC%H z2BpR|pb?h40drlABP7NIj-goHciu*w4Uy809+5S;5*!)HbN&cE%85exPNYBJ;XrlH zBMs9OSy%z?>>N^0O%@r<*JN`SyYMG`$P4f?+uAQLtaz=Fd!a(^iuA-{GBEeHYk^cZRu$~D9$O)7w0@BFZ4;EG1mo%ILqQvsSDm^M-+j=B186PD6=8dFQ zQF6N=^)2GOYIUJ(a;_=I{Pn^IkBIPb8z#L0ra!__z;$PGe-oLVY)C-f++#zn@F>6% zJV^zGUZ75l>m-WtTX}5=GHUr&t@h zsRR3|xk|7ESnWRYa4G%nFcy|IaVJ-S=@QWI34tOtUU`wP1;2q`84F@sxO03%NZXsC%5*ivcuYN7> zm@^4dO}0-deApMZpP!}QkQ89w9;1--Lk4*Z>38mTp3x@1UWhf?P()J#?G+Lq^a=mQ!cYNPNR&;$n!aANHB=l{SIY}>`%=J za^bFoxv>JwP2To4;EC_TZ9c&|rwV4E*ZKDs){(&mjGaz*M*NrX!B?tDqB#$NQmqga z+`#jS?*RKN1bIp_qmf)uGBETwm39~N@cgvPvdk6%>)G4r8^`fya0TLKr&MWJK9lPi zRC|y>bOZJ`7Pym}IzjkH34=em%s0Q&ES-QrO}%5gYR#i=i%Io9M{My3vwBc7It z<1veOkI}FnG7}mNH$2s61rA>?>hH;jxI%)=Vz%{?rB+F9{+ir=lq$?xBkVRasa#?~F7qpSZ=OntCCRxK7pdXMJ@2Bg4KVACo^ z75-83=v?c{qt~-7vHg$^S)l2ps(C_gF(Tg0Vyc`@lG){y_oV(@q<|yi74EM;~Xf9B{ z?cD^+sl`t53`2<0_#zLP*a)cG!^Qnna1o|C-Vs271Ho~+-mW_P5%GO$AHE%b@^7qW z%i~u?MMD)GuP@d;3X`|=VVx_*1q0i)$YP1cmzo-~fAMNtZ6glPX*WqO$@pnjB(Hd6 z`x&)%s!z5QhNWsW#u0y&&O4pE_d~Mmg}diwN%xY>zFP2BbrtDXXNPXvyThhUQIF`7 zBe*c^{GGN+G;KnEts`%>?bh zZ;vv=Djm^vsYiWEHJXRdNAC@zHhBBr=9(&-}Jz<#LV;g;=4zCuTO|P@F%CC0yIB~TN!D2f4@@!kD~;lCj8z< zZvEpg(jme!G5l?5&*69c)K>e(|DU-wBr867<^jiv>U!eQzzqL?043&WQUFFW;27r0J3Q7(;V|viqzwjX|09V6p>u*jYM=N=FHE7} zf0b@INMcbDfJ7ns;Tx;r>%7` z3(X9PnL$RO0Py>wbZHt7cgf(9A2V9+M9=rqod@Ax=|yy9YWIQcdajC=sMLN)V7OWrOdsb9@-A7AWGGv7D7ot^4EK6K-4 zloxbE8m+A30R41i;9k}u9-1={W8lOO=4#(_GqFfmFAmg`2}KcZE{dQ4=c)FZ=(W7% zU~t0P)(bk_^W}z2>J7_k|fx5PZsrSaZc&tn`gS1Dfc=puv%El4q${!UESYIGFFKde37ybpY&5nSuZtkLi& zlVROi`U2r+uH#SiV}!9!cPoLnq9Is4%(x~1Xq2LARCz{(G5A)IH{HOj;=+Ndd4Hn* z*YGJvQ5^k@1QPCU1J?9~f4#clC5Tsuh8glK8(JU*;yYr#Z2laFK^$jLHrybXu?23O zhc3T&I(Wp~*v&5X$%3D&1h?;%TtQFbIUR5@W1pY9q_{ld!euSu;lk+~>%k8L;G8M_ zB=S2*z=Mo^0OS2WkiL0CSpj+^WVPI4G3hU9-B?hG*3rNK2f8StG zt?-f*l258klG(0+$CT$iiLMl(nZMY?p=;>d-jijXiFxU~8WfAd{q^B%u(pykd3!Dr(uh7=AV-1`>*y)nA7TnZ5Xcr!3!SLCE|>BmzMt=YH2GCPec z+%6rcYlk*Sev4P}zl3%A$EwFxOFl8=h9ynm>CInK(`sS(XFmRNNlLJbrP2x1sCVI< zIk&6rY0xT#?OEo>amT*-rio{QB{_rMSM-DmU|$?^oX3a59Rwqg&SK_H#gdhf`cimJ}9d7N=tFS<6DP1gx3Dj9Fx_!VQ6 zn&XsJzys3XmIq{J;xL*&h8wN3Tr}L?8T+-r+`Bv}5w^VJKHbpf-FxSm?tg&cg~II* zTE`omB1ot(-7s4N50AQu%R*so*6vMpyLw?if^}xPb;@cVX3js32t+3V=B?V7-=M=i z_gcovdv9kqc(w_jaF>F2OP7fs3gmV^zQPkAzKyk=(^j3kD}BM!y{cqnR{5~nA~R2_ zE2j9{jlR|uv--WO+>5j%gWDi3kgFTI&jC_Xa*+$M38iDo5GGK^a6-~tP@7~Gy=q>yiX^)R)(gv3`4zl%OxG7T9Z!a=G31xDhC=1L^lv_)T zH_=(4WyeT}RLbNX?K_iOZVEckYtAU!MXrh+zYWXW&SzFo8CV)aUXa5Qc1L*6-qVB$7{_YNB`|XiJjG zHPmEKkHC-8JXi!muKnfmJ3i%eiLWKkzz>U)Z~t%^$Kjn<6Yb$v`WC-!sQffwahs8* zihh*Ys{e>cFK-_4#7~u;wrhPw`ANOASs0f^p?EhFH-ztj>Cp`a3!6irsK_|Dz~%Yo z9V2f>+;2|~k*8f4#uS|~=sHiU+0ak`Ur}sOpf--d7I~xZnJ5^D7NZDuwV?Vws+IL9 zowdN1C5JkRvQd13YNKs?E@IR_@w4Ajn~;2pCu5wz#{HgWH zH!+)D@d=wl-3n;$V{e;VrrNx}F-NYs z8406OI0NWG8r0An2jFlZK&cu_Uw+iP07v9xPRz(Kg|IY8J^C1&L40vuCyq^NIuen3~=fSOy zc>f$;w*rZr7fnjKbrVZG!g>>N=3+G!K2mhQ)eqNy>49D-1>DhXzZ0CODr4R`q`ueu z)1oThr6aJ-FItPGTZGP6c<wHb8+o#Jf?o^-Xel6j0 zy)!n%WaUa}L*v;qY5}o*0%j6XMq=8w*5OEG1W{q!{LAiezVlaZmz>+0LH z!?gJbFIVY?;aOtGptk3Mbi|tOjQ63MOKhO+-Ok4<_|8F(E?*?; zyd2K|HP~-QEIjWVps$IaDdgyV(S#;#2pp1>IvRqHN1Y>q zqAGD~8VG5CMl`U;(y?+IkIamYw>oX=hGy0UMB#CH*d{bCn&*I*EFN^{-lv)B0Av5E zD+`aC)Gzxwpy4V=2NhMFBWjB|sQwHFWBkZ458aB;XDt3ma-#DwC-s)vK5`pZFynwR zl>^e5YsY@F*~a%1soQR*7f1MRM`1WIl2lCt3&knZdy%Xpb7(crAjvs@jyJOjh!(>v z0<{y%%AFQO?;<@4c>vt#yl3zxnKcCnNM)-4)KU}Eu>b^3E!U+-aatMr1I+#;yB#AF zD6fn+={w8rj=qFQwm?Z90ud{958^fv7VexN#l|Tfwd}?3yy-VQofkE& zx!ojs{p!J{C|{2GL+g|Rsa95x=gaM&bAm&NMbXA2t3A8(9gEF`Y9KLJ*+d<@Moug@ z3JQsi5nRV@i>(8=Dtq;)$)sHgg-us(s+%c6MwmL@lXKi;wY*S8V%{ntIg(aAeg6Tr zJjcVtizy(F?M{{eCMyXrewY(qmut;_ld&(rU?pGMEGc{($}RrnPg8dZHN-|FW) z=wHSWM2CSZf0^Y!IYJ_RdML@1wGN8tE4UqOJZv4hB`M(lDF&w_YJmE3{-r+1>CRG$C5a{tAFo8Lr z*pwI{ipa3~dLUhtrUo3F3W_Tf3IsDpc^g1nqB^Z7^C59KEGFqkIOEmm4!yEa(;j{1 zVsd^r4O*sjF(W9Em}|C~HG}=38StYS06Rg%mQ%Q_L_|4dfJC~UU_TJx+rJz$o>)L| z&kT4+M9RaV0iqk#zqzT!w)!`+Fu3^(J*8v@Pm{bToIi)2+z#P-KTKa4!xAxeP0FW4 zaYzyn@GhQf7oNpfg*-%pryV{=EW$Hr1E+!?l7;PgI#D043(tzK2R8+9;NQF!&&hsU zkQ*4^CC=q2n}2}Y=DhH91>U=!FQD_HRCZHh|id)_;gfcn#Ud@v+1 zIx6KmmpqrUuMXoAnfR@>7wtY?(oY`H3b&d}^XQJSJCE6I6jZSA7$!-@FBR&2Kib=O$o# z>?A65^yT7ysTM~X*7~?2&}~CEwx;8?zt9c$cr9JG16`}^o4eZI4DMup5g;Ut$Joq& z1y3-hLFR>Y>q3*t+;ncmOal%^~#f)fN6-skZH=+mw%XY?jyye!^o)feV z#~Z{4F^}oecBK(|;^T#nyqBaC5QYW*B@I`A$NGW>>a83JdPi;*iWAOEbu>4ucth2AckeDJi7fJP1Wkru9{ADyYdH&8Uwpd7Q{`3YJ)w5BaD7 z>%V~XCT|E6nvwthS%DChT=_Q`Xc@`o9iyGz8r4Q_g&YkLRKpxM{Xx)3<1rv%DDZfZ zdsHz|{cW9X{F)?#ejX*Eo4p?#wCCnJA{T-#J1X19 zP%+q|Dp(uBgP~@ZUcj)5mVM8uq`*F0pmgNM1zy;2p~DvD%+9pX}Vz-`v(KV-K{Hivxe?>@^+No z>9tg}PZaOfA9ao%1e`!0W2@4lak}-wao{WCezFMiRsr^~jCf=JYlq^ZvK0eUV{P%@KyNl#3^l0ygyYw8s+sLz`66<*(?R73<(Rtqb7t2 ze{pv)$r&Gm8r@S1P*g#>V6>49uI{TZxU`2(c-&~nL=t+@Q=HbF zxoS>-S%C+=88yKpQ3#Dl(_g&sb9YL18YHQct8(eJaH<3m(O=ffgI$Gj-^*Njgt>(F zMPgt%osqee+6Mf9=SCZrkq&6R>rhhgv>BQ2DxYsfa|QQR+&bSX_eC;^fS{aGy*-oR z^;du7JcHY1cwB*V@tM~9qg$xPEoUgHWW;USV*_vo@4rZ2(nVU`OvBTY2n3|Evb^Zu z|1WHi#R_KlM_TsOC5!)knR5)^@>T?fDKD$2d&-}bz;@wUC0X)!5ip^buk_c?j$l;& zI%zd**>yA1wxDdLj3U6yr0n4Gx2MeF>o3+^Iomo1!a^E&2suElQt>#i;Hya=^X9di z%wgZvms}o63P7SS2R8zEdtA^naO_Rq?n%h~U$z5MxhvYFM{uAIKkv~ap{;kqtHiJF z#%`S0+t-htJono@b4>a9)&g7AXtGJ?Pc`8AI_H~C-nz11LX3py_4u2Brp)k*ql%Iifv+n@fiszXm6U$hDR4^R*m@}Wxl z1Gh6+GJihkeYT2!o#uu5-O%|s>U~xcc zE9lGK6y&C)3(zQ7xm@0jStv05HS2u9ecfO+AMuh85z1YrLFQRrV_vM#^T;@WhI8GH zd%b$Q&hCe+OGQ%4dcu9a9i2Dl_FCWjFEv_TYKu_SY>TnHXy@BNs5cM`yM(*o`)K7- z_Qcww{De@e>GdfSO8$utGEFtBpQ5hSlOKFo@E^+2F$83dRzZrNilz}-$c=R?g3VoP zwSb0qAD&D+x0Tf@n(e(3wYq$Lr={gjWZa(j3PAhtxb6YzamUcVhvEl1DY4j)uu>1V z@>}mabS5vUFW5vE=IMSL%2P+_rs`Qv_*oXMK>MCM;UD5+GW&x% zemczGQU7sJY_3t|?&#jJFE!d%Jb&-#O*g;6n|@|#uKc?@FV5YK_SOxx{I-T}*GLR) zZym>mH1K>2~*=Me&J&M~gO!adliI zNg&7Rr|3$LV4m1M$=QLdgQ+f@;`g1@LVqFMPgfiaM%U>yDD!85rV(b+Si@r8Z5^}i zKz=WX&bBtb2{TRCdDhELC>(_##Cxm~%uLI&IDvvZoDnmkr^Uu%nI!J$wrLg72Q{b}=KRl`!qf(ks2$||<;PkM9`A@^y_nrl@! zH>q9_s+2~~Nd&)t)rzr`E; z%_rIG7$%QG7Pocq)U4D^#4hD4Zsl8#I-;AA4LTTexWY-`V4--%2!f7sSH8I%#W_P$ zz%KLfCL~Kny1TwTQk=3+|0rdEdfSm==?`gxa`=~8a&7pjh9zIe9ej4D<+E zL=WZf66U#6AE!oNLLdR$0cre{?b!6`jUHzJ+tC$+ffXAUlH4N2bArxNwerd3zQJRo zqd&q~3{CzF*DdzV`CvsWS=9WAn(*%|RNzCHucNoa zuUdB#&tF!m{j_xFPhy8@8uEj6L$T8`24lkHFSFxQt}_WZxb~+6=48rf+w%>SLM;PHA{0GH!@qKG-382 zeb?<50)X~uehXq&4tx7kjs?d%zj&Ifw3-3VoJL}1JppnJyZ~FZZSQ-gW7->=2)1WGK_b#;=OMkG7p%#SIAIo_X~H;0pTd#*j)X*_nZ5r1_+ zsDSR~hUm<8{vIzp@$+q}!7@Xu8|Se$a&s;JX&38J$XaCG!o7nrsb#F}C@Qd2*1%8?hy>`QU(QfsZgB}zS2z%lgk3!F->)}#E zUMI>hcNc9BR>VK6N-kWYkRIe)H#RJ79twYRN6!}2Z*}CAC%5@=E-##nm(F^9Zr(@Z z(T3h7JE`8h5BHx>Mnp8dI>z8iY z@ph&fvJG7+0CGDdSU%%H(xdT*ZsKz zdBj{Me>YI-U3d8>HKcZHp|-He=TX~f722Cio763HJ>rV7aZdd%!l{oJgwbSacH>;r zkL=t|Ub^wPI6nUMMAGvn)s;A{0!0f=nH%6(L`41@o3-L{J#*XaWIeHfwY*WgAF!kjHp2cBUDciftL* zQxlRZWOt7I z*3CjKswaOLXTpK+^qUxgG54?<}P~!>U!c)TRram81x$Wt) zX{sR&k58(L*6>Y+1XW|LSFWp@DCnMooTU0~yc z?rc;5Yu8X5JnTPmP}n8ky4~>~U^V{av6D`;38@F$UJ?MaU zLu15E^%ai_V)On3gphL|qS)=JNmH9^uJ)vLL#)HIUei~4;j#@B>RSw+7pc-0gpE?h ziu$$cFx@TQ3dXg;TO6xVG&|VX(1Z1)2kOZC9w#A)-6JDyD~7t zS+dOPqf5JSRf9Wzy?spzt0CIs_ExjX{pl!RwOSLd!?zBEd(q)(fe_U<`aBZPjDf|ByS|vamUHUD0HAP*2zO;UX?teGjikNAao4}aO=p9;g~-9 zc+OMMqun$}t?i8kdam{3Tr)&kVDHA8FjXy4^^)5p*2Bt}eD&4+N2{_T^IkzHVPDPF z@$tj#Bj+WQ`viOy=hu%=UG+{rdq1~qX!=KMrR~M_l6PGJmZVwEhwJ<8zr4@c?YL7L zgX8xEhJVX`pM3N}ntLHP@wz{40~(GGsj_Kv1;#x^Ed(xvaM__@cr9!3bm)3rLBM2| z6TV~HdCWWMc+zyl27P{hQ7%^1y ziXg(OdbS(481Fp}$mwIOU_&Dn>@$MG9AVzNzSThA?WFjXj=i7+p-|p}{(;jE#dbPE z7n0&!`)p18&lIn(?7X%MY}@I0_iCtNuF`xl`&#erYG$&ZS~oDhwf`zWj~5tjS~n5g zC}ZlTyVV3K^DzrGC6KTpif&*)ZDs zu3b8jT+8ej7Ie|_)jX6w{HW5jl@R88`r%y9A?%aa?)&OLnY#hJrE-|L*Pd!m#+ z&Lc@4`*~dQ{H-qy2f)PQX3R(%3SlL1T;6dAS@C41NfT*2>Nya25T?)eVq6L+kQ_fr z6vzm=R){et7T^5_kRh{q6z$hVGe(1~P&r(t$yix0vRbHX*C!yRU_unP?X~Kfy51~F z=icTG0E%Y9oykBBqIZhBUxt^LJ(4kb$&W^43?E^??Mm3EJp?8)CaMm9^!HP)Oec^| zcuqi*ARAaJu=tAN=H`Kqq~Mx^qznaHm@$E&4dnT#PqIaz;_FfU;Vt5uhgVHJ8B;;U zrSdt3b$GcAO&%5W(+nW<&RU2x_7;-wdhA>!2)&EbI4&PPKo*ZzCun>=87>_$jla(& zwa59gje9kx2;~!!!J^_(F)#DMl8W%2jj}0`wt-9G%41sn7jI&GQ~3az8%8NwcI?Ms z34hMjk*L-NBN9=^)4d1vy_ear%|rLqMB;sVc0m+<2hU`<+-_S62!aNe<(z*DvFOe> zE9<&AYPM=w7nK5J2xepT3c9Hz-0B%a{woHXTc9y;lZc_x(kyHqt{ZXNb z_j=RVG9GC|K{k#bWg)G#_rrcYbA#I-=ryWYR#R(i7ibs8MPKI-0fXSQj~oHk@Rezp zRX-(;q}L_9tIzpTW&@Uy+bo|8*Gi!c$(C)pTN?#yPDX^uI^LF=M~eWG`?mPT><2t2 zL@^$(^LUK+UzaN!X4^wWO>Fsb6 z6*gbZyLeM*=~=;+n4MR8nk!G;Fqz8#`wVzirFB56AklXfEj=f&bo`z$%uxmT5K*wN zKYoYo4~yK)70j9IBK|Z@)e|+$;P8Al*;^H`*{BU^jMH|P8Iz^eWOz&ZT~%{e@Gwe9 ztf%!@^OB-L>laFfCtr45Nvn$WW;^Zf+Ua%mYcA=&;72+|$XV&XF$-{wcDphn@7uII zC--L5Ygi#wyt`cij#%2V$$RB;O(TeCsQIEJ9CoxoyN&9xxl&xEc}#WaT-FBG*HcE!RP_6ps6_^t z1vM7*@9BcI{0O7}KEc+vuZVkNmV3`PE$np;zGTWYY6mtwRiZU{M9jCf>}b`V6Gs2F z^I7t1cMHm9HZheB)&G40E7OYqxp>soUE;n5Gdp!2(*4Ac_eo1QUx0ehd_;Vlo~P>4 zdgZy!+kOV_0%mgsp)o=ig=mdca5^Y~jqp(PqDp6-+!8D6nj*{f7bEV%e?vZQ?yoCgaia=M6{PyhvSjH4 zgY_ddKDILN!Y=&I36V6 z>Rr?aV-98m*f{fVaq^$V`*^rA6?Vl|oIu$b!;FSYVxIAdM&Bbvnh;xb=_FQR*tkFI|o+4LBHQ1IdEE zg0==`fH;iI9#p(V;AC5A%r@XeN)=Kp45QegF3n?Vunl@^auu!*QB7H(u^(M$5vCzrGkc-b9)PpyqUTWT7@OYw{|LC^N{p0%bAQdWfum|1L-M2II+R_EKO zya?t;GGLxW0PM06gHQI!d1)rMe;&%z1ls{^5N7l%X`3GcH5T$|LZFnO>XLsBuN;hE zXr@>&02V<~&k!REnGVM^3`OeL@~G10NSL_cEuP7VOOULx#{VR_^jt6Xdc zsoxnRyIf`b9>=nnEvD4e%C#)VELY6qt=QB~hf(EZ#iby%Gd5$FwXOwv{IPd)B7I6{ zr088DL=8C$q(=lLKfLKtT@m={%VfkdW6?;5aX4CZ*u%qB|YlRlkG)2R3)_}5AB zbz42%(=M<&`wdNsJ8;g~EB003?DuB_i_ZJu36qS>8Yi@E=h0DDT>KIbFH z=G$$nj>dbT*&q5jVNt_*c83hu_AbwzrKa^a19MLo2vcJUGrHT=9v*7b(Z)B_eLH!) zoRYilTeLh0k6iY&3K_Bxn6h+u zv5vcpsX+K}dwB4i`x}eWx%n^FG5>+?xqfLuExAPAFK-m2N@jFrBz!kE`$}jV6TUa4 z`|12bUrS7m8ejOdW>i^JL(A7H6J?HN*ArMk173h3debRu%U9QBXU1*00`}~zb0XjSKO|O;!Kmd$u^51<3Uvh)pF4*!^ z4{5G_b^bQv96XJj3jsnHg8q6zEO#q^&mRh*4u9yO``pSEzKqzz>jT?24Mb>1DAA&^ zDp2~{6#9;tIm?MERm}6~H^8SDp(=kXx0JO z-VutFN8(}LR1!}7p;3)~hX2z`V;HKS+-JV^wGQfN?KlQ;MFC8W;%oEsMhQ9N^>6-b z8$hEATCMwq=@HzAprYtY?6txvY9eSUMbJK0vk(h{NDrk6W6-NAuCFFtI37me*1~u%@flnkZSE6=F|lx!Gc}n5ewwm+>!<(&1=j^7 zD0~mg%l2EG3(J;@Cip(fk3S5xF1c?Q_p|kaw(TU7QaF{0AvRdG<(!|o_AIcZb^^~= zd+w%#JRDPifjMw1x+`B>Ng6!Br*}#)rP&VjNerm!G@H=J4_R&^(;}_Lzc;lm9$Ap-$ZBenr-yNy>=!-N z3DQnG{Y*4HaR%IP$VJJjw4fRwI}Qom<|Z;zxqDtpC(%ErZN^2YVGw??(GiQTQX?n- zYoEpbitx#|ckW6gr}7(+#DSgS@mK|{Bbp)lYp_Ol>;G%t=bnja z%!D9%);+=;j|7x$pvx9aC@(=7-d)&WCVe{Pvs9mkSrXEj(pcikZ_qR|$rI;JIQ>;b zB8vQe6NmN`d@j}P4Mem*kmLYWyX`X*?5sr?o|j(LpPab&$<33TSyPsQ+I2$7K-Q`; zbOcf#Q_1WaSqIT`zHW7uF9ozBOp^fOy1%qBmTD$bM~EmZm%1}|a&aS!%}kK}qIDhS z&~D$f$GVyU=1q~UmY@=Zw7F%A?RmTET6)&Xsy-7;RQ=D$IVF1_z(xi{k*YL2C%q=k zShSKZsL=DZ5R}0?1p`2==PZ(-@m5ISw{U{5kZy z9>-rIy3~79F6S41 zx}C$*xkr`M*L0yR91B7Z^2y1^;Za2q8w}YJ{?~-r&7e@2ygw4C~J{amhP{8FVVm&=v*5C8Ks`ag|XOS)( zR1cTh@eX^2vsQWTpwZ{tx)M~F&3_=>SMwu=S0iKNMdJ=*14-tI1~ z``OBQ-WRQoJA!QfDvVg~5t4UZBt<2)??dK3H|My2eK&8>vSfc}G8)1y{EC3;__`b# zl96*!-6Hovwe0S^bCu%#_&0j|XDg8dEqg-Bx$T;)&8&UGb|H^SPabthz?e`E^ljYwk$kBM(S+h24N%Qp)pxDI*sICk|W*`HI5Is`*{RqQexip9PYx z=gmWS#rLUXshHbG*JCTmND|QRxOp(HaO?sZU4TqE5|Q&IvC8P#n&i;)i^-&oSG-l( z#*|gp8WLEw$0->{Wg<&ZBE9i;_CSvGnInnt*>DA{`0x&9@QWc{4qWYR`bPFEpeP-) zy~^U|rJh3ANW-NtP;r%$%g!V+%N2wjbYf-h%~fV_ADQ-?&A;x@UG^1MxGFfTG{|Y$ z5QOha?BfciXif{)F|dvqnV;~p5`mR@yl9qy!NKi0!>e$2`X~3`P=1Y5S6rO-O}vok z1$jF;EDJORR=8u^s%K9YX&FCwcf3YWAgO-vrF1=E1VQVPzH&QZn;a^HwEZL^jt12F96 z$hWr&hG;WJbQ8G7N~)kqml?wg+HtnhjVRQ?%dcrbt7d&ZKG*he>j@c>3TKPtPee*l z!O`4u*sSa*;S%B{$Po&+M0}33by4wF${3H)zgYfJcT?-ZN;nO+l9zTN>s=K4?BLz9 ztTCN(iIw}C%@sbqSG@wZsxeF;dpsJ&mf`(KwUrUWg6JP$3P~26&Qt_ZLvLqd~db%K1 zQ@bz3B>F^S>)h{vE6Bl@Ncdac&7 zRY&)GpJebl577qQ%q=QjY6&yrs(bf9zTu`<$@&z-$5qE-sJ*)-Ipo0Cn4aOXl{Hm> zM_AjQcg%7LQ+zjH{=ReZTJ)b9f3J?iC!;U!i$}?=R1JCw+}_PVuzqnb-6AqH!J}5&l{4-t<9}r-LX$xwX<6bE_HjCym{QJc-uiQyZ3M* zR!^69nAJ`|28{Tl?gi-P*ThfW)cqYM`O0mzy(FvS)3gQqLBglew@a$`7JR&}RcwED z>2Aq@xkbcPPDmE(KojJ>M2&n+T@PI6!}UGP>qZXGjPEh-XVjz~YbDjs)i#y?Yjvfg ztK0dK0CC{^j~gC4k6ZhioZMRsUt|nk?^I>R24Owj7?ZwM9Zv|29;WM$z5Ts;V+T9` z19gOXX_Ahf;d!$(IFD^294j zbU*C>D)v>h(w$}OD%YGNDyYUqikCtzqnky^N+iODy;AII7?8uS+?QDXj7Dw-iSWR# zlE>FNPve!?blB%g8xiU+dbWXZT%jUb#UCFnN`1Q=MI!U&yo*O`ESro1&99tMaM_aW z6;)&&)4vWYW+zQjXDf(M5y4##R?tH)aerUpIzQNQ3oTI}Pc;yUh-sr*fOgyUz+H=l z)2H1Zx-Y8$eX}^1))(PnqF$osU&&2fSv}z56r$19a8B@GjfA{E7`-pI8JQ-1gbAfL z(qS7*Zwsw3Nos5QW*4OW^5r6yx;2N*Y9uSZg`5ws-S4wA&4Bz!1$Cyw3xBEQN$pOq|bcN zVQ)4VtOfgr)YgBc@!q+J&P^J^1clX4v>vr=jUcRCJH_qK+>!(NU3X+DAf3MseI2wl zA2vU|?CbQ`20+$J-%0&qz%7fB<2g;q900+Y$t>!qP+@E72LDxPFG!4IDx>H!J`z^H zJiA`CzLL^7?8FKQ`>FD|!w`0u_Zv_2D@78gq&jy&ERs5e6hxCq5zXQ3O8_$hjwfnW zGjjGp(xGZc#FmN%;p`=^Lic2@lz2n`G#H@{OqOJJE$Q?C;zAhWoHNtHAY%Qb#Cg(0 z&}tH$`*{G!HY#;LO$Z&O!WNDfZ+;MGcTR$KzXBPQB_fk7aQwRCfbg)8_Zo@KcWb|^ zt7|xgMX>GDEQl!%P&joj%eq3?Pv zeXj^Y*q0(e{sWs@?fbzh^QnC_mM1n^aLum9L4Nj>6HX?C(DtTT5GaElS>0eyUCn;n=7vhuqKXeKO~$p<7UXs8TigN-rXD zV`}KK&j#P=XH#h{QQ?G^)(aBux}$!9^RL&+52HdG#j;PImmRqqCzhT)^Q=A9ggd;1 z&+_Lzwf%~coCPYQ>io6@s#U8srd6Ybw=EAxtZseKWzS`EG!xu)cVn4xPd&Pw67I>+ z)Z({y5cuqp7rLeQqo7FIIFOGSdE($$y!pg2cHr6dJiZZoWaHGS_dZwpL`k)hyEdL; z5=N8`V683x_gCZjy(yoi+y_wgLsZkEyC&I@v6>$$&d)fl{3qpDk@xFo{;lEW>f9Gu zGPW2M=t!vTl=j_EG0h}H$sxvhU#Xs0JWnH}3 z_GWIg%Ltgd(w}C1t>CWbtGF7G?6T#S72ML<^lw{uQ(xZqwr1Uzq;5~H5QlIn zgiBc&Y71|_-SjcHx$xJ<4%_8Qn9|!mpHN2kxRK2o3_4w@wmACal z{BFzerCz`HcA^Smb1oyro3BsTW`iDQm2c5oB+Kg@M9Om$<=0!ZbTz8%>+DLYbA<2_w*DF&)6X}VP)g!dm=*hNxIjV3Q=o( zpz!4E4E#&|(h3~s2)ziS@3FCtqx#v78Wm;TN@@+5Sp`o5BQ}ZnBlPKat?ls8fs7jV zn>rL_GYHp--bBR>Ar~MF)BT#Z$u(v!^w%E0Kw;Y{SxTP^P9PFtESXI#w$M|f z0J14YSrs{BZfMeE4+`xV0A{)3BAamAHOd7tgbtI)IAOG@pJzXa{(q2nga_KQRcKgf zp5N5fF$k*RT+qJUQ>q&>Ne6z>pl6rY$Gn*j;X2sV6bQ87T-Q_TTE5y)0GnPfBzOeb zt$I4KAKt$)ERVY*47L}Pmp%7=uA`bO>UnYL-zn-=_Q!;Z*xHhxZ(gfF{0}pj)|I1* zk|%%3z9(%C?uOO4UH+G!cpwM=Q>)><;9&AS;Fv-i@#8;DMRf=37PdG~E}eb^K{37I>x2$DAa1D7I;z?U z`x>(zE+@*QPk1+w$H^bUuoZoBCciYwM3;6%fnAx#!HM8w%%xee$!2C_yxv@6b*DkQ zQdf}##%E}#I#>JVHUuha|D5p}nwpL-0g6Zef$pOx_2k)GTv}grR(pX~47WC%jUib0 zn#l!I!^s~td$a!}bon?|w7SD!!u5Th4Tfs&{SGR)FsXB(S{h9~?r3Q`TUB32HXvTw zlkvaG*>mpw-s?J6kOC)QPMl@_D52dzm?+RJ*g+5|ZuV;K*VlQfYzXuvrVk>rXk_-x zhO`mOC>MR$d9=fztnAKN<_t~-3(9KPfk+q3R?>z=|9Z}sOYPkVd-68-M(q6PuSYv6 z71wSpd_2@u4#&~WoKi`{`oK{lgT*3Lu++IuDDZl~tcP%-Ua-BwQXgs>`GeLmK?oE5o7Bu+ z07!31Q&3xtrnW>r@N@a9+hTvd($p(Cx!}S&Pb{%u!5^BkWO>Gck?4&-p9q=S0mmLP z4HtdmU8i1KjCCb!&EMN0))d4SnmK`>y?sgRwp?jB{6G zRwoDf=W27U>s`_dS(`1nj(c}YYO!McBEBXsyx%%)pYrmuaV}U+2%S4^F*0z=H_bv& z!YYElTp@YNbLbhPF+`hfP{YSK)N^C6H_msK#59|oA60OOhk7oazD1J?Ayq{{J@7#yAf;Vc1=NOycPqZOI7Hm~nHsfOAdm3@s@>4<)};Sw*7rTR-AC2O z`Kiv4b|rqbFZ|8KmZVg7jTFw&d3L*ljOI%p$DYnRulbI}PXA~S!(z|1c=e!+VqP82 zuR9I=0IELCbDrL`dlYi}P~!?s~88j##|x`(4Tj z?yZRIb^JCRfwDL#`0FIMg>{Ec)u2I# z4pi-_lX2XDyKX6wbamwVV2NZ<@hDLLB${37v&^~>Y=K9AG;Mm&`B+<%69gC?aY#Ek zQ$t%|qL{ha>Y_WM|B*cmQ#9g>n zFH!35>YUw72t~i~2Nb`|1q$6*sl|xtz>mh?Y#Ofy_BZSqf8KFnJ2|2E{aF$2YE12{ z>o4=$$8jl0!bv~tR0%tmpF<0h^BOi09SpIbxp}fY;}}}9ZLL(k##TJ2?XAuj!KwFI zDk}aVGkvCRytenpjSj1lpD%RJ;MT_dMWeJYa63>xx$|RjS%GEhQ|cvWe3ystx|Ji0 z+&p8-;YQK;MkN{(6ki`T8>`2E(hqs{N|@Lh2%^bbs0bHAvucu zo$C3!?;fyKR5wsvJc6H#;7aWTu)7yV`21C)u(iG2GD+2u`g(*>i?Y@24Coq$u zr;YNkto=S0a^dntp1?tf@_^N#7NVAtY+!eKyd8(G+?O_fr=h_n9{KzK?&1jich1Kp zw5r1yU^U)>lzIa```vUpX_Y91P!W7<#_GiJ1lMV7qHU3fd3I+^RQ!B*?jHq;tzTdJ zl~JD2KTgK2wHQm8Q-%@6CPLl6P=vA_wFC1zJ;~Mi_Zs0JTv+K1HPf@OXL}=l%p$D!bdtxfxozn zZXu6}rP=A1(MERMH_@j6!amR*7kf zD`CD4tsDW3`!1(7>YlQ^w~0ZD>8`c&>B{`alM8mW32h@y{OJ}s;XPUmQ-LdA+U1DV z7*$0^o2Kq9hfM)3#OSK0QROX%a{({bttHD}?0wiPkO@CC#kpN^Y~kRsYd_=tVcT7E zMUjQ@%m#1gPZw9NeJ19dYupQAxR+LQv|9XjobyatuMf_JxcE#k>Q^%9o<@PUv~NX* zYH+(0XNy%o>~?tY$8_hUEBw7>lV@np$g4%k#82C&uIBd$bCUIPpRZ+V(M?>AJ7jM2B6~+8_1fsSx4LEi z+^Pnmt77us!qhg)-=fw76KRKM*gN*Y@-GxC{h_3zw$Zu75AV_V`I zt-fmpKB6~B;U%+L$J(8?PofrFbZS_k|7>(JVo{9`x=F(!ozUp$e|6{GP7T?URg>|hQpSQ^#QQ({LEC=2K zp_;zPg$@S-n4)VsQzrLRRGOkgLn5{36DDkP)Y#V0SKEQf_!yTBhl~98qRZdbHfhP7 z8X+jt*mGhN57VqM&Ki@KRF4f_tWI4BJjX-6hzst|$@p!YG|C?JZ?iCS`CQp( z%Oa3ekC_6)@io>O1*X0fi{>U`SQow?If^!O$fMzo5ajjKHj~U`lGh{#rGXCK1oo)# zd%~QmG=&Uflh%00jAaY=9*@fH*anV^Ahn*!(nttzxa|z#!x=1k4WKU&f27S2z9EN~ z@NyE#k5IeBd?qHD%olZ&Vhh+_qwr2t9{G@;w=?kG<}!J<(5@b#3941z3S{+c@Q+7a zCcNGif_#-T0L$~vSAUe8Eak`b{jbPX=s1i|tV;@{=vSF47Oz9`|8eI_E2mz;(DWBR zFb?``a?nojU0>hK?y>n$O|O`n9$S;q>~_vkk&ZDf=B92^jWT)>H={48`w7l7u`3Zb zgo9^qter$wTXd{+c|;8&2d=-|)LB;B5#?q2C6_EWIQm1n1`FyLo=&0b1ym$tG768) zGr3xBC@W>u|GF!M%~XM;s3Hl{_s*)N4Zpjj8&aG271VIL<#!zx4G~$ROzfWBLZ@Ao zS)S2UIhyI0rk|~!sbs>h7QuB9o2L?a4ky8<`p5qQHB(LxxC~gQ6P!0PS<8sd&NFgJ zd^_v~-7e#wQjZhocm=S4Zxa}l$WVNlU-W=f7-%%%PqF!%D7IHY2T>YyUuYQHG-z~B z??RILxbMC@Mf@RKu_nxR(^@9Qq=E=3VxTbc|4p92_98^J8^ntdrz_^^-; zfvj(i&MqrSEe*zW0z*<&yHg)~73+p$dow>-8EvEELZ0t^LL|;kR zk9O;`PrG`bhQB$822D7~Mo++omaIAgs?%s7oudV5B=9VqM9?ow@xQyKmwek1x*MLO z;iiqlRZ%P-mmO1;Jl9CvhJ2?1a}5#^nnxMr1z@5HXgPWsDIw%{>8JVDfTi{viLyzR zic>;aUr{3S7`miv8W9R-L%{G9A@Mr-)M^o#8US=7TkZKT9t}yDH4k{kT-=^~6?~e@ z*42}374Zcg7$orcY8gu?WF5}>zn$;HeSaD3JPsI^ucaUjG>p&3n3#9kx>wdfMd&NWnT&MY^HSvr7 z;tSWEZ>94BD(wU0``_T*lx!izO(|#D^;8-I?k$tz+ zY(X)n)1`gDbroGGLYr?*-j(RkxD0&0LiuJu=BA<~^$nS*(@7O`5qw^WfxYxS5S)Jb(AL8$ES$ao0<^2^{JGG!H`qK7wUeR;Ko&S2X@OnIMS z^b}~u-aNu%Xcr@aAbB#BMBZei57XVvcg2w^rdQ>NVrW|-DnWq@q6T6lbCtX12$xtr z4Zp>(ESJ~DzGYo3g>Z9Y*^wZZb^WW>9abzG_|XI8z#!HPN^>Zmac!s}7P!a9EIrGv$3oEihr?*l?PmC(APtMb{ zqT?V4Erg^n9HK+F?WEB3X%LS`v?)EY^A691TjYJQmY07iLh}?3O9eN&MVFDr0$E@6 z(-FV@u}E1QXw*RCKG+?5&jVCt$C=;*E6Ocfi}Pm`_RnJcJKPb0P6C~Z!{^$b+)aY%$|u!KIEx9-QFVX!ao@@ z+n=>6jdjCZJO$U!Dwyrm?GBU4SRA$5+VS!UAT4M`N>K&V&-D@ z8(vP&t9eDRT}MNNYJi`YQA!DbuZEs@iqthP&bObBO6@QmX`t$sza$m3>D4GS!R$Pq zFP>`C45jDO9>#Z;g%bJiwTn1;rFUmt{x?I)rY=2W6yJBd_=U4QDC4Q2Lt6+pWB4r_ z#kyC;75L)y%E=$HBQ-d|Ma6XxH`kS>?&{4~XJrB;2ip@pXPYr5xrND5(+wVa;f?5j zH=<+AoOB;2hTY+ooc6-Ei%kx9l~=mC4*&enJ7;;_GI?W1({UxM+^zP=?q>^NiE_L4 zYUJ@r0&Bso>dsun_KUhtA>Ybhh4O#)Y=3(w8T#P*)Sgp!jgMk@rljsfai}^%iZu0Z z=%1s7d#B_NN>7!P8S??4h5*$|?#(>esbZZ%+tW9%e&;M~iW9f8o=*U$XX+Y zB@0y6#-OB7t51*Qxx5KmTvtEWsL4=6?G&AD)2j5ze_^(d5_2QA>g|{AMAel~S~wN> zMEGzyPQK<%Ix_J(1p8_ct6d{~tc&!RMD)f5Om1sRAE4}weNIMS?`-kL=T-Cf@=xn= z^*-1hxz``e>Eu>?sI-m;qh!IaI76w^_APBgH9PC#t79tad)lnldm`nF#Ucf4Hi?y# z>LCCWJVyC>eFIY8af|3vt@HtdCDPo)<3+nHR&vH(`Wf8~X)O@wdygqH%D9vT<$OiO> z0NtrzoUlEfflSgV5(lYK5FH5h=9#U1QW%uH+Fmv$hu|V9b2?U0E)B6Nqxr4o!+K%l z(y(9jJcq=5P%_xX{S#(xU-O-7=TYnu9OiJw|G|16W-?;Gcjl$H8;;I(N2szRdcjyV z*Bi`~$cq*p1_E-O&NM7)7+tEyDS0`8hBxPbrS8e z!ZEX5Et3OAsZJ;VLIo{i!x_$fB zB5UorMlS;!f>DKJK4GhMk%6^B%Sd<$PqLlX;})(*a^srR@#r-X-`92Zzv=7d-PlK# zLqY^aVCeN;4qWI_{h1#+isN=WcdC{H-K2>6p1dE8ca-%`eOB|7p`Nvc`GSo1Bgu&!uWRS znW*~~WA@Pq6F&-21ngsjhzLT~J`j^JP2j^8KBk9@j;~WWon8nuj!B%bPUHnAtVa z%j(qp_Az1i!?uwYOk(PIBv}mjR{)F3PZmo-t&;pwM8pVCSF=@XvdxTEj5g(VF}9Ep zXRV;`{Mz-SEOx+e>v`o@>Nq4~#2cRmr6aU;56jE`+#=Ib$l_1UVOP%TZmB%6q^)GV zC6sz2zp5lzj|X#HfgpiPLTmps&Aa((&6A6wDg)vcT&s?nqAxT{c4gw%kKw)LKtT_f zi2J{86&7Vzz}^;x?n7e>&kXnH5O-0E!Cn9Cn!gwLxZ}DoFQ3~~5NiJ|v|O&UTrCLI znGMx-6JA6?KzvtBYbudWepOrw3w6OlEaP#o;-;VvowEcwkfFQ@l81BtcNZ{&k$A>r0h=**p zw4N=fy`;M^GFKF`{a1SsrK`pG;5`0j@AdTUD&gjwXV!f;{9{P(yY?Wj)A^f{wyvir z_jD^mN5W~nP4=&v7T3Ebe-@6Ed{UR~)p=}h@2r`~&-+a0Mf4{<39c|3w};2WZ=KZb z|7#QTVC&J4MIG>VCBIcZYdJ?iCHvsIR zHIP!F`L*J492WLHSG>nK4K^FXfcfp z#->4qYu-NP+9<5Y7GcFfvGj~0!u*`e`J!pgrU-mcW|f|SQ6jSg2iY?OAi*dH8v$Md zlvu_I?vW}dneKOiEh8lWOy#yh7kjM95w?sF|Nq&3LNfFHLRA6aWTW!Qe!uih;FnT@ zE|t-2cvo8LCISQH4bXt%iiuyoea%o?&ov~O|70Xjl)asFO>C*FtAD<_C@nk7b30IO zsG9PSURsIzrHX0s2#U)GOJB8SIUQ9=nz3&ua44Ia2OrMSz#7T&!zGSguYJ{6Lw<1= z0`?@n994-jxIB5u!$-5zPwS}?@5%(?oXZ*-5|_+BI&Az-*zCe6LaReMJHx7SC8>C5 zDAEQjR7+`a8mGZ6W3vvVJN&>3ar@HiE)j~-6;}<82d1va-k!Lw;6dk67@Jlk){?BpiCb6y2QlRz70tpv}PDROFX6 zlLs~`G=@xm*lWflq=dc5F5Rxux*=4m%u690Gd)Y-5y~?)>VDTfnlxoN1P54o6ydm3 z;f}PM<9f>0{*WVr4o}e$$%Dr@0A2g`YQ37Dy^XpF90x-snfcnQ#_oc5D5*3&hw_C2 z=0Dt;jM}pk$mP)Rfemok&!cY^O-WtNwDi37JOdfF@ltGtL1vH9-F%yq$P(db*6&-p zQ0q?-@}&qZa{en zvSv+#FEcfeLj_m9WC}Qaox8_kW$4w$F&#zkGlZO7XTt71dH{AwT2WYg)S@0Uoib%A zqpdr8chp6a+VXGzyOXai8-OtMj=-2Tn2TQ1+rC|LrhY-?k#EmMyQeo(cO810Yp!$?!zr@dPmaMm;U>+(*OPkJ|e8!p9iqQo)&e4HxNl8&XNM`S_q zaerXAZ*W zyuj_QVicbU&*rvuLN9k{i*n<_7wZsqAFs0=pH84?ce?lOlvvk%?Gp(bj6dN3IUy)? zq4~+{n@y#{3Ww@F=nBsXpO)u+?wX9t-9ce|kJBetLPt#IIO^%SzTB;DzBln}J9r+S z=E;wp?HAma=KmRMabZ3gnJ#aLnxEZ^p`WlW{Iqi{*L*U0c){n~{P{}EX}-d0_mMT6 zkC@=_G34tKDMY335`U)7!T}f8`D8^m3dr2zd`i0J1vKB{8F{x~CC&SjT6&`mCtB0l zdZubFfh2chA$qsbs?V)6g#8GE>nAOPl$tufq-gpI(X;HaFEQ7R4=ijoOxpc8c9zoh z4KAIJd-Ge`_~XSEl0B+$QyFPL0<_`@I5anbS*rH`=RQ6ht}t!Xs0*b@Lr)SU?(BO2 zlRva=EFYm`2oFO~zlU)RmSvw)eHax*>4Bj!a=z=!?UBPslRg^!Lt=`KW<3-%EV_wV z7m7<67T^>V5~~g$C=iQqR6zoEvFnLH!VX<}bBvCypzRhuFYwk#M`x&~2pPm4<-0$s zUnw?WK*MLVC=2NFxu2f@4zSG#X8U?uz5BP>{QwpHcR*^Qh~gy>_2>oBYr5 zncjm|HGRlhy_(fdg_2M*jjsNN@>g2k98Sn_k_@O9* z0iZaUTUq7V+Sh8$J8YpkkuAt&R`UhD_p=E#zP~#$ z9=8gyPGXPb+1-$+&+9=>?*v~OfWMr5I8*8?Js-3xsa=-2Q6!%!j31Psks+0Nv%UOS z;rZ*d<)vT#~XwOgD5+8O7c|17o+1}z@<%oziU?>$1IRX}3%yUw=NVVtzu1}pZrK?CeK}`5?`0N{ zBDVV-$%Kn$c@gp>MFTr|RwdasXi$o<=zJuy9cf?2#50*X9B#GY0BS3heJ+&yf+8BA zN&b+ZOlVQ*j4D^Iep7-IdCRC~W5)1Lr$W6OVzo|U&{X}=_^*(3I#O+B=$NrJ-hSv4)*DZ`aPm05i<7kCU?f1r0H6gkk zT^@x)UFHvzFEIkcH0QOB*L*}dduv;Fc)qrI@NO`6_>uecXpZMYz44HC!P2GImYicQ z4~;Jr|9n;Q`1$9~TD@g4cX z72Yk2uYL=6aG5oV-jtDg=gOJ$Or8%7^}HeV!L3yr68AOT<;U> z^P%=`7snZ&s-?VQp&!-$mP?iFF0{hT&S&Lm9i|7!HH6*H!B-fXjJV)Hl3xm&JxngL zUZ;fi_@IXIK3!a&Br%#|V^Xo@Mc4n`rQA2^<;0W>a_qD!JaW5S!-@zNvMN2=E^k5w zL)|#|VTZ2ZL2h=r_DQMl@Zw_6=I(;tgY&8y7U0%qSBp4@7KK|lW{wY+?E^K8R@a?< zo-6SVE61*ORB%PkRcCl|Gd>0^_Th+}pd(s*O(8-6*pe&MrOsy1_Z;DQ^A?hPjNN@F zC{py5nS^`u=nal!H)OKcL*;3QfQ@kH_J+D+b)G|4caT;whdtom9s?CRiUnn^CuwHf z!5XVf;!%hpV@j%lX{9;_Qe$U%Z0D`mQ19qG{n2VXO6>M3&BT~mC;RfITBM@1IYG6k z_$N<~z$BE)dPWES5IpU3MH;@KO2sUjzBxH+c>hvW89n!n$a@iq^8T7BdDAh)wDD=r zW8O}R#dqvfFLy=kZMDYGpZ?qtM zi(ap~iADB8+Kj`5Uv%9K0Mu7e6Qh1rw)o%Y4ASf*NH|)9K`(xL!HzQ3{%wku> zI(g!0B0(FiJu#e(OfAhG6XNf$+y)w&6LJS>>?k@5rgbEXO=5T_g9i~X67xj6;xCOl zxP(hLS3Vbi%5ZnR-#g9ab<}}c-a>i8_4vmPF)c<}Dks(?w$ubwk(MZb(xXsuqe0eL zX%eVZnrlygQ*196J1JTsi`ZSyd83E@BD!e^x)8@nk21OHvS*cDu&oKseqRvN^Z;Zg zbXMZ(C973wicpsoOM8<1c}%BQ&3B8K$hK|`(7HpX4T-#$fa)KWJ2=f-3aL4w?wSjD zcm1}L!tnN#4$sLd{7^oP0)t`Y3YjAkg8Nng4%&+>!GMATdU9SkczP0Czy50 zK;7HZ&g&x)-7K)Y72A9H!DZ@u^e)Q|gzp;NsV^Qig)e}Mkz@V(<}dyO z8TnqJkVNRRqU@xR-+>{KR=8q8WB;;IA{cNAqK}v^3FVcscrZUcAV}-y=xNM-gwa2O zU%nZEKM;&Qu2sYpii-d_{D0DS_77P=sK>Snu&tnP(?Xc`-7*Lj(v5Nb?R_k#&N>4nBYXlqI9(7#J)p^73!@rr`6;q$?fyn$ZZB1;9u{-D0uXP~0jBZp(wi zR8ajE351x18x8-nUrtHR32N~ zRaa94F^O%yi__vh9{lI-b%h?tN%FI-hRL0M{++)pm%(Okr>RoF2kNx_P2BNu+eZEX zF(i9($~>9G;I~qx+2-%yI*H)$k<}l?I~u6>!?@Cr7Cz4<8|?#dB=>Y}%%M0TipxGq zitnSQmiei7D9IHm*So{Md#)jKug_1;`$_dXzgBaYPFhNi?a*5=27(iQpK2ZBJs@Ho zb1wYEi|g6~T9bCBd=d5ro_A5>1frw1SA#2em9j|ji_?Q9 zMVG`&UMa^IoNf=3!$u>|`(-fxN71?eGuc0Wd>dvM#!PdnIiE&m5lK1coU=JL(weqci;bDKU}*W@9X_~y`Im%6>WLb zjbARp$x%H1Kit#Zv?v$*kS1JcDwT|GZh#VxUDmNwB$u{j1T@y0_-o%$#Kb=l>Lox* zG{L`1?QruZPN&2*R$}boX-{V3dq5{J%s#SwYsYL=<&7#%t=CjW+jx=dRu z8f~0A7w|evML_u4lL*7ES5BJU);H^Qlv3j^{Sd8@uG!m;T!`|scGIns+AooAC|68( zLkSQwVUUp&)v*1(dEMX6Ee!i*tixLBxVtUpexIQCduLmjX}%! z?yUKP8ih`}siLkC!6!Hx?}hhsLK&SP0y>yJ1&6Q4Wk6+e=|(}5DlmEbw@?4<6?Pwg zvfTT#O@46&v~$vMWTgU`b3H7b3CvAT;iKpPe!^V;%YC}I{7X275PfkHXBEQb8vyW& zKv>F{3wJW{+5AMZg|h_*2S&9LZowS8+S4uF3K+s}bmNvOR)^W1Uia z-dGCn3lSVhUW^cU@mVs4ERoE|Jhi9qaCQ5JSun$j89w}bL}vd~j;ex@!OUlcXep{9 zN)C|5Ju=%vEdFZ@_p$LWQXz%F&47g28MCZ7V@TViwm{jRq4@Q9)35&n z_`F4JYoHdNtfzXkt$1yx3PqxAX4Sxk1bkHY_7%dzQPT#3~@qXNa72DF%~5uhc!a~$a-CP5d~gJkIm3A z$)kr7)|K=5;&DmVpXEyw6~UN@%G_#zy!1LQ4gl0Wz)e<~cjjv&I&KkgU~PrGF}M4h z3?hvt9-W~E;Wsn8ci-UTnZ52CgOl5aPzzM7vR)8JD=yt$>b7gFOqrnfm7PxC!xDKl z;jzT}XlWC?4nK4qb64UZKUXBE2qHOoWVsBj7p0guu0w5*XZy-VBp=+B=YYl)tW0_& z!$G<+Q*aq|tq3!p4x)Wx$Bc!XGve#>fAx4o|9k5rKg90ViM>BSsKfNZDE?F zWElch+`(L>iY{_*dc}(vc$C=NgBQ+<>JT<7 zPJ|?0fYI#2%`dU}=utvG@6|5XZ(BX0y}8h}OS%(Gc8D-c=e}M3)A4by#Mi~zU3zUF zp4Yo}Smp%^?WDDT#ZsL4{6VkotQ*>%&Kq$xHuxsM@MW5VmKQm_I#G^BebJyB9kZ&` zGLP2BFQ++=mpjADls-!3m?vHb34gd&#K_+9PN}mN_UX$gKCT`^xvFUwV4Z#lLMu#P zI5m4bL82KN&OEzTuWK=+F){GGO74#4TA=KF;!0?lu(>gO_?b+M7D&TwoZ*y~dQslT z!K=&+-I3Aa+JScQ0cf$Jw|=ah>d&%&rWt=vcqO3d2^VfX+DT&F_Y1n-d{}lnWVWl? z_nmZ8iW(Ck{B0bRuSqIe%x!2K@GP`y9LNHHn}@g9*{oEj7c&WFt>FTyOO(xSotl8_ zvt3Iz){mc!kzRzJdFD9io^vVfprmNtP-&-WYNvVfpAhrV3rmabvQrZ!r%6+w?5sk1 z<&ekxqjSCM%~oT`tO1><_A7g%OUsh8};ePywT)CJ)Nvc**W|1t2;iH~z;{Boj`mWob z8--St7Pb!Xp}ReMfL*FHsx03qnaoQ$mKbf$^Dso=VDcif#D3PGq_kw}eY!BB?`$^# zu)WV!UfUNru`hbrcLMCSq1Y~(;>rw_OR|1d?D5A8M8X(t>tezucSbN`-jJaqo1kPN zG@m8KrE7?MIhe{e-MWh{Az`tw=68Akv^gxE&f`}mjs_L+vlN?yd~dO$6H|}%%_!HJ zKRoc*GS?Gx@24`V2)?gVwk1}}t;EL*@)=C8&raq!6qkH5vrd!E<@G648-+2ic!56w zxS~)L!z0fI81^2sJM~|>U+3!2EvObdh;wHM!@TQRlumyJ`B!yTKou4Q{_)OheIkRN_ykm+efCsrL> zDzZOH1EN7doyqjuF8x`?tRVJg+>~VJG6&@G#M+8?F6049{Ko>#pky;6z~!~$TNCN2 zj%lh>?3oA^cAMg|?2H)zIKvME2_Mq#_PuUMI~29|Y{Gd6A3u|pTr=7sE<}BB$G5p{ z=Msmk)Xpye7SB%)5(YR8zBsdpRg1X<+3Bg<%!uLOlg9of08Kz@fwL0z?r(f2<{}AT=5Qgdn1582P!Mu_b>za8 z6bV}O;61KV-i5aQjgLhkGE~QjobLCu4IxG{9rdEm^I{M|8iJL&T=J=2#Q(Q+bspET z1*-r-5bsSWR0mGONQTkX)RQyrjDX_QLSwzt(Y3%MEa% zi(Z~i!WeII6R-+UJ_R71PTuAdpUChc-@OfFWR^d_#sx#BF<4M0j{wFPIkHgP`HDe~ z%A_UyNPAz&Gh-T&AW*@^O$ixZk2z_qxyyiszd|~boYKrcmZ+|)*FJ?58qPx*^S}gP zakhMseP4RSu!U8dp008)V*YHwvQu_lbC-9!x0)k_!jH)Fv=WX!mcOwfa_}(IeA1Li z0DN7Y?OCX68`5BfXqJ9sQ9vaw#6nP25p$tgI|rwoCpf=*)CDIZ&NyJ*gh`I?s=xt4sEza`uY3n`hI#lw5@4@B{oOe9HfpNxeNfhDosKPJ?w+!K2I(ch!=pP1SM&y{ zW;4t>vQ^V5vhsiDuD@`SREs1IIuiYGP)L+@XT1>@Fqp&T`+0+}}PvKzRlC4*xM=EdZj zP-0tX;-*)Q3pefndah|mrh?RV!C8yV)`mRi3_FWw1 zM~?K(*Tf#*O20W@>1V{MmF}PCU6w;u9;dv{HoPf8sjhT=ctR0NrwwLS7hSzCxQP)W zbGf`eRk=HomVq%2k{$Nwpw#Uv+(SF~cSf_fC_gYPb+8dXRuZ%ghV=x$m%h0o{~k8w zAQRZvT*af_BzsNUmzK^*HM;;L%JdXNaUh?gPNWH60wj`@3%+>eBCIekW4L4L&1hS3 z_z>0D>^uUq(2;LqLoB9VOUUT3bmvM*<{6c5otKFugCiVbt#2rgP2y}dm!(l9p-hS0 zxfqwW0X!(L{)R8XcbM6a4Zr&Hm5efApFZ&3bAw@fpfLhqU>we3H6czMN|0jq}qkhM~x`aD7%n%`s}y+|c&TKSNmU3fAq zxKF0oXG6o-`Uh@01-T)SXW#21&^FNy9QXY6dib{Ly~t~Srp`z`;J%nY_ILZ-p9V84 z&HJ1?tXMo)zZe>a4o-$+(3Y>eOVP<3gC-|$WOT`vsp|;e2do>?<~2!} zI~o_R$;hO4qJOJWaCf1h--WDimR|KREuB^QK6(0j$C=o0Ban^&dCPccwV`+}Wg@f2 zeDG5nT)&I8F!a|(^K9L4g4manFpSWHFWF1LbX$hSFcvfg&j({c$DV{J#b$H_Eii>U zsn0UY`^XpVGl?FrTe=d$tm5G?vD9i^yn-W$Ac4h-Utw}drxWp}KXX&NVDclfVqY@% zfghf0WZe3f&Bb`ba><;}2))>hzbRrjfw??RKTxuY)r#U(n@MVryHD6KNAAC1@6`vA zd_FTseH8QZcN!aBOv20D?c(a$|LVSpz(xX^6*I(o16z}0#G~jbq*yx753_9r<`bf^ ze|$_bf5ZEzgR1w$+9t;UxNJ}~cSAT&0EcA6NeSd8vLE>g@HRszTSDj&i!vu&rOeKyZ}ZKIZ!U#EPw8P4qd(LGQ7 zwD&iBB4^dkm+qWc7U3bBY9gq3WxQt8`dOg_>jAYpUh`h4NZk|Mo2JmUNrQ{30O`jY z4~+$y+jECdA3pid=zuRh4)dP#d(VXST$)Bitx5lll9IW}GdlVStXvXkT_K3I6hFU4 zpRP-Fts`z%zcXwvR>X}mcm3P7<)!JUrRd@mi(JrF%ndcNcRMP5of-2DDeru z@t3w|(L6fa39ma*BYq@SKIHM2cSxsCddua7rJE`Kr4u_^e@1@Ei)f-{AJZCzm#l9+ zC-n#IcWCR}i`5PY-3ke6>*BOsZ3u{Sh`Ev-hK`(9_RB|vH(}k0YE6{LI((SLnD6r< zpUz+%)~@|^J7QIT7{VYt*2FS1e7N;_`%1u^c0v$%#*Q#AAoUpM`n~Nyr$_dMmZ53( zJA^Ur=N4h#J<`E#(59&Jw|2QFx$2yb>}2i7!*5d&`q-e?9|*F~g5NIvLbSJf+Yy+? z{O&hRyvz!f;a3|p!kpm)4q@U_FidLA)o;XR`Me_OV9l1i4Yi6QbGMbVbgiSDBPa>q z9BmFtAf%BWA)BFJzDSD=RUenk;I1q46)|c0@9Y%#WTqsWq%yMj+cOBzB390#SGjGt zmWK=>I-P~CgWYoLFK)X91Qy*^VT>Ha>BlXRQ5m1Ls<~4iBj7QjF;YzB4$Qp*EkPCg zu7bz+pBO32&;eoLgB{D1V$`DqjI-E1rj&TlZpN4BV0lYI6P^eCcYfa$zmABLZ5A+w zK1un|x)}CDa#$nn^7}qgIgf6;_;jV=a8>QuW5syg?w%H;>J7*B5WS1EXvHf*Fov^# zM*q6DN9&Vy6FiUyb>OM)86)M?CS-=29nhSX6?>6qdS0R%Hv?tHRjDYzF%0q)fP%Ea zgpV_|vKA%CUt&~g8n?YJ{{Hyj(!M})7V??8K)48;=D0yKF~5Hdl}{fV>?u)^@%#ku zXSB;B@EBQ1j0-5_Z>Z#}wd4Y_QEkZlzn6+la(A~ zR(S#0r$?P^M-qJ30sPU;+7TJXsm5V8fC+V&d^*3JHdvA{<3mo^po|O6eJOZHiWVb4 z{3L4)!7@l0PvbbsgLe~jJqj%+RrcxdQ)Q#m-3htlhz&z^40cj?OuFii?#e|U3y8b; zjg1^_%_;&SX*==i|AB&t6+tJ8&E!~c0nC_6C#II=G#22v5|)+-Vwi) zm&YG66nMaX&nM}(wpI1rs0dG9y!)ix(!QiqBQ$V%_9T8@V)eLscxVsmvk?4GySV1P z$(-U`+iW8_wV8%ys;15o3ifam42j_2C_v4boBspA%H-tpAV28F(WIuv?8tFG$yb>+ zMj2`X-1bDlA1$iOIc{V`SbxOb{!SHdSG@|HPL#Zr7t75T%svS;3K{Z3R!9DG+QfKB z!drDh!j^SW5oPlkj)K4a!_2eD4IhKc?+nX3 z{71PQj0F{^8{HT5N|E6q{n`L^kA+WP^-``?Q>3R2^PahXoNinGrPfK24XOM9g>Rp> zGNtg=<$oMGL8<+M@Q2rr78+WTv<&j_MZd$twM8FX7tBj%BKR&|sxMyf%EB3HnUh8t zwRVPXIvU#o{IJzRg8w39bjuOPm+4183eGIl1zz7MaO%D*3@A}S@Nj<-o*d!fF(&1g z#fyfk1s#9vm}aGW#rp^HxTjMYIV7Tmh<-TW!2{=Umhe@#Z@XD;1EQ9p)9Hsoh5oRe zJ)g;YmjM@~AB>$jXc`x``a3c*XE(`k?DXR~J%Z{?{>hQZh_4BcR-~jnPTg@07n^%A z^a>DMSTCGW*Z!w}3obztf%DgnLa%Xc*V4;v;{MTBigy&A!dHF7e-Q z==gbkb-UmCwn3N}eQ{2ssi(2{?H|k?N>0XIHrH;e*#l4+(Xrmde4E>;Cs1CyH6tP= z4t8KpM5p)USbHWeKcuy?OZ-Qh`a=VXRXeENV6+EyiB{(=_8u2 zbu`j#$1hK)@4(OIWo_4`)Of{J)h5gQ(B_To8b(cJsx*-&R}cY!n^Fsm+6AgkD_;5m zKl{!_m9O)3l(EdF-2OvlQUzbV-No&wwzOMon7e(R!hRrayfn8eTLb|X_%zbzn63h{ z(w+eVxSnGUNlqe9F7BSr;Hn|Oys56Uan_?DmsW{94`id2^OtrvGEE;PW6ExQ-u$}u z9>@>!*Insb0!D0>-X@&xcezhZIT^xr;cpfwZ}If)HH`3U{5G<9Yh)F?asGFnqI>+q z(i1tcRsL&Cx8SNiX3Nm?=64jUzcL`sL|c6iO@%duu~8K_*&*qdmi?@FpC0S1V-ml( zj)S*9zk34|~l2eu2y^2%hCfy|bDjJl=2VzAlBAjK;DXsQmzfJk4%67bUYe z3^v2e3uH)xCGuP}Psq0eWK5@Yg?poi}HH-ra==-5MlBM#( zSu&f6-_?}`i18$l(AXy6u8}LkDgnC>%)6h#Q+ePoxJrS*Z9kTboZ0Hn?!kLJw(&Al ztvq%)w@<#)Xd7;nFr(O{XT&4F6=?=p2*t-xszIyx_Gjp!)zg#E^0UF|z_p>Gc8vA) z2XEw4GIXo@KFwp>j^~i$*pTjwl)nEeP$^I|yBWUkY4}s3uaj(O;8?InU-9XLU2Xqi zR4I@8&dhbJp2ZVQ1m3l`44Zqbev5=@rT z$aH~Lw`2S;dGB!VR`mNPL6}93d&XHj{y7@0Xu8kt6okC)B-a6>mCqx`rp1J7YVQy3 z3KTK@Qf4(p-kh<=dClB#Bnvc-9@wF56pnxjyu1i=y~8C1DwyXrff}yWv0}BC!DiOA z37W{3Bb&3?Mas%r>m8p9`rPrNdXRC!{{h~Bf|W*A4;h`nWIX%{he&aB$g=6%m(3v0w9gX@;$ly;5Tl_wv&;o<*Q}o^v`rrtPq46Y~idQ#}>9wk}zYW+H zC7Bita@7c~7Yi4k*rxF=Soo1Nu9M*9jGh?`@-k}767$?#C@b1ylh-t%p;BA%j9Nkp zsrYkp#O(`4sivCs%PVJc%=vi5Y&s>06?{vG(($)f#D%@tla3IRQB{$}7&G0zl;GMk zB+cDnIOT5{_%@jB2b8b)jG^!=!;NIW|8O|3bRi?@l!?GW3GvGB|5XhsOwX%!vc=QyNm`^DayAVzs1yv35mi|qdgu>1x79_$`k ze6nKhyqu&$20Gq&FhN9ZRMbs}X4tNIU1zl3pnAT?x-yfW`Mdop`pT8TZ~7X3h7pT? z^5|xKiw=%iLVoJDQP#7P+bH|yEs3q)-Fe~qPQ`45^v*swO>)XSrWLmo6Xz9?D~G_u zrom>O+Q-FxTx?vZ%h#AcXdx>{C7pmc6samt7-~S`(TahGlF8Ezho1BCf03_4t!y@J zhHMRt)moV;EE|rN@182G*hDK(Gd3P3_)-fguJYAD-F&$d?;Q~K=EdLE)T^#8ZG=Y# zCN1X%<_E(52e|${y!R4(igPJA*hQKbqlZ3eXt1y!3Og)qvhI#8)78!9aL!cZzFU2)<;=!Q(PUumBO zR72{(%cl7h9u+kyVtEz52@001T!KswsE&xa4Xp!t2UB-8h;W#5WJVV@Hs8GnKAU4D z{dmUl(fvqgM zrx9un9YC8oVMWzmF8%NLzVhRXKbbgB!{V8jQ%|+{j(@+ixq7|5&5dOkgyog3)G$&c z^~Oz|K-f8R)EKffqH(9i>Dd$Sao~hM_xnl8i9#6q<|4B_RAr z5(>|b&pP4-h`v8kIQqO|h@M5P(6~DvODVMsR*B{pMCA#Au=rTEh|CYO#SAP$I1W?5 zNsuUm^~Ni(B`TN%ymCkja*`2CT-aUB4c5bI2A zR_fJAf+Y>?XT?eMpU51~{3`VMz^#M%{UOGRv@UpK5>gE-UyDtHICdJjA=5ui3*LB$ z)Fwa6be9y2o|oXGqFFFdaJ&j1mJ_dBjEBqI73E7n5agTB^M*w}%;t?;fZOze4?yvb z>bt3>LA8oF4Eeuz5ssErj9#yrHcbmISaMJ8@obqHG~$!3%OWsCv6)U~^`q9|Mr&W# z8;BocdMo2EEv6O<%_i*&Vkj=89tzlK9}pBsn_|V&`5}flJnxJ+mpPD4)Uru!c?I*xOcdlwINPz#-VHqZmDT>p&|;N2ag* z;-exNYQBj@s#e8uv-IC7irO*4b`yYi3>F^wPeqt$msdwFREJ)k5&HH&ucf!*LiDsz z_&U-N6mY3fYd-@CR#Vn6l`MTNETCS2Ynp}rtNeoi1hQvtYO+;^pmMf8cDU(sS{ea? zF`;hM#%RCR%I_UZr>aW?(LX31QWbIDSn9iEp62B_1+_P;ndl9daA}`^+U`SUk+9;S zPEWDDT~TR6P){`paZ4$J4Bh#w7nPX!4~@4;lu75awzi|ylEl8k4*&W3oXX-A0h5EU z{6o+C=o!HhrOL6%ap#n6Dozo%0D6Awsf+Coe~O81|H3`nZ)i+>`ZvU5)X~bn%uKQu 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,JCy;jC*u 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≪fsddT1PD&K+u*9|Lv^i_W>pLYhy!Z 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 RLha*fMp=UY&%1k%4apGk%z=Za~ICu)8x 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%0DNKHZUJ#aHtNLvDW!r`%U#8P7Vn4Vqxg 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 ClNU6ut}Kb2CpPbdR;>T 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 XM-;N>DK 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%0D|2{sAEzcPa{^AT?yN!5)~+t2Ed{J|k2J?MGZ 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

EL@s^^YP>k;An4X(Bae9(!GqxuE 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
8z6zGp1a``NB{zI}bj)T%`1M-o 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

%HkmduTKlmBR_wJUB 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 MN)sjaV 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� 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πON?Hk#J{hP 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%0Dc!?p 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
C^Xg+ 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
iSGU0@F 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�X`C=>4RvcZqY)Dl*z^|l62{+odP+d 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 z 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ⅅJXcvU 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%0DrRKmgUuCTq(&t;fZO} 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

okC|!9Nvl!B$XwiITbD?Eu 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�-K6q%_$Y!gqvv(fi*wa5Cd0)}}m_mDo} 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�{=l&`m7 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%0D8%Nu(L3A$Zcv!u1r$}4ZclOSyD4{A|+ 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

gv3RO-%HtbuY^q3ML3WeCeON%flW> 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

z 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

*+XtupCVch2Sa&cy7b&y184%9n* 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 UHewVSXg5zeG+zStl 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

RB#??7gMO~tn92EC}3i4#C)y#9!} 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�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∈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 wR3SG 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%0Am&`Ej@f_ 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

*FsU+m#%6$IUcVEW=MK_RZMdYl(wxYl7K^v0vg4 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

aRo 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àoX2=cwMh6k+PNGs>-jGB~3%3lL## zaUw|mx2{UXkQ2-iHX~T`)+rylFt%PcP!x3Dhi8w{?FbpH0Ncy0WbIMajuP12fb^DA zvuOsK6j%dcs2|u;CBnfVsez~4H2Kklf~Wyo0tV76mNsUSBiu4%YaJq?IRa!W1AiNM z{{XEkCnEf~u_LCN59m;ym+Mfr+V$;`>%B<=cbdpcaVRD_p9(AuymqNWD?}{#gIN0} zV4U&#+I2VqN%xfKV}3DSbJLFv}GL9fH7ky#~Hhf%kMb9ji

YgH{3s3er8WTc>0EzN8hH8F)W4LgVO$?f7|um( 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 #yBSD=~2hJuDfVysPtJLPT} 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

*>3P&pWs>0D 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

8u&jxj$QP-|3p498W9MAd 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

Rhd-&@%AMw$+$K#6%wNVUlh}SD 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

0cHNo>&iK@@#;10T1q@MjvGb#l3qh_5 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

bZ;Myo;C)BqDZBN~I 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⪚YL-DRA$9jXH-iU6L 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

0oto_DYKR_ZBXn0FEG|hH`8}oV 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

diff --git a/websrc/cobalt-web/tsconfig.json b/websrc/cobalt-web/tsconfig.json new file mode 100644 index 00000000..56f22c22 --- /dev/null +++ b/websrc/cobalt-web/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src", "./src/interfaces/*.d.ts"], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/websrc/cobalt-web/tsconfig.node.json b/websrc/cobalt-web/tsconfig.node.json new file mode 100644 index 00000000..9d31e2ae --- /dev/null +++ b/websrc/cobalt-web/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/websrc/cobalt-web/vite.config.js b/websrc/cobalt-web/vite.config.js deleted file mode 100644 index 5a33944a..00000000 --- a/websrc/cobalt-web/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/websrc/cobalt-web/vite.config.ts b/websrc/cobalt-web/vite.config.ts new file mode 100644 index 00000000..f10c29ed --- /dev/null +++ b/websrc/cobalt-web/vite.config.ts @@ -0,0 +1,52 @@ +import { ConfigEnv, UserConfigExport } from "vite"; +import react from "@vitejs/plugin-react"; +import svgr from "vite-plugin-svgr"; +import path from "path"; +// import { viteMockServe } from 'vite-plugin-mock' + +const resolve = (dir: string) => path.join(__dirname, ".", dir); + +const isDev = process.env.NODE_ENV === "development"; + +export default ({ command }: ConfigEnv): UserConfigExport => { + return { + publicDir: "public", + plugins: [ + react(), + svgr(), + /*viteMockServe({ + mockPath: 'mock', + localEnabled: false, + supportTs: true, + watchFiles: true, + }),*/ + ], + resolve: { + alias: { + "@": resolve("src"), + }, + }, + css: { + preprocessorOptions: { + less: { + javascriptEnabled: true, + }, + }, + }, + server: { + cors: true, + watch: { + usePolling: true, + }, + // http://192.168.31.193:7999 + proxy: { + "^/api/.*": { + target: "http://192.168.31.193:7999", + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(/^\/api/, ""), + }, + }, + }, + }; +}; From 0345ce07c078f32ebb101cd047079d4d56ea7b4a Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 20 Apr 2024 01:48:39 +0800 Subject: [PATCH 21/28] remove cobalt-mobile for I have no way to test. --- websrc/cobalt-mobile/.bundle/config | 2 - websrc/cobalt-mobile/.eslintrc.js | 4 - websrc/cobalt-mobile/.gitignore | 66 - websrc/cobalt-mobile/.prettierrc.js | 7 - websrc/cobalt-mobile/.watchmanconfig | 1 - websrc/cobalt-mobile/App.tsx | 118 - websrc/cobalt-mobile/Gemfile | 7 - websrc/cobalt-mobile/README.md | 79 - websrc/cobalt-mobile/__tests__/App.test.tsx | 17 - websrc/cobalt-mobile/android/app/build.gradle | 119 - .../cobalt-mobile/android/app/debug.keystore | Bin 2257 -> 0 bytes .../android/app/proguard-rules.pro | 10 - .../java/com/cobaltmobile/MainActivity.kt | 22 - .../java/com/cobaltmobile/MainApplication.kt | 45 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 0 bytes websrc/cobalt-mobile/android/build.gradle | 21 - .../cobalt-mobile/android/gradle.properties | 41 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 - websrc/cobalt-mobile/android/gradlew | 249 - websrc/cobalt-mobile/android/gradlew.bat | 92 - websrc/cobalt-mobile/android/settings.gradle | 4 - websrc/cobalt-mobile/app.json | 4 - websrc/cobalt-mobile/babel.config.js | 3 - websrc/cobalt-mobile/index.js | 9 - websrc/cobalt-mobile/ios/.xcode.env | 11 - websrc/cobalt-mobile/ios/Podfile | 55 - .../cobaltmobile.xcodeproj/project.pbxproj | 684 - .../xcschemes/cobaltmobile.xcscheme | 88 - .../ios/cobaltmobile/AppDelegate.h | 6 - .../ios/cobaltmobile/AppDelegate.mm | 31 - .../AppIcon.appiconset/Contents.json | 53 - .../Images.xcassets/Contents.json | 6 - .../cobalt-mobile/ios/cobaltmobile/Info.plist | 52 - .../ios/cobaltmobile/LaunchScreen.storyboard | 47 - websrc/cobalt-mobile/ios/cobaltmobile/main.m | 10 - .../ios/cobaltmobileTests/Info.plist | 24 - .../ios/cobaltmobileTests/cobaltmobileTests.m | 66 - websrc/cobalt-mobile/jest.config.js | 3 - websrc/cobalt-mobile/metro.config.js | 11 - websrc/cobalt-mobile/package-lock.json | 12803 ---------------- websrc/cobalt-mobile/package.json | 39 - websrc/cobalt-mobile/tsconfig.json | 3 - 52 files changed, 14919 deletions(-) delete mode 100644 websrc/cobalt-mobile/.bundle/config delete mode 100644 websrc/cobalt-mobile/.eslintrc.js delete mode 100644 websrc/cobalt-mobile/.gitignore delete mode 100644 websrc/cobalt-mobile/.prettierrc.js delete mode 100644 websrc/cobalt-mobile/.watchmanconfig delete mode 100644 websrc/cobalt-mobile/App.tsx delete mode 100644 websrc/cobalt-mobile/Gemfile delete mode 100644 websrc/cobalt-mobile/README.md delete mode 100644 websrc/cobalt-mobile/__tests__/App.test.tsx delete mode 100644 websrc/cobalt-mobile/android/app/build.gradle delete mode 100644 websrc/cobalt-mobile/android/app/debug.keystore delete mode 100644 websrc/cobalt-mobile/android/app/proguard-rules.pro delete mode 100644 websrc/cobalt-mobile/android/app/src/main/java/com/cobaltmobile/MainActivity.kt delete mode 100644 websrc/cobalt-mobile/android/app/src/main/java/com/cobaltmobile/MainApplication.kt delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 websrc/cobalt-mobile/android/build.gradle delete mode 100644 websrc/cobalt-mobile/android/gradle.properties delete mode 100644 websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 websrc/cobalt-mobile/android/gradlew delete mode 100644 websrc/cobalt-mobile/android/gradlew.bat delete mode 100644 websrc/cobalt-mobile/android/settings.gradle delete mode 100644 websrc/cobalt-mobile/app.json delete mode 100644 websrc/cobalt-mobile/babel.config.js delete mode 100644 websrc/cobalt-mobile/index.js delete mode 100644 websrc/cobalt-mobile/ios/.xcode.env delete mode 100644 websrc/cobalt-mobile/ios/Podfile delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/project.pbxproj delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/xcshareddata/xcschemes/cobaltmobile.xcscheme delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.h delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.mm delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/Contents.json delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/Info.plist delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/LaunchScreen.storyboard delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobile/main.m delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobileTests/Info.plist delete mode 100644 websrc/cobalt-mobile/ios/cobaltmobileTests/cobaltmobileTests.m delete mode 100644 websrc/cobalt-mobile/jest.config.js delete mode 100644 websrc/cobalt-mobile/metro.config.js delete mode 100644 websrc/cobalt-mobile/package-lock.json delete mode 100644 websrc/cobalt-mobile/package.json delete mode 100644 websrc/cobalt-mobile/tsconfig.json diff --git a/websrc/cobalt-mobile/.bundle/config b/websrc/cobalt-mobile/.bundle/config deleted file mode 100644 index 848943bb..00000000 --- a/websrc/cobalt-mobile/.bundle/config +++ /dev/null @@ -1,2 +0,0 @@ -BUNDLE_PATH: "vendor/bundle" -BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/websrc/cobalt-mobile/.eslintrc.js b/websrc/cobalt-mobile/.eslintrc.js deleted file mode 100644 index 187894b6..00000000 --- a/websrc/cobalt-mobile/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native', -}; diff --git a/websrc/cobalt-mobile/.gitignore b/websrc/cobalt-mobile/.gitignore deleted file mode 100644 index 0cab2ac6..00000000 --- a/websrc/cobalt-mobile/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -ios/.xcode.env.local - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof -.cxx/ -*.keystore -!debug.keystore - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -**/fastlane/report.xml -**/fastlane/Preview.html -**/fastlane/screenshots -**/fastlane/test_output - -# Bundle artifact -*.jsbundle - -# Ruby / CocoaPods -/ios/Pods/ -/vendor/bundle/ - -# Temporary files created by Metro to check the health of the file watcher -.metro-health-check* - -# testing -/coverage diff --git a/websrc/cobalt-mobile/.prettierrc.js b/websrc/cobalt-mobile/.prettierrc.js deleted file mode 100644 index 2b540746..00000000 --- a/websrc/cobalt-mobile/.prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - arrowParens: 'avoid', - bracketSameLine: true, - bracketSpacing: false, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/websrc/cobalt-mobile/.watchmanconfig b/websrc/cobalt-mobile/.watchmanconfig deleted file mode 100644 index 0967ef42..00000000 --- a/websrc/cobalt-mobile/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/websrc/cobalt-mobile/App.tsx b/websrc/cobalt-mobile/App.tsx deleted file mode 100644 index 125fe1b9..00000000 --- a/websrc/cobalt-mobile/App.tsx +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - */ - -import React from 'react'; -import type {PropsWithChildren} from 'react'; -import { - SafeAreaView, - ScrollView, - StatusBar, - StyleSheet, - Text, - useColorScheme, - View, -} from 'react-native'; - -import { - Colors, - DebugInstructions, - Header, - LearnMoreLinks, - ReloadInstructions, -} from 'react-native/Libraries/NewAppScreen'; - -type SectionProps = PropsWithChildren<{ - title: string; -}>; - -function Section({children, title}: SectionProps): React.JSX.Element { - const isDarkMode = useColorScheme() === 'dark'; - return ( - - - {title} - - - {children} - - - ); -} - -function App(): React.JSX.Element { - const isDarkMode = useColorScheme() === 'dark'; - - const backgroundStyle = { - backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, - }; - - return ( - - - -
- -
- Edit App.tsx to change this - screen and then come back to see your edits. -
-
- -
-
- -
-
- Read the docs to discover what to do next: -
- -
- - - ); -} - -const styles = StyleSheet.create({ - sectionContainer: { - marginTop: 32, - paddingHorizontal: 24, - }, - sectionTitle: { - fontSize: 24, - fontWeight: '600', - }, - sectionDescription: { - marginTop: 8, - fontSize: 18, - fontWeight: '400', - }, - highlight: { - fontWeight: '700', - }, -}); - -export default App; diff --git a/websrc/cobalt-mobile/Gemfile b/websrc/cobalt-mobile/Gemfile deleted file mode 100644 index 6a7d5c7a..00000000 --- a/websrc/cobalt-mobile/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://rubygems.org' - -# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby ">= 2.6.10" - -gem 'cocoapods', '~> 1.13' -gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/websrc/cobalt-mobile/README.md b/websrc/cobalt-mobile/README.md deleted file mode 100644 index 12470c30..00000000 --- a/websrc/cobalt-mobile/README.md +++ /dev/null @@ -1,79 +0,0 @@ -This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli). - -# Getting Started - ->**Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding. - -## Step 1: Start the Metro Server - -First, you will need to start **Metro**, the JavaScript _bundler_ that ships _with_ React Native. - -To start Metro, run the following command from the _root_ of your React Native project: - -```bash -# using npm -npm start - -# OR using Yarn -yarn start -``` - -## Step 2: Start your Application - -Let Metro Bundler run in its _own_ terminal. Open a _new_ terminal from the _root_ of your React Native project. Run the following command to start your _Android_ or _iOS_ app: - -### For Android - -```bash -# using npm -npm run android - -# OR using Yarn -yarn android -``` - -### For iOS - -```bash -# using npm -npm run ios - -# OR using Yarn -yarn ios -``` - -If everything is set up _correctly_, you should see your new app running in your _Android Emulator_ or _iOS Simulator_ shortly provided you have set up your emulator/simulator correctly. - -This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively. - -## Step 3: Modifying your App - -Now that you have successfully run the app, let's modify it. - -1. Open `App.tsx` in your text editor of choice and edit some lines. -2. For **Android**: Press the R key twice or select **"Reload"** from the **Developer Menu** (Ctrl + M (on Window and Linux) or Cmd ⌘ + M (on macOS)) to see your changes! - - For **iOS**: Hit Cmd ⌘ + R in your iOS Simulator to reload the app and see your changes! - -## Congratulations! :tada: - -You've successfully run and modified your React Native App. :partying_face: - -### Now what? - -- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps). -- If you're curious to learn more about React Native, check out the [Introduction to React Native](https://reactnative.dev/docs/getting-started). - -# Troubleshooting - -If you can't get this to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page. - -# Learn More - -To learn more about React Native, take a look at the following resources: - -- [React Native Website](https://reactnative.dev) - learn more about React Native. -- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment. -- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**. -- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts. -- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native. diff --git a/websrc/cobalt-mobile/__tests__/App.test.tsx b/websrc/cobalt-mobile/__tests__/App.test.tsx deleted file mode 100644 index 9eac6fbc..00000000 --- a/websrc/cobalt-mobile/__tests__/App.test.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @format - */ - -import 'react-native'; -import React from 'react'; -import App from '../App'; - -// Note: import explicitly to use the types shipped with jest. -import {it} from '@jest/globals'; - -// Note: test renderer must be required after react-native. -import renderer from 'react-test-renderer'; - -it('renders correctly', () => { - renderer.create(); -}); diff --git a/websrc/cobalt-mobile/android/app/build.gradle b/websrc/cobalt-mobile/android/app/build.gradle deleted file mode 100644 index ac4dc8f4..00000000 --- a/websrc/cobalt-mobile/android/app/build.gradle +++ /dev/null @@ -1,119 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "org.jetbrains.kotlin.android" -apply plugin: "com.facebook.react" - -/** - * This is the configuration block to customize your React Native Android app. - * By default you don't need to apply any configuration, just uncomment the lines you need. - */ -react { - /* Folders */ - // The root of your project, i.e. where "package.json" lives. Default is '..' - // root = file("../") - // The folder where the react-native NPM package is. Default is ../node_modules/react-native - // reactNativeDir = file("../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen - // codegenDir = file("../node_modules/@react-native/codegen") - // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js - // cliFile = file("../node_modules/react-native/cli.js") - - /* Variants */ - // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. - // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. - // debuggableVariants = ["liteDebug", "prodDebug"] - - /* Bundling */ - // A list containing the node command and its flags. Default is just 'node'. - // nodeExecutableAndArgs = ["node"] - // - // The command to run when bundling. By default is 'bundle' - // bundleCommand = "ram-bundle" - // - // The path to the CLI configuration file. Default is empty. - // bundleConfig = file(../rn-cli.config.js) - // - // The name of the generated asset file containing your JS bundle - // bundleAssetName = "MyApplication.android.bundle" - // - // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") - // - // A list of extra flags to pass to the 'bundle' commands. - // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle - // extraPackagerArgs = [] - - /* Hermes Commands */ - // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" - // - // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" - // hermesFlags = ["-O", "-output-source-map"] -} - -/** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. - */ -def enableProguardInReleaseBuilds = false - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * The international variant includes ICU i18n library and necessary data - * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that - * this variant is about 6MiB larger per architecture than default. - */ -def jscFlavor = 'org.webkit:android-jsc:+' - -android { - ndkVersion rootProject.ext.ndkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion - - namespace "com.cobaltmobile" - defaultConfig { - applicationId "com.cobaltmobile" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - } - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.debug - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - implementation("com.facebook.react:flipper-integration") - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} - -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/websrc/cobalt-mobile/android/app/debug.keystore b/websrc/cobalt-mobile/android/app/debug.keystore deleted file mode 100644 index 364e105ed39fbfd62001429a68140672b06ec0de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2257 zcmchYXEfYt8;7T1^dLH$VOTZ%2NOdOH5j5LYLtZ0q7x-V8_6gU5)#7dkq{HTmsfNq zB3ZqcAxeY^G10@?efK?Q&)M(qInVv!xjx+IKEL}p*K@LYvIzo#AZG>st5|P)KF1_Z;y){W{<7K{nl!CPuE z_^(!C(Ol0n8 zK13*rzAtW>(wULKPRYLd7G18F8#1P`V*9`(Poj26eOXYyBVZPno~Cvvhx7vPjAuZo zF?VD!zB~QG(!zbw#qsxT8%BSpqMZ4f70ZPn-3y$L8{EVbbN9$H`B&Z1quk9tgp5FM zuxp3pJ0b8u|3+#5bkJ4SRnCF2l7#DyLYXYY8*?OuAwK4E6J{0N=O3QNVzQ$L#FKkR zi-c@&!nDvezOV$i$Lr}iF$XEcwnybQ6WZrMKuw8gCL^U#D;q3t&HpTbqyD%vG=TeDlzCT~MXUPC|Leb-Uk+ z=vnMd(|>ld?Fh>V8poP;q;;nc@en$|rnP0ytzD&fFkCeUE^kG9Kx4wUh!!rpjwKDP zyw_e|a^x_w3E zP}}@$g>*LLJ4i0`Gx)qltL}@;mDv}D*xR^oeWcWdPkW@Uu)B^X&4W1$p6}ze!zudJ zyiLg@uggoMIArBr*27EZV7djDg@W1MaL+rcZ-lrANJQ%%>u8)ZMWU@R2qtnmG(acP z0d_^!t>}5W zpT`*2NR+0+SpTHb+6Js4b;%LJB;B_-ChhnU5py}iJtku*hm5F0!iql8Hrpcy1aYbT z1*dKC5ua6pMX@@iONI?Hpr%h;&YaXp9n!ND7-=a%BD7v&g zOO41M6EbE24mJ#S$Ui0-brR5ML%@|ndz^)YLMMV1atna{Fw<;TF@>d&F|!Z>8eg>>hkFrV)W+uv=`^F9^e zzzM2*oOjT9%gLoub%(R57p-`TXFe#oh1_{&N-YN z<}artH|m=d8TQuKSWE)Z%puU|g|^^NFwC#N=@dPhasyYjoy(fdEVfKR@cXKHZV-`06HsP`|Ftx;8(YD$fFXumLWbGnu$GMqRncXYY9mwz9$ap zQtfZB^_BeNYITh^hA7+(XNFox5WMeG_LtJ%*Q}$8VKDI_p8^pqX)}NMb`0e|wgF7D zuQACY_Ua<1ri{;Jwt@_1sW9zzdgnyh_O#8y+C;LcZq6=4e^cs6KvmK@$vVpKFGbQ= z$)Eux5C|Fx;Gtmv9^#Y-g@7Rt7*eLp5n!gJmn7&B_L$G?NCN`AP>cXQEz}%F%K;vUs{+l4Q{}eWW;ATe2 zqvXzxoIDy(u;F2q1JH7Sf;{jy_j})F+cKlIOmNfjBGHoG^CN zM|Ho&&X|L-36f}Q-obEACz`sI%2f&k>z5c$2TyTSj~vmO)BW~+N^kt`Jt@R|s!){H ze1_eCrlNaPkJQhL$WG&iRvF*YG=gXd1IyYQ9ew|iYn7r~g!wOnw;@n42>enAxBv*A zEmV*N#sxdicyNM=A4|yaOC5MByts}s_Hpfj|y<6G=o=!3S@eIFKDdpR7|FY>L&Wat&oW&cm&X~ z5Bt>Fcq(fgnvlvLSYg&o6>&fY`ODg4`V^lWWD=%oJ#Kbad2u~! zLECFS*??>|vDsNR&pH=Ze0Eo`sC_G`OjoEKVHY|wmwlX&(XBE<@sx3Hd^gtd-fNwUHsylg06p`U2y_={u}Bc = - PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here, for example: - // add(MyReactNativePackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - - override val reactHost: ReactHost - get() = getDefaultReactHost(this.applicationContext, reactNativeHost) - - override fun onCreate() { - super.onCreate() - SoLoader.init(this, false) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } - ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager) - } -} diff --git a/websrc/cobalt-mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/websrc/cobalt-mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a2f5908281d070150700378b64a84c7db1f97aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3056 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 axPAxe%7rDusX+w*00006jj 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* diff --git a/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 459ca609d3ae0d3943ab44cdc27feef9256dc6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7098 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 diff --git a/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 8ca12fe024be86e868d14e91120a6902f8e88ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6464 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 B0*L?s diff --git a/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8e19b410a1b15ff180f3dacac19395fe3046cdec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10676 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 diff --git a/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/websrc/cobalt-mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 4c19a13c239cb67b8a2134ddd5f325db1d2d5bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15523 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
{h2A1UXMG-c%hMvHLbF6t}G>KA)H# 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 BIP(Ai diff --git a/websrc/cobalt-mobile/android/build.gradle b/websrc/cobalt-mobile/android/build.gradle deleted file mode 100644 index cb9d6232..00000000 --- a/websrc/cobalt-mobile/android/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -buildscript { - ext { - buildToolsVersion = "34.0.0" - minSdkVersion = 21 - compileSdkVersion = 34 - targetSdkVersion = 34 - ndkVersion = "25.1.8937393" - kotlinVersion = "1.8.0" - } - repositories { - google() - mavenCentral() - } - dependencies { - classpath("com.android.tools.build:gradle") - classpath("com.facebook.react:react-native-gradle-plugin") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") - } -} - -apply plugin: "com.facebook.react.rootproject" diff --git a/websrc/cobalt-mobile/android/gradle.properties b/websrc/cobalt-mobile/android/gradle.properties deleted file mode 100644 index a46a5b90..00000000 --- a/websrc/cobalt-mobile/android/gradle.properties +++ /dev/null @@ -1,41 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - -# Use this property to specify which architecture you want to build. -# You can also override it from the CLI using -# ./gradlew -PreactNativeArchitectures=x86_64 -reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 - -# Use this property to enable support to the new architecture. -# This will allow you to use TurboModules and the Fabric render in -# your application. You should enable this flag either if you want -# to write custom TurboModules/Fabric components OR use libraries that -# are providing them. -newArchEnabled=false - -# Use this property to enable or disable the Hermes JS engine. -# If set to false, you will be using JSC instead. -hermesEnabled=true diff --git a/websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.jar b/websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.properties b/websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index d11cdd90..00000000 --- a/websrc/cobalt-mobile/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/websrc/cobalt-mobile/android/gradlew b/websrc/cobalt-mobile/android/gradlew deleted file mode 100644 index 0adc8e1a..00000000 --- a/websrc/cobalt-mobile/android/gradlew +++ /dev/null @@ -1,249 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/websrc/cobalt-mobile/android/gradlew.bat b/websrc/cobalt-mobile/android/gradlew.bat deleted file mode 100644 index 93e3f59f..00000000 --- a/websrc/cobalt-mobile/android/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/websrc/cobalt-mobile/android/settings.gradle b/websrc/cobalt-mobile/android/settings.gradle deleted file mode 100644 index 102f74ae..00000000 --- a/websrc/cobalt-mobile/android/settings.gradle +++ /dev/null @@ -1,4 +0,0 @@ -rootProject.name = 'cobaltmobile' -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) -include ':app' -includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/websrc/cobalt-mobile/app.json b/websrc/cobalt-mobile/app.json deleted file mode 100644 index 4924b29c..00000000 --- a/websrc/cobalt-mobile/app.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "cobaltmobile", - "displayName": "cobaltmobile" -} diff --git a/websrc/cobalt-mobile/babel.config.js b/websrc/cobalt-mobile/babel.config.js deleted file mode 100644 index f7b3da3b..00000000 --- a/websrc/cobalt-mobile/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ['module:@react-native/babel-preset'], -}; diff --git a/websrc/cobalt-mobile/index.js b/websrc/cobalt-mobile/index.js deleted file mode 100644 index a850d031..00000000 --- a/websrc/cobalt-mobile/index.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @format - */ - -import {AppRegistry} from 'react-native'; -import App from './App'; -import {name as appName} from './app.json'; - -AppRegistry.registerComponent(appName, () => App); diff --git a/websrc/cobalt-mobile/ios/.xcode.env b/websrc/cobalt-mobile/ios/.xcode.env deleted file mode 100644 index 3d5782c7..00000000 --- a/websrc/cobalt-mobile/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/websrc/cobalt-mobile/ios/Podfile b/websrc/cobalt-mobile/ios/Podfile deleted file mode 100644 index 7ebbb5f3..00000000 --- a/websrc/cobalt-mobile/ios/Podfile +++ /dev/null @@ -1,55 +0,0 @@ -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip - -platform :ios, min_ios_version_supported -prepare_react_native_project! - -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded -# -# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# ``` -flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled - -linkage = ENV['USE_FRAMEWORKS'] -if linkage != nil - Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green - use_frameworks! :linkage => linkage.to_sym -end - -target 'cobaltmobile' do - config = use_native_modules! - - use_react_native!( - :path => config[:reactNativePath], - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable the next line. - :flipper_configuration => flipper_config, - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/.." - ) - - target 'cobaltmobileTests' do - inherit! :complete - # Pods for testing - end - - post_install do |installer| - # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false - ) - end -end diff --git a/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/project.pbxproj b/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/project.pbxproj deleted file mode 100644 index 67f6711f..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/project.pbxproj +++ /dev/null @@ -1,684 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 00E356F31AD99517003FC87E /* cobaltmobileTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* cobaltmobileTests.m */; }; - 0C80B921A6F3F58F76C31292 /* libPods-cobaltmobile.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-cobaltmobile.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 7699B88040F8A987B510C191 /* libPods-cobaltmobile-cobaltmobileTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-cobaltmobile-cobaltmobileTests.a */; }; - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = cobaltmobile; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 00E356EE1AD99517003FC87E /* cobaltmobileTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = cobaltmobileTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* cobaltmobileTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = cobaltmobileTests.m; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* cobaltmobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cobaltmobile.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = cobaltmobile/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = cobaltmobile/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = cobaltmobile/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = cobaltmobile/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = cobaltmobile/main.m; sourceTree = ""; }; - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-cobaltmobile-cobaltmobileTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-cobaltmobile-cobaltmobileTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B4392A12AC88292D35C810B /* Pods-cobaltmobile.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cobaltmobile.debug.xcconfig"; path = "Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile.debug.xcconfig"; sourceTree = ""; }; - 5709B34CF0A7D63546082F79 /* Pods-cobaltmobile.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cobaltmobile.release.xcconfig"; path = "Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile.release.xcconfig"; sourceTree = ""; }; - 5B7EB9410499542E8C5724F5 /* Pods-cobaltmobile-cobaltmobileTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cobaltmobile-cobaltmobileTests.debug.xcconfig"; path = "Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests.debug.xcconfig"; sourceTree = ""; }; - 5DCACB8F33CDC322A6C60F78 /* libPods-cobaltmobile.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-cobaltmobile.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = cobaltmobile/LaunchScreen.storyboard; sourceTree = ""; }; - 89C6BE57DB24E9ADA2F236DE /* Pods-cobaltmobile-cobaltmobileTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cobaltmobile-cobaltmobileTests.release.xcconfig"; path = "Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests.release.xcconfig"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7699B88040F8A987B510C191 /* libPods-cobaltmobile-cobaltmobileTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0C80B921A6F3F58F76C31292 /* libPods-cobaltmobile.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* cobaltmobileTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* cobaltmobileTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = cobaltmobileTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* cobaltmobile */ = { - isa = PBXGroup; - children = ( - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = cobaltmobile; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 5DCACB8F33CDC322A6C60F78 /* libPods-cobaltmobile.a */, - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-cobaltmobile-cobaltmobileTests.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* cobaltmobile */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* cobaltmobileTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - BBD78D7AC51CEA395F1C20DB /* Pods */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* cobaltmobile.app */, - 00E356EE1AD99517003FC87E /* cobaltmobileTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - BBD78D7AC51CEA395F1C20DB /* Pods */ = { - isa = PBXGroup; - children = ( - 3B4392A12AC88292D35C810B /* Pods-cobaltmobile.debug.xcconfig */, - 5709B34CF0A7D63546082F79 /* Pods-cobaltmobile.release.xcconfig */, - 5B7EB9410499542E8C5724F5 /* Pods-cobaltmobile-cobaltmobileTests.debug.xcconfig */, - 89C6BE57DB24E9ADA2F236DE /* Pods-cobaltmobile-cobaltmobileTests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* cobaltmobileTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "cobaltmobileTests" */; - buildPhases = ( - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = cobaltmobileTests; - productName = cobaltmobileTests; - productReference = 00E356EE1AD99517003FC87E /* cobaltmobileTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* cobaltmobile */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "cobaltmobile" */; - buildPhases = ( - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = cobaltmobile; - productName = cobaltmobile; - productReference = 13B07F961A680F5B00A75B9A /* cobaltmobile.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1210; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1120; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "cobaltmobile" */; - compatibilityVersion = "Xcode 12.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* cobaltmobile */, - 00E356ED1AD99517003FC87E /* cobaltmobileTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/.xcode.env.local", - "$(SRCROOT)/.xcode.env", - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; - }; - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-cobaltmobile-cobaltmobileTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-cobaltmobile-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-cobaltmobile/Pods-cobaltmobile-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-cobaltmobile-cobaltmobileTests/Pods-cobaltmobile-cobaltmobileTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* cobaltmobileTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* cobaltmobile */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-cobaltmobile-cobaltmobileTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = cobaltmobileTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/cobaltmobile.app/cobaltmobile"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-cobaltmobile-cobaltmobileTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - INFOPLIST_FILE = cobaltmobileTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/cobaltmobile.app/cobaltmobile"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-cobaltmobile.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = cobaltmobile/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = cobaltmobile; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-cobaltmobile.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = cobaltmobile/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = cobaltmobile; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DFOLLY_CFG_NO_COROUTINES=1", - ); - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DFOLLY_CFG_NO_COROUTINES=1", - ); - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "cobaltmobileTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "cobaltmobile" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "cobaltmobile" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/xcshareddata/xcschemes/cobaltmobile.xcscheme b/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/xcshareddata/xcschemes/cobaltmobile.xcscheme deleted file mode 100644 index 74800166..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile.xcodeproj/xcshareddata/xcschemes/cobaltmobile.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.h b/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.h deleted file mode 100644 index 5d280825..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : RCTAppDelegate - -@end diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.mm b/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.mm deleted file mode 100644 index a40998e5..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/AppDelegate.mm +++ /dev/null @@ -1,31 +0,0 @@ -#import "AppDelegate.h" - -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"cobaltmobile"; - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self getBundleURL]; -} - -- (NSURL *)getBundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -@end diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/AppIcon.appiconset/Contents.json b/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 81213230..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/Contents.json b/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/Contents.json deleted file mode 100644 index 2d92bd53..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/Info.plist b/websrc/cobalt-mobile/ios/cobaltmobile/Info.plist deleted file mode 100644 index bf5578a7..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/Info.plist +++ /dev/null @@ -1,52 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - cobaltmobile - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - NSAppTransportSecurity - - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/LaunchScreen.storyboard b/websrc/cobalt-mobile/ios/cobaltmobile/LaunchScreen.storyboard deleted file mode 100644 index a8d78f6f..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/LaunchScreen.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/websrc/cobalt-mobile/ios/cobaltmobile/main.m b/websrc/cobalt-mobile/ios/cobaltmobile/main.m deleted file mode 100644 index d645c724..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobile/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/websrc/cobalt-mobile/ios/cobaltmobileTests/Info.plist b/websrc/cobalt-mobile/ios/cobaltmobileTests/Info.plist deleted file mode 100644 index ba72822e..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobileTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/websrc/cobalt-mobile/ios/cobaltmobileTests/cobaltmobileTests.m b/websrc/cobalt-mobile/ios/cobaltmobileTests/cobaltmobileTests.m deleted file mode 100644 index 55e88234..00000000 --- a/websrc/cobalt-mobile/ios/cobaltmobileTests/cobaltmobileTests.m +++ /dev/null @@ -1,66 +0,0 @@ -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React" - -@interface cobaltmobileTests : XCTestCase - -@end - -@implementation cobaltmobileTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; -#ifdef DEBUG - RCTSetLogFunction( - ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); -#endif - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view - matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - -#ifdef DEBUG - RCTSetLogFunction(RCTDefaultLogFunction); -#endif - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - -@end diff --git a/websrc/cobalt-mobile/jest.config.js b/websrc/cobalt-mobile/jest.config.js deleted file mode 100644 index 8eb675e9..00000000 --- a/websrc/cobalt-mobile/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - preset: 'react-native', -}; diff --git a/websrc/cobalt-mobile/metro.config.js b/websrc/cobalt-mobile/metro.config.js deleted file mode 100644 index ad8f87b6..00000000 --- a/websrc/cobalt-mobile/metro.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); - -/** - * Metro configuration - * https://facebook.github.io/metro/docs/configuration - * - * @type {import('metro-config').MetroConfig} - */ -const config = {}; - -module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/websrc/cobalt-mobile/package-lock.json b/websrc/cobalt-mobile/package-lock.json deleted file mode 100644 index b8d6c1ea..00000000 --- a/websrc/cobalt-mobile/package-lock.json +++ /dev/null @@ -1,12803 +0,0 @@ -{ - "name": "cobaltmobile", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "cobaltmobile", - "version": "0.0.1", - "dependencies": { - "@rneui/base": "^4.0.0-rc.7", - "@rneui/themed": "^4.0.0-rc.8", - "react": "18.2.0", - "react-native": "0.73.2", - "react-native-webview": "^13.6.4" - }, - "devDependencies": { - "@babel/core": "^7.20.0", - "@babel/preset-env": "^7.20.0", - "@babel/runtime": "^7.20.0", - "@react-native/babel-preset": "0.73.19", - "@react-native/eslint-config": "0.73.2", - "@react-native/metro-config": "0.73.3", - "@react-native/typescript-config": "0.73.1", - "@types/react": "^18.2.6", - "@types/react-test-renderer": "^18.0.0", - "babel-jest": "^29.6.3", - "eslint": "^8.19.0", - "jest": "^29.6.3", - "prettier": "2.8.8", - "react-test-renderer": "18.2.0", - "typescript": "5.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz", - "integrity": "sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", - "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz", - "integrity": "sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-default-from": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz", - "integrity": "sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/preset-flow/-/preset-flow-7.23.3.tgz", - "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmmirror.com/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/register/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@react-native-community/cli": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli/-/cli-12.3.0.tgz", - "integrity": "sha512-XeQohi2E+S2+MMSz97QcEZ/bWpi8sfKiQg35XuYeJkc32Til2g0b97jRpn0/+fV0BInHoG1CQYWwHA7opMsrHg==", - "dependencies": { - "@react-native-community/cli-clean": "12.3.0", - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-doctor": "12.3.0", - "@react-native-community/cli-hermes": "12.3.0", - "@react-native-community/cli-plugin-metro": "12.3.0", - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native-community/cli-types": "12.3.0", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "bin": { - "react-native": "build/bin.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native-community/cli-clean": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-clean/-/cli-clean-12.3.0.tgz", - "integrity": "sha512-iAgLCOWYRGh9ukr+eVQnhkV/OqN3V2EGd/in33Ggn/Mj4uO6+oUncXFwB+yjlyaUNz6FfjudhIz09yYGSF+9sg==", - "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-config": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-config/-/cli-config-12.3.0.tgz", - "integrity": "sha512-BrTn5ndFD9uOxO8kxBQ32EpbtOvAsQExGPI7SokdI4Zlve70FziLtTq91LTlTUgMq1InVZn/jJb3VIDk6BTInQ==", - "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.0.tgz", - "integrity": "sha512-w3b0iwjQlk47GhZWHaeTG8kKH09NCMUJO729xSdMBXE8rlbm4kHpKbxQY9qKb6NlfWSJN4noGY+FkNZS2rRwnQ==", - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native-community/cli-doctor": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-doctor/-/cli-doctor-12.3.0.tgz", - "integrity": "sha512-BPCwNNesoQMkKsxB08Ayy6URgGQ8Kndv6mMhIvJSNdST3J1+x3ehBHXzG9B9Vfi+DrTKRb8lmEl/b/7VkDlPkA==", - "dependencies": { - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@react-native-community/cli-hermes": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-hermes/-/cli-hermes-12.3.0.tgz", - "integrity": "sha512-G6FxpeZBO4AimKZwtWR3dpXRqTvsmEqlIkkxgwthdzn3LbVjDVIXKpVYU9PkR5cnT+KuAUxO0WwthrJ6Nmrrlg==", - "dependencies": { - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.0.tgz", - "integrity": "sha512-VU1NZw63+GLU2TnyQ919bEMThpHQ/oMFju9MCfrd3pyPJz4Sn+vc3NfnTDUVA5Z5yfLijFOkHIHr4vo/C9bjnw==", - "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.2.4", - "glob": "^7.1.3", - "logkitty": "^0.7.1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.0.tgz", - "integrity": "sha512-H95Sgt3wT7L8V75V0syFJDtv4YgqK5zbu69ko4yrXGv8dv2EBi6qZP0VMmkqXDamoPm9/U7tDTdbcf26ctnLfg==", - "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-plugin-metro": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.0.tgz", - "integrity": "sha512-tYNHIYnNmxrBcsqbE2dAnLMzlKI3Cp1p1xUgTrNaOMsGPDN1epzNfa34n6Nps3iwKElSL7Js91CzYNqgTalucA==" - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-server-api/-/cli-server-api-12.3.0.tgz", - "integrity": "sha512-Rode8NrdyByC+lBKHHn+/W8Zu0c+DajJvLmOWbe2WY/ECvnwcd9MHHbu92hlT2EQaJ9LbLhGrSbQE3cQy9EOCw==", - "dependencies": { - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^7.5.1" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-tools/-/cli-tools-12.3.0.tgz", - "integrity": "sha512-2GafnCr8D88VdClwnm9KZfkEb+lzVoFdr/7ybqhdeYM0Vnt/tr2N+fM1EQzwI1DpzXiBzTYemw8GjRq+Utcz2Q==", - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli-tools/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@react-native-community/cli-types": { - "version": "12.3.0", - "resolved": "https://registry.npmmirror.com/@react-native-community/cli-types/-/cli-types-12.3.0.tgz", - "integrity": "sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw==", - "dependencies": { - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native-community/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@react-native/assets-registry": { - "version": "0.73.1", - "resolved": "https://registry.npmmirror.com/@react-native/assets-registry/-/assets-registry-0.73.1.tgz", - "integrity": "sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.73.2", - "resolved": "https://registry.npmmirror.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.2.tgz", - "integrity": "sha512-PadyFZWVaWXIBP7Q5dgEL7eAd7tnsgsLjoHJB1hIRZZuVUg1Zqe3nULwC7RFAqOtr5Qx7KXChkFFcKQ3WnZzGw==", - "dependencies": { - "@react-native/codegen": "0.73.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.73.19", - "resolved": "https://registry.npmmirror.com/@react-native/babel-preset/-/babel-preset-0.73.19.tgz", - "integrity": "sha512-ujon01uMOREZecIltQxPDmJ6xlVqAUFGI/JCSpeVYdxyXBoBH5dBb0ihj7h6LKH1q1jsnO9z4MxfddtypKkIbg==", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.73.2", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.73.2", - "resolved": "https://registry.npmmirror.com/@react-native/codegen/-/codegen-0.73.2.tgz", - "integrity": "sha512-lfy8S7umhE3QLQG5ViC4wg5N1Z+E6RnaeIw8w1voroQsXXGPB72IBozh8dAHR3+ceTxIU0KX3A8OpJI8e1+HpQ==", - "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.73.12", - "resolved": "https://registry.npmmirror.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.12.tgz", - "integrity": "sha512-xWU06OkC1cX++Duh/cD/Wv+oZ0oSY3yqbtxAqQA2H3Q+MQltNNJM6MqIHt1VOZSabRf/LVlR1JL6U9TXJirkaw==", - "dependencies": { - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native/dev-middleware": "0.73.7", - "@react-native/metro-babel-transformer": "0.73.13", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.73.3", - "resolved": "https://registry.npmmirror.com/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz", - "integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.73.7", - "resolved": "https://registry.npmmirror.com/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz", - "integrity": "sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.73.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^1.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "open": "^7.0.3", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/eslint-config": { - "version": "0.73.2", - "resolved": "https://registry.npmmirror.com/@react-native/eslint-config/-/eslint-config-0.73.2.tgz", - "integrity": "sha512-YzMfes19loTfbrkbYNAfHBDXX4oRBzc5wnvHs4h2GIHUj6YKs5ZK5lldqSrBJCdZAI3nuaO9Qj+t5JRwou571w==", - "dev": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/eslint-parser": "^7.20.0", - "@react-native/eslint-plugin": "0.73.1", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-ft-flow": "^2.0.1", - "eslint-plugin-jest": "^26.5.3", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": ">=8", - "prettier": ">=2" - } - }, - "node_modules/@react-native/eslint-plugin": { - "version": "0.73.1", - "resolved": "https://registry.npmmirror.com/@react-native/eslint-plugin/-/eslint-plugin-0.73.1.tgz", - "integrity": "sha512-8BNMFE8CAI7JLWLOs3u33wcwcJ821LYs5g53Xyx9GhSg0h8AygTwDrwmYb/pp04FkCNCPjKPBoaYRthQZmxgwA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.73.4", - "resolved": "https://registry.npmmirror.com/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz", - "integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.73.1", - "resolved": "https://registry.npmmirror.com/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz", - "integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.73.13", - "resolved": "https://registry.npmmirror.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.13.tgz", - "integrity": "sha512-k9AQifogQfgUXPlqQSoMtX2KUhniw4XvJl+nZ4hphCH7qiMDAwuP8OmkJbz5E/N+Ro9OFuLE7ax4GlwxaTsAWg==", - "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.73.19", - "hermes-parser": "0.15.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/metro-config": { - "version": "0.73.3", - "resolved": "https://registry.npmmirror.com/@react-native/metro-config/-/metro-config-0.73.3.tgz", - "integrity": "sha512-aIVh+lM52n7/RFDXLDiIp1vI21jc9thm2VxdkP7KwxMut7VvW+2tO38zKt74/2ker2ca0205tbf3pyCYBvV6Ww==", - "dev": true, - "dependencies": { - "@react-native/js-polyfills": "0.73.1", - "@react-native/metro-babel-transformer": "0.73.13", - "metro-config": "^0.80.3", - "metro-runtime": "^0.80.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.73.2", - "resolved": "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz", - "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==" - }, - "node_modules/@react-native/typescript-config": { - "version": "0.73.1", - "resolved": "https://registry.npmmirror.com/@react-native/typescript-config/-/typescript-config-0.73.1.tgz", - "integrity": "sha512-7Wrmdp972ZO7xvDid+xRGtvX6xz47cpGj7Y7VKlUhSVFFqbOGfB5WCpY1vMr6R/fjl+Og2fRw+TETN2+JnJi0w==", - "dev": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.73.4", - "resolved": "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz", - "integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react-native": "*" - } - }, - "node_modules/@rneui/base": { - "version": "4.0.0-rc.7", - "resolved": "https://registry.npmmirror.com/@rneui/base/-/base-4.0.0-rc.7.tgz", - "integrity": "sha512-dffzoYek3Qp+7wJzC42QjI/Fu1HOUNxFIR88t1laDrBV5QZQB55f+Vu5zLbC80/bh1b8fYtl63HTIWpORuA3Eg==", - "dependencies": { - "@types/react-native-vector-icons": "^6.4.10", - "color": "^3.2.1", - "deepmerge": "^4.2.2", - "hoist-non-react-statics": "^3.3.2", - "react-native-ratings": "^8.1.0", - "react-native-size-matters": "^0.4.0" - }, - "peerDependencies": { - "react-native-safe-area-context": "^3.1.9 || ^4.0.0", - "react-native-vector-icons": ">7.0.0" - } - }, - "node_modules/@rneui/themed": { - "version": "4.0.0-rc.8", - "resolved": "https://registry.npmmirror.com/@rneui/themed/-/themed-4.0.0-rc.8.tgz", - "integrity": "sha512-8L/XOrL9OK/r+/iBLvx63TbIdZOXF8SIjN9eArMYm6kRbMr8m4BitXllDN8nBhBsSPNYvL6EAgjk+i2MfY4sBA==", - "peerDependencies": { - "@rneui/base": "4.0.0-rc.7" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.11.10", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.10.tgz", - "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-native": { - "version": "0.70.19", - "resolved": "https://registry.npmmirror.com/@types/react-native/-/react-native-0.70.19.tgz", - "integrity": "sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-native-vector-icons": { - "version": "6.4.18", - "resolved": "https://registry.npmmirror.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.18.tgz", - "integrity": "sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==", - "dependencies": { - "@types/react": "*", - "@types/react-native": "^0.70" - } - }, - "node_modules/@types/react-test-renderer": { - "version": "18.0.7", - "resolved": "https://registry.npmmirror.com/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz", - "integrity": "sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmmirror.com/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "node_modules/ansi-fragments/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-fragments/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmmirror.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001581", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", - "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmmirror.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/chromium-edge-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-edge-launcher/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dependencies": { - "browserslist": "^4.22.2" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecated-react-native-prop-types": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz", - "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==", - "dependencies": { - "@react-native/normalize-colors": "^0.73.0", - "invariant": "^2.2.4", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.648", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz", - "integrity": "sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmmirror.com/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-ft-flow": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz", - "integrity": "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7.12.0", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "26.9.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz", - "integrity": "sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz", - "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==", - "dev": true, - "dependencies": { - "eslint-plugin-react-native-globals": "^0.1.1" - }, - "peerDependencies": { - "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-xml-parser": { - "version": "4.3.3", - "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz", - "integrity": "sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==" - }, - "node_modules/flow-parser": { - "version": "0.206.0", - "resolved": "https://registry.npmmirror.com/flow-parser/-/flow-parser-0.206.0.tgz", - "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.15.0", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.15.0.tgz", - "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==" - }, - "node_modules/hermes-parser": { - "version": "0.15.0", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.15.0.tgz", - "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==", - "dependencies": { - "hermes-estree": "0.15.0" - } - }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hermes-profile-transformer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/joi": { - "version": "17.12.0", - "resolved": "https://registry.npmmirror.com/joi/-/joi-17.12.0.tgz", - "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.4", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmmirror.com/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==" - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==" - }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmmirror.com/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jscodeshift/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jscodeshift/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jscodeshift/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmmirror.com/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } - }, - "node_modules/logkitty/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/logkitty/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/logkitty/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/metro": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro/-/metro-0.80.5.tgz", - "integrity": "sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.18.2", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.5", - "metro-cache": "0.80.5", - "metro-cache-key": "0.80.5", - "metro-config": "0.80.5", - "metro-core": "0.80.5", - "metro-file-map": "0.80.5", - "metro-resolver": "0.80.5", - "metro-runtime": "0.80.5", - "metro-source-map": "0.80.5", - "metro-symbolicate": "0.80.5", - "metro-transform-plugins": "0.80.5", - "metro-transform-worker": "0.80.5", - "mime-types": "^2.1.27", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^3.0.2", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.1", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-babel-transformer/-/metro-babel-transformer-0.80.5.tgz", - "integrity": "sha512-sxH6hcWCorhTbk4kaShCWsadzu99WBL4Nvq4m/sDTbp32//iGuxtAnUK+ZV+6IEygr2u9Z0/4XoZ8Sbcl71MpA==", - "dependencies": { - "@babel/core": "^7.20.0", - "hermes-parser": "0.18.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.18.2", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.18.2.tgz", - "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==" - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.18.2", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.18.2.tgz", - "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", - "dependencies": { - "hermes-estree": "0.18.2" - } - }, - "node_modules/metro-cache": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-cache/-/metro-cache-0.80.5.tgz", - "integrity": "sha512-2u+dQ4PZwmC7eZo9uMBNhQQMig9f+w4QWBZwXCdVy/RYOHM0eObgGdMEOwODo73uxie82T9lWzxr3aZOZ+Nqtw==", - "dependencies": { - "metro-core": "0.80.5", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-cache-key/-/metro-cache-key-0.80.5.tgz", - "integrity": "sha512-fr3QLZUarsB3tRbVcmr34kCBsTHk0Sh9JXGvBY/w3b2lbre+Lq5gtgLyFElHPecGF7o4z1eK9r3ubxtScHWcbA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-config": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-config/-/metro-config-0.80.5.tgz", - "integrity": "sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ==", - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "jest-validate": "^29.6.3", - "metro": "0.80.5", - "metro-cache": "0.80.5", - "metro-core": "0.80.5", - "metro-runtime": "0.80.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-core": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-core/-/metro-core-0.80.5.tgz", - "integrity": "sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg==", - "dependencies": { - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-file-map": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-file-map/-/metro-file-map-0.80.5.tgz", - "integrity": "sha512-bKCvJ05drjq6QhQxnDUt3I8x7bTcHo3IIKVobEr14BK++nmxFGn/BmFLRzVBlghM6an3gqwpNEYxS5qNc+VKcg==", - "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/metro-minify-terser": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-minify-terser/-/metro-minify-terser-0.80.5.tgz", - "integrity": "sha512-S7oZLLcab6YXUT6jYFX/ZDMN7Fq6xBGGAG8liMFU1UljX6cTcEC2u+UIafYgCLrdVexp/+ClxrIetVPZ5LtL/g==", - "dependencies": { - "terser": "^5.15.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-resolver": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-resolver/-/metro-resolver-0.80.5.tgz", - "integrity": "sha512-haJ/Hveio3zv/Fr4eXVdKzjUeHHDogYok7OpRqPSXGhTXisNXB+sLN7CpcUrCddFRUDLnVaqQOYwhYsFndgUwA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-runtime": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-runtime/-/metro-runtime-0.80.5.tgz", - "integrity": "sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg==", - "dependencies": { - "@babel/runtime": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-source-map/-/metro-source-map-0.80.5.tgz", - "integrity": "sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ==", - "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.80.5", - "nullthrows": "^1.1.1", - "ob1": "0.80.5", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-symbolicate/-/metro-symbolicate-0.80.5.tgz", - "integrity": "sha512-IsM4mTYvmo9JvIqwEkCZ5+YeDVPST78Q17ZgljfLdHLSpIivOHp9oVoiwQ/YGbLx0xRHRIS/tKiXueWBnj3UWA==", - "dependencies": { - "invariant": "^2.2.4", - "metro-source-map": "0.80.5", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-transform-plugins/-/metro-transform-plugins-0.80.5.tgz", - "integrity": "sha512-7IdlTqK/k5+qE3RvIU5QdCJUPk4tHWEqgVuYZu8exeW+s6qOJ66hGIJjXY/P7ccucqF+D4nsbAAW5unkoUdS6g==", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/metro-transform-worker/-/metro-transform-worker-0.80.5.tgz", - "integrity": "sha512-Q1oM7hfP+RBgAtzRFBDjPhArELUJF8iRCZ8OidqCpYzQJVGuJZ7InSnIf3hn1JyqiUQwv2f1LXBO78i2rAjzyA==", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "metro": "0.80.5", - "metro-babel-transformer": "0.80.5", - "metro-cache": "0.80.5", - "metro-cache-key": "0.80.5", - "metro-minify-terser": "0.80.5", - "metro-source-map": "0.80.5", - "metro-transform-plugins": "0.80.5", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/metro/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/metro/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/metro/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.18.2", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.18.2.tgz", - "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==" - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.18.2", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.18.2.tgz", - "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", - "dependencies": { - "hermes-estree": "0.18.2" - } - }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmmirror.com/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" - }, - "node_modules/ob1": { - "version": "0.80.5", - "resolved": "https://registry.npmmirror.com/ob1/-/ob1-0.80.5.tgz", - "integrity": "sha512-zYDMnnNrFi/1Tqh0vo3PE4p97Tpl9/4MP2k2ECvkbLOZzQuAYZJLTUYVLZb7hJhbhjT+JJxAwBGS8iu5hCSd1w==", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "4.28.5", - "resolved": "https://registry.npmmirror.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz", - "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-native": { - "version": "0.73.2", - "resolved": "https://registry.npmmirror.com/react-native/-/react-native-0.73.2.tgz", - "integrity": "sha512-7zj9tcUYpJUBdOdXY6cM8RcXYWkyql4kMyGZflW99E5EuFPoC7Ti+ZQSl7LP9ZPzGD0vMfslwyDW0I4tPWUCFw==", - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native/assets-registry": "0.73.1", - "@react-native/codegen": "0.73.2", - "@react-native/community-cli-plugin": "0.73.12", - "@react-native/gradle-plugin": "0.73.4", - "@react-native/js-polyfills": "0.73.1", - "@react-native/normalize-colors": "0.73.2", - "@react-native/virtualized-lists": "0.73.4", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "base64-js": "^1.5.1", - "deprecated-react-native-prop-types": "^5.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^4.27.7", - "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "node_modules/react-native-ratings": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/react-native-ratings/-/react-native-ratings-8.1.0.tgz", - "integrity": "sha512-+QOJ4G3NjVkI1D+tk4EGx1dCvVfbD2nQdkrj9cXrcAoEiwmbep4z4bZbCKmWMpQ5h2dqbxABU8/eBnbDmvAc3g==", - "dependencies": { - "lodash": "^4.17.15" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-safe-area-context": { - "version": "4.8.2", - "resolved": "https://registry.npmmirror.com/react-native-safe-area-context/-/react-native-safe-area-context-4.8.2.tgz", - "integrity": "sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==", - "peer": true, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-size-matters": { - "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/react-native-size-matters/-/react-native-size-matters-0.4.2.tgz", - "integrity": "sha512-DKE3f/sdcozd24oASgkP1iGg+YU3HoajRa5k3a4wkRzpiqREq8SGX12Y5zBgAt/8IivLQoTMYkyQu1/Giuy+zQ==", - "peerDependencies": { - "react-native": "*" - } - }, - "node_modules/react-native-vector-icons": { - "version": "10.0.3", - "resolved": "https://registry.npmmirror.com/react-native-vector-icons/-/react-native-vector-icons-10.0.3.tgz", - "integrity": "sha512-ZgVlV5AdQgnPHHvBEihGf2xwyziT1acpXV1U+WfCgCv3lcEeCRsmwAsBU+kUSNsU+8TcWVsX04kdI6qUaS8D7w==", - "peer": true, - "dependencies": { - "prop-types": "^15.7.2", - "yargs": "^16.1.1" - }, - "bin": { - "fa-upgrade.sh": "bin/fa-upgrade.sh", - "fa5-upgrade": "bin/fa5-upgrade.sh", - "fa6-upgrade": "bin/fa6-upgrade.sh", - "generate-icon": "bin/generate-icon.js" - } - }, - "node_modules/react-native-vector-icons/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native-webview": { - "version": "13.6.4", - "resolved": "https://registry.npmmirror.com/react-native-webview/-/react-native-webview-13.6.4.tgz", - "integrity": "sha512-AdgmaMBHPcyERTvng9eSGgHX6AleyUlSusWAxngSOSdiYGgHW81T6C5A8j/ImJAF9oZg0bQDxp43Hu56tzENZQ==", - "dependencies": { - "escape-string-regexp": "2.0.0", - "invariant": "2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-webview/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/react-native/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/react-native/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-native/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-native/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/react-native/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/react-native/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmmirror.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-test-renderer": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz", - "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", - "dev": true, - "dependencies": { - "react-is": "^18.2.0", - "react-shallow-renderer": "^16.15.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-test-renderer/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/react-test-renderer/node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" - }, - "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "dependencies": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmmirror.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmmirror.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmmirror.com/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - } - } - } -} diff --git a/websrc/cobalt-mobile/package.json b/websrc/cobalt-mobile/package.json deleted file mode 100644 index be5dae2e..00000000 --- a/websrc/cobalt-mobile/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "cobaltmobile", - "version": "0.0.1", - "private": true, - "scripts": { - "android": "react-native run-android", - "ios": "react-native run-ios", - "lint": "eslint .", - "start": "react-native start", - "test": "jest" - }, - "dependencies": { - "@rneui/base": "^4.0.0-rc.7", - "@rneui/themed": "^4.0.0-rc.8", - "react": "18.2.0", - "react-native": "0.73.2", - "react-native-webview": "^13.6.4" - }, - "devDependencies": { - "@babel/core": "^7.20.0", - "@babel/preset-env": "^7.20.0", - "@babel/runtime": "^7.20.0", - "@react-native/babel-preset": "0.73.19", - "@react-native/eslint-config": "0.73.2", - "@react-native/metro-config": "0.73.3", - "@react-native/typescript-config": "0.73.1", - "@types/react": "^18.2.6", - "@types/react-test-renderer": "^18.0.0", - "babel-jest": "^29.6.3", - "eslint": "^8.19.0", - "jest": "^29.6.3", - "prettier": "2.8.8", - "react-test-renderer": "18.2.0", - "typescript": "5.0.4" - }, - "engines": { - "node": ">=18" - } -} diff --git a/websrc/cobalt-mobile/tsconfig.json b/websrc/cobalt-mobile/tsconfig.json deleted file mode 100644 index 304ab4e2..00000000 --- a/websrc/cobalt-mobile/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "@react-native/typescript-config/tsconfig.json" -} From a8ef13f903938cad329121547e84a6a5e7cd4909 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 20 Apr 2024 05:26:06 +0800 Subject: [PATCH 22/28] update server but have runtime problem --- CMakeLists.txt | 26 +- launcher/#launcher.glade# | 437 -------------- launcher/CMakeLists.txt | 0 launcher/assets/atom.png | Bin 30753 -> 0 bytes launcher/launcher.cpp | 552 ------------------ launcher/launcher.glade | 181 ------ launcher/launcher.glade~ | 167 ------ launcher/launcher.hpp | 292 --------- launcher/launcher.json | 10 - locale/lithium.pot | 23 - locale/po/en_US.UTF-8/lithium.po | 4 - locale/po/es/lithium.po | 46 -- locale/po/fr_FR/lithium.po | 46 -- locale/po/zh-CN.UTF-8/lithium.po | 258 -------- locale/po/zh-CN/lithium.po | 258 -------- src/App.cpp | 8 +- src/atom/algorithm/CMakeLists.txt | 2 + src/atom/algorithm/hash.hpp | 23 + .../hash_util.cpp => algorithm/mhash.cpp} | 119 +--- .../hash_util.hpp => algorithm/mhash.hpp} | 29 +- src/atom/async/pool.hpp | 122 ++++ src/atom/utils/CMakeLists.txt | 2 - src/atom/utils/aes.cpp | 68 ++- src/atom/utils/aes.hpp | 14 +- src/atom/utils/switch.hpp | 2 + src/preload.cpp | 89 +++ src/preload.hpp | 7 + src/server/App.cpp | 8 +- src/server/App.hpp | 2 +- src/server/AppComponent.hpp | 195 ++++--- src/server/CMakeLists.txt | 38 ++ src/server/Runner.cpp | 70 ++- src/server/Runner.hpp | 6 +- src/server/auth/AuthHandler.cpp | 12 - src/server/auth/AuthHandler.hpp | 19 - src/server/auth/JWT.cpp | 32 - src/server/auth/JWT.hpp | 29 - .../controller/AsyncConfigController.hpp | 31 +- .../controller/AsyncDeviceController.hpp | 2 - src/server/controller/AsyncIOController.hpp | 2 - src/server/controller/AsyncPHD2Controller.hpp | 2 - .../controller/AsyncProcessController.hpp | 2 - .../controller/AsyncScriptController.hpp | 2 - .../controller/AsyncStaticController.hpp | 2 - .../controller/AsyncSystemController.hpp | 2 - src/server/controller/AuthController.hpp | 75 --- src/server/controller/StaticController.hpp | 45 -- src/server/controller/StoryController.hpp | 124 ---- src/server/database/StoryDb.hpp | 65 --- src/server/database/UserDb.hpp | 73 --- src/server/database/model/StoryModel.hpp | 22 - src/server/database/model/UserModel.hpp | 22 - src/server/interceptor/AuthInterceptor.cpp | 33 -- src/server/interceptor/AuthInterceptor.hpp | 25 - src/server/launcher/faq.cpp | 155 ----- src/server/launcher/faq.hpp | 65 --- src/server/service/AuthService.cpp | 74 --- src/server/service/AuthService.hpp | 31 - src/server/service/StoryService.cpp | 95 --- src/server/service/StoryService.hpp | 43 -- src/utils/constant.hpp | 5 + src/utils/resource.hpp | 41 ++ 62 files changed, 635 insertions(+), 3599 deletions(-) delete mode 100644 launcher/#launcher.glade# delete mode 100644 launcher/CMakeLists.txt delete mode 100644 launcher/assets/atom.png delete mode 100644 launcher/launcher.cpp delete mode 100644 launcher/launcher.glade delete mode 100644 launcher/launcher.glade~ delete mode 100644 launcher/launcher.hpp delete mode 100644 launcher/launcher.json delete mode 100644 locale/lithium.pot delete mode 100644 locale/po/en_US.UTF-8/lithium.po delete mode 100644 locale/po/es/lithium.po delete mode 100644 locale/po/fr_FR/lithium.po delete mode 100644 locale/po/zh-CN.UTF-8/lithium.po delete mode 100644 locale/po/zh-CN/lithium.po rename src/atom/{utils/hash_util.cpp => algorithm/mhash.cpp} (61%) rename src/atom/{utils/hash_util.hpp => algorithm/mhash.hpp} (80%) create mode 100644 src/atom/async/pool.hpp create mode 100644 src/preload.cpp create mode 100644 src/preload.hpp delete mode 100644 src/server/auth/AuthHandler.cpp delete mode 100644 src/server/auth/AuthHandler.hpp delete mode 100644 src/server/auth/JWT.cpp delete mode 100644 src/server/auth/JWT.hpp delete mode 100644 src/server/controller/AuthController.hpp delete mode 100644 src/server/controller/StaticController.hpp delete mode 100644 src/server/controller/StoryController.hpp delete mode 100644 src/server/database/StoryDb.hpp delete mode 100644 src/server/database/UserDb.hpp delete mode 100644 src/server/database/model/StoryModel.hpp delete mode 100644 src/server/database/model/UserModel.hpp delete mode 100644 src/server/interceptor/AuthInterceptor.cpp delete mode 100644 src/server/interceptor/AuthInterceptor.hpp delete mode 100644 src/server/launcher/faq.cpp delete mode 100644 src/server/launcher/faq.hpp delete mode 100644 src/server/service/AuthService.cpp delete mode 100644 src/server/service/AuthService.hpp delete mode 100644 src/server/service/StoryService.cpp delete mode 100644 src/server/service/StoryService.hpp create mode 100644 src/utils/resource.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 10b6d0bc..786ff06a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,18 @@ include_directories(${CMAKE_SOURCE_DIR}/libs/oatpp) include_directories(${CMAKE_SOURCE_DIR}/libs/oatpp-swagger) include_directories(${CMAKE_SOURCE_DIR}/libs/oatpp-websocket) +find_package(OpenSSL REQUIRED) +if(OpenSSL_FOUND) + message("-- Found OpenSSL ${OPENSSL_VERSION}: ${OPENSSL_LIBRARIES}") +else() + message("-- OpenSSL Not Found") +endif() + +find_package(CFITSIO REQUIRED) +find_package(ZLIB REQUIRED) +find_package(SQLite3 REQUIRED) +find_package(fmt REQUIRED) + ################################################################################# # # Subdirectories of Lithium @@ -118,6 +130,7 @@ add_subdirectory(modules) add_subdirectory(driver) add_subdirectory(${lithium_src_dir}/config) +add_subdirectory(${lithium_src_dir}/server) ################################################################################# # @@ -219,18 +232,6 @@ set(Lithium_module ${lithium_src_dir}/LithiumApp.cpp ) -find_package(OpenSSL REQUIRED) -if(OpenSSL_FOUND) - message("-- Found OpenSSL ${OPENSSL_VERSION}: ${OPENSSL_LIBRARIES}") -else() - message("-- OpenSSL Not Found") -endif() - -find_package(CFITSIO REQUIRED) -find_package(ZLIB REQUIRED) -find_package(SQLite3 REQUIRED) -find_package(fmt REQUIRED) - ################################################################################# # Main @@ -239,6 +240,7 @@ add_executable(lithium_server ${lithium_src_dir}/app.cpp) target_link_directories(lithium_server PUBLIC ${CMAKE_BINARY_DIR}/libs) target_link_libraries(lithium_server lithium_server-library) +target_link_libraries(lithium_server lithium_webserver) target_link_libraries(lithium_server oatpp-websocket oatpp-swagger oatpp-openssl oatpp-zlib oatpp) target_link_libraries(lithium_server loguru) target_link_libraries(lithium_server libzippp) diff --git a/launcher/#launcher.glade# b/launcher/#launcher.glade# deleted file mode 100644 index ef2bca54..00000000 --- a/launcher/#launcher.glade# +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - - - False - True - - - True - False - 介绍页 - - - progress - False - - - - - True - False - 内容页 - - - False - - - - - True - False - 确认页 - - - confirm - False - - - - - False - end - 6 - 6 - 6 - 6 - 6 - 6 - 6 - - - intro - False - - - - - False - 440 - 250 - assets\atom.png - - - True - False - vertical - top - - - True - False - - - True - False - 文件(_F) - True - - - True - False - - - gtk-new - True - False - True - True - - - - - gtk-open - True - False - True - True - - - - - gtk-save - True - False - True - True - - - - - gtk-save-as - True - False - True - True - - - - - True - False - - - - - gtk-quit - True - False - True - True - - - - - - - - - True - False - 编辑(_E) - True - - - True - False - - - gtk-cut - True - False - True - True - - - - - gtk-copy - True - False - True - True - - - - - gtk-paste - True - False - True - True - - - - - gtk-delete - True - False - True - True - - - - - - - - - True - False - 视图(_V) - True - - - - - True - False - 帮助(_H) - True - - - True - False - - - gtk-about - True - False - True - True - - - - - - - - - False - True - 0 - - - - - True - True - left - True - True - - - True - False - vertical - - - - - - - - - - - - - - True - False - Home - center - True - - - Home - True - True - True - - - - - True - False - vertical - - - - - - - - - - - - 1 - - - - - True - False - Installation - - - 1 - False - - - - - True - False - vertical - - - - - - - - - - - - 2 - - - - - True - False - Settings - - - 2 - False - - - - - True - True - 1 - - - - - True - True - - - False - True - 2 - - - - - - - False - About - True - help-about - dialog - Hello ElementAstro Launcher - 1.0.0 - https://github.com/ElementAstro - Official Github Repository - Max Qian - Max Qian - Max Qian - Max Qian - assets\atom.png - gpl-3-0 - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - - - - - False - Lithium Script Editor - True - True - edit-find-replace - dialog - lithium - Lithium Script Editor - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/launcher/assets/atom.png b/launcher/assets/atom.png deleted file mode 100644 index 6d32705bb5c6cc1a82ccfe8e5f528e5427f78910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30753 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

Li{C|1jmf(rz8;l=|gC` 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 - */ - -/************************************************* - -Date: 2023-3-29 - -Description: Lithium Server Launcher - -**************************************************/ - -#include "launcher.hpp" - -#include -#include -#include -#include - -#include "atom/system/crash.hpp" -#include "atom/log/loguru.hpp" - -ServerLauncher::ServerLauncher(const std::string &config_file_path, const std::string &DLOG_File_path) - : _config_file_path(config_file_path), _DLOG_File_path(DLOG_File_path) -{ - try - { - // 加载配置文件 - load_config(); - } - catch (const std::exception &e) - { - DLOG_F(ERROR, "Failed to initialize ServerLauncher: {}", e.what()); - throw; - } -} - -void ServerLauncher::run() -{ - try - { - // 检查服务器所需的资源文件是否存在 - if (!check_resources()) - { - DLOG_F(INFO, "Some resource files are missing, downloading now..."); - download_resources(); - } - - check_dependencies(); - - check_config_file(_config_file_path); - - // 启动服务器 - start_server(); - - // 读取服务器输出 - read_server_output(); - - // 发送停止命令给服务器,并等待服务器退出 - stop_server(); - - // 等待服务器退出 - wait_for_server_to_exit(); - - DLOG_F(INFO, "Server stopped."); - } - catch (const std::exception &e) - { - LOG_F(ERROR, "Error occurred in ServerLauncher::run(): {}", e.what()); - throw; - } -} - -void ServerLauncher::stop() -{ - // 设置请求停止服务器的标志 - _stop_requested = true; - - // 唤醒服务器条件变量,以便服务器检测到停止请求 - _server_cv.notify_all(); - - DLOG_F(INFO, "Stop command sent to server."); -} - -bool ServerLauncher::is_running() const -{ - return _server_running; -} - -void ServerLauncher::load_config() -{ - std::ifstream config_file(_config_file_path); - if (!config_file) - { - LOG_F(ERROR, "Failed to open config file: {}", _config_file_path); - throw std::runtime_error("Failed to open config file: " + _config_file_path); - } - try - { - config_file >> _config; - DLOG_F(INFO, "Config file loaded successfully."); - } - catch (const std::exception &e) - { - LOG_F(ERROR, "Error occurred when reading config file: {}", e.what()); - throw; - } -} - -bool ServerLauncher::check_resources() -{ - const auto &resources = _config["resources"]; - - for (const auto &res_file : resources) - { - const std::string filename = res_file; - - if (!fs::exists(filename)) - { - LOG_F(ERROR, "Resource file '{}' is missing.", filename); - return false; - } - - // 计算 SHA256 值 - std::string sha256_val; - if (!calculate_sha256(filename, sha256_val)) - { - LOG_F(ERROR, "Failed to calculate SHA256 value of '" << filename << "'." << std::endl; - return false; - } - - const std::string expected_sha256 = res_file["sha256"]; - if (sha256_val != expected_sha256) - { - LOG_F(ERROR, "SHA256 check failed for '" << filename << "'." << std::endl); - return false; - } - } - - DLOG_F(INFO, "All resource files are found."); - return true; -} - -void ServerLauncher::download_resources() -{ - DLOG_F(INFO, "Downloading missing resources..."); - - // 创建线程池 - ThreadPool pool(std::thread::hardware_concurrency()); - - // 创建任务列表 - std::vector> tasks; - - for (const auto &res_file : _config["resources"]) - { - // 发送 HTTP GET 请求下载文件 - const std::string url = _config["resource_server"].get() + "/" + res_file.get(); - - // 添加下载任务到线程池 - tasks.emplace_back(pool.enqueue([url, res_file, this] - { - try { - httplib::Client client(_config["resource_server"]); - auto res = client.Get(url.c_str()); - - if (!res) { - LOG_F(ERROR, "Failed to download resource: {}", res_file.get()); - return false; - } - - // 将下载的数据写入文件 - std::ofstream outfile(res_file); - outfile.write(res->body.c_str(), res->body.size()); - - DLOG_F(INFO,"Resource file '{}' downloaded.", res_file.get()); - return true; - } - catch (const std::exception &e) { - LOG_F(ERROR, "Error occurred when downloading resource '{}: {}" ,res_file.get(), << e.what()); - return false; - } })); - } - - // 等待所有任务完成 - for (auto &&task : tasks) - { - task.wait(); - } - - // 检查是否有任务失败 - for (auto &&task : tasks) - { - if (!task.get()) - { - LOG_F(ERROR, "Failed to download some resources."); - } - } - - DLOG_F(INFO, "Downloading finished."); -} - -bool check_process(const std::string &name) -{ -#ifdef _WIN32 - std::string command = "tasklist /FI \"IMAGENAME eq " + name + "\""; - - // 创建匿名管道 - SECURITY_ATTRIBUTES saAttr; - HANDLE hReadPipe, hWritePipe; - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - if (!CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0)) - { - return false; - } - - // 设置命令行输出重定向到管道 - STARTUPINFOA si; - PROCESS_INFORMATION pi; - ZeroMemory(&si, sizeof(STARTUPINFOA)); - ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); - si.cb = sizeof(STARTUPINFOA); - si.hStdError = hWritePipe; - si.hStdOutput = hWritePipe; - si.dwFlags |= STARTF_USESTDHANDLES; - - // 启动命令行进程 - if (!CreateProcessA(NULL, const_cast(command.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) - { - CloseHandle(hReadPipe); - CloseHandle(hWritePipe); - return false; - } - - // 关闭写入端,避免读取阻塞 - CloseHandle(hWritePipe); - - // 读取命令行的输出结果 - const int BUFFER_SIZE = 4096; - char buffer[BUFFER_SIZE]; - DWORD bytesRead = 0; - std::string output; - - while (ReadFile(hReadPipe, buffer, BUFFER_SIZE - 1, &bytesRead, NULL)) - { - if (bytesRead == 0) - { - break; - } - - buffer[bytesRead] = '\0'; - output += buffer; - } - - // 关闭管道和进程句柄 - CloseHandle(hReadPipe); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - - // 检查输出结果中是否包含进程名 - return (output.find(name) != std::string::npos); -#else - std::string command = "ps aux | grep -v grep | grep -q '" + name + "'"; - return (system(command.c_str()) == 0); -#endif -} - -bool ServerLauncher::check_dependencies() -{ - const std::vector dependencies = {"redis-server", "mysqld"}; - - for (const auto &dependency : dependencies) - { - if (!check_process(dependency)) - { - DLOG_F(INFO, "Dependency process '{}' is not running.", dependency); - return false; - } - } - DLOG_F(INFO, "All dependencies are ready."); - return true; -} - -bool ServerLauncher::check_config_file(const std::string &config_file) -{ - if (!std::filesystem::exists(config_file)) - { - LOG_F(ERROR, "Config file not found: {}", config_file); - return false; - } - - try - { - std::ifstream ifs(config_file); - json config = json::parse(ifs); - - // 检查 "port" 配置项是否存在 - if (config.find("port") == config.end()) - { - LOG_F(ERROR, "Config item 'port' not found in config file."); - return false; - } - - // 检查 "port" 配置项是否合法 - int port = config["port"].get(); - if (port < 0 || port > 65535) - { - LOG_F(ERROR, "Invalid 'port' configuration value: {}", port); - return false; - } - } - catch (const std::exception &e) - { - LOG_F(ERROR, "Failed to parse config file: {}", e.what()); - return false; - } - - return true; -} - -bool ServerLauncher::check_modules(const std::string &modules_dir, const json &module_list) -{ - if (!std::filesystem::exists(modules_dir)) - { - DLOG_F(INFO, "Modules directory not found: {}", modules_dir); - if (!std::filesystem::create_directory(modules_dir)) - { - LOG_F(ERROR, "Failed to create modules directory: {}", modules_dir); - return false; - } - } - - bool all_found = true; - for (const auto &module : module_list) - { - std::string module_path = modules_dir + "/" + module.get(); - if (!std::filesystem::exists(module_path)) - { - DLOG_F(ERROR, "Required module not found: {}", module_path); - all_found = false; - } - } - - return all_found; -} - -void ServerLauncher::start_server() -{ - DLOG_F(INFO, "Starting server..."); - - // 执行启动服务器的命令 - const std::string cmd = _config["server_command"]; - - _server_process = std::shared_ptr(_popen(cmd.c_str(), "r"), [](FILE *f) - { if (f) { _pclose(f); } }); - - if (!_server_process) - { - DLOG_F(ERROR, "Failed to execute server command: {}", cmd); - throw std::runtime_error("Failed to execute server command: " + cmd); - } - else - { - DLOG_F(INFO, "Server process started with command: {}", cmd); - std::cout << "Server process started with command: " << cmd << std::endl; - } - - // 创建一个线程来等待服务器启动 - _server_thread = std::jthread([&] - { - std::unique_lock lock(_server_mutex); - - while (!_stop_requested) { - // 在条件变量上等待,直到服务器启动 - _server_cv.wait(lock, [&] { return _server_running || _stop_requested; }); - } - - // 如果请求停止服务器,则发送停止命令给服务器 - if (_stop_requested) { - fprintf(_server_process.get(), "%c", _config["stop_command"]); - fflush(_server_process.get()); - DLOG_F(INFO,"Stop command sent to server process."); - } }); - - DLOG_F(INFO, "Server started."); -} - -void ServerLauncher::stop_server() -{ - DLOG_F(INFO, "Stopping server..."); - - // 发送停止命令给服务器 - fprintf(_server_process.get(), "%c", _config["stop_command"]); - fflush(_server_process.get()); - - DLOG_F(INFO, "Stop command sent to server process."); -} - -void ServerLauncher::wait_for_server_to_exit() -{ - // 等待服务器退出并获取返回值 - int status = -1; - _server_thread.join(); - _server_process.reset(); - _server_running = false; -} - -void ServerLauncher::read_server_output() -{ - // 定义正则表达式模板,匹配错误信息 - std::regex error_regex("ERROR: \\[(\\S+)\\] (.*)"); - - // 创建一个线程来读取服务器输出 - std::thread read_thread([&] - { - char buffer[1024]; - while (fgets(buffer, sizeof(buffer), _server_process.get())) { - std::cout << buffer; - - // 判断输出中是否包含错误信息 - std::string line(buffer); - std::smatch match; - - if (std::regex_search(line, match, error_regex)) { - // 匹配成功,提取错误类型和错误消息 - std::string error_type = match[1].str(); - std::string error_message = match[2].str(); - - // 根据错误类型处理错误 - if (error_type == "CRITICAL") { - // 生成冲突日志 - //Lithium::CrashReport::saveCrashLog(error_message); - } - else if (error_type == "WARNING") { - } - - // 读取结束,设置服务器运行标志为 false - _server_running = false; - - // 唤醒等待服务器退出的条件变量 - _server_cv.notify_all(); - return; - } - } - - // 读取结束,设置服务器运行标志为 false - _server_running = false; - - // 唤醒等待服务器退出的条件变量 - _server_cv.notify_all(); }); - - // 启动成功,设置服务器运行标志为 true - _server_running = true; - - // 让分离线程自行运行,不阻塞 run() 函数 - read_thread.detach(); -} - -bool ServerLauncher::calculate_sha256(const std::string &filename, std::string &sha256_val) -{ - // 打开文件 - std::ifstream file(filename, std::ios::binary); - if (!file) - { - return false; - } - - // 计算 SHA256 值 - EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); - EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL); - - char buffer[1024]; - while (file.read(buffer, sizeof(buffer))) - { - EVP_DigestUpdate(mdctx, buffer, sizeof(buffer)); - } - - if (file.gcount() > 0) - { - EVP_DigestUpdate(mdctx, buffer, file.gcount()); - } - - unsigned char hash[EVP_MAX_MD_SIZE]; - unsigned int hash_len = 0; - EVP_DigestFinal_ex(mdctx, hash, &hash_len); - EVP_MD_CTX_free(mdctx); - - // 转换为十六进制字符串 - sha256_val.clear(); - for (unsigned int i = 0; i < hash_len; ++i) - { - char hex_str[3]; - sprintf(hex_str, "%02x", hash[i]); - sha256_val += hex_str; - } - - return true; -} - -void setupLogFile() -{ - std::filesystem::path logsFolder = std::filesystem::current_path() / "logs"; - if (!std::filesystem::exists(logsFolder)) - { - std::filesystem::create_directory(logsFolder); - } - auto now = std::chrono::system_clock::now(); - auto now_time_t = std::chrono::system_clock::to_time_t(now); - std::tm *local_time = std::localtime(&now_time_t); - char filename[100]; - std::strftime(filename, sizeof(filename), "%Y%m%d_%H%M%S.log", local_time); - std::filesystem::path logFilePath = logsFolder / filename; - loguru::add_file(logFilePath.string().c_str(), loguru::Append, loguru::Verbosity_MAX); - - loguru::set_fatal_handler([](const loguru::Message &message) - { Lithium::CrashReport::saveCrashLog(std::string(message.prefix) + message.message); }); -} - -int main(int argc, char *argv[]) -{ - std::vector args(argv + 1, argv + argc); - - if (args.size() < 2) - { - LOG_F(INFO, "Error: Missing arguments."); - LOG_F(INFO, "Usage: launcher "); - return 1; - } - - try - { - ServerLauncher launcher(args[0], args[1]); - launcher.run(); - - if (launcher.is_running()) - { - launcher.stop(); - } - } - catch (const std::exception &e) - { - // 输出错误信息并返回 - LOG_F(ERROR, "Error: {}", e.what()); - return 1; - } - - return 0; -} \ No newline at end of file diff --git a/launcher/launcher.glade b/launcher/launcher.glade deleted file mode 100644 index ffd0f7f7..00000000 --- a/launcher/launcher.glade +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - False - True - - - True - False - 介绍页 - - - progress - False - - - - - True - False - 内容页 - - - False - - - - - True - False - 确认页 - - - confirm - False - - - - - False - end - 6 - 6 - 6 - 6 - 6 - 6 - 6 - - - intro - False - - - - - False - Hello ElementAstro Launcher - True - assets\atom.png - - - True - False - 0 - none - - - True - False - 12 - - - - - - - - True - False - __glade_unnamed_14 - - - - - - - False - About - True - help-about - dialog - Hello ElementAstro Launcher - 1.0.0 - https://github.com/ElementAstro - Official Github Repository - Max Qian - Max Qian - Max Qian - Max Qian - assets\atom.png - gpl-3-0 - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - - - - - False - Lithium Script Editor - True - True - edit-find-replace - dialog - lithium - Lithium Script Editor - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - diff --git a/launcher/launcher.glade~ b/launcher/launcher.glade~ deleted file mode 100644 index 9fbbf465..00000000 --- a/launcher/launcher.glade~ +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - False - True - - - True - False - 介绍页 - - - progress - False - - - - - True - False - 内容页 - - - False - - - - - True - False - 确认页 - - - confirm - False - - - - - False - end - 6 - 6 - 6 - 6 - 6 - 6 - 6 - - - intro - False - - - - - False - Hello ElementAstro Launcher - True - assets\atom.png - - - True - True - False - True - - - - - - - - False - About - True - help-about - dialog - Hello ElementAstro Launcher - 1.0.0 - https://github.com/ElementAstro - Official Github Repository - Max Qian - Max Qian - Max Qian - Max Qian - assets\atom.png - gpl-3-0 - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - - - - - False - Lithium Script Editor - True - True - edit-find-replace - dialog - lithium - Lithium Script Editor - - - False - vertical - 2 - - - False - end - - - False - False - 0 - - - - - - diff --git a/launcher/launcher.hpp b/launcher/launcher.hpp deleted file mode 100644 index 18a1989d..00000000 --- a/launcher/launcher.hpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - * launcher.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-3-29 - -Description: Lithium Server Launcher - -**************************************************/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "atom/web/httplib.h" -#include "atom/type/json.hpp" - -using json = nlohmann::json; -namespace fs = std::filesystem; - -/** - * @brief 一个服务器启动器类,用于管理和启动服务器,包括资源下载、依赖检查、配置文件解析等操作。 - */ -class ServerLauncher -{ -public: - /** - * @brief 构造函数,初始化配置文件路径和日志文件路径,但不进行任何初始化操作。 - * @param config_file_path 服务器配置文件路径 - * @param DLOG_File_path 服务器日志文件路径 - */ - ServerLauncher(const std::string &config_file_path, const std::string &DLOG_File_path); - - /** - * @brief 启动服务器并开始监听连接请求。 - * - * 该函数首先检查运行所需的资源是否已下载和依赖项是否已安装,然后加载配置文件, - * 启动服务器进程并开始监听连接请求。启动过程中,服务器输出将定向至日志文件中。 - * - * 如果启动失败,则会发送警告邮件,并打印相关错误并退出程序。 - * - * 在 start_server() 函数内部,会创建一个新的线程来启动服务器进程,并等待子进程结束。 - */ - void run(); - - /** - * @brief 停止服务器进程和启动器。 - * - * 停止服务器进程前会发送停止信号以确保服务器进程优雅地退出。 - */ - void stop(); - - /** - * @brief 检查服务器是否正在运行。 - * @return 如果服务器正在运行,则返回 true,否则返回 false。 - */ - bool is_running() const; - - /** - * @brief 重定向服务器的标准输出和标准错误输出到日志文件中。 - * - * 该函数在服务器启动后应当被调用,以便将服务器输出记录到日志文件中。 - * - * @param DLOG_File_path 日志文件路径。 - */ - void redirect_stdout_stderr(const std::string &DLOG_File_path); - - /** - * @brief 计算指定文件的 SHA-256 哈希值。 - * @param filename 要计算哈希值的文件名。 - * @param sha256_val 输出参数,保存计算出的哈希值。 - * @return 如果文件存在并成功计算出哈希值,则返回 true,否则返回 false。 - */ - bool calculate_sha256(const std::string &filename, std::string &sha256_val); - -private: - /** - * @brief 加载配置文件,并检查其中的参数是否合法。 - * - * 该函数在 ServerLauncher::run() 函数中被调用,用于加载服务器的配置文件, - * 并检查其中的参数是否设置正确。如果参数检查失败,则会打印相关错误信息并退出程序。 - */ - void load_config(); - - /** - * @brief 检查启动器所需的资源是否已下载。 - * - * 该函数在 ServerLauncher::run() 函数中被调用,用于检查启动器所需的资源是否已下载。 - * 如果没有下载,则会提示用户开始下载,或自动下载并安装缺失的资源。 - * - * @return 如果所有必要的资源均已下载,则返回 true,否则返回 false。 - */ - bool check_resources(); - - /** - * @brief 下载启动器所需的资源。 - * - * 该函数在 ServerLauncher::check_resources() 函数中被调用,用于下载启动器所需的资源, - * 包括服务器程序、配置文件、数据文件等。下载完成后,将自动解压和安装这些资源。 - */ - void download_resources(); - - /** - * @brief 检查启动器所需的依赖项是否已安装。 - * - * 该函数在 ServerLauncher::run() 函数中被调用,用于检查启动器所需的依赖项是否已安装。 - * 如果某些依赖项未安装,则会提示用户开始安装,或自动下载并安装这些依赖项。 - * - * @return 如果所有必要的依赖项均已安装,则返回 true,否则返回 false。 - */ - bool check_dependencies(); - - /** - * @brief 检查服务器配置文件是否合法。 - * @param config_file 支持 JSON 或 YAML 格式的配置文件路径。 - * @return 如果配置文件有效,则返回 true,否则返回 false。 - */ - bool check_config_file(const std::string &config_file); - - /** - * @brief 检查已安装的模组是否符合要求。 - * - * 该函数在 ServerLauncher::run() 函数中被调用,用于检查已安装的模组是否符合要求, - * 如果存在不支持或过时的模组,则会提示用户更新或删除这些模组。 - * - * @param modules_dir 模组所在的目录路径。 - * @param module_list 从配置文件中读取的模组列表。 - * @return 如果所有必要的模组均已安装并且都是最新版,则返回 true,否则返回 false。 - */ - bool check_modules(const std::string &modules_dir, const json &module_list); - - /** - * @brief 启动服务器进程并等待其结束。 - * - * 该函数在 ServerLauncher::run() 函数中被调用,用于启动服务器进程并等待其结束。 - * 在启动服务器进程前,将检查服务器程序是否存在以及配置文件是否设置正确。 - * 若服务器程序不存在或配置文件设置错误,则会输出错误信息并退出程序。 - * - * 在函数内部,会创建一个新的线程来启动服务器进程,并等待子进程结束。如果服务器进程 - * 提前结束,则会发送警告邮件给管理员,并打印相关错误信息并退出程序。 - */ - void start_server(); - - /** - * @brief 发送停止信号给服务器进程,并等待其优雅地退出。 - * - * 该函数在 ServerLauncher::stop() 函数中被调用,用于发送停止信号给服务器进程, - * 并等待其在一段时间内优雅地退出。如果服务器未能在规定时间内退出,则会发送 - * kill 信号以强制结束服务器进程。 - */ - void stop_server(); - - /** - * @brief 等待服务器进程结束。 - * - * 该函数在 ServerLauncher::stop_server() 和 ServerLauncher::start_server() - * 函数中都可能被调用,用于等待服务器进程在子线程中结束。 - * - * 通过使用条件变量和互斥锁来控制等待流程,避免了死锁和忙等情况的出现。 - */ - void wait_for_server_to_exit(); - - /** - * @brief 读取服务器输出并将其记录到日志文件中。 - * - * 该函数在 ServerLauncher::start_server() 中被调用,用于读取服务器进程的标准输出 - * 并将其记录到日志文件中。该函数在一个独立的线程中运行,以避免阻塞其他操作。 - */ - void read_server_output(); - - std::string _config_file_path; ///< 配置文件路径 - std::string _DLOG_File_path; ///< 日志文件路径 - json _config; ///< 服务器配置文件 - std::atomic_bool _stop_requested = false; ///< 是否请求停止服务器的标志 - std::atomic_bool _server_running = false; ///< 是否正在运行服务器的标志 - std::jthread _server_thread; ///< 执行服务器进程的线程对象 - std::mutex _server_mutex; ///< 控制等待服务器进程结束的互斥锁 - std::condition_variable _server_cv; ///< 控制等待服务器进程结束的条件变量 - std::shared_ptr _server_process; ///< 指向服务器进程标准输出流的指针 -}; - -/** - * @brief 线程池 - */ -class ThreadPool { -public: - /** - * @brief 构造函数,初始化线程池大小和停止标志位。 - * - * 构造函数会创建 n_threads 个线程,并等待来自任务队列的任务分配。 - * - * @param n_threads 线程池大小 - */ - ThreadPool(std::size_t n_threads) - : stop(false) - { - for (std::size_t i = 0; i < n_threads; ++i) - { - threads.emplace_back([this] - { - for (;;) { - std::function task; - { - std::unique_lock lock(queue_mutex); - condition.wait(lock, [this] { return stop || !tasks.empty(); }); - if (stop && tasks.empty()) { - return; - } - task = std::move(tasks.front()); - tasks.pop(); - } - task(); - } }); - } - } - - /** - * @brief 析构函数,销毁所有线程并退出。 - * - * 析构函数会向任务队列中插入空任务,并等待所有线程完成该任务并退出。 - */ - ~ThreadPool() - { - { - std::unique_lock lock(queue_mutex); - stop = true; - } - condition.notify_all(); - for (std::thread &thread : threads) - { - thread.join(); - } - } - - /** - * @brief 将指定任务添加到任务队列中,并返回该任务的 future 对象。 - * - * 该函数用于将函数 f 和其参数 args 添加到任务队列中等待执行,并返回一 - * 个 std::future 对象,以便查询任务完成情况。当任务队列已满或线程池被 - * 停止时,将会抛出 std::runtime_error 异常。 - * - * @tparam F 函数类型 - * @tparam Args 参数类型 - * @param f 要执行的函数对象 - * @param args 函数参数 - * @return 返回一个 std::future 对象,用于查询任务完成情况 - */ - template - auto enqueue(F &&f, Args &&...args) -> std::future::type> - { - using return_type = typename std::result_of::type; - - auto task = std::make_shared>( - std::bind(std::forward(f), std::forward(args)...)); - - std::future res = task->get_future(); - { - std::unique_lock lock(queue_mutex); - - if (stop) - { - throw std::runtime_error("enqueue on stopped ThreadPool"); - } - - tasks.emplace([task] - { (*task)(); }); - } - condition.notify_one(); - return res; - } - -private: - std::vector threads; ///< 线程池中的线程列表 - std::queue> tasks; ///< 任务队列 - - std::mutex queue_mutex; ///< 任务队列的互斥锁 - std::condition_variable condition; ///< 任务队列的条件变量 - bool stop; ///< 停止标志位 -}; diff --git a/launcher/launcher.json b/launcher/launcher.json deleted file mode 100644 index de0b14a6..00000000 --- a/launcher/launcher.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "server_command": "./server", - "stop_command": "q\n", - "resources": [ - "data.json", - "config.ini" - ], - "resource_server": "http://example.com" - } - \ No newline at end of file diff --git a/locale/lithium.pot b/locale/lithium.pot deleted file mode 100644 index 6876ffa8..00000000 --- a/locale/lithium.pot +++ /dev/null @@ -1,23 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Max Qian -# This file is distributed under the same license as the package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: astro_air@126.com\n" -"POT-Creation-Date: 2024-02-06 17:50+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: E:/msys64/home/Lithium/src/LithiumApp.cpp:551 -#, c++-format -msgid "Dispatched command {} with result: {}" -msgstr "" diff --git a/locale/po/en_US.UTF-8/lithium.po b/locale/po/en_US.UTF-8/lithium.po deleted file mode 100644 index 629b9775..00000000 --- a/locale/po/en_US.UTF-8/lithium.po +++ /dev/null @@ -1,4 +0,0 @@ -#: E:/msys64/home/Lithium/src/LithiumApp.cpp:551 -#, c++-format -msgid "Dispatched command {} with result: {}" -msgstr "" diff --git a/locale/po/es/lithium.po b/locale/po/es/lithium.po deleted file mode 100644 index 94c1bb2c..00000000 --- a/locale/po/es/lithium.po +++ /dev/null @@ -1,46 +0,0 @@ -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:232 -msgid "port the server running on" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:233 -msgid "host the server running on" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:234 -msgid "path to the config file" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:235 -msgid "path to the modules directory" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:236 -msgid "web panel" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:237 -msgid "path to log file" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:239 -msgid "Lithium Command Line Interface:" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:240 -msgid "End." -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:248 -#, c-format -msgid "Failed to parser command line : %s" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:269 -#, c-format -msgid "Command line server port : %d" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:275 -#, c-format -msgid "Set server port to %d" -msgstr "" diff --git a/locale/po/fr_FR/lithium.po b/locale/po/fr_FR/lithium.po deleted file mode 100644 index 94c1bb2c..00000000 --- a/locale/po/fr_FR/lithium.po +++ /dev/null @@ -1,46 +0,0 @@ -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:232 -msgid "port the server running on" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:233 -msgid "host the server running on" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:234 -msgid "path to the config file" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:235 -msgid "path to the modules directory" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:236 -msgid "web panel" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:237 -msgid "path to log file" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:239 -msgid "Lithium Command Line Interface:" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:240 -msgid "End." -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:248 -#, c-format -msgid "Failed to parser command line : %s" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:269 -#, c-format -msgid "Command line server port : %d" -msgstr "" - -#: E:/msys64/home/Qrm/OpenAPT/src/App.cpp:275 -#, c-format -msgid "Set server port to %d" -msgstr "" diff --git a/locale/po/zh-CN.UTF-8/lithium.po b/locale/po/zh-CN.UTF-8/lithium.po deleted file mode 100644 index bdf1643a..00000000 --- a/locale/po/zh-CN.UTF-8/lithium.po +++ /dev/null @@ -1,258 +0,0 @@ -# Language zh-CN translations for Lithium package. -# Copyright (C) 2023 Max Qian -# This file is distributed under the same license as the Lithium package. -# , 2023. -# -msgid "" -msgstr "" -"Project-Id-Version: Lithium \n" -"Report-Msgid-Bugs-To: astro_air@126.com\n" -"POT-Creation-Date: 2023-10-07 12:34+0000\n" -"PO-Revision-Date: 2023-10-07 12:36+0000\n" -"Last-Translator: \n" -"Language-Team: Language zh-CN\n" -"Language: zh-CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ASCII\n" -"Content-Transfer-Encoding: 8bit\n" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:63 -msgid "Failed to destroy ThreadManager: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:82 -msgid "Thread manager has stopped, cannot add new thread" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:100 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:122 -msgid "Unhandled exception in thread: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:128 -msgid "Added thread: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:133 -msgid "Failed to add thread {}: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:149 -msgid "All threads joined" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:153 -msgid "Failed to join all threads: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:163 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:180 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:194 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:205 -msgid "Thread {} not found" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:172 -msgid "Thread {} joined" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:184 -msgid "Failed to join thread {}: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:210 -msgid "Failed to check if thread {} is running: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:75 -msgid "Failed to create PowerShell process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:85 -msgid "Running command: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:98 -#: /workspaces/Lithium/src/modules/system/process.cpp:122 -#: /workspaces/Lithium/src/modules/system/process.cpp:143 -msgid "Failed to create process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:108 -#: /workspaces/Lithium/src/modules/system/process.cpp:153 -msgid "Process created: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:132 -msgid "Running script: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:170 -#: /workspaces/Lithium/src/modules/system/process.cpp:182 -msgid "Process terminated: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:174 -msgid "Failed to terminate process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:190 -#: /workspaces/Lithium/src/modules/system/process.cpp:246 -msgid "Process not found" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:205 -msgid "Process not found by name: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:212 -msgid "Currently running processes:" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:216 -msgid "{} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:261 -msgid "Process completed: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:265 -msgid "Failed to wait for process completion" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:271 -#, c-format -msgid "Process completed: %s (PID: %d)" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:276 -msgid "All processes completed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:287 -msgid "Failed to create process snapshot" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:328 -msgid "Failed to open /proc directory" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:357 -msgid "Failed to get process path" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:378 -msgid "Failed to get process info length" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:385 -msgid "Failed to allocate memory" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:391 -msgid "Failed to get process info" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:94 -msgid "CreateToolhelp32Snapshot failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:113 -msgid "Watching process with PID: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:124 -msgid "Process exited with code: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:133 -msgid "GetExitCodeProcess failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:143 -msgid "OpenProcess failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:170 -msgid "Process exited with status: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:179 -msgid "Process terminated by signal: {}" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:223 -msgid "port the server running on" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:224 -msgid "host the server running on" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:225 -msgid "path to the config file" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:226 -msgid "path to the modules directory" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:227 -msgid "web panel" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:228 -msgid "path to log file" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:230 -msgid "Lithium Command Line Interface:" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:231 -msgid "End." -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:239 -#, c-format -msgid "Failed to parser command line : %s" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:260 -#, c-format -msgid "Command line server port : %d" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:266 -#, c-format -msgid "Set server port to %d" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:67 -msgid "Failed to load Lithium App , error : {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:79 -msgid "Get config value: {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:85 -msgid "Set {} to {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:272 -msgid "Failed to run chai command : {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:290 -msgid "Failed to run chai multi command {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:303 -msgid "Failed to load chaiscript file {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:316 -msgid "Failed to run chai script {}" -msgstr "" diff --git a/locale/po/zh-CN/lithium.po b/locale/po/zh-CN/lithium.po deleted file mode 100644 index c863404b..00000000 --- a/locale/po/zh-CN/lithium.po +++ /dev/null @@ -1,258 +0,0 @@ -# Language zh-CN translations for Lithium package. -# Copyright (C) 2023 Max Qian -# This file is distributed under the same license as the Lithium package. -# , 2023. -# -msgid "" -msgstr "" -"Project-Id-Version: Lithium \n" -"Report-Msgid-Bugs-To: astro_air@126.com\n" -"POT-Creation-Date: 2023-10-07 12:34+0000\n" -"PO-Revision-Date: 2023-10-07 12:37+0000\n" -"Last-Translator: \n" -"Language-Team: Language zh-CN\n" -"Language: zh-CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ASCII\n" -"Content-Transfer-Encoding: 8bit\n" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:63 -msgid "Failed to destroy ThreadManager: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:82 -msgid "Thread manager has stopped, cannot add new thread" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:100 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:122 -msgid "Unhandled exception in thread: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:128 -msgid "Added thread: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:133 -msgid "Failed to add thread {}: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:149 -msgid "All threads joined" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:153 -msgid "Failed to join all threads: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:163 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:180 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:194 -#: /workspaces/Lithium/src/modules/thread/thread.cpp:205 -msgid "Thread {} not found" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:172 -msgid "Thread {} joined" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:184 -msgid "Failed to join thread {}: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/thread/thread.cpp:210 -msgid "Failed to check if thread {} is running: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:75 -msgid "Failed to create PowerShell process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:85 -msgid "Running command: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:98 -#: /workspaces/Lithium/src/modules/system/process.cpp:122 -#: /workspaces/Lithium/src/modules/system/process.cpp:143 -msgid "Failed to create process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:108 -#: /workspaces/Lithium/src/modules/system/process.cpp:153 -msgid "Process created: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:132 -msgid "Running script: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:170 -#: /workspaces/Lithium/src/modules/system/process.cpp:182 -msgid "Process terminated: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:174 -msgid "Failed to terminate process" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:190 -#: /workspaces/Lithium/src/modules/system/process.cpp:246 -msgid "Process not found" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:205 -msgid "Process not found by name: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:212 -msgid "Currently running processes:" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:216 -msgid "{} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:261 -msgid "Process completed: {} (PID: {})" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:265 -msgid "Failed to wait for process completion" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:271 -#, c-format -msgid "Process completed: %s (PID: %d)" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:276 -msgid "All processes completed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:287 -msgid "Failed to create process snapshot" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:328 -msgid "Failed to open /proc directory" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:357 -msgid "Failed to get process path" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:378 -msgid "Failed to get process info length" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:385 -msgid "Failed to allocate memory" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/process.cpp:391 -msgid "Failed to get process info" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:94 -msgid "CreateToolhelp32Snapshot failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:113 -msgid "Watching process with PID: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:124 -msgid "Process exited with code: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:133 -msgid "GetExitCodeProcess failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:143 -msgid "OpenProcess failed." -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:170 -msgid "Process exited with status: {}" -msgstr "" - -#: /workspaces/Lithium/src/modules/system/pid.cpp:179 -msgid "Process terminated by signal: {}" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:223 -msgid "port the server running on" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:224 -msgid "host the server running on" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:225 -msgid "path to the config file" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:226 -msgid "path to the modules directory" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:227 -msgid "web panel" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:228 -msgid "path to log file" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:230 -msgid "Lithium Command Line Interface:" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:231 -msgid "End." -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:239 -#, c-format -msgid "Failed to parser command line : %s" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:260 -#, c-format -msgid "Command line server port : %d" -msgstr "" - -#: /workspaces/Lithium/src/App.cpp:266 -#, c-format -msgid "Set server port to %d" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:67 -msgid "Failed to load Lithium App , error : {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:79 -msgid "Get config value: {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:85 -msgid "Set {} to {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:272 -msgid "Failed to run chai command : {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:290 -msgid "Failed to run chai multi command {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:303 -msgid "Failed to load chaiscript file {}" -msgstr "" - -#: /workspaces/Lithium/src/LithiumApp.cpp:316 -msgid "Failed to run chai script {}" -msgstr "" diff --git a/src/App.cpp b/src/App.cpp index 3e4cc42b..f83df684 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -14,6 +14,8 @@ Description: Main Entry #include "lithiumapp.hpp" +#include "preload.hpp" + #include "atom/log/loguru.hpp" #include "atom/server/global_ptr.hpp" #include "atom/system/crash.hpp" @@ -26,9 +28,7 @@ Description: Main Entry using namespace Lithium::Terminal; #endif -#if ENABLE_WEBPANEL #include "server/App.hpp" -#endif #include #include @@ -180,9 +180,7 @@ int main(int argc, char *argv[]) { LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); } -#if ENABLE_WEBPANEL - runServer(argc, argv); -#endif + runServer(); return 0; } \ No newline at end of file diff --git a/src/atom/algorithm/CMakeLists.txt b/src/atom/algorithm/CMakeLists.txt index 6165958f..ee460e74 100644 --- a/src/atom/algorithm/CMakeLists.txt +++ b/src/atom/algorithm/CMakeLists.txt @@ -18,6 +18,7 @@ set(${PROJECT_NAME}_SOURCES huffman.cpp math.cpp md5.cpp + mhash.cpp ) # Headers @@ -30,6 +31,7 @@ set(${PROJECT_NAME}_HEADERS huffman.hpp math.hpp md5.hpp + mhash.hpp ) # Build Object Library diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index 932b33e1..a8f9a2d5 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -239,6 +239,29 @@ inline std::uint32_t jenkins_one_at_a_time_hash(const std::string& s) noexcept { return jenkins_one_at_a_time_hash(std::string_view{s}); } +inline uint32_t quickHash(const char* str) { + if (!str) + return 0; + + unsigned int h = 0; + for (; *str; str++) { + h = 31 * h + *str; + } + return h; +} + +inline uint32_t quickHash(const void* tmp, uint32_t size) { + if (!tmp) + return 0; + + const char* str = (const char*)tmp; + unsigned int h = 0; + for (uint32_t i = 0; i < size; ++i, ++str) { + h = 31 * h + *str; + } + return h; +} + } // namespace Atom::Algorithm #endif diff --git a/src/atom/utils/hash_util.cpp b/src/atom/algorithm/mhash.cpp similarity index 61% rename from src/atom/utils/hash_util.cpp rename to src/atom/algorithm/mhash.cpp index a1779714..4315b969 100644 --- a/src/atom/utils/hash_util.cpp +++ b/src/atom/algorithm/mhash.cpp @@ -1,5 +1,5 @@ /* - * hash_util.cpp + * mhash.cpp * * Copyright (C) 2023-2024 Max Qian */ @@ -12,7 +12,7 @@ Description: Implementation of murmur3 hash and quick hash **************************************************/ -#include "hash_util.hpp" +#include "mhash.hpp" #include #include @@ -91,29 +91,6 @@ uint32_t murmur3Hash(const void *data, const uint32_t &size, return fmix32(h ^ len); } -uint32_t quickHash(const char *str) { - if (!str) - return 0; - - unsigned int h = 0; - for (; *str; str++) { - h = 31 * h + *str; - } - return h; -} - -uint32_t quickHash(const void *tmp, uint32_t size) { - if (!tmp) - return 0; - - const char *str = (const char *)tmp; - unsigned int h = 0; - for (uint32_t i = 0; i < size; ++i, ++str) { - h = 31 * h + *str; - } - return h; -} - uint64_t murmur3Hash64(const void *str, const uint32_t &size, const uint32_t &seed = 1060627423, const uint32_t &seed2 = 1050126127) { @@ -126,71 +103,7 @@ uint64_t murmur3Hash64(const char *str, const uint32_t &seed = 1060627423, return (((uint64_t)murmur3Hash(str, seed)) << 32 | murmur3Hash(str, seed2)); } -std::string base64decode(const std::string &src) { - std::string result; - result.resize(src.size() * 3 / 4); - char *writeBuf = &result[0]; - - const char *ptr = src.c_str(); - const char *end = ptr + src.size(); - - while (ptr < end) { - int i = 0; - int padding = 0; - int packed = 0; - for (; i < 4 && ptr < end; ++i, ++ptr) { - if (*ptr == '=') { - ++padding; - packed <<= 6; - continue; - } - - // padding with "=" only - if (padding > 0) { - return ""; - } - - int val = 0; - if (*ptr >= 'A' && *ptr <= 'Z') { - val = *ptr - 'A'; - } else if (*ptr >= 'a' && *ptr <= 'z') { - val = *ptr - 'a' + 26; - } else if (*ptr >= '0' && *ptr <= '9') { - val = *ptr - '0' + 52; - } else if (*ptr == '+') { - val = 62; - } else if (*ptr == '/') { - val = 63; - } else { - return ""; // invalid character - } - - packed = (packed << 6) | val; - } - if (i != 4) { - return ""; - } - if (padding > 0 && ptr != end) { - return ""; - } - if (padding > 2) { - return ""; - } - - *writeBuf++ = (char)((packed >> 16) & 0xff); - if (padding != 2) { - *writeBuf++ = (char)((packed >> 8) & 0xff); - } - if (padding == 0) { - *writeBuf++ = (char)(packed & 0xff); - } - } - - result.resize(writeBuf - result.c_str()); - return result; -} - -void hexstring_from_data(const void *data, size_t len, char *output) { +void hexstringFromData(const void *data, size_t len, char *output) { const unsigned char *buf = (const unsigned char *)data; size_t i, j; for (i = j = 0; i < len; ++i) { @@ -204,25 +117,25 @@ void hexstring_from_data(const void *data, size_t len, char *output) { } } -std::string hexstring_from_data(const char *data, size_t len) { +std::string hexstringFromData(const char *data, size_t len) { if (len == 0) { return std::string(); } std::string result; result.resize(len * 2); - hexstring_from_data(data, len, &result[0]); + hexstringFromData(data, len, &result[0]); return result; } -std::string hexstring_from_data(const std::string &data) { - return hexstring_from_data(data.c_str(), data.size()); +std::string hexstringFromData(const std::string &data) { + return hexstringFromData(data.c_str(), data.size()); } -void data_from_hexstring(const char *hexstring, size_t length, void *output) { +void dataFromHexstring(const char *hexstring, size_t length, void *output) { unsigned char *buf = (unsigned char *)output; unsigned char byte; if (length % 2 != 0) { - throw std::invalid_argument("data_from_hexstring length % 2 != 0"); + throw std::invalid_argument("dataFromHexstring length % 2 != 0"); } for (size_t i = 0; i < length; ++i) { switch (hexstring[i]) { @@ -256,7 +169,7 @@ void data_from_hexstring(const char *hexstring, size_t length, void *output) { break; default: throw std::invalid_argument( - "data_from_hexstring invalid hexstring"); + "dataFromHexstring invalid hexstring"); } ++i; switch (hexstring[i]) { @@ -290,27 +203,27 @@ void data_from_hexstring(const char *hexstring, size_t length, void *output) { break; default: throw std::invalid_argument( - "data_from_hexstring invalid hexstring"); + "dataFromHexstring invalid hexstring"); } *buf++ = byte; } } -std::string data_from_hexstring(const char *hexstring, size_t length) { +std::string dataFromHexstring(const char *hexstring, size_t length) { if (length % 2 != 0) { - throw std::invalid_argument("data_from_hexstring length % 2 != 0"); + throw std::invalid_argument("dataFromHexstring length % 2 != 0"); } if (length == 0) { return std::string(); } std::string result; result.resize(length / 2); - data_from_hexstring(hexstring, length, &result[0]); + dataFromHexstring(hexstring, length, &result[0]); return result; } -std::string data_from_hexstring(const std::string &hexstring) { - return data_from_hexstring(hexstring.c_str(), hexstring.size()); +std::string dataFromHexstring(const std::string &hexstring) { + return dataFromHexstring(hexstring.c_str(), hexstring.size()); } } // namespace Atom::Utils diff --git a/src/atom/utils/hash_util.hpp b/src/atom/algorithm/mhash.hpp similarity index 80% rename from src/atom/utils/hash_util.hpp rename to src/atom/algorithm/mhash.hpp index 0954d213..39f38312 100644 --- a/src/atom/utils/hash_util.hpp +++ b/src/atom/algorithm/mhash.hpp @@ -66,23 +66,6 @@ namespace Atom::Utils { const uint32_t &seed, const uint32_t &seed2); -/** - * @brief Calculates the quick hash value for a given string. - * - * @param str The input string. - * @return uint32_t The calculated hash value. - */ -[[nodiscard]] uint32_t quickHash(const char *str); - -/** - * @brief Calculates the quick hash value for a given data buffer. - * - * @param str The input data buffer. - * @param size The size of the data buffer. - * @return uint32_t The calculated hash value. - */ -[[nodiscard]] uint32_t quickHash(const void *str, uint32_t size); - /** * @brief Converts binary data to a hexadecimal string representation. * @@ -91,7 +74,7 @@ namespace Atom::Utils { * @param output The output buffer to store the hexadecimal string (length must * be len * 2). */ -void hexstring_from_data(const void *data, size_t len, char *output); +void hexstringFromData(const void *data, size_t len, char *output); /** * @brief Converts binary data to a hexadecimal string representation. @@ -100,7 +83,7 @@ void hexstring_from_data(const void *data, size_t len, char *output); * @param len The length of the data buffer. * @return std::string The hexadecimal string representation. */ -[[nodiscard]] std::string hexstring_from_data(const void *data, size_t len); +[[nodiscard]] std::string hexstringFromData(const void *data, size_t len); /** * @brief Converts a string to a hexadecimal string representation. @@ -108,7 +91,7 @@ void hexstring_from_data(const void *data, size_t len, char *output); * @param data The input string. * @return std::string The hexadecimal string representation. */ -[[nodiscard]] std::string hexstring_from_data(const std::string &data); +[[nodiscard]] std::string hexstringFromData(const std::string &data); /** * @brief Converts a hexadecimal string representation to binary data. @@ -118,7 +101,7 @@ void hexstring_from_data(const void *data, size_t len, char *output); * @param output The output buffer to store the binary data (length must be * length / 2). */ -void data_from_hexstring(const char *hexstring, size_t length, void *output); +void dataFromHexstring(const char *hexstring, size_t length, void *output); /** * @brief Converts a hexadecimal string representation to binary data. @@ -129,7 +112,7 @@ void data_from_hexstring(const char *hexstring, size_t length, void *output); * @throw std::invalid_argument If the input hexstring is not a valid * hexadecimal string. */ -[[nodiscard]] std::string data_from_hexstring(const char *hexstring, +[[nodiscard]] std::string dataFromHexstring(const char *hexstring, size_t length); /** @@ -140,7 +123,7 @@ void data_from_hexstring(const char *hexstring, size_t length, void *output); * @throw std::invalid_argument If the input hexstring is not a valid * hexadecimal string. */ -[[nodiscard]] std::string data_from_hexstring(const std::string &data); +[[nodiscard]] std::string dataFromHexstring(const std::string &data); } // namespace Atom::Utils #endif \ No newline at end of file diff --git a/src/atom/async/pool.hpp b/src/atom/async/pool.hpp new file mode 100644 index 00000000..9c04dcb0 --- /dev/null +++ b/src/atom/async/pool.hpp @@ -0,0 +1,122 @@ +/* + * pool.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-13 + +Description: A very simple thread pool for preload + +**************************************************/ + +#ifndef ATOM_ASYNC_POOL_HPP +#define ATOM_ASYNC_POOL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Atom::Async { +/** + * @brief 线程池 + */ +class ThreadPool { +public: + /** + * @brief 构造函数,初始化线程池大小和停止标志位。 + * + * 构造函数会创建 n_threads 个线程,并等待来自任务队列的任务分配。 + * + * @param n_threads 线程池大小 + */ + ThreadPool(std::size_t n_threads) : stop(false) { + for (std::size_t i = 0; i < n_threads; ++i) { + threads.emplace_back([this] { + for (;;) { + std::function task; + { + std::unique_lock lock(queue_mutex); + condition.wait( + lock, [this] { return stop || !tasks.empty(); }); + if (stop && tasks.empty()) { + return; + } + task = std::move(tasks.front()); + tasks.pop(); + } + task(); + } + }); + } + } + + /** + * @brief 析构函数,销毁所有线程并退出。 + * + * 析构函数会向任务队列中插入空任务,并等待所有线程完成该任务并退出。 + */ + ~ThreadPool() { + { + std::unique_lock lock(queue_mutex); + stop = true; + } + condition.notify_all(); + for (std::thread &thread : threads) { + thread.join(); + } + } + + /** + * @brief 将指定任务添加到任务队列中,并返回该任务的 future 对象。 + * + * 该函数用于将函数 f 和其参数 args 添加到任务队列中等待执行,并返回一 + * 个 std::future 对象,以便查询任务完成情况。当任务队列已满或线程池被 + * 停止时,将会抛出 std::runtime_error 异常。 + * + * @tparam F 函数类型 + * @tparam Args 参数类型 + * @param f 要执行的函数对象 + * @param args 函数参数 + * @return 返回一个 std::future 对象,用于查询任务完成情况 + */ + template + auto enqueue(F &&f, Args &&...args) + -> std::future::type> { + using return_type = typename std::result_of::type; + + auto task = std::make_shared>( + std::bind(std::forward(f), std::forward(args)...)); + + std::future res = task->get_future(); + { + std::unique_lock lock(queue_mutex); + + if (stop) { + throw std::runtime_error("enqueue on stopped ThreadPool"); + } + + tasks.emplace([task] { (*task)(); }); + } + condition.notify_one(); + return res; + } + +private: + std::vector threads; ///< 线程池中的线程列表 + std::queue> tasks; ///< 任务队列 + + std::mutex queue_mutex; ///< 任务队列的互斥锁 + std::condition_variable condition; ///< 任务队列的条件变量 + bool stop; ///< 停止标志位 +}; +} // namespace Atom::Async + +#endif \ No newline at end of file diff --git a/src/atom/utils/CMakeLists.txt b/src/atom/utils/CMakeLists.txt index 0b76c16b..969743e0 100644 --- a/src/atom/utils/CMakeLists.txt +++ b/src/atom/utils/CMakeLists.txt @@ -13,7 +13,6 @@ project(atom-utils C CXX) set(${PROJECT_NAME}_SOURCES aes.cpp env.cpp - hash_util.cpp random.cpp string.cpp stopwatcher.cpp @@ -26,7 +25,6 @@ set(${PROJECT_NAME}_SOURCES set(${PROJECT_NAME}_HEADERS aes.hpp env.hpp - hash_util.hpp random.hpp refl.hpp string.hpp diff --git a/src/atom/utils/aes.cpp b/src/atom/utils/aes.cpp index b9a3c838..274adea6 100644 --- a/src/atom/utils/aes.cpp +++ b/src/atom/utils/aes.cpp @@ -14,29 +14,33 @@ Description: Simple implementation of AES encryption #include "aes.hpp" +#include +#include +#include + #include #include #include -#include -#include + +#include "atom/io/io.hpp" +#include "atom/log/loguru.hpp" const int AES_BLOCK_SIZE = 16; namespace Atom::Utils { -std::string encryptAES(const std::string &plaintext, const std::string &key) { +std::string encryptAES(std::string_view plaintext, std::string_view key) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), nullptr, - reinterpret_cast(key.c_str()), + reinterpret_cast(key.data()), nullptr); int c_len = plaintext.length() + AES_BLOCK_SIZE; unsigned char *ciphertext = new unsigned char[c_len]; int len; - EVP_EncryptUpdate( - ctx, ciphertext, &len, - reinterpret_cast(plaintext.c_str()), - plaintext.length()); + EVP_EncryptUpdate(ctx, ciphertext, &len, + reinterpret_cast(plaintext.data()), + plaintext.length()); int ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); @@ -50,10 +54,10 @@ std::string encryptAES(const std::string &plaintext, const std::string &key) { return result; } -std::string decryptAES(const std::string &ciphertext, const std::string &key) { +std::string decryptAES(std::string_view ciphertext, std::string_view key) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), nullptr, - reinterpret_cast(key.c_str()), + reinterpret_cast(key.data()), nullptr); int p_len = ciphertext.length() + AES_BLOCK_SIZE; @@ -62,7 +66,7 @@ std::string decryptAES(const std::string &ciphertext, const std::string &key) { int len; EVP_DecryptUpdate( ctx, plaintext, &len, - reinterpret_cast(ciphertext.c_str()), + reinterpret_cast(ciphertext.data()), ciphertext.length()); int plaintext_len = len; @@ -77,7 +81,7 @@ std::string decryptAES(const std::string &ciphertext, const std::string &key) { return result; } -std::string compress(const std::string &data) { +std::string compress(std::string_view data) { z_stream zs; memset(&zs, 0, sizeof(zs)); @@ -107,7 +111,7 @@ std::string compress(const std::string &data) { return compressed; } -std::string decompress(const std::string &data) { +std::string decompress(std::string_view data) { z_stream zs; memset(&zs, 0, sizeof(zs)); @@ -136,4 +140,42 @@ std::string decompress(const std::string &data) { return decompressed; } + +std::string calculateSha256(std::string_view filename) { + if (!Atom::IO::isFileExists(std::string(filename))) { + LOG_F(ERROR, "File not exist: {}", filename); + return ""; + } + std::ifstream file(filename.data(), std::ios::binary); + if (!file || !file.good()) { + return ""; + } + + EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); + EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL); + + char buffer[1024]; + while (file.read(buffer, sizeof(buffer))) { + EVP_DigestUpdate(mdctx, buffer, sizeof(buffer)); + } + + if (file.gcount() > 0) { + EVP_DigestUpdate(mdctx, buffer, file.gcount()); + } + + unsigned char hash[EVP_MAX_MD_SIZE]; + unsigned int hash_len = 0; + EVP_DigestFinal_ex(mdctx, hash, &hash_len); + EVP_MD_CTX_free(mdctx); + + // 转换为十六进制字符串 + std::string sha256_val; + for (unsigned int i = 0; i < hash_len; ++i) { + char hex_str[3]; + sprintf(hex_str, "%02x", hash[i]); + sha256_val += hex_str; + } + + return sha256_val; +} } // namespace Atom::Utils diff --git a/src/atom/utils/aes.hpp b/src/atom/utils/aes.hpp index 20063973..4489f632 100644 --- a/src/atom/utils/aes.hpp +++ b/src/atom/utils/aes.hpp @@ -25,8 +25,8 @@ namespace Atom::Utils { * @param key 加密密钥 * @return 加密后的密文数据 */ -[[maybe_unused]] [[nodiscard]] std::string encryptAES( - const std::string &plaintext, const std::string &key); +[[nodiscard]] std::string encryptAES( + std::string_view plaintext, std::string_view key); /** * @brief 使用AES算法对输入的密文进行解密。 @@ -35,8 +35,8 @@ namespace Atom::Utils { * @param key 解密密钥 * @return 解密后的明文数据 */ -[[maybe_unused]] [[nodiscard]] std::string decryptAES( - const std::string &ciphertext, const std::string &key); +[[nodiscard]] std::string decryptAES( + std::string_view ciphertext, std::string_view key); /** * @brief 使用Zlib库对输入的数据进行压缩。 @@ -44,7 +44,7 @@ namespace Atom::Utils { * @param data 待压缩的数据 * @return 压缩后的数据 */ -[[maybe_unused]] [[nodiscard]] std::string compress(const std::string &data); +[[nodiscard]] std::string compress(std::string_view data); /** * @brief 使用Zlib库对输入的数据进行解压。 @@ -52,7 +52,9 @@ namespace Atom::Utils { * @param data 待解压的数据 * @return 解压后的数据 */ -[[maybe_unused]] [[nodiscard]] std::string decompress(const std::string &data); +[[nodiscard]] std::string decompress(std::string_view data); + +[[nodiscard]]std::string calculateSha256(std::string_view filename); } // namespace Atom::Utils #endif diff --git a/src/atom/utils/switch.hpp b/src/atom/utils/switch.hpp index 25edae2b..f3e9ae43 100644 --- a/src/atom/utils/switch.hpp +++ b/src/atom/utils/switch.hpp @@ -43,6 +43,8 @@ class StringSwitch : public NonCopyable { using Func = std::function; using DefaultFunc = std::optional; + StringSwitch() = default; + // Register a case with the given string and function void registerCase(const std::string &str, Func func) { if (cases_.find(str) != cases_.end()) { diff --git a/src/preload.cpp b/src/preload.cpp new file mode 100644 index 00000000..52150710 --- /dev/null +++ b/src/preload.cpp @@ -0,0 +1,89 @@ +#include "preload.hpp" + +#include + +#include "atom/async/pool.hpp" +#include "atom/io/io.hpp" +#include "atom/log/loguru.hpp" +#include "atom/utils/aes.hpp" +#include "atom/utils/string.hpp" +#include "atom/web/httpclient.hpp" + +#include "utils/resource.hpp" + +bool checkResources() { + for (auto &[key, value] : resource::LITHIUM_RESOURCES) { + if (!Atom::IO::isFileExists(key.data())) { + LOG_F(ERROR, "Resource file '{}' is missing.", key); + return false; + } + auto sha256_val = Atom::Utils::calculateSha256(key); + if (!sha256_val.empty()) { + LOG_F(ERROR, "Failed to calculate SHA256 value of '{}'.", key); + value.second = true; + continue; + } + auto expected_sha256 = value.first; + if (sha256_val != expected_sha256) { + LOG_F(ERROR, "SHA256 check failed for '{}'", key); + return false; + } + value.second = true; + } + + DLOG_F(INFO, "All resource files are found."); + return true; +} + +void downloadResources() { + DLOG_F(INFO, "Downloading missing resources..."); + + // 创建线程池 + Atom::Async::ThreadPool pool(std::thread::hardware_concurrency()); + + // 创建任务列表 + std::vector> tasks; + + for (auto &[key, value] : resource::LITHIUM_RESOURCES) { + // 发送 HTTP GET 请求下载文件 + const auto url = Atom::Utils::joinStrings( + {resource::LITHIUM_RESOURCE_SERVER, key}, "/"); + + // 添加下载任务到线程池 + tasks.emplace_back(pool.enqueue([url] { + try { + auto client = Atom::Web::HttpClient( + resource::LITHIUM_RESOURCE_SERVER, 443, true); + json res_body; + std::string err; + auto res = client.sendGetRequest(url, {}, res_body, err); + + if (!res) { + LOG_F(ERROR, "Failed to download resource: {}", url); + return false; + } + + // 将下载的数据写入文件 + std::ofstream outfile( + std::string(Atom::Utils::splitString(url, '/').back())); + outfile.write(res_body.dump().c_str(), res_body.dump().size()); + + DLOG_F(INFO, "Resource file '{}' downloaded.", url); + return true; + } catch (const std::exception &e) { + LOG_F(ERROR, "Error occurred when downloading resource '{}: {}", + url, e.what()); + return false; + } + })); + } + for (auto &&task : tasks) { + task.wait(); + } + for (auto &&task : tasks) { + if (!task.get()) { + LOG_F(ERROR, "Failed to download some resources."); + } + } + DLOG_F(INFO, "Downloading finished."); +} \ No newline at end of file diff --git a/src/preload.hpp b/src/preload.hpp new file mode 100644 index 00000000..b734dd58 --- /dev/null +++ b/src/preload.hpp @@ -0,0 +1,7 @@ +#ifndef LITHIUM_PRELOAD_HPP +#define LITHIUM_PRELOAD_HPP + +bool checkResources(); +void downloadResources(); + +#endif diff --git a/src/server/App.cpp b/src/server/App.cpp index a32c4923..571e6d80 100644 --- a/src/server/App.cpp +++ b/src/server/App.cpp @@ -22,9 +22,9 @@ Description: Main #include -void run(const oatpp::base::CommandLineArguments& args) { +void run() { /* Register Components in scope of run() method */ - AppComponent components(args); + AppComponent components; Runner runner(OATPP_GET_COMPONENT(oatpp::Object), OATPP_GET_COMPONENT(std::shared_ptr)); @@ -34,10 +34,10 @@ void run(const oatpp::base::CommandLineArguments& args) { runner.join(); } -int runServer(int argc, const char* argv[]) { +int runServer() { oatpp::base::Environment::init(); - run(oatpp::base::CommandLineArguments(argc, argv)); + run(); oatpp::base::Environment::destroy(); diff --git a/src/server/App.hpp b/src/server/App.hpp index 69fee2f3..a2231778 100644 --- a/src/server/App.hpp +++ b/src/server/App.hpp @@ -1,6 +1,6 @@ #ifndef LITHIUM_SERVER_APP_HPP #define LITHIUM_SERVER_APP_HPP -int runServer(int argc, const char* argv[]); +int runServer(); #endif diff --git a/src/server/AppComponent.hpp b/src/server/AppComponent.hpp index b43228f9..39d5c4ab 100644 --- a/src/server/AppComponent.hpp +++ b/src/server/AppComponent.hpp @@ -15,8 +15,6 @@ Description: App Components #ifndef LITHIUM_APP_COMPONENT_HPP #define LITHIUM_APP_COMPONENT_HPP -#include "config.h" - #include "config/Config.hpp" #include "config/HubsConfig.hpp" @@ -28,7 +26,6 @@ Description: App Components #include "ErrorHandler.hpp" -#include "oatpp/core/base/CommandLineArguments.hpp" #include "oatpp/core/macro/component.hpp" #include "oatpp/core/utils/ConversionUtils.hpp" #include "oatpp/network/monitor/ConnectionInactivityChecker.hpp" @@ -63,42 +60,45 @@ Description: App Components #include /** - * Class which creates and holds Application components and registers components in oatpp::base::Environment - * Order of components initialization is from top to bottom + * Class which creates and holds Application components and registers + * components in oatpp::base::Environment Order of components initialization is + * from top to bottom */ class AppComponent { -private: - oatpp::base::CommandLineArguments m_cmdArgs; public: - AppComponent(const oatpp::base::CommandLineArguments& cmdArgs) - : m_cmdArgs(cmdArgs) - {} + AppComponent() = default; + public: + /** + * Swagger component + */ + SwaggerComponent swaggerComponent; - /** - * Create config component - */ - OATPP_CREATE_COMPONENT(oatpp::Object, appConfig)([this] { - auto config = ConfigDto::createShared(); + /** + * Create config component + */ + OATPP_CREATE_COMPONENT(oatpp::Object, appConfig) + ([this] { + auto config = ConfigDto::createShared(); - auto hostServer = ServerConfigDto::createShared(); - hostServer->host = "0.0.0.0"; - hostServer->port = 8000; + auto hostServer = ServerConfigDto::createShared(); + hostServer->host = "0.0.0.0"; + hostServer->port = 8000; - auto clientServer = ServerConfigDto::createShared(); - clientServer->host = "0.0.0.0"; - clientServer->port = 8001; + auto clientServer = ServerConfigDto::createShared(); + clientServer->host = "0.0.0.0"; + clientServer->port = 8001; - config->hostAPIServer = hostServer; - config->clientAPIServer = clientServer; + config->hostAPIServer = hostServer; + config->clientAPIServer = clientServer; - return config; - }()); + return config; + }()); - /** - * Hub configs - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, hubConfig) + /** + * Hub configs + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, hubConfig) ([] { // We specify the default config here auto config = std::make_shared(nullptr); @@ -112,56 +112,95 @@ class AppComponent { return config; }()); - /** - * Create Async Executor - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, executor)([] { - return std::make_shared(); - }()); - - /** - * Create Router component - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, httpRouter)([] { - return oatpp::web::server::HttpRouter::createShared(); - }()); - - /** - * Create ObjectMapper component to serialize/deserialize DTOs in Contoller's API - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, apiObjectMapper)(Constants::COMPONENT_REST_API,[] { - auto mapper = oatpp::parser::json::mapping::ObjectMapper::createShared(); - mapper->getSerializer()->getConfig()->includeNullFields = false; - return mapper; - }()); - - /** - * Create ObjectMapper component to serialize/deserialize DTOs in WS communication - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, wsApiObjectMapper)(Constants::COMPONENT_WS_API,[] { - auto mapper = oatpp::parser::json::mapping::ObjectMapper::createShared(); - mapper->getSerializer()->getConfig()->includeNullFields = false; - return mapper; - }()); - - /** - * Create games sessions Registry component. - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, gamesSessionsRegistry)([] { - return std::make_shared(); - }()); - - /** - * Create websocket connection handler - */ - OATPP_CREATE_COMPONENT(std::shared_ptr, websocketConnectionHandler)(Constants::COMPONENT_WS_API, [] { - OATPP_COMPONENT(std::shared_ptr, executor); - OATPP_COMPONENT(std::shared_ptr, registry); - auto connectionHandler = oatpp::websocket::AsyncConnectionHandler::createShared(executor); - connectionHandler->setSocketInstanceListener(registry); - return connectionHandler; - }()); + /** + * Create Async Executor + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, executor) + ([] { return std::make_shared(); }()); + + /** + * Create Router component + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, + httpRouter) + ([] { return oatpp::web::server::HttpRouter::createShared(); }()); + + /** + * Create ObjectMapper component to serialize/deserialize DTOs in + * Contoller's API + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, + apiObjectMapper) + (Constants::COMPONENT_REST_API, [] { + /* create serializer and deserializer configurations */ + auto serializeConfig = + oatpp::parser::json::mapping::Serializer::Config::createShared(); + auto deserializeConfig = + oatpp::parser::json::mapping::Deserializer::Config::createShared(); + + /* enable beautifier */ + serializeConfig->useBeautifier = true; + + auto objectMapper = + oatpp::parser::json::mapping::ObjectMapper::createShared( + serializeConfig, deserializeConfig); + objectMapper->getDeserializer()->getConfig()->allowUnknownFields = + false; + + // objectMapper->getSerializer()->getConfig()->enabledInterpretations = + // { + // "system::memory"}; + // objectMapper->getDeserializer()->getConfig()->enabledInterpretations + // = { + // "system::memory"}; + return objectMapper; + }()); + + /** + * Create ObjectMapper component to serialize/deserialize DTOs in WS + * communication + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, + wsApiObjectMapper) + (Constants::COMPONENT_WS_API, [] { + auto mapper = + oatpp::parser::json::mapping::ObjectMapper::createShared(); + mapper->getSerializer()->getConfig()->includeNullFields = false; + return mapper; + }()); + /** + * Create games sessions Registry component. + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, gamesSessionsRegistry) + ([] { return std::make_shared(); }()); + + + + /** + * Create websocket connection handler + */ + OATPP_CREATE_COMPONENT(std::shared_ptr, + websocketConnectionHandler) + (Constants::COMPONENT_WS_API, [] { + OATPP_COMPONENT(std::shared_ptr, executor); + OATPP_COMPONENT(std::shared_ptr, registry); + auto connectionHandler = + oatpp::websocket::AsyncConnectionHandler::createShared(executor); + connectionHandler->setSocketInstanceListener(registry); + return connectionHandler; + }()); + + /** + * Create Debug virtual interface component + */ +#if ENABLE_DEBUG + OATPP_CREATE_COMPONENT(std::shared_ptr, + virtualInterface) + ([] { + return oatpp::network::virtual_::Interface::obtainShared("virtualhost"); + }()); +#endif }; #endif /* LITHIUM_APP_COMPONENT_HPP */ \ No newline at end of file diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index e69de29b..6f8ccca9 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -0,0 +1,38 @@ +# CMakeLists.txt for Lithium +# This project is licensed under the terms of the GPL3 license. +# +# Project Name: Lithium-WebServer +# Description: Oatpp http and websocket for Lithium +# Author: Max Qian +# License: GPL3 + +cmake_minimum_required(VERSION 3.20) + +project(lithium_webserver C CXX) + +set(server_websocket_module + websocket/Hub.cpp + websocket/Connection.cpp + websocket/Registry.cpp + websocket/Session.cpp +) + +set(server_module + App.cpp + AppComponent.hpp + ErrorHandler.cpp + Runner.cpp + + config/HubsConfig.cpp +) + +################################################################################# +# Main + +add_library(${PROJECT_NAME} STATIC ${server_websocket_module} ${server_module}) +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_BINARY_DIR}/libs) + +target_link_libraries(${PROJECT_NAME} PRIVATE oatpp-websocket oatpp-swagger oatpp-openssl oatpp-zlib oatpp) +target_link_libraries(${PROJECT_NAME} PRIVATE loguru fmt::fmt) +target_link_libraries(${PROJECT_NAME} PRIVATE atomstatic) + diff --git a/src/server/Runner.cpp b/src/server/Runner.cpp index 2d4846b3..365721c0 100644 --- a/src/server/Runner.cpp +++ b/src/server/Runner.cpp @@ -14,15 +14,34 @@ Description: Lithium Server Runner #include "Runner.hpp" +#include "ErrorHandler.hpp" + #include "controller/AsyncClientController.hpp" +#include "controller/AsyncConfigController.hpp" +/* +#include "controller/AsyncDeviceController.hpp" +#include "controller/AsyncIOController.hpp" +#include "controller/AsyncStaticController.hpp" +#include "controller/AsyncSystemController.hpp" +*/ + +#include "oatpp-swagger/AsyncController.hpp" #include "oatpp-openssl/server/ConnectionProvider.hpp" #include "oatpp/network/tcp/server/ConnectionProvider.hpp" +#include "oatpp/web/protocol/http/incoming/SimpleBodyDecoder.hpp" #include "oatpp/web/server/AsyncHttpConnectionHandler.hpp" #include "oatpp/network/Server.hpp" +#include "oatpp-zlib/EncoderProvider.hpp" + +#define ADD_CONTROLLER(controller, router) \ + auto controller##_ptr = controller::createShared(); \ + docEndpoints.append(controller##_ptr->getEndpoints()); \ + router->getRouter()->addController(controller##_ptr); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // APIServer @@ -49,9 +68,35 @@ APIServer::APIServer(const oatpp::Object& config, {config->host, config->port, oatpp::network::Address::IP_4}); } + auto components = + std::make_shared( + m_router); + /* Add content encoders */ + auto encoders = std::make_shared< + oatpp::web::protocol::http::encoding::ProviderCollection>(); + encoders->add(std::make_shared()); + encoders->add(std::make_shared()); + /* Set content encoders */ + components->contentEncodingProviders = encoders; + + auto decoders = std::make_shared< + oatpp::web::protocol::http::encoding::ProviderCollection>(); + decoders->add(std::make_shared()); + decoders->add(std::make_shared()); + /* Set Body Decoder */ + components->bodyDecoder = std::make_shared< + oatpp::web::protocol::http::incoming::SimpleBodyDecoder>(decoders); + m_connectionHandler = - oatpp::web::server::AsyncHttpConnectionHandler::createShared(m_router, + oatpp::web::server::AsyncHttpConnectionHandler::createShared(components, executor); + OATPP_COMPONENT( + std::shared_ptr, + + apiObjectMapper, + Constants::COMPONENT_REST_API); // get ObjectMapper component + m_connectionHandler->setErrorHandler( + std::make_shared(apiObjectMapper)); } std::shared_ptr APIServer::getRouter() { @@ -59,7 +104,7 @@ std::shared_ptr APIServer::getRouter() { } void APIServer::start() { - m_serverThread = std::thread([this] { + m_serverThread = std::jthread([this] { oatpp::network::Server server(m_connectionProvider, m_connectionHandler); server.run(); @@ -78,7 +123,20 @@ Runner::Runner(const oatpp::Object& config, auto hostServer = std::make_shared(config->hostAPIServer, executor); - hostServer->getRouter()->addController(std::make_shared()); + + oatpp::web::server::api::Endpoints docEndpoints; + ADD_CONTROLLER(ClientController, hostServer); + ADD_CONTROLLER(ConfigController, hostServer); + /* + ADD_CONTROLLER(DeviceController, hostServer); + ADD_CONTROLLER(IOController, hostServer); + ADD_CONTROLLER(StaticController, hostServer); + ADD_CONTROLLER(SystemController, hostServer); + */ + + hostServer->getRouter()->addController( + oatpp::swagger::AsyncController::createShared(docEndpoints)); + m_servers.push_back(hostServer); /* client API server */ @@ -86,16 +144,14 @@ Runner::Runner(const oatpp::Object& config, if (config->clientAPIServer->host == config->hostAPIServer->host && config->clientAPIServer->port == config->hostAPIServer->port) { - hostServer->getRouter()->addController( - std::make_shared()); + ADD_CONTROLLER(ClientController, hostServer); } else { assertServerConfig(config->clientAPIServer, "clientAPIServer", true); auto clientServer = std::make_shared(config->clientAPIServer, executor); - clientServer->getRouter()->addController( - std::make_shared()); + ADD_CONTROLLER(ClientController, clientServer); m_servers.push_back(clientServer); } } diff --git a/src/server/Runner.hpp b/src/server/Runner.hpp index aebb2975..de791a5b 100644 --- a/src/server/Runner.hpp +++ b/src/server/Runner.hpp @@ -22,6 +22,9 @@ Description: Lithium Server Runner #include "oatpp/network/ConnectionHandler.hpp" #include "oatpp/network/ConnectionProvider.hpp" +#include "oatpp-websocket/AsyncConnectionHandler.hpp" +#include "oatpp/web/server/AsyncHttpConnectionHandler.hpp" + #include "oatpp/core/async/Executor.hpp" class APIServer { @@ -29,7 +32,8 @@ class APIServer { std::shared_ptr m_router; std::shared_ptr m_connectionProvider; - std::shared_ptr m_connectionHandler; + std::shared_ptr + m_connectionHandler; private: #if __cplusplus >= 202002L diff --git a/src/server/auth/AuthHandler.cpp b/src/server/auth/AuthHandler.cpp deleted file mode 100644 index 0eb06a93..00000000 --- a/src/server/auth/AuthHandler.cpp +++ /dev/null @@ -1,12 +0,0 @@ - -#include "AuthHandler.hpp" - -AuthHandler::AuthHandler(const std::shared_ptr& jwt) - : oatpp::web::server::handler::BearerAuthorizationHandler( - "API" /* Realm */), - m_jwt(jwt) {} - -std::shared_ptr AuthHandler::authorize( - const oatpp::String& token) { - return m_jwt->readAndVerifyToken(token); -} \ No newline at end of file diff --git a/src/server/auth/AuthHandler.hpp b/src/server/auth/AuthHandler.hpp deleted file mode 100644 index 91ffb28c..00000000 --- a/src/server/auth/AuthHandler.hpp +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef HEAL_AUTH_JWT_AUTHHANDLER_HPP -#define HEAL_AUTH_JWT_AUTHHANDLER_HPP - -#include "JWT.hpp" - -class AuthHandler - : public oatpp::web::server::handler::BearerAuthorizationHandler { -private: - std::shared_ptr m_jwt; - -public: - AuthHandler(const std::shared_ptr& jwt); - - std::shared_ptr authorize( - const oatpp::String& token) override; -}; - -#endif // HEAL_AUTH_JWT_AUTHHANDLER_HPP diff --git a/src/server/auth/JWT.cpp b/src/server/auth/JWT.cpp deleted file mode 100644 index ece67ad4..00000000 --- a/src/server/auth/JWT.cpp +++ /dev/null @@ -1,32 +0,0 @@ - -#include "JWT.hpp" - -JWT::JWT(const oatpp::String& secret, const oatpp::String& issuer) - : m_secret(secret), - m_issuer(issuer), - m_verifier(jwt::verify() - .allow_algorithm(jwt::algorithm::hs256{secret}) - .with_issuer(issuer)) {} - -oatpp::String JWT::createToken(const std::shared_ptr& payload) { - auto token = jwt::create() - .set_issuer(m_issuer) - .set_type("JWS") - - .set_payload_claim("userId", jwt::claim(payload->userId)) - - .sign(jwt::algorithm::hs256{m_secret}); - return token; -} - -std::shared_ptr JWT::readAndVerifyToken( - const oatpp::String& token) { - auto decoded = jwt::decode(token); - m_verifier.verify(decoded); - - auto payload = std::make_shared(); - payload->userId = - decoded.get_payload_claim("").to_json().get("userId").to_str(); - - return payload; -} \ No newline at end of file diff --git a/src/server/auth/JWT.hpp b/src/server/auth/JWT.hpp deleted file mode 100644 index 6e37e192..00000000 --- a/src/server/auth/JWT.hpp +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef HEAL_AUTH_JWT_HPP -#define HEAL_AUTH_JWT_HPP - -#include "oatpp/core/Types.hpp" -#include "oatpp/web/server/handler/AuthorizationHandler.hpp" - -#include - -class JWT { -public: - struct Payload : public oatpp::web::server::handler::AuthorizationObject { - oatpp::String userId; - }; - -private: - oatpp::String m_secret; - oatpp::String m_issuer; - jwt::verifier m_verifier; - -public: - JWT(const oatpp::String& secret, const oatpp::String& issuer); - - oatpp::String createToken(const std::shared_ptr& payload); - - std::shared_ptr readAndVerifyToken(const oatpp::String& token); -}; - -#endif // HEAL_AUTH_JWT_HPP diff --git a/src/server/controller/AsyncConfigController.hpp b/src/server/controller/AsyncConfigController.hpp index 8776668d..19ca78c8 100644 --- a/src/server/controller/AsyncConfigController.hpp +++ b/src/server/controller/AsyncConfigController.hpp @@ -15,8 +15,6 @@ Description: Async Config Controller #ifndef LITHIUM_ASYNC_SCRIPT_CONTROLLER_HPP #define LITHIUM_ASYNC_SCRIPT_CONTROLLER_HPP -#include "config.h" - #include "oatpp/core/macro/codegen.hpp" #include "oatpp/core/macro/component.hpp" #include "oatpp/parser/json/mapping/ObjectMapper.hpp" @@ -32,11 +30,11 @@ Description: Async Config Controller class ConfigController : public oatpp::web::server::api::ApiController { public: - static std::shared_ptr m_configManager; + static std::weak_ptr m_configManager; ConfigController(const std::shared_ptr& objectMapper) : oatpp::web::server::api::ApiController(objectMapper) { - m_configManager = GetPtr("lithium.config"); + m_configManager = GetWeakPtr("lithium.config"); } // ---------------------------------------------------------------- @@ -73,16 +71,16 @@ class ConfigController : public oatpp::web::server::api::ApiController { auto res = ReturnConfigDTO::createShared(); res->status = "getConfig"; - if (!m_configManager) { + if (m_configManager.expired()) { res->status = "error"; res->code = 500; res->error = "ConfigManager is null"; } else { std::string path = body->path.getValue(""); - if (auto tmp = m_configManager->getValue(path); tmp) { + if (auto tmp = m_configManager.lock()->getValue(path); tmp) { res->status = "success"; res->code = 200; - res->value = tmp.dump(); + res->value = tmp.value().dump(); res->type = "string"; } else { res->status = "error"; @@ -119,14 +117,14 @@ class ConfigController : public oatpp::web::server::api::ApiController { auto res = StatusDto::createShared(); res->command = "setConfig"; - if (!m_configManager) { + if (m_configManager.expired()) { res->status = "error"; res->code = 500; res->error = "ConfigManager is null"; } else { std::string path = body->path.getValue(""); std::string value = body->value.getValue(""); - if (m_configManager->setValue(path, value)) { + if (m_configManager.lock()->setValue(path, value)) { res->status = "success"; res->code = 200; } else { @@ -162,13 +160,13 @@ class ConfigController : public oatpp::web::server::api::ApiController { auto res = StatusDto::createShared(); res->command = "deleteConfig"; - if (!m_configManager) { + if (m_configManager.expired()) { res->status = "error"; res->code = 500; res->error = "ConfigManager is null"; } else { std::string path = body->path.getValue(""); - if (m_configManager->deleteValue(path)) { + if (m_configManager.lock()->deleteValue(path)) { res->status = "success"; res->code = 200; } else { @@ -205,13 +203,13 @@ class ConfigController : public oatpp::web::server::api::ApiController { auto res = StatusDto::createShared(); res->command = "loadConfig"; - if (!m_configManager) { + if (m_configManager.expired()) { res->status = "error"; res->code = 500; res->error = "ConfigManager is null"; } else { std::string path = body->path.getValue(""); - if (m_configManager->loadFromFile(path)) { + if (m_configManager.lock()->loadFromFile(path)) { res->status = "success"; res->code = 200; } else { @@ -248,14 +246,14 @@ class ConfigController : public oatpp::web::server::api::ApiController { auto res = StatusDto::createShared(); res->command = "saveConfig"; - if (!m_configManager) { + if (m_configManager.expired()) { res->status = "error"; res->code = 500; res->error = "ConfigManager is null"; } else { std::string path = body->path.getValue(""); bool isAbsolute = body->isAbsolute.getValue(true); - if (m_configManager->saveToFile(path)) { + if (m_configManager.lock()->saveToFile(path)) { res->status = "success"; res->code = 200; } else { @@ -270,8 +268,7 @@ class ConfigController : public oatpp::web::server::api::ApiController { }; }; -std::shared_ptr ConfigController::m_configManager = - GetPtr("lithium.config"); +std::weak_ptr ConfigController::m_configManager = {}; #include OATPP_CODEGEN_END(ApiController) //<- End Codegen diff --git a/src/server/controller/AsyncDeviceController.hpp b/src/server/controller/AsyncDeviceController.hpp index d61fed05..4131f856 100644 --- a/src/server/controller/AsyncDeviceController.hpp +++ b/src/server/controller/AsyncDeviceController.hpp @@ -15,8 +15,6 @@ Description: Device Routes #ifndef LITHIUM_ASYNC_DEVICE_CONTROLLER_HPP #define LITHIUM_ASYNC_DEVICE_CONTROLLER_HPP -#include "config.h" - #include "oatpp/core/macro/codegen.hpp" #include "oatpp/core/macro/component.hpp" #include "oatpp/parser/json/mapping/ObjectMapper.hpp" diff --git a/src/server/controller/AsyncIOController.hpp b/src/server/controller/AsyncIOController.hpp index f94858f3..388f782a 100644 --- a/src/server/controller/AsyncIOController.hpp +++ b/src/server/controller/AsyncIOController.hpp @@ -15,8 +15,6 @@ Description: IO Route #ifndef LITHIUM_ASYNC_IO_CONTROLLER_HPP #define LITHIUM_ASYNC_IO_CONTROLLER_HPP -#include "config.h" - #include "atom/io/compress.hpp" #include "atom/io/file.hpp" #include "atom/io/io.hpp" diff --git a/src/server/controller/AsyncPHD2Controller.hpp b/src/server/controller/AsyncPHD2Controller.hpp index 219ddd95..6c5ee817 100644 --- a/src/server/controller/AsyncPHD2Controller.hpp +++ b/src/server/controller/AsyncPHD2Controller.hpp @@ -17,8 +17,6 @@ Description: PHD2 Route #include "lithiumapp.hpp" -#include "config.h" - #include "data/PHD2Dto.hpp" #include "data/StatusDto.hpp" diff --git a/src/server/controller/AsyncProcessController.hpp b/src/server/controller/AsyncProcessController.hpp index e1fb2f13..968abb2c 100644 --- a/src/server/controller/AsyncProcessController.hpp +++ b/src/server/controller/AsyncProcessController.hpp @@ -15,8 +15,6 @@ Description: Process Route #ifndef LITHIUM_ASYNC_PROCESS_CONTROLLER_HPP #define LITHIUM_ASYNC_PROCESS_CONTROLLER_HPP -#include "config.h" - #include "data/ProcessDto.hpp" #include "data/StatusDto.hpp" diff --git a/src/server/controller/AsyncScriptController.hpp b/src/server/controller/AsyncScriptController.hpp index d8758120..cb91edd9 100644 --- a/src/server/controller/AsyncScriptController.hpp +++ b/src/server/controller/AsyncScriptController.hpp @@ -26,8 +26,6 @@ Description: Async Script Controller #ifndef Lithium_SCRIPTCONTROLLER_HPP #define Lithium_SCRIPTCONTROLLER_HPP -#include "config.h" - #include "oatpp/core/macro/codegen.hpp" #include "oatpp/core/macro/component.hpp" #include "oatpp/parser/json/mapping/ObjectMapper.hpp" diff --git a/src/server/controller/AsyncStaticController.hpp b/src/server/controller/AsyncStaticController.hpp index a7c7a68b..6fa5f60c 100644 --- a/src/server/controller/AsyncStaticController.hpp +++ b/src/server/controller/AsyncStaticController.hpp @@ -20,8 +20,6 @@ Description: Static Route #include "oatpp/parser/json/mapping/ObjectMapper.hpp" #include "oatpp/web/server/api/ApiController.hpp" -#include "config.h" - #include #include #include diff --git a/src/server/controller/AsyncSystemController.hpp b/src/server/controller/AsyncSystemController.hpp index c5b8639a..986dab01 100644 --- a/src/server/controller/AsyncSystemController.hpp +++ b/src/server/controller/AsyncSystemController.hpp @@ -23,8 +23,6 @@ Description: System Route #include "atom/system/module/wifi.hpp" #include "atom/system/system.hpp" -#include "config.h" - #include "oatpp/core/macro/codegen.hpp" #include "oatpp/core/macro/component.hpp" #include "oatpp/parser/json/mapping/ObjectMapper.hpp" diff --git a/src/server/controller/AuthController.hpp b/src/server/controller/AuthController.hpp deleted file mode 100644 index cf373f75..00000000 --- a/src/server/controller/AuthController.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef EXAMPLE_JWT_AUTHCONTROLLER_HPP -#define EXAMPLE_JWT_AUTHCONTROLLER_HPP - -#include "service/AuthService.hpp" - -#include "oatpp/core/macro/codegen.hpp" -#include "oatpp/parser/json/mapping/ObjectMapper.hpp" -#include "oatpp/web/server/api/ApiController.hpp" - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- Begin Codegen - -/** - * User REST controller. - */ -class AuthController : public oatpp::web::server::api::ApiController { -public: - AuthController(const std::shared_ptr& objectMapper) - : oatpp::web::server::api::ApiController(objectMapper) {} - -private: - AuthService m_userService; // Create user service. -public: - static std::shared_ptr createShared( - OATPP_COMPONENT(std::shared_ptr, - objectMapper) // Inject objectMapper component here as - // default parameter - ) { - return std::make_shared(objectMapper); - } - - ENDPOINT_INFO(signUp) { - info->summary = "Sign up"; - - info->addConsumes>("application/json"); - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - } - ENDPOINT("POST", "users/signup", signUp, BODY_DTO(Object, dto)) { - return createDtoResponse(Status::CODE_200, m_userService.signUp(dto)); - } - - ENDPOINT_INFO(signIn) { - info->summary = "Sign in"; - - info->addConsumes>("application/json"); - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - } - ENDPOINT("POST", "users/signin", signIn, BODY_DTO(Object, dto)) { - return createDtoResponse(Status::CODE_200, m_userService.signIn(dto)); - } - - ENDPOINT_INFO(deleteUser) { - info->summary = "Delete User"; - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - } - ENDPOINT("DELETE", "users", deleteUser, BUNDLE(String, userId)) { - return createDtoResponse(Status::CODE_200, - m_userService.deleteUserById(userId)); - } -}; - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- End Codegen - -#endif // EXAMPLE_JWT_AUTHCONTROLLER_HPP diff --git a/src/server/controller/StaticController.hpp b/src/server/controller/StaticController.hpp deleted file mode 100644 index 2e2d442f..00000000 --- a/src/server/controller/StaticController.hpp +++ /dev/null @@ -1,45 +0,0 @@ - -#ifndef EXAMPLE_JWT_STATICCONTROLLER_HPP -#define EXAMPLE_JWT_STATICCONTROLLER_HPP - -#include "oatpp/core/macro/codegen.hpp" -#include "oatpp/core/macro/component.hpp" -#include "oatpp/parser/json/mapping/ObjectMapper.hpp" -#include "oatpp/web/server/api/ApiController.hpp" - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- Begin Codegen - -class StaticController : public oatpp::web::server::api::ApiController { -public: - StaticController(const std::shared_ptr& objectMapper) - : oatpp::web::server::api::ApiController(objectMapper) {} - -public: - static std::shared_ptr createShared( - OATPP_COMPONENT(std::shared_ptr, - objectMapper) // Inject objectMapper component here as - // default parameter - ) { - return std::make_shared(objectMapper); - } - - ENDPOINT("GET", "/", root) { - const char* html = - "" - " " - " " - " " - " " - "

Hello CRUD example project!

" - "
Checkout Swagger-UI page" - " " - ""; - auto response = createResponse(Status::CODE_200, html); - response->putHeader(Header::CONTENT_TYPE, "text/html"); - return response; - } -}; - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- End Codegen - -#endif // EXAMPLE_JWT_STATICCONTROLLER_HPP diff --git a/src/server/controller/StoryController.hpp b/src/server/controller/StoryController.hpp deleted file mode 100644 index f0b8c155..00000000 --- a/src/server/controller/StoryController.hpp +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef EXAMPLE_JWT_STORYCONTROLLER_HPP -#define EXAMPLE_JWT_STORYCONTROLLER_HPP - -#include "service/StoryService.hpp" - -#include "oatpp/core/macro/codegen.hpp" -#include "oatpp/parser/json/mapping/ObjectMapper.hpp" -#include "oatpp/web/server/api/ApiController.hpp" - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- Begin Codegen - -/** - * Story REST controller. - */ -class StoryController : public oatpp::web::server::api::ApiController { -public: - StoryController(const std::shared_ptr& objectMapper) - : oatpp::web::server::api::ApiController(objectMapper) {} - -private: - StoryService m_storyService; // Create story service. -public: - static std::shared_ptr createShared( - OATPP_COMPONENT(std::shared_ptr, - objectMapper) // Inject objectMapper component here as - // default parameter - ) { - return std::make_shared(objectMapper); - } - - ENDPOINT_INFO(createStory) { - info->summary = "Create new Story"; - - info->addConsumes>("application/json"); - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - } - ENDPOINT("POST", "stories", createStory, BUNDLE(String, userId), - BODY_DTO(Object, storyDto)) { - storyDto->id = nullptr; - return createDtoResponse(Status::CODE_200, - m_storyService.createStory(userId, storyDto)); - } - - ENDPOINT_INFO(putStory) { - info->summary = "Update Story by storyId"; - - info->addConsumes>("application/json"); - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_404, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - - info->pathParams["storyId"].description = "Story Identifier"; - } - ENDPOINT("PUT", "stories/{storyId}", putStory, BUNDLE(String, userId), - PATH(String, storyId), BODY_DTO(Object, storyDto)) { - storyDto->id = storyId; - return createDtoResponse(Status::CODE_200, - m_storyService.updateStory(userId, storyDto)); - } - - ENDPOINT_INFO(getStoryById) { - info->summary = "Get one Story by storyId"; - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_404, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - - info->pathParams["storyId"].description = "Story Identifier"; - } - ENDPOINT("GET", "stories/{storyId}", getStoryById, BUNDLE(String, userId), - PATH(String, storyId)) { - return createDtoResponse( - Status::CODE_200, - m_storyService.getStoryByUserIdAndId(userId, storyId)); - } - - ENDPOINT_INFO(getStories) { - info->summary = "Get All user stories"; - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - } - ENDPOINT("GET", "stories/offset/{offset}/limit/{limit}", getStories, - BUNDLE(String, userId), PATH(UInt32, offset), - PATH(UInt32, limit)) { - return createDtoResponse( - Status::CODE_200, - m_storyService.getAllUserStories(userId, offset, limit)); - } - - ENDPOINT_INFO(deleteStory) { - info->summary = "Delete story by storyId"; - - info->addResponse>(Status::CODE_200, - "application/json"); - info->addResponse>(Status::CODE_500, - "application/json"); - - info->pathParams["storyId"].description = "Story Identifier"; - } - ENDPOINT("DELETE", "stories/{userId}", deleteStory, BUNDLE(String, userId), - PATH(String, storyId)) { - return createDtoResponse( - Status::CODE_200, - m_storyService.deleteStoryByUserIdAndId(userId, storyId)); - } -}; - -#include OATPP_CODEGEN_BEGIN(ApiController) //<- End Codegen - -#endif /* EXAMPLE_JWT_STORYCONTROLLER_HPP */ diff --git a/src/server/database/StoryDb.hpp b/src/server/database/StoryDb.hpp deleted file mode 100644 index d416c133..00000000 --- a/src/server/database/StoryDb.hpp +++ /dev/null @@ -1,65 +0,0 @@ - -#ifndef EXAMPLE_JWT_STORYDB_HPP -#define EXAMPLE_JWT_STORYDB_HPP - -#include "model/StoryModel.hpp" -#include "oatpp-sqlite/orm.hpp" - -#include OATPP_CODEGEN_BEGIN(DbClient) //<- Begin Codegen - -/** - * StoryDb client definitions. - */ -class StoryDb : public oatpp::orm::DbClient { -public: - StoryDb(const std::shared_ptr& executor) - : oatpp::orm::DbClient(executor) { - oatpp::orm::SchemaMigration migration(executor); - migration.addFile(1 /* start from version 1 */, "./sql/story.sql"); - // TODO - Add more migrations here. - migration - .migrate(); // <-- run migrations. This guy will throw on error. - - auto version = executor->getSchemaVersion(); - OATPP_LOGD("UserDb", "Migration - OK. Version=%lld.", version); - } - - QUERY(createStory, - "INSERT INTO Stories" - "(id, userid, content) VALUES " - "(uuid_generate_v4(), :story.userid, :story.content) " - "RETURNING *;", - PREPARE(true), // prepared statement! - PARAM(oatpp::Object, story)) - - QUERY(updateStory, - "UPDATE Stories " - "SET " - " content=:story.content, " - "WHERE " - " id=:story.id AND userid=:story.userid " - "RETURNING *;", - PREPARE(true), // prepared statement! - PARAM(oatpp::Object, story)) - - QUERY(getStoryByUserIdAndId, - "SELECT * FROM Stories WHERE id=:id AND userid=:userId;", - PREPARE(true), // prepared statement! - PARAM(oatpp::String, userId), PARAM(oatpp::String, id)) - - QUERY(getAllUserStories, - "SELECT * FROM Stories WHERE userid=:userId LIMIT :limit OFFSET " - ":offset;", - PREPARE(true), // prepared statement! - PARAM(oatpp::String, userId), PARAM(oatpp::UInt32, offset), - PARAM(oatpp::UInt32, limit)) - - QUERY(deleteStoryByUserIdAndId, - "DELETE FROM Stories WHERE id=:id AND userid=:userId;", - PREPARE(true), // prepared statement! - PARAM(oatpp::String, userId), PARAM(oatpp::String, id)) -}; - -#include OATPP_CODEGEN_END(DbClient) //<- End Codegen - -#endif // EXAMPLE_JWT_STORYDB_HPP diff --git a/src/server/database/UserDb.hpp b/src/server/database/UserDb.hpp deleted file mode 100644 index 9bf68c35..00000000 --- a/src/server/database/UserDb.hpp +++ /dev/null @@ -1,73 +0,0 @@ - -#ifndef EXAMPLE_JWT_USERDB_HPP -#define EXAMPLE_JWT_USERDB_HPP - -#include "data/UserDto.hpp" -#include "model/UserModel.hpp" -#include "oatpp-sqlite/orm.hpp" - -#include OATPP_CODEGEN_BEGIN(DbClient) //<- Begin Codegen - -/** - * UserDb client definitions. - */ -class UserDb : public oatpp::orm::DbClient { -public: - UserDb(const std::shared_ptr& executor) - : oatpp::orm::DbClient(executor) { - oatpp::orm::SchemaMigration migration(executor); - migration.addFile(1 /* start from version 1 */, "./sql/user.sql"); - // TODO - Add more migrations here. - migration - .migrate(); // <-- run migrations. This guy will throw on error. - - auto version = executor->getSchemaVersion(); - OATPP_LOGD("UserDb", "Migration - OK. Version=%lld.", version); - } - - QUERY(createUser, - "INSERT INTO AppUser" - "(username, email, password, role) VALUES " - "(:user.username, :user.email, :user.password, :user.role);", - PARAM(oatpp::Object, user)) - - QUERY(updateUser, - "UPDATE AppUser " - "SET " - " username=:user.username, " - " email=:user.email, " - " password=:user.password, " - " role=:user.role " - "WHERE " - " id=:user.id;", - PARAM(oatpp::Object, user)) - - QUERY(getUserById, "SELECT * FROM AppUser WHERE id=:id;", - PARAM(oatpp::Int32, id)) - - QUERY(getAllUsers, "SELECT * FROM AppUser LIMIT :limit OFFSET :offset;", - PARAM(oatpp::UInt32, offset), PARAM(oatpp::UInt32, limit)) - - QUERY(deleteUserById, "DELETE FROM AppUser WHERE id=:id;", - PARAM(oatpp::Int32, id)) - - QUERY(changeUserPassword, - "UPDATE users " - "SET " - " pswhash=crypt(:newPassword, gen_salt('bf', 8)) " - "WHERE " - " id=:id AND pswhash=crypt(:oldPassword, pswhash);", - PREPARE(true), // prepared statement! - PARAM(oatpp::String, userId, "id"), PARAM(oatpp::String, oldPassword), - PARAM(oatpp::String, newPassword)) - - QUERY(authenticateUser, - "SELECT id FROM users WHERE username=:username AND " - "pswhash=crypt(:password, pswhash);", - PREPARE(true), // prepared statement! - PARAM(oatpp::String, username), PARAM(oatpp::String, password)) -}; - -#include OATPP_CODEGEN_END(DbClient) //<- End Codegen - -#endif // EXAMPLE_JWT_USERDB_HPP diff --git a/src/server/database/model/StoryModel.hpp b/src/server/database/model/StoryModel.hpp deleted file mode 100644 index 75b57a4e..00000000 --- a/src/server/database/model/StoryModel.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef EXAMPLE_JWT_STORYMODEL_HPP -#define EXAMPLE_JWT_STORYMODEL_HPP - -#include "oatpp/core/macro/codegen.hpp" -#include "oatpp/core/Types.hpp" - -#include OATPP_CODEGEN_BEGIN(DTO) - -class StoryModel : public oatpp::DTO { - - DTO_INIT(StoryModel, DTO) - - DTO_FIELD(String, id); - DTO_FIELD(String, userId, "userid"); - DTO_FIELD(String, content, "content"); - -}; - -#include OATPP_CODEGEN_END(DTO) - - -#endif //EXAMPLE_JWT_STORYMODEL_HPP diff --git a/src/server/database/model/UserModel.hpp b/src/server/database/model/UserModel.hpp deleted file mode 100644 index 013e9a94..00000000 --- a/src/server/database/model/UserModel.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef EXAMPLE_JWT_DB_MODEL_USERMODEL_HPP -#define EXAMPLE_JWT_DB_MODEL_USERMODEL_HPP - -#include "oatpp/core/macro/codegen.hpp" -#include "oatpp/core/Types.hpp" - -#include OATPP_CODEGEN_BEGIN(DTO) - -class UserModel : public oatpp::DTO { - - DTO_INIT(UserModel, DTO) - - DTO_FIELD(String, id); - DTO_FIELD(String, userName, "username"); - DTO_FIELD(String, email, "email"); - DTO_FIELD(String, password, "password"); - -}; - -#include OATPP_CODEGEN_END(DTO) - -#endif /* EXAMPLE_JWT_DB_MODEL_USERMODEL_HPP */ diff --git a/src/server/interceptor/AuthInterceptor.cpp b/src/server/interceptor/AuthInterceptor.cpp deleted file mode 100644 index 30259671..00000000 --- a/src/server/interceptor/AuthInterceptor.cpp +++ /dev/null @@ -1,33 +0,0 @@ - -#include "AuthInterceptor.hpp" - -AuthInterceptor::AuthInterceptor(const std::shared_ptr& jwt) - : m_authHandler(jwt) { - authEndpoints.route("POST", "users/signup", false); - authEndpoints.route("POST", "users/signin", false); - - authEndpoints.route("GET", "swagger/*", false); - authEndpoints.route("GET", "api-docs/oas-3.0.0.json", false); -} - -std::shared_ptr AuthInterceptor::intercept( - const std::shared_ptr& request) { - auto r = authEndpoints.getRoute(request->getStartingLine().method, - request->getStartingLine().path); - if (r && !r.getEndpoint()) { - return nullptr; // Continue without Authorization - } - - auto authHeader = - request->getHeader(oatpp::web::protocol::http::Header::AUTHORIZATION); - - auto authObject = std::static_pointer_cast( - m_authHandler.handleAuthorization(authHeader)); - if (authObject) { - request->putBundleData("userId", authObject->userId); - return nullptr; // Continue - token is valid. - } - - throw oatpp::web::protocol::http::HttpError( - oatpp::web::protocol::http::Status::CODE_401, "Unauthorized", {}); -} \ No newline at end of file diff --git a/src/server/interceptor/AuthInterceptor.hpp b/src/server/interceptor/AuthInterceptor.hpp deleted file mode 100644 index a14c2c09..00000000 --- a/src/server/interceptor/AuthInterceptor.hpp +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef EXAMPLE_JWT_AUTHINTERCEPTOR_HPP -#define EXAMPLE_JWT_AUTHINTERCEPTOR_HPP - -#include "auth/AuthHandler.hpp" - -#include "oatpp/web/server/HttpConnectionHandler.hpp" -#include "oatpp/web/server/HttpRouter.hpp" -#include "oatpp/web/server/handler/AuthorizationHandler.hpp" -#include "oatpp/web/server/interceptor/RequestInterceptor.hpp" - -class AuthInterceptor - : public oatpp::web::server::interceptor::RequestInterceptor { -private: - AuthHandler m_authHandler; - oatpp::web::server::HttpRouterTemplate authEndpoints; - -public: - AuthInterceptor(const std::shared_ptr& jwt); - - std::shared_ptr intercept( - const std::shared_ptr& request) override; -}; - -#endif // EXAMPLE_JWT_AUTHINTERCEPTOR_HPP diff --git a/src/server/launcher/faq.cpp b/src/server/launcher/faq.cpp deleted file mode 100644 index 473dca12..00000000 --- a/src/server/launcher/faq.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - * faq.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-4-13 - -Description: F&Q Manager for HEAL - -**************************************************/ - -#include "faq.hpp" - -#include -#include -#include -#include -#include -#include - -struct FAQ { - std::string question; - std::string description; - std::string category; - std::vector solutions; - int difficulty; - std::vector links; -}; - -void FAQManager::addFAQ(const FAQ &faq) { - std::lock_guard lock(mutex); - faqs.push_back(faq); -} - -void FAQManager::deleteFAQ(const std::string &question) { - std::lock_guard lock(mutex); - faqs.erase(std::remove_if( - faqs.begin(), faqs.end(), - [&](const FAQ &faq) { return faq.question == question; }), - faqs.end()); -} - -std::vector FAQManager::searchFAQs(const std::string &keyword) { - std::lock_guard lock(mutex); - - // 检查缓存中是否存在搜索结果 - if (cache.find(keyword) != cache.end()) { - return cache[keyword]; - } - - std::vector results; - for (const auto &faq : faqs) { - if (faq.question.find(keyword) != std::string::npos || - faq.description.find(keyword) != std::string::npos || - faq.category.find(keyword) != std::string::npos) { - results.push_back(faq); - } - } - - // 将搜索结果存入缓存 - cache[keyword] = results; - - return results; -} - -std::vector FAQManager::getFAQs() const { - std::lock_guard lock(mutex); - return faqs; -} - -std::vector FAQManager::getCategorizedFAQs(const std::string &category) { - std::lock_guard lock(mutex); - - // 检查缓存中是否存在分类结果 - if (categoryCache.find(category) != categoryCache.end()) { - return categoryCache[category]; - } - - std::vector results; - for (const auto &faq : faqs) { - if (faq.category == category) { - results.push_back(faq); - } - } - - // 将分类结果存入缓存 - categoryCache[category] = results; - - return results; -} - -void FAQManager::saveToFile(const std::string &filename) { - std::lock_guard lock(mutex); - json jsonData; - - for (const auto &faq : faqs) { - json jsonFAQ; - jsonFAQ["question"] = faq.question; - jsonFAQ["description"] = faq.description; - jsonFAQ["category"] = faq.category; - jsonFAQ["solutions"] = faq.solutions; - jsonFAQ["difficulty"] = faq.difficulty; - jsonFAQ["links"] = faq.links; - - jsonData.push_back(jsonFAQ); - } - - std::ofstream file(filename); - file << jsonData.dump(4); // 4-space indentation for pretty printing -} - -void FAQManager::loadFromFile(const std::string &filename) { - std::lock_guard lock(mutex); - std::ifstream file(filename); - json jsonData; - file >> jsonData; - - faqs.clear(); - cache.clear(); - categoryCache.clear(); - - for (const auto &jsonFAQ : jsonData) { - FAQ faq; - faq.question = jsonFAQ["question"]; - faq.description = jsonFAQ["description"]; - faq.category = jsonFAQ["category"]; - faq.solutions = jsonFAQ["solutions"]; - faq.difficulty = jsonFAQ["difficulty"]; - faq.links = jsonFAQ["links"]; - - faqs.push_back(faq); - } -} - -void FAQManager::printFAQs() const { - std::lock_guard lock(mutex); - json jsonData; - - for (const auto &faq : faqs) { - json jsonFAQ; - jsonFAQ["question"] = faq.question; - jsonFAQ["description"] = faq.description; - jsonFAQ["category"] = faq.category; - jsonFAQ["solutions"] = faq.solutions; - jsonFAQ["difficulty"] = faq.difficulty; - jsonFAQ["links"] = faq.links; - - jsonData.push_back(jsonFAQ); - } - - std::cout << jsonData.dump(4) << std::endl; -} \ No newline at end of file diff --git a/src/server/launcher/faq.hpp b/src/server/launcher/faq.hpp deleted file mode 100644 index 2a50f43f..00000000 --- a/src/server/launcher/faq.hpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * faq.hpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-4-13 - -Description: F&Q Manager for HEAL - -**************************************************/ - -#include -#include -#include - -#if ENABLE_FASTHASH -#include "emhash/hash_table8.hpp" -#else -#include -#endif - -#include "atom/type/json.hpp" -using json = nlohmann::json; - -struct FAQ { - std::string question; - std::string description; - std::string category; - std::vector solutions; - int difficulty; - std::vector links; -}; - -class FAQManager { -public: - void addFAQ(const FAQ &faq); - - void deleteFAQ(const std::string &question); - - std::vector searchFAQs(const std::string &keyword); - - std::vector getFAQs() const; - - std::vector getCategorizedFAQs(const std::string &category); - - void saveToFile(const std::string &filename); - - void loadFromFile(const std::string &filename); - - void printFAQs() const; - -private: - std::vector faqs; -#if ENABLE_FASTHASH - emhash8::HashMap> cache; - emhash8::HashMap> categoryCache; -#else - std::unordered_map> cache; - std::unordered_map> categoryCache; -#endif - mutable std::mutex mutex; -}; \ No newline at end of file diff --git a/src/server/service/AuthService.cpp b/src/server/service/AuthService.cpp deleted file mode 100644 index ddcf9c51..00000000 --- a/src/server/service/AuthService.cpp +++ /dev/null @@ -1,74 +0,0 @@ - -#include "AuthService.hpp" - -oatpp::Object AuthService::signUp( - const oatpp::Object& dto) { - auto user = UserModel::createShared(); - user->id = nullptr; - user->userName = dto->userName; - user->email = dto->email; - user->password = dto->password; - - auto userDto = UserDto::createShared(); - userDto->userName = user->userName; - userDto->email = user->email; - userDto->password = user->password; - userDto->role = Role::ADMIN; - - auto dbResult = m_database->createUser(userDto); - if (!dbResult->isSuccess()) { - OATPP_LOGE("AuthService", "DB-Error: '%s'", - dbResult->getErrorMessage()->c_str()); - } - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_401, "Unauthorized"); - - auto result = - dbResult->fetch>>(); - OATPP_ASSERT_HTTP(result->size() == 1, Status::CODE_401, "Unauthorized") - - auto newUserId = result[0][0]; - - auto payload = std::make_shared(); - payload->userId = newUserId; - - auto auth = AuthDto::createShared(); - auth->token = m_jwt->createToken(payload); - - return auth; -} - -oatpp::Object AuthService::signIn( - const oatpp::Object& dto) { - auto dbResult = m_database->authenticateUser(dto->userName, dto->password); - if (!dbResult->isSuccess()) { - OATPP_LOGE("AuthService", "DB-Error: '%s'", - dbResult->getErrorMessage()->c_str()); - } - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_401, "Unauthorized") - - auto result = - dbResult->fetch>>(); - OATPP_ASSERT_HTTP(result->size() == 1, Status::CODE_401, "Unauthorized") - - auto userId = result[0][0]; - - auto payload = std::make_shared(); - payload->userId = userId; - - auto auth = AuthDto::createShared(); - auth->token = m_jwt->createToken(payload); - - return auth; -} - -oatpp::Object AuthService::deleteUserById( - const oatpp::String& userId) { - auto dbResult = m_database->deleteUserById(1); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - auto status = StatusDto::createShared(); - status->status = "OK"; - status->code = 200; - status->message = "User was successfully deleted"; - return status; -} \ No newline at end of file diff --git a/src/server/service/AuthService.hpp b/src/server/service/AuthService.hpp deleted file mode 100644 index 10093d3e..00000000 --- a/src/server/service/AuthService.hpp +++ /dev/null @@ -1,31 +0,0 @@ - -#ifndef HEAL_SERVICE_JWT_AUTHSERVICE_HPP -#define HEAL_SERVICE_JWT_AUTHSERVICE_HPP - -#include "auth/JWT.hpp" - -#include "data/AuthDto.hpp" -#include "data/PageDto.hpp" -#include "data/SignInDto.hpp" -#include "data/SignUpDto.hpp" -#include "data/StatusDto.hpp" -#include "database/UserDb.hpp" - -#include "oatpp/core/macro/component.hpp" -#include "oatpp/web/protocol/http/Http.hpp" - -class AuthService { -private: - typedef oatpp::web::protocol::http::Status Status; - -private: - OATPP_COMPONENT(std::shared_ptr, - m_database); // Inject database component - OATPP_COMPONENT(std::shared_ptr, m_jwt); // Inject JWT component -public: - oatpp::Object signUp(const oatpp::Object& dto); - oatpp::Object signIn(const oatpp::Object& dto); - oatpp::Object deleteUserById(const oatpp::String& id); -}; - -#endif // HEAL_SERVICE_JWT_AUTHSERVICE_HPP diff --git a/src/server/service/StoryService.cpp b/src/server/service/StoryService.cpp deleted file mode 100644 index 5b358c22..00000000 --- a/src/server/service/StoryService.cpp +++ /dev/null @@ -1,95 +0,0 @@ - -#include "StoryService.hpp" - -oatpp::Object StoryService::storyDtoFromModel( - const oatpp::Object& model) { - auto dto = StoryDto::createShared(); - dto->id = model->id; - dto->content = model->content; - return dto; -} - -oatpp::Object StoryService::storyModelFromDto( - const oatpp::String& userId, const oatpp::Object& dto) { - auto model = StoryModel::createShared(); - model->userId = userId; - model->id = dto->id; - model->content = dto->content; - return model; -} - -oatpp::Object StoryService::createStory( - const oatpp::String& userId, const oatpp::Object& dto) { - auto dbResult = m_database->createStory(storyModelFromDto(userId, dto)); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - auto result = dbResult->fetch>>(); - OATPP_ASSERT_HTTP(result->size() == 1, Status::CODE_500, "Unknown Error"); - return storyDtoFromModel(result[0]); -} - -oatpp::Object StoryService::updateStory( - const oatpp::String& userId, const oatpp::Object& dto) { - auto dbResult = m_database->updateStory(storyModelFromDto(userId, dto)); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - auto result = dbResult->fetch>>(); - OATPP_ASSERT_HTTP(result->size() == 1, Status::CODE_500, "Unknown Error"); - return storyDtoFromModel(result[0]); -} - -oatpp::Object StoryService::getStoryByUserIdAndId( - const oatpp::String& userId, const oatpp::String& id, - const oatpp::provider::ResourceHandle& connection) { - auto dbResult = m_database->getStoryByUserIdAndId(userId, id, connection); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - OATPP_ASSERT_HTTP(dbResult->hasMoreToFetch(), Status::CODE_404, - "User story not found"); - - auto result = dbResult->fetch>>(); - OATPP_ASSERT_HTTP(result->size() == 1, Status::CODE_500, "Unknown error"); - - return storyDtoFromModel(result[0]); -} - -oatpp::Object>> StoryService::getAllUserStories( - const oatpp::String& userId, const oatpp::UInt32& offset, - const oatpp::UInt32& limit) { - oatpp::UInt32 countToFetch = limit; - - if (limit > 10) { - countToFetch = 10; - } - - auto dbResult = m_database->getAllUserStories(userId, offset, countToFetch); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - - auto items = dbResult->fetch>>(); - - oatpp::Vector> stories({}); - for (auto& item : *items) { - stories->push_back(storyDtoFromModel(item)); - } - - auto page = PageDto>::createShared(); - page->offset = offset; - page->limit = countToFetch; - page->count = stories->size(); - page->items = stories; - - return page; -} - -oatpp::Object StoryService::deleteStoryByUserIdAndId( - const oatpp::String& userId, const oatpp::String& id) { - auto dbResult = m_database->deleteStoryByUserIdAndId(userId, id); - OATPP_ASSERT_HTTP(dbResult->isSuccess(), Status::CODE_500, - dbResult->getErrorMessage()); - auto status = StatusDto::createShared(); - status->status = "OK"; - status->code = 200; - status->message = "User story was successfully deleted"; - return status; -} \ No newline at end of file diff --git a/src/server/service/StoryService.hpp b/src/server/service/StoryService.hpp deleted file mode 100644 index d6c722fa..00000000 --- a/src/server/service/StoryService.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef HEAL_SERVICE_STORYSERVICE_HPP -#define HEAL_SERVICE_STORYSERVICE_HPP - -#include "database/StoryDb.hpp" -#include "database/model/StoryModel.hpp" - -#include "data/PageDto.hpp" -#include "data/StatusDto.hpp" -#include "data/StoryDto.hpp" - -#include "oatpp/core/macro/component.hpp" -#include "oatpp/web/protocol/http/Http.hpp" - -class StoryService { -private: - typedef oatpp::web::protocol::http::Status Status; - -private: - oatpp::Object storyDtoFromModel( - const oatpp::Object& model); - oatpp::Object storyModelFromDto( - const oatpp::String& userId, const oatpp::Object& dto); - -private: - OATPP_COMPONENT(std::shared_ptr, - m_database); // Inject database component -public: - oatpp::Object createStory(const oatpp::String& userId, - const oatpp::Object& dto); - oatpp::Object updateStory(const oatpp::String& userId, - const oatpp::Object& dto); - oatpp::Object getStoryByUserIdAndId( - const oatpp::String& userId, const oatpp::String& id, - const oatpp::provider::ResourceHandle& - connection = nullptr); - oatpp::Object>> getAllUserStories( - const oatpp::String& userId, const oatpp::UInt32& offset, - const oatpp::UInt32& limit); - oatpp::Object deleteStoryByUserIdAndId( - const oatpp::String& userId, const oatpp::String& id); -}; - -#endif // HEAL_SERVICE_STORYSERVICE_HPP diff --git a/src/utils/constant.hpp b/src/utils/constant.hpp index 86f10e34..5acda270 100644 --- a/src/utils/constant.hpp +++ b/src/utils/constant.hpp @@ -78,6 +78,9 @@ class constants { static constexpr const char* LITHIUM_MODULE_LOADER = "lithium.addon.loader"; static constexpr const char* LITHIUM_ADDON_MANAGER = "lithium.addon.addon"; static constexpr const char* LITHIUM_UTILS_ENV = "lithium.utils.env"; + + static std::vector LITHIUM_RESOURCES; + static std::vector LITHIUM_RESOURCES_SHA256; }; #ifdef _WIN32 @@ -102,4 +105,6 @@ std::vector constants::COMPILER_PATHS = {"/usr/bin", "/usr/local/bin"}; #endif + + #endif // LITHIUM_UTILS_CONSTANTS_HPP diff --git a/src/utils/resource.hpp b/src/utils/resource.hpp new file mode 100644 index 00000000..e9595e3a --- /dev/null +++ b/src/utils/resource.hpp @@ -0,0 +1,41 @@ +/* + * resource.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-16 + +Description: Resource List for Lithium + +**************************************************/ + +#ifndef LITHIUM_UTILS_RESOURCE_HPP +#define LITHIUM_UTILS_RESOURCE_HPP + +#include +#include + +class resource { +public: + static std::unordered_map> + LITHIUM_RESOURCES; + + static constexpr const char* LITHIUM_RESOURCE_SERVER = + "https://github/ElementAstro/LithiumPackage"; +}; + +std::unordered_map> + resource::LITHIUM_RESOURCES = {{ +#ifdef _WIN32 + "lithium_server.exe" +#else + "lithium_server" +#endif + , + {"", false}}}; + +#endif \ No newline at end of file From 7e3fe90813852741e959abc98cb5cd49062f330d Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 20 Apr 2024 20:22:20 +0800 Subject: [PATCH 23/28] fix bugs in carbon --- CMakeLists.txt | 1 + src/atom/CMakeLists.txt | 1 + src/atom/algorithm/hash.hpp | 2 +- src/atom/error/exception.cpp | 136 +++++ src/atom/error/exception.hpp | 42 ++ src/atom/io/compress.cpp | 77 +-- src/atom/io/file.cpp | 104 +--- src/atom/io/file.hpp | 18 - src/atom/io/io.cpp | 57 ++ src/atom/io/io.hpp | 34 ++ src/atom/utils/aes.hpp | 16 +- src/carbon/CMakeLists.txt | 101 ++-- src/carbon/LICENSE | 31 + src/carbon/command/bad_boxed_cast.cpp | 9 +- src/carbon/command/boxed_value.hpp | 10 +- src/carbon/command/dispatchkit.cpp | 45 +- src/carbon/command/dispatchkit.hpp | 2 +- src/carbon/command/dynamic_object.cpp | 8 +- src/carbon/command/dynamic_object_detail.cpp | 24 +- src/carbon/command/dynamic_object_detail.hpp | 4 +- src/carbon/command/proxy_functions.cpp | 46 +- src/carbon/command/proxy_functions.hpp | 9 +- src/carbon/command/register_function.hpp | 107 ++-- src/carbon/command/type_conversions.hpp | 13 +- src/carbon/language/engine.cpp | 565 ++++++++++++++++++ src/carbon/language/engine.hpp | 566 ++----------------- src/carbon/language/windows.hpp | 30 + src/server/AppComponent.hpp | 4 +- src/server/Runner.cpp | 4 - 29 files changed, 1197 insertions(+), 869 deletions(-) create mode 100644 src/atom/error/exception.cpp create mode 100644 src/carbon/LICENSE create mode 100644 src/carbon/language/engine.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 786ff06a..1e9ff549 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,6 +129,7 @@ add_subdirectory(modules) add_subdirectory(driver) +add_subdirectory(${lithium_src_dir}/carbon) add_subdirectory(${lithium_src_dir}/config) add_subdirectory(${lithium_src_dir}/server) diff --git a/src/atom/CMakeLists.txt b/src/atom/CMakeLists.txt index 47070d12..d2a23517 100644 --- a/src/atom/CMakeLists.txt +++ b/src/atom/CMakeLists.txt @@ -49,6 +49,7 @@ endif() # Sources list(APPEND ${PROJECT_NAME}_SOURCES error/error_stack.cpp + error/exception.cpp log/logger.cpp log/global_logger.cpp diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index a8f9a2d5..937f9e64 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -254,7 +254,7 @@ inline uint32_t quickHash(const void* tmp, uint32_t size) { if (!tmp) return 0; - const char* str = (const char*)tmp; + const char* str = static_cast(tmp); unsigned int h = 0; for (uint32_t i = 0; i < size; ++i, ++str) { h = 31 * h + *str; diff --git a/src/atom/error/exception.cpp b/src/atom/error/exception.cpp new file mode 100644 index 00000000..5f19b1f3 --- /dev/null +++ b/src/atom/error/exception.cpp @@ -0,0 +1,136 @@ +/* + * exception.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-11-10 + +Description: Better Exception Library + +**************************************************/ + +#include "exception.hpp" + +#include +#include +#include +#include +#include +#include +#include + + +#ifdef _WIN32 +#include +#include +#pragma comment(lib, "dbghelp.lib") +#elif defined(__APPLE__) || defined(__linux__) +#include +#include +#include +#endif + +namespace Atom::Error +{ +const char* Exception::what() const noexcept { + if (full_message_.empty()) { + std::ostringstream oss; + oss << "[" << getCurrentTime() << "] "; + oss << "Exception at " << file_ << ":" << line_ << " in " << func_ + << "()"; + oss << " (thread " << thread_id_ << ")"; + oss << "\n\tMessage: " << message_; + oss << "\n\tStack trace:\n" << getStackTrace(); + full_message_ = oss.str(); + } + return full_message_.c_str(); +} + +const std::string& Exception::getFile() const { return file_; } +int Exception::getLine() const { return line_; } +const std::string& Exception::getFunction() const { return func_; } +const std::string& Exception::getMessage() const { return message_; } +std::thread::id Exception::getThreadId() const { return thread_id_; } + +std::string Exception::getCurrentTime() const { + auto now = std::chrono::system_clock::now(); + auto time = std::chrono::system_clock::to_time_t(now); + char buffer[80]; + std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", + std::localtime(&time)); + return buffer; +} + +std::string Exception::getStackTrace() const { + std::ostringstream oss; + +#ifdef _WIN32 + const int max_frames = 64; + void* frames[max_frames]; + HANDLE process = GetCurrentProcess(); + SymInitialize(process, NULL, TRUE); + + WORD num_frames = CaptureStackBackTrace(0, max_frames, frames, NULL); + std::unique_ptr symbol( + (SYMBOL_INFO*)std::calloc(sizeof(SYMBOL_INFO) + 256, 1)); + symbol->MaxNameLen = 255; + symbol->SizeOfStruct = sizeof(SYMBOL_INFO); + + for (int i = 0; i < num_frames; ++i) { + SymFromAddr(process, (DWORD64)(frames[i]), 0, symbol.get()); + oss << "\t\t" << symbol->Name << " - 0x" << std::hex << symbol->Address + << "\n"; + } +#elif defined(__APPLE__) || defined(__linux__) + const int max_frames = 64; + void* frames[max_frames]; + int num_frames = backtrace(frames, max_frames); + std::unique_ptr symbols(backtrace_symbols(frames, num_frames)); + + for (int i = 0; i < num_frames; ++i) { + char* symbol_name = nullptr; + char* offset_begin = nullptr; + char* offset_end = nullptr; + + for (char* p = symbols.get()[i]; *p; ++p) { + if (*p == '(') { + symbol_name = p; + } else if (*p == '+') { + offset_begin = p; + } else if (*p == ')') { + offset_end = p; + break; + } + } + + if (symbol_name && offset_begin && offset_end && + symbol_name < offset_begin) { + *symbol_name++ = '\0'; + *offset_begin++ = '\0'; + *offset_end = '\0'; + + int status = 0; + char* demangled_name = + abi::__cxa_demangle(symbol_name, nullptr, 0, &status); + if (status == 0) { + oss << "\t\t" << demangled_name << " +" << offset_begin + << offset_end << "\n"; + std::free(demangled_name); + } else { + oss << "\t\t" << symbol_name << " +" << offset_begin + << offset_end << "\n"; + } + } else { + oss << "\t\t" << symbols.get()[i] << "\n"; + } + } +#else + oss << "\t\tStack trace not available on this platform.\n"; +#endif + + return oss.str(); +} +} diff --git a/src/atom/error/exception.hpp b/src/atom/error/exception.hpp index a6512647..a1945e18 100644 --- a/src/atom/error/exception.hpp +++ b/src/atom/error/exception.hpp @@ -15,10 +15,52 @@ Description: Better Exception Library #ifndef ATOM_ERROR_EXCEPTION_HPP #define ATOM_ERROR_EXCEPTION_HPP +#include +#include +#include #include #include +#include namespace Atom::Error { + +class Exception : public std::exception { +public: + template + Exception(const char *file, int line, const char *func, Args &&...args) + : file_(file), + line_(line), + func_(func), + thread_id_(std::this_thread::get_id()) { + std::ostringstream oss; + ((oss << std::forward(args)), ...); + message_ = oss.str(); + } + + const char *what() const noexcept override; + + const std::string &getFile() const; + int getLine() const; + const std::string &getFunction() const; + const std::string &getMessage() const; + std::thread::id getThreadId() const; + +private: + std::string getCurrentTime() const; + + std::string getStackTrace() const; + + std::string file_; + int line_; + std::string func_; + std::string message_; + mutable std::string full_message_; + std::thread::id thread_id_; +}; + +#define THROW_EXCEPTION(...) \ + throw Exception(__FILE__, __LINE__, __func__, __VA_ARGS__) + class ObjectAlreadyExist : public std::logic_error { public: explicit ObjectAlreadyExist(const std::string &msg) diff --git a/src/atom/io/compress.cpp b/src/atom/io/compress.cpp index e726deea..2dcd4c38 100644 --- a/src/atom/io/compress.cpp +++ b/src/atom/io/compress.cpp @@ -86,16 +86,26 @@ bool compress_file(const std::string &file_name, } char buf[CHUNK]; - while (in.read(buf, CHUNK)) { + while (in.read(buf, sizeof(buf))) { if (gzwrite(out, buf, static_cast(in.gcount())) == 0) { LOG_F(ERROR, "Failed to compress file {}", file_name); - in.close(); gzclose(out); return false; } } - in.close(); + if (in.eof()) { + if (gzwrite(out, buf, static_cast(in.gcount())) == 0) { + LOG_F(ERROR, "Failed to compress file {}", file_name); + gzclose(out); + return false; + } + } else if (in.bad()) { + LOG_F(ERROR, "Failed to read input file {}", file_name); + gzclose(out); + return false; + } + gzclose(out); DLOG_F(INFO, "Compressed file {} -> {}", file_name, output_path.string()); return true; @@ -109,17 +119,25 @@ bool compress_file_(const fs::path &file, gzFile out) { } char buf[CHUNK]; - while (in.read(buf, sizeof(buf)) || in.gcount()) { + while (in.read(buf, sizeof(buf))) { if (gzwrite(out, buf, static_cast(in.gcount())) != static_cast(in.gcount())) { - in.close(); - gzclose(out); - DLOG_F(ERROR, "Failed to compress file {}", file.string()); + LOG_F(ERROR, "Failed to compress file {}", file.string()); + return false; + } + } + + if (in.eof()) { + if (gzwrite(out, buf, static_cast(in.gcount())) != + static_cast(in.gcount())) { + LOG_F(ERROR, "Failed to compress file {}", file.string()); return false; } + } else if (in.bad()) { + LOG_F(ERROR, "Failed to read file {}", file.string()); + return false; } - in.close(); return true; } @@ -149,7 +167,7 @@ bool decompress_file(const std::string &file_name, char buf[CHUNK]; int bytesRead; - while ((bytesRead = gzread(in, buf, CHUNK)) > 0) { + while ((bytesRead = gzread(in, buf, sizeof(buf))) > 0) { if (fwrite(buf, 1, bytesRead, out) != static_cast(bytesRead)) { LOG_F(ERROR, "Failed to decompress file {}", file_name); fclose(out); @@ -158,6 +176,13 @@ bool decompress_file(const std::string &file_name, } } + if (bytesRead < 0) { + LOG_F(ERROR, "Failed to read compressed file {}", file_name); + fclose(out); + gzclose(in); + return false; + } + fclose(out); gzclose(in); DLOG_F(INFO, "Decompressed file {} -> {}", file_name, output_path.string()); @@ -174,36 +199,13 @@ bool compress_folder_(const fs::path &folder_name) { for (const auto &entry : fs::recursive_directory_iterator(folder_name)) { if (entry.is_directory()) { -#ifdef _WIN32 - std::string file_name = - fmt::format("{}\\{}", entry.path().string(), "*"); -#else - std::string file_name = - fmt::format("{}/{}", entry.path().string(), "*"); -#endif - for (const auto &sub_entry : fs::directory_iterator(file_name)) { + std::string file_pattern = entry.path().string() + "/*"; + for (const auto &sub_entry : fs::directory_iterator(file_pattern)) { if (sub_entry.is_regular_file()) { - std::ifstream in(sub_entry.path(), std::ios::binary); - if (!in) { - LOG_F(ERROR, "Failed to open file {}", - sub_entry.path().string()); - continue; + if (!compress_file_(sub_entry.path(), out)) { + gzclose(out); + return false; } - - char buf[CHUNK]; - while (in.read(buf, sizeof(buf)) || in.gcount()) { - if (gzwrite(out, buf, - static_cast(in.gcount())) != - static_cast(in.gcount())) { - in.close(); - gzclose(out); - LOG_F(ERROR, "Failed to compress file {}", - sub_entry.path().string()); - return false; - } - } - - in.close(); } } } else if (entry.is_regular_file()) { @@ -213,6 +215,7 @@ bool compress_folder_(const fs::path &folder_name) { } } } + gzclose(out); DLOG_F(INFO, "Compressed folder {} -> {}", folder_name.string(), outfile_name); diff --git a/src/atom/io/file.cpp b/src/atom/io/file.cpp index 640baba1..313bc514 100644 --- a/src/atom/io/file.cpp +++ b/src/atom/io/file.cpp @@ -21,19 +21,16 @@ Description: File Manager #include #include "atom/log/loguru.hpp" +#include "atom/utils/aes.hpp" #include -namespace Atom::IO { - -bool fileExists(const std::string &filename) { - return std::filesystem::exists(filename); -} +namespace fs = std::filesystem; -FileManager::FileManager() : m_file() {} +namespace Atom::IO { bool FileManager::createFile(const std::string &filename) { - if (fileExists(filename)) { + if (fs::exists(filename)) { LOG_F(ERROR, "File \"{}\" already exists!", filename); return false; } @@ -42,15 +39,12 @@ bool FileManager::createFile(const std::string &filename) { LOG_F(ERROR, "Error creating file \"{}\"!", filename); return false; } - outfile.close(); - std::fclose( - std::fopen(filename.c_str(), "a")); // create a link to the file DLOG_F(INFO, "Created file \"{}\"", filename); return true; } bool FileManager::openFile(const std::string &filename) { - if (!fileExists(filename)) { + if (!fs::exists(filename)) { LOG_F(ERROR, "File \"{}\" does not exist!", filename); return false; } @@ -69,9 +63,8 @@ bool FileManager::readFile(std::string &contents) { LOG_F(ERROR, "No file is currently open!"); return false; } - std::stringstream buffer; - buffer << m_file.rdbuf(); - contents = buffer.str(); + contents = std::string(std::istreambuf_iterator(m_file), + std::istreambuf_iterator()); DLOG_F(INFO, "Read contents of file \"{}\"", m_filename); return true; } @@ -88,16 +81,17 @@ bool FileManager::writeFile(const std::string &contents) { bool FileManager::moveFile(const std::string &oldFilename, const std::string &newFilename) { - if (!fileExists(oldFilename)) { + if (!fs::exists(oldFilename)) { LOG_F(ERROR, "File \"{}\" does not exist!", oldFilename); return false; } - if (fileExists(newFilename)) { + if (fs::exists(newFilename)) { LOG_F(ERROR, "File \"{}\" already exists!", newFilename); return false; } - int result = std::rename(oldFilename.c_str(), newFilename.c_str()); - if (result != 0) { + std::error_code ec; + fs::rename(oldFilename, newFilename, ec); + if (ec) { LOG_F(ERROR, "Could not move file from \"{}\" to \"{}\"!", oldFilename, newFilename); return false; @@ -107,11 +101,13 @@ bool FileManager::moveFile(const std::string &oldFilename, } bool FileManager::deleteFile(const std::string &filename) { - if (!fileExists(filename)) { + if (!fs::exists(filename)) { LOG_F(ERROR, "File \"{}\" does not exist!", filename); return false; } - if (std::remove(filename.c_str()) != 0) { + std::error_code ec; + fs::remove(filename, ec); + if (ec) { LOG_F(ERROR, "Could not delete file \"{}\"!", filename); return false; } @@ -124,74 +120,24 @@ long FileManager::getFileSize() { LOG_F(ERROR, "No file is currently open!"); return -1; } - m_file.seekg(0, m_file.end); - long fileSize = m_file.tellg(); - m_file.seekg(0, m_file.beg); - if (fileSize == -1) { + auto fileSize = fs::file_size(m_filename); + if (fileSize == static_cast(-1)) { LOG_F(ERROR, "Could not get file size of \"{}\"!", m_filename); } else { - DLOG_F(INFO, "File size of \"{}\" is %ld bytes", m_filename, fileSize); - } - return fileSize; -} - -std::string FileManager::calculateSHA256() { - if (!m_file.is_open()) { - LOG_F(ERROR, "No file is currently open!"); - return ""; - } - - EVP_MD_CTX *mdContext = EVP_MD_CTX_new(); - if (mdContext == nullptr) { - LOG_F(ERROR, "Failed to create EVP_MD_CTX"); - return ""; + DLOG_F(INFO, "File size of \"{}\" is {} bytes", m_filename, fileSize); } - - if (EVP_DigestInit_ex(mdContext, EVP_sha256(), nullptr) != 1) { - LOG_F(ERROR, "Failed to initialize EVP_MD_CTX"); - EVP_MD_CTX_free(mdContext); - return ""; - } - - char buffer[1024]; - while (m_file.read(buffer, sizeof(buffer))) { - if (EVP_DigestUpdate(mdContext, buffer, sizeof(buffer)) != 1) { - LOG_F(ERROR, "Failed to update EVP_MD_CTX"); - EVP_MD_CTX_free(mdContext); - return ""; - } - } - - unsigned char hash[EVP_MAX_MD_SIZE]; - unsigned int hashLength = 0; - if (EVP_DigestFinal_ex(mdContext, hash, &hashLength) != 1) { - LOG_F(ERROR, "Failed to finalize EVP_MD_CTX"); - EVP_MD_CTX_free(mdContext); - return ""; - } - - EVP_MD_CTX_free(mdContext); - - std::stringstream sha256Stream; - sha256Stream << std::hex << std::setfill('0'); - for (unsigned int i = 0; i < hashLength; ++i) { - sha256Stream << std::setw(2) << static_cast(hash[i]); - } - - DLOG_F(INFO, "SHA-256 value for file \"{}\" is {}", m_filename, - sha256Stream.str()); - return sha256Stream.str(); + return static_cast(fileSize); } std::string FileManager::getFileDirectory(const std::string &filename) { - size_t pos = filename.find_last_of("/\\"); - if (pos == std::string::npos) { + auto parentPath = fs::path(filename).parent_path(); + if (parentPath.empty()) { LOG_F(ERROR, "Could not get directory of file \"{}\"", filename); return ""; } else { - std::string directory = filename.substr(0, pos); - DLOG_F(INFO, "Directory of file \"{}\" is \"{}\"", filename, directory); - return directory; + DLOG_F(INFO, "Directory of file \"{}\" is \"{}\"", filename, + parentPath.string()); + return parentPath.string(); } } diff --git a/src/atom/io/file.hpp b/src/atom/io/file.hpp index 000f8b68..59ebe6bc 100644 --- a/src/atom/io/file.hpp +++ b/src/atom/io/file.hpp @@ -25,11 +25,6 @@ namespace Atom::IO { */ class FileManager { public: - /** - * 默认构造函数 - */ - FileManager(); - /** * 创建文件 * @param filename 文件名 @@ -80,12 +75,6 @@ class FileManager { */ long getFileSize(); - /** - * 计算文件的MD5值 - * @return 文件的MD5值 - */ - std::string calculateSHA256(); - /** * 获取文件所在目录路径 * @param filename 文件名 @@ -98,13 +87,6 @@ class FileManager { std::string m_filename; ///< 当前打开的文件名 }; -/** - * 检查文件是否存在 - * @param filename 文件名 - * @return 文件是否存在 - */ -bool fileExists(const std::string &filename); - } // namespace Atom::IO #endif diff --git a/src/atom/io/io.cpp b/src/atom/io/io.cpp index ae8ce7e0..82079ec1 100644 --- a/src/atom/io/io.cpp +++ b/src/atom/io/io.cpp @@ -19,10 +19,15 @@ Description: IO #include #include #include +#include #include "atom/log/loguru.hpp" #include "atom/utils/string.hpp" +#if __cplusplus >= 202002L +#include +#endif + #ifdef _WIN32 #include const std::string PATH_SEPARATOR = "\\"; @@ -97,6 +102,58 @@ void createDirectory(const std::string &date, const std::string &rootDir) { DLOG_F(INFO, "Directory creation completed: {}", currentDir.string()); } +bool createDirectoriesRecursive(const fs::path& basePath, + const std::vector& subdirs, + const CreateDirectoriesOptions& options = {}) { + for (size_t i = 0; i < subdirs.size(); ++i) { + const std::string& subdir = subdirs[i]; + +#if __cplusplus >= 202002L + std::string fullPath = std::format("{}/{}", basePath.string(), subdir); +#else + std::string fullPath = basePath.string() + "/" + subdir; +#endif + + if (!options.filter(subdir)) { + if (options.verbose) { + LOG_F(INFO, "Skipping directory (filtered out): {}", fullPath); + } + continue; + } + if (fs::exists(fullPath)) { + if (!fs::is_directory(fullPath)) { + LOG_F(ERROR, "Path exists but is not a directory: {}", + fullPath); + return false; + } + if (options.verbose) { + LOG_F(INFO, "Directory already exists: {}", fullPath); + } + continue; + } + + if (!options.dryRun) { + std::error_code ec; + if (!fs::create_directories(fullPath, ec)) { + std::cerr << "Failed to create directory: " << fullPath + << ", error: " << ec.message() << std::endl; + return false; + } + } + + if (options.verbose) { + LOG_F(INFO, "Creating directory: {}", fullPath); + } + options.onCreate(fullPath); + if (options.delay > 0) { + std::this_thread::sleep_for( + std::chrono::milliseconds(options.delay)); + } + } + + return true; +} + bool removeDirectory(const std::string &path) { ATOM_IO_CHECK_ARGUMENT(path); try { diff --git a/src/atom/io/io.hpp b/src/atom/io/io.hpp index a19759a0..acb1a014 100644 --- a/src/atom/io/io.hpp +++ b/src/atom/io/io.hpp @@ -17,6 +17,7 @@ Description: IO #include #include +#include #include #include namespace fs = std::filesystem; @@ -35,6 +36,39 @@ namespace Atom::IO { */ [[nodiscard]] bool createDirectory(const std::string &path); +/** + * @brief Creates a directory with the specified path. +*/ +struct CreateDirectoriesOptions { + bool verbose = true; + bool dryRun = false; + int delay = 0; + std::function filter = [](const std::string&) { + return true; + }; + std::function onCreate = [](const std::string&) { + }; +}; + +/** + * @brief Creates a directory with the specified path. + * + * @param basePath The base path of the directory to create. + * @param subdirs The subdirectories to create. + * @param options The options for creating the directory. + * @return True if the operation was successful, false otherwise. + * + * 使用指定路径创建一个目录。 + * + * @param basePath 要创建的目录的基本路径。 + * @param subdirs 要创建的子目录。 + * @param options 创建目录的选项。 + * @return 如果操作成功,则返回true,否则返回false。 + */ +bool createDirectoriesRecursive(const fs::path& basePath, + const std::vector& subdirs, + const CreateDirectoriesOptions& options); + /** * @brief Creates a directory with the specified path. * diff --git a/src/atom/utils/aes.hpp b/src/atom/utils/aes.hpp index 4489f632..ef8d7013 100644 --- a/src/atom/utils/aes.hpp +++ b/src/atom/utils/aes.hpp @@ -25,8 +25,8 @@ namespace Atom::Utils { * @param key 加密密钥 * @return 加密后的密文数据 */ -[[nodiscard]] std::string encryptAES( - std::string_view plaintext, std::string_view key); +[[nodiscard]] std::string encryptAES(std::string_view plaintext, + std::string_view key); /** * @brief 使用AES算法对输入的密文进行解密。 @@ -35,8 +35,8 @@ namespace Atom::Utils { * @param key 解密密钥 * @return 解密后的明文数据 */ -[[nodiscard]] std::string decryptAES( - std::string_view ciphertext, std::string_view key); +[[nodiscard]] std::string decryptAES(std::string_view ciphertext, + std::string_view key); /** * @brief 使用Zlib库对输入的数据进行压缩。 @@ -54,7 +54,13 @@ namespace Atom::Utils { */ [[nodiscard]] std::string decompress(std::string_view data); -[[nodiscard]]std::string calculateSha256(std::string_view filename); +/** + * @brief 计算文件的SHA-256哈希值。 + * + * @param filename 文件名 + * @return 文件的SHA-256哈希值 + */ +[[nodiscard]] std::string calculateSha256(std::string_view filename); } // namespace Atom::Utils #endif diff --git a/src/carbon/CMakeLists.txt b/src/carbon/CMakeLists.txt index dc3466ab..317e05b8 100644 --- a/src/carbon/CMakeLists.txt +++ b/src/carbon/CMakeLists.txt @@ -94,9 +94,9 @@ list(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.git") list(APPEND CPACK_SOURCE_IGNORE_FILES ".swp") list(APPEND CPACK_SOURCE_IGNORE_FILES ".*~") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/license.txt") -set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/readme.md") -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/description.txt") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") +set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") +#set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/description.txt") set(CPACK_PACKAGE_VERSION_MAJOR 7) set(CPACK_PACKAGE_VERSION_MINOR 0) @@ -115,11 +115,11 @@ set(CPACK_RPM_PACKAGE_GROUP "Programming") set(CHAI_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}) -configure_file(Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile) +# configure_file(Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile) include(CTest) include(CPack) -include(cmake/Catch.cmake) + #include(cmake/Catch.cmake) if(NOT MINGW) find_library(READLINE_LIBRARY NAMES readline PATH /usr/lib /usr/local/lib /opt/local/lib) @@ -195,7 +195,7 @@ endif() include_directories(include) -set(Chai_INCLUDES include/Carbon/Carbon.hpp include/Carbon/Carbon_threading.hpp include/Carbon/dispatchkit/bad_boxed_cast.hpp include/Carbon/dispatchkit/bind_first.hpp include/Carbon/dispatchkit/bootstrap.hpp include/Carbon/dispatchkit/bootstrap_stl.hpp include/Carbon/dispatchkit/boxed_cast.hpp include/Carbon/dispatchkit/boxed_cast_helper.hpp include/Carbon/dispatchkit/boxed_number.hpp include/Carbon/dispatchkit/boxed_value.hpp include/Carbon/dispatchkit/dispatchkit.hpp include/Carbon/dispatchkit/type_conversions.hpp include/Carbon/dispatchkit/dynamic_object.hpp include/Carbon/dispatchkit/exception_specification.hpp include/Carbon/dispatchkit/function_call.hpp include/Carbon/dispatchkit/function_call_detail.hpp include/Carbon/dispatchkit/handle_return.hpp include/Carbon/dispatchkit/operators.hpp include/Carbon/dispatchkit/proxy_constructors.hpp include/Carbon/dispatchkit/proxy_functions.hpp include/Carbon/dispatchkit/proxy_functions_detail.hpp include/Carbon/dispatchkit/register_function.hpp include/Carbon/dispatchkit/type_info.hpp include/Carbon/language/Carbon_algebraic.hpp include/Carbon/language/Carbon_common.hpp include/Carbon/language/Carbon_engine.hpp include/Carbon/language/Carbon_eval.hpp include/Carbon/language/Carbon_parser.hpp include/Carbon/language/Carbon_prelude.hpp include/Carbon/language/Carbon_prelude_docs.hpp include/Carbon/utility/utility.hpp include/Carbon/utility/json.hpp include/Carbon/utility/json_wrap.hpp) +set(Chai_INCLUDES carbon.hpp threading.hpp command/bad_boxed_cast.hpp command/bind_first.hpp command/bootstrap.hpp command/bootstrap_stl.hpp command/boxed_cast.hpp command/boxed_cast_helper.hpp command/boxed_number.hpp command/boxed_value.hpp command/dispatchkit.hpp command/type_conversions.hpp command/dynamic_object.hpp command/exception_specification.hpp command/function_call.hpp command/function_call_detail.hpp command/handle_return.hpp command/operators.hpp command/proxy_constructors.hpp command/proxy_functions.hpp command/proxy_functions_detail.hpp command/register_function.hpp command/type_info.hpp language/algebraic.hpp language/common.hpp language/engine.hpp language/eval.hpp language/parser.hpp language/prelude.hpp language/prelude_docs.hpp utils/utility.hpp utils/json.hpp utils/json_wrap.hpp) set_source_files_properties(${Chai_INCLUDES} PROPERTIES HEADER_FILE_ONLY TRUE) @@ -237,16 +237,28 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}") -add_library(stdlib STATIC static_libs/Carbon_stdlib.cpp) -add_library(parser STATIC static_libs/Carbon_parser.cpp) +#add_library(stdlib STATIC static_libs/Carbon_stdlib.cpp) +#add_library(parser STATIC static_libs/Carbon_parser.cpp) -add_library(Carbon_stdlib-${CHAI_VERSION} MODULE src/Carbon_stdlib_module.cpp) -target_link_libraries(Carbon_stdlib-${CHAI_VERSION} ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) +#add_library(Carbon_stdlib-${CHAI_VERSION} MODULE src/Carbon_stdlib_module.cpp) +#target_link_libraries(Carbon_stdlib-${CHAI_VERSION} ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) set(Carbon_LIBS stdlib parser) -add_executable(chai src/main.cpp ${Chai_INCLUDES}) -target_link_libraries(chai ${LIBS} ${Carbon_LIBS}) +set(Carbon_SRC + command/bad_boxed_cast.cpp + command/boxed_number.cpp + command/dispatchkit.cpp + command/dynamic_object_detail.cpp + command/dynamic_object.cpp + command/proxy_functions.cpp + + language/engine.cpp +) +# We will build a static library for Carbon +add_library(carbon STATIC ${Carbon_SRC}) +# add_executable(chai src/main.cpp ${Carbon_SRC} ${Chai_INCLUDES}) +# target_link_libraries(chai ${LIBS} ${Carbon_LIBS}) add_library(Carbon INTERFACE) target_include_directories(Carbon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) @@ -268,13 +280,13 @@ endif() if(BUILD_MODULES) - add_library(test_module MODULE src/test_module.cpp) - target_link_libraries(test_module ${LIBS}) + #add_library(test_module MODULE src/test_module.cpp) + #target_link_libraries(test_module ${LIBS}) - add_library(stl_extra MODULE src/stl_extra.cpp) - target_link_libraries(stl_extra ${LIBS}) + #add_library(stl_extra MODULE src/stl_extra.cpp) + #target_link_libraries(stl_extra ${LIBS}) - set(MODULES stl_extra) + #set(MODULES stl_extra) endif() @@ -368,52 +380,7 @@ if(BUILD_TESTING) "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" ) - if(NOT UNIT_TEST_LIGHT) - add_executable(compiled_tests unittests/compiled_tests.cpp) - target_link_libraries(compiled_tests ${LIBS} ${Carbon_LIBS}) - catch_discover_tests(compiled_tests TEST_PREFIX "compiled.") - - add_executable(static_Carbon_test unittests/static_Carbon.cpp) - target_link_libraries(static_Carbon_test ${LIBS}) - add_test(NAME Static_Carbon_Test COMMAND static_Carbon_test) - - add_executable(boxed_cast_test unittests/boxed_cast_test.cpp) - target_link_libraries(boxed_cast_test ${LIBS}) - add_test(NAME Boxed_Cast_Test COMMAND boxed_cast_test) - - add_executable(type_info_test unittests/type_info_test.cpp) - target_link_libraries(type_info_test ${LIBS}) - add_test(NAME Type_Info_Test COMMAND type_info_test) - - add_executable(c_linkage_test unittests/c_linkage_test.cpp) - target_link_libraries(c_linkage_test ${LIBS} ${Carbon_LIBS}) - add_test(NAME C_Linkage_Test COMMAND c_linkage_test) - - add_executable(integer_literal_test unittests/integer_literal_test.cpp) - target_link_libraries(integer_literal_test ${LIBS} ${Carbon_LIBS}) - add_test(NAME Integer_Literal_Test COMMAND integer_literal_test) - - if(MULTITHREAD_SUPPORT_ENABLED) - add_executable(multithreaded_test unittests/multithreaded_test.cpp) - target_link_libraries(multithreaded_test ${LIBS}) - add_test(NAME Multithreaded_Test COMMAND multithreaded_test) - set_property(TEST Multithreaded_Test - PROPERTY ENVIRONMENT - "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" - "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" - ) - endif() - - add_executable(multifile_test - unittests/multifile_test_main.cpp - unittests/multifile_test_chai.cpp - unittests/multifile_test_module.cpp - ) - target_link_libraries(multifile_test ${LIBS}) - add_test(NAME MultiFile_Test COMMAND multifile_test) - - install(TARGETS test_module RUNTIME DESTINATION bin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/Carbon") - endif() + endif() @@ -424,7 +391,7 @@ if(BUILD_LIBFUZZ_TESTER) endif() -install(TARGETS chai Carbon_stdlib-${CHAI_VERSION} ${MODULES} RUNTIME DESTINATION bin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/Carbon") +# install(TARGETS chai Carbon_stdlib-${CHAI_VERSION} ${MODULES} RUNTIME DESTINATION bin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/Carbon") install(DIRECTORY include/Carbon DESTINATION include PATTERN "*.hpp" @@ -443,8 +410,8 @@ install(DIRECTORY samples DESTINATION share/Carbon PATTERN "*/.git*" EXCLUDE PATTERN "*~" EXCLUDE) -configure_file(contrib/pkgconfig/Carbon.pc.in lib/pkgconfig/Carbon.pc @ONLY) -install(FILES "${Carbon_BINARY_DIR}/lib/pkgconfig/Carbon.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +#configure_file(contrib/pkgconfig/Carbon.pc.in lib/pkgconfig/Carbon.pc @ONLY) +#install(FILES "${Carbon_BINARY_DIR}/lib/pkgconfig/Carbon.pc" +# DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") diff --git a/src/carbon/LICENSE b/src/carbon/LICENSE new file mode 100644 index 00000000..73e79394 --- /dev/null +++ b/src/carbon/LICENSE @@ -0,0 +1,31 @@ +BSD-3-Clause License + +Copyright 2009-2018 Jason Turner +Copyright 2009-2012 Jonathan Turner. + +All Rights Reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Jason Turner nor Jonathan Turner nor the + name of contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/src/carbon/command/bad_boxed_cast.cpp b/src/carbon/command/bad_boxed_cast.cpp index 2894db89..cbe9a028 100644 --- a/src/carbon/command/bad_boxed_cast.cpp +++ b/src/carbon/command/bad_boxed_cast.cpp @@ -2,15 +2,16 @@ namespace Carbon::exception { bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to, - Static_String t_what) + Static_String t_what) noexcept : from(t_from), to(&t_to), m_what(std::move(t_what)) {} -bad_boxed_cast::bad_boxed_cast(Type_Info t_from, const std::type_info &t_to) +bad_boxed_cast::bad_boxed_cast(Type_Info t_from, + const std::type_info &t_to) noexcept : from(t_from), to(&t_to), m_what("Cannot perform boxed_cast") {} -bad_boxed_cast::bad_boxed_cast(Static_String t_what) +bad_boxed_cast::bad_boxed_cast(Static_String t_what) noexcept : m_what(std::move(t_what)) {} /// \brief Description of what error occurred -const char *bad_boxed_cast::what() const { return m_what.c_str(); } +const char *bad_boxed_cast::what() const noexcept { return m_what.c_str(); } } // namespace Carbon::exception diff --git a/src/carbon/command/boxed_value.hpp b/src/carbon/command/boxed_value.hpp index e180d578..bdfbb479 100644 --- a/src/carbon/command/boxed_value.hpp +++ b/src/carbon/command/boxed_value.hpp @@ -56,7 +56,7 @@ class Boxed_Value { template static auto get(const std::shared_ptr &obj, bool t_return_value) { - return std::make_shared(detail::Get_Type_Info::get(), + return std::make_shared(Get_Type_Info::get(), Carbon::detail::Any(obj), false, obj.get(), t_return_value); } @@ -65,7 +65,7 @@ class Boxed_Value { static auto get(std::shared_ptr &&obj, bool t_return_value) { auto ptr = obj.get(); return std::make_shared( - detail::Get_Type_Info::get(), + Get_Type_Info::get(), Carbon::detail::Any(std::move(obj)), false, ptr, t_return_value); } @@ -84,7 +84,7 @@ class Boxed_Value { static auto get(std::reference_wrapper obj, bool t_return_value) { auto p = &obj.get(); return std::make_shared( - detail::Get_Type_Info::get(), + Get_Type_Info::get(), Carbon::detail::Any(std::move(obj)), true, p, t_return_value); } @@ -93,7 +93,7 @@ class Boxed_Value { static auto get(std::unique_ptr &&obj, bool t_return_value) { auto ptr = obj.get(); return std::make_shared( - detail::Get_Type_Info::get(), + Get_Type_Info::get(), Carbon::detail::Any( std::make_shared>(std::move(obj))), true, ptr, t_return_value); @@ -103,7 +103,7 @@ class Boxed_Value { static auto get(T t, bool t_return_value) { auto p = std::make_shared(std::move(t)); auto ptr = p.get(); - return std::make_shared(detail::Get_Type_Info::get(), + return std::make_shared(Get_Type_Info::get(), Carbon::detail::Any(std::move(p)), false, ptr, t_return_value); } diff --git a/src/carbon/command/dispatchkit.cpp b/src/carbon/command/dispatchkit.cpp index 4c0600da..2c9043ec 100644 --- a/src/carbon/command/dispatchkit.cpp +++ b/src/carbon/command/dispatchkit.cpp @@ -33,7 +33,8 @@ Module &Module::eval(std::string str) { return *this; } -bool Module::has_function(const Proxy_Function &new_f, std::string_view name) { +bool Module::has_function(const Proxy_Function &new_f, + std::string_view name) noexcept { return std::any_of( m_funcs.begin(), m_funcs.end(), [&](const std::pair &existing_f) { @@ -47,7 +48,7 @@ Dispatch_Function::Dispatch_Function(std::vector t_funcs) m_funcs(std::move(t_funcs)) {} bool Dispatch_Function::operator==( - const dispatch::Proxy_Function_Base &rhs) const { + const dispatch::Proxy_Function_Base &rhs) const noexcept { try { const auto &dispatch_fun = dynamic_cast(rhs); return m_funcs == dispatch_fun.m_funcs; @@ -62,7 +63,7 @@ std::vector Dispatch_Function::get_contained_functions() } int Dispatch_Function::calculate_arity( - const std::vector &t_funcs) { + const std::vector &t_funcs) noexcept { if (t_funcs.empty()) { return -1; } @@ -81,7 +82,7 @@ int Dispatch_Function::calculate_arity( bool Dispatch_Function::call_match( const Function_Params &vals, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { return std::any_of(std::begin(m_funcs), std::end(m_funcs), [&vals, &t_conversions](const Proxy_Function &f) { return f->call_match(vals, t_conversions); @@ -533,13 +534,13 @@ Dispatch_Engine::get_functions() const { return rets; } -const Type_Conversions &Dispatch_Engine::conversions() const { +const Type_Conversions &Dispatch_Engine::conversions() const noexcept { return m_conversions; } bool Dispatch_Engine::is_attribute_call( const std::vector &t_funs, const Function_Params &t_params, - bool t_has_params, const Type_Conversions_State &t_conversions) { + bool t_has_params, const Type_Conversions_State &t_conversions) noexcept { if (!t_has_params || t_params.empty()) { return false; } @@ -772,7 +773,7 @@ void Dispatch_Engine::dump_system() const { /// return true if the Boxed_Value matches the registered type by name bool Dispatch_Engine::is_type(const Boxed_Value &r, - std::string_view user_typename) const { + std::string_view user_typename) const noexcept { try { if (get_type(user_typename).bare_equal(r.get_type_info())) { return true; @@ -864,27 +865,30 @@ void Dispatch_Engine::pop_function_call() { pop_function_call(*m_stack_holder, m_conversions.conversion_saves()); } -Stack_Holder &Dispatch_Engine::get_stack_holder() { return *m_stack_holder; } +Stack_Holder &Dispatch_Engine::get_stack_holder() noexcept { + return *m_stack_holder; +} -const Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() const { +const Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() + const noexcept { return m_stack_holder->stacks.back(); } Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data( - Stack_Holder &t_holder) { + Stack_Holder &t_holder) noexcept { return t_holder.stacks.back(); } -Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() { +Dispatch_Engine::StackData &Dispatch_Engine::get_stack_data() noexcept { return m_stack_holder->stacks.back(); } -parser::Carbon_Parser_Base &Dispatch_Engine::get_parser() { +parser::Carbon_Parser_Base &Dispatch_Engine::get_parser() noexcept { return m_parser.get(); } bool Dispatch_Engine::function_less_than(const Proxy_Function &lhs, - const Proxy_Function &rhs) { + const Proxy_Function &rhs) noexcept { auto dynamic_lhs( std::dynamic_pointer_cast(lhs)); auto dynamic_rhs( @@ -1010,19 +1014,24 @@ Dispatch_State::Dispatch_State(Dispatch_Engine &t_engine) m_conversions(t_engine.conversions(), t_engine.conversions().conversion_saves()) {} -Dispatch_Engine *Dispatch_State::operator->() const { return &m_engine.get(); } +Dispatch_Engine *Dispatch_State::operator->() const noexcept { + return &m_engine.get(); +} -Dispatch_Engine &Dispatch_State::operator*() const { return m_engine.get(); } +Dispatch_Engine &Dispatch_State::operator*() const noexcept { + return m_engine.get(); +} -Stack_Holder &Dispatch_State::stack_holder() const { +Stack_Holder &Dispatch_State::stack_holder() const noexcept { return m_stack_holder.get(); } -const Type_Conversions_State &Dispatch_State::conversions() const { +const Type_Conversions_State &Dispatch_State::conversions() const noexcept { return m_conversions; } -Type_Conversions::Conversion_Saves &Dispatch_State::conversion_saves() const { +Type_Conversions::Conversion_Saves &Dispatch_State::conversion_saves() + const noexcept { return m_conversions.saves(); } diff --git a/src/carbon/command/dispatchkit.hpp b/src/carbon/command/dispatchkit.hpp index 797da10d..42a63d24 100644 --- a/src/carbon/command/dispatchkit.hpp +++ b/src/carbon/command/dispatchkit.hpp @@ -358,7 +358,7 @@ class Dispatch_Engine { void add(const Type_Info &ti, const std::string &name); /// Returns the type info for a named type - Type_Info get_type(std::string_view name, bool t_throw = true) const; + Type_Info get_type(std::string_view name, bool t_throw) const; /// Returns the registered name of a known type_info object /// compares the "bare_type_info" for the broadest possible diff --git a/src/carbon/command/dynamic_object.cpp b/src/carbon/command/dynamic_object.cpp index 33023ee6..be7e8b4b 100644 --- a/src/carbon/command/dynamic_object.cpp +++ b/src/carbon/command/dynamic_object.cpp @@ -6,13 +6,15 @@ namespace dispatch { Dynamic_Object::Dynamic_Object(std::string t_type_name) : m_type_name(std::move(t_type_name)), m_option_explicit(false) {} -bool Dynamic_Object::is_explicit() const { return m_option_explicit; } +bool Dynamic_Object::is_explicit() const noexcept { return m_option_explicit; } -void Dynamic_Object::set_explicit(const bool t_explicit) { +void Dynamic_Object::set_explicit(const bool t_explicit) noexcept { m_option_explicit = t_explicit; } -const std::string &Dynamic_Object::get_type_name() const { return m_type_name; } +const std::string &Dynamic_Object::get_type_name() const noexcept { + return m_type_name; +} const Boxed_Value &Dynamic_Object::operator[]( const std::string &t_attr_name) const { diff --git a/src/carbon/command/dynamic_object_detail.cpp b/src/carbon/command/dynamic_object_detail.cpp index d4a1db49..c011f7d2 100644 --- a/src/carbon/command/dynamic_object_detail.cpp +++ b/src/carbon/command/dynamic_object_detail.cpp @@ -32,10 +32,8 @@ Dynamic_Object_Function::Dynamic_Object_Function(std::string t_type_name, "one parameter (this)"); } -Dynamic_Object_Function &Dynamic_Object_Function::operator=( - const Dynamic_Object_Function) = delete; - -bool Dynamic_Object_Function::operator==(const Proxy_Function_Base &f) const { +bool Dynamic_Object_Function::operator==( + const Proxy_Function_Base &f) const noexcept { if (const auto *df = dynamic_cast(&f)) { return df->m_type_name == m_type_name && (*df->m_func) == (*m_func); } else { @@ -43,13 +41,13 @@ bool Dynamic_Object_Function::operator==(const Proxy_Function_Base &f) const { } } -bool Dynamic_Object_Function::is_attribute_function() const { +bool Dynamic_Object_Function::is_attribute_function() const noexcept { return m_is_attribute; } bool Dynamic_Object_Function::call_match( const Carbon::Function_Params &vals, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { if (dynamic_object_typename_match(vals, m_type_name, m_ti, t_conversions)) { return m_func->call_match(vals, t_conversions); } else { @@ -62,8 +60,9 @@ Dynamic_Object_Function::get_contained_functions() const { return {m_func}; } -Boxed_Value Dynamic_Object_Function::do_call(const Carbon::Function_Params ¶ms, - const Type_Conversions_State &t_conversions) const { +Boxed_Value Dynamic_Object_Function::do_call( + const Carbon::Function_Params ¶ms, + const Type_Conversions_State &t_conversions) const { if (dynamic_object_typename_match(params, m_type_name, m_ti, t_conversions)) { return (*m_func)(params, t_conversions); @@ -73,7 +72,8 @@ Boxed_Value Dynamic_Object_Function::do_call(const Carbon::Function_Params ¶ } bool Dynamic_Object_Function::compare_first_type( - const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const { + const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) const noexcept { return dynamic_object_typename_match(bv, m_type_name, m_ti, t_conversions); } @@ -90,7 +90,7 @@ std::vector Dynamic_Object_Function::build_param_types( bool Dynamic_Object_Function::dynamic_object_typename_match( const Boxed_Value &bv, const std::string &name, const std::unique_ptr &ti, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { if (bv.get_type_info().bare_equal(m_doti)) { try { const Dynamic_Object &d = @@ -111,7 +111,7 @@ bool Dynamic_Object_Function::dynamic_object_typename_match( bool Dynamic_Object_Function::dynamic_object_typename_match( const Carbon::Function_Params &bvs, const std::string &name, const std::unique_ptr &ti, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { if (!bvs.empty()) { return dynamic_object_typename_match(bvs[0], name, ti, t_conversions); } else { @@ -143,7 +143,7 @@ std::vector Dynamic_Object_Constructor::build_type_list( } bool Dynamic_Object_Constructor::operator==( - const Proxy_Function_Base &f) const { + const Proxy_Function_Base &f) const noexcept { const Dynamic_Object_Constructor *dc = dynamic_cast(&f); return (dc != nullptr) && dc->m_type_name == m_type_name && diff --git a/src/carbon/command/dynamic_object_detail.hpp b/src/carbon/command/dynamic_object_detail.hpp index 7d681bf3..02eb192b 100644 --- a/src/carbon/command/dynamic_object_detail.hpp +++ b/src/carbon/command/dynamic_object_detail.hpp @@ -40,11 +40,11 @@ class Dynamic_Object_Function final : public Proxy_Function_Base { public: Dynamic_Object_Function(std::string t_type_name, const Proxy_Function &t_func, - bool t_is_attribute = false); + bool t_is_attribute); Dynamic_Object_Function(std::string t_type_name, const Proxy_Function &t_func, const Type_Info &t_ti, - bool t_is_attribute = false); + bool t_is_attribute); Dynamic_Object_Function &operator=(const Dynamic_Object_Function) = delete; Dynamic_Object_Function(Dynamic_Object_Function &) = delete; diff --git a/src/carbon/command/proxy_functions.cpp b/src/carbon/command/proxy_functions.cpp index af258f35..e33a61f4 100644 --- a/src/carbon/command/proxy_functions.cpp +++ b/src/carbon/command/proxy_functions.cpp @@ -12,12 +12,12 @@ #include "proxy_functions.hpp" #include "../defines.hpp" +#include "atom/experiment/type_info.hpp" #include "boxed_cast.hpp" #include "boxed_value.hpp" #include "dynamic_object.hpp" #include "function_params.hpp" #include "proxy_functions_detail.hpp" -#include "atom/experiment/type_info.hpp" namespace Carbon { @@ -35,7 +35,7 @@ void Param_Types::push_front(const std::string &t_name, Type_Info t_ti) { update_has_types(); } -bool Param_Types::operator==(const Param_Types &t_rhs) const { +bool Param_Types::operator==(const Param_Types &t_rhs) const noexcept { return m_types == t_rhs.m_types; } @@ -91,7 +91,7 @@ std::vector Param_Types::convert( // second result: needs conversions std::pair Param_Types::match( const Function_Params &vals, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { const auto dynamic_object_type_info = user_type(); bool needs_conversion = false; @@ -139,7 +139,7 @@ std::pair Param_Types::match( } const std::vector> &Param_Types::types() - const { + const noexcept { return m_types; } @@ -168,14 +168,16 @@ Boxed_Value Proxy_Function_Base::operator()( /// function returns/takes if the function is variadic or takes no arguments /// (arity of 0 or -1), the returned value contains exactly 1 Type_Info /// object: the return type \returns the types of all parameters. -const std::vector &Proxy_Function_Base::get_param_types() const { +const std::vector &Proxy_Function_Base::get_param_types() + const noexcept { return m_types; } -bool Proxy_Function_Base::is_attribute_function() const -{ return false; } +bool Proxy_Function_Base::is_attribute_function() const noexcept { + return false; +} -bool Proxy_Function_Base::has_arithmetic_param() const { +bool Proxy_Function_Base::has_arithmetic_param() const noexcept { return m_has_arithmetic_param; } @@ -188,7 +190,7 @@ Proxy_Function_Base::get_contained_functions() const { //! to the passed in values bool Proxy_Function_Base::filter( const Function_Params &vals, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { assert(m_arity == -1 || (m_arity > 0 && static_cast(vals.size()) == m_arity)); @@ -204,11 +206,11 @@ bool Proxy_Function_Base::filter( /// \returns the number of arguments the function takes or -1 if it is /// variadic -int Proxy_Function_Base::get_arity() const { return m_arity; } +int Proxy_Function_Base::get_arity() const noexcept { return m_arity; } bool Proxy_Function_Base::compare_type_to_param( const Type_Info &ti, const Boxed_Value &bv, - const Type_Conversions_State &t_conversions) { + const Type_Conversions_State &t_conversions) noexcept { const auto boxed_value_ti = user_type(); const auto boxed_number_ti = user_type(); const auto function_ti = @@ -228,7 +230,8 @@ bool Proxy_Function_Base::compare_type_to_param( } bool Proxy_Function_Base::compare_first_type( - const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const { + const Boxed_Value &bv, + const Type_Conversions_State &t_conversions) const noexcept { /// TODO is m_types guaranteed to be at least 2?? return compare_type_to_param(m_types[1], bv, t_conversions); } @@ -248,7 +251,7 @@ Proxy_Function_Base::Proxy_Function_Base(std::vector t_types, bool Proxy_Function_Base::compare_types( const std::vector &tis, const Function_Params &bvs, - const Type_Conversions_State &t_conversions) { + const Type_Conversions_State &t_conversions) noexcept { if (tis.size() - 1 != bvs.size()) { return false; } else { @@ -276,7 +279,8 @@ Dynamic_Proxy_Function::Dynamic_Proxy_Function( // assert(t_parsenode); } -bool Dynamic_Proxy_Function::operator==(const Proxy_Function_Base &rhs) const { +bool Dynamic_Proxy_Function::operator==( + const Proxy_Function_Base &rhs) const noexcept { const Dynamic_Proxy_Function *prhs = dynamic_cast(&rhs); @@ -292,11 +296,15 @@ bool Dynamic_Proxy_Function::call_match( return call_match_internal(vals, t_conversions).first; } -bool Dynamic_Proxy_Function::has_guard() const { return bool(m_guard); } +bool Dynamic_Proxy_Function::has_guard() const noexcept { + return bool(m_guard); +} -Proxy_Function Dynamic_Proxy_Function::get_guard() const { return m_guard; } +Proxy_Function Dynamic_Proxy_Function::get_guard() const noexcept { + return m_guard; +} -bool Dynamic_Proxy_Function::has_parse_tree() const { +bool Dynamic_Proxy_Function::has_parse_tree() const noexcept { return static_cast(m_parsenode); } @@ -375,7 +383,7 @@ Bound_Function::Bound_Function(const Const_Proxy_Function &t_f, m_f->get_arity() == static_cast(m_args.size())); } -bool Bound_Function::operator==(const Proxy_Function_Base &t_f) const { +bool Bound_Function::operator==(const Proxy_Function_Base &t_f) const noexcept { return &t_f == this; } @@ -456,7 +464,7 @@ Proxy_Function_Impl_Base::Proxy_Function_Impl_Base( bool Proxy_Function_Impl_Base::call_match( const Function_Params &vals, - const Type_Conversions_State &t_conversions) const { + const Type_Conversions_State &t_conversions) const noexcept { return static_cast(vals.size()) == get_arity() && (compare_types(m_types, vals, t_conversions) && compare_types_with_cast(vals, t_conversions)); diff --git a/src/carbon/command/proxy_functions.hpp b/src/carbon/command/proxy_functions.hpp index 95283468..d3c5f2aa 100644 --- a/src/carbon/command/proxy_functions.hpp +++ b/src/carbon/command/proxy_functions.hpp @@ -230,10 +230,7 @@ class Proxy_Function_Base { virtual bool compare_first_type( const Boxed_Value &bv, - const Type_Conversions_State &t_conversions) const noexcept { - /// TODO is m_types guaranteed to be at least 2?? - return compare_type_to_param(m_types[1], bv, t_conversions); - } + const Type_Conversions_State &t_conversions) const noexcept; protected: /** @@ -315,8 +312,8 @@ class Dynamic_Proxy_Function : public Proxy_Function_Base { */ explicit Dynamic_Proxy_Function(const int t_arity, std::shared_ptr t_parsenode, - Param_Types t_param_types = Param_Types(), - Proxy_Function t_guard = Proxy_Function()); + Param_Types t_param_types, + Proxy_Function t_guard); /** * @brief Checks if two Dynamic_Proxy_Function objects are equal. diff --git a/src/carbon/command/register_function.hpp b/src/carbon/command/register_function.hpp index 70b06de8..de32bdeb 100644 --- a/src/carbon/command/register_function.hpp +++ b/src/carbon/command/register_function.hpp @@ -10,37 +10,11 @@ namespace Carbon { namespace dispatch::detail { -/** - * @brief Retrieves the first parameter from a function parameter pack. - * - * @tparam Obj The type of the object. - * @tparam Param1 The type of the first parameter. - * @tparam Rest The remaining parameter types. - * @param params The function parameters. - * @param obj The object. - * @return Param1 The first parameter value. - */ template Param1 get_first_param(Function_Params, Obj &&obj) { return static_cast(std::forward(obj)); } -/** - * @brief Internal implementation to create a callable object from a function or - * member function. - * - * @tparam Func The type of the function. - * @tparam Is_Noexcept Boolean indicating if the function is noexcept. - * @tparam Is_Member Boolean indicating if the function is a member function. - * @tparam Is_MemberObject Boolean indicating if the function is a member - * object. - * @tparam Is_Object Boolean indicating if the object is a callable object. - * @tparam Ret The return type of the function. - * @tparam Param The parameter types of the function. - * @param func The function to be made callable. - * @param fs The function signature. - * @return A Proxy_Function representing the callable object. - */ template auto make_callable_impl( @@ -78,6 +52,8 @@ auto make_callable_impl( } } +// this version peels off the function object itself from the function +// signature, when used on a callable object template auto make_callable(Func &&func, @@ -89,48 +65,65 @@ auto make_callable(Func &&func, false, true>{}); } -/** - * @brief Creates a callable object from a free function, member function, or - * data member. - * - * @tparam Func The type of the function. - * @tparam Ret The return type of the function. - * @tparam Object The type of the object. - * @tparam Param The parameter types of the function. - * @tparam Is_Noexcept Boolean indicating if the function is noexcept. - * @param func The function to be made callable. - * @param fs The function signature. - * @return A Proxy_Function representing the callable object. - */ -template -auto make_callable(Func &&func, - Function_Signature, - Is_Noexcept, false, false, true> - fs) { +template +auto make_callable( + Func &&func, Function_Signature, Is_Noexcept, + Is_Member, Is_MemberObject, false> + fs) { return make_callable_impl(std::forward(func), fs); } } // namespace dispatch::detail + +/// \brief Creates a new Proxy_Function object from a free function, member +/// function or data member \param[in] t Function / member to expose +/// +/// \b Example: +/// \code +/// int myfunction(const std::string &); +/// class MyClass +/// { +/// public: +/// void memberfunction(); +/// int memberdata; +/// }; +/// +/// Carbon::Carbon chai; +/// chai.add(fun(&myfunction), "myfunction"); +/// chai.add(fun(&MyClass::memberfunction), "memberfunction"); +/// chai.add(fun(&MyClass::memberdata), "memberdata"); +/// \endcode +/// +/// \sa \ref adding_functions template Proxy_Function fun(T &&t) { return dispatch::detail::make_callable( std::forward(t), dispatch::detail::function_signature(t)); } -/** - * @brief Creates a callable object from a free function, member function, or - * data member and binds the first parameter. - * - * @tparam T The type of the function. - * @tparam Q The type of the value to bind to the first parameter. - * @param t The function or member to expose. - * @param q The value to bind to the first parameter. - * @return A Proxy_Function representing the callable object. - */ +/// \brief Creates a new Proxy_Function object from a free function, member +/// function or data member and binds the first parameter of it \param[in] t +/// Function / member to expose \param[in] q Value to bind to first parameter +/// +/// \b Example: +/// \code +/// struct MyClass +/// { +/// void memberfunction(int); +/// }; +/// +/// MyClass obj; +/// Carbon::Carbon chai; +/// // Add function taking only one argument, an int, and permanently bound to +/// "obj" chai.add(fun(&MyClass::memberfunction, std::ref(obj)), +/// "memberfunction"); \endcode +/// +/// \sa \ref adding_functions template Proxy_Function fun(T &&t, const Q &q) { - return fun(detail::bind_first(std::forward(t), q)); + return fun(bind_first(std::forward(t), q)); } + } // namespace Carbon -#endif +#endif \ No newline at end of file diff --git a/src/carbon/command/type_conversions.hpp b/src/carbon/command/type_conversions.hpp index f8ccfbb3..9c483429 100644 --- a/src/carbon/command/type_conversions.hpp +++ b/src/carbon/command/type_conversions.hpp @@ -13,11 +13,10 @@ #include "../threading.hpp" #include "atom/experiment/sstring.hpp" +#include "atom/experiment/type_info.hpp" #include "bad_boxed_cast.hpp" #include "boxed_cast_helper.hpp" #include "boxed_value.hpp" -#include "atom/experiment/type_info.hpp" -#include "atom/experiment/sstring.hpp" namespace Carbon { namespace exception { @@ -95,7 +94,7 @@ template class Static_Caster { public: static Boxed_Value cast(const Boxed_Value &t_from) { - if (t_from.get_type_info().bare_equal(Carbon::user_type())) { + if (t_from.get_type_info().bare_equal(user_type())) { if (t_from.is_pointer()) { // Dynamic cast out the contained boxed value, which we know is // the type we want @@ -148,7 +147,7 @@ template class Dynamic_Caster { public: static Boxed_Value cast(const Boxed_Value &t_from) { - if (t_from.get_type_info().bare_equal(Carbon::user_type())) { + if (t_from.get_type_info().bare_equal(user_type())) { if (t_from.is_pointer()) { // Dynamic cast out the contained boxed value, which we know is // the type we want @@ -217,8 +216,7 @@ template class Dynamic_Conversion_Impl : public Type_Conversion_Base { public: Dynamic_Conversion_Impl() - : Type_Conversion_Base(Carbon::user_type(), - Carbon::user_type()) {} + : Type_Conversion_Base(user_type(), user_type()) {} Boxed_Value convert_down(const Boxed_Value &t_base) const override { return Dynamic_Caster::cast(t_base); @@ -233,8 +231,7 @@ template class Static_Conversion_Impl : public Type_Conversion_Base { public: Static_Conversion_Impl() - : Type_Conversion_Base(Carbon::user_type(), - Carbon::user_type()) {} + : Type_Conversion_Base(user_type(), user_type()) {} Boxed_Value convert_down(const Boxed_Value &t_base) const override { throw Carbon::exception::bad_boxed_dynamic_cast( diff --git a/src/carbon/language/engine.cpp b/src/carbon/language/engine.cpp new file mode 100644 index 00000000..ca1ff89c --- /dev/null +++ b/src/carbon/language/engine.cpp @@ -0,0 +1,565 @@ +#include "engine.hpp" + +namespace Carbon { +Boxed_Value Carbon_Basic::do_eval(const std::string &t_input, + const std::string &t_filename = "__EVAL__", + bool /* t_internal*/ = false) { + try { + const auto p = m_parser->parse(t_input, t_filename); + return p->eval(Carbon::detail::Dispatch_State(m_engine)); + } catch (Carbon::eval::detail::Return_Value &rv) { + return rv.retval; + } +} + +Boxed_Value Carbon_Basic::internal_eval_file(const std::string &t_filename) { + for (const auto &path : m_use_paths) { + try { + const auto appendedpath = path + t_filename; + return do_eval(load_file(appendedpath), appendedpath, true); + } catch (const exception::file_not_found_error &) { + // failed to load, try the next path + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } + } + + // failed to load by any name + throw exception::file_not_found_error(t_filename); +} + +Boxed_Value Carbon_Basic::internal_eval(const std::string &t_e) { + try { + return do_eval(t_e, "__EVAL__", true); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } +} + +Carbon::detail::Dispatch_Engine &Carbon_Basic::get_eval_engine() noexcept { + return m_engine; +} + +void Carbon_Basic::build_eval_system(const ModulePtr &t_lib, + const std::vector &t_opts) { + if (t_lib) { + add(t_lib); + } + + m_engine.add(fun([this]() { m_engine.dump_system(); }), "dump_system"); + m_engine.add( + fun([this](const Boxed_Value &t_bv) { m_engine.dump_object(t_bv); }), + "dump_object"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_type) { + return m_engine.is_type(t_bv, t_type); + }), + "is_type"); + m_engine.add(fun([this](const Boxed_Value &t_bv) { + return m_engine.type_name(t_bv); + }), + "type_name"); + m_engine.add(fun([this](const std::string &t_f) { + return m_engine.function_exists(t_f); + }), + "function_exists"); + m_engine.add(fun([this]() { return m_engine.get_function_objects(); }), + "get_functions"); + m_engine.add(fun([this]() { return m_engine.get_scripting_objects(); }), + "get_objects"); + + m_engine.add(dispatch::make_dynamic_proxy_function( + [this](const Function_Params &t_params) { + return m_engine.call_exists(t_params); + }), + "call_exists"); + + m_engine.add( + fun([this](const dispatch::Proxy_Function_Base &t_fun, + const std::vector &t_params) -> Boxed_Value { + Type_Conversions_State s( + this->m_engine.conversions(), + this->m_engine.conversions().conversion_saves()); + return t_fun(Function_Params{t_params}, s); + }), + "call"); + + m_engine.add(fun([this](const Type_Info &t_ti) { + return m_engine.get_type_name(t_ti); + }), + "name"); + + m_engine.add(fun([this](const std::string &t_type_name, bool t_throw) { + return m_engine.get_type(t_type_name, t_throw); + }), + "type"); + m_engine.add(fun([this](const std::string &t_type_name) { + return m_engine.get_type(t_type_name, true); + }), + "type"); + + m_engine.add( + fun([this]( + const Type_Info &t_from, const Type_Info &t_to, + const std::function &t_func) { + m_engine.add(Carbon::type_conversion(t_from, t_to, t_func)); + }), + "add_type_conversion"); + + if (std::find(t_opts.begin(), t_opts.end(), Options::No_Load_Modules) == + t_opts.end() && + std::find(t_opts.begin(), t_opts.end(), Options::Load_Modules) != + t_opts.end()) { + m_engine.add( + fun([this](const std::string &t_module, const std::string &t_file) { + load_module(t_module, t_file); + }), + "load_module"); + m_engine.add(fun([this](const std::string &t_module) { + return load_module(t_module); + }), + "load_module"); + } + + if (std::find(t_opts.begin(), t_opts.end(), Options::No_External_Scripts) == + t_opts.end() && + std::find(t_opts.begin(), t_opts.end(), Options::External_Scripts) != + t_opts.end()) { + m_engine.add( + fun([this](const std::string &t_file) { return use(t_file); }), + "use"); + m_engine.add(fun([this](const std::string &t_file) { + return internal_eval_file(t_file); + }), + "eval_file"); + } + + m_engine.add( + fun([this](const std::string &t_str) { return internal_eval(t_str); }), + "eval"); + m_engine.add(fun([this](const AST_Node &t_ast) { return eval(t_ast); }), + "eval"); + + m_engine.add(fun([this](const std::string &t_str, const bool t_dump) { + return parse(t_str, t_dump); + }), + "parse"); + m_engine.add(fun([this](const std::string &t_str) { return parse(t_str); }), + "parse"); + + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + add_global_const(t_bv, t_name); + }), + "add_global_const"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + add_global(t_bv, t_name); + }), + "add_global"); + m_engine.add( + fun([this](const Boxed_Value &t_bv, const std::string &t_name) { + set_global(t_bv, t_name); + }), + "set_global"); + + // why this unused parameter to Namespace? + m_engine.add(fun([this](const std::string &t_namespace_name) { + register_namespace([](Namespace & /*space*/) noexcept {}, + t_namespace_name); + import(t_namespace_name); + }), + "namespace"); + m_engine.add(fun([this](const std::string &t_namespace_name) { + import(t_namespace_name); + }), + "import"); +} + +bool Carbon_Basic::skip_bom(std::ifstream &infile) { + size_t bytes_needed = 3; + char buffer[3]; + + memset(buffer, '\0', bytes_needed); + + infile.read(buffer, static_cast(bytes_needed)); + + if ((buffer[0] == '\xef') && (buffer[1] == '\xbb') && + (buffer[2] == '\xbf')) { + infile.seekg(3); + return true; + } + + infile.seekg(0); + + return false; +} + +std::string Carbon_Basic::load_file(const std::string &t_filename) { + std::ifstream infile(t_filename.c_str(), + std::ios::in | std::ios::ate | std::ios::binary); + + if (!infile.is_open()) { + throw Carbon::exception::file_not_found_error(t_filename); + } + + auto size = infile.tellg(); + infile.seekg(0, std::ios::beg); + + assert(size >= 0); + + if (skip_bom(infile)) { + size -= 3; // decrement the BOM size from file size, otherwise + // we'll get parsing errors + assert(size >= 0); // and check if there's more text + } + + if (size == std::streampos(0)) { + return std::string(); + } else { + std::vector v(static_cast(size)); + infile.read(&v[0], static_cast(size)); + return std::string(v.begin(), v.end()); + } +} + +std::vector ensure_minimum_path_vec( + std::vector paths) { + if (paths.empty()) { + return {""}; + } else { + return paths; + } +} + +Carbon_Basic::Carbon_Basic( + const ModulePtr &t_lib, + std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = Carbon::default_options()) + : m_module_paths(ensure_minimum_path_vec(std::move(t_module_paths))), + m_use_paths(ensure_minimum_path_vec(std::move(t_use_paths))), + m_parser(std::move(parser)), + m_engine(*m_parser) { +#if !defined(CARBON_NO_DYNLOAD) && defined(_POSIX_VERSION) && \ + !defined(__CYGWIN__) + // If on Unix, add the path of the current executable to the module + // search path as windows would do + + union cast_union { + Boxed_Value (Carbon_Basic::*in_ptr)(const std::string &); + void *out_ptr; + }; + + Dl_info rInfo; + memset(&rInfo, 0, sizeof(rInfo)); + cast_union u; + u.in_ptr = &Carbon_Basic::use; + if ((dladdr(static_cast(u.out_ptr), &rInfo) != 0) && + (rInfo.dli_fname != nullptr)) { + std::string dllpath(rInfo.dli_fname); + const size_t lastslash = dllpath.rfind('/'); + if (lastslash != std::string::npos) { + dllpath.erase(lastslash); + } + + // Let's see if this is a link that we should expand + std::vector buf(2048); + const auto pathlen = + readlink(dllpath.c_str(), &buf.front(), buf.size()); + if (pathlen > 0 && static_cast(pathlen) < buf.size()) { + dllpath = std::string(&buf.front(), static_cast(pathlen)); + } + + m_module_paths.insert(m_module_paths.begin(), dllpath + "/"); + } +#endif + build_eval_system(t_lib, t_opts); +} + +#ifndef CARBON_NO_DYNLOAD +Carbon_Basic::Carbon_Basic( + std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = Carbon::default_options()) + : Carbon_Basic({}, std::move(parser), t_module_paths, t_use_paths, t_opts) { + try { + // attempt to load the stdlib + load_module("stdlib-" + Build_Info::version()); + } catch (const exception::load_module_error &t_err) { + std::cout + << "An error occurred while trying to load the chaiscript " + "standard library.\n" + "\n" + "You must either provide a standard library, or compile it " + "in.\n" + "For an example of compiling the standard library in,\n" + "see: https://gist.github.com/lefticus/9456197\n" + "Compiling the stdlib in is the recommended and MOST " + "SUPPORTED method.\n" + "\n\n" + << t_err.what(); + throw; + } +} +#else // CARBON_NO_DYNLOAD +Carbon_Basic::Carbon_Basic(std::unique_ptr &&parser, + std::vector t_module_paths = {}, + std::vector t_use_paths = {}, + const std::vector &t_opts = + Carbon::default_options()) = delete; +#endif + +parser::Carbon_Parser_Base &Carbon_Basic::get_parser() noexcept { + return *m_parser; +} + +const Boxed_Value Carbon_Basic::eval(const AST_Node &t_ast) { + try { + return t_ast.eval(Carbon::detail::Dispatch_State(m_engine)); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } +} + +AST_NodePtr Carbon_Basic::parse(const std::string &t_input, + const bool t_debug_print) { + auto ast = m_parser->parse(t_input, "PARSE"); + if (t_debug_print) { + m_parser->debug_print(*ast); + } + return ast; +} + +std::string Carbon_Basic::get_type_name(const Type_Info &ti) const { + return m_engine.get_type_name(ti); +} + +Boxed_Value Carbon_Basic::use(const std::string &t_filename) { + for (const auto &path : m_use_paths) { + const auto appendedpath = path + t_filename; + try { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + Boxed_Value retval; + + if (m_used_files.count(appendedpath) == 0) { + l2.unlock(); + retval = eval_file(appendedpath); + l2.lock(); + m_used_files.insert(appendedpath); + } + + return retval; // return, we loaded it, or it was already + // loaded + } catch (const exception::file_not_found_error &e) { + if (e.filename != appendedpath) { + // a nested file include failed + throw; + } + // failed to load, try the next path + } + } + + // failed to load by any name + throw exception::file_not_found_error(t_filename); +} + +Carbon_Basic &Carbon_Basic::add_global_const(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.add_global_const(t_bv, t_name); + return *this; +} + +Carbon_Basic &Carbon_Basic::add_global(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.add_global(t_bv, t_name); + return *this; +} + +Carbon_Basic &Carbon_Basic::set_global(const Boxed_Value &t_bv, + const std::string &t_name) { + Name_Validator::validate_object_name(t_name); + m_engine.set_global(t_bv, t_name); + return *this; +} + +Carbon_Basic::State Carbon_Basic::get_state() const { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + State s; + s.used_files = m_used_files; + s.engine_state = m_engine.get_state(); + s.active_loaded_modules = m_active_loaded_modules; + return s; +} + +void Carbon_Basic::set_state(const State &t_state) { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + Carbon::detail::threading::shared_lock< + Carbon::detail::threading::shared_mutex> + l2(m_mutex); + + m_used_files = t_state.used_files; + m_active_loaded_modules = t_state.active_loaded_modules; + m_engine.set_state(t_state.engine_state); +} + +std::map Carbon_Basic::get_locals() const { + return m_engine.get_locals(); +} + +void Carbon_Basic::set_locals( + const std::map &t_locals) { + m_engine.set_locals(t_locals); +} + +Carbon_Basic &Carbon_Basic::add(const Type_Conversion &d) { + m_engine.add(d); + return *this; +} + +Carbon_Basic &Carbon_Basic::add(const ModulePtr &t_p) { + t_p->apply(*this, this->get_eval_engine()); + return *this; +} + +std::string Carbon_Basic::load_module(const std::string &t_module_name) { +#ifdef CARBON_NO_DYNLOAD + throw Carbon::exception::load_module_error( + "Loadable module support was disabled (CARBON_NO_DYNLOAD)"); +#else + std::vector errors; + std::string version_stripped_name = t_module_name; + size_t version_pos = + version_stripped_name.find("-" + Build_Info::version()); + if (version_pos != std::string::npos) { + version_stripped_name.erase(version_pos); + } + + std::vector prefixes{"lib", "cyg", ""}; + + std::vector postfixes{".dll", ".so", ".bundle", ""}; + + for (auto &elem : m_module_paths) { + for (auto &prefix : prefixes) { + for (auto &postfix : postfixes) { + try { + const auto name = elem + prefix + t_module_name + postfix; + // std::cerr << "trying location: " << name << '\n'; + load_module(version_stripped_name, name); + return name; + } catch (const Carbon::exception::load_module_error &e) { + // std::cerr << "error: " << e.what() << '\n'; + errors.push_back(e); + // Try next set + } + } + } + } + + throw Carbon::exception::load_module_error(t_module_name, errors); +#endif +} + +void Carbon_Basic::load_module(const std::string &t_module_name, + const std::string &t_filename) { + Carbon::detail::threading::lock_guard< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (m_loaded_modules.count(t_module_name) == 0) { + detail::Loadable_Module_Ptr lm( + new detail::Loadable_Module(t_module_name, t_filename)); + m_loaded_modules[t_module_name] = lm; + m_active_loaded_modules.insert(t_module_name); + add(lm->m_moduleptr); + } else if (m_active_loaded_modules.count(t_module_name) == 0) { + m_active_loaded_modules.insert(t_module_name); + add(m_loaded_modules[t_module_name]->m_moduleptr); + } +} + +Boxed_Value Carbon_Basic::operator()( + const std::string &t_script, + const Exception_Handler &t_handler = Exception_Handler()) { + return eval(t_script, t_handler); +} + +Boxed_Value Carbon_Basic::eval( + const std::string &t_input, + const Exception_Handler &t_handler, + const std::string &t_filename) { + try { + return do_eval(t_input, t_filename); + } catch (Boxed_Value &bv) { + if (t_handler) { + t_handler->handle(bv, m_engine); + } + throw; + } +} + +Boxed_Value Carbon_Basic::eval_file( + const std::string &t_filename, + const Exception_Handler &t_handler) { + return eval(load_file(t_filename), t_handler, t_filename); +} + +void Carbon_Basic::import(const std::string &t_namespace_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (m_engine.get_scripting_objects().count(t_namespace_name)) { + throw std::runtime_error("Namespace: " + t_namespace_name + + " was already defined"); + } else if (m_namespace_generators.count(t_namespace_name)) { + m_engine.add_global( + var(std::ref(m_namespace_generators[t_namespace_name]())), + t_namespace_name); + } else { + throw std::runtime_error("No registered namespace: " + + t_namespace_name); + } +} + +void Carbon_Basic::register_namespace( + const std::function &t_namespace_generator, + const std::string &t_namespace_name) { + Carbon::detail::threading::unique_lock< + Carbon::detail::threading::recursive_mutex> + l(m_use_mutex); + + if (!m_namespace_generators.count(t_namespace_name)) { + // contain the namespace object memory within the + // m_namespace_generators map + m_namespace_generators.emplace( + std::make_pair(t_namespace_name, + [=, space = Namespace()]() mutable -> Namespace & { + t_namespace_generator(space); + return space; + })); + } else { + throw std::runtime_error("Namespace: " + t_namespace_name + + " was already registered."); + } +} + +} // namespace Carbon diff --git a/src/carbon/language/engine.hpp b/src/carbon/language/engine.hpp index de62852c..874c2c6d 100644 --- a/src/carbon/language/engine.hpp +++ b/src/carbon/language/engine.hpp @@ -15,14 +15,14 @@ #include #include -#include "../defines.hpp" -#include "../threading.hpp" #include "../command/boxed_cast_helper.hpp" #include "../command/boxed_value.hpp" #include "../command/dispatchkit.hpp" #include "../command/proxy_functions.hpp" #include "../command/register_function.hpp" #include "../command/type_conversions.hpp" +#include "../defines.hpp" +#include "../threading.hpp" #include "common.hpp" #if defined(__linux__) || defined(__unix__) || defined(__APPLE__) || \ @@ -76,247 +76,30 @@ class Carbon_Basic { /// Evaluates the given string in by parsing it and running the results /// through the evaluator Boxed_Value do_eval(const std::string &t_input, - const std::string &t_filename = "__EVAL__", - bool /* t_internal*/ = false) { - try { - const auto p = m_parser->parse(t_input, t_filename); - return p->eval(Carbon::detail::Dispatch_State(m_engine)); - } catch (Carbon::eval::detail::Return_Value &rv) { - return rv.retval; - } - } + const std::string &t_filename, bool /* t_internal*/); /// Evaluates the given file and looks in the 'use' paths - Boxed_Value internal_eval_file(const std::string &t_filename) { - for (const auto &path : m_use_paths) { - try { - const auto appendedpath = path + t_filename; - return do_eval(load_file(appendedpath), appendedpath, true); - } catch (const exception::file_not_found_error &) { - // failed to load, try the next path - } catch (const exception::eval_error &t_ee) { - throw Boxed_Value(t_ee); - } - } - - // failed to load by any name - throw exception::file_not_found_error(t_filename); - } + Boxed_Value internal_eval_file(const std::string &t_filename); /// Evaluates the given string, used during eval() inside of a script - Boxed_Value internal_eval(const std::string &t_e) { - try { - return do_eval(t_e, "__EVAL__", true); - } catch (const exception::eval_error &t_ee) { - throw Boxed_Value(t_ee); - } - } + Boxed_Value internal_eval(const std::string &t_e); /// Returns the current evaluation m_engine - Carbon::detail::Dispatch_Engine &get_eval_engine() noexcept { - return m_engine; - } + Carbon::detail::Dispatch_Engine &get_eval_engine() noexcept; /// Builds all the requirements for ChaiScript, including its evaluator and /// a run of its prelude. void build_eval_system(const ModulePtr &t_lib, - const std::vector &t_opts) { - if (t_lib) { - add(t_lib); - } - - m_engine.add(fun([this]() { m_engine.dump_system(); }), "dump_system"); - m_engine.add(fun([this](const Boxed_Value &t_bv) { - m_engine.dump_object(t_bv); - }), - "dump_object"); - m_engine.add( - fun([this](const Boxed_Value &t_bv, const std::string &t_type) { - return m_engine.is_type(t_bv, t_type); - }), - "is_type"); - m_engine.add(fun([this](const Boxed_Value &t_bv) { - return m_engine.type_name(t_bv); - }), - "type_name"); - m_engine.add(fun([this](const std::string &t_f) { - return m_engine.function_exists(t_f); - }), - "function_exists"); - m_engine.add(fun([this]() { return m_engine.get_function_objects(); }), - "get_functions"); - m_engine.add(fun([this]() { return m_engine.get_scripting_objects(); }), - "get_objects"); - - m_engine.add(dispatch::make_dynamic_proxy_function( - [this](const Function_Params &t_params) { - return m_engine.call_exists(t_params); - }), - "call_exists"); - - m_engine.add( - fun([this]( - const dispatch::Proxy_Function_Base &t_fun, - const std::vector &t_params) -> Boxed_Value { - Type_Conversions_State s( - this->m_engine.conversions(), - this->m_engine.conversions().conversion_saves()); - return t_fun(Function_Params{t_params}, s); - }), - "call"); - - m_engine.add(fun([this](const Type_Info &t_ti) { - return m_engine.get_type_name(t_ti); - }), - "name"); - - m_engine.add(fun([this](const std::string &t_type_name, bool t_throw) { - return m_engine.get_type(t_type_name, t_throw); - }), - "type"); - m_engine.add(fun([this](const std::string &t_type_name) { - return m_engine.get_type(t_type_name, true); - }), - "type"); - - m_engine.add( - fun([this](const Type_Info &t_from, const Type_Info &t_to, - const std::function - &t_func) { - m_engine.add(Carbon::type_conversion(t_from, t_to, t_func)); - }), - "add_type_conversion"); - - if (std::find(t_opts.begin(), t_opts.end(), Options::No_Load_Modules) == - t_opts.end() && - std::find(t_opts.begin(), t_opts.end(), Options::Load_Modules) != - t_opts.end()) { - m_engine.add(fun([this](const std::string &t_module, - const std::string &t_file) { - load_module(t_module, t_file); - }), - "load_module"); - m_engine.add(fun([this](const std::string &t_module) { - return load_module(t_module); - }), - "load_module"); - } - - if (std::find(t_opts.begin(), t_opts.end(), - Options::No_External_Scripts) == t_opts.end() && - std::find(t_opts.begin(), t_opts.end(), - Options::External_Scripts) != t_opts.end()) { - m_engine.add( - fun([this](const std::string &t_file) { return use(t_file); }), - "use"); - m_engine.add(fun([this](const std::string &t_file) { - return internal_eval_file(t_file); - }), - "eval_file"); - } - - m_engine.add(fun([this](const std::string &t_str) { - return internal_eval(t_str); - }), - "eval"); - m_engine.add(fun([this](const AST_Node &t_ast) { return eval(t_ast); }), - "eval"); - - m_engine.add(fun([this](const std::string &t_str, const bool t_dump) { - return parse(t_str, t_dump); - }), - "parse"); - m_engine.add( - fun([this](const std::string &t_str) { return parse(t_str); }), - "parse"); - - m_engine.add( - fun([this](const Boxed_Value &t_bv, const std::string &t_name) { - add_global_const(t_bv, t_name); - }), - "add_global_const"); - m_engine.add( - fun([this](const Boxed_Value &t_bv, const std::string &t_name) { - add_global(t_bv, t_name); - }), - "add_global"); - m_engine.add( - fun([this](const Boxed_Value &t_bv, const std::string &t_name) { - set_global(t_bv, t_name); - }), - "set_global"); - - // why this unused parameter to Namespace? - m_engine.add(fun([this](const std::string &t_namespace_name) { - register_namespace( - [](Namespace & /*space*/) noexcept {}, - t_namespace_name); - import(t_namespace_name); - }), - "namespace"); - m_engine.add(fun([this](const std::string &t_namespace_name) { - import(t_namespace_name); - }), - "import"); - } + const std::vector &t_opts); /// Skip BOM at the beginning of file - static bool skip_bom(std::ifstream &infile) { - size_t bytes_needed = 3; - char buffer[3]; - - memset(buffer, '\0', bytes_needed); - - infile.read(buffer, static_cast(bytes_needed)); - - if ((buffer[0] == '\xef') && (buffer[1] == '\xbb') && - (buffer[2] == '\xbf')) { - infile.seekg(3); - return true; - } - - infile.seekg(0); - - return false; - } + static bool skip_bom(std::ifstream &infile); /// Helper function for loading a file - static std::string load_file(const std::string &t_filename) { - std::ifstream infile(t_filename.c_str(), - std::ios::in | std::ios::ate | std::ios::binary); - - if (!infile.is_open()) { - throw Carbon::exception::file_not_found_error(t_filename); - } - - auto size = infile.tellg(); - infile.seekg(0, std::ios::beg); - - assert(size >= 0); - - if (skip_bom(infile)) { - size -= 3; // decrement the BOM size from file size, otherwise - // we'll get parsing errors - assert(size >= 0); // and check if there's more text - } - - if (size == std::streampos(0)) { - return std::string(); - } else { - std::vector v(static_cast(size)); - infile.read(&v[0], static_cast(size)); - return std::string(v.begin(), v.end()); - } - } + static std::string load_file(const std::string &t_filename); std::vector ensure_minimum_path_vec( - std::vector paths) { - if (paths.empty()) { - return {""}; - } else { - return paths; - } - } + std::vector paths); public: /// \brief Virtual destructor for ChaiScript @@ -328,51 +111,10 @@ class Carbon_Basic { /// load a binary module \param[in] t_usepaths Vector of paths to search /// when attempting to "use" an included ChaiScript file Carbon_Basic(const ModulePtr &t_lib, - std::unique_ptr &&parser, - std::vector t_module_paths = {}, - std::vector t_use_paths = {}, - const std::vector &t_opts = - Carbon::default_options()) - : m_module_paths(ensure_minimum_path_vec(std::move(t_module_paths))), - m_use_paths(ensure_minimum_path_vec(std::move(t_use_paths))), - m_parser(std::move(parser)), - m_engine(*m_parser) { -#if !defined(CARBON_NO_DYNLOAD) && defined(_POSIX_VERSION) && \ - !defined(__CYGWIN__) - // If on Unix, add the path of the current executable to the module - // search path as windows would do - - union cast_union { - Boxed_Value (Carbon_Basic::*in_ptr)(const std::string &); - void *out_ptr; - }; - - Dl_info rInfo; - memset(&rInfo, 0, sizeof(rInfo)); - cast_union u; - u.in_ptr = &Carbon_Basic::use; - if ((dladdr(static_cast(u.out_ptr), &rInfo) != 0) && - (rInfo.dli_fname != nullptr)) { - std::string dllpath(rInfo.dli_fname); - const size_t lastslash = dllpath.rfind('/'); - if (lastslash != std::string::npos) { - dllpath.erase(lastslash); - } - - // Let's see if this is a link that we should expand - std::vector buf(2048); - const auto pathlen = - readlink(dllpath.c_str(), &buf.front(), buf.size()); - if (pathlen > 0 && static_cast(pathlen) < buf.size()) { - dllpath = - std::string(&buf.front(), static_cast(pathlen)); - } - - m_module_paths.insert(m_module_paths.begin(), dllpath + "/"); - } -#endif - build_eval_system(t_lib, t_opts); - } + std::unique_ptr &&parser, + std::vector t_module_paths, + std::vector t_use_paths, + const std::vector &t_opts); #ifndef CARBON_NO_DYNLOAD /// \brief Constructor for ChaiScript. @@ -383,64 +125,24 @@ class Carbon_Basic { /// \param[in] t_modulepaths Vector of paths to search when attempting to /// load a binary module \param[in] t_usepaths Vector of paths to search /// when attempting to "use" an included ChaiScript file - explicit Carbon_Basic( - std::unique_ptr &&parser, - std::vector t_module_paths = {}, - std::vector t_use_paths = {}, - const std::vector &t_opts = - Carbon::default_options()) - : Carbon_Basic({}, std::move(parser), t_module_paths, t_use_paths, - t_opts) { - try { - // attempt to load the stdlib - load_module("stdlib-" + Build_Info::version()); - } catch (const exception::load_module_error &t_err) { - std::cout - << "An error occurred while trying to load the chaiscript " - "standard library.\n" - "\n" - "You must either provide a standard library, or compile it " - "in.\n" - "For an example of compiling the standard library in,\n" - "see: https://gist.github.com/lefticus/9456197\n" - "Compiling the stdlib in is the recommended and MOST " - "SUPPORTED method.\n" - "\n\n" - << t_err.what(); - throw; - } - } + explicit Carbon_Basic(std::unique_ptr &&parser, + std::vector t_module_paths, + std::vector t_use_paths, + const std::vector &t_opts); #else // CARBON_NO_DYNLOAD - explicit Carbon_Basic( - std::unique_ptr &&parser, - std::vector t_module_paths = {}, - std::vector t_use_paths = {}, - const std::vector &t_opts = - Carbon::default_options()) = delete; + explicit Carbon_Basic(std::unique_ptr &&parser, + std::vector t_module_paths, + std::vector t_use_paths, + const std::vector &t_opts) = delete; #endif - parser::Carbon_Parser_Base &get_parser() noexcept { return *m_parser; } + parser::Carbon_Parser_Base &get_parser() noexcept; - const Boxed_Value eval(const AST_Node &t_ast) { - try { - return t_ast.eval(Carbon::detail::Dispatch_State(m_engine)); - } catch (const exception::eval_error &t_ee) { - throw Boxed_Value(t_ee); - } - } + const Boxed_Value eval(const AST_Node &t_ast); - AST_NodePtr parse(const std::string &t_input, - const bool t_debug_print = false) { - auto ast = m_parser->parse(t_input, "PARSE"); - if (t_debug_print) { - m_parser->debug_print(*ast); - } - return ast; - } + AST_NodePtr parse(const std::string &t_input, const bool t_debug_print = false); - std::string get_type_name(const Type_Info &ti) const { - return m_engine.get_type_name(ti); - } + std::string get_type_name(const Type_Info &ti) const; template std::string get_type_name() const { @@ -452,40 +154,7 @@ class Carbon_Basic { /// searched for the requested file. /// /// \param[in] t_filename Filename to load and evaluate - Boxed_Value use(const std::string &t_filename) { - for (const auto &path : m_use_paths) { - const auto appendedpath = path + t_filename; - try { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::shared_mutex> - l2(m_mutex); - - Boxed_Value retval; - - if (m_used_files.count(appendedpath) == 0) { - l2.unlock(); - retval = eval_file(appendedpath); - l2.lock(); - m_used_files.insert(appendedpath); - } - - return retval; // return, we loaded it, or it was already - // loaded - } catch (const exception::file_not_found_error &e) { - if (e.filename != appendedpath) { - // a nested file include failed - throw; - } - // failed to load, try the next path - } - } - - // failed to load by any name - throw exception::file_not_found_error(t_filename); - } + Boxed_Value use(const std::string &t_filename); /// \brief Adds a constant object that is available in all contexts and to /// all threads \param[in] t_bv Boxed_Value to add as a global \param[in] @@ -493,11 +162,7 @@ class Carbon_Basic { /// Carbon::exception::global_non_const If t_bv is not a constant object /// \sa Boxed_Value::is_const Carbon_Basic &add_global_const(const Boxed_Value &t_bv, - const std::string &t_name) { - Name_Validator::validate_object_name(t_name); - m_engine.add_global_const(t_bv, t_name); - return *this; - } + const std::string &t_name); /// \brief Adds a mutable object that is available in all contexts and to /// all threads \param[in] t_bv Boxed_Value to add as a global \param[in] @@ -506,18 +171,10 @@ class Carbon_Basic { /// ChaiScript is thread-safe but provides no threading locking /// mechanism to the script Carbon_Basic &add_global(const Boxed_Value &t_bv, - const std::string &t_name) { - Name_Validator::validate_object_name(t_name); - m_engine.add_global(t_bv, t_name); - return *this; - } + const std::string &t_name); Carbon_Basic &set_global(const Boxed_Value &t_bv, - const std::string &t_name) { - Name_Validator::validate_object_name(t_name); - m_engine.set_global(t_bv, t_name); - return *this; - } + const std::string &t_name); /// \brief Represents the current state of the ChaiScript system. State and /// be saved and restored \warning State object does not contain the user @@ -547,20 +204,7 @@ class Carbon_Basic { /// Carbon::ChaiScript chai; /// Carbon::ChaiScript::State s = chai.get_state(); // represents /// bootstrapped initial state \endcode - State get_state() const { - Carbon::detail::threading::lock_guard< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l2(m_mutex); - - State s; - s.used_files = m_used_files; - s.engine_state = m_engine.get_state(); - s.active_loaded_modules = m_active_loaded_modules; - return s; - } + State get_state() const; /// \brief Sets the state of the system /// @@ -576,24 +220,11 @@ class Carbon_Basic { /// chai.add(Carbon::fun(&somefunction), "somefunction"); /// chai.set_state(s); // restore initial state, which does not have the /// recently added "somefunction" \endcode - void set_state(const State &t_state) { - Carbon::detail::threading::lock_guard< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - Carbon::detail::threading::shared_lock< - Carbon::detail::threading::shared_mutex> - l2(m_mutex); - - m_used_files = t_state.used_files; - m_active_loaded_modules = t_state.active_loaded_modules; - m_engine.set_state(t_state.engine_state); - } + void set_state(const State &t_state); /// \returns All values in the local thread state, added through the add() /// function - std::map get_locals() const { - return m_engine.get_locals(); - } + std::map get_locals() const; /// \brief Sets all of the locals for the current thread state. /// @@ -601,9 +232,7 @@ class Carbon_Basic { /// current state with /// /// Any existing locals are removed and the given set of variables is added - void set_locals(const std::map &t_locals) { - m_engine.set_locals(t_locals); - } + void set_locals(const std::map &t_locals); /// \brief Adds a type, function or object to ChaiScript. Objects are added /// to the local thread state. \param[in] t_t Item to add \param[in] t_name @@ -635,18 +264,12 @@ class Carbon_Basic { /// Carbon::ChaiScript chai; /// chai.add(Carbon::base_class()); \endcode - Carbon_Basic &add(const Type_Conversion &d) { - m_engine.add(d); - return *this; - } + Carbon_Basic &add(const Type_Conversion &d); /// \brief Adds all elements of a module to ChaiScript runtime /// \param[in] t_p The module to add. /// \sa Carbon::Module - Carbon_Basic &add(const ModulePtr &t_p) { - t_p->apply(*this, this->get_eval_engine()); - return *this; - } + Carbon_Basic &add(const ModulePtr &t_p); /// \brief Load a binary module from a dynamic library. Works on platforms /// that support @@ -664,45 +287,7 @@ class Carbon_Basic { /// /// \throw Carbon::exception::load_module_error In the event that no /// matching module can be found. - std::string load_module(const std::string &t_module_name) { -#ifdef CARBON_NO_DYNLOAD - throw Carbon::exception::load_module_error( - "Loadable module support was disabled (CARBON_NO_DYNLOAD)"); -#else - std::vector errors; - std::string version_stripped_name = t_module_name; - size_t version_pos = - version_stripped_name.find("-" + Build_Info::version()); - if (version_pos != std::string::npos) { - version_stripped_name.erase(version_pos); - } - - std::vector prefixes{"lib", "cyg", ""}; - - std::vector postfixes{".dll", ".so", ".bundle", ""}; - - for (auto &elem : m_module_paths) { - for (auto &prefix : prefixes) { - for (auto &postfix : postfixes) { - try { - const auto name = - elem + prefix + t_module_name + postfix; - // std::cerr << "trying location: " << name << '\n'; - load_module(version_stripped_name, name); - return name; - } catch ( - const Carbon::exception::load_module_error &e) { - // std::cerr << "error: " << e.what() << '\n'; - errors.push_back(e); - // Try next set - } - } - } - } - - throw Carbon::exception::load_module_error(t_module_name, errors); -#endif - } + std::string load_module(const std::string &t_module_name); /// \brief Load a binary module from a dynamic library. Works on platforms /// that support @@ -714,22 +299,7 @@ class Carbon_Basic { /// /// \sa ChaiScript::load_module(const std::string &t_module_name) void load_module(const std::string &t_module_name, - const std::string &t_filename) { - Carbon::detail::threading::lock_guard< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - - if (m_loaded_modules.count(t_module_name) == 0) { - detail::Loadable_Module_Ptr lm( - new detail::Loadable_Module(t_module_name, t_filename)); - m_loaded_modules[t_module_name] = lm; - m_active_loaded_modules.insert(t_module_name); - add(lm->m_moduleptr); - } else if (m_active_loaded_modules.count(t_module_name) == 0) { - m_active_loaded_modules.insert(t_module_name); - add(m_loaded_modules[t_module_name]->m_moduleptr); - } - } + const std::string &t_filename); /// \brief Evaluates a string. Equivalent to ChaiScript::eval. /// @@ -741,11 +311,8 @@ class Carbon_Basic { /// /// \throw Carbon::exception::eval_error In the case that evaluation /// fails. - Boxed_Value operator()( - const std::string &t_script, - const Exception_Handler &t_handler = Exception_Handler()) { - return eval(t_script, t_handler); - } + Boxed_Value operator()(const std::string &t_script, + const Exception_Handler &t_handler); /// \brief Evaluates a string and returns a typesafe result. /// @@ -790,16 +357,7 @@ class Carbon_Basic { /// \throw exception::eval_error In the case that evaluation fails. Boxed_Value eval(const std::string &t_input, const Exception_Handler &t_handler = Exception_Handler(), - const std::string &t_filename = "__EVAL__") { - try { - return do_eval(t_input, t_filename); - } catch (Boxed_Value &bv) { - if (t_handler) { - t_handler->handle(bv, m_engine); - } - throw; - } - } + const std::string &t_filename = "__EVAL__"); /// \brief Loads the file specified by filename, evaluates it, and returns /// the result. \param[in] t_filename File to load and parse. \param[in] @@ -808,9 +366,7 @@ class Carbon_Basic { /// Carbon::exception::eval_error In the case that evaluation fails. Boxed_Value eval_file( const std::string &t_filename, - const Exception_Handler &t_handler = Exception_Handler()) { - return eval(load_file(t_filename), t_handler, t_filename); - } + const Exception_Handler &t_handler = Exception_Handler()); /// \brief Loads the file specified by filename, evaluates it, and returns /// the type safe result. \tparam T Type to extract from the result value of @@ -831,23 +387,7 @@ class Carbon_Basic { /// ChaiScript instance. \param[in] t_namespace_name Name of the namespace /// to import. \throw std::runtime_error In the case that the namespace name /// was never registered. - void import(const std::string &t_namespace_name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - - if (m_engine.get_scripting_objects().count(t_namespace_name)) { - throw std::runtime_error("Namespace: " + t_namespace_name + - " was already defined"); - } else if (m_namespace_generators.count(t_namespace_name)) { - m_engine.add_global( - var(std::ref(m_namespace_generators[t_namespace_name]())), - t_namespace_name); - } else { - throw std::runtime_error("No registered namespace: " + - t_namespace_name); - } - } + void import(const std::string &t_namespace_name); /// \brief Registers a namespace generator, which delays generation of the /// namespace until it is imported, saving memory if it is never used. @@ -857,25 +397,7 @@ class Carbon_Basic { /// name was already registered. void register_namespace( const std::function &t_namespace_generator, - const std::string &t_namespace_name) { - Carbon::detail::threading::unique_lock< - Carbon::detail::threading::recursive_mutex> - l(m_use_mutex); - - if (!m_namespace_generators.count(t_namespace_name)) { - // contain the namespace object memory within the - // m_namespace_generators map - m_namespace_generators.emplace(std::make_pair( - t_namespace_name, - [=, space = Namespace()]() mutable -> Namespace & { - t_namespace_generator(space); - return space; - })); - } else { - throw std::runtime_error("Namespace: " + t_namespace_name + - " was already registered."); - } - } + const std::string &t_namespace_name); }; } // namespace Carbon diff --git a/src/carbon/language/windows.hpp b/src/carbon/language/windows.hpp index 415063f5..7e6d52e5 100644 --- a/src/carbon/language/windows.hpp +++ b/src/carbon/language/windows.hpp @@ -80,6 +80,8 @@ struct Loadable_Module { HMODULE m_data; }; + /* + TODO: Fix -Wcast-function-type here template struct DLSym { DLSym(DLModule &t_mod, const std::string &t_symbol) @@ -93,6 +95,34 @@ struct Loadable_Module { T m_symbol; }; + */ + template + struct DLSym { + using FunctionPtr = T; + + DLSym(DLModule &t_mod, const std::string &t_symbol) + : m_symbol(get_function_pointer(t_mod, t_symbol)) { + if (!m_symbol) { + throw Carbon::exception::load_module_error( + get_error_message(GetLastError())); + } + } + + FunctionPtr m_symbol; + + private: + // Helper function to safely retrieve the function pointer + static FunctionPtr get_function_pointer(DLModule &t_mod, + const std::string &t_symbol) { + FARPROC proc = GetProcAddress(t_mod.m_data, t_symbol.c_str()); + if (!proc) { + throw std::runtime_error( + "Failed to retrieve function pointer for symbol: " + + t_symbol); + } + return reinterpret_cast(proc); + } + }; Loadable_Module(const std::string &t_module_name, const std::string &t_filename) diff --git a/src/server/AppComponent.hpp b/src/server/AppComponent.hpp index 39d5c4ab..69b77635 100644 --- a/src/server/AppComponent.hpp +++ b/src/server/AppComponent.hpp @@ -160,6 +160,7 @@ class AppComponent { * Create ObjectMapper component to serialize/deserialize DTOs in WS * communication */ + /* OATPP_CREATE_COMPONENT(std::shared_ptr, wsApiObjectMapper) (Constants::COMPONENT_WS_API, [] { @@ -168,7 +169,8 @@ class AppComponent { mapper->getSerializer()->getConfig()->includeNullFields = false; return mapper; }()); - + */ + /** * Create games sessions Registry component. */ diff --git a/src/server/Runner.cpp b/src/server/Runner.cpp index 365721c0..4990ec34 100644 --- a/src/server/Runner.cpp +++ b/src/server/Runner.cpp @@ -18,12 +18,10 @@ Description: Lithium Server Runner #include "controller/AsyncClientController.hpp" #include "controller/AsyncConfigController.hpp" -/* #include "controller/AsyncDeviceController.hpp" #include "controller/AsyncIOController.hpp" #include "controller/AsyncStaticController.hpp" #include "controller/AsyncSystemController.hpp" -*/ #include "oatpp-swagger/AsyncController.hpp" @@ -127,12 +125,10 @@ Runner::Runner(const oatpp::Object& config, oatpp::web::server::api::Endpoints docEndpoints; ADD_CONTROLLER(ClientController, hostServer); ADD_CONTROLLER(ConfigController, hostServer); - /* ADD_CONTROLLER(DeviceController, hostServer); ADD_CONTROLLER(IOController, hostServer); ADD_CONTROLLER(StaticController, hostServer); ADD_CONTROLLER(SystemController, hostServer); - */ hostServer->getRouter()->addController( oatpp::swagger::AsyncController::createShared(docEndpoints)); From 8bbb26f9abdcc4268d1602f4da6c0857a9fb5a40 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 20 Apr 2024 20:45:23 +0800 Subject: [PATCH 24/28] add extra carbon modules --- CMakeLists.txt | 3 + src/carbon/carbon.hpp | 154 ++-- src/carbon/command/bootstrap.hpp | 2 +- src/carbon/command/dynamic_object_detail.cpp | 4 +- src/carbon/command/dynamic_object_detail.hpp | 4 +- src/carbon/extra/math.hpp | 805 +++++++++++++++++++ src/carbon/extra/string.hpp | 165 ++++ src/carbon/language/engine.hpp | 2 +- src/carbon/utils/utility.hpp | 6 +- src/script/carbon.cpp | 137 ++++ src/script/carbon.hpp | 32 + 11 files changed, 1229 insertions(+), 85 deletions(-) create mode 100644 src/carbon/extra/math.hpp create mode 100644 src/carbon/extra/string.hpp create mode 100644 src/script/carbon.cpp create mode 100644 src/script/carbon.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e9ff549..0d4e8edf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,6 +216,8 @@ set(script_module ${lithium_src_dir}/script/custom/config.cpp ${lithium_src_dir}/script/sheller.cpp + + ${lithium_src_dir}/script/carbon.cpp ) set(task_module @@ -246,6 +248,7 @@ target_link_libraries(lithium_server oatpp-websocket oatpp-swagger oatpp-openssl target_link_libraries(lithium_server loguru) target_link_libraries(lithium_server libzippp) target_link_libraries(lithium_server atomstatic) +target_link_libraries(lithium_server carbon) target_link_libraries(lithium_server-library fmt::fmt) target_compile_definitions(lithium_server PRIVATE LOGURU_DEBUG_LOGGING) diff --git a/src/carbon/carbon.hpp b/src/carbon/carbon.hpp index 5abbdccc..a24d3498 100644 --- a/src/carbon/carbon.hpp +++ b/src/carbon/carbon.hpp @@ -2,31 +2,31 @@ #define CARBON_HPP /// @mainpage -/// [ChaiScript](http://www.chaiscript.com") is a scripting language designed +/// [CarbonScript](http://www.chaiscript.com") is a scripting language designed /// specifically for integration with C++. It provides seamless integration with /// C++ on all levels, including shared_ptr objects, functors and exceptions. /// -/// The parts of the ChaiScript API that the average user will be concerned with -/// are contained in the chaiscript namespace and the Carbon::ChaiScript +/// The parts of the CarbonScript API that the average user will be concerned +/// with are contained in the chaiscript namespace and the Carbon::CarbonScript /// class. /// /// The end user parts of the API are extremely simple both in size and ease of /// use. /// -/// Currently, all source control and project management aspects of ChaiScript -/// occur on [github](http://www.github.com/ChaiScript/ChaiScript"). +/// Currently, all source control and project management aspects of CarbonScript +/// occur on [github](http://www.github.com/CarbonScript/CarbonScript"). /// /// ------------------------------------------------------------ /// /// @sa chaiscript -/// @sa Carbon::ChaiScript +/// @sa Carbon::CarbonScript /// @sa Carbon_Language for Built in Functions /// @sa @ref LangGettingStarted /// @sa @ref LangKeywordRef /// @sa @ref LangInPlaceRef /// @sa @ref LangObjectSystemRef /// @sa http://www.chaiscript.com -/// @sa http://www.github.com/ChaiScript/ChaiScript +/// @sa http://www.github.com/CarbonScript/CarbonScript /// /// ----------------------------------------------------------- /// @@ -60,7 +60,7 @@ /// /// int main() /// { -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.add(Carbon::fun(&function), "function"); /// /// double d = chai.eval("function(3, 4.75);"); @@ -69,9 +69,9 @@ /// /// ------------------------------------------------------ /// -/// @subsection compiling Compiling ChaiScript Applications +/// @subsection compiling Compiling CarbonScript Applications /// -/// ChaiScript is a header only library with only one dependency: The +/// CarbonScript is a header only library with only one dependency: The /// operating system provided dynamic library loader, which has to be specified /// on some platforms. /// @@ -99,15 +99,15 @@ /// /// @subsubsection parenoperator () Operator /// -/// operator() can be used as a handy shortcut for evaluating ChaiScript +/// operator() can be used as a handy shortcut for evaluating CarbonScript /// snippets. /// /// ~~~~~~~~{.cpp} -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai("print(@"hello world@")"); /// ~~~~~~~~ /// -/// @sa Carbon::ChaiScript::operator()(const std::string &) +/// @sa Carbon::CarbonScript::operator()(const std::string &) /// /// @subsubsection evalmethod Method 'eval' /// @@ -115,32 +115,32 @@ /// return values from the script. /// /// ~~~~~~~~{.cpp} -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.eval("callsomefunc()"); /// int result = chai.eval("1 + 3"); /// // result now equals 4 /// ~~~~~~~~ /// -/// @sa Carbon::ChaiScript::eval +/// @sa Carbon::CarbonScript::eval /// /// @subsubsection evalfilemethod Method 'eval_file' /// /// The 'eval_file' method loads a file from disk and executes the script in it /// /// ~~~~~~~~{.cpp} -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.eval_file("myfile.chai"); /// std::string result = chai.eval_file("myfile.chai") // extract /// the last value returned from the file /// ~~~~~~~~ /// -/// @sa Carbon::ChaiScript::eval_file +/// @sa Carbon::CarbonScript::eval_file /// /// -------------------------------------------------- /// -/// @subsection adding_items Adding Items to ChaiScript +/// @subsection adding_items Adding Items to CarbonScript /// -/// ChaiScript supports 4 basic things that can be added: objects, functions, +/// CarbonScript supports 4 basic things that can be added: objects, functions, /// type infos and Modules /// /// @subsubsection adding_objects Adding Objects @@ -152,7 +152,7 @@ /// /// ~~~~~~~~~{.cpp} /// using namespace Carbon; -/// ChaiScript chai; +/// CarbonScript chai; /// int i = 5; /// chai.add(var(i), "i"); /// chai("print(i)"); @@ -167,7 +167,7 @@ /// /// Named variables can only be accessed from the context they are created in. /// If you want a global variable, it must be const, and created with the -/// Carbon::ChaiScript::add_global_const function. +/// Carbon::CarbonScript::add_global_const function. /// /// ~~~~~~~~~{.cpp} /// chai.add_global_const(const_var(i), "i"); @@ -192,7 +192,7 @@ /// void overloadedmethod(const std::string &); /// }; /// -/// ChaiScript chai; +/// CarbonScript chai; /// chai.add(fun(&MyClass::memberdata), "memberdata"); /// chai.add(fun(&MyClass::method), "method"); /// chai.add(fun(&MyClass::staticmethod), "staticmethod"); @@ -220,12 +220,12 @@ /// /// @subsubsection addingtypeinfo Adding Type Info /// -/// ChaiScript will automatically support any type implicitly provided to it in -/// the form of objects and function parameters / return types. However, it can -/// be nice to let ChaiScript know more details about the types you are giving -/// it. For instance, the "clone" functionality cannot work unless there is a -/// copy constructor registered and the name of the type is known (so that -/// ChaiScript can look up the copy constructor). +/// CarbonScript will automatically support any type implicitly provided to it +/// in the form of objects and function parameters / return types. However, it +/// can be nice to let CarbonScript know more details about the types you are +/// giving it. For instance, the "clone" functionality cannot work unless there +/// is a copy constructor registered and the name of the type is known (so that +/// CarbonScript can look up the copy constructor). /// /// Continuing with the example "MyClass" from above: /// @@ -235,7 +235,7 @@ /// /// @subsubsection adding_modules Adding Modules /// -/// Modules are holders for collections of ChaiScript registrations. +/// Modules are holders for collections of CarbonScript registrations. /// /// ~~~~~~~~{.cpp} /// ModulePtr module = get_sum_module(); @@ -248,7 +248,7 @@ /// /// @subsection operatoroverloading Operator Overloading /// -/// Operators are just like any other function in ChaiScript, to overload an +/// Operators are just like any other function in CarbonScript, to overload an /// operator, simply register it. /// /// ~~~~~~~~{.cpp} @@ -274,8 +274,8 @@ /// /// @subsection add_class Class Helper Utility /// -/// Much of the work of adding new classes to ChaiScript can be reduced with the -/// help of the add_class helper utility. +/// Much of the work of adding new classes to CarbonScript can be reduced with +/// the help of the add_class helper utility. /// /// ~~~~~~~~{.cpp} /// class Test @@ -306,7 +306,7 @@ /// ); /// /// -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.add(m); /// } /// ~~~~~~~~ @@ -317,7 +317,7 @@ /// /// @subsection pointer_conversions Pointer / Object Conversions /// -/// As much as possible, ChaiScript attempts to convert between &, *, const &, +/// As much as possible, CarbonScript attempts to convert between &, *, const &, /// const *, std::shared_ptr, std::shared_ptr, /// std::reference_wrapper, std::reference_wrapper and value types /// automatically. @@ -345,7 +345,7 @@ /// int main() /// { /// using namespace Carbon -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.add(fun(fun1), "fun1"); /// chai.add(fun(fun2), "fun2"); /// chai.add(fun(fun3), "fun3"); @@ -378,9 +378,9 @@ /// /// @subsection baseclasses Base Classes /// -/// ChaiScript supports handling of passing a derived class object to a function -/// expecting a base class object. For the process to work, the base/derived -/// relationship must be registered with the engine. +/// CarbonScript supports handling of passing a derived class object to a +/// function expecting a base class object. For the process to work, the +/// base/derived relationship must be registered with the engine. /// /// ~~~~~~~~{.cpp} /// class Base {}; @@ -389,7 +389,7 @@ /// /// int main() /// { -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.add(Carbon::base_class()); /// Derived d; /// chai.add(Carbon::var(&d), "d"); @@ -403,8 +403,9 @@ /// /// @subsection functionobjects Function Objects /// -/// Functions are first class objects in ChaiScript and ChaiScript supports -/// automatic conversion between ChaiScript functions and std::function objects. +/// Functions are first class objects in CarbonScript and CarbonScript supports +/// automatic conversion between CarbonScript functions and std::function +/// objects. /// /// ~~~~~~~~{.cpp} /// void callafunc(const std::function &t_func) @@ -414,7 +415,7 @@ /// /// int main() /// { -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// chai.add(Carbon::fun(&callafunc), "callafunc"); /// chai("callafunc(fun(x) { print(x); })"); // pass a lambda function to the /// registered function @@ -422,7 +423,7 @@ /// std::function /// /// std::function f = chai.eval -/// >("dump_system"); f(); // call the ChaiScript function dump_system, from +/// >("dump_system"); f(); // call the CarbonScript function dump_system, from /// C++ /// } /// ~~~~~~~~ @@ -432,9 +433,10 @@ /// /// @subsection threading Threading /// -/// Thread safety is automatically handled within the ChaiScript system. Objects -/// can be added and scripts executed from multiple threads. For each thread -/// that executes scripts, a new context is created and managed by the engine. +/// Thread safety is automatically handled within the CarbonScript system. +/// Objects can be added and scripts executed from multiple threads. For each +/// thread that executes scripts, a new context is created and managed by the +/// engine. /// /// Thread safety can be disabled by defining CARBON_NO_THREADS when using the /// library. @@ -448,8 +450,8 @@ /// /// @subsubsection exceptionsbasics Exception Handling Basics /// -/// Exceptions can be thrown in ChaiScript and caught in C++ or thrown in C++ -/// and caught in ChaiScript. +/// Exceptions can be thrown in CarbonScript and caught in C++ or thrown in C++ +/// and caught in CarbonScript. /// /// ~~~~~~~~{.cpp} /// void throwexception() @@ -459,13 +461,13 @@ /// /// int main() /// { -/// // Throw in C++, catch in ChaiScript -/// Carbon::ChaiScript chai; +/// // Throw in C++, catch in CarbonScript +/// Carbon::CarbonScript chai; /// chai.add(Carbon::fun(&throwexception), "throwexception"); /// chai("try { throwexception(); } catch (e) { print(e.what()); }"); // /// prints "err" /// -/// // Throw in ChaiScript, catch in C++ +/// // Throw in CarbonScript, catch in C++ /// try { /// chai("throw(1)"); /// } catch (Carbon::Boxed_Value bv) { @@ -478,12 +480,12 @@ /// @subsubsection exceptionsautomatic Exception Handling Automatic Unboxing /// /// As an alternative to the manual unboxing of exceptions shown above, -/// exception specifications allow the user to tell ChaiScript what possible +/// exception specifications allow the user to tell CarbonScript what possible /// exceptions are expected from the script being executed. /// /// Example: /// ~~~~~~~~{.cpp} -/// Carbon::ChaiScript chai; +/// Carbon::CarbonScript chai; /// /// try { /// chai.eval("throw(runtime_error(@"error@"))", @@ -502,11 +504,11 @@ /// unboxing /// @sa Carbon::exception_specification -/// @page LangObjectSystemRef ChaiScript Language Object Model Reference +/// @page LangObjectSystemRef CarbonScript Language Object Model Reference /// /// -/// ChaiScript has an object system built in, for types defined within the -/// ChaiScript system. +/// CarbonScript has an object system built in, for types defined within the +/// CarbonScript system. /// /// ~~~~~~~~~ /// attr Rectangle::height @@ -519,7 +521,7 @@ /// print(rect.area()) /// ~~~~~~~~~ /// -/// Since ChaiScript 5.4.0 it has been possible to use the "class" keyword to +/// Since CarbonScript 5.4.0 it has been possible to use the "class" keyword to /// simplify this code. /// /// ~~~~~~~~~ @@ -538,7 +540,7 @@ /// @sa @ref keywordattr /// @sa @ref keyworddef -/// @page LangInPlaceRef ChaiScript Language In-Place Creation Reference +/// @page LangInPlaceRef CarbonScript Language In-Place Creation Reference /// @section inplacevector Vector /// /// ~~~~~~~~~ @@ -559,16 +561,16 @@ /// In-place Map ::= "[" (string ":" expression)+ "]" /// ~~~~~~~~ -/// @page LangGettingStarted ChaiScript Language Getting Started +/// @page LangGettingStarted CarbonScript Language Getting Started /// -/// ChaiScript is a simple language that should feel familiar to anyone who +/// CarbonScript is a simple language that should feel familiar to anyone who /// knows C++ or ECMAScript (JavaScript). /// /// ----------------------------------------------------------------------- /// /// @section chaiscriptloops Loops /// -/// Common looping constructs exist in ChaiScript +/// Common looping constructs exist in CarbonScript /// /// ~~~~~~~~ /// var i = 0; @@ -640,7 +642,8 @@ /// /// @section chaiscriptfunctionobjects Function Objects /// -/// Functions are first class types in ChaiScript and can be used as variables. +/// Functions are first class types in CarbonScript and can be used as +/// variables. /// /// ~~~~~~~~ /// eval> var p = print; @@ -672,13 +675,13 @@ /// @sa @ref LangKeywordRef /// @sa Carbon_Language for Built in Functions -/// @page LangKeywordRef ChaiScript Language Keyword Reference +/// @page LangKeywordRef CarbonScript Language Keyword Reference /// /// /// ----------------------------------------------------------------------- /// /// @section keywordattr attr -/// Defines a ChaiScript object attribute +/// Defines a CarbonScript object attribute /// /// ~~~~~~~~ /// Attribute Definition ::= "attr" class_name "::" attribute_name @@ -735,7 +738,7 @@ /// not a while or for loop). /// /// Method definitions for known types extend those types with new methods. This -/// includes C++ and ChaiScript defined types. Method definitions for unknown +/// includes C++ and CarbonScript defined types. Method definitions for unknown /// types implicitly define the named type. /// /// @sa @ref LangObjectSystemRef @@ -773,7 +776,7 @@ /// var f = fun(x) { x + 2; } /// ~~~~~~~~ /// -/// @sa @ref keyworddef for more details on ChaiScript functions +/// @sa @ref keyworddef for more details on CarbonScript functions /// /// /// ----------------------------------------------------------------------- @@ -851,17 +854,16 @@ #include "stdlib.hpp" namespace Carbon { -class ChaiScript : public Carbon_Basic { +class CarbonScript : public Carbon_Basic { public: - ChaiScript(std::vector t_modulepaths = {}, - std::vector t_usepaths = {}, - std::vector t_opts = Carbon::default_options()) - : Carbon_Basic( - Carbon::Std_Lib::library(), - std::make_unique>(), - std::move(t_modulepaths), std::move(t_usepaths), - std::move(t_opts)) {} + CarbonScript(std::vector t_modulepaths = {}, + std::vector t_usepaths = {}, + std::vector t_opts = Carbon::default_options()) + : Carbon_Basic(Carbon::Std_Lib::library(), + std::make_unique>(), + std::move(t_modulepaths), std::move(t_usepaths), + std::move(t_opts)) {} }; } // namespace Carbon diff --git a/src/carbon/command/bootstrap.hpp b/src/carbon/command/bootstrap.hpp index b6c3289c..5d5650b5 100644 --- a/src/carbon/command/bootstrap.hpp +++ b/src/carbon/command/bootstrap.hpp @@ -512,7 +512,7 @@ class Bootstrap { m.add(Carbon::base_class()); - m.add(Carbon::user_type(), + m.add(user_type(), "arithmetic_error"); m.add( Carbon::base_classget_param_types(), t_func->get_arity()), m_type_name(std::move(t_type_name)), m_func(t_func), @@ -19,7 +19,7 @@ Dynamic_Object_Function::Dynamic_Object_Function(std::string t_type_name, Dynamic_Object_Function::Dynamic_Object_Function(std::string t_type_name, const Proxy_Function &t_func, const Type_Info &t_ti, - bool t_is_attribute = false) + bool t_is_attribute) : Proxy_Function_Base(build_param_types(t_func->get_param_types(), t_ti), t_func->get_arity()), m_type_name(std::move(t_type_name)), diff --git a/src/carbon/command/dynamic_object_detail.hpp b/src/carbon/command/dynamic_object_detail.hpp index 02eb192b..7d681bf3 100644 --- a/src/carbon/command/dynamic_object_detail.hpp +++ b/src/carbon/command/dynamic_object_detail.hpp @@ -40,11 +40,11 @@ class Dynamic_Object_Function final : public Proxy_Function_Base { public: Dynamic_Object_Function(std::string t_type_name, const Proxy_Function &t_func, - bool t_is_attribute); + bool t_is_attribute = false); Dynamic_Object_Function(std::string t_type_name, const Proxy_Function &t_func, const Type_Info &t_ti, - bool t_is_attribute); + bool t_is_attribute = false); Dynamic_Object_Function &operator=(const Dynamic_Object_Function) = delete; Dynamic_Object_Function(Dynamic_Object_Function &) = delete; diff --git a/src/carbon/extra/math.hpp b/src/carbon/extra/math.hpp new file mode 100644 index 00000000..e1b03a08 --- /dev/null +++ b/src/carbon/extra/math.hpp @@ -0,0 +1,805 @@ +#ifndef CARBON_EXTRAS_MATH_HPP_ +#define CARBON_EXTRAS_MATH_HPP_ + +#include +#include + +#include "../carbon.hpp" + +namespace Carbon { +namespace extras { +namespace math { +// TRIG FUNCTIONS +template +ModulePtr cos(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::cos(p); }), "cos"); + return m; +} + +template +ModulePtr sin(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::sin(p); }), "sin"); + return m; +} + +template +ModulePtr tan(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::tan(p); }), "tan"); + return m; +} + +template +ModulePtr acos(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::acos(p); }), "acos"); + return m; +} + +template +ModulePtr asin(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::asin(p); }), "asin"); + return m; +} + +template +ModulePtr atan(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::atan(p); }), "atan"); + return m; +} + +template +ModulePtr atan2(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::atan2(p1, p2); }), + "atan2"); + return m; +} + +// HYPERBOLIC FUNCTIONS +template +ModulePtr cosh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::cosh(p); }), "cosh"); + return m; +} + +template +ModulePtr sinh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::sinh(p); }), "sinh"); + return m; +} + +template +ModulePtr tanh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::tanh(p); }), "tanh"); + return m; +} + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED +template +ModulePtr acosh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::acosh(p); }), "acosh"); + return m; +} + +template +ModulePtr asinh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::asinh(p); }), "asinh"); + return m; +} + +template +ModulePtr atanh(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::atanh(p); }), "atanh"); + return m; +} +#endif + +// EXPONENTIAL AND LOGARITHMIC FUNCTIONS +template +ModulePtr exp(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::exp(p); }), "exp"); + return m; +} + +template +ModulePtr frexp(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::frexp(p1, p2); }), + "frexp"); + return m; +} + +template +ModulePtr ldexp(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::ldexp(p1, p2); }), + "ldexp"); + return m; +} + +template +ModulePtr log(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::log(p); }), "log"); + return m; +} + +template +ModulePtr log10(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::log10(p); }), "log10"); + return m; +} + +template +ModulePtr modf(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::modf(p1, p2); }), + "modf"); + return m; +} + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED +template +ModulePtr exp2(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::exp2(p); }), "exp2"); + return m; +} + +template +ModulePtr expm1(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::expm1(p); }), "expm1"); + return m; +} + +template +ModulePtr ilogb(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::ilogb(p); }), "ilogb"); + return m; +} + +template +ModulePtr log1p(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::log1p(p); }), "log1p"); + return m; +} + +template +ModulePtr log2(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::log2(p); }), "log2"); + return m; +} + +template +ModulePtr logb(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::logb(p); }), "logb"); + return m; +} + +template +ModulePtr scalbn(ModulePtr m = std::make_shared()) { + m->add( + Carbon::fun([](Param1 p1, Param2 p2) { return std::scalbn(p1, p2); }), + "scalbn"); + return m; +} + +template +ModulePtr scalbln(ModulePtr m = std::make_shared()) { + m->add( + Carbon::fun([](Param1 p1, Param2 p2) { return std::scalbln(p1, p2); }), + "scalbln"); + return m; +} +#endif + +// POWER FUNCTIONS +template +ModulePtr pow(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::pow(p1, p2); }), + "pow"); + return m; +} + +template +ModulePtr sqrt(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::sqrt(p); }), "sqrt"); + return m; +} + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED +template +ModulePtr cbrt(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::cbrt(p); }), "cbrt"); + return m; +} + +template +ModulePtr hypot(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::hypot(p1, p2); }), + "hypot"); + return m; +} + +// ERROR AND GAMMA FUNCTIONS +template +ModulePtr erf(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::erf(p); }), "erf"); + return m; +} + +template +ModulePtr erfc(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::erfc(p); }), "erfc"); + return m; +} + +template +ModulePtr tgamma(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::tgamma(p); }), "tgamma"); + return m; +} + +template +ModulePtr lgamma(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::lgamma(p); }), "lgamma"); + return m; +} +#endif + +// ROUNDING AND REMAINDER FUNCTIONS +template +ModulePtr ceil(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::ceil(p); }), "ceil"); + return m; +} + +template +ModulePtr floor(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::floor(p); }), "floor"); + return m; +} + +template +ModulePtr fmod(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::fmod(p1, p2); }), + "fmod"); + return m; +} + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED +template +ModulePtr trunc(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::trunc(p); }), "trunc"); + return m; +} + +template +ModulePtr round(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::round(p); }), "round"); + return m; +} + +template +ModulePtr lround(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::lround(p); }), "lround"); + return m; +} + +// long long ints do not work +template +ModulePtr llround(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::llround(p); }), "llround"); + return m; +} + +template +ModulePtr rint(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::rint(p); }), "rint"); + return m; +} + +template +ModulePtr lrint(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::lrint(p); }), "lrint"); + return m; +} + +// long long ints do not work +template +ModulePtr llrint(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::llrint(p); }), "llrint"); + return m; +} + +template +ModulePtr nearbyint(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::nearbyint(p); }), "nearbyint"); + return m; +} + +template +ModulePtr remainder(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::remainder(p1, p2); }), + "remainder"); + return m; +} + +template +ModulePtr remquo(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2, Param3 p3) { + return std::remquo(p1, p2, p3); + }), + "remquo"); + return m; +} + +// FLOATING-POINT MANIPULATION FUNCTIONS +template +ModulePtr copysign(ModulePtr m = std::make_shared()) { + m->add( + Carbon::fun([](Param1 p1, Param2 p2) { return std::copysign(p1, p2); }), + "copysign"); + return m; +} + +template +ModulePtr nan(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::nan(p); }), "nan"); + return m; +} + +template +ModulePtr nextafter(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::nextafter(p1, p2); }), + "nextafter"); + return m; +} + +template +ModulePtr nexttoward(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::nexttoward(p1, p2); }), + "nexttoward"); + return m; +} + +// MINIMUM, MAXIMUM, DIFFERENCE FUNCTIONS +template +ModulePtr fdim(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::fdim(p1, p2); }), + "fdim"); + return m; +} + +template +ModulePtr fmax(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::fmax(p1, p2); }), + "fmax"); + return m; +} + +template +ModulePtr fmin(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { return std::fmin(p1, p2); }), + "fmin"); + return m; +} + +// OTHER FUNCTIONS +template +ModulePtr fabs(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::fabs(p); }), "fabs"); + return m; +} +#endif + +template +ModulePtr abs(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::abs(p); }), "abs"); + return m; +} + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED +template +ModulePtr fma(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2, Param3 p3) { + return std::fma(p1, p2, p3); + }), + "fma"); + return m; +} + +// CLASSIFICATION FUNCTIONS +template +ModulePtr fpclassify(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::fpclassify(p); }), + "fpclassify"); + return m; +} +#endif + +template +ModulePtr isfinite(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::isfinite(p); }), "isfinite"); + return m; +} + +template +ModulePtr isinf(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::isinf(p); }), "isinf"); + return m; +} + +template +ModulePtr isnan(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::isnan(p); }), "isnan"); + return m; +} + +template +ModulePtr isnormal(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::isnormal(p); }), "isnormal"); + return m; +} + +template +ModulePtr signbit(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param p) { return std::signbit(p); }), "signbit"); + return m; +} + +// COMPARISON FUNCTIONS +template +ModulePtr isgreater(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::isgreater(p1, p2); }), + "isgreater"); + return m; +} + +template +ModulePtr isgreaterequal(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun([](Param1 p1, Param2 p2) { + return std::isgreaterequal(p1, p2); + }), + "isgreaterequal"); + return m; +} + +template +ModulePtr isless(ModulePtr m = std::make_shared()) { + m->add( + Carbon::fun([](Param1 p1, Param2 p2) { return std::isless(p1, p2); }), + "isless"); + return m; +} + +template +ModulePtr islessequal(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::islessequal(p1, p2); }), + "islessequal"); + return m; +} + +template +ModulePtr islessgreater(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::islessgreater(p1, p2); }), + "islessgreater"); + return m; +} + +template +ModulePtr isunordered(ModulePtr m = std::make_shared()) { + m->add(Carbon::fun( + [](Param1 p1, Param2 p2) { return std::isunordered(p1, p2); }), + "isunordered"); + return m; +} + +ModulePtr bootstrap(ModulePtr m = std::make_shared()) { + // TRIG FUNCTIONS + cos(m); + cos(m); + cos(m); + + sin(m); + sin(m); + sin(m); + + tan(m); + tan(m); + tan(m); + + acos(m); + acos(m); + acos(m); + + asin(m); + asin(m); + asin(m); + + atan(m); + atan(m); + atan(m); + + atan2(m); + atan2(m); + atan2(m); + + // HYPERBOLIC FUNCTIONS + cosh(m); + cosh(m); + cosh(m); + + sinh(m); + sinh(m); + sinh(m); + + tanh(m); + tanh(m); + tanh(m); + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED + acosh(m); + acosh(m); + acosh(m); + + asinh(m); + asinh(m); + asinh(m); + + atanh(m); + atanh(m); + atanh(m); +#endif + + // EXPONENTIAL AND LOGARITHMIC FUNCTIONS + exp(m); + exp(m); + exp(m); + + frexp(m); + frexp(m); + frexp(m); + + ldexp(m); + ldexp(m); + ldexp(m); + + log(m); + log(m); + log(m); + + log10(m); + log10(m); + log10(m); + + modf(m); + modf(m); + modf(m); + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED + exp2(m); + exp2(m); + exp2(m); + + expm1(m); + expm1(m); + expm1(m); + + ilogb(m); + ilogb(m); + ilogb(m); + + log1p(m); + log1p(m); + log1p(m); + + log2(m); + log2(m); + log2(m); + + logb(m); + logb(m); + logb(m); + + scalbn(m); + scalbn(m); + scalbn(m); + + scalbln(m); + scalbln(m); + scalbln(m); +#endif + + // POWER FUNCTIONS + pow(m); + pow(m); + pow(m); + + sqrt(m); + sqrt(m); + sqrt(m); + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED + cbrt(m); + cbrt(m); + cbrt(m); + + hypot(m); + hypot(m); + hypot(m); + + // ERROR AND GAMMA FUNCTIONS + erf(m); + erf(m); + erf(m); + + erfc(m); + erfc(m); + erfc(m); + + tgamma(m); + tgamma(m); + tgamma(m); + + lgamma(m); + lgamma(m); + lgamma(m); +#endif + + // ROUNDING AND REMAINDER FUNCTIONS + ceil(m); + ceil(m); + ceil(m); + + floor(m); + floor(m); + floor(m); + + fmod(m); + fmod(m); + fmod(m); + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED + trunc(m); + trunc(m); + trunc(m); + + round(m); + round(m); + round(m); + + lround(m); + lround(m); + lround(m); + + // long long ints do not work + llround(m); + llround(m); + llround(m); + + rint(m); + rint(m); + rint(m); + + lrint(m); + lrint(m); + lrint(m); + + // long long ints do not work + llrint(m); + llrint(m); + llrint(m); + + nearbyint(m); + nearbyint(m); + nearbyint(m); + + remainder(m); + remainder(m); + remainder(m); + + remquo(m); + remquo(m); + remquo(m); + + // FLOATING-POINT MANIPULATION FUNCTIONS + copysign(m); + copysign(m); + copysign(m); + + nan(m); + + nextafter(m); + nextafter(m); + nextafter(m); + + nexttoward(m); + nexttoward(m); + nexttoward(m); + + // MINIMUM, MAXIMUM, DIFFERENCE FUNCTIONS + fdim(m); + fdim(m); + fdim(m); + + fmax(m); + fmax(m); + fmax(m); + + fmin(m); + fmin(m); + fmin(m); + + // OTHER FUNCTIONS + fabs(m); + fabs(m); + fabs(m); +#endif + + abs(m); + abs(m); + abs(m); + +#ifndef CARBON_EXTRAS_MATH_SKIP_ADVANCED + fma(m); + fma(m); + fma(m); + + // CLASSIFICATION FUNCTIONS + fpclassify(m); + fpclassify(m); + fpclassify(m); +#endif + + isfinite(m); + isfinite(m); + isfinite(m); + + isinf(m); + isinf(m); + isinf(m); + + isnan(m); + isnan(m); + isnan(m); + + isnormal(m); + isnormal(m); + isnormal(m); + + signbit(m); + signbit(m); + signbit(m); + + // COMPARISON FUNCTIONS + isgreater(m); + isgreater(m); + isgreater(m); + + isgreaterequal(m); + isgreaterequal(m); + isgreaterequal(m); + + isless(m); + isless(m); + isless(m); + + islessequal(m); + islessequal(m); + islessequal(m); + + islessgreater(m); + islessgreater(m); + islessgreater(m); + + isunordered(m); + isunordered(m); + isunordered(m); + + return m; +} +} // namespace math +} // namespace extras +} // namespace Carbon + +#endif /* CARBON_EXTRAS_MATH_HPP_ */ \ No newline at end of file diff --git a/src/carbon/extra/string.hpp b/src/carbon/extra/string.hpp new file mode 100644 index 00000000..fca4f7e4 --- /dev/null +++ b/src/carbon/extra/string.hpp @@ -0,0 +1,165 @@ +#ifndef CARBON_EXTRAS_STRING_METHODS_HPP_ +#define CARBON_EXTRAS_STRING_METHODS_HPP_ + +#include +#include +#include +#include "../carbon.hpp" + +namespace Carbon { +namespace extras { +namespace string_methods { + +/** + * Replaces all occurances of a string within the given string. + * + * @code + * var hello = "Hello World" + * hello.replace("Hello", "Goodbye") + * // => "Goodbye World" + * @endcode + * + * @see replaceChar + */ +std::string replaceString(const std::string& subject, const std::string& search, + const std::string& replace) { + std::string result(subject); + size_t pos = 0; + while ((pos = result.find(search, pos)) != std::string::npos) { + result.replace(pos, search.length(), replace); + pos += replace.length(); + } + return result; +} + +/** + * Replaces all occurances of a character within the given character. + * + * @see replaceString + */ +std::string replaceChar(const std::string& subject, char search, char replace) { + std::string result(subject); + std::replace(result.begin(), result.end(), search, replace); + return result; +} + +/** + * Trims the given string. + */ +std::string trim(const std::string& subject) { + std::string result(subject); + std::string delimiters = "\t\n\v\f\r "; + result.erase(0, result.find_first_not_of(delimiters)); + result.erase(0, result.find_last_not_of(delimiters)); + return result; +} + +/** + * Trims the beginning of the given string. + */ +std::string trimStart(const std::string& subject) { + std::string result(subject); + std::string delimiters = "\t\n\v\f\r "; + result.erase(0, result.find_first_not_of(delimiters)); + return result; +} + +/** + * Trims the end of the given string. + */ +std::string trimEnd(const std::string& subject) { + std::string result(subject); + std::string delimiters = "\t\n\v\f\r "; + result.erase(result.find_last_not_of(delimiters) + 1); + return result; +} + +/** + * Splits the given string into a vector of strings. + * + * @code + * var input = "Hello|World|How|Are|You" + * var words = input.split("|") + * words[1] + * // => "World" + */ +std::vector split(const std::string& subject, + const std::string& token) { + std::string str(subject); + std::vector result; + while (str.size()) { + size_t index = str.find(token); + if (index != std::string::npos) { + result.push_back(str.substr(0, index)); + str = str.substr(index + token.size()); + if (str.size() == 0) { + result.push_back(str); + } + } else { + result.push_back(str); + str = ""; + } + } + return result; +} + +/** + * Convert the given string to lowercase letters. + */ +std::string toLowerCase(const std::string& subject) { + std::string result(subject); + std::transform(result.begin(), result.end(), result.begin(), + [](unsigned char c) { return std::tolower(c); }); + return result; +} + +/** + * Convert the given string to uppercase letters. + */ +std::string toUpperCase(const std::string& subject) { + std::string result(subject); + std::transform(result.begin(), result.end(), result.begin(), + [](unsigned char c) { return std::toupper(c); }); + return result; +} + +/** + * Checks if a string includes the given string. + * + * @see includesChar + */ +bool includes(const std::string& subject, const std::string& search) { + return subject.find(search) != std::string::npos; +} + +/** + * Checks if a string includes the given character. + * + * @see includes + */ +bool includesChar(const std::string& subject, char search) { + return subject.find(search) != std::string::npos; +} + +/** + * Adds the String Methods to the given Carbon module. + */ +ModulePtr bootstrap(ModulePtr m = std::make_shared()) { + m->add(fun(replaceString), "replace"); + m->add(fun(replaceChar), "replace"); + m->add(fun(trim), "trim"); + m->add(fun(split), "split"); + m->add(fun(toLowerCase), "toLowerCase"); + m->add(fun(toUpperCase), "toUpperCase"); + m->add(fun(includes), "includes"); + m->add(fun(includesChar), "includes"); + m->add(fun(trimStart), "trimStart"); + m->add(fun(trimEnd), "trimEnd"); + + return m; +} +} // namespace string_methods +} // namespace extras +} // namespace Carbon + +#endif /* CARBON_EXTRAS_STRING_METHODS_HPP_ */ \ No newline at end of file diff --git a/src/carbon/language/engine.hpp b/src/carbon/language/engine.hpp index 874c2c6d..c41cb420 100644 --- a/src/carbon/language/engine.hpp +++ b/src/carbon/language/engine.hpp @@ -241,7 +241,7 @@ class Carbon_Basic { /// \b Examples: /// \code /// Carbon::ChaiScript chai; - /// chai.add(Carbon::user_type(), "MyClass"); // Add explicit + /// chai.add(user_type(), "MyClass"); // Add explicit /// type info (not strictly necessary) /// chai.add(Carbon::fun(&MyClass::function), "function"); // Add a /// class method MyClass obj; chai.add(Carbon::var(&obj), "obj"); // Add diff --git a/src/carbon/utils/utility.hpp b/src/carbon/utils/utility.hpp index 4813d311..3352e3fe 100644 --- a/src/carbon/utils/utility.hpp +++ b/src/carbon/utils/utility.hpp @@ -43,7 +43,7 @@ void add_class(ModuleType &t_module, const std::string &t_class_name, const std::vector &t_constructors, const std::vector> &t_funcs) { - t_module.add(Carbon::user_type(), t_class_name); + t_module.add(user_type(), t_class_name); for (const Carbon::Proxy_Function &ctor : t_constructors) { t_module.add(ctor, t_class_name); @@ -59,7 +59,7 @@ typename std::enable_if::value, void>::type add_class( ModuleType &t_module, const std::string &t_class_name, const std::vector::type, std::string>> &t_constants) { - t_module.add(Carbon::user_type(), t_class_name); + t_module.add(user_type(), t_class_name); t_module.add(Carbon::constructor(), t_class_name); t_module.add(Carbon::constructor(), t_class_name); @@ -84,7 +84,7 @@ template typename std::enable_if::value, void>::type add_class( ModuleType &t_module, const std::string &t_class_name, const std::vector> &t_constants) { - t_module.add(Carbon::user_type(), t_class_name); + t_module.add(user_type(), t_class_name); t_module.add(Carbon::constructor(), t_class_name); t_module.add(Carbon::constructor(), diff --git a/src/script/carbon.cpp b/src/script/carbon.cpp new file mode 100644 index 00000000..cc3b5310 --- /dev/null +++ b/src/script/carbon.cpp @@ -0,0 +1,137 @@ +#include "carbon.hpp" + +#include "carbon/carbon.hpp" +#include "carbon/extra/math.hpp" +#include "carbon/extra/string.hpp" + +#include "atom/log/loguru.hpp" + +namespace Lithium +{ + // Pimpl implementation + class CarbonScriptImpl + { + public: + CarbonScriptImpl() + : m_carbon(std::make_unique()) { + } + + void InitSubModules() + { + m_carbon->add(Carbon::extras::math::bootstrap()); + m_carbon->add(Carbon::extras::string_methods::bootstrap()); + + // Add additional sub-modules if needed + } + + void InitMyApp() + { + LOG_F(INFO, "CarbonScriptr initializing ..."); + InitSubModules(); + LOG_F(INFO, "CarbonScript initialized"); + //m_carbon->add_global(Carbon::var(MyApp), "app"); + } + + bool LoadScriptFile(const std::string &filename) + { + std::ifstream file(filename); + if (file) + { + std::string script((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + file.close(); + m_carbon->eval(script); + } + else + { + LOG_F(ERROR, "Failed to open script file: %s", filename.c_str()); + return false; + } + return true; + } + + bool RunCommand(const std::string &command) + { + try + { + m_carbon->eval(command); + } + catch (Carbon::exception::eval_error &e) + { + LOG_F(ERROR, "Failed to eval %s : %s", e.filename.c_str(), e.what()); + return false; + }; + return true; + } + + bool RunScript(const std::string &filename) + { + try + { + m_carbon->eval_file(filename); + } + catch (Carbon::exception::eval_error &e) + { + LOG_F(ERROR, "Failed to run %s : %s", e.filename.c_str(), e.what()); + return false; + } + return true; + } + + bool RunMultiCommand(const std::vector &commands) + { + for (auto command : commands) + { + try + { + m_carbon->eval(command); + } + catch (Carbon::exception::eval_error &e) + { + LOG_F(ERROR, "Failed to run: %s", e.what()); + return false; + } + } + return true; + } + + private: + std::unique_ptr m_carbon; + }; + + CarbonScript::CarbonScript() + : impl_(std::make_unique()) + { + } + + std::shared_ptr CarbonScript::createShared() + { + return std::make_shared(); + } + + void CarbonScript::Init() + { + impl_->InitMyApp(); + } + + bool CarbonScript::LoadScriptFile(const std::string &filename) + { + return impl_->LoadScriptFile(filename); + } + + bool CarbonScript::RunCommand(const std::string &command) + { + return impl_->RunCommand(command); + } + + bool CarbonScript::RunMultiCommand(const std::vector &commands) + { + return impl_->RunMultiCommand(commands); + } + + bool CarbonScript::RunScript(const std::string &filename) + { + return impl_->RunScript(filename); + } + +} diff --git a/src/script/carbon.hpp b/src/script/carbon.hpp new file mode 100644 index 00000000..09d6ae9a --- /dev/null +++ b/src/script/carbon.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include + + +namespace Lithium { +class CarbonScriptImpl; + +class CarbonScript { +public: + CarbonScript(); + ~CarbonScript(); + + static std::shared_ptr createShared(); + + void Init(); + void InitSubModules(); + void InitMyApp(); + + bool LoadScriptFile(const std::string &filename); + bool RunCommand(const std::string &command); + bool RunMultiCommand(const std::vector &commands); + bool RunScript(const std::string &filename); + +private: + std::unique_ptr impl_; +}; + +} // namespace Lithium From 45f50daa4a44b0bc2012aea0d15a47b42ea7ef2a Mon Sep 17 00:00:00 2001 From: Max Qian Date: Mon, 22 Apr 2024 21:06:40 +0800 Subject: [PATCH 25/28] update not finished --- CMakeLists.txt | 3 +- src/LithiumApp.cpp | 7 +- src/atom/algorithm/base.cpp | 183 ++----- src/atom/algorithm/base.hpp | 26 +- src/atom/experiment/any.hpp | 58 ++- src/atom/io/_script.hpp | 112 ++++ src/atom/io/ifile.cpp | 189 +++++++ src/atom/io/ifile.hpp | 238 +++++++++ src/atom/log/CMakeLists.txt | 1 - src/atom/log/loguru.cpp | 140 ++--- src/atom/log/loguru.hpp | 7 +- src/atom/type/CMakeLists.txt | 1 - src/atom/type/args.cpp | 59 --- src/atom/type/args.hpp | 270 +++++----- src/atom/type/argsview.hpp | 259 +++++++++ src/atom/utils/string.hpp | 2 - src/atom/utils/validate_aligned_storage.hpp | 1 + src/carbon/CMakeLists.txt | 2 + src/carbon/language/common.cpp | 424 +++++++++++++++ src/carbon/language/common.hpp | 360 ++----------- src/carbon/language/parser.hpp | 44 +- src/carbon/language/prelude.cpp | 551 ++++++++++++++++++++ src/carbon/language/prelude.hpp | 548 +------------------ src/device/manager.cpp | 4 - 24 files changed, 2099 insertions(+), 1390 deletions(-) create mode 100644 src/atom/io/_script.hpp create mode 100644 src/atom/io/ifile.cpp create mode 100644 src/atom/io/ifile.hpp delete mode 100644 src/atom/type/args.cpp create mode 100644 src/atom/type/argsview.hpp create mode 100644 src/carbon/language/common.cpp create mode 100644 src/carbon/language/prelude.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d4e8edf..f1305852 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -239,6 +239,7 @@ set(Lithium_module # Main add_library(lithium_server-library STATIC ${component_module} ${config_module} ${debug_module} ${module_module} ${device_module} ${task_module} ${script_module} ${Lithium_module}) +target_link_libraries(lithium_server-library loguru) add_executable(lithium_server ${lithium_src_dir}/app.cpp) target_link_directories(lithium_server PUBLIC ${CMAKE_BINARY_DIR}/libs) @@ -249,7 +250,7 @@ target_link_libraries(lithium_server loguru) target_link_libraries(lithium_server libzippp) target_link_libraries(lithium_server atomstatic) target_link_libraries(lithium_server carbon) -target_link_libraries(lithium_server-library fmt::fmt) +target_link_libraries(lithium_server fmt::fmt) target_compile_definitions(lithium_server PRIVATE LOGURU_DEBUG_LOGGING) diff --git a/src/LithiumApp.cpp b/src/LithiumApp.cpp index 2285e5a9..4206c490 100644 --- a/src/LithiumApp.cpp +++ b/src/LithiumApp.cpp @@ -84,7 +84,6 @@ namespace Lithium { std::shared_ptr MyApp = nullptr; LithiumApp::LithiumApp() { - DLOG_SCOPE_FUNCTION(INFO); DLOG_F(INFO, "LithiumApp Constructor"); try { // Specialized Managers and Threads @@ -112,10 +111,10 @@ LithiumApp::LithiumApp() { // message // to the right type to process. // All of the messages are based on the Message class. - DLOG_SCOPE_F(INFO, "Start Message Processing Thread"); + DLOG_F(INFO, "Start Message Processing Thread"); m_MessageBus.lock()->StartProcessingThread(); - DLOG_SCOPE_F(INFO, "Register LithiumApp Member Functions"); + DLOG_F(INFO, "Register LithiumApp Member Functions"); LiRegisterMemberFunc("GetConfig", &LithiumApp::GetConfig); LiRegisterMemberFunc("SetConfig", &LithiumApp::SetConfig); @@ -125,7 +124,7 @@ LithiumApp::LithiumApp() { LOG_F(ERROR, "Failed to load Lithium App , error : {}", e.what()); throw std::runtime_error("Failed to load Lithium App"); } - DLOG_SCOPE_F(INFO, "Lithium App Initialized"); + DLOG_F(INFO, "Lithium App Initialized"); } LithiumApp::~LithiumApp() { diff --git a/src/atom/algorithm/base.cpp b/src/atom/algorithm/base.cpp index 7724b2a5..0f8d1f21 100644 --- a/src/atom/algorithm/base.cpp +++ b/src/atom/algorithm/base.cpp @@ -106,176 +106,83 @@ std::string base32Decode(std::string_view encoded) { return result; } -std::string base64Encode(const std::vector &bytes_to_encode) { - static const std::string kBase64Chars = +std::string base64Encode(std::string_view bytes_to_encode) { + static constexpr std::string_view kBase64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; + std::string ret; - int i = 0; - int j = 0; - unsigned char char_array_3[3]; - unsigned char char_array_4[4]; - for (const auto &byte : bytes_to_encode) { - char_array_3[i++] = byte; - if (i == 3) { - char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; - char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + - ((char_array_3[1] & 0xf0) >> 4); - char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + - ((char_array_3[2] & 0xc0) >> 6); - char_array_4[3] = char_array_3[2] & 0x3f; - for (i = 0; i < 4; i++) { - ret += kBase64Chars[char_array_4[i]]; - } - i = 0; - } - } - if (i) { - for (j = i; j < 3; j++) { - char_array_3[j] = '\0'; + ret.reserve((bytes_to_encode.size() + 2) / 3 * 4); + + std::array char_array_3{}; + std::array char_array_4{}; + + auto it = bytes_to_encode.begin(); + auto end = bytes_to_encode.end(); + + while (it != end) { + int i = 0; + for (; i < 3 && it != end; ++i, ++it) { + char_array_3[i] = static_cast(*it); } + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; - for (j = 0; j < i + 1; j++) { - ret += kBase64Chars[char_array_4[j]]; - } - while ((i++ < 3)) { - ret += '='; - } - } - return ret; -} -std::vector base64Decode(const std::string &encoded_string) { - static const std::string kBase64Chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; + for (int j = 0; j < i + 1; ++j) { + ret.push_back(kBase64Chars[char_array_4[j]]); + } - int in_len = encoded_string.size(); - int i = 0; - int j = 0; - int in_ = 0; - unsigned char char_array_4[4], char_array_3[3]; - std::vector ret; - - while (in_len-- && (encoded_string[in_] != '=') && - (kBase64Chars.find(encoded_string[in_]) != std::string::npos)) { - char_array_4[i++] = encoded_string[in_]; - in_++; - if (i == 4) { - for (i = 0; i < 4; i++) { - char_array_4[i] = static_cast( - kBase64Chars.find(char_array_4[i])); - } - char_array_3[0] = - (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + - ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - for (i = 0; i < 3; i++) { - ret.push_back(char_array_3[i]); + if (i < 3) { + for (int j = i; j < 3; ++j) { + ret.push_back('='); } - i = 0; - } - } - if (i) { - for (j = i; j < 4; j++) { - char_array_4[j] = 0; - } - for (j = 0; j < 4; j++) { - char_array_4[j] = - static_cast(kBase64Chars.find(char_array_4[j])); - } - char_array_3[0] = - (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = - ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - for (j = 0; j < i - 1; j++) { - ret.push_back(char_array_3[j]); + break; } } + return ret; } -std::string base64EncodeEnhance(const std::vector &bytes_to_encode) { - const std::string base64_chars = +std::string base64Decode(std::string_view encoded_string) { + static constexpr std::string_view kBase64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; - std::string encoded_data; - size_t input_length = bytes_to_encode.size(); + std::string ret; + ret.reserve(encoded_string.size() / 4 * 3); - for (size_t i = 0; i < input_length; i += 3) { - uint32_t padded_value = 0; - int padding_count = 0; + std::array char_array_4{}; + std::array char_array_3{}; - for (size_t j = 0; j < 3; ++j) { - if (i + j < input_length) { - padded_value <<= 8; - padded_value |= bytes_to_encode[i + j]; - } else { - padded_value <<= 8; - ++padding_count; - } - } + auto it = encoded_string.begin(); + auto end = encoded_string.end(); - for (int k = 0; k < 4 - padding_count; ++k) { - uint8_t index = (padded_value >> (6 * (3 - k))) & 0x3F; - encoded_data += base64_chars[index]; + while (it != end) { + int i = 0; + for (; i < 4 && it != end && *it != '='; ++i, ++it) { + char_array_4[i] = + static_cast(kBase64Chars.find(*it)); } - for (int k = 0; k < padding_count; ++k) { - encoded_data += '='; - } - } - - return encoded_data; -} - -std::vector base64DecodeEnhance(const std::string &encoded_string) { - const std::string base64_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - - std::vector decoded_data; - size_t input_length = encoded_string.length(); - size_t padding_count = - std::count(encoded_string.begin(), encoded_string.end(), '='); - size_t output_length = (3 * input_length) / 4 - padding_count; - - uint32_t padded_value = 0; - int padding_index = 0; - - for (size_t i = 0; i < input_length; ++i) { - if (encoded_string[i] == '=') { - padded_value <<= 6; - ++padding_index; - } else { - uint8_t value = base64_chars.find(encoded_string[i]); - padded_value <<= 6; - padded_value |= value; - } + char_array_3[0] = + (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = + ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - if ((i + 1) % 4 == 0 && padding_index < padding_count) { - for (int j = 0; j < 3 - padding_index; ++j) { - uint8_t byte = (padded_value >> (16 - (j + 1) * 8)) & 0xFF; - decoded_data.push_back(byte); - } - padding_index = 0; - padded_value = 0; + for (int j = 0; j < i - 1; ++j) { + ret.push_back(static_cast(char_array_3[j])); } } - return decoded_data; + return ret; } const std::string base85_chars = diff --git a/src/atom/algorithm/base.hpp b/src/atom/algorithm/base.hpp index 181787f6..c9bd3240 100644 --- a/src/atom/algorithm/base.hpp +++ b/src/atom/algorithm/base.hpp @@ -72,7 +72,7 @@ base32Decode(std::string_view encoded); * @return std::string 编码后的字符串 */ [[nodiscard("The result of base64Encode is not used.")]] std::string -base64Encode(const std::vector &bytes_to_encode); +base64Encode(std::string_view bytes_to_encode); /** * @brief Base64解码函数 @@ -80,28 +80,8 @@ base64Encode(const std::vector &bytes_to_encode); * @param encoded_string 待解码字符串 * @return std::vector 解码后的数据 */ -[[nodiscard( - "The result of base64Decode is not used.")]] std::vector -base64Decode(const std::string &encoded_string); - -/** - * @brief Base64编码函数 - * - * @param bytes_to_encode 待编码数据 - * @return std::string 编码后的字符串 - */ -[[nodiscard("The result of base64EncodeEnhance is not used.")]] std::string -base64EncodeEnhance(const std::vector &bytes_to_encode); - -/** - * @brief Base64解码函数 - * - * @param encoded_string 待解码字符串 - * @return std::vector 解码后的数据 - */ -[[nodiscard( - "The result of base64DecodeEnhance is not used.")]] std::vector -base64DecodeEnhance(const std::string &encoded_string); +[[nodiscard("The result of base64Decode is not used.")]] std::string +base64Decode(std::string_view encoded_string); /** * @brief Encodes a vector of unsigned characters into a Base85 string. diff --git a/src/atom/experiment/any.hpp b/src/atom/experiment/any.hpp index c7dbb35e..621f3043 100644 --- a/src/atom/experiment/any.hpp +++ b/src/atom/experiment/any.hpp @@ -15,7 +15,9 @@ Description: A simple implementation of any type. #ifndef ATOM_EXPERIMENT_ANY_HPP #define ATOM_EXPERIMENT_ANY_HPP +#include #include +#include #include #include #include @@ -27,21 +29,60 @@ template concept Derived = std::is_base_of_v, Any>; class Any { +private: + static constexpr std::size_t BufferSize = 64; + static constexpr std::size_t BufferAlign = alignof(std::max_align_t); + + using Storage = std::aligned_storage_t; + public: constexpr Any() noexcept : ptr(nullptr) {} template - requires(!Derived) + requires(!Derived && + !(sizeof(T) <= BufferSize && std::is_trivially_copyable_v)) constexpr Any(T &&value) : ptr(new holder>(std::forward(value))) {} + template + requires(!Derived && sizeof(T) <= BufferSize && + std::is_trivially_copyable_v) + constexpr Any(T &&value) { + new (&storage) holder>(std::forward(value)); + small = true; + } + constexpr Any(const Any &other) - : ptr(other.ptr ? other.ptr->clone() : nullptr) {} + : ptr(other.small ? nullptr + : (other.ptr ? other.ptr->clone() : nullptr)), + small(other.small) { + if (other.small) { + std::copy_n(reinterpret_cast(&other.storage), + sizeof(Storage), reinterpret_cast(&storage)); + } + } - constexpr Any(Any &&other) noexcept - : ptr(std::exchange(other.ptr, nullptr)) {} + constexpr Any(Any &&other) noexcept : small(other.small) { + if (other.small) { + std::memcpy(&storage, &other.storage, sizeof(Storage)); + } else { + ptr = std::exchange(other.ptr, nullptr); + } + } - ~Any() { delete ptr; } + ~Any() { + if (small) { + // If the stored object has a non-trivial destructor, it needs to be + // called manually + if (!std::is_trivially_destructible_v) { + // Assuming 'holder' has a virtual destructor and a method to + // properly destroy the contained object... + reinterpret_cast(&storage)->~placeholder(); + } + } else { + delete ptr; + } + } constexpr Any &operator=(const Any &other) { if (this != &other) { @@ -80,6 +121,7 @@ class Any { [[nodiscard]] virtual const std::type_info &type() const noexcept = 0; [[nodiscard]] virtual placeholder *clone() const = 0; virtual void swap(placeholder &other) = 0; + virtual void destroy() = 0; }; template @@ -106,6 +148,12 @@ class Any { T held; }; + union { + placeholder *ptr; + Storage storage; + }; + bool small = false; + placeholder *ptr; constexpr void swap(Any &other) noexcept { std::swap(ptr, other.ptr); } diff --git a/src/atom/io/_script.hpp b/src/atom/io/_script.hpp new file mode 100644 index 00000000..c76ad332 --- /dev/null +++ b/src/atom/io/_script.hpp @@ -0,0 +1,112 @@ +#ifndef ATOM_IO_SCRIPT_HPP +#define ATOM_IO_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "compress.hpp" +#include "file.hpp" +#include "glob.hpp" +#include "ifile.hpp" +#include "io.hpp" + +using namespace Atom::IO; + +namespace Atom::_Script::IO { +/** + * Adds the String Methods to the given Carbon module. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + m->add(Carbon::fun(&compress_file), "compress_file"); + m->add(Carbon::fun(&decompress_file), "decompress_file"); + m->add(Carbon::fun(&compress_folder), "compress_folder"); + m->add(Carbon::fun(&create_zip), "create_zip"); + m->add(Carbon::fun(&extract_zip), "extract_zip"); + + m->add(user_type(), "FileManager"); + m->add(Carbon::constructor(), "FileManager"); + m->add(Carbon::fun(&FileManager::createFile), "createFile"); + m->add(Carbon::fun(&FileManager::openFile), "openFile"); + m->add(Carbon::fun(&FileManager::readFile), "readFile"); + m->add(Carbon::fun(&FileManager::writeFile), "writeFile"); + m->add(Carbon::fun(&FileManager::moveFile), "moveFile"); + m->add(Carbon::fun(&FileManager::deleteFile), "deleteFile"); + m->add(Carbon::fun(&FileManager::getFileSize), "getFileSize"); + m->add(Carbon::fun(&FileManager::getFileDirectory), "getFileDirectory"); + + m->add(Carbon::fun(&glob::translate), "translate"); + m->add(Carbon::fun(&glob::expand_tilde), "expand_tilde"); + m->add(Carbon::fun(&glob::has_magic), "has_magic"); + m->add(Carbon::fun(&glob::is_hidden), "is_hidden"); + m->add(Carbon::fun(&glob::string_replace), "string_replace"); + m->add(Carbon::fun(&glob::is_recursive), "is_recursive"); + m->add(Carbon::fun(&glob::filter), "filter"); + m->add(Carbon::fun(&glob::glob0), "glob0"); + m->add(Carbon::fun(&glob::compile_pattern), "compile_pattern"); + m->add(Carbon::fun(&glob::glob1), "glob1"); + m->add(Carbon::fun(&glob::glob2), "glob2"); + m->add(Carbon::fun(&glob::iter_directory), "iter_directory"); + m->add(Carbon::fun(&glob::rlistdir), "rlistdir"); + + m->add(user_type(), "FileWrapper"); + m->add(Carbon::constructor(), "FileWrapper"); + m->add(Carbon::fun( + static_cast&)>( + &FileWrapper::write)), + "write"); + m->add(Carbon::fun(&FileWrapper::read), "read"); + m->add(Carbon::fun(&FileWrapper::exists), "exists"); + m->add(Carbon::fun(&FileWrapper::remove), "remove"); + m->add(Carbon::fun(&FileWrapper::get_path), "get_path"); + m->add(Carbon::fun(&FileWrapper::is_binary_file), "is_binary_file"); + m->add(Carbon::fun(&FileWrapper::get_size), "get_size"); + m->add(Carbon::fun(&FileWrapper::get_size_string), "get_size_string"); + m->add(Carbon::fun(&FileWrapper::get_last_write_time), + "get_last_write_time"); + m->add(Carbon::fun(&FileWrapper::rename), "rename"); + m->add(Carbon::fun(&FileWrapper::copy_to), "copy_to"); + m->add(Carbon::fun(&FileWrapper::move_to), "move_to"); + m->add(Carbon::fun(&FileWrapper::is_empty), "is_empty"); + m->add(Carbon::fun( + static_cast&)>( + &FileWrapper::append)), + "append"); + + m->add(Carbon::fun( + static_cast(&createDirectory)), + "createDirectory"); + m->add(Carbon::fun(&createDirectoriesRecursive), + "createDirectoriesRecursive"); + m->add(Carbon::fun(&removeDirectory), "removeDirectory"); + m->add(Carbon::fun(&renameDirectory), "renameDirectory"); + m->add(Carbon::fun(&moveDirectory), "moveDirectory"); + m->add(Carbon::fun(©File), "copyFile"); + m->add(Carbon::fun(&moveFile), "moveFile"); + m->add(Carbon::fun(&removeFile), "removeFile"); + m->add(Carbon::fun(&createSymlink), "createSymlink"); + m->add(Carbon::fun(&removeSymlink), "removeSymlink"); + m->add(Carbon::fun(&fileSize), "fileSize"); + m->add(Carbon::fun(&traverseDirectories), "traverseDirectories"); + m->add(Carbon::fun(&checkFileTypeInFolder), "checkFileTypeInFolder"); + m->add( + Carbon::fun(static_cast(&isFolderExists)), + "isFolderExists"); + m->add(Carbon::fun(static_cast(&isFolderExists)), + "isFolderExists"); + m->add(Carbon::fun(&isFileExists), "isFileExists"); + m->add(Carbon::fun(&isFolderNameValid), "isFolderNameValid"); + m->add(Carbon::fun(&isFileNameValid), "isFileNameValid"); + m->add(Carbon::fun(&isAbsolutePath), "isAbsolutePath"); + m->add(Carbon::fun(&isExecutableFile), "isExecutableFile"); + m->add(Carbon::fun(&changeWorkingDirectory), "changeWorkingDirectory"); + m->add(Carbon::fun(&convertToLinuxPath), "convertToLinuxPath"); + m->add(Carbon::fun(&convertToWindowsPath), "convertToWindowsPath"); + m->add(Carbon::fun(&normPath), "normPath"); + m->add(Carbon::fun(&isFolderEmpty), "isFolderEmpty"); + m->add(Carbon::fun(&getFileTimes), "getFileTimes"); + m->add(Carbon::fun(&renameFile), "renameFile"); + return m; +} +} // namespace Atom::_Script::IO + +#endif \ No newline at end of file diff --git a/src/atom/io/ifile.cpp b/src/atom/io/ifile.cpp new file mode 100644 index 00000000..9e825754 --- /dev/null +++ b/src/atom/io/ifile.cpp @@ -0,0 +1,189 @@ +#include "ifile.hpp" + +namespace Atom::IO { +FileWrapper::FileWrapper(const fs::path& file_path) : file_path_(file_path) {} + +void FileWrapper::write(const std::string& content) { write_file(content); } + +void FileWrapper::write(const std::vector& content) { + write_file(content); +} + +std::variant> FileWrapper::read() { + if (is_binary_file()) { + return read_file>(); + } else { + return read_file(); + } +} + +bool FileWrapper::exists() const { return fs::exists(file_path_); } + +void FileWrapper::remove() { + if (exists()) { + fs::remove(file_path_); + } +} + +fs::path FileWrapper::get_path() const { return file_path_; } + +bool FileWrapper::is_binary_file() const { + std::ifstream file(file_path_, std::ios::binary); + if (file.is_open()) { + char byte; + while (file.get(byte)) { + if (byte == '\0') { + return true; + } + } + } + return false; +} + +uintmax_t FileWrapper::get_size() const { return fs::file_size(file_path_); } + +std::string FileWrapper::get_size_string() const { + auto size = get_size(); + std::stringstream ss; + if (size < 1024) { + ss << size << " B"; + } else if (size < 1024 * 1024) { + ss << std::fixed << std::setprecision(2) << size / 1024.0 << " KB"; + } else if (size < 1024 * 1024 * 1024) { + ss << std::fixed << std::setprecision(2) << size / (1024.0 * 1024.0) + << " MB"; + } else { + ss << std::fixed << std::setprecision(2) + << size / (1024.0 * 1024.0 * 1024.0) << " GB"; + } + return ss.str(); +} + +std::string FileWrapper::get_last_write_time() const { + auto last_write_time = fs::last_write_time(file_path_); + auto time_point = + std::chrono::time_point_cast( + last_write_time - fs::file_time_type::clock::now() + + std::chrono::system_clock::now()); + auto time_t = std::chrono::system_clock::to_time_t(time_point); + std::stringstream ss; + ss << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S"); + return ss.str(); +} + +void FileWrapper::rename(const fs::path& new_path) { + fs::rename(file_path_, new_path); + file_path_ = new_path; +} + +void FileWrapper::copy_to(const fs::path& destination) const { + fs::copy_file(file_path_, destination, + fs::copy_options::overwrite_existing); +} + +void FileWrapper::move_to(const fs::path& destination) { + fs::rename(file_path_, destination); + file_path_ = destination; +} + +bool FileWrapper::is_empty() const { return get_size() == 0; } + +void FileWrapper::append(const std::string& content) { + std::ofstream file(file_path_, std::ios::app); + if (!file) { + throw std::runtime_error("无法打开文件进行追加: " + + file_path_.string()); + } + file << content; +} + +void FileWrapper::append(const std::vector& content) { + std::ofstream file(file_path_, std::ios::app | std::ios::binary); + if (!file) { + throw std::runtime_error("无法打开文件进行追加: " + + file_path_.string()); + } + file.write(reinterpret_cast(content.data()), content.size()); +} + +void FileWrapper::write_at(const std::string& content, + std::streampos position) { + std::fstream file(file_path_, std::ios::in | std::ios::out); + if (!file) { + throw std::runtime_error("无法打开文件进行写入: " + + file_path_.string()); + } + file.seekp(position); + file << content; +} + +void FileWrapper::write_at(const std::vector& content, + std::streampos position) { + std::fstream file(file_path_, + std::ios::in | std::ios::out | std::ios::binary); + if (!file) { + throw std::runtime_error("无法打开文件进行写入: " + + file_path_.string()); + } + file.seekp(position); + file.write(reinterpret_cast(content.data()), content.size()); +} + +std::variant> FileWrapper::read_from( + std::streampos start, std::streamsize count) { + std::ifstream file(file_path_, std::ios::binary); + if (!file) { + throw std::runtime_error("无法打开文件进行读取: " + + file_path_.string()); + } + file.seekg(start); + if (is_binary_file()) { + std::vector content(count); + file.read(reinterpret_cast(content.data()), count); + return content; + } else { + std::string content(count, '\0'); + file.read(&content[0], count); + return content; + } +} + +std::string FileWrapper::get_extension() const { + return file_path_.extension().string(); +} + +std::string FileWrapper::get_stem() const { return file_path_.stem().string(); } + +std::string FileWrapper::get_parent_path() const { + return file_path_.parent_path().string(); +} + +bool FileWrapper::is_directory() const { return fs::is_directory(file_path_); } + +bool FileWrapper::is_regular_file() const { + return fs::is_regular_file(file_path_); +} + +bool FileWrapper::is_symlink() const { return fs::is_symlink(file_path_); } + +std::uintmax_t FileWrapper::get_hard_link_count() const { + return fs::hard_link_count(file_path_); +} + +void FileWrapper::create_symlink(const fs::path& target) { + fs::create_symlink(target, file_path_); +} + +void FileWrapper::create_hardlink(const fs::path& target) { + fs::create_hard_link(target, file_path_); +} + +void FileWrapper::permissions(fs::perms prms) { + fs::permissions(file_path_, prms); +} + +fs::perms FileWrapper::permissions() const { + return fs::status(file_path_).permissions(); +} + +} // namespace Atom::IO diff --git a/src/atom/io/ifile.hpp b/src/atom/io/ifile.hpp new file mode 100644 index 00000000..b3bbf944 --- /dev/null +++ b/src/atom/io/ifile.hpp @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; + +namespace Atom::IO { + +class FileWrapper { +public: + /** + * @brief Constructs a FileWrapper object with the given file path. + * @param file_path The path to the file. + */ + explicit FileWrapper(const fs::path& file_path); + + /** + * @brief Writes string content to the file. + * @param content The string content to be written. + */ + void write(const std::string& content); + + /** + * @brief Writes binary content to the file. + * @param content The binary content to be written. + */ + void write(const std::vector& content); + + /** + * @brief Reads content from the file. + * @return A variant containing either a string or binary content. + */ + std::variant> read(); + + /** + * @brief Checks if the file exists. + * @return True if the file exists, false otherwise. + */ + bool exists() const; + + /** + * @brief Removes the file. + */ + void remove(); + + /** + * @brief Gets the path of the file. + * @return The path of the file. + */ + fs::path get_path() const; + + /** + * @brief Checks if the file is a binary file. + * @return True if the file is binary, false otherwise. + */ + bool is_binary_file() const; + + /** + * @brief Gets the size of the file. + * @return The size of the file in bytes. + */ + uintmax_t get_size() const; + + /** + * @brief Gets the size of the file as a human-readable string. + * @return The size of the file as a string (e.g., "10 KB"). + */ + std::string get_size_string() const; + + /** + * @brief Gets the last write time of the file. + * @return A string representing the last write time of the file. + */ + std::string get_last_write_time() const; + + /** + * @brief Renames the file. + * @param new_path The new path of the file. + */ + void rename(const fs::path& new_path); + + /** + * @brief Copies the file to a new location. + * @param destination The destination path. + */ + void copy_to(const fs::path& destination) const; + + /** + * @brief Moves the file to a new location. + * @param destination The destination path. + */ + void move_to(const fs::path& destination); + + /** + * @brief Checks if the file is empty. + * @return True if the file is empty, false otherwise. + */ + bool is_empty() const; + + /** + * @brief Appends content to the file. + * @param content The content to be appended. + */ + void append(const std::string& content); + + /** + * @brief Appends binary content to the file. + * @param content The binary content to be appended. + */ + void append(const std::vector& content); + + /** + * @brief Writes content to the file at a specific position. + * @param content The content to be written. + * @param position The position to write the content. + */ + void write_at(const std::string& content, std::streampos position); + + /** + * @brief Writes binary content to the file at a specific position. + * @param content The binary content to be written. + * @param position The position to write the content. + */ + void write_at(const std::vector& content, std::streampos position); + + /** + * @brief Reads content from the file at a specific position. + * @param start The starting position. + * @param count The number of bytes to read. + * @return A variant containing either a string or binary content. + */ + std::variant> read_from( + std::streampos start, std::streamsize count); + + /** + * @brief Gets the extension of the file. + * @return The extension of the file. + */ + std::string get_extension() const; + + /** + * @brief Gets the stem of the file. + * @return The stem of the file. + */ + std::string get_stem() const; + + /** + * @brief Gets the parent path of the file. + * @return The parent path of the file. + */ + std::string get_parent_path() const; + + /** + * @brief Checks if the file is a directory. + * @return True if the file is a directory, false otherwise. + */ + bool is_directory() const; + + /** + * @brief Checks if the file is a regular file. + * @return True if the file is a regular file, false otherwise. + */ + bool is_regular_file() const; + + /** + * @brief Checks if the file is a symbolic link. + * @return True if the file is a symbolic link, false otherwise. + */ + bool is_symlink() const; + + /** + * @brief Gets the hard link count of the file. + * @return The hard link count of the file. + */ + std::uintmax_t get_hard_link_count() const; + + /** + * @brief Creates a symbolic link to the file. + * @param target The target path of the symbolic link. + */ + void create_symlink(const fs::path& target); + + /** + * @brief Creates a hard link to the file. + * @param target The target path of the hard link. + */ + void create_hardlink(const fs::path& target); + + /** + * @brief Sets the permissions of the file. + * @param prms The permissions to set. + */ + void permissions(fs::perms prms); + + /** + * @brief Gets the permissions of the file. + * @return The permissions of the file. + */ + fs::perms permissions() const; + +private: + fs::path file_path_; + + /** + * @brief Writes content to the file. + * @tparam T The type of content to be written. + * @param content The content to be written. + */ + template + void write_file(const T& content) { + auto file = std::ofstream(file_path_, std::ios::binary); + if (!file) { + throw std::runtime_error("Failed to write " + file_path_.string()); + } + file.write(reinterpret_cast(content.data()), + content.size()); + } + + /** + * @brief Reads content from the file. + * @tparam T The type of content to be read. + * @return The content read from the file. + */ + template + T read_file() { + auto file = std::ifstream(file_path_, std::ios::binary); + if (!file) { + throw std::runtime_error("Failed to read " + file_path_.string()); + } + return T(std::istreambuf_iterator(file), {}); + } +}; +} // namespace Atom::IO diff --git a/src/atom/log/CMakeLists.txt b/src/atom/log/CMakeLists.txt index c2298f5b..7034d88a 100644 --- a/src/atom/log/CMakeLists.txt +++ b/src/atom/log/CMakeLists.txt @@ -80,7 +80,6 @@ endif() # ---------------------------------------------------------- set(LOGURU_USE_FMTLIB On) -set(LOGURU_STACKTRACES On) if (WIN32) find_package(dlfcn-win32 REQUIRED) diff --git a/src/atom/log/loguru.cpp b/src/atom/log/loguru.cpp index ba953a58..6735f0b9 100644 --- a/src/atom/log/loguru.cpp +++ b/src/atom/log/loguru.cpp @@ -54,7 +54,7 @@ #ifdef _WIN32 #include - +#include #define localtime_r(a, b) \ localtime_s(b, a) // No localtime_r with MSVC, but arguments are swapped // for localtime_s @@ -68,8 +68,6 @@ #include // PATH_MAX #elif !defined(_WIN32) #include // PATH_MAX -#elif _WIN32 -#include #endif #ifndef PATH_MAX @@ -86,7 +84,7 @@ #define LOGURU_PTHREADS 0 #define LOGURU_WINTHREADS 1 #ifndef LOGURU_STACKTRACES -#define LOGURU_STACKTRACES 1 +#define LOGURU_STACKTRACES 0 #endif #else #define LOGURU_PTHREADS 1 @@ -103,19 +101,10 @@ #endif #if LOGURU_STACKTRACES -#ifdef _WIN32 -#include -#include -#include -#ifndef __MINGW64__ -#pragma comment(lib, "DbgHelp.lib") -#endif -#else #include // for __cxa_demangle #include // for dladdr #include // for backtrace -#endif -#endif // LOGURU_STACKTRACES +#endif // LOGURU_STACKTRACES #if LOGURU_PTHREADS #include @@ -142,10 +131,7 @@ #define _WIN32_WINNT 0x0502 #endif #define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX #define NOMINMAX -#endif - #include #endif @@ -790,27 +776,13 @@ void suggest_log_path(const char* prefix, char* buff, } #ifdef _WIN32 - size_t buff_len = strlen(buff); - size_t remaining_space = buff_size - buff_len - 1; - if (remaining_space > 0) { - size_t filename_len = s_argv0_filename.length(); - size_t copy_len = std::min(filename_len, remaining_space); - strncat_s(buff + buff_len, remaining_space, s_argv0_filename.c_str(), - copy_len); - remaining_space = buff_size - strlen(buff) - 1; - buff_len = strlen(buff); - if (remaining_space > 0) { - strncat_s(buff + buff_len, remaining_space, "/", 1); - remaining_space = buff_size - strlen(buff) - 1; - buff_len = strlen(buff); - } - write_date_time(buff + buff_len, remaining_space); - remaining_space = buff_size - strlen(buff) - 1; - buff_len = strlen(buff); - if (remaining_space > 0) { - strncat_s(buff + buff_len, remaining_space, ".log", 4); - } - } + strncat_s(buff, buff_size - strlen(buff) - 1, s_argv0_filename.c_str(), + buff_size - strlen(buff) - 1); + strncat_s(buff, buff_size - strlen(buff) - 1, "/", + buff_size - strlen(buff) - 1); + write_date_time(buff + strlen(buff), buff_size - strlen(buff)); + strncat_s(buff, buff_size - strlen(buff) - 1, ".log", + buff_size - strlen(buff) - 1); #else strncat(buff, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); strncat(buff, "/", buff_size - strlen(buff) - 1); @@ -1089,12 +1061,7 @@ void make_pthread_key_name() { #if LOGURU_WINTHREADS // Where we store the custom thread name set by `set_thread_name` char* thread_name_buffer() { -#ifdef _WIN32 thread_local static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = {0}; -#else - __declspec(thread) static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { - 0}; -#endif return &thread_name[0]; } #endif // LOGURU_WINTHREADS @@ -1187,23 +1154,8 @@ void get_thread_name(char* buffer, unsigned long long length, #if LOGURU_STACKTRACES Text demangle(const char* name) { int status = -1; -#ifdef _WIN32 - DWORD length = 512; - char* demangled = (char*)malloc(length * sizeof(char)); - if (demangled) { - if (UnDecorateSymbolName(name, demangled, length, UNDNAME_COMPLETE) != - 0) { - status = 0; - } - } -#else - char* demangled = abi::__cxa_demangle(name, nullptr, nullptr, &status); -#endif - - Text result{status == 0 && demangled ? demangled : STRDUP(name)}; -#ifdef _WIN32 - free(demangled); -#endif + char* demangled = abi::__cxa_demangle(name, 0, 0, &status); + Text result{status == 0 ? demangled : STRDUP(name)}; return result; } @@ -1265,39 +1217,8 @@ std::string stacktrace_as_stdstring(int skip) { // From https://gist.github.com/fmela/591333 void* callstack[128]; const auto max_frames = sizeof(callstack) / sizeof(callstack[0]); - int num_frames = 0; - -#ifdef _WIN32 - num_frames = CaptureStackBackTrace(0, max_frames, callstack, nullptr); -#else - num_frames = backtrace(callstack, max_frames); -#endif - - char** symbols = nullptr; - -#ifdef _WIN32 - SYMBOL_INFO* symbol_info = - (SYMBOL_INFO*)malloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char)); - symbol_info->MaxNameLen = 255; - symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO); - - symbols = (char**)malloc(num_frames * sizeof(char*)); - for (int i = 0; i < num_frames; ++i) { - symbols[i] = (char*)malloc(256 * sizeof(char)); - symbol_info->Name[0] = '\0'; - symbol_info->Address = (DWORD64)callstack[i]; - DWORD64 displacement = 0; - if (SymFromAddr(GetCurrentProcess(), (DWORD64)callstack[i], - &displacement, symbol_info)) { - StringCchPrintfA(symbols[i], 256, "%s + 0x%I64X", symbol_info->Name, - displacement); - } else { - StringCchPrintfA(symbols[i], 256, "0x%p", callstack[i]); - } - } -#else - symbols = backtrace_symbols(callstack, num_frames); -#endif + int num_frames = backtrace(callstack, max_frames); + char** symbols = backtrace_symbols(callstack, num_frames); std::string result; // Print stack traces so the most relevant ones are written last @@ -1305,15 +1226,28 @@ std::string stacktrace_as_stdstring(int skip) { // http://yellerapp.com/posts/2015-01-22-upside-down-stacktraces.html for (int i = num_frames - 1; i >= skip; --i) { char buf[1024]; -#ifdef _WIN32 - snprintf(buf, sizeof(buf), "%-3d %p %s\n", i - skip, callstack[i], - symbols[i]); -#else - snprintf(buf, sizeof(buf), "%-3d %*p %s\n", i - skip, - int(2 + sizeof(void*) * 2), callstack[i], symbols[i]); -#endif + Dl_info info; + if (dladdr(callstack[i], &info) && info.dli_sname) { + char* demangled = NULL; + int status = -1; + if (info.dli_sname[0] == '_') { + demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); + } + snprintf(buf, sizeof(buf), "%-3d %*p %s + %zd\n", i - skip, + int(2 + sizeof(void*) * 2), callstack[i], + status == 0 ? demangled + : info.dli_sname == 0 ? symbols[i] + : info.dli_sname, + static_cast(callstack[i]) - + static_cast(info.dli_saddr)); + free(demangled); + } else { + snprintf(buf, sizeof(buf), "%-3d %*p %s\n", i - skip, + int(2 + sizeof(void*) * 2), callstack[i], symbols[i]); + } result += buf; } + free(symbols); if (num_frames == max_frames) { result = "[truncated]\n" + result; @@ -1323,12 +1257,6 @@ std::string stacktrace_as_stdstring(int skip) { result.resize(result.size() - 1); } -#ifdef _WIN32 - free(symbol_info); -#else - free(symbols); -#endif - return prettify_stacktrace(result); } diff --git a/src/atom/log/loguru.hpp b/src/atom/log/loguru.hpp index 93203f91..c23e6adf 100644 --- a/src/atom/log/loguru.hpp +++ b/src/atom/log/loguru.hpp @@ -201,7 +201,7 @@ loguru::Verbosity_MAX); #endif #ifndef LOGURU_USE_FMTLIB -#define LOGURU_USE_FMTLIB 1 +#define LOGURU_USE_FMTLIB 0 #endif #ifndef LOGURU_USE_LOCALE @@ -1268,9 +1268,6 @@ LOGURU_ANONYMOUS_NAMESPACE_END #define DVLOG_IF_F(verbosity, ...) VLOG_IF_F(verbosity, __VA_ARGS__) #define DRAW_LOG_F(verbosity_name, ...) RAW_LOG_F(verbosity_name, __VA_ARGS__) #define DRAW_VLOG_F(verbosity, ...) RAW_VLOG_F(verbosity, __VA_ARGS__) -#define DLOG_SCOPE_F(verbosity_name, ...) \ - LOG_SCOPE_F(verbosity_name, __VA_ARGS__) -#define DLOG_SCOPE_FUNCTION(...) LOG_SCOPE_FUNCTION(__VA_ARGS__) #else // Debug logging disabled: #define DLOG_F(verbosity_name, ...) @@ -1279,8 +1276,6 @@ LOGURU_ANONYMOUS_NAMESPACE_END #define DVLOG_IF_F(verbosity, ...) #define DRAW_LOG_F(verbosity_name, ...) #define DRAW_VLOG_F(verbosity, ...) -#define DLOG_SCOPE_F(verbosity_name, ...) -#define DLOG_SCOPE_FUNCTION(...) #endif #define CHECK_EQ_F(a, b, ...) CHECK_OP_F(a, b, ==, ##__VA_ARGS__) diff --git a/src/atom/type/CMakeLists.txt b/src/atom/type/CMakeLists.txt index 4a07fb21..1eb8126a 100644 --- a/src/atom/type/CMakeLists.txt +++ b/src/atom/type/CMakeLists.txt @@ -11,7 +11,6 @@ project(atom-type C CXX) # Sources set(${PROJECT_NAME}_SOURCES - args.cpp ini.cpp message.cpp ) diff --git a/src/atom/type/args.cpp b/src/atom/type/args.cpp deleted file mode 100644 index 24cac700..00000000 --- a/src/atom/type/args.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * args.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2023-12-28 - -Description: Argument Container Library for C++ - -**************************************************/ - -#include "args.hpp" - -bool ArgumentContainer::remove(const std::string &name) { - if (m_arguments.find(name) == m_arguments.end()) { - return false; - } - return m_arguments.erase(name) != 0; -} - -bool ArgumentContainer::contains(const std::string &name) const { - return m_arguments.count(name) != 0; -} - -std::size_t ArgumentContainer::size() const { return m_arguments.size(); } - -std::vector ArgumentContainer::getNames() const { - std::vector names; - names.reserve(m_arguments.size()); - for (const auto &pair : m_arguments) { - names.push_back(pair.first); - } - return names; -} - -std::string ArgumentContainer::toJson() const { - std::string json; - json += "{"; - for (const auto &pair : m_arguments) { - json += "\"" + pair.first + "\":"; - if (pair.second.type() == typeid(std::string)) { - json += "\"" + std::any_cast(pair.second) + "\""; - } else if (pair.second.type() == typeid(int)) { - json += std::to_string(std::any_cast(pair.second)); - } else if (pair.second.type() == typeid(double)) { - json += std::to_string(std::any_cast(pair.second)); - } else if (pair.second.type() == typeid(bool)) { - json += std::to_string(std::any_cast(pair.second)); - } else { - json += "null"; - } - json += ","; - } - json += "}"; - return json; -} \ No newline at end of file diff --git a/src/atom/type/args.hpp b/src/atom/type/args.hpp index 6116789d..d7942c10 100644 --- a/src/atom/type/args.hpp +++ b/src/atom/type/args.hpp @@ -43,184 +43,148 @@ Description: Argument Container Library for C++ #define REMOVE_ARGUMENT(container, name) container.remove(#name) /** - * @brief 用于存储和获取参数的容器。 - * @brief A container for storing and retrieving arguments. + * @brief 通用容器,用于存储任意类型的键值对。 + * @brief A universal container for storing any type of key-value pairs. + * @note 这是ArgumentContainer的弱化版,虽然功能少,但是性能更好。 + * @note This is a weak version of ArgumentContainer, although it has fewer + * features, it has better performance. */ -class ArgumentContainer { +class Args { public: /** - * @brief 设置参数值。 - * @brief Set the value of a parameter. - * @tparam T 参数的类型。 - * @tparam T The type of the parameter. - * @param name 参数的名称。 - * @param name The name of the parameter. - * @param value 参数的值。 - * @param value The value of the parameter. - * @note 若参数已存在,则会覆盖原有的值。 - * @note If the parameter exists, it will overwrite the original value. + * @brief 设置键值对。 + * @brief Set key-value pairs. + * @param key 键。 + * @param key Key. + * @param value 值。 + * @param value Value. + * @note 如果键已存在,则会覆盖原有的值。 + * @note If the key exists, it will overwrite the original value. */ template - void set(const std::string &name, const T &value); + void set(std::string_view key, T &&value) { + m_data[key] = std::forward(value); + } /** - * @brief 获取参数值。 - * @brief Get the value of a parameter. - * @tparam T 参数的类型。 - * @tparam T The type of the parameter. - * @param name 参数的名称。 - * @param name The name of the parameter. - * @return 参数的值(如果存在),否则返回std::nullopt。 - * @return The value of the parameter (if it exists), otherwise return - * std::nullopt. + * @brief 获取键对应的值。 + * @brief Get the value corresponding to the key. + * @param key 键。 + * @param key Key. + * @return 值。 + * @return Value. + * @note 如果键不存在,则会抛出异常。 + * @note If the key does not exist, an exception will be thrown. */ template - std::optional get(const std::string &name) const; + T get(std::string_view key) const { + return std::any_cast(m_data.at(key)); + } /** - * @brief 移除指定的参数。 - * @brief Remove a specified parameter. - * @param name 要移除的参数的名称。 - * @param name The name of the parameter to be removed. - * @return 如果成功移除参数,则返回true;否则返回false - * @return If the parameter is successfully removed, return true; otherwise - * return false。 + * @brief 获取键对应的值(如果键不存在,则返回默认值)。 + * @brief Get the value corresponding to the key (if the key does not exist, + * return the default value). + * @param key 键。 + * @param key Key. + * @param default_value 默认值。 + * @param default_value Default value. + * @return 值。 + * @return Value. */ - bool remove(const std::string &name); + template + T get_or(std::string_view key, T &&default_value) const { + if (auto it = m_data.find(key); it != m_data.end()) { + return std::any_cast(it->second); + } + return std::forward(default_value); + } /** - * @brief 检查参数是否存在。 - * @brief Check if a parameter exists. - * @param name 要检查的参数的名称。 - * @param name The name of the parameter to be checked. - * @return 如果参数存在,则返回true;否则返回false。 - * @return If the parameter exists, return true; otherwise return false. + * @brief 获取键对应的值(如果键不存在,则返回 std::nullopt)。 + * @brief Get the value corresponding to the key (if the key does not exist, + * return std::nullopt). + * @param key 键。 + * @param key Key. + * @return 值。 + * @return Value. */ - bool contains(const std::string &name) const; + template + std::optional get_optional(std::string_view key) const { + if (auto it = m_data.find(key); it != m_data.end()) { + return std::any_cast(it->second); + } + return std::nullopt; + } /** - * @brief 获取参数的数量。 - * @brief Get the number of parameters. - * @return 参数的数量。 - * @return The number of parameters. + * @brief 检查键是否存在。 + * @brief Check if the key exists. + * @param key 键。 + * @param key Key. + * @return 如果键存在,则返回true;否则返回false。 + * @return If the key exists, return true; otherwise return false. */ - std::size_t size() const; + bool contains(std::string_view key) const noexcept { + return m_data.contains(key); + } /** - * @brief 获取所有参数的名称。 - * @brief Get all parameter names. - * @return 包含所有参数名称的字符串向量。 - * @return A vector containing all parameter names. + * @brief 移除键值对。 + * @brief Remove key-value pairs. + * @param key 键。 + * @param key Key. */ - std::vector getNames() const; + void remove(std::string_view key) { m_data.erase(key); } /** - * @brief 重载索引运算符[]以获取和设置参数值。 - * @brief Overload the index operator [] to get and set the value of a - * parameter. - * @tparam T 参数的类型。 - * @tparam T The type of the parameter. - * @param name 参数的名称。 - * @param name The name of the parameter. - * @return 参数的引用。 - * @return A reference to the parameter. + * @brief 清空容器。 + * @brief Clear the container. */ - template - T &operator[](const std::string &name) { - return std::any_cast(m_arguments[name]); - } - + void clear() noexcept { m_data.clear(); } /** - * @brief 重载赋值运算符=以设置参数值。 - * @brief Overload the assignment operator = to set the value of a - * parameter. - * @tparam T 参数的类型。 - * @tparam T The type of the parameter. - * @param argument 要设置的参数(名称和值)。 - * @param argument The parameter to be set (name and value). + * @brief 获取容器中键值对的数量。 + * @brief Get the number of key-value pairs in the container. + * @return 键值对的数量。 + * @return The number of key-value pairs. */ - template - void operator=(const std::pair &argument) { - set(argument.first, argument.second); - } + size_t size() const noexcept { return m_data.size(); } /** - * @brief 重载赋值运算符=以设置参数值。 - * @brief Overload the assignment operator = to set the value of a - * parameter. - * @param container 要设置的参数容器。 - * @param container The parameter container to be set. + * @brief 检查容器是否为空。 + * @brief Check if the container is empty. + * @return 如果容器为空,则返回true;否则返回false。 + * @return If the container is empty, return true; otherwise return false. */ -#if ENABLE_FASTHASH - void operator=(const emhash8::HashMap &container) -#else - void operator=(const std::unordered_map &container) -#endif - { - m_arguments = container; - } + bool empty() const noexcept { return m_data.empty(); } - std::string toJson() const; - -private: #if ENABLE_FASTHASH - emhash8::HashMap m_arguments; // 存储参数的容器 + emhash8::HashMap data() #else - std::unordered_map m_arguments; // 存储参数的容器 + std::unordered_map data() #endif -}; - -template -void ArgumentContainer::set(const std::string &name, const T &value) { - if (m_arguments.find(name) != m_arguments.end()) { - m_arguments.erase(name); + const noexcept { + return m_data; } - m_arguments[name] = value; -} -template -std::optional ArgumentContainer::get(const std::string &name) const { - auto it = m_arguments.find(name); - if (it != m_arguments.end()) { - try { - return std::any_cast(it->second); - } catch (const std::bad_any_cast &) { - return std::nullopt; - } - } else { - return std::nullopt; - } -} - -using Args = ArgumentContainer; - -/** - * @brief 通用容器,用于存储任意类型的键值对。 - * @brief A universal container for storing any type of key-value pairs. - * @note 这是ArgumentContainer的弱化版,虽然功能少,但是性能更好。 - * @note This is a weak version of ArgumentContainer, although it has fewer - * features, it has better performance. - */ -class UniversalContainer { -public: /** - * @brief 设置键值对。 - * @brief Set key-value pairs. + * @brief 获取指定键对应的值。 + * @brief Get the value corresponding to the specified key. * @param key 键。 * @param key Key. - * @param value 值。 - * @param value Value. - * @note 如果键已存在,则会覆盖原有的值。 - * @note If the key exists, it will overwrite the original value. + * @return 值。 + * @return Value. + * @note 如果键不存在,则会插入一个新的键值对。 + * @note If the key does not exist, a new key-value pair will be inserted. */ template - void set(std::string_view key, T &&value) { - m_data.emplace(key, std::forward(value)); + T &operator[](std::string_view key) { + return std::any_cast(m_data[key]); } /** - * @brief 获取键对应的值。 - * @brief Get the value corresponding to the key. + * @brief 获取指定键对应的值。 + * @brief Get the value corresponding to the specified key. * @param key 键。 * @param key Key. * @return 值。 @@ -229,29 +193,39 @@ class UniversalContainer { * @note If the key does not exist, an exception will be thrown. */ template - T get(std::string_view key) const { - try { - return std::any_cast(m_data.at(key)); - } catch (const std::out_of_range &) { - throw std::runtime_error("Key not found"); - } + const T &operator[](std::string_view key) const { + return std::any_cast(m_data.at(key)); } /** - * @brief 检查键是否存在。 - * @brief Check if the key exists. + * @brief 获取指定键对应的值。 + * @brief Get the value corresponding to the specified key. * @param key 键。 * @param key Key. - * @return 如果键存在,则返回true;否则返回false。 - * @return If the key exists, return true; otherwise return false. + * @return 值。 + * @return Value. + * @note 如果键不存在,则会插入一个新的键值对。 + * @note If the key does not exist, a new key-value pair will be inserted. */ - bool contains(std::string_view key) const noexcept { - return m_data.find(key) != m_data.end(); + std::any &operator[](std::string_view key) { return m_data[key]; } + + /** + * @brief 获取指定键对应的值。 + * @brief Get the value corresponding to the specified key. + * @param key 键。 + * @param key Key. + * @return 值。 + * @return Value. + * @note 如果键不存在,则会抛出异常。 + * @note If the key does not exist, an exception will be thrown. + */ + const std::any &operator[](std::string_view key) const { + return m_data.at(key); } private: #if ENABLE_FASTHASH - emhash8::HashMap m_data; + emhash8::HashMap m_data; #else std::unordered_map m_data; #endif diff --git a/src/atom/type/argsview.hpp b/src/atom/type/argsview.hpp new file mode 100644 index 00000000..6d23e57a --- /dev/null +++ b/src/atom/type/argsview.hpp @@ -0,0 +1,259 @@ +/* + * argsview.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-12-28 + +Description: Argument View for C++20 + +**************************************************/ + +#ifndef ATOM_TYPE_ARGSVIEW_HPP +#define ATOM_TYPE_ARGSVIEW_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +template +class ArgsView { +public: + constexpr ArgsView(Args&&... args) noexcept + : args_(std::forward(args)...) {} + + template ...>, + int> = 0> + constexpr ArgsView(const std::tuple& other_tuple) + : args_(std::apply( + [](const auto&... args) { + return std::tuple(std::forward(args)...); + }, + other_tuple)) {} + + template ...>, + int> = 0> + constexpr ArgsView(ArgsView other_args_view) + : args_(std::apply( + [](const auto&... args) { + return std::tuple(std::forward(args)...); + }, + other_args_view.args_)) {} + + template + constexpr decltype(auto) get() const noexcept { + return std::get(args_); + } + + constexpr size_t size() const noexcept { return sizeof...(Args); } + + constexpr bool empty() const noexcept { return size() == 0; } + + template + constexpr void for_each(Func&& func) const { + apply([&func](auto&&... args) { + (func(std::forward(args)), ...); + }); + } + + template + constexpr auto transform(Func&& func) const { + return ArgsView(std::apply( + [&func](auto&&... args) { + return std::make_tuple( + func(std::forward(args))...); + }, + args_)); + } + + template + constexpr auto accumulate(Func&& func, Init init) const { + return apply([&func, init = std::move(init)](auto&&... args) mutable { + ((init = func(std::move(init), std::forward(args))), + ...); + return init; + }); + } + + template + constexpr auto apply(Func&& func) const { + return std::apply(std::forward(func), args_); + } + + template ...>, + int> = 0> + constexpr ArgsView& operator=(const std::tuple& other_tuple) { + args_ = std::apply( + [](const auto&... args) { + return std::tuple(std::forward(args)...); + }, + other_tuple); + return *this; + } + + template ...>, + int> = 0> + constexpr ArgsView& operator=(ArgsView other_args_view) { + args_ = std::apply( + [](const auto&... args) { + return std::tuple(std::forward(args)...); + }, + other_args_view.args_); + return *this; + } + + constexpr decltype(auto) begin() const noexcept { + return std::apply( + [](const auto&... args) { + return std::tuple(args...); + }, + args_) + .cbegin(); + } + + constexpr decltype(auto) end() const noexcept { + return std::apply( + [](const auto&... args) { + return std::tuple(args...); + }, + args_) + .cend(); + } + +private: + std::tuple args_; +}; + +template +ArgsView(Args&&...) -> ArgsView...>; + +template +using ArgsViewT = ArgsView...>; + +template +int sum(Args&&... args) { + return ArgsView{std::forward(args)...}.accumulate( + [](int a, int b) { return a + b; }, 0); +} + +template +std::string concat(Args&&... args) { + return transform( + [](const auto& arg) { + if constexpr (std::is_same_v, + const char*>) { + return std::string(arg); + } else { + return std::to_string(arg); + } + }, + make_args_view(std::forward(args)...)) + .accumulate([](std::string a, std::string b) { return a + b; }, + std::string{}); +} + +template +constexpr auto apply(Func&& func, ArgsViewT args_view) { + return args_view.apply(std::forward(func)); +} + +template +constexpr void for_each(Func&& func, ArgsView args_view) { + args_view.for_each(std::forward(func)); +} + +template +constexpr auto accumulate(Func&& func, Init init, + ArgsViewT args_view) { + return args_view.accumulate(std::forward(func), std::move(init)); +} + +template +constexpr ArgsViewT make_args_view(Args&&... args) { + return ArgsViewT(std::forward(args)...); +} + +template +constexpr decltype(auto) get(ArgsView args_view) { + return args_view.template get(); +} + +template +constexpr bool operator==(ArgsView lhs, ArgsView rhs) { + return lhs.size() == rhs.size() && + lhs.apply([&rhs](const auto&... lhs_args) { + return rhs.apply([&lhs_args...](const auto&... rhs_args) { + return ((lhs_args == rhs_args) && ...); + }); + }); +} + +template +constexpr bool operator!=(ArgsView lhs, ArgsView rhs) { + return !(lhs == rhs); +} + +template +constexpr bool operator<(ArgsView lhs, ArgsView rhs) { + return lhs.apply([&rhs](const auto&... lhs_args) { + return rhs.apply([&lhs_args...](const auto&... rhs_args) { + return std::tie(lhs_args...) < std::tie(rhs_args...); + }); + }); +} + +template +constexpr bool operator<=(ArgsView lhs, ArgsView rhs) { + return !(rhs < lhs); +} + +template +constexpr bool operator>(ArgsView lhs, ArgsView rhs) { + return rhs < lhs; +} + +template +constexpr bool operator>=(ArgsView lhs, ArgsView rhs) { + return !(lhs < rhs); +} + +template +struct std::hash> { + std::size_t operator()(ArgsView args_view) const { + return args_view.apply([](const auto&... args) { + std::size_t seed = 0; + ((seed ^= std::hash>{}(args) + + 0x9e3779b9 + (seed << 6) + (seed >> 2)), + ...); + return seed; + }); + } +}; + +#ifdef __DEBUG__ +#include +template +void print(Args&&... args) { + ArgsView{std::forward(args)...}.for_each( + [](const auto& arg) { std::cout << arg << ' '; }); + std::cout << '\n'; +} +#endif + +#endif diff --git a/src/atom/utils/string.hpp b/src/atom/utils/string.hpp index ef3eee1b..e47b0cd0 100644 --- a/src/atom/utils/string.hpp +++ b/src/atom/utils/string.hpp @@ -20,8 +20,6 @@ Description: Some useful string functions #include namespace Atom::Utils { -#include - /** * @brief Checks if the given string contains any uppercase characters. * diff --git a/src/atom/utils/validate_aligned_storage.hpp b/src/atom/utils/validate_aligned_storage.hpp index dc29f29d..b044d155 100644 --- a/src/atom/utils/validate_aligned_storage.hpp +++ b/src/atom/utils/validate_aligned_storage.hpp @@ -15,6 +15,7 @@ Description: Validate aligned storage #ifndef ATOM_UTILS_VALIDATE_ALIGNED_STORAGE_HPP #define ATOM_UTILS_VALIDATE_ALIGNED_STORAGE_HPP +#include #include namespace Atom::Utils { diff --git a/src/carbon/CMakeLists.txt b/src/carbon/CMakeLists.txt index 317e05b8..441f8695 100644 --- a/src/carbon/CMakeLists.txt +++ b/src/carbon/CMakeLists.txt @@ -253,7 +253,9 @@ set(Carbon_SRC command/dynamic_object.cpp command/proxy_functions.cpp + language/common.cpp language/engine.cpp + language/prelude.cpp ) # We will build a static library for Carbon add_library(carbon STATIC ${Carbon_SRC}) diff --git a/src/carbon/language/common.cpp b/src/carbon/language/common.cpp new file mode 100644 index 00000000..6d47ffdb --- /dev/null +++ b/src/carbon/language/common.cpp @@ -0,0 +1,424 @@ +#include "common.hpp" + +#include +#include +#include +#include +#include +#include + +#include +#include "../command/boxed_value.hpp" +#include "../command/dispatchkit.hpp" +#include "../command/proxy_functions.hpp" +#include "../defines.hpp" +#include "atom/experiment/type_info.hpp" + +namespace Carbon { +Parse_Location::Parse_Location(std::string t_fname, const int t_start_line, + const int t_start_col, const int t_end_line, + const int t_end_col) + : start(t_start_line, t_start_col), + end(t_end_line, t_end_col), + filename(std::make_shared(std::move(t_fname))) {} + +Parse_Location::Parse_Location(std::shared_ptr t_fname, + const int t_start_line, const int t_start_col, + const int t_end_line, const int t_end_col) + : start(t_start_line, t_start_col), + end(t_end_line, t_end_col), + filename(std::move(t_fname)) {} + +const std::string &AST_Node::filename() const noexcept { + return *location.filename; +} + +const File_Position &AST_Node::start() const noexcept { return location.start; } + +const File_Position &AST_Node::end() const noexcept { return location.end; } + +std::string AST_Node::pretty_print() const { + std::ostringstream oss; + + oss << text; + + for (auto &elem : get_children()) { + oss << elem.get().pretty_print() << ' '; + } + + return oss.str(); +} + +/// Prints the contents of an AST node, including its children, recursively +std::string AST_Node::to_string(const std::string &t_prepend) const { + std::ostringstream oss; + + oss << t_prepend << "(" << ast_node_type_to_string(this->identifier) << ") " + << this->text << " : " << this->location.start.line << ", " + << this->location.start.column << '\n'; + + for (auto &elem : get_children()) { + oss << elem.get().to_string(t_prepend + " "); + } + return oss.str(); +} + +AST_Node::AST_Node(std::string t_ast_node_text, AST_Node_Type t_id, + Parse_Location t_loc) + : identifier(t_id), + text(std::move(t_ast_node_text)), + location(std::move(t_loc)) {} + +const std::string &AST_Node_Trace::filename() const noexcept { + return *location.filename; +} + +const File_Position &AST_Node_Trace::start() const noexcept { + return location.start; +} + +const File_Position &AST_Node_Trace::end() const noexcept { + return location.end; +} + +std::string AST_Node_Trace::pretty_print() const { + std::ostringstream oss; + + oss << text; + + for (const auto &elem : children) { + oss << elem.pretty_print() << ' '; + } + + return oss.str(); +} + +std::vector AST_Node_Trace::get_children(const AST_Node &node) { + const auto node_children = node.get_children(); + return std::vector(node_children.begin(), + node_children.end()); +} + +AST_Node_Trace::AST_Node_Trace(const AST_Node &node) + : identifier(node.identifier), + text(node.text), + location(node.location), + children(get_children(node)) {} + +/// \brief Classes which may be thrown during error cases when ChaiScript is +/// executing. +namespace exception { +load_module_error::load_module_error(const std::string &t_reason) + : std::runtime_error(t_reason) {} + +load_module_error::load_module_error( + const std::string &t_name, const std::vector &t_errors) + : std::runtime_error(format_error(t_name, t_errors)) {} + +std::string load_module_error::format_error( + const std::string &t_name, const std::vector &t_errors) { + std::stringstream ss; + ss << "Error loading module '" << t_name << "'\n" + << " The following locations were searched:\n"; + + for (const auto &err : t_errors) { + ss << " " << err.what() << "\n"; + } + + return ss.str(); +} + +eval_error::eval_error( + const std::string &t_why, const File_Position &t_where, + const std::string &t_fname, const std::vector &t_parameters, + const std::vector &t_functions, + bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss) noexcept + : std::runtime_error( + format(t_why, t_where, t_fname, t_parameters, t_dot_notation, t_ss)), + reason(t_why), + start_position(t_where), + filename(t_fname), + detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + +eval_error::eval_error( + const std::string &t_why, const std::vector &t_parameters, + const std::vector &t_functions, + bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss) noexcept + : std::runtime_error(format(t_why, t_parameters, t_dot_notation, t_ss)), + reason(t_why), + detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + +eval_error::eval_error(const std::string &t_why, const File_Position &t_where, + const std::string &t_fname) noexcept + : std::runtime_error(format(t_why, t_where, t_fname)), + reason(t_why), + start_position(t_where), + filename(t_fname) {} + +eval_error::eval_error(const std::string &t_why) noexcept + : std::runtime_error("Error: \"" + t_why + "\" "), reason(t_why) {} + +std::string eval_error::pretty_print() const { + std::ostringstream ss; + + ss << what(); + if (!call_stack.empty()) { + ss << "during evaluation at (" << fname(call_stack[0]) << " " + << startpos(call_stack[0]) << ")\n"; + ss << '\n' << detail << '\n'; + ss << " " << fname(call_stack[0]) << " (" << startpos(call_stack[0]) + << ") '" << pretty(call_stack[0]) << "'"; + for (size_t j = 1; j < call_stack.size(); ++j) { + if (id(call_stack[j]) != Carbon::AST_Node_Type::Block && + id(call_stack[j]) != Carbon::AST_Node_Type::File) { + ss << '\n'; + ss << " from " << fname(call_stack[j]) << " (" + << startpos(call_stack[j]) << ") '" << pretty(call_stack[j]) + << "'"; + } + } + } + ss << '\n'; + return ss.str(); +} + +std::string eval_error::format_why(const std::string &t_why) { + return "Error: \"" + t_why + "\""; +} + +std::string eval_error::format_types( + const Const_Proxy_Function &t_func, bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + assert(t_func); + int arity = t_func->get_arity(); + std::vector types = t_func->get_param_types(); + + std::string retval; + if (arity == -1) { + retval = "(...)"; + if (t_dot_notation) { + retval = "(Object)." + retval; + } + } else if (types.size() <= 1) { + retval = "()"; + } else { + std::stringstream ss; + ss << "("; + + std::string paramstr; + + for (size_t index = 1; index != types.size(); ++index) { + paramstr += (types[index].is_const() ? "const " : ""); + paramstr += t_ss.get_type_name(types[index]); + + if (index == 1 && t_dot_notation) { + paramstr += ").("; + if (types.size() == 2) { + paramstr += ", "; + } + } else { + paramstr += ", "; + } + } + + ss << paramstr.substr(0, paramstr.size() - 2); + + ss << ")"; + retval = ss.str(); + } + + std::shared_ptr dynfun = + std::dynamic_pointer_cast( + t_func); + + if (dynfun && dynfun->has_parse_tree()) { + Proxy_Function f = dynfun->get_guard(); + + if (f) { + auto dynfunguard = std::dynamic_pointer_cast< + const dispatch::Dynamic_Proxy_Function>(f); + if (dynfunguard && dynfunguard->has_parse_tree()) { + retval += " : " + format_guard(dynfunguard->get_parse_tree()); + } + } + + retval += "\n Defined at " + + format_location(dynfun->get_parse_tree()); + } + + return retval; +} + +std::string eval_error::format_detail( + const std::vector &t_functions, + bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + if (t_functions.size() == 1) { + assert(t_functions[0]); + ss << " Expected: " + << format_types(t_functions[0], t_dot_notation, t_ss) << '\n'; + } else { + ss << " " << t_functions.size() << " overloads available:\n"; + + for (const auto &t_function : t_functions) { + ss << " " << format_types((t_function), t_dot_notation, t_ss) + << '\n'; + } + } + + return ss.str(); +} + +std::string eval_error::format_parameters( + const std::vector &t_parameters, bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + ss << "("; + + if (!t_parameters.empty()) { + std::string paramstr; + + for (auto itr = t_parameters.begin(); itr != t_parameters.end(); + ++itr) { + paramstr += (itr->is_const() ? "const " : ""); + paramstr += t_ss.type_name(*itr); + + if (itr == t_parameters.begin() && t_dot_notation) { + paramstr += ").("; + if (t_parameters.size() == 1) { + paramstr += ", "; + } + } else { + paramstr += ", "; + } + } + + ss << paramstr.substr(0, paramstr.size() - 2); + } + ss << ")"; + + return ss.str(); +} + +std::string eval_error::format_filename(const std::string &t_fname) { + std::stringstream ss; + + if (t_fname != "__EVAL__") { + ss << "in '" << t_fname << "' "; + } else { + ss << "during evaluation "; + } + + return ss.str(); +} + +std::string eval_error::format_location(const File_Position &t_where) { + std::stringstream ss; + ss << "at (" << t_where.line << ", " << t_where.column << ")"; + return ss.str(); +} + +std::string eval_error::format(const std::string &t_why, + const File_Position &t_where, + const std::string &t_fname, + const std::vector &t_parameters, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << "With parameters: " + << format_parameters(t_parameters, t_dot_notation, t_ss); + ss << " "; + + ss << format_filename(t_fname); + ss << " "; + + ss << format_location(t_where); + + return ss.str(); +} + +std::string eval_error::format(const std::string &t_why, + const std::vector &t_parameters, + bool t_dot_notation, + const Carbon::detail::Dispatch_Engine &t_ss) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << "With parameters: " + << format_parameters(t_parameters, t_dot_notation, t_ss); + ss << " "; + + return ss.str(); +} + +std::string eval_error::format(const std::string &t_why, + const File_Position &t_where, + const std::string &t_fname) { + std::stringstream ss; + + ss << format_why(t_why); + ss << " "; + + ss << format_filename(t_fname); + ss << " "; + + ss << format_location(t_where); + + return ss.str(); +} + +file_not_found_error::file_not_found_error(const std::string &t_filename) + : std::runtime_error("File Not Found: " + t_filename), + filename(t_filename) {} + +} // namespace exception + +// static +bool AST_Node::get_bool_condition(const Boxed_Value &t_bv, + const Carbon::detail::Dispatch_State &t_ss) { + try { + return t_ss->boxed_cast(t_bv); + } catch (const exception::bad_boxed_cast &) { + throw exception::eval_error("Condition not boolean"); + } +} + +namespace eval { +namespace detail { + +Scope_Push_Pop::Scope_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_scope(m_ds.stack_holder()); +} + +Scope_Push_Pop::~Scope_Push_Pop() { m_ds->pop_scope(m_ds.stack_holder()); } + +Function_Push_Pop::Function_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); +} + +Function_Push_Pop::~Function_Push_Pop() { + m_ds->pop_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); +} + +void Function_Push_Pop::save_params(const Function_Params &t_params) { + m_ds->save_function_params(t_params); +} + +Stack_Push_Pop::Stack_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) + : m_ds(t_ds) { + m_ds->new_stack(m_ds.stack_holder()); +} + +Stack_Push_Pop::~Stack_Push_Pop() { m_ds->pop_stack(m_ds.stack_holder()); } + +} // namespace detail +} // namespace eval +} // namespace Carbon diff --git a/src/carbon/language/common.hpp b/src/carbon/language/common.hpp index 5828447b..ad424898 100644 --- a/src/carbon/language/common.hpp +++ b/src/carbon/language/common.hpp @@ -182,17 +182,11 @@ struct File_Position { struct Parse_Location { Parse_Location(std::string t_fname = "", const int t_start_line = 0, const int t_start_col = 0, const int t_end_line = 0, - const int t_end_col = 0) - : start(t_start_line, t_start_col), - end(t_end_line, t_end_col), - filename(std::make_shared(std::move(t_fname))) {} + const int t_end_col = 0); Parse_Location(std::shared_ptr t_fname, const int t_start_line = 0, const int t_start_col = 0, - const int t_end_line = 0, const int t_end_col = 0) - : start(t_start_line, t_start_col), - end(t_end_line, t_end_col), - filename(std::move(t_fname)) {} + const int t_end_line = 0, const int t_end_col = 0); File_Position start; File_Position end; @@ -206,23 +200,13 @@ struct AST_Node { const std::string text; Parse_Location location; - const std::string &filename() const noexcept { return *location.filename; } + const std::string &filename() const noexcept; - const File_Position &start() const noexcept { return location.start; } + const File_Position &start() const noexcept; - const File_Position &end() const noexcept { return location.end; } + const File_Position &end() const noexcept; - std::string pretty_print() const { - std::ostringstream oss; - - oss << text; - - for (auto &elem : get_children()) { - oss << elem.get().pretty_print() << ' '; - } - - return oss.str(); - } + std::string pretty_print() const; virtual std::vector> get_children() const = 0; @@ -230,20 +214,9 @@ struct AST_Node { const Carbon::detail::Dispatch_State &t_e) const = 0; /// Prints the contents of an AST node, including its children, recursively - std::string to_string(const std::string &t_prepend = "") const { - std::ostringstream oss; - - oss << t_prepend << "(" << ast_node_type_to_string(this->identifier) - << ") " << this->text << " : " << this->location.start.line << ", " - << this->location.start.column << '\n'; + std::string to_string(const std::string &t_prepend = "") const; - for (auto &elem : get_children()) { - oss << elem.get().to_string(t_prepend + " "); - } - return oss.str(); - } - - static inline bool get_bool_condition( + static bool get_bool_condition( const Boxed_Value &t_bv, const Carbon::detail::Dispatch_State &t_ss); virtual ~AST_Node() noexcept = default; @@ -254,10 +227,7 @@ struct AST_Node { protected: AST_Node(std::string t_ast_node_text, AST_Node_Type t_id, - Parse_Location t_loc) - : identifier(t_id), - text(std::move(t_ast_node_text)), - location(std::move(t_loc)) {} + Parse_Location t_loc); }; /// \brief Typedef for pointers to AST_Node objects. Used in building of the @@ -270,35 +240,17 @@ struct AST_Node_Trace { const std::string text; Parse_Location location; - const std::string &filename() const noexcept { return *location.filename; } + const std::string &filename() const noexcept; - const File_Position &start() const noexcept { return location.start; } + const File_Position &start() const noexcept; - const File_Position &end() const noexcept { return location.end; } + const File_Position &end() const noexcept; - std::string pretty_print() const { - std::ostringstream oss; + std::string pretty_print() const; - oss << text; + std::vector get_children(const AST_Node &node); - for (const auto &elem : children) { - oss << elem.pretty_print() << ' '; - } - - return oss.str(); - } - - std::vector get_children(const AST_Node &node) { - const auto node_children = node.get_children(); - return std::vector(node_children.begin(), - node_children.end()); - } - - AST_Node_Trace(const AST_Node &node) - : identifier(node.identifier), - text(node.text), - location(node.location), - children(get_children(node)) {} + AST_Node_Trace(const AST_Node &node); std::vector children; }; @@ -308,29 +260,17 @@ struct AST_Node_Trace { namespace exception { /// \brief Thrown if an error occurs while attempting to load a binary module struct load_module_error : std::runtime_error { - explicit load_module_error(const std::string &t_reason) - : std::runtime_error(t_reason) {} + explicit load_module_error(const std::string &t_reason); load_module_error(const std::string &t_name, - const std::vector &t_errors) - : std::runtime_error(format_error(t_name, t_errors)) {} + const std::vector &t_errors); load_module_error(const load_module_error &) = default; ~load_module_error() noexcept override = default; static std::string format_error( const std::string &t_name, - const std::vector &t_errors) { - std::stringstream ss; - ss << "Error loading module '" << t_name << "'\n" - << " The following locations were searched:\n"; - - for (const auto &err : t_errors) { - ss << " " << err.what() << "\n"; - } - - return ss.str(); - } + const std::vector &t_errors); }; /// Errors generated during parsing or evaluation @@ -346,59 +286,22 @@ struct eval_error : std::runtime_error { const std::vector &t_parameters, const std::vector &t_functions, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) noexcept - : std::runtime_error(format(t_why, t_where, t_fname, t_parameters, - t_dot_notation, t_ss)), - reason(t_why), - start_position(t_where), - filename(t_fname), - detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + const Carbon::detail::Dispatch_Engine &t_ss) noexcept; eval_error(const std::string &t_why, const std::vector &t_parameters, const std::vector &t_functions, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) noexcept - : std::runtime_error(format(t_why, t_parameters, t_dot_notation, t_ss)), - reason(t_why), - detail(format_detail(t_functions, t_dot_notation, t_ss)) {} + const Carbon::detail::Dispatch_Engine &t_ss) noexcept; eval_error(const std::string &t_why, const File_Position &t_where, - const std::string &t_fname) noexcept - : std::runtime_error(format(t_why, t_where, t_fname)), - reason(t_why), - start_position(t_where), - filename(t_fname) {} + const std::string &t_fname) noexcept; - explicit eval_error(const std::string &t_why) noexcept - : std::runtime_error("Error: \"" + t_why + "\" "), reason(t_why) {} + explicit eval_error(const std::string &t_why) noexcept; eval_error(const eval_error &) = default; - std::string pretty_print() const { - std::ostringstream ss; - - ss << what(); - if (!call_stack.empty()) { - ss << "during evaluation at (" << fname(call_stack[0]) << " " - << startpos(call_stack[0]) << ")\n"; - ss << '\n' << detail << '\n'; - ss << " " << fname(call_stack[0]) << " (" - << startpos(call_stack[0]) << ") '" << pretty(call_stack[0]) - << "'"; - for (size_t j = 1; j < call_stack.size(); ++j) { - if (id(call_stack[j]) != Carbon::AST_Node_Type::Block && - id(call_stack[j]) != Carbon::AST_Node_Type::File) { - ss << '\n'; - ss << " from " << fname(call_stack[j]) << " (" - << startpos(call_stack[j]) << ") '" - << pretty(call_stack[j]) << "'"; - } - } - } - ss << '\n'; - return ss.str(); - } + std::string pretty_print() const; ~eval_error() noexcept override = default; @@ -425,73 +328,11 @@ struct eval_error : std::runtime_error { return oss.str(); } - static std::string format_why(const std::string &t_why) { - return "Error: \"" + t_why + "\""; - } + static std::string format_why(const std::string &t_why); static std::string format_types( const Const_Proxy_Function &t_func, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) { - assert(t_func); - int arity = t_func->get_arity(); - std::vector types = t_func->get_param_types(); - - std::string retval; - if (arity == -1) { - retval = "(...)"; - if (t_dot_notation) { - retval = "(Object)." + retval; - } - } else if (types.size() <= 1) { - retval = "()"; - } else { - std::stringstream ss; - ss << "("; - - std::string paramstr; - - for (size_t index = 1; index != types.size(); ++index) { - paramstr += (types[index].is_const() ? "const " : ""); - paramstr += t_ss.get_type_name(types[index]); - - if (index == 1 && t_dot_notation) { - paramstr += ").("; - if (types.size() == 2) { - paramstr += ", "; - } - } else { - paramstr += ", "; - } - } - - ss << paramstr.substr(0, paramstr.size() - 2); - - ss << ")"; - retval = ss.str(); - } - - std::shared_ptr dynfun = - std::dynamic_pointer_cast( - t_func); - - if (dynfun && dynfun->has_parse_tree()) { - Proxy_Function f = dynfun->get_guard(); - - if (f) { - auto dynfunguard = std::dynamic_pointer_cast< - const dispatch::Dynamic_Proxy_Function>(f); - if (dynfunguard && dynfunguard->has_parse_tree()) { - retval += - " : " + format_guard(dynfunguard->get_parse_tree()); - } - } - - retval += "\n Defined at " + - format_location(dynfun->get_parse_tree()); - } - - return retval; - } + const Carbon::detail::Dispatch_Engine &t_ss); template static std::string format_guard(const T &t) { @@ -508,134 +349,36 @@ struct eval_error : std::runtime_error { static std::string format_detail( const std::vector &t_functions, - bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss) { - std::stringstream ss; - if (t_functions.size() == 1) { - assert(t_functions[0]); - ss << " Expected: " - << format_types(t_functions[0], t_dot_notation, t_ss) << '\n'; - } else { - ss << " " << t_functions.size() << " overloads available:\n"; - - for (const auto &t_function : t_functions) { - ss << " " - << format_types((t_function), t_dot_notation, t_ss) << '\n'; - } - } - - return ss.str(); - } + bool t_dot_notation, const Carbon::detail::Dispatch_Engine &t_ss); static std::string format_parameters( const std::vector &t_parameters, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) { - std::stringstream ss; - ss << "("; - - if (!t_parameters.empty()) { - std::string paramstr; - - for (auto itr = t_parameters.begin(); itr != t_parameters.end(); - ++itr) { - paramstr += (itr->is_const() ? "const " : ""); - paramstr += t_ss.type_name(*itr); - - if (itr == t_parameters.begin() && t_dot_notation) { - paramstr += ").("; - if (t_parameters.size() == 1) { - paramstr += ", "; - } - } else { - paramstr += ", "; - } - } - - ss << paramstr.substr(0, paramstr.size() - 2); - } - ss << ")"; - - return ss.str(); - } - - static std::string format_filename(const std::string &t_fname) { - std::stringstream ss; - - if (t_fname != "__EVAL__") { - ss << "in '" << t_fname << "' "; - } else { - ss << "during evaluation "; - } + const Carbon::detail::Dispatch_Engine &t_ss); - return ss.str(); - } + static std::string format_filename(const std::string &t_fname); - static std::string format_location(const File_Position &t_where) { - std::stringstream ss; - ss << "at (" << t_where.line << ", " << t_where.column << ")"; - return ss.str(); - } + static std::string format_location(const File_Position &t_where); static std::string format(const std::string &t_why, const File_Position &t_where, const std::string &t_fname, const std::vector &t_parameters, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) { - std::stringstream ss; - - ss << format_why(t_why); - ss << " "; - - ss << "With parameters: " - << format_parameters(t_parameters, t_dot_notation, t_ss); - ss << " "; - - ss << format_filename(t_fname); - ss << " "; - - ss << format_location(t_where); - - return ss.str(); - } + const Carbon::detail::Dispatch_Engine &t_ss); static std::string format(const std::string &t_why, const std::vector &t_parameters, bool t_dot_notation, - const Carbon::detail::Dispatch_Engine &t_ss) { - std::stringstream ss; - - ss << format_why(t_why); - ss << " "; - - ss << "With parameters: " - << format_parameters(t_parameters, t_dot_notation, t_ss); - ss << " "; - - return ss.str(); - } + const Carbon::detail::Dispatch_Engine &t_ss); static std::string format(const std::string &t_why, const File_Position &t_where, - const std::string &t_fname) { - std::stringstream ss; - - ss << format_why(t_why); - ss << " "; - - ss << format_filename(t_fname); - ss << " "; - - ss << format_location(t_where); - - return ss.str(); - } + const std::string &t_fname); }; /// Errors generated when loading a file struct file_not_found_error : std::runtime_error { - explicit file_not_found_error(const std::string &t_filename) - : std::runtime_error("File Not Found: " + t_filename), - filename(t_filename) {} + explicit file_not_found_error(const std::string &t_filename); file_not_found_error(const file_not_found_error &) = default; ~file_not_found_error() noexcept override = default; @@ -645,16 +388,6 @@ struct file_not_found_error : std::runtime_error { } // namespace exception -// static -bool AST_Node::get_bool_condition(const Boxed_Value &t_bv, - const Carbon::detail::Dispatch_State &t_ss) { - try { - return t_ss->boxed_cast(t_bv); - } catch (const exception::bad_boxed_cast &) { - throw exception::eval_error("Condition not boolean"); - } -} - namespace parser { class Carbon_Parser_Base { public: @@ -700,12 +433,9 @@ struct Scope_Push_Pop { Scope_Push_Pop(const Scope_Push_Pop &) = delete; Scope_Push_Pop &operator=(const Scope_Push_Pop &) = delete; - explicit Scope_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) - : m_ds(t_ds) { - m_ds->new_scope(m_ds.stack_holder()); - } + explicit Scope_Push_Pop(const Carbon::detail::Dispatch_State &t_ds); - ~Scope_Push_Pop() { m_ds->pop_scope(m_ds.stack_holder()); } + ~Scope_Push_Pop(); private: const Carbon::detail::Dispatch_State &m_ds; @@ -718,18 +448,11 @@ struct Function_Push_Pop { Function_Push_Pop(const Function_Push_Pop &) = delete; Function_Push_Pop &operator=(const Function_Push_Pop &) = delete; - explicit Function_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) - : m_ds(t_ds) { - m_ds->new_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); - } + explicit Function_Push_Pop(const Carbon::detail::Dispatch_State &t_ds); - ~Function_Push_Pop() { - m_ds->pop_function_call(m_ds.stack_holder(), m_ds.conversion_saves()); - } + ~Function_Push_Pop(); - void save_params(const Function_Params &t_params) { - m_ds->save_function_params(t_params); - } + void save_params(const Function_Params &t_params); private: const Carbon::detail::Dispatch_State &m_ds; @@ -742,12 +465,9 @@ struct Stack_Push_Pop { Stack_Push_Pop(const Stack_Push_Pop &) = delete; Stack_Push_Pop &operator=(const Stack_Push_Pop &) = delete; - explicit Stack_Push_Pop(const Carbon::detail::Dispatch_State &t_ds) - : m_ds(t_ds) { - m_ds->new_stack(m_ds.stack_holder()); - } + explicit Stack_Push_Pop(const Carbon::detail::Dispatch_State &t_ds); - ~Stack_Push_Pop() { m_ds->pop_stack(m_ds.stack_holder()); } + ~Stack_Push_Pop(); private: const Carbon::detail::Dispatch_State &m_ds; diff --git a/src/carbon/language/parser.hpp b/src/carbon/language/parser.hpp index 4bd0e17a..aaf6e6ed 100644 --- a/src/carbon/language/parser.hpp +++ b/src/carbon/language/parser.hpp @@ -62,29 +62,24 @@ struct Char_Parser_Helper { static std::string u8str_from_ll(long long val) { using char_type = std::string::value_type; - char_type c[2]; - c[1] = char_type(val); - c[0] = char_type(val >> 8); - - if (c[0] == 0) { - return std::string(1, c[1]); // size, character + if (val <= 0xFF) { + return std::string(1, static_cast(val)); } - return std::string(c, 2); // char buffer, size + return std::string{static_cast(val >> 8), + static_cast(val)}; } static string_type str_from_ll(long long val) { using target_char_type = typename string_type::value_type; #if defined(CARBON_UTF16_UTF32) - // prepare converter - std::wstring_convert, - target_char_type> - converter; // convert - return converter.from_bytes(u8str_from_ll(val)); + return std::wstring_convert, + target_char_type>{} + .from_bytes(u8str_from_ll(val)); #else // no conversion available, just put value as character - return string_type(1, target_char_type(val)); // size, character + return string_type(1, static_cast(val)); #endif } }; @@ -456,7 +451,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { public: explicit Carbon_Parser(Tracer tracer = Tracer(), - Optimizer optimizer = Optimizer()) + Optimizer optimizer = Optimizer()) : m_tracer(std::move(tracer)), m_optimizer(std::move(optimizer)) { m_match_stack.reserve(2); } @@ -527,10 +522,9 @@ class Carbon_Parser final : public Carbon_Parser_Base { /// \todo fix the fact that a successful match that captured no /// ast_nodes doesn't have any real start position m_match_stack.push_back(m_optimizer.optimize( - Carbon::make_unique, - NodeType>(std::move(t_text), - std::move(filepos), - std::move(new_children)))); + Carbon::make_unique, NodeType>( + std::move(t_text), std::move(filepos), + std::move(new_children)))); } /// Reads a symbol group from input if it matches the parameter, without @@ -2128,7 +2122,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { (!is_if_init && num_children == 2)) { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } if (!is_if_init) { @@ -2241,7 +2235,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { } else { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } } @@ -2251,7 +2245,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { } else { m_match_stack.push_back( Carbon::make_unique, - eval::Constant_AST_Node>( + eval::Constant_AST_Node>( Boxed_Value(true))); } } @@ -2259,7 +2253,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { if (!Equation()) { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } return true; @@ -2455,7 +2449,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { if (m_match_stack.size() == prev_stack_top) { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } build_match>(prev_stack_top); @@ -2485,7 +2479,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { if (m_match_stack.size() == prev_stack_top) { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } build_match>(prev_stack_top); @@ -3158,7 +3152,7 @@ class Carbon_Parser final : public Carbon_Parser_Base { } else { m_match_stack.push_back( Carbon::make_unique, - eval::Noop_AST_Node>()); + eval::Noop_AST_Node>()); } AST_NodePtr retval(std::move(m_match_stack.front())); diff --git a/src/carbon/language/prelude.cpp b/src/carbon/language/prelude.cpp new file mode 100644 index 00000000..acaac4f2 --- /dev/null +++ b/src/carbon/language/prelude.cpp @@ -0,0 +1,551 @@ +#include "prelude.hpp" + +namespace Carbon { +std::string Carbon_Prelude::prelude() { + return R"chaiscript( + +def lt(l, r) { + if (call_exists(`<`, l, r)) { + l < r + } else { + type_name(l) < type_name(r) + } +} + + +def gt(l, r) { + if (call_exists(`>`, l, r)) { + l > r + } else { + type_name(l) > type_name(r) + } +} + +def eq(l, r) { + if (call_exists(`==`, l, r)) { + l == r + } else { + false + } +} + +def new(x) { + eval(type_name(x))(); +} + +def clone(double x) { + double(x).clone_var_attrs(x) +} + +def clone(string x) { + string(x).clone_var_attrs(x) +} + +def clone(vector x) { + vector(x).clone_var_attrs(x) +} + + +def clone(int x) { + int(x).clone_var_attrs(x) +} + +def clone(x) : function_exists(type_name(x)) && call_exists(eval(type_name(x)), x) +{ + eval(type_name(x))(x).clone_var_attrs(x); +} + + +# to_string for Pair() +def to_string(x) : call_exists(first, x) && call_exists(second, x) { + "<" + x.first.to_string() + ", " + x.second.to_string() + ">"; +} + +# to_string for containers +def to_string(x) : call_exists(range, x) && !x.is_type("string"){ + "[" + x.join(", ") + "]"; +} + +# Prints to console with no carriage return +def puts(x) { + print_string(x.to_string()); +} + +# Prints to console with carriage return +def print(x) { + println_string(x.to_string()); +} + +# Returns the maximum value of two numbers +def max(a, b) { + if (a>b) { + a + } else { + b + } +} + +# Returns the minimum value of two numbers +def min(a, b) +{ + if (a 0) && (!r.empty())) { + inserter(r.front()); + r.pop_front(); + --i; + } +} + + +# Returns a new container with the given number of elements taken from the container +def take(container, num) { + auto retval := new(container); + take(container, num, back_inserter(retval)); + retval; +} + + +def take_while(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while ((!r.empty()) && f(r.front())) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given elements match the second value function +def take_while(container, f) { + auto retval := new(container); + take_while(container, f, back_inserter(retval)); + retval; +} + + +def drop(container, num, inserter) : call_exists(range, container) { + auto r := range(container); + auto i = num; + while ((i > 0) && (!r.empty())) { + r.pop_front(); + --i; + } + while (!r.empty()) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given number of elements dropped from the given container +def drop(container, num) { + auto retval := new(container); + drop(container, num, back_inserter(retval)); + retval; +} + + +def drop_while(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while ((!r.empty())&& f(r.front())) { + r.pop_front(); + } + while (!r.empty()) { + inserter(r.front()); + r.pop_front(); + } +} + + +# Returns a new container with the given elements dropped that match the second value function +def drop_while(container, f) { + auto retval := new(container); + drop_while(container, f, back_inserter(retval)); + retval; +} + + +# Applies the second value function to the container. Starts with the first two elements. Expects at least 2 elements. +def reduce(container, func) : container.size() >= 2 && call_exists(range, container) { + auto r := range(container); + auto retval = r.front(); + r.pop_front(); + retval = func(retval, r.front()); + r.pop_front(); + while (!r.empty()) { + retval = func(retval, r.front()); + r.pop_front(); + } + retval; +} + + +# Returns a string of the elements in container delimited by the second value string +def join(container, delim) { + auto retval = ""; + auto range := range(container); + if (!range.empty()) { + retval += to_string(range.front()); + range.pop_front(); + while (!range.empty()) { + retval += delim; + retval += to_string(range.front()); + range.pop_front(); + } + } + retval; +} + + +def filter(container, f, inserter) : call_exists(range, container) { + auto r := range(container); + while (!r.empty()) { + if (f(r.front())) { + inserter(r.front()); + } + r.pop_front(); + } +} + + +# Returns a new Vector which match the second value function +def filter(container, f) { + auto retval := new(container); + filter(container, f, back_inserter(retval)); + retval; +} + + +def generate_range(x, y, inserter) { + auto i = x; + while (i <= y) { + inserter(i); + ++i; + } +} + + +# Returns a new Vector which represents the range from the first value to the second value +def generate_range(x, y) { + auto retval := Vector(); + generate_range(x,y,back_inserter(retval)); + retval; +} + + +# Returns a new Vector with the first value to the second value as its elements +def collate(x, y) { + return [x, y]; +} + + +def zip_with(f, x, y, inserter) : call_exists(range, x) && call_exists(range, y) { + auto r_x := range(x); + auto r_y := range(y); + while (!r_x.empty() && !r_y.empty()) { + inserter(f(r_x.front(), r_y.front())); + r_x.pop_front(); + r_y.pop_front(); + } +} + + +# Returns a new Vector which joins matching elements of the second and third value with the first value function +def zip_with(f, x, y) { + auto retval := Vector(); + zip_with(f,x,y,back_inserter(retval)); + retval; +} + + +# Returns a new Vector which joins matching elements of the first and second +def zip(x, y) { + zip_with(collate, x, y); +} + + +# Returns the position of the second value string in the first value string +def string::find(string substr) { + find(this, substr, size_t(0)); +} + + +# Returns the position of last match of the second value string in the first value string +def string::rfind(string substr) { + rfind(this, substr, size_t(-1)); +} + + +# Returns the position of the first match of elements in the second value string in the first value string +def string::find_first_of(string list) { + find_first_of(this, list, size_t(0)); +} + + +# Returns the position of the last match of elements in the second value string in the first value string +def string::find_last_of(string list) { + find_last_of(this, list, size_t(-1)); +} + + +# Returns the position of the first non-matching element in the second value string in the first value string +def string::find_first_not_of(string list) { + find_first_not_of(this, list, size_t(0)); +} + + +# Returns the position of the last non-matching element in the second value string in the first value string +def string::find_last_not_of(string list) { + find_last_not_of(this, list, size_t(-1)); +} + + +def string::ltrim() { + drop_while(this, fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'}); +} + + +def string::rtrim() { + reverse(drop_while(reverse(this), fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'})); +} + + +def string::trim() { + ltrim(rtrim(this)); +} + + +def find(container, value, Function compare_func) : call_exists(range, container) { + auto range := range(container); + while (!range.empty()) { + if (compare_func(range.front(), value)) { + return range; + } else { + range.pop_front(); + } + } + range; +} + + +def find(container, value) { + find(container, value, eq) +} + + +)chaiscript"; +} +} // namespace Carbon diff --git a/src/carbon/language/prelude.hpp b/src/carbon/language/prelude.hpp index bf7eed05..2b49394e 100644 --- a/src/carbon/language/prelude.hpp +++ b/src/carbon/language/prelude.hpp @@ -7,553 +7,7 @@ namespace Carbon { struct Carbon_Prelude { - static std::string prelude() { - return R"chaiscript( - -def lt(l, r) { - if (call_exists(`<`, l, r)) { - l < r - } else { - type_name(l) < type_name(r) - } -} - - -def gt(l, r) { - if (call_exists(`>`, l, r)) { - l > r - } else { - type_name(l) > type_name(r) - } -} - -def eq(l, r) { - if (call_exists(`==`, l, r)) { - l == r - } else { - false - } -} - -def new(x) { - eval(type_name(x))(); -} - -def clone(double x) { - double(x).clone_var_attrs(x) -} - -def clone(string x) { - string(x).clone_var_attrs(x) -} - -def clone(vector x) { - vector(x).clone_var_attrs(x) -} - - -def clone(int x) { - int(x).clone_var_attrs(x) -} - -def clone(x) : function_exists(type_name(x)) && call_exists(eval(type_name(x)), x) -{ - eval(type_name(x))(x).clone_var_attrs(x); -} - - -# to_string for Pair() -def to_string(x) : call_exists(first, x) && call_exists(second, x) { - "<" + x.first.to_string() + ", " + x.second.to_string() + ">"; -} - -# to_string for containers -def to_string(x) : call_exists(range, x) && !x.is_type("string"){ - "[" + x.join(", ") + "]"; -} - -# Prints to console with no carriage return -def puts(x) { - print_string(x.to_string()); -} - -# Prints to console with carriage return -def print(x) { - println_string(x.to_string()); -} - -# Returns the maximum value of two numbers -def max(a, b) { - if (a>b) { - a - } else { - b - } -} - -# Returns the minimum value of two numbers -def min(a, b) -{ - if (a 0) && (!r.empty())) { - inserter(r.front()); - r.pop_front(); - --i; - } -} - - -# Returns a new container with the given number of elements taken from the container -def take(container, num) { - auto retval := new(container); - take(container, num, back_inserter(retval)); - retval; -} - - -def take_while(container, f, inserter) : call_exists(range, container) { - auto r := range(container); - while ((!r.empty()) && f(r.front())) { - inserter(r.front()); - r.pop_front(); - } -} - - -# Returns a new container with the given elements match the second value function -def take_while(container, f) { - auto retval := new(container); - take_while(container, f, back_inserter(retval)); - retval; -} - - -def drop(container, num, inserter) : call_exists(range, container) { - auto r := range(container); - auto i = num; - while ((i > 0) && (!r.empty())) { - r.pop_front(); - --i; - } - while (!r.empty()) { - inserter(r.front()); - r.pop_front(); - } -} - - -# Returns a new container with the given number of elements dropped from the given container -def drop(container, num) { - auto retval := new(container); - drop(container, num, back_inserter(retval)); - retval; -} - - -def drop_while(container, f, inserter) : call_exists(range, container) { - auto r := range(container); - while ((!r.empty())&& f(r.front())) { - r.pop_front(); - } - while (!r.empty()) { - inserter(r.front()); - r.pop_front(); - } -} - - -# Returns a new container with the given elements dropped that match the second value function -def drop_while(container, f) { - auto retval := new(container); - drop_while(container, f, back_inserter(retval)); - retval; -} - - -# Applies the second value function to the container. Starts with the first two elements. Expects at least 2 elements. -def reduce(container, func) : container.size() >= 2 && call_exists(range, container) { - auto r := range(container); - auto retval = r.front(); - r.pop_front(); - retval = func(retval, r.front()); - r.pop_front(); - while (!r.empty()) { - retval = func(retval, r.front()); - r.pop_front(); - } - retval; -} - - -# Returns a string of the elements in container delimited by the second value string -def join(container, delim) { - auto retval = ""; - auto range := range(container); - if (!range.empty()) { - retval += to_string(range.front()); - range.pop_front(); - while (!range.empty()) { - retval += delim; - retval += to_string(range.front()); - range.pop_front(); - } - } - retval; -} - - -def filter(container, f, inserter) : call_exists(range, container) { - auto r := range(container); - while (!r.empty()) { - if (f(r.front())) { - inserter(r.front()); - } - r.pop_front(); - } -} - - -# Returns a new Vector which match the second value function -def filter(container, f) { - auto retval := new(container); - filter(container, f, back_inserter(retval)); - retval; -} - - -def generate_range(x, y, inserter) { - auto i = x; - while (i <= y) { - inserter(i); - ++i; - } -} - - -# Returns a new Vector which represents the range from the first value to the second value -def generate_range(x, y) { - auto retval := Vector(); - generate_range(x,y,back_inserter(retval)); - retval; -} - - -# Returns a new Vector with the first value to the second value as its elements -def collate(x, y) { - return [x, y]; -} - - -def zip_with(f, x, y, inserter) : call_exists(range, x) && call_exists(range, y) { - auto r_x := range(x); - auto r_y := range(y); - while (!r_x.empty() && !r_y.empty()) { - inserter(f(r_x.front(), r_y.front())); - r_x.pop_front(); - r_y.pop_front(); - } -} - - -# Returns a new Vector which joins matching elements of the second and third value with the first value function -def zip_with(f, x, y) { - auto retval := Vector(); - zip_with(f,x,y,back_inserter(retval)); - retval; -} - - -# Returns a new Vector which joins matching elements of the first and second -def zip(x, y) { - zip_with(collate, x, y); -} - - -# Returns the position of the second value string in the first value string -def string::find(string substr) { - find(this, substr, size_t(0)); -} - - -# Returns the position of last match of the second value string in the first value string -def string::rfind(string substr) { - rfind(this, substr, size_t(-1)); -} - - -# Returns the position of the first match of elements in the second value string in the first value string -def string::find_first_of(string list) { - find_first_of(this, list, size_t(0)); -} - - -# Returns the position of the last match of elements in the second value string in the first value string -def string::find_last_of(string list) { - find_last_of(this, list, size_t(-1)); -} - - -# Returns the position of the first non-matching element in the second value string in the first value string -def string::find_first_not_of(string list) { - find_first_not_of(this, list, size_t(0)); -} - - -# Returns the position of the last non-matching element in the second value string in the first value string -def string::find_last_not_of(string list) { - find_last_not_of(this, list, size_t(-1)); -} - - -def string::ltrim() { - drop_while(this, fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'}); -} - - -def string::rtrim() { - reverse(drop_while(reverse(this), fun(x) { x == ' ' || x == '\t' || x == '\r' || x == '\n'})); -} - - -def string::trim() { - ltrim(rtrim(this)); -} - - -def find(container, value, Function compare_func) : call_exists(range, container) { - auto range := range(container); - while (!range.empty()) { - if (compare_func(range.front(), value)) { - return range; - } else { - range.pop_front(); - } - } - range; -} - - -def find(container, value) { - find(container, value, eq) -} - - -)chaiscript"; - } + static std::string prelude(); }; } // namespace Carbon diff --git a/src/device/manager.cpp b/src/device/manager.cpp index 9fbf3424..b93fe20c 100644 --- a/src/device/manager.cpp +++ b/src/device/manager.cpp @@ -29,11 +29,7 @@ Description: Device Manager #include "atom/utils/random.hpp" #include "utils/utils.hpp" -#ifdef __cpp_lib_format -#include -#else #include -#endif #include #include "config.h" From 64988aedb087ae6715e40ffe1a8d6ff445597a2e Mon Sep 17 00:00:00 2001 From: Max Qian Date: Tue, 23 Apr 2024 21:29:13 +0800 Subject: [PATCH 26/28] update not finished --- src/atom/algorithm/_script.cpp | 36 ---- src/atom/algorithm/_script.hpp | 126 ++++++++++++ src/atom/algorithm/fraction.cpp | 22 --- src/atom/algorithm/fraction.hpp | 26 +-- src/atom/algorithm/hash.hpp | 23 +-- src/atom/io/_script.hpp | 41 +++- src/atom/io/idirectory.cpp | 85 ++++++++ src/atom/io/idirectory.hpp | 97 ++++++++++ src/atom/io/ifile.cpp | 17 ++ src/atom/io/ifile.hpp | 16 +- src/atom/io/io.cpp | 12 +- src/atom/io/io.hpp | 1 + src/atom/system/CMakeLists.txt | 1 + src/atom/system/_script.cpp | 63 ------ src/atom/system/_script.hpp | 280 +++++++++++++++++++++++++++ src/atom/system/command.cpp | 4 +- src/atom/system/command.hpp | 5 +- src/atom/system/lregistry.cpp | 49 +++-- src/atom/system/lregistry.hpp | 21 +- src/atom/system/module/wifi.cpp | 98 ++++++++++ src/atom/system/module/wifi.hpp | 21 ++ src/atom/system/pidwatcher.hpp | 87 +++++++-- src/atom/type/_script.hpp | 72 +++++++ src/atom/utils/_script.hpp | 124 ++++++++++++ src/carbon/command/bootstrap_stl.hpp | 190 +++++++++++++++--- src/carbon/stdlib.hpp | 2 + src/script/carbon.cpp | 240 +++++++++++++---------- src/script/sheller.cpp | 35 +--- 28 files changed, 1415 insertions(+), 379 deletions(-) delete mode 100644 src/atom/algorithm/_script.cpp create mode 100644 src/atom/algorithm/_script.hpp create mode 100644 src/atom/io/idirectory.cpp create mode 100644 src/atom/io/idirectory.hpp delete mode 100644 src/atom/system/_script.cpp create mode 100644 src/atom/system/_script.hpp create mode 100644 src/atom/type/_script.hpp create mode 100644 src/atom/utils/_script.hpp diff --git a/src/atom/algorithm/_script.cpp b/src/atom/algorithm/_script.cpp deleted file mode 100644 index 40fe6f3d..00000000 --- a/src/atom/algorithm/_script.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "carbon/carbon.hpp" - -#include "base.hpp" -#include - -#include "atom/log/loguru.hpp" - -using namespace Atom::Algorithm; - -CARBON_MODULE_EXPORT { - Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { - try { - Carbon::ModulePtr m_module = std::make_shared(); - - m_module->add(Carbon::fun(&base16Encode), "base16encode"); - m_module->add(Carbon::fun(&base16Decode), "base16decode"); - m_module->add(Carbon::fun(&base32Encode), "base32encode"); - m_module->add(Carbon::fun(&base32Decode), "base32decode"); - m_module->add(Carbon::fun(&base64Encode), "base64encode"); - m_module->add(Carbon::fun(&base64Decode), "base64decode"); - m_module->add(Carbon::fun(&base85Encode), "base85encode"); - m_module->add(Carbon::fun(&base85Decode), "base85decode"); - m_module->add(Carbon::fun(&base91Encode), "base91encode"); - m_module->add(Carbon::fun(&base91Decode), "base91decode"); - m_module->add(Carbon::fun(&base128Encode), "base128encode"); - m_module->add(Carbon::fun(&base128Decode), "base128decode"); - - return m_module; - } catch (const std::bad_any_cast &e) { - LOG_F(ERROR, "Failed to load config manager"); - return nullptr; - } - } -} - - diff --git a/src/atom/algorithm/_script.hpp b/src/atom/algorithm/_script.hpp new file mode 100644 index 00000000..3db8ac40 --- /dev/null +++ b/src/atom/algorithm/_script.hpp @@ -0,0 +1,126 @@ +#include "carbon/carbon.hpp" + +#include "algorithm.hpp" +#include "base.hpp" +#include "convolve.hpp" +#include "fraction.hpp" +#include "hash.hpp" +#include "huffman.hpp" +#include "math.hpp" +#include "md5.hpp" +#include "mhash.hpp" + +using namespace Atom::Algorithm; +using namespace Atom::Utils; + +namespace Atom::_Script::Algorithm { +/** + * Adds the String Methods to the given Carbon m. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + m->add(user_type(), "KMP"); + m->add(Carbon::fun(&KMP::Search), "search"); + m->add(Carbon::fun(&KMP::SetPattern), "set_pattern"); + + m->add(user_type(), "MinHash"); + m->add(Carbon::fun(&MinHash::compute_signature), "compute_signature"); + m->add(Carbon::fun(&MinHash::estimate_similarity), "estimate_similarity"); + + m->add(user_type(), "BoyerMoore"); + m->add(Carbon::fun(&BoyerMoore::Search), "search"); + m->add(Carbon::fun(&BoyerMoore::SetPattern), "set_pattern"); + + m->add(user_type>(), "BloomFilter"); + m->add(Carbon::fun(&BloomFilter<16>::insert), "insert"); + m->add(Carbon::fun(&BloomFilter<16>::contains), "contains"); + + m->add(Carbon::fun(&base16Encode), "base16encode"); + m->add(Carbon::fun(&base16Decode), "base16decode"); + m->add(Carbon::fun(&base32Encode), "base32encode"); + m->add(Carbon::fun(&base32Decode), "base32decode"); + m->add(Carbon::fun(&base64Encode), "base64encode"); + m->add(Carbon::fun(&base64Decode), "base64decode"); + m->add(Carbon::fun(&base85Encode), "base85encode"); + m->add(Carbon::fun(&base85Decode), "base85decode"); + m->add(Carbon::fun(&base91Encode), "base91encode"); + m->add(Carbon::fun(&base91Decode), "base91decode"); + m->add(Carbon::fun(&base128Encode), "base128encode"); + m->add(Carbon::fun(&base128Decode), "base128decode"); + + m->add(Carbon::fun(&xorEncrypt), "xor_encrypt"); + m->add(Carbon::fun(&xorDecrypt), "xor_decrypt"); + + m->add(Carbon::fun(&convolve), "convolve"); + m->add(Carbon::fun(&deconvolve), "deconvolve"); + m->add(Carbon::fun(&convolve2D), "convolve2d"); + m->add(Carbon::fun(&deconvolve2D), "deconvolve2d"); + + m->add(user_type(), "Fraction"); + //m->add(Carbon::constructor(), "Fraction"); + m->add(Carbon::fun(&Fraction::operator+=), "+="); + m->add(Carbon::fun(&Fraction::operator-=), "-="); + m->add(Carbon::fun(&Fraction::operator*=), "*="); + m->add(Carbon::fun(&Fraction::operator/=), "/="); + m->add(Carbon::fun(&Fraction::operator+), "+"); + m->add(Carbon::fun(&Fraction::operator-), + "-"); + m->add(Carbon::fun(&Fraction::operator-), + "-"); + m->add(Carbon::fun( + &Fraction::operator-), + "-"); + m->add(Carbon::fun(&Fraction::operator*), "*"); + m->add(Carbon::fun(&Fraction::operator/), "/"); + m->add(Carbon::fun(&Fraction::operator==), "=="); + m->add( + Carbon::fun(&Fraction::operator double), + "to_double"); + m->add(Carbon::fun(&Fraction::operator float), + "to_float"); + m->add(Carbon::fun(&Fraction::operator int), + "to_int"); + m->add(Carbon::fun(&Fraction::to_string), "to_string"); + m->add(Carbon::fun(&Fraction::to_double), "to_double"); + + m->add(Carbon::fun(static_cast( + &quickHash)), + "hash"); + m->add(Carbon::fun( + static_cast(&quickHash)), + "hash"); + + m->add(user_type(), "HuffmanNode"); + //m->add(Carbon::constructor(), "HuffmanNode"); + m->add(Carbon::fun(&HuffmanNode::data), "data"); + m->add(Carbon::fun(&HuffmanNode::frequency), "frequency"); + m->add(Carbon::fun(&HuffmanNode::left), "left"); + m->add(Carbon::fun(&HuffmanNode::right), "right"); + + m->add(Carbon::fun(&createHuffmanTree), "create_huffman_tree"); + m->add(Carbon::fun(&generateHuffmanCodes), "generate_huffman_codes"); + m->add(Carbon::fun(&compressText), "compress_text"); + m->add(Carbon::fun(&decompressText), "decompress_text"); + + m->add(Carbon::fun(&mulDiv64), "mul_div_64"); + + m->add(Carbon::fun(&MD5::encrypt), "md5_encrypt"); + + m->add( + Carbon::fun(&murmur3Hash), + "murmur3_hash"); + m->add(Carbon::fun(&murmur3Hash64), + "murmur3_hash_64"); + m->add( + Carbon::fun(&dataFromHexstring), + "data_from_hexstring"); + m->add( + Carbon::fun(&dataFromHexstring), + "data_from_hexstring"); + m->add( + Carbon::fun(&hexstringFromData), + "hexstring_from_data"); + return m; +} +} // namespace Atom::_Script::Algorithm diff --git a/src/atom/algorithm/fraction.cpp b/src/atom/algorithm/fraction.cpp index 75686b07..7c710361 100644 --- a/src/atom/algorithm/fraction.cpp +++ b/src/atom/algorithm/fraction.cpp @@ -80,28 +80,6 @@ bool Fraction::operator==(const Fraction &other) const { return (numerator == other.numerator) && (denominator == other.denominator); } -Fraction &Fraction::operator++() { - *this += 1; - return *this; -} - -Fraction Fraction::operator++(int) { - Fraction temp = *this; - ++(*this); - return temp; -} - -Fraction &Fraction::operator--() { - *this -= 1; - return *this; -} - -Fraction Fraction::operator--(int) { - Fraction temp = *this; - --(*this); - return temp; -} - Fraction Fraction::operator-() const { return Fraction(-numerator, denominator); } diff --git a/src/atom/algorithm/fraction.hpp b/src/atom/algorithm/fraction.hpp index 1f720fd5..b1a8c23e 100644 --- a/src/atom/algorithm/fraction.hpp +++ b/src/atom/algorithm/fraction.hpp @@ -49,7 +49,7 @@ class Fraction { * @param n The numerator (default is 0). * @param d The denominator (default is 1). */ - Fraction(int n = 0, int d = 1); + explicit Fraction(int n = 0, int d = 1); /** * @brief Adds another fraction to this fraction. @@ -131,30 +131,6 @@ class Fraction { */ bool operator==(const Fraction& other) const; - /** - * @brief Pre-increments the fraction by 1. - * @return Reference to the modified fraction. - */ - Fraction& operator++(); - - /** - * @brief Post-increments the fraction by 1. - * @return The fraction before incrementing. - */ - Fraction operator++(int); - - /** - * @brief Pre-decrements the fraction by 1. - * @return Reference to the modified fraction. - */ - Fraction& operator--(); - - /** - * @brief Post-decrements the fraction by 1. - * @return The fraction before decrementing. - */ - Fraction operator--(int); - /** * @brief Negates the fraction. * @return The negated fraction. diff --git a/src/atom/algorithm/hash.hpp b/src/atom/algorithm/hash.hpp index 937f9e64..58394575 100644 --- a/src/atom/algorithm/hash.hpp +++ b/src/atom/algorithm/hash.hpp @@ -239,25 +239,22 @@ inline std::uint32_t jenkins_one_at_a_time_hash(const std::string& s) noexcept { return jenkins_one_at_a_time_hash(std::string_view{s}); } -inline uint32_t quickHash(const char* str) { - if (!str) - return 0; - - unsigned int h = 0; - for (; *str; str++) { - h = 31 * h + *str; +inline uint32_t quickHash(std::string_view str) { + uint32_t h = 0; + for (char c : str) { + h = 31 * h + static_cast(c); } return h; } -inline uint32_t quickHash(const void* tmp, uint32_t size) { - if (!tmp) +inline uint32_t quickHash(const void* data, size_t size) { + if (data == nullptr || size == 0) return 0; - const char* str = static_cast(tmp); - unsigned int h = 0; - for (uint32_t i = 0; i < size; ++i, ++str) { - h = 31 * h + *str; + const auto* str = static_cast(data); + uint32_t h = 0; + for (size_t i = 0; i < size; ++i) { + h = 31 * h + str[i]; } return h; } diff --git a/src/atom/io/_script.hpp b/src/atom/io/_script.hpp index c76ad332..9fd62d6b 100644 --- a/src/atom/io/_script.hpp +++ b/src/atom/io/_script.hpp @@ -1,3 +1,17 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Carbon binding for Atom-IO + +**************************************************/ + #ifndef ATOM_IO_SCRIPT_HPP #define ATOM_IO_SCRIPT_HPP @@ -6,6 +20,7 @@ #include "compress.hpp" #include "file.hpp" #include "glob.hpp" +#include "idirectory.hpp" #include "ifile.hpp" #include "io.hpp" @@ -24,7 +39,7 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&extract_zip), "extract_zip"); m->add(user_type(), "FileManager"); - m->add(Carbon::constructor(), "FileManager"); + //m->add(Carbon::constructor(), "FileManager"); m->add(Carbon::fun(&FileManager::createFile), "createFile"); m->add(Carbon::fun(&FileManager::openFile), "openFile"); m->add(Carbon::fun(&FileManager::readFile), "readFile"); @@ -49,7 +64,7 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&glob::rlistdir), "rlistdir"); m->add(user_type(), "FileWrapper"); - m->add(Carbon::constructor(), "FileWrapper"); + //m->add(Carbon::constructor(), "FileWrapper"); m->add(Carbon::fun( static_cast&)>( &FileWrapper::write)), @@ -72,6 +87,22 @@ Carbon::ModulePtr bootstrap( &FileWrapper::append)), "append"); + m->add(user_type(), "DirectoryWrapper"); + //m->add(Carbon::constructor(), + // "DirectoryWrapper"); + //m->add(Carbon::constructor(), + // "DirectoryWrapper"); + m->add(Carbon::fun(&DirectoryWrapper::exists), "exists"); + m->add(Carbon::fun(&DirectoryWrapper::get_path), "get_path"); + m->add(Carbon::fun(&DirectoryWrapper::get_size), "get_size"); + m->add(Carbon::fun(&DirectoryWrapper::get_size_string), "get_size_string"); + m->add(Carbon::fun(&DirectoryWrapper::remove), "remove"); + m->add(Carbon::fun(&DirectoryWrapper::create_directory), + "create_directory"); + m->add(Carbon::fun(&DirectoryWrapper::list_files), "list_files"); + m->add(Carbon::fun(&DirectoryWrapper::list_directories), + "list_directories"); + m->add(Carbon::fun( static_cast(&createDirectory)), "createDirectory"); @@ -93,7 +124,11 @@ Carbon::ModulePtr bootstrap( "isFolderExists"); m->add(Carbon::fun(static_cast(&isFolderExists)), "isFolderExists"); - m->add(Carbon::fun(&isFileExists), "isFileExists"); + m->add( + Carbon::fun(static_cast(&isFileExists)), + "isFileExists"); + m->add(Carbon::fun(static_cast(&isFileExists)), + "isFileExists"); m->add(Carbon::fun(&isFolderNameValid), "isFolderNameValid"); m->add(Carbon::fun(&isFileNameValid), "isFileNameValid"); m->add(Carbon::fun(&isAbsolutePath), "isAbsolutePath"); diff --git a/src/atom/io/idirectory.cpp b/src/atom/io/idirectory.cpp new file mode 100644 index 00000000..f591bd65 --- /dev/null +++ b/src/atom/io/idirectory.cpp @@ -0,0 +1,85 @@ +/* + * idirectory.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Directory Wrapper + +**************************************************/ + +#include "idirectory.hpp" + +#include +#include + +namespace Atom::IO { +DirectoryWrapper::DirectoryWrapper(const fs::path& dir_path) + : dir_path_(dir_path) {} + +DirectoryWrapper::DirectoryWrapper(const std::string& dir_path) + : dir_path_(dir_path) {} + +bool DirectoryWrapper::exists() const { + return fs::exists(dir_path_) && fs::is_directory(dir_path_); +} + +void DirectoryWrapper::remove() { + if (exists()) { + fs::remove_all(dir_path_); + } +} + +fs::path DirectoryWrapper::get_path() const { return dir_path_; } + +uintmax_t DirectoryWrapper::get_size() const { + uintmax_t size = 0; + for (const auto& entry : fs::recursive_directory_iterator(dir_path_)) { + if (fs::is_regular_file(entry)) { + size += fs::file_size(entry); + } + } + return size; +} + +std::string DirectoryWrapper::get_size_string() const { + uintmax_t size = get_size(); + if (size < 1024) { + return std::to_string(size) + " B"; + } else if (size < 1024 * 1024) { + return std::to_string(size / 1024) + " KB"; + } else if (size < 1024 * 1024 * 1024) { + return std::to_string(size / (1024 * 1024)) + " MB"; + } else { + return std::to_string(size / (1024 * 1024 * 1024)) + " GB"; + } +} + +std::vector DirectoryWrapper::list_files() const { + std::vector files; + for (const auto& entry : fs::directory_iterator(dir_path_)) { + if (fs::is_regular_file(entry)) { + files.push_back(entry.path()); + } + } + return files; +} + +std::vector DirectoryWrapper::list_directories() const { + std::vector directories; + for (const auto& entry : fs::directory_iterator(dir_path_)) { + if (fs::is_directory(entry)) { + directories.push_back(entry.path()); + } + } + return directories; +} + +void DirectoryWrapper::create_directory(const std::string& name) const { + fs::create_directory(dir_path_ / name); +} +} // namespace Atom::IO diff --git a/src/atom/io/idirectory.hpp b/src/atom/io/idirectory.hpp new file mode 100644 index 00000000..13f6c469 --- /dev/null +++ b/src/atom/io/idirectory.hpp @@ -0,0 +1,97 @@ +/* + * idirectory.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Directory Wrapper + +**************************************************/ + +#ifndef ATOM_IO_IDIRECTORY_HPP +#define ATOM_IO_IDIRECTORY_HPP + +#include +#include +#include + +namespace fs = std::filesystem; + +namespace Atom::IO { +/** + * @brief A wrapper class for interacting with directories. + */ +class DirectoryWrapper { +public: + /** + * @brief Constructs a DirectoryWrapper object with the specified directory + * path. + * @param dir_path The path to the directory. + */ + explicit DirectoryWrapper(const fs::path& dir_path); + + /** + * @brief Constructs a DirectoryWrapper object with the specified directory + * path. + * @param dir_path The path to the directory. + */ + explicit DirectoryWrapper(const std::string& dir_path); + + /** + * @brief Checks if the directory exists. + * @return True if the directory exists, otherwise false. + */ + bool exists() const; + + /** + * @brief Removes the directory and its contents. + */ + void remove(); + + /** + * @brief Gets the path of the directory. + * @return The path of the directory. + */ + fs::path get_path() const; + + /** + * @brief Gets the size of the directory in bytes. + * @return The size of the directory. + */ + uintmax_t get_size() const; + + /** + * @brief Gets the size of the directory as a string representation. + * @return The size of the directory as a string. + */ + std::string get_size_string() const; + + /** + * @brief Lists all files in the directory. + * @return A vector containing paths to all files in the directory. + */ + std::vector list_files() const; + + /** + * @brief Lists all subdirectories in the directory. + * @return A vector containing paths to all subdirectories in the directory. + */ + std::vector list_directories() const; + + /** + * @brief Creates a new directory within the current directory. + * @param name The name of the new directory to create. + */ + void create_directory(const std::string& name) const; + +private: + fs::path dir_path_; ///< The path to the directory. +}; + +} // namespace Atom::IO + +#endif diff --git a/src/atom/io/ifile.cpp b/src/atom/io/ifile.cpp index 9e825754..c5de7f77 100644 --- a/src/atom/io/ifile.cpp +++ b/src/atom/io/ifile.cpp @@ -1,5 +1,22 @@ +/* + * ifile.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: File Wrapper + +**************************************************/ + #include "ifile.hpp" +#include +#include + namespace Atom::IO { FileWrapper::FileWrapper(const fs::path& file_path) : file_path_(file_path) {} diff --git a/src/atom/io/ifile.hpp b/src/atom/io/ifile.hpp index b3bbf944..1bc60098 100644 --- a/src/atom/io/ifile.hpp +++ b/src/atom/io/ifile.hpp @@ -1,6 +1,18 @@ +/* + * ifile.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: File Wrapper + +**************************************************/ + #include -#include -#include #include #include #include diff --git a/src/atom/io/io.cpp b/src/atom/io/io.cpp index 82079ec1..2fd7b502 100644 --- a/src/atom/io/io.cpp +++ b/src/atom/io/io.cpp @@ -102,11 +102,11 @@ void createDirectory(const std::string &date, const std::string &rootDir) { DLOG_F(INFO, "Directory creation completed: {}", currentDir.string()); } -bool createDirectoriesRecursive(const fs::path& basePath, - const std::vector& subdirs, - const CreateDirectoriesOptions& options = {}) { +bool createDirectoriesRecursive(const fs::path &basePath, + const std::vector &subdirs, + const CreateDirectoriesOptions &options = {}) { for (size_t i = 0; i < subdirs.size(); ++i) { - const std::string& subdir = subdirs[i]; + const std::string &subdir = subdirs[i]; #if __cplusplus >= 202002L std::string fullPath = std::format("{}/{}", basePath.string(), subdir); @@ -380,6 +380,10 @@ bool isFileExists(const std::string &fileName) { return fs::exists(fileName) && fs::is_regular_file(fileName); } +bool isFileExists(const fs::path &fileName) { + return isFileExists(fileName.string()); +} + bool isFolderEmpty(const std::string &folderName) { if (!isFolderExists(folderName)) { return false; diff --git a/src/atom/io/io.hpp b/src/atom/io/io.hpp index acb1a014..51005e81 100644 --- a/src/atom/io/io.hpp +++ b/src/atom/io/io.hpp @@ -320,6 +320,7 @@ void traverseDirectories(const std::filesystem::path &directory, * @return 如果文件存在,则返回true,否则返回false。 */ [[nodiscard]] bool isFileExists(const std::string &filePath); +[[nodiscard]] bool isFileExists(const fs::path &filePath); /** * @brief Check if the folder is empty. diff --git a/src/atom/system/CMakeLists.txt b/src/atom/system/CMakeLists.txt index 28d62761..b9bac6c4 100644 --- a/src/atom/system/CMakeLists.txt +++ b/src/atom/system/CMakeLists.txt @@ -22,6 +22,7 @@ set(${PROJECT_NAME}_SOURCES command.cpp crash_quotes.cpp crash.cpp + lregistry.cpp pidwatcher.cpp process.cpp register.cpp diff --git a/src/atom/system/_script.cpp b/src/atom/system/_script.cpp deleted file mode 100644 index 8b7464b3..00000000 --- a/src/atom/system/_script.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * _script.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-4-13 - -Description: Carbon Binding of Atom-System - -**************************************************/ - -#include "carbon/carbon.hpp" - -#include "module/battery.hpp" -#include "module/cpu.hpp" -#include "module/disk.hpp" -#include "module/memory.hpp" -#include "module/os.hpp" -#include "module/wifi.hpp" - -#include -#include "atom/log/loguru.hpp" - -using namespace Atom::System; - -CARBON_MODULE_EXPORT { - Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { - Carbon::ModulePtr m_module = std::make_shared(); - - m_module->add(Carbon::fun(&getCurrentCpuUsage), - "get_current_cpu_usage"); - m_module->add(Carbon::fun(&getCurrentCpuTemperature), - "get_current_cpu_temperature"); - m_module->add(Carbon::fun(&getCPUModel), "get_cpu_model"); - m_module->add(Carbon::fun(&getProcessorIdentifier), - "get_processor_identifier"); - m_module->add(Carbon::fun(&getProcessorFrequency), - "get_processor_frequency"); - m_module->add(Carbon::fun(&getNumberOfPhysicalPackages), - "get_number_of_physical_packages"); - m_module->add(Carbon::fun(&getNumberOfPhysicalCPUs), - "get_number_of_physical_cpus"); - - m_module->add(Carbon::fun(&getMemoryUsage), "get_memory_usage"); - m_module->add(Carbon::fun(&getTotalMemorySize), - "get_total_memory_size"); - m_module->add(Carbon::fun(&getAvailableMemorySize), - "get_available_memory_size"); - m_module->add(Carbon::fun(&getPhysicalMemoryInfo), - "get_physical_memory_info"); - m_module->add(Carbon::fun(&getVirtualMemoryMax), - "get_virtual_memory_max"); - m_module->add(Carbon::fun(&getVirtualMemoryUsed), - "get_virtual_memory_used"); - m_module->add(Carbon::fun(&getSwapMemoryTotal), - "get_swap_memory_total"); - m_module->add(Carbon::fun(&getSwapMemoryUsed), "get_swap_memory_used"); - return m_module; - } -} diff --git a/src/atom/system/_script.hpp b/src/atom/system/_script.hpp new file mode 100644 index 00000000..3e1180b5 --- /dev/null +++ b/src/atom/system/_script.hpp @@ -0,0 +1,280 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Carbon binding for Atom-System + +**************************************************/ + +#ifndef ATOM_SYSTEM_SCRIPT_HPP +#define ATOM_SYSTEM_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "module/battery.hpp" +#include "module/cpu.hpp" +#include "module/disk.hpp" +#include "module/gpu.hpp" +#include "module/memory.hpp" +#include "module/os.hpp" +#include "module/wifi.hpp" + +#include "command.hpp" +#include "crash.hpp" +#include "crash_quotes.hpp" +#include "lregistry.hpp" +#include "os.hpp" +#include "pidwatcher.hpp" +#include "process.hpp" +#include "register.hpp" +#include "storage.hpp" +#include "system.hpp" +#include "user.hpp" + +using namespace Atom::System; + +namespace Atom::_Script::System { +/** + * Adds the String Methods to the given Carbon m. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + + m->add(user_type(), "BatteryInfo"); + //m->add(Carbon::constructor(), "BatteryInfo"); + m->add(Carbon::fun(&BatteryInfo::isBatteryPresent), "is_battery_present"); + m->add(Carbon::fun(&BatteryInfo::batteryLifeTime), "battery_life_time"); + m->add(Carbon::fun(&BatteryInfo::batteryLifePercent), + "battery_life_percent"); + m->add(Carbon::fun(&BatteryInfo::batteryFullLifeTime), + "battery_full_life_time"); + m->add(Carbon::fun(&BatteryInfo::energyNow), "energy_now"); + m->add(Carbon::fun(&BatteryInfo::energyFull), "energy_full"); + m->add(Carbon::fun(&BatteryInfo::energyDesign), "energy_design"); + m->add(Carbon::fun(&BatteryInfo::currentNow), "current_now"); + m->add(Carbon::fun(&BatteryInfo::voltageNow), "voltage_now"); + m->add(Carbon::fun(&BatteryInfo::isCharging), "is_charging"); + + m->add(Carbon::fun(&getBatteryInfo), "get_battery_info"); + + m->add(Carbon::fun(&getCurrentCpuUsage), "get_current_cpu_usage"); + m->add(Carbon::fun(&getCurrentCpuTemperature), + "get_current_cpu_temperature"); + m->add(Carbon::fun(&getCPUModel), "get_cpu_model"); + m->add(Carbon::fun(getProcessorIdentifier), "get_processor_identifier"); + m->add(Carbon::fun(&getProcessorFrequency), "get_processor_frequency"); + m->add(Carbon::fun(&getNumberOfPhysicalCPUs), + "get_number_of_physical_cpus"); + m->add(Carbon::fun(&getNumberOfPhysicalPackages), + "get_number_of_physical_packages"); + + m->add(Carbon::fun(&getDiskUsage), "get_disk_usage"); + m->add(Carbon::fun(&getDriveModel), "get_drive_model"); + m->add(Carbon::fun(&getAvailableDrives), "get_available_drives"); + m->add(Carbon::fun(&getStorageDeviceModels), "get_storage_device_models"); + m->add(Carbon::fun(&calculateDiskUsagePercentage), + "calculate_disk_usage_percentage"); + + m->add(Carbon::fun(&getGPUInfo), "get_gpu_info"); + + m->add(user_type(), "MemorySlot"); + //m->add(Carbon::constructor(), "MemorySlot"); + m->add( + Carbon::constructor(), + "size"); + m->add(Carbon::fun(&MemoryInfo::MemorySlot::capacity), "capacity"); + m->add(Carbon::fun(&MemoryInfo::MemorySlot::type), "type"); + m->add(Carbon::fun(&MemoryInfo::MemorySlot::clockSpeed), "speed"); + + m->add(user_type(), "MemoryInfo"); + //m->add(Carbon::constructor(), "MemoryInfo"); + m->add(Carbon::fun(&MemoryInfo::slots), "slots"); + m->add(Carbon::fun(&MemoryInfo::swapMemoryTotal), "swap_memory_total"); + m->add(Carbon::fun(&MemoryInfo::swapMemoryUsed), "swap_memory_used"); + m->add(Carbon::fun(&MemoryInfo::virtualMemoryMax), "virtual_memory_max"); + m->add(Carbon::fun(&MemoryInfo::virtualMemoryUsed), "virtual_memory_used"); + + m->add(Carbon::fun(&getMemoryUsage), "get_memory_usage"); + m->add(Carbon::fun(&getPhysicalMemoryInfo), "get_physical_memory_info"); + m->add(Carbon::fun(&getVirtualMemoryMax), "get_virtual_memory_max"); + m->add(Carbon::fun(&getVirtualMemoryUsed), "get_virtual_memory_used"); + m->add(Carbon::fun(&getSwapMemoryTotal), "get_swap_memory_total"); + m->add(Carbon::fun(&getSwapMemoryUsed), "get_swap_memory_used"); + m->add(Carbon::fun(&getTotalMemorySize), "get_total_memory_size"); + m->add(Carbon::fun(&getAvailableMemorySize), "get_available_memory_size"); + + m->add(user_type(), "OperatingSystemInfo"); + //m->add(Carbon::constructor(), "OperatingSystemInfo"); + m->add(Carbon::fun(&OperatingSystemInfo::osName), "os_name"); + m->add(Carbon::fun(&OperatingSystemInfo::osVersion), "os_version"); + m->add(Carbon::fun(&OperatingSystemInfo::kernelVersion), "kernel_version"); + m->add(Carbon::fun(&OperatingSystemInfo::architecture), "architecture"); + m->add(Carbon::fun(&OperatingSystemInfo::compiler), "compiler"); + m->add(Carbon::fun(&OperatingSystemInfo::toJson), "to_json"); + + m->add(Carbon::fun(&getOperatingSystemInfo), "get_operating_system_info"); + + m->add(Carbon::fun(&getCurrentWifi), "get_current_wifi"); + m->add(Carbon::fun(&getCurrentWiredNetwork), "get_current_wired_network"); + m->add(Carbon::fun(&isHotspotConnected), "is_hotspot_connected"); + m->add(Carbon::fun(&getHostIPs), "get_host_ips"); + + m->add(user_type(), "ProcessHandle"); + //m->add(Carbon::constructor(), "ProcessHandle"); + + m->add( + Carbon::fun)>( + &executeCommand), + "execute_command"); + m->add(Carbon::fun(&executeCommand), + "execute_command"); + m->add(Carbon::fun(&executeCommands), "execute_commands"); + m->add(Carbon::fun(&killProcess), "kill_process"); + m->add(Carbon::fun(&executeCommandWithEnv), "execute_command_with_env"); + m->add(Carbon::fun(&executeCommandWithStatus), + "execute_command_with_status"); + + m->add(user_type(), "Quote"); + m->add( + Carbon::constructor(), + "Quote"); + m->add(Carbon::fun(&Quote::getAuthor), "author"); + m->add(Carbon::fun(&Quote::getText), "text"); + + m->add(user_type(), "QuoteManager"); + //m->add(Carbon::constructor(), "QuoteManager"); +#if ENABLE_DEBUG + m->add(Carbon::fun(&QuoteManager::displayQuotes), "display_quotes"); +#endif + m->add(Carbon::fun(&QuoteManager::clearQuotes), "clear_quotes"); + m->add(Carbon::fun(&QuoteManager::saveQuotesToFile), "save_quotes_to_file"); + m->add(Carbon::fun(&QuoteManager::loadQuotesFromFile), + "load_quotes_from_file"); + m->add(Carbon::fun(&QuoteManager::shuffleQuotes), "shuffle_quotes"); + m->add(Carbon::fun(&QuoteManager::addQuote), "add_quote"); + m->add(Carbon::fun(&QuoteManager::removeQuote), "remove_quote"); + m->add(Carbon::fun(&QuoteManager::searchQuotes), "search_quotes"); + m->add(Carbon::fun(&QuoteManager::getRandomQuote), "get_random_quote"); + m->add(Carbon::fun(&QuoteManager::filterQuotesByAuthor), + "filter_quotes_by_author"); + + m->add(Carbon::fun(&saveCrashLog), "save_crash_log"); + + m->add(user_type(), "Registry"); + + //m->add(Carbon::constructor(), "Registry"); + + m->add(Carbon::fun(&Registry::loadRegistryFromFile), + "loadRegistryFromFile"); + m->add(Carbon::fun(&Registry::createKey), "createKey"); + m->add(Carbon::fun(&Registry::deleteKey), "deleteKey"); + m->add(Carbon::fun(&Registry::setValue), "setValue"); + m->add(Carbon::fun(&Registry::getValue), "getValue"); + m->add(Carbon::fun(&Registry::deleteValue), "deleteValue"); + m->add(Carbon::fun(&Registry::backupRegistryData), "backupRegistryData"); + m->add(Carbon::fun(&Registry::restoreRegistryData), "restoreRegistryData"); + m->add(Carbon::fun(&Registry::keyExists), "keyExists"); + m->add(Carbon::fun(&Registry::valueExists), "valueExists"); + m->add(Carbon::fun(&Registry::getValueNames), "getValueNames"); + + m->add(user_type(), "Utsname"); + //m->add(Carbon::constructor(), "Utsname"); + m->add(Carbon::fun(&Utsname::nodename), "nodename"); + m->add(Carbon::fun(&Utsname::sysname), "sysname"); + m->add(Carbon::fun(&Utsname::release), "release"); + m->add(Carbon::fun(&Utsname::version), "version"); + m->add(Carbon::fun(&Utsname::machine), "machine"); + + m->add(Carbon::fun(&walk), "walk"); + m->add(Carbon::fun(&jwalk), "jwalk"); + m->add(Carbon::fun(&fwalk), "fwalk"); + m->add(Carbon::fun(&Environ), "Environ"); + m->add(Carbon::fun(&ctermid), "ctermid"); + m->add(Carbon::fun(&getpriority), "getpriority"); + m->add(Carbon::fun(&getlogin), "getlogin"); + m->add(Carbon::fun(&uname), "uname"); + + m->add(user_type(), "PidWatcher"); + //m->add(Carbon::constructor(), "PidWatcher"); + m->add(Carbon::fun(&PidWatcher::SetExitCallback), "set_exit_callback"); + m->add(Carbon::fun(&PidWatcher::SetMonitorFunction), + "set_monitor_function"); + m->add(Carbon::fun(&PidWatcher::Start), "start"); + m->add(Carbon::fun(&PidWatcher::Stop), "stop"); + m->add(Carbon::fun(&PidWatcher::Switch), "switch"); + m->add(Carbon::fun(&PidWatcher::GetPidByName), "get_pid_by_name"); + + m->add(user_type(), "ProcessManager"); + //m->add(Carbon::constructor(), "ProcessManager"); + m->add(Carbon::fun(&ProcessManager::createProcess), "create_process"); + m->add(Carbon::fun(&ProcessManager::terminateProcess), "terminate_process"); + m->add(Carbon::fun(&ProcessManager::terminateProcessByName), + "terminate_process_by_name"); + m->add(Carbon::fun(&ProcessManager::hasProcess), "has_process"); + m->add(Carbon::fun(&ProcessManager::getProcessOutput), + "get_process_output"); + m->add(Carbon::fun(&ProcessManager::runScript), "run_script"); + m->add(Carbon::fun(&ProcessManager::waitForCompletion), + "wait_for_completion"); + m->add(Carbon::fun(&ProcessManager::getRunningProcesses), + "get_running_processes"); + +#ifdef _WIN32 + + m->add(Carbon::fun(&getRegistrySubKeys), "get_registry_sub_keys"); + m->add(Carbon::fun(&getRegistryValues), "get_registry_values"); + m->add(Carbon::fun(&findRegistryKey), "find_registry_key"); + m->add(Carbon::fun(&findRegistryValue), "find_registry_value"); + m->add(Carbon::fun(&recursivelyEnumerateRegistrySubKeys), + "recursively_enumerate_registry_sub_keys"); + m->add(Carbon::fun(&exportRegistry), "export_registry"); + m->add(Carbon::fun(&backupRegistry), "backup_registry"); + m->add(Carbon::fun(&modifyRegistryValue), "modify_registry_value"); + m->add(Carbon::fun(&deleteRegistrySubKey), "delete_registry_sub_key"); + m->add(Carbon::fun(&deleteRegistryValue), "delete_registry_value"); + +#endif + + m->add(user_type(), "StorageMonitor"); + //m->add(Carbon::constructor(), "StorageMonitor"); + m->add(Carbon::fun(&StorageMonitor::registerCallback), "register_callback"); + m->add(Carbon::fun(&StorageMonitor::startMonitoring), "start_monitoring"); + m->add(Carbon::fun(&StorageMonitor::stopMonitoring), "stop_monitoring"); + m->add(Carbon::fun(&StorageMonitor::triggerCallbacks), "trigger_callbacks"); + + m->add(Carbon::fun(&checkSoftwareInstalled), "check_software_installed"); + m->add(Carbon::fun(&checkDuplicateProcess), "check_duplicate_process"); + m->add(Carbon::fun(&getProcessInfoByName), "get_process_info_by_name"); + m->add(Carbon::fun(&getProcessInfoByID), "get_process_info_by_id"); + m->add(Carbon::fun(&GetProcessDetails), "get_process_details"); + m->add(Carbon::fun(&getProcessInfo), "get_process_info"); + m->add(Carbon::fun(&GetAllProcesses), "get_all_processes"); + m->add(Carbon::fun(&GetSelfProcessInfo), "get_self_process_info"); + m->add(Carbon::fun(&isProcessRunning), "is_process_running"); + m->add(Carbon::fun(&isRoot), "is_root"); + m->add(Carbon::fun(&reboot), "reboot"); + m->add(Carbon::fun(&shutdown), "shutdown"); + + m->add(Carbon::fun(&getUsername), "get_username"); + m->add(Carbon::fun(&getUserId), "get_user_id"); + m->add(Carbon::fun(&getGroupId), "get_group_id"); + m->add(Carbon::fun(&getHomeDirectory), "get_home_directory"); + m->add(Carbon::fun(&getLoginShell), "get_login_shell"); + m->add(Carbon::fun(&getUserGroups), "get_user_groups"); + m->add(Carbon::fun(&getHostname), "get_hostname"); + + return m; +} +} // namespace Atom::_Script::System + + +#endif + diff --git a/src/atom/system/command.cpp b/src/atom/system/command.cpp index 1f58b28f..e527149b 100644 --- a/src/atom/system/command.cpp +++ b/src/atom/system/command.cpp @@ -38,8 +38,8 @@ Description: Simple wrapper for executing commands. namespace Atom::System { std::string executeCommand( - const std::string &command, bool openTerminal = false, - std::function processLine = nullptr) { + const std::string &command, bool openTerminal, + std::function processLine) { if (command.empty()) { return ""; } diff --git a/src/atom/system/command.hpp b/src/atom/system/command.hpp index 2ce53eb7..4953e51c 100644 --- a/src/atom/system/command.hpp +++ b/src/atom/system/command.hpp @@ -48,8 +48,9 @@ struct ProcessHandle { * execute. */ [[nodiscard]] std::string executeCommand( - const std::string &command, bool openTerminal, - std::function processLine); + const std::string &command, bool openTerminal = false, + std::function processLine = + [](const std::string &) {}); /** * @brief Execute a list of commands. diff --git a/src/atom/system/lregistry.cpp b/src/atom/system/lregistry.cpp index 864b02c1..f8fc41d5 100644 --- a/src/atom/system/lregistry.cpp +++ b/src/atom/system/lregistry.cpp @@ -16,6 +16,7 @@ Description: A self-contained registry manager. #include #include +#include #include "atom/log/loguru.hpp" @@ -23,10 +24,12 @@ namespace Atom::System { class Registry::RegistryImpl { public: - std::map> registryData; + std::unordered_map> + registryData; void saveRegistryToFile(); - void notifyEvent(std::string eventType, std::string keyName); + void notifyEvent(const std::string& eventType, const std::string& keyName); }; Registry::Registry() : pImpl(std::make_unique()) {} @@ -36,25 +39,26 @@ void Registry::loadRegistryFromFile() { pImpl->saveRegistryToFile(); // Delegate to implementation } -void Registry::createKey(std::string keyName) { +void Registry::createKey(const std::string& keyName) { pImpl->saveRegistryToFile(); // Delegate to implementation pImpl->notifyEvent("KeyCreated", keyName); // Delegate to implementation } -void Registry::deleteKey(std::string keyName) { +void Registry::deleteKey(const std::string& keyName) { pImpl->saveRegistryToFile(); // Delegate to implementation pImpl->notifyEvent("KeyDeleted", keyName); // Delegate to implementation } -void Registry::setValue(std::string keyName, std::string valueName, - std::string data) { +void Registry::setValue(const std::string& keyName, + const std::string& valueName, const std::string& data) { pImpl->registryData[keyName][valueName] = data; // Access implementation directly pImpl->saveRegistryToFile(); // Delegate to implementation pImpl->notifyEvent("ValueSet", keyName); // Delegate to implementation } -std::string Registry::getValue(std::string keyName, std::string valueName) { +std::string Registry::getValue(const std::string& keyName, + const std::string& valueName) { if (pImpl->registryData.find(keyName) != pImpl->registryData.end() && pImpl->registryData[keyName].find(valueName) != pImpl->registryData[keyName].end()) { @@ -66,7 +70,8 @@ std::string Registry::getValue(std::string keyName, std::string valueName) { } } -void Registry::deleteValue(std::string keyName, std::string valueName) { +void Registry::deleteValue(const std::string& keyName, + const std::string& valueName) { if (pImpl->registryData.find(keyName) != pImpl->registryData.end()) { pImpl->registryData[keyName].erase( valueName); // Access implementation directly @@ -78,14 +83,14 @@ void Registry::deleteValue(std::string keyName, std::string valueName) { void Registry::backupRegistryData() { std::time_t currentTime = std::time(nullptr); - std::string backupFileName = + const std::string& backupFileName = "registry_backup_" + std::to_string(currentTime) + ".txt"; std::ofstream backupFile(backupFileName); if (backupFile.is_open()) { - for (const auto &key : pImpl->registryData) { + for (const auto& key : pImpl->registryData) { backupFile << key.first << std::endl; - for (const auto &value : key.second) { + for (const auto& value : key.second) { backupFile << value.first << "=" << value.second << std::endl; } backupFile << std::endl; @@ -98,7 +103,7 @@ void Registry::backupRegistryData() { } } -void Registry::restoreRegistryData(std::string backupFile) { +void Registry::restoreRegistryData(const std::string& backupFile) { std::ifstream backup(backupFile); if (backup.is_open()) { pImpl->registryData.clear(); // Clear existing data before restoring @@ -109,7 +114,7 @@ void Registry::restoreRegistryData(std::string backupFile) { if (!line.empty() && line.find('=') == std::string::npos) { currentKey = line; pImpl->registryData[currentKey] = - std::map(); + std::unordered_map(); } else if (line.find('=') != std::string::npos) { size_t splitPos = line.find('='); std::string valueName = line.substr(0, splitPos); @@ -126,20 +131,22 @@ void Registry::restoreRegistryData(std::string backupFile) { } } -bool Registry::keyExists(std::string keyName) const { +bool Registry::keyExists(const std::string& keyName) const { return pImpl->registryData.find(keyName) != pImpl->registryData.end(); } -bool Registry::valueExists(std::string keyName, std::string valueName) const { +bool Registry::valueExists(const std::string& keyName, + const std::string& valueName) const { auto keyIter = pImpl->registryData.find(keyName); return keyIter != pImpl->registryData.end() && keyIter->second.find(valueName) != keyIter->second.end(); } -std::vector Registry::getValueNames(std::string keyName) const { +std::vector Registry::getValueNames( + const std::string& keyName) const { std::vector valueNames; if (pImpl->registryData.find(keyName) != pImpl->registryData.end()) { - for (const auto &pair : pImpl->registryData.at(keyName)) { + for (const auto& pair : pImpl->registryData.at(keyName)) { valueNames.push_back(pair.first); } } @@ -148,9 +155,9 @@ std::vector Registry::getValueNames(std::string keyName) const { void Registry::RegistryImpl::saveRegistryToFile() { std::ofstream file("registry_data.txt"); if (file.is_open()) { - for (auto const &key : registryData) { + for (auto const& key : registryData) { file << key.first << std::endl; - for (auto const &value : key.second) { + for (auto const& value : key.second) { file << value.first << "=" << value.second << std::endl; } file << std::endl; @@ -161,8 +168,8 @@ void Registry::RegistryImpl::saveRegistryToFile() { } } -void Registry::RegistryImpl::notifyEvent(std::string eventType, - std::string keyName) { +void Registry::RegistryImpl::notifyEvent(const std::string& eventType, + const std::string& keyName) { DLOG_F(INFO, "Event: {} occurred for key: {}", eventType, keyName); } diff --git a/src/atom/system/lregistry.hpp b/src/atom/system/lregistry.hpp index c05b41df..e65ea895 100644 --- a/src/atom/system/lregistry.hpp +++ b/src/atom/system/lregistry.hpp @@ -36,14 +36,14 @@ class Registry { * * @param keyName The name of the key to create. */ - void createKey(std::string keyName); + void createKey(const std::string &keyName); /** * @brief Deletes a key from the registry. * * @param keyName The name of the key to delete. */ - void deleteKey(std::string keyName); + void deleteKey(const std::string &keyName); /** * @brief Sets a value for a key in the registry. @@ -52,7 +52,8 @@ class Registry { * @param valueName The name of the value to set. * @param data The data to set for the value. */ - void setValue(std::string keyName, std::string valueName, std::string data); + void setValue(const std::string &keyName, const std::string &valueName, + const std::string &data); /** * @brief Gets the value associated with a key and value name from the @@ -62,7 +63,8 @@ class Registry { * @param valueName The name of the value to retrieve. * @return The value associated with the key and value name. */ - std::string getValue(std::string keyName, std::string valueName); + std::string getValue(const std::string &keyName, + const std::string &valueName); /** * @brief Deletes a value from a key in the registry. @@ -70,7 +72,7 @@ class Registry { * @param keyName The name of the key. * @param valueName The name of the value to delete. */ - void deleteValue(std::string keyName, std::string valueName); + void deleteValue(const std::string &keyName, const std::string &valueName); /** * @brief Backs up the registry data. @@ -82,7 +84,7 @@ class Registry { * * @param backupFile The backup file to restore data from. */ - void restoreRegistryData(std::string backupFile); + void restoreRegistryData(const std::string &backupFile); /** * @brief Checks if a key exists in the registry. @@ -90,7 +92,7 @@ class Registry { * @param keyName The name of the key to check for existence. * @return true if the key exists, false otherwise. */ - bool keyExists(std::string keyName) const; + bool keyExists(const std::string &keyName) const; /** * @brief Checks if a value exists for a key in the registry. @@ -99,7 +101,8 @@ class Registry { * @param valueName The name of the value to check for existence. * @return true if the value exists, false otherwise. */ - bool valueExists(std::string keyName, std::string valueName) const; + bool valueExists(const std::string &keyName, + const std::string &valueName) const; /** * @brief Retrieves all value names for a given key from the registry. @@ -107,7 +110,7 @@ class Registry { * @param keyName The name of the key. * @return A vector of value names associated with the given key. */ - std::vector getValueNames(std::string keyName) const; + std::vector getValueNames(const std::string &keyName) const; private: class RegistryImpl; // Forward declaration of the implementation class diff --git a/src/atom/system/module/wifi.cpp b/src/atom/system/module/wifi.cpp index 5d1ec9fe..f91645eb 100644 --- a/src/atom/system/module/wifi.cpp +++ b/src/atom/system/module/wifi.cpp @@ -1,14 +1,32 @@ +/* + * wifi.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-21 + +Description: System Information Module - Wifi Information + +**************************************************/ + #include "wifi.hpp" #include #include #ifdef _WIN32 +#include #include #include #include #include +#include +#if !defined(__MINGW32__) && !defined(__MINGW64__) #pragma comment(lib, "wlanapi.lib") +#endif #elif defined(__linux__) #include #include @@ -220,4 +238,84 @@ bool isHotspotConnected() { return isConnected; } + +std::vector getHostIPs() { + std::vector hostIPs; + +#ifdef _WIN32 + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + LOG_F(ERROR, "Error: WSAStartup failed"); + return hostIPs; + } + + char hostname[256]; + if (gethostname(hostname, sizeof(hostname)) == SOCKET_ERROR) { + LOG_F(ERROR, "Error: gethostname failed"); + WSACleanup(); + return hostIPs; + } + + addrinfo hints, *res; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + if (getaddrinfo(hostname, NULL, &hints, &res) != 0) { + LOG_F(ERROR, "Error: getaddrinfo failed"); + WSACleanup(); + return hostIPs; + } + + for (addrinfo* p = res; p != NULL; p = p->ai_next) { + void* addr; + char ipstr[INET6_ADDRSTRLEN]; + if (p->ai_family == AF_INET) { + sockaddr_in* ipv4 = reinterpret_cast(p->ai_addr); + addr = &(ipv4->sin_addr); + } else { + sockaddr_in6* ipv6 = reinterpret_cast(p->ai_addr); + addr = &(ipv6->sin6_addr); + } + inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr)); + hostIPs.push_back(std::string(ipstr)); + } + + freeaddrinfo(res); + WSACleanup(); +#else + ifaddrs* ifaddr; + if (getifaddrs(&ifaddr) == -1) { + LOG_F(ERROR, "Error: getifaddrs failed"); + return hostIPs; + } + + for (ifaddrs* ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) + continue; + + if (ifa->ifa_addr->sa_family == AF_INET || + ifa->ifa_addr->sa_family == AF_INET6) { + char ipstr[INET6_ADDRSTRLEN]; + void* addr; + if (ifa->ifa_addr->sa_family == AF_INET) { + sockaddr_in* ipv4 = + reinterpret_cast(ifa->ifa_addr); + addr = &(ipv4->sin_addr); + } else { + sockaddr_in6* ipv6 = + reinterpret_cast(ifa->ifa_addr); + addr = &(ipv6->sin6_addr); + } + inet_ntop(ifa->ifa_addr->sa_family, addr, ipstr, sizeof(ipstr)); + hostIPs.push_back(std::string(ipstr)); + } + } + + freeifaddrs(ifaddr); +#endif + + return hostIPs; +} } diff --git a/src/atom/system/module/wifi.hpp b/src/atom/system/module/wifi.hpp index 9cc83761..df8e88e0 100644 --- a/src/atom/system/module/wifi.hpp +++ b/src/atom/system/module/wifi.hpp @@ -1,7 +1,22 @@ +/* + * wifi.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-2-21 + +Description: System Information Module - Wifi Information + +**************************************************/ + #ifndef ATOM_SYSTEM_MODULE_WIFI_HPP #define ATOM_SYSTEM_MODULE_WIFI_HPP #include +#include namespace Atom::System { /** @@ -21,6 +36,12 @@ namespace Atom::System { * @return True if hotspot is connected */ [[nodiscard]] bool isHotspotConnected(); + +/* + * @brief Get host IP addresses + * @return Vector of host IP addresses + */ +std::vector getHostIPs(); } // namespace Atom::System #endif \ No newline at end of file diff --git a/src/atom/system/pidwatcher.hpp b/src/atom/system/pidwatcher.hpp index df4d274c..ef3e31f1 100644 --- a/src/atom/system/pidwatcher.hpp +++ b/src/atom/system/pidwatcher.hpp @@ -24,59 +24,108 @@ Description: PID Watcher namespace Atom::System { +/** + * @brief A class for monitoring processes by their PID. + * + * This class allows monitoring of processes by their PID. It provides + * functionality to set callbacks on process exit, set a monitor function to + * run at intervals, get PID by process name, start monitoring a specific + * process, stop monitoring, and switch the target process. + */ class PidWatcher { public: using Callback = std::function; + /** + * @brief Constructs a PidWatcher object. + */ PidWatcher(); + /** + * @brief Destroys the PidWatcher object. + */ ~PidWatcher(); - // 设置进程退出后的回调函数 + /** + * @brief Sets the callback function to be executed on process exit. + * + * @param callback The callback function to set. + */ void SetExitCallback(Callback callback); - // 设置监视函数,每隔一段时间运行一次 + /** + * @brief Sets the monitor function to be executed at specified intervals. + * + * @param callback The monitor function to set. + * @param interval The interval at which the monitor function should run. + */ void SetMonitorFunction(Callback callback, std::chrono::milliseconds interval); - // 根据进程名称获取PID + /** + * @brief Retrieves the PID of a process by its name. + * + * @param name The name of the process. + * @return The PID of the process. + */ pid_t GetPidByName(const std::string &name) const; - // 开始监视指定进程 + /** + * @brief Starts monitoring the specified process by name. + * + * @param name The name of the process to monitor. + * @return True if monitoring started successfully, false otherwise. + */ bool Start(const std::string &name); - // 停止监视进程 + /** + * @brief Stops monitoring the currently monitored process. + */ void Stop(); - // 切换目标进程 + /** + * @brief Switches the target process to monitor. + * + * @param name The name of the process to switch to. + * @return True if the process was successfully switched, false otherwise. + */ bool Switch(const std::string &name); private: + /** + * @brief The thread function for monitoring the process. + */ void MonitorThread(); + /** + * @brief The thread function for handling process exit. + */ void ExitThread(); private: - pid_t pid_; - bool running_; - bool monitoring_; + pid_t pid_; ///< The PID of the currently monitored process. + bool running_; ///< Flag indicating if the monitoring is running. + bool monitoring_; ///< Flag indicating if a process is being monitored. - Callback exit_callback_; - Callback monitor_callback_; - std::chrono::milliseconds monitor_interval_; + Callback exit_callback_; ///< Callback function to execute on process exit. + Callback monitor_callback_; ///< Monitor function to execute at intervals. + std::chrono::milliseconds + monitor_interval_; ///< Interval for monitor function execution. #if __cplusplus >= 202002L - std::jthread monitor_thread_; - std::jthread exit_thread_; + std::jthread monitor_thread_; ///< Thread for monitoring the process. + std::jthread exit_thread_; ///< Thread for handling process exit. #else - std::thread monitor_thread_; - std::thread exit_thread_; + std::thread monitor_thread_; ///< Thread for monitoring the process. + std::thread exit_thread_; ///< Thread for handling process exit. #endif - std::mutex mutex_; - std::condition_variable monitor_cv_; - std::condition_variable exit_cv_; + std::mutex mutex_; ///< Mutex for thread synchronization. + std::condition_variable + monitor_cv_; ///< Condition variable for monitoring. + std::condition_variable exit_cv_; ///< Condition variable for process exit. }; + } // namespace Atom::System #endif \ No newline at end of file diff --git a/src/atom/type/_script.hpp b/src/atom/type/_script.hpp new file mode 100644 index 00000000..57ed64da --- /dev/null +++ b/src/atom/type/_script.hpp @@ -0,0 +1,72 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Carbon binding for Atom-Type + +**************************************************/ + +#ifndef ATOM_TYPE_SCRIPT_HPP +#define ATOM_TYPE_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "args.hpp" +#include "flatset.hpp" +#include "ini.hpp" +#include "small_vector.hpp" + +namespace Atom::_Script::Type { +/** + * Adds the String Methods to the given Carbon module. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + m->add(user_type(), "Args"); + m->add(Carbon::fun(&Args::set), "set"); + m->add(Carbon::fun(&Args::get), "get"); + m->add(Carbon::fun(&Args::get_or), "get_or"); + m->add(Carbon::fun(&Args::contains), "contains"); + m->add(Carbon::fun(&Args::get_optional), + "get_optional"); + m->add(Carbon::fun(&Args::remove), "remove"); + m->add(Carbon::fun(&Args::empty), "empty"); + m->add(Carbon::fun(&Args::size), "size"); + m->add(Carbon::fun(&Args::clear), "clear"); + m->add(Carbon::fun(&Args::data), "data"); + + Carbon::bootstrap::standard_library::vector_type< + SmallVector>("SmallVector", *m); + Carbon::bootstrap::standard_library::set_type>( + "FlatSet", *m); + Carbon::bootstrap::standard_library::set_type< + std::set>("Set", *m); + + m->add(user_type(), "INIFile"); + // m->add(Carbon::constructor(), "INIFile"); + m->add(Carbon::fun(&INIFile::load), "load"); + m->add(Carbon::fun(&INIFile::save), "save"); + m->add(Carbon::fun(&INIFile::set), "set_int"); + m->add(Carbon::fun(&INIFile::get), "get_int"); + m->add(Carbon::fun(&INIFile::set), "set_double"); + m->add(Carbon::fun(&INIFile::get), "get_double"); + m->add(Carbon::fun(&INIFile::set), "set_string"); + m->add(Carbon::fun(&INIFile::get), "get_string"); + m->add(Carbon::fun(&INIFile::set), "get_bool"); + m->add(Carbon::fun(&INIFile::get), "get_bool"); + m->add(Carbon::fun(&INIFile::has), "has"); + m->add(Carbon::fun(&INIFile::hasSection), "has_section"); + m->add(Carbon::fun(&INIFile::toJson), "to_json"); + m->add(Carbon::fun(&INIFile::toXml), "to_xml"); + + return m; +} +} // namespace Atom::_Script::Type + +#endif \ No newline at end of file diff --git a/src/atom/utils/_script.hpp b/src/atom/utils/_script.hpp new file mode 100644 index 00000000..6e0dd57a --- /dev/null +++ b/src/atom/utils/_script.hpp @@ -0,0 +1,124 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Carbon binding for Atom-Utils + +**************************************************/ + +#ifndef ATOM_TYPE_SCRIPT_HPP +#define ATOM_TYPE_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "aes.hpp" +#include "argsview.hpp" +#include "env.hpp" +#include "random.hpp" +#include "stopwatcher.hpp" +#include "string.hpp" +#include "time.hpp" + +using namespace Atom::Utils; + +namespace Atom::_Script::Utils { +/** + * Adds the String Methods to the given Carbon module. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + m->add(Carbon::fun(&encryptAES), "encrypt_aes"); + m->add(Carbon::fun(&decryptAES), "decrypt_aes"); + m->add(Carbon::fun(&compress), "compress"); + m->add(Carbon::fun(&decompress), "decompress"); + m->add(Carbon::fun(&calculateSha256), "calculate_sha256"); + + m->add(user_type(), "ArgsView"); + m->add(Carbon::fun (ArgsView::*)( + std::string_view) const>(&ArgsView::get), + "get_string"); + m->add(Carbon::fun(&ArgsView::get), "get_int"); + m->add(Carbon::fun(&ArgsView::get), "get_double"); + m->add(Carbon::fun(&ArgsView::get), "get_bool"); + m->add(Carbon::fun(&ArgsView::has), "has"); + m->add(Carbon::fun(&ArgsView::hasFlag), "has_flag"); + m->add(Carbon::fun(&ArgsView::addRule), "add_rule"); + m->add(Carbon::fun(&ArgsView::getFlags), "get_flags"); + + m->add(user_type(), "Env"); + m->add(Carbon::fun(&Env::setEnv), "set_env"); + m->add(Carbon::fun(&Env::getEnv), "get_env"); + m->add(Carbon::fun(&Env::add), "add"); + m->add(Carbon::fun(&Env::del), "del"); + m->add(Carbon::fun(&Env::get), "get"); + m->add(Carbon::fun(&Env::getAbsolutePath), "get_absolute_path"); + m->add(Carbon::fun(&Env::getAbsoluteWorkPath), "get_absolute_work_path"); + m->add(Carbon::fun(&Env::getConfigPath), "get_config_path"); + m->add(Carbon::fun(&Env::removeHelp), "remove_help"); + m->add(Carbon::fun(&Env::addHelp), "add_help"); + m->add(Carbon::fun(&Env::printHelp), "print_help"); + m->add(Carbon::fun(&Env::createShared), "create_shared"); + m->add(Carbon::fun(&Env::createUnique), "create_unique"); + + m->add(user_type(), "default_random_engine"); + m->add(user_type>(), + "uniform_int_distribution"); + m->add(user_type>(), "random"); + m->add(Carbon::fun( + static_cast< + typename random>:: + result_type (random>::*)( + const typename random< + std::default_random_engine, + std::uniform_int_distribution<>>::param_type &)>( + &random>::operator())), + "operator()"); + m->add(Carbon::fun(&generateRandomString), "generate_random_string"); + + m->add(user_type(), "StopWatcher"); + m->add(Carbon::fun(&StopWatcher::start), "start"); + m->add(Carbon::fun(&StopWatcher::pause), "pause"); + m->add(Carbon::fun(&StopWatcher::stop), "stop"); + m->add(Carbon::fun(&StopWatcher::resume), "resume"); + m->add(Carbon::fun(&StopWatcher::reset), "reset"); + m->add(Carbon::fun(&StopWatcher::elapsedMilliseconds), "elapsed_ms"); + m->add(Carbon::fun(&StopWatcher::elapsedSeconds), "elapsed_s"); + m->add(Carbon::fun(&StopWatcher::elapsedFormatted), "elapsed_formatted"); + m->add(Carbon::fun(&StopWatcher::registerCallback), "register_callback"); + + m->add(Carbon::fun(&hasUppercase), "has_uppercase"); + m->add(Carbon::fun(&toCamelCase), "to_camel_case"); + m->add(Carbon::fun(&toUnderscore), "to_underscore"); + + m->add(Carbon::fun(&urlEncode), "url_encode"); + m->add(Carbon::fun(&urlDecode), "url_decode"); + m->add(Carbon::fun(&replaceString), "replace_string"); + m->add(Carbon::fun(&replaceStrings), "replace_strings"); + m->add(Carbon::fun(&startsWith), "starts_with"); + m->add(Carbon::fun(&endsWith), "ends_with"); + m->add(Carbon::fun(&joinStrings), "join_strings"); + m->add(Carbon::fun(&splitString), "split_string"); + + m->add(user_type(), "tm"); + m->add(Carbon::fun(&timeStampToString), "time_stamp_to_string"); + m->add(Carbon::fun(&getTimestampString), "get_timestamp_string"); + m->add(Carbon::fun(&getChinaTimestampString), "get_china_timestamp_string"); + m->add(Carbon::fun(&getUtcTime), "get_utc_time"); + m->add(Carbon::fun(×tampToTime), "timestamp_to_time"); + m->add(Carbon::fun(&toString), "to_string"); + m->add(Carbon::fun(&convertToChinaTime), "convert_to_china_time"); + + return m; +} +} // namespace Atom::_Script::Utils + +#endif \ No newline at end of file diff --git a/src/carbon/command/bootstrap_stl.hpp b/src/carbon/command/bootstrap_stl.hpp index bdd6dbf7..21b3e383 100644 --- a/src/carbon/command/bootstrap_stl.hpp +++ b/src/carbon/command/bootstrap_stl.hpp @@ -9,13 +9,13 @@ #include #include +#include "atom/experiment/type_info.hpp" #include "bootstrap.hpp" #include "boxed_value.hpp" #include "dispatchkit.hpp" #include "operators.hpp" #include "proxy_constructors.hpp" #include "register_function.hpp" -#include "atom/experiment/type_info.hpp" namespace Carbon::bootstrap::standard_library { /// Bidir_Range, based on the D concept of ranges. @@ -79,6 +79,16 @@ void insert_ref(T &t_target, const typename T::value_type &t_val) { t_target.insert(t_val); } +template +void emplace(T &t_target, const typename T::value_type &t_val) { + t_target.emplace(t_val); +} + +template +void emplace_hint(T &t_target, const typename T::value_type &t_val) { + t_target.emplace_hint(t_target.end(), t_val); +} + /// Add Bidir_Range support for the given ContainerType template void input_range_type_impl(const std::string &type, Module &m) { @@ -125,6 +135,13 @@ void erase_at(Type &container, int pos) { } } // namespace detail +/** + * Add Bidir_Range support for the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention empty, pop_front, front, pop_back, back + */ template void input_range_type(const std::string &type, Module &m) { detail::input_range_type_impl< @@ -134,8 +151,13 @@ void input_range_type(const std::string &type, Module &m) { "Const_" + type, m); } -/// Add random_access_container concept to the given ContainerType -/// http://www.sgi.com/tech/stl/RandomAccessContainer.html +/** + * Add random_access_container concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention [index] operator + */ template void random_access_container_type(const std::string & /*type*/, Module &m) { // In the interest of runtime safety for the m, we prefer the at() method @@ -167,8 +189,13 @@ void assignable_type(const std::string &type, Module &m) { operators::assign(m); } -/// Add container resize concept to the given ContainerType -/// http://www.cplusplus.com/reference/stl/ +/** + * Add resizable concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention resize + */ template void resizable_type(const std::string & /*type*/, Module &m) { m.add(fun([](ContainerType *a, typename ContainerType::size_type n, @@ -182,8 +209,13 @@ void resizable_type(const std::string & /*type*/, Module &m) { "resize"); } -/// Add container reserve concept to the given ContainerType -/// http://www.cplusplus.com/reference/stl/ +/** + * Add reservable concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention reserve, capacity + */ template void reservable_type(const std::string & /*type*/, Module &m) { m.add(fun([](ContainerType *a, typename ContainerType::size_type n) { @@ -194,8 +226,13 @@ void reservable_type(const std::string & /*type*/, Module &m) { "capacity"); } -/// Add container concept to the given ContainerType -/// http://www.sgi.com/tech/stl/Container.html +/** + * Add container concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention size, empty, clear + */ template void container_type(const std::string & /*type*/, Module &m) { m.add(fun([](const ContainerType *a) { return a->size(); }), "size"); @@ -210,9 +247,23 @@ void default_constructible_type(const std::string &type, Module &m) { m.add(constructor(), type); } -/// Add sequence concept to the given ContainerType -/// http://www.sgi.com/tech/stl/Sequence.html -template +template +concept SequenceContainer = requires(T t) { + typename T::value_type; + { + t.insert(t.begin(), typename T::value_type{}) + } -> std::same_as; + { t.erase(t.begin()) } -> std::same_as; +}; + +/** + * Add sequence concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention insert_at, erase_at + */ +template void sequence_type(const std::string & /*type*/, Module &m) { m.add(fun(&detail::insert_at), []() -> std::string { if (typeid(typename ContainerType::value_type) == typeid(Boxed_Value)) { @@ -225,9 +276,35 @@ void sequence_type(const std::string & /*type*/, Module &m) { m.add(fun(&detail::erase_at), "erase_at"); } -/// Add back insertion sequence concept to the given ContainerType -/// http://www.sgi.com/tech/stl/BackInsertionSequence.html -template +template +concept SequenceContainerWithEmplace = requires(T t) { + typename T::value_type; + { + t.insert(t.begin(), typename T::value_type{}) + } -> std::same_as; + { t.erase(t.begin()) } -> std::same_as; + { + t.emplace(typename T::value_type{}) + } -> std::same_as>; + { + t.emplace_hint(t.begin(), typename T::value_type{}) + } -> std::same_as; +}; + +template +concept BackInsertionSequence = requires(T t) { + typename T::value_type; + { t.push_back(typename T::value_type{}) } -> std::same_as; + { t.pop_back() } -> std::same_as; +}; +/** + * Add back insertion sequence concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention back, push_back, pop_back + */ +template void back_insertion_sequence_type(const std::string &type, Module &m) { m.add(fun([](ContainerType &container) -> decltype(auto) { if (container.empty()) { @@ -276,9 +353,20 @@ void back_insertion_sequence_type(const std::string &type, Module &m) { m.add(fun(&ContainerType::pop_back), "pop_back"); } -/// Front insertion sequence -/// http://www.sgi.com/tech/stl/FrontInsertionSequence.html -template +template +concept FrontInsertionSequence = requires(T t) { + typename T::value_type; + { t.push_front(typename T::value_type{}) } -> std::same_as; + { t.pop_front() } -> std::same_as; +}; +/** + * Add front insertion sequence concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention front, push_front, pop_front + */ +template void front_insertion_sequence_type(const std::string &type, Module &m) { using push_ptr = void (ContainerType::*)(typename ContainerType::const_reference); @@ -329,9 +417,19 @@ void front_insertion_sequence_type(const std::string &type, Module &m) { m.add(fun(static_cast(&ContainerType::pop_front)), "pop_front"); } -/// bootstrap a given PairType -/// http://www.sgi.com/tech/stl/pair.html -template +template +concept Pair = requires() { + typename T::first_type; + typename T::second_type; +}; +/** + * Add pair type to the given ContainerType + * @tparam PairType The pair type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention first, second + */ +template void pair_type(const std::string &type, Module &m) { m.add(user_type(), type); @@ -352,9 +450,24 @@ void pair_associative_container_type(const std::string &type, Module &m) { pair_type(type + "_Pair", m); } -/// Add unique associative container concept to the given ContainerType -/// http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html -template +template +concept UniqueAssociativeContainer = requires(T t) { + typename T::key_type; + typename T::mapped_type; + { t.count(typename T::key_type{}) } -> std::same_as; + { t.erase(typename T::key_type{}) } -> std::same_as; + { + t.insert(typename T::value_type{}) + } -> std::same_as>; +}; +/** + * Add unique associative container concept to the given ContainerType + * @tparam ContainerType The container type to add support for + * @param m The module to add the type to + * @note This function is a no-op if the type has already been added + * @attention count, erase, insert, insert_ref + */ +template void unique_associative_container_type(const std::string & /*type*/, Module &m) { m.add(fun(detail::count), "count"); @@ -494,6 +607,35 @@ void vector_type(const std::string &type, Module &m) { } } +template +concept SetLike = requires(T t) { + std::is_default_constructible_v; + requires std::same_as())), + std::pair>; + requires std::is_convertible_v< + decltype(t.find(std::declval())), + typename T::const_iterator>; + requires std::is_convertible_v< + decltype(t.erase(std::declval())), + typename T::iterator>; + requires std::is_convertible_v; + requires std::is_convertible_v; +}; + +template +void set_type(const std::string &type, Module &m) { + m.add(user_type(), type); + + sequence_type(type, m); + random_access_container_type(type, m); + reservable_type(type, m); + container_type(type, m); + default_constructible_type(type, m); + assignable_type(type, m); + input_range_type(type, m); +} + /// Add a String container /// http://www.sgi.com/tech/stl/basic_string.html template diff --git a/src/carbon/stdlib.hpp b/src/carbon/stdlib.hpp index 40184c9e..5513d785 100644 --- a/src/carbon/stdlib.hpp +++ b/src/carbon/stdlib.hpp @@ -44,6 +44,8 @@ class Std_Lib { bootstrap::standard_library::string_type("string", *lib); bootstrap::standard_library::map_type< std::map>("Map", *lib); + bootstrap::standard_library::map_type< + std::unordered_map>("HashMap", *lib); bootstrap::standard_library::pair_type< std::pair>("Pair", *lib); diff --git a/src/script/carbon.cpp b/src/script/carbon.cpp index cc3b5310..eea887a0 100644 --- a/src/script/carbon.cpp +++ b/src/script/carbon.cpp @@ -4,134 +4,170 @@ #include "carbon/extra/math.hpp" #include "carbon/extra/string.hpp" +#include "atom/io/_script.hpp" +#include "atom/system/_script.hpp" +#include "atom/type/_script.hpp" + +#include "atom/async/pool.hpp" +#include "atom/experiment/noncopyable.hpp" #include "atom/log/loguru.hpp" -namespace Lithium -{ - // Pimpl implementation - class CarbonScriptImpl - { - public: - CarbonScriptImpl() - : m_carbon(std::make_unique()) { +namespace Lithium { +// Pimpl implementation +class CarbonScriptImpl : public NonCopyable { +public: + explicit CarbonScriptImpl(const fs::path &script_dir = "./script", + int cache_expiry_seconds = 60) + : m_carbon(std::make_unique()) { + if (!Atom::IO::isFolderExists(script_dir)) { + throw std::runtime_error("Script directory does not exist: " + + script_dir_.string()); } + cache_cleanup_thread_ = + std::thread(&CarbonScriptImpl::CacheCleanupLoop, this); + LOG_F(INFO, "CarbonScript initializing ..."); + InitMyApp(); + LOG_F(INFO, "CarbonScript initialized"); + } - void InitSubModules() - { - m_carbon->add(Carbon::extras::math::bootstrap()); - m_carbon->add(Carbon::extras::string_methods::bootstrap()); + void InitSubModules() { + m_carbon->add(Carbon::extras::math::bootstrap()); + m_carbon->add(Carbon::extras::string_methods::bootstrap()); - // Add additional sub-modules if needed - } + m_carbon->add(Atom::_Script::IO::bootstrap()); + m_carbon->add(Atom::_Script::System::bootstrap()); + m_carbon->add(Atom::_Script::Type::bootstrap()); + + // Add additional sub-modules if needed + } - void InitMyApp() - { - LOG_F(INFO, "CarbonScriptr initializing ..."); - InitSubModules(); - LOG_F(INFO, "CarbonScript initialized"); - //m_carbon->add_global(Carbon::var(MyApp), "app"); + void InitMyApp() { + LOG_F(INFO, "CarbonScriptr initializing ..."); + InitSubModules(); + LOG_F(INFO, "CarbonScript initialized"); + // m_carbon->add_global(Carbon::var(MyApp), "app"); + } + + bool LoadScriptFile(const std::string &filename) { + std::ifstream file(filename); + if (file) { + std::string script((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + file.close(); + m_carbon->eval(script); + } else { + LOG_F(ERROR, "Failed to open script file: {}", filename.c_str()); + return false; } + return true; + } - bool LoadScriptFile(const std::string &filename) - { - std::ifstream file(filename); - if (file) - { - std::string script((std::istreambuf_iterator(file)), - std::istreambuf_iterator()); - file.close(); - m_carbon->eval(script); - } - else - { - LOG_F(ERROR, "Failed to open script file: %s", filename.c_str()); - return false; - } - return true; + bool RunCommand(const std::string &command) { + try { + m_carbon->eval(command); + } catch (Carbon::exception::eval_error &e) { + LOG_F(ERROR, "Failed to eval {} : {}", e.filename.c_str(), + e.what()); + return false; + }; + return true; + } + + bool RunScript(const std::string &filename) { + try { + m_carbon->eval_file(filename); + } catch (Carbon::exception::eval_error &e) { + LOG_F(ERROR, "Failed to run {} : {}", e.filename.c_str(), e.what()); + return false; } + return true; + } - bool RunCommand(const std::string &command) - { - try - { + bool RunMultiCommand(const std::vector &commands) { + for (auto command : commands) { + try { m_carbon->eval(command); - } - catch (Carbon::exception::eval_error &e) - { - LOG_F(ERROR, "Failed to eval %s : %s", e.filename.c_str(), e.what()); + } catch (Carbon::exception::eval_error &e) { + LOG_F(ERROR, "Failed to run: {}", e.what()); return false; - }; - return true; + } } + return true; + } - bool RunScript(const std::string &filename) - { - try - { - m_carbon->eval_file(filename); - } - catch (Carbon::exception::eval_error &e) - { - LOG_F(ERROR, "Failed to run %s : %s", e.filename.c_str(), e.what()); - return false; - } - return true; + void cacheScript(const std::string &script_name) { + auto script_path = script_dir_ / (script_name + ".li"); + + if (!Atom::IO::isFileExists(script_path)) { + LOG_F(ERROR, "Script not found: {}", script_name); + return; + } + std::lock_guard lock(cache_mutex_); + auto it = script_cache_.find(script_path); + if (it == script_cache_.end()) { + std::ifstream script_file(script_path); + std::string script_content( + (std::istreambuf_iterator(script_file)), + std::istreambuf_iterator()); + m_carbon->eval(script_content); + script_cache_[script_path] = std::chrono::steady_clock::now(); + } else { + script_cache_[script_path] = std::chrono::steady_clock::now(); } + } - bool RunMultiCommand(const std::vector &commands) - { - for (auto command : commands) - { - try - { - m_carbon->eval(command); - } - catch (Carbon::exception::eval_error &e) - { - LOG_F(ERROR, "Failed to run: %s", e.what()); - return false; +private: + void CacheCleanupLoop() { + while (!stop_cleanup_thread_) { + std::this_thread::sleep_for( + std::chrono::seconds(cache_expiry_seconds_)); + std::lock_guard lock(cache_mutex_); + auto now = std::chrono::steady_clock::now(); + for (auto it = script_cache_.begin(); it != script_cache_.end();) { + if (now - it->second > + std::chrono::seconds(cache_expiry_seconds_)) { + it = script_cache_.erase(it); + } else { + ++it; } } - return true; } + } - private: - std::unique_ptr m_carbon; - }; +private: + std::unique_ptr m_carbon; - CarbonScript::CarbonScript() - : impl_(std::make_unique()) - { - } + fs::path script_dir_; + std::unordered_map + script_cache_; + std::mutex cache_mutex_; + std::thread cache_cleanup_thread_; + bool stop_cleanup_thread_ = false; + int cache_expiry_seconds_; +}; - std::shared_ptr CarbonScript::createShared() - { - return std::make_shared(); - } +CarbonScript::CarbonScript() : impl_(std::make_unique()) {} - void CarbonScript::Init() - { - impl_->InitMyApp(); - } +std::shared_ptr CarbonScript::createShared() { + return std::make_shared(); +} - bool CarbonScript::LoadScriptFile(const std::string &filename) - { - return impl_->LoadScriptFile(filename); - } +void CarbonScript::Init() { impl_->InitMyApp(); } - bool CarbonScript::RunCommand(const std::string &command) - { - return impl_->RunCommand(command); - } +bool CarbonScript::LoadScriptFile(const std::string &filename) { + return impl_->LoadScriptFile(filename); +} - bool CarbonScript::RunMultiCommand(const std::vector &commands) - { - return impl_->RunMultiCommand(commands); - } +bool CarbonScript::RunCommand(const std::string &command) { + return impl_->RunCommand(command); +} - bool CarbonScript::RunScript(const std::string &filename) - { - return impl_->RunScript(filename); - } +bool CarbonScript::RunMultiCommand(const std::vector &commands) { + return impl_->RunMultiCommand(commands); +} +bool CarbonScript::RunScript(const std::string &filename) { + return impl_->RunScript(filename); } + +} // namespace Lithium diff --git a/src/script/sheller.cpp b/src/script/sheller.cpp index 95df83fa..c9b997e2 100644 --- a/src/script/sheller.cpp +++ b/src/script/sheller.cpp @@ -204,37 +204,8 @@ void ScriptManager::LogError(const std::string &message) { logFile << "[" << buffer << "] " << message << std::endl; logFile.close(); } -} // namespace Lithium -/* -int main() -{ - ScriptManager manager; - - // 注册Shell脚本 - manager.RegisterScript("hello", "echo \"Hello, World!\""); - manager.RegisterScript("sum", "a=$1\nb=$2\nsum=$((a+b))\necho \"Sum: -$sum\""); - - // 注册PowerShell脚本 - manager.RegisterPowerShellScript("greet", R"( - $name = Read-Host -Prompt "Enter your name" - Write-Host "Hello, $name!" - )"); - - // 查看已注册的脚本 - manager.ViewScripts(); - - // 运行脚本 - manager.RunScript("hello"); - manager.RunScript("sum", {"3", "5"}); - manager.RunScript("greet"); - - // 查看脚本输出和状态 - manager.ViewScriptOutput("hello"); - manager.ViewScriptStatus("sum"); - - return 0; -} +#if ENABLE_PEGTL -*/ +#endif +} // namespace Lithium From 4867e688b7b203d59e717ae34139d4b03684e356 Mon Sep 17 00:00:00 2001 From: Max Qian Date: Wed, 24 Apr 2024 21:00:53 +0800 Subject: [PATCH 27/28] update not finished -- have runtime problem -- failed to load custom oatpp component -- unknown reason for crash -- unable to quit normally --- src/atom/error/_script.hpp | 131 ++++++++++++ src/atom/error/error_code.hpp | 2 +- src/atom/error/exception.hpp | 112 +++++++--- src/atom/type/_script.hpp | 12 +- src/atom/utils/_script.hpp | 52 ++++- src/carbon/extra/math.hpp | 8 +- src/carbon/extra/stdlib.hpp | 87 ++++++++ src/carbon/extra/string.hpp | 8 +- src/carbon/stdlib.hpp | 4 +- src/config/_script.cpp | 201 ------------------ src/config/_script.hpp | 190 +++++++++++++++++ src/script/carbon.cpp | 10 + .../controller/AsyncClientController.hpp | 2 +- src/server/websocket/Connection.hpp | 2 +- src/server/websocket/Registry.hpp | 2 +- 15 files changed, 566 insertions(+), 257 deletions(-) create mode 100644 src/atom/error/_script.hpp create mode 100644 src/carbon/extra/stdlib.hpp delete mode 100644 src/config/_script.cpp create mode 100644 src/config/_script.hpp diff --git a/src/atom/error/_script.hpp b/src/atom/error/_script.hpp new file mode 100644 index 00000000..87bd585f --- /dev/null +++ b/src/atom/error/_script.hpp @@ -0,0 +1,131 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-23 + +Description: Carbon binding for Atom-ERROR + +**************************************************/ + +#ifndef ATOM_ERROR_SCRIPT_HPP +#define ATOM_ERROR_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "error_code.hpp" +#include "error_stack.hpp" +#include "exception.hpp" + +using namespace Atom::Error; + +namespace Atom::_Script::Error { +/** + * Adds the String Methods to the given Carbon module. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + m->add( + Carbon::type_conversion([](const LIError &error) { + switch (error) { + case LIError::None: + return "None"; + case LIError::NotFound: + return "NotFound"; + case LIError::OpenError: + return "OpenError"; + case LIError::AccessDenied: + return "AccessDenied"; + case LIError::ReadError: + return "ReadError"; + case LIError::WriteError: + return "WriteError"; + case LIError::PermissionDenied: + return "PermissionDenied"; + case LIError::ParseError: + return "ParseError"; + case LIError::InvalidPath: + return "InvalidPath"; + case LIError::FileExists: + return "FileExists"; + case LIError::DirectoryNotEmpty: + return "DirectoryNotEmpty"; + case LIError::TooManyOpenFiles: + return "TooManyOpenFiles"; + case LIError::DiskFull: + return "DiskFull"; + case LIError::LoadError: + return "LoadError"; + case LIError::UnLoadError: + return "UnLoadError"; + } + })); + m->add(Carbon::type_conversion( + [](const std::string &str) { + if (str == "None") + return LIError::None; + else if (str == "NotFound") + return LIError::NotFound; + else if (str == "OpenError") + return LIError::OpenError; + else if (str == "AccessDenied") + return LIError::AccessDenied; + else if (str == "ReadError") + return LIError::ReadError; + else if (str == "WriteError") + return LIError::WriteError; + else if (str == "PermissionDenied") + return LIError::PermissionDenied; + else if (str == "ParseError") + return LIError::ParseError; + else if (str == "InvalidPath") + return LIError::InvalidPath; + else if (str == "FileExists") + return LIError::FileExists; + else if (str == "DirectoryNotEmpty") + return LIError::DirectoryNotEmpty; + else if (str == "TooManyOpenFiles") + return LIError::TooManyOpenFiles; + else if (str == "DiskFull") + return LIError::DiskFull; + else if (str == "LoadError") + return LIError::LoadError; + else if (str == "UnloadError") + return LIError::UnLoadError; + else + throw std::runtime_error("Invalid LIError string: " + str); + })); + + m->add(user_type(), "ErrorInfo"); + m->add(Carbon::fun(&ErrorInfo::errorMessage), "errorMessage"); + m->add(Carbon::fun(&ErrorInfo::moduleName), "moduleName"); + m->add(Carbon::fun(&ErrorInfo::functionName), "functionName"); + m->add(Carbon::fun(&ErrorInfo::line), "line"); + m->add(Carbon::fun(&ErrorInfo::fileName), "fileName"); + m->add(Carbon::fun(&ErrorInfo::timestamp), "timestamp"); + m->add(Carbon::fun(&ErrorInfo::uuid), "uuid"); + + m->add(user_type(), "ErrorStack"); + m->add(Carbon::fun(&ErrorStack::createShared), "create_error_stack"); + m->add(Carbon::fun(&ErrorStack::createUnique), "create_unique_error_stack"); + m->add(Carbon::fun(&ErrorStack::insertError), "insert_error"); + m->add(Carbon::fun(&ErrorStack::getFilteredErrorsByModule), + "get_filtered_errors_by_module"); + m->add(Carbon::fun(&ErrorStack::getCompressedErrors), + "get_compressed_errors"); + m->add(Carbon::fun(&ErrorStack::setFilteredModules), + "set_filtered_modules"); + m->add(Carbon::fun(&ErrorStack::clearFilteredModules), + "clear_filtered_modules"); + m->add(Carbon::fun(&ErrorStack::printFilteredErrorStack), + "print_filtered_error_stack"); + + return m; +} +} // namespace Atom::_Script::Error + +#endif \ No newline at end of file diff --git a/src/atom/error/error_code.hpp b/src/atom/error/error_code.hpp index 6b6100ac..8f8751a0 100644 --- a/src/atom/error/error_code.hpp +++ b/src/atom/error/error_code.hpp @@ -18,7 +18,7 @@ Description: All of the error code enum class LIError { None, // 无错误 NotFound, // 文件未找到 - OepnError, // 无法打开 + OpenError, // 无法打开 AccessDenied, // 访问被拒绝 ReadError, // 读取错误 WriteError, // 写入错误 diff --git a/src/atom/error/exception.hpp b/src/atom/error/exception.hpp index a1945e18..a6e35245 100644 --- a/src/atom/error/exception.hpp +++ b/src/atom/error/exception.hpp @@ -24,8 +24,18 @@ Description: Better Exception Library namespace Atom::Error { +/** + * @brief Custom exception class with detailed information about the error. + */ class Exception : public std::exception { public: + /** + * @brief Constructs an Exception object. + * @param file The file where the exception occurred. + * @param line The line number in the file where the exception occurred. + * @param func The function where the exception occurred. + * @param args Additional arguments to provide context for the exception. + */ template Exception(const char *file, int line, const char *func, Args &&...args) : file_(file), @@ -37,25 +47,63 @@ class Exception : public std::exception { message_ = oss.str(); } + /** + * @brief Returns a C-style string describing the exception. + * @return A pointer to a string describing the exception. + */ const char *what() const noexcept override; + /** + * @brief Gets the file where the exception occurred. + * @return The file where the exception occurred. + */ const std::string &getFile() const; + + /** + * @brief Gets the line number where the exception occurred. + * @return The line number where the exception occurred. + */ int getLine() const; + + /** + * @brief Gets the function where the exception occurred. + * @return The function where the exception occurred. + */ const std::string &getFunction() const; + + /** + * @brief Gets the message associated with the exception. + * @return The message associated with the exception. + */ const std::string &getMessage() const; + + /** + * @brief Gets the ID of the thread where the exception occurred. + * @return The ID of the thread where the exception occurred. + */ std::thread::id getThreadId() const; private: + /** + * @brief Gets the current time as a formatted string. + * @return The current time as a formatted string. + */ std::string getCurrentTime() const; + /** + * @brief Gets the stack trace when the exception occurred. + * @return The stack trace when the exception occurred. + */ std::string getStackTrace() const; - std::string file_; - int line_; - std::string func_; - std::string message_; - mutable std::string full_message_; - std::thread::id thread_id_; + std::string file_; /**< The file where the exception occurred. */ + int line_; /**< The line number in the file where the exception occurred. */ + std::string func_; /**< The function where the exception occurred. */ + std::string message_; /**< The message associated with the exception. */ + mutable std::string + full_message_; /**< The full message including additional context. */ + std::thread::id + thread_id_; /**< The ID of the thread where the exception occurred. */ }; #define THROW_EXCEPTION(...) \ @@ -64,136 +112,138 @@ class Exception : public std::exception { class ObjectAlreadyExist : public std::logic_error { public: explicit ObjectAlreadyExist(const std::string &msg) - : std::logic_error(msg){}; + : std::logic_error(msg) {}; }; class ObjectNotExist : public std::logic_error { public: - explicit ObjectNotExist(const std::string &msg) : std::logic_error(msg){}; + explicit ObjectNotExist(const std::string &msg) : std::logic_error(msg) {}; }; class ObjectUninitialized : public std::logic_error { public: explicit ObjectUninitialized(const std::string &msg) - : std::logic_error(msg){}; + : std::logic_error(msg) {}; }; class Uninitialization : public std::logic_error { public: - explicit Uninitialization(const std::string &msg) : std::logic_error(msg){}; + explicit Uninitialization(const std::string &msg) + : std::logic_error(msg) {}; }; class WrongArgument : public std::logic_error { public: - explicit WrongArgument(const std::string &msg) : std::logic_error(msg){}; + explicit WrongArgument(const std::string &msg) : std::logic_error(msg) {}; }; class InvalidArgument : public std::logic_error { public: - explicit InvalidArgument(const std::string &msg) : std::logic_error(msg){}; + explicit InvalidArgument(const std::string &msg) : std::logic_error(msg) {}; }; class MissingArgument : public std::logic_error { public: - explicit MissingArgument(const std::string &msg) : std::logic_error(msg){}; + explicit MissingArgument(const std::string &msg) : std::logic_error(msg) {}; }; class UnlawfulOperation : public std::logic_error { public: explicit UnlawfulOperation(const std::string &msg) - : std::logic_error(msg){}; + : std::logic_error(msg) {}; }; class Unkown : public std::logic_error { public: - explicit Unkown(const std::string &msg) : std::logic_error(msg){}; + explicit Unkown(const std::string &msg) : std::logic_error(msg) {}; }; class SystemCollapse : public std::runtime_error { public: - explicit SystemCollapse(const std::string &msg) : std::runtime_error(msg){}; + explicit SystemCollapse(const std::string &msg) + : std::runtime_error(msg) {}; }; class NullPointer : public std::logic_error { public: - explicit NullPointer(const std::string &msg) : std::logic_error(msg){}; + explicit NullPointer(const std::string &msg) : std::logic_error(msg) {}; }; class NotFound : public std::logic_error { public: - explicit NotFound(const std::string &msg) : std::logic_error(msg){}; + explicit NotFound(const std::string &msg) : std::logic_error(msg) {}; }; class FileNotFound : public std::logic_error { public: - explicit FileNotFound(const std::string &msg) : std::logic_error(msg){}; + explicit FileNotFound(const std::string &msg) : std::logic_error(msg) {}; }; class FileNotReadable : public std::logic_error { public: - explicit FileNotReadable(const std::string &msg) : std::logic_error(msg){}; + explicit FileNotReadable(const std::string &msg) : std::logic_error(msg) {}; }; class FileNotWritable : public std::logic_error { public: - explicit FileNotWritable(const std::string &msg) : std::logic_error(msg){}; + explicit FileNotWritable(const std::string &msg) : std::logic_error(msg) {}; }; class FileUnknown : public std::logic_error { public: - explicit FileUnknown(const std::string &msg) : std::logic_error(msg){}; + explicit FileUnknown(const std::string &msg) : std::logic_error(msg) {}; }; class Conflict : public std::logic_error { public: - explicit Conflict(const std::string &msg) : std::logic_error(msg){}; + explicit Conflict(const std::string &msg) : std::logic_error(msg) {}; }; class FailToLoadDll : public std::runtime_error { public: - explicit FailToLoadDll(const std::string &msg) : std::runtime_error(msg){}; + explicit FailToLoadDll(const std::string &msg) : std::runtime_error(msg) {}; }; class FailToUnloadDll : public std::runtime_error { public: explicit FailToUnloadDll(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToGetFunction : public std::runtime_error { public: explicit FailToGetFunction(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToCreateObject : public std::runtime_error { public: explicit FailToCreateObject(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToDestroyObject : public std::runtime_error { public: explicit FailToDestroyObject(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToCallFunction : public std::runtime_error { public: explicit FailToCallFunction(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToCallMemberFunction : public std::runtime_error { public: explicit FailToCallMemberFunction(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; class FailToCallStaticFunction : public std::runtime_error { public: explicit FailToCallStaticFunction(const std::string &msg) - : std::runtime_error(msg){}; + : std::runtime_error(msg) {}; }; } // namespace Atom::Error diff --git a/src/atom/type/_script.hpp b/src/atom/type/_script.hpp index 57ed64da..e9f01210 100644 --- a/src/atom/type/_script.hpp +++ b/src/atom/type/_script.hpp @@ -41,12 +41,12 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&Args::clear), "clear"); m->add(Carbon::fun(&Args::data), "data"); - Carbon::bootstrap::standard_library::vector_type< - SmallVector>("SmallVector", *m); - Carbon::bootstrap::standard_library::set_type>( - "FlatSet", *m); - Carbon::bootstrap::standard_library::set_type< - std::set>("Set", *m); + //Carbon::bootstrap::standard_library::vector_type< + // SmallVector>("SmallVector", *m); + //Carbon::bootstrap::standard_library::set_type>( + // "FlatSet", *m); + //Carbon::bootstrap::standard_library::set_type< + // std::set>("Set", *m); m->add(user_type(), "INIFile"); // m->add(Carbon::constructor(), "INIFile"); diff --git a/src/atom/utils/_script.hpp b/src/atom/utils/_script.hpp index 6e0dd57a..b47e36c4 100644 --- a/src/atom/utils/_script.hpp +++ b/src/atom/utils/_script.hpp @@ -24,6 +24,9 @@ Description: Carbon binding for Atom-Utils #include "stopwatcher.hpp" #include "string.hpp" #include "time.hpp" +#include "utf.hpp" +#include "uuid.hpp" +#include "xml.hpp" using namespace Atom::Utils; @@ -94,7 +97,7 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&StopWatcher::elapsedSeconds), "elapsed_s"); m->add(Carbon::fun(&StopWatcher::elapsedFormatted), "elapsed_formatted"); m->add(Carbon::fun(&StopWatcher::registerCallback), "register_callback"); - + m->add(Carbon::fun(&hasUppercase), "has_uppercase"); m->add(Carbon::fun(&toCamelCase), "to_camel_case"); m->add(Carbon::fun(&toUnderscore), "to_underscore"); @@ -109,6 +112,15 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&splitString), "split_string"); m->add(user_type(), "tm"); + m->add_global_const(Carbon::const_var(&std::tm::tm_sec), "tm_sec"); + m->add_global_const(Carbon::const_var(&std::tm::tm_min), "tm_min"); + m->add_global_const(Carbon::const_var(&std::tm::tm_hour), "tm_hour"); + m->add_global_const(Carbon::const_var(&std::tm::tm_mday), "tm_mday"); + m->add_global_const(Carbon::const_var(&std::tm::tm_mon), "tm_mon"); + m->add_global_const(Carbon::const_var(&std::tm::tm_year), "tm_year"); + m->add_global_const(Carbon::const_var(&std::tm::tm_wday), "tm_wday"); + m->add_global_const(Carbon::const_var(&std::tm::tm_yday), "tm_yday"); + m->add_global_const(Carbon::const_var(&std::tm::tm_isdst), "tm_isdst"); m->add(Carbon::fun(&timeStampToString), "time_stamp_to_string"); m->add(Carbon::fun(&getTimestampString), "get_timestamp_string"); m->add(Carbon::fun(&getChinaTimestampString), "get_china_timestamp_string"); @@ -117,6 +129,44 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&toString), "to_string"); m->add(Carbon::fun(&convertToChinaTime), "convert_to_china_time"); + m->add(Carbon::fun(&toUTF8), "to_utf8"); + m->add(Carbon::fun(&fromUTF8), "from_utf8"); + m->add(Carbon::fun(&UTF8toUTF16), "utf8_to_utf16"); + m->add(Carbon::fun(&UTF16toUTF8), "utf16_to_utf8"); + m->add(Carbon::fun(&UTF8toUTF32), "utf8_to_utf32"); + m->add(Carbon::fun(&UTF32toUTF8), "utf32_to_utf8"); + m->add(Carbon::fun(&UTF16toUTF32), "utf16_to_utf32"); + m->add(Carbon::fun(&UTF32toUTF16), "utf32_to_utf16"); + + m->add(user_type(), "UUIDGenerator"); + m->add(Carbon::fun(&UUIDGenerator::generateUUID), "generate_uuid"); + m->add(Carbon::fun(&UUIDGenerator::getRandomNumber), "get_random_number"); + m->add(Carbon::fun(&UUIDGenerator::seed), "seed"); + m->add(Carbon::fun(&generateSystemUUID), "generate_system_uuid"); + + m->add(user_type(), "XMLReader"); + m->add(Carbon::fun(&XMLReader::getChildElementText), + "get_child_element_text"); + m->add(Carbon::fun(&XMLReader::getChildElementAttributeValue), + "get_child_element_attribute_value"); + m->add(Carbon::fun(&XMLReader::getChildElementAttributeValueByPath), + "get_child_element_attribute_value_by_path"); + m->add(Carbon::fun(&XMLReader::getChildElementTextByPath), + "get_child_element_text_by_path"); + m->add(Carbon::fun(&XMLReader::getChildElementNames), + "get_child_element_names"); + m->add(Carbon::fun(&XMLReader::getRootElementNames), + "get_root_element_names"); + m->add(Carbon::fun(&XMLReader::getAttributeValue), "get_attribute_value"); + m->add(Carbon::fun(&XMLReader::getAttributeValueByPath), + "get_attribute_value_by_path"); + m->add(Carbon::fun(&XMLReader::getValueByPath), "get_value_by_path"); + m->add(Carbon::fun(&XMLReader::hasChildElement), "has_child_element"); + m->add(Carbon::fun(&XMLReader::hasChildElementByPath), + "has_child_element_by_path"); + m->add(Carbon::fun(&XMLReader::saveToFile), "save_to_file"); + m->add(Carbon::fun(&XMLReader::getElementText), "get_element_text"); + return m; } } // namespace Atom::_Script::Utils diff --git a/src/carbon/extra/math.hpp b/src/carbon/extra/math.hpp index e1b03a08..8287bb8e 100644 --- a/src/carbon/extra/math.hpp +++ b/src/carbon/extra/math.hpp @@ -6,9 +6,7 @@ #include "../carbon.hpp" -namespace Carbon { -namespace extras { -namespace math { +namespace Carbon::extras::math { // TRIG FUNCTIONS template ModulePtr cos(ModulePtr m = std::make_shared()) { @@ -798,8 +796,6 @@ ModulePtr bootstrap(ModulePtr m = std::make_shared()) { return m; } -} // namespace math -} // namespace extras -} // namespace Carbon +} // namespace Carbon::extras::math #endif /* CARBON_EXTRAS_MATH_HPP_ */ \ No newline at end of file diff --git a/src/carbon/extra/stdlib.hpp b/src/carbon/extra/stdlib.hpp new file mode 100644 index 00000000..a592605e --- /dev/null +++ b/src/carbon/extra/stdlib.hpp @@ -0,0 +1,87 @@ +#ifndef CARBON_EXTRAS_STDLIB_HPP +#define CARBON_EXTRAS_STDLIB_HPP + +#include "../carbon.hpp" + +#include +#include +#include + +namespace Carbon::extras::stdlib { +template +ModulePtr optional(ModulePtr m = std::make_shared(), + const std::string &type = "") { + utility::add_class>( + *m, std::string("Optional") + type, + {constructor()>() + + }, + { + {fun(&std::optional::has_value), "has_value"}, + //{fun(&std::optional::value), "value"}, + //{fun(&std::optional::value_or), "value_or"}, + {fun(&std::optional::swap), "swap"}, + {fun(&std::optional::reset), "reset"}, + //{fun(&std::optional::emplace), "emplace"}, + //{fun(&std::optional::operator=), "operator="}, +#if __cplusplus >= 202110L + {fun(&std::optional::and_then), "and_then"}, + {fun(&std::optional::or_else), "or_else"}, + {fun(&std::optional::transform), "transform"}, +#endif + //{fun(&std::make_optional), std::string("make_Optional") + type} + }); + return m; +} + +ModulePtr timezone(ModulePtr m = std::make_shared()) { + utility::add_class( + *m, "Tzdb", {}, + {{fun(&std::chrono::tzdb::version), "version"}, + {fun(&std::chrono::tzdb::current_zone), "current_zone"}, + {fun(&std::chrono::tzdb::locate_zone), "locate_zone"}, + {fun(&std::chrono::tzdb::zones), "zones"}, + {fun(&std::chrono::tzdb::links), "links"}, + {fun(&std::chrono::tzdb::leap_seconds), "leap_seconds"}}); + + utility::add_class(*m, "TimezoneList", {}, {}); + + utility::add_class( + *m, "SysInfo", + { + + }, + {{fun(&std::chrono::sys_info::abbrev), "abbrev"}, + {fun(&std::chrono::sys_info::offset), "offset"}, + {fun(&std::chrono::sys_info::save), "save"}}); + + utility::add_class( + *m, "Timezone", {}, + { + //{fun&) + //const>(&std::chrono::time_zone::get_info), "get_info"} + }); + m->add(fun(&std::chrono::get_tzdb), "get_tzdb"); + m->add(fun(&std::chrono::get_tzdb_list), "get_tzdb_list"); + m->add(fun(&std::chrono::reload_tzdb), "reload_tzdb"); + m->add(fun(&std::chrono::remote_version), "remote_version"); + m->add(fun(&std::chrono::locate_zone), "locate_zone"); + m->add(fun(&std::chrono::current_zone), "current_zone"); + + return m; +} +/** + * Adds the String Methods to the given Carbon module. + */ +ModulePtr bootstrap(ModulePtr m = std::make_shared()) { + optional(m, "Int"); + optional(m, "Double"); + optional(m, "String"); + optional(m, "Bool"); + timezone(m); + return m; +} +} // namespace Carbon::extras::stdlib + +#endif /* CARBON_EXTRAS_STDLIB_HPP */ \ No newline at end of file diff --git a/src/carbon/extra/string.hpp b/src/carbon/extra/string.hpp index fca4f7e4..a44dcf13 100644 --- a/src/carbon/extra/string.hpp +++ b/src/carbon/extra/string.hpp @@ -6,9 +6,7 @@ #include #include "../carbon.hpp" -namespace Carbon { -namespace extras { -namespace string_methods { +namespace Carbon::extras::string_methods { /** * Replaces all occurances of a string within the given string. @@ -158,8 +156,6 @@ ModulePtr bootstrap(ModulePtr m = std::make_shared()) { return m; } -} // namespace string_methods -} // namespace extras -} // namespace Carbon +} // namespace Carbon::extras::string_methods #endif /* CARBON_EXTRAS_STRING_METHODS_HPP_ */ \ No newline at end of file diff --git a/src/carbon/stdlib.hpp b/src/carbon/stdlib.hpp index 5513d785..124e300a 100644 --- a/src/carbon/stdlib.hpp +++ b/src/carbon/stdlib.hpp @@ -44,8 +44,8 @@ class Std_Lib { bootstrap::standard_library::string_type("string", *lib); bootstrap::standard_library::map_type< std::map>("Map", *lib); - bootstrap::standard_library::map_type< - std::unordered_map>("HashMap", *lib); + //bootstrap::standard_library::map_type< + // std::unordered_map>("HashMap", *lib); bootstrap::standard_library::pair_type< std::pair>("Pair", *lib); diff --git a/src/config/_script.cpp b/src/config/_script.cpp deleted file mode 100644 index 53e0e615..00000000 --- a/src/config/_script.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - * _script.cpp - * - * Copyright (C) 2023-2024 Max Qian - */ - -/************************************************* - -Date: 2024-4-13 - -Description: Carbon Binding of ConfigManager - -**************************************************/ - -#include "carbon/carbon.hpp" - -#include "configor.hpp" - -#include "atom/log/loguru.hpp" - -using namespace Lithium; - -CARBON_MODULE_EXPORT { - Carbon::ModulePtr exportModule([[maybe_unused]] const std::any &m_params) { - if (m_params.type() != typeid(std::weak_ptr)) { - LOG_F(ERROR, - "Invalid parameters recieved while loading ConfigModule"); - return nullptr; - } - try { - auto m_configManager = - std::any_cast>(m_params); - if (m_configManager.expired()) { - LOG_F(ERROR, "config manager pointer is expired!"); - return nullptr; - } - Carbon::ModulePtr m_module = std::make_shared(); - - auto get_config_func = [](std::weak_ptr manager, - const std::string &sv) -> json { - if (!sv.empty() && !manager.expired()) { - LOG_F(ERROR, "no key path found"); - return {}; - } - if (auto value = manager.lock()->getValue(sv); - value.has_value()) { - return value.value(); - } - return {}; - }; - - m_module->add(Carbon::fun([m_configManager, get_config_func]( - const std::string &key) -> double { - if (!key.empty()) { - try { - return get_config_func(m_configManager, - key) - .get(); - } catch (const json::exception &e) { - } - } - return -1; - }), - "get_number_config"); - - m_module->add( - Carbon::fun([m_configManager, get_config_func]( - const std::string &key) -> std::string { - if (!key.empty()) { - try { - return get_config_func(m_configManager, key) - .get(); - } catch (const json::exception &e) { - } - } - return ""; - }), - "get_string_config"); - - m_module->add( - Carbon::fun([m_configManager, - get_config_func](const std::string &key) -> bool { - if (!key.empty()) { - try { - return get_config_func(m_configManager, key) - .get(); - } catch (const json::exception &e) { - } - } - return false; - }), - "get_boolean_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &key, - double number) { - if (!key.empty() && !m_configManager.expired()) [[likely]] { - if (m_configManager.lock()->setValue(key, number)) { - return true; - } - } - return false; - }), - "set_number_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &key, - const std::string &text) { - if (!key.empty() && !m_configManager.expired()) [[likely]] { - if (m_configManager.lock()->setValue(key, text)) { - return true; - } - } - return false; - }), - "set_string_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &key, - bool value) { - if (!key.empty() && !m_configManager.expired()) [[likely]] { - if (m_configManager.lock()->setValue(key, value)) { - return true; - } - } - return false; - }), - "set_bool_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &key) { - if (!key.empty() && !m_configManager.expired()) [[likely]] { - if (m_configManager.lock()->hasValue(key)) { - return true; - } - } - return false; - }), - "has_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &key) { - if (!key.empty() && !m_configManager.expired()) [[likely]] { - if (m_configManager.lock()->deleteValue(key)) { - return true; - } - } - return false; - }), - "delete_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &file_path) { - if (!file_path.empty() && !m_configManager.expired()) - [[likely]] { - if (m_configManager.lock()->loadFromFile(file_path)) { - return true; - } - } - return false; - }), - "load_config"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &folder_path) { - if (!folder_path.empty() && !m_configManager.expired()) - [[likely]] { - if (m_configManager.lock()->loadFromDir(folder_path)) { - return true; - } - } - return false; - }), - "load_configs"); - - m_module->add( - Carbon::fun([m_configManager](const std::string &file_path) { - if (!file_path.empty() && !m_configManager.expired()) - [[likely]] { - if (m_configManager.lock()->saveToFile(file_path)) { - return true; - } - } - return false; - }), - "save_config"); - - m_module->add(Carbon::fun([m_configManager]() { - if (!m_configManager.expired()) [[likely]] { - m_configManager.lock()->tidyConfig(); - } - }), - "tidy_config"); - - return m_module; - } catch (const std::bad_any_cast &e) { - LOG_F(ERROR, "Failed to load config manager"); - return nullptr; - } - } -} diff --git a/src/config/_script.hpp b/src/config/_script.hpp new file mode 100644 index 00000000..788c4fd8 --- /dev/null +++ b/src/config/_script.hpp @@ -0,0 +1,190 @@ +/* + * _script.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-13 + +Description: Carbon Binding of ConfigManager + +**************************************************/ + +#ifndef LITHIUM_CONFIG_SCRIPT_HPP +#define LITHIUM_CONFIG_SCRIPT_HPP + +#include "carbon/carbon.hpp" + +#include "configor.hpp" + +#include "atom/log/loguru.hpp" +#include "atom/server/global_ptr.hpp" + +namespace Lithium::_Script::Config { +/** + * Adds the String Methods to the given Carbon m. + */ +Carbon::ModulePtr bootstrap( + Carbon::ModulePtr m = std::make_shared()) { + try { + auto m_configManager = GetWeakPtr("lithium.config"); + if (m_configManager.expired()) { + LOG_F(ERROR, "config manager pointer is expired!"); + return nullptr; + } + + auto get_config_func = [](std::weak_ptr manager, + const std::string &sv) -> json { + if (!sv.empty() && !manager.expired()) { + LOG_F(ERROR, "no key path found"); + return {}; + } + if (auto value = manager.lock()->getValue(sv); value.has_value()) { + return value.value(); + } + return {}; + }; + + m->add(Carbon::fun([m_configManager, + get_config_func](const std::string &key) -> double { + if (!key.empty()) { + try { + return get_config_func(m_configManager, key) + .get(); + } catch (const json::exception &e) { + } + } + return -1; + }), + "get_number_config"); + + m->add(Carbon::fun([m_configManager, get_config_func]( + const std::string &key) -> std::string { + if (!key.empty()) { + try { + return get_config_func(m_configManager, key) + .get(); + } catch (const json::exception &e) { + } + } + return ""; + }), + "get_string_config"); + + m->add(Carbon::fun([m_configManager, + get_config_func](const std::string &key) -> bool { + if (!key.empty()) { + try { + return get_config_func(m_configManager, key) + .get(); + } catch (const json::exception &e) { + } + } + return false; + }), + "get_boolean_config"); + + m->add(Carbon::fun([m_configManager](const std::string &key, + double number) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, number)) { + return true; + } + } + return false; + }), + "set_number_config"); + + m->add(Carbon::fun([m_configManager](const std::string &key, + const std::string &text) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, text)) { + return true; + } + } + return false; + }), + "set_string_config"); + + m->add( + Carbon::fun([m_configManager](const std::string &key, bool value) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->setValue(key, value)) { + return true; + } + } + return false; + }), + "set_bool_config"); + + m->add(Carbon::fun([m_configManager](const std::string &key) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->hasValue(key)) { + return true; + } + } + return false; + }), + "has_config"); + + m->add(Carbon::fun([m_configManager](const std::string &key) { + if (!key.empty() && !m_configManager.expired()) [[likely]] { + if (m_configManager.lock()->deleteValue(key)) { + return true; + } + } + return false; + }), + "delete_config"); + + m->add(Carbon::fun([m_configManager](const std::string &file_path) { + if (!file_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->loadFromFile(file_path)) { + return true; + } + } + return false; + }), + "load_config"); + + m->add(Carbon::fun([m_configManager](const std::string &folder_path) { + if (!folder_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->loadFromDir(folder_path)) { + return true; + } + } + return false; + }), + "load_configs"); + + m->add(Carbon::fun([m_configManager](const std::string &file_path) { + if (!file_path.empty() && !m_configManager.expired()) + [[likely]] { + if (m_configManager.lock()->saveToFile(file_path)) { + return true; + } + } + return false; + }), + "save_config"); + + m->add(Carbon::fun([m_configManager]() { + if (!m_configManager.expired()) [[likely]] { + m_configManager.lock()->tidyConfig(); + } + }), + "tidy_config"); + + return m; + } catch (const std::bad_any_cast &e) { + LOG_F(ERROR, "Failed to load config manager"); + return nullptr; + } +} +} // namespace Lithium::_Script::Config + +#endif diff --git a/src/script/carbon.cpp b/src/script/carbon.cpp index eea887a0..1a3f1bc7 100644 --- a/src/script/carbon.cpp +++ b/src/script/carbon.cpp @@ -2,12 +2,17 @@ #include "carbon/carbon.hpp" #include "carbon/extra/math.hpp" +#include "carbon/extra/stdlib.hpp" #include "carbon/extra/string.hpp" +#include "atom/algorithm/_script.hpp" +#include "atom/error/_script.hpp" #include "atom/io/_script.hpp" #include "atom/system/_script.hpp" #include "atom/type/_script.hpp" +#include "config/_script.hpp" + #include "atom/async/pool.hpp" #include "atom/experiment/noncopyable.hpp" #include "atom/log/loguru.hpp" @@ -33,11 +38,16 @@ class CarbonScriptImpl : public NonCopyable { void InitSubModules() { m_carbon->add(Carbon::extras::math::bootstrap()); m_carbon->add(Carbon::extras::string_methods::bootstrap()); + m_carbon->add(Carbon::extras::stdlib::bootstrap()); + m_carbon->add(Atom::_Script::Algorithm::bootstrap()); + m_carbon->add(Atom::_Script::Error::bootstrap()); m_carbon->add(Atom::_Script::IO::bootstrap()); m_carbon->add(Atom::_Script::System::bootstrap()); m_carbon->add(Atom::_Script::Type::bootstrap()); + m_carbon->add(Lithium::_Script::Config::bootstrap()); + // Add additional sub-modules if needed } diff --git a/src/server/controller/AsyncClientController.hpp b/src/server/controller/AsyncClientController.hpp index 81668c25..831277b3 100644 --- a/src/server/controller/AsyncClientController.hpp +++ b/src/server/controller/AsyncClientController.hpp @@ -33,7 +33,7 @@ class ClientController : public oatpp::web::server::api::ApiController { private: OATPP_COMPONENT(std::shared_ptr, - websocketConnectionHandler, Constants::COMPONENT_WS_API); + websocketConnectionHandler, Constants::COMPONENT_REST_API); public: ClientController(OATPP_COMPONENT(std::shared_ptr, diff --git a/src/server/websocket/Connection.hpp b/src/server/websocket/Connection.hpp index 421c5714..5a6da9c6 100644 --- a/src/server/websocket/Connection.hpp +++ b/src/server/websocket/Connection.hpp @@ -69,7 +69,7 @@ class Connection : public oatpp::websocket::AsyncWebSocket::Listener { /* Inject application components */ OATPP_COMPONENT(std::shared_ptr, m_asyncExecutor); OATPP_COMPONENT(std::shared_ptr, - m_objectMapper, Constants::COMPONENT_WS_API); + m_objectMapper, Constants::COMPONENT_REST_API); private: CoroutineStarter handlePong(const oatpp::Object& message); diff --git a/src/server/websocket/Registry.hpp b/src/server/websocket/Registry.hpp index 589295a8..a86dbc0a 100644 --- a/src/server/websocket/Registry.hpp +++ b/src/server/websocket/Registry.hpp @@ -41,7 +41,7 @@ class Registry OATPP_COMPONENT(std::shared_ptr, m_hubConfig); OATPP_COMPONENT(std::shared_ptr, m_asyncExecutor); OATPP_COMPONENT(std::shared_ptr, - m_objectMapper, Constants::COMPONENT_WS_API); + m_objectMapper, Constants::COMPONENT_REST_API); private: oatpp::String getRequiredParameter( From 3a5846c070b0c00325a3f70001cc60ec05b4a3ce Mon Sep 17 00:00:00 2001 From: Max Qian Date: Sat, 27 Apr 2024 12:59:22 +0800 Subject: [PATCH 28/28] update not finished! this is a very important update for atom-component we must think clear about the structure and how to call functions properly --- meson.build | 37 +-- src/App.cpp | 41 +-- src/atom/algorithm/_component.hpp | 0 src/atom/algorithm/_pybind.cpp | 120 ++----- src/atom/algorithm/_script.hpp | 33 +- src/atom/algorithm/fraction.cpp | 4 - src/atom/algorithm/fraction.hpp | 6 - src/atom/algorithm/math.cpp | 157 +++++---- src/atom/algorithm/math.hpp | 89 ++++- src/atom/algorithm/mhash.cpp | 254 ++++++--------- src/atom/algorithm/mhash.hpp | 63 +--- src/atom/components/component.cpp | 257 +++------------ src/atom/components/component.hpp | 305 ++++++++++-------- src/atom/components/component.inl | 18 ++ src/atom/components/component_impl.hpp | 6 - src/atom/components/configor.cpp | 209 ++++++++++++ src/atom/components/configor.hpp | 199 ++++++++++++ src/atom/components/dispatch.cpp | 59 ++++ src/atom/components/dispatch.hpp | 130 ++++++++ src/atom/components/dispatch.inl | 175 ++++++++++ src/atom/components/proxy.hpp | 112 +++++++ src/atom/components/templates/shared.cpp | 91 ++++++ src/atom/components/templates/shared.hpp | 24 ++ .../components/templates/shared_component.cpp | 186 ----------- .../components/templates/shared_component.hpp | 64 ---- src/atom/components/var.hpp | 114 +++++++ src/atom/components/var.inl | 73 +++++ src/atom/experiment/iter.hpp | 286 ++++++++++++++++ src/atom/type/no_offset_ptr.hpp | 148 +++++++++ src/atom/type/pointer.hpp | 37 ++- src/atom/type/small_list.hpp | 252 +++++++++++++++ src/atom/type/trackable.hpp | 142 ++++++++ src/atom/utils/cstring.hpp | 167 ++++++++++ src/config/configor.cpp | 2 - src/config/configor.hpp | 2 - 35 files changed, 2793 insertions(+), 1069 deletions(-) delete mode 100644 src/atom/algorithm/_component.hpp create mode 100644 src/atom/components/component.inl delete mode 100644 src/atom/components/component_impl.hpp create mode 100644 src/atom/components/configor.cpp create mode 100644 src/atom/components/configor.hpp create mode 100644 src/atom/components/dispatch.cpp create mode 100644 src/atom/components/dispatch.hpp create mode 100644 src/atom/components/dispatch.inl create mode 100644 src/atom/components/proxy.hpp create mode 100644 src/atom/components/templates/shared.cpp create mode 100644 src/atom/components/templates/shared.hpp delete mode 100644 src/atom/components/templates/shared_component.cpp delete mode 100644 src/atom/components/templates/shared_component.hpp create mode 100644 src/atom/components/var.hpp create mode 100644 src/atom/components/var.inl create mode 100644 src/atom/experiment/iter.hpp create mode 100644 src/atom/type/no_offset_ptr.hpp create mode 100644 src/atom/type/small_list.hpp create mode 100644 src/atom/type/trackable.hpp create mode 100644 src/atom/utils/cstring.hpp diff --git a/meson.build b/meson.build index d877d0c1..d7e5043a 100644 --- a/meson.build +++ b/meson.build @@ -57,6 +57,13 @@ lithium_server_library_src = files([ join_paths(lithium_src_dir, 'LithiumApp.cpp'), ]) +lithium_server_library = static_library( + 'lithium_server-library', + lithium_server_library_src, + dependencies: lithium_deps, + include_directories: include_directories('.', 'libs', 'libs/oatpp', 'libs/oatpp-swagger', 'libs/oatpp-websocket'), +) + lithium_server = executable( 'lithium_server', lithium_server_src, @@ -66,38 +73,8 @@ lithium_server = executable( link_args: cpp.get_supported_link_arguments(), ) -lithium_server_library = static_library( - 'lithium_server-library', - lithium_server_library_src, - dependencies: lithium_deps, - include_directories: include_directories('.', 'libs', 'libs/oatpp', 'libs/oatpp-swagger', 'libs/oatpp-websocket'), -) - configure_file( input: 'config.h.in', output: 'config.h', ) -# Additional targets -cmake_additional_files = custom_target( - 'CmakeAdditionalFiles', - input: join_paths(lithium_src_dir, '../cmake_modules/compiler_options.cmake'), -) - -# clang-format -if cpp.get_id() == 'clang' - format_code = get_option('FORMAT_CODE') - if format_code.get_value() - all_source_files = [] - all_source_files += files(lithium_src_dir, recursive: true, exclude_files: ['*.h']) - clangformat_exe = find_program('clang-format-5.0') - if clangformat_exe.found() - run_target( - 'clang-format', - command: [clangformat_exe, '-style=file', '-i'] + all_source_files, - input: all_source_files, - capture: true, - ) - endif - endif -endif diff --git a/src/App.cpp b/src/App.cpp index f83df684..3125a486 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) { .default_value("config.json"); program.add_argument("-M", "--module-path") .help("path to the modules directory") - .default_value("modules"); + .default_value("./modules"); program.add_argument("-W", "--web-panel") .help("web panel") .default_value(true); @@ -119,21 +119,10 @@ int main(int argc, char *argv[]) { Lithium::InitLithiumApp(argc, argv); // Create shared instance Lithium::MyApp = Lithium::LithiumApp::createShared(); - - auto cmd_port = program.get("--port"); - if (cmd_port != 8000) { - DLOG_F(INFO, "Command line server port : {}", cmd_port); - - auto port = - Lithium::MyApp->GetConfig("config/server").value("port", 8000); - if (port != cmd_port) { - Lithium::MyApp->SetConfig( - {{"key", "config/server/port"}, {"value", cmd_port}}); - DLOG_F(INFO, "Set server port to {}", cmd_port); - } - } + // Parse arguments try { auto cmd_host = program.get("--host"); + auto cmd_port = program.get("--port"); auto cmd_config_path = program.get("--config"); auto cmd_module_path = program.get("--module-path"); auto cmd_web_panel = program.get("--web-panel"); @@ -144,6 +133,17 @@ int main(int argc, char *argv[]) { {{"key", "config/server/host"}, {"value", cmd_host}}); DLOG_F(INFO, "Set server host to {}", cmd_host); } + if (cmd_port != 8000) { + DLOG_F(INFO, "Command line server port : {}", cmd_port); + + auto port = Lithium::MyApp->GetConfig("config/server") + .value("port", 8000); + if (port != cmd_port) { + Lithium::MyApp->SetConfig( + {{"key", "config/server/port"}, {"value", cmd_port}}); + DLOG_F(INFO, "Set server port to {}", cmd_port); + } + } if (!cmd_config_path.empty()) { Lithium::MyApp->SetConfig({{"key", "config/server/configpath"}, {"value", cmd_config_path}}); @@ -167,9 +167,6 @@ int main(int argc, char *argv[]) { if (!Lithium::MyApp->GetConfig("config/server/debug").get()) { Lithium::MyApp->SetConfig( {{"key", "config/server/debug"}, {"value", true}}); - - ConsoleTerminal terminal; - terminal.run(); } } else { Lithium::MyApp->SetConfig( @@ -178,9 +175,17 @@ int main(int argc, char *argv[]) { } } catch (const std::bad_any_cast &e) { LOG_F(ERROR, "Invalid args format! Error: {}", e.what()); + Atom::System::saveCrashLog(e.what()); + return 1; } - runServer(); + // In debug mode run the terminal first and will not run the server + if (Lithium::MyApp->GetConfig("config/server/debug").get()) { + ConsoleTerminal terminal; + terminal.run(); + } else { + runServer(); + } return 0; } \ No newline at end of file diff --git a/src/atom/algorithm/_component.hpp b/src/atom/algorithm/_component.hpp deleted file mode 100644 index e69de29b..00000000 diff --git a/src/atom/algorithm/_pybind.cpp b/src/atom/algorithm/_pybind.cpp index ed18085e..8e6ef5f7 100644 --- a/src/atom/algorithm/_pybind.cpp +++ b/src/atom/algorithm/_pybind.cpp @@ -24,10 +24,12 @@ Description: Python Binding of Atom-Algorithm #include "huffman.hpp" #include "math.hpp" #include "md5.hpp" +#include "mhash.hpp" namespace py = pybind11; using namespace Atom::Algorithm; +using namespace Atom::Utils; PYBIND11_MODULE(atom_algorithm, m) { m.doc() = "Atom Algorithm Python Binding"; @@ -63,99 +65,21 @@ PYBIND11_MODULE(atom_algorithm, m) { "Perform two-dimensional deconvolution"); py::class_(m, "Fraction") - .def(py::init(), py::arg("numerator") = 0, - py::arg("denominator") = 1) - .def("__add__", &Fraction::operator+, py::arg("other")) - //.def("__sub__", &Fraction::operator-, py::arg("other")) - .def("__mul__", &Fraction::operator*, py::arg("other")) - .def("__truediv__", &Fraction::operator/, py::arg("other")) - .def(py::self += py::self) - .def(py::self -= py::self) - .def(py::self *= py::self) - .def(py::self /= py::self) - .def("__eq__", &Fraction::operator==) - //.def("__lt__", &Fraction::operator<) - //.def("__neg__", &Fraction::operator-) + .def(py::init()) + .def_readwrite("numerator", &Fraction::numerator) + .def_readwrite("denominator", &Fraction::denominator) + .def("__add__", &Fraction::operator+, py::is_operator()) + .def("__sub__", &Fraction::operator-, py::is_operator()) + .def("__mul__", &Fraction::operator*, py::is_operator()) + .def("__truediv__", &Fraction::operator/, py::is_operator()) + .def("__eq__", &Fraction::operator==, py::is_operator()) + .def("__neg__", &Fraction::operator-) .def("__str__", &Fraction::to_string) .def("__float__", &Fraction::to_double) .def("__int__", &Fraction::operator int) - .def("__float__", &Fraction::operator float) - .def("__double__", &Fraction::operator double) - .def("__repr__", &Fraction::to_string) - .def("__abs__", - [](const Fraction& f) { - return Fraction(std::abs(f.numerator), - std::abs(f.denominator)); - }) - .def( - "__iadd__", - [](Fraction& self, const Fraction& other) { - self += other; - return self; - }, - py::arg("other")) - .def( - "__isub__", - [](Fraction& self, const Fraction& other) { - self -= other; - return self; - }, - py::arg("other")) - .def( - "__imul__", - [](Fraction& self, const Fraction& other) { - self *= other; - return self; - }, - py::arg("other")) - .def( - "__idiv__", - [](Fraction& self, const Fraction& other) { - self /= other; - return self; - }, - py::arg("other")) - .def("__pos__", - [](const Fraction& f) { - return Fraction(f.numerator, f.denominator); - }) - .def("__abs__", - [](const Fraction& f) { - return Fraction(std::abs(f.numerator), - std::abs(f.denominator)); - }) - .def("__pos__", - [](const Fraction& f) { - return Fraction(f.numerator, f.denominator); - }) - .def("__neg__", - [](const Fraction& f) { - return Fraction(-f.numerator, f.denominator); - }) - .def("__hash__", - [](const Fraction& f) { - return std::hash()(f.to_double()); - }) - .def( - "__pow__", - [](const Fraction& f, int power) { - return Fraction(std::pow(f.to_double(), power)); - }, - py::arg("power")) - //.def(py::self < py::self) - .def(py::self == py::self) - .def(py::self != py::self) - .def("__float__", [](const Fraction& f) { return f.to_double(); }) - .def("__int__", - [](const Fraction& f) { return static_cast(f.to_double()); }); - - //m.def("compute_hash", &fnv1a_hash, - // "Compute FNV-1a hash for a string view"); - - //m.def("compute_hash", &jenkins_one_at_a_time_hash, - // "Compute Jenkins One-at-a-Time hash for a string view"); - - // Bindings for createHuffmanTree function + .def("__repr__", [](const Fraction &f) { return f.to_string(); }); + + // Bindings for createHuffmanTree function m.def("create_huffman_tree", &createHuffmanTree, "Create a Huffman tree from character frequencies"); @@ -171,9 +95,23 @@ PYBIND11_MODULE(atom_algorithm, m) { m.def("decompress_text", &decompressText, "Decompress text using Huffman decoding"); - m.def("mul_div_64", &mulDiv64, "Perform 64-bit multiplication and division"); + m.def("mul_div_64", &mulDiv64, + "Perform 64-bit multiplication and division"); + m.def("safe_add", &safeAdd, "Safe addition"); + m.def("safe_sub", &safeSub, "Safe subtraction"); + m.def("safe_mul", &safeMul, "Safe multiplication"); + m.def("safe_div", &safeDiv, "Safe division"); + m.def("normalize", &normalize, "Normalize a 64-bit number"); + m.def("rotl64", &rotl64, "Rotate left"); + m.def("rotr64", &rotr64, "Rotate right"); + m.def("clz64", &clz64, "Count leading zeros"); py::class_(m, "MD5") .def(py::init<>()) .def_static("encrypt", &MD5::encrypt); + + m.def("murmur3_hash", &murmur3Hash, "Murmur3 Hash"); + m.def("murmur3_hash64", &murmur3Hash64, "Murmur3 Hash64"); + m.def("hexstring_from_data", py::overload_cast(&hexstringFromData), "Hexstring from Data"); + m.def("data_from_hexstring", &dataFromHexstring, "Data from Hexstring"); } diff --git a/src/atom/algorithm/_script.hpp b/src/atom/algorithm/_script.hpp index 3db8ac40..d41011fa 100644 --- a/src/atom/algorithm/_script.hpp +++ b/src/atom/algorithm/_script.hpp @@ -57,19 +57,12 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&deconvolve2D), "deconvolve2d"); m->add(user_type(), "Fraction"); - //m->add(Carbon::constructor(), "Fraction"); m->add(Carbon::fun(&Fraction::operator+=), "+="); m->add(Carbon::fun(&Fraction::operator-=), "-="); m->add(Carbon::fun(&Fraction::operator*=), "*="); m->add(Carbon::fun(&Fraction::operator/=), "/="); m->add(Carbon::fun(&Fraction::operator+), "+"); - m->add(Carbon::fun(&Fraction::operator-), - "-"); - m->add(Carbon::fun(&Fraction::operator-), - "-"); - m->add(Carbon::fun( - &Fraction::operator-), - "-"); + m->add(Carbon::fun(&Fraction::operator-), "-"); m->add(Carbon::fun(&Fraction::operator*), "*"); m->add(Carbon::fun(&Fraction::operator/), "/"); m->add(Carbon::fun(&Fraction::operator==), "=="); @@ -91,7 +84,6 @@ Carbon::ModulePtr bootstrap( "hash"); m->add(user_type(), "HuffmanNode"); - //m->add(Carbon::constructor(), "HuffmanNode"); m->add(Carbon::fun(&HuffmanNode::data), "data"); m->add(Carbon::fun(&HuffmanNode::frequency), "frequency"); m->add(Carbon::fun(&HuffmanNode::left), "left"); @@ -103,21 +95,20 @@ Carbon::ModulePtr bootstrap( m->add(Carbon::fun(&decompressText), "decompress_text"); m->add(Carbon::fun(&mulDiv64), "mul_div_64"); + m->add(Carbon::fun(&safeAdd), "safe_add"); + m->add(Carbon::fun(&safeSub), "safe_sub"); + m->add(Carbon::fun(&safeMul), "safe_mul"); + m->add(Carbon::fun(&safeDiv), "safe_div"); + m->add(Carbon::fun(&normalize), "normalize"); + m->add(Carbon::fun(&rotl64), "rotl_64"); + m->add(Carbon::fun(&rotr64), "rotr_64"); + m->add(Carbon::fun(&clz64), "clz_64"); m->add(Carbon::fun(&MD5::encrypt), "md5_encrypt"); - m->add( - Carbon::fun(&murmur3Hash), - "murmur3_hash"); - m->add(Carbon::fun(&murmur3Hash64), - "murmur3_hash_64"); - m->add( - Carbon::fun(&dataFromHexstring), - "data_from_hexstring"); - m->add( - Carbon::fun(&dataFromHexstring), - "data_from_hexstring"); + m->add(Carbon::fun(&murmur3Hash), "murmur3_hash"); + m->add(Carbon::fun(&murmur3Hash64), "murmur3_hash_64"); + m->add(Carbon::fun(&dataFromHexstring), "data_from_hexstring"); m->add( Carbon::fun(&hexstringFromData), "hexstring_from_data"); diff --git a/src/atom/algorithm/fraction.cpp b/src/atom/algorithm/fraction.cpp index 7c710361..85814d3f 100644 --- a/src/atom/algorithm/fraction.cpp +++ b/src/atom/algorithm/fraction.cpp @@ -80,10 +80,6 @@ bool Fraction::operator==(const Fraction &other) const { return (numerator == other.numerator) && (denominator == other.denominator); } -Fraction Fraction::operator-() const { - return Fraction(-numerator, denominator); -} - Fraction::operator double() const { return to_double(); } Fraction::operator float() const { return static_cast(to_double()); } diff --git a/src/atom/algorithm/fraction.hpp b/src/atom/algorithm/fraction.hpp index b1a8c23e..9530852b 100644 --- a/src/atom/algorithm/fraction.hpp +++ b/src/atom/algorithm/fraction.hpp @@ -131,12 +131,6 @@ class Fraction { */ bool operator==(const Fraction& other) const; - /** - * @brief Negates the fraction. - * @return The negated fraction. - */ - Fraction operator-() const; - /** * @brief Converts the fraction to a double value. * @return The fraction as a double. diff --git a/src/atom/algorithm/math.cpp b/src/atom/algorithm/math.cpp index 694c5797..f4253829 100644 --- a/src/atom/algorithm/math.cpp +++ b/src/atom/algorithm/math.cpp @@ -14,92 +14,107 @@ Description: Extra Math Library #include "math.hpp" -#if defined(_MSC_VER) -#include -#endif +#include +#include namespace Atom::Algorithm { -uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, - uint64_t divider) { #if defined(__GNUC__) && defined(__SIZEOF_INT128__) +uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, + uint64_t divider) noexcept { __uint128_t a = operant; __uint128_t b = multiplier; __uint128_t c = divider; - return (uint64_t)(a * b / c); + return static_cast((a * b) / c); +} #elif defined(_MSC_VER) -#if defined(_M_IX86) - // Your x86 specific code here -#elif defined(_M_X64) -#pragma warning(push) -#pragma warning(disable : 4244) // C4244: 'conversion' conversion from 'type1' - // to 'type2', possible loss of data - uint64_t a = operant; - uint64_t b = multiplier; - uint64_t c = divider; - - // Normalize divisor - unsigned long shift; - _BitScanReverse64(&shift, c); - shift = 63 - shift; - - c <<= shift; - - // Multiply - a = _umul128(a, b, &b); - if (((b << shift) >> shift) != b) { - // Overflow - return 0xFFFFFFFFFFFFFFFF; +#include // For _umul128 and _BitScanReverse64 +#include + +uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, + uint64_t divider) noexcept { + uint64_t highProd; + uint64_t lowProd = _umul128( + operant, multiplier, + &highProd); // Directly get the low and high parts of the product + + if (divider == 0) { + throw std::runtime_error("Division by zero"); } - b = __shiftleft128(a, b, shift); - a <<= shift; - - uint32_t div; - uint32_t q0, q1; - uint64_t t0, t1; - - // 1st Reduction - div = (uint32_t)(c >> 32); - t0 = b / div; - if (t0 > 0xFFFFFFFF) - t0 = 0xFFFFFFFF; - q1 = (uint32_t)t0; - while (1) { - t0 = _umul128(c, (uint64_t)q1 << 32, &t1); - if (t1 < b || (t1 == b && t0 <= a)) - break; - q1--; + + // Normalize divisor + unsigned long shift = 63 - std::bit_width(divider - 1); + uint64_t normDiv = divider << shift; + + // Normalize high part + highProd = (highProd << shift) | (lowProd >> (64 - shift)); + lowProd <<= shift; + + // Division using high and low parts + uint64_t quotient, remainder; + _udiv128(highProd, lowProd, normDiv, &remainder); + + return quotient; +} +#else +#error "Platform not supported for mulDiv64 function!" +#endif + +uint64_t safeAdd(uint64_t a, uint64_t b) { + uint64_t result; + if (__builtin_add_overflow(a, b, &result)) { + throw std::overflow_error("Overflow in addition"); } - b -= t1; - if (t0 > a) - b--; - a -= t0; - - if (b > 0xFFFFFFFF) { - // Overflow - return 0xFFFFFFFFFFFFFFFF; + return result; +} + +uint64_t safeMul(uint64_t a, uint64_t b) { + uint64_t result; + if (__builtin_mul_overflow(a, b, &result)) { + throw std::overflow_error("Overflow in multiplication"); } + return result; +} + +uint64_t rotl64(uint64_t n, unsigned int c) { + const unsigned int mask = 63; + c &= mask; + return (n << c) | (n >> (-c & mask)); +} + +uint64_t rotr64(uint64_t n, unsigned int c) { + const unsigned int mask = 63; + c &= mask; + return (n >> c) | (n << (-c & mask)); +} + +int clz64(uint64_t x) { + if (x == 0) + return 64; + return __builtin_clzll(x); // GCC built-in +} - // 2nd reduction - t0 = ((b << 32) | (a >> 32)) / div; - if (t0 > 0xFFFFFFFF) - t0 = 0xFFFFFFFF; - q0 = (uint32_t)t0; - - while (1) { - t0 = _umul128(c, q0, &t1); - if (t1 < b || (t1 == b && t0 <= a)) - break; - q0--; +uint64_t normalize(uint64_t x) { + if (x == 0) + return 0; + int n = clz64(x); + return x << n; +} + +uint64_t safeSub(uint64_t a, uint64_t b) { + uint64_t result; + if (__builtin_sub_overflow(a, b, &result)) { + throw std::underflow_error("Underflow in subtraction"); } + return result; +} - return ((uint64_t)q1 << 32) | q0; -#pragma warning(pop) -#endif -#else -#error MulDiv64 is no supported! -#endif +uint64_t safeDiv(uint64_t a, uint64_t b) { + if (b == 0) { + throw std::runtime_error("Division by zero"); + } + return a / b; } } // namespace Atom::Algorithm diff --git a/src/atom/algorithm/math.hpp b/src/atom/algorithm/math.hpp index 2ac45700..1c392a6b 100644 --- a/src/atom/algorithm/math.hpp +++ b/src/atom/algorithm/math.hpp @@ -28,7 +28,94 @@ namespace Atom::Algorithm { * @param divider The divisor for the division operation. * @return The result of (operant * multiplier) / divider. */ -uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, uint64_t divider); +uint64_t mulDiv64(uint64_t operant, uint64_t multiplier, + uint64_t divider) noexcept; + +/** + * @brief Performs a safe addition operation. + * + * This function adds two unsigned 64-bit integers, handling potential overflow. + * + * @param a The first operand for addition. + * @param b The second operand for addition. + * @return The result of a + b, or 0 if there is an overflow. + */ +uint64_t safeAdd(uint64_t a, uint64_t b); + +/** + * @brief Performs a safe multiplication operation. + * + * This function multiplies two unsigned 64-bit integers, handling potential overflow. + * + * @param a The first operand for multiplication. + * @param b The second operand for multiplication. + * @return The result of a * b, or 0 if there is an overflow. + */ +uint64_t safeMul(uint64_t a, uint64_t b); + +/** + * @brief Rotates a 64-bit integer to the left. + * + * This function rotates a 64-bit integer to the left by a specified number of bits. + * + * @param n The 64-bit integer to rotate. + * @param c The number of bits to rotate. + * @return The rotated 64-bit integer. + */ +uint64_t rotl64(uint64_t n, unsigned int c); + +/** + * @brief Rotates a 64-bit integer to the right. + * + * This function rotates a 64-bit integer to the right by a specified number of bits. + * + * @param n The 64-bit integer to rotate. + * @param c The number of bits to rotate. + * @return The rotated 64-bit integer. + */ +uint64_t rotr64(uint64_t n, unsigned int c); + +/** + * @brief Counts the leading zeros in a 64-bit integer. + * + * This function counts the number of leading zeros in a 64-bit integer. + * + * @param x The 64-bit integer to count leading zeros in. + * @return The number of leading zeros in the 64-bit integer. + */ +int clz64(uint64_t x); + +/** + * @brief Normalizes a 64-bit integer. + * + * This function normalizes a 64-bit integer by shifting it to the right until the most significant bit is set. + * + * @param x The 64-bit integer to normalize. + * @return The normalized 64-bit integer. + */ +uint64_t normalize(uint64_t x); + +/** + * @brief Performs a safe subtraction operation. + * + * This function subtracts two unsigned 64-bit integers, handling potential underflow. + * + * @param a The first operand for subtraction. + * @param b The second operand for subtraction. + * @return The result of a - b, or 0 if there is an underflow. + */ +uint64_t safeSub(uint64_t a, uint64_t b); + +/** + * @brief Performs a safe division operation. + * + * This function divides two unsigned 64-bit integers, handling potential division by zero. + * + * @param a The numerator for division. + * @param b The denominator for division. + * @return The result of a / b, or 0 if there is a division by zero. + */ +uint64_t safeDiv(uint64_t a, uint64_t b); } // namespace Atom::Algorithm #endif \ No newline at end of file diff --git a/src/atom/algorithm/mhash.cpp b/src/atom/algorithm/mhash.cpp index 4315b969..e0c855ee 100644 --- a/src/atom/algorithm/mhash.cpp +++ b/src/atom/algorithm/mhash.cpp @@ -22,208 +22,134 @@ Description: Implementation of murmur3 hash and quick hash #include #include #include +#include #include #include - -#define ROTL(x, r) ((x << r) | (x >> (32 - r))) +#include namespace Atom::Utils { -static inline uint32_t fmix32(uint32_t h) { +uint32_t fmix32(uint32_t h) noexcept { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; - return h; } -uint32_t murmur3Hash(const char *str, const uint32_t &seed = 1060627423) { - if (!str) - return 0; - - int len = strlen(str); - return murmur3Hash(str, len, seed); +uint32_t ROTL(uint32_t x, int8_t r) noexcept { + return (x << r) | (x >> (32 - r)); } -uint32_t murmur3Hash(const void *data, const uint32_t &size, - const uint32_t &seed = 1060627423) { - if (!data) - return 0; - - const char *str = (const char *)data; - int len = size; - - uint32_t s, h = seed, seed1 = 0xcc9e2d51, seed2 = 0x1b873593, - *ptr = (uint32_t *)str; - - // handle begin blocks - int blk = len / 4; - for (int i = 0; i < blk; i++) { - s = ptr[i]; - s *= seed1; - s = ROTL(s, 15); - s *= seed2; - - h ^= s; - h = ROTL(h, 13); - h *= 5; - h += 0xe6546b64; +uint32_t murmur3Hash(std::string_view data, uint32_t seed) noexcept { + uint32_t hash = seed; + const uint32_t seed1 = 0xcc9e2d51; + const uint32_t seed2 = 0x1b873593; + + // Process 4-byte chunks + const uint32_t *blocks = reinterpret_cast(data.data()); + size_t nblocks = data.size() / 4; + for (size_t i = 0; i < nblocks; i++) { + uint32_t k = blocks[i]; + k *= seed1; + k = ROTL(k, 15); + k *= seed2; + + hash ^= k; + hash = ROTL(hash, 13); + hash = hash * 5 + 0xe6546b64; } - // handle tail - s = 0; - uint8_t *tail = (uint8_t *)(str + blk * 4); - switch (len & 3) { + // Handle the tail + const uint8_t *tail = + reinterpret_cast(data.data() + nblocks * 4); + uint32_t tail_val = 0; + switch (data.size() & 3) { case 3: - s |= tail[2] << 16; + tail_val |= tail[2] << 16; + [[fallthrough]]; case 2: - s |= tail[1] << 8; + tail_val |= tail[1] << 8; + [[fallthrough]]; case 1: - s |= tail[0]; - - s *= seed1; - s = ROTL(s, 15); - s *= seed2; - h ^= s; - }; - - return fmix32(h ^ len); -} + tail_val |= tail[0]; + tail_val *= seed1; + tail_val = ROTL(tail_val, 15); + tail_val *= seed2; + hash ^= tail_val; + } -uint64_t murmur3Hash64(const void *str, const uint32_t &size, - const uint32_t &seed = 1060627423, - const uint32_t &seed2 = 1050126127) { - return (((uint64_t)murmur3Hash(str, size, seed)) << 32 | - murmur3Hash(str, size, seed2)); + return fmix32(hash ^ static_cast(data.size())); } -uint64_t murmur3Hash64(const char *str, const uint32_t &seed = 1060627423, - const uint32_t &seed2 = 1050126127) { - return (((uint64_t)murmur3Hash(str, seed)) << 32 | murmur3Hash(str, seed2)); +uint64_t murmur3Hash64(std::string_view str, uint32_t seed, uint32_t seed2) { + return (static_cast(murmur3Hash(str, seed)) << 32) | + murmur3Hash(str, seed2); } void hexstringFromData(const void *data, size_t len, char *output) { - const unsigned char *buf = (const unsigned char *)data; - size_t i, j; - for (i = j = 0; i < len; ++i) { - char c; - c = (buf[i] >> 4) & 0xf; - c = (c > 9) ? c + 'a' - 10 : c + '0'; - output[j++] = c; - c = (buf[i] & 0xf); - c = (c > 9) ? c + 'a' - 10 : c + '0'; - output[j++] = c; + const unsigned char *buf = static_cast(data); + std::span bytes(buf, len); + std::ostringstream stream; + + // Use iomanip to format output + stream << std::hex << std::setfill('0'); + for (unsigned char byte : bytes) { + stream << std::setw(2) << static_cast(byte); } -} -std::string hexstringFromData(const char *data, size_t len) { - if (len == 0) { - return std::string(); - } - std::string result; - result.resize(len * 2); - hexstringFromData(data, len, &result[0]); - return result; + std::string hexstr = stream.str(); + std::copy(hexstr.begin(), hexstr.end(), output); + output[hexstr.size()] = '\0'; // Null-terminate the output string } std::string hexstringFromData(const std::string &data) { - return hexstringFromData(data.c_str(), data.size()); -} - -void dataFromHexstring(const char *hexstring, size_t length, void *output) { - unsigned char *buf = (unsigned char *)output; - unsigned char byte; - if (length % 2 != 0) { - throw std::invalid_argument("dataFromHexstring length % 2 != 0"); + if (data.empty()) { + return {}; } - for (size_t i = 0; i < length; ++i) { - switch (hexstring[i]) { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - byte = (hexstring[i] - 'a' + 10) << 4; - break; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - byte = (hexstring[i] - 'A' + 10) << 4; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - byte = (hexstring[i] - '0') << 4; - break; - default: - throw std::invalid_argument( - "dataFromHexstring invalid hexstring"); - } - ++i; - switch (hexstring[i]) { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - byte |= hexstring[i] - 'a' + 10; - break; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - byte |= hexstring[i] - 'A' + 10; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - byte |= hexstring[i] - '0'; - break; - default: - throw std::invalid_argument( - "dataFromHexstring invalid hexstring"); + + std::string result; + result.reserve(data.size() * 2); + + for (unsigned char c : data) { + char buf[3]; // buffer for two hex chars and null terminator + std::to_chars_result conv_result = + std::to_chars(buf, buf + sizeof(buf), c, 16); + + if (conv_result.ec == std::errc{}) { + if (buf[1] == '\0') { + result += '0'; // pad single digit hex numbers + } + result.append(buf, conv_result.ptr); } - *buf++ = byte; } -} -std::string dataFromHexstring(const char *hexstring, size_t length) { - if (length % 2 != 0) { - throw std::invalid_argument("dataFromHexstring length % 2 != 0"); - } - if (length == 0) { - return std::string(); - } - std::string result; - result.resize(length / 2); - dataFromHexstring(hexstring, length, &result[0]); return result; } std::string dataFromHexstring(const std::string &hexstring) { - return dataFromHexstring(hexstring.c_str(), hexstring.size()); + if (hexstring.size() % 2 != 0) { + throw std::invalid_argument("Hex string length must be even"); + } + + std::string result; + result.resize(hexstring.size() / 2); + + size_t output_index = 0; + for (size_t i = 0; i < hexstring.size(); i += 2) { + int byte = 0; + auto [ptr, ec] = std::from_chars(hexstring.data() + i, + hexstring.data() + i + 2, byte, 16); + + if (ec == std::errc::invalid_argument || + ptr != hexstring.data() + i + 2) { + throw std::invalid_argument("Invalid hex character"); + } + + result[output_index++] = static_cast(byte); + } + + return result; } } // namespace Atom::Utils diff --git a/src/atom/algorithm/mhash.hpp b/src/atom/algorithm/mhash.hpp index 39f38312..cff1097c 100644 --- a/src/atom/algorithm/mhash.hpp +++ b/src/atom/algorithm/mhash.hpp @@ -29,18 +29,8 @@ namespace Atom::Utils { * @param seed The seed value (optional, default is 1060627423). * @return uint32_t The calculated hash value. */ -[[nodiscard]] uint32_t murmur3Hash(const char *str, const uint32_t &seed); - -/** - * @brief Calculates the MurmurHash3 hash value for a given data buffer. - * - * @param str The input data buffer. - * @param size The size of the data buffer. - * @param seed The seed value (optional, default is 1060627423). - * @return uint32_t The calculated hash value. - */ -[[nodiscard]] uint32_t murmur3Hash(const void *str, const uint32_t &size, - const uint32_t &seed); +[[nodiscard]] uint32_t murmur3Hash(std::string_view data, + uint32_t seed = 1060627423) noexcept; /** * @brief Calculates the 64-bit MurmurHash3 hash value for a given string. @@ -50,21 +40,9 @@ namespace Atom::Utils { * @param seed2 The second seed value (optional, default is 1050126127). * @return uint64_t The calculated hash value. */ -[[nodiscard]] uint64_t murmur3Hash64(const char *str, const uint32_t &seed, - const uint32_t &seed2); - -/** - * @brief Calculates the 64-bit MurmurHash3 hash value for a given data buffer. - * - * @param str The input data buffer. - * @param size The size of the data buffer. - * @param seed The first seed value (optional, default is 1060627423). - * @param seed2 The second seed value (optional, default is 1050126127). - * @return uint64_t The calculated hash value. - */ -[[nodiscard]] uint64_t murmur3Hash64(const void *str, const uint32_t &size, - const uint32_t &seed, - const uint32_t &seed2); +[[nodiscard]] uint64_t murmur3Hash64(std::string_view str, + uint32_t seed = 1060627423, + uint32_t seed2 = 1050126127); /** * @brief Converts binary data to a hexadecimal string representation. @@ -76,15 +54,6 @@ namespace Atom::Utils { */ void hexstringFromData(const void *data, size_t len, char *output); -/** - * @brief Converts binary data to a hexadecimal string representation. - * - * @param data The input data buffer. - * @param len The length of the data buffer. - * @return std::string The hexadecimal string representation. - */ -[[nodiscard]] std::string hexstringFromData(const void *data, size_t len); - /** * @brief Converts a string to a hexadecimal string representation. * @@ -93,28 +62,6 @@ void hexstringFromData(const void *data, size_t len, char *output); */ [[nodiscard]] std::string hexstringFromData(const std::string &data); -/** - * @brief Converts a hexadecimal string representation to binary data. - * - * @param hexstring The input hexadecimal string. - * @param length The length of the hexadecimal string. - * @param output The output buffer to store the binary data (length must be - * length / 2). - */ -void dataFromHexstring(const char *hexstring, size_t length, void *output); - -/** - * @brief Converts a hexadecimal string representation to binary data. - * - * @param hexstring The input hexadecimal string. - * @param length The length of the hexadecimal string. - * @return std::string The binary data. - * @throw std::invalid_argument If the input hexstring is not a valid - * hexadecimal string. - */ -[[nodiscard]] std::string dataFromHexstring(const char *hexstring, - size_t length); - /** * @brief Converts a hexadecimal string representation to binary data. * diff --git a/src/atom/components/component.cpp b/src/atom/components/component.cpp index 162e2704..3eb15494 100644 --- a/src/atom/components/component.cpp +++ b/src/atom/components/component.cpp @@ -28,240 +28,83 @@ namespace fs = std::filesystem; #include #endif -Component::Component(const std::string &name) - : m_CommandDispatcher(std::make_unique>()), - m_VariableRegistry(std::make_unique(name)), - m_name(name) {} - -Component::~Component() { destroy(); } - -bool Component::initialize() { - DLOG_F(INFO, "Component is initializing ..."); - registerFunc("registerVariable", &Component::_registerVariable, this); - DLOG_F(INFO, "Component is initialized"); - return true; +Component::Component(const std::string& name) + : m_name(name), + m_ConfigManager(std::make_unique()), + m_CommandDispatcher(std::make_unique()), + m_VariableManager(std::make_unique()), + m_typeInfo(user_type()) { + // Empty } -bool Component::destroy() { - if (m_CommandDispatcher) { - m_CommandDispatcher->removeAll(); - m_CommandDispatcher.reset(); - } - if (m_VariableRegistry) { - m_VariableRegistry->RemoveAll(); - m_VariableRegistry.reset(); - } - return true; +Component::~Component() { + // Empty } +bool Component::initialize() { return true; } + +bool Component::destroy() { return true; } + std::string Component::getName() const { return m_name; } -bool Component::loadConfig(const std::string &path) { - std::unique_lock lock(m_mutex); - try { - std::ifstream ifs(path); - if (!ifs.is_open()) { - LOG_F(ERROR, "Failed to open file: {}", path); - return false; - } - json j = json::parse(ifs); - const std::string basename = fs::path(path).stem().string(); - m_config[basename] = j["config"]; - m_ConfigPath = path; - DLOG_F(INFO, "Loaded config file {} successfully", path); - return true; - } catch (const json::exception &e) { - LOG_F(ERROR, "Failed to parse file: {}, error message: {}", path, - e.what()); - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to load config file: {}, error message: {}", path, - e.what()); - } - return false; +std::optional Component::getValue(const std::string& key_path) const { + return m_ConfigManager->getValue(key_path); } -bool Component::saveConfig() { - if (m_ConfigPath.empty()) { - LOG_F(ERROR, "No path provided, will not save {}'s config", m_name); - return false; - } - std::ofstream ofs(m_ConfigPath); - if (!ofs.is_open()) { - LOG_F(ERROR, "Failed to open file: {}", m_ConfigPath); - return false; - } - try { - ofs << m_config.dump(4); - } catch (const json::parse_error &e) { - LOG_F(ERROR, "Failed to sace config {} for JSON error: {}", - m_ConfigPath, e.what()); - ofs.close(); - return false; - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to save config to file: {}, error message: {}", - m_ConfigPath, e.what()); - ofs.close(); - return false; - } - ofs.close(); - DLOG_F(INFO, "Save config to file: {}", m_ConfigPath); - return true; +bool Component::setValue(const std::string& key_path, const json& value) { + return m_ConfigManager->setValue(key_path, value); } -json Component::getValue(const std::string &key_path) const { - // std::lock_guard lock(rw_m_mutex); - try { - const json *p = &m_config; - for (const auto &key : Atom::Utils::splitString(key_path, '/')) { - if (p->is_object() && p->contains(key)) { - p = &(*p)[key]; - } else { - LOG_F(ERROR, "Key not found: {}", key_path); - return nullptr; - } - } - return *p; - } catch (const std::exception &e) { - LOG_F(ERROR, "Failed to get value: {} {}", key_path, e.what()); - return nullptr; - } - return nullptr; +bool Component::hasValue(const std::string& key_path) const { + return getValue(key_path).has_value(); } -std::string Component::getVariableInfo(const std::string &name) const { - if (!m_VariableRegistry->HasVariable(name)) { - return ""; - } - return m_VariableRegistry->GetDescription(name); +bool Component::loadFromFile(const fs::path& path) { + return m_ConfigManager->loadFromFile(path); } -bool Component::registerVariableRanges(const std::string &name, - const double &low, const double &high) { - if (name.empty()) - return false; - m_VariableRegistry->SetVariableRange(name, low, high); - return true; +bool Component::saveToFile(const fs::path& file_path) const { + return m_ConfigManager->saveToFile(file_path); } -bool Component::runFunc(const std::string &name, const json ¶ms) { - if (!m_CommandDispatcher->hasHandler(name)) { - return false; - } - m_CommandDispatcher->dispatch(name, params); - return true; +void Component::addAlias(const std::string& name, const std::string& alias) { + m_CommandDispatcher->addAlias(name, alias); } -json Component::getFuncInfo(const std::string &name) { - if (m_CommandDispatcher->hasHandler(name)) { - json args; - args = { - {"name", name}, - {"description", m_CommandDispatcher->getFunctionDescription(name)}}; - return args; - } - return {}; +void Component::addGroup(const std::string& name, const std::string& group) { + m_CommandDispatcher->addGroup(name, group); } -std::function Component::getFunc(const std::string &name) { - if (!m_CommandDispatcher->hasHandler(name)) { - throw Atom::Error::InvalidArgument("Function not found"); - } - return m_CommandDispatcher->getHandler(name); +void Component::setTimeout(const std::string& name, + std::chrono::milliseconds timeout) { + m_CommandDispatcher->setTimeout(name, timeout); } -json Component::createSuccessResponse(const std::string &command, - const json &value) { - json res; - res["command"] = command; - res["value"] = value; - res["status"] = "ok"; - res["code"] = 200; -#if __cplusplus >= 202003L - res["message"] = std::format("{} operated on success", command); -#else - res["message"] = fmt::format("{} operated on success", command); -#endif - return res; +void Component::clearCache() { m_CommandDispatcher->clearCache(); } + +void Component::removeCommand(const std::string& name) { + m_CommandDispatcher->removeCommand(name); } -json Component::createErrorResponse(const std::string &command, - const json &error, - const std::string &message = "") { - json res; - res["command"] = command; - res["status"] = "error"; - res["code"] = 500; -#if __cplusplus >= 202003L - res["message"] = - std::format("{} operated on failure, message: {}", command, message); -#else - res["message"] = - std::format("{} operated on failure, message: {}", command, message); -#endif - if (!error.empty()) { - res["error"] = error; - } else { - res["error"] = "Unknown Error"; - } - return res; +std::vector Component::getCommandsInGroup( + const std::string& group) const { + return m_CommandDispatcher->getCommandsInGroup(group); +} + +std::string Component::getCommandDescription(const std::string& name) const + +{ + return m_CommandDispatcher->getCommandDescription(name); } -json Component::createWarningResponse(const std::string &command, - const json &warning, - const std::string &message = "") { - json res; - res["command"] = command; - res["status"] = "warning"; - res["code"] = 400; -#if __cplusplus >= 202003L - res["message"] = - std::format("{} operated on warning, message: {}", command, message); +#if ENABLE_FASTHASH +emhash::HashSet Component::getCommandAliases( + const std::string& name) const #else - res["message"] = - std::format("{} operated on warning, message: {}", command, message); +std::unordered_set Component::getCommandAliases( + const std::string& name) const #endif - if (!warning.empty()) { - res["warning"] = warning; - } else { - res["warning"] = "Unknown Warning"; - } - return res; -} -json Component::_registerVariable(const json ¶ms) { - // Check Parameters - if (!params.contains("name") || !params.contains("value")) { - return createErrorResponse(__func__, {{"error", "Invalid Parameters"}}, - "Missing 'name' or 'value'"); - } - if (!params["name"].is_string()) { - return createErrorResponse(__func__, {{"error", "Invalid Parameters"}}, - "'name' must be a string value"); - } - std::string name = params["name"].get(); - std::string description = ""; - // Get description if have - if (params.contains("description") && params["description"].is_string()) { - description = params["description"]; - } - bool status = false; - if (params["value"].is_string()) { - status = registerVariable(name, params["value"].get(), - description); - } else if (params["value"].is_number()) { - status = - registerVariable(name, params["value"].get(), description); - } else if (params["value"].is_boolean()) { - status = - registerVariable(name, params["value"].get(), description); - } else { - return createErrorResponse( - __func__, {{"error", "Unknown Type"}}, - "Value type must be one of number|boolean|string"); - } - if (!status) { - return createErrorResponse(__func__, {{"error", "Operation Failed"}, - "Failed to register value"}); - } - return createSuccessResponse(__func__, {}); +{ + return m_CommandDispatcher->getCommandAliases(name); } \ No newline at end of file diff --git a/src/atom/components/component.hpp b/src/atom/components/component.hpp index f91fdb50..b07a0242 100644 --- a/src/atom/components/component.hpp +++ b/src/atom/components/component.hpp @@ -12,45 +12,29 @@ Description: Basic Component Definition **************************************************/ -// Max: Obviously, directly use json.hpp is much simpler than self-implement -// type - #ifndef ATOM_COMPONENT_HPP #define ATOM_COMPONENT_HPP #include #include +#include #include "types.hpp" -#include "atom/server/commander.hpp" -#include "atom/server/variables.hpp" - -#include "atom/type/json.hpp" -using json = nlohmann::json; - -#define SETVAR_STR(name, value) \ - m_VariableRegistry->RegisterVariable(name); \ - m_VariableRegistry->SetVariable(name, value); +#include "dispatch.hpp" +#include "var.hpp" -#define SETVAR_INT(name, value) \ - m_VariableRegistry->RegisterVariable(name); \ - m_VariableRegistry->SetVariable(name, value); +#include "configor.hpp" -#define SETVAR_BOOL(name, value) \ - m_VariableRegistry->RegisterVariable(name); \ - m_VariableRegistry->SetVariable(name, value); +#include "atom/experiment/noncopyable.hpp" +#include "atom/experiment/type_info.hpp" -#define SETVAR_DOUBLE(name, value) \ - m_VariableRegistry->RegisterVariable(name); \ - m_VariableRegistry->SetVariable(name, value); - -class Component : public std::enable_shared_from_this { +class Component : public std::enable_shared_from_this, public NonCopyable { public: /** * @brief Constructs a new Component object. */ - explicit Component(const std::string &name); + explicit Component(const std::string& name); /** * @brief Destroys the Component object. @@ -81,164 +65,217 @@ class Component : public std::enable_shared_from_this { */ virtual bool destroy(); + /** + * @brief Gets the name of the plugin. + * + * @return The name of the plugin. + */ std::string getName() const; // ------------------------------------------------------------------- // Component Configuration methods // ------------------------------------------------------------------- - // Max: Should we use JSON here? - // 2024/02/13 Max: Obviously, directly use json.hpp is much simpler than - // self-implement type + [[nodiscard("config value should not be ignored!")]] std::optional + getValue(const std::string& key_path) const; /** - * @brief Loads the component configuration from a file. + * @brief 添加或更新一个配置项 * - * @param path The path to the component configuration file. - * @return True if the component configuration was loaded successfully, - * false otherwise. - * @note Usually, the component configuration file is stored in the plugin's - * directory. + * Add or update a configuration item. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + * @param value 配置项的值,使用 JSON 格式进行表示 + * @return bool 成功返回 true,失败返回 false */ - bool loadConfig(const std::string &path); + bool setValue(const std::string& key_path, const json& value); - bool saveConfig(); + /** + * @brief 判断一个配置项是否存在 + * + * Determine if a configuration item exists. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + * @return bool 存在返回 true,不存在返回 false + */ + [[nodiscard("status of the value should not be ignored")]] bool hasValue( + const std::string& key_path) const; + + /** + * @brief 从指定文件中加载JSON配置,并与原有配置进行合并 + * + * Load JSON configuration from the specified file and merge with the + * existing configuration. + * + * @param path 配置文件路径 + */ + bool loadFromFile(const fs::path& path); - json getValue(const std::string &key_path) const; + /** + * @brief 将当前配置保存到指定文件 + * + * Save the current configuration to the specified file. + * + * @param file_path 目标文件路径 + */ + bool saveToFile(const fs::path& file_path) const; // ------------------------------------------------------------------- // Variable methods // ------------------------------------------------------------------- - json _registerVariable(const json ¶ms); + template + void addVariable(const std::string& name, T initialValue, + const std::string& description = "", + const std::string& alias = "", + const std::string& group = "") { + m_VariableManager->addVariable(name, initialValue, description, alias, + group); + } - /** - * @brief Registers a member function with a specific name and handler. - * - * This function allows plugins to register member functions that can be - * called by other plugins. - * - * @tparam ClassType The type of the class that owns the handler function. - * @param name The name of the function. - * @param handler The handler function for the function. - * @param object The object instance that owns the handler function. - */ template - bool registerVariable(const std::string &name, const T &value, - const std::string &description = "") { - return m_VariableRegistry->RegisterVariable(name, value, - description); + void setRange(const std::string& name, T min, T max) { + m_VariableManager->setRange(name, min, max); } - bool registerVariableRanges(const std::string &name, const double &low, const double &high); + void setStringOptions(const std::string& name, + std::vector options) { + m_VariableManager->setStringOptions(name, options); + } /** - * @brief Gets the value of the variable with the specified name. - * - * @tparam T The type of the variable. + * @brief Gets a variable by name. * @param name The name of the variable. - * @return An optional containing the value of the variable, or empty if the - * variable does not exist. + * @return A shared pointer to the variable. */ template - bool setVariable(const std::string &name, const T &value) { - return m_VariableRegistry->SetVariable(name, value); + std::shared_ptr> getVariable(const std::string& name) { + return m_VariableManager->getVariable(name); } /** - * @brief Gets the value of the variable with the specified name. - * - * @tparam T The type of the variable. + * @brief Sets the value of a variable. * @param name The name of the variable. - * @return An optional containing the value of the variable, or empty if the - * variable does not exist - * @note When you try to get a variable that does not exist, an exception - * will be thrown - * @note This function is thread-safe - * @note This function is for the server to get the value of a variable of - * the plugin. + * @param newValue The new value of the variable. + * @note const char * is not equivalent to std::string, please use + * std::string */ template - [[nodiscard]] std::optional getVariable(const std::string &name) const { - return m_VariableRegistry->GetVariable(name); + void setValue(const std::string& name, T newValue) { + m_VariableManager->setValue(name, newValue); } - /** - * @brief Gets the information about the variable with the specified name. - * - * @param name The name of the variable. - * @return The information about the variable. - */ - std::string getVariableInfo(const std::string &name) const; - // ------------------------------------------------------------------- // Function methods // ------------------------------------------------------------------- - /** - * @brief Sets the value of the variable with the specified name. - * - * @tparam T The type of the variable. - * @param name The name of the variable. - * @param value The value to set. - * @return True if the variable was set successfully, false otherwise. - */ - template - void registerFunc(const std::string &name, - json (ClassType::*handler)(const json &), - ClassType *object); + template + void registerCommand( + const std::string& name, const std::string& group, + const std::string& description, std::function func, + std::optional> precondition = std::nullopt, + std::optional> postcondition = std::nullopt) + { + m_CommandDispatcher->registerCommand(name, group, description, func, + precondition, postcondition); + } - /** - * @brief Gets the information about the function with the specified name. - * - * @param name The name of the function. - * @return The information about the function in JSON format. - */ - json getFuncInfo(const std::string &name); + template + void registerCommand(const std::string& name, Callable&& func, + const std::string& group = "", + const std::string& description = "") { + m_CommandDispatcher->registerCommand(name, func, group, description); + } - /** - * @brief Runs the function with the specified name and parameters. - * - * This function calls a registered member function with the specified name - * and parameters. - * - * @param name The name of the function. - * @param params The parameters for the function. - * @return True if the function was executed successfully, false otherwise. - */ - bool runFunc(const std::string &name, const json ¶ms); + template + void registerCommand(const std::string& name, Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = "") { + m_CommandDispatcher->registerCommand(name, func, group, description); + } - std::function getFunc(const std::string &name); + template + void registerCommand(const std::string& name, Ret (Class::*func)(Args...), + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") - json createSuccessResponse(const std::string &command, const json &value); + { + m_CommandDispatcher->registerCommand(name, func, instance, group, + description); + } - json createErrorResponse(const std::string &command, const json &error, - const std::string &message); + template + void registerCommand(const std::string& name, + Ret (Class::*func)(Args...) const, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") { + m_CommandDispatcher->registerCommand(name, func, instance, group, + description); + } - json createWarningResponse(const std::string &command, const json &warning, - const std::string &message); + template + void registerCommand(const std::string& name, + Ret (Class::*func)(Args...) noexcept, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") { + m_CommandDispatcher->registerCommand(name, func, instance, group, + description); + } -private: - std::string m_name; - std::string m_ConfigPath; - std::string m_InfoPath; + template + void registerCommand(const std::string& name, Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = "") { + m_CommandDispatcher->registerCommand(name, func, group, description); + } + + void addAlias(const std::string& name, const std::string& alias); + + void addGroup(const std::string& name, const std::string& group); + + void setTimeout(const std::string& name, std::chrono::milliseconds timeout); + + template + std::any dispatch(const std::string& name, Args&&... args) + { + return m_CommandDispatcher->dispatch(name, std::forward(args)...); + } - std::unique_ptr> - m_CommandDispatcher; ///< The command dispatcher for handling - ///< functions. - std::unique_ptr - m_VariableRegistry; ///< The variable registry for managing variables. + void clearCache(); - json m_config; + void removeCommand(const std::string& name); + + std::vector getCommandsInGroup(const std::string& group) const; + + std::string getCommandDescription(const std::string& name) const; + +#if ENABLE_FASTHASH + emhash::HashSet getCommandAliases( + const std::string& name) const; +#else + std::unordered_set getCommandAliases( + const std::string& name) const; +#endif + +private: + std::string m_name; + std::string m_configPath; + std::string m_infoPath; + Type_Info m_typeInfo; + + std::unique_ptr + m_CommandDispatcher; ///< The command dispatcher for managing commands. + std::unique_ptr + m_VariableManager; ///< The variable registry for managing variables. + std::unique_ptr + m_ConfigManager; + std::mutex m_mutex; }; -template -void Component::registerFunc(const std::string &name, - json (ClassType::*handler)(const json &), - ClassType *object) { - if (!m_CommandDispatcher->hasHandler(name)) - m_CommandDispatcher->registerMemberHandler(name, object, handler); -} - #endif diff --git a/src/atom/components/component.inl b/src/atom/components/component.inl new file mode 100644 index 00000000..1edf9772 --- /dev/null +++ b/src/atom/components/component.inl @@ -0,0 +1,18 @@ +#ifndef ATOM_COMPONENT_INL +#define ATOM_COMPONENT_INL + +#include + +template +struct has_getValue { + template + static constexpr auto check(int) -> decltype(std::declval().getValue(), + std::true_type{}); + + template + static constexpr std::false_type check(...); + + static constexpr bool value = decltype(check(0))::value; +}; + +#endif diff --git a/src/atom/components/component_impl.hpp b/src/atom/components/component_impl.hpp deleted file mode 100644 index 4cea6d40..00000000 --- a/src/atom/components/component_impl.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ATOM_COMPONENT_IMPL_HPP -#define ATOM_COMPONENT_IMPL_HPP - -#include "component.hpp" - -#endif \ No newline at end of file diff --git a/src/atom/components/configor.cpp b/src/atom/components/configor.cpp new file mode 100644 index 00000000..d2ca6a15 --- /dev/null +++ b/src/atom/components/configor.cpp @@ -0,0 +1,209 @@ +/* + * configor.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-4-30 + +Description: Configor + +**************************************************/ + +#include "configor.hpp" + +#include +#include +#include +#include +#if ENABLE_FASTHASH +#include "emhash/hash_table8.hpp" +#else +#include +#endif +#include "atom/utils/string.hpp" + +#include "atom/log/loguru.hpp" + +namespace fs = std::filesystem; + +class ConfigManagerImpl { +public: + mutable std::shared_mutex rw_mutex_; + json config_; +}; + +ConfigManager::ConfigManager() : m_impl(std::make_unique()) { + if (loadFromFile("config.json")) { + DLOG_F(INFO, "Config loaded successfully."); + } +} + +ConfigManager::~ConfigManager() { saveToFile("config.json"); } + +std::shared_ptr ConfigManager::createShared() { + static std::shared_ptr instance = + std::make_shared(); + return instance; +} + +std::unique_ptr ConfigManager::createUnique() { + return std::make_unique(); +} + +bool ConfigManager::loadFromFile(const fs::path& path) { + std::shared_lock lock(m_impl->rw_mutex_); + try { + std::ifstream ifs(path); + if (!ifs || ifs.peek() == std::ifstream::traits_type::eof()) { + LOG_F(ERROR, "Failed to open file: {}", path.string()); + return false; + } + json j = json::parse(ifs); + if (j.empty()) { + return false; + } + + mergeConfig(j); + return true; + } catch (const json::exception& e) { + LOG_F(ERROR, "Failed to parse file: {}, error message: {}", path.string(), + e.what()); + } catch (const std::exception& e) { + LOG_F(ERROR, "Failed to load config file: {}, error message: {}", path.string(), + e.what()); + } + return false; +} + +bool ConfigManager::loadFromDir(const fs::path& dir_path, bool recursive) { + std::shared_lock lock(m_impl->rw_mutex_); + try { + for (const auto& entry : fs::directory_iterator(dir_path)) { + if (entry.is_regular_file() && + entry.path().extension() == ".json") { + loadFromFile(entry.path()); + } else if (recursive && entry.is_directory()) { + loadFromDir(entry.path(), true); + } + } + } catch (const std::exception& e) { + LOG_F(ERROR, "Failed to load config file from: {}, error message: {}", + dir_path.string(), e.what()); + return false; + } + return true; +} + +std::optional ConfigManager::getValue(const std::string& key_path) const { + std::shared_lock lock(m_impl->rw_mutex_); + const json* p = &m_impl->config_; + for (const auto& key : key_path | std::views::split('/')) { + if (p->is_object() && + p->contains(std::string(key.begin(), key.end()))) { + p = &(*p)[std::string(key.begin(), key.end())]; + } else { + return std::nullopt; + } + } + return *p; +} + +bool ConfigManager::setValue(const std::string& key_path, const json& value) { + std::unique_lock lock(m_impl->rw_mutex_); + json* p = &m_impl->config_; + std::vector keys; + for (auto sub_range : key_path | std::views::split('/')) { + keys.emplace_back(sub_range.data(), sub_range.size()); + } + + for (auto it = keys.begin(); it != keys.end(); ++it) { + if (it + 1 == keys.end()) { + (*p)[*it] = value; + return true; + } + + if (!p->is_object()) { + return false; + } + + if (!p->contains(*it)) { + (*p)[*it] = json::object(); + } + + p = &(*p)[*it]; + } + + return true; +} + +bool ConfigManager::deleteValue(const std::string& key_path) { + std::unique_lock lock(m_impl->rw_mutex_); + std::vector keys; + for (auto sub_range : key_path | std::views::split('/')) { + keys.emplace_back(sub_range.data(), sub_range.size()); + } + json* p = &m_impl->config_; + for (auto it = keys.begin(); it != keys.end(); ++it) { + if (it + 1 == keys.end()) { // Last key + if (p->contains(*it)) { + p->erase(*it); + return true; + } + return false; + } + if (!p->contains(*it) || !(*p)[*it].is_object()) { + return false; + } + p = &(*p)[*it]; + } + return false; +} + +bool ConfigManager::hasValue(const std::string& key_path) const { + return getValue(key_path).has_value(); +} + +bool ConfigManager::saveToFile(const fs::path& file_path) const { + std::unique_lock lock(m_impl->rw_mutex_); + std::ofstream ofs(file_path); + if (!ofs) { + LOG_F(ERROR, "Failed to open file: {}", file_path.string()); + return false; + } + try { + ofs << m_impl->config_.dump(4); + ofs.close(); + return true; + } catch (const std::exception& e) { + LOG_F(ERROR, "Failed to save config to file: {}, error message: {}", + file_path.string(), e.what()); + return false; + } +} + +void ConfigManager::tidyConfig() { + std::unique_lock lock(m_impl->rw_mutex_); + json updated_config; + for (const auto& [key, value] : m_impl->config_.items()) { + json* p = &updated_config; + for (auto sub_key : key | std::views::split('/')) { + if (!p->contains(std::string(sub_key.begin(), sub_key.end()))) { + (*p)[std::string(sub_key.begin(), sub_key.end())] = + json::object(); + } + p = &(*p)[std::string(sub_key.begin(), sub_key.end())]; + } + *p = value; + } + m_impl->config_ = std::move(updated_config); +} + +void ConfigManager::mergeConfig(const json& src) { + m_impl->config_.merge_patch(src); +} + +void ConfigManager::clearConfig() { m_impl->config_.clear(); } + diff --git a/src/atom/components/configor.hpp b/src/atom/components/configor.hpp new file mode 100644 index 00000000..3f95a574 --- /dev/null +++ b/src/atom/components/configor.hpp @@ -0,0 +1,199 @@ +/* + * configor.cpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-4-4 + +Description: Configor + +**************************************************/ + +#ifndef ATOM_COMPONENT_CONFIG_HPP +#define ATOM_COMPONENT_CONFIG_HPP + +#include +#include +#include +namespace fs = std::filesystem; + +#include "error/error_code.hpp" + +#include "atom/type/json.hpp" +using json = nlohmann::json; + +#define GetIntConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() + +#define GetFloatConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() + +#define GetBoolConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() + +#define GetDoubleConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() + +#define GetStringConfig(path) \ + GetPtr("lithium.config") \ + .value() \ + ->getValue(path) \ + .value() \ + .get() + +class ConfigManagerImpl; + +class ConfigManager { +public: + /** + * @brief 构造函数 + * + * Constructor. + */ + ConfigManager(); + + /** + * @brief 析构函数 + * + * Destructor. + */ + ~ConfigManager(); + + // ------------------------------------------------------------------- + // Common methods + // ------------------------------------------------------------------- + + /** + * @brief 创建ConfigManager的共享指针,但是全局唯一 + * + * Create a shared pointer of ConfigManager. But global only + */ + static std::shared_ptr createShared(); + + static std::unique_ptr createUnique(); + + // ------------------------------------------------------------------- + // Config methods + // ------------------------------------------------------------------- + + /** + * @brief 获取一个配置项的值 + * + * Get the value of a configuration item. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + * @return json 配置项对应的值,如果键不存在则返回 nullptr + */ + [[nodiscard("config value should not be ignored!")]] std::optional + getValue(const std::string& key_path) const; + + /** + * @brief 添加或更新一个配置项 + * + * Add or update a configuration item. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + * @param value 配置项的值,使用 JSON 格式进行表示 + * @return bool 成功返回 true,失败返回 false + */ + bool setValue(const std::string& key_path, const json& value); + /** + * @brief 删除一个配置项 + * + * Delete a configuration item. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + */ + + bool deleteValue(const std::string& key_path); + + /** + * @brief 判断一个配置项是否存在 + * + * Determine if a configuration item exists. + * + * @param key_path 配置项的键路径,使用斜杠 / 进行分隔,如 + * "database/username" + * @return bool 存在返回 true,不存在返回 false + */ + [[nodiscard("status of the value should not be ignored")]] bool hasValue( + const std::string& key_path) const; + + /** + * @brief 从指定文件中加载JSON配置,并与原有配置进行合并 + * + * Load JSON configuration from the specified file and merge with the + * existing configuration. + * + * @param path 配置文件路径 + */ + bool loadFromFile(const fs::path& path); + + /** + * @brief 加载指定目录下的所有JSON配置文件 + * + * Load all JSON configuration files in the specified directory. + * + * @param dir_path 配置文件所在目录的路径 + */ + bool loadFromDir(const fs::path& dir_path, bool recursive = false); + + /** + * @brief 将当前配置保存到指定文件 + * + * Save the current configuration to the specified file. + * + * @param file_path 目标文件路径 + */ + bool saveToFile(const fs::path& file_path) const; + + /** + * @brief 清理配置项 + * + * Clean up configuration items. + */ + void tidyConfig(); + + /** + * @brief 清除所有配置(测试用) + * + * Clear all of the configurations, only used for test + */ + void clearConfig(); + +private: + std::unique_ptr m_impl; + + /** + * @brief 将 JSON 配置合并到当前配置中 + * + * Merge JSON configuration to the current configuration. + * + * @param j JSON 配置 + */ + void mergeConfig(const json& j); +}; + +#endif diff --git a/src/atom/components/dispatch.cpp b/src/atom/components/dispatch.cpp new file mode 100644 index 00000000..7be45524 --- /dev/null +++ b/src/atom/components/dispatch.cpp @@ -0,0 +1,59 @@ +#include "dispatch.hpp" + +void CommandDispatcher::addAlias(const std::string& name, + const std::string& alias) { + auto it = commands.find(name); + if (it != commands.end()) { + it->second.aliases.insert(alias); + commands[alias] = it->second; + groupMap[alias] = groupMap[name]; + } +} + +void CommandDispatcher::addGroup(const std::string& name, + const std::string& group) { + groupMap[name] = group; +} + +void CommandDispatcher::setTimeout(const std::string& name, + std::chrono::milliseconds timeout) { + timeoutMap[name] = timeout; +} + +void CommandDispatcher::clearCache() { cacheMap.clear(); } + +void CommandDispatcher::removeCommand(const std::string& name) { + commands.erase(name); + groupMap.erase(name); + timeoutMap.erase(name); + cacheMap.erase(name); +} + +std::vector CommandDispatcher::getCommandsInGroup( + const std::string& group) const { + std::vector result; + for (const auto& pair : groupMap) { + if (pair.second == group) { + result.push_back(pair.first); + } + } + return result; +} + +std::string CommandDispatcher::getCommandDescription( + const std::string& name) const { + auto it = commands.find(name); + if (it != commands.end()) { + return it->second.description; + } + return ""; +} + +std::unordered_set CommandDispatcher::getCommandAliases( + const std::string& name) const { + auto it = commands.find(name); + if (it != commands.end()) { + return it->second.aliases; + } + return {}; +} \ No newline at end of file diff --git a/src/atom/components/dispatch.hpp b/src/atom/components/dispatch.hpp new file mode 100644 index 00000000..1c05edd2 --- /dev/null +++ b/src/atom/components/dispatch.hpp @@ -0,0 +1,130 @@ +#ifndef ATOM_COMMAND_DISPATCH_HPP +#define ATOM_COMMAND_DISPATCH_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if ENABLE_FASTHASH +#include "emhash/hash_set8.hpp" +#include "emhash/hash_table8.hpp" +#else +#include +#include +#endif +#include +#include + +#include "atom/experiment/noncopyable.hpp" +#include "atom/type/pointer.hpp" + +#include "proxy.hpp" + +class CommandDispatcher : public NonCopyable { +public: + template + void registerCommand( + const std::string& name, const std::string& group, + const std::string& description, std::function func, + std::optional> precondition = std::nullopt, + std::optional> postcondition = std::nullopt); + + template + void registerCommand(const std::string& name, Callable&& func, + const std::string& group = "", + const std::string& description = ""); + + template + void registerCommand(const std::string& name, Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = ""); + + template + void registerCommand(const std::string& name, Ret (Class::*func)(Args...), + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = ""); + + template + void registerCommand(const std::string& name, + Ret (Class::*func)(Args...) const, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = ""); + + template + void registerCommand(const std::string& name, + Ret (Class::*func)(Args...) noexcept, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = ""); + + template + void registerCommand(const std::string& name, Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = ""); + + void addAlias(const std::string& name, const std::string& alias); + + void addGroup(const std::string& name, const std::string& group); + + void setTimeout(const std::string& name, std::chrono::milliseconds timeout); + + template + std::any dispatch(const std::string& name, Args&&... args); + + void clearCache(); + + void removeCommand(const std::string& name); + + std::vector getCommandsInGroup(const std::string& group) const; + + std::string getCommandDescription(const std::string& name) const; + +#if ENABLE_FASTHASH + emhash::HashSet getCommandAliases( + const std::string& name) const; +#else + std::unordered_set getCommandAliases( + const std::string& name) const; +#endif + +private: + struct Command { + std::vector&)>> + funcs; + std::vector funcs_info; + std::string description; +#if ENABLE_FASTHASH + emhash::HashSet aliases; +#else + std::unordered_set aliases; +#endif + std::optional> precondition; + std::optional> postcondition; + }; + +#if ENABLE_FASTHASH + emhash8::HashMap commands; + emhash8::HashMap groupMap; + emhash8::HashMap timeoutMap; + emhash8::HashMap cacheMap; +#else + std::unordered_map commands; + std::unordered_map groupMap; + std::unordered_map timeoutMap; + std::unordered_map cacheMap; +#endif +}; + +#include "dispatch.inl" + +#endif diff --git a/src/atom/components/dispatch.inl b/src/atom/components/dispatch.inl new file mode 100644 index 00000000..7c82f308 --- /dev/null +++ b/src/atom/components/dispatch.inl @@ -0,0 +1,175 @@ +#ifndef ATOM_COMPONENT_DISPATCH_INL +#define ATOM_COMPONENT_DISPATCH_INL + +#include "dispatch.hpp" + +#include "atom/error/exception.hpp" +#include "atom/type/abi.hpp" + +template +void CommandDispatcher::registerCommand( + const std::string& name, const std::string& group, + const std::string& description, std::function func, + std::optional> precondition = std::nullopt, + std::optional> postcondition = std::nullopt) { + auto it = commands.find(name); + if (it == commands.end()) { + Command cmd{{ProxyFunction(std::move(func))}, + description, + {}, + std::move(precondition), + std::move(postcondition)}; + commands[name] = std::move(cmd); + groupMap[name] = group; + } else { + it->second.funcs.emplace_back(ProxyFunction(std::move(func))); + } +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Callable&& func, + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function(std::forward(func))); +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function([func](Args... args) { + return func(std::forward(args)...); + })); +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Ret (Class::*func)(Args...), + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function([instance, func](Args... args) { + return std::invoke(func, instance.get(), + std::forward(args)...); + })); +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Ret (Class::*func)(Args...) const, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function([instance, func](Args... args) { + return std::invoke(func, instance.get(), + std::forward(args)...); + })); +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Ret (Class::*func)(Args...) noexcept, + const PointerSentinel& instance, + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function([instance, func](Args... args) { + return std::invoke(func, instance.get(), + std::forward(args)...); + })); +} + +template +void CommandDispatcher::registerCommand(const std::string& name, + Ret (*func)(Args...), + const std::string& group = "", + const std::string& description = "") { + registerCommand(name, group, description, + std::function([func](Args... args) { + return func(std::forward(args)...); + })); +} + +template +std::any CommandDispatcher::dispatch(const std::string& name, Args&&... args) { + auto it = commands.find(name); + if (it == commands.end()) { + for (const auto& cmd : commands) { + for (const auto& alias : cmd.second.aliases) { + if (alias == name) { +#if ENABLE_DEBUG + std::cout << "Command '" << name + << "' not found, did you mean '" << cmd.first + << "'?\n"; +#endif + it = commands.find(cmd.first); + } + } + } + throw std::runtime_error("Unknown command: " + name); + } + + const auto& cmd = it->second; + if (cmd.precondition.has_value() && !cmd.precondition.value()()) { + throw std::runtime_error("Precondition failed for command: " + name); + } + + auto argsTuple = std::make_tuple(std::forward(args)...); + std::vector argsVec; + argsVec.reserve(sizeof...(Args)); + std::apply( + [&argsVec](auto&&... args) { + ((argsVec.emplace_back(std::forward(args))), ...); + }, + argsTuple); + + auto cacheIt = cacheMap.find(name); + if (cacheIt != cacheMap.end()) { + return cacheIt->second; + } + + auto timeoutIt = timeoutMap.find(name); + if (timeoutIt != timeoutMap.end()) { + auto future = std::async(std::launch::async, [&]() { + for (const auto& func : cmd.funcs) { + try { + // Max: 匹配找到的第一个,但是理论上来说不会有重复 + return func(argsVec); + } catch (const std::bad_any_cast&) { + // 参数类型不匹配,尝试下一个重载函数 + } + } + return std::any{}; + }); + if (future.wait_for(timeoutIt->second) == std::future_status::timeout) { + throw std::runtime_error("Command timed out: " + name); + } + auto result = future.get(); + cacheMap[name] = result; + if (cmd.postcondition.has_value()) + cmd.postcondition.value()(); + return result; + } else { + for (const auto& func : cmd.funcs) { + try { + auto result = func(argsVec); + cacheMap[name] = result; + if (cmd.postcondition.has_value()) + cmd.postcondition.value()(); + return result; + } catch (const std::bad_any_cast&) { + // 参数类型不匹配,尝试下一个重载函数 + } + } + throw std::runtime_error("No matching overload found for command: " + + name); + } +} + +#endif \ No newline at end of file diff --git a/src/atom/components/proxy.hpp b/src/atom/components/proxy.hpp new file mode 100644 index 00000000..da804b94 --- /dev/null +++ b/src/atom/components/proxy.hpp @@ -0,0 +1,112 @@ +/* + * proxy.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-3-1 + +Description: Proxy Function Implementation + +**************************************************/ + +#ifndef ATOM_COMPONENT_PROXY_HPP +#define ATOM_COMPONENT_PROXY_HPP + +#include +#include +#include +#include +#include +#include + +template +struct ProxyFunction { + std::function func; + static constexpr std::size_t N = sizeof...(Args); + + ProxyFunction(std::function func) : func(std::move(func)) {} + + std::any operator()(const std::vector& args) { + if (args.size() != N) + throw std::runtime_error("Number of arguments does not match"); + return call(args, std::make_index_sequence()); + } + +private: + template + std::any call(const std::vector& args, + std::index_sequence) { + if constexpr (std::is_void_v) { + std::invoke(func, + std::any_cast>(args[Is])...); + return {}; + } else { + return std::make_any(std::invoke( + func, std::any_cast>(args[Is])...)); + } + } +}; + +template +struct ProxyFunction { + using MemFuncPtr = Ret (Class::*)(Args...); + MemFuncPtr memFunc; + static constexpr std::size_t N = sizeof...(Args) + 1; + + ProxyFunction(MemFuncPtr func) : memFunc(func) {} + + std::any operator()(const std::vector& args) { + if (args.size() != N) + throw std::runtime_error("Number of arguments does not match"); + return call(args, std::make_index_sequence()); + } + +private: + template + std::any call(const std::vector& args, + std::index_sequence) { + if constexpr (std::is_void_v) { + (std::any_cast(args[0]).*memFunc)( + std::any_cast>(args[Is + 1])...); + return {}; + } else { + return std::make_any((std::any_cast(args[0]).*memFunc)( + std::any_cast>(args[Is + 1])...)); + } + } +}; + +template +struct ProxyFunction { + using ConstMemFuncPtr = Ret (Class::*)(Args...) const; + ConstMemFuncPtr memFunc; + static constexpr std::size_t N = sizeof...(Args) + 1; + + ProxyFunction(ConstMemFuncPtr func) : memFunc(func) {} + + std::any operator()(const std::vector& args) { + if (args.size() != N) + throw std::runtime_error("Number of arguments does not match"); + return call(args, std::make_index_sequence()); + } + +private: + template + std::any call(const std::vector& args, + std::index_sequence) { + if constexpr (std::is_void_v) { + (std::any_cast(args[0]).*memFunc)( + std::any_cast>(args[Is + 1])...); + return {}; + } else { + return std::make_any( + (std::any_cast(args[0]).*memFunc)( + std::any_cast>(args[Is + 1])...)); + } + } +}; + +#endif diff --git a/src/atom/components/templates/shared.cpp b/src/atom/components/templates/shared.cpp new file mode 100644 index 00000000..35aa75c4 --- /dev/null +++ b/src/atom/components/templates/shared.cpp @@ -0,0 +1,91 @@ +#include "shared.hpp" + +#include "atom/error/exception.hpp" +#include "atom/log/loguru.hpp" +#include "atom/server/message_bus.hpp" +#include "atom/type/message.hpp" +#include "atom/utils/string.hpp" + +using namespace Atom::Error; + +SharedComponent::SharedComponent(const std::string &name) : Component(name) { + m_handleFunction = [shared_this = + shared_from_this()](const std::any &message) { + LOG_F(INFO, "SharedComponent::handleFunction"); + if (message.has_value()) { + if (message.type() == typeid(std::shared_ptr)) { + shared_this->dispatch( + "handleVoid", + std::any_cast>(message)); + } else if (message.type() == + typeid(std::shared_ptr)) { + shared_this->dispatch( + "handleNumber", + std::any_cast>(message)); + } else if (message.type() == typeid(std::shared_ptr)) { + shared_this->dispatch( + "handleText", + std::any_cast>(message)); + } else if (message.type() == + typeid(std::shared_ptr)) { + shared_this->dispatch( + "handleBoolean", + std::any_cast>(message)); + } else if (message.type() == + typeid(std::shared_ptr)) { + shared_this->dispatch( + "handleParams", + std::any_cast>(message)); + } else { + LOG_F(ERROR, + "SharedComponent::handleFunction: unknown message type"); + THROW_EXCEPTION( + "SharedComponent::handleFunction: unknown message type"); + } + } else { + LOG_F(ERROR, "SharedComponent::handleFunction: message is null"); + THROW_EXCEPTION("SharedComponent::handleFunction: message is null"); + } + }; + + registerCommand("handleNumber", handleNumberMessage); + registerCommand("handleText", handleTextMessage); + registerCommand("handleBoolean", handleBooleanMessage); + registerCommand("handleVoid", handleVoidMessage); +} + +SharedComponent::~SharedComponent() {} + +bool SharedComponent::initialize() { return true; } + +bool SharedComponent::destroy() { return true; } + +void SharedComponent::handleVoidMessage( + const std::shared_ptr &message) { + LOG_F(INFO, "SharedComponent::handleVoid"); + auto name = message->name(); + try + { + + } + catch(const std::exception& e) + { + std::cerr << e.what() << '\n'; + } + +} + +void SharedComponent::handleTextMessage( + const std::shared_ptr &message) { + LOG_F(INFO, "SharedComponent::handleText"); +} + +void SharedComponent::handleBooleanMessage( + const std::shared_ptr &message) { + LOG_F(INFO, "SharedComponent::handleBoolean"); +} + +void SharedComponent::handleNumberMessage( + const std::shared_ptr &message) { + LOG_F(INFO, "SharedComponent::handleNumber"); +} \ No newline at end of file diff --git a/src/atom/components/templates/shared.hpp b/src/atom/components/templates/shared.hpp new file mode 100644 index 00000000..ba51cb50 --- /dev/null +++ b/src/atom/components/templates/shared.hpp @@ -0,0 +1,24 @@ +#ifndef ATOM_COMPONENT_SHARED_HPP +#define ATOM_COMPONENT_SHARED_HPP + +#include "atom/components/component.hpp" + +#include "atom/type/message.hpp" + +class SharedComponent : public Component { + explicit SharedComponent(const std::string &name); + virtual ~SharedComponent() override; + + virtual bool initialize() override; + virtual bool destroy() override; + + void handleVoidMessage(const std::shared_ptr &message); + void handleTextMessage(const std::shared_ptr &message); + void handleNumberMessage(const std::shared_ptr &message); + void handleBooleanMessage(const std::shared_ptr &message); + +private: + std::function m_handleFunction; +}; + +#endif \ No newline at end of file diff --git a/src/atom/components/templates/shared_component.cpp b/src/atom/components/templates/shared_component.cpp deleted file mode 100644 index a992b348..00000000 --- a/src/atom/components/templates/shared_component.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include "shared_component.hpp" - -#include "atom/log/loguru.hpp" -#include "atom/server/message_bus.hpp" -#include "atom/utils/string.hpp" - -//#include "config.h" - -#include "macro.hpp" - -#define GET_ARGUMENT_S(command, type, name) \ - if (!args.get(#name).has_value()) { \ - this->SendTextMessage(#command, \ - fmt::format("Missing arguments: {}", #name)); \ - return; \ - } \ - type name = args.get(#name).value(); - -SharedComponent::SharedComponent(const std::string &name) : Component(name) { - DLOG_F(INFO, "Shared component is created."); -} - -SharedComponent::~SharedComponent() { - DLOG_F(INFO, "Shared component is destroyed."); -} - -bool SharedComponent::initialize() { - Component::initialize(); - DLOG_F(INFO, "Shared component is initializing ..."); - - m_handleFunction = [this](std::shared_ptr message) { - if (message) { - switch (message->type()) { - case Message::Type::kText: { - auto textMessage = - std::dynamic_pointer_cast(message); - if (textMessage) { - DLOG_F(INFO, "Text message is received: {}", - textMessage->value()); - m_handleText->match(textMessage->name(), textMessage); - } - break; - } - case Message::Type::kNumber: { - auto numberMessage = - std::dynamic_pointer_cast(message); - if (numberMessage) { - DLOG_F(INFO, "Number message is received: {}", - numberMessage->value()); - m_handleNumber->match(numberMessage->name(), - numberMessage); - } - } - case Message::Type::kBoolean: { - auto booleanMessage = - std::dynamic_pointer_cast(message); - if (booleanMessage) { - DLOG_F(INFO, "Boolean message is received: {}", - booleanMessage->value()); - m_handleBoolean->match(booleanMessage->name(), - booleanMessage); - } - break; - } - case Message::Type::kParams: { - auto paramsMessage = - std::dynamic_pointer_cast(message); - if (paramsMessage) { - DLOG_F(INFO, "Params message is received: {}", - paramsMessage->value().toJson()); - m_handleParams->match(paramsMessage->name(), - paramsMessage); - } - break; - } - default: - break; - } - } - }; - - // Initialize message handlers - m_handleVoid = std::make_unique< - Atom::Utils::StringSwitch &>>(); - m_handleText = std::make_unique< - Atom::Utils::StringSwitch &>>(); - m_handleNumber = std::make_unique< - Atom::Utils::StringSwitch &>>(); - m_handleBoolean = std::make_unique< - Atom::Utils::StringSwitch &>>(); - m_handleParams = std::make_unique< - Atom::Utils::StringSwitch &>>(); - - DLOG_F(INFO, "Shared component is initialized"); - return true; -} - -bool SharedComponent::destroy() { - Component::destroy(); - return true; } - -bool SharedComponent::NeedMessageBus() { return true; } - -bool SharedComponent::InjectMessageBus( - std::shared_ptr messageBus) { - m_MessageBus = messageBus; - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - DLOG_F(INFO, "Message bus is injected."); - return true; -} - -bool SharedComponent::ConnectMessageBus() { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - m_MessageBus->Subscribe>("lithium.app", - m_handleFunction); - DLOG_F(INFO, "Message bus is connected."); - return true; -} - -bool SharedComponent::DisconnectMessageBus() { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - // There is a very severe bug in the message bus. - // It will cause a crash when the message bus is disconnected. - // How should we identify which connection is the one we want to disconnect? - m_MessageBus->Unsubscribe>("lithium.app", - m_handleFunction); - DLOG_F(INFO, "Message bus is disconnected."); - return true; -} - -bool SharedComponent::SendTextMessage(const std::string &message, - const std::string &text) { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - m_MessageBus->Publish>( - message, - std::make_shared(message, text, "lithium.app", getName())); - return true; -} - -bool SharedComponent::SendNumberMessage(const std::string &message, - const double &number) { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - m_MessageBus->Publish>( - message, std::make_shared(message, number, "lithium.app", - getName())); - return true; -} - -bool SharedComponent::SendBooleanMessage(const std::string &message, - const bool &boolean) { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - m_MessageBus->Publish>( - message, std::make_shared(message, boolean, - "lithium.app", getName())); - return true; -} - -bool SharedComponent::SendParamsMessage(const std::string &message, - const Args ¶ms) { - if (!m_MessageBus) { - LOG_F(ERROR, "Message bus is null."); - return false; - } - m_MessageBus->Publish>( - message, std::make_shared(message, params, "lithium.app", - getName())); - return true; -} diff --git a/src/atom/components/templates/shared_component.hpp b/src/atom/components/templates/shared_component.hpp deleted file mode 100644 index f2199070..00000000 --- a/src/atom/components/templates/shared_component.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "atom/components/component.hpp" -#include "atom/server/message_bus.hpp" -#include "atom/type/message.hpp" -#include "atom/utils/switch.hpp" - -class SharedComponent : public Component { -public: - explicit SharedComponent(const std::string &name); - ~SharedComponent(); - - // ------------------------------------------------------------------- - // Common methods - // ------------------------------------------------------------------- - - virtual bool initialize() override; - virtual bool destroy() override; - - // ------------------------------------------------------------------- - // Message methods - // ------------------------------------------------------------------- - - bool NeedMessageBus(); - bool InjectMessageBus(std::shared_ptr messageBus); - bool ConnectMessageBus(); - bool DisconnectMessageBus(); - bool SendTextMessage(const std::string &message, const std::string &text); - bool SendNumberMessage(const std::string &message, const double &number); - bool SendBooleanMessage(const std::string &message, const bool &boolean); - bool SendParamsMessage(const std::string &message, const Args ¶ms); - - // ------------------------------------------------------------------- - // Handbler methods - // ------------------------------------------------------------------- - - void SetHandleFunction( - std::function)> handleFunction) { - m_handleFunction = handleFunction; - } - -private: - // This is a little bit hacky, but it works. - std::shared_ptr m_MessageBus; - - std::function)> m_handleFunction; - - // Message handlers - std::unique_ptr< - Atom::Utils::StringSwitch &>> - m_handleVoid; - std::unique_ptr< - Atom::Utils::StringSwitch &>> - m_handleText; - std::unique_ptr< - Atom::Utils::StringSwitch &>> - m_handleNumber; - std::unique_ptr< - Atom::Utils::StringSwitch &>> - m_handleBoolean; - std::unique_ptr< - Atom::Utils::StringSwitch &>> - m_handleParams; -}; \ No newline at end of file diff --git a/src/atom/components/var.hpp b/src/atom/components/var.hpp new file mode 100644 index 00000000..d481c590 --- /dev/null +++ b/src/atom/components/var.hpp @@ -0,0 +1,114 @@ +#ifndef ATOM_COMPONENT_VAR_HPP +#define ATOM_COMPONENT_VAR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if ENABLE_FASTHASH +#include "emhash/hash_table8.hpp" +#else +#include +#endif + +#include "atom/error/exception.hpp" +#include "atom/experiment/noncopyable.hpp" +#include "atom/type/trackable.hpp" +#include "atom/utils/cstring.hpp" + +class VariableManager : public NonCopyable { +public: + template + void addVariable(const std::string& name, T initialValue, + const std::string& description = "", + const std::string& alias = "", + const std::string& group = "") { + auto variable = std::make_shared>(std::move(initialValue)); + variables_[name] = {std::move(variable), description, alias, group}; + } + + template + void setRange(const std::string& name, T min, T max) { + if (auto variable = getVariable(name)) { + ranges_[name] = std::make_pair(std::move(min), std::move(max)); + } + } + + void setStringOptions(const std::string& name, + std::vector options) { + if (auto variable = getVariable(name)) { + stringOptions_[name] = std::move(options); + } + } + + template + std::shared_ptr> getVariable(const std::string& name) { + auto it = variables_.find(name); + if (it != variables_.end()) { + try { + return std::any_cast>>( + it->second.variable); + } catch (const std::bad_any_cast& e) { + THROW_EXCEPTION(concat("Type mismatch: ", name)); + } + } + return nullptr; + } + + void setValue(const std::string& name, const char* newValue) { + setValue(name, std::string(newValue)); + } + + template + void setValue(const std::string& name, T newValue) { + if (auto variable = getVariable(name)) { + if constexpr (std::is_arithmetic_v) { + if (ranges_.count(name)) { + auto [min, max] = + std::any_cast>(ranges_[name]); + if (newValue < min || newValue > max) { + THROW_EXCEPTION("Value out of range"); + } + } + } else if constexpr (std::is_same_v) { + if (stringOptions_.count(name)) { + auto& options = stringOptions_[name]; + if (std::find(options.begin(), options.end(), newValue) == + options.end()) { + THROW_EXCEPTION("Invalid string option"); + } + } + } + *variable = std::move(newValue); + } else { + THROW_EXCEPTION("Variable not found"); + } + } + +private: + struct VariableInfo { + std::any variable; + std::string description; + std::string alias; + std::string group; + }; + +#if ENABLE_FASTHASH + emhash8::HashMap variables_; + emhash8::HashMap ranges_; + emhash8::HashMap> stringOptions_; +#else + std::unordered_map variables_; + std::unordered_map ranges_; + std::unordered_map> stringOptions_; +#endif +}; + +#include "var.inl" + +#endif \ No newline at end of file diff --git a/src/atom/components/var.inl b/src/atom/components/var.inl new file mode 100644 index 00000000..7f842f31 --- /dev/null +++ b/src/atom/components/var.inl @@ -0,0 +1,73 @@ +#ifndef ATOM_COMPONENT_VAR_INL +#define ATOM_COMPONENT_VAR_INL + +#include "var.hpp" + +template +void VariableManager::addVariable(const std::string& name, T initialValue, + const std::string& description = "", + const std::string& alias = "", + const std::string& group = "") { + auto variable = std::make_shared>(std::move(initialValue)); + variables_[name] = {std::move(variable), description, alias, group}; +} + +template +void VariableManager::setRange(const std::string& name, T min, T max) { + if (auto variable = getVariable(name)) { + ranges_[name] = std::make_pair(std::move(min), std::move(max)); + } +} + +inline void VariableManager::setStringOptions( + const std::string& name, std::vector options) { + if (auto variable = getVariable(name)) { + stringOptions_[name] = std::move(options); + } +} + +template +std::shared_ptr> VariableManager::getVariable( + const std::string& name) { + auto it = variables_.find(name); + if (it != variables_.end()) { + try { + return std::any_cast>>( + it->second.variable); + } catch (const std::bad_any_cast& e) { + THROW_EXCEPTION(concat("Type mismatch: ", name)); + } + } + return nullptr; +} + +void VariableManager::setValue(const std::string& name, const char* newValue) { + setValue(name, std::string(newValue)); +} + +template +void VariableManager::setValue(const std::string& name, T newValue) { + if (auto variable = getVariable(name)) { + if constexpr (std::is_arithmetic_v) { + if (ranges_.count(name)) { + auto [min, max] = std::any_cast>(ranges_[name]); + if (newValue < min || newValue > max) { + THROW_EXCEPTION("Value out of range"); + } + } + } else if constexpr (std::is_same_v) { + if (stringOptions_.count(name)) { + auto& options = stringOptions_[name]; + if (std::find(options.begin(), options.end(), newValue) == + options.end()) { + THROW_EXCEPTION("Invalid string option"); + } + } + } + *variable = std::move(newValue); + } else { + THROW_EXCEPTION("Variable not found"); + } +} + +#endif \ No newline at end of file diff --git a/src/atom/experiment/iter.hpp b/src/atom/experiment/iter.hpp new file mode 100644 index 00000000..16e60bd0 --- /dev/null +++ b/src/atom/experiment/iter.hpp @@ -0,0 +1,286 @@ +/* + * iter.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-26 + +Description: Some iterators + +**************************************************/ + +#ifndef ATOM_EXPERIMENTAL_ITERATOR_HPP +#define ATOM_EXPERIMENTAL_ITERATOR_HPP + +#include +#include +#include +#include +#include +#include + +#if ENABLE_DEBUG +#include +#endif + +template +class pointer_iterator { +public: + using iterator_category = std::forward_iterator_tag; + using value_type = decltype(&*std::declval()); + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + +private: + IteratorT it_; + +public: + pointer_iterator() = default; + + explicit pointer_iterator(IteratorT it) : it_(std::move(it)) {} + + value_type operator*() const { return &*it_; } + + pointer_iterator& operator++() { + ++it_; + return *this; + } + + pointer_iterator operator++(int) { + pointer_iterator tmp = *this; + ++(*this); + return tmp; + } + + bool operator==(const pointer_iterator& other) const = default; + bool operator!=(const pointer_iterator& other) const = default; +}; + +template +auto make_pointer_range(IteratorT begin, IteratorT end) { + return std::make_pair(pointer_iterator(begin), + pointer_iterator(end)); +} + +template +void process_container(ContainerT& container) { + auto beginIter = std::next(container.begin()); + auto endIter = std::prev(container.end()); + + std::vector> ptrs; + auto ptrPair = make_pointer_range(beginIter, endIter); + for (auto it = ptrPair.first; it != ptrPair.second; ++it) { + ptrs.push_back(*it); + } + + for (auto& ptrOpt : ptrs) { + if (ptrOpt) { + auto ptr = *ptrOpt; +#if ENABLE_DEBUG + std::cout << "pointer addr: " << static_cast(&ptr) + << '\n'; + std::cout << "point to: " << static_cast(ptr) << '\n'; + std::cout << "value: " << *ptr << '\n'; +#endif + container.erase( + std::find(container.begin(), container.end(), *ptr)); + } + } +} + +template +class early_inc_iterator { +public: + using iterator_category = std::output_iterator_tag; + using value_type = void; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + + early_inc_iterator() = default; + explicit early_inc_iterator(I x) : current(x) {} + + early_inc_iterator& operator++() { + ++current; + return *this; + } + + early_inc_iterator operator++(int) { + early_inc_iterator tmp = *this; + ++current; + return tmp; + } + + friend bool operator==(const early_inc_iterator& x, + const early_inc_iterator& y) { + return x.current == y.current; + } + + friend bool operator!=(const early_inc_iterator& x, + const early_inc_iterator& y) { + return !(x == y); + } + + auto operator*() const { return *current; } + +private: + I current{}; +}; + +template +early_inc_iterator make_early_inc_iterator(I x) { + return early_inc_iterator(x); +} + +template +class transform_iterator { +public: + using iterator_category = + typename std::iterator_traits::iterator_category; + using value_type = std::invoke_result_t< + FuncT, typename std::iterator_traits::reference>; + using difference_type = + typename std::iterator_traits::difference_type; + using pointer = value_type*; + using reference = value_type; + +private: + IteratorT it_; + FuncT func_; + +public: + transform_iterator() : it_(), func_() {} + transform_iterator(IteratorT it, FuncT func) : it_(it), func_(func) {} + + reference operator*() const { return func_(*it_); } + pointer operator->() const { return &(operator*()); } + + transform_iterator& operator++() { + ++it_; + return *this; + } + transform_iterator operator++(int) { + transform_iterator tmp = *this; + ++it_; + return tmp; + } + + bool operator==(const transform_iterator& other) const { + return it_ == other.it_; + } + bool operator!=(const transform_iterator& other) const { + return !(*this == other); + } +}; + +template +transform_iterator make_transform_iterator(IteratorT it, + FuncT func) { + return transform_iterator(it, func); +} + +template +class filter_iterator { +public: + using iterator_category = std::forward_iterator_tag; + using value_type = typename std::iterator_traits::value_type; + using difference_type = + typename std::iterator_traits::difference_type; + using pointer = typename std::iterator_traits::pointer; + using reference = typename std::iterator_traits::reference; + +private: + IteratorT it_; + IteratorT end_; + PredicateT pred_; + + void satisfy_predicate() { + while (it_ != end_ && !pred_(*it_)) { + ++it_; + } + } + +public: + filter_iterator() : it_(), end_(), pred_() {} + filter_iterator(IteratorT it, IteratorT end, PredicateT pred) + : it_(it), end_(end), pred_(pred) { + satisfy_predicate(); + } + + reference operator*() const { return *it_; } + pointer operator->() const { return &(operator*()); } + + filter_iterator& operator++() { + ++it_; + satisfy_predicate(); + return *this; + } + + filter_iterator operator++(int) { + filter_iterator tmp = *this; + ++*this; + return tmp; + } + + bool operator==(const filter_iterator& other) const { + return it_ == other.it_; + } + bool operator!=(const filter_iterator& other) const { + return !(*this == other); + } +}; + +template +class reverse_iterator { +public: + using iterator_category = + typename std::iterator_traits::iterator_category; + using value_type = typename std::iterator_traits::value_type; + using difference_type = + typename std::iterator_traits::difference_type; + using pointer = typename std::iterator_traits::pointer; + using reference = typename std::iterator_traits::reference; + +private: + IteratorT current; + +public: + reverse_iterator() : current() {} + explicit reverse_iterator(IteratorT x) : current(x) {} + + IteratorT base() const { return current; } + reference operator*() const { + IteratorT tmp = current; + return *--tmp; + } + pointer operator->() const { return &(operator*()); } + reverse_iterator& operator++() { + --current; + return *this; + } + reverse_iterator operator++(int) { + reverse_iterator tmp = *this; + --current; + return tmp; + } + reverse_iterator& operator--() { + ++current; + return *this; + } + reverse_iterator operator--(int) { + reverse_iterator tmp = *this; + ++current; + return tmp; + } + + bool operator==(const reverse_iterator& x) const { + return current == x.current; + } + bool operator!=(const reverse_iterator& x) const { return !(*this == x); } +}; + +#endif \ No newline at end of file diff --git a/src/atom/type/no_offset_ptr.hpp b/src/atom/type/no_offset_ptr.hpp new file mode 100644 index 00000000..f15368d5 --- /dev/null +++ b/src/atom/type/no_offset_ptr.hpp @@ -0,0 +1,148 @@ +/* + * no_offset_ptr.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-3 + +Description: No Offset Pointer + +**************************************************/ + +#ifndef ATOM_TYPE_NoOffsetPtr_HPP +#define ATOM_TYPE_NoOffsetPtr_HPP + +#include +#include +#include +#include +#include +#include + +template +class UnshiftedPtr { +public: + UnshiftedPtr() { new (&storage) T; } + + UnshiftedPtr(const T& value) { new (&storage) T(value); } + + UnshiftedPtr(const UnshiftedPtr& other) { new (&storage) T(get()); } + + UnshiftedPtr(UnshiftedPtr&& other) { new (&storage) T(std::move(get())); } + + ~UnshiftedPtr() { get().~T(); } + + UnshiftedPtr& operator=(const UnshiftedPtr& other) { + if (this != &other) { + get() = other.get(); + } + return *this; + } + + UnshiftedPtr& operator=(UnshiftedPtr&& other) { + if (this != &other) { + get() = std::move(other.get()); + } + return *this; + } + + T* operator->() { return &get(); } + + const T* operator->() const { return &get(); } + + T& operator*() { return get(); } + + const T& operator*() const { return get(); } + +private: + T& get() { return reinterpret_cast(storage); } + + const T& get() const { return reinterpret_cast(storage); } + + std::aligned_storage_t storage; +}; + +template +class NoOffsetPtr { +public: + constexpr NoOffsetPtr() noexcept = default; + constexpr NoOffsetPtr(std::nullptr_t) noexcept {} + + constexpr explicit NoOffsetPtr(T* ptr) noexcept : ptr_(ptr) {} + + constexpr NoOffsetPtr(const NoOffsetPtr&) noexcept = default; + constexpr NoOffsetPtr& operator=(const NoOffsetPtr&) noexcept = default; + + constexpr NoOffsetPtr(NoOffsetPtr&&) noexcept = default; + constexpr NoOffsetPtr& operator=(NoOffsetPtr&&) noexcept = default; + + constexpr T& operator*() const noexcept { return *ptr_; } + constexpr T* operator->() const noexcept { return ptr_; } + + constexpr explicit operator bool() const noexcept { + return ptr_ != nullptr; + } + + constexpr T* get() const noexcept { return ptr_; } + + constexpr void reset(T* ptr = nullptr) noexcept { ptr_ = ptr; } + + constexpr void swap(NoOffsetPtr& other) noexcept { + std::swap(ptr_, other.ptr_); + } + + NoOffsetPtr& operator++() = delete; + NoOffsetPtr& operator--() = delete; + NoOffsetPtr operator++(int) = delete; + NoOffsetPtr operator--(int) = delete; + NoOffsetPtr& operator+=(std::ptrdiff_t) = delete; + NoOffsetPtr& operator-=(std::ptrdiff_t) = delete; + NoOffsetPtr operator+(std::ptrdiff_t) const = delete; + NoOffsetPtr operator-(std::ptrdiff_t) const = delete; + std::ptrdiff_t operator-(const NoOffsetPtr&) const = delete; + +private: + T* ptr_ = nullptr; +}; + +template +constexpr bool operator==(const NoOffsetPtr& lhs, + const NoOffsetPtr& rhs) noexcept { + return lhs.get() == rhs.get(); +} + +template +constexpr bool operator==(const NoOffsetPtr& lhs, std::nullptr_t) noexcept { + return lhs.get() == nullptr; +} + +template +constexpr bool operator==(std::nullptr_t, const NoOffsetPtr& rhs) noexcept { + return nullptr == rhs.get(); +} + +template +constexpr bool operator!=(const NoOffsetPtr& lhs, + const NoOffsetPtr& rhs) noexcept { + return !(lhs == rhs); +} + +template +constexpr bool operator!=(const NoOffsetPtr& lhs, std::nullptr_t) noexcept { + return !(lhs == nullptr); +} + +template +constexpr bool operator!=(std::nullptr_t, const NoOffsetPtr& rhs) noexcept { + return !(nullptr == rhs); +} + +template +constexpr void swap(NoOffsetPtr& lhs, NoOffsetPtr& rhs) noexcept { + lhs.swap(rhs); +} + +#endif diff --git a/src/atom/type/pointer.hpp b/src/atom/type/pointer.hpp index 67ffdafe..7c1aa05a 100644 --- a/src/atom/type/pointer.hpp +++ b/src/atom/type/pointer.hpp @@ -66,6 +66,27 @@ class PointerSentinel { */ explicit PointerSentinel(T* p) : ptr(p) {} + /** + * @brief Copy constructor. + * + * @param other The other Pointer Sentinel object to copy from. + */ + PointerSentinel(const PointerSentinel& other) + : ptr(std::visit( + [](const auto& p) + -> std::variant, std::unique_ptr, T*> { + if constexpr (std::is_same_v, + std::shared_ptr>) { + return p; + } else if constexpr (std::is_same_v, + std::unique_ptr>) { + return std::make_unique(*p); + } else { + return new T(*p); + } + }, + other.ptr)) {} + /** * @brief Get the raw pointer stored in the variant. * @@ -76,9 +97,9 @@ class PointerSentinel { [](auto&& arg) -> T* { using U = std::decay_t; if constexpr (std::is_pointer_v) { - return arg; // Raw pointer + return arg; // 原始指针 } else { - return arg.get(); // For smart pointers + return arg.get(); // 智能指针 } }, ptr); @@ -97,8 +118,16 @@ class PointerSentinel { [[nodiscard]] auto invoke(Func func, Args&&... args) { static_assert(std::is_member_function_pointer_v, "Func must be a member function pointer"); - T* p = get(); - return (p->*func)(std::forward(args)...); + return std::visit( + [func, &args...](auto&& arg) -> decltype(auto) { + using U = std::decay_t; + if constexpr (std::is_pointer_v) { + return ((*arg).*func)(std::forward(args)...); + } else { + return ((*arg.get()).*func)(std::forward(args)...); + } + }, + ptr); } }; diff --git a/src/atom/type/small_list.hpp b/src/atom/type/small_list.hpp new file mode 100644 index 00000000..d86570b3 --- /dev/null +++ b/src/atom/type/small_list.hpp @@ -0,0 +1,252 @@ +/* + * small_list.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2023-12-17 + +Description: A Small List Implementation + +**************************************************/ + +#ifndef ATOM_TYPE_SMALL_LIST_HPP +#define ATOM_TYPE_SMALL_LIST_HPP + +#include +#include +#include +#include + +template +class small_list { +private: + struct Node { + T data; + Node* prev; + Node* next; + + Node(const T& value) : data(value), prev(nullptr), next(nullptr) {} + }; + + Node* head; + Node* tail; + size_t list_size; + +public: + small_list() : head(nullptr), tail(nullptr), list_size(0) {} + + small_list(std::initializer_list init_list) : small_list() { + for (const auto& value : init_list) { + push_back(value); + } + } + + ~small_list() { clear(); } + + void push_back(const T& value) { + Node* new_node = new Node(value); + if (empty()) { + head = tail = new_node; + } else { + tail->next = new_node; + new_node->prev = tail; + tail = new_node; + } + ++list_size; + } + + void push_front(const T& value) { + Node* new_node = new Node(value); + if (empty()) { + head = tail = new_node; + } else { + head->prev = new_node; + new_node->next = head; + head = new_node; + } + ++list_size; + } + + void pop_back() { + if (!empty()) { + Node* temp = tail; + tail = tail->prev; + if (tail) { + tail->next = nullptr; + } else { + head = nullptr; + } + delete temp; + --list_size; + } + } + + void pop_front() { + if (!empty()) { + Node* temp = head; + head = head->next; + if (head) { + head->prev = nullptr; + } else { + tail = nullptr; + } + delete temp; + --list_size; + } + } + + T& front() { return head->data; } + + const T& front() const { return head->data; } + + T& back() { return tail->data; } + + const T& back() const { return tail->data; } + + bool empty() const { return list_size == 0; } + + size_t size() const { return list_size; } + + void clear() { + while (!empty()) { + pop_front(); + } + } + + class iterator { + public: + using iterator_category = std::bidirectional_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = T*; + using reference = T&; + + iterator(Node* ptr = nullptr) : node_ptr(ptr) {} + + iterator& operator++() { + node_ptr = node_ptr->next; + return *this; + } + + iterator operator++(int) { + iterator temp = *this; + ++(*this); + return temp; + } + + iterator& operator--() { + node_ptr = node_ptr->prev; + return *this; + } + + iterator operator--(int) { + iterator temp = *this; + --(*this); + return temp; + } + + bool operator==(const iterator& other) const { + return node_ptr == other.node_ptr; + } + + bool operator!=(const iterator& other) const { + return !(*this == other); + } + + T& operator*() const { return node_ptr->data; } + + T* operator->() const { return &(node_ptr->data); } + + Node* node_ptr; + }; + + iterator begin() { return iterator(head); } + + iterator end() { return iterator(nullptr); } + + void insert(iterator pos, const T& value) { + if (pos == begin()) { + push_front(value); + } else if (pos == end()) { + push_back(value); + } else { + Node* new_node = new Node(value); + Node* prev_node = pos.node_ptr->prev; + new_node->prev = prev_node; + new_node->next = pos.node_ptr; + prev_node->next = new_node; + pos.node_ptr->prev = new_node; + ++list_size; + } + } + + iterator erase(iterator pos) { + if (pos == begin()) { + pop_front(); + return begin(); + } else if (pos == --end()) { + pop_back(); + return end(); + } else { + Node* prev_node = pos.node_ptr->prev; + Node* next_node = pos.node_ptr->next; + prev_node->next = next_node; + next_node->prev = prev_node; + delete pos.node_ptr; + --list_size; + return iterator(next_node); + } + } + + void remove(const T& value) { + for (auto it = begin(); it != end();) { + if (*it == value) { + it = erase(it); + } else { + ++it; + } + } + } + + void unique() { + for (auto it = begin(); it != end();) { + auto next_it = std::next(it); + if (next_it != end() && *it == *next_it) { + it = erase(next_it); + } else { + ++it; + } + } + } + + void sort() { + if (size() <= 1) { + return; + } + small_list temp; + while (!empty()) { + auto it = begin(); + T min_val = *it; + for (auto curr = ++begin(); curr != end(); ++curr) { + if (*curr < min_val) { + min_val = *curr; + it = curr; + } + } + temp.push_back(min_val); + erase(it); + } + swap(temp); + } + + void swap(small_list& other) { + std::swap(head, other.head); + std::swap(tail, other.tail); + std::swap(list_size, other.list_size); + } +}; + +#endif // ATOM_TYPE_SMALL_LIST_HPP \ No newline at end of file diff --git a/src/atom/type/trackable.hpp b/src/atom/type/trackable.hpp new file mode 100644 index 00000000..30382ac9 --- /dev/null +++ b/src/atom/type/trackable.hpp @@ -0,0 +1,142 @@ +#ifndef ATOM_TYPE_TRACKABLE_HPP +#define ATOM_TYPE_TRACKABLE_HPP + +#include +#include +#include +#include +#include + +#include "atom/error/exception.hpp" +#include "atom/utils/cstring.hpp" + +/** + * @brief A class template for creating trackable objects that notify observers + * when their value changes. + * + * @tparam T The type of the value being tracked. + */ +template +class Trackable { +public: + /** + * @brief Constructor to initialize the trackable object with an initial + * value. + * + * @param initialValue The initial value of the trackable object. + */ + explicit Trackable(T initialValue) + : value_(std::move(initialValue)), notifyDeferred_(false) {} + + /** + * @brief Subscribe a callback function to be called when the value changes. + * + * @param onChange The callback function to be called when the value + * changes. It takes two const references: the old value and the new value. + */ + void subscribe(std::function onChange) { + std::scoped_lock lock(mutex_); + observers_.emplace_back(std::move(onChange)); + } + + /** + * @brief Unsubscribe all observer functions. + */ + void unsubscribeAll() { + std::scoped_lock lock(mutex_); + observers_.clear(); + } + + /** + * @brief Overloaded assignment operator to update the value and notify + * observers. + * + * @param newValue The new value to be assigned. + * @return Trackable& Reference to the trackable object. + */ + Trackable& operator=(T newValue) { + std::scoped_lock lock(mutex_); + if (value_ != newValue) { + T oldValue = std::exchange(value_, std::move(newValue)); + if (!notifyDeferred_) { + notifyObservers(oldValue, value_); + } + } + return *this; + } + + /** + * @brief Control whether notifications are deferred or not. + * + * @param defer If true, notifications will be deferred until + * deferNotifications(false) is called. + */ + void deferNotifications(bool defer) { + std::scoped_lock lock(mutex_); + notifyDeferred_ = defer; + if (!defer) { + notifyObservers(std::exchange(lastOldValue_, value_), value_); + } + } + + /** + * @brief Overloaded += operator to increment the value and notify + * observers. + * + * @param rhs The value to be added. + * @return Trackable& Reference to the trackable object. + */ + Trackable& operator+=(const T& rhs) { + std::scoped_lock lock(mutex_); + T newValue = value_ + rhs; + if (value_ != newValue) { + T oldValue = std::exchange(value_, std::move(newValue)); + if (!notifyDeferred_) { + notifyObservers(oldValue, value_); + } + } + return *this; + } + + /** + * @brief Conversion operator to convert the trackable object to its value + * type. + * + * @return T The value of the trackable object. + */ + operator T() const { + std::scoped_lock lock(mutex_); + return value_; + } + +private: + T value_; ///< The stored value. + std::vector> + observers_; ///< List of observer functions. + mutable std::mutex mutex_; ///< Mutex for thread safety. + bool notifyDeferred_; ///< Flag to control deferred notifications. + T lastOldValue_; ///< Last old value for deferred notifications. + + /** + * @brief Notifies all observers about the value change. + * + * @param oldVal The old value. + * @param newVal The new value. + */ + void notifyObservers(const T& oldVal, const T& newVal) { + auto localObservers = observers_; + mutex_.unlock(); // 解锁,以避免在调用回调时持有锁 + for (const auto& observer : localObservers) { + try { + observer(oldVal, newVal); + } catch (const std::exception& e) { + THROW_EXCEPTION(concat("Exception in observer.", e.what())); + } catch (...) { + THROW_EXCEPTION("Unknown exception in observer."); + } + } + mutex_.lock(); + } +}; + +#endif \ No newline at end of file diff --git a/src/atom/utils/cstring.hpp b/src/atom/utils/cstring.hpp new file mode 100644 index 00000000..39b95758 --- /dev/null +++ b/src/atom/utils/cstring.hpp @@ -0,0 +1,167 @@ +/* + * cstring.hpp + * + * Copyright (C) 2023-2024 Max Qian + */ + +/************************************************* + +Date: 2024-4-18 + +Description: String methods in compilation time + +**************************************************/ + +#ifndef ATOM_UTILS_CSTRING_HPP +#define ATOM_UTILS_CSTRING_HPP + + +#include +#include + +template +constexpr auto deduplicate(const char (&str)[N]) { + std::array result{}; + std::size_t index = 0; + + for (std::size_t i = 0; i < N - 1; ++i) { + bool duplicate = false; + for (std::size_t j = 0; j < index; ++j) { + if (str[i] == result[j]) { + duplicate = true; + break; + } + } + if (!duplicate) { + result[index++] = str[i]; + } + } + + result[index] = '\0'; + return result; +} + +constexpr auto split(std::string_view str, char delimiter) { + std::array result; + std::size_t pos = 0; + std::size_t index = 0; + while ((pos = str.find(delimiter)) != std::string_view::npos && + index < result.size()) { + result[index++] = str.substr(0, pos); + str.remove_prefix(pos + 1); + } + if (index < result.size()) { + result[index++] = str; + } + return result; +} + +template +constexpr auto replace(const char (&str)[N], char oldChar, char newChar) { + std::array result{}; + for (std::size_t i = 0; i < N - 1; ++i) { + result[i] = (str[i] == oldChar) ? newChar : str[i]; + } + result[N - 1] = '\0'; + return result; +} + +template +constexpr auto toLower(const char (&str)[N]) { + std::array result{}; + for (std::size_t i = 0; i < N - 1; ++i) { + result[i] = + (str[i] >= 'A' && str[i] <= 'Z') ? str[i] + ('a' - 'A') : str[i]; + } + result[N - 1] = '\0'; + return result; +} + +template +constexpr auto toUpper(const char (&str)[N]) { + std::array result{}; + for (std::size_t i = 0; i < N - 1; ++i) { + result[i] = + (str[i] >= 'a' && str[i] <= 'z') ? str[i] - ('a' - 'A') : str[i]; + } + result[N - 1] = '\0'; + return result; +} + +template +constexpr auto concat(const char (&str1)[N1], const char (&str2)[N2]) { + std::array result{}; + std::size_t index = 0; + for (std::size_t i = 0; i < N1 - 1; ++i) { + result[index++] = str1[i]; + } + for (std::size_t i = 0; i < N2 - 1; ++i) { + result[index++] = str2[i]; + } + return result; +} + +template +constexpr auto trim(const char (&str)[N]) { + std::array result{}; + std::size_t index = 0; + for (std::size_t i = 0; i < N - 1; ++i) { + if (str[i] != ' ') { + result[index++] = str[i]; + } + } + result[index] = '\0'; + return result; +} + +template +constexpr auto substring(const char (&str)[N], std::size_t start, + std::size_t length) { + std::array result{}; + std::size_t index = 0; + for (std::size_t i = start; i < start + length && i < N - 1; ++i) { + result[index++] = str[i]; + } + result[index] = '\0'; + return result; +} + +template +constexpr bool equal(const char (&str1)[N1], const char (&str2)[N2]) { + if (N1 != N2) { + return false; + } + for (std::size_t i = 0; i < N1 - 1; ++i) { + if (str1[i] != str2[i]) { + return false; + } + } + return true; +} + +template +constexpr std::size_t find(const char (&str)[N], char ch) { + for (std::size_t i = 0; i < N - 1; ++i) { + if (str[i] == ch) { + return i; + } + } + return N - 1; +} + +template +constexpr std::size_t length(const char (&str)[N]) { + return N - 1; +} + +template +constexpr auto reverse(const char (&str)[N]) { + std::array result{}; + for (std::size_t i = 0; i < N - 1; ++i) { + result[i] = str[N - 2 - i]; + } + result[N - 1] = '\0'; + return result; +} + +#endif diff --git a/src/config/configor.cpp b/src/config/configor.cpp index b1c5ddc4..d2ca6a15 100644 --- a/src/config/configor.cpp +++ b/src/config/configor.cpp @@ -29,7 +29,6 @@ Description: Configor namespace fs = std::filesystem; -namespace Lithium { class ConfigManagerImpl { public: mutable std::shared_mutex rw_mutex_; @@ -208,4 +207,3 @@ void ConfigManager::mergeConfig(const json& src) { void ConfigManager::clearConfig() { m_impl->config_.clear(); } -} // namespace Lithium diff --git a/src/config/configor.hpp b/src/config/configor.hpp index 8c7b529f..2d008e64 100644 --- a/src/config/configor.hpp +++ b/src/config/configor.hpp @@ -60,7 +60,6 @@ using json = nlohmann::json; .value() \ .get() -namespace Lithium { class ConfigManagerImpl; class ConfigManager { @@ -196,6 +195,5 @@ class ConfigManager { */ void mergeConfig(const json& j); }; -} // namespace Lithium #endif

#Q#BHLOqK&^nvY_2yxz#4!A)U6+> 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%0D!i$K^X(Sc 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�pO4290okq9%kqhMx^ zONTX8Myc&x-;~)FJNq1hmT;O4(4Et<$)iR%S&ZNjL3mD$Sn zF#*$mTLXtRudzWy3Zf^>To$9#bK3j~k>WAkwv*0BfH_N?G)VXIyet9HO(eF}yNp?+ zc|WNd=5=)hy9PQ1jP+B`Z1vCAowO_xsF&!nl8r3*_8h;p`sSJ`xRxnEik(<_{~lfY z0vbcbkb_6-Fi-qH&CLTyl)Q zvP=7TR@TFq@{>(@BKNPC|7Ts{v&j0k+cFSEtel{>mbI%@!%ws`y$A^Eugx9jD~gSP zVoakWw*50qz1Lu#-gN08PoI+$Y-~QK;U3bH&ydlJW^UeGty*Qf+QdXj43FM-=!|$*BCFLvC13%a$t>IwW$rG@9 zK@LQ~pRYD_Doiu=P)g;gC`55$bgTzs)XbV#ZnkA;r~?XspP>P{i@ssoc=ci@Fr*l} zvFlr`SW$@oj|4oui76|>o3~}ciz=I4DqtsA!7jEZXK{-uQ8%war*E0xvh79G75Mq; zPVCC67Ml9O^wDCoNbvRdMH3gYA7X7U#&y#ziNy? zoQKq=Mxy)jm@XxFZn*7OunvGMH(>w~F~i;`c{BPSNsjf+$Xb4cdJpdt2W52<{@YFZ zd|l$t698Q^KZQN0KB!OGEN8hJ;Q-lt>;A?X_mz|13n}KZD|p&1aXcS>eSd7Arq1PD zgOs9CBEU*yDJaIH!P`+cwvcB2xVlNx+5co2LLm*>3oowpw=Pb=J=%FFfqMH2bS%8OqG zw!MtL(n$ zqOh8t?_lw?Y41j>;JaMno%Ocqv-D^QIXMp+(}apjvll`~tKw+G(X!}#&zbg%ePt)o;3yUEeq&P#8N`gKJhsn!#*6G-7w zCeO)=!D+-+iNh?lYipawJcFK+W@oP!p$&Nrjcqlf0AxkzAypM`#`7RI>mq0n+Mpp} ze=N)GA9bOFq-=3+2xtDo){KchEf-{F%fp3&jN!M~orgJNOWv78Lr29q1hBHH=3C_L zF&HVom>rr*Ef?veHx4sMGKv1@#^`fL-H5mm;6zqqX{xn5{Awha;X>i0MkG<5VsZM? zqw8!og8!H8goI49TERLiHB730^rQeX3Md2CM&uP12Q`e^kl1bHFg9pF)_mgYqmVnncTRGF4Nu(4 zZel$0R2*U&#Q*Dx7fiK{+&l_b-Anse>|54(>=cq`>G158Gr*wk-q(Ep5`&`u3?G0( zv;_twhrcULHCKeT!Dk~}RjNU8kK1q2iEj^}uO5-JejN1rRcIQAHH5tyoSNEn^0IX6 zd7>?ZC@{aDlc7KyKl9mF;9L~BJxLhm%q`6ZYe(tuT4vs;X2O32IouLoDmh$Hz5?by zNeNj@x~#6a=ZI{A*xP6|`fj`r{SIhJ8@uZY^zcrw+S0N<dJdhdYhO)Sb z4{SozZ=%cvUXLI42|Eh&G$bg1UyeKOAkE)*t;EwG0B@!9K`}kFsHx@Dj44F$HfES) zxpm5UCb0G`=KI6Q4QAwcik>7tq@@v~nICzq>!hTEqgQw&H<<##i7zKyx}@s@+y#ba zK*d+q+7Fy23;d7!+LZcsjxE;?6qrpXweHxYS~VkYlS-V;N44%(12r9jlklVG?V2vN zW`x9Niv)9XMre}-)2Q=~MD&zx+J+y2eirI^w~P1By`IMncV>S5ZLd|ou8RkC6f~0Q zmFEWs=(I_a_6wb8u-fIeCRwU?L}_Gin$AN{6Fybpiw{8hHXo8@AWaa2?~wU563ap| zn_Q-+J<)WGmFl|SpJCAVH3q+JKuKRb@#o#@0Lz!zjWgc>g|B=Rk4x&4SHYE^4N~U3 zoJ88HB%9X}q&CSmHS2#|G5>+6FHCl$x-t-9!4KBGF(L8dpEskuh)<#as;UkLR*|S2 ziIz;A*0gbxdW+8uc4)C_%`NNXjeuwu7baob+Bc5hZv znfkYLatz@|7N$_doBC`>fKxEq+;U*&l)b2;if(QXrCT;?fIshn^!?PXH@wJ-RbvOArVCt%Si$bIk3`G;zUI^UXWyEQlCyZ7U zzc|&{GTI<2fJ+-WPCDwqXU;Hf72gh`rmr z{alHc0YMW+rK?rxV!Zd#hqbVt)%GV5A&mp!P}~8Q*6hn`J8r<%SbksZ7`br-r%tQ~ zG{a2C)Q|EQ3+W0Abh`7^ix9LgH^_BZKjK2_YDgDu!x!L0B|NJ=F34<-^6Szbia+(; z16jJK>_1V`4fabc5?i@qsW};el1&)-Smtss+2^S+Vc$wv_w%p!Mj8SMC&m9zLP z%+#TRuE5E|ufTz-VDpM?yr>o@n3vY08^rdTRlW3n#pWPl!!&5)g%6{FtYT*QKmQz5 zF=1WQ!P~z$3SsQ)ed18#Ae*sCny?M>9-Id z?}<8)pjBSa2!{=Zy5Ktsx$ltgk=V$aD0zu2{7OC^9P&m(on%H7Zx4dEcQi|;e7s@P zVEo3Vw_@y5>2GiJ(+(dSx-2G27>TcM9JzTOjY<7UP1~u&?H~tsA@R)uM4RJ5pA#%vM+Qd>qL0B5U_X7PN|M3b=mOoqh(B z;`wMicPpnJKrSPdHxt5Tl=f+7#1MOzIZTf*B6KIyZ+CIT5_?QGDYJwRHJf(q|8`}t z>U$xaF?rpBdvq1lEi8y4+}PCrdn5<{mLbq0qSsp8kN}pOF5x5Xo=m>Wmb!T$n~cmA zjc=53oNE%efE3PV9N7uI7JQFv8Zked0ORK(rh_cDRs+>D($e4Kt>;4f@yUwc<280H zvk~0;&k^x*J66C^Xf3}VSa+^^4!{wC2ZX4>H8sT==|z@+U`qfJ=nTUozYZYc5T&fa zxe~A#1(eU9PODndy`Z=p$}77WXh?f#{dQy-&H{bWT$g4d-gJVLYY?n-dSq<6XO}Bg zr$ygEHScnvvoNhhz7fn^zZ(l)q}9IKfX*>)X2d#7kj9_)+!-M@%egS-7FR}i!JiW1 z9WMGxLY$`|@9aoUiqrzBxGKr6gB}_j(?zqB2hj^0;)BRrd%TaXI18FMKbDVrdy@pQ z(tlp!pslH9Nu*$r!KU6z0I{ji%I}5VMkhIF-bL|x4gFwqik*M#B65pNpNvfzPj-Fo z<6q0T+gdoWBrU$LffeyDC$E7z*u9u>H*bN4ol%`9QCc|Uz>dHh?DpYiW4R~sl^k>c znrX6vMFlBxSZlS#3iOT})#45_o6O&6WAJ}1VL(l_eozSYTfZ&Fq_pIK7wIoqxdSf> zaQJKr4|91?*#JX9*pqbtaE(~mvEIqypm^84?6=^q*02j0DQw<&v*&C2k8 zaErH#w#{Q+<|@Z;8Z$Qa8eo+Y0-M86-`g}=9lJB@*~CZY$uMd3Q*-L}f8(PF?0%Su zFm>}Up2?rE-ELFNG(KF1Xx|M=*6#1$M4fq_ibb|!!|h8;)-Q-HnAmel*2u}QnY?qd zb*ph65FJ&I%w|U)xm+DzOY@YHSeL)bU7-IN`rCs%T0Sd#?Xc=qLp+bsOSgw81e;!@ zx*U1V&3{UCW8s{+!FQFhJO19-TBT<)XXC<|X$iuHJ}1yiYSNd;gE$vLQBc!GV(!=b zX4TyEZarp?trLH&HbE1)eEZir{4GO8 zx6}cU4F)=kPb+A=t@|q;;AE#8IVM4CK`ZjQz6Fyu0l_ZRH{IObzmUfv7b5nk_Ba8J zZ%OD2Aozm_PdvP!;R<$F^*6N0Tzn!gX16E@e!L}8u=gnJioGq<@Gla+nQ3enz&2eL zPrtfBecnR;rXDA_6gh4A*Tr+taP5^8#_7-J!cG6y6s2J;bEQrkN!#sv)k?}A+khx< z9ABFLkm~bmkd@Ok^(DZ&xb(-7!Z1vL5Wa$qv5wysznrp_?w_<=Taka)utc1y6I;ihXxY;moXyIgp!o$2_6@pj` z!%4Q;$g3$88iy}c_hIQe^htMeXO}&>rD<7CJyPOI`V_h; z-HcGQ-j~QG+WS>U0u}T_r2jw$wWA*}S?lBe#Z|DvX}D3E_YFTGrz#0eaR}%5)fw|r zBhE=&;i+6*ZU3l1pc>!gGrr%yvvz~KL7-h<{$dT#-7OCSi;VezQGQ#1fXKk!L*2E^ zQhq=26esg3d(>guQEOLx#8vSshwRV>X;luqxfVNwhc*J-96@IZ1?|1X2#)ay9jv1> ziuycKkG2SqpBdd|zoYfAy+_b&P3CHtg)dRxXjMj%&2JfC`@}@%<^sHSy+L1a_s1n1 z)D`19koVMtFQVW(H3*0Y2-|-z_yWCD7>TWZfIN%&dgB9aR>RtLE00T^wi7*DRQz^P z!LZXJt?1Pfr0wq!t>|ixF1Bj0vd+3x!)*t`#QV@(9hgP&q1~>RGGmKH!O$R8G``NX^Y8GOjO|@Wwsw7VAZH;%|2|OX%h?KoCtnagZ}tS?g3}*>(Py zcVeft%bB?_$KV^@b;Y}5aVt!Dre6anf-|r)VLeB^L{7d}YG;-LH*utc-_;f;jA=Z zC1@4>9{L#*Oy*RaL;w=1Jwn4=Wz?j?=D-_@6xC$4pDdu36)w;rvC-L@LC|KO#Cv5sIy`8xif$c`h&UXk z_m$Hh7m~NkTQIe}E?rBevi&-h=H9jENcK3l9BJvZSbDG%O>r{pxMgU%Cx?BP^u64C z`b4Aa*~vtwq3%D!5#K!V<=q9`5j38aI$N7f>Gq(9VjgYrmq4_?G0xVHzYPjDx6=*R zYMkI6T{y^wc-DMDgxJHDl2n11-}5BdNSyX}#M2EHav5HVqb|#D;GgOvt@-!9v+=Ni zl3%86ptUe-Wgz%yV$(O zkLEpFc83x9df)ecByEAjT+R^=ar4V@cN&&mK`doyVj*^xuwD&PSkjC0km(LwPzX|~ z?uelzJi)ay9IMwW@$YQsBP#dSzccM7|1+6-+|I(NQw32Xh~Dz9hF8#n0(BSMCt%)5 zSdiw#Ye|3J$RL+TQUQc5DsI4zu_ z{=^!&68?HZh8s?Tk*l6CaG6EBecnT%X{GrA-yS(M4+OoNU4u=x0`+#=y5?@vr8+GR z%8ufLTwaV^=oC(aJt+1XcS%j}GZGTZ9!{H4q9N)-Z``i?xOK=uuQ%O66?HZ5pZ+ae z?}tE|S~9lgax-s>$>~s$=F>+dGSo}ydp-Bd|K%ya|B)*c4I&Poxp6z6dRRnNov?KU z->U`w$#?(B7AM**a>zPat6*BO+Z9d{@sAiY?v|{h>ATpaylZEsEug=5(+2Rpn&kIa zKThqnMd{v8&rSMxtghA00qi4X6yTHc@IBRT3#r}Vut2dz7j|G0S-YzffmPWZO8;rO zAvHK3&l#k?ecG&Kg^9DT_jelnJt4bnXlhXRZ*OMPC*}8^Lpm#}TxONNOGSJwGFL=I zu9Sk)PGTFG(t;fYLv}DVg}n7UKLIV%?bqJ;8``sUGg(1@{XH)QW*?q}EEUY3hj6GZ z5KRIZJW2)%yB1BHM1+w4P@gqh|DHMFupR7-$GuIK{Y>3<;toJqcKB-a zYUr_``VZ*!4T=!ti`Q)bfvQ97V)tuM9xS>YW9@I=X4Tv)eZL?zu=Q_f0~OFvfBC7j z0pk`IgiuV0jcqFhqV$)C9#s9g;s&mjPg?znI%z3d-LqJo5DN>-h&gRVb9E>pcJ)dN zbyH_sNXWJUwk;UnEXwy&Lp+f`o!zHf;FzrcCh?QoWwrsCxt-eGCec?!n&Kf(^L))u z_4Olu4$9BcFsZ`A_b&b(H9pg`CoW#WHUM@eJeKdgh^5{Wga+j?&nQG*- zpQ~&4Rxl}KgiNB&y{3F_a<)&AR5Y>88W@udYS%WuMZ<@4acBMOe18b3l}Mc-f=CO7 z^Yzt}keDmSO(795CJ!@qX9~Bf5LQw=HKm99;&_=)#rQ` z&qPO;xI94?FOHYqz70*izc%jn)!<9T_m@z;6fTL*B^NvoWg=m1*>dr9O~WJ1xu)wi ziNBUYs&!$KW~JPpZESllr~2X(0(&S-=Rb!3RW*Y67%FhR+@mX4Ab{2P7_&e)N4o4% zW9!rz=SASXna=Hj2*-u${1ZCK*tWdmaGX9WT{pHPEG+D0#K=vn4O{ao#6d#mU3~au z{a9Uxa-iB>cCfS6DEJQt#$z|0fm;T3gMesHo!X_SZtsBowW^IQ6v)C0v?C)_XQS){!#KZ&ap}H zrhYxp$G;u)7X&g2_zy%Sk8k~cFQqxz1Xle!BP3&ME4Jjmu5%yO^Eb}-E#>=o)msuE zB_w5rx#kCNN6w5ickLW^|NlU}a@jBUa<>+HT62Mo=3=AZ?oxFdPF|Y1@|!0?1sHj> z;i!eK#J4yw{tl)IUSuWg9O6AiANrbVn{5IlYnOE1ewZ{)dj2;OFr|2eH&`vPp(R+X zbEu6M>gc#bdjdDKtX|L*xxS#>9Ok|oO1705Z`{>=*9>FAyAy2Dztd8VCLH+&nwG2$ z(rFvn`B|z3dBr)lgbXIFyKi_K&EdPMZ60+U9`=_RSGNfp+~8-ig7U>+YnhX^D#JTX zD+^WyQVl3v3t?wIswKe1pe;PSB*Ejru2^~qp8Dl*fKjLlF@1PpWe33?q(`D*?y5|5`^%i;o98ax3b|Ho6D^o2PEV1k?fRs6aO99NNP&RgovK5n}8E(8M zTvAVDPxncJ1+(CQ1Q}vbA-?7EVr0F}U8aXhKU?cf+)U$FXPiv%y{(xKmG$dCH$1g| z?zx8R8yT$xPQ!nGzVs(yg8!Z&-A~if@j`KF$BwmNie$jmlR0MfqihEB2SCT$DEdbP zz>50SKeSrD8a~QwOEt=z9^l+ctJ<_3|Fai5*2 z^B2aLORu*egDr%Uk;z3eucr51@(tZr@IyOb$Js&7l5|20F( z?9kjmebTRZF9G%R@j-?0?042dKB5pi7>t)SmI~3}<(1&IQBf&=QgJnGi}wE8VaHK! zBFE$z zOUE>Y`D&P8OQTf(itWn4V4G(P>1f&_9?@g(@6f^B^i@X|3ij@pS`2&q`|fEy79vDw zn&SJtwI%$%9+?0HFjgCc{J%R4<8lP#27urG2oun-(uheMh?RqyD{AcH#nW!)%=Y1> zgy1EeygKl~4(0YDuab=k!}L4mCNV-8hBe66`kH5Qsu=h;-qGzm!!Z`Uzx{b@$;8kI ziu2H=&<2$6>bZD2js89~W~~uN(TGgc&GZy-^ZhbiS?ckQ9P`;+LTIHKI~LsgBmbvC z4^`j5`GleY0auxfHP{KkoK5>!OD|eHq&^Oe?-uphxSXiWY@sJswp75;Oh1#75O{xbUNa$ z@)yDb(OGf#JL6R@yuF;7W;;IU$VG!j-~7ANX2Q#h_JTsm_iB^D@b@mdB1!A zncz~IrwHwzdL6m~H-}QbX75}(n`E}BO5{-wEn?7%-SmI}?YLj};$fEy>}g*G6hAju z2&Q)sa(+pE(8k4v9tK|TO-bWXkUUUq)Fm~6BJe9^7l<~PFmf@ z)*`XE>Se1b{@l_<3FjptLlLSg{pO!^AN$$9s9VZJvfsdF%k!j*&5Ys!S?aY(7WevNBBW``?z5Y2354!#4Dc((UY<|v|bjI1#eE!rSv&Qy<|fz$e> zM*GhGRn`AIGm+cKF!Wax^4@B;qT+JWE!X6F&wTwdYKOKb%q`1i-<39T)RG!l#P1~h z2f8jV+)8xRa%l@#JGZ{EBDSys`}DwwOqF0yeJRJ&rjd3h};COw8Lv zn_9Ge$lG8|WORievrE+UVqc3DXM?~ka7Rj1_HUrR!5iC)5YhG- zvkm^&$b)6ZGar0h^3J*7HQw_zmSKMbx2ZI?%njd+6H8eCYN-ULXI0;y8IDt#qJjLA z>}m0;u=d4N8EfuM==af;(yddOEEy~eoSB(MYyJpeFb8^4JN5~oyy@LtZ<;+JwKKn& zq@i&$r;I+#29W9(0$z5DLLz1j6UZm1ASeV&M3o2!@&va&m_SC$%T?%2z0XW>2MW>1n` z^@`&MO_=+92$kdV+UoN1z5_dhPfOFs8)bZ{fA+FvsRXz7oEks;W(b%D@36uclNHJCAnKFTP^1O7Gd^tf2cQJkp>8$&9d`Ho+gSjs;Oyf13 zFPG!e{UUg&11nsz2qAQpd*A?C;==Q5w*gOycfR5}*AzZ7x1?TOY0(-15TyW>;Jp>6 z?fruRLJcnkw^*1D2=u16KlGXQGs^qwI=Zr~L^+lAaaQ|T-zLPt9Svx;VgfJ(e#YRRU*Jhgn9l#wi;Ca7#3 zqagN;c-8J&oaaUi_VF#wj4Z z*qAj@hZaD0wVquFpmXO15OuHX&(bfz$Rl$3tdBt4zBy#kbY`#5b}dx1%iz{%8oBf8 z?ME!B(!Bdpr$NIXINQm(BUaP>KEMiQhQ?_bQHZ{uCTbtbV5X^EElAmVL;=zim6ILd z<@3Yg#(^d#Lx{&B95QA*T7;FDbS(UP)WW9MHuUrr@`JXhjclY2CHtf`=YOC8&dD8f z&(*4*^*L<{k)B2w=`l!Z4v&S4jK5c%F7!|b+3_z0oBrN)3xhhp6nM?};`DSItYB#3{5aW5MMA7Nr8pbRHHERe2yfv14`l19 zv`-^coD=?rQsKbR(G+ia8*b`5B3`;vh(kj3Z!_o!H%JUV8qh{fRJeEw$%ON84&qFPnoD z*F3RfWW$zt%XqEB&2u+SCWU8`PxpXI#H+T)yxEv&L4WeB|3FWyLxh-|S3j7SycY?d zQl`+_M3=~Os(A%-?~SAV3MYM4_Qa z`P3}rVv}o&ZmX}sSx-m^X_z)*kpWJu{XoWM|GW#GL%)lNeKU2Y)Y}geGJ@vZd+U)! zLz0;d*{SP08y(tzMJ=DOU6W7gZTpV>aZL~Ndo3z+a~q}66_&J)+$RySU-urJl{?5&&WJMS1ZZM?YFCztdxndZ59zh(#XFn2=e*+CZF z(Zu@IL!5ec$@=hBju%5(o6Bj`-6(z?!UPfM@-38b7O?c*?`E6tu{U4awtLw79|)LK zIrZ^-i{)AbZ_94;P>}KPsU%_$%w*^@tN1xdP5A?y!N-7erT-PBb3?t@X*JGYe%|%# z#v~xqEDZa6>jU?Kt3zz+bWtgL*E4;X<%)6?9mqIZ6 z9vj^MMvS#2%AKFf!@B_j zR(=e*C*K)LXqB$`E^2Tgi`Mb-+49S4dVRzNWYUhQ3en)Ey3gO|6>m;*pMBJlSFWamt&#MZ6vSPqS!ltvK=DP0t?XxmQ-B{N)>W`fB``mb7i^ zceb!sCA^0Z38|f34>Z!uM`bbEca7DZf;9_R*ag3cHG;hKI_8a@9>38$enSvqIMUqK zl3<&fdeofVd{)o|u(P&Q)+kp50?GKvb+CJgh{bkV@oNQ)EZupba|d+T!)BR97kYap zBk&LS#Mwi*AqlVDIzGW5C|miNuJm1H7h>a!N)F^Imoi%1i2(|gD-&pX0rY3RHcT^{ zZd7RD1IJyuEwHrcm z>s1*O`*JlU5CM>LnhHp_Khxu5LM-{+gielziqv%dU%gcNpc?k{>AweInD|g~$}lOi zZn8@9a}8EMP%e=jh!he9b6Vs8j$k5@Jedw?k;|>Omd?u&>4eOCVh$nJzYUEr+Gtu- z@#jj7f(_N*9{(n)Ph6l4J|n0qBGg>$H$4oK9_?vwh254{%bOznlVn|s*x4aAYZYzY zz)v9FNL?rFI4^De!081~j_<5YqZVg$o{Hb8z5H&T#^hE*_z}}se{HXh*&741d*Kak zYN}P4iOOMSG_i%rH<*c+xeh3N^^IKgNq*Ek{ruo{(f!elmuTeA3E40cFh}8+*(qKh zrZUBESUFP^c97??cD9T2SAao~r~pLzGHhlJ~UqBamcf)Y^)vLLmLd3&u6Xm+EsKp;XQEE3-J$RdJwFow_ z`+n%#IqovHf7IWz3jE-SRlfP=4uM%Yl$_+<82jGDyE&52H`?o~VREyU_m|$AjSZI7 z7Oy`V>QqxOew2c43o$_K7;P=n)VwvL;~?>~G04hMf1mx^Z;G*xUVi$isR@&sPsO`y z_2Nx582&kR{(YQ7?m9 z>6XdKXZ<#;aLSw7&+5=kG`7mdi@|~Mnend!yt&z<+(I%hhQckp3C8zttmL~xi0lsPkR_2OMv5MOJtqK!_2k{&iJjCdhSlG?C9P<+;%o{j zCap&JF!A1_E9Qp%X~V;nZ0Qa~<06*gom&6L_2uQnASb&6yXKRqjvZi*ZK*0{subfQ zuK89XUZ*p?qHGHP^gmEV697h~kqsOl@Nuot68$_Vyq*CLc*icR>ecGP+j;@c3%8lNdM;u`d^B;;}3o zw(s-J31ZicYHuz)D;J|4utmX3zVhy?8C95Hx)D`SC{r&~D+qKc1wP*lFSy!3RHV8|;^$;{v&hX#iPUUFk1buHknA)G5eV}V}YZS zM}_%|gtVXM!V_&S`$35no;r6kX6(<{br{q{x;Iw;`Onv zg$Z2Ak?O+-dvRm>jCFYA60!gWzxsiHYjQF2qOwLfpGllpv4(ZK0`{^CjYsO`o7~_frGHF zPQ5pmB^0M}Gj2Z$dwe*omTuIRBgcm_;gra@Nz9O$lCtPyP>+p_;I7S9gKjGY?E3#T7t?9(qm+V8t3@|WyHCxp4(k8gi z<-shJxdH)=cAAWSSNHb0!YCymJ@FCy7W@W_+IrK+F&$6(J6)4t%xe^%W6YmEloq65 zXulL-Y~|^c6sg535b(FLs<1#no#|hS_N8MbYU=6<$u3^jU3=YP2=8!Sff^;5+Nayb zlb8CiJM%?m1LNgOsg&X*kIUSlrO=zaXi_L^WD#(EU|rhzHgp#MF|N{FbKv=M_Ka1S zyU`CI{PrV~O2YkW56E!LwrE`hlVm|24M`rrRYOzs#6^4b$jQ|BsO|p0tGhLc+G8S! zaj$5JfNx-9V;v7T!gR_WV_Oj7RszR_nb@?o)#;3HEiAamN9IL3cNRz zXZ6g0t102|7dnyVRmq8GLQE2hOCDe-$(h}Q>q)% zY;B8HvKul(c?h!g%iO=qvHOE>l@%?D-~P62Qq3Mfsh#cm^*&%?k>P&A^{h%y7H_OZ zfRAW9i>PXQa+xtw+%K#0-?1Z>Dl`D$!rc5j71cec?h zqp)RYKyAxR;8;$YMc$Y{!ns9!{lm}gY>e3F>KImdv`w;IP1ti_t>swi!5+lJpuYP+ z%@CB?uuRu5oStI(H~Ow5s$$?7uXx)2hF;HurQ2N_F>KCbuxs4!+dS{U*|eb@3Uvd5 zZpIt0Zzjm#t?yMFfBlVSc&6EL%9Cu^%yS*_=B-4dv!EB1lQoWeKmXPP8!XW|uy;t) z+n0~eEV;e#+}VhHP%pKx;AUY){OBvvD^h)1Py!Ty6cJYsugY6@c$PsOCdPLU?3`C< z*tqG)uSqYVEa2xc6+&BljJC70q_Z>rMDS=uRUlEFR*`BkS07ayuGd@}?>X&Lg9WNb zg2=vA96#0ynQnl~+2mTCX%E__rW~%PEn#2E@z~q}K2+lgID%d}OW zMnp|-$r&4Sp)+YFlFE9wc{Dr4p2bu4ewV>F@)9k=d9&!WHkBEYb!LI`N|LMI7uzWi z#oKwwv0K-|+`NB~HP9GXTDP>`Qp?`OD>qxI5T)9j+iK2XYc~#!=R9S&-jT~lmsTF0 z6D93`wAD6O=WL7)UEOpMLZFfZXw}CBh>9fM?7M|^ZM6+y`$H>aVH@N2&fGq+FTJZ) zH48DxmT`1`9lUhUe0dL#en8A62*#Ti{N=DSzOm19Cq~M9f`<63s4{?#S$C2@JE4z7 z#<&3A@4wJa3%T^Z?nmNW4Ajwi6T+UG1GgEbd#oL1+4i`iiUQVMWTs1II@o726QA{x zKE%AQN#f=u4sjCaXF+-xc!FuW8}*Nk%4-uuKe(Wlu$bI+pm*-S6iU%IS+Rw zfvo@JN!u@`R^bV+D(ZNV_6gG2(!X&QddiP@WRU@Lus|CxaztpZuQQ8Eq-E@a_=8g>2TQL_{bKJhwri`XMRr z+}oW_afa~x>SL(R#p@gDFRq7Y%b;yj0GM-_if{a@YqEAUzK6^6oHOG!sarXh=hP6@`mY{t;~Q6_%vgz8@S>f7#aX~V2E)HihLCc0nX4d%nh9cWaNo_}om827e96=0vn zTnzzmb?_dLJ6UhT^PIm7g`R6Da!bzx6KD=ZoCEVYC6^U;pQ?|d=DQ48y6<}(X*KdK zjVX1_f6rXSx?c2Q9U$(FN|sTB-sB_AT<;bdP(q?W^qvnLi*3h8tRj94|MXSx9LTnq z){A;|EB#E~zb!rgBst_3VFSY-U3I~)Sh3J{@>;w%w=>CixP5=q^<>~>`NuwTse`>1@`XAa7J?`xzd0^6SG3#5&qm|#Fwe+0g*8ag?GceWrh(eu4 zamV7n^H!PX24uCcR$J*tF_T6mh4Fp@9!~mDN zk>D8Z-1^f>{zmi{YhW5_pa<1(PsavT4&H3a05=&`qu??UR0R!@wCaXUNK_qMEs|ue z(gXUEl7sb_*x``!`442t6(Pku0KFW4@Jnd!?K=ACpHXuxqqTG*j3&H)y^Rh^85c&y z+@lbT^0|D_lTlwm&%UTS?A*R=bJWp0fAkNAnNAWKwSIp6uCUI)!QCc#_QRe)vgugY zWUt?M=U77J)v}hVw3s zV=jUfA6nB!yX_BKgjtqxM}t~KadSqj?zjXs8}+xkt*ccv0IMR(cN*EX{7!r1-zU-B z_G+G)3Gk1bh%rYeXOXSL%z*EsLz{1LLUygSSSJ^qNoOzWOfXnTg`~M9RLR@OuT#^6 zOZvr!%?nrwHIjTb7?fSFWL0hWpz*q$PFFd4^LuraQOp2Nm-)Qo2p@?Wl zha1$5rEg^f?)V@s+j6$n@phhejq|&|W#HKrjj1lw# z|6cO4%{`j@2Pr!(6Uz^vHzln={sUd`0Evt(uIagVOP3Vow`BlmB?-wsNuD)lCqJGY zE*Vw6er%c$5C3U04K8+YDcH2c*QaH4WqxxR9oB^i?`VzXj~)dn%oDr{H(7%&(u{1K zWY0z|>t>C3ZTH9nCTSud;4AjoZ;IUhEe*GD*&Y);^{KO;;W&I%{aT5@s`unb6c zcSVp#>899=5482EMJjKrQ1Ot8c~o6(Xi@hM5~)7AXF#R(<9yZqws2uj9p;laZ}*rY zuO9h=%~5-lpPKawXSfcCcGS@3}S5TXAu>e`tRx7KN(Yq@X zIM4Ai^c{kn|zkCbxbBuxeS{X<)*`V!%l&YH&Wgq z{<-A8D1n^~R$R8Wl{;h%oaDa6dI{XVW1qp7@G);-p+Z%6PlOW^Qw7N0&CFB7FkUR3Y|K$=>aKy zSXsf1jF6OVR-c$j*7zBN9VMj38*Nze0tpUYyt zj~F}_YG61hqX{Fw{f+!sU0Wc093>EMX>cAyXid3ZR_q(_%5W43;p*H)wM8MzI5Bq=R zJFUpo0J#{}*|RSBvPc-Dzi1HXirX+Q=>ef3x-ofG8%)Geo{MZi3~kr+7vN}I`w~-Y zt{i@udq#s0e(eFP=%UTWWpS<+1wK5em`VLPk72j0E! zCuh`IqJb(l@qupXwT0_6j;j3t&8tE$x2#nEhe>4>aw?hfV9;l64KVBSnw~4)yr(e_?2A_xujJyvrXIXns}?@>183y0%5@(hz&s8$Y}_g`q;C zXC2eF;+u52d(T)uUXAozybh`J-1TCkz$tbh)_Zhu3Z7Suaz8zBC=M~8&qxsZCJbWr z_D<8sc$0(fh5V7@2hqx5Gmd$}^gfyX%oT0+dsHZ4TNo(B?aQcZ#2YX(c zPai)T@5=58M+H3`e)ac=cnjaDA8s+iFJ__h|J}TRX$aD(82+w7W53TKacCjI z;y=)v027y0z)vc0I;v$|5|W3?O5m8v3~$LzlMTII-OF;V`L6?Oof--)K%qO&a#LUV z{j(c#YY8$#l&{X%I<&4!H-y}KE!2iE3tsP@wlp zttBC7Hp6&nOM+S;@ver|*=Gk+zc#aj%N*Go+yJ@Hf(l3Z+FIVI$kO3V;b^LLcN{3- zFv=#eeunj2J(A7I0A}||!P%ENI;2EW3>LWsJ99f))5C7|(w@QoY?m>g4i5%15l^}H zo;@&8W?>5j?uYF%Ao6g=)Qap^%sVeO);~7Xu}hQ3Wn~X0koCC`X*?_cNR*lvePAry z2H4TF8v}N5NA&pGef5<;qvP77i`0u`qIW<-W~HXFL`vLE`5%gUzrrI}Bb9Fz?tQG| zbposv-nme41>pxC6BnJSl4|bomNk}o2mSft259kQ>z3#4wXho!bQ%f9v$apyq75Cx z*j#zpbCj3Ergq}zl>HwIv#KY;cz@=Q@yCT~Q}uW;56Nr-7N3QK`}%usu3Gy9?Tt(4 za!eu8d1KhdUG~+vmSrv03r+y|FZ&of9a6p908N}7oSw|gl}gwB+4FXJ&%zXgImBHc z^Cg&PI0R6JBses#_yEby+?qDPeUG~M1W<-ZZdZSK&H-BpilJsngwA)MLkqUB!?K=% zj;fs2shdC&x%AO+lYFeaWdRH`{&|tiYL!1hiT#+(ky`QStNzMZK;<#!9209$K*~xZ zwLK-Gmasbq0)&=T;U%p}%qE!^iNg+BKphBk*?tFP%z#+bcI9w?d`E=R)M7N1FQV19(0 z-Ef0j<{5>awd6|ck>o3%Eft#Bh`@f~8% z1Y002BW0+s55o^a4bS@4tH5&K_bn@1whpI+a;r{fdeR6FscLu`pRSDW*2q{7J(J>(F_*!dcN9lG?7`B}|Jh^^fWIrpra6SdDjotCe3%v7~ zk<03-NY&x_y@zL4zuFms0)jC?u@``>OS>x~0ZN=Ckk08SjT_F@F8+_Cvkq(W{og)F zDy1NuN~x4eH>i}85T&~vV<5ul5(EKhWJrs2*XV8#$&DJ_-7sQopWpp`o`d7y;E(ao zz3sZ*ah|VpM40k#vyB0#gVQ%A=I1mb+-(3Yj+8`|&#yTB*oYn2#~qZAS_AmZozG$i=C z_n81EN+p&AcY%wY5oLP9t2b0A`#M7gH1w3ATW9rE0*^~TKsggFv_nRxi?07wZ z2|j9yUz!x&&o{fb(;`cipP39P+Iv3gcmRgUrG~~Mp*hG<+)Qhj&|A;uIz*MGd`>GI zGYabRs7qet8{2mg2ja!;ksn&ksP}sCLdaTnn{IO^JDI-ZZWc~)PSu(Wwy*fPwb9IZMSZ!xSsGNo^mNCPT%`YLI%ik*M65sP8g;Q zH3|ZWg2>Fxm3?T1^D0UNS{hXj{oT|SJoGN?W|#b(>%3WafuV})vzGB$w>P2Lu0xLx%G5@KcR=HBgNZk}Nx5y1u zq{*z&oa&{nsfC$*Q`Ylt7n?lr>4F?Oti~6dvkjk?nW}|4_zsmchfgm2&DMRm?&M^9 zKT4}hnT+Ebt&G8kyeoqq8GPcZ%Y#p;d?m%70%#C*s1|L1yMjf>`=3}~xN{%-4DXT! z6ErTY4}GcMP(2PbBn{P!O^XG2V2>B3<`%v8g5jg%cojXB*n^jE!d5k`lcx04A1iw| z8ml``pndbPFOyyAmi@ECZY}-O?Q&yc-K(S;Onf6A8;);ATJV3;u!+tK<}!NS7*2;z zjLzY|Bn2t$PKY){%?bXi8sUpnr4qiZZ&ELab$v0A&CQi&Pe>g&ou*&LQd;u3>8{_E zy>{C87#43X9_EzWfkmv5-KaxDvuafO%!n~C~&|P2!;PstR zhl36zpXcV>--Q=gOFk%C<;qkVdI(+Dt&HXgx zy@u2R8^7oskc*OrwVCAGk;qJAwYbL~k36mu_In}*unG)!h{LG~*{dJ^`j^1vY+PN} z+}5JL&m@2Kc~!|HF^WXmTJ(B-`C`XRIC?eOM6LPTtRtgD0@|_3yz-&OrcqnXA9>`C zPZWk0h)^4~p04kjJpBE$m;PY=kzYy4x5Na4Pjv&$*+N10GD;O^|E8bp2mFM|HfOrc zZ>3LFC4!esMA`#S#Q|_GvZ%rr#(QyqJLt|$W=#E-EGk?4tfj_GL+sz*$nZj2=tyDY zkG@Hrhm@7Byw}Vd5m1~-!L3h>B;B06ck#8gOoDo>TslV}K=W8O`|Qi9_4G~AWwJJM zgg|*a2Jl!yB84?#a8s@~fc`SWO3Y6n7>V4ql#gst~#mAOk5@nS+xVj59J0{xQ0) zU<}NScLs5p(!@48C>o3_v1MRS^Zzc?8*d))Li;*<)&a+jQ%s*P)r(CT|FrPKwS}ix zy71L#?y%>Fl1^by)?&m_cfP3~#naP&B+F3LxdtpeCqab7&jkkmVxEC$pGynHi6*|I z;-vR7Fh7=zlrvf3WV;G9Iqr{^6Y=+6fjV@dH=;*=lwW~*d^GjMZOTk?>#j+Z zvL)Vh8ud^B0{Z~mCN*(UK|Oy36Liv-b*~DW`_R-nmDVdzVZ4hLuKiI5wzK-} zcz@Re9adBbD);hnp#e{sb1%Q_T)2GUVK2O|;c4BQk`kjK*i*%`Ud3M|-lVU8$6r>x zsTJ<)FEQm?v|QbWvJFPxJ+#Miq<|%WfXVC6YTTs^EU?^;Hkc;&0TNqNPa6- z)LY@f-XK{u?$2_W>uYT8|w?9|nI=|!nca5i%;y0n9-lYG$Y;%`$_ zVzhIqy4xkB`ouaF)3tcGr45@D6q`%*&Yjm5PAZhsKLwvI&CU-3b)}Duv7_WW3bYfv zYfHOkN}TG|^jns6k-~+YI#LvY2z{XwZ=+hU^n5i*&ROQ^O>H3K`(@hy?qlLQ$j6TsDlc){=z&qn0;^65D zmOH5%D)H7Vew>i~J5G{%g5aez59J-D-VdU@TZxWvc!itbKiVfb63O9f@WzDw+ftrB zP~d(3koU^ujj;N*z`8eu6Y@>jr?Sv|YEXATiLgv!*v1PZd#xrNTwy;MvwdCG#IaES6ezM&-e9 zZ%)zx`d@bezbr5XOV9ch1Q1S1EHb?oK3Jz8>X1$l+DYFdAU^B>{$oC!BZI`jVHWp~ zsy1%$^S`vmDe1}acS2=j#=;9rSc z>}T-@ro$~!%*HR;ObJe?Up@G~dw@tFkeqmQvfx`X9I6znbf*ZcEDBGhV{LlUKB< zOs{;qStM$GfjP_4Juf%CG~*McF+XVv;R&yx#B}G7v|_rv=9c0Cr?pJMWcH$?NoMFmbn!( zu7UV8YrQbRQfksa%|VsGdkA=Xet&n_Kf{~~MxaD~wN$xAkh@%^FiH{g-O2n&O;4&d z$wt`sRP$oCO2)@xmrsEGwN4x8E`fxHB(Tx9s(jBIB0R^glo!Dg)8r!3m)-mtIZ(ww z%(gu{NpFUdSY8u+$iT$J1B@F}BqP38Gft0it?z4wq)vwAfq=cNL~Ma+3J} zokxNUY|Bf_+Cjo;LLwe3NHhFJ;Hf;lux%TGVMJYnp5|#6-X(o?MC7@81BWiT;URAP zNkAVoR_y2{$gS;!XJAN_JR_Ae<93aXC~-@Lq*G@$jrPv!GClobDUtf<1q2Cy4a+BIovFih3frddBd|(VM;vxL7pQ^U%KC3@jzRp`ixmJrl{HmrP6<_`9{l)EUC zmvoss@oD~e`ap@m;#`iJ9P5#Tx&0d5$b=%4fq7?!DwN$vBCr+0W1gZW&TN$Nt*6slgcHKnL5vPk>8vlt>4qSQC>|xK0bB0=7tV5&T$5AcbIc zj{Ox@Yo4fN5fIa)5e&B52myWgq*D?niBSp>5CZkG#MXcxgDd_r9J8sVvBvy`eo$)p zxS#D~$*Pbdw>Afd%K_&DOLnDQnV?Em)%1tp8!yzaI{;FL6HQh475B%rV8#(pZ->4) zp`c#AemFm8pbeid7up*VhBTTTRQzhM*t@xqf4kMg*!1@r9aG@z!HBa>&=mjICwfWj zJ;(edV2eo9W%d8+Y@n72MkL$~0s}Q#KR(ztFf?U>JYgV;>6)B>sgLl)ohnQl8AI30pWpNLG zK-a?+a{v4UE1Q`twk#Gwo%Q^E6;de*%IeN)TVdyCCdsQHUvWtI2F(+lQ+{;0L#8ss zwuoD~uq@)^oHHC~D;C}*KKz;_*Ka8#kN#F4zu-4h3vY}%5`8ULPe^M~vr`^Yl9SD^@W1>1c@#KxdA-jr@G$VkC|Pr5!* z%E33bC|93v1S<1aw$Y{Z@ZiEoxR$wA7JOG?qSvwN*FG--RsN9|DPN2FhhaD|a`cE6 zE)_TYQ(u$*%+vxb}xRswubbcd3D79olq)M-wJKRaVpuEdXPk4xJ1R#>?@AY<5z2&;`vinVw9O5Sctc-2YjLUnr65XtXagL{!9QO3ZvusoapVqmRR>N#S-zr zk#@it+KI#F%yqmu&f-H)J^n&aEfL=pyer%M>7XNOlqY;SgpHafp4Vi6pf9(ouUKKU zU_aH+I`NsLX$gUXN<5D@Twez>NbEEKHI#X z1))w|J8MIYK-G$fo?LO3wj zH|<{}kF_-I%lM%$i#pHIQgCmch9DKeWY;dXE$^Z$#l9Qr@5?w7(+P1+?(P7oO4KcA zxw*{xg-za77N~COsD-ugDnvQv`cHjZ^$&~j3r$i@>j_a}pRn&mb84S?#{v1aXysGM zo8YCwc3uRo*?oh>=fZDkX9nel%fMx1NG#Q{&!e1O?MwMD7*t&Ibfl=>Kfyr#%q z@5Nc#!R4mNMOoiYPp4CD&xdvOq?myo;BU+CCvXafE5+< zfUXj2?1w1Pt#(yKh}yZyK;!G9y=;F#QuBfBws?Bm@cvN$$%9}T?tLzs1Xpxh zHZHSG?i0X(02ZV2_Gc>AHMd>$tKR=}~Dpsvfqj-yB)T&k#moa^1mN)NVoA zyNb^$)M}|d#$>pbI7+~qGOIB@?oH=#;9Ob3ksNYQ${Cdbi-xRwb9)^8 zlkR4$AC`Hmn!l2)!$;uA`FRuG^{V!nt;SjtZ{gpdAh{yj`k2!Rjn(McKQX(r^Up>f zKy!GGCeTO7lIws!|MT?Za}j#6>U}&Iu+LCtuRosf_o+7y>LbD1v=KQT+37NUCe_+I z30tN)XCs&)_L)k$=KTq;rU{aqWixsr#VIPu6}3@KPL;mP#8h;#@N!q4rkf@0DqyN# zGgJP9di}IuqM4zeb_qB&9Sz*w=S{T-3keVz=ZuQ&R6lqVv5a#HM+oP45n(~wDRFjf zJ=DT9>@q60$G9!YQxOAC%AMWzAYIa`0#Pv63KVLNq~*;TF7AHOC|TO|Q_&Q08z_Z*U^C)dHJ`&K4(!0-uc7~*}o}! zpz{)$Zs~!)ZKTLDEgq>^IJSEhuq#kd`~zR3fH=K1ZIl@94ZPdX=Dmz_c7`lYQPbrr z8Hjv9$6`JMen?=6V6oFzF9L*=UC8=NjZ*bv`ttZH3U*SxC){xyLa+NQtXqW~a&~Cd zR)B5r!u%_=W(GbHOcjd}OLb@AJ*fS${U3ofBDsH&{6w*9^dV%C@+3NbLe5|%1EdQ$ zcEa7=TWVSXwvoWo^=gzD_D8GC=AO2PhBci3xjE=zVfOeUGq)$f#?gL2S8vSH)d_Ou zfZ<*H&Uzw({S{tS_ses2$fK`;|ML(f>Piq;rF>OEUt4h(2Y(FNSmX9E2)fHnw)t>K z_G``$j0wg6iuUO#)>df3lGWqiIbQqg-7@#<-QXcUJL5Oce6~Luq(lp)=6m-zpSE zGxxQvYD`dCq*5!@zr5J4N+P+w9&c1;I4IR9 zVeybz*aB?yWnflK?;EWHv1+}pi8x}Ozw-n{&l+%7QuUh}*7tMG{lER*Ej}r& zlEZ|3VwY=|V1*kHlm;&!-Xl(V9yrwSo4WqZWa_AXB?`ZoYK5F{Y&T_Be=(?NDG;CO zIv*dBK5YW5LUuf-Z;~>T3mqBJFLyobJ!JZ73ub1#vh>ZA(S&Qpg!po#_P?hnI7BI~bICCD6K%{j>oBl$-S|Np_pNBaza#=qVtGV)3)@5?FPt>x5UQJ{})pW-9 zYq^{etujKdjgSpb1;wyXSuK?N!K;1_OBr~&x(h(8lh+a_!sX=0UL~i;C?Wz8>c}$y zO1MiOR${GW&wISIO$dsTVzRuG@b~jV^=I`_z9KP<^=Hi`i}-^xKi%mgXLo@;jq?T3 z4}e2(^SCz!DW)m#I@OHNSGHN2EPTJTbbobPMI|1^YY>(ge>t2L{N9 z*TPUt4keRNcSAu0^WzhtHpC4)L;eC+9&cAJe-vgH`w``is+=<4)2c=0w>JLJ*0iSC zHv{R_{m?{}K5lKUnL_G~BU-u83Hxa6Vbi}lJ|z;(c{rp02uxT*bQ3hC0FW<=6{~Jb z7gDeuEp-YMw7+8rSiGc>-vM!NU`@5y_5laTfF(2k20FEWfgE9tel0cf#VzV9GU!F0 z9NiqJ=)p_b!@s=&jU?4yNRF9NQbfPW3Yh34M_suL*L-J_jK2SU`O5|wwai8sJ-=4| z%+7%it!?1k6qx)k)^0ij7FH(?y^8Csi`=NpIxSwRPDiD%u z=soPri@InPeN%ZREbKn4pmKWqAHlz5tvU0(oTZx!A!c#1XrqO2@`q&7=n$!Q?Bd}> zZdOWb{4tvDO&&$O4Rx;?7NfpVD~9*^ez{8)1smwU?JoH_QEGR5m<34He#r#wgcJgS zTRTf=>18k)z{R$;&!QvlbR$!d^^KG^eBwGSxPuvP0@uuLmaiE0X&t1Bhwe|)Y}<@2 zP9Yb1sK_61T~^{`t=CW9A^x24oifb1tUp9I^7Qg;Wt)kBE%My0An#n}-3v4GK_N`Z zDmScr35)?1SuBa;_ICR98&g4Z0s!G!Ns^HPK<#kZ^}?d@RDPP!+Hr(HaP-aNs@Q0O=8;Zc0Xr*P>XGGyIDe zK>5H=$(t!Ov@GhV)D$ce*V2F#+pL|E1CpKPr@zp1;uv*h zv?~61g{U^ywE|K~PE#a|1lX=MvtC&>A#0%$vl+rGj1r6yuGae67M%2z*m_Wtsn- z6jJkaE69*&aB%t32`@f9uSvC7A&>en%1To%%P#JqZ3}3=$mJ9R5)S z;o}>h&2>4rw=JfDr&V+LEa$MC#duZn9x})=q<1_WE62M6l}6M>((uvcI|5~opPL`x z9hNF z*JY~56`tP#*eS!#QQ|$XoNk3j$F1u=Y7y@87TxHKzQo^ifYMbiUK zF_4|GrE;PcT3g22v&c4SX@I;~qS-~;*XPZffty0}Q1hryRps=rwnAdo_zCc^h;4Sh zcJBhO#2y7+6nt9iI3TOk9O5&X{M}u-%+Z)5LvUIo&|xKm&&=WD8PcWP*;;fI_-JL-E3k``lzON@-y z^fQ6dvJyZGp$-oagBK={&52TyhC6pYZed?_U5upbopf4G5m%?fTB~1*$NVM-)Wi&H z`&2f80XVJcA-1%YAB}CAnZSNrXejP-#!1Y52SGcX zf8{7SMPXMc9$&@RjZ@qwET#6sdSn$W-I>M^e=Rg5vat%Zq;kI6TP=vd^Db;pD+rU8H5xH$VrST(oM7Bu%&7 z-u%)$RSeA5@8pg|xer4}*$H_lZ@y@+dTl>VHmoA=faysyPBAX%FX^o96a6>|!Q9f+ z&n#_r;R2R=Nk3?aVHdYRY%H585RZ1p)UGAts_HtF&|?(CU2*o8n}_n|eN?ZtVm6$e zoy;#)t0q??4;OxGK+iRGLb0mxt`ZD?l5YYQ#S3Ymjf}}SMOrp995P8{YP|qn$SZm4 z$l@Wrw*!pa=@JVZ|6dkOL5TAENxf zN0FGT;FZ`cmUb!cG9lepaDVP(l4f0ca}_G0afZ%cM5*zuHTDzD(H@PuTqDTs2t58mQGW&bR_{nEclXJKLKgDuiP zHDZ#la+-V69oCNIM;6qyA&(w48@iNTFu^Gj-5g*xE|!Ap_3hF5HIPrMzDkwf+;|iq z^1qtpVy#VEV=_kt;0|uK{q9jc$@U&{RZdm%AQlzqKn@n9-4(4)(uq8p#)<_3laGSf z{e27I>fB`sLY|)#0#<);hoj;wo*h3@(lk605-osb)SQBflOv>nLTRc@D8XdU_;i=$ zcSAx~A5yEXsd{W*FtuAH7=5XOswh7~41tzfBrgLNj zREnC{FwXt)*lY4En-4VV8B zpow?+u>hbW(1ETX4p1DzfCcZU=Ii$?;rMZ;Qbw83-wVYv@%c>!7+$ zd6Gdd3!?V}gv!Kg+FMM>V>QjL*vj8?`Fm@5S0-l#l9-r358Vod(+QF13+j~d`LPG= zidZE}3Y;8GeG~>*ikpq~m?l39fHpFB_*n%}p=2)keak8I zcGm=CBu>e9Aa(Hdoq@rZd85a#F%+13S-p6k1}|VmzkLZmrl^ZVi#Nnr)I?VGL^xAM z4zVGN^SASxGHmZzhfwO-dU0+_*Ci}2fg76v{zSV&sWY~{_3QYqj~PA@CRAQVIliRH z-a45#fnJyar@}*hom|A^?Z<1c5GLFEfLg9h_&)+w-)3^|W@If*-H>>T{PC4=odWh%^sv8RE_tYH~8-bvuw;ahR&70Ofn(RkM~tYr~ZY&#?AcO2?|6UsdFh z#lN3@)iwPSZ(l%cd513Z8x(74y_h93Gbk5WuvN7C<1Iebui`gd4zr}9=8V;FM0;;U zm6LxEaCDvFeh1e4N3hZNA3;noFza9?K4j(_NVjw*cy5{)Mi$zaeapQ;1r!80fyZKZ zH2)PZ5US&WXL|qMXV*A28?&v@iv5^uOBhj8XT`ptONMe=Yju^}x}{J0NoG!JDh##t zcWvm1*LTU&dFX7qA+6eZy4rc+U~E{z!$$j=%TJ4V8+@=JlOe@}MLd?va0$5XwwYwS z+p5|t+c{lOg5nf3m3n73K7!`g9%W&fnqTj!id4iZ$@sObc*DSb4Ln z9F1mNhLfCCz8AZkX!Z<*0WY39fi>a~Y#m2jx2U*LVkD*pIf7xijhgpHl*PsX9_%Tg zKU1*88u#J9G}jG+gppw#1bz(*o!s%k&n4D_?jHSn4kFX*w0?dunW&qi09oKKg&rQ= zj$mgU-QM^5I=(M1w0_zs&Ci0m78-(x9SP*8HG_E}X7h?QBN+u%L{vpYSy#WnJ%qUI zC>!lHZ30>XZl+NZ80WzQmW8|A^(xlIkz_Z0&fn;HY97g*^Y)2O*E%ei&S=I@dUWb9d@N0t& z{~Mw&D{HE1XliN*o){5GE6NVmmM+O}E@6MVz&}3*X^FRF3Yrft0B>!PXxtsS7w6&m z0ry*m0uuN*T8j5tbuO+b;3F8TG(s>RuoQ?(C(|Xcls+0YQYkiftdoJ3+GAEPQe`z? z4ys^E{2y0gX=f=OG#Z&!+B(H8%`Tr(J3BH=%+Aa$wT9kGBr_&^yk9UiGE)HyVbUwb zH*y(uJAes`{!?El@4x3mJaw3x(9rH;lU<1f?IfNRnanf4!#x;8+Pm#Pf}oK#tuNY` z&k#~GbyAc#_pN1y)Dg-X*-de$k&;G=pP3VV$0J56dYMk;5onCj`g`RQX(qtOAHDR1 z_zM9UU!%N$p89$7fs~<%rqBgGBakEC9;J^Tc7oO#@>kY}$zCBMgkao(RK4f*XuHiE zO0;G$*z*R8xan;xnFhS0)A%PR97WkXkaEbMY1NaMdb%r+QsW76b@z%Q6(sYqzpk0Y z>5)?AX!iq^Jc=W_y~}7~{KMnw-AtY=4V2wPOtj|`Gt2~LF>SGD`G`_0Cqr&6kf&fq z@as;(xAmEr25FvSZ+>x>KApx5WAScGx5H0TN;M+F(4fmu0bR<%rUBcdG8@uwrFcQR{>;95Kux zU6y6gHqr7Tu*@r9$q;q0&!3>ls)?#Sq5`K*Wiuf+PZ$!(TTxDasb)HF^^_jm(N-dT zNk?GAnNKD!?|Ik)DwsE!nVU04Z}V%{CXATO zl3Zgj3uFfDA*zsmQ<|EYSNL4koA&-hDXoTl+YYg)nNsDj7-4v%NyO2i^Tg9!%?iOg ztgz_W9HiwhLIL5}e6IqN=B9~T#+AK_2fI^E3hfnx`8zkx*=56|Usp8gbWYSFYX`HD zWd)5PZ;$&!&!a7RQt^eDzESmYv9j0tC_4nQ)VVyne;!DM0Bq3?1v6A?#Ev{!`wNPA zJ~FKjzy!tNf0ZB+7T|F$ozfsLC;{+z0l`b_I)}Qx0vCxPiTc_)2qgOLxVV72@IfA& z9N)npol4PcVpMM5QWfpKr?FKN3F&Go`)Oz9Y2iauI{|Ce-&4s_Yr+pR)XQWh`<&J$ z{aAeM>HsY^?h$fX4aU9??#*d$^u@}{Tp3${IMO6az~Yl(F;f_k0m?g4HVK5fs;jCQ zfrW9@tZ_M7ovhzo<8j%hn5<$|4``yLP~3X9z~2mX0L3Hj^4F|*Ql?<4PorE(5}~j= zC+$c>w#Pwt%Bj^EXYTc!jnPW?t1$jWZs%5PBE}CV&NOPrU-Gi<*6%h0PUh*Xit@s> z?r_PrKN96~vdy}(YM8K8B|za5lZDjgoV~sQK5w6*cIKC&flNW9@|FJzO~g$M5I+8` z#SPd7YaI9Pne09#PE8KYnXo^RNThq)|E@Y&18RRa4|%7zTo%MvQD|%eHtzp^2&2^G zTYH;&q+NT$m*e}#Q2TSYZUgc>ZyH9yN^*)eDKQfUEj(jawJfL9|Kcb?>J(SA&hl5L zDs^IYOp~|woABu%NrPR4Ir*AFiV(}lFjqsElylE2rZ*$_nOp*SQsJqqZVnX?yst&*d2T1cRJgz!%mPjp@Gmr)9kt0H<_)dOaf7&)fZvF{7*eY)P zNARVN*@?WZ?=`hRKFa-wcFxO9^W?Rc{hrEkU}VL{aei7^ci!&n*C(W{E3zU~+N)57 zAqy1xd|^*tq{PdiC*bMWfjC#{o3dw6&+(YhZIF8csG-PSa-N2s10E3Na)Y zSCqGN6CUj%wx{u(4;tL8AkCfdMU`4Ud|#SgamH|I=CeweprFFS93V<9I3^&<4ACa= zv2-=YT2pF`KfdF=?yU2f+BH5?UUVXHTo#hQ(9v`H6A<5d4X~3d%xu;<#N5sRRw2$x zXK%qfTLJ-nT|j}w#tMA?f6w^W7nn=;`sb1D+pNt6&K|wPmB(a}EOq3ch-Za3FVfKN zFr*$#|Bwq8xzMI*OHGz+8ZIkMwJ~M77|$6k$hFtkmei?(3gM-Gs+O+U++~r-9b`@9 zher(~M1w+O7buq>eIc^aVCrK^6*p~-%FwpIepb&&{q`?@B6afYiErCYbrPN)`Z1xV z9g;p?Yx|n{nKr?G2lK0YYnF6qjV&DuO)U? z=+c4g`(KlvA$#S;jKq>1&kwHnOZMb3EXr;>uk%65gcn(Vq-pB1-p!ssl(d5Iw50X* zjL+c-hyRA%9-Fs*^F-UH6gnQesyQ~(-y>wDd6!n{6_w6buJ|pueIHXc!esDavsGFR zJ~z~g?eq|GiK0ocv5I+k=!|o#7wYrEdJ|_ftltAm6RIz^s;oRkV79ZGFR#50pIIs_ zA?|yvU42yq^okK)vX$CclkYq`*US}PPAWQqd8U_02LQ~w6{h)~$$O$V8VM63-Rt0> zOT`+tO(1>%$%m(Ny^`pIvV<$xer?I@p;)xYJLI8@IK-rt)u7=-yx_YSwu0R3szp-4 zpVi=z;d6pIrClQW5$TTkynx@RNHTq?_oz7a+aMmCLXx|o^B@_Kw)N#!?A37xyK5A# zouZFGa&0CB$t)AOE9+7(kx7Uj$Bz+2OT}tRMXRV`JTjuyuz^?vskX`K_@Xqx!_^pq+_f)hw!xiDW*@BT~VuP(j7;C!5@5R zMcfB9(HTF#PMBaFD(W3>Dy!{MtF+l=NX@8X2`B)2f(K9moiO*u9r!UUpxM^vfuqFP zrP$T5vgtcl()i)6+$+~*k^8smQ&2y;m4Vp{lYtA?Z(a;&0e7rW=;Uy1Urn*&4Ll|9 z6Pj3Z9Btx=J}fClqjw~x3v`|@$=#VSkEEaE@I~rLUweX$r;nHcx67>jM0J_UWRmpL z249JVgm&?Hv&`bDjkBer)ULU%I4{`20bLKBABaN{Q9lMy5WRvvWdfl?^3VR!x&v=` zV3%yZSGCK1i=}z+=_m8Ylj5zBu$- zJ6GhW4CJrm{}#n%(D%IG<+0%&2K~?_zxSdRT3+u+Kp3VR{QOy!Oh_S11j^(clKg4& zrru7l=>IZ>q9~&rxn}|$wu)Mg>*}-BR`&J|SPd08Ph!94P5DXt20Fm(Ai%>_<_X|y zM#RjD6K83S)tX5f)Zr&UQG*MiF1|n`^u1}t=Jbc0v^@PnY&2agS zl)xyvsQO%rRP(H?xJ$Bf)x4-^sZ*s%ONCP(TDBzo)vLNaJDxVM4u69C0~J9i#_N8v zMy?{5zN7#^*GGx3v%F1M^ea!+U}@_Aoa|&SPP*GQnPF^{Z@7`5YDKC0A3+Wsdy7G8 zd=!Z1fa=@(Id%y&^PzBWI-f6gDoD8sJ~Bak*I)3PCaJRMK>H{9dXkuITc-X3?E<5v z{pTiTx!VTs^n-7PS3NtLs*-G%cq$)8pbj#h(#+2EKL#|vG^f(6o<6Nh2J`)?^QxSb zp;6Dmuk0OOTz7~G78^0S{KDl5ufOE~#T&o>pjcB%gPEM`$Im2d9{Eu|x2C7aCwcAT z0}ZdP0_)^ay?RdqforW#{dru~|35@Bu~or%HQzle@X zROscJtMRT`uN~l>j1ihGn+&%(d#k5ESzbC*f&tM8QrbwaFzdc6L5*PJ^gF9y>Vq-2;(D z9%3fUR8MY|ixi6FO8oum(P==20M%oNzck&ux>FwfV4b&6z_`DsH^*Hkw{#mG4lT*g zt_X&8*AAX(tK~pW!z)>fR+P)_i|ngv*)qBwpZiF;x8nB517R4BLTB9SguZw?we5QV z?1-Z6x191yPb13i__k>w^e2bVn4iH47#2&hdpmqslWUw|KG8KH(Cpj10ag6a66ro! zS_-vmvoq7y zJ^Y(2kW;gF=W7D>L#<)SU;USiE-#6QO-MfYM(DwHC%jFR`_ovC$2uu!n*(%DpMdWl zM^z~S4;B(MIg*j;|Dl0BQT-MBtevdwGYo0R3sZVwplciH$h`Z?Z9tFzVK>#m4y3hM z!qSFNn_JP7=akypCadLcx%=WS5KGj(LEsQofeBxCU>BzXDW1`EqFjS%SS8GPlR;s4 z%n(*l2ZSXmSkpoFUiIYxG_bHgN&qBVE`7$4pCtys3qC)UnFawHBLfY`3m1rc!{L6? z0{ridz>(c1K+Es|EbEkQxc-)x{_72l{9s6ODvPaYCW}CfG=luLCS^ zetzDJHA5IAz1)zxsBY^BDy*12?A}3xo10teo6VGS;ENEZ1ol?~WeOt`i(c-APDhJ3 z%v)z-z^s^W0lY-PU898(J9tAY zu~ftomW9hJ*pgM^N$d*N=oAGN&Mxjm=gn@{)xElV!FnZ5+St}K<$Q3+`i{ZaIpF+4^L-Uat405F8A!@o)J+D4xfKKe?NX{Om`upj| zA-BjgGS#a7l=WIQ8ZI}=TEeLPvp-TN;6sbvu z-ny(*JOn?@-t%Ekj(l7-85`zY`{U!35loW|tM9BCR zE`!vVc>34~ce2KlXI>$1PZUGkw~lxY{LAv25c{p>b+@F6p4HBCvyv_!a!>R#mZ2gY zcs6){Z)!~03EzJN<|l&YPmhQ5f7s(0#?C3|^14?RREPS;y~6gezWP%~X+4^5xwBp# z)0$)F%|g@%a-b4NnZ=SnUKUYxjV5too6x%N&IK54VBD^yroe%$rFyO7O(UGZE}h~& zlx|f^iuzNBgt5Oe<@f?2vSa(sB;qv1B(MqI!%#FwOGV4vMzsS;^6kiqYHg-1BH8cH zsJk0(e-E7EmJJ@O+HBexR?G~s?`jCYruDml6;BkWLiq*61sV_=5To|S!}8h%B2DMi z3weo~&A)~d-CASG+K3+}ZBv35pt;spXQoYKNBd<4>JuV|5@0+>dreiSK4wUN?3|qs zf*m@rI+`+h@Y@88(8X#3zpxpQn|NJEW_hbSEwvN(!Au(CA>$_50SUKDIs{#WV zrsIp=`J3`+5=>69mz&n~5lmjIzYE=0ohrsMQon)|Ke9#&)@I!YI6`CR+V?G3nW+nM z!F3*^Y;HR@W+Pd<=3K{H!GdMy0!w%H&@qiRg+}NMUG4kmohHukgBBI)@4puzCjfR( zv|u;2cxRC%-g|@ascxu8|?;}57?uL722=#T0i%l@`kn3us3D?M&(mya!3k(#DLziAU7F*p{ zq3q;>g&RrRqRY4u3E^yi!Z*nrd$~;x<)WKg&5ueBNi&lJg)Q6T|Bt2fj%NG)-@jF~ zR;#TMvqiPFT6>SGRkdpiS~Y^$F^i(5YSYppHnCzR_NdxbGqGY*E5sJt`}g{M&+pHi zv>&|E1%*{Ec+7$k9@z&PgJ?QmB4AyG0UZtR&yxNQWq2#-axT_q4Le% z>~r62qnsIgJasS8*Cn2r@ImnIHQ&}%2IB2U3fjx*8~!8_TPayhU;4WaZLYp4)8`jE zgF=$ydU8Aw|Ca4wbnBmm=7J|uO_8|)00ecDDe;fH+gjv^e9-q{{=)vZh>!gx zkdtZsftp`?y3{xrIU>`UKM5Gf{m&3J1y=>O9!DbG**M@~7vDY^PZ{H7)j+ z>a07riAF#Epi=H~9@Pa7RCqHB_TMrLHZuGwL}Stt=Ch^QqL61cyJ_LWRNi+ORyyn4 z9nc{CxMSdFKR6g}S2nufd+bu;ktQ@ZhE8w)KFqYQ6nRWXc40bttZmsUWj=z|ZUtTc z#)~<6I(jS@Q1{bIYf1GItbL}eS&k=Vt)!b1`3jp2ls z&9->&M|4?>?PY&zd5)ZRGE`l>7!29cop6t;lICa6Hd;XHyngug)3~*} zQ${_%K>X0~eCS{kM)yQJRXV|G^`gyEqEccv=xEi%8FyY$FJE+#eYB(aiwx2gABu6+ zVxd^Ml8&$sEvAo>{$G|gK%yky0)qQANmJ^QdQOLuwJr(1zdD$e8_F@h8V~pMw#)CO z&vuvZ_e0LAG9|tBlvPDo&d<#Zl+HuWo#z&246=3FT?~9RX1c#uC!bC+)CYh46{iIH zyze31-Uj%U>6a?oI_!dt`&sC7B0@+F-BA}4;7OqDtmhs{dYH{OXks|nG%&|Pjz*au>e8W~SFus=1zkAmp2&4N^16Y;v5PP(o7x9V(6M4M{tg^vZr~HD-?X#r6a%h;VQJ!i6=&%;s$zJ^- zT@rRE$v;L<;t0bFDsl#NTO9c2(?w3oHxVbTq(&!Zu?$NJz4vw=q|R&)5f9X$!N3Oi ztNsCcwFeCF#~m^viUFK09>h`HxGS|hl} zhnSwn;iW5(@57fR61@t(WG04SMFfAuwLiAj^D$+;6yPNr(nAkKCoj2uFUuWS~xpHAvvAhred!8N9@@&{~xzTa2 zBDZWKeGQp&s)d4cm`wf_2q;tYuE-epf>Pjhy6rEbJSi+bu*(?QEp>&=cd1u=oYHC9 z2GW+J*}bipUy6gAPh?$-jHaoNi7zc)Sr2zN`O3GnJ4_y+yT&o#aiE-?hwkVl{(&91 zI{!mI*SkB~O|f@}1nIqpvb1Jx!G@=1Z1=8*4chhOH`gzeg~G7D5yjtSBQw4K7l;MH zqAs+uqfz#RfCm~K4zP-45(byMtnUq zmIMvXAX}Yg#l+KI zmiLPhcu_5u6A7_lqV{mrLJF}5dJ!2in@?gZN&Pz^jbeQhJ5@aj+d@*FbbB~8wX}gS z5(;eU*cMeLc;GoFy!`a*Oc!%HWm0gN;G^G|He-rD@ z$1}LoBaoZtnStU==bRZu)=ueG6H@1evFU#&=Xo209gVR@786Qn7+8IRPM1bVeYmr# zb7@A0N*&6kJm!$0nPHP*H7Su(qu$bRJ(%9Lu%PD7{v0kmv9@KDsPdSvLO$``x4vK6 zFi{pH;Y-ROMR1el&n&gCkK%vt2k~1@8E^`K%=4HT-_1k95VSnBqkp7+uTe>Q6=*bADw$sgybQwtCf22mTb@ zi2>s(jG#mbQV@thWy1OOQ?*@UVoC&O>vCPw-<-S}lAFJIH^nvpf4P`muaK#SA2i&TPQ|`0CNOFz2E03#_0_U zsZXf6yT3>LO@_^@TJ}tS7EYf!Oo%WHgm@urb%cE`Le>R!%m#u*Mhp}7NrvZ zl+JU9lz`=6;a=lNT+i=y{W0~%TxU>4j8naATIA6#v%jp4ZEGb^HDYRVK)d2$(=?lu z#bN`TvK_0ry+r95xc5J@6{R;Rga=D?hH#9C2*1Z(%B^JI@gIKm75qqu*<_#Nd+*0% zY8VI2n`W#;pYYKa@m6)0GChL(&EdC>!R0gNR>Pj|}Q2-vg z8WD+kldA7|2!(37qaW#O%1Gh$tRPd}@9%zQB4K}gi)5Is@fP)l_@!ORtnx~19DteW zb6~k~#!EQS|LeIyx)v6*HXza3VyMN#D@pL9b=~eKv!D!k_t`Azp4*rvnCEw+pWw}R zulK+)S|;kh1UppZz5H)UFCHd%hYh~LL>m#=$x5kLt3wef0EPbIKt1=D(#EX`l29i` zhWiM2KkxiG6mh`OQ?L$H@uSyh^r%(+E@f>I7{Xk`7g+)=HlJDOg$9W?Sr^hmN}K|d zEnH;z=CjKoMCOTKD^15XKV4MDc3X5RH=BeLB;oGGTYmeS6SZ5QotUM#hc{uYu?)h< zWxYGjAiby~jwgP#_`tTtQV32l+o^UA?^ieBF(~TS(lE(%# z_UJQ~TV*lbAsl-rQLeCqlu; z)mZyUiRfbnaR5@I(TSPHo3LPDq;IABrAhFz^2%PCB!u=q>+q&1a*~O<#{5$+5r$K5 zgPJrO_q)T7%G{SV-OEuMN2K@sZu$X#b1CBR{j0x|Izh#qWflw5{T!KfzK7E;76pN^ zsp-->np+6He!#JL_9H!Rq^%VzvQl4%wj7v==|a`Uc0ionSm8OSX!(gq>X@buQ0ns{ z>;SaC>}^;v1os6H0;DfO;Gx9*B0M+48P#XtY@-Nd1p&YY&gV+mmc-|OjL5JrjL!nO zDqoFo+0v3-Eo-%7Df5SkAq+%+V2H_Y@QVUZ&VT)gee*n&7;rs8>e@<1yx!O}fDC(j z;K1;qTt8^hRo>#1r48P|YzEJ)Zy`TS!R(iM?wbbn^So6sX>#tC&Aux#{XjtPLLo92 z0U=Uds2XA^;Y4x-1A#<0e^QSpKJ&5_eRn3k(TBnVSv_;HRby|w`Y!dv3v5lo@VsCX zvU)TdraRh9R*^SA{)9K5`$ZkKWEDwVY%I0?(*P?eEARdsdx4GLdhKo_cnLZgp!6q1 zncsuzLXHc^Ca5g?MQM8K?Nz3FMv1p2WfSfWMLmQ}0lb zR%J{TC7>o+Zt14LYMWWtEWA1--d&FE-WV`Y__)qyaZ8mB5Ii3<2bbmYJxcY>Cn#3 zznN*AHm}EGMk`^K-uhsT@F@EJx0lTpIyrP@4R^TN93H9LgFElqew<<60yq7SA(Gm1HMjH#WI;|(cGng8;*M{B{clZagADI%-J>-TNlX-byH3dRT%_rkaIBlKJJsv&F35JAEY zcTK#|8%wy?5RG4JV`K84Vbd7h)~5L1%jaWwsO&f@ z>pFXF{xeV~>?x3Rm0x@}ESx?gTs=E8Yhn77MP^RJDDk;mNOxBD1`9{?KkrP>o@buG zfo2D9sibj6s($Zrk;4F6V*j0~&OVBJ4>vivUws#(C?BC7xhmtcU2`!x_$RiiF@3;y zBaJcjPYUGX^m0$7BTRARp2G{hBrT5^_VCdcYn<;%4PL*b%@#jAl_#Z@!bW*>+x-hZd$)7F^XOvK zq*dvVKk%HC_qMSf*c0e*B)aXL^a}B;D1}RK-NlCpH|_N_?m0}*nO_FwZjR2BH)+J| zF!?{g6z&nLMQ5kf#Ep3CEa1(Mll=}sBIV&fAs+o2jKRw!TV905+E(edzl{p%5Fnd@P!CQvxKr^z4jT`js|iCw{1 z&7jMm1YoCTO*}U`QGDz*^Jbx?l9!Ozp8q-4wg_kF^=i@tQej_ov0z$=s%?$Z3U6=? za1$YFY?=RqpiwNk=+m^tpa*w-qlQrE4wcjv0G7+S+BEl^CJI2+pai%1E-SG3IW z6idL&n7#b@b*_L0fhw)&0xvw)?BKt6Y0YhjmiEVtC%46-VLEm1Zz0#>I-}B)pW<8Kqss(!d-?{Ut z7vKoo7njYfhR_wd)CaEC<>&Z+1)$NOM_Fww;~$I$?9Xofy}5I9m}+WbKP3*`nr!3e z*26hG3ZcwSG$f;JHo=KE5i$;G4TryUAD&}yQBOV z_v>+cn4M4|VXWW&3Jq~7G4uG@SzDp$$Gcd3LH&-G8~*1eUj)~W_n8T*{Tl|U+|Riq z`C0ofdQ&zdDHv5&HT$?%3imlviv8WYKo#jCM+>*Pwh8(A80B^hnm+29Zw2Ipr6PV0 z!$c~r@gTA!?j{Gyd`tGN-I^x)?zWyQTqG}J(3NZG>sE$$r`k)|ai`Ie#USpwYs+bC&VKKv|v7t(&)46#w zvwV3y&c~#FqAz5D*oYgKAQ3Bu3y%`I?0qmmst&JR+|>er?k z==_B(%7ek9!Jrr8;((ReIj|xcIcud?xMA@bfE|G1A`xpAk!d9w%hZ>0OYV%D*5VCV zRQoN3W`9{O#%@YPnTv&POt45q`8JF|-WgbdTn?pmku8|NH=bWJR&fM3?ZQ1O@mw5q z?8e>biCR{0|LOm4?+h%w%A)7X#ILoRka6d;iP&A<2(JK3G77m@6f|Kd(gpR>rm%m zV(=q5x?3!jkLp^|=PiTe6cktVYB8?v>2hUo;hvs}c^$?1VA(&xkG1Gl5g@nByV#TE zr5wOAfqCvp!u84S{AP;5!7q^2=Q*u~ZWM$mt=zu`YI2~UJEK{f&}Eu5w|P#P=EC{2%sYt76XUxd!9b+4{Sr8ICA!tzp5cKdmo;I zOTnv)>T0c52;>6`A~jC2Bj~F2L)TS=-rUt^;uhtI9`X3<>gu{RxZ*z&_t35r!a3c? zk@i|((^a*wc}}>_3ayG~-urQeldY6qPsa^q2LYKEG&urKeyt4Ri2M}N8JsK#1djE9 z{sBqu+bZqtQT%=vdY|Tz7ZX7NiW7@-xBR*NBL0%7x!*(*Mb@skjLyX z0D=D7(sccYf>%~uMx;a_{mB~V?nZmAQqy=-E_R=@co zrM@TC4UIMaAe}fEy!F(4?pYA5DTTmj$CW>zdB?@@&)W%uM@_ zG1P)nZF6m1TNd~wn6JA84S+u0x_@}n?+ydD4K(c%I|RV?XCs7e+N}4jNUOE_xg3w1 za}%u_cE5iVZwpI&s0rfxA;)5-E-I9=ed2irh0&-V{<&}Gpa0e6$Fyb<)6SraPu*F( zz(zU-7JDFACNzxeY#H?P*#B()weRm)oY`BUNhiwjU_(^Lo%?)o} z69Yl0!L`_CRw+_e;qDkp+Y2q;b#JX^j_H1UuUtBC=fVbGb#^wn! zkfstm>`?^QbS?Njr46Q&F({@o*}bIP?Z`c7p!?A@;vcv)t|U|6s6bg%ato}g&+mTr~y$ctCuqJb2w zDsi2;p0PRo+{rh)6~+`IO!g7+EiOyV3N)rh%TB0haRt$tE>Wi{o73Ga-wnVxYLg1IBWY(IoW${(WJn=w8?%_T<}oFOtCM*qBWYAo)n+v^O# zlWl_=++XzCeK(Zyv0AQNXi1}cZ>`Nt-&L1sX~3@s$X!XYA-N5ZvqhkvFghf+#MYSt z7!z~dq0`XCba<&>d}s=_2`hvx)4hfaES(-lSNhPF#>s$tvRHtZNzOiz|DU%PuuuFt zP*>0W{2SMmcyGOe>a1J+mroV-$7(~e>R9%0V?*`CsvG{TzP@sA7&WbgG8u!5&+41i zZ$4g76uTaw^6ZnAXAG9ff$-H-kGhPRE&PxWrOTM!kYqZkcd^ffSipKJ-A1R&4J;su zo3bHkH}|dzyK1dw2TNQ+9*m=62Hp0pSGt&^G*=TV{}{I!#ELF8u#-LW2o*cUAb31A zOmYQ%$8@y>?QAtqQ>$ z1sf~8VMQ8Z%Bk*|mDQ}o-w53?RFDgYh!*OrIW-D%)GQ}QL;ccsLUMvQs>WzCl%15U zCrwWAFN*{OWXMBnGcKf8E|ej2nkDGlO`%*kazg`nQ&_OND+!zXuEf2uBK;WveHF@k0tCppUV{1!Gi<7O{a!^@WMx>GWSnZnNCuj{_ zWLt*`-?x&BneR2`^jeCI>y;8ap?k$XI#NCPoz^`2ClNl{kL3lgAGGYx$}XQa|CXH_ z9Ln&lbdpS`xMl}r@u2M69k4uqS=^-Y7nL0U`Q-yHF6a517}pP~BA-7Z&Bs<>(SMj6 zm-E8m+F=W!LJ8!l@;(%ty&PI{>i(MzA3ghy*|8^g)@1bU7)c~kI!N0wJ~!l(IpV<`>1 zQrZSegXNo?o3E}tftv07kbN@<9>($N2pOK*qdsA+!9w-8B{87a`e|xDMP2={ducJF z3x9<;@RWWj|elxamt}xy#few1mu!V z%Hw*Z?|KvqsI(z)kdtZCPNiMJ)K%7naoaf3CrH$dV0U4i8|oz_L^fwV-~#FpU!-hl zaDwL0CwTMTS{!k*?RO`ss&D>!KCk82*jf)2gYIF4xa%T&EQ7X6_-b`zkZ9(XhI*7X z_yzu42Gx96Y(CZT=%-?Sg50Z5;ayKy+0X6dkGF=cLh_oq?)kf0?U{Z-FHoJ9y~KV{ zS{}Z+h3k#H)XQ~FlBmefcS+|sO1Cb_2jm{mpi40%@O$BE;kIF;PnP7TUbf$>XEB5I zF1Seu)q2O=Oe|N(I-0~9d(?}L=wzhhx4_srw`k=WHx8>`?KnLGDD&JyUM!w-$BQcL=~$>bW*^lFJ>X52iuEET=O*0@S8O3wW@dXm%^kEWDEgV4 z(Or8{@)KK+uH4;tUD=fWpwDkG`G1PB%-1S7NIyBLRy$cIK&_#@ErwW^<~we_wkxq6=Aj!ve$3f2Y4Sm>L?|*p0SL(Wd<+WRoY?2;3VIW);tI8Uav#|`zB-&5G00cp*woPQb@w+e z{+pY6QJhNvXwy`mt&v?Z7qMmGDvK_>LN-Qf?YJI;Wv_>g&{*DNYB$$)dY*%da?tXl zqk0c%>|K(J@vl{KZKkAq{I@LZZiVLWl9LQR5oO?~d`1U})Td75`X(Dz-EX`gE$4Ql z=8k)&Fw+ytOOSHs=S{9)q_WbcZ zy53XMinHF!pfjQCSmsrkRFSk3xexQ|V786=;QPepLvlrt+D$)DV%yiDpt@1yjIO12 zvG8_&wqbZ@f9k)DiIW(i!K{=3PXUXYg1h2ZUMy)Q2A+1s5by1}lI2he3;$Y`V7=}T z*4D|~(3}2;odQ>dxhlZ4$qk+BpRPdO?dyP_2!1s`+?~Zd0-M+)))p$jvl^FL8O&`? z(;;L~v>n&D1eQZ8<2>`@A0 za9Jp{%i1 zPHKsWbSoWR*GckVp=xn+xntY&mN6MmkjFCiSh{OCU5zzwok{eKBS0!R4{Hq9o@~Ro zyNw=gDQ$0MP#0i%+6X>EN=t&NAvfHa{5yLB6^MwHNA;)COks;~{x09^`=@T04I&55wmqlExtjZ2*Z z|2Ne@D>`-Xslr^! z6>T&*f=pRW41;dt61XEWZ>xLJ2Oq6uwP2n@5NC?(Dp07qC+*8_qIM(fwvZ$EWu$MP zJ^}GWFtOxT*f)VcQ}MzuGSi^0^q`KC`3`6aBoO@_ems!^T?R7)touO`FzEGxd2h+o zH2z#E>R1icRv(YM#s%BxV$d-eK|hMd#V@q$5|!k2Nvf!J!aF?$NiMqn-IwMi(|miC zKPl5+>>63{j(X7c)GGiRTDwiD*$d=>NhmY5xH{`|7h%XT?YC@xV=|lYdnF(j_C zcoN$((qsie61)nD<86)1ZQ3ROrJtEgrv3xZ2X23=)8dU?mnm|V6x}@c;W4@c`F){# zJ@WexJDnV`;X}l!>h^>#ztg-P!cxnInhv!F1?e~6*@5uy08Ew|R zQyf%GYW`&~QLV{H3k^}zg~)o5BJG5Y_}R*UCAXpnJl?a$=-OsFU(Tw+#JxzH5__1E zg7@x|NMnkDmh#U?gx+b7q=*7R3sy`RtsyI{SiKa8$0zM#ju*3c9su-j>yLI)Xa#9! zC7i57Mlr)};f$-om@Bz!m8QrH1bdt^hvw!f<|B!tKIZ63Ll3xQT7Z8q*u(Bk^G(K1 znJ`8PJs}^!_MJ%0d(4~liC#~7I0U98lx#ZRFK|8;uQqqh^$++>-7ju@#3^5d2v%yK zQ*+!8^7$Wpsg~i|JToHFCTjkbnx1}7skCyL+d&0A>$_!{=_q|Y(%!Z?EH!yt*QA4r zE)9ij)iv==z-?hH$YTK=O-p==#NXR|6&ao`F5Wz|))tygpW_CP;c;<$RerbQxm(9v&$;OaXEV}Cq92)`tzrtWQ~fUA;s zz>*z5Qv;4QAJx}YVb6jr&k8V=+xbD@N$+W^Di<0pcl)e9aQSmfXHn%zV(N6;_nmFz zj$I9w&+^G`PGhzXrT{$#w7Nv<(QI+bMs>=5y5<~{K#INCmx^KfZT3N_@HDNfDWtXd z)TlGP_lx1eg=DYQzCz`v7Gu~FL6W$9^H_j^<}{Vq%@_5e)okyZl^^+|`6p`mJoop48vWQDpPaS%LPqBBm`gmbK-l@|^hS ztN8kzC=hY*VW6yQS6FH`}R6JqP9gRvn8*6d4r^Ii}be#n8 z#S08r2_EDmwGG}AaC&IzFFzF{Ue0q!!13R>-8K0Pr^@#i;?;7jUVQcb>(0>P-6 z*_wj8eWfPme`~ZKf~_8sS1H#meG%2LW@($b|9Qr2Vcwz><}R6gzwk0$9ZkV(YEtAcv}0e@ zav{-GJ=bp^a8Cy+-{B({q+>B*`UC$+ALoX?-}xVjop4f-8U94}bIiuz(isf0iyqjJ zmu-?Pm!M->cv)YMg&xBt59n+N^PGehr4^g|PS=#p0FLZZ&7LW3dG{V9&0;+&Cr(fz z$a44Q%zq@^Ld!JSjQI4IAh$G#n15y0v&|QsU6E!BuO`EP#&7pqMTmR}jbJ zzi57|m%Ux==?>fd;WWnP;y1L*k2^&p@8tZBF`DaeOZQ2a9`_kI8bhK?U|`T-Xe60Af_Q~t*BA=qq62!`$~rd|nmaONQxhpvvBo97$ zS-rRC5KB1;!Fjdpd605N3N-A6hO>3oTWtHD4~6A}H_qv<+u1FMx$cD(wVdf$?{Owc zF#mlEy~;U(N}~05dE&vA*b|ITPxHi%IFjFRWp{Ua+96Xd`zdZJfN6qQede3GZ`m~n z>~dSwP2%qb#Y8aUgm-Au{0#MA@|gbOx7q|%Lb`oeeH8||*wm)2L=c!U%UgJBFPSTN zf&p92SlT#aR3FAf8_v_fU(m3bA@d~bzK{;e)@VJHTT21l{Q43>T9q6YTb` zAOTGp1SyzT3mMz;H85Wgii;cH#|Rxz_x_>o8u{OP2+P!P93Ibxe0Tl+0=(^L-WEBH<}l9_xixDeXeuS?>1^sk>R#Is zP;M#Fl~^ujZP5jo2ugvL##$6X4aSih`cDb2bfJ)@zb!uD8mFNP@?^n=F5AFg(#db) zLVT`N4R9D&7~5H49SQ?`5;ZNnYs_=Ft5sW#PQ5 z6Mr9w2yO+66Wev9d@NkdApONnf`P%|&UD3ikbQ)8luv>ow=>sUHQ!r41QoRyIx+n! z%rVpvTlAs2owYt)kSxcHO}g$*EdBG?tibrdTXZXx*-jm2Tj5qC?vjr&b z|3~sB;6D;g7WS3+#{RC+@(b2{7NdUmGy7hdgX@zWu}KyxR{4J;h8YopaSfRQRWr}| zyiw{TYYSB5tPcW^(rQCekGzwmBBH%WhIn{GD~E1wondNgeSIz4zFyd12Y=&)tn0LW z)9hEz?y3Wzt4B35cPeszVtR5&-Os)-oc{FwMPbMJ$(CVzN$tJjdoP-Yl?bgy-i?8W z1n94IucqWEkD16GSz6!gr+a$QEmW1(r*_@vzJ*IljGNjt&gqIsdx`i$guGgbbU|*}Oa*>(r>tKZEyF+CNIyoMr+tP&2(SzQC+^!)pKZ9O6tQa`SEPRu0vNWJ zl%ONxmKhB4@O+I2#MssEn(uNLm1!Cpe{G2V^~9$1XT5kMyJL@g1xKt|M}4GTr{L;I z?T&R-!E~?7@EFLwVfPG6482Vi>O~?q=+_kjnm`e(mxnw3(m5`hvLn^M->;9xZRwye zD|)46WXr<8hv0PBIWY&brE$4KJV*rs`jEXL3`Y>jN+pIV2 zciZ(YgrqRnL}fR(Nf}yNk%5H>OHuv`%X)&eoGMfb-W}YY%FM@uHahK+lEgr@if>IJ z+3twGIzzmd(01LR$j{Tq#%x0QnwUDu{HNoE%yR6@V(5-OIL4 z>e63>hN>MqBx#Y2>Wd4{1aHSC|6*2EUVmLhJwNckOG`i!6b%kTY&S?l+Yx2C+6C-WxXsRCUbSw9|dz*pZbZ3m5TC)twjA5)oM`#HQYI~ zj|t9pPr9d>Gxzw7w)EdHlc&+F*qb1ySACJvbszgV&t3*`eEBOl*3P6l=D zSxk5EeVt}p6LZG$k6qa1sFNsv>UiE#ss!l1PMelfsdrt5hB6^QTA|B{5WhTI(@cE_+H`O}uHWabp7>y1hzIujg1h+Hqo+pet1xy@ zn$T>3OosNG1t|%5`b?$rVhgnJH|!?o@9`qcn5skG1a;nAY)ZW?AiqayQRPx`M|68w zQ~@pqS7u|uwKJcKzfQ7Ie0HQJN`M^D)wfx{WUQ?G9C7;|!?#-t4U@tSpfBO8_#*=EEwtYG&{uBBSyQ_K>12+0S*zN*q2tE8DLWV!?z&LO9vu zIY6C8O;GJ_)ARS%9HXm^=mhmBW9;^VHC7zX3wFNkd0`xn`6U$Ekd)kW@>x(_^bPGn zaMTB%c~-E9{&>_SA1Hc6e1pxVwGJ!perxl5@Yg;W#0Ii=g*?u84!ql)>l_GlI~TY# zef~Z;J{&17q-wm+6t|Rc&pGvuzl~LDiiv%XmX>q9R@vEk2B*}1@Iv&1>IpOpstjs4 zKk#bwecj&r=MPFtLhO(%*1et2O9ZBCZ3dc-B8XobPg@n{&ZX(H9FkFq@wC?bt2>K- zZezTX$vAh@Anv`7i}+UGJ^H#gDCOHXNf7SDA^F9VE8qeG+u?*?A+)R5jajxsts zrppuO(Hq(hr_2-IzJq|vuQy_ScB0Z}tM=gIyOHklM&jq-)CkUEaq8Xm)@V03SVjh< z5}Jb%|MU|G?ZBDXTnK9AGumVSk)VB!u)^F;?U;s231Y%aJf z;iy_qZ3qCW3;5i=*eP~A?{~BsNme88d|8s zYkGI{{F^4UF#qQpD30Je@gK=QZz=E1lXPGDOawEtXQ8v?sJWyX}Vtly*)UkC7OUFP#}&s}>NcbkuP1aAuh211 ze9VrK5Cm!sJfZ>OdOA~p6F^WRB*u49pU`?Z928qh@jnF1~c zG#u{s0ZqOMWItmW8(FQ$l#+V%D7+Ljye&E%x6XO;=+KoKcCT2ipEZLM$+N$I`L~~} z+Pk3?Yd1Mr=+eo8Iq2n08gX2ZdHw$1K5<85@88Gg=s8KDhX*t?!IrucEpzDJWMLC|t%4nHiX1tsfjTq7+rCX?QVuSadN&bfdnuQ(m;w`^NUfuDc-g-u~-Py}XR7k0#<@ z+WYv=3h+Ep@1QUm?|-`8Rg4SiOtCGXy__j$&Lq**iM|#dZW-8Wq(?gVcmAnyWiNUU)wIOvA!|uvV&x{P1ZMSO{ ze{}HEihWdB{Ti+;)X%y?G1;(TL#D{>U*Dnl>VEbYhi@zs^bCTIh1fJJWZG+LHgggEzFEN!L_!leLw-oR1-x=)F_2u+k zk5>=8VX%;b_MWBx9@^!nj}L^OVNeBohq2%P2Q*{`w&VK<#=lJ;u_{>l-0|vIhSN02 z>0&f+2i_1;wF*|%2Le1vVI&V`3w&==gA zA0(aEFF>A{di?)7xUKK$33Qw3VOXJ~;Di zA9d;pTvu7>YV~1`Z^(vt;UXThVo-;+P4V!g;_;4eXX@&+WTKu2nUCcodUfdmzvct- zu~tXb(+B$x|07u<*6+t??nTyCd=TAJAf|D}d@#z(!<$&MU1PHiG27)W=8}oHSZk)n z$qFAhNH!N)SA?b?gj@6WPaN>%t-dhbR9GOKGS;cRR*nV{t>8~Rw|q?oZwlA7t<-9vOprE zrfd@oQgy5a0H=A%=BD>sKi_s7qjn*lX}A#AsaRW}C7BH^#?82Je#l(0#(z0b5#2^L z`%ng^U`+I5XXS&wd+Eavph(!^m#s)iC&f$fGq43I;Ffhjjhd^{(JC!=-+_~ zD;KvN)^<@+7qj6dC@L1q(eF|m9P<{y_Kc;8R+ zCiyP)!Oiu!M(%URr1=P2{HqMEOeoehWL|Tf-KT@(_=N^fwndf15e-4^bz^(uI7&e8 zPQbZIzN4LcP*92a%;tIFYHf#IWoTE;^3XDVOBD`42DaB4K(Ows)*5FbE;WTX_w+pJ z+nz5Y>5$}JsNi)t67bTdij~>`e?lJ;LO8tGV z&QD`)pi{YJ3;*nnNxN=bU1QPgDUa58+vM^BrDAF-v!vH4;x)`1MNqOqVNGo4z<-8t zK)9n}h7Ga<%-l@ubO#lO))SDa%4e({*k`(W#OPnFkA8WH6WKR=4gQB|v(@!E?8&$E zReU;e6wGD3*BV(;rn&^RF&L8wHtp;*%$m{0qT?v(-c72F!xR+RoR+W>beuC?vd48v z-XZmjo08}A)s#RPG~RF1vv!&5K0Zri^3q_1i_JxmcRwxe@@;U*X+jsLFmP0q+vc!E)e1=iHE6}$5#tLG$Qp|SIIS8QC@ zZGWNy^|0q;@jvW=@GfBK!J$1+R(BS9MA)!oZ-y!^$I<=6U`=q;Fne;;p3(4H&29D_l{D0`tE~ zxX?Dg5Ka;Y!P_#VqM$Gie*JN7tdOEci>-|=@HV+_11F@!#gr`Bb;Si$i~8Xb8*2!p zu`)mI4TYfZqpXOJRHUzx18sMB;{y+uJ(9Xczl%Vl^Ja8jeKyvEo~7}u5ts)#EeArN z_k#amx0C`5<6dsIB8Kvt$N4$I3X_d9TMO^8ZuYGg=IFcCsdv4YmKkbm!rW^9E^G1n z)SKlGX`Yc-J-+{|f$fKzmJE3yX*JR9mMQC*`pL`?L8ZxuQN_`j&I-Q zZ?@yC8QaHUp|lGNn@wup;e^48$`aIqD^}v>Qn0BhDEM!aJm@%fGhE}q$vsUxm_mT*R}JHOw|ZxbKhMgzH4N9Tg_MdKjwPYy5v(#vlghp_+&cOhMkg`F#t7W$4Pwxg)* zEaMw+z1iRWR&KYYa$9`v zTxjCcAsAAO(z0br30(V{FI{YYlR1kG1DNjsWEOTCremt#xc_1hIf!(gut289Kp{(4 z>TF08@O|-NI_*NRm6Pa{Q&UJausjkBXDqSD8QM_F88xUxlM9wsWV>PJHCBRV=1N#W z`L^8{*4get#VoEsIMas0v!@8>!5i9zs+UWC-l&hF;d~=JPA?fAvN^A98QDz=z4$mQ6G(Jo{F4jqMxK!bUCza3>9$-eZ;xPKXk@RI@9^b5b{tS0XIIO2(Gd zy9KB;Z9T?mNK*!oatn!Db|TzWPgidPs1JhgvO6u>^7HT@Tj(Fz9z-*xs?!lVsvLWVjw4g553Q+Fk)J z2cyp=8SHNH4yG3IKfkJshqP9AcQfH37a zsnzXY>?FB0D(h{}2Vd5NGG+c^r(xoG%G6o$YSq=0ikIX~1u5m_AwtOj3&6TRpHb;! zCGHk4;4MDNM&@WJJp+)iR|TZ(3lR~;2`!?UbRdYZQf>c}FMsOBaucIEZ@i=DT9qDV zSzKpjYi`C{BpW0{g$Taik2bGhqUInibGyHu(IG?ND09EKn$+LDs5Z)%Q|ttN(Wf$b zPRex|Csk*WWTq6XniRtgWS_NuuM^lycyhX3e@N9Q{XdG%J)Y_Ri{naC2}Lf=wJ4Qa zG^LTb|Wg)k@wV5yfW;cYcm@!C|szS~cdoOz_*1mGIMtT-$M;r%wupieXLG0~N_| z`D77&Hh&hm?fSNb9m6kb>PR^M8=z|0;PxqzbS{hF8<3 zePsg{)`8ZI7kv!ZzH}4scM53#(VLu*cmPvPz-#(Dl@-v3Ys`fRk2*8DE9}YU7yOn> zQ)}D|ixz%E7YM8w=b)?ISAqi`0j?a@M!nrLDv@}N4z@yC0qyJ1-tlFic*@ao&LGH? z{++iR9?2#scEwZzXoF!x>jWxAH=WX<$3J)ZP`ZbWBdD+g(54@Ee(gWlsO z;?KG9;;{0=U(bIlUO-ZV@$6KXTZk8Z9M?z9{y$|A9_xKhrq$!=SH4Adsu$j?oDaIj z06kpfPy&UpEj~Z6kvKa=`Oe_?7xO7IwT7$X`6Zv}UU`Ny=zPoa)NmQC7fRpyEY zIp(c_9?PxPp2iz2(?jkra_<(l2LgVEbWGtzq)4BOANm zYmu^HjUPTbf5>bLXgq@Q$Pt?c)ErQ&!t3<+r z^{!B?nljUN3`U5P;Knm$T~!N}$Y^3ZjF-z}*UP;!c4~ldA+ld1E11uN#vJhyC^?#@ z?WEkm>Fcr}gGXRzt8pbAE#5b=!@-OU(Vb-Gb7$~u4CgMt`2J#(=66C+_wjmMIj;Nn z;{B6I;kvcEUnBcmg)c|yI^G-iDOA>MA$aMjMqaOSM=kOscZ<_ z5Yd5ClTc-0wrgJWYP#Gl4OL_zV`EhmU>qzl9w?cq#nXEXdE*x@-SHp8PFzqHa5tM6 zj+Ub0*n{H=ek^MZBg*lF*aZ}&jk7jDcipt1tH*A_XNY$J;fWu7U z3}UHPMfEs|lEuPL7M<3rNh{w3&ItJ`~$5(u=sIL%B21okp~Rgq1Y^E*j;k){UMMe}$+Y060J( zY77B{qc=l5v9b7&Xyj{GQ1F_jXFD_fVHY2E&7%;3K?4igyl^FWji{qIlmHwKKvOqZ znEws(J;Y9x5yBjofInXZpyZ{{p%OBq2?(mp!8Nx%k?a(dvC$dpLtcCK`r+|58s(tQr^`tr*A=l7Gr*`X2xJfyWF|chXs5U>wfAl zp0k;&+yCe#4^IX^A1Atci6~4Nvm~sXjv7T&ektZ;3ko$lOm%tJ>Ju_%*XU;6+?>=Wo-0`okZ~jQ*p^($q9T$ z#t+rR`m?qWC{s6wQU-B#lJ7H0bOLCec#O~U7UL*PvCUjALvrt{U zghWa6?lt3i>nHwDr?T0GFSiR=Csu)!JdZf@VoQRL&mXW3rP)pr*pO;!NeMPfdRc^O zB{WbQXqt?bM`odmk|MS(ZAS@9EDM6900oOZoAoA(1bOyLZi-EVP*6|RTMv0lxuI9{ z5Vn~OEXW*51mB$R2{R)~szL<$cS@?4LQ(dAdqQ|JX&49}pMZv0^ggp#-j6(iHbEU_ zzJ8GmjmC|Xf5Ys`B;#N`REOik#j+dim$&#&qAtiUJ%3xMnL>qEIM{hEfPrD)Wth2f zR+NcBn%o@r$bUNEuVCNi1xlR%7%sBq10~oB zln}~UM%LV81NwZlJV!!AuI7rU-+v58nVd#M;se>oFZLqmb$nxZhtK=&udJQ(@wMqJ zMTS$_LnT|Pk7z&MW~5=-0-OJ1koj!m_2~0%yQc6*2c6uYeCVgECJ#ObWo}^^ex+Z^SyU7fSf9t4^Y*)unE^M)?;MNr0E#^QTT; zUmOtX0>SmuhgE_)RRVJQd-MIz1EjzIS!QZlv{4)UfiVz4HNi0JCD&C7e04z=90BJ6 zP{{%f&NDe$0@_G^HWp%x$4Fk9dA7?`QolIoGik?YKhYw@hPj;xXWgpJx3aeiN|`BTSC~DHu)_$= zlSRC5CH&jpVL`b5=J@3=ctOG{VI}=H9<19)b@u%{otg5e{^Y~xl%0?;&|C}hN>4d;kLJ&Z3YdRtuD3JbFX#ayw3Z0zezfa zKm*~9KukcNIx{t{6fZ|6G_^ENscDv4&j(R?_w(4?0v2}O1?gHRcHgES!M{ zIKH23(-pv>({wx8rJB{uetfG+N?!ep-#R8#T;SD-ZcoYyD0~Cq>PVU*Ypw_+t1_Nw zpXi#52<^%^Y*Lh<$3eIOfbDiJMYuv20FT{`N|$g!nh@ehGq37+Ua)RwVii?l4Z}9Y zW_}wggPLp{H>5f7BzVZp36fAQt$4ZQ+uLTNaG=972x-h9vff;_8Y8xTPXRb=*o8Gk zuYpP%RuNM?dV|$^&@#@bwWX$E5{;mo8$W=-R1<^~O>qeHreEtb=oATLXH`{LLYe~p z)fqQ}ouEFV*i_G@_AZ1_m^J>uj(uq)=D?F1W(|pxZ|8L&5!65R%>B~f-NC$V!oKtW zcLNjq3ar>=&4t=(udkqtuB z5MRYm2oWqbze;(5Zm17}8#l_3P~HLKZssPDmhm7`mGt!~38~`7boHr=qQ5e-!jrJx zUq0JSH;wQ)GVvT1xYLbJJs+xXOZmI9>fBludSF*4V*6HSww-hwf2Q$UECUmq3kZqB^r>!mEW6GLr(2d-OfF-W%%+E#%-bDZB;ss3x{ zN_$jtg^erd{&ygj^4~G6l!$F?OnXP@33Hcz=UW<&v{LwvJ9FmOQ=Xu6lkCW`xqne7|tu01hL3 zKEfF-@5)Cr8m16&2RDlEgg-Yb$wE?nfal818bN&wpvWR8GEWz*KGwC})AN)mVmQmY zn*Qv)o^vVL5^k(OSwwJera%8KoTC(_!kN>3_VVQ`7L0s)N@A{ycZJ{U5}&x~__OLE zT$vbvw#ymxoa6&qcFCC%1i&pEJDP@)ZTj&TumSzHAp%`a&ytq`PDO$HzBv)V%4u2K8a#$a|eOItzyKWa!uR{G4s zze6M#@0dPJ?p-C%i|cJsw)dyE(BW=Z#=0smtcV_t)C$eom`Ep-UnC0KrReP^@A|#Tu7NrxkGMRibyAhI7TuS}{ zs2Wu=3TcI9ZlEYP#kCWIR0?M)S^YqWBJh~?F(AJ-QDWwjs%&y27X^8_sl;X?4Q>|T z6|?sumw;F=NF9BwRwY&;HQNLadE`StTm;auRY?69{f<7e99l)1C5K&IMnQnVRJ`OV zxY#nt!WQq;i2Gxw**nj?)1D%Ck<(zxFYju{hxJ@3941GK$kI%^EiT{;$p*u~o?Y0G zsaW|KUm^Yr45~@3(nTB&^9;)59<5NgfsK-j;{DOb zaqnI!rRAaX;+=gPgFKcEy2OOq6X3}gN}x#X(*nCdMhVD~C75%G{vyTa=U>RKQL|bI z9bFIe3d;LYM^KN8$J|ADQ_#;5uPkTDP);)i7*TCT@+ZcyJd8(P9inkM_<<{lr zLP9C#3td@=xKnvnf-8_bS?Rv7OdhA!N11t313u_06cz0ojoU&0Z6D^!jNcqRg%Aa} zC+FNLeyC9US}a=Q-k4gbJX#?HHT1dRL!X9#<-P;AWKF}~($s!DaZLX65AyM?7SO8# z5226PgqN~hxArco>gYdtHGE!oZbVctFFC^QV&hP9+w4$_Kp*nFL`y@>&Q?yS zB&zBQTVuH;!2e8zDK5qA@+6|&MJrF6u2nNH0Ahh?8oZtDY_vcFFnuTTax%c52nMq< zZxKSXQ|}X({N=AKZ(6Qg@_J=*`zs6Ooi^()(JNa#hmU8c@0B&c!Z#YUfIHnN&op4;JQ_-Fo(2c?J}$&_5d+K%rrg)G8Ardy1KV^_l4X9>#3~i&##`4{stGag~a0H~e}|{HX=+^$6um$BXZ;F|3TX!1dH44-rG=_ zd{a0G^Dhm0{Sc4dW+CU^+)XL?Hha`(k6bzdM5WelplfZSrl6i);0MJJ<^+*Zj5f!t9B6Jek;wAwdsD;f(V}RBTmg5+w2L=1o7jdVQFiB##X0JW>q;#0B zKWb*~NLSC!2ORi=O0fH7+$o)aY#rT{12=UCUQ|dG{8a81SPZX5VBmh3lrfByRG(QJ zZiSOHnPCB@3g{Z$4J;vLy}b)Bo1XhU+b?;bs@l)A=`}xm98q!;l<^@XqbcK4;OkP$ z-*Yx3NcG@>9CGT<@#j>K2e0v?MWm1)$4lPh2b>$ZFblg6k6ZBWYde&b+T!1xfW3?W zvkSFB@3O8m&85bnD6M2f6OH}iQP(I`_7a)e=DRRZ1eTm4+C=Urm7!*v!4xjdK=w#fBA;4y9?rb z0I?y*C0&N|^Go-yqCqK7Iz_ofU#0~2>I${}(<*;y)A#ms_ZGu|&`UMvNW;(WDM$Y_ z8~2FOv0*L4)Hwom8&$n`%KEV*`Dxwz6*)g=2`+IZm{&;T3Qw@rBPt0tr2Ff(#v#WQ5xNhHeP1t9UhCJuFB#A{ z?M7R~y%pc}CHQ+IV9P>Ru}PjijXRQ6IZJlRVTy3r64;dU0p)0}{u{94V6%#&fy>Py1X6QVORUC}3mS^SFsD%p_0xjv|ub|j+ zcfk`&ob{Rs2FFSc3US>+Lv#EP9FQW|p|yR%x1iWA{pOujYzg_0!(n4ycvn6(&JPwZ zAq79Zk#9!|v0eu{Sm@SAa48m=XODG8F)@_JZivRWI91HplAD?p-<>-6qK=}$JIN_A zOS}g`YJ7_emtBt)ZTVpKS<+g{m3b2oVx0JY3}LxXprodnx@gmSg$Aqwp~>3Djl%#* zs-M$_!4S|=6%t{x(7DuLDX}?0B0m;v1CCWCx%Uibs(pa+9GB!FhOKSBRNu0~h}&Gq zm_J?whh=V`OP`*ewX^wMPHM@g7fgT3b(Td_cOX=s$R3@d z=Rv*tFJBL9Npv%?>9{9|`fG+VSGx@R1lM%iI14&&YqflO!S1lc;K64j!r=c;_tc;# z&|xP&NJfK?EO;NmtJS86*%iz~{ytTMKQLE3v}T>pQ9Djex-nH!=Ww~}wbOn2&usk< zmYAvH^i|bt7+*72W5#dBm=DJ78RP28*_Sety*f@aJ1k3N4cIdQUNV(2x5W>Y!>r%F z%Q`prDX9tEvg_JJ$I4|g}?PcB*6i0D%x_IJL;ZF}0=6nXU0&AK%BC&K1rmUFLH%@D;~hmlnF?RZ>o`VBQ z&+wC9o-U!mE}|vNo0;rqzFSJezcm_j5t|yoI^*LzGqyi=hc4z$UVNlq=jxPmD^`i& zU*nHIy?QHBT`5RcO;52Xh{npUN7ygAbAdM6N8jht0iPFR2twQ5y-fe<>9F~S(BR|N zu20r;ny7I7L%#Dor*6gN-96vx^^q}&QF_6!iP%aE)J0Rf#;K%02{?kFB0KmzjR`AGzz zEuIjJL({a4{`s?NtC%%3m=m_!m*}Bc=Y%i3VEh(yPyND+#neZK-;^=Kk(|D)e)z8yC7%` z_{eMbD6n`gs}4vPPoWz(tdo?OKuPIk7q4HwAj+-0 z!oe>3cVI|FZ?khc!RbApTGBx$f70Q>w$^2vS@zB4>n3TXWun+2$G)$Ak}n7eYf%pQ zC+9aWDc>+s>t$+Gdf_8G-yYt$7OPQ$mEI56nCyCtmz1YyS~O0`4Gvb&RDLd)#QyEF z&^2kriH`XfmRVbBdza2xlO~(?c?1Qs?Z$*2Px|>~TEumy1toUn3fAWbN%z>_uG=G29PmPDE!T=reHl(&4B=rG7%)4^r`NKSx_$uJPGJv#bHQ@q=$j|2gEe&C72P7^HFW1=GcB1C$igBbQGTu}Nl(@w z)=Qv1lW&&!gCHMq#utE6ybV_YE1H=kL%^AsVt~__}_FdW=AO7 z+Wbfc^t!#N-iy7L_g`yvcc$riK0oKjHGlL;jnk6|=YU^Aa2>q{Pog(${$sdCTJGx1 z>uMnM&$-O-*|l zaus&$8S9s<1D8i{UnD7l1QP|S5=t!XZs&MclCw5$7a&|bnN~3Y((<7gP)V&MwG{pY zlh&f35MbW$t4@;R#Bh9jOP&?-B+k}hGu-^=&-u{7ifd^6cKW%xiChC64m;fvHMlP= zYgIM$Ur*D#9@Tr+YTo;Azra_fOLmixkNi1Bg5LBk^(N|Su-FaWzcV!lT$wqu=^eTH zwjSsHrll7uA70~F%x-JHNoQefUj;DZ;Mx52Gb6?iMt8Fq_>9l&6 zi?^c#@14s$XX}_&#tPx(uUgm~D_fL3PTd^Q*$Jrlb`;nHlENUCLWOupD&ecC;o(b~ zSMA9e1kHGk{uw*B5DirDQgbU~_kGu)`4Vi*Zr|>g zA9=H>ZLo1f=U4m_dQOQO1L>iyG_`cTDI*JMfPV=xu^Y^JC=ZrLtnez70q0vr*7+=1 z^ir*Y)2I8N&2l4!sAl>7Cl#c~pz4OU3-qBjMH*80C=J*FQ@c@^8asatPrvDQm{^XhOUctq5hu9~+I&1)Z{f!#8(l52aNZ6;eF z0k)Ooo1jJvKPU@4mt+4jE4et-XOIGe%i#$}NX@vZ-azl8&`#e|Ah>jVpHDUK+$>oo z1Er7|4lB04T^OuUSW)hfIVJzHb?SU}Fvy_j)_%a%yY*3Hsm!5JrnV2zGVO9JS{?Po z1lu^i4Ayc}FrI#h9Puo(Gmv~6VleHN?f_I>#kpmHrMeoaWeR0ZNE?HqS+_4!AHMKE zUjN&E;X2!I+_|%t8#~2u?xFAAGrF%NU{Y)N1jJtDAxS?vc_8f@-Es7DXosGMVYVXOdM(=V5AFKYh=ku0c`{x?W`|mu*LJE`MO!kkMogY-&iw ztczx_H{449)%4cOaJRK}?#I&xqiYWOcd)V&jx+lAKSlgD0St%dWz?cLS^j;PgTkOI zv$ON^Idwg1lNB7d2t^qIII`KTLK2MS*WT<%slL;t8!v;GukuvIS>a#qD%6(+Me*ia z$t!PRSRdx=p_UB31d2C3EQV6eskP|wN9WABL8{x@mk3YzOB6=%5|x{iosy>~WdhE* zbn%MoPG4>}N#7*&xnj5F_OvoD%2}`pf49kKc~&3ylgxB6!_WL7wfoZN9Mhi-WHP1{|FU=RDLk<6jG}RPpYwL?V_?FEy82 zxrt)vg(Ys$fdHURD<}g7WycX}nzWo`W&g9mDhO)IS9t-|)XhD)MOk@%3&L#&*^;V9;Fm_ac#;_ePTZQ0?1ZnZYYL+*l#BgJm>DSN(M|M)kis_m>txqYTP z$au+RuxgLBU~B$hXyH7-mO74y$hKuGL<{7$Wwm8jy75@3nCdPiCO@#Q8JF}!TtUD{ zocd)js&7!B72+yXa_Ki_P6n`-p8S}CRgkkZ+SIfa@(S%-1#dJjjqnBK{$M}S-3PuM zzmKCNTEc^&1wlIf2~;emIM3)qSDWd2m>ma4CiVxqs+OM>%IG7T2 z(*CA|P?xN6Xk@2E21WL1CmTTM!+knJyHebMY^|FYfR6g^wGHL9{)|N!a?<}^CzN#7Ze3{ej_|b zww3mLn(zGey{m}8@LA6X?wz6Y;=?Y&QLw29^_^iX3d-SXe_KNkAZTOMw1wh0a6N|& zzG82;IJHzWOPQRY4#0>hij%_98pOh2=oe!T0N1Y;V`lmwvoE zd^KZw_yXH#zZt|Mntm&_w90~h3+UOaK<(57)Pq$mjHRi*0*e&-2q+@2gw%JU#vsp5 zk)}vRzULJLLbW$@{$JvgmQ7cR8{hZ#n;Eq!vF=^|w8GlKq)hPr>*vwPixLC(6g7z< z)KSQA!Q8T7ynS-8W@|BBn=g_gz0K9Kw0e2FJAI2^P={el#aru4r)xcM&1}KZ>m>z8 zAJN51`!r3S=820xe)r4zMsw<|K;7@9_Sw&p!Wk%8_h0@iw$M4NKHl4?WkpTH@);~2 zL9kljS06kE6i!5EPT8POhmhiS&9^Ctw2=Q86#LX@ZT~UQG>vZqX|){=3qZ_DO;2+2 zo0H%*x*9khfHk#hNXWl$8J=e6DV2%0JUO?xnAV*>^P`V`G&AzkyJP+Gq-&YLc=$Kb z)p^&Vx*FFyMMjDL7#_TZcmI>B>o}Rty1&J5cCRSC!QrlG^vYXN!MBvUE{^+#(QzkT z(fTE5w~>0;9Hrr*;zO}e%mQ7gb|T2(2av)Z&?1+2`L~@LAra6E$XZ+LjL&u=Nh<|#JK_KA~Y1L$U3juY~J6kOW` zznW@>_d5_XzPVwRq0r`3>ZTXbRq_dV8@+M35gXWAqxo-vYRM^n#?@}_zOVcIYa)zD zv*>rhclvH%>6G{tWfx~eSjg5b3#Gnag-ywiy+r2+ngbw^X6KrEuWixnFVB3=KU;gB zzf6i^_f4f-{(wiz;6eW}1QZNs=?YCBzi}!_ee@6qWZToJfC~r+O~`46g+7^B9G8?o zu^2_$nIBq@XByT{9OzEQY{%prumo@WgU_?DzUtGQFesw z(~IM`lh$EA%6|2j59aL?^2(Bw&a2&r$H@oNPt4Tu<1RA|JIJJ)JD*D03cGTJCe|kR zt@cH~@1D=`ElUFR@wK8-I4u6F^uu8Twzkt` zAoG*fgfm-+Jo#KB`IXF&?$6#*I>&zNlO8|(9HqL2Ej=wj~>JV9&=;PLatDo4ZftCk|;)vr@jqnC2-iiQH4$G<8BKR`pnS6mP2 ztDGXJ#J9+&#S=qowiHDwiSO)WSTd!uwwT6hpG%v#@>HK)%-E&#D3wdJvuOG1FFm`)EzOB>m zhVxkLawh_oSHSncZb{DNA6L^~9I`R5-;Isylyz6SwEhMDrjz;l_V*9XymJG}WQg@< zPJ=4{;(L9yDE-=VYr=w-D^X_#R{SfK^E+R4;1$!guV^?zs1ZgAi44o2LS5ZXlp3bT?wUEd1@A zwx0Mp`tWo5*Z_Ah9S8DK8u_h>Mi8B;Z0!WKebfkZB1PBOhK04=6JL+4kYPY{4{~4U z-~C#qN%74+=zgGT9Ob@HRq!8!5TLPoE6l$p%)ms4{0d20Ygd**xR&?Shin>)3>cGD z*_|DJEsINVfTRS*$u4`D(HqN4|SY)8mP*a@jCvpw){LG3@Ja72RmZoraw9Aec37UlhH&imZm2 z!W1-a?aCeZ09Ql!QJ^7i|BlN}W*oqfvFm>$O{s8Ew%;A7(tIIPr)Ka<0KE|z4`W*F z|L9r1P`*t=*gJKHM;qhYIwT}8npen|?-QWDv~Pg>5ZH^#Lt3&^1RkBPuxg$t1MX5s zU`O@q84;7dyN((b$zvbik172d%e*lbP2t0BwRxRk-sF|{d6m>r^kUm)L7Bp&r4gp-auu7lWd^6+;Ai6PLjt2Ttq0rR}Rhfi_c! zT6fF|?dCDg8e5b1tYt?r;a2mQ=j+e`Lx`gF5VpK<7;+j+OJiLlY;F5$K>oer*G+w|e7RHe?SnfutKNdLk4nWv z&x~Ut@z+?+x6a!uqmFWQ+PK_ z#&b;Z-$gVQ8uH~hASnwqx5?=i@+y`4OEFmmjSVRt)TS2W7G5b+W_hTpC@k#h3+x)Fx5AIgS4= z=-sFrE|)F39Q!_BOsvF5C8ZZ_^W%6ANFc?B!12eoqsxE0sx-8_Rs;huw)LbWW^j(@ zY2z+a;YguwDJ;OAXZO}>oU5lHVWK3u!j=RLJfG*cYuFHxx_7;=UdJl?*JqAt<@f?q zNdG0rP0_u?kuN_7lgwl;Fa-`^>Kh*iv7H%=IvY7-vl^B<`(7>At@D-Cj7!qX#*Rnd z2SlUTE{JJrc)enjaa?`V^8Rw#@(MX7?nEnJ z$@}v>R>rB&by8ons8;fIF=?{%3t@8jtaArrlA|x4?V;#e4a3S`T(#WWQiiW*a`J&) zU4zT)VTJ6a^4}^a&`lJ?5s15Fe8ORPb+zpOy8f*5Ux?w_T9fXl@>S%lt+;PNDa+vI zM6F5x>PyLj4xCUGqq;FxMN@o>CUbn4rf=o6)$EXO31Q=yYhu>hW&`AoRm)#w&#&rx zzB848P8R91p06(?Hw7dUQL-D)b}|Y|tw-R{YS+muDt2k3)!^H9VVVr79=N<(G>3n2_p2H*|UCi5>MA)f-D>U2yjAh*blumloaLLj?lCh*J?L0j%T@7M+pkJe_aCW* zmv2PS4d9ave|7vF)U2`O$61KT~= zgp3)Y5Op0Y9@+0!Fsw$aR4dWYS7}9o;aW9eE^{ds9v8ayW_$vH;Ooq!sV5ajHpV;j zFH0z+)_A^=vFY~;?o@cXU0#>pjep0r;-o)x26tcf0wS@eJpnAg1t0OqkB%hQ=e4IyLmEDfGd$e~{S+~`u7Z_f{k+W67b+JG%2N&8kD zxv>cN8t)uZw}Jc4xt)=OuqV*qoCtX?Tz#pxqmSHP3x_tMyBoUV-!aVS*M17)bdx#B zj|!SS?>!^t;>%xno$8vM7Oqy9^M zQOl=!k^(q`R$V8-(O+rZl@>m|O&${W-!12?&4!ZzG-SX1BV_&qQC-Gwa>5VD<}W-!Lig&D4FwP&iu@DpX|+J|v7dIcZpfjP70v$YGsc~PozIvjMcL}o^3PM03~Mi3 z+iiUQ{gxiLAOAI@@!9MOV!5xAZObNzhs#C&Z%|GpN2$~+dK$6xp}Hu=|+&S03+?)nz%9(!nEOq^LDzv zzD1qY8v#_st53=uSRyZ@44!?*-{v`lx!;N!1mp4zY{bRyv?Pmx8^$-)21EHmT}8i0 zY&wRXOuvA&nr=c6WwUlwB-3lIVMx_d5FLeAu6^`)yw#g95UVBmlpU_$DDQpbgB_5@Pd^ZX%{C zu{lU*P(U$YR{5o@1-yhakgCg|S-*b@1W+m~RWuJcR4uHY=XfA~k&(6UTw^W4MlHR^ zqRmLl)<#uBDMW@2y#jS4=eaumn!4Fuu2H?9kFN zSF{ZUkf~?qX4Cdc$DbBhJ%7m;cvtKXp~Kl*)Tu^!_i( zE-f$nR(;YwbDGVu-DGQi{w`D0TozQ6_(6xk^$%MZ%58i#zD zW%E2yH37ZBJ#({|S~j5%gM1qD<+<9g_kNWF(sUw@UC#px9%g^(A zlAU|n6m~|UH|e}#4|XAmsC@^Hpmg?&ZuZg>`J)GkVD7;#3q=*3M($Q3T&#PfV8cR? zITeC#-ffFUl8>2UTbER)op%M|dP1CC&vv@7mZfq8M}ZY^QtnBGQFJHOEZ_m;6p;H3 zM7q?@(QQ&E_j{!=6#0wpASZ!cdSf)4jC=5diK%T zj;lIq%__%51r`d=^Owx5U1iF6mNbnco#l~@b~{avnpiDtgg%T1tH z(5lM^s`Q$kFT}*g6b~(h3NUwR{+?9%lu`dWC|3;FQGac^%iZo&ZEb&KgahwPy``X8 zt<)^~XV=Z?VeP+x{Wf<+>?gk!X2jy;zUm?#=p>z-Yx(hPo(~(G^jpB z`}BTktzFmZ6u#nf=AUoxW+bHf=r#2htt{*s{gx&hT{+D5$P9VZ+!NBCe6YZJDzG~h zAHfhsCY|=GFmUTuRnMo?}wtilEl;kI$cC z^o_*R^cOOTb)Ll^%`>N-{7ZX&asii8?{OIT=g8KB0(JeDb1(z;e?4@_vKnC`+uTfowq0n+qkm7Y-^|&nz}zTfWz49k0*1vG{W5 z74?;p)1g;wH)1>G;F=bAxdHU@SGWIb<(<1nE5+gAW0)T+o}IqmF7?u|kQj zgewyG;-lZ{Sf=0ldF5bv>rXJi*S}eOCab{$7hPG>BKPPpT<_?o;P%Tj>oI)G$%+s_ zLZAw?w-am;-R(7X&WwL0_rDlH$}XsTc9KRgH4X+V6Tw80ohY%2CMa4E^~POI5>@(L8Y= z+PY!EXikyQ(9M=q#QD|5YmU)P)CKZ0_-4mz<6gZ!JFRycRq_a~`7Z9nfccxv-=k=L zgD4R3`dU-eKTj&F?ABelwbFLR;l1*A4DJ0UN$&Rbhl(~gTJ0ZZ6 zE(H1>^1RsS`OV^c;O~l_{(~7O$o6|D$uv*12`R~?@oI`Y#pvUdd4|q{P7SX5WqrmT z`GC)?ISOx2K8%75#secBldM&uswf7Rf1fm|U|!?n4EdQk(AgQd0`PC~fA9MgUO(Y6 z^kE+QJ#$o{oA+#oHn;Xx(jTVI%@t?G16oUf|JiL>w!zEmOP@YeC1<8X|7zrgdoF#a zgb9YpyKtu#k}SZCN9lHfc9XSi`SMIGshb;|IR;)hx{DYD*PDZM$o1#K{Vh2V0;KyL zczF)*QZm=dvJB+vCT)t%LV-qyH3H0ffC8pnFz4mkYP|`2##KuX##a^|f#(%$zkG8VuRzZ`>LA^EchNf?qI5I7**a-jujL*cg{#^y7lz8+6)xW-Zl4 zzvU|Orn}t8h1)UVWn`6HtXP7ig!2d8@o!_BnR-nDtxc&`nC3~oZhe1`o8wD0&A2Vc zQR$WMt+1236nFS0aYFiE{*3j0fI>7JHuk&1MIsYSwfXWAoAJbSZ+I2@QdPO8HdNqO z-*sFH#7>ufTZ#3}B=A{XqWs73#vdl2X+9NpH}rOK2^6$!7lbg6v&6}r*o7M5L)e}cctU}MzC%gAbj#C(i$jyQ*J2}(Y**T!` znLY$usP7fZM%V*g6PDr2(;ZeUx8KvEO8(cinwCq7UDk==l5N%*-lZnrC|co=s!3p#O|xuP}v|E z=8%5<0>jX5s1lJoKdc=fR2c2W$m3X5Nz=`FfFOO)Bia;@6N>OGdC2|A zxzx6y7-eVO_lV=kltLG#DMv93}`R9Tooo;1tK@X?h@6_et>AXtp&5Ku@yxQ z(}3&a?cFoYwT<e%KC-wF9U*k8b(FWX&35`^ zH}mw~!kM7d?icF5z19bnxxhH*t#6ki4~GyXbPz11$_lY=#MDOFe36vsRyf9t-we-^ zd>sE(hq}5p27Kf!MpwI?<{}K9`TbL_ez~BiD1BH6vl&6OMyLlVE}6&e zsygf(b}Vqi5La8cT!3cNdYjb5=>z0ZsKsu;H+T2g`cQZQG%FWL%PYht6i)z?yGvH8 zJ*9R*0WM?{&4_jC9OUaV$_e8`(6LU~7i+kU6@>fEx2wD_Ha7 zF+guELi<3Or_pGdDp+$@3MJn9=r+bcF4;I4a$;}~$Tv`RbW`zlQ$N$|J0M~r%JyW0 z@yNnp7ZSfeBxbprk+Yc1kq;(rbIfcU=f)NOyctCJYl7KX%|yX`y8MWfW85Q88`G=~ z_3l5)*|0#`%l)}z^r0Ru&vl!S+5>}E9Zs}Hvp+4qbqiqF0{*mvx2eUgQ}CvJBIfgp zs3qU<^WR)j2td+f#{L;!Ul{A3A#|TH2K_yBNCSwCtuDGc0KY}SbT=qk06Avi-sv@W zXBWeV#swi(mkOO{SG@Ze(uO?#aZ{&;JXQ4ly3h9CzQ8uosr2ohWLU(pT7+CmsOB~3ywE##HrJ-MZ0UHpcCM0S?|j#*q^6te3iCI{ z{J<}|wBG$t=K;5mp%areeh|Ro5SXWO#X4{rrF=;E?VWUAaGLoqf9h~`baZ5Bp?oS$(jFcNeYG#S==kd7-4K>pBAqA|D z_tAO2pXZ3s-rN)*5KZ}w|2Be2;r$1FcP)%0%^i{LL3X7`C=A3{C_k|JQr_~%x31pv zms`S0r*{gJoe!i-pTYWaJL_P!4m11@Xs5LRW;d^)!fXh$+UR#*_f?~Dh2d|*t_Sv> z2R$KTn9&qS`B*I9S%P?R@s*^Wnl;L+hRsaS3k=I2^v; zlvCFq;Tu-DxYbryCc%#`BGgH4hK4eUImwe;o$OqvEc@;Z1H^CVt8kPDWvmT8u9#xI zJKf(F`o5#6X!#$Amc{=)uQ@kwWEFO~mx|TpAW{+N(x3;&!;m8T0)^BZvnC}C|q&yS3 zA@3YNDTO?VI_FbMw4VZ5PPOx=n`lEdKDX?>{#U$xR>_M~&P+7RKhVPQ+7k! zpwsZ`{`VO+?pzs4AWo{Lf?^PL4O=k?vTB&ZuVb#0przd7Khwn7&OtT#3fNyKJIa6BLPGoG_^Zpy* z(3PGUCS682fcWR%=e0x~lMXV|*l=f2{CYZC7&;`s7GN0dQQuvw8d2ZmDT`FMKk0Am zDIKZ#Sv*+vlW%3n$r^*^o!fGVXm2`N_>RU8Mg2ep@9RNb_XN)#M#v5HIHkk}G-KRX zD`)Wb@13NA=T08M^6`=3dge7Ne7Nsq8}rf9O6I%fzibXQ;xT$zlPlH`>#c2`bRCZy zpTE`Gzq`g^0WQaLl6K$3ep)txTnO<)U#VzQKAJvHf|2fu1cZQ~D~O*E3J7x0lTD__v_;T-aSo?%>tZ3kGM}*Qv(EJ^f-QD-EN>O?kdcC{ zo|x^km`~ZEJlH8hT2v(~q?zesSc6miZ}2Xgmrjko7%Iu|6f4+(12jXAf`91OJBoK8fOGkQOA#SneZAoseim zi8r*K3sH$2b`rFo*l?(Umt$=!N`fW#L=i1Trg6Kv6^>4}5=_jJ=>juL(EzEzaE6%m*a`X3PfmJFe%Cz?YW%HE^Bo4K+K^YzREQj&-5@iI0 zz^ETmE~lr5{DuWuCX{il|K=N1k8-0bI%2joM}ahmKkyX;wF~j*5)qKnMO-1*v|_{M z`yUN zEqG$|QnQ~G6Fp4#(Me|>i9W0QBOU$m^=a4Y3!d)=LrT#hvA)u<`tUe@u-ySic};lX zKakyIeSqk@@5($eC5ix+rNYY^Eo%gWye-p-eimJ+R08V>ytdw;*;wIdYhR%0dyk-6 z8(ila+TPd*kGi$JSAPp*32uzqNHa)2{3>wCjqa(+%%IB;^6bw`t*Yip?n4ix z$8{`Q4X__vu0E9cKxKJqd`s}QxIQ+%_-46WQ1Xsj_lJ$shBR#I1|1`HHS2=Q%OCDW z=4|>_p$#g@mr0YVvWEfe#W%jtEzJP*^6 zQ`i0^b>O$Y;;d}QyDs9-r3$k7e@47?Im{6wof0UI%K%#J&Rc9!ovjsMFE)q%DzN9_ zJF>EAOGnE@L++_rLEgh@`j3DC!`%@QIj@wtd4^7liXKy36E{3;Xwi6onaKaKt=E(? zF{uwI?#THJP71MU+so+$DxilC1Q!8y1?V!lVEH!y#bv&an-!d0^y1qsSiE|bl~ z09(U`U>UoC;97BE*>Qc6d}f>ZhdK|>MU#+OWe@+%>7c?|j+CDg&2x3%kZ^r|L5s=K z$;+l?Ca)n;m0mPjKpi?z4#NT411BknoDW6l7s2xRfrhZ>Vu3OMQB7bLOOkI6F7kME zxGKaks6zX3uwg+LA8B2yw9NJjMn`%~uYu-E=Dwf5CV*EFel?ez6LL4F!3DLH!3an@ zwnvf~=u+xx$2jMt_Xmg}v`Tr{fo4%Os1*y&2xlR|p)3l9JZUsH%^gGUn?f0{4Wg+yyTYC0-!oj^)y zS)`&Vb0a(5K^z9R^cf@#RZm>|j`6mIfZgHkB0_PxZ!8|l6mxZfc%?^x8$q;$)K{df zXfbapWjWtIF!okUsY8$PZT+?@Uwo7B){m#R_c=Z+(+Owq9{hu29VKUbvdqDA6+e6h zJlp!bIt(@z;~XZTEP_6m>q;MU?t*{3b$Aq|KlQiHTcxhmi6SFa7j2eZ4u^+b`!Pj4*uo%urt4+`WZW%vvAYbcC=LSG{W|UQR$YfXKp*kB|>g$ zHhpWkXQvoP=PXu1Cnxhcs zmy5QS3{lmc71Z?lwDB%f7r0zonUezo)I7Mjk86XVg!SDSA@?84c^6)e{NR%vtXPQ{ z2_6YLJpN-3cE%iUCq#B4YmKB6tN10uGrvmu@%l0JlS9U?Iyz!7i_M7*FWlP%GK)O{@&*6#p32wky=44#q#`%yDV_!;1{4># z!Tbc8%pTRsF?xL*|HUQV97Z@d?jtz6!pu*8&$(!2SdcxOrjHdCp4oFid=PD8h*GyH zB|2ClCQC`m@st~z_8!UVH|ygH^>1URM;8g4!I6(!Ixz;|nXdjG(^C@MT8 z&&g}`(g%XcDee>t1+V9t=|@a|fRnduELwlwOw`>eGJ{eHV(e3cm%6WzOA6GzRK-XJ=EIN;01L1< zJ6I*MRz&=iS-GL`6<7Hf?ul(?yC}X!eeDg^) zI+cmw{k>(ShPt}F-myeX);H)<-A(Rin%5@J_0NJkC3ANVwuQQ;{1ks8uuAKA?~!}N zQf;Xny7CM?pDyK0800LW^glU@trzHv8`R|@3Q5m}I^Hqu_5$QC*)t)`)e3t%K=<6x zm*$bMIad`Be9qPD<9&6Qn`OeB_X;A*MK()?Tj=Rh==yt})35N4rE*z%eNho2-e zc%OvwYU{hSpI3>m{f(=dzivD2ezL|S)k1suFg;_4kvY$no$6_N3%j(795t@_dcZ~M zrF^Qmma#zO1E%K|Y&tAKH8O z`QEDM`iEz>0mJF9;#9f$_}p%^YAZ}>;d0+t<}=d7$WBu}Ex9$EL-PT``JeIdIIREl z&&l9@g&hOa$!o?{t0v~EYX0XBS^1v2b<(r2nqX!T7w#tp-KNby?>_oLo7!b1ykC>e zDB7pu!om`B8Si13IAvfxax^wPXkhMdZ?? z1(ZzsdydI#r?*_KIF9eQwXh|XdWs3&GQU6rdd?9yU1~{PUzfP+S)Sn#&Rs%sOE}8lw!4n_1~GcY+Q*}}8(#_bjGSc0Y~^b7 zHANPb{Z{8x%IpQeVGh`SA@-ZUWT@CLJPwxn^P@bg!+;P?E>rg<$(<$cYZHfPC^Wt@?cSv)V)tdIpM>oY{Ed4PGDnF@x>Rhqbyu{>5m9j`);-Bu&QUp?jpVfOXCaNw z%C5fQDxwKBl*gI_lleg1(LNoxYuHRXcUA7Tv5&*|m}yVyE9||XDW8%y?bFcrItpK2 z$+`?e+7RyZ?Y_}cYm(=(>$${J%xn$)QSPtZ zqw=@l?QQf*z((L5!)b0i0yK!m4fOP>m!Ry;#+Wkp7|Px;sLVslWsMwVtkL)&PyJ=i z>Q05+OSVW~ca^0~MC-tFwcKA66k=oNGypQYL2XFSVm1PJ$7I%Yjw$2)UV?AK8pB=3 zy3f**_AVqS)CE}`2z*@rR%i5d0ys0A8YhBx{GA(7Gj{bs6RQpd*O;3`s4PHUHd&#Y1#sl_);)n)~899UCG5=l*_idsl;~2 zohEzW=rBJ&Fc!scBCFV;W~U6OrH)IxQ+SH7?YbTv_lJAhgB}c1PiwA zh%ON?sAnyO{J8qRCtxMHAawQl6%gBn!iznJmB8u_$^V1Zq$sJ@g*b06SmVBdg$`3(oH-6?{+p`>Hc&_TUyvN)WyWGLD zvf3LaAeq;%dHX;sE5%q>SZfX~!Uz5J=mOSvYcOvB{WtN{A^nwuQl~IVVgFPqj7NSO zKDo1QH=0vrXW(5qYg~aHq053X&zmolcdTVPfP35iflOPI_`xQ*1E(elg!#s8$~t{v zwqjFZ_9BL3nltn)<>S2QT|2-fVBFA%g?c#EPPbWCyDH^=K@{%K))kykQgfSLv6Ma$ zKuVo-iiX{C=^2l!9-7;m)lt2Ky-1rM+xFzKODWmCIi`IHF1W zZVSkdb{7D@v!-_MJ0(G*_-ajAe@%%5$a_>r0x3Y^+U#~v#k0^h;y zTfUx52@X;NwtwR69##cL?smBZr~Q&3P#1sm59P(a9sSanWhxX8=(o?F zTc15~B@p|O`j2(xS+FW%dFcUiF46?(Mt|%zqwf>kfJTIj#}PD#0! zqRw-svNv-+$M#-gJaah@OJw(dqa<)+f4d0|1b;m1jEztnNo|hc_?-Jeq8>+he#1Cw zIYrBIV(⪻Q73J3lqcYxDQv+0XQn zg-~DTu7%;*KUx8`(;u*6A&SO~gLkG=l0R+kFgWvfS1*MDewp`i>6Mp8zMr&|59F2u zjMUe}MsP+RmlmbYcx&1#8C|NYAA?!{k^%obd{c!MeiPc*{pAPes+VzT10Y6EC=InS z_vWR7Lf3TNE@L-Na$TdHD(6KFS^+ z7Wy09Q?0{1GHH$vm7VW(3(i7Cm}Bh+t9oI0Bj#-=j$=3qHtQt9*mSsn-XQbg*Dw&^ z$?k*71Rf^d{7sa~Pp~kxGaE7#+6cHkt?G!9qmneDP46H|YHx^S7*m}l_`DtCrigDg zJ|P#8i~aur(WWGZFREiR7rTIq1f8p8i8CSp*Bk#r1B_w)x`5Y)qVxjjnMLft;O#u7 z4U)PaGj8yV3i#1E^ysg98A}&QA4mfO^yL+?Rp}MvM4sqGLLlmRN#UGd%j^j6t~9L z*VYM&!YtlF4tcp(x}>m8$c0l>=C#C; average_hfr: Array; } -interface ICSingleHFRPointData { +declare interface ICSingleHFRPointData { star_count: number; average_hfr: number; max_star: number; @@ -16,7 +16,7 @@ interface ICSingleHFRPointData { } // phd2导星数据记录 -interface ICPHD2GuideDataPointList { +declare interface ICPHD2GuideDataPointList { dx: Array; dy: Array; RaDistance: Array; @@ -25,7 +25,7 @@ interface ICPHD2GuideDataPointList { DecControl: Array; } -interface ICPHD2InterfaceGuideStep { +declare interface ICPHD2InterfaceGuideStep { Frame: number; Time: number; Mount: string; @@ -43,26 +43,37 @@ interface ICPHD2InterfaceGuideStep { SNR: number; HFD: number; AvgDist: number; - RALimited: boolean; - DecLimited: boolean; + RALimited: bool; + DecLimited: bool; ErrorCode: number; } +declare interface ICPHD2InterfaceCalibrationResult { + calibrated: boolean; + xAngle: number; + xRate: number; + xParity: "+" | "-"; + yAngle: number; + yRate: number; + yParity: "+" | "-"; + declination: number; +} + // general interface -interface IResponseFlagGeneral { +declare interface IResponseFlagGeneral { success: boolean; data: { flag: boolean; }; } -interface IResponseDataAny { +declare interface IResponseDataAny { success: boolean; data: any; } // phd2 related http interface -interface IPHD2ResponseStatus { +declare interface IPHD2ResponseStatus { success: boolean; data: { flag: diff --git a/websrc/cobalt-web/src/interfaces/GlobalParameters.d.ts b/websrc/cobalt-web/src/interfaces/GlobalParameters.d.ts index 3379709c..3ef5fec1 100644 --- a/websrc/cobalt-web/src/interfaces/GlobalParameters.d.ts +++ b/websrc/cobalt-web/src/interfaces/GlobalParameters.d.ts @@ -51,7 +51,7 @@ declare interface IPlateSolve { declare interface ITelescopeInfo { name: string; - apeture: number; + aperture: number; focal_length: number; guider_aperture: number; guider_focal_length: number; @@ -64,8 +64,8 @@ declare interface AnyCameraInfo { } declare interface ICameraGet { - camera: boolean; - guider_camera: boolean; + camera: boolean = false; + guider_camera: boolean = false; } declare interface IGlobalParameters { diff --git a/websrc/cobalt-web/src/interfaces/PAA.d.ts b/websrc/cobalt-web/src/interfaces/PAA.d.ts new file mode 100644 index 00000000..dcd563f2 --- /dev/null +++ b/websrc/cobalt-web/src/interfaces/PAA.d.ts @@ -0,0 +1,119 @@ +declare interface PAABaseStepsInfo { + device: string; + instruction: string; + params: any; + id: string; + count?: number; + repeat?: number; + children?: Array; + conditions?: Array; + name?: string; + ra?: number; + dec?: number; + after_loop?: Array; +} + +declare interface PAABseCondiitonInfo { + if_condition: string; + params: any; +} + +declare interface PAABaseAfterLoopInfo { + if_condition: string; + params: any; +} + +declare interface PAAScriptInfo { + file_name: string; + modified_time: string; +} + +declare interface PAAlog_info { + data: { + params?: { + count: number; + }; + }; + device_name: string; + instruction: string; + message: string; + type: string; +} + +// script type +declare interface exposureProps { + exposure_time: number; + exposure_count: number; + dither: number; + type: string; + binning: number; + filter?: number; +} + +declare interface targetProps { + target_name: string; + ra: number; + dec: number; + rotation?: number; + exposure_list: Array; +} + +declare interface IPAAColorScriptDataSetting { + target_list: Array; + warm_camera: boolean; + cool_camera: boolean; + cool_temperature: number; + af_on_start: boolean; + af_on_hfr_change: number; + af_after_exposure: number; + af_after_temperature: number; + recenter_if_drift: number; + unpark: boolean; + park: boolean; + find_home: boolean; + meridian_flip: boolean; + guide_exposure?: number; + restore_guide?: boolean; +} + +declare interface IPAAMonoScriptDataSetting { + target_list: Array; + warm_camera: boolean; + cool_camera: boolean; + cool_temperature: number; + af_on_start: boolean; + af_on_hfr_change: number; + af_after_exposure: number; + af_after_temperature: number; + af_after_filter_change: boolean; + recenter_if_drift: number; + unpark: boolean; + park: boolean; + find_home: boolean; + meridian_flip: boolean; + guide_exposure?: number; + restore_guide?: boolean; +} + +declare interface IPAADarkScriptDataSetting { + cool_temperature: number; + dark_time: Array; + repeat: number; + warm_camera: boolean; + bias: boolean; +} + +// ----------------------- +// IO related + +declare interface IPAAScriptDataType { + script: Array; + setting: any; + type: string; +} + +declare interface IPAAScripteResponse { + success: boolean; + data: IPAAScriptDataType; + message?: string; +} diff --git a/websrc/cobalt-web/src/interfaces/PAAFixedProcedure.d.ts b/websrc/cobalt-web/src/interfaces/PAAFixedProcedure.d.ts index d06f1ca8..6a099cb8 100644 --- a/websrc/cobalt-web/src/interfaces/PAAFixedProcedure.d.ts +++ b/websrc/cobalt-web/src/interfaces/PAAFixedProcedure.d.ts @@ -1,4 +1,3 @@ - declare interface IPAAFixedStatus { success: boolean; data: { @@ -28,10 +27,39 @@ declare interface IPAAFixedGotoRequest { dec: number; } -declare interface IPAAFixedPolarAlignmentRequest{ - start_from: 'West' | 'East'; +declare interface IPAAFixedPolarAlignmentRequest { + start_from: "West" | "East"; move_time: number; solve_retry: number; manual_start?: boolean; + search_radius?: number; +} + +declare interface IPAAFixedAutofocusRequest { + filter_index: "current" | number; + start_side: boolean; +} + +// PPA scripts + +declare interface PAAEmptyProps {} + +declare interface PAAScriptBaseHanlder { + savePAAScript: () => void; } +declare interface TargetSelectDialogHandler { + open_dialog: () => void; +} + +declare interface PAA_step_info { + data: { + params?: { + count: number; + }; + }; + device_name: string; + instruction: string; + message: string; + type: string; +} diff --git a/websrc/cobalt-web/src/interfaces/TargetSearch.d.ts b/websrc/cobalt-web/src/interfaces/TargetSearch.d.ts index 53d108f4..d6d14c16 100644 --- a/websrc/cobalt-web/src/interfaces/TargetSearch.d.ts +++ b/websrc/cobalt-web/src/interfaces/TargetSearch.d.ts @@ -1,156 +1,169 @@ declare interface IDSOObjectInfo { - name: string, - ra: number, - dec: number, + name: string; + ra: float; + dec: float; } - -declare interface IDSOFramingObjectInfo{ - name: string, - ra: number, - dec: number, - rotation: number, - flag: string, // flag is user editable, any string is ok - tag: string, // tag is system set filters. - target_type: string, - bmag: number, - vmag: number, - size: number, - checked: boolean, +declare interface IDSOFramingObjectInfo { + name: string; + ra: float; + dec: float; + rotation: float; + flag: string; // flag is user editable, any string is ok + tag: string; // tag is system set filters. + target_type: string; + size: float; + checked: boolean; + // depreciated + bmag?: float; + vmag?: float; } - declare interface IDSOObjectDetailedInfo { - name: string, - ra: number, - dec: number, - target_type: string, - bmag: number, - vmag: number, - size: number, - moon_distance: number, - altitude: Array<[string, number, number]> + name: string; + alias: string; + ra: float; + dec: float; + target_type: string; + const: string; + size: float; + transit_month: number; + transit_date: string; + filter: string; + focal_length: number; + altitude: Array<[string, float, float]>; + Top200: number | null; + // depreciated + moon_distance?: float | null; + bmag?: float | null; + vmag?: float | null; } +declare interface IDSOObjectSimpleInfo { + current: number; + highest: number; + available_shoot_time: number; +} declare interface ILightStarInfo { - name: string, - show_name: string, - ra: number, - dec: number, - Const: string, - Const_Zh: string, - magnitude: number, - alt: number, - az: number, - sky: string, + name: string; + show_name: string; + ra: float; + dec: float; + Const: string; + Const_Zh: string; + magnitude: float; + alt: float; + az: float; + sky: string; } - declare interface ITwilightDataString { - evening: { - sun_set_time: string, - evening_civil_time: string, - evening_nautical_time: string, - evening_astro_time: string, - }, - morning: { - sun_rise_time: string, - morning_civil_time: string, - morning_nautical_time: string, - morning_astro_time: string, - } + evening: { + sun_set_time: string; + evening_civil_time: string; + evening_nautical_time: string; + evening_astro_time: string; + }; + morning: { + sun_rise_time: string; + morning_civil_time: string; + morning_nautical_time: string; + morning_astro_time: string; + }; } declare interface ITwilightData { - evening: { - sun_set_time: Date, - evening_civil_time: Date, - evening_nautical_time: Date, - evening_astro_time: Date, - }, - morning: { - sun_rise_time: Date, - morning_civil_time: Date, - morning_nautical_time: Date, - morning_astro_time: Date, - } + evening: { + sun_set_time: Date; + evening_civil_time: Date; + evening_nautical_time: Date; + evening_astro_time: Date; + }; + morning: { + sun_rise_time: Date; + morning_civil_time: Date; + morning_nautical_time: Date; + morning_astro_time: Date; + }; } // interface from the api declare interface IOFRequestLightStar { - sky_range?: Array, - max_mag?: number, + sky_range?: Array; + max_mag?: number; } declare interface IOFResponseLightStar { - success: boolean; - data: Array; + success: boolean; + data: Array; } declare interface IOFResponseFindTargetName { - success: boolean, - data: Array, + success: boolean; + data: Array; } declare interface IOFRequestFOVpoints { - x_pixels: number, - y_pixels: number, - x_pixel_size: number, - y_pixel_size: number, - focal_length: number, - target_ra: number, - target_dec: number, - camera_rotation: number, + x_pixels: number; + y_pixels: number; + x_pixel_size: number; + y_pixel_size: number; + focal_length: number; + target_ra: number; + target_dec: number; + camera_rotation: number; } declare interface IOFResponseFOVpoints { - success: boolean, - data: [ - [number, number], - [number, number], - [number, number], - [number, number] - ], - message?: string, + success: boolean; + data: [ + [number, number], + [number, number], + [number, number], + [number, number] + ]; + message?: string; } declare interface IOFRequestFOVpointsTiles { - x_pixels: number, - y_pixels: number, - x_pixel_size: number, - y_pixel_size: number, - focal_length: number, - target_ra: number, - target_dec: number, - camera_rotation: number, - x_tiles: number, - y_tiles: number, - overlap: number, + x_pixels: number; + y_pixels: number; + x_pixel_size: number; + y_pixel_size: number; + focal_length: number; + target_ra: number; + target_dec: number; + camera_rotation: number; + x_tiles: number; + y_tiles: number; + overlap: number; } declare interface IOFResponseFOVpointsTiles { - success: boolean, - data: Array<[ - [number, number], - [number, number], - [number, number], - [number, number] - ]>, - message?: string, + success: boolean; + data: Array< + [[number, number], [number, number], [number, number], [number, number]] + >; + message?: string; } declare interface IOFResponseAltCurve { - success: boolean, - data: { - moon_distance: number, - altitude: Array<[string, number, number]> - } + success: boolean; + data: { + moon_distance: float; + altitude: Array<[string, float, float]>; + }; } declare interface IOFResponseTwilightData { - success: boolean, - data: ITwilightDataString + success: boolean; + data: ITwilightDataString; +} + +declare interface IOFResponseOBJSimple { + success: boolean; + data: IDSOObjectSimpleInfo; } -// end of interface from the api \ No newline at end of file +// end of interface from the api diff --git a/websrc/cobalt-web/src/interfaces/api.d.ts b/websrc/cobalt-web/src/interfaces/api.d.ts index 8dbd62e1..7cdfac72 100644 --- a/websrc/cobalt-web/src/interfaces/api.d.ts +++ b/websrc/cobalt-web/src/interfaces/api.d.ts @@ -1,11 +1,11 @@ declare interface IRequestParams { - url:string; - method?:"GET"|"POST", - body?:any + url: string; + method?: "GET" | "POST"; + body?: any; } declare interface IRequestResponse { - success: boolean; - data?: T; - message?: string; -} \ No newline at end of file + success: boolean; + data?: T; + message?: string; +} diff --git a/websrc/cobalt-web/src/interfaces/global.d.ts b/websrc/cobalt-web/src/interfaces/global.d.ts index 327940c1..420bc761 100644 --- a/websrc/cobalt-web/src/interfaces/global.d.ts +++ b/websrc/cobalt-web/src/interfaces/global.d.ts @@ -1,7 +1,7 @@ declare global { - interface Window { - A:any - } + interface Window { + A: any; } - - export {} \ No newline at end of file +} + +export {}; diff --git a/websrc/cobalt-web/src/interfaces/react.d.ts b/websrc/cobalt-web/src/interfaces/react.d.ts index e69de29b..df5f1863 100644 --- a/websrc/cobalt-web/src/interfaces/react.d.ts +++ b/websrc/cobalt-web/src/interfaces/react.d.ts @@ -0,0 +1,7 @@ +declare type DeepPartial = Partial<{ + [k in keyof T]: T[k] extends object ? DeepPartial : T[k]; +}>; + +declare type IProps = { + children?: React.ReactNode; +}; diff --git a/websrc/cobalt-web/src/pages/config/ClickQuestionTooltips.tsx b/websrc/cobalt-web/src/pages/config/ClickQuestionTooltips.tsx index d8de817c..198973b9 100644 --- a/websrc/cobalt-web/src/pages/config/ClickQuestionTooltips.tsx +++ b/websrc/cobalt-web/src/pages/config/ClickQuestionTooltips.tsx @@ -1,9 +1,9 @@ -import React, { useState } from "react"; +import * as React from "react"; +import { QuestionCircle } from "react-bootstrap-icons"; import Badge from "react-bootstrap/Badge"; import Button from "react-bootstrap/Button"; import OverlayTrigger from "react-bootstrap/OverlayTrigger"; -import Popover from "react-bootstrap/Popover"; -import { QuestionCircle } from "react-bootstrap-icons"; +import Tooltip from "react-bootstrap/Tooltip"; interface RedDotProps { show_changing: boolean; @@ -11,26 +11,18 @@ interface RedDotProps { } const GPRedDotComp: React.FC = (props) => { - const [open, setOpen] = useState(false); - - const handleTooltipClose = () => { - setOpen(false); - }; - - const handleTooltipOpen = () => { - setOpen(true); - }; + const renderTooltip = (tooltip: string) => ( + {tooltip} + ); if (props.show_changing) { return ( - + {props.tooltip}} - rootClose + overlay={renderTooltip(props.tooltip || "")} > - @@ -39,12 +31,10 @@ const GPRedDotComp: React.FC = (props) => { } else { return ( {props.tooltip}} - rootClose + overlay={renderTooltip(props.tooltip || "")} > - diff --git a/websrc/cobalt-web/src/pages/config/OneSettingEntryComp.tsx b/websrc/cobalt-web/src/pages/config/OneSettingEntryComp.tsx index ec3eda49..068c286f 100644 --- a/websrc/cobalt-web/src/pages/config/OneSettingEntryComp.tsx +++ b/websrc/cobalt-web/src/pages/config/OneSettingEntryComp.tsx @@ -15,6 +15,7 @@ import OverlayTrigger from "react-bootstrap/OverlayTrigger"; import Dropdown from "react-bootstrap/Dropdown"; import GPRedDotComp from "./ClickQuestionTooltips"; +import { GlobalStore } from "../../store/globalStore"; interface SingleSettingPartProps { setting_part_key: string; @@ -84,7 +85,7 @@ const GlobalSettingSingleSettingEntry: React.FC = ( props.handleSettingChange( props.setting_part_key, diff --git a/websrc/cobalt-web/src/pages/config/components/camera.tsx b/websrc/cobalt-web/src/pages/config/components/camera.tsx new file mode 100644 index 00000000..e69de29b diff --git a/websrc/cobalt-web/src/pages/config/components/filter.tsx b/websrc/cobalt-web/src/pages/config/components/filter.tsx new file mode 100644 index 00000000..9e359523 --- /dev/null +++ b/websrc/cobalt-web/src/pages/config/components/filter.tsx @@ -0,0 +1,148 @@ +import * as React from "react"; +import { GlobalStore } from "../../../store/globalStore"; +import Table from "react-bootstrap/Table"; +import Button from "react-bootstrap/Button"; +import Modal from "react-bootstrap/Modal"; +import Form from "react-bootstrap/Form"; +import { Card } from "react-bootstrap"; + +const GPFilterEasyUseComp: React.FC = () => { + const global_parameter = GlobalStore.useAppState( + (state) => state.GlobalParameterStore + ); + const [showFilterSetDialog, setShowFilterSetDialog] = + React.useState(false); + const [toSetFilterIndex, setToSetFilterIndex] = React.useState(0); + const [singleFilterDialogData, setSingleDialogData] = + React.useState({ + filter_name: "", + focus_offset: 0, + af_exposure_time: 1, + }); + const [filterTouched, setFilterTouched] = React.useState(false); + + // functions + + const onSubmitClicked = (filterIndex: number) => { + // if (filterTouched) { + // props.handle_single_filter_setting(filterIndex, singleFilterDialogData); + // } + setShowFilterSetDialog(false); + }; + + return ( + <> + {global_parameter.global_parameter.filter_setting === null ? ( + + 全局变量加载失败! + + ) : ( +