From mboxrd@z Thu Jan 1 00:00:00 1970 From: Milian Wolff Subject: Re: perf trace report with time consumed Date: Fri, 01 Apr 2016 00:34:44 +0200 Message-ID: <11979280.sfXiZ5YTfG@agathebauer> References: <1894563.GPSC8z33rH@agathebauer> <4785655.UdtHu7qvlx@agathebauer> <20160330215832.GG3420@kernel.org> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1739560.0JIQQkJjTV"; micalg="sha1"; protocol="application/pkcs7-signature" Return-path: Received: from mail.kdab.com ([176.9.126.58]:56606 "EHLO mail.kdab.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932186AbcCaWet (ORCPT ); Thu, 31 Mar 2016 18:34:49 -0400 In-Reply-To: <20160330215832.GG3420@kernel.org> Sender: linux-perf-users-owner@vger.kernel.org List-ID: To: Arnaldo Carvalho de Melo Cc: perf group --nextPart1739560.0JIQQkJjTV Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" On Mittwoch, 30. M=E4rz 2016 18:58:33 CEST Arnaldo Carvalho de Melo wrote: > Em Wed, Mar 30, 2016 at 11:24:17PM +0200, Milian Wolff escreveu: > > On Mittwoch, 30. M=E4rz 2016 11:53:14 CEST Arnaldo Carvalho de Melo wro= te: > > > Em Tue, Mar 29, 2016 at 10:39:36PM +0200, Milian Wolff escreveu: > > > > with "perf trace record --call-graph dwarf" I get a nice data file > > > > with > > > > potentially everything required to find slow syscalls in user space > > > > applications. But I'm missing a way to rewrite the data file to let > > > > "perf > > > > report" attribute samples with the time spent as cost, instead of t= he > > > > raw > > > > number of syscalls, i.e. samples. >=20 > >=20 > > > There is even: > > >=20 > > > [root@jouet ~]# trace --duration 1000 -i perf.data > > >=20 > > > 1000.423 (1000.056 ms): sleep/1139 nanosleep(rqtp: 0x7ffebed266c0) = =3D 0 > > >=20 > > > [root@jouet ~]# > > >=20 > > > Having that with callgraph from userspace is what you're asking for, = no? > > >=20 > > > 'trace' here is just an alias for 'perf trace'. > >=20 > > Yep, I think having the individual trace entries annotated with their > > backtrace would be a useful addition and also brings perf trace closer = to > > strace, cf. it's -k option. >=20 > Humm, I was unaware of that: >=20 > -k Print the execution stack trace of the traced > processes after each system call (experimental). > This option is available only if strace is built with > libunwind. >=20 > Which is not the case in fedora23 :-\ I tried playing around with the source code to add that feature and have hi= t=20 some issues and need some guidance. My WIP patch currently is: ~~~~~~~~~~~~~~~~~ diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 69960c3..cc3df97 100644 =2D-- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -34,6 +34,7 @@ #include "trace-event.h" #include "util/parse-events.h" #include "util/bpf-loader.h" +#include "util/callchain.h" =20 #include #include @@ -2161,6 +2162,18 @@ signed_print: goto signed_print; =20 fputc('\n', trace->output); + + if (sample->callchain) { + struct addr_location al; + if (machine__resolve(trace->host, &al, sample) < 0) { + pr_err("problem processing %d event, skipping it.\n", + event->header.type); + return -1; + } + + perf_evsel__print_ip(evsel, sample, &al, PRINT_IP_OPT_IP |=20 PRINT_IP_OPT_DSO | PRINT_IP_OPT_SYM /* TODO print_opts*/, + scripting_max_stack); + } out: ttrace->entry_pending =3D false; err =3D 0; @@ -3221,6 +3234,9 @@ int cmd_trace(int argc, const char **argv, const char= =20 *prefix __maybe_unused) "Trace pagefaults", parse_pagefaults, "maj"), OPT_BOOLEAN(0, "syscalls", &trace.trace_syscalls, "Trace syscalls"), OPT_BOOLEAN('f', "force", &trace.force, "don't complain, do it"), + OPT_CALLBACK(0, "call-graph", &trace.opts, + "record_mode[,record_size]", record_callchain_help, + &record_parse_callchain_opt), OPT_UINTEGER(0, "proc-map-timeout", &trace.opts.proc_map_timeout, "per thread proc mmap processing timeout in ms"), OPT_END() @@ -3248,6 +3264,11 @@ int cmd_trace(int argc, const char **argv, const cha= r=20 *prefix __maybe_unused) trace.opts.sample_time =3D true; } =20 + if (trace.opts.callgraph_set) { + symbol_conf.use_callchain =3D true; + callchain_param.enabled =3D true; + } + if (trace.evlist->nr_entries > 0) evlist__set_evsel_handler(trace.evlist, trace__event_handler); ~~~~~~~~~~~~~~~~~=20 Which gives me something when doing ~~~~~~~~~~~~~~~~~ perf trace -e nanosleep --call-graph fp path/to/ex_sleep 1000.177 (1000.177 ms): ex_sleep/7965 nanosleep(rqtp: 0x7ffd123d3470, rmt= p:=20 0x7ffd123d3470 ) =3D 0 20379e syscall_slow_exit_work ([kernel.kallsyms]) 203bc4 syscall_return_slowpath ([kernel.kallsyms]) 797248 int_ret_from_sys_call ([kernel.kallsyms]) b7600 __nanosleep (/usr/lib/libc-2.23.so) 1fe258d4c544155 [unknown] ([unknown]) ~~~~~~~~~~~~~~~~~ Nice, so the frame point unwinding seems to work already. But I'm a user-sp= ace=20 person and none of my tools have that. So let's try dwarf: ~~~~~~~~~~~~~~~~~ perf trace -e nanosleep --call-graph dwarf path/to/ex_sleep perf: Segmentation fault Obtained 10 stack frames. perf(sighandler_dump_stack+0x4f) [0x5637fdcfc85f] /usr/lib/libc.so.6(+0x3332f) [0x7fe888b2132f] /usr/lib/libc.so.6(__vsnprintf_chk+0x6b) [0x7fe888be38db] perf(+0xb3f93) [0x5637fdc56f93] perf(+0xb8fec) [0x5637fdc5bfec] perf(cmd_trace+0x1c14) [0x5637fdc5e5c4] perf(+0xe6bae) [0x5637fdc89bae] perf(main+0x6e3) [0x5637fdc23a83] /usr/lib/libc.so.6(__libc_start_main+0xef) [0x7fe888b0e70f] perf(_start+0x28) [0x5637fdc23bc8] Segmentation fault (core dumped) ~~~~~~~~~~~~~~~~~ Ouch :( Valgrind gives me: ~~~~~~~~~~~~~~~~~ =3D=3D8053=3D=3D Syscall param msync(start) points to uninitialised byte(s) =3D=3D8053=3D=3D at 0x528A700: __msync_nocancel (in /usr/lib/libpthread-= 2.23.so) =3D=3D8053=3D=3D by 0x4E396D6: validate_mem (Ginit.c:137) =3D=3D8053=3D=3D by 0x4E396D6: access_mem (Ginit.c:171) =3D=3D8053=3D=3D by 0x4E3F79D: dwarf_get (libunwind_i.h:168) =3D=3D8053=3D=3D by 0x4E3F79D: apply_reg_state (Gparser.c:819) =3D=3D8053=3D=3D by 0x4E3EE72: _ULx86_64_dwarf_find_save_locs (Gparser.c= :907) =3D=3D8053=3D=3D by 0x4E4126A: _ULx86_64_dwarf_step (Gstep.c:34) =3D=3D8053=3D=3D by 0x4E3A873: _ULx86_64_step (Gstep.c:71) =3D=3D8053=3D=3D by 0x4E3B9CF: trace_init_addr (Gtrace.c:248) =3D=3D8053=3D=3D by 0x4E3B9CF: trace_lookup (Gtrace.c:330) =3D=3D8053=3D=3D by 0x4E3B9CF: _ULx86_64_tdep_trace (Gtrace.c:447) =3D=3D8053=3D=3D by 0x4E38C8F: backtrace (backtrace.c:69) =3D=3D8053=3D=3D by 0x26185F: dump_stack (util.c:338) =3D=3D8053=3D=3D by 0x26185F: sighandler_dump_stack (util.c:356) =3D=3D8053=3D=3D by 0x69B232F: ??? (in /usr/lib/libc-2.23.so) =3D=3D8053=3D=3D by 0x6A748DA: __vsnprintf_chk (in /usr/lib/libc-2.23.so) =3D=3D8053=3D=3D by 0x1BBF93: vsnprintf (stdio2.h:77) =3D=3D8053=3D=3D by 0x1BBF93: scnprintf (kernel.h:91) =3D=3D8053=3D=3D Address 0xffeffa000 is on thread 1's stack =3D=3D8053=3D=3D in frame #7, created by backtrace (backtrace.c:59) ~~~~~~~~~~~~~~~~ Any idea what I'm missing in the setup routine? It works fine for `perf tra= ce=20 record --call-graph dwarf`. Thanks =2D-=20 Milian Wolff | milian.wolff@kdab.com | Software Engineer KDAB (Deutschland) GmbH&Co KG, a KDAB Group company Tel: +49-30-521325470 KDAB - The Qt Experts --nextPart1739560.0JIQQkJjTV Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Disposition: attachment; filename="smime.p7s" Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIUdzCCBGYw ggNOoAMCAQICEFEmCpMc4n+cw6VfeeByroIwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAlVT MQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS VFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMRswGQYDVQQD ExJVVE4gLSBEQVRBQ29ycCBTR0MwHhcNMDUwNjA3MDgwOTEwWhcNMTkwNjI0MTkwNjMwWjBvMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVy bmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt/caM+byAAQtOeBOW+0fvGwPzbX6I7bO3psRM5ek KUx9k5+9SryT7QMa44/P5W1QWtaXKZRagLBJetsulf24yr83OC0ePpFBrXBWx/BPP+gynnTKyJBU 6cZfD3idmkA8Dqxhql4Uj56HoWpQ3NeaTq8Fs6ZxlJxxs1BgCscTnTgHhgKo6ahpJhiQq0ywTyOr Ok+E2N/On+Fpb7vXQtdrROTHre5tQV9yWnEIN7N5ZaRZoJQ39wAvDcKSctrQOHLbFKhFxF0qfbe0 1sTurM0TRLfJK91DACX6YblpalgjEbenM49WdVn1zSnXRrcKK2W200JvFbK4e/vv6V1T1TRaJwID AQABo4HYMIHVMB8GA1UdIwQYMBaAFFMy0bPPf/rg8aBdhU6S0p5FHbRPMB0GA1UdDgQWBBStvZh6 NLQm9/rEJlTvA73gJMtUGjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zARBglghkgB hvhCAQEEBAMCAQIwIAYDVR0lBBkwFwYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMD0GA1UdHwQ2MDQw MqAwoC6GLGh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tREFUQUNvcnBTR0MuY3JsMA0GCSqG SIb3DQEBBQUAA4IBAQDG7lMXaBSyUSIekFgNlP298XDlhi3DNjGPVEhG5y0IN7xsCmDhDq1RNOAS k+m+uKu4JrTplj0oj65kB/7gAezF45HrGKDxdX7bCuafkduvrnXfI5Fo3RcAWkv/ZGxw6wEa0JDZ x6bWbfYT5P+1ydIeKsuxJUMmeNkwm04NHr5p79/q/i2zzPmw3bUUypHUsrWl+wEZo0d5n52MlYc0 +B84kto2phH6a+tr6dxFeBU5BtdNQeQhyNwvh9G3v0hgdaViyyTeO2GgKSCmvsVsnMTpCmki75E6 +iav0VtBpzri+DgHQqvBW/jObboPBD8yNKzcBCjXcDAUJgbE5JuY1c94MIIEnTCCA4WgAwIBAgIQ ND3pK6wnNP+PyzSU+8xwVDANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTA1MDYwNzA4MDkxMFoXDTIwMDUzMDEw NDgzOFowga4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp dHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51 c2VydHJ1c3QuY29tMTYwNAYDVQQDEy1VVE4tVVNFUkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlv biBhbmQgRW1haWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCyOYWk8n2rQTtiRjeu zcFgdbw5ZflKGkeiucxIzGqY1U01GbmkQuXOSeKKLx580jEHx060g2SdLinVomTEhb2FUTV5pE5o kHsceqSSqBfymBXyk8zJpDKVuwxPML2YoAuL5W4bokb6eLyib6tZXqUvz8rabaov66yhs2qqty5n NYt54R5piOLmRs2gpeq+C852OnoOm+r82idbPXMfIuZIYcZM82mxqC4bttQxICy8goqOpA6l14lD /BZarx1x1xFZ2rqHDa/68+HC8KTFZ4zW1lQ63gqkugN3s2XI/R7TdGKqGMpokx6hhX71R2XL+E1X KHTSNP8wtu72YjAUjCzrAgMBAAGjgfQwgfEwHwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTL VBowHQYDVR0OBBYEFImCZ33EnSZwAEu0UEh83j2uBG59MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB Af8EBTADAQH/MBEGA1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3Js LnVzZXJ0cnVzdC5jb20vQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYBBQUHAQEEKTAn MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IB AQABvJzjYyiw8zEBwt973WKgAZ0jMQ+cknNTUeofTPrWn8TKL2d+eDMPdBa5kYeR9Yom+mRwANge +QsEYlCHk4HU2vUj2zS7hVa0cDRueIM3HoUcxREVkl+HF72sav3xwtHMiV+xfPA+UfI183zsYJhr Oivg79+zfYbrtRv1W+yifJgT1wBQudEtc94DeHThBYUxXsuauZ2UxrmUN3Vy3ET7Z+jw+iUeUqfa JelH4KDHPKBOsQo2+3dIn++Xivu0/uOUFKiDvFwtP9JgcWDuwnGCDOmINuPaILSjoGyqlku4gI51 ykkH9jsUut/cBdmf2+Cy5k2geCbn5y1uf1/GHogVMIIFGjCCBAKgAwIBAgIQbRnqpxlPajMi5iIy eqpx3jANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQL ExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50 IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw0xMTA0MjgwMDAwMDBaFw0yMDA1MzAxMDQ4Mzha MIGTMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdT YWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDE5MDcGA1UEAxMwQ09NT0RPIENsaWVu dCBBdXRoZW50aWNhdGlvbiBhbmQgU2VjdXJlIEVtYWlsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAkoSEW0tXmNReL4uk4UDIo1NYX2Zl8TJO958yfVXQeExVt0KU4PkncQfFxmmk uTLE8UAakMwnVmJ/F7Vxaa7lIBvky2NeYMqiQfZq4aP/uN8fSG1lQ4wqLitjOHffsReswtqCAtbU MmrUZ28gE49cNfrlVICv2HEKHTcKAlBTbJUdqRAUtJmVWRIx/wmi0kzcUtve4kABW0ho3cVKtODt JB86r3FfB+OsvxQ7sCVxaD30D9YXWEYVgTxoi4uDD216IVfmNLDbMn7jSuGlUnJkJpFOpZIP/+Cx YP0ab2hRmWONGoulzEKbm30iY9OpoPzOnpDfRBn0XFs1uhbzp5v/wQIDAQABo4IBSzCCAUcwHwYD VR0jBBgwFoAUiYJnfcSdJnAAS7RQSHzePa4Ebn0wHQYDVR0OBBYEFHoTTgB0W8Z4Y2QnwS/ioFu8 ecV7MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMBEGA1UdIAQKMAgwBgYEVR0g ADBYBgNVHR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJz dC1DbGllbnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDB0BggrBgEFBQcBAQRoMGYwPQYIKwYB BQUHMAKGMWh0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VVE5BZGRUcnVzdENsaWVudF9DQS5jcnQw JQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEFBQADggEB AIXWvnhXVW0zf0RS/kLVBqgBA4CK+w2y/Uq/9q9BSfUbWsXSrRtzbj7pJnzmTJjBMCjfy/tCPKEl Pgp11tA9OYZm0aGbtU2bb68obB2v5ep0WqjascDxdXovnrqTecr+4pEeVnSy+I3T4ENyG+2P/WA5 IEf7i686ZUg8mD2lJb+972DgSeUWyOs/Q4Pw4O4NwdPNM1+b0L1garM7/vrUyTo8H+2b/5tJM75C KTmD7jNpLoKdRU2oadqAGx490hpdfEeZpZsIbRKZhtZdVwcbpzC+S0lEuJB+ytF5OOu0M/qgOl0m WJ5hVRi0IdWZ1eBDQEIwvuql55TSsP7zdfl/bucwggZKMIIFMqADAgECAhByCOhbkTwXiJtaa0d5 K5u0MA0GCSqGSIb3DQEBBQUAMIGTMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5j aGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDE5MDcG A1UEAxMwQ09NT0RPIENsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgU2VjdXJlIEVtYWlsIENBMB4X DTE0MDYwMjAwMDAwMFoXDTE3MDYwMTIzNTk1OVowggFZMQswCQYDVQQGEwJTRTEPMA0GA1UEERMG NjgzIDMxMRIwEAYDVQQIEwlWYWVybWxhbmQxEDAOBgNVBAcTB0hhZ2ZvcnMxGDAWBgNVBAkTD05v cnJpbmdzIHZhZWcgMjEPMA0GA1UEEhMGQm94IDMwMSYwJAYDVQQKDB1LbGFyw6RsdmRhbGVucyBE YXRha29uc3VsdCBBQjEdMBsGA1UECxMUQSBLREFCIEdyb3VwIENvbXBhbnkxQzBBBgNVBAsMOklz c3VlZCB0aHJvdWdoIEtsYXLDpGx2ZGFsZW5zIERhdGFrb25zdWx0IEFCIEUtUEtJIE1hbmFnZXIx HzAdBgNVBAsTFkNvcnBvcmF0ZSBTZWN1cmUgRW1haWwxFTATBgNVBAMTDE1pbGlhbiBXb2xmZjEk MCIGCSqGSIb3DQEJARYVbWlsaWFuLndvbGZmQGtkYWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAwirYPAOcWQk9jaCoEAn84PwINg/NDs3PxsEd34f27AfCqJepwIF+ikMuBBxt mm1pieQwU9fcFrE4CXPCdYxfFOdcbJJ58Xzog5aFrJHnYGEFIL8KVvdBvAFeP/AJPaY2lg1JWnVI 1jwO74VmUGMyvMG286wpwW3hWO3sepZZQN3tvXyd9EgD72AiImkvw43+BW4xy8ptOd3TvEwCJ+uN x8v+uILsRLvKcmSrUsLpo7No2HoifWX1doKHKSwYVVqmOT/rjJWxF98j4w2kTKRsWdQ4ENlqNpjW zlbtB6TM2mrnInefzALbIoLLQ2E2NFCaMVsczf7RFsMxUepM9KQQ5QIDAQABo4IBzzCCAcswHwYD VR0jBBgwFoAUehNOAHRbxnhjZCfBL+KgW7x5xXswHQYDVR0OBBYEFGSjHixs9BD9OyGskYjMX7mi P+fiMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMEBggr BgEFBQcDAjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgEDBTArMCkGCCsGAQUFBwIBFh1odHRwczov L3NlY3VyZS5jb21vZG8ubmV0L0NQUzBXBgNVHR8EUDBOMEygSqBIhkZodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DbGllbnRBdXRoZW50aWNhdGlvbmFuZFNlY3VyZUVtYWlsQ0EuY3JsMIGI BggrBgEFBQcBAQR8MHowUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E T0NsaWVudEF1dGhlbnRpY2F0aW9uYW5kU2VjdXJlRW1haWxDQS5jcnQwJAYIKwYBBQUHMAGGGGh0 dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTAgBgNVHREEGTAXgRVtaWxpYW4ud29sZmZAa2RhYi5jb20w DQYJKoZIhvcNAQEFBQADggEBAFvi067uXCOkiUH/D6rv4gV0/e+e8DzcvbbsUxAC5nwDXBv+47ds l7j8NrZstZraVz35WEWgksNmnyghcuBKzKcN3kY1KNn/ERc9wvns/0dI+yj39L0eSMzchUZoV6GY MtPfmLofPvUBbDesl97JQXF9vpk8FIVsI1UKKrLzfoKhue5abQHXurSFa0ts1UPmSh2Y8/QCQlFN lCv8ISyEwVCAkhdIqxRc3hslooBhcRVUrYhRdCLlNN6Od8yuLE9sKWH/K4wg/BpnjCJmGp4GQhU8 DUG2r0CbOa+iZQKTWUgwdGU3Jr+WcOan/JaNzBuKk1GM3D+WcljoU7ZWtoqXPzgxggJaMIICVgIB ATCBqDCBkzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxOTA3BgNVBAMTMENPTU9ETyBD bGllbnQgQXV0aGVudGljYXRpb24gYW5kIFNlY3VyZSBFbWFpbCBDQQIQcgjoW5E8F4ibWmtHeSub tDAJBgUrDgMCGgUAoIGHMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8X DTE2MDMzMTIyMzQ0NFowIwYJKoZIhvcNAQkEMRYEFPjo6qK906h6Xs3KjH52+7HR+iOJMCgGCSqG SIb3DQEJDzEbMBkwCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA0GCSqGSIb3DQEBAQUABIIBADuB bnWrB4Uas+Zic59Bv4EhyltwbHnzmMkSnSmU2mlxMHdCSyxFYD5gPLese6a3NYsRCY0c+zcTtkX2 oTO6lQy+wUPygxmss65ee79ZLpO8aPdW22lweaVf73+QbV5e+4+T3r5R4GVuuI2z7s32RmACkkuk pJkJ3V6LP8Jw5cc45Z7UZRYxnWUPgWdsRGTFYM7uBTX0IOd6x+VPxrO7FQwbd4F7WZEIsX/oe2Hc BRhdjO1oouSK51t1S85YS3WV96rzajZGt9G/oWjMpMSxa4nj9P72fzhMwGYzl9hnmR5rwEqnRop3 yeHCzQTPDFyO1Lg0/ganl8dlXMzB6Qc7YzAAAAAAAAA= --nextPart1739560.0JIQQkJjTV--