This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 4/4] strip: Add --reloc-debug-sections-only option.


On Tue, Nov 06, 2018 at 03:21:24PM +0100, Mark Wielaard wrote:
> The buildbot didn't sent any failure emails (I am still looking into
> why), but this new cmp test failed on debian-armhf, fedora-ppc64 and
> fedora-ppc64le:
> https://builder.wildebeest.org/buildbot/#/builders/15/builds/81
> https://builder.wildebeest.org/buildbot/#/builders/12/builds/242
> https://builder.wildebeest.org/buildbot/#/builders/11/builds/244
> 
> It succeeds on everything else. Still investigating.

The buildbot did sent email. I was too fast.
The issue was kind of subtle, but is easily fixable.
I committed the attached patch with some extra testcases to
(hopefully) get the build green again on all arches.

Cheers,

Mark
>From c6e3290a9722df58191c1ac181ce587f406d7b7a Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Fri, 9 Nov 2018 08:18:22 +0000
Subject: [PATCH] libelf: Explicitly update section data after (de)compression.

We need to explictly trigger a section data reload after updating the
ELF section rawdata to make sure it gets written out to disk on an
elf_update. Doing this showed one bug/inefficiently when the underlying
file has a different endianness. In that case for debug sections we
would convert by allocating a new buffer and just copying over the
raw data into a new buffer. This is not really necessary and would
hide any relocations done on the rawdata by libdwfl.

Added a couple of new ppc64 big endian testfiles that show the issue.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 libelf/ChangeLog                       |   7 ++
 libelf/elf_compress.c                  |   6 ++
 libelf/elf_getdata.c                   |   3 +-
 tests/ChangeLog                        |  10 +++
 tests/Makefile.am                      |   5 +-
 tests/run-readelf-zdebug-rel.sh        | 106 +++++++++++++++++++++++++
 tests/run-strip-reloc.sh               |   4 +
 tests/testfile-debug-rel-ppc64-g.o.bz2 | Bin 0 -> 1400 bytes
 tests/testfile-debug-rel-ppc64-z.o.bz2 | Bin 0 -> 1420 bytes
 tests/testfile-debug-rel-ppc64.o.bz2   | Bin 0 -> 1103 bytes
 10 files changed, 139 insertions(+), 2 deletions(-)
 create mode 100644 tests/testfile-debug-rel-ppc64-g.o.bz2
 create mode 100644 tests/testfile-debug-rel-ppc64-z.o.bz2
 create mode 100644 tests/testfile-debug-rel-ppc64.o.bz2

diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index af5650360..53da9a65f 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,10 @@
+2018-11-09  Mark Wielaard  <mark@klomp.org>
+
+	* elf_compress.c (__libelf_reset_rawdata): Make rawdata change
+	explicit by calling __libelf_set_data_list.
+	* elf_getdata.c (convert_data): Don't convert if type is ELF_T_BYTE
+	even if endianness is different.
+
 2018-10-18  Mark Wielaard  <mark@klomp.org>
 
 	* libelf.h (Elf_Type): Add ELF_T_NHDR8.
diff --git a/libelf/elf_compress.c b/libelf/elf_compress.c
index fd412e8a6..d96245df2 100644
--- a/libelf/elf_compress.c
+++ b/libelf/elf_compress.c
@@ -326,6 +326,12 @@ __libelf_reset_rawdata (Elf_Scn *scn, void *buf, size_t size, size_t align,
 
   scn->rawdata_base = buf;
   scn->flags |= ELF_F_MALLOCED;
+
+  /* Pretend we (tried to) read the data from the file and setup the
+     data (might have to convert the Chdr to native format).  */
+  scn->data_read = 1;
+  scn->flags |= ELF_F_FILEDATA;
+  __libelf_set_data_list_rdlock (scn, 1);
 }
 
 int
diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c
index 4f80aaf2d..2043bba2d 100644
--- a/libelf/elf_getdata.c
+++ b/libelf/elf_getdata.c
@@ -146,7 +146,8 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass,
 {
   const size_t align = __libelf_type_align (eclass, type);
 
-  if (data == MY_ELFDATA)
+  /* Do we need to convert the data and/or adjust for alignment?  */
+  if (data == MY_ELFDATA || type == ELF_T_BYTE)
     {
       if (((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0)
 	/* No need to copy, we can use the raw data.  */
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 23e911336..7ce39808d 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,13 @@
+2018-11-09  Mark Wielaard  <mark@klomp.org>
+
+	* testfile-debug-rel-ppc64-g.o.bz2: New test file.
+	* testfile-debug-rel-ppc64-z.o.bz2: Likewise.
+	* testfile-debug-rel-ppc64.o.bz2: Likewise.
+	* Makefile.am (EXTRA_DIST): Add testfile-debug-rel-ppc64-g.o.bz2,
+	testfile-debug-rel-ppc64-z.o.bz2 and testfile-debug-rel-ppc64.o.bz2.
+	* run-strip-reloc.sh: Also test on testfile-debug-rel-ppc64.o.
+	* run-readelf-zdebug-rel.sh: Also test on testfile-debug-rel-ppc64*.o.
+
 2018-10-26  Mark Wielaard  <mark@klomp.org>
 
 	* run-strip-reloc.sh: Add a test for --reloc-debug-sections-only.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a2a381ac8..d3ac345df 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -412,7 +412,10 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
 	     testfile-riscv64.bz2 testfile-riscv64-s.bz2 \
 	     testfile-riscv64-core.bz2 \
 	     run-copyadd-sections.sh run-copymany-sections.sh \
-	     run-typeiter-many.sh run-strip-test-many.sh
+	     run-typeiter-many.sh run-strip-test-many.sh \
+	     testfile-debug-rel-ppc64-g.o.bz2 \
+	     testfile-debug-rel-ppc64-z.o.bz2 \
+	     testfile-debug-rel-ppc64.o.bz2
 
 if USE_VALGRIND
 valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1'
diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh
index 3f20078c4..53fa42a27 100755
--- a/tests/run-readelf-zdebug-rel.sh
+++ b/tests/run-readelf-zdebug-rel.sh
@@ -146,4 +146,110 @@ cat loc.out | sed -e "s/'.debug_loc' at offset 0x185/'.zdebug_loc' at offset 0x1
 
 cat loc.out | sed -e "s/at offset 0x185/at offset 0x150/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel-z.o
 
+# Same as above, but on ppc64
+testfiles testfile-debug-rel-ppc64.o
+testfiles testfile-debug-rel-ppc64-g.o testfile-debug-rel-ppc64-z.o
+
+cat > info.out << \EOF
+
+DWARF section [ 6] '.debug_info' at offset 0x80:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ [     b]  compile_unit         abbrev: 1
+           producer             (strp) "GNU C11 7.3.1 20180712 (Red Hat 7.3.1-6) -Asystem=linux -Asystem=unix -Asystem=posix -msecure-plt -g -Og"
+           language             (data1) C99 (12)
+           name                 (strp) "testfile-zdebug-rel.c"
+           comp_dir             (strp) "/home/mjw"
+           low_pc               (addr) 000000000000000000
+           high_pc              (data8) 44 (0x000000000000002c)
+           stmt_list            (sec_offset) 0
+ [    2d]    subprogram           abbrev: 2
+             external             (flag_present) yes
+             name                 (strp) "main"
+             decl_file            (data1) testfile-zdebug-rel.c (1)
+             decl_line            (data1) 4
+             prototyped           (flag_present) yes
+             type                 (ref4) [    82]
+             low_pc               (addr) 000000000000000000
+             high_pc              (data8) 44 (0x000000000000002c)
+             frame_base           (exprloc) 
+              [ 0] call_frame_cfa
+             GNU_all_call_sites   (flag_present) yes
+             sibling              (ref4) [    82]
+ [    4e]      formal_parameter     abbrev: 3
+               name                 (strp) "argc"
+               decl_file            (data1) testfile-zdebug-rel.c (1)
+               decl_line            (data1) 4
+               type                 (ref4) [    82]
+               location             (sec_offset) location list [     0]
+ [    5d]      formal_parameter     abbrev: 4
+               name                 (strp) "argv"
+               decl_file            (data1) testfile-zdebug-rel.c (1)
+               decl_line            (data1) 4
+               type                 (ref4) [    89]
+               location             (exprloc) 
+                [ 0] reg4
+ [    6a]      variable             abbrev: 5
+               name                 (string) "a"
+               decl_file            (data1) testfile-zdebug-rel.c (1)
+               decl_line            (data1) 6
+               type                 (ref4) [    9c]
+               const_value          (sdata) 18446744073709551607 (-9)
+ [    74]      variable             abbrev: 6
+               name                 (string) "b"
+               decl_file            (data1) testfile-zdebug-rel.c (1)
+               decl_line            (data1) 7
+               type                 (ref4) [    9c]
+               location             (sec_offset) location list [    4e]
+ [    82]    base_type            abbrev: 7
+             byte_size            (data1) 4
+             encoding             (data1) signed (5)
+             name                 (string) "int"
+ [    89]    pointer_type         abbrev: 8
+             byte_size            (data1) 8
+             type                 (ref4) [    8f]
+ [    8f]    pointer_type         abbrev: 8
+             byte_size            (data1) 8
+             type                 (ref4) [    95]
+ [    95]    base_type            abbrev: 9
+             byte_size            (data1) 1
+             encoding             (data1) unsigned_char (8)
+             name                 (strp) "char"
+ [    9c]    base_type            abbrev: 9
+             byte_size            (data1) 8
+             encoding             (data1) unsigned (7)
+             name                 (strp) "long unsigned int"
+EOF
+
+cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=info testfile-debug-rel-ppc64.o
+
+cat info.out | sed -e "s/'.debug_info'/'.zdebug_info'/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=info testfile-debug-rel-ppc64-g.o
+
+cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=info testfile-debug-rel-ppc64-z.o
+
+cat > loc.out << \EOF
+
+DWARF section [ 9] '.debug_loc' at offset 0x1af:
+
+ CU [     b] base: 000000000000000000
+ [     0] range 0, 4
+           [ 0] reg3
+          range 4, 14
+           [ 0] breg3 -42
+           [ 2] stack_value
+          range 14, 2c
+           [ 0] GNU_entry_value:
+                [ 0] reg3
+           [ 3] stack_value
+ [    4e] range 8, 18
+           [ 0] reg3
+EOF
+
+cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel-ppc64.o
+
+cat loc.out | sed -e "s/'.debug_loc' at offset 0x1af/'.zdebug_loc' at offset 0x15f/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel-ppc64-g.o
+
+cat loc.out | sed -e "s/at offset 0x1af/at offset 0x177/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel-ppc64-z.o
+
 exit 0
diff --git a/tests/run-strip-reloc.sh b/tests/run-strip-reloc.sh
index 6e54ab4af..6f299aba2 100755
--- a/tests/run-strip-reloc.sh
+++ b/tests/run-strip-reloc.sh
@@ -135,4 +135,8 @@ testrun ${abs_top_builddir}/src/elfcompress -o strip-compressed.o -t zlib \
 runtest strip-uncompressed.o 1
 runtest strip-compressed.o 1
 
+# See run-readelf-zdebug-rel.sh
+testfiles testfile-debug-rel-ppc64.o
+runtest testfile-debug-rel-ppc64.o 1
+
 exit $status
diff --git a/tests/testfile-debug-rel-ppc64-g.o.bz2 b/tests/testfile-debug-rel-ppc64-g.o.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..8c5ec99e7d413fcf6b2109dc5af751c4cecff508
GIT binary patch
literal 1400
zcmV-;1&8`VT4*^jL0KkKS->=g0RRKT|NsC0|L*($fBpae_y7Oz|M&Xu-~awu{hE3E
za&G(df2hy{o7{jmZM(SdK~brxqtZ0fO-4=X1i&&z$ueev8&lF~VrjH`gHh-Krip+7
z9+8msFief9>SSbTk?EjJ8bfMr05q6JX^2uN$kRXu(gr{SBSwLvKmZ1S13&-(4FCYp
z0000000000007k09#c~^^rxzRsphC;+MZL=Y2s>njSo=J&;jZI3?_{RhL2DHVgLXQ
z05Td40MKcsOrEA7XaE2pXlMY?(?)=3WHJCU41j3RWCjQWMnD>ApazD3XaS%A02u%P
zGzNgs7$j0gr>Tf#G;KmQf_qV<!Zg|wXpJ<{rk+hkN2!ULh7iPhj2b4I9-ta}jWjb;
z5u;5pJw`wbm_tkiG&ISk5X|9hv*!vEk`CP}mDq)-oNn-y8Dau!X;J5NrCAD?apNkC
zO&dm0z=j&CPHyfQ?cNqC2YaOziz*!UCi10XK0Ei<kn-+(TT5)b>nZsMG!P&NB3PoA
z5K{p>VBe_Z@#F|6nlfdK+EEaIi4Y2S9HN1wk%{+Hj*Y>#z!V9>1h~#44wp24BTd}w
zgV@0)DPx6Bj{?HDp#T5?94d9_{&?_@zrnCs+Rar6^HHU5Q%2htmDg`1LQ@@p(okqJ
z*|$>S6_YFyl?O$b5+s7bh=U-&Z2}88KpOyTY-~vl`Hl^-u_n?+y`)?*0n~WC1Q1uV
z&S*$K3D8L!>&PS^oY09{9Mnqo#a8ZiH%F~>N9xaB$F<zeG%Z(2LmMb8>*aRjq$k%r
zDA3{nzKragV?10Ym#p{YlWDNiEnrcfV<Mo@PWBm|>LJsqswI>{yMh5%F(Qj6-(i$y
zsm#uFY6<e@I+j3nxcKdBVZ(E_lWD^3gsRvmI`>>Up;ag)Ck~_W&)h~Lm6u`Q+shDJ
zG=l=lo0u3X5Wn*wSJb=kB?U8>(6aybHX_<MYJO@T6uM~8X}a1`0BlHn?3yl6@v{>I
zbe06LQ|D`gk92H@Bn`Ub=D8NAwXLd(eJbg&X&T81@seKM*N{ms9{P#z+!D^U?je3M
z53%TgPiE<06^{hD#m_s1s~3)Wv~sbyNXotGJ4Q+38Zs?>+d-O9ww1deGIBhdAFIN|
z%-~aBE+leoD&4$NGJ_w_ug%||Eb^gN5*L*_7Y}|jYrk-#?XtH0XRxx6Tk2#rROSIs
zK0n1@Nhzgb1HNTmlhs{{5)3JV_!I>xns&hf%;=IdGR_M#1OkTLuDbEbfz5NxX_0L7
zVMmgXhhoa*0$r>Z4F*Yg`0sbumL-=Itd788sHKp|g~Alc!5OA;TIyx1JnAVyUOo@H
zMU15+#d)6cBB-OAK|&Ym`%ijR(T_jIJZ@1nqJH9$*Dl$IZXtj~L_afdJx_bG;r^NN
zfb!l9WiKs*Qh^r5hENj*Za}9a8xDtXDb^3!Ru=C5H1AAl0kDYPQYVSAk1r&3mRSr=
zN&H;WTi%|_C3xW`5l|v^-AeToQb__(^`%D2YKjc8C6|G_QwH$>0{$nwH3Kl&^RTRU
zZcIC%3<wTwR%VA~;L9uy)S@z|9J_uU&Db8R$jU#bL1RaJwPl?M6hlPM+{cd=!S~BF
zp?V2UrUjDaDs$0RNtT!(xn>~EI8^)|u8~S$Md{6RGZ5S!MWH!v9ZdPspKq$u!+uc|
zHYu?|J?P|OOYO0~9rGNr7fopH1MNIRLi#D4Sr6+O0t=&(r}TReYKCEIr4Rg})?%t+
zbq(80lSvv-i@>dyaW1p?Q;@mAoh$(>`zx9!<y8`;hnkpvf$)Hm;S^Nd;_gVN3KAFw
GkiZ}~a)z(~

literal 0
HcmV?d00001

diff --git a/tests/testfile-debug-rel-ppc64-z.o.bz2 b/tests/testfile-debug-rel-ppc64-z.o.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..df50465fceffe5446a06103346ce85b57dcf753d
GIT binary patch
literal 1420
zcmV;71#|jBT4*^jL0KkKS!MiGE&v1DfB*mg|L*hu|NZ~p_kaKI|M&Xu-~OI^{hoRI
za&G_pf2hy{y4~OhFK*p9VkxPV^-mQ2B>gg@)bed8H1#vnRMC(RQ_^~mQ_z}iA?iG!
z(Wj{OG&IxH^nsI4Q%^`9pc+3^^%?+rntFpl>Uu$@Y967JLqpW^M#T!IP|)&$pfqRz
z01r?DCV&6{05WNy0B9Oy00000000000MKLrA}NT~KT2=aHi@a|k5TE8WHNe;69~X2
z3AGw%$Y{}k34jP-69E__3FvAx85(5C>R|><03m=(D3oXb02qdV00T`1fEoY*Jwc!V
z&@=$h0000Q0000000004ibxRkH5e3V#);|ZDYSrj29fF-dWM-j6B-7iYI;voN2p}=
zF_JVGnlx$Z2AUp(Fi%s^h7syL6GK2`1|hWu9(RPJC_xr5VN)+~<YD6mhJ=YzsF-{;
zSk4OJfH~kbr$eEDgEmI+;wgk^!29$&4n!$6u!#im&mEYW3UpY(0Kg#x_$nA7&qQSY
z-m7Blpg*L+kQw<52tfpz7;K>i+&JifXexkuq9}qR6BuT)qy-!(pbY2-lTdx5nGo^{
zZ?KPs0^A@ch!z`731_b)o{1pXozH)CQVJl(V2T+&006S8Fai{`85?^)PXbbvPX@#m
z*VnXCyIDzH&8E2PwBBz9Vo6W6U^J8(R(j_(#1%}hN<<%i%z+X@uwsKC#G4WV(hvs3
zhQ`Lg6Ml10ZH<XGAjYs(3`j8@y>t+3SQ|DW2hki5mIe$GNF!(o9v^)YrDCLeTT0vS
zXEhYN?^D<*6#~;UB`%AwkQvI!5hBQ7olB~Tz#!hPC<2o4gF6=!Z&g#v#^1>!j(rfd
zik7yEF)>lJOlP5-f>vZ|3dsuo0tyBVi4BT#5KUz^G8Rm{dQOb>4lT)_b6Ek@Wo>ct
z@Yz4_Ohx-fJ%onXRn8$aQ&uP<O@qUs!nUlGB6jM!+U7_jz-a|TChcId4@UZ%xKd(y
zcM=1)>ERnf?!Vgji8L-3e<dFFOu0h3c<QJCNRfOwV$11hXhcGRF&2YfK=iK`6F3D3
z27rs0G3O)1?%9!ERpO9s->4nb6l~Txa=Wo&?)eWsW(~@TEP0sF85|VAx|}tvBV<0Q
z_wmzF;?onMZb%z~M{-QKE=at}3qh-(X|%hy9xKm)YV3Hn`AGhG>)CG?4h20!BqAV#
z`Bp@^tRkx<eWb(#_~s@{sRK%+<&>!OFV(kon^H_<lu|K>5K~64x>sIn($V(h)Em9v
z(<~r5nQMXU6uiVK(=?6?tbm&XIr2-73VILP_4Zpsn=OVcJZUqan71m%o8#e_IW%R(
z(yBG-OF;{o0y&`w5<(#YXn;&Xgarl;;J)@CQq^XhCNUCaGBd6a0q8j}c12Z#h-?fP
zqcLxNsOa?8d1td7>;Z{%YHI%)iQF8KQ*)6)^-fA<T%spgg-1^yj<Ua&UNo#^-cTJ?
zB=v1Gh)F6CvVjOK;V4^tghi}0vJi$Ozh%|o$Scw2y{RGcfI$a9z~^44Qo#}<Ob#)5
zV@VjGmm}r!21N>h;)D#M03z=4`m)Oq8j3i^VBP(H*Gp~VOIFHt#wfiboD006>d50o
zdTjBqYJZ1y>{cKTf2UvF!{TN&CUB!I!m4#9;P&r+%Ca^J{+i<qpE}*-TqGKd8hdM{
zIqW#N<Sj|OUsy>HyOBpAJ#}dhJs@l!%KvH?zAN!Xe!f*lB`b&NIn;}0l@hq=X`>L)
zqy!tW^s_{HHeD972boDL4vnuWZ-~m%=DQTjn0S>x3J!bYuS}P@qF}e*qrI5=x@;Cm
a;M(q!sx2UDCc(J>@pmLsg$V{<#X{hSoOrqb

literal 0
HcmV?d00001

diff --git a/tests/testfile-debug-rel-ppc64.o.bz2 b/tests/testfile-debug-rel-ppc64.o.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..8340d0cee0e0f509b96a230e47473f1318211fb4
GIT binary patch
literal 1103
zcmV-V1hD%;T4*^jL0KkKStF?k-2enHfBgUd|Lphw{r~&z-y#41|Mt=-!sgB~ga|+Y
zXvok5njQsd?Vgd|AdxXmpfx>BG&Bt~GzN@AAZXE`83uun01X2`4FRCZpa@AdHjE}}
zO@wNCo~D{<pa1}9001-q000dEpa21;f(fN3=+d5$(9mH30004?000000002c&;S66
zc~fcvG|*(x>KQZu7$KkoMnDY#rkXM|8feH2AbOf;$Yf*^B$Fh`Jxx6m(1w6AX_25b
z007VcXaE2KpwKiK0LW-FOy3cj)iglUBM0)p^`T|3D=Z>;BIYsNdsZw$RI$T{$p}-=
zaI02~LIsD;NDsax!Vyg7Y|Culj^shU8+ya;h!_(h0U}s1LVQ7sS<mKqBh4Psb~7i~
zCxOIDJUHtDGtpK_T)M5bWA!}QYX$9}yLR!70ttYom>NhrcC__bx{(STC<Emzz|4jN
zSS?m+?XT~hGZsEWK>(pNXq69;7Y+;n009n~Hx#MJ3KV7{037m{#%5%MQwYdl(@wf>
zCH*laQLTe)K@3LYjO#figw1+WLoiGzi`^S{_cSCJEJVx*XgP5JR$u|gl+slknSj*I
zB1|eo6gX)lHVut~X(rMG9f(Ky(E3e!v0++S#p6p6p&jCx2oZ9`by$m6Lr7Y8mHUJs
z=bRWq0*=o*MuCg4?XoQLE_U*x9~<arRMkV1MPHRKwRpFt3qPd5pMp|Cch2l+asay-
zdgmCNklmd0AXu5|0Jwwm<s;NdL_snZWFUbAtdl4y7_syf6UGt~60pWwLP#fQpkUY&
zv{GfF=DgIfSVSq)DFyc>2H=69S^?{TcxeM<#7GDQ=piP+3#Qg70?4Hn9#bSW`?Q25
z?kYkT6{FgUq&Wlu7|^?x^<;m#9=U>JG{PN|Lax)5JjJZE(}5<~o;)UnDFFe6IF=C*
zf&{^69^mxC2Ocg36kbbKYL!`vNd!UX7&oX!kR*&V>w@%@`U;;M;v9gSgkGTL88;33
z?N8sVjgV3SuxMM$MP~|&j|gIf)jP?oAZfI&nKoctd!w#b-Ieg*$gD`1wkl2=`qo~8
zl;KR8RL-WZ#o-OswV4!Ts5B$2XoG|zCMU{K9mJ(aFk`JY=n4ULLWL<17>20{@*qG5
z(grc^uM(wkfp&(!FFbOLnXV48t<zry9o6`UsOUjoEUQjxG&J%grprw#_BuA!6^d4(
zGnpk60Xm+%DKMJf#iEv2iR1ebzS0lTU<!=W_Xr$Q;DZ1F@K2IRY|9Hkn`k{TSqO{r
z8glIr)Cdc!IQYYqS%s2OXmbU4Lb((~AsP-r><4R{noiGHU5o>jCNRN1sDQaew8&Km
zEeZwzlmr%Slv<aS!oW7kFkGha0g;pZp*D53`h$SNcUcfMF)*bqC{d(AXd;}51-NR|
V3FaVFfe6F@7ji{7P>>_32;B%%*1`Y)

literal 0
HcmV?d00001

-- 
2.19.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]