<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55530>55530</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] `bugprone-unchecked-optional-access` crashes, hangs
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy,
            crash,
            crash-on-valid
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          whisperity
      </td>
    </tr>
</table>

<pre>
    > Due to the interaction with dataflow, I was suggested by @steakhal to tag @Xazax-hun, @sgatev and @ymand. @ymand is also the author of the check.

When analysing "relatively complex"(?) code with `clang-tidy`, the `bugprone-unchecked-optional-access` checker either hangs, fails with seemingly infinite recursion, or crashes with a non-infinite stack trace.

Running nightly PPA on Ubuntu 20.04 LTS:

```
Package: clang-tidy-15
Version: 1:15~++20220513052831+6716e2055dde-1~exp1~20220513172924.250
```

# Non-infinite stack trace

> [ERROR 2022-05-17 11:45] - Analyzing [SmallIndexMapTest.cpp](http://github.com/whisperity/monomux/blob/99b1cafde9cb0fa915897ab0987ee246e9fa8fde/test/adt/SmallIndexMapTest.cpp) with clang-tidy  failed!

```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.Program arguments: /usr/lib/llvm-15/bin/clang-tidy /mnt/test/adt/SmallIndexMapTest.cpp --export-fixes /mnt/Reports/fixit/SmallIndexMapTest.cpp_clang-tidy_edc91faa5cbe120c7656946b7203686b.yaml -- -Qunused-arguments -Wall -Wextra -x c++ --target=x86_64-linux-gnu -I/mnt/include/core -I/mnt/include/implementation -I/mnt/AnalBuild/include -I/mnt/include -I/mnt/src -isystem /mnt/AnalBuild/_deps/googletest-src/googletest/include -isystem /mnt/AnalBuild/_deps/googletest-src/googletest -std=c++17 -isystem /usr/include/c++/9 -isystem /usr/include/x86_64-linux-gnu/c++/9 -isystem /usr/include/c++/9/backward -isystem /usr/local/include -isystem /usr/include/x86_64-linux-gnu -isystem /usr/include
1.<eof> parser at end of file
2.ASTMatcher: Processing 'bugprone-unchecked-optional-access' against:
CXXMethodDecl monomux::SmallIndexMap<int, 4, true, false>::isMapped : </mnt/include/core/monomux/adt/SmallIndexMap.hpp:352:3, line:358:3>
--- Bound Nodes Begin ---
    T - { BuiltinType : int }
    fun - { CXXMethodDecl monomux::SmallIndexMap<int, 4, true, false>::isMapped : </mnt/include/core/monomux/adt/SmallIndexMap.hpp:352:3, line:358:3> }
--- Bound Nodes End ---
 #0 0x00007f55d774eff1 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe64ff1)
 #1 0x00007f55d774cd3e llvm::sys::RunSignalHandlers() (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe62d3e)
 #2 0x00007f55d774f51b (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe6551b)
 #3 0x00007f55e0d3e420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007f55df1a9c44 clang::dataflow::Environment::setValue(clang::dataflow::StorageLocation const&, clang::dataflow::Value&) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1df2c44)
 #5 0x00007f55df1bf294 (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1e08294)
 #6 0x00007f55df1c196c (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1e0a96c)
 #7 0x00007f55df1c5248 (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1e0e248)
 #8 0x00007f55df1bccf3 clang::dataflow::UncheckedOptionalAccessModel::transfer(clang::Stmt const*, clang::dataflow::SourceLocationsLattice&, clang::dataflow::Environment&) (/usr/lib/llvm-15/
bin/../lib/libclang-cpp.so.15+0x1e05cf3)
 #9 0x00007f55df1b0ee1 clang::dataflow::transferBlock(clang::dataflow::ControlFlowContext const&, std::vector<llvm::Optional<clang::dataflow::TypeErasedDataflowAnalysisState>, std::allocator
<llvm::Optional<clang::dataflow::TypeErasedDataflowAnalysisState>>>&, clang::CFGBlock const&, clang::dataflow::Environment const&, clang::dataflow::TypeErasedDataflowAnalysis&, std::function
<void (clang::CFGStmt const&, clang::dataflow::TypeErasedDataflowAnalysisState const&)>) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1df9ee1)
#10 0x00007f55df1b1684 clang::dataflow::runTypeErasedDataflowAnalysis(clang::dataflow::ControlFlowContext const&, clang::dataflow::TypeErasedDataflowAnalysis&, clang::dataflow::Environment c
onst&) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1dfa684)
#11 0x000055932a5d6094 llvm::Expected<std::vector<llvm::Optional<clang::dataflow::DataflowAnalysisState<clang::dataflow::UncheckedOptionalAccessModel::Lattice>>, std::allocator<llvm::Optiona
l<clang::dataflow::DataflowAnalysisState<clang::dataflow::UncheckedOptionalAccessModel::Lattice>>>>> clang::dataflow::runDataflowAnalysis<clang::dataflow::UncheckedOptionalAccessModel>(clang
::dataflow::ControlFlowContext const&, clang::dataflow::UncheckedOptionalAccessModel&, clang::dataflow::Environment const&) (/usr/lib/llvm-15/bin/clang-tidy+0x398094)
#12 0x000055932a5d5b19 clang::tidy::bugprone::UncheckedOptionalAccessCheck::check(clang::ast_matchers::MatchFinder::MatchResult const&) (/usr/lib/llvm-15/bin/clang-tidy+0x397b19)
#13 0x00007f55de47892c (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c192c)
#14 0x00007f55de4ac31c clang::ast_matchers::internal::BoundNodesTreeBuilder::visitMatches(clang::ast_matchers::internal::BoundNodesTreeBuilder::Visitor*) (/usr/lib/llvm-15/bin/../lib/libclan
g-cpp.so.15+0x10f531c)
#15 0x00007f55de47834e (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c134e)
#16 0x00007f55de47af6f (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c3f6f)
#17 0x00007f55de47f57b (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c857b)
#18 0x00007f55de47b16e (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c416e)
#19 0x00007f55de47e346 (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c7346)
#20 0x00007f55de47b4fe (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c44fe)
#21 0x00007f55de47cedb (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c5edb)
#22 0x00007f55de47b0c6 (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c40c6)
#23 0x00007f55de48388b (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10cc88b)
#24 0x00007f55de47afa7 (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x10c3fa7)
#25 0x00007f55de44af71 clang::ast_matchers::MatchFinder::matchAST(clang::ASTContext&) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x1093f71)
#26 0x00007f55dfa1132c clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x265a32c)
#27 0x00007f55dde085a4 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0xa515a4)
#28 0x00007f55df9d4297 clang::FrontendAction::Execute() (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x261d297)
#29 0x00007f55df94ac96 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x2593c96)
#30 0x00007f55dfbe484c clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, c
lang::DiagnosticConsumer*) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x282d84c)
#31 0x000055932aa46f7d (/usr/lib/llvm-15/bin/clang-tidy+0x808f7d)
#32 0x00007f55dfbe45af clang::tooling::ToolInvocation::runInvocation(char const*, clang::driver::Compilation*, std::shared_ptr<clang::CompilerInvocation>, std::shared_ptr<clang::PCHContainer
Operations>) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x282d5af)
#33 0x00007f55dfbe3635 clang::tooling::ToolInvocation::run() (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x282c635)
#34 0x00007f55dfbe603e clang::tooling::ClangTool::run(clang::tooling::ToolAction*) (/usr/lib/llvm-15/bin/../lib/libclang-cpp.so.15+0x282f03e)
#35 0x000055932aa426ed clang::tidy::runClangTidy(clang::tidy::ClangTidyContext&, clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<
char>, std::allocator<char>>>, llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem>, bool, bool, llvm::StringRef) (/usr/lib/llvm-15/bin/clang-tidy+0x8046ed)
#36 0x000055932a446257 clang::tidy::clangTidyMain(int, char const**) (/usr/lib/llvm-15/bin/clang-tidy+0x208257)
#37 0x00007f55d63ce083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#38 0x000055932a4421de _start (/usr/lib/llvm-15/bin/clang-tidy+0x2041de)
```

The affected `isMapped()` function looks like this:

```cpp

  /// \returns whether the stored element represents a mapped value.
  bool isMapped(const E& Elem) const noexcept
  {
    if constexpr (IntrusiveDefaultSentinel)
      return Elem != E{};
    else
      return static_cast<bool>(Elem);
  }
```

where `E` is either some type like `int` or `T*` in case `IntrusiveDefaultSentinel` is `true`, and `std::unique_ptr<T>` or `std::optional<T>` otherwise. Both are castable to `bool` and are false when "empty".

# Infinite recursion depth

> [ERROR 2022-05-17 12:22] - Analyzing [Dispatch.cpp](http://github.com/whisperity/monomux/blob/99b1cafde9cb0fa915897ab0987ee246e9fa8fde/src/client/Dispatch.cpp) with clang-tidy  failed!

I observed a crash with a seemingly infinite stack trace.

```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.Program arguments: /usr/lib/llvm-15/bin/clang-tidy /mnt/src/client/Dispatch.cpp --export-fixes /mnt/Reports/fixit/Dispatch.cpp_clang-tidy_76b81b409a195383fc3c434ff5b14a4b.yaml -- -Qu
nused-arguments -Wall -Wextra -x c++ --target=x86_64-linux-gnu -I/mnt/include/core -I/mnt/include/implementation -I/mnt/AnalBuild/include -I/mnt/src -std=c++17 -isystem /usr/include/c++/9 -i
system /usr/include/x86_64-linux-gnu/c++/9 -isystem /usr/include/c++/9/backward -isystem /usr/local/include -isystem /usr/include/x86_64-linux-gnu -isystem /usr/include
1.<eof> parser at end of file
2.ASTMatcher: Processing 'bugprone-unchecked-optional-access' against:
CXXMethodDecl monomux::client::Client::responseClientID : </mnt/src/client/Dispatch.cpp:50:1 <Spelling=line:42:3>, line:59:1>
--- Bound Nodes Begin ---
    T - { RecordType : monomux::message::response::ClientID }
    fun - { CXXMethodDecl monomux::client::Client::responseClientID : </mnt/src/client/Dispatch.cpp:50:1 <Spelling=line:42:3>, line:59:1> }
--- Bound Nodes End ---
  #0 0x00007f7284b07ff1 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe64ff1)
  #1 0x00007f7284b05d3e llvm::sys::RunSignalHandlers() (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe62d3e)
  #2 0x00007f7284b0851b (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe6551b)
  #3 0x00007f728e0f7420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
  #4 0x00007f728c55fd5b clang::dataflow::DataflowAnalysisContext::addTransitiveFlowConditionConstraints(clang::dataflow::AtomicBoolValue&, llvm::DenseSet<clang::dataflow::BoolValue*, llvm::D
enseMapInfo<clang::dataflow::BoolValue*, void>>&, llvm::DenseSet<clang::dataflow::AtomicBoolValue*, llvm::DenseMapInfo<clang::dataflow::AtomicBoolValue*, void>>&) const (/usr/lib/llvm-15/bin
/../lib/libclang-cpp.so.15+0x1defd5b)

[#4 repeated until #255 where the stack printout stops]
```

The affected code snippet is generated partially from a macro:

```cpp
#define HANDLER(NAME)                                                          \
  void Client::NAME(Client& Client, std::string_view Message)

#define MSG(TYPE)                                                              \
  std::optional<TYPE> Msg = TYPE::decode(Message);                             \
  if (!Msg)                                                                    \
    return;

HANDLER(responseClientID)
{
  MSG(response::ClientID);

  Client.ClientID = Msg->Client.ID;

  /* ... unrelated code ... */
}
```

# Non-halting (?) execution

While the first crashes happened almost immediately and the second one happened after about 20 minutes of execution time, the last analysis job that I am running for my project, for a file that has a similar pattern to the 2nd case, has been running ~100% CPU use, currently at 496M resident memory, for about 80 minutes already.

-----

Disabling the check or running Tidy with just other checks makes the analyses conclude successfully. With every *other* check used by the project (*and* also running Clang SA), the **total** analysis time is about 7 minutes.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW1lz4siy_jX0SwWEdqQHP2CwzziiPeNrPMt9cpSkEmhaSFwtXs6vv19WSaCSgbbdzFniHIcDUKkq96zMLKXCIn69GNlXbNEIVhesXguW5rUoeVSnRc6e03rNYl7zJCueR9ac3bBnXrGqWa1EVYuYha9s5Bj4yb-teSZB8BUN_cH_zl_G6yanVTRlxWvxxHge09XrBj8mu18srRjPKoWfN_W6KFmRyKtoLaJvk5GxGBkz9fn7WuSAw7PXKs2By7JKkfE6fRLZK4uKzTYTLxgcWf7Ivh5ZAcZioTgZeUaU8Xw1rtP4FRdEGyHBz7BZbcsiF-MmlyhFPC62JAOejXkUiarCJEWNKJkANHytAasiIAlPs0rhqITYgC7QkuZJmqe1YKWImrICLJoK1qKSV2vRzucsL_Lxbm5V8-gbq6EAoXF93-Q5sZunq3UN4Hd3MwYF_Ro2ed0wy5gYDvv6sBzZs_4q4lH9y8s7wOYrgUlsL4ex6aq7vwlFJO6a-MDw9GpkXeLfMizLcE3bcC3fNjHgTU1PYMiNYzE2MU-8bOmrm2hOrcByJpZrHKSj_bRs9vMR3rV5sM-Re3l1f__LPSMMY8Mdm1NmEpWOO3IXbMxmZBB_lwbhXi43PMtu8li83PLtAyx1Em23mAebWNf1loRkwTSuV1BAE05gNLh4XqfVVpRp_YqLTZEXmwZ2dB1mRYivIAjNiCexCKLQSHhgun4w5aER-FMhLMcTQcJ93MbUGgjxxWP6PEwKrFIqf68FJm1IxCPLPKXAr1ez5RX8L9ykNUwHVgvr2hZlTa5HvFWHmcuyp-5rDDv_U0REXFpVjYABX0u_TPMoa-Aq0u3IRFkIffRNcSkVFDeb7c7OjMldWaxKvmG8XDUbkddEAbzyuqlKwpiGHV4YFMSZwguue3yTsPP6XWJj4zHsDMyOk_QF_rNbei9FQIzgRnp0_eMe7aOIo8BMOHejUJiWEU091wscL5xahu35Xjh55ZsMCNn4f5q8qbAd7Phj498BHJ_iBcJh4xcWKTfB9BqzRD2yFy--9-g54yzNm5fxKm_Y-GZHbitokkNRisN3UtrHCB2XG3FvDln6ZZNm8X7-ARD9oaqM2DitXrFNb9hBOI-x2JL4VkWxygRpYoxF2kAf9I_CYuOqjiGkVm7w5T5IZTg9IalZ5IQn5w1F_oGlvXlko7DyZ17GB5ZkRcSzI6L4Hj0nJktXMicjey6KhPa7LS8rBBheMwHPRCxMsDmoadZktny45TViUUmuBv-j8KRi4fQdccyaMr7iaQ6ddl48_-OPW4GwGy9ElLFu88Nde6Z5EghMSeFz5sjYWTZChb-sQlS5UivSCjO3SA7kRmDPj9i9tsse8PrJekvbjO1a9EloIEkhR3w5AnyS-DG89LJoIKefEekrdilWKTxmPFa3Gf4eECFG00tGNlqn-cPrVkjqwAzGF_uJSZO3U_9NRbJnZyiWK_zaCwXB12DGi4G_aYI4Pp06IklMJgOFpBm2qn7clWBQbv0PMjRb_n5SyZ8fi6ouBUd48YgiKYyAUfp1OgZMJvtbafj162-3uDupigklGMaL8BzQA1B7gs0BwVFsi0MEI1dapitY_E8IaxmyGknMWWiygFKjyRrQlLhmeA5ELuBoiOweImGADMcy2ONjie0UlvOIDEBhVUAP7IW4sa3X0FRMeAyJx3QARUPj9PlJTB5EjqPSFCXbXTEgr67ypxS7DcWpVgei_o1n5AL-0UVLEIws9Cu2UhnbooK2ImU9Rxe1UL3P6FGFfSQAUsCu4jxOLLCm8e7qvIeJFTjnQSYMH7A0ZJ6OLDIDLzoXMg5YGrLpAJlrOf65kCH79TVk_kCMUZTYxxX7axenfmnD1ExGqVvsWZmagSQrrxIEO82mlvWm7kxndtJ0lkVTRjtzq77yuk4j8T2D65v2981Ocf8BqbkQiia1YCA1QwjzOHWdTC6RkHw75WzzIq_LIkPi8kw_kbJq_ibzMJr3hIqgQD4x3--nnUIweBQ8RdIr1AoiXrTjM1WZVwgYtQyAfSyIZaQGIGoru_OjU_9vlDu__puU1ft2m57y37fgOGFDQSPDkGcrOwk8FWnMdBWC2L55fxa1lEkPSCAlc7b9M4CF7kyYwrMxMGHT80_EjrLJT0nt0yb9eR29zxwUv3uhnkucHNLSxNmlO64b2BZ3Y89AONr7y9XLFj4rYFbzH_XiI850fMH3N-1ul23d8eAecIBMxf0_l9ju_6TpvjGhTxNwtbP1dkc4n8WfRPypLfA91t47YiXTtgPfCHTLtgaW7YZm0KdErpW_unL2JD9zGlQz5H198-BV_bhR5XJbH8jiGaVXLAvobuBeVE32w7xOwYrGaz9vj4Uz9QPrTHmegZzRijRkjo6MR7YZsZOykKf9cnugK1kvynLxoRRCnuh0MnpKq7RWxw7V9wT8bqC_EVDsBJTBfW4jVby_lU3ignVNNu5QEbYjzqYIwNKQeQNkPPGScyGzAUtDNh0gS9zpx2vQI8h8wNKQ-QNkiPJnE6MDWBqyYIBM2I53LmRTwOojs4whZ05yPs4AS0NmDpBFIj6bzlzA0pBZQ86M6GxidABLQzbY8Hzb98_GWQRYGjLnjZ_x6fn8jE81ZIMdxOHJ1Dy9u76JNPL2bPmg76AYaOP6OVNKI7BBoMaBfujATdO2tPhwiwiY0gNUkFM1m45qdY72QDVnJovoX3N6yvKXs2B5Lrf1EGdpm10sDN_lWpFxRyfnbyS8FBveZjxhUWT77_MQyl0TZGh06qcgQexYwbRP53VJ4srjmaoG25ReRE0tPnlceViCZgzEGmX6SUOALCHwtFK52GzTTJQ3SIR4HgmNtpZcTbgDVs6of-SHIK5PvX5qnYTYYBzNhGuoNT1M2TWn6uh1l8Pf5E_toRCI3dUn1ZqXIn7c1qWe0-_FslulKpu-JDDhlud8Jcr2VOq7YO_mP5Hj8DQX5S9bUapDqg50Ww_tZi9SvsqLCtXKzkM_nzu9EbdvxZCmJm69COWOl0zjj-fFvuFjnQbYGurR5clRPT7goi_3QwqMIOCjB4Jl-tRtZkqP7ar36eio6j-kXcX7QMfn0xzkpwnYHgjY9mz3owI-507kWxEo0Eh0BiR6hi2OkjincaKzT90pfrrt6Jz-kRi2lsftnhl0_mF5Ij5cyoJgxYJ0Cv_gnN2EfiydHxfJ3pTpPCLkldAOBvbHK7Oy5K_3IukfFj0-Ri8vsomGCm1epdFjVZcS-JycSTNwGnisS55Sf8dc8S8nnTjd6e7vzoD29NzkddlUcErQNM_ru1o_DXpK2gTqF7htxl9pX13KZ-ctJD2I9yEvJQvE6mcKeN9wPKFvVJ6mYcfxLHd6WMNRp71bTrD99rnwYGN6pzkOCLMMH3g1wrRMyLMj5EI2e3wk44UieUnJaJq_47FgRDbuKTQOgGhY_AH7lhkLpuB_hgvHjHsOdKgt7IF6AJNEnm1SZ1737FztRdSF1x2hs6wovlUsS79R01IqTeZQ7xR1XPXGGfVfqH82cuelqJsyr9jzWsimPmp_ks9UYyZUCw61WJWikr0_nG3Uk_wneiA56SCSHbIepVLdjJ5DsCsAUW2INJQX4iUS23pHyvRy332QJmqWeNmWJNydlyxEwpGaL0ECIkm2f3Ak_xQHEhGj_jF7AcyAO12M7B50QR0Jb5dV1GIUPUac-kHm0qHkmWRLdw_ErrXgoN4gv1K2Ul6RjtKqa5Ksig3UQx0XUlGkUfgFphQlXTyQR9CCnEW0f-H3UbYVXHzJLgvVvyk7Sj1jtwE1efp_jWgj8QOxskO1m1Psz8R3M4jW57QSE3ZZUFsmeCGR8DCTnbHUIkqiwVTCSLdliweZDfmYJTZb6hy0tK5NanG8edMGymIYwPpdLY7U6GFZB1ocF2m1pVryH9rZqPq4oiyVD0WvNRre3dJ4w4qwEuUTfIi3fYZtI-yB1tlj7bD_QX2RJ4T-gYbI_rJ-H-TUC30zdIyAm4Fr-3YS2ZFjO0nihqbDHa0PUnH2b9UNKVsfP99sqDj-b8vhP7blsLX1NiPe_0YM3iI8CjV2s3jTTXdqf7JnroEPkxYstyJTWfSibaBzVEddm6aqMTeg-Z9pM7wXMOV412WoMbeBPFQPfo-jPq_E14dbEv_VRPbeNkS9D3Fq-U6I73_lPkS9EVFR7P6zGxH1TkRFlP-XdCLqrYjAJIxk-he0Iuq9iMATuW4Su-HxB9bDJ_JdCa3K0jiWx9cpvSfUPkePU9qk6ByN6loK0CeaTlB4b9LoEingvhOxX3YuBLxsScHueB9Ab_VssFpxTTBQQiBjLD4ChzqItL6nj5H1hrUhce8k6zCcAXFdHfQ9w2zT53e1zggyjH1RqT7dS2lByAIFp0qyQQ2RST9xXaZqFVXpUeq2pa2laGoq_JAquqfqHK0-le-WVXmKsq-m2mQlcjrewx2E0zpFZvTKkrLYyLoxKovvl6iWDX6wm7KfZj8vvl7dQ1A_z27lSeGn_1Dldm4lu836EUIB99sh1Kvdr_7ppjxTeXxKxTO7bePXQNw7sm-XfwO4h_-9-zGSB2QfLN0IB0LNbYU0BDWvupZ2KUgvIKNHrH35Xlxp-6TeBOAf5uEN9K7u3tXV6nOv7WHI3kt6f1SghHw4e-jX7N18dW_SywIWJLYxxNfeulm8WSTLpRmbTCZwHvmOZWfwNCTd-7qj7JTDdO_5rTm9e7Fi-zczhXymtG-GlJ-_r9NM-WaSltgpurcl13S2klPVmG0Q6lm62Yg4BVFwMSrTpDdD8ZS8wg7305Oa0tqQ3BtxChVmUwMcEtwdelanG9G9DJqh6u_eL63Yn0WIUSTFNwy1XNm-hZkUJdu8sl3FOJcjXKbMavqa01lRlW7SjJfYDGrqiOlesbVAIx120EKaGAqR72CPplemgUjosvndr6xRs6KmLKEmYrVmTuDdwoqqNKbDqY3Y0EOtjgbJp7_nk2cUZ1-16nk83mVg6hNpHw8pvdu_c0tnJh1JdKapivQ_GwhHnpWoWRW2tW_AIl_clTLDBXSgSpWqkel_0mAbnLDfCYB4EiUVtzMJhOxLYaOikt4mJkCtWJUXzqBbmibfD-4IkufkbElHqbt3eOXZal3UVCzN5IpOh6Rd-YqxlM20E00rki_xhR0HdsC_1GmdiQtEjt6ppbv4wNvBylKVVvNV9aUps4vPHz64rmsbX9YXjmEnHFFrak4d0zGT0DZ95KBJYniOHxrJl4yHIqsuZMiz-ieulnz5GmNE2OByDI984hmCszxf-pJetC_vTk3Tcg134jqBYQlg8jw7dAJz5Bhiw9NsQvROinL1pbyQpEM4FW5maVVX-5sc9eEqF1KeBF-91n2xP4v6Ihm9kFz-PwIh0RI">