Skip to content

Commit

Permalink
⬆ Update usage of ztd.idk's versioning and checking macros
Browse files Browse the repository at this point in the history
  • Loading branch information
ThePhD committed Jun 30, 2022
1 parent 787d1d3 commit 56fbd40
Show file tree
Hide file tree
Showing 57 changed files with 416 additions and 144 deletions.
2 changes: 1 addition & 1 deletion examples/basic/source/rope_transcode_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include <ztd/text/transcode_view.hpp>
#include <ztd/text/encoding.hpp>

#if ZTD_IS_ON(ZTD_LIBSTDCXX_I_)
#if ZTD_IS_ON(ZTD_LIBSTDCXX)

// libstdc++ (gcc) has a rope class!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

#include <ztd/text.hpp>

#if !defined(_LIBCPP_VERSION) && ZTD_IS_OFF(ZTD_PLATFORM_MAC_OS_I_)
#if !defined(_LIBCPP_VERSION) && ZTD_IS_OFF(ZTD_PLATFORM_MAC_OS)
// This example doesn't work on Apple/libc++ because they don't have
// standard C or C++ headers.

Expand Down
18 changes: 9 additions & 9 deletions include/ztd/ranges/algorithm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ namespace ztd { namespace ranges {
ZTD_RANGES_INLINE_ABI_NAMESPACE_OPEN_I_

namespace __rng_detail {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
template <typename _InItOrRange, typename _OutItOrRange>
using __in_out_result = ::std::ranges::in_out_result<_InItOrRange, _OutItOrRange>;
#else
Expand Down Expand Up @@ -91,7 +91,7 @@ namespace ztd { namespace ranges {
template <typename _Iterator0, typename _Sentinel0, typename _Iterator1, typename _Sentinel1>
constexpr bool __equal(_Iterator0 __first0, _Sentinel0 __last0, _Iterator1 __first1, _Sentinel1 __last1) {
// std lib does not take differing sentinels, which is kind of shitty tbh
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS_I_) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
return ::std::ranges::equal(
::std::move(__first0), ::std::move(__last0), ::std::move(__first1), ::std::move(__last1));
#else
Expand All @@ -116,7 +116,7 @@ namespace ztd { namespace ranges {

template <typename _Iterator0, typename _Iterator1>
constexpr _Iterator0 __reverse(_Iterator0 __first, _Iterator1 __last) noexcept {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS_I_) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
return ::std::ranges::reverse(::std::move(__first), ::std::move(__last));
#else
if (__first == __last) {
Expand Down Expand Up @@ -171,7 +171,7 @@ namespace ztd { namespace ranges {
using _InRange = subrange<_ResultInIt, default_sentinel_t>;
using _OutRange = unbounded_view<_OutFirst>;
using _Result = __in_out_result<_InRange, _OutRange>;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated())
#else
if (false)
Expand Down Expand Up @@ -205,7 +205,7 @@ namespace ztd { namespace ranges {
using _InRange = subrange<_First, _Last>;
using _OutRange = unbounded_view<_OutFirst>;
using _Result = __in_out_result<_InRange, _OutRange>;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated())
#else
if (false)
Expand Down Expand Up @@ -239,7 +239,7 @@ namespace ztd { namespace ranges {
using _InRange = subrange<counted_iterator<_First>, default_sentinel_t>;
using _OutRange = subrange<counted_iterator<_OutFirst>, default_sentinel_t>;
using _Result = __in_out_result<_InRange, _OutRange>;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated())
#else
if (false)
Expand Down Expand Up @@ -283,7 +283,7 @@ namespace ztd { namespace ranges {
using _InRange = subrange<_First, _Last>;
using _OutRange = subrange<_OutFirst, _OutLast>;
using _Result = __in_out_result<_InRange, _OutRange>;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated())
#else
if (false)
Expand Down Expand Up @@ -339,11 +339,11 @@ namespace ztd { namespace ranges {

template <typename _First0, typename _Last0, typename _First1, typename _Last1>
constexpr bool __lexicographical_compare(_First0 __first0, _Last0 __last0, _First1 __first1, _Last1 __last1) {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS_I_) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS) && ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
return ::std::ranges::lexicographical_compare(
::std::move(__first0), ::std::move(__last0), ::std::move(__first1), ::std::move(__last1));
#else
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONSTEXPR_ALGORITHMS)
if constexpr (::std::is_same_v<_First0, _Last0> && ::std::is_same_v<_First1, _Last1>) {
return ::std::lexicographical_compare(
::std::move(__first0), ::std::move(__last0), ::std::move(__first1), ::std::move(__last1));
Expand Down
8 changes: 4 additions & 4 deletions include/ztd/ranges/counted_iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
#include <iterator>
#include <utility>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand Down Expand Up @@ -86,7 +86,7 @@ namespace ztd { namespace ranges {

template <typename _It2, ::std::enable_if_t<::std::is_convertible_v<_It2, iterator_type>>* = nullptr>
constexpr __counted_iterator(const __counted_iterator<_It2>& __from) noexcept(
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_NOTHROW_CONVERTIBLE_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_NOTHROW_CONVERTIBLE)
::std::is_nothrow_convertible_v<const _It2&, iterator_type>
#else
noexcept(static_cast<iterator_type>(::std::declval<const _It2&>()))
Expand All @@ -97,7 +97,7 @@ namespace ztd { namespace ranges {

template <typename _It2, ::std::enable_if_t<::std::is_convertible_v<_It2, iterator_type>>* = nullptr>
constexpr __counted_iterator(__counted_iterator<_It2>&& __from) noexcept(
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_NOTHROW_CONVERTIBLE_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_NOTHROW_CONVERTIBLE)
::std::is_nothrow_convertible_v<_It2&&, iterator_type>
#else
noexcept(static_cast<iterator_type>(::std::declval<_It2&&>()))
Expand Down Expand Up @@ -279,7 +279,7 @@ namespace ztd { namespace ranges {
//////
template <typename _It>
using counted_iterator =
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
::std::counted_iterator<_It>;
#else
__rng_detail::__counted_iterator<_It>;
Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/default_sentinel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

#include <ztd/ranges/version.hpp>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand All @@ -44,7 +44,7 @@
namespace ztd { namespace ranges {
ZTD_RANGES_INLINE_ABI_NAMESPACE_OPEN_I_

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
//////
/// @brief A sentinel that cannot compare equal to any other iterator and thus results in infinitely long ranges.
using default_sentinel_t = ::std::default_sentinel_t;
Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
#include <type_traits>
#include <utility>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand Down Expand Up @@ -231,7 +231,7 @@ namespace ztd { namespace ranges {
template <typename _It>
inline constexpr bool is_iterator_contiguous_iterator_v = ::ztd::__idk_detail::__mark_contiguous_v<_It>
|| (
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONTIGUOUS_ITERATOR_TAG_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_CONTIGUOUS_ITERATOR_TAG)
is_iterator_concept_or_better_v<contiguous_iterator_tag, _It>)
|| (is_iterator_concept_or_better_v<contiguous_iterator_tag, _It> &&
#else
Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/range.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
#include <type_traits>
#include <utility>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand All @@ -53,7 +53,7 @@
namespace ztd { namespace ranges {
ZTD_RANGES_INLINE_ABI_NAMESPACE_OPEN_I_

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
template <typename _Range>
using range_iterator_t = ::std::ranges::iterator_t<_Range>;

Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/reconstruct.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ namespace ztd { namespace hijack {
using _SizeType = typename ::std::basic_string_view<_Ty, _Traits>::size_type;
if constexpr (!::std::is_integral_v<_Sen>) {
_SizeType __ptr_size = static_cast<_SizeType>(__sentinel - __iterator);
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
if (__ptr_size == static_cast<_SizeType>(0)) {
const auto& __empty_str = empty_string<_Ty>();
return ::std::basic_string_view<_Ty, _Traits>(__empty_str + 0, 0);
Expand All @@ -217,7 +217,7 @@ namespace ztd { namespace hijack {
return ::std::basic_string_view<_Ty, _Traits>(::ztd::idk_adl::adl_to_address(__iterator), __ptr_size);
}
else {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
if (static_cast<_SizeType>(__sentinel) == static_cast<_SizeType>(0)) {
const auto& __empty_str = empty_string<_Ty>();
return ::std::basic_string_view<_Ty, _Traits>(__empty_str + 0, 0);
Expand Down
6 changes: 3 additions & 3 deletions include/ztd/ranges/subrange.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
#include <iterator>
#include <utility>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand Down Expand Up @@ -431,7 +431,7 @@ namespace ztd { namespace ranges {
};
} // namespace __rng_detail

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)

// std::subrange is busted and I'm not interested in digging into why it's busted
using ::std::ranges::subrange;
Expand Down Expand Up @@ -473,7 +473,7 @@ namespace ztd { namespace ranges {
ZTD_RANGES_INLINE_ABI_NAMESPACE_CLOSE_I_
}} // namespace ztd::ranges

#if ZTD_IS_ON(ZTD_STD_LIBRARY_BORROWED_RANGE_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_BORROWED_RANGE)

namespace std { namespace ranges {

Expand Down
2 changes: 1 addition & 1 deletion include/ztd/ranges/unbounded.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ namespace ztd { namespace ranges {
ZTD_RANGES_INLINE_ABI_NAMESPACE_CLOSE_I_
}} // namespace ztd::ranges

#if ZTD_IS_ON(ZTD_STD_LIBRARY_BORROWED_RANGE_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_BORROWED_RANGE)

namespace std { namespace ranges {

Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

#include <ztd/ranges/range.hpp>

#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
#include <ranges>
#endif

Expand All @@ -49,7 +49,7 @@ namespace ztd { namespace ranges {
namespace __rng_detail {
template <typename _Ty>
inline constexpr bool __enable_view
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_RANGES)
::std::ranges::enable_view<_Ty>
#else
= false
Expand Down
4 changes: 2 additions & 2 deletions include/ztd/ranges/word_iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ namespace ztd { namespace ranges {
__base_value_type __write_storage[__base_values_per_word] {};
auto __write_storage_first = __write_storage + 0;
auto __write_storage_last = __write_storage + __base_values_per_word;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated()) {
// just memcpy the data
::std::memcpy(__write_storage, ::std::addressof(__val), sizeof(value_type));
Expand Down Expand Up @@ -255,7 +255,7 @@ namespace ztd { namespace ranges {
__rng_detail::__reverse(__read_storage_first, __read_storage_last);
}
}
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_IS_CONSTANT_EVALUATED)
if (!::std::is_constant_evaluated())
#else
if (false)
Expand Down
3 changes: 3 additions & 0 deletions include/ztd/text.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@
#include <ztd/text/decode_view.hpp>
#include <ztd/text/transcode_view.hpp>

#include <ztd/text/normalization.hpp>
#include <ztd/text/normalized_view.hpp>

#include <ztd/text/text_view.hpp>
#include <ztd/text/text.hpp>

Expand Down
6 changes: 3 additions & 3 deletions include/ztd/text/assume_valid_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

#include <ztd/text/assert.hpp>

#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION_I_)
#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION)
#include <cstdlib>
#endif

Expand All @@ -61,7 +61,7 @@ namespace ztd { namespace text {
/// it cannot ignore it. See ztd::text::assume_valid_handler_t for details.
//////
using assume_valid = ::std::integral_constant<bool,
#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION_I_)
#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION)
true
#else
false
Expand All @@ -77,7 +77,7 @@ namespace ztd { namespace text {
template <typename _Encoding, typename _Result, typename _InputProgress, typename _OutputProgress>
constexpr auto operator()(
const _Encoding&, _Result __result, const _InputProgress&, const _OutputProgress&) const {
#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION_I_)
#if ZTD_IS_ON(ZTD_TEXT_ASSUME_VALID_HANDLER_TRAPS_ON_INVOCATION)
ZTD_TEXT_ASSERT_MESSAGE_I_(
"You have invoked the ztd::text::assume_valid handler, and tripped undefined behavior. This means "
"you violated the covenant between you, the compiler, this library, and every piece of code that "
Expand Down
12 changes: 6 additions & 6 deletions include/ztd/text/basic_c_string_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ namespace ztd { namespace text {
}

constexpr basic_c_string_view(const_iterator __arg0, const_iterator __arg1) noexcept
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
: __base_t(__arg0 == __arg1 ? empty_string<_CharType>() : ::std::addressof(*__arg0),
::std::distance(__arg0, __arg1)) {
#else
Expand Down Expand Up @@ -252,11 +252,11 @@ namespace ztd { namespace text {
using __base_t::compare;

using __base_t::copy;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_STARTS_ENDS_WITH_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_STARTS_ENDS_WITH)
using __base_t::ends_with;
using __base_t::starts_with;
#endif
#if ZTD_IS_ON(ZTD_STD_LIBRARY_STRING_CONTAINS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_STRING_CONTAINS)
using __base_t::contains;
#endif

Expand Down Expand Up @@ -291,7 +291,7 @@ namespace ztd { namespace text {
::std::in_place_type_t<basic_c_string_view>, _It __iterator, _Sen __sentinel) noexcept {
using _SizeType = typename __base_t::size_type;
if constexpr (!::std::is_integral_v<_Sen>) {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
if (__iterator == __sentinel) {
const auto& __empty_str = empty_string<value_type>();
return __base_t(__empty_str + 0, 0);
Expand All @@ -300,7 +300,7 @@ namespace ztd { namespace text {
return __base_t(::std::addressof(*__iterator), static_cast<_SizeType>(__sentinel - __iterator));
}
else {
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
if (static_cast<_SizeType>(__sentinel) == static_cast<_SizeType>(0)) {
const auto& __empty_str = empty_string<value_type>();
return __base_t(__empty_str + 0, 0);
Expand All @@ -314,7 +314,7 @@ namespace ztd { namespace text {
friend constexpr basic_c_string_view tag_invoke(ztd::tag_t<::ztd::ranges::reconstruct>,
::std::in_place_type_t<basic_c_string_view>, _It __iterator, sentinel __sentinel) {
using _SizeType = typename __base_t::size_type;
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS_I_)
#if ZTD_IS_ON(ZTD_STD_LIBRARY_DEBUG_ITERATORS)
if (__iterator == __sentinel) {
const auto& __empty_str = empty_string<value_type>();
return __base_t(__empty_str + 0, 0);
Expand Down
6 changes: 3 additions & 3 deletions include/ztd/text/basic_iconv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
namespace ztd { namespace text {
ZTD_TEXT_INLINE_ABI_NAMESPACE_OPEN_I_

#if ZTD_IS_ON(ZTD_LIBICONV_I_)
#if ZTD_IS_ON(ZTD_LIBICONV)
namespace __txt_detail {
class __iconv_base {
public:
Expand All @@ -76,7 +76,7 @@ namespace ztd { namespace text {
#endif

namespace __impl {
#if ZTD_IS_ON(ZTD_LIBICONV_I_)
#if ZTD_IS_ON(ZTD_LIBICONV)
//////
/// @brief An encoding which wraps the iconv library.
///
Expand Down Expand Up @@ -676,7 +676,7 @@ namespace ztd { namespace text {
//////
template <typename _CodeUnit, typename _CodePoint = unicode_code_point>
using basic_iconv =
#if ZTD_IS_ON(ZTD_LIBICONV_I_)
#if ZTD_IS_ON(ZTD_LIBICONV)
__impl::__basic_iconv<_CodeUnit, _CodePoint>
#else
__impl::__basic_iconv_no<_CodeUnit, _CodePoint>
Expand Down

0 comments on commit 56fbd40

Please sign in to comment.