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

    <tr>
        <th>Summary</th>
        <td>
            [Flang][OpenMP][Offload] HLFIR AssignOp does not lower to a friendly form for AMDGPU which is used for target offloading for OpenMP
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang:ir,
            flang:runtime,
            flang,
            flang:fir-hlfir,
            flang:openmp,
            flang:codegen
      </td>
    </tr>

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

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

<pre>
    This issue was found during the implementation of the following PR (and is dependent on it): https://github.com/llvm/llvm-project/pull/71766 

The following example which attempts to map and assign a value to an allocatable variable on device compiles and works for the deprecated FIR flow, but will fail using the new HLFIR flow: 

```
program main
    integer, allocatable :: test
    allocate(test)
    test = 10

!$omp target map(tofrom:test)
    test = 50
!$omp end target

    print *, test

    deallocate(test)
end program
```

Yielding the following ICE error:

```
LLVM ERROR: Cannot select: t20: i64,ch = dynamic_stackalloc t16:1, Constant:i64<16>, Constant:i64<0>
  t19: i64 = Constant<16>
  t6: i64 = Constant<0>
In function: __omp_offloading_fd00_4b200ae__QQmain_l5
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --linker-path=/work/agozillo/git/flang-dev/llvm-main-project/build/bin/ld.lld -- -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o single-value-alloca.out /lib/x86_64-linux-gnu/Scrt1.o /lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/lib -L/usr/lib -L/home/agozillo/git/flang-dev/llvm-main-project/build/lib -L/home/agozillo/git/flang-dev/llvm-main-project/build/projects/openmp/libomptarget -L/home/agozillo/git/flang-dev/llvm-main-project/build/projects/openmp/ -L/home/agozillo/git/flang-dev/llvm-main-project/build/projects/openmp/libomptarget/DeviceRTL -L/etc/alternatives/rocm/lib /tmp/single-value-alloca-825105.o -L/work/agozillo/git/flang-dev/llvm-main-project/build/lib --whole-archive -lFortran_main --no-whole-archive -lFortranRuntime -lFortranDecimal -lm -lomp -lomptarget -lomptarget.devicertl -L/work/agozillo/git/flang-dev/llvm-main-project/build/lib -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /lib/x86_64-linux-gnu/crtn.o
1.      Running pass 'CallGraph Pass Manager' on module 'ld-temp.o'.
2.      Running pass 'AMDGPU DAG->DAG Pattern Instruction Selection' on function '@__omp_offloading_fd00_4b200ae__QQmain_l5'
 #0 0x0000560af190f69f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x147969f)
 #1 0x0000560af190ce84 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007fd3d84a9420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x00007fd3d7f4600b raise /build/glibc-BHL3KM/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
 #4 0x00007fd3d7f25859 abort /build/glibc-BHL3KM/glibc-2.31/stdlib/abort.c:81:7
 #5 0x0000560af071eb98 llvm::ConvertUTF8toUTF32(unsigned char const**, unsigned char const*, unsigned int**, unsigned int*, llvm::ConversionFlags) (.cold) ConvertUTF.cpp:0:0
 #6 0x0000560af22b02bd llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e1a2bd)
 #7 0x0000560af22b2a19 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e1ca19)
 #8 0x0000560af0e98117 AMDGPUDAGToDAGISel::Select(llvm::SDNode*) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xa02117)
 #9 0x0000560af22ad240 llvm::SelectionDAGISel::DoInstructionSelection() (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e17240)
#10 0x0000560af22ba62e llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e2462e)
#11 0x0000560af22bd758 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e27758)
#12 0x0000560af22bf446 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#13 0x0000560af0ea1349 AMDGPUDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xa0b349)
#14 0x0000560af1a1e351 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#15 0x0000560af1285b71 llvm::FPPassManager::runOnFunction(llvm::Function&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xdefb71)
#16 0x0000560af15206e7 (anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) CallGraphSCCPass.cpp:0:0
#17 0x0000560af1286652 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xdf0652)
#18 0x0000560af1ee0205 codegen(llvm::lto::Config const&, llvm::TargetMachine*, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex const&) LTOBackend.cpp:0:0
#19 0x0000560af1ee080d llvm::lto::backend(llvm::lto::Config const&, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a4a80d)
#20 0x0000560af1ed6c65 llvm::lto::LTO::runRegularLTO(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a40c65)
#21 0x0000560af1ed72b8 llvm::lto::LTO::run(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, std::function<llvm::Expected<std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>> (unsigned int, llvm::StringRef, llvm::Twine const&)>) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a412b8)
#22 0x0000560af07d1a5d (anonymous namespace)::linkBitcodeFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::SmallVectorImpl<llvm::StringRef>&, llvm::opt::ArgList const&) (.constprop.0) ClangLinkerWrapper.cpp:0:0
#23 0x0000560af07d881a llvm::Error (anonymous namespace)::linkAndWrapDeviceFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::opt::InputArgList const&, char**, int)::'lambda'(auto&)::operator()<llvm::SmallVector<llvm::object::OffloadFile, 3u>>(auto&) const ClangLinkerWrapper.cpp:0:0
#24 0x0000560af07dee05 (anonymous namespace)::linkAndWrapDeviceFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::opt::InputArgList const&, char**, int) ClangLinkerWrapper.cpp:0:0
#25 0x0000560af07248e0 main (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x28e8e0)
#26 0x00007fd3d7f27083 __libc_start_main /build/glibc-BHL3KM/glibc-2.31/csu/../csu/libc-start.c:342:3
#27 0x0000560af07c119e _start (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x32b19e)
 #0 0x0000560af190f69f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x147969f)
 #1 0x0000560af190ce84 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007fd3d84a9420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x00007fd3d7f4600b raise /build/glibc-BHL3KM/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
 #4 0x00007fd3d7f25859 abort /build/glibc-BHL3KM/glibc-2.31/stdlib/abort.c:81:7
 #5 0x0000560af071eb98 llvm::ConvertUTF8toUTF32(unsigned char const**, unsigned char const*, unsigned int**, unsigned int*, llvm::ConversionFlags) (.cold) ConvertUTF.cpp:0:0
 #6 0x0000560af22b02bd llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e1a2bd)
 #7 0x0000560af22b2a19 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e1ca19)
 #8 0x0000560af0e98117 AMDGPUDAGToDAGISel::Select(llvm::SDNode*) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xa02117)
 #9 0x0000560af22ad240 llvm::SelectionDAGISel::DoInstructionSelection() (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e17240)
#10 0x0000560af22ba62e llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e2462e)
#11 0x0000560af22bd758 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1e27758)
#12 0x0000560af22bf446 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#13 0x0000560af0ea1349 AMDGPUDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xa0b349)
#14 0x0000560af1a1e351 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#15 0x0000560af1285b71 llvm::FPPassManager::runOnFunction(llvm::Function&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xdefb71)
#16 0x0000560af15206e7 (anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) CallGraphSCCPass.cpp:0:0
#17 0x0000560af1286652 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0xdf0652)
#18 0x0000560af1ee0205 codegen(llvm::lto::Config const&, llvm::TargetMachine*, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex const&) LTOBackend.cpp:0:0
#19 0x0000560af1ee080d llvm::lto::backend(llvm::lto::Config const&, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a4a80d)
#20 0x0000560af1ed6c65 llvm::lto::LTO::runRegularLTO(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a40c65)
#21 0x0000560af1ed72b8 llvm::lto::LTO::run(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, std::function<llvm::Expected<std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>> (unsigned int, llvm::StringRef, llvm::Twine const&)>) (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x1a412b8)
#22 0x0000560af07d1a5d (anonymous namespace)::linkBitcodeFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::SmallVectorImpl<llvm::StringRef>&, llvm::opt::ArgList const&) (.constprop.0) ClangLinkerWrapper.cpp:0:0
#23 0x0000560af07d881a llvm::Error (anonymous namespace)::linkAndWrapDeviceFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::opt::InputArgList const&, char**, int)::'lambda'(auto&)::operator()<llvm::SmallVector<llvm::object::OffloadFile, 3u>>(auto&) const ClangLinkerWrapper.cpp:0:0
#24 0x0000560af07dee05 (anonymous namespace)::linkAndWrapDeviceFiles(llvm::SmallVectorImpl<llvm::object::OffloadFile>&, llvm::opt::InputArgList const&, char**, int) ClangLinkerWrapper.cpp:0:0
#25 0x0000560af07248e0 main (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x28e8e0)
#26 0x00007fd3d7f27083 __libc_start_main /build/glibc-BHL3KM/glibc-2.31/csu/../csu/libc-start.c:342:3
#27 0x0000560af07c119e _start (/work/agozillo/git/flang-dev/llvm-main-project/build/bin/clang-linker-wrapper+0x32b19e)
```

