<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/78132>78132</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-tidy reports use-after-move in `std::ranges::sort`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vogelsgesang
</td>
</tr>
</table>
<pre>
When running the clang-tidy pass `clang-analyzer-cplusplus.Move` against the following program, it reports a move-after-free within `std::ranges::sort`.
clang-tidy version 17.0.6
libc++ version 17.0.6
Program:
```cplusplus
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
static bool lessSize(const string& a, const string& b) {
return a.length() < b.length();
}
int main(int, char**) {
vector<string> files;
ranges::sort(files, lessSize);
}
```
clang-tidy output:
```
example.cpp:8:24: warning: Method called on moved-from object of type 'std::basic_string' [clang-analyzer-cplusplus.Move]
8 | return a.length() < b.length();
| ^
example.cpp:13:4: note: Calling '__fn::operator()'
13 | ranges::sort(files, lessSize);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/ranges_sort.h:64:12: note: Calling '__fn::__sort_fn_impl'
64 | return __sort_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/ranges_sort.h:48:5: note: Calling '__sort_impl<std::_RangeAlgPolicy, std::__wrap_iter<std::string *>, bool (*)(const std::string &, const std::string &)>'
48 | std::__sort_impl<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:942:7: note: Assuming the condition is false
942 | if (__libcpp_is_constant_evaluated()) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:942:3: note: Taking false branch
942 | if (__libcpp_is_constant_evaluated()) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:946:5: note: Calling '__sort_dispatch<std::_RangeAlgPolicy, std::string *, bool (*)(const std::string &, const std::string &)>'
946 | std::__sort_dispatch<_AlgPolicy>(std::__unwrap_iter(__first), std::__unwrap_iter(__last), __comp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:878:3: note: Calling '__introsort<std::_RangeAlgPolicy, bool (*&)(const std::string &, const std::string &), std::string *, false>'
878 | std::__introsort<_AlgPolicy,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
879 | _Comp&,
| ~~~~~~~
880 | _RandomAccessIterator,
| ~~~~~~~~~~~~~~~~~~~~~~
881 | __use_branchless_sort<_Comp, _RandomAccessIterator>::value>(
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
882 | __first, __last, __comp, __depth_limit);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:731:3: note: Loop condition is true. Entering loop body
731 | while (true) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:733:5: note: 'Default' branch taken. Execution continues on line 755
733 | switch (__len) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:755:9: note: Assuming '__len' is >= '__limit'
755 | if (__len < __limit) {
| ^~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:755:5: note: Taking false branch
755 | if (__len < __limit) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:763:9: note: Assuming '__depth' is not equal to 0
763 | if (__depth == 0) {
| ^~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:763:5: note: Taking false branch
763 | if (__depth == 0) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:773:11: note: Assuming '__len' is <= '__ninther_threshold'
773 | if (__len > __ninther_threshold) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:773:7: note: Taking false branch
773 | if (__len > __ninther_threshold) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:794:10: note: '__leftmost' is true
794 | if (!__leftmost && !__comp(*(__first - difference_type(1)), *__first)) {
| ^~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:794:21: note: Left side of '&&' is false
794 | if (!__leftmost && !__comp(*(__first - difference_type(1)), *__first)) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:801:9: note: '?' condition is false
801 | _UseBitSetPartition
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:803:15: note: Calling '__partition_with_equals_on_right<std::_RangeAlgPolicy, std::string *, bool (*&)(const std::string &, const std::string &)>'
803 | : std::__partition_with_equals_on_right<_AlgPolicy, _RandomAccessIterator, _Compare>(__first, __last, __comp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:594:3: note: '?' condition is true
594 | _LIBCPP_ASSERT_UNCATEGORIZED(__last - __first >= difference_type(3), "");
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__config:314:75: note: expanded from macro '_LIBCPP_ASSERT_UNCATEGORIZED'
314 | # define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSERT(expression, message)
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__assert:21:4: note: expanded from macro '_LIBCPP_ASSERT'
21 | (__builtin_expect(static_cast<bool>(expression), 1) \
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:597:14: note: Object of type 'std::basic_string' is left in a valid but unspecified state after move
597 | value_type __pivot(_Ops::__iter_move(__first));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:603:5: note: Assuming the condition is true
603 | _LIBCPP_ASSERT_UNCATEGORIZED(
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__config:314:75: note: expanded from macro '_LIBCPP_ASSERT_UNCATEGORIZED'
314 | # define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSERT(expression, message)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__assert:21:4: note: expanded from macro '_LIBCPP_ASSERT'
21 | (__builtin_expect(static_cast<bool>(expression), 1) \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:603:5: note: '?' condition is true
603 | _LIBCPP_ASSERT_UNCATEGORIZED(
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__config:314:75: note: expanded from macro '_LIBCPP_ASSERT_UNCATEGORIZED'
314 | # define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSERT(expression, message)
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__assert:21:4: note: expanded from macro '_LIBCPP_ASSERT'
21 | (__builtin_expect(static_cast<bool>(expression), 1) \
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:601:3: note: Loop condition is false. Exiting loop
601 | do {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:609:3: note: Taking true branch
609 | if (__begin == __first - difference_type(1)) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:610:12: note: Assuming '__first' is >= '__last'
610 | while (__first < __last && !__comp(*--__last, __pivot))
| ^~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:610:29: note: Left side of '&&' is false
610 | while (__first < __last && !__comp(*--__last, __pivot))
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:629:3: note: Loop condition is false. Execution continues on line 645
629 | while (__first < __last) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:646:7: note: '__begin' is equal to '__pivot_pos'
646 | if (__begin != __pivot_pos) {
| ^~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:646:3: note: Taking false branch
646 | if (__begin != __pivot_pos) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:803:15: note: Returning from '__partition_with_equals_on_right<std::_RangeAlgPolicy, std::string *, bool (*&)(const std::string &, const std::string &)>'
803 | : std::__partition_with_equals_on_right<_AlgPolicy, _RandomAccessIterator, _Compare>(__first, __last, __comp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:807:9: note: Assuming field 'second' is true
807 | if (__ret.second) {
| ^~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:807:5: note: Taking true branch
807 | if (__ret.second) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:808:19: note: Calling '__insertion_sort_incomplete<std::_RangeAlgPolicy, bool (*&)(const std::string &, const std::string &), std::string *>'
808 | bool __fs = std::__insertion_sort_incomplete<_AlgPolicy, _Compare>(__first, __i, __comp);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:314:3: note: Control jumps to 'case 2:' at line 318
314 | switch (__last - __first) {
| ^
/Users/avogelsgesang/bazel-cache/bazel/bazel_user_root/0a6b6ee4727d75e1dd322c74e148faf8/execroot/__main__/external/clang_darwin/include/c++/v1/__algorithm/sort.h:319:9: note: Calling 'lessSize'
319 | if (__comp(*--__last, *__first))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
example.cpp:8:24: note: Method called on moved-from object of type 'std::basic_string'
8 | return a.length() < b.length();
| ^~~~~~~~~~
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXFtv47by_zTMC2FDoqyLH_LgOMkfBdp_F7stDnBeCFoa2WxlUoekctmH89kPSF0s-RZnt91ulBW89kYiJfI3Mz8Oh0MxrflaAFyj8AaFt1esMhuprh_kGgq9Bs3E-mols-frf21AYFUJwcUamw3gtGBiPTE8e8Yl0xqjyKtPMcGK58-gJmlZVNr-m_4iHwBFHmZrxoU2rn4ui0I-2ruVSq4V2yKyxNxgBaVURmOGt_IBJiw3oCa5AsCP3Gy4sA_SJkPBAgULxcQadP1_LZVBkTdF3i3yFvV3r5EPoDSXAvvx1JtG9eWCr1JEbhC5OXq5_v7QNC9Y9M-iyKs_XS-b8yTgIi2qDDAKlqxYS8XNZouCu2PXtVFcrE9cfIDUSLW76L4rbSETbAu6ZClgB8VNv4Q2zPAUr6QscAFaf-KfAZEklRb55oEkwszivX9yhcgco7i5H1ZgKiUwmxYg1maDSOKuB0u8GpzatSC-7TeFC4O3jAtEEi6Me-CGKUQW7tN_UtvXHSI454UVbVsC4wNhk6QuQ5a9jh5rTCurE6ohK1NW5pSA6z_hiW3LAqZpWaJgkaBgQWYoWOBHpoRr8AL_AmYjM5yyooAMS-EUOJvkSm6xXP0BqcEyx-a5BIxI3Onwimme0lYGMUbhzXlDCm87SHCCUbx8vZywO2xVFN4d66AfoGDhOiikAfu7ZEVhVQ-RmNJc1G2XJShmBVffnsTd7f2gbtkrZTZo2H_PHK3B3P-uQWlE7lmfsxC5X7HPUExSlm6g_av9pZUGRZWUBpF7j0WrCGAWkziLQ_CzLCAkjWfgz5Kc5Qki9_AEaVOaUqvPlLqzBpRg9q5OXjRj6tHq-n1jw_ZCzS6I3D_4rvaOEMh9jQ21sEw3KFhEFm-fvAg6dVVoLijflkUf9GjmoLNHoxL7ZZO-QFawdrZJqXLSG4oLRDa4Rmkqt2X9v1LJPwZiu0BiFx4jFOzM0kV4Uq5OQk48lv4aVqAf7U0WxfqDLHj6bGHfXaOPipWUG1D9KjWFYMutwZ2t4IYAZ5oLJ8NuDNivEPXHgiMX5-6GOz2b1bTTa1C_D_tNt3WTrqwlRadXOVfadLpVMG3qHnUKBqmBrFG6L2CI96t_neLNZ5ZN4r7mLbSutp0PJ0XGjXV7uMY5KzS0GM9npKESnmMnLusrlSXlmjpFYcJQeGBFxQxkLf33R_RXiGl8kAd9yH9jf1rAHb54pZhIN38PzOPCMXqZNDOuS2bSzaXE2WPIv5Ee57PoKD32WktPsSOlldiR-z5Nnilm-XNvoP52nDlaa07iZN-aB1rIhVHS-bXnNXCgatHXattpla45fKCNSXwwWPdbTfvt3NcW_IK-NOWTeN75nXsHXTpVjI7e_ODYu23inbztRyYyuV2kKWj9k2knIQfPONtsnCS-K0Wt2tGame2khLbYLFuH9-jjgrsaUEvPNejJZc9_jR3hJCE9FDo-aH2mfc88g9JsaMG33BxngFc9fRxWHAf-vhX_LGU5dH-MqmCK8Z0w4CyqsCVWMntuAYwDvxHE44YXdg6f2DrvYziOg2B_OEYkvoWcVYVBJG78GmzYnyCm-O4J0sohm0phuKhAYylwwQXgOAx3kNZRAv3ITbppHCAQ7wTS0MI5P-qcu8HFIRFb3XRUc9ucrU274_c4DDt-6JxIEC7605W-zDEfH7rhhX74V4E4Ktii4LxSuvGlUUshDYb_VKzARmKvwzIKDrB0tTAKbq0aexfp4_hQvVgZvwLAUaEWW9R8_zKGXHYMKbgwG1DUbBTojSyyPlvGQc-bGpr6HT5a9_VBjfEJIb5Udf86eEcF4tyF9r0998kik5ut1KbRYudPtlDOZ3ssgIi_q1HPBSPsTtbufz27bEMGeIIznuegQKRAzXMJiCR-HT-yUwVEFv3gwotaPj55kAGz_Ay5wZpngKVFO67xbQQziI1-J5IZk0ASz993O6wIgnuL_-kodeL5gwgB_V3DDTefwHxgyrg6w_WpcWHmhsfTIdKyxYA-crOhzlPTVAqq-HrzUsTqkpjpVweyhoEqLzgI99g-9QJXL_ZoEM06GSWqo1JMNUGbszGVfyiIOk5nInS8G1xg5v2RMOz4lv78083ywwe6-PTp7uNv9Pf_Xy5-u_u_Xz_-9O-72y4KjidtlKydNx-ybdBRLXGfs5kRbw77VIqcry3S_sxNhfuAw1PJRAYZdnkpW5Yq6ejiLLSdkQZ-LQtEApxBzgW8JBR4KhVobamYLPEWtGZrFzQb1jtTcjyCYVqDMq3rMXu1WPpr8MRvBJFQuqp4Ybig8FRCatx6EjM8pakls2BpSbumuj7EzgB851-EB4HzN4zxceKxMxh_gPivl6dkcY2td4e5wAw_sIJneFUZXAldQspzDhm2iAN22You72tHXnFDXm6ZwBEQprTkD7a3Cf211N2yjAFFj6RHfPEQNCYJRt5BCOV0KkN_9Igat-IFmhqPAYyf_cer-W9pfHjXnuwROrrAk416U5zL-OgHFX3fVPRGBfOmiOatYnycNy5IRXAxrinGd0_ctKkIOwppQ16ZfAeBwcibn0intLy6t_oQefO9bEqX4d4um10Qfn0PiLpliOE2g-GqWjPzOMw8cKGxzvAjf5ee1WXE7CIvbTDtRDh8MunH2prp0Pwif2980iDzL1uJ-HYiGBXm5IBTTnLwuUSmaNYlMkWkZp4zQngn7OLStuODhc5mq5FT4S5lpF6lsHpHS6n71NJkUB8QuXVXbvGg0vmFy_Fhe-nWgi_FcIRKeWyl7KPbH-fAs37ujwWzHwtm36XmxifT8XIORebC1mBHriMpJIkXHySSKTDTtsIRsx81jscS8I5MI14D21jH8cRLLGXOz-x80aAcs9RbP4W1_gJsyX9-J8weTdYbYNyTKc3tpOZ2uB3mdFf2-PE0DfJvy4Fj0rU6ODjcZCWFUbLAf1TbUjeuYso0YDtttUyHmamd8MBP9kOCeLifYJAS8D6sN3CGe8p4d-9d6EVT5weUd3yiuJ-c1hs-Oh_k5dzYU2_TaFv717xKYyflpG3g170pY9_82leEXGXXQTYP5uwKrv3YCwPfi0L_anMdxuHci2dBxlJvnkDir1KWRUmcMC8JCMyu-DXxyMzz_dCbk5nvT_PEI0nszZN5GELu-2jmwZbxYloUD9upVOsrrnUF13HiB-SqYCsotHt5DyG7N5ogQlB4e6WubaXJqlprNPMKro3e3cZwU8B17y0o7Yt3Kt2-dceCjl9-485VpYrrjTH1Sja5R-R-zc2mWk1TadXSPrL5mTT7-q1O225YO3M9-V8AAAD__-Tn3vY">