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

    <tr>
        <th>Summary</th>
        <td>
            Infinite execve() loop on ppc64le with pre-loaded libasan
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Hey!

First of all, I'm really not sure on which side this issue actually is nor if this is a "supported" scenario at all.

In [systemd](https://github.com/systemd/systemd) when we test *everything* with ASan/UBSan, we wrap certain uninstrumented binaries (that load instrumented stuff) with a simple shell script to make them work with ASan without having to resort to setting `LD_PRELOAD=<path-to-libasan.so>` globally, since that leads to all sorts of issues. The wrapper is pretty straightforward - we move the original binary, suffix it with ".orig", and then place a shell script at the original location. For example, for `/bin/su` we'd move it to `/bin/su.orig` and place this script at `/bin/su`:

```bash
#!/bin/bash
# Preload the ASan runtime DSO, otherwise ASAn will complain
export LD_PRELOAD="/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-x86_64.so"
# Disable LSan to speed things up, since we don't care about leak reports
# from 'external' binaries
export ASAN_OPTIONS=detect_leaks=0
# Set argv[0] to the original binary name without the ".orig" suffix
exec -a "$0" -- "/bin/su.orig" "$@"
```

This works pretty well and allows us to test systemd with ASan/UBSan without having to rebuild the whole system.

However, a couple of days back, I noticed a strange fail in one of the newer tests in the `ppc64le` job:

```
[90437.173819] testsuite-58.sh[68]: ++ su testuser -s /bin/sh -c 'XDG_RUNTIME_DIR=/run/user/$UID exec "$@"' -- sh mktemp --directory /tmp/test-repart.XXXXXXXXXX
[90440.809111] testsuite-58.sh[69]: ERROR: ld.so: object '/usr/lib64/clang/14.0.0/lib/libclang_rt.asan-powerpc64le.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
[90440.809419] testsuite-58.sh[69]: /usr/bin/su: error while loading shared libraries: libpam.so.0: cannot open shared object file: Error 24
```

where `su` is the wrapper above, calling `/bin/su.orig`.

After several hours of playing around, it looks like pre-loading ASan on `ppc64le` in case of the `su` binary causes an infinite `execve()` loop - but only on `ppc64le`, on `x86_64` it works as it should:

`x86_64`
```
# cat /bin/su
#!/bin/bash
# Preload the ASan runtime DSO, otherwise ASAn will complain
export LD_PRELOAD="/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-x86_64.so"
# Disable LSan to speed things up, since we don't care about leak reports
# from 'external' binaries
export ASAN_OPTIONS=detect_leaks=0
# Set argv[0] to the original binary name without the ".orig" suffix
exec -a "$0" -- "/bin/su.orig" "$@"
# su.orig --version
su.orig from util-linux 2.38.1

# strace -e execve,openat -- su --help
execve("/usr/bin/su", ["su", "--help"], 0x7ffeeacbc840 /* 31 vars */) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libtinfo.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
...
openat(AT_FDCWD, "/usr/bin/su", O_RDONLY) = 3
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x5616c4cc9ee0 /* 32 vars */) = 0
openat(AT_FDCWD, "/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-x86_64.so", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam_misc.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libeconf.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/proc/sys/kernel/cap_last_cap", O_RDONLY) = 3
openat(AT_FDCWD, "/proc/self/cmdline", O_RDONLY) = 4
openat(AT_FDCWD, "/proc/self/environ", O_RDONLY) = 4
...
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

Usage:
 su [options] [-] [<user> [<argument>...]]
...
```

`ppc64le`

```
# cat /bin/su
#!/bin/bash
# Preload the ASan runtime DSO, otherwise ASAn will complain
export LD_PRELOAD="/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so"
# Disable LSan to speed things up, since we don't care about leak reports
# from 'external' binaries
export ASAN_OPTIONS=detect_leaks=0
# Set argv[0] to the original binary name without the ".orig" suffix
exec -a "$0" -- "/bin/su.orig" "$@"
# su.orig --version
su.orig from util-linux 2.38.1

# strace -e execve -- su --help
execve("/usr/bin/su", ["su", "--help"], 0x7fffe2d0c430 /* 46 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x1000cc045f0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffedbfa3e0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7ffffd5546a0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffc128c2d0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffec341d50 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffdb41dbc0 /* 47 vars */) = 0
...
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffc467b1c0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7ffff1592070 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffc50d5980 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffc48844a0 /* 47 vars */) = 0
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffe9ac0950 /* 47 vars */) = 0
ERROR: ld.so: object '/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
/usr/bin/su: error while loading shared libraries: libpam.so.0: cannot open shared object file: Error 24
+++ exited with 127 +++

# strace -e execve,openat -- su --help
execve("/usr/bin/su", ["su", "--help"], 0x7fffec04f040 /* 46 vars */) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libtinfo.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
...
openat(AT_FDCWD, "/usr/bin/su", O_RDONLY) = 3
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x10037b345f0 /* 47 vars */) = 0
openat(AT_FDCWD, "/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam_misc.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libeconf.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/proc/sys/kernel/cap_last_cap", O_RDONLY) = 3
openat(AT_FDCWD, "/proc/self/cmdline", O_RDONLY) = 4
openat(AT_FDCWD, "/proc/self/environ", O_RDONLY) = 4
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffe63f9560 /* 47 vars */) = 0
openat(AT_FDCWD, "/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libpam_misc.so.0", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libeconf.so.0", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/lib64/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/proc/sys/kernel/cap_last_cap", O_RDONLY) = 4
openat(AT_FDCWD, "/proc/self/cmdline", O_RDONLY) = 5
openat(AT_FDCWD, "/proc/self/environ", O_RDONLY) = 5
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7fffc45fd770 /* 47 vars */) = 0
openat(AT_FDCWD, "/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libpam_misc.so.0", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libeconf.so.0", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/proc/sys/kernel/cap_last_cap", O_RDONLY) = 5
openat(AT_FDCWD, "/proc/self/cmdline", O_RDONLY) = 6
openat(AT_FDCWD, "/proc/self/environ", O_RDONLY) = 6
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x7ffff8d5c270 /* 47 vars */) = 0
openat(AT_FDCWD, "/usr/lib64/clang/15.0.4/lib/libclang_rt.asan-powerpc64le.so", O_RDONLY|O_CLOEXEC) = 6
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 6
...
```

However, if I drop the `LD_PRELOAD=...` line from the `su` script, everthing goes back to normal:

```
# cat /bin/su
#!/bin/bash
# Disable LSan to speed things up, since we don't care about leak reports
# from 'external' binaries
export ASAN_OPTIONS=detect_leaks=0
# Set argv[0] to the original binary name without the ".orig" suffix
exec -a "$0" -- "/bin/su.orig" "$@"

# strace  -e execve,openat -- su --help
execve("/usr/bin/su", ["su", "--help"], 0x7fffee2d44b0 /* 46 vars */) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libtinfo.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
...
openat(AT_FDCWD, "/usr/bin/su", O_RDONLY) = 3
execve("/bin/su.orig", ["/usr/bin/su", "--help"], 0x100127e45f0 /* 46 vars */) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpam_misc.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libeconf.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 3
...
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

Usage:
 su [options] [-] [<user> [<argument>...]]
...
```

After checking other binaries we do this with, they seem to be working fine-ish (i.e. no "infinite" loop), but the `execve()` calls are doubled:

`ls` (with wrapper, but without `LD_PRELOAD=`):
```
# strace -e execve -- ls -l ~
execve("/usr/bin/ls", ["ls", "-l", "/root"], 0x7fffcc26a798 /* 46 vars */) = 0
execve("/bin/ls.orig", ["/usr/bin/ls", "-l", "/root"], 0x1000ad545f0 /* 46 vars */) = 0
total 256
-rw-------. 1 root root 18565 Nov 21 12:18 anaconda-ks.cfg
-rw-r--r--. 1 root root     6 Nov 21 12:18 NETBOOT_METHOD.TXT
-rw-------. 1 root root 18582 Nov 21 12:23 original-ks.cfg
-rw-r--r--. 1 root root     9 Nov 21 12:18 RECIPE.TXT
+++ exited with 0 +++
```

`ls` (with wrapper and `LD_PRELOAD=`):
```
# strace -e execve -- ls -l ~
execve("/usr/bin/ls", ["ls", "-l", "/root"], 0x7fffdcb4f378 /* 46 vars */) = 0
execve("/bin/ls.orig", ["/usr/bin/ls", "-l", "/root"], 0x100092845f0 /* 47 vars */) = 0
execve("/bin/ls.orig", ["/usr/bin/ls", "-l", "/root"], 0x7fffead45308 /* 47 vars */) = 0
total 256
-rw-------. 1 root root 18565 Nov 21 12:18 anaconda-ks.cfg
-rw-r--r--. 1 root root     6 Nov 21 12:18 NETBOOT_METHOD.TXT
-rw-------. 1 root root 18582 Nov 21 12:23 original-ks.cfg
-rw-r--r--. 1 root root     9 Nov 21 12:18 RECIPE.TXT
+++ exited with 0 +++
```

Same with `stat`:
```
# Without LD_PRELOAD=
# strace -e execve -- stat ~
execve("/usr/bin/stat", ["stat", "/root"], 0x7fffdb495aa0 /* 46 vars */) = 0
execve("/bin/stat.orig", ["/usr/bin/stat", "/root"], 0x1003f7045f0 /* 46 vars */) = 0
# With LD_PRELOAD=
# strace -e execve -- stat ~
execve("/usr/bin/stat", ["stat", "/root"], 0x7ffff9d33f70 /* 46 vars */) = 0
execve("/bin/stat.orig", ["/usr/bin/stat", "/root"], 0x10004a145f0 /* 47 vars */) = 0
execve("/bin/stat.orig", ["/usr/bin/stat", "/root"], 0x7fffcd4e52b0 /* 47 vars */) = 0
```

etc. Not sure if that's expected, but at least the binaries seem to be working fine.

This was originally spotted on CentOS 8 Stream with `compiler-rt-14.0.0-3.module_el8.7.0+1149+a59781f0.ppc64le`, but it's reproducible on Fedora Rawhide with `compiler-rt-15.0.4-1.fc38.ppc64le` as well.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztXFtT47gS_jXhRWWX75cHHiAJu9RhyRQwNXOeUrIsJ14c2yXZBP796ZadGwkkZsjC7CGVSnyRP7XU3V-3ZNlRET-d_smfepbZMwY946z5vUiFrEiREJplPatPLnuWPyOCw-4TyYuKyFpwUuRkPk3ZlMg05qSappKkUtacUFbVqigcyQtB0mRxllDSsyxZl2UhKh7DNpGM51SkBaEVVqevy3GZk557Lp9kxWdxzx30rGBaVaXs2Wc96wK-k7Sa1pHOihnsLMqtbYUgIQcxQTwOLepZZ_yBiyeQJp_ADpnD9eTsluZw0fdz9d_H0nNBS8K4qGiakzpPc1mJesZzkJlEKcrLJaAF1RSkzgoak40isqqTRNWO-BQ6aFZmnMgpzzJosEjLilQFmdF77Dc-I_NC3K-EUVtFXZEpfQBBsajgEnoMtySvKjzY84yrwfjbzfBqdDbo2fDtl7SaalWhZWlEJc11WfTsIZQjk6yIUCHYOpnmDGtFwTmNJWJSFAvwJepc6VDq5G7a9EPJBWquFFDxEzRN0HQyrZJCzKmIiYbdNSseVENIIdIJdE_WdFJTH3RF-kjSqmkfqFzHUvCPZ2ke44U5KTMKYtHNPgIZN1CzgtEqLXKdXIBZ8UeK3YowIA12CGgRKkYDqLHZczjnx410qeq8zTKNIFAQpWgEUHa6qn0LEy1vzUDxiPpCh0_bQ5aN3rS4auME-Sa4shZsldK0qPMqnXEyuB1hOwo4IeapxLNnaAfQF2DcIBuAKRT-iK5DNlWPfXlRSwG_oHvPgX-WUTTxC9PVDd1pTjS_6sxYVDraiPYYeGPPQVMBkKWcg1TSCCz2CmVEoys5R6nB8CSpy5UdgfLjAtrpV4RR4AQaod2CYd2DyaKkcgWaiGIG-vf5Y8UFqBM2l8600Tho-_V49O3ucnR9C82LecVZNUZQ8PyBsUK85aAlMXkAkjCAHlDSHVZIcgo9vPApLLBmhK19LurnjGiKo3qWY-BpTWv2nhkNnGkK9VSxZ9awbiJ3aFHo30sXmqOFo8mB2xVz6E_lg4qgWuLa5qWdlBDVadbY0nxaIL-oqzcY9M9ijoynXA0sqUYaAh-P6ZMkEWX3it2R0lMGCqbKvfMJJwlNM-A04HhVHuvI-RyYAMWUeEb1o2eUJfMccELwor-L6CX3aHfd89BwbF83fTswQ6UxhKvTimtuoIOnuOdegERvn0H_nsMX9KMK1RIq15B0F5qYEo2hOf0c_DG--X59d_nXcDy4vFH-cAF-pVwCmw6Bwvl-OSBKuxtaAwME_QLS7B46roSdOBVgawUYDVxXzUr8hdo1MGYKLvNz-VlvkWPogRGapvlCi8K2RcObm9ENbmSx4uYzUkR_Q3XYipcd2AEHNl524BI0LBolKC_2Gz9bEQQ4Zo4xO-JogEg_oGmIXe3hogT2lVNw3nghTpIiq4YoYDqBAM5jfbu5zosKDJcKbJu05E84yIUAroa8AQwRZUFjbmuHpomGDLCL0qikM2iRjpxL9giLnauAQbUvuyLkAkIZbRMewC-rtRgH1PWgggkDv2wj7I5gseFeZwlQGYRkcDGgG3BQoUIo8PUTIlBR1HmMmCmmCQVwQJbeKz1oi8arMACp1KYvgYMxKpe-t5S5ZTRGwbQhm8qhYJLm0P1YBA0cmxCg8qAw1Ag2TSKgjSKHdOx5LSriqGNNFFAVVy1ZUYnbEtqUxdtuvbxgd3cDNzMMn2u6_wqO_-fBEURqC8B14DASErnm1OKw6oO6SjPIYPP6kVi6HegbAxMFAiEKOlfjZGHvfaQFMDfk8hp-IYUsVzK3HmFt01GTgkL_qDHJYteyWgTYxyFHnxiPfpJwTlnEAscgKqKcEdskD1RgRGoGIyGB_ietAhqJoOKzu_HFoP9j0EJDSV4xtDUMATqjbMrbikfjm8Ho-uq_Pb8_GvevRsOfw_4C1d6LujBt-IfhQVIguvfeyKwjqq7re-F36mSJvYn3TJ3PrW6lzRd1vUu5rmd6zGEs5HylXOttyn0HnvllhR3dwJaB-f1xx7NUsqOAd7Xdw1BlFbMmUT0K_ISxsURk872RZ0eRl9ZxWh1FXs6KPDmOYdBSyyfvB12KgjVzUPB7D8GcZ0gFtBxnVFZj2Hid5A6A5lmCkLMY4uSWd7doTkc0nj-kArOV19AOJ3SVpGMHF5BOc4U__n4L_1f98V_D29uzP4a4t4r2-myL_dq6NZMMr0fD6zsctVxDvlWzqUr7IZchywEb5rxvFk3_fnehBZ9WurpKPq1w_4Rcze93SSd8ORTBVA-CfVHihKDEBBf2tPa_Z_fV2N8etnuQCKvJWTiCNgyhH76bJr1zyLg5XnplauNfMuJ5PpvwNez5rMOe4452Em7FBnPsZULseK8kxMfJy03DMBgzHDdZSeH_41KozoijhNr8o8VIYtd1PPrRYjDTChiYx0crhdmOGbsfLUYcgRQRO0yMZbA5onYcz4_MA-U5oq2abmgZ_keLwVwjdsPgw8VwgsBxPtxzeUiZER7oMm-7W9Exvzjq3YqPvP-g5gTw_hV_THFJgLqjZ0J7l2c-ybwm8KjhJIZzWKT_mtfcgxrzB_itqqc1tB83Cut6dH1-Ner_57ecJIVkzPYj--Bk7N3nSLdHJl8TpV8TpV8TpV8TpZ9xovSIOZxnJ6Hr_S4svL9338LC-1HfxsJdcTuxcCfwg1m4E2p3Fu4E34mFOyEfzMKdUDuxcCfkTizczTA6sfDh5NaZhbvy5uss7L4rC7vHH9C7SewfOL3x8Sy8v3ffwsL7Ud_Gwl1xO7FwJ_CDWbgTancW7gTfiYU7IR_Mwp1QO7FwJ-ROLNzNMDqx8OHk1pmFu_Lm6yzsvSsLe0efZA5il1m_DQvv7923sLB3yH3stecA0oRcklgU5WJl8cbNY4TBpcNgI83U7Mby4-bJGERBNHXvl0wK3jxLgLda80LMaLbnMYA33Sv_uv38ptvPz6eXP2B-mVux40Rf88vvgvovnl82wQ835pc_q6F8Tev-1vOYx5nRfdPs6C-tp_xaFqh-P2JZYPPcF1ALu8cUSK3TWz0YrjKQ5lFiDPHYUijwRCTnM0wIIq6escIrE8iztFTic9FBqnMdEijs2cVTXRjU8SkubDKgRItkYftZL3xoTRLMd-KihjxpxzNbmeypaeNA3YtuH3tbwC5yka3HyvExsXAFtp3K7VqYBqJoGen5w73pBAi1HjNWuxAkstU2lBRFUW1NwzDLo34YHBQydgauTO4NXB1kwiVrNHYPjmJVUUFOaLltDq-JudZ8dGISBG9-zMD1XHJdPBDLJKYF2jADQnMKFBlT7V7qLJmsEISG300E_HjPEa6Hd-ej0R146d2fo4F-9_NurxiBtQEC6l9ktgeLET4X42bYv_w2XFW_e-2EsbVy4oX1ujvNXD1v_XvZdswiJ7H9T2XboRX82nLM9xVJDS9o7Li2ERwk05e_vbO_3S7GsWqOoIIsYf0dGdsO9aMNM5t--Kq_IepB7qaq3xibrh142c0iJ3Qp_ZWFzlDN_tHPPllwgU3iGweHjkVvfqKuTMLYxjZ8gq40HGr-4sLxdxFFJSmxw10rOkyWnV4GI1odvLh975J6nRLW60vQbQlJMY8XaVzzVh_ZpInLhPSFxHPjVQbNe0qoXBJMBglrWVRICEVO-pAlj25JQG4rwels6fP4OAok6EITlda8qkKzIcGP64yPeRboPg6Hzk3TgQT2nLqhH5iJoW--gwAFT5v2CF4KuJilONUH1V7wuBCU3ND5FF8ytbNWNU2rmXrC7GANGd9ggK9a0U_4qel5oeHalu-fxKd2HNohPanSKuOnl4v3J6wn1M2bE6D6Fq2pd_HWhmapKE4Bn9QiO33ljVRZ9rD406BduF4UdpsXLMGGG0K_nExPncSHLT_yKPNsg1sWsJKZeL5v2E5k-PZJRiOeydPGBHM-b97R1NjZSXpqGZZlmvD1XXy7SmjEeHsytOPY8LzE6DkGn9E001EOMOnJiThVIkX1RMLJLJWVXJ2kUqaTnHNVHeDTGihbnM4EM2YzSKNOVOWnSvj_Ad3qXj8">