The command used to compile this and hit the error (should just require having a Clang that's compiled to support AMDGPU and the dependent PR if it's not committed already): flang-new --offload-arch=gfx90a -fopenmp  test.f90 -o test.out 

>From what I can gather, from digging a little into the issue, this comes from AMDGPU not supporting DYNAMIC_STACKALLOCA instructions. I think AMDGPU only performs static allocation, but someone with more understanding of that segment of the compiler will know far better than myself. 

However, the generation of this code that's unfriendly for AMD GPU, appears to stem from the HLFIR AssignOp, which lowers to a Fortran runtime call, which likely brings in the instruction that requires a dynamic stack allocation instruction (I've unfortunately not found the exact problematic line, but there's a number of areas that might pose the problem). 

The solution, that I can currently think of, is to opt out of the HLFIR AssignOp generation for AMD GPU devices or for OpenMP offload (or both) and utilise the old FIR flow, which does not depend on the runtime call. I am not sure how palatable that is for everyone though, as I imagine the intent was to discard this old FIR flow in the near future. I am more than open to other suggestions however! This is just the option I had in mind just now.

It also brings up the possible issue that errors like this are encountered for other cases where HLFIR operations lower to Fortran rutnime calls, but that may be hyperbole as this is the only case I've encountered so far. 

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsfF1T6zjy96fxuelyypbzesFFTkIYamEPC8w-NVcp2W7HGmTJK8kE9tM_JclJ7BDmMLMz7P5PpeqcEGSp1f3rF7Ul1FRrthGIF8Hoa0AI3ch_M86lCAgJRssvtDGlVBf75i-pzF8vHkumgWndIGyphkI2Ioe8UUxswJQIrKo5VigMNUwKkIVrLSTncmv73N1DQKZU5MA05FijyFEYkAKYCcgsSOZQGlPrIJkHZBWQ1YaZskkHmawCsuL8efcjrJX8FTMTkFXdcB6Q1SSejMcQRMsgmvvPx97U-EItc7AtWVYCNQar2mgwEipag2XJIwIUnilv0D6hAijnMqOGphzhmSrmvkgBOT6zDCGTVc04akdgK9WTBUU5qXOsFWbUYA6r63souNwGZAFpY2DLOIeCMg6N3kEncAs_3ex7JvOeLME4av-5X2slN4pWUFEmfAsAABMGN6jsLF22LZjJHAxqc-jbdsCATN0DMjs8sw0QJEuIox4PJA7IUFY1GKo2aCxwdrgslKyCZP4-nVF0TAFF3lLpzmAH1YoJAwGZWzEOPB865Pge75Zoi8xJ1PznLwx5vkP9YB_Xi0tApaSycL2P_M3NP2_h8v7-273FdEGFkAY0cmuLFmQS2R9sPAzIIiud9PmroBXL1trQ7MnxDiYeB8k8tiIupNCGCjvajkoW9tHlySeRfdDiYOJZO5Gb49C3Hb_rNn6n14HWtYCiEZl1WNt3vZZVvZZFwSW1MK2LPIrWw5REEcX1-h__sDa35iM_-O7mcv5wCbpJK2aAQtpsQGEtlbH-87t92YUWHZCV8ycmMt7k6BSVKapLSGn2ZBTNcOCnf7CQQt5U9V5r0SCIZnetf1C1aWw40s6fyMp6aEBWu6jmmQrIquBUbMIcn3csWSE7fKUN47n9yURAVpnrzZl4QhVuFa1rVBCGpdQmNIrVHINk-TIdr8fDsBFPQm6F7d28hBvRQLgbWVNTBsnyT2OL5wPOcwhDCP8NCrmSlimqy1CbV8eTnx7LsFC0wrDMFYQVIC_WnlsIa4YQtgbb8mlx4yy1Fr3ieSvIy3QcjocDLQcEQgk2inEMXeAMvXsOZGPaoQFZtWjsUQjI6iFTJh7I3-yTKcN8l0arfcdNlp3uPvNDUtww8TCQEN58eOTv6RuQ1WDw9sOB5OmcFqj77HhEd-bT47o9Tsx31Mn_WsoK_xPD-tMItS3WtWWNoqo9cVnV7Vryl83yOfwHZLV0GcH9442fEY01H8oNKkENe3ZhTcmsamENyMo4Mid8J5ySURyNdhb8n4YHp8VwW0qOIVVZyZ4RQr6Syigq1nYQhKGQ7_W4b4RhVadhiRmrKIeQVxByu5y7z50mD98HPktShv-JgvBNlkEYUh0KxBxz37LWXoZuc21KhdR-yz4-7HfGGhT5w_eDmBhIvzrFdnW6b4SwKUdNtYaATBaU8ytF6xLubMstFdSlcRObaFYyb2wSRyY8D23SOpABmbTrHzlFbn67vLr7GZbzqzBILpfzK7iz6a4ScC20UY1b6uHB5Sx20ffz7HIASyEYRh9OA8ikzTUCkkQQvURRFI3GES3iWVSMZwW4ld6loPpV-y93Nsdza_ejXcwDMj10UnS7ltoopFVAxjYPYsKmePbF4S9dwQPyNXqJh5PZeFYc0tiAJPGRVBlOh_DANoLyn6jIuR06bZn0zXqQ1TYjidz_PSHSEpoUeZJPh3Q2JBGs1wq1kQrXyrQyvmtJnKWtTduVN2o5HpKox2_SnWZSDMdRlIKiTFsr2gOx4SzNwq8_3SR_u93_SgZJ7EKSlWK3zuhXnWNtw1cj2ItvcDBbzmxQs6QHWZDMR7HLavecDPuckNF0NAOaSifpxzgxuUfDjXKTTO0kHaMbddUTTWJMZ9OO0S2keEZlfn5cTY38-XGVkIBMG-FefnPISqogs2mxe-NwLx3vPew8cdp-03_XungzvWZSrDjd6NaQB5m0os_gwN1pkxl3hSMkjUiad6jvnXg5v7p-QN7O6d5KfkHjH_fc62H5d5mjY_OzXApjStK8Z6KTI7EIjWffFcu3LmSOC1lVNnCdluvjGvw8BDIaz3oITHtWi7NpHE_AR-7l_OpRnpD8v6xHGpE4nvSEmPXVSHMyjL6rxqXsLEOdVWj6mfqYkOEhaNoYHx1ZJB0T_L6jyRyvUMxFflkxs5xffa4UZDgm2JMiPpIin4ymH_SrOedfqWbZVy6zJ92ztdUuNWg9afyZMk4mo2lPRnIkYzEcjr8ro2rEN3FLs5IJ3InTk_HNs52Qg5oqY9faGRyTfhuyLX9J37NpnAxn73r2H-frMxw-TYazHvbDXipEY0xGMbzLrM1mO2KelO83AT9B7zTmvRwgJtNROunytbqzQ3d59e_m6K-HOscincQ9qHsrfzwi0RgnfvNcitdKNhoErVDXLn-etfHo6rSct-4dom9XbZOTcf8C8rBYvA_y5Ajk8XhEOiBz3NDstU3wD2xcV_XB1t9n4XNgLqLxiPRg7q3DMWJEohFkMscN9rnlRu4zuoJtOrGwm-49uvfe1m7bnEOb3D88bLMuDiMuX2rMDOZBsth3bAT7V4Pr2qhe1wXNSsxXjOND-37UIZ5jQRtu1jlyNPjb45JL_w-6qbDLiHqybJnAbsxv96XfH9HR6Nvmh6aqqHq9Fjm-9FaSm8dvX2n2hCI_bXezYxVNo24OvFdM6ol8WGtnvbzRy6eu7XRIp1He9UbS30DAfJyNR6dUffP4bR9T7nHTcKpsE5n-WDr9PE1E2XjU00R8pIkJSaff08QPh_8fiRE_guDfG_RgFBObeyz-t4w4JmnvVYGQ_tZQHtNR_r0cypL-yoxNASyY_Tehh4py_k_MjGzzmo4CZPqrPwQOkvk3v29qCTgMjgLvb5E5YHtioKzbCeZqc8O0OX4jG7jfayVrn0AvLFo3Dqz_57E6ucSS5Aio6TSmnWkvlZLqI8DNRW7n8Uchfxl8exSuRd2Yt1As3L7PYYPO7_X4IQGZcFqlOQ3IxArUGLmzVU8aFTVS-Rf5vmIOzH-IcbKApGm9sDuRZ_TDqhkeqQYxGv1fV8WHhT_a2yXDKUbuj14-J6aQKU6xt09Exkdb2pNomsB6zVnq_sBDmXXL3oe2tzPd7HbZ_Vf30NFxe93JkNjPw_STPiBZHM8Q_MSfA0lC0niGvV3A86nP-dTnfOpzPvU5n_qcT33Opz7nU5_zqc_51Od86nM-9Tmf-vwwG4LnU58fWS_nU5__KZ2eT33-2z51PvU5n_qcT33Opz7nU5_zqc_51Oftqc_Je9WPpbsOX1GRQ6MxByN31-PBlMxfkS-Zcdd5cRdbdCkbnsOvjTag8F8NUwglfWZiA9QbDJiSmoBM9I6ao6yb2t0ybi87Wdrtpfu2psDdPbDClRWYaBDSON6YMZgD5Qpp_toWHPAQCdxCGLb3ndwduCBZboqXWUQhLPydP3-jfVDMIgil_-4uuXZAWClZwbakBq4howI21JT-Rn5hn-Rss_GicWYMR-sZ0ldO0Lpx0cNBlckKtR_SCuiumXuZLYHlL3-f314v1g-P88Xf5jc33xZzYIcNVj2Aa0tJPO3GS8FfoUZVSFVp0IYalu2KALhtD1-ZQMsKpUDYMlNCJRVCI3JU2lDh7sy7ig7UgMZN5So3-AoPrWaUr2zwJOQWCqogRWNQ2RECqleNvBj00PpJbvHZw2OpbFDYOLyvHOGAcPe_WwNoRKEYipy_uioL89slXN397Ood1DVS5co5aIOVh87S9CUV5q60w7fadvUFILjcou9Pob3WCKq96JhRzjs92RPyV0jtAq2BCa-uzk06B0hruxro7r4_uPv-HYx7gwIyvQ7I5NkCXEhlGkGNncbq2ZfVcG7yQjMDtZIpx8qpjLsdBq8sa1rogKEgmipFZXGjCqn2TFVsUxqopfZ36Fs6AZkN3hTK0JI3O0MwB_vNGqVQGP7aWpN0yR9zwMnagLX_1gb6SHeV2dFVWzdDg1Su-VuN4vYOWr-zqEgFqTSlXS9cJDGMs5Z_yfulNLx-conewb3vg_Qa6irTegOtWh-yAUZuoaa8rY_hxGW-cIc1x1frAKaUzaZ0pqXhGlhFN0xgq3tjTX9LHQo50xlVuTfXLoc7UxFIFRSNaRS2fDi_ck5h44qD0qoSdLPZoHb-a1n0rhFDW3TFx0iHQ-1gvYaS2jQdKibaCCrkdtDV7LUByrXcGW9TezuQWjMrua_k4uR3AVk7Y2-jtUJAkclGGFSYO3Q8mxnVqGFrja9Vus-fHN_Or6xIB6cyYqcHfbBca530FVKE8rVGlUqO4MzWy-rEtCHLTgatp3TZ0dJGmJ0df8kvknyWzOgXvIgnUTydjKM4-lJeTMdklGckn0U4nNJolk-TyWg4LMiE0iLPR1_YBYlIEpNoHI9IFEeDjGRpPCITnJJ4jEkUDCOsKOMDu3wOpNp8cahdTIbjKPnCaYpctzV03EoSJHOmAkICsug0tdZ41H7cq2AqLHlxYvzu0vlR837L0tXsURduiU-bjQ6GEWfa6APXhhnuiv2s3NjRMhh99d7XfvcuGIyWx568d7C9bil043C1c3Dr394nmfYpgKuF46-FH64Sdxz_S6P4xR-vEuJ08P8DAAD__8nk5hM">