diff --git a/include/toml++/toml_parser_impl.h b/include/toml++/toml_parser_impl.h index 6df72c4..75b33ce 100644 --- a/include/toml++/toml_parser_impl.h +++ b/include/toml++/toml_parser_impl.h @@ -77,6 +77,73 @@ TOML_IMPL_START return { prev_pos.line, static_cast(prev_pos.column + fallback_offset) }; } + template + static void abort_with_error_concatenate(T&& arg, char(& buf)[N], char*& ptr) noexcept + { + (void)buf; + + using arg_t = remove_cvref_t; + if constexpr (std::is_same_v || std::is_same_v) + { + std::memcpy(ptr, arg.data(), arg.length()); + ptr += arg.length(); + } + else if constexpr (std::is_same_v) + { + toml::string_view cp_view; + if (arg.value <= U'\x1F') TOML_UNLIKELY + cp_view = low_character_escape_table[arg.value]; + else if (arg.value == U'\x7F') TOML_UNLIKELY + cp_view = TOML_STRING_PREFIX("\\u007F"sv); + else + cp_view = arg.template as_view(); + + std::memcpy(ptr, cp_view.data(), cp_view.length()); + ptr += cp_view.length(); + } + else if constexpr (std::is_same_v) + { + *ptr++ = arg; + } + else if constexpr (std::is_same_v) + { + const auto boolval = arg ? "true"sv : "false"sv; + std::memcpy(ptr, boolval.data(), boolval.length()); + ptr += boolval.length(); + } + else if constexpr (std::is_same_v) + { + const auto str = impl::node_type_friendly_names[ + static_cast>(arg) + ]; + std::memcpy(ptr, str.data(), str.length()); + ptr += str.length(); + } + else if constexpr (std::is_floating_point_v) + { + #if TOML_USE_STREAMS_FOR_FLOATS + { + std::ostringstream ss; + ss.precision(std::numeric_limits::digits10 + 1); + ss << arg; + const auto str = std::move(ss).str(); + std::memcpy(ptr, str.c_str(), str.length()); + ptr += str.length(); + } + #else + { + const auto result = std::to_chars(ptr, buf + N, arg); + ptr = result.ptr; + } + #endif + } + else if constexpr (std::is_integral_v) + { + const auto result = std::to_chars(ptr, buf + N, arg); + ptr = result.ptr; + } + } + template TOML_NORETURN void abort_with_error(T &&... args) const TOML_MAY_THROW @@ -90,70 +157,7 @@ TOML_IMPL_START static constexpr auto buf_size = 512_sz; TOML_GCC_ATTR(uninitialized) char buf[buf_size]; auto ptr = buf; - const auto concatenator = [&](auto&& arg) noexcept //a.k.a. "no stringstreams, thanks" - { - using arg_t = remove_cvref_t; - if constexpr (std::is_same_v || std::is_same_v) - { - std::memcpy(ptr, arg.data(), arg.length()); - ptr += arg.length(); - } - else if constexpr (std::is_same_v) - { - toml::string_view cp_view; - if (arg.value <= U'\x1F') TOML_UNLIKELY - cp_view = low_character_escape_table[arg.value]; - else if (arg.value == U'\x7F') TOML_UNLIKELY - cp_view = TOML_STRING_PREFIX("\\u007F"sv); - else - cp_view = arg.template as_view(); - - std::memcpy(ptr, cp_view.data(), cp_view.length()); - ptr += cp_view.length(); - } - else if constexpr (std::is_same_v) - { - *ptr++ = arg; - } - else if constexpr (std::is_same_v) - { - const auto boolval = arg ? "true"sv : "false"sv; - std::memcpy(ptr, boolval.data(), boolval.length()); - ptr += boolval.length(); - } - else if constexpr (std::is_same_v) - { - const auto str = impl::node_type_friendly_names[ - static_cast>(arg) - ]; - std::memcpy(ptr, str.data(), str.length()); - ptr += str.length(); - } - else if constexpr (std::is_floating_point_v) - { - #if TOML_USE_STREAMS_FOR_FLOATS - { - std::ostringstream ss; - ss.precision(std::numeric_limits::digits10 + 1); - ss << arg; - const auto str = std::move(ss).str(); - std::memcpy(ptr, str.c_str(), str.length()); - ptr += str.length(); - } - #else - { - const auto result = std::to_chars(ptr, buf + buf_size, arg); - ptr = result.ptr; - } - #endif - } - else if constexpr (std::is_integral_v) - { - const auto result = std::to_chars(ptr, buf + buf_size, arg); - ptr = result.ptr; - } - }; - (concatenator(std::forward(args)), ...); + (abort_with_error_concatenate(std::forward(args), buf, ptr), ...); *ptr = '\0'; #if TOML_EXCEPTIONS TOML_ERROR(buf, current_position(1), reader.source_path()); @@ -1014,7 +1018,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing "sv, node_type::floating_point, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } @@ -1211,7 +1215,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing hexadecimal "sv, node_type::floating_point, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } @@ -1402,7 +1406,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing "sv, traits::qualifier, ' ', node_type::integer, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } diff --git a/include/toml++/toml_version.h b/include/toml++/toml_version.h index b8e1466..9d18fb6 100644 --- a/include/toml++/toml_version.h +++ b/include/toml++/toml_version.h @@ -2,7 +2,7 @@ #define TOML_LIB_MAJOR 0 #define TOML_LIB_MINOR 4 -#define TOML_LIB_PATCH 2 +#define TOML_LIB_PATCH 3 #define TOML_LANG_MAJOR 0 #define TOML_LANG_MINOR 5 diff --git a/meson.build b/meson.build index 2a3a714..70aa31b 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'tomlplusplus', 'cpp', - version : '0.4.2', + version : '0.4.3', license : 'MIT', default_options : [ 'cpp_std=c++17', diff --git a/toml.hpp b/toml.hpp index 9314388..c395e15 100644 --- a/toml.hpp +++ b/toml.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------------------------------------------------- // -// toml++ v0.4.2 +// toml++ v0.4.3 // https://github.com/marzer/tomlplusplus // SPDX-License-Identifier: MIT // @@ -312,7 +312,7 @@ #define TOML_LIB_MAJOR 0 #define TOML_LIB_MINOR 4 -#define TOML_LIB_PATCH 2 +#define TOML_LIB_PATCH 3 #define TOML_LANG_MAJOR 0 #define TOML_LANG_MINOR 5 @@ -6299,6 +6299,73 @@ TOML_IMPL_START return { prev_pos.line, static_cast(prev_pos.column + fallback_offset) }; } + template + static void abort_with_error_concatenate(T&& arg, char(& buf)[N], char*& ptr) noexcept + { + (void)buf; + + using arg_t = remove_cvref_t; + if constexpr (std::is_same_v || std::is_same_v) + { + std::memcpy(ptr, arg.data(), arg.length()); + ptr += arg.length(); + } + else if constexpr (std::is_same_v) + { + toml::string_view cp_view; + if (arg.value <= U'\x1F') TOML_UNLIKELY + cp_view = low_character_escape_table[arg.value]; + else if (arg.value == U'\x7F') TOML_UNLIKELY + cp_view = TOML_STRING_PREFIX("\\u007F"sv); + else + cp_view = arg.template as_view(); + + std::memcpy(ptr, cp_view.data(), cp_view.length()); + ptr += cp_view.length(); + } + else if constexpr (std::is_same_v) + { + *ptr++ = arg; + } + else if constexpr (std::is_same_v) + { + const auto boolval = arg ? "true"sv : "false"sv; + std::memcpy(ptr, boolval.data(), boolval.length()); + ptr += boolval.length(); + } + else if constexpr (std::is_same_v) + { + const auto str = impl::node_type_friendly_names[ + static_cast>(arg) + ]; + std::memcpy(ptr, str.data(), str.length()); + ptr += str.length(); + } + else if constexpr (std::is_floating_point_v) + { + #if TOML_USE_STREAMS_FOR_FLOATS + { + std::ostringstream ss; + ss.precision(std::numeric_limits::digits10 + 1); + ss << arg; + const auto str = std::move(ss).str(); + std::memcpy(ptr, str.c_str(), str.length()); + ptr += str.length(); + } + #else + { + const auto result = std::to_chars(ptr, buf + N, arg); + ptr = result.ptr; + } + #endif + } + else if constexpr (std::is_integral_v) + { + const auto result = std::to_chars(ptr, buf + N, arg); + ptr = result.ptr; + } + } + template TOML_NORETURN void abort_with_error(T &&... args) const TOML_MAY_THROW @@ -6312,70 +6379,7 @@ TOML_IMPL_START static constexpr auto buf_size = 512_sz; TOML_GCC_ATTR(uninitialized) char buf[buf_size]; auto ptr = buf; - const auto concatenator = [&](auto&& arg) noexcept //a.k.a. "no stringstreams, thanks" - { - using arg_t = remove_cvref_t; - if constexpr (std::is_same_v || std::is_same_v) - { - std::memcpy(ptr, arg.data(), arg.length()); - ptr += arg.length(); - } - else if constexpr (std::is_same_v) - { - toml::string_view cp_view; - if (arg.value <= U'\x1F') TOML_UNLIKELY - cp_view = low_character_escape_table[arg.value]; - else if (arg.value == U'\x7F') TOML_UNLIKELY - cp_view = TOML_STRING_PREFIX("\\u007F"sv); - else - cp_view = arg.template as_view(); - - std::memcpy(ptr, cp_view.data(), cp_view.length()); - ptr += cp_view.length(); - } - else if constexpr (std::is_same_v) - { - *ptr++ = arg; - } - else if constexpr (std::is_same_v) - { - const auto boolval = arg ? "true"sv : "false"sv; - std::memcpy(ptr, boolval.data(), boolval.length()); - ptr += boolval.length(); - } - else if constexpr (std::is_same_v) - { - const auto str = impl::node_type_friendly_names[ - static_cast>(arg) - ]; - std::memcpy(ptr, str.data(), str.length()); - ptr += str.length(); - } - else if constexpr (std::is_floating_point_v) - { - #if TOML_USE_STREAMS_FOR_FLOATS - { - std::ostringstream ss; - ss.precision(std::numeric_limits::digits10 + 1); - ss << arg; - const auto str = std::move(ss).str(); - std::memcpy(ptr, str.c_str(), str.length()); - ptr += str.length(); - } - #else - { - const auto result = std::to_chars(ptr, buf + buf_size, arg); - ptr = result.ptr; - } - #endif - } - else if constexpr (std::is_integral_v) - { - const auto result = std::to_chars(ptr, buf + buf_size, arg); - ptr = result.ptr; - } - }; - (concatenator(std::forward(args)), ...); + (abort_with_error_concatenate(std::forward(args), buf, ptr), ...); *ptr = '\0'; #if TOML_EXCEPTIONS TOML_ERROR(buf, current_position(1), reader.source_path()); @@ -7236,7 +7240,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing "sv, node_type::floating_point, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } @@ -7433,7 +7437,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing hexadecimal "sv, node_type::floating_point, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } @@ -7624,7 +7628,7 @@ TOML_IMPL_START default: //?? abort_with_error( "Error parsing "sv, traits::qualifier, ' ', node_type::integer, - "; an unspecified error occurred while trying to interpret '", + "; an unspecified error occurred while trying to interpret '"sv, std::string_view{ chars, length }, "' as a value"sv ); } diff --git a/vs/toml++.sln b/vs/toml++.sln index 6a51665..1d9f150 100644 --- a/vs/toml++.sln +++ b/vs/toml++.sln @@ -47,84 +47,162 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_x86_char8_strict_noexc EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Debug|Win32.Build.0 = Debug|Win32 {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Debug|x64.ActiveCfg = Debug|x64 {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Debug|x64.Build.0 = Debug|x64 + {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Release|Win32.ActiveCfg = Release|Win32 + {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Release|Win32.Build.0 = Release|Win32 {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Release|x64.ActiveCfg = Release|x64 {0E287B5A-1168-43FD-B067-F6BE8E182A57}.Release|x64.Build.0 = Release|x64 + {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Debug|Win32.ActiveCfg = Debug|x64 + {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Debug|Win32.Build.0 = Debug|x64 {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Debug|x64.ActiveCfg = Debug|x64 {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Debug|x64.Build.0 = Debug|x64 + {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Release|Win32.ActiveCfg = Release|x64 + {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Release|Win32.Build.0 = Release|x64 {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Release|x64.ActiveCfg = Release|x64 {54532B93-A2F9-49AC-886E-767A6D78E2F2}.Release|x64.Build.0 = Release|x64 + {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Debug|Win32.ActiveCfg = Debug|x64 + {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Debug|Win32.Build.0 = Debug|x64 {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Debug|x64.ActiveCfg = Debug|x64 {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Debug|x64.Build.0 = Debug|x64 + {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Release|Win32.ActiveCfg = Release|x64 + {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Release|Win32.Build.0 = Release|x64 {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Release|x64.ActiveCfg = Release|x64 {E888E99C-734D-44C4-B917-0AC8D3E2F48F}.Release|x64.Build.0 = Release|x64 + {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Debug|Win32.ActiveCfg = Debug|x64 + {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Debug|Win32.Build.0 = Debug|x64 {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Debug|x64.ActiveCfg = Debug|x64 {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Debug|x64.Build.0 = Debug|x64 + {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Release|Win32.ActiveCfg = Release|x64 + {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Release|Win32.Build.0 = Release|x64 {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Release|x64.ActiveCfg = Release|x64 {3E4018CE-CCA2-48E6-B11E-732A1B59C672}.Release|x64.Build.0 = Release|x64 + {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Debug|Win32.ActiveCfg = Debug|x64 + {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Debug|Win32.Build.0 = Debug|x64 {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Debug|x64.ActiveCfg = Debug|x64 {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Debug|x64.Build.0 = Debug|x64 + {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Release|Win32.ActiveCfg = Release|x64 + {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Release|Win32.Build.0 = Release|x64 {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Release|x64.ActiveCfg = Release|x64 {F094F967-42B5-4AD7-AB44-EA044CD9837E}.Release|x64.Build.0 = Release|x64 + {89FF67C6-94C0-4C46-8411-7549A36584FB}.Debug|Win32.ActiveCfg = Debug|x64 + {89FF67C6-94C0-4C46-8411-7549A36584FB}.Debug|Win32.Build.0 = Debug|x64 {89FF67C6-94C0-4C46-8411-7549A36584FB}.Debug|x64.ActiveCfg = Debug|x64 {89FF67C6-94C0-4C46-8411-7549A36584FB}.Debug|x64.Build.0 = Debug|x64 + {89FF67C6-94C0-4C46-8411-7549A36584FB}.Release|Win32.ActiveCfg = Release|x64 + {89FF67C6-94C0-4C46-8411-7549A36584FB}.Release|Win32.Build.0 = Release|x64 {89FF67C6-94C0-4C46-8411-7549A36584FB}.Release|x64.ActiveCfg = Release|x64 {89FF67C6-94C0-4C46-8411-7549A36584FB}.Release|x64.Build.0 = Release|x64 + {F05F8C1B-7E23-4147-901E-AD91092E5752}.Debug|Win32.ActiveCfg = Debug|x64 + {F05F8C1B-7E23-4147-901E-AD91092E5752}.Debug|Win32.Build.0 = Debug|x64 {F05F8C1B-7E23-4147-901E-AD91092E5752}.Debug|x64.ActiveCfg = Debug|x64 {F05F8C1B-7E23-4147-901E-AD91092E5752}.Debug|x64.Build.0 = Debug|x64 + {F05F8C1B-7E23-4147-901E-AD91092E5752}.Release|Win32.ActiveCfg = Release|x64 + {F05F8C1B-7E23-4147-901E-AD91092E5752}.Release|Win32.Build.0 = Release|x64 {F05F8C1B-7E23-4147-901E-AD91092E5752}.Release|x64.ActiveCfg = Release|x64 {F05F8C1B-7E23-4147-901E-AD91092E5752}.Release|x64.Build.0 = Release|x64 + {EAC419E9-0C72-4625-B2B9-E879F697021A}.Debug|Win32.ActiveCfg = Debug|x64 + {EAC419E9-0C72-4625-B2B9-E879F697021A}.Debug|Win32.Build.0 = Debug|x64 {EAC419E9-0C72-4625-B2B9-E879F697021A}.Debug|x64.ActiveCfg = Debug|x64 {EAC419E9-0C72-4625-B2B9-E879F697021A}.Debug|x64.Build.0 = Debug|x64 + {EAC419E9-0C72-4625-B2B9-E879F697021A}.Release|Win32.ActiveCfg = Release|x64 + {EAC419E9-0C72-4625-B2B9-E879F697021A}.Release|Win32.Build.0 = Release|x64 {EAC419E9-0C72-4625-B2B9-E879F697021A}.Release|x64.ActiveCfg = Release|x64 {EAC419E9-0C72-4625-B2B9-E879F697021A}.Release|x64.Build.0 = Release|x64 + {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Debug|Win32.ActiveCfg = Debug|x64 + {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Debug|Win32.Build.0 = Debug|x64 {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Debug|x64.ActiveCfg = Debug|x64 {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Debug|x64.Build.0 = Debug|x64 + {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Release|Win32.ActiveCfg = Release|x64 + {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Release|Win32.Build.0 = Release|x64 {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Release|x64.ActiveCfg = Release|x64 {9ADB61D3-FDFA-4A9C-A34F-663007BB70F6}.Release|x64.Build.0 = Release|x64 + {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Debug|Win32.ActiveCfg = Debug|Win32 + {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Debug|Win32.Build.0 = Debug|Win32 {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Debug|x64.ActiveCfg = Debug|x64 {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Debug|x64.Build.0 = Debug|x64 + {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Release|Win32.ActiveCfg = Release|Win32 + {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Release|Win32.Build.0 = Release|Win32 {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Release|x64.ActiveCfg = Release|x64 {259FCEE5-3442-4076-9547-2BA793ECA1CB}.Release|x64.Build.0 = Release|x64 + {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Debug|Win32.ActiveCfg = Debug|Win32 + {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Debug|Win32.Build.0 = Debug|Win32 {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Debug|x64.ActiveCfg = Debug|x64 {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Debug|x64.Build.0 = Debug|x64 + {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Release|Win32.ActiveCfg = Release|Win32 + {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Release|Win32.Build.0 = Release|Win32 {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Release|x64.ActiveCfg = Release|x64 {BE34AA99-BEE6-4B50-B237-217E7C88FCB5}.Release|x64.Build.0 = Release|x64 + {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Debug|Win32.ActiveCfg = Debug|Win32 + {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Debug|Win32.Build.0 = Debug|Win32 {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Debug|x64.ActiveCfg = Debug|Win32 {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Debug|x64.Build.0 = Debug|Win32 + {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Release|Win32.ActiveCfg = Release|Win32 + {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Release|Win32.Build.0 = Release|Win32 {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Release|x64.ActiveCfg = Release|Win32 {150FA82E-0E9F-4449-82A6-811BFFE6B5FE}.Release|x64.Build.0 = Release|Win32 + {54DD1412-20C0-4700-96D7-3FD445E70996}.Debug|Win32.ActiveCfg = Debug|Win32 + {54DD1412-20C0-4700-96D7-3FD445E70996}.Debug|Win32.Build.0 = Debug|Win32 {54DD1412-20C0-4700-96D7-3FD445E70996}.Debug|x64.ActiveCfg = Debug|Win32 {54DD1412-20C0-4700-96D7-3FD445E70996}.Debug|x64.Build.0 = Debug|Win32 + {54DD1412-20C0-4700-96D7-3FD445E70996}.Release|Win32.ActiveCfg = Release|Win32 + {54DD1412-20C0-4700-96D7-3FD445E70996}.Release|Win32.Build.0 = Release|Win32 {54DD1412-20C0-4700-96D7-3FD445E70996}.Release|x64.ActiveCfg = Release|Win32 {54DD1412-20C0-4700-96D7-3FD445E70996}.Release|x64.Build.0 = Release|Win32 + {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Debug|Win32.ActiveCfg = Debug|Win32 + {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Debug|Win32.Build.0 = Debug|Win32 {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Debug|x64.ActiveCfg = Debug|Win32 {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Debug|x64.Build.0 = Debug|Win32 + {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Release|Win32.ActiveCfg = Release|Win32 + {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Release|Win32.Build.0 = Release|Win32 {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Release|x64.ActiveCfg = Release|Win32 {1ED2F590-1DE8-457D-97BD-38ECF0955F7F}.Release|x64.Build.0 = Release|Win32 + {BE980D05-770C-4420-B59B-EAD7A63468D2}.Debug|Win32.ActiveCfg = Debug|Win32 + {BE980D05-770C-4420-B59B-EAD7A63468D2}.Debug|Win32.Build.0 = Debug|Win32 {BE980D05-770C-4420-B59B-EAD7A63468D2}.Debug|x64.ActiveCfg = Debug|Win32 {BE980D05-770C-4420-B59B-EAD7A63468D2}.Debug|x64.Build.0 = Debug|Win32 + {BE980D05-770C-4420-B59B-EAD7A63468D2}.Release|Win32.ActiveCfg = Release|Win32 + {BE980D05-770C-4420-B59B-EAD7A63468D2}.Release|Win32.Build.0 = Release|Win32 {BE980D05-770C-4420-B59B-EAD7A63468D2}.Release|x64.ActiveCfg = Release|Win32 {BE980D05-770C-4420-B59B-EAD7A63468D2}.Release|x64.Build.0 = Release|Win32 + {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Debug|Win32.Build.0 = Debug|Win32 {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Debug|x64.ActiveCfg = Debug|Win32 {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Debug|x64.Build.0 = Debug|Win32 + {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Release|Win32.ActiveCfg = Release|Win32 + {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Release|Win32.Build.0 = Release|Win32 {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Release|x64.ActiveCfg = Release|Win32 {3B05742A-6512-4B11-8842-A1B9D1465B1F}.Release|x64.Build.0 = Release|Win32 + {0BBEE569-536D-452C-808C-61843FECCC7E}.Debug|Win32.ActiveCfg = Debug|Win32 + {0BBEE569-536D-452C-808C-61843FECCC7E}.Debug|Win32.Build.0 = Debug|Win32 {0BBEE569-536D-452C-808C-61843FECCC7E}.Debug|x64.ActiveCfg = Debug|Win32 {0BBEE569-536D-452C-808C-61843FECCC7E}.Debug|x64.Build.0 = Debug|Win32 + {0BBEE569-536D-452C-808C-61843FECCC7E}.Release|Win32.ActiveCfg = Release|Win32 + {0BBEE569-536D-452C-808C-61843FECCC7E}.Release|Win32.Build.0 = Release|Win32 {0BBEE569-536D-452C-808C-61843FECCC7E}.Release|x64.ActiveCfg = Release|Win32 {0BBEE569-536D-452C-808C-61843FECCC7E}.Release|x64.Build.0 = Release|Win32 + {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Debug|Win32.ActiveCfg = Debug|Win32 + {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Debug|Win32.Build.0 = Debug|Win32 {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Debug|x64.ActiveCfg = Debug|Win32 {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Debug|x64.Build.0 = Debug|Win32 + {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Release|Win32.ActiveCfg = Release|Win32 + {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Release|Win32.Build.0 = Release|Win32 {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Release|x64.ActiveCfg = Release|Win32 {A4F27C6F-601D-45C0-9F81-7C100BD93B9A}.Release|x64.Build.0 = Release|Win32 + {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Debug|Win32.ActiveCfg = Debug|Win32 + {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Debug|Win32.Build.0 = Debug|Win32 {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Debug|x64.ActiveCfg = Debug|Win32 {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Debug|x64.Build.0 = Debug|Win32 + {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Release|Win32.ActiveCfg = Release|Win32 + {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Release|Win32.Build.0 = Release|Win32 {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Release|x64.ActiveCfg = Release|Win32 {0CAD095A-C9F2-49FC-9C9F-4508498BE488}.Release|x64.Build.0 = Release|Win32 EndGlobalSection