From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 60790 invoked by alias); 1 Jun 2018 00:51:27 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 59147 invoked by uid 89); 1 Jun 2018 00:51:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.4 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=ton, lcd, bem, Deal X-Spam-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: gnu.wildebeest.org Received: from wildebeest.demon.nl (HELO gnu.wildebeest.org) (212.238.236.112) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 01 Jun 2018 00:51:17 +0000 Received: from tarox.wildebeest.org (tarox.wildebeest.org [172.31.17.39]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id BC585300087F; Fri, 1 Jun 2018 02:51:14 +0200 (CEST) Received: by tarox.wildebeest.org (Postfix, from userid 1000) id 4BF7140011A3; Fri, 1 Jun 2018 02:51:14 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: Mark Wielaard Subject: [PATCH] readelf: Deal with combined normal and split dwarf DebugFission .debug_loc. Date: Fri, 01 Jun 2018 00:51:00 -0000 Message-Id: <1527814269-7544-1-git-send-email-mark@klomp.org> X-Mailer: git-send-email 1.8.3.1 X-Spam-Flag: NO X-IsSubscribed: yes X-SW-Source: 2018-q2/txt/msg00132.txt.bz2 Normal and split dwarf from GNU DebugFission look the same, but should be treated competely separtely. When having a file with both skeletons and real compile units only note the secoffsets into the real .debug_loc in readelf. Otherwise or known_locslistptr will get confused. Add a testfile that combines an normal -gdwarf-4 object with a -gsplit-dwarf object. libdw already got this right, but add a run-varlocs.sh test to make sure. Signed-off-by: Mark Wielaard --- src/ChangeLog | 5 + src/readelf.c | 14 +- tests/ChangeLog | 10 + tests/Makefile.am | 2 + tests/run-readelf-loc.sh | 289 ++++++++++++++++++++++++ tests/run-varlocs.sh | 42 ++++ tests/splitdwarf4-not-split4.dwo.bz2 | Bin 0 -> 931 bytes tests/testfile-splitdwarf4-not-split4.debug.bz2 | Bin 0 -> 2230 bytes 8 files changed, 359 insertions(+), 3 deletions(-) create mode 100644 tests/splitdwarf4-not-split4.dwo.bz2 create mode 100755 tests/testfile-splitdwarf4-not-split4.debug.bz2 diff --git a/src/ChangeLog b/src/ChangeLog index 95f8a72..55e735b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2018-05-31 Mark Wielaard + * readelf.c (attr_callback): Only register section_loc when not + looking at a split dwarf from a skeleton. + +2018-05-31 Mark Wielaard + * readelf.c (print_debug_units): Print the dwo name and id when unable to find a .dwo file. diff --git a/src/readelf.c b/src/readelf.c index 8d85dc8..e2d9c69 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -7077,9 +7077,17 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) { bool nlpt; if (cbargs->cu->version < 5) - nlpt = notice_listptr (section_loc, &known_locsptr, - cbargs->addrsize, cbargs->offset_size, - cbargs->cu, num, attr); + { + if (! cbargs->is_split) + { + nlpt = notice_listptr (section_loc, &known_locsptr, + cbargs->addrsize, + cbargs->offset_size, + cbargs->cu, num, attr); + } + else + nlpt = true; + } else { /* Only register for a real section offset. Otherwise diff --git a/tests/ChangeLog b/tests/ChangeLog index 1c1ef4e..04b6e75 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,15 @@ 2018-05-31 Mark Wielaard + * splitdwarf4-not-split4.dwo.bz2: New test file. + * testfile-splitdwarf4-not-split4.debug.bz2: Likewise. + * run-readelf-loc.sh: Add test for splitdwarf4-not-split4.dwo + and testfile-splitdwarf4-not-split4.debug. + * run-varlocs.sh: Test testfile-splitdwarf4-not-split4.debug. + * Makefile.am (EXTRA_DIST): Add splitdwarf4-not-split4.dwo.bz2 + and testfile-splitdwarf4-not-split4.debug.bz2. + +2018-05-31 Mark Wielaard + * test-subr.sh (self_test_files): Split into self_test_files_exe, self_test_files_lib and self_test_obj. (testrun_on_self_exe): New function. diff --git a/tests/Makefile.am b/tests/Makefile.am index e935410..28ba9f7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -238,6 +238,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ testfile-macros-0xff.bz2 \ run-readelf-macro.sh testfilemacro.bz2 \ run-readelf-loc.sh testfileloc.bz2 \ + splitdwarf4-not-split4.dwo.bz2 \ + testfile-splitdwarf4-not-split4.debug.bz2 \ run-readelf-ranges.sh \ run-readelf-aranges.sh run-readelf-line.sh testfilefoobarbaz.bz2 \ testfile-ppc64-min-instr.bz2 \ diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh index 484db46..bf676f2 100755 --- a/tests/run-readelf-loc.sh +++ b/tests/run-readelf-loc.sh @@ -868,4 +868,293 @@ DWARF section [ 3] '.debug_loc.dwo' at offset 0x225: [ 0] reg5 EOF +# Partial dwarf-4 and partial GNU DebugFission split-dwarf. +# +# = popcount.c = +# +# int popcount (unsigned char u) +# { +# int c = 0; +# while (u != 0) +# { +# if ((u & 1) == 1) +# c++; +# u >>= 1; +# } +# return c; +# } +# +# = splitdwarf4-not-split4.c = +# +# extern int popcount (unsigned char); +# +# int main (int argc, char **argv) +# { +# int i; +# int p = argc; +# for (i = 0; i < argc; ++i) +# p += popcount (argv[i][0]); +# i += p; +# return i; +# } +# +# gcc -gdwarf-4 -O2 -c popcount.c +# gcc -gdwarf-4 -gsplit-dwarf -O2 -c splitdwarf4-not-split4.c +# gcc -o testfile-splitdwarf4-not-split4 splitdwarf4-not-split4.o popcount.o +# eu-strip -f testfile-splitdwarf4-not-split4.debug \ +# testfile-splitdwarf4-not-split4 + +testfiles testfile-splitdwarf4-not-split4.debug +testfiles splitdwarf4-not-split4.dwo + +testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info+ --debug-dump=loc testfile-splitdwarf4-not-split4.debug <<\EOF + +DWARF section [28] '.debug_info' at offset 0x330: + [Offset] + Compilation unit at offset 0: + Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 + Unit type: skeleton (4), Unit id: 0x3d909d7bd0e69c0b + [ b] compile_unit abbrev: 1 + ranges (sec_offset) range list [ 0] + low_pc (addr) 000000000000000000 + stmt_list (sec_offset) 0 + GNU_dwo_name (strp) "splitdwarf4-not-split4.dwo" + comp_dir (strp) "/tmp" + GNU_pubnames (flag_present) yes + GNU_addr_base (sec_offset) address base [ 0] + GNU_dwo_id (data8) 0x3d909d7bd0e69c0b + GNU_ranges_base (sec_offset) 0 + Split compilation unit at offset 0: + Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 + Unit type: skeleton (4), Unit id: 0x3d909d7bd0e69c0b + { b} compile_unit abbrev: 1 + producer (GNU_str_index) "GNU C17 9.0.0 20180528 (experimental) -mtune=generic -march=x86-64 -gdwarf-4 -gsplit-dwarf -O2" + language (data1) C99 (12) + name (GNU_str_index) "splitdwarf4-not-split4.c" + comp_dir (GNU_str_index) "/tmp" + GNU_dwo_id (data8) 0x3d909d7bd0e69c0b + { 18} subprogram abbrev: 2 + external (flag_present) yes + name (GNU_str_index) "main" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 3 + decl_column (data1) 5 + prototyped (flag_present) yes + type (ref4) { 6d} + low_pc (GNU_addr_index) [4] 0x0000000000401050
+ high_pc (data8) 76 (0x000000000040109c <_start>) + frame_base (exprloc) + [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + sibling (ref4) { 6d} + { 30} formal_parameter abbrev: 3 + name (GNU_str_index) "argc" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 3 + decl_column (data1) 15 + type (ref4) { 6d} + location (sec_offset) location list [ 0] + { 3d} formal_parameter abbrev: 3 + name (GNU_str_index) "argv" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 3 + decl_column (data1) 28 + type (ref4) { 74} + location (sec_offset) location list [ 28] + { 4a} variable abbrev: 4 + name (string) "i" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 5 + decl_column (data1) 7 + type (ref4) { 6d} + location (sec_offset) location list [ 47] + { 58} variable abbrev: 4 + name (string) "p" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 6 + decl_column (data1) 7 + type (ref4) { 6d} + location (sec_offset) location list [ 73] + { 66} GNU_call_site abbrev: 5 + low_pc (GNU_addr_index) [1] 0x000000000040107f + abstract_origin (ref4) { 84} + { 6d} base_type abbrev: 6 + byte_size (data1) 4 + encoding (data1) signed (5) + name (string) "int" + { 74} pointer_type abbrev: 7 + byte_size (data1) 8 + type (ref4) { 7a} + { 7a} pointer_type abbrev: 7 + byte_size (data1) 8 + type (ref4) { 80} + { 80} base_type abbrev: 8 + byte_size (data1) 1 + encoding (data1) signed_char (6) + name (GNU_str_index) "char" + { 84} subprogram abbrev: 9 + external (flag_present) yes + declaration (flag_present) yes + linkage_name (GNU_str_index) "popcount" + name (GNU_str_index) "popcount" + decl_file (data1) splitdwarf4-not-split4.c (1) + decl_line (data1) 1 + decl_column (data1) 12 + Compilation unit at offset 52: + Version: 4, Abbreviation section offset: 29, Address size: 8, Offset size: 4 + [ 3f] compile_unit abbrev: 1 + producer (strp) "GNU C17 9.0.0 20180528 (experimental) -mtune=generic -march=x86-64 -gdwarf-4 -O2" + language (data1) C99 (12) + name (strp) "popcount.c" + comp_dir (strp) "/tmp" + low_pc (addr) 0x0000000000401180 + high_pc (data8) 33 (0x00000000004011a1) + stmt_list (sec_offset) 145 + [ 61] subprogram abbrev: 2 + external (flag_present) yes + name (strp) "popcount" + decl_file (data1) popcount.c (1) + decl_line (data1) 1 + decl_column (data1) 5 + prototyped (flag_present) yes + type (ref4) [ a0] + low_pc (addr) 0x0000000000401180 + high_pc (data8) 33 (0x00000000004011a1) + frame_base (exprloc) + [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + sibling (ref4) [ a0] + [ 83] formal_parameter abbrev: 3 + name (string) "u" + decl_file (data1) popcount.c (1) + decl_line (data1) 1 + decl_column (data1) 29 + type (ref4) [ a7] + location (sec_offset) location list [ 0] + [ 91] variable abbrev: 4 + name (string) "c" + decl_file (data1) popcount.c (1) + decl_line (data1) 3 + decl_column (data1) 7 + type (ref4) [ a0] + location (sec_offset) location list [ 60] + [ a0] base_type abbrev: 5 + byte_size (data1) 4 + encoding (data1) signed (5) + name (string) "int" + [ a7] base_type abbrev: 6 + byte_size (data1) 1 + encoding (data1) unsigned_char (8) + name (strp) "unsigned char" + +DWARF section [32] '.debug_loc' at offset 0x5ef: + + CU [ 3f] base: 0x0000000000401180 + [ 0] range 0, 9 + 0x0000000000401180 .. + 0x0000000000401188 + [ 0] reg5 + range 9, 1b + 0x0000000000401189 .. + 0x000000000040119a + [ 0] reg1 + range 1b, 1d + 0x000000000040119b .. + 0x000000000040119c + [ 0] breg1 0 + [ 2] lit1 + [ 3] shr + [ 4] stack_value + range 1d, 21 + 0x000000000040119d .. + 0x00000000004011a0 + [ 0] reg1 + [ 60] range 0, 9 + 0x0000000000401180 .. + 0x0000000000401188 + [ 0] lit0 + [ 1] stack_value + range 9, 20 + 0x0000000000401189 .. + 0x000000000040119f + [ 0] reg0 + range 20, 21 + 0x00000000004011a0 .. + 0x00000000004011a0 + [ 0] lit0 + [ 1] stack_value +EOF + +testrun_compare ${abs_top_builddir}/src/readelf --dwarf-skeleton=testfile-splitdwarf4-not-split4.debug --debug-dump=loc splitdwarf4-not-split4.dwo <<\EOF + +DWARF section [ 3] '.debug_loc.dwo' at offset 0x15b: + + CU [ b] base: 000000000000000000 + [ 0] range 401050, 40106e + 0x0000000000401050
.. + 0x000000000040106d + [ 0] reg5 + range 40106e, 401086 + 0x000000000040106e .. + 0x0000000000401085 + [ 0] reg12 + range 401086, 401095 + 0x0000000000401086 .. + 0x0000000000401094 + [ 0] GNU_entry_value: + [ 0] reg5 + [ 3] stack_value + range 401095, 40109c + 0x0000000000401095 .. + 0x000000000040109b + [ 0] reg5 + [ 28] range 401050, 40106e + 0x0000000000401050
.. + 0x000000000040106d + [ 0] reg4 + range 40106e, 401095 + 0x000000000040106e .. + 0x0000000000401094 + [ 0] GNU_entry_value: + [ 0] reg4 + [ 3] stack_value + range 401095, 40109c + 0x0000000000401095 .. + 0x000000000040109b + [ 0] reg4 + [ 47] range 401050, 40106e + 0x0000000000401050
.. + 0x000000000040106d + [ 0] lit0 + [ 1] stack_value + range 401086, 40108e + 0x0000000000401086 .. + 0x000000000040108d + [ 0] breg12 0 + [ 2] breg6 0 + [ 4] plus + [ 5] stack_value + range 40108e, 401095 + 0x000000000040108e .. + 0x0000000000401094 + [ 0] reg0 + range 401095, 40109c + 0x0000000000401095 .. + 0x000000000040109b + [ 0] lit0 + [ 1] stack_value + [ 73] range 401050, 40106e + 0x0000000000401050
.. + 0x000000000040106d + [ 0] reg5 + range 40106e, 401090 + 0x000000000040106e .. + 0x000000000040108f + [ 0] reg6 + range 401095, 40109c + 0x0000000000401095 .. + 0x000000000040109b + [ 0] reg5 +EOF + exit 0 diff --git a/tests/run-varlocs.sh b/tests/run-varlocs.sh index e98d8e9..b262177 100755 --- a/tests/run-varlocs.sh +++ b/tests/run-varlocs.sh @@ -559,4 +559,46 @@ module 'testfile-addrx_constx-4' location (exprloc) {addr: 0x404038, deref_size(4), GNU_push_tls_address, const: 0x403e08, deref_size(4), plus, GNU_push_tls_address, const: 0x403e0c, deref_size(4), plus, GNU_push_tls_address, const: 0x403e10, deref_size(4), plus, addr: 0x404034, deref_size(4), plus, addr: 0x40403c, deref_size(4), plus, stack_value} EOF +# See run-readelf-loc.sh +testfiles testfile-splitdwarf4-not-split4.debug +testfiles splitdwarf4-not-split4.dwo + +testrun_compare ${abs_top_builddir}/tests/varlocs --debug -e testfile-splitdwarf4-not-split4.debug <<\EOF +module 'testfile-splitdwarf4-not-split4.debug' +[b] CU 'splitdwarf4-not-split4.c' + [18] function 'main'@401050 + frame_base: {call_frame_cfa {...}} + [30] parameter 'argc' + [401050,40106e) {reg5} + [40106e,401086) {reg12} + [401086,401095) {GNU_entry_value(1) {reg5}, stack_value} + [401095,40109c) {reg5} + [3d] parameter 'argv' + [401050,40106e) {reg4} + [40106e,401095) {GNU_entry_value(1) {reg4}, stack_value} + [401095,40109c) {reg4} + [4a] variable 'i' + [401050,40106e) {lit0, stack_value} + [401086,40108e) {breg12(0), breg6(0), plus, stack_value} + [40108e,401095) {reg0} + [401095,40109c) {lit0, stack_value} + [58] variable 'p' + [401050,40106e) {reg5} + [40106e,401090) {reg6} + [401095,40109c) {reg5} +module 'testfile-splitdwarf4-not-split4.debug' +[3f] CU 'popcount.c'@401180 + [61] function 'popcount'@401180 + frame_base: {call_frame_cfa {...}} + [83] parameter 'u' + [401180,401189) {reg5} + [401189,40119b) {reg1} + [40119b,40119d) {breg1(0), lit1, shr, stack_value} + [40119d,4011a1) {reg1} + [91] variable 'c' + [401180,401189) {lit0, stack_value} + [401189,4011a0) {reg0} + [4011a0,4011a1) {lit0, stack_value} +EOF + exit 0 diff --git a/tests/splitdwarf4-not-split4.dwo.bz2 b/tests/splitdwarf4-not-split4.dwo.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4346b2e6dec2f4aab7edd79aec3e96f427f62540 GIT binary patch literal 931 zcmV;U16=$WEu!EX^Cr@K*^xdh-euDO++Nq38ooMH8zH(YI+$> z8f0map{9Un15E*-8Z>0n)C1JhLm{95X`pH88UPvu3nmy^1t?DEO~$2vK#s`BBXIHR zUxdSEZWZp9RMvnFJP{TOn{$%=HrE0ybCD}x`A--q%X=k25q?l7^KpBmwcnmT+CYVD| zkAY&hWF(V-LeI|WQ-MSl1qH-QY%R1eK2~L-pQ3ZPW5)py_y@>+?51MDsiSS15(FTi@{Npdt3re(*6GWdTULi3 z6+&(a^lR+qTS z8RERR$V5EkkxF&z$g&G5cbQ%WY~@uOcL^K?G{%DFX};t?;SjVg-04B!2C$E%%C)Tv zG94dz-r6Ud9a+_SK$1VaU@VbV1SFPXu==hB zJwkwh{w8C#qR7j0h!Z92enPL!0Hau`l_a32U&V(I7w;rT%3ocEOc-ipEpaew0xAR7 z)PULiW7cO10QVz4;7&+@sv@9JfGz`17%wv*G)%Oq;D!T%HZTZY@qz?Z2+XW@BLLek zvZ91-~G3UU2Lfco08+nxMF21PhugR!b3+a?v++)JZH&6i;6V5d@<7soTITx1AEc0jyqP37 zc&;VkMI%){@N9E+y?-!;3A6+O(Cib2gONphx(7*eWXu+~iDeT@ieR_+yOJrwgoL1% FxR}IAoL&F` literal 0 HcmV?d00001 diff --git a/tests/testfile-splitdwarf4-not-split4.debug.bz2 b/tests/testfile-splitdwarf4-not-split4.debug.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..6f4d701a9199c66e8d8a0e4684ee91da4946e468 GIT binary patch literal 2230 zcmV;n2ub%sT4*^jL0KkKS(YsdBLE3*|NsC0|NsB@_xu0v|8@W8|LFJIdzawM{Zv$0 zQHaM#rP$yHpEq|x4{sL-wkf+(>4X(H8X%H-8X>4@r;`+UN2#?QrcY6$)M(MBnq+A5 zjR4b420+t5(?)@#L7>n*CS^T9GyobsC#VL5CMJ-?X)&ceDe8Wx{ZsO%lT&JGrjJkz znqc)tKn(z3CLkIa8X62E1kf}ApaVvSsi10LN>3^38h`)|05SkH00Te`05TYw001%o z001%o0000Yo>CE@G#UWV&;S4c&<2128UPv$fY1N{05lmg0000128|gq4Ky^tb=jTns#g9)Zh0h3Ic0U{!3rXx)g%4JW~nLRX{O%O9r zP@k$iQzq2N!94lZ)E^ zv=R208JIS&8UV$z6TfoXM%c==4Qsa4?xs^>+RtrzIlF3#xt({=Qf6YMAoNtiEo2n- z?)G?D{;(31PC5-7xlEe(N*hy+zN-VmTh41gL2bi^D+D-1&X ztVY}850Rq@4%vtWa~5jP8;MXrO92$yfg}>pa7Lk^;x!zIP|``YoklWHh-mDiw3LPP z#sZd;X$yl^<{>u{lG2D5-##P;hyWNTz(@#)hzN+N8;uiiK58S7NKyR?Z~Eu*Aj**=A)91#n>&I^#+fqzcZ> zr9>*=P|5=b#mAz|^d39d^w(IM154Ly{E`QD3vGF_YFefq9XAs$ei${MYhR6z z*B{gFmmcZvfKq~b0hBOmKtT~`kgyUZoFqIN`VaH<-W;?DJyv*W`D;*$3`PwLd@xISFe6vqINn`zx#8Hwd?8dOJLwNH>LOs@ zQ=x+?VYKuK@@~_(zC>2qk|ptcxPjHMf3ckiI4fWIO+E-`bk3Z_rSqFZ|&*`$BU zQypupSu39B!j11JLC#GmtQNQ>w&rBY!o9BYEl&Ku4?>tfiIlqhY^qb3xiO2o2UWWg z06>bJjEGrR4P|v!!RSPVN>UP%A{D&#Rx=ATKkW)*v6B*nExXWFh6kGt|A@a{EbH!k zn;+T$TwOZmbkEI(-qz=QZ1?%`<4;mSN8y1Kf2D*>0VB_!ER~hZo8*ev8)(Rnew*q! z`}fm@&chzRCfQmpjuTdy(8{9wtg-9gP9?2>#@Q$wep|J^g-&6d2qGJZA}23$a5}9s zsXL4a*CZlLb%3P8moA~S*$gRs*xbT}Dmts8b+n{YSYglzPefXf$shz|NCZtL6dGSN zP|kdiz@`i){56_NQvmqs3Q8>9!O5=c3GDf7s9#@yBi7Fp$aw3hr>|@@l%VZQXl>pO zs>h{qG6BO?R4sqzjCwQ4QYKDJZh*4O$X-(e3qBFs(oa%T8rjqg!Tz>F8^ueJ0~v7& z@xL;n(UFvTh+{=BC5WiaqL}zjsV}&^dJUX%?-zASVN|yQF3?yy{80N~ZI7YPD z2lkHX)v+?Bty4Fg<}&PMv=Gv0I9hRNphyg4Wn0nK=^h+`$mqbbR;#S%Dp=Y8dKs5l z(JA7Y1Bk#f+4jzmr4=t!0KrBQWfb^s-qkI)WCJ3U7w-zOsz*3EYfNUKco#eu2ra8% zFhVl6*9Emf43P{tg*d1b+$|NL@jC4gupxAe+Cj~|YJwSc*;EyUayAR&Mr}sxJKXug zl++WZk+C5pxE4|fMh2;md3B5jgtph%V6AYb*D)(ADjN-(x+qnO zs<3&1n;EUTNB>UB{S#c8zl%Xosg5!0<*K01f@{=87>rJ+PeSOBQz5C|+xH;OJLiJ)_KuhUpbi;Pl3fJrC{KuD~k{Q>_Maz!{$kd`e9 EBg@S9z5oCK literal 0 HcmV?d00001 -- 1.8.3.1