From 15ace8508def7a873b6676bdf79f9edc3aa44db6 Mon Sep 17 00:00:00 2001 From: "Alexander J. Pfleger" <70842573+AJPfleger@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:39:24 +0100 Subject: [PATCH 01/10] feat(gx2f): Add new error `NotEnoughMeasurements` (#2981) ## What? Returns an error, in case the number of measurements is too low for a fit. This check takes into account the evaluated dimensions of the measurements. To fit, we need at least NDF+1 measurements. However, we n-dimensional measurements count for n measurements, reducing the effective number of needed measurements. We might encounter the case, where we cannot use some (parts of a) measurements, maybe if we do not support that kind of measurement. This is also taken into account here. `ndf = 4` is chosen, since this a minimum that makes sense for us, but a more general approach is desired. ## Why? We had in PR #2966 FPE Problems due to a division by zero in: https://github.com/acts-project/acts/blob/a42f23b96876a0fdfba5a8ab1b6c90a9b1f2dc30/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp#L716 This happened, when no measurements were evaluated by the collector. It could happen that we didn't collect any measurements, since the ODD uses also some 3-dimensional measurements. Currently, the GX2F can only handle 1- and 2-dimensional measurements. ## Future TODO Make `ndf` dependent on the problem. For this we need to find a way to deduce, how many parameters we want to fit. --- .../TrackFitting/GlobalChiSquareFitter.hpp | 24 ++++++- .../GlobalChiSquareFitterError.hpp | 1 + .../UnitTests/Core/TrackFitting/Gx2fTests.cpp | 68 +++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp b/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp index 659b36af6c1..ef7b6b559c4 100644 --- a/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp +++ b/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp @@ -495,8 +495,10 @@ class Gx2Fitter { } else if (trackStateProxy.calibratedSize() == 2) { collector<2>(trackStateProxy, result, *actorLogger); } else { - ACTS_WARNING( - "Only measurements of 1 and 2 dimensions are implemented yet."); + ACTS_WARNING("Found measurement with " + << trackStateProxy.calibratedSize() + << " dimensions. Only measurements of 1 and 2 " + "dimensions are implemented yet."); } // Set the measurement type flag @@ -675,6 +677,24 @@ class Gx2Fitter { ACTS_VERBOSE("gx2fResult.collectorProjectedJacobians.size() = " << gx2fResult.collectorProjectedJacobians.size()); + // This check takes into account the evaluated dimensions of the + // measurements. To fit, we need at least NDF+1 measurements. However, + // we n-dimensional measurements count for n measurements, reducing the + // effective number of needed measurements. + // We might encounter the case, where we cannot use some (parts of a) + // measurements, maybe if we do not support that kind of measurement. This + // is also taken into account here. + // `ndf = 4` is chosen, since this a minimum that makes sense for us, but + // a more general approach is desired. + // TODO genernalize for n-dimensional fit + constexpr std::size_t ndf = 4; + if (ndf + 1 > gx2fResult.collectorResiduals.size()) { + ACTS_INFO("Not enough measurements. Require " + << ndf + 1 << ", but only " + << gx2fResult.collectorResiduals.size() << " could be used."); + return Experimental::GlobalChiSquareFitterError::NotEnoughMeasurements; + } + chi2sum = 0; aMatrix = BoundMatrix::Zero(); bVector = BoundVector::Zero(); diff --git a/Core/include/Acts/TrackFitting/GlobalChiSquareFitterError.hpp b/Core/include/Acts/TrackFitting/GlobalChiSquareFitterError.hpp index 79e40ab31b7..52aed8456a4 100644 --- a/Core/include/Acts/TrackFitting/GlobalChiSquareFitterError.hpp +++ b/Core/include/Acts/TrackFitting/GlobalChiSquareFitterError.hpp @@ -18,6 +18,7 @@ enum class GlobalChiSquareFitterError { // ensure all values are non-zero AIsNotInvertible = 1, DidNotConverge = 2, + NotEnoughMeasurements = 3, }; std::error_code make_error_code( diff --git a/Tests/UnitTests/Core/TrackFitting/Gx2fTests.cpp b/Tests/UnitTests/Core/TrackFitting/Gx2fTests.cpp index e749e4748db..d9af10cdd97 100644 --- a/Tests/UnitTests/Core/TrackFitting/Gx2fTests.cpp +++ b/Tests/UnitTests/Core/TrackFitting/Gx2fTests.cpp @@ -735,6 +735,74 @@ BOOST_AUTO_TEST_CASE(DidNotConverge) { ACTS_INFO("*** Test: DidNotConverge -- Finish"); } + +BOOST_AUTO_TEST_CASE(NotEnoughMeasurements) { + ACTS_INFO("*** Test: NotEnoughMeasurements -- Start"); + + std::default_random_engine rng(42); + + ACTS_DEBUG("Create the detector"); + const std::size_t nSurfaces = 2; + Detector detector; + detector.geometry = makeToyDetector(geoCtx, nSurfaces); + + ACTS_DEBUG("Set the start parameters for measurement creation and fit"); + const auto parametersMeasurements = makeParameters(); + const auto startParametersFit = makeParameters( + 7_mm, 11_mm, 15_mm, 42_ns, 10_degree, 80_degree, 1_GeV, 1_e); + + ACTS_DEBUG("Create the measurements"); + // simulation propagator + using SimPropagator = + Acts::Propagator; + const SimPropagator simPropagator = makeStraightPropagator(detector.geometry); + const auto measurements = + createMeasurements(simPropagator, geoCtx, magCtx, parametersMeasurements, + resMapAllPixel, rng); + const auto sourceLinks = prepareSourceLinks(measurements.sourceLinks); + ACTS_VERBOSE("sourceLinks.size() = " << sourceLinks.size()); + + BOOST_REQUIRE_EQUAL(sourceLinks.size(), nSurfaces); + + ACTS_DEBUG("Set up the fitter"); + const Surface* rSurface = ¶metersMeasurements.referenceSurface(); + + using RecoStepper = EigenStepper<>; + const auto recoPropagator = + makeConstantFieldPropagator(detector.geometry, 0_T); + + using RecoPropagator = decltype(recoPropagator); + using Gx2Fitter = + Experimental::Gx2Fitter; + const Gx2Fitter fitter(recoPropagator, gx2fLogger->clone()); + + Experimental::Gx2FitterExtensions extensions; + extensions.calibrator + .connect<&testSourceLinkCalibrator>(); + TestSourceLink::SurfaceAccessor surfaceAccessor{*detector.geometry}; + extensions.surfaceAccessor + .connect<&TestSourceLink::SurfaceAccessor::operator()>(&surfaceAccessor); + + const Experimental::Gx2FitterOptions gx2fOptions( + geoCtx, magCtx, calCtx, extensions, PropagatorPlainOptions(), rSurface, + false, false, FreeToBoundCorrection(false), 6, true, 0); + + Acts::TrackContainer tracks{Acts::VectorTrackContainer{}, + Acts::VectorMultiTrajectory{}}; + + ACTS_DEBUG("Fit the track"); + ACTS_VERBOSE("startParameter unsmeared:\n" << parametersMeasurements); + ACTS_VERBOSE("startParameter fit:\n" << startParametersFit); + const auto res = fitter.fit(sourceLinks.begin(), sourceLinks.end(), + startParametersFit, gx2fOptions, tracks); + + BOOST_REQUIRE(!res.ok()); + BOOST_CHECK_EQUAL( + res.error(), + Acts::Experimental::GlobalChiSquareFitterError::NotEnoughMeasurements); + + ACTS_INFO("*** Test: NotEnoughMeasurements -- Finish"); +} BOOST_AUTO_TEST_SUITE_END() } // namespace Test } // namespace Acts From 6fb49f14adb871945b231c4c10cec6cf20b3dd47 Mon Sep 17 00:00:00 2001 From: "Alexander J. Pfleger" <70842573+AJPfleger@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:09:56 +0100 Subject: [PATCH 02/10] ci(gx2f): add physmon truth tracking for the GX2F (#2966) This PR adds the GX2F to the physmon. It runs stable even though the ODD uses 3D-measurements for the inner pixels. So far the GX2F supports only 1-2D measurements. blocked by: - https://github.com/acts-project/acts/pull/2972 - https://github.com/acts-project/acts/pull/2981 --- CI/physmon/gx2f.yml | 48 ++++++++++++++++++ CI/physmon/phys_perf_mon.sh | 12 +++++ CI/physmon/reference/performance_gx2f.root | Bin 0 -> 143250 bytes .../workflows/physmon_truth_tracking_gx2f.py | 34 +++++++++++++ .../Scripts/Python/truth_tracking_gx2f.py | 22 ++++---- 5 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 CI/physmon/gx2f.yml create mode 100644 CI/physmon/reference/performance_gx2f.root create mode 100755 CI/physmon/workflows/physmon_truth_tracking_gx2f.py diff --git a/CI/physmon/gx2f.yml b/CI/physmon/gx2f.yml new file mode 100644 index 00000000000..7cbae3ba4bc --- /dev/null +++ b/CI/physmon/gx2f.yml @@ -0,0 +1,48 @@ +checks: + "*": + Chi2Test: + threshold: 0.01 + KolmogorovTest: + threshold: 0.68 + RatioCheck: + threshold: 3 + ResidualCheck: + threshold: 3 + IntegralCheck: + threshold: 3 + + "nStates_*": + KolmogorovTest: null + "nMeasurements_*": + KolmogorovTest: null + + pullmean_phi_vs_eta: + IntegralCheck: + threshold: 4 + pullmean_theta_vs_eta: + IntegralCheck: null + pullmean_z0_vs_eta: + IntegralCheck: null + + pullwidth_phi_vs_eta: + IntegralCheck: + threshold: 4.3 + reswidth_d0_vs_eta: + IntegralCheck: + threshold: 4 + resmean_d0_vs_eta: + IntegralCheck: + threshold: 4 + + pullwidth_*: + Chi2Test: null + KolmogorovTest: null + pullmean_*: + Chi2Test: null + KolmogorovTest: null + reswidth_*: + Chi2Test: null + KolmogorovTest: null + resmean_*: + Chi2Test: null + KolmogorovTest: null diff --git a/CI/physmon/phys_perf_mon.sh b/CI/physmon/phys_perf_mon.sh index 225c53f35bb..81288e902a9 100755 --- a/CI/physmon/phys_perf_mon.sh +++ b/CI/physmon/phys_perf_mon.sh @@ -59,6 +59,9 @@ fi if [[ "$mode" == "all" || "$mode" == "gsf" ]]; then run_physmon_gen "Truth Tracking GSF" "truth_tracking_gsf" fi +if [[ "$mode" == "all" || "$mode" == "gx2f" ]]; then + run_physmon_gen "Truth Tracking GX2F" "truth_tracking_gx2f" +fi if [[ "$mode" == "all" || "$mode" == "fullchains" ]]; then run_physmon_gen "CKF Tracking" "ckf_tracking" run_physmon_gen "Track finding ttbar" "track_finding_ttbar" @@ -340,6 +343,15 @@ if [[ "$mode" == "all" || "$mode" == "kalman" ]]; then -c CI/physmon/truth_tracking.yml fi +if [[ "$mode" == "all" || "$mode" == "gx2f" ]]; then + run_histcmp \ + $outdir/performance_gx2f.root \ + $refdir/performance_gx2f.root \ + "Truth tracking (GX2F)" \ + gx2f \ + -c CI/physmon/gx2f.yml +fi + if [[ "$mode" == "all" || "$mode" == "vertexing" ]]; then Examples/Scripts/vertex_mu_scan.py \ $outdir/performance_vertexing_*mu*.root \ diff --git a/CI/physmon/reference/performance_gx2f.root b/CI/physmon/reference/performance_gx2f.root new file mode 100644 index 0000000000000000000000000000000000000000..62af439fbd05b0501efbf94c35e887629828ba0c GIT binary patch literal 143250 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%0DV~VTC(rrxk!5PnVaTVgKDQZi` zV(Q@nJYm@t(VOuBX5yvPcOndhj}FGmt_pX+2V+)zZLYE+S8!W3xO|VRrW~`vl>Fqp zjTZDcpSH7{PNu4E4>bhoVi>=W=|YJAIB;UUj@DoQw%&jfWym4ZwJH8XkqM0}jo43f zSB%)JFR>rzNaJ&)c|$k28qZ1G#sBmnfzSbu(--O(+02$a2f1R^-Z?<%$7Z^K2A(%5 zbIj18l4-ghWEu4XHx*a8khCM;q5eZkTUp!-tOEa<#T&z+6Xjd^`$q?@yR@*+t>@yv z^$C(*h_XmFKLL7f*X~6o+Q)6Qc;5>)_bJu)V=DKPEexFIPR|eyVzZYc20`y-_h~y3 z?L?s0{^nU}OKyXHR(b!QnLSN?PzgAoQC`_4oB&8RuloMqp@#jC-5cb6G? z7|~R_$pwh2YsqtnqF{#i5OI~Yazycm-b4# zC;u0hI@uZR<)rTB&Y=sS7JNCcOT|cBqn&vjs&m#-D%IvrQV?Bf`B+OhL?~VB9B|%;EKr83Gu4r?ix+cz6(IF${k+a30|Gk&#rxs zeH6yWn>U33x2$`lfD?BFmQ$}fTU-6On`Wea57+-z_E~GN8BUWI;sBr|8+7p^`4d$y z*UM7)mu#-^9#uctyI$-2vVDV@Pc#L%)54zq7@fGaS?;t46Uc{iSMz7~$w_ z22z!zj-BN^O}YE{g;a)#}BQ0Jw1iARx?~3ig!F#k_B^T8kDO*O@ct zm36Ndn(4*uC@l1PPWj_B?uTPLnkg_oZ2NK{`rb?GRt-jmT@v6=cNyPlUEqv7c*~=w z<*0Va!MEhVk%O?|gNbmO7aGhg>MUVY6`-5%zH#og%5Y$7{!F-mc7bZD82G8M&ylsj z_=5Ed3$a+Q3+(~J7-*_q~T5R9^4;2xMrRxf2HyJdaF>Xldb3GvPZ~u4AkRk3s{1A$J3< zR0#474y8xot;eN zwTxk@N4sZ$(WvLRDRA=%S0KS>Gw|F-jcz6=cY1(=^lJXN`Qu_!30Wq3&L=-=?M(mv zM-OAB{3rQquIQg$U{|>K;h=4TML!yE#ndA-#E@sH^_DTRhZoiTuEz9P!1CJ_5PWv~YzP$KGq%7yIi0;W5kp!5{{<)e>`E;d@M=7kP7G%C zY~JeE==7WH4<qqCSzF;K;gpnPmyC}KXr^O~1N>tkZ{ZcgAa9|$Uh9JD`3YTY zp8E>0&nZasWP*S5EWh6A1%v;LdftQBR>5Tb0hN_&9)f{R+5_>~+-e~Oq6a&-USqZS zpJqDy02^5-vmim8WpSgN0-y2n?CkhS-#CG!{CXT=0gHhyJ9*KYn_d;s-CoN~fp9FB z`EZa=t!FA&yVia1xwJBhlb{G^f{*Y-4m$)@ZT zF1hsp^JY1eX*r4A_1KQ9cqk*t^CIz*_Uw>ZNj7>KSA$bXK44c-W{mY@V*Wuu$>o~m zpvRs0z@prk84*$>^<9<5u4~FSL4b}M&-Ybzh60r-=Yuu|jBJpr$C!1$o~qvp|K{XX zzPg|;k@N~JJf&xv^eVMyJ_RO`Rcn5%Tb1lT4*qh1FAVzyJT(UiUDcXa;b!`4Z-d8J zM4$%UW4E;z%ySYzDf#wZhJjI_>L$22taz@v^u!Qb^$*zi^D-n2f9 z7;S7J)L&)MfTRYHgp0W08WVIem$;P?B_PBT69Sg_^v*T!dd|{U_@DH~0B64Xi0?~a z*x!4pp5G8Y@j6BmjlDEYu@{>dh@R$B-_1eRN;WYXQ~Ys&L)4Bye2)nRYMkn>s-3Q{2I&g%eh`oFciG(rI_|=r za2~QLLySh>jAA93HkoLa87)sNkzQD%F6ZN z<8M1lWiVBTG&qLaT_euX>60y8&?EXL_p;h2~}6g7JJlvQFN%g zpZI_(|EM?Ae@Sa;$AS64Ae=W!$-QLsknh&@9S`3Vg7X@nNocXFv1V4D6v~FZYdj+D zo&I5>U&z>-pyZ;&RAa5Dqag03I#mCpm=?2NOrN;`w{~ayWkFpOB-}2>t<}3FuG)T8 zHXbx1%#?yV#70?OCk=0Od7xUop<+uHD{O)_`no=2Ii8=yM3+m<-J$id@Ek` zRws}U%ClaMM}sqK23mXI)p2uo3f=h8SrX8d31j1k;09J!u}iP%l0TnZSH2AkboN@0 z3s!Qx$v<67n88sUKA+;Wy|p}p!!`acnQ{9YvdSVuBgBtS)f;Ga61kAfdWxq!1nCwm zIZ?aR&*=M(t2HHwYV5#C@QkUi8?NJeR67bgP%;U*@cjyzQmj{eZtfG{_`$h64f1_T zAY~e%;tp7tm%9rY#%p#8>7N>?IK8-$29F9^+i6Z|$nd8By7F~uE;28Znmu}--)My; z$*H#I)y3X0I_k9B!^!qeiVObQ?rnsg%DE8#gvr+UNPj4}^F((pT0R@4T{=}jHFF-$ zk5B1=RqI~S*U0isBrp9_Qt0xSw9ge>GMCOmXD99^WjJ2-%M|ve1Q^WkoVIm_6sSvfLJMpAksslDhSSyV?*ulTion z%#}XzlUl*Y8{N-v+w{YpVe(Laxuk*x$7eL{3Fe95%I|Zq;(>W6jG48MSeYMpMlQP5 z6shlllueSfqSMBG1&>_#mZZ7ZHs|t|{Ftx1XG$(WMF&&e>PqT#9^@jhmfrem=z!mH zK(@U&Fo`c5d#aljn*SkL1F<&+{QT+rn0^z=OeaWu z8Jnb60o@DZy_c^lbxZ5}lyBjI)n+@EhU+%2@7x!2mi)dxZ}rZu-UF&ssXnF=E8jP1 zytvVKI?~~+5P6ocOjY(wM zKXs{yw0wecu7#tJBgPNtcj^DtA5XNE)UB(-QdAzL4z&@$I$ zOgu2%f#Dv9;caW*t5YtNJz_)Y_*Tcab>?eWPKl8kFR8~AC)Q4OchWEX%6ewTQP~%- zOcrPuKJ6jK61vw8i_%lLa6Q?tpSN~lgNq2qZ|x_+y&a^`gvgs@y1X|IvDK?v;fwA9 z&Xv>#v*IraJHDvs5>9D;IN;Fk80L z>w?6vRqPMIF$juMfLuD)TXs1yRk5zF$e=)1qF+u@j(j4sOo~Lq&X1fYys7xqYg2@j zvUe>pqM1E5zgY6j-G7z3LD{^5RUuq`4t)V@EU}o#xX4#b**Pyef~l9p(OdVJ>qbV?m9yNj zb!@<4m}HnWZCW-nJ?|ZK>HbTrJtI@mv3aLW0asqQ!-cm~P3b0pr))l>!AWnuFgvp4 z5(N7G?Q}<^#2cl_(q;M^W$$^!TfTLNOoO#zv)8jbk=yMi_j_^hTaeXZKvy*GK^Lw| zNHkDrwP*_^e&=q9NUZAGQ^;xV=7hz#kVVL2FReij<{EK}1MB*E|47n(*%b*jvizx1 z{!1(CviMK+>L0D_Kl8%>+s*T*nzi`1R<=RQ5h=+e0zg)F+^o`Oo^#8Q_{a8WS-k>_ z!cXPmtnlG@=Ggoan)Rd8cXX2Y_^DwG=&8Z9WRhfNO#85_aGv-Par)0WCBb<%tk?^|05w(`A5WX7KR5#&BJ?~?u)|?ufrP^nnv}_Vgxqb zNCn5{6~8Dsi)hV(o~1P_`QS1uSA#pTBzpRxlt|D%0F^%Q2N#A-+0l%Q zlRGcAigKGcc23$>u$LlCy2jny-|+UZ2c0B%aGF5%Qy-hzh3dz5g)@@Nc`8^O+iH@s z0z|-9QgH-sQMoc$8P+M9-!gX8rZe~|N(8F)cfNUN-=!~Q4*{y2;{rZ(5!NL` z2)C;0Eg9M7*Tl&?PbxYTbB7XV@pq8wU zE_D`oTkAs}@eH#W%Bb-Fs#p{w8LAHO>rHXms8BM*$5b1F$g&R_^dJqHRcY@R{xW1{ zb6fWPHe^QK7&bL?(j)m_()C=9ofwowfn}ad(FMdNOKX<(K!FW*bCc+R0r%t=*av5l z7#g0~a2(+5uaZv%P-O$)_SQRIB_>4^|2Jf_Mymm4c7b0Sf35IY4f!LhhR~^yCCnAhzA=vx$)w3a3ucA5%>rHU9N5!(yn*r8L3R%zBtAuFPo@( z>g-(kx^BwBMcTjuZkTjf7DbUjArfIx*~FwTw0+Q|^r`4BQaZrYIJ(u5-XPSqGP{i( zC0Dx?egajkP92Xq#n|$Z!AIr^=2eOS|m9}{LMzy`8B3Xh~4YOm$ zmog@zE2?kqWtve718C1v`f~52uP+l3bWnI zx7Yd2F%G`qObG_Oxm-Z%JeA_G5ajQeSsFT7{g*cfnPH2d{f%6yq09S~L!p@O={4+_{yW?4Gi%qk(6?|DGMCl@=G>2jo zn{tXh9GAOl@6JN=2R-kS!cxIUvq{&J#gY{m+2tN~rF*Yr|G_HFP3tf0{=_+&Bfs-! z=HmdJuXwVMK7cJZM_8HlLFgqs+~Ux6%R+93_a>9?m9}9@Jv)+<$ET(K2LR^z0{~k= z6|0)>Z|PorbAHi(A`nP^X(C@EmL#Hv9wyfD7$S@Q(s$|Qhqk#u!BF?@buG%BDz~ro zS25dG1I8o64l+xNF0W>dB_|Dn3h1<2ExIwgX;7_X-XT4*Vt)#Z|MJLsG5=Fw{Ns`R zD?k2i{X#;(f7KWNcw{dz{^OA~av+u=8Yt$NDN57JrJx~ldK#W6UGWaj(QJpL#$Sd- z=PqY4kBAZ9)`meZuLWzJ5M5rWmsIo9O9HIfUU_8-@MD%7KZRU0d`>QOsdw_IJ@L)H zW5(>sndKQPPCniG-D6`JH=q&t=)l;>>d|Yvd)e1RC9l)9T0D(Q*}iBHYKKEX!b1sV z%`UdS*7mxN2X$k!(L4KsN12f%?Sl80({Z0ms}`s0#i%ZlB3%Rb@PHu&?_gMp= zRcswExRk6DJhd*#wclwMlKKzCUTEK(-wczw>v-@M@4RjVbwCqIJ21CqSPB&oAvT2j zd^lPv9i_jHZy`&ww{LFdvMhs=t)iebI1oRC!b)b>D`N_TSs99_!+JFCGHp>R+4afr z_s`z6r>Z!2xM+yh?_wOMlqjT3RKfff6JjXOEUhRm#Ns5HUPd09ud_g!CGH8y-LgmW zU_=5#Bd>O|Gd*2*oriLSnTebA-Ljpen#iA7rnODnf5BRQ*6PZ$3rK&w%-#xW$c1q! zp5ls|=DF_{^A{k^NY8e1CODveM>pKQb%p)q zS0ui9O?xBzwH;T|?sKL695YvQI9=Lq^IN{_H3M{Squ_m!({5IYqB{foLks4b@UY9P z-B3jB51iZ5nT+~RvC9s^>wQ8q%?r2Tj?YSJxjz53svVw|xYhKB* zfOA%`e;HVNO0-Zn26;PtuB8~QHQ*XMUq^lO6@-d*`$?{RM*_&!xHpgY{P@J3SMX`)$iy0JewqEkSI=MwkzI z7#Y-pexfR+u@jqNKGY;7V3DwRv?Ecc6-p~brj)6qN-#5^vjYQt$Z23!dGi3`jF7!xk-lxkr`?MFho5!G!?e@R^9lG zxR>!DgF;woOdg3N-9vpEVuJ9UWCV4TN$%T4Yr3yC{tMNS{nct5@Qzq{-mXIs^3l5z zJ|;~v1_UPR_Kg*)7oEmJ^^=bTbn;hV`tMJ^4*9X7Dg@KoX5+7amj4B#qf>j1ItXWZ z)Q(p=0+z~=#*91TLB6m>6vpDkqvB)!ynYj?BmI2K8eaf4UWAKD{KfOHU>BKnJf+Ds ztnmo>f-cgJQrv?OoJZfD6D*jpJqk6AgM0se(LzIvY)K8pdj3@a3saSuB2MC1j=@3Y zt4M%n9v!(wKzQ&dYusfUA@(4x$ea0$=iXvt;UN~Wm-txenhY>S6<&r<%WJ@g||6V)-{{8kF|GM9OLc9t1isik8ey`fe z_q$IBBXT2t*u*JG<2iu~pTydQ!VML*19O$i?Eo&4@%(~yX-+SIzXlb<+;e?C@)Mpv9SE5su}XWt8z z_}VubEg<$wV+Hj5jRt--{oqXt#m~`*i6b5@MKyeH08nFcxAGwp~86- zKP&*U6iY?^F3d2@vUep<=422S%irm@G9Iv4E6R;{ONjh0riGIcoRC;OO73(pl~RA< z#i3rg^*n(&1dhiEDa?n!l?MVXhYaM4vfDKgCV1IM!;ZOrz~woSgf zM;mYdmc)`GC9&n3xow;HU^Q9Ckj#*mQuXmZUsQY+a{>9VC~9t>@m>7<@NZJ)On~Fa ztnmlRal5Rl0!L4*dBy7)e8vdJVBKigRzzn1!A-cM@z5m-*9v=5}LhOm@G@U!?^IQf}`AK zSo}bS`uI<%|0RhHLLLDB0pS0U#QrDN|G&{x_CJzXK}Dn!c;Nocmk>v3B}Nv5f^i~h zmY`m9BWi?UVn)n@h5KV92;_9r1Fr|UZYI@V}SS!5mK6XYxR@3!Y zpVCQl;nQh}(#nc6OWv7BKB#T=8xwW)ch1SKCi)6-EEyVtEfQ#kJAD~@h4 z6RgOfBT;zlwCh+dA3YRa$vipHjTEkDa}Shbci*TA{CZOSTAYW$hi^T8S5Q^Jnew*# za|L(hLxr_4V}>5)jW}i`9uM45(7AR`ew*Bh$+Anrm(Xx3*-&G(T@&m1f%BwvUM#V^ zAi!r*%VAx+;|1kIj8-S0{z@Jag|E;%UHX34Osjh8`U}Kra#qdnMr(RgMm_DE8*o!j zNt=VCo`u@@(^^qcp^$W2EH(5|MWQ9qoTRVuSz3|NNID*5`j5v46(NLjTJV zdu$cu5znC|y~_ryk+88_G*#MGszZFFeWDSo=3aTsRBKBSuN;3og(iVY^CfS3n!;X& zsB|3T2gze=ZpDuLU0f4?itW+ly z{Oim-CKecxa2}bZb>>l#LvcO!w8zK-mfZ_s$~-=Oib9=ytrBVx=li*zG!oOOWGuQCxA+?5z@T10|tG zvcxoGInbvQe;NY#I2w2FKJ8B?c@z^>0w?GrDTP>_n z$GneE+b3L;!PFpc5ENr`T`KEI!C6lhhT2walRT#0(B5?pcq6ah;ElHu=KG40GXbA0 z^{QuTSwk$kD8Hy)|6-;4&RU&)bxQ?U-J4Us^(vE^(^m8TP<`I}@RxPOkhx?aeU{>D zDlW7kgNQ8qAsG!uPnN?eK60E z8I8?1H!RA5o}2q9{2b!6>!SL;?S)vOp|iTVA)}iB9)6Q*7r=9I8ZOEIN8VdUwY9zd zzDR)gXmJV@FGWM4SaEmv;_d_w9z0m!rrrD3z0Z5!GtRl^ z-v91cgONFtMaWuD9@d=m`L55`bZQRjY}9`5iz#x_T84PjkO*suLf_!;r7#nZ16OX( zzHTJNc}-<@d~;V7l}uXpC^jI>IoA2pMhpoWX&C=~@CnU^TCaaEO|Qs@JG3a?xqy%J zhZ^R^W=kXeuQfU1(}B?a0AL51H=DU(*DBNk9Ipn-t{rJf>O5q#H213PD)%*$q)uiw++LL&+M^Xh-yV86g)ZzSs zwGj1BZnfdTOOCuO?{RVTpQz{JA?18oe=KuV#=XxAH7~_!rC;HlAIW@w$X#VQT>Nln zHGJUbSeB6L2>9^}6$`U-6&vkK4Jx!*89x|*P`~6J?x;)mI=DKyr8a7Nz>isZXm|AA zxiNcR8zVF)(z@cmKCVfG#W#1bd|SjLb5WGqLUtuQU8?I-j24q9=15bRu>`HF>Tj=Y2AB!4LVhnM>FT@ zvN{;nXC8LTdQ|5V22c&Q<(Q@STN%sT%DVj12Cz>_$xTH|hh5A5p0_S_qp+DK;UlOt zhNtgVZcl*k1Blho<(8V&e`kY-2;}+T$$URd8Bl(e34K^u2QK-0oj_OaGkTKssoTJU z*bOP0mnpJG4}-Foa8~RUo5Dx~NFzb$AtQm}7b_MBj$t4jJ$tEK$7azCR3?3BQZpRo zRWk(jO^AC6#g-0isBLeIxMh^>>%Ba?IL1r%-p;jpe<|$!arl-6Bs3U1#l^%sx~;R& zjN>W##Y!nGz5YREAJJ}^2JJfKC^o@M&oe0K&c`z-;U3P4jrqlj^#|^kdbTY#aYF?c zOBz6qZ(qY%v3oF2X;nb;tqL`iA&vrcRC;z@`uRmeQPWJHD8;~Q2)1Q>qr$qz^0Wvj zBTlHV2{~m-CL1hBSN`*(OrBt4iwLOid12-r84!||(ZqdA%;x*hM?28ka>WLGD24md zt~U!B63Ti4PLQb|053q4kpa*vWfqr-1Eaf0=!3zF4Ipdl{+TGAtoNwtB)Ew_{)~+X zbm|3_jAtb>I={ZZo(EeU@eLfB#Z|{BRz55~_Xd8w%Ym%5N#TKn22T80;;%PfY}C~J;?4K#|DI5z(Y z5G4s)n@NP`L`a;}BtrK&o%uxKPyJVj!pxO_-oh^Un1PD?)Ks4&&Po%{EF38^9lxh5 z10yBQ#}m&EFZmRFRY&?_zNZ6?};&aVW#iUiDysWo4rVH8Uje;b9h!%%6Mz2Fxp~enNf4J;+xe1J!42a zpAB#yT%@|bXY&j=76&39MxSc?)~fgY>~H_~W^2B>4q`9kXy*f%8~>MW6_13ZO_}Xu z@!+b!sUN8fMLr2>{Samp`1CctPsC)&`h)6WGKt6W(XpB>k>;Y!B(R`)z-_oImlb%j z<0EvbJL|6{m*$=q$-H9<8>)Jr8hKGh=9xRUf6+&cnfOqaexGV}P-EDG;a_wUW?6P! z0I#N>E5Wpe)fUU9cmNfx8i$cvHlLnoMwcCSOBfYXw|(0o5Yy2ru@#w&_J%ucNcXud z65KBepgI)HCYcJ)jnC<@Ug|R3YqLKfQXO4-Dwe&9>e8;Oz|pA6)UC=SNXiZ>vp@W# ze99l13?)5eQk=c(q29CCqxW}n8j1Xj-J3(2yc6TsZfLtr{lik&qNSMJ0Bmv}dFbMg z0o>eDZb^M|>Z(D}yqhnqo`J--FYdTe*ow1Ov(5o~n_0f&W%Lw{(j@Y^0|#a?lD`}J z-Im{*w7X!2tDyY;zD}cI*XoEMdMbOjV9H`sN^7D{eim=^0A7ojsnAfPg)k<;yVoL@ z`Ja=ev7iG!V?wNdD%*qWPx@Rq_j8v)w1L3^OZ2pA8$T0H@hpyP z7OTn>P_`B6AN4iMY+}mD#(FrG$t;x?y_H(xS)2zik&SSoOvMB3c@lxN1Ikxo31Q7K zc^pSOLrf7oP{fUT>G5XZbEB}IW`?i{-wY_Ocf@vcyjJzvZmW>mS_}^uCOod3c5>YB z?byXubn0r&g_a{{2&cx9fn$Z9Q?C)Od>#Un?8+Fr_!wCqP3Lg(zPPdyYIb3(JF30# zjjs==bmtqj2g!2-0lY4t4knPqj&ER$5oU&^q3rqO_Pw#;x^qCz8CQ_+7YP0eT1DXL z*;8h}&uz85KVs62<^76Oh72MgDcp4I~BfP8It0NG3z zqf@F+Pw-QHKllcojWjQ@0m3TFBw9o{qqiUts%cn~RfebdSiob2)=s8t^oQoYe$Q5N zFA%;b%Q_CXs5j201=m(n!dd@yu=EuzXq6BSoK5bR_R1X=`Nj`jC4KK7k7GSTe%*N+ z*t{;>DV*{gSkEw^<`v}GYr-HZkqpJ<3!I(X?kKR||Db#t3izmXBymbWH90h!e$`Ou z|FAmR%1(V32LxDQo;PgFdaCr|j&IZkPeH-9BjcukA-3?>wb!E#*0p3wq8_wJsp5lp&+aHHnE(0L#>i5PH%??vZ77a>aW zeC_G5&)6md7*AwDDC^D;%YO|^WUb`L%JAxi;WV~(keWM{(@Ov3DODi+psoV@E>=@+ z38+YCr9=TzhInn=82%MF(eIp+ZxaCG3B2j@S06=BiSE4u&N5_0H`WroBZ9DzI=Hz+ z)DT#`N%zf#7jM=Q?ur+WJAKJTy>i@lz%yj|FaJ`y<9S$cFxgvgqMhw`7>N6Z+kbdP&(avA5b? zKf~4gv-VTJ9^nt4z3Y}IHH5aMrJ=^^KW31fW`cUljxl16d;C6>o~C+#Z5tvE?c~JP z3SX&pxH4IeOTHrX4{9?FQ}(g~aD!egO#Jx#ac*tRv~lyPkn<5!CfosBkgFZvd5_0m z>yu?haXvs=!#jc+Kwxn8^KBA+8Pi!>ZHnpEvFd4Utx+(|B}!dmG)!*17zZn$m`ySl ze#b%Yh!>X!*X1|cnINUXLBan?W^HC_!ZH#Y*ySiNr{Q5_Gepd8Hs;S>KcXt z8-f3O-{qA;BjF=C`&q#E_utNQijF9GjrOl7(e?%^dX4IyH2qWx$i^dk&}eiCnB-YQ zL$c1PfT%wN^c}k0f4hlp#&icuE%mm4Z4(>}ip$S9;qr;bjQU@0chs2Q^BP+D#|}7> z{qBp?p{GUt=O2N9y%E|#NtD~JSjZ&kq(kbzF38G^ohnSF5F)PJ&^7B>siQxtEam53 z8iY-CXx3F2Ib?8s>v_|j(pUoH1#VU9%`wwgs7{sGyE7SkEb3pH&uBsQ()f#4taN(K zobj?h%_@%4IhYoYNH&FWzHf}1n>{hhrhm<#-Sn$CBMTdO6-+|$c zYYtV^RzvWiucBiQSc?Mu9UoP49aE8aN=m8VKC1ipJ!K}c&6Bd;3j+$XPhZnMnn~PL zZ`wqd2))$7;V4Gh+OKftjM&Xk;prNy`l* z>e@{oayhVJvQH;X4u!Z)Da)nBm>48;=}_b!e39@YjN!l$v7AWz#BxZ21)eV$wDM7M zQFT#>e_PClu;(5P2to~cf< zlZiKHecDQUqkK$ZqYiOdyav3vP{TXfwXz}lx;3li%xd{Ge{jKd(uoAfCTG~c?gjp# z2Xy}7Jjv6`B@E8rR+c^a4zsh9A;(Toa*+a1B`zh_fInVPV(26jmHB1Th`UCGPC|&g z+~JJf6cIMN&NaSVVH}5{grY)fJKCr!<{y`;cTuB+80ie^Kv{u-hFHZl-!}6Aho+Tx%K&cdsKVW{L}v@rRznD{0tg0X9D=Q$Ca^ z&bfX5R1~1G`XWExXBT2&{I7x+EzkHFDr!iSp77l^r`=%=5!$M8%+lq*=-uUy@H)F| z=5UL5$PSQL0N6*B-?SE#m96W)=ut)Jdrx8&pU~;XzLDne!~Uydg1`8w+mR>hbaEwVx11N z5g^lhQqP&nG6e(dW>67bq!xcxG0SGIM44t%C(`B390{aJ%h|`W6v?P(X)_=jF>lYZe_B_O7T@rKyM=Hg`}kX<>w?@U9a|_5b_we}MU{y#4Tosg z!g&B2f3NrPxa2{KTRe%CvV7EH)i@FBD2Ur8LDP))cB?XC-IsS%n;%N#+epJv{3Ryi zh3sdG6IWVt@Yv<@%#xODD&MZj`jSV(5eXJ>O#mKN&WLLVxxu4-jDR8tkf&tBR`MV>0? zfEj*|DRZC7+|a0yQ=zau-F~GfP1@R|OxlpE-n60o#KB1JtF6q6#)Dc&ZwmPPwAK94 zA^q%r%}>BQ21mRltM>HqjnIaRLPohRw#-zE`;3Ma_M~6Z_lOjrmnA25v|yiwdxFx0 z-L>Ab#h04Y7UFUND#@yJPV%efl|uVk`h$r4^g07894`SmgFLdg>M$CSyD2yA9eWOqSNTZ{U|o9-?ZRPStwN$H8LlL+$M}>hDq$64Fw?5*u0I8fj7hb>sV~5eQTfB3^Fh zzf>nhsBvOv=aBqZjW}5x;u+UiA!aIj z1v0?K*y#fplZ0ZG2Nf{~Ih|A7xEJyA;n^_+fm~bXCn8aKr5f7Tjy+6l_P}YyMI6n` z2k^b9@wM4)Kwu98i7KjgR)fTsYS(?=6b z>7eQqHNlAkS>vcUI^vAC4c#MaQ>F=b1LS?f{rE3MJGO`F!s@~C$lZLFXyLwK0kI{= zBZQMtNwn~XN=m+VbR9}Qnj6YzYbLwx$d|JgXfj?~&qL_C&0kD>{P^t=g|{kWoYs?1 zLLRft@!3ODrded^CupzHU*5OxV!S}TUUmV1+|9P6IdO%^A^?+s6zM1WB_D2RSXdRKZ40HOjB9U-p+}TLEup>Wh|z z=3Cj7YBmlp6D}$1LXJ|7U9lx5ZqvF18!hU#F8bD4n=hWT+%$ONZ)`0$r$+cv5ltV-Is&W) z@r$bTmR_5V77>?0DLi%;)dq>pi`Mq7Yz>O*wCu?sBKv+e9;yS;wKy|PxYf9_hzMV4 zrPbkSLiIaM{zZ}nD*s87f01PWJBs9qw(v1 zuBIDtxeS^7nzt$eV_kwQx%z`ap4iDBDhW0p5d>w?BZP@dQKR#J5Lo{)`JRP|OOToW zs6JiQS1GgWyP$--Pu>(Ucz@Y>N)}68oS07f6`BODd*-+JFLLT(RI$d-p6w&EAkGoS zA|@8BE9Vb$lp0a2$}GezN|Sbb}iss`h}GC$LtHXu9bS%+D8v+_x&ZR~(Z?lEF|PM_ECgmuGDqm$LDz2#LV(?hbyi}J1dBs$IL7FV4?MNU$|>b z+XEPy?mg~}>~1b*A=Xl9FpZi_t}e{zo+gJ95U7%)4%;cs92t>>4M+Mk5xcvaF9tE! zS=yAg@y{-1?C(APxvwE0EZQtrZje9GF|CBEht;83K6;|gUKy07+WP+SC5Z2>{&Z=8 zCG68tXzAxAwJNzYdKMiLf+#K0Tvc$no#|qe5%&_OWk>LCTfpgiMnVTPX?oPuI@AE? z_JkxB?r)VSAEo$K8yQy!dQMcLUafs*1RkuRDny*lFan9T>{a|76OmU@H*;Vpir1K! z=tsyut$YZqY(C)_zdL^RPGm9XDmIS~EhsST#pizG(J(rLDGw=hW^ z3EQx9s#l-SPebjj(BZ8KHv2^7%T5t?F_*ihUD_A={#6Nig+ru6ccW%TPvfXN(SGKn zPVwLlhgY+rQRJ=G{BkKOqgiWztp_+D`B2)40o1FBYSK#BT_YaPz8xN8qcbsni z56S{%0jVS42PyE0a$M^J)9y{1u|e;{)0lu=U^h$<208Juy>qPaZ#3#{jJtm#)H)~{ zdTVua%K?S8khGBt?U{U&@NSam^QHLFHqZajosA!~N_M{)d;d0Uq;BlnnWJ0(s0i4q zSnx0w#G9e!wIYi>Y}F=lrni3g(cLP8v!HE&hAM$_-L;*@kPdBd1c;73$huHOEP8GOV&2;RFk>JRjroTNLKb2D(oXJH|Vp378H<-T> zd;A!Y=Gmj*54gBUgh82cd^%mrx19VDLM#N|s0WphugRBTcR2 z7#_{pL`C8w>jOAlQ)@RSxHZ~%4&`2_UF`1l$5cN|aO>Ww9*KGrQ>J=f*l7h7*5a>b zh*qEO&6lFu|8Cbe`_vY7FpqjXDn1M2?@YjFthQC+->)$)J>IlK`ihh8GGqHhd4=dh z&#xWDUs?$w&0KfAUK@Bqph>{LRXiJ*wBUo9j*u0prdXX-#E47sq+Qoo9si|vlgcx8 zybtb8q|K#vz>hM!kQI(qi$kT?XNXr01=iI8dn7wHC2BxzAHGvtA-~((M8P zjNZjQwUHg`*@us{!8nnFzk1>-UM`miLr}h7A9iQ)v;?i=5yC=B@LSX;{a`^aa>OI> zbd>>?rB^MjaYh@!KY=hmew3K=toipFTUTTtK<;SnGT2G&9&O$R&b`Zy1&Dq<-lS_U zLajT7pGYFuv-CrfxotL3{?Aa=;LwjB&KcO$*9HdFrhdotKSBH-I|vwv?|!IE|4?Vt z3`*9h+#P(FHS{Ro6NpFu^<^l1h1l2hBR@F-<5w?=&iE%R|D{N@eQ+=tuf;MV9(wst z&DK}S@6iPcN7h@jC`J=fw`hJf6?R9PiJ=)&%n$ym89jbmSl5=tceBnQ*u)R(uY0RB zbr^bO2Y=v`0DNZevg(Kppe7Vy56-s=S5`BGAV_$9=Izd>DRWFc^>OykA>Gdm7{mp_ zf9DY=fb7hl-5zxmFoOwPO<9{vgchcXtG!h7N?o5!bSDP>D;V{ukM0rOjx}2UJFskF zA;KSB-5;>*f3BbZ&HU@X1IyBi{{hQ}C;tM=T2Eb2MTkFtEES|Ou6~QUPX1UVJTf}Q z*tReux`Yor6mf)#6qvLcyzF?-4<2H+3dJ?m3dhZk3CE9>3Jj=o3TYzT2JK}Z9NhGn|r4c)t5jm)%40_YWr#pXl$`>H-Dl^ zm`R;U%(r=2n;bO#!?CP!2`L2~LsKU&a?8dj|f?aedZcE!2MJ2`@AlkZ#AZP>X>e9l*!4624~6`1$Mw_zC8wUI zfqk)z4h`V~tiRNB&pwhUBk64x<+lE;Or;T*nYwGmSR(xw zm8@3?!nf_GG)Sh$CowDt!KtVD4NKl0bzZToJrhV!U)|p(Q zn#XZY^o%}EM(J;WFi9=B6kIjA_qwrf2K$0+`ERr=x#D+9GL91!>GQ9s*6DAR=Q@LF z)29#=<92NH_%5@aX!fc|3fUc=Br; zjLz^IAk6#APoc#9Pn^-<8d)PJYa1L@3s)O+cN4p3@KG?l4@b*ZAR{oKBX}VmYU(H? z%Hpz$8FvPKB7@lV5*m=QS(-(i$Z%t4>OeNc(VU$u2|Q5Jk)07p+tG5ekM^>i=cAuw zMv&#ulLft;@?sF#3EBy&Y_iL?jj~>6>Ah)6b?2htm?x$_koDBi($bnXy3nv9_>LL; z2&Go8{N)F(@D1viM+kZ@?ZiVbb>n6&O4+`Gv3&h2iEj>@t%S+D``9YoQj`O|W&+yv z(OsFl7`3~~o_(WIC20RZQWUGb{&E1r1A8+O+gxw!vIjASH!W!*3twzWuw;)!D}c%3 z4YB9Vl@+*Fdz(2^nZj;He*bxZ68}UF0hUEdnSs=PBOOooH1WF&ap~Sbh_HHzK-EQSAyW&Tf2jMvbtDcV4|sV?J%K(J~X2IEC@q$-G* z@#5&y(?d~86dZh&;|dZKHX4GvsjO8SYV_8}D2|HO$6=^3*2fX3W!A@$sH4`$(WnsZ zlKpk@NgR%r=OGa~gkmyvHlUaVx9I7-fduq7ABBu!-31Pm2h|k<_P|~7CPg(KLImw{ zhjq8o{d7NOuOXkehvZc-v0AsJYD+jXk?g z=$c~S&4Z+1Zr%_J7FFs0x$Rv{TB%E5F1&!H!;sRLvwD*T_ADM`9InpGus>ebZaPMZ zfx3`F_u;AD`g`JA@H^opea^Edsp?9r15s$b(x z4l&>E#hPg*@aut97?A9LI?QG1k2ja z_`%+pgF7vJXOXbH&XhytRJnQw&gqe_&Uu*kVy}4feA-iMNAjjA<ryWrEj3!uamK>p>VzA$cwm!9wK{_;{MAI4_}>2n8G5l};+?+ZB$Fa1ooy$Krwy?l zW_%fmR&Dm__5oAv?i=|VGGZv~y^QZV(+bwEzJAEC?gqNurKx_vSlP7cmHdWsB^SuWm#ptPG}r6109omhN^=bVr-1C7i@S;OnrpMmE$uW$V$04@(h=KGwMiJ-c*KdWl3ZP2TC1B)YrP` z692_e(1_RjF{wfHX?xY}I=}Cg`F0?=wu^}InzKF&n5O6AeIF1AuA|teaLF?X1y!EL zQC1lN59*AoD(>%FS`6|>^6p?8O!r=AmrQ==rv;;ae%47bx|Wo%GyHtmc3X4BS)^y% zHZKmfukvzGMVsSgW8Mbn{tKvjV07v3RO#V5Xxe=?bLW&iKp4CSG#cOG)f8RG-^V9y zGwFofb1`!+fEF(Yw2X$Z&-Xpc4s|?0g7=x=fb-#xzDCe}CCx*x%LWPmTg!8v^TE#zHu^P3)iP{7FZQ_640* zs#+<*z5{h@LNQl#eEvm_9nSjz&X~HdeLCGRVyCu-rPhy&%TX8ZB0*b+{;zNF@2u4q z&rZs1d$mu)bbnBr6v9m9VbZ!}5b7_zjF$f+1l{s?)wce)HumR9C&Bp#F+)sX z-jHGWqxDT8h3v6q^%7=juN{<}7VVbCc!V&Hk!Ba>BBc zx^yL*c}J0_nd|C)nw~zi?^-;mLvA|6*ASCNd%D;to6J9PX*fYK8V=yE)42=*Ghgn4 z#iA0f>5X}5M`=#wz^Q`3O6#3<39Moq4u)@A zo9i}Plh3YSIwU`5sVUm1ch%oIiw3O3ozX&^*95~f_qL_K4iq*6xBJvt!OlF5y#u}j zlIm=uq~2^l&%%;?l18|p-i4{A9;cbf(314U2z|D_xn#J0Varu4bbs=xWqNuWdA)un zTcx8}Jpk7h%cjs^>#Vt(r8U7FYvW=7{6=Msb<~L8sFOh_lh3o^_IVH7!l~h!E(>qc z{BC{lwafnY+4GBrHfd+?qx3;g(Od7VC6M%%NGuF5$wf1zZA$&>#l{yGl{JP#3ajsi zKP7Vw0V*$vlkT%8O4Vz|1k78qLly{ip|>>;j(sd#MukZX*DqiXZo(7FT=U95B@-_8 zfXZV08KV-y{~u+>zf!B6PPv_wb4)$8vV6>?nf}X?bgPeLQ)}(}2XcmJ`#Xo5lBCI) zMF{2m@{Ql3wSuB@c1+{{R+82qJf7RB)H}6kTUDJq!`*nWO}}>L=Tp4)zh6UlkAFkX zF!CVNm43bb?8BXQ$M7^T8BKa&yDn^7QXbFh>oY9TT?*#z52zMvv-1X+^w(J(VS&ap z{LMrVJk!MM&LtZ()X4_Jv1wy0W135c^2f}H+(G>11art^wP}6qJ@OAMNW zqk%1E3c}r5IHJ>^Z*<1u^l{vGNs5UuZ`Mg(ej;4Tez7@$a27K6*;Rp4yf26nVG-jJ zb1uO+CeR)&=;0@|DfUUeZ->W6=OM`_c&NjNFNd^@ux1d6KEmd{VqT?uG!E(zk@JVC z6a+osBQA=kn+TKGVxn&lGSP%}vG=91Gu$ot`*F^>;;I>y7j>*MY;$5`UJ4^WD7>{~ zoO(cKW^YBtTmY{h@JPz9iO94eopoSdlzUznAp{AJsDFq?X`;luCq;_FpQBm4AEWPX zps*v+o;%C$&>!#o?uz1SoL)ZK&z0Uq{EYtC8N?*M#<0oR_3aMF_#4c>+{tm8eY8(J zl9>K;v~L^Pc7*XtyA`@NA98!+{j){GvHW(Vz6;}M<8~oG5=_2zlA0b2E+IAjula~} z#B-CzYb$6Hz1&$e+bPBp?KcvX=dut)Ule8}+fa_ij%P;2FCapI70)jH7Iw!^C5QxH zpO-PR8DU%-hcb7E!#dbB<4@>T*gaPRw?3ct3xxvMyDVbGLzlB?a5RTroP_YdFX#ZwFG9|5OC$Ic_3shvKlgP0$4K_C z>FfI6gdDg4pv3&Q0AS>o0KmBO9|1t3Zu;-~e{3A-UjhI|Jor;7s;OUd5aQqUE2|;= zM7(hRtpYel`mF+h{m)bYb|!yR0IAsj4^#jx|Nl?{L}31(sQ{GB7F3H~w3rJz({3ZQ ztR8wGbp()6Lm;*InDbf$)<=$gml@Lf%{w)RWxgen&=tE&69#8rKj#dJvywV&@*Hvb~*$^P9ZsQAw~ou;nh>bUIv*o#S!L}HI89pv^3x}c1n}5AQIS!{Wi~_ zH3PDnaQHdN&yqT3=W7J1@c&(+L;OpV(W~lC47G`$Oi)PD}@47X# z7gmYajriD)Sl+54AcP&s!|z2y=KP&8e>p_S{+jQ#Y5vI=e0awEWf1jG%KYQX@dqmP zSI(>;zQUB#Cd&l>Ao9!vdj2NDP`V_$oH^`SayWm|mkq&+IdK4d*+H1~K z%iy)_kl65dwU3|Vgw*u&@SwCLCt2ufOMJF`lcnNtH{fi3Gkz4)Yb|GgN7ekxS@yaC zO2LY1PguZVEg&9)_*zU-1d02D$bf|_uu4yu?#l#TQ|^*|g*Unubxp(JOy!%fIGre~ z$mnhvp$punandaj#X*npOoC-lpFhn|$0DG|e8on>-kw@6lvTo5T;9Y@F5_h?hl2It zedtq#rZgBT4XdcI?T?nvsNY^!e3dEZqRYH{!fqtn6Dv}tW*SMF_|*ZG&POmrC!$el zyx{GK>JX!VRMjgoDc{@zQpcif)8?YrIm4lwz@ZhIu&=G+*st4=yyH)J2hE~LVx_;r zJ_&W7+qj4>&h}^6xtm|>3_Lr5$ww^e(Tya(I111svl7ba-k^;DyUNfI<;$*LG z9GY=bf55}L#=Iy>_Nq9*Zm7WFs90SekEDIzl%A#EH**`sRG()p`{Okv*xaLSof1Cq zPgX62+tFORKmCZk_eo6Q#OEjFsE{e3{j~hBkom5jZKdJPSwBjo0H{!(!~!T2(Rty& zNU!jHd+)s?6<+8HnsT$uIXW^_gpQJ_pU6i7O%*eP3(yz* zvPgu7%8Pv%)56Y*nYLIm{3ail&te4++RpI9)ML2xeIX%tXYx!V&V^~VzIwyuIz2}% zvvv}oP+bAaO-cDU!%p!S)SZ$8?cq%|w&eQdoGLA3xHuOP%e6IV^=>UH}?{W-M zjDE`AF4%f5EiBVZZ!B$rwxGzD#Jwc#O$%w5N=yLG9w~+Ry{*!@cP&l`7dra=CyAU; z3a;aYKq+5=`xN%5V{)}nO+y3(RPx_TB*p)js&z*Eoicx0*!-O>PU`<8%U>&_zg9?o zGp0sS5Q={)&F1zSda@g3gzO8+Y$6~{FCACA%G_`KPizItp+p5}wdabwFty})OF-`X_TLBq`^07J<{*F$|rj?$#}n|=c?av=bw+e2t9dUeanMWVv9z1j%(A%#4!-#ahEb^)4l zi8SdyR-HS=@Oo5#6vx^38}=KK7Y(rTo{DGP&K1~ih~ykZO`Y}e*6Y>LXd++KMbbKd zU8E!Gv!KG4ph(toWu6xApJ-V!q*0{U*0yv844IjRZ){9cJXB2`j-$QA3q8jhA*%`| z@09mabkzXcU*_#xCi33yWwV-j{Ztv$&gbz2XgN9QGNf30-qOxaZSThiI!oB9gYJh8 z2%%T%K>eG&R*BpnP;KLzhIORrCQIdj@rdgmTKU5&X{cd(qo2K|^1LHN2_4dY6z7mC zx4x#;(czBqzuv!ZQy+C?s1t2EvYqC%9l1%Tq^YSWDA~J8b1XP=s3`#Ncuc!LqXU1Q zEctPk7M~{4_T!CvUNZs6r%B6w)BoXYctxS6BVbl5%uh}Iw)BhfMz84fjRbWwkHvBD zd%=XIhm~7t^+g5YZ|@CGO*KyEmw$wS($IHqY}KnueJkG2Tv!&lH;#~NB$Ps$b&K|I z)JtYAFbneCDQkYHfJF65CZLom7dQUEmu;=1R2oI#GBs|W6$%ae?INzTVy=zBq53WQ zwz*Bhy?ctS>Dm2h!19Pjih$~|=E~#lL(*>8ZufOk_l6bzD3tf)Zn_&P_y+LM6tVA} zS>Ni~ePQ`@)=1*c-|(4#01&qg6i}ct%aJ_SC4EqpHn(qP+V<3Rlsw$8D!hgG>FsU! zY)+7upU2a(S;X~=+i)-8HabI)X!xvPw7@xxGaM=*a&pheu)@aDeVY&T5^YgxZX-DH z7gVx*h?|cwzhp>($yq+c&ySj4@}|I){Co@m=9ytCqv&iy1vvz!HU0|upS=|XJ7WsV z1vBme(*c;l;9Sl%vudr*m)>)>l7r#rA(=&E`Eeu-BOEMzwb4Y6o*^JU7DGV7{ebX) z+FW{xd&|jx1TZQfL&7Ct`vCT99xyNMAHeLLb4Ho~hN#7fq#?_W)>%Wf(8g#roH8>R|*lNgCiV>VK z2whUi*SlX?!&X#(^1ll1aRB-q#_C(*4R~4f|Av(5|Ndt*^@n8p=koABn|}O*lo6DN z^MigPWw`LF@e-L-tNbOrs!XrTFv_)3sd3 z6XMAk&7ULZhYn|AM-0g96*NhW94&r}g@;=CC0)b8w_g-Y=vK z^U05u=;#l$26ZK+McI0-wQ);Hy=++%K~%24wTt?rU>h93|1Q6_tlMmRl>ba5bf;$SggK%{8%#(-=*!^ zY9!+cT<-9O6)AWXx%1I^M;~=90bVq7h6Lq0)@=%3h#Pop;>o@_ zXq}>sBox&4&Cs$9+n@Eg(=b^0Go3zTBtF119Cyrc9QE6T(tyYF>*|`6pCxV(hqI52 zfgd0S)R8zVB2uB`wWbpAc>hQ|<;MrdXWUKya#^jYl-7s4>5_PmNMQ}j{wjvU-E_&8 z9nU|E2T8?{{E9dC35W7|{jYd4=$pXf{r*Fq%y~6a`blsVSr$K@u+etH4vH4M81B=V z`yYf5JsctQiAlc(9&g>>2q7(z$BcVVYc-;e-$a*-c?y$=dTfRgUCGWfP9hVP%_v8(=Q-M-97-DA9b)CO;t5AmG=W=P;a1X# z4bgZCyRUOotm%4=gI`qMW?6~Hx#aSS;3($X}EEktk6S|M0?Nm~s*mNy_U5?9% z$p7*+o#o4}w{^1$vWiJ8NpS<;(?}#d)#4dFBp+wkLIYBC+Dx6M8$q9&kLaCwqy#wT zHGP>faYtDA8!)SId+Z!$2B^~ZJtoW+V+8qa79*8H?VFm(>g+qys_Z-U%&I!|%5~OS ztgAZZ7YJXs&a6B?acI zaf;`OBTx|?k|>GwOp%ACIm}MqYtdf8%TWh!#Y)pU5wooS%Ihk*l;KWo_Nn2--5T{9 zg%DzHqpPCrCu}=+Yoh{=UWQ%+$7rMv&xIIHJUbyfYMzUMc6AhjjQMbo^o{4H)b>zT;yx zgfid@9Eb3~Kfg6(Z^M98HoQ24@aV>{!Z|{g)rKgv)wy&tK2%n4j*x9jWbp;Wav8^T z8HiteTN9?HnrvTuJKxpV#xVmE8DNPIV6zp)th($&E{5TOH4D%3i(y=S3r4iXu-ed? z2h(C$eRPeea`~k#ukFK#OPc><+W=ziTNnxWyNE$C*u-;KC(f_Xk6lFv8=NsqF`~7! zX6J9$+-&xp{mBT{XntDJHsELUnkk$klrl?5PnOW!V0+rScZ!GV__h4#P5o|gecH$= zK*XuYrhP@jNEwIa*@|GBvn3eub~`IaC3s!mkDx5|A%>9f3^c}@T?BkAooo^8dF7Sd zH%$eBUS;*Qieaw23nOoNNbJiGk-97HqlwY`VS0SF!sbPR&DFa6>WhF7HsevjE2Z7Q z`gDzlEfi{Kb26a0vfxCnyJ}DRPHwdi=cXPyNO!?7>U-{A_``qTtdD3qX2xKt*#FxP zIJpV8hC2^#=Y1O zIg%cbtV05Y1kOGX5@f^~VGqB7d=x>K^aXpqF~VRJMHWIReuEm34G{t&U4;-?j7SBd%(!vJM1=@Ywb1XfBmLJ z^$j^l^Y0)t^KV-t_ouBHJN$Q$N&eq$&3}b4@Bc@W^FK-WJCrz?f5(_vMlnWEt-kmh zcF^tTDqs5LS=GOlCf?c3cbybZ*kKzJ$y!%%U2WRtu+JkYrd7FJfu_7a6 zC-h4H8oTTO2OJEG3Yqx*B?oyoh~+>`?8yoXeKcy7t|x1&?8uA*F_e9AQr?*HJ{HVI z61g-cnzi}37;_$}q_0&E_OH=O31@OVKg7~A7M^I07?WZfUPDXsTL$XJYft3t&;7qO zYoE!~QRRpomBjn+e&-m%<=eaYS@(z@s0QO2fncvyLM9IsR}+!CUf&ll~j15ZdOe6{P&sugx;+DUkhoLnTm?aXS1yHk#6pl~qc`**n2R_14?Rfi+68=lsN67% z5rTVbu`hl{c?DpG68ybJu79ovI)jp|uQ4X=SQj?>>yKCb($|y;$x2(qV0eb|s0=vp z=eiVyia0p13x9I`fHn3FRd5}o9) z+#xdHFT*^51*sTAXxRn=fhQ(noR4O~8J1Gc@%h&i?0aWNJ+191>p@?j7+IGf*B(}x zDO}?HQalIQFP-;GRgj+53)?}o&l9o%P%;u-=Bf+i-}Lu>K{kSZKbqF=>fMp*CLJJ5 zHg3TMo6mOrdY+#Z&#ERS)0ybjv6SF;C7tBlPpl%=$*L~4+?nir63{HQi8z{?&^r#$ zyHZv|G_j6mF1giSMKO;m#u~5;?`oeJEOW#$_D2~=qK(z~fu{DcLY_!gTX?{^Wzy9N zzjGjrav8OA*eJ6P2s%uTPoaJ7$`f<<|8Los!*955Z7^!uj@F$hhAMpaA_|YYH2L~D z&zZJx{#P7>N2dV(cttO9rV~?G+&q_S2eu*8#`d6`u^a_Gn@62pEN(&fs-Q{|%6 zk_d*uj`e8`%f&k9Q@l4);?s242?@7v8=ExPuT^(z9Smo5ETX7ETJg@~Am`CAaaMYh z(-E0;!$Y0Rz8B{JpVl=q=56h&>+^o@c@rU0!>+>p6| zrjRhIVTjzQOQu9Jk`&45n^^SVVEdW-A71~!Cr(G_HABll7 z4ANNbpGqdDF~>c(G!I8zCPGCFO{L0%kj?{2rw^*eA~F76Ea_tjm%_U)MEM|;o5%RG zu=vqcGJ-MEt4(Qnkr}n6;6~VEj*}Y2OV{{M!-Ty)N&<&Ym~Unk7RLj5x-J8nC-<>O z%Z!(aMRj>>*s*l%-LCs|XGfoRyJXwRPD0Mu-4!^$AflZ&_Tpg$oL_(!+k1%$ay3)- znYVANNLPlFZEVg>ao@k(GO2Q$XdfqkrE@~b&LaNF^$@}H6U76|@<`w>XWc-LeH-Ia zYyWas;(xj>^-J`0i{-J#fZwP>53FrtHUgn{l8A_{e6UC0bDhJ9@($dNid$JNwqd#q ze?=t4#!3ucRlcApjP&@<;_e8L*W-st5wI`GkgK*^=##fW7CBtWzf^5-B95f)ZWw+k z>SBWkXK9R52OjbSl09M_;5<}wU%k2=_}slMa5wCg@u%%OZv1&{NNZ(6@JGU1C2J7z z!S>fzOoPlK@S&pt`K3L7lQotH@y!vlkM0=FKLp+i}H29R+~9-`nQK6sw4hMdL{>&^M%5!kL0e&K}ptiUCWZDo)k zE7B$#yzjE|F?m>Z2$^foyxCcsAkqdEgI;W6DO*mklmR;sB>PFGAHC(ZoUAvgx`z8k z!0q=CU$L}}S>JuamV%>_KG>Bd6H3MSepT#o>tzGTiZ#N?kob9AwgqsJ($|^M=?=G)&Ld(1p z5w~w}NB7VHV@vKO@B=JAM!E1_=OkLv5%GR#IWLD3&U?BJEDYSRXf`<_EVXD~Rp_&o zg`FTCY`}{bX%%HaM<=rsZ0+15fsOn0GWfW_0nbuS$KPEjBxJ+yyLBQ5wL+&J92& zVQN5*)RqNnvreur6nF2oW_k6t($)0Y#W%+FycP`T-kH#Zi*3KS{gOvO6xmdgk^(v?!df;2*>|Z_Q;vu6L;VbRm z3)i;H-q1XDFj{Mum(bm-(F#~}*}g(m)*kAhw?T3ga}KYnDt7;LReTpNFerArlli%G zPq}ObZOhwulXcI7(;`-7?AWnCG^sS~Iazsz5>k>{R^~`DBE^|jyi)aJ7}ce|l9bCq zE#~Ghfvpe3gU(tSORLcBMi~A0xxm)#YR$a`_2q*(uP7Lu%?HyDrkcUWhR*iSQWf$4 zS;C8cT(B@MfnsBn{%gyB@8QeCE3tF7C41o)(=B~n-oL-e?J4fRCxf|!WIInpN0?wr zG_H5S1rZ?hx=7sBB3O82ka+s*I5Rcf|FLZA1rOB0aA-xbDT90dX@JLw&ctS?B6!O1 zVw2f?#kyMq_{~qi^Z`|$zF^Z-lcxV?d5jfUd~7at=(IiS4l4!U#fn>ik;}3SVv1YrpHaH6n;na`tiBdn!pEEHU#7!sp|z0Ew`Qht?~P9aDqmfc_{!evYVt_S zMdJhll;H_?Wdj~psBbxC57rJx0F9UTheJGt7-VYeg#iW*HSjZ|N&twfD&%-~W z8mbb9(9CugY^fF3;Gy#c&Ctk1L zKnsW}jkauT`p!OJ=M*aqG6|N`G0sUQ_8S^!%)jI23jymcBC^Mvq)ydokqC zJZ&wBUhslyKJzE1hCmuoy`(^!55Nk$8OGIcN3EH`VVzlk$J69xXwr-C0HY`BMNOq2 zS&Bj-L%;p%TW@AA&xe;MRM;-43Lk)r`rh)yXNDH$t<4!%nQ&4qdtfIy9IC?Up~42M z#aCQH?NY*xzfQ0X7uK9sr3TCV{*T8*L2(VRus$os8m(B9J35ym8qk^{!|bYG!hU=R zL1w5+f(z4#@t{*f>Qr&t(+^#+guhqPm(Eo<2+HK_85y(*jj+6g>CPCWZ~iEIKB*ai z8I^fzIL<^os~Y0#iy;|t%c>{+CCQaJ81p902`j%=9OwqA_gArH8c7@$E$xhIKd}T( zcDsATemHM)l=~TmfqrPHbyqyE8=e^-6#i6n`8#0z&)x5IG1tzN`s>d`rX4h^Tch*q&DoyFkhT?JEgV^7$KdB8ehDmg zF^TWnrqaY66w4^_*U!?n^cvV7F55>nQ)JLXlAgx`;xx??Cnwi!9&jy{I?A6Lu5fn? zKDX1abJCLL9YyCEuVW7Dj$;QkZ*2a10oYe{$6%H#eVS-FF;iqHZPv%_DrWvm)%QXx z__93Jdl#1@0Bhgmk%L=&nFiyvwu%b&disAxFGNr;V51w%#xwyDZ&C~ zge*EfW4Z~Ry>4JAyqxOa&nxQl*rxjF$lxjxIx!4+$L*NQb1K1oTDMT=3d*!2JYO_V zk1K?@&hi-eXmmVXzRV($;_0qa(p7NUIeKwkKLz0w zr+)1oz{8|v*iQ_L!?&i2eed5y-=?K__bhu+$&ODm@fje=KIcA5)Q{kcFZxa-jXsCC zO7QM=e`vUYVmHX0@uMrB8)kx7<{e;#D6DF^HCbU5;92GFI);RoHEt+w&@tvxOo`j; za{HJ|Onk^yjdOh^>jP{#HU_FPTe59&Q1(>AYS&^0-NDU)wsyttH>UT^g;yuht6Qbk z_KFQ?TRLscZSN!%jU4#$)o^sAWv_8pE^Bgz^{QbFP1bEa*0voqWuQ|6J2y{gOPW>( z>LBk=1x2Zcc{aqDr0orX$|^MCa#!N_N)msa2rgLhjViUx%neuVpV?O;+Om3qFR*S3 z5tgp0PESp?7N%CvOQp^aGdG2ynohzI74>jVt{*jpG*B@XQfa~Cx1kuR8Yo**=+PK92N<^PJbs8Uf zrnlCxu+l|RM|Jmy6>mk{<>ra{v0j-~ z;X&H-t6!t_%zfD_*VmCRO~z(A4LfwD_}trEb+^77c8rPf{}S~MN;4nL{+hRCfR^Yo ziy4o{TQ@$>+Y{X@#2Dv_R6}(kbMGBnY4Hut@kL+oJVWp)FQ` zgPMbjW-FKfk*>ALR{V$Gz9yG)nmn4%h)8xduDE`d=Z_uwRrS93b#>8pv;=_ojP|v| zJ`z27BdacZO!DEjDO>-x(nG?xzo=;>viUOW9~2!a8>>f3^lg3b-Om$`&7WebcPIvl zmptIv|FWUH`SDKP=+6)DH6wSA*p&q+zSIY2;FOc7;10fbumc&~(_qs~BBR2oAyO2` zUt)TjnafMm`<+whJ%vgk%`MVGT8nM)r=t`aVxmcL*Yxa{F}vmzX^yGYDlu*BU7U)l zufJ0Kr03Q7ATaml-Kh6KZp<;?-56mpK8*D_ZMW#82}Ors=g;mZ>zsE@=#Dc5hWDqt zl?tK6A&w>w-K(eVm`oqvIth?)L(6aYzdD5X-RmV*Vv)i3k>-r66@?~15#dK4-MaVM zUwdQciDWd$S787OYPP2;>_|?G^m}D02_61b z_sKn;PcMq2@%E8cac#cXI}jfc!;VLqrarFr){by49%$SYT&*(a=p~3Vj$Vv*e|+ed8w&|E4wl|Aw9w|Ad}lcK`Yb)t}Jw|JDTlgRcKyNzDm79REK_ z&H4{U%9HP?WY8Z+tysC)itm(Ii3`fTp-ch9?mxco_xnw3YD46ZUE!pY+%syfr*%|3 z3JFyHku3Kg`|n&U$qkqDy!;+9He*W=FjgdIhm^O-Fz3IzI{H&&QsPfN*2ffU1k|`5 zthPk5cu%&KzTu52Ql*G9@wHB;+i(rm8VtVX5w>ZNj(*D4EPUec%r5j+g!f4bXF7L^ zP)`0~(uaw6k-KBWB#L-ZEMxbAcweg6UOG0mziN*TFXXsYj7ue$WvXh&I$cm9(w7f} zS6IFLs>-X#z@xt;drkGKyw31*I&@&qO>E=nC7F*Jo_rhAO#ep%vTUob2|`)cDbrcP z56VPcI?Gqu2qGt~iwaB@mN?Y_0qv(D=c(tI$#gd0$O|U-kGHQ@D2c z=Wg~;+~>eVHpN@sAB701_5@JhUM%>`bjpdNzSLGhoB=Z%As%_+PBZWHIJwsGTDLgo z>X_c5rMdRGs|rOB9>{C*Q`;sF|J(H%B3jbnK+gPH#s`F{<(sSp{*%KVh`mR6j8j^; zmqHd>C57C-r!IKD*Rn@+8rmF_O>Al6v ziJ%ZCqAKm=wQ3a`D~jkON1&;7YEY}rZT=rQjZ0bk_QEA}pZPOozmvB;IL}2J%e1H- z>)OUDxTuS?IFN2*6GNAX19bI(4DDV>(`j8!WAyJxCzrjWlI2?S?g!nhSp~0WZ{R@O ze{(b7zYZe%$3b?Z{>{z&Q`O<$od3U79d5S#tNvRfzybd=J<`aLN{cE8?%Y@~g=b)& z%bziQg!8JWkXqq~SZl}%`S?@ncUMtk?>Ag5xIP5Xt0{X6ykot?MWNS28%r)}FZY#k zoUXen=N-r~_t_UZg?GtMR))oDClVh>XAv>M>ARPj1#LRTkgYbJ^9PoM!{Y}Wgj;7u zg~Go6zotT-C8=^;(((%RPQ~*fD~#Lo7i!%G!j~Rz#uc6y8|XrfJ~vPapVAC6k5lfd z38M`$`L^w&mU*0@xEY4rdfQCeueJkl{3IeZ`8sUFLvPLb&bmM=7y0JAYSSB(+rSWw z0`9u%=+|Kdl1x!2qzLwlRMB^Sfi;IvevICRS`8KB%HHooHI%!X#;&O4(<##x+ym$k^bBpvzi3dm96L)~?^T{N0@YVdhr z+%UT}<84=KLH=v#os7(}?1Iq~)$)QQDN zIG0@5JCXJ-y42D&4qD#?c^w1}0nwsK#QbYl^{Xby8W)_K_drGK5rJc_KLPG-M>^u_ z-l-R>kRDQqsUaT*7a2$o>OFvmF0UhI!j{c3rynWS6~j4QuL)O)7Nof)gRlaaJM-{! z7IJ~HJYcI58Z8;s`BNg&HM8C2BU#|-XPNQ5b>5Th3m4yH2oTO0BLREYVbE6Vy)eKM z3kyYT;%VYBOsD-iX%S{=e7Gpd+Z$du{azwpu4e*`No;{+w??4C z#q#{zL0h$?wm?ByM8Ivuwd2NH)AHnR0~Uxs@ax&Wf+z*=+7Z4DsJLC)$R&H0hFjW4 zEqmreS8Qw$yz7ONVf#S#Y!UwhobVexwhkwo++g*j`4i&#DQ=8j2&WCAItj6PvGHPj z^!lfr4|2oxh>cwfKF}W1*?mH|l=O$WdPa?@ox)=Qh9DTdS=95fg8QPRvKl`k0U-Rc zas-(uzHIZ~l}%3=^T)eEwA@*uFuk!N)-eDLZaD<7mSxk`YcVRZLWL7>3GCSggn;1X z(r7|4*U{P>lf9(cJEnP?Jz|gvq}S5@psOI-ZBf!oq^NU{*G2WSzgKi-)kk_n#_9_> z!ecIaSvA9HLnPbW{pb8v0f8_cJYB*5o0Wn<{w-eI?Zb^fH&Ge2PT(C;1?7K+HY912 z?X&X@c{dqQpD2k3h*{R%=&qA!pi0A zf&C;}m?UYINDkgqki^Yb+ZWRvm`nbcbwyD)2d*S?vTy7BA11zFWyG<_P^}o~kuUG+ z<0i;#KaVd(wd+VKwf@Jq-rm9^^$w277t&brd4FSeTyGz{@z8v`oWxXIjg9r|-dp_nToRj>Mx&+*8k&6mV~DqXXy{F}c8y(v zPjf-lpFeml*HJRgn)2sxVAy7X0;2EF!7c^=?DK!v=zeOVHiW|u4dh+HFMNe)%)f2j zdkM!M?s5MJR8R(?LpM+zUnG%t1`vX5=EoHjVDzi)7ahq6EaeRqi26NPuG09#i}<)% zQyDZLw$VKBSr?-w=U++rZSpg!y-DjcL`Cj|>IC(Ehn8OYjkYpKB6Oqqtup8VyT(K5 z=pxGtp1UZ&h_8~|a$81&XAckL{O_W~ZkLmQ%_|9SJ(Rxn(C76rmweH^T+PpFVs@{a z`HbS;jZ7)r@?~ij-4nOIajhm24C!8(;g=hU+}7WB$$zGo$p7gokL&+^m;4_X>%ZOQ z|7*x~Lj(FdvE(56%^SHt1@<~#FPs|U|1xS)rj>f|soE`y;zz zHmj1EBL$kMSF7wvO;0%Pem@r?(|c;2&0@f`B?xR zVi@!4Cj#4qSNyZxR!U8|xcZOB9kjGxRn2#k4vpP&<_LR6`gULal!jhAbiUzZ-*flS zR+Uwxk-ZW6QBJZ);~#h@sG$90e>~e?#ZT{mHED9l)FCB5s{T8^p_-Z1XZQZ(SObS{~R#f@PLB=eR7zq(DEee zPWK?!)18-k>Fp%3Qs=O{m+NpoE&PG7dv9o(w(&}$WT$`iAREBHiFcbB0VDRO;7 zeKH&+x$h4>qG;1Nq7=ZPz5Xp3B=bR1N>r48KLwF)-tk3@+bU|n^piy@nSLLdrVo|O z>WnND9{>_B_+O^9h13;7P)J~|j{iqsIz z1AGxA+Sw-1)1&kQEJM;)n^}%e9E1h=D1p8wS7mYru#-4>%-}rLc-mh z%zGnwWnT5wz6eOuhu&0C+@tZFsy}*PU+uA5?Ek($#amDzTI~h`F{$1qE+4(lp zZp*ip7M)T)@9%b9;lU`^m!OrjEwE|Mv$S2<(GxVsOLR2hkVSq=6_w7@wQ99ak zM#;?PtKJOE+VZl5BeU&@T|p4p`C4#)Bcmcf{N-17X@dwt=hv)n=pB2nRzGzgAbqP% zTzpXVg7ejI$B)M;QKY}2{^mItjQ+l$HFq^~%Kc)ZoYGH+|H5^0GFm`9y%X`PfS#@* za3k6z{JIBZ(kbKq@f!LY&==K^`}5g8pNoe^`_)rVkJVn#fc(Y9=e+I1XtRAuo#u_n zFrnW&-qJ$;X~b*}9q1il9bC_gLzLS>QtUyWoQ2wApy_UZuSOEgnwy>t<9v|X{uNPY%!I67x3l3{OWL}w~4Alb{ z{5?j!aGuN9&iHW~Ox6zqKnLyKNV9@2Cv199Ou{lSW#8|^K6j6Ek{-WY+Bn*^A^~a| zY)03bR3mpw*Z6K5h}hADxJ`!qqOCIsQg!QG1b07B?4zVo@OmpA6a4AQ#a=KR!E=O_ zzTE*|9*l|?#1d&I$ePIvRKWOwi7OTXNu&Ii8S zrO)qpxyyX1W-R#t`(=zf>uab<#fSbEyA=qA`k(ewVdTOQc(EN1X4wxk_KHKVUa;PK zLnt_Nqkl-5bHMOrz(mYZT6JHiRy(EdK=;3NXwsfGaodNza(tI%_Q+->VtnK-!3{{J z?OxbD=??wleYIw z$``;@!cZu2n!?B{8FoYSR|SpsGilL=T!z#ZSc`XC_9Odo&-@h5iQpjX_7Pt2cP2+O zvc9kL3eK6<&3ktMjUOR)seXC6V6(WM(ClGm-r-fbtue;oa&2FY`_M{V5q|TFP^66@FAnc8_VvBt}2qCL}jZ_uT_ACVWFW^?tU%d^SyFbBLX=Jqn3BUzT9xk6TOK}sGvZ+VvHDQi^Iqtk z&XhxFrz3VHLoNq)kt$L0Rk4GqB zb(Xy{7&Tol9GrXbzXSiuzpdZj$+DLr{|@~B6o>w&_4_YXCf)zl2>y>YGy5J+_^Ey`c)V z{nqjHRbIi2t=?n(aleH7w{#i4-TlP6(M7`MZKgYe3BSs8 zc)~N02?gAIhBfvZiF2DU=&7R9SrmhFj+M!Cz!v=k0~C;yzP(Csco58;+^qO%s&kxE z5cp+3_#|MyS7pmk$Za}|+nSX^JOezeo=DGc9~RcPi0EN~`>pE{vRuQ#3mn<~LWexB zT!?Fc{*O>A-$cc}Sj{qyLX!{90BW;N{zx9u|(acGUoK}Jh&%M3=K zFgHI&`{=rx2@-y`@LTZ~7-R9OKK~UDJI0|gzK6)n;^+m@M1c z++6yQQfk&glI3t%vh+NSo66;mP^T1X9&NZjyng;ZwEzs9%!(B}Z02b{-XkWI2L4v| z&AT4c5nj0dej3iHJ?sbE-Z%{(I&9fIEs9ff8M7xWf-W!WpY0RZpI)+AU++w1E@ug| zh#h6|ABc!JWud#2uCLBu6MI+35e6rjbr8ZlX zoYiDdBOMBGptY9oNRd7Qh|SA!P0GjJxK&LXRF zTG>+Y>D}pOmloBt_OHg3EiAA3wWPcXY0Kge6VdLN;8Q$iWZ0=cGkn#(Bo3hC3p(#) zm(oESC6gHh+8D^#=%O`rTjTYy56iqtmrRmDIh(MeKKrYF_iw(9$JsUZDr<5;8QMdL z*SD)#zB-c?xxj0WZ`WqDy?$e1$K-A=AvQ*1$TnhMa*vnS&3wZ!0N=1n5-|b`ZdLYR zTEmOKM|-ibidO}0{sG6Q_3rqE-x1OB15HJH5#LnJ;$Wx?o;T91a%rgs%6OPb1+I5r zUiF2Y9eO#qV{RFJj(ADCwysLMW>r9Z42UK^KGmXK?SUj<*5Ze0x7#O}6Mw*T**@Lvr*RfRKH0y{ zDM=%jW!zVg&sc#IW=w%LC~-oN^@wNG5R;M%Vg#CLO~>IRzVXU=UzGJmxQtF&7Q%J; z<=TlT>TpA6N$z+p8o*N%iG317!L*f+Ox79Th};u?wiT1qpOE%1Z0kur5*hEt-eQgW1B#N21(M67bA z&BjO?^fi8=2{I6GxKjpjH~dc7NjOWs?{+<};mHZ|@0&J&YezBB-X;Kn440iY3Da#b z49{IUpv+=DSask6R8onYDF2aH8SOm1@|Is1H$-VP4PoQ6@ymMyknMwNe69>yIKVDB za1D;snhc$1A!3x=);p|GX1I|yH`macggF7Wgq#Y$9L+>sw5>J|V6%}MQWWBAh)Ap+ zQVRB{Pyeg0zl#m1EpBj;(_{(eW9rIak6hwh=jtGTc1QbZKljU=Gmeg>HF%Pxj; zGznsH!cGnf85R8qMqn)c6XECz7I>``QmSvK*0(F=3ZA|Wh*Q8|nD|%;P=}Q%nuZdJ5=x01FZ2-SJ`Y zIYA}D`jN`Lj6T_x7<#b(=!O{JI*Ai)5s-?IN?o7741YI>*eSVr>M@k5NqOXele2K+ z{SEpE)Wu_sC77=Oh`ui-@Q{3xQjr%@#3^&KA#KTYypYFf;>)_VOJ6h`aUJ*QI7Yr# zMr@*X8PjYIll4(%ARG+=-2{Xd;urcheqaV>$cIpv)qwLPept&hkQg5_?3dk+_oxWV zf=vwDXf!&-RZ)FuE`e}8-POljp4;1POYCKbV_(4NRdZ#7OZSsaR1Ab|Gz9+4|1gnX z>`Od3Ag0Y5Y}m{aLRzs+50j+TjdvY5E7$8p6Ph$Y`T?Mk5ExhUu}>FD(3sw2p)rQP z_aRt@2RS2ywvsr9ATsy#gufJubU*;hlY$+hGAEWyy#dQ(AkQdGH!G==&8w}JXAtbs z=!2L*py~5B>up@IhE8CVe$)3!MEY^>h2+5QGYER)@IV?Vw4MOFgGz@XA34x4q-`f% z?yN79&oY@WB;11N^)ey@C0QBgCItEDp^i8IqgXXiz~fKCWF-kj(`Tny{GFXg3v9Hh zf*Kt$8X(&88&XkcZvr|*y!T-vJBTYgASlnRDq2sBf>g4J2hX1@53E*8)yB zY(Qzfg6A&iY}9+%j38wfr*#Af4RY#7vUINLt4+_b^F9MRY=;C8E+^ob5G#oahy=L~VvUINb!9d@ugaSkI6>fz{wAhq_~?_e z`xHlt4?*AZtp79pk?r*Wq-p&ZY;MKwARaKX}k}9wt!R&hj7p2!Sy~? zJ$F5sE=Hkv53rQtZR^wKi zOvjRMV`^gwqW$y28W?`Ym!XpGvtb8E4QsrHNsXz1Xd!Q007Yb_CFGPomhvI7~lyus&Mzs#9tGi{)d(|@}ZYrHXCQm1v(JyHj&u&*Rp z!Y$RG%eQ0|fSX5cP7+pF7GS9|Ky+QtB4QH|cl{fAt_lUA_D!yQPdij5I-fzU<@BIm z-y*nN429b@$%+}OZ~EJ9hTunF4TYJRdi*j1K9b;?9vgahUjwaieS-EdqHd!*_kc@- z(WCF(qf*Qk2NHcBwtg%jVZhHoR@0QzSC%j~-c2fwWROb!UM}!REy*_NRiVPvjsmN+ zzeQh0^yniyYThr!12%w#)(`U_#f?R%aq4Y<~qyAB5}GPVcd>f^LRQ5|N#pOh0NwHZdc ze0{75p0gMc>AG7eE_iV!P~Q4{(QJ8uoM+TcC5ZS==m`jR|?lyL_8zJmUg z!Z?i2D~e^b1}t)#wsLXt-|cA|x+o`h%^szv@P{a6`i{)4`aVrM`k=kHk}0r3i2hWf zxLx5A9?6OiA(1B9!+{=C>783F;7)$00ZOROFdcJADgXiu`uCPtyM^ZZ>BE+pCE>_04S7#Cva3+LvDq=j7}Tph7PS`l82(I=z`rcKACeI84(bm6&~m~7-qAOx zR-E{rFFqbP)kFm4)g{O#HpMovI8C-O`;2p)y{&}qt)_K}7fxIvkK{c`WA6us_#FsX zDR<-o7+qRWdx3gZY6VUDM`A3Lz2p*@$-aJ5@nV@>pT*9AGP|3QxwJ$Mg zgoACY#)J7-0TPb@VpitYxtjH4W<29lp#vA)THcF!=ZkR0l?c-{LQ^cWv<&4b+-&R{WaQlifvTkUAbqLf z<9P89B7XvhZU%vE%JtTV&R*;)*W!xYYd zv{m{BV1Jzx--#Oj#$dW1KeVMm$eBNxb&M{rWWmIMT_NC=<|NF{xPpw|R z#S<%2F2}ZXLmfNw+jHyHSYPvY&q@#a7Y&f5Mw`3dM(zQxv>QB%4hJ=2Wa|$p*LCXo zID@Zm^>s^x-Uy+D{v)mN<|f#UOXBu#u$$^8-1Ap2_&2=$e-W|&TQ&IK!S5S7+TY~H zAEKbuU!vg1U!q{wzeK_J|4kH3OwdoHyI~5F=l6ViA1$c)ni4=I`~EJ&rQ&G;9J(EtC`#$&cXuag%ty={j z=yd7m=&pmQZT0v&My-Ze^Xw33Z)N%^C>WpQ;lEH_55oC!8;|e~sk>kZhw46#3ByfI zL9tr|giWz8e{AExR4Kl?24Q9HU?hGJXs5ab;g|1E;aXRVhun%W^_V;lNx@z>Uz6)z z{k{U59uJ^9gU=rCUz2E8wO&iBEk@~8Z@*ErgJ*5uEYCs@o);;hs_%}&*Elr*Or>eD3F;FvKYWP z?pmiKAz8JYHlg}w;7vI}UGbwJtj8?wedA_jGookok?y9ZPjHn$RIfL*K0S(G6spR9 zB3MsXOkjfvj**L!`6zcQ@+J1Jxj8-=2}!f5U)a0-3cT4Noa7$6hx(r$&dHh11+1EW zn&zeZM99$_^vm=`2Hsn_0-|cc&-!gg3+>Jl?ZE5)AH@ou1Yr@4qUlfO=xgdT<^%-h zcOo^aZ8Oa6ZNAd_mqwuTvj^s5wpKiD>gX2i;7U~O*VT$!mYqoU_l_o5bVUW2=pQ)l zN0k=#c>bOhv|aM722b{KucnZ0 zv5Cn3P_D4qP(bs(s`AjgAlsVDCf{XTNN~{bo8M^M!E(LVQ7MsblSCT)i%hxMy@LmK z-!4~&&NbhBXyi?QtTracj*p{I@KWf;X@vheO~~IEsoEc>AusyZX{c|U<{$Cke|in= zzk$+!C4~R&HY<2IA^$BR{P2=W8ogH9MTW1dUfbRDP}^2y3#%-Uf)q*S$=qfdT_lN z#NYFgY7dQ=q%ej%b?-G&0zoX@5FHhgm}0gBf0H|g3O6hL+5UXdJq}y*W&TT!! zeHtNn{zTj71Eo(|#u`Cx+WX-9f3Sj6RPz`;Y7adM9GM};#wT#D$NX<$QABAZf8~S{ ziVZvlLo$lZC84u48}~mwFLuDo+N=x=Y+sB{;(Xdlph@Ujh}vIWbNcz40o^rufe>uC z0DyeijC2J?EXk;fzmI)~yH`ll8bo9VRN54HJ48If`mRy7zmgiy*) zG|JxI{G{{3bQX^2){k>ZUy6#v891?(T%ga+zf!}cSy5jt~Y#XGeHY2J;_5CJcT zC6UE`mI!eY^?4vCD!8VfB+vbl=!fsvxJu3##;K$xgD}ANH@dpoSnH8|3z;6vX>RU5 zbN`})lA31x*m}A%m79m?bly!A#(%)>*h50ZLo{m(}^@;z3EwaPJ0@D zs5tMF(bV0G58K8y(#eXvk_3z;RYd2%|FUQJ4Y=As=gw8dwJC-uWzp>a^`&V_%BpR^PZi|~R^68N& z+V+hl|KbycxuN?OccMQLzcW{+NVy%!8uP5s8g$>atBE5DIA)K**(H2&mru6M#TrDD zkxa()oCLtKnk@l+V9=Id&ZT2Br5NJCC;HZj*7y!BMf-^UU;O%6)GE!n^3*=#~kRvWik z5=CUa@1{<_Pcx-e&h%*BT+3YBsI+BX&ia)Eb&YuL9pOIoy$$uzmRbb)HQ-pO$9z;Y~=L;n1T`Pq3~Zyx7;a}PT> zn8UHj@D<@*R^O{q$$KO1NQ8;k_2W4p+I8~M%H;oJ?X9EQ=-PLG+^x`}EmCNKqD6{Z zDPEwsyF+o;;8vtSDGtR;aVYLia9Xsu1`iNCA)LVTzRz>s_j`W7b^bVOR@TZSnapJF z?3sP<``VxDQ~kb!p<#^xn=T`t2BJFfqS`i@eAdG_$;(_h0Eiz!)i>l=WO#k@qPA}c zX5~s%Nr>Rx(FC*$vJ$h{I>1bgesowb|Cwn2cCK6vJ8bYcUx8;?3nn(4#PVH!DzYp5 zW}Vqs{v5oMlqYehI5i9dMGK}~dZ{o%*hq)Xvr(nWN5BQzuOK(#tY5E%*+_?kfApeI zbZ85+Ze$Zd%v%YiVq+jN-xF`9O)I9@9wqBK#?5$tsLaWoT`ImUw(h__^^3yVf(gG? zjgyIdZsQF#p2pFStz6%OeW-weoazF|wR`}sg+@S))?59)j;K<lV7WKz`0MXPeVkv@yEDk z#a>-R=}p_PhDgWOkM@DaAD+mL2`9Ksdl7-9@YFty4j!jzF{-A$VzQ<^jxLRkXPeD; zjYl#S(4_rYZyCFckJDvFU@3Urljk z)#)g0{&2i`c8l+sAR4s$yHNZ=(-}$amdT7ID4ES#%>8|S?F*;v^sMrloc+k+9QR@a z66ELNXpu;dXi-EM#qSLF1WL2Lh{v-(Jg2#TU0e(0>}Eb0*fc^k?wUL6&i2?XE1%-I zQ!ddrcyBoxUiUP_Aohl&0W}hV(_C;m_tOfwJGwi`LK}nUlFLM>KMp#`vgk#PK>D(} z^EvuCQUeM0dz5cryuPV39o+t_R$o|K&m5M~l$q3or-yG0lKcMWcgYY#yrQ5>JWk|J z^Y^^Jf=hall8{DZ&4#=y(Yfit6villI)TifHd6J1Hmg8vq#wv?W4>(P>9SK5k#L1L zw_0bPXE(AT)#a??_*7t=*JYD*E{XCKIirhcg;?$>kB|m#Jxg_2w(I&a@UXpZ6yvM$ z`oCV<8}!9UMf!G*Rg`(DJCS&ijr*DSUVpQilu8nK7qaIJ^69hZS#ps`Bm z4^RvFh%z(|$^DL#Bj|oj{gLtrb)b6a{ednyhAg0PX5Ek^F}+8BF95FFfh#YPBHaR^ zjX&T&9w{&W`35cKP6sL2fA+-sBIB`&ln7}^=s<=TpeZazn|&EeuK| z?*g&(f1>Go8@Rj}|5UGHZMH=0R48TuB*}Ad{w*hoQgIymbFH7XNvMar25pe@qf5pb zio%f`g2vDJk&8>;7$~wkD8ulAruP0#F8jvLMBmfM!p?A$qzF7RZ5P6DU7U~PZmsU*At+>)4Vep%%Fq0M%j4MlEklyRaao%p;$VBG+UD4w zP3Ee)oq}F?TAljw)Vv#H{dkp0?|sC(kirIb%ApqyV|#1q++*}~?Yf2DJDYREaoG2u zu>N^QAAY=)B`&LXgwewhz(x??ad|9m&RnB2=hT4s1{VfpzF+1hbvik7rv!}i(H}|q zSYJaLww@W`h);ATT;`ic+#gF4<|xeGTgWv>yzpT)&d)rW`x0G1)pO2dhOxdisUC%@ADt6% zLY9)7g@Th*vKwO$hWw`*TSNi26=%iV9T6^Y`LG}F-DUdZOb5~Qo0bzA6kP}&U6G+p z`9Kh=yR(O$cKAb|LH@qaK=tVFp7uSu`#;lDC-r~)n*KXG%|%8E{}1V%?bpUAPF=J< zgP%-fQbbZ`PSLDB6Tc5)<(Fh-Nh-tYn$OVx(%zk6|EaV8TYDFDuf02gZ;QDe#UM16 zXdI7d5wxgxokV^x6I`TR*+~xGp3N7&-y4y8LTq1JpCrOR`c&_gS=LisL11P0 z>ZN1p?7U-WjzVh{nPt4$YqFs{w3TPwXm0AfZ>utyt+JfxOb$opfbF*;q7z{lotG8y zQZf!SJ!YdVBKiMD5N;(dArORmPY6Yx#5aa>+43In9B}b4mdx%1XbJHcpM9I`K>!Fv z9PX8t-Mx$=lWLUT_@lBt!nm`YG*NkE@<0Y_!HoJ-NNfo^TR1uIDjT~sh9^iW3d6AR zKdeii2~vn+CsjE0aGix_*sRSWl$N)&-wI^r47s~qdAp0e+SNz?5ag5yiD{JD2KX$f zvtInjK93E|JfbSu_07ErPI9LT&`YJ^+r$s3xO27TUOulNP}k0w{&d53#sP3gMf*uR zn9)gk_0&c~4vu;wGz&-APFPhVVt)A$^T>yozrT<9GxWb>em^AfU)k0F-dX$~$yFXQ zQsiGzZ;?m6$4(*)7%3m2OMIxWns^*d`}R0dWoi|@@}z>HtBhgwMPsRSDceCGACVss z8DiSSjH(cop7U55iDGD=@e6)B=%|=07s(i&0+!M9ci(-*Lj(Cy5K%`?_-eKwz_PjM z_h)p$;f?=Z!Kad$7YodrN;S~0N;)#WU&l`4>9H{QG>|X$A8kJ8IFOp((C!YYA*XYS zU_w58QclEfp@7b)`(8&+&bQ9fGlI}9j{vK6->kZ8VPMB;!{c&d;WqhIq2E|-wdHgrQIhBa9+v1KyzD&%^Uj(t~SE(F6`lvh-d5j_^ zzsQvSGTvm&JP&iF{N_#E_5nejlu~Xqr?~0fis39omS2iAq(hJ=e=s6sm;P%$(pT;& zx(M>5(>d0{4{5Io={Zj49cr?V|Bxpg|4p6@dLU1}{V(z)SltS?Z~tH9$+xKp^5oeA zc@pIz?AG?yh^eb+UiV?gp?(NE|9#l0VSk4m=Yaa254DGk)46Hp?wy(73Ua_?Xbfwy3RtA_CId-kQWXsd8i5Q7sTok2nooup)-n1J&%_z(ec`tVr}i4VrVr( zJlGHq{?V^~LQBji0qHNs+Z1BE#iU}pON)guNl~h%|uz!#(n|&cN zq?yKcB@n9Gu0_>{?O72I}RKKzbg^ea1q>l`G;n!2^rdUEc8*s3;!Z!Q>=>d1-w9nsl6@- z7k<1Ib&sB8&%ZXwhhZYnlWnGBKnnOrw_DBp^BIcrj^8^01gS=$p3^%4D?BL$M}GNW z*NGjdJy!=dxVh=&KA7uIe3&%Ub|Wk?Je~f0H$U+SGZt z?bx_iTV1Is+;fsVe{f};U}&^&O_axCpL|!J{U&dEFI4-dxEUFB%tb zOHJmL39247YZ=%IB5(9d@92iIs6gywowJZu`=f7`mcgUnSMre;-|i8jQFBKxv^@DF zD5CuZ;I%&vMn<*GZLM8HnHI{`&27sA(Cs$& z_VK;to;DJ(PcTvK^T?Pk^Z3qB`@oKb4y2+q!3qS0QsrS-;;)&G_fvt9>D~Ty-Qkjc z^v`wY-*!6xarya2?TAA1ulbIdMrBsh8Uy375ah{a6WPt62&3dwW)wi{$0tTU3y4_lHbAA2~_N60+q)9?v@6Cm}2d&SM#3Q+iATYI6#v% z_}vCGqseutpAm!FO5*i=3JLPS0 zzBkYe%W;Jxr{7rs*y6Nj+m^qh&;5_8*Clc;SY1%=4igX z+!j0bUVwm`?#4&%MxS+v-BrZjjlpP^0?gr_6?Zc*g}8xu5fC%q?=ms&(G9?xQTT70 z>^sKau1B7IJOds6>9azj{*xQ9H69S;zEU#<~Fvf-!RyJ_kE@f|~Jx8XF|({i@y$q`o0UkSjdOYQD)?N-vBr! z?@IPEUlfe1@^s~>;>1f!I$?3r;1EI+XPV}Y$t`E_@+A65KHk&!@%YJ+_)FgCop~kn zG7sA5-Fk=00jSgCX;4f5hJUSV0|GAjg62;4@q7d5ZtDabX__%=GmsLA?b{H|}{?oISb{Px|!2~AX<@Eaqq*3vxwJ2yC+5qO#D*EQ@DH8>~R zr`~y;YQHnbfB*KA3*a2Rh6g;pTqyPy zGm3tGSGNn;PLDLbJL7>kyFR|vDoU%wEIPV49cG4HPdB2)7mr+qI8($G`B5wCM^_g5 z8RkR{pLBg0hkR{h@KqHBR}NTQe;hhL{-B@kS)|Y5yK(AAzvbieoP9DvwW2|9gX>VP ziCQex#Xo>;%SR;LA8aHSajWm3bS>)Vvs-c1#44uxTlgRaa*Xac zqx@&$CMOv*W;{}uP1iia5-Ufa?U_rIANLLRHg-08yazIYmS&@vB)#wb9XFyPf$8vtW#wOyz)G_KDf@R`dahc}}U@ z0m2h^CnlsW>xwpDM^fejwT9;GakwtWrRW`cKgM#^2H}jeHpr#RC+C37aERY;tHWfG z0sd?6JS{4Zn|csNIV_lho4|4*VenetE11ss%Gwi=kr2!a^cuRo#9OX7 zL!to3LGDk_M6Sv}Wd2gO2zn%dRMeCuOv@`DzPis?V`kdg|0k!>gzy{&CG8PU5JaAr zj#gTW@)ZK2Vv9C`j(r&VCjqa{@IZj#Z~_KFR2i=Vg2}Ga<;=}k(tyJifQka*ryRq6 zzm6jS=XN{~@ZbP|gu+C5n4qQ|wC97jVJULUCMb@0ZQGtA2fd{Um*Qn=pad(zOC50W z)C*x3z#3rzJ7d=hThJ6^>$>vOt60dZeasF?3ofa3S||!`>cCUWOxl-NYGViwSpolCc7G2jfdXVCdbj7 zd>`Mt#m+G<;3KDX4B&Wz;8$cEOJpg9RJNdiu?h?krv^tgrx)bU6?Hvp!BAO-4+4s? z2&?iP58f75tezWG1Fm}F2*!7gbpXY|9f_Fx1ZVAPn8w%Coh)F1J)BKL$9koY!5xnU z&!cHzJ&evJvM_7aP=1Qmn2)ks4;;`WpD{>rM_+TjCv(-m^C#$w_7ab)Ml%Z`x|d_7y*^qbTR)461S};=xO%u(k?iuQ27A zQIlaYD;#&u4|`5*#rj@bZ9vaRU!|;*jAnx0c2CNZ`j2 zeCr`esbrub|NA`xTVMp`*PHE-+f`5Eb0GAwkULNW;H~E*dPc z*RR`(&#|HeLuK|n={Y`o5vrve%ibz?#|y^#=9Kq%7s;MKxy-)VgfAsNBe~>%Su}Mc z-t3F+GM?1Jiw$2*x?}_mcw1g}iI`<5UW4S1`GI=OU=6Q8<#x#_mR9GL$tF-M2S3@7 z5c#?G5%9x)lK%&?MLw@E%&UTm#s)v5RkBd!<=WmLv35u%mB%UeNU>n1RkXT-K_^RV z7t0`6*$Z_o_NE}NL}oeXc&MqGzdk9%fAjpAop zT^uq=_BHs)pVLpCKFc$lW4uW?NWE(B;qY??+fiQ|gwlY-MTk>;(9HZ#DJgTNtRyb_ zE=jX|aj0>#ON6dA+OPn}gz-DQeM$xxL7UwCqQIPHb0glIqyz2t%PF!B&xy51*%NE= zjb)gc7r7_0?Taj&ed3dAA-AeI$LNUjnjyG#D{DY(l}KjVMhV$D&bFYLlAE$xb4|Qd z56DrqIz}~Gyi5n*h>Qr&;0_IeKWU4NgoJeKnH#!YP(e5RHIIZ^yJ^m`jao6k%fO-{ zL}pA3IPv3vnNC2l3oW+`{B90m#C1q;5RB{<+7XFqaNOTKhu~Y5!r(FZ$<3k4UO|jU z+=2neL(pWe7|d?^{aK&)RCrZ{#L^st@SfabMT2fe;U0RAJt_uj*+rZ+Uc~MnQ`8bx z`7y5I8g`3y(QMG3M;rASMbVttiWK1!%weX^0gS7A=>2kgNFtw!<|`>=9)~c^NMfGI z&`>4e`okDI$ra@87tzmxQ0w-3)v7)U}81^VV{mfsc zw|{@UWac@?ItRRfW2}nRM*)$jrX7n3x53As+Hux8VAS6ub$JPWw?xV7#yV!SP6jY2 zFsnm)&7NkRP8@>0}4SBBFbhV@Q65w&cDR?0ZTZea@>{vn}IG*?dmv3OC0X zTvbVk8!wsFx9yYl<&B-e&WA;O6v3D*r=U1b2>Sn96k>v=cp}nKN2wL;a>Po}E>GjV zesSFO6~p()Ru&410lPbsjH1`px_8h9z;!q%j(7Br+H|JMGYay5Elhat7k)hx65--J zT_kLxuM~m^y2XWm785ASir+{)p|w(o6!ii!cqhE`5SraOFY90(wpmXxFX#{!z3{X& zPUE{-9jjf@j{h=tS8NjXp5549#;E^~r}shZQSH~-^7zUrE}5leJ)jJWbJ6A(%Nlp$o;L_-)VQ5TwGQ=+yn~#7QhiNYe5mmBVOv)$ z+ok}vj#yfG603`092eKooaNF@%VZ*{^JIP|B+ur}S*3OJvVpbdiq1yttwniG@d*-{ zoPw9q-W-7W_qCmC1(l`R7}b8wf_7vlG~EAJq~<9bDE2VMu=1Dx z5i4l-wy0zKM6cW;ks-@G!L`nh?#@_D?9!8~)H9_<_5{Mko9uMq*;9-5_ia2N^Xe~V#rms| zf*bCrEidUrlu`DK*$BU+149nQj!~Do{^o%8O@1|{mvSzzKn<@SImm^UB>b#aR`aoy zb6)H5CQ%+M-m>vd%lx_n<5NOQw-*5qdu@*3Lv0O{m_b8J$BXsJ!?=l{7gjI0ffT@~ z&unYy+wR@c-%ms#Ke=5+$=;sd`pt$FGbqddY`?^3v+5xshAa(Td*khr7FYJCU5jX2 zAIcf7>?>QfmE5U^ZZ$L+d1;!09IqRQuWy9U{VNp#Y|K9^t0$V*2Ue25emYl{A7hre zwbFXC)o}6*h?{7|u$>RgZ0ac16*!+dh||k119|R-p0R^0{T!4S8sviYhL^_MvA=Xc zUbR(j>yQ16>jitW@KDFrN{vnOFX|^PG6^t2DWb0JY90lWR<%Ri1VJWN zhu0L#j2T;{?Ky4yXZpzIBYSNj>8u{{FwrdR4w7!( zsO^`dhqrB0(iQu$N;*Bv|wKqa`Vy?q_*H^xG1x^Ys($DqeiTid-b^JDv4d2vH zH|X2nx(@C8M8P3|vC@gd{kOxvKjaZnJSncUv^vtq8gAJsyD3i2$h!33%ONSsEN#np zLp2|I#L<%bZN(Mg2JhnVQdbREFlSswG`z+!ns1|Svt;qj$Vvgw_pnx!t^Q6)mAZYq z{y5Y;x3#x;#eRQZbUsb**<5Oyk-b;|^&ZsMYvydm?^z$;8Kq*krfJik`D`_Z*kknE z6K~Dam`%B;>k0*)BWKdRv#G@O8%q04+v_wYnqfysTjIWJoM9y!h_p?SiTm0@PL#SO$Yho?& zS=!Ce^!8jfE5@(0DHwsfw_>GQ`R=8^&}mIA;{aoirC)`@=DsldDNJ+)a=f}fdfIFV zC_kOJ2^jmj^0oJL;j4Ds+YB@R_(}7}XTK8jT(%91am(%B^f08Mb?0U^^nbU>5gLA- zPMwjJoYOYLdDfhPUGCVL#sIVdel=ID$%35S^6W)m`Pj)Nto?@Yv>`4rqS+}~zAP$Z zh2afmhV+?oiGm{a7VN;;nX_7hcLBd*dt&7_e-3&(Uyz3ID=Lp}jGJaX-fs{nj*Xfa zo1fTxw<$Ip5UZQ09kXOD_lZ9xTyL<-ooJYSUa$Je)ZAR2M#tVb;*G@CT#Hu%* zbFPW;pf)0pHTsOY&2d;&lm8nRHUZme^Sp>0ca}^kBkR%rub|1xE^2C0K$F4e{rA^D z>Ey@-1%R9Qcy(IZhEx^8GB4IzDeFN3Kh0CkZkHU&vVL;2wE~VE}L93_0hL7H~wd7Aipw_nG&T$sN>il>Nf!o1NrxsVaRX#{vODGazCK< zpG7+aOM&=dQ0>1fc1tKo0r$0=dp)V?gPyeOK~FmLx1Ln@LwZuugGKc}g3?fwz&spU zlQ0+$dKKOWdQ4Ojwa2pDpGW&U(Rfy0eC|UxNA5eIA{Q4Q4hnK+L`^~167whW;*~v# zdXm=1IwW2jr1}bv6%Q}wt`p~H8JQ8NW-EU3=e5sw8gr~j{4bLzlts?sNU|tFsG%5w zsS+eFJpwuK@d%DHkwZ`y`)Q5c0$pEXjqrEEY0%)$j8Rz>1UgYPJ@$~ewX?dArK_54 zpj|`oyTv<9R=~$Q<*KXA+m+56;tK#q>Fm-Sb=mPSJjM9B{WiX9of7I8d_4+P4&Hs5 zv2V=CJtuj^ctCebbx5~&cu04XG7ms1HLHzCb+jR@<`{r8&ShR-5MAoK1dbN!gjt_?b;6qukgzND3#vj>W8MjJa()S7^-G#Ao_Yv3TwI#2kA^=vsP|g{`s->GOpI{-sU8p2xou-_WipWg4ztH9?N7s2Sx9sayxZLY!nx;)JMukK%m>B}9 zIYxQBEn1zj{ploqHww24FQOQ|Lz3Q{Eie|4od*2+T0^+3+1>D?W>~a}FQ7XQQ}?3F z;nnQ(BDSBGv!KsLKd(Fdt=(V9$iSJQALukRwo+sc=<&yog>jRrl}ENU1-O|PM78|n zwvv-8F8Zu!sM9Xv7uuVSzD38Ve7=nd2Hvr3dCbumRdktk6eYgQ#-P~i?4%v+#CeY` z-ia5lN<@egC`H)l7kGmGt3LWb`6CC*cwL)EI-s)nZBX69B8M-^4^$5^6G78jL!jL_ z*brMU2h3g{6MZ_9O^kWLV@O`}4uRSlAAA6{IYHQNvJxZ#z-){QJc zLRw6JdxdB%3=gd(@Sh5|0HW^wFM~bO`_}Sb~}*qND!>vyAs$BNzpWBJlqB)uzvSoxd^|%NP!kQZSR_8O;j$o%aQlf;U7!G!4 zRZYRj?iv4qORggONDAbmLrN_Bq>j4%rq2ctg`RIRA7jEczG_3A0GZAG^}9l+S1Ql4 zQ8BoY6}dx60yQLp#KEHwLH%a@DFNQTU;=UOE^JGMHV$F7U+JH3YR@TMyUlH1t69Bt zr?^!ks{Zwb&P2DEoo)34y`aF<3q6YZ? z-v|_;HQv^7^`G-48^IP|TYQ0#Bv)o$Nm8s|lt$<5E6NkD7=8G2z4!k72oiB4J5U-$5de&Yv-2C`~1CI%h{h zW$7NZRuH~h)N-CMz!{eSpwL3L%d;k1U1nM*&PZHJ=vSl=*w*+aoIRQx?xKtz$x*Js zNRJ_nlicgsmd-(xAbfs1W4I7)){;bx{g^&n<;QHfK406|^C}60$E%QOX!K2DyP2Nf zYN0!f50U<)Zbszq==?TVGUbr5Dg$n$gr7LM_GFhqZ&MfChW?z+L{Nm}*xoEYNzH|l z-?Gx0Sf0c!7FVjiUJ}ZjoEM0O5()-}!+-Go^@vO{n(7;qWGWFwXoScGvcqkxDg_6n8P2vB1tQ!v|S_-jIjd zH)TQqP0=N8#Z~Y8Csc0(?X3pmrY$bR1hYxkml!M=e5N{CxJy#b+ON4{UM#d}*8zho zB*7ETLF87DH|5e z^qJi_xAjJLH>AJ!+U7a7wP}^?LGP6?rg-^T{8-z~Oft zEBi_G4oJ~`DDvA4yqLzl(uP1%V*JU<3KrxnQ2q9%t^8HUESWkllSU16iDTVQ+E4%&}T8rNBf}16$e*Nyqlv7&K02n{z)(1A^ zWb=DNGF^U8FlM1*pVJ{+$!t*~tG|&~FxHt_gy52Ihsw#frJXw7S8di5M%GNa(Z93L zc@$s};=F&Z9mBF`8zYog`np0szN=BE8E0c=S3ZX77jukI8T0ikcl7?zDY+QEQWEmZ za7}VgS$d^HSZ!m+(%q+Xp=+0R$W3UAxA$8T)J%-c8=wt$ zqmcZVr)I7b2g{fb`TJ@^w|q}Vh&1>LNT`*aW!-^P6~Gf}=JB)wz> zDlb0`L~j*duptU)l_GtETBTiEjrJG@YgcD=q72-UQp!AMWzwz;)Icg5t2zA`A)(jh zfnK%|!JD3JC4?s^yzrzdjz+MiOnAX$LZiw6dH*UGT0_%pVej~}=Ua|wkjS3_@49}> zw#1ywirj`I5-Smf(y%Z{U&7BhN^@-p|O6yRR!C_R)-IVxKoArwMg1}rd#s_AzStLFwU~U zQxvx1E*JYIo5>{p+ux?~WShIi2xz8b4ZjdG|?<#|@9gGO`zlkv*OH7V*^8Wti0NM|xsT z(THzFr=Uo6my6*?YfYz$q$gxltXeVnqc~&!qtT!6zveunN`I1>14KNxj2WLbRqMnV z0~`1CVGILE?%xsXN4&GW{21~4;}Bzqfh2YAD&_MjgTZv^>aInQnPhG7Qfyh{obi!D zb*@g=(dU7oPq^E*k~i1Ybhoh1&jIP{kZ%YYrMfih5uK#pjr5NCQE~W{-}vW%oA5IT zz2vFu#ODBqHw8Hvc))RLNxuuKU*n{bH#URN@FV;1tJe9LfNe$Zjty5yzw}dIuom8l z&7iyJT@{_EqW8+NCb!=HCk4Bg$`=J=?d_*u> z>Wi8BuYcy}qHBey{?gK|9r4}GFQu7TVbS?SVdbtNzec%vv`(Xk7FkE8Oh`bm)UC3- z;M(>UUiO7Uu$+S6&nsIR@E@O`@jfB~$M3ZVe9uQfMsu}u8*|?YE#%(r5Rf8gX=o6! zkqtp#l%WTO+*%`{;4GL#^@oK*aY3&JTv&zz4(b{U?M`(K49`17|7^ zihlf2rF$9O?1PLBp`T>_my9m$%8SkVwfc&{FoSj3W~_6hiq8oj9xH zSne#3L%#+eb?vl%ViHM!FHdXmST6NEthC;QR)2vsV5x9sngd06sXH#6G`p1ajUu%- zBh(@4a_TT=NMl+|#P-#jn;**v^`s=iu)FBNu)9p}c%c*4NUMD8dOKcXfL-A#_`&4x zAH(i%=qlN0^@COlrK+bi6Dv&@go^r>eu!W{@Vn5%9{Ni6{4Qi^$-jgBkbVDGKH;SP z|B+50!X5S>(#b`hf=4P;67$c)W(FIvDw7w3VwWcs4Ljx7`}E{S=un~7?{I?P|KRco5^7gt)s1oJV&Ty&n0$* z0fwwH@)UOT8rnzm%bTbwXvixqqNK`;B2wY$HPu}W5q28#*O^hSKz6uoKJU2X2qe;u zDPOZksposHfZUSwrQn}j(R^quHK(A-S=HpbKe>-cXxydZZ36q{&O+(mH+9S5PdrBG zW<$9v{?g6Rr96r71HeieD9E){kzOR zF}_LD$nkYLZQob^g(c;F+lu`$XgonP`7bOf&1||A!kHVj;J$6+Fg=8u?>^kJTz`if z6Csv0a&~kgRJCxmF?Tn4uRN(*fej=AJx7^ zp}R?FGD(z6_Zdp-gV%Z!rJO0)(A%6lcEwCInF?DpOSJ`tJ$%{ zD*XDIZrGCEr#w&6ccpdRX>?3X3TD&7kAok>%hPqH-XEI0ux93@ZNz595Pu)2fyKO{ zYp6}CnO^It^%e-<8C@XOTzF%z!o-q_ROD~<5q8=?@U@`o;F?8rNelt{S zYbrd8c2M=LKM~oBD$^z6p^x>mdg@tELr!nxwcOlgLbxPY4Zl8xu{K-Cy;7+!(d(I6 zEOPj*A6t-tDOo;FoHqzPH1m}2kv!FG)m|c1kub==ReoN&UZRizJ^dmWq1WEdEGV7T z2l~=yF?9kT6gKJ?+N(;bm${r#f$lFR%cK;jw0JCVN%I{Y?Lyc`3*H!ozxCPm0p+D- zyni(H$JX#EbVgz}-N@nTA<^X&hPRpMCDTktSAp$x8eP; zgwZ~;T$KK?388xh@+V9_ZccX5v8r?`DPxi_^kt{b@tt|Tk!3Ro_AO(&piDRvGW!7I zrG;LG<{!(+tZ9XGdm^QEa6jD=-DSEgm1qJZ&Dc>>bIS`aGM>MWxWZ2$*I<@PVQn zY2;fE2TwfHRZiEWfy%Gs+hI)CrP4sFr}6>N52yA69v6;pOCsKXxv_p*l7c8w>4d2& zvmdMrx4$iEc=zQ-C`L72lIh$=szeJ@{`Mko$`wuCACy1ULgp{Xp+q7tW{zHUvKr&y5G;|{81MNoL)+T*Dytt*f2T?E`+QSS8xu=rq;d? z0HCz6YRU7oQ!2tl7T&@Y-Wgp;;#(_J>X@wCIZ#E1=PSJ)V||FJDN|}HJm)qRi`??W zcJ7t8soOSeD*oL9-lUjw>y;R+4T~J9miC={bKwK^eEYqm_!CDaxFN`-~u-Dn~tk&jL8d+KQowNIN&*K zgxzRfax!!GkEW`p`(+S(u}O@TyON|lBiDAVTKcAB)@*gx3Y7v7-KE?499!!c3g%o_ zQF_-G`Ie3B^Q#b4_Q<$+9fHr|+YJ}C;MF5`t}|lrW7R^P_7v7p(X+$?14j;tKWy&5 z4i0QCGp0JgN($G+m!HmtT^S4gl`oTcK6(rkz|k-3zF0L$CIb5XX{(u_-`>xE-o8wn zaip_XF1Y2JaJEU27lb4IfrsvZO+-tlH#&ufL;Op+MD1`P)4Et&&Rr0 z^2N+c-A6oyERJ#dQt%&Oep6vi|{o}7w5f^1n=PTP`Is0NG)6j+` zul~04qq8=ARO#l?*rvsruC}H+s{s`tg~RWnpQ1}~$xVDS0Fm`6Moj%B$_^8;29@mc zq3I!5#?n3)IKd%gq@k-k#oMycovVXOiyk7lYM69==4xj_tx=(Sv~r+1>~FUu-(-}l zM|TNy88(N#Y*6nnch}%D%=Ojj2f8Hx>HxBR4QO)6{ka0(mTP&${^}fa5s$gjwJ&jH z^OPYDSaGT~N}lMqB%gTG43+z%g-5?@lp-f+h!4DaVju@@___&q-z|VpC<%7R|GGY+ zPXkB^?n3Yw{oCb#ftF;Z;lg{rWJPS{{KFG{coS~e7|utYpD!uw8OW|1B}g|@*A?t@ ze{pL|mz{N_+x4+br~n)OI%hBNX##NV29V1&i_Ih)rC9#Db>-L%_>pH{6SwmDs3D*L z>PWpCAS~W2#w~YgN3jcEl5Ec5mc8^8-3@U3CJiunl_<9okx;(;#2{7E%5KEmTe(sQ zB*J#NqSlj4=J$F79-It7g*k_G#K4AepUNp-v}JxbqM&K(V$PK)eHFV@T{m8?rYySC z#v|PyDFytQ`OC9Te;oydC=dya76}Q1mFv$1~OI%xYEc|HFEZ_}`(;j6n z)%vM_2y96r2CdqY$n5;&_O0$6Kxm<>%N2xilJH%BuJv=joaV-3?EbGuzx}*rH&}0D z1uk}J#boFX%f8Pjm(FSvpRt_sh*jurgnsTcR51vWDD;ljs{5*(S&|iy0Qh>e=9OV~kjSIk=HXvjyCyr19g!&%y z|K%zB*ZIFv#@05g;AMW&>hlHW4Unm)Un zdS>A4|2gdcHhQZ#SRc+R`RV{{&89Elux{a8PC#6j4`mMwJ%-arrjhkv*0sHGOuwDJ zJLhW@>t^pA?(>K{OsO$WrM^r}8O1THr-ZJ;Lnmkh90Kh?XXfH4KY#pUswPL&VyVpF z@hSc2d6}!%opA_NyTkg`qhiYT?4ATMK+^AU z=;6lZIQP}l{=!tN{nr*tO`X(h=H9XMy!w?ugd=V0a8Fwk`%sB)<#1A9W zWa$jNH#SRc@qhid)u#*+L+&=AKzJ^oay+E8{tvg*hm=;0`R{HoG2)i`kkKOUpZ`|v z|J?)rcaib0Ztw~UlK;O;jOGs|#<7PIWB1=BM)iLqYf_Df5Wt!o-9#p0#7k+a>8bfh zi5~`))sTje&z(6rUrQlSuk#=A-izOI1hKNy;xbvTbRwbX65z!MQ8Yd!C+|)8XkuJ0 zTQZvhN=0@qU}mBg$)o>G&(DJODie<@mmb(1ZONNia0UWQ(B&h zHoSDsYE(ZPW2Zn69s*nQ1_L=CHIrMyxF7lAj`kRgM5V1WgiKmhqlTHsylA&wj=nZahTCX2ioxEApnnbb`C%?;FeC43p7D3$=se@6yLm>tX0qFfdNFH(VApIt4|~yT&hRTJC>QOiw<=SD z7Iw5S!apf7Z)D2!8)fDRCKnDfyfX@q0ppw{GU^FGC+BAH;S=fV1{`w^)DOhPVb<8; z*0@17mti5;nhnNS)T!jCq#={mIO5pJFFPyp4EX#D4b!qx+~i%z6)LjK46m|h(<+tg|sU-nRqClqpcTv|oK?Qf`maaWi13#Hxt+{E_)uf}^r8mhV866LA!3h1?l5;(`*Fq&(tC0EK%d`covHA(Y z8`A}WuLsX?Mp9TQ-`(jJ^bcorOyTf!RPV&RP}chsx1-Zcs@GA8vb$2C zdi=-+cWUT^T+HKP;C9@%pxY=ebTcypr_oW3;U)P`ADMH>n(d=)lzW*XiSclPSC?@L z6mfY5$)s0l_?{=Ja;jxS^xH<=B1ko$5rGx&zd$u8_{im$XK1uf)X(xKkal`lST9Is z-pW+(T3aq6XChl7e|2_}!cH0roJtfA>0{14 zQUZ&LURr%|&x}W-3jjsDFh#il-QT$J!IKK423T{q^@U6Xn=K-go{=mF=JN za@S-Ho`XsHMjXmc9VpjAAjYA5M4j=%#WzcMg!A!9)Ub!#j7wuXx7~X*2R>Y^k;0gBZ}eX>sn(cDT2{p;y}*7NHsRh2;T-#5tx7K z3P(#GOZD$TgQVz1`-l%Z%Z5{%Ba(GJ%sXx;_--};>>qbtR0bIV(Yo!TGO-xqbtImX zX@NX$xn@KLj=rHoEk&P8y`!Nmt#)4(cOy;4Lmyzjk`XnPtZB3`9{R>@*ekHz7)v06tNv8Lw#vHnoa+5K>++l!fxc* z%bsiJI99V@Ek5ZCThEX2)Ac;l{m*9|Bj4DU11ur+#}|y3N>qKZuA%+qK;xv1pDR3O7)eXbP40GTO02}o>ZIlDi>Il->BiAw zfLD6WPaaJYSlTWQMB@Uybtvu}!@8EJqi|K$5{gS@m$RTk?kn1AqmWyh=vt94v>oGK2HJ3J8VL9`2U?6P zTDZE(GiWe3)EG0XhXC}Y4ia-9oV1FnhOxf6V z2&8Fmqy=YmQwdzpR^}Iqgrmp$ryhFfkw1fHaofeFV@~X9P0Ls`zN6iQ-COjb8p~}_PaS(6iv*bya+N}f4|f4&^;cYlTkM#hLZ=CjL7$3?x}0d2zz^Z*7R!( zFgnZy0WV_ZcY;#H;HZzgd4BMiX{6N+YdTD#=U$yL48EwoXDQ-)?|8V;_~@~x<+kCg zf=V$Z(Zh@5I)!FKIjW(T4f!tC!JlaVL^P!@AKnr8<=1q1sYdEjMoEM{<<7fG*qNV4 zDmokLS`UK*-|a)L-9wcm>_ZHVYAm#c?yV0Qu2;Mrafuo!2^*1xkNCbGX$b8=sNbs> zAb;7YcsjZ`x&`my zEzbXAaGj=vb^Nxk+`B^{E)d%HO%^Z&XgX`}|bypH;R+u%{3 ziRI9Vu}?1g)jb~P%a_5YwM8=;zO0nX$px9Q@%&%^GJ?&SCmYc5YjvZ7-bvf!SRyECw>SS+{Y|L2*}UMrBcb2$kL^E2{_8(^_|M5)8$0PQCYL@@5@!_;Ium753sO!>co_mY>gMctT-OF)7G+Zd^qLFNr3?UT0s~Ue& z{ZgjrYF2*ujK;a+(0RaaX?0E2$Y7UA`s}2W(8-hHt*3pFjTH^D-Gk?D?Xc3`8m7B- z@@z}DMm5bjXYuL5&lwuM0-U;&#$p!twUb=)N`2!sN*~Q!+qP)z=)Sc>tQj#nNLxTJ zNo|Jz=0Aj&bG7Yn@Z;gL9;NTy=HL+pKDy<)8ZzD@w(F)O0S^Ko^F_^t_h0 zDED(70!uoS8~_?qP8I8y%yI8PSF+zdO@3PQc~Yn8F1}&vvu1WgjDUiQ+y1BDgA7kL z_|6?e=aBfz0lgf#Y73PNPH*oZ>)VtKl}c#MFAhaN21Z)H3hzt$EN0nrdYC73KX&c$ z4KQnQU7I(R1md>*#>V%n_f~XBl-pBnD<LAe|(lZ)sOm095Il!;3MLbaRKa=5;+P3;y0sZ8Kg%v}$J|e}8vT z(J#F$U*9yqn+J@3!2L3h1O?ZcGvP$Uj(v=d|M9?Lt%FT-25^DBfovtK1D(svc%+WCQu`O-k_n4oB7A}NEql1w%9|H zuJT@1@_q1yrp;4!NuR|nb(ofTG6_Y$BYr`YZy}XB&Ke(X!%#<8B+Z+e(9))7Z<3wg zFeh|}55MeMm6b>5IVTPnVp5~DP$L!9=RLjf2!bk$rEm-P4O3Z5J9$V&x&1pN;98J<4@m-}62J=^+cd7t{D>Y~|2O6)m}C`7xpDnu9eb<)_a+Qy>YD)isEO>}ADqhces-)OP?Sgbbi@}0>T z1viT`x~?RJ&2F_h0=B}B1X|5v1xc6M?s(i?qDMHV+nS97f`+`q;98taK_3pKUJow@ z%M(msyiCm(AifVctZsYUUqziYh&tY${}2;4Pq*L>R57~ndC0SMjZ|qw76sk+GE6D4 z2L#L22c-@9L3v^|9QPp?1`M-Q?e-xy(tWJ>3)v{p_cc5&1*PRXn4XBka}8)W43YR0 zQcHq_%M&@qzyePPFlsK%(S?T?+gZS~S$K9Ku_~D@KAComylFp+I<*lbxWo{7%<7_k zwtTF6s}RS!BHDxX91AeFEh@P*7O?TG2yx0qouzaPZ8R3JWm|;ucN+sdEy4ti1!(kh z_ZX^f_)i#vOzdr(RYkA$EHrMvZdcx5aU@p{{ak)<%r3V9GpsQgIQ+=lei$?MQC4d5 zlhd8W=aTP;U!rwCSt`zJake2?-ZlJEweC-zohF63PZOSQQ1Vwg2M=lx!OtgwHM2ce z?70iQJLR#*Rb#qB#M0&+lLY?tLvs!fKeM+p>*VcgT1yt{?z`X$wB>gP8G^M&b2pZ5 z?l_Z!QDd{aiGv@r_ISIZx3h3B^W3h-<8C{%mD47$&Bu}siFvCZea%+lO*oJNu=9$$ z#jgjE{r=W_mb?AE!;g_1D_<*L>AdrkD_H9BTsdE$_5hduc&?`x;;>?k1o$_@M}y(# zJU`Vmko?lnZpbusUw;;S-Y~SC%%r?Q4%jW+)+k6L(JyMdM936EMwT5I!y^3 zW8|J^=J|0$oe;!!o&)LbOM zMw9lZ$4j@0u^NBe4MnhuoxGv*;rs1y1Kl@2PvvLSz5w!V!(Q;5y!BnGF*8d~E1`Pi z1w(jJ+i;>^51ruMQ;Q#Sn?l|kg|zJ4iV~U?7W(`#sP2W)0Gn{=gKOuwa@e(Rwgne8 z1qBw@fK+{!Wm9C88>}3+nhvG{$>YH#kZu0J^bs)b>#D7D&{E3k2N>cfpMgHM_&J=C z=acz@1y#Gdn;<4g$>~-UpmeYSH1_%gYY*RaZ7o5oZ&bnkvJ!Q4Srm!*<8%q*q~drVg^r0f^){T;LiL5|Xcg?`ogL$QnF=YXZ|BD!?<$rA z&v)SwSVAy)znr+M+fegT_l4SiRVg)N z(EP7)a(o-(_6lL>t5}DcosA-9Y?;hpIJ3D}d=!sJWFvOLjpp%j@>BM1#d=;a!X^9O z_C_%t2h}R;uWwKJBAMW)?^}fNb!SKRY(Myo{OJ6R{J0YJ3+9Hv;D@e!Lwdzx@KuAe zsbN@C2*u9G9`)%MiV3!1pMDwC%3l(hrK)^fT@ox4g@GLg2au5cpdr5W<22+kgndbH z;JB0ORTH&G01x9EB%`o~XdApAKr3z#4abuyhjpBJ+e$r4Y(|xWaQovL?OmYqp*EHI z0TpVti(evx*|A@Bx~O|qHt`s}8*`}W#h~%aXl(eEJ)2J?-{QzC2YI3?&}^f9n{@kT zft1>5my(=*bn+srTE-0&w9BDZdT6!y%M@Qju*Z< zPUIYx2$Iw`ZUz`i%y4KVcWOJQc9UMsy&6ixjc>kENVN=*DX95|z_~8{W`5|X?mP^j zG#RHAdgGgKZ_y#soqyVpSB7ddD0@gR1U3jow-vVc#J||9d+_g*!GE0({y)6G$TdMh zzGsN*I`ztaUZSBP z17#xOTk?v3-QgFJ_onrj#3QNG4I2Y}gcE)P?LKy6Ti#aK2WShV&9B-y=&lbn5z6UX zJMB=FqaCaRY8#83*OUBg1~JmttyI28w&`XZCwG7;19dl`{B%SKUOSYFiqTH&a4~cjl<8-g+x;H+ZqMOC+qP6f!&=4 z<%R6^)|u&EXKW$iB*O4EbXn5gPvn14=m}$T%eY*qpN|^ zW85d_z?exv%0p{wLdSa>J%B+dVn-_@P6}+~?&N2+ic}%xTXYphlUs~7TF>)@^a!`w zCA#|?wxL}oWyl^*e)Ub|OWkT48%i;^0gqdSQv*%c6IHUCxyFy4JkQ*j?&1Qv9M9Ku zFrPT|rwRPTnB8JUDA*H8QQG^I!TZA+U_J9h$!;J`&TG5wR>re!& z!0JrC={DVN#9jM&eW!Ict8oDCF*Yf;`SxoKzXnzJ^dGpo7GYAGaN}DRzc8Z}vJTK` zJ&O1p&4NFo%rgPUbKUO6nA*Yc;u}NhoQ<#Ek8IsMY+Q!bw9*~MAD5N3%YrF>6DZyQ z@AZs38O^GjBfb!z_A?-rw~$iq?}2;>AJI-To<}#I4Bj~%ypz-h5BOs6)ow1YQLOfO zvkwyCxGuk~GY3&ZwmIIETvFie#e1zM68q39Y7gOu@I1wpxx5L+ppAg#AP{V=6g^6P zNr(p4Bd5LFA$i65$g25YpMQ*qkSNO|Vyq-%_=qx!%@065lszJXr@9j3^_Jtjd@Lz|08^S z;aIiwaln=tF!)69VW8}`s`qKZ5q>ykCt?-S!=>TpppG74!0bc{@Wh4I%z)<7z&4-V z@`b77jJaed;P?VGfQnsz1WZ=q41%p-p^z{`pjgCRmoqIZL{V_OSmRzDZScsX;WBeC zG7T)SVCr)46%R$iU)wp|X%i-SqUz8i;{L{Y;JFfdsJsmzTs?dh8$mSSFAwGon*ZLu zhyO0a7ju7JOoOnj{&p4grheJFT@0h^w+f?vU|RG*O`pvq)m?1tI%H^U&DRB@sC1vi z!220{>T9iE(W%=#SH+q!?Xo1}@kR}2U}Rqta+-NN<%Fld`z|D$lrOe@Rl|`A)?o%h z(aghBBdU=qZ#4$PWIXeA7a5B`Uj=IS;YIhd4Dxm7vPUF>-8vv$P?ax|ySLkgF@VKP ze<&dKdrR6aPV0q)#_xi2KSqSTd&zl0b@-iAD5t@k0h(TN$oLOhcj<498cQ&%HgSAY zbKXuX-j|TQO@N&~PG=&G;nT5U$X01TnFoY+bApJCoOg8Y;5z;qp7dm{j6}I-5j!b% zA{o!z_!i=HhSHLeWgO&|Wu0#fl**SSdZP_`j3D}@=&GkQ?b zL>0wI1=Wuz;%i606;L#lo`MYuF+EslVkai0{Pg^%_X@imo+bM_&otIV zt&$m}Tn+LYkGYH;3GJNTeCW2iM7+~xn(wSClKtxk#~#&9TD!phh zZwjvTbWS#^@qR`dKutQArL0}bj<94Mp+UUOWjDx1v>p=CAe^$=+@W)islyb8xo;9a zZ$RwSyyy+R1+Jde8Yew&{1~WD?ouNfV>+(-oDF=GAjSjidfdjh!Qjdt^L4giu z0WWlJc{eSXjy=YwyYASY?Wb;x5WAOT9u9<(axh#t|!`=UQJ2*?1@C&Bnpl2T%dStn=`+B2zgJ+D# zU45Hv-=M30%Kt2L!vZ}vE7zTL{h&m_CYtEVDJDVf&aIx?JP8CU=&)m5uPk{}%hXj+*KMoOO> z_jo<&om`fdp$GeMFB#l7ChapX(~GX9g1+v4qx5{n&E`#)PfzfuK#w48aJ$Hf z`Rk5|t1+TFEY4c!r|yRBl~=4I$|se1;XC(GmFT$T>}GWC`^lr10>(0GuoKFXylGyX z(~!ZJ72(Q<604K@6MO{+zJ*bJ+$Gg*kjr-F`gQIK-5QB*mjh}|5J(12+w17UKs!jX znJxQ=QJ+3HKi&63?g7pMjy&mClH`{_Rf*|IFYo1EimlY~*sRNu0FG`IaT~Y@R4~OD zKYbx$tGAB4oXe{tjxZ=sAsY+x3ytbx%|`|YT^_3SIHxV~x)&VrejGK97t0R56<}2^ z1pjJp{8J}22m@}-Q@YT%TgaGXw)V9WSHv=cufG?H?27H^`U#Oo+kfLqQ%(Zq+rG!s z|EgeJ8X?G8JF^LsynzmRZ|&>X2mC*|b?y-*_}J*}1!J<$=Yrzj6`J13?EnOG`tI zpOA0vNCq7gjUi7IxQ-cvVk-Cwz^jE!hGNR&a&JNU$9mJar;~&CU(VTUZ77Hs>xk*- zyBDR`2`Rxhe#+{^pF*$uKW%*cD(tB17y2@9yf7;^<2m@P(J`h-nbWw__~cT@?!Xsj zcxh2jv#3DqaP;y^pgEn7Jt4*q_(BDrLV$^e;I zscNSFLC9DittB zNvAd?oGL(hZiwO1_z7y|PogTO?w>{LO|aZ&(X|KFJ+2>0_XxB~PqI$_(xRGRf}qku z9Ej5p9H<7XCaf%G>4Rd1cdVB;!X=mekvc8&kEi#?3ad?~TT(`BlDSNF*TFn_KI6<4 zq!>qpZc^Xrp14hyCtC&wqwxwpKn3C4vpyPUvq1sSN&+^}{?ly|3-{eaVv5&KD!gNG zdTir5zqY8e6no?lXv&PQN(B4@P5CI0;=8XXLepvCB|9&yy$vADjNM}XmEV+<9=@&iTlNQm6blMnBT4PH=Gy z!8@s(Hmjt@S&h`;P0qveAhf^Qq)!2Z;iyM^%xcX~Wq)1fyey>?gTk`5D>0W@@)RY& z?Gl?xo=&86^ ztV?_8_M(#?S%!qY8L(3^TfZIi{nQ9ZGRC{25D95Lq`y-@yGm z1D~4p^ii$``P_M89{IG2qW27q5Ymai+dTY(ry{xEv`J)Z&9c9`ax}w^7Wrt2IdVZi z9#<$)GU^kJ1bR-*y+cJyV$BJ10^=fkvIZF%ycWSpGP$CPUS~_bJ#$Ae8F$W}y&kpr zM8D=K{3{|Wh;t@yb9(cEacxmUX7hOHWWB_k$uw7ldJ63R7iECA?-%9f7hOwSDmX`O zfFq127AM_sXo2 zu?%c@If_inHlMomnnI@HOxr8&!KG{%5We@Moj#&*ANWk$<-N*?w=d{pT2uy0dof z&yN3p&+z6>&;9~8*Hg?i^`*o|pUUt7+*O4Avds>Jo_ zQ`SwM(3c7fqM577H!pC0pl7dex22(#U}WgZIBQ82XD!|{kuEj4Y+`?*;tHKU!~L() zrP9*U6gu%A<<{Vgz9fyi!>b#ggFalksPNz}lhdazTH1@JPqLijS$o2u|7n7@Sx#E1 z1;lWc#e+92WQcY!<)ZWw4Ker}!8e4t@cIf3)04@sbp5v842)c@>$zKu;>2Unv0y2w zjI7bRn1Bza+t8gj<}S4MJq|2wlOo!@ULhW6Fhsj-B2KR=Vl+zfO=@3@m0`uG=capZY%nR5YSn4 z9l?_u|B)O`m3eo!HM^3S3iC)IH@Jj;9{*~ z^xRqI0rMb%jys$^c%GesHSCC^qvH%!(D5*D!LeS zI3h`WejCqZc(QUc?^n_6&l(p5c_D|KT!KL8u^EP)^|rM=XKzcNd-9^~TkWgw80lNG z7%hPcpNlY^~B4Tm`#TJ1RbTzeHUs z!hea)Ji@d$CkKGQ0QDh#j~Ta|G3o zesaI*vc1fiu@7%2o}gKyE`7 z-Y0P(LV4W8NyX%u{A8b=e>LB+{kOBLQ}gj8TjxwSRzH7-8>ZKYA)Ma6#y!yck0Kto zoV$B-<%GtGbIWmWa*>{?eR63|PR?g&nM0hT*xF)d+k+ZR9K*Xvetx0!Pj6Jc8L|y< zVE)4ad3DLlB(Ja+{lH5~=_AMav(p@|ytfM$RR^SV2p;CeSqqius8sCPs3@$ty+N8l zvRGY{jR5*c)IWyk(1%jeu%z@yq8t=!;K|yx)>4QCBF`bWjf6~lqy5dY;Hb7BCVD|5 zf=#znIyy`!NG=L|fe-CjoRyE}IKMD*XJlIQ4%z5VI$GpBTJ`>AgMCr+1;Y-=9qQ;~ z{M>o`<7Lleq4I7x&4eFTq5p+7y$j6UvaDz%-Sn<<^Z_({Z%q&`lbfb2&c=C?_R69^ z-Rg3Yy?-bVr@oRql>>4qW7deZ&Q{|1N@BE`rDDUNFqH#xVZPyLNidgT@EO|Hrrr(& zfT{3la7}>eTp1Cf>Qh|r!XHBbJQ_Nmf{OZ5Ep0n0X~!}BWfx1OcZb>wY#Fq!pGPgEw^p}@Txr!mWsFze_$*1g6)F7o z%Wam*5)D?^LT|@#?)N_KaQcZH-W%KRnj+kNo8Qm+9?z8XrP7PgQ0Dc;LT{04a$YLZ z9qsSnpZXw{quAJR6HYo>APW_hz>3}e*+*V46MtBm$Buoxa$Qm2rtUMvv2+jH!|tF; z-u$K}whRg8CxJb&-iI5d)k^dwa&n6w4$<+a)lUV}xT)V=rJkkwPg?uU-(#Clp?}6U zEdM#S@p$yt;`sN}=8rJ%6yx8V_6)0+9KYS;wj@5j{_&6%a`TnE8cpOgI)%N@M2rMFT%hSdqIC+D_f?k|f{)NETgs`h_XiVJoIEBc;mhvK#UU7iZQ= zDnxz2aoUr$%#LA&fKME9&!?GEkMOB?pPtS~$YuGYlx4(X_48TQfpxKVsUOnna%gs@N&Tjhv>GXmD?h0 z)IoHcxkzs&d20TVWV7voZ|Cs?;4bQ;Hu(LZ;IS4u7WwmV5%o)LmwT}rabA%!+Oe_- z@28Y34L>JZ>;hJ6w+X6j2qnqX+S9vND~_88UnZO7fKErAq^~a!s6e3`p|rTP6H_S8 z2PBEst8DmNJ4M{>aJoh0={2y+36 za6WwjbN0J7ak4s&XycR|BN;kQ7yq+jW%NQ=0ik{ z>jT1b7PU74+2WggRc46tseRq8{EQyXh#|#+rYY9*+hMZL#G zWRN~E_PW--$th&8qL!49SfbsSEe!OBEQ(sgFqJ=N#hL@>zuACarCeso#qNRgE;UK% zQ;{CEVay_#9W)oB7!2rg8nl&DfE5pR>H;WJM(+rp1=w~=yE`qe@Z-%w0%AI%zAvpG z>S|Z4Mg-_}eEaL7Pg-NdPH3#k&r&`3m(wWe0W{JH8Tk8Rq6N91@@_B-xl%Fyep^j- z*zux5J9=-@r90_@PcHK2%K@S#FmP*ac5rZ?`(4l$=y0>jZbSa~JB*xu?0B&{(r|FM zlSWMc$(lRs=@ZeC}O*YfX+Qh_-tRU~BW9UEGmNn$Yp#CkC> zRaI=*@j}v{=cs+~f??CvFmw-pqmd4}IjrLMmGZN+12yIP=zXU`KIKLnBo&Ha@Dtaj zlS2BYs%gCOW%vjjh)!OY(uW~BR1X#tCLLkPXjOgKagQq9vVUSDur(SBOM=*b#tYnO znUK4Pfj2G*Q3G^F|1ZkRUy+?(XILg83y5(||B86J0!@zd5=N71s<6xPf zKCb=#@5d<(38W?P4bD?_aL2T?t;r!0*yF^E(3j(0ahOT`yQi`PS=i!WeJy?+T9!XER>2ol=U;gzyd%Dene^+@nP7UO?Y(|)fQ?v2D zY-k!J$fyloq}IsZBu@<;6c z4)jmW$@;(Tna895Q+Jj|``4k6t&e{z?waq<>|4@zTGig;RKNJTw3|I;KeKStD*sJr z=8G3ktLjh}j~FxszvwmqH7$~>T!s}=L90)APH7fo#svmr;h@3(mHvyZzVv`r;wcT< z+a9~n0Xl+ev}2tmFac-)V~^^=J}m#_1O|MFqL+f zUFGd#Z%|O>kio$1{MGa52X|-RLf&fLu1H{r5vZ=ZEqoWsqyF5hV@)SJvhwz@C~)Z= zY?MYzXFpvcM!C(O`NxS!>&kH5_a0_+mAA5%~NWg)$2*CWe2sF^y7NXU{{qw5z+YT(WW9`cYoDUT3cLXhYrk598hq zJnPoq>gPLi=@HERP^P_;8j8p1T^#7=HjK_MEl0!tWvb@Y(w)$eQ|I=AeksyB@-nTyX-2W}5J$}ivDx_)n z`bGqw9!r$a>y8}u?AlDD?pm#^TH6+p)Y{k5?iZUw=fjlzaI}r9`HE83o$JN#MQ`2Q zx%}kmY5}6Y!Flc4ty5N)Zk_@P>D}Z6lkAvi7P?41b8}{H1+{7FD*cXzOp}dlI-dPw znnaK8RVDbDc8raY*knl<+z?UfSk_&p$@zx}a{Yw)HRp?7&7LsvC;r{m)NKskm&Lnp zue=VySh+`wZNmyFZ}kc>TMOoYgtW>Iyi_4=-R32egWp10(RLFm5oA(l>#lG8)MvNs zz?f}$DiI{)w~+P{o8ZA6sMBvD?Fh$v|29wNA15PWUg5?t4|6)X+gZjANq=;;(?8e- zOPKhXKY+voLeJ{9Rf=0yGOI8Atl!y?tSSbde=s8Pvew|)rW@pKL*sOlp8RsiiKjjn}E;o4hDCqds zDCid%B*>9V^~J5#dYG)$0(Rzg-W~`oYTntY&pYzmTkH%Y!2Kx|han*qBovASPw{;| z=a2R`b?_+JFJQlrlPQ$4*#^k5`6B(}TUDM);QNuO*p!OV=L$ARl{MoJ&CQWN065|o z0Oa_l>pA(3yBTjDn*KVz#qikPY53iZ(kE6gD+QhOt*9G+29>DW#L~?RlQ{QH`Mus` z1WWVLkLA#?U{oE)-80^mF}5At!Awm?AMaEpJquC?=r4{7cc2P8q7Vx`{e(zaYfQXz zV^YHT#S)W#n_c_omY}XatB0`#%G{TNa-IcECZz1f%hpSN?Sl3|vp9}F*AVC(Egvo& zp4vq>9s<&L3wcz}FIvozxE(DYELpxGm^n6U+T_7Mm;8i((J&AYK?!w#N5}m7w%_aH z5WGU}-Tk;Ejy4`Fv4p;Y^y03Kmw*LUurK<$zgF3aKiH0V75tHyGo!H*bPaD>hw3Gp zHUqq!m-Zl6QE*Ae3pNK`iBX>Nw?3jZr3yOzt-S_P5b<$y-?6#lSsW|=BOA_JY9+nc z0>vBASn$R`)FJMa(Q13HW!YPOQ;uI9XJ;EkZX+YkHXZ-4%p1+G8glF=oxSbaizJMm zDjPzyd84z0@|GH*ZYjQ3`^BARJlk9a-yEx70zN=&%$76h{%kl1UEi%4$3g~mb|cu} z%w*+<`*4G|Zt+|LT{*>oG#x-nJ}=~%1aA1X{FG5;81YN z_4+49ftEwSlDil|K)H#vtKoSNG^t_u4Q~mAySntIHCAM`!M_p3=vqrgT;BB9UK$f2QV|o?$(Ydw22tqb@PwldBQ*ky3PAk_cwftnt(*uBpx;slY+`PoK zWUrg{1?#i9u$R1$yy}B2Z$*-sZ`vlRzB0%c+buwt5JtNl4VM2< ztxv1pep?dWo`E4YmCPJa+$ld)krXsMxRrCa`R?|Jv*TNN$Tu@hhp8sE=^cH5Hm}=p zfm6F;bN6&Zghg=sG^kw>JUc!9)}n2zbs^V-xaV<=G#0_zh8dT7J3VfLARuHYoSZfQ zBBvC^w12vpfLS8ewIfmcdiDcZ&f`n_c~q;&`D{l7>s4P~t>72gF~>c3 zcTp2pu))DgRXYt1*@eN#yOH>{u8p!m%*&5p%3$xSyuxLog~?uUNg|n4lt_k57(^@$ z__(CFheHE54<^P@77H7~x|T_a$-p92-1P3wcJ1;4WJYkV2s(S*acGkc*_kmkA1?yG zZl3tb2KFGlZXCUCG#gRMj2wjI^TL?d-Xh(#9sQo)OXnbsHqWCkM4IeWU^_zG`~n)* z;M}Z^^cu6Aq!FQ^GeNIlTtAo%T{+1;mpn~&OpjiZsdp)_7Nx?cm=V(KL^epP;geP< zqgOi;pcULGMKBWg17`9H@J3NUkXC+if-LRq&O-AV^b5sf9gs`8xvr6TWO$k4w+I!T zOZGF>1WI`KdFlrD9VTs<6}xjIZ!|jqlMc;RT~ZJ$LD%t)Q0DVfgUM&FAC@k6$4lu_ zt{+w|kH@>~QY7FJIFqpfw8J53v&XDVLzx}y+%PXjr_vWtYG_vG*ffzx%nE*bAz3Mqlegpqu z5GD?I4yx)Jz-+9_FVAvpjT9W@2(CkZG(U3l_o&4Hq)1E0n?475!TZC(;N6I0TS66} zlgIW7&Tgx7s_Cw3l0W}oPY!Rb<*}|KTy5*ip7%pMr05ah8pU+7B(bps?RkUSX=6{C zKgpb`9cPyEg%<@E2r343O#vE1J6?EiW)9W8Z>0f;9uChSx^3JUrD+Tq&+gE2E5qq9FrYZuo+`haBuFSfAP<b3eb zb6}g1WA52kn+Qq9<)5_sA- znd3U=6jdjC!e=qG|2ABu9NEi;Nx1;Z9@W^W*_#{@36iKLRV^8#6G)S2;G1#PC`W#D zAX+tw-+CRNN7}G;sH9Yt9{F$o|+WO^r`2xX`ZX~F9mL@@({qkJX6ivX1#$8jE*?8 zIeJup{G5+N>R!jy2d#HAPlyp;+iZ3hP{CCJ!+m8^L?wf<8vZjs$v` zoW%v6$AGqtr2UIG9>66KU)xP_-O@6bk1tFz`1n=x<%3}oZvzIYR3fk<{<)RdI9+MB zA#)F6%*HLVx%;d5+{O;wtK!31mNr>*fXRho1oo@3^wJ)wMb40AJ^}J%J9A8=u?>Lc zqxebfS|5j&-z4*QDj~zY3D%>98p0nzd4JLcvcVM>Ybc76Ox0unFTlaNIB;FhxGYu-P;|xCu4k z+b4$S$BqB~t=P%sxWEuxzVVnY&_#edSVb>M&vXR|F^@Z1AXx}9ji9!6zGHF(uWwA> zUA$gKJ<6MaNHz3?Z#vF0675hsG|-KnzNScDk%!Q9_c_y@!N786eWEf1;L4h#Mg{|InCy(U}ML%i)evnWKs(bm258{@3wAC*Z1Zya2)tQz{`b!zaBFzDtVR$K``(el2UaVlFhs`UEc_i2` z7pA%Q-8;9-kql|W~z#o zozj?9@xnL;Xu6#jjM2yMt|Me!6`M-+5~F>x!4Wj!Zei1Cn6FEk2dGj#^OklZGw@(m zCu8CGM#E%-6&GO>_M)g$|@;?ILYh8`NA zLH{6QiSMHB>!0V~1A(myeJ8UGH2uEJ&DX7D)Q3B+v!<^cb-ytcpZ>Lu_dn3$Z{<{b zO`2OE-{Nl*Q=!f(>n~fwdl~ErYmY_{RE+97 zZ-16Gweb=8&yRF{AK_tcPA_ZR|HxBu-&DgD%Mg;6DtgPeM_xd6n;Y`!*DRs zp*OL6#*{zL8guPE4#fr%eCX?HwTL87?tSu97Q5)bykj5II2lnzTq2)nGjMI?FRXM=TO?Mm2@s)fl7LPm}O`C$#SJ1$VNQ8a1t2y<&q z@9bB`y^`<1h0mkoeRpHAdKs^5ZVZxJlyJ&@hcn{T$#r`IvC#WdiYY&ZRUEU!q(M?v zL#L^%&a{j9Yy-x0GH|Uu=T8S;^lk%MsH!aObOciLJoC{oVn{%TAkg1hd_5k+&Fyo; zHsz`}?HC@sSB7Mf8o7iKKBpSQokuz3Kmx2ym*ZA@LL720Mw(LcOOiO(U7Pyzk24f7 zBBdDss2N(`z&LMNM!t~P)1mD6c93F`QNJia|5bO+SdDQz(lU?Uj(lg&nOy9h(Wtps zwK;+}-ZSrZq_VK2(CH|hwVkuabu_!?_T;bGD+~vha4Fthlnrukof{Hjoa}8~!Q%6Q zu$D5m9738VXI6Z!w%$N+rgA`!g3!eC`0J!Sa4Io@(2;Vjn&{-+7yFd4Y#ck-OE z{FxH?+^=&GZ?InJ&(dMXPyMP|)hYK)sLI>mt_`B2iJDp7VBdR@8!U_C>l1me3-%)N zd}dzRaZCrkGU59K72F8vbio{par%(BH6*`NTFjH{GzrfT-fBoypVgZ01RYHmg)@RX zPh`mJn4DESpsz(Spg}<89m?}|A9LsyrF0x`)EsPbv_ga3QQcN+o`kgBhG-NKV3DYA z-qW6>+^Eg&xn+hO#+2^B=BkR#YpP4#^x}d8_=Cs9cEnygzCZoJmiPr*O4Pzpu%O2% zVPtEEu8mQJ>i8Hw_r4}zqsEyJvGjH;NJ8-)|4V#R@7xi;FN6ay@>zs-t$<_!`!qfU zjix;JS9*!q=?GYh7*Kt&6tUZ;6~ZL9P7poNLP_{)7psfym9Qv8rv$#ZK{*@Hw|Kjq^UO5zjZ8D|K;#-z~F2iE(^Ih-%7kL6Vfy4e#&V(^YSm(dpH(kkBoH(OO@b1l{Z6 z_+S>R$E7)Ief|xH&Z~9l;}4@U22A1E3dbw{+M^M&vMX0V$64?@&cFM??x@Vz_6%X} zAJ_eK%@JZ8%n=9XS3cg<&8^qQ*!*J9ZkCiO``itJ+n8s^NMs)h3Ck~DmvVnNv(2Ua zZ3$9i^(=WSf9jPb^u^UV{009(rYs`g)GNX1C-({+#AnszCNSMO{YqdzY*@3-EgAd`(yVA`483d$HC{@4CNvSzZ|sA& zxR8?dRM-2Fbdj|dzXkg&W^ll4+ddix z>3FzPXD2^aokIglL;q6tcT1CONU51l&Y7O(b?K42kHx81+wG&RT;uYtcISy$>}`nf z#9D?gNU42$&i#&Hl-BghLh8_U`;=o!-sXasJ#;K~8caS1Q5vhg-SYxl*AFVP9VsBC zJL0v}FfzQJYH#b-ga@OuFZ+S5Cv;~-V|FhQXRV9Z-;W7N8S81iYqo<6*)5|j10eUG z=^f~l zRwi`gjkmAu#k4xJheNNaxZyJFcF;Uzn%8%XQ242@bjoVsId zH*uKEpkqU_W8Sz+wNxAj$(TyISovb~|3ALoGAyp8?GnZ{xCU!9NP-0jZVB!#!9s9{ z;0^(T26t=R-QC??g1fuZ$TXbu4M>}J9&@;R0! zDN(Pq#qB%se6Kl1CS&+ zHbf-GGG5KRpV9m%1{BwhbSgpa5ACXF4ZOGu65^B3yg0KxocamhD>xyEJD{tv&gmkP zT6)k(y9}Tljj5LhrrclH9I%Xp_cC`o5c#HN^6UIa${n`fIX4L0nU}=fFU6~}T--kJ z-=$a%8`;pDkOWIg5L*IOo~wtXJz8q#N*{VnbNo^yce?e2i7gSkRgYYk*F!2v>{p%5 zWUS{6Qaj2MP1ZR0k-HZo4kc=+@DyCuNNrGSDc{*FI0PM5*BAf_&ze3Ny#?~P?r~$z zQpwjc7V^tBh9&7Yi%sp1{hrweiDH;8(qB1JJ{`_tx~2#3*b7#?Psq0GNU<4hyg;va zDPrq)2z=Y*yka&<+1v$e-cY%o#fqUAZ6VCRvkkk*yrKY%ZvE6(tq8YH-NbvWx0YPL zciBrapTWThnHV}RLSi?<{Bilvbh56u*_hdKVqk{mjn>6l<-K;kNN`tJxp#ERtMuicwwQbf%S$=dyBP&rnO1dhs4})RjzqvZ-Fk z{h$XN)fufVPY$fzVW-w&1}54q#?b7{fk%e|Pmm@~Lzg;D4oA>E#VB4@DR}U@XN2YJ z)KBqv9;e=@{cZ^22*z}^&Ea{ta|xA=OJ1LM^|0+P(SPq=?cZ1Xo(4ag6aHzDSB2-9 zZ7XdqVyEyv#pbJft@B7KNV0-9s%+SIzjI4IIkT@?RVvPJeH8rj*Z5lRU2FAAP4v$S z0~qwS-`+VVmvjZOFi;(f?u2Oq6<36bdgmG*@b-6_m~E8;jN3&^>mr8}tiy+KuQ#owb$)TEI&hK;H@Gy#LN5s1=0rmzKnK`ej-vjnt zQoE+4>tEa3i%p#?94L&*#$${oXkH**ipWtI=0O5utOsaI&Rh`|^jj z!vTnq44X7U4NU5A8evJF%|0;0+#59NyXoax5*yar1+KE5AF^yWZDO_3*G}Q}o*nYa zUU8a*PKCz4ElyAg)!dQ1Ymj!a-Z5GRLk_uuF^Kp4a8R@E(mixq3b|7>Ik1}qXp{5s zaLYMRiG61xllHEcMeXaCCHX`XWjw3)L2}!061VFPi@*!oz)BVb>5rqF`=CYUg>x1b z*r3~QrHh8NBM0vZ01_TEM{FmJAqj=0!}lcb&o4v2Hd(=?^It4=CAi%;H^uIl4de}1 zx!~9*vxEVR`hm6gNekWDK>PdfTzglLvSTzZr-{LsPn%hjPnM{A3G(bmo%bM8Ss;ty z1;?_$ARi}pt&No_sc9vnYxsgTz3U1J#izmQwe0OeNC2`no}Vm-b_?}V4^cfpJeUW& zpRzrd%d*h1>7ZF(yC;l?zx&!Sz;TMFx6e_2e*%;aiVyb8BUWzlaCD{69`2Rkv*D-z zSX*Dl$hpo~OJTCPg&-O+n6YaU8{PjyJC^H{+_wCm^Lrj6H2nasR9ox)$CAxK9#Onn zfN~)-XlPPGzs?>7&|5hD0UDlPAz7#P?rxiyitX0ED{OJeL1`Gf&(Cnbiv_4hyJ6{g z=D=2Gp$BJ#yv4fmJah)jyTh!p`9lDrmZitG_OjEXt!i9~WWlW5!ZOHhd+Tj&{oU=4 zi?d8~lCb1}VZJfJ(LvB)!$N2Q#w>Q(uupmBz*ZW^ASZ|aJ+Os)bur z`y)|ljG;7nNo`Hfme{m%(|4!xF$M?hs5+z3U_;){5Kla#sJz(-k9_@5{;&*!h2(A_1fH|9_uZdOX*Tm{;{yewx zZ?+8`ym|i0Znpc6kig%>+kg1YFWEORVbl2^!ls$nq&zmiYlE~Ri`W1kf&_A8XN1z%xt?p+MAom7x~}s3gq*2JmeL@QeC0Q^$SoHL=||EVF-?+!odWf4nQRS z&~Pr-AQshAROHEn#I8&Zk9RQY3dhi8&XIMTsU(%ki4`LF;4L)44;vISgVX~{jL5i7 zs@qIN$?B&IKhFMfk(A8#O{LJFiJ#E039nGMbH7l#^DLOJnH1q^3qp4Ob>Mz3d+ex` zy7@rqoQ##b2~j)SuT#e-=rMR>v}M`CH6iNMPa5bRM|nsexhffX+Da{LovMO)CLP(g z6K)7jvPR|^K?rl;1i2*1O|`;zJKxJEm%`X5=Lt5SirN6)z1i3y5VFx3No&N8@OeU5 zT^n9#%5%w=jqlKZ~0UtrHPBMy6MdRVZb$U3)WPVc`efW z?!?#5p><=#!0b*`oZy3IZ5aa@n6HWT&FZL(>Z7_hfI72qgeXK%$E^M&{S%b?O=*tV zyP{o9cDua=dSYB2o5THicPKO*WwCqIE}rMBqP7~is&{_4tU&G%)GxNTmoYXUXn8+b z1da+8GFV;0ztKxIYaRS*_1R4JnZkq=tC&r1qKA)4MTwx2>lfj8BijOZ{2xD*oO~mo zZR6S5*QojNi*t8Wg0>m39B6@jna#4+r_JG8}4;s$#yh6^Y*@U^;79v z`zML~;WrD2;)Uj&<+Akg;g67>+2rGBS4Zy7=~|%)79W#PIRf)@a6l*9@e~X#?HAr$ zt;|%YI=@Z1YV~`H6PW@|;lrH8uEF@Ad&P(A{}2xfCja8&Ma1hL-obwWg7p_5f2jvA z2m#BEy8eR@SFtF0>{eGUY1T@3v9Yu~P8uNTmkVw?9IY^AIvlc+n5drZOp9!jj9maP zjdUavol88e;3aw9hZeN-7;=3?aY0WpOuE=W$;4;}0Kp_SsCNZ^Qk-XNk}fPlbcW51t$z3*j9S=stKAz2C`|nuekx08S(h!6`sV#2tE-RI=Ky-gp1sG8qy)E3uVb!4yeX)Yre|Y`nA-Vb?GkU)w!O|r~IL)Vl z#*1%K`Zq-ml$*oVJc3e$0%iv(F3=u8LO%dOhrY4a(nR zORYbvbTn7=lrNPv-;K1?Jdu^*_xi_)y7>{Ab#zjm5HR6>!spr2Aj>qMtYVf$bmeXp zs&#mqPV*HcZ)?Do%vH4$vZRg_)6W(GFKhH=V>Mjg=@Ww0h&^MWL?KkEiRAXkb%`)1 zD+&^V9~n*p3{>|@?8Fjw-(=^q|K8(IGYNqcW2D^->q&Jq%SZhVgRq$myGqnts<4eH z(FW@!5c-2eHKJ?A$1~?*-ujH>T6m|>3}sf zIT|r;Fts`J1u3KdxE%7oq+yF6|E6J)!AQ}01qs-%=PyS7lZAa{HfzBDYjCI~X^x|e z&u7s-Re%AFjO867uIGghzz~Kxax@Y^2Pl0ICYe~c^hWX1{&SA|c7V{i-Zq<^`P~Pt zI%~m8A$A5S)}F2-t+z|%HX9urjw7Ds)-o~Ct;77Owum=L&q)bZEf*=CmPxKVGU*<- zLc`t-w+V?!ya3f=xqX}I=*K}4dWq^~b}ptFmSx*-MY$7fo|A2Ja?el8YsUIa1YxKl z!Z9W0AeHIGrs5Xa8n-ahk!ujIhUsAJ#}W$VdA()(yqr>HjUL9ttdeb#eO^}98I`@D zno`1DkBXBNa~}sb(fpj&^WoUy`^&f*JiubP-4$R(GhcE#u99u=<1p3y^MiNsZ>s95 za$l*;r#7gLZr>x{Dyr19`#n~jwjTw+Oc$!@!aR>aQ&Js)z+1H>7im-^Gu{0-MW2JJ zcGVwpa}bKHi3D!agl-h@e!rRQjiAkPJXqN3XvwGGR_F*12L#g#P4|aMi{2i}pjZYX zRJYd-!aetYET!fbtaeM5UF*=uIkk32Iw3ydZAqKZDE-%hPjB>+=7eBlI(Xg(X9G`t1U&5Uen-tEnt zG|k*>SLo9|N;is2l2`}T`0S_x&R*w`Td)IY(bP0La?5ECf*0P{^`yov0vG;)eWzG|R{Ja3 z6*+0-_*Yrq$UgpL$g1O6^oL=`;*J;>iqP1o6K@noSKJUR#A2Z)ltrmYoSf%tDE*$ zK=j&~^h8Ujc=jdUPLC3pClHbK5l&q`CW5m}%+RHilvQn+s@OLbOa%TgCq0q(rKu;T zziScPM!n4*0_viF%J6!R0h`>>@1r-Grv955R7Yk%lTRv_TK^&_ur4wdbiaXDMEfbnj*|Lw|$U1sCLrQn% z<1?Bc3YqMPdXI=qb(-HW8T1HDSs?iSbZ-5&1c8kXDH&;Cbr}jD8qoc4F0sPw{saDf zl;d?d{Ux;eDrgaH<9a&1?I~J?DGJ=ixzsGS z$+Q^N`$p(d$Cp4qpoze{3NA$9uG&F7Mdf$X`NcU(pU%&TCG0pryVI<4`^0U9oThkz z$+zzoe7Ki6 z7*m`wliWf*ClU*nDpKs1@Sh4PDtGWlnxPZP9ibkh1PSe0ng}7?d)wbHclbF2b@L6h zC?h^#nGAl6`A`GCrVu__9enQb;~}@tq(-W{^=q_P1`}}5jp`%cpwffi%kwVoKyM?? z)N|H6QGHR4UxPlL2;ZeD$+xujFMwT*e$P{=^p^;No2lp1yb> zoILT<1+!>(Ul+6gSlhpf##N{NUCg3^r|AC)_P{2Jf2ZmHj`hG4+E-Kizg+1TbyAYT zw7Ov2EpkM1usUg87Ci6Jp+Vjhif`5K*Z4vZN`@8srC>wVK4F!GdgCXHOirWF?4RgW zNCfpa?9ZG#Lz*LRFn=n;AXtPUV4(Yjd749#PB~k03xjtEV=Loiu0KqtRHbx`3qN%! z$RAwJ(OpEKKRof;hdesm-tE43)dfqFI;Ma4e7Zy-CE%$A3G@C=q8$;KUG(Ui5=ugH z`b)41vIVV~9<$LEN!H%*7xfCDM44{uLc&)O^(^zZgBi&$GZGtAgDEqPZyd(P4if?6 znI#U!L%TMa)FGj7c`aBY9E^LqjCjXw3DTS~n^%#rQmy5otAsM*wAR2!{HGy`BX+L{ zfWlUF9a#pui0rl<(Qq{O?_Gl50R2o<>nz^7bfhGog1{VFPYk&k`a?70wHQ;~UblQV z?K0x!$qG+8RjudC=zO&Y>1GW=NMWto+;mIjX;{XZ4|A+c;A9Tg!^FKUfofAy2*SG?Iok9Jv59RSzlBe?yc!xwltzUo4)j4w)8)y?5}5*YXkoF^Gi_wUqQ=%ugCtk zm?ahRA3OHHWNEPOFawswUOVh8eytcL>-RP){T>{&3%FMUMITX} zwnEWn=QBDLM|)O87#P`~IEF3vg^h*3O2~azaiG9v)xHP;?f(c5({3GAc9c{CZ9e8Y zO43slWWu1Eq{RLNhDDZbLB9Xc60 z173B9do^EFXrV>W2#DETy8cz6b^VVDEzZ0Di|()iU+`buVWcR6w9S81Xmd1QRA>=r zD_>P;&xO4*HRj}}UzqVZ{S>)MeG5&wmd{EhK~H;}isj?%S0z?3VBKL0WqU?tuwwGQF(2>uvvbHQeigLOaCQQ?~z7rOTlqa93$hQ!pa6jR@4p=Y zP-}pLYuP_eejeS3Ib|L&AYJpR{%l^!IR*XzcES&Pva0dA{G8q~EptJE>3&B&zVD1u z++ttlGCQ`v66`?Y<-j*PK5~E`TgBjGyi<>VnJA9J zquFQP5ScEVJ5r6wpv@mO*I^;Y1O#)#Qj;LsdV=Fz5Be^=qFnu3EkUoN221-t4Il%p z)o+uqEC64Cc6h6_?AiH=UIpPI2Ls)7)#>vW*>1jv)5~^OET79>uHTI+di(O7w(`ZB ztGVO}5qRyKwUq=>&d1Lt3j|E`4Lc?|m7ue$M3d2tvm%thI{rd;lKb99#1l;ikDs{% z8!JtsIjDT?7hESbJ2ol5jlfeErfX^!%ub5!ktWN+qxzBa(usqL>tgi@#a(!o``X1s z9XICDg_hpCr{5NUf;ZhaG-s=Ke1zqhSYK~*DzPWtn=!kex1!1&@Sl^Q6E^WgA29HZ zKj}?A46{Oyd@>!SxFGcG2sldgpWK#w)0>OG!^7^cJQXIMDkSOUe~+5s9(pKjKAWoO zM!qhqUc-CLH`_5#C(n~p&$(@*BRLl>{x0L7T)z$JZdT_Rz6DAQ_Cpc`1fuI}d>!|S zbiNm)H*5Wi^p7Ga{~-O}ZQ6ehIsGTP2A{JBZ$YslLd3nQy=qE^;0mK3yH}77pqaTX z&g?=m@d?5T=j!`quD5>+2_iI*S0l0UrV)I^Li<6=^Br3iR#lp3&pRqCZBky(%{vHx zLp-BLz|9K-a0}sD&|qJaGM{i~^yKMc=+Y-;udJ%-ex-cnspsu}Npk>G1g(^u3cFt#yGH? zVF)G0EfoJwWiFEvm|Fv{woqsuSq9ug9%(oxtUF0v8?mJwb1sT1uff`7x+vJ;2ijdl zYZwiIwuXzf(XHqm41##Kuyq(4BHmFH+8|5)M1UDYfs$AHdXxlPeD7!)}A8I$cq%aPD8vQAdSV+ zalWNTs4M@a8#&Zr5D^)R|D_}GpOvHV){U_{yyVQ?*(14!dekk#AEA25MnoNz02)nr z^yL(R+fs;v9jvr_6#+CZhjt+@w60#w_z-({q^?;BKpgh`4eSgv=2#P`+4L9pQ;^xa_$$rOhYcFVdSc6S4axH-c1)9mVkz6F!_rh8?y` zQ2gweRXx!!89vyX(#S96LBOD$)R;~iFWDX^tj%!Ee(JTmm>+5)&S()`fnAn-kQ>7> zoh)6A0ZN=gpnCjoXLkL%iJc3~%SfC`jU1g$Kx;d_lw-t29V-7rFA#N4s{-mm9*CRE zVKANWN7&lkKHZfybU<8R`g0puODxx}!#O275HKLg1l4tu*7T;*>%M(6dk%T3 zlzMAR4Q^_5{yee@^2!z1^g$MKxO3@zLKBXa@#y^A4Te=#c2Lp|ZLCR)fl-lgjE4a_ zakN?Bf(zN$L-ZRR4ixK(r1$nC^lo>HCX^k(;r1Bmy89WjM`eBMkoaP-p}jF#%KVqM z)R8KV=UH>xIbNT}FCJq5)#9gyT14o~)LU8Yi|gZ*@A$f_jg>lo;G^!YHEeXmm7X4_ zt{)nQoFI{DNf&9hzPG_Hj*I?~+kY=24v78X6HVxS2H zulUWNXU&vq%4pS9E-%o6T?4PUz`izgO+O*>nj+uxBWw3XjT_9(hoHE;$JM-%bY z=c4!!Joxo`<(Wd$i@73~jh^2Js`K6<>UCSp@8nS$lz*=jOfRgeW$_t0%Sh{fgBUa; zrB8S(7_5IcgU~Nl%vGv;io7w*i%aBoe4fcK4 zwVrur#Wux(liql&Y^59Q4eP(}VEPupux&(vGbtwceS9PQ}{rIY+E$3YwPc zviQ+{a-{Cgw1>QY;l8nQYQ||Qj?AFhC#kO_m22|C@@{nbhbnL^-<*-QsmuzuIL$;X zcm@SL-pqlBhTO3kMzIu8vBSEgJFMm#6(qwbUbI4W9u(+Ye*9rOzGuDjtGVjMb_ zlpioqJ{W08i0$pc|GiFc+FD+8t)%j1?uk+`ry8c0OMqIIS`)D{co z==qiR>^S#*!#@`A^~zs~9{G=%4##?H;+I`;@g2ni&+bgFEwP{FLBl;p8+cLPdG&#R z7!9X!?Z@Aa?I_GDyX#)pfd)n;UY_L&mvL-#{kB(Ri2GTM^|x7>*GLD7y=L3@{1t|+ zbNPx=PKk4ETK2w2f3HKr+3=zjsdI0Fevqg*>fmEc@}(g58@PKhogs1Uu%D1qCgVkn zOrK)x%Re!Cz35bu0l=x0XJJ*2P;%rX${XG&ScUnFKQ7u-4~VW z&AIF)kn8np#p$8fTQ_Ed+dpH=Fx7?79KwAOH5P6MvXA6FfPa8wA0AsHbyYQD-Rlpw zy@3WusAz?u!m}GwdXcj7XFlSTNFSWf;wi1dt-^!6}ZV@qcAW&W4kgSKGU=U^la3Y#dn})xAX;|5AsyL`zqCuS4NZIn;`?_V94&x!Vh=)-XSH(J1rGt@nl~hghDjJ;;32o zPH(Dw&t;K7`iiAGl~hx(M&&Hg=(vh4FEOBjneByYzVXJN4Qv*=>2nBfeF>sWjjw@3s-0J@6(1 zJT%Cb!@BR$&OEe?W~*&yJjLd&ksfKuR1s;P;Dn!rY>rXRN-(U9l0%;F9-zyXO90>? zi{N$N#Nl=6CGfKJ>Y4i+WMTY0Wd5HdAnI$p_20WD<4_O||D7SXO|mpi6vK|Cxjcmo z+Ov)?e3nPzf9Fp7oef^*W3Jywya=hdoV++?M4&J4)S;jXCaps$GCcr?&IE*xG2WRG zJ=Dc?#K)RLd)>VPc)D4%_1LjF;nak&;LF2c#kNC0ho-w`&V#fQghxKQ)=Xj>T`wb| zE1M&l@v_T7+$lJPR$oKiPJ?DFU0Mw6UtaAdf=}2Sq|8y2@S-3Pyh3-w_?9i|G{#jt zatJm26*n$n#v4w6jTT|NUlq=c9X>HrDzoGxiSOVL=I~G9iLJv?uO9|}pQl1X;q(#Z zo-HBw+USWXjb$q;)cFi<;f!g+nun4w`w*XYUX1EOr_Nd-y`;ibP79zftIhfoogA-V;GpodkZdwXza17j$b+&a3 zkbCT3j5ovxmq7+Yb|-YLV^eSHbqXhWG|vBIgd4c=uypog9Q3fdkF11jOl+wA zl#(bwjiQC2>GTG;)x_)e$7&;zC=p)Ri*&3){F~gf1?`Ho4=?Y!d;C0OL*)MWU>o&g`4-(&;npWd5aw+bFO5M@EdOxIxY~>47c$s{o7-@GHr2qP83X!dD( zg4x{J6Yyxk$}f(du40R5og0jvrTBAywtpF4Og!_EY)PA70Ncrr9P#`plMW@0Pw4dHeO&i+z;Bi zQpESB9ayN2{u^5yYwmv4&|yKKj|bAOOrs>#OBF-EMvm8VW<~J6QYYRQ(_=X4?hLT5 z2+_s%$(HV*IE`h8#H~!fEuUEQFq9U@*ACg;xAB|$mTsVlKR@PmC;JO7=uL#=4`VhO zs3HjB6d0s6E6M34*4>w^c*0}Gd)g&@Y3*zH2xv>{lK0}&S7pw;wGdNf{F%Q40Fn{m zfq;M;e2v=w@oC|CnL38C{zmO@UZ#%!q{aV%#(#qL*Od4#xPKj5Ql!BtaqQj`S9f}g z;_Jb#nC*lzblk|CYK-8KvrKgU3}s{w!Ju~BF(_%IfRg12zrY4kX^iUqnV1r(#G&6s z2s%gv1_u8MeUTyAZznrH5+NlxrY0=hp{*^|8;v}UrmWnpa9cprCMfFV2y74ENLifT z735RvsU&EgQgfJwjf)fuBbeoJ>ue+-}xy@c<-dI$96BSKG} zO>kq{)wG_$PljbK)&H4k5Gggn{#)>2hI1n4x-A&qA@oz|C7#Y4Q=Q3h4ZUE8gd)>B zN54sx8@C6GjppGbu(0AmaP8;(Q=YmCuCXSH+d+6RREWfxO=z z_eSzo0iR40uGvfm8$oo0NmSsJw^;=6JMQ0*lO6vA-I-dT z>?~PaB;N!L+bn}-td~_|x1`!zJ7yh0&jW4`p86zDRQ0W%^2Y}{;h;Ou0r!WCjFV@w zhNqKc)l<*4gO%GIj;DxctgwZR=eE0p2ig&{)6w%Q*#{OPofE)T%Zca6QCL*2Wb&?f z>uA&gh^N1GiF?r5%4x+G#q&zYvzq#5VZHxxo{T#rvSvFyy6nFA2Q$; z=WP_*Pol`b5jR~0wMwr06H`9b1$Qwzn|>e36??FY@6zEGf0&V8ZzT!@)JEN2zy!V& zaLW{*lTtpBP@aL9O^x`7DGzi*3}=yM4UXa8RtDo4fttGSTm6xx+=*kXZ zr)qEI-6e$bs5K09JL`f*43Fa$obi0(Iv@C4#1Y4GJtore@xGA$LH}Mt3Ijz70YzGd z?QQ0XQa)v@sUZe&lIbTzchCupIn&@E;K9SpFG5Rw`J9LgH&z+|@t}^;BJ5)#592L? z&<2bd)8L84^+(V50$+e^iciPJ`a;7Ac?&i}s*AXN;tiEJ$A3sj)>;%h4atn;flKY5 z@BR%l%0bt!xB6P#w6c*$8P*PbDbK1S{T_(uW%S*y9J-waS8|=y>7583H~LAY+J``& zXeUaz9tG+6H%G6$0CBgVS?TT?;B?Nl|2HM3BtzTHsJ|jZV?g@w>th#3% zz?@EPi8uU6Q1#)rr-w*w;7NyrGIUYoHN_4;w)6w%ZH|wml{8F86fkr6CjpP8m7T&NUwDx zN;J2p%a;FXz?c7@S9?HAZGcIOHH1<-F)2aahJzvvH-rK|r4SnYLT4BH2C3)Br1rur zMZd06*VegDcfr?!g&KayK|?A-IRWz5n?hGOi(Ol{N<;=9A?B!NG)KR6#f`u^8-|8BHr^bk2(RVek)9PKVNXD?xUtQ^gzg-PEn;5{sQ|E$*NvE z53wZK_qxm$bMFl(OQT#&2_GQ66rT>|@Y@3$Tue)fD25bgp|jqrvau!RB~}$MmKkJ@+jsSMvua6YR4< zbIOXD1++$rb1_%P16)50Qo*gCPA$c0t_3<9RvtIVYVoqEKB)6T$;q%lg4-D2(YoVG zkT7xBI$YGu2OWk?x^IW@PyQaSpRcb7)l8t~-0`xL#pkg<*cbq5-Q=fl4{+@hKaV`X z+xSa^Eyo~NU)Os7P$6FlUX#mz*LvtLQ`vu~kN>|xP(0*6B*_0xD55g#ipy=U3i{Ce zL|9h|lGn5*cBFy}M7KsXoZ2;67I1@Zhqpm@gDWMu+U_n?Tbj;f>F`<=FZ=u=zLY~} zheJj=8bPYWODZft{ry2#5+eV8Vz0ejm&`NT_J`4yW`Bv+s#iAo%vsBpwFlDKZH|lo zqiNS&Gv4*Yp^bT$U&R|T2Y*&bdhdNPmGhYIoLUvd#r++oH_NEhRq03p%?DLOZAW@8 zd6tcOr(g@y7zI9{ew{wIXZ856ll0D;0JDFTmp*-o64w&Bsr!?zoe2s#W_M}Z)qN4! z%6!MS9Y`_@VIY3#`#$;7SCJsi1e13I$%uC?8O}IWi1F49vw0UO?!y<^x~BJ4Yy#K6 zcX3`UOdDQ=x3Ef1kXnxw4px02M8nEBSv!!~IuZ{fY!yC4b5j5CC{X$4;nJ;SzNyTc z`P=KuQZ4h;jlvZyK;+Xy4HLg*AK?ShqiqNE@>LD$?Hk~}@FVVhTx$a)6hZi=^fyVj zP*%DBIGElk>*0g@cjL8x-Cx)8f-g&z>6X9!`x@o`*IM3M>Ho5nPk@AQe_6`^B?o|o z)B>jHXpTFC8<>6~bPUi|>tZ6+U9Jq-X!+5 z^vmdefYYV}i?huoMPth3FqBqa%|fMtofwYX!!1$5;#uCV{a0du$($ZO8!I=hu3c*; zF#(gy*e+RS6j)77I*XWq<;+I)(ie_KI)j>cE&6@(48(BwuDU444$=;r05T<)qLK7v z28CwD8?CkT8m2ac90NxW^6V1<`a{eiI+9#3?L4b*rtkySyv!Pt2TYLfdTZ5DPe566ZDl>iMWm zbSDeYX(G^A_zu#}^61rm>*H|E zH~XIW&*s;XKZ|8q8t6uZzBasHu!bJ5IO_v#L-Qy^C54aIeivCWt_pTZ6480oZRTig zJ=$a`IbMw-w};o+e-_VBa&5P6*oDKunIn+QK9w-*chpY_rbG#DRci--b& zDWFbzZ+gyG_Px*3=>m%O+`~4X;YKUu`GfE8t~vMXh0MAjL!7^fM;39$OBd{kM*aCV zG@{w+Zf+iUxzK*5=WYQd(5I2C^Zb0N*!Hp1jPYjng=al4-sOay|E#;wOf#w0I@;~6lO}bPgz~X<910o)U!6`< zsqh{}5fVAIfN4&Q+;jd@@`1)VRoLxa0kf6tlw3eRfK;I$65nq9^GXRn5@9Lc;vC zkcfBMZ{#cLR~(o)#YwRtsk;UNZEdaD!>;Pv8Qh_v@W+NSaV!kU->svaOt)3ksa$3* z-`9dqmji=8fM+@H-5viuF+vho9(cb2@&!|vsQ-hhC7=IaOj#S7{68>N0tb^9J4f@@JaC&(iH@lv-`|!QKqVCxr`(bUT3X^c=cyc7)zQ#~PmhEZ)qb5_1>HR~? z7Yz%F!^ZI;CbEOeJpVJu4rdWuy#&-FptG4tI}CB6`^x;4*6d}UV~4-ain~OZ+wRCw z3O(Qe1Jq;naGa0I3*LLTFYEkTv%C7}JubOYIt6Q`^~l@|YuC;iRll#D(t6WD2r|Om zcYEU~2=8!H)Z|tr37_L;LEe&kVV?fmYQM=fG$oYbPgZxR>{X6UD()wX(I56-T25^X z@f2tASP2Hz_y06C^mWyi7PM~1hG|tk1T=8%>`}NfRu%9As(&f(BQaPM+(RF<<}v6k z0rFPLmxl|`4m9&UI`7}*ORCMP+hZJX=6Q5;X)83xdnVk&UW~}?FauR~m}K+0e9lG- z0Zhk(`>rAEf+-ywASJj*yuzqmM}ZUpkd+eNpWh0-a?b(xFk2}S6oAsaC9MkSm1em}&&n((NvfWcR7%|90`$kd8ud=~eR|b^D zjtPg|F65E-<;n`4sFM4$IO314ati!rR981_;*Vgno##gA$ZclP3Ac&J?dmTR4=s@# zqoEp?sMc3J?czH2O8| z@t%C_X$h_hhz50ZGU|N|;zXFQw}ba?@wXnS{p{0!2TPU;SjSrO0`6kf?@YIPWPJKM zLLIb|7IRi_u;T9`5Mab?kKu9M)0Lb`UN@fe$!JO%h{&EYM#%vU;5|{mup$#4Q84r!cR$r zuCj|}^B}gjLMuJ}DmUtqOW*XBcFn7Djo8H7Y9030AuYj1b9t78Jq{)(&uXk6s%sx* zLeP1IZ&)wI(BR4)mwiU7(gT^N@a<7Bq1TuEpx&uVW?zqbq|0Ro6uOfxu=m!>e(;1F zzTc7G<|u8Q5QWqS!FD;Lc8h^#Rg1)R*0FvNU59b-&JMebbh;aCwv-c(Mu2)QbWozL zs%86JjtNWSK*?K)hlO5D3#wUA74{swH~tqt+|5-bJnCDwYbMr^&!XD3I+njGIGL%( zyGktb-OfxrXxd8Omyj{i=Ml72zFAQpN-@73`RHa;{;V>0vHfgoboYZLHH--#nEc1X z^hgb|IjYx+N2w|Lgf3(^8U+1(G*Tgw$ui}Ks3;IW#Bt1o;Xs7I3oL6tQ;OyQ^)3Xs z>QWm`bsezynggvDAM^|WVqBLQvD>GgdWnA!6OHP*#~)&bR`S77hJkzoX>{G=nfyq- zz{b-3pC(-2`pf$xK+ORoHk@RDm;HQuP7Wy+lt!+{@R^NTpCzJ*N2$E0ruM>TJ0B$= z=BeE}ln8ZsSi*B7kODZRIC*!rxHw5};x^6}dD|eu-(a0T)LR9<>DNP@lwU{e{hR`+2DaOBH9La za`-1APTOCX^}hPsLwA)uY7!4(L1TBz2*Yec)#fFMoVgl>V%tR@M9&AA5CIthP+_7u zJwxi53b~KpHm6LMT$g!QmO)U8&!=IZ7&cN|NAHqt`EHs{npZBe0^TxqWTPtz#osGZ zd`1urF;aFI8Faq8lMG&xG}^{-sla=qk);eP%-9g!K$=ThN@G<0!#2SB#~Z~98a4o~ zjm&T|B)x=R8{j9Lq`~i4N80H?m)1{dpv{>hldWb6&(?q{8sjK*1&*fYyz<@r%>);D zdh)CQH))P6^u1_RZ*1MOZ#o^4s)mhA&h<8rrw&wb=HhfAe*~OzP_wsPpgUS1ad>rt z0<=2v(Z$=vDI_Z-krpW?kX7q07D@2rt$BsEe$dOU!Y~U3lo4)zWXOK-Ww~l8%6i+p zd}F6|sj1$Re_Fo}gyYKHWtOHt50UtGXE@5v*zAErCDI~ab(P|5WcbZTy|vNt$&bDF zup5*m+a7B#kC;mx*7d1EryZW#L))qTh?0+7lYXEfF1wl60=0(F?QW|^kz$!3jChkB zi903#{h;jPZ`uB50=_U%M+DC`l!JUSgBz#wX75$EXnE55(HFmiG>LM29BfC1mixm$ zrGA7gW&Z2A8IjklI5E*i8tVNy>)zLR3Qu+nHg*c?)87tgI^QhZ8Jy*=u!HDk2=+EPG((q)TC zFw;w8h&(3X25g5UK0ch}5NHDWvb#7eT_^&*;%@m-OJ$(}Unq_?uT~`&fG!q8xY8 zbWZ2P`pAtn^x{w*@2Na5&@YUnwfj_F3$H_!O^Z1Njc%dJc~=fi)#*~xPA+99EpxN+ zfS0XuT<|K@54F3+RUPg@>BjDVwf2=^S!_|;bV?&gcSxs-Al*m_N{KXr(jC&B0@5vw zAV`OlN=qpz-5nww!Z**L55{?~>wUj-ew<5%v+r4JulrtW_ROBO5BKJl?)s#yVjbEa zzfwKCu8Vg21Fw}!pT%yg4+~wUUNZN=%@Niq)T(49ZS}^E*4=yZl8e!%+iA^58HsY)qOE%@n~8QVDj#xK zO3Sh&z6Pvs;bJ1?ohZ+jy?=y$l4$LyDf^-+HEo!M$nov7k>_-6Wo>%=a;;y6*BQvX zh~_NlH>}ss%&KOSWGL!8KDxvr6;Y@V+vG(eSq{Wb^r&Gz7SE$-(_`K-?yz=Z#psLb z8t$P9r$Nf{yD3oUv`#_Nq;VAbmd6FX*JbV|<>WLA|I$pYvnz%unas?H8dGzc>;trk z=E59$de+0(z>VCX?ZU5ygyE}I0aX3E=(hBTKCE53=-eak^9pF^)%+V=&xBa-E+N%2 zXTN1p?crwaLU^JVTw|{%Gd+#vti>8C8gS+0cC!;Q;c0OB(ozLocfo=~zWVmjAdj%8 zmsRZK;^X?;VUH&7j($7XuG;ABd^)_toHX}kqtFo%#hP49QQdmu8QwLVRR(SN<%9rE zTXJT>9o^(eQh9}G4Pi}p|A4E{zvE%_RBJd5ardM;QVPtC^qduWiaIE;4{}>rpCK;N z@@E2TT`@>nM$QA%@;yjeULk>`WfWB<8%twTGb2n36+1mU;44|+sSB{qrBJXp*Eh1E zguD;5w9_-Av;}_)^ekqhq`BD9y9@`DhYZ}GS40CZ&Xuv-9#7aiYPVeRBd=GDkj)+t z3+zmhL)eSJmc*i3_D_tYm?^4sn+bEn;jF+f39u0fazQCqjG877ktL+)qC`b|ur5NS zl!tJAs3$?=X^b!VsK%|vqh8?AOwXMF2`daQ^mjF6>nP#YRy4vmBlC)hWKAiPNy|3DF{&M#T9T+JVEe~sN6{#=GRiy8 zcMb2}6wx5}-XL-Jfzs!Sowf)(tx$UPIirXaI1tM|7%i(@R7pP@L9egWmP<@I{@oFqtEJeHc=Vx9j^AuQOdHNTT0aq}v@0a~xr z8M$A)s>XWN`VK~Yj< zHZIcI&d|g$wCP8@DG=lFNU34e`I&Q{>f0~U){L$keUY$-yCP>;V?_qDE;UR(yiteT zc?^lzAM&|Wcw3);7@(k06wMM+ln4xI(_q(Gr6(KA!N-u=(#|L-_FPWRuA2!ZU36-I zyS6_NNG&;~LdGV96?vvlX?+$9H@)sm>t4$g_`*Lwo~ z*u&-XnvoCnUn?n*k#iFcWD~G_x;|xgm9VJr9WJ793uMtwHyaoqM#|hy?l`{BZ@W&~ zCRL#ReBF4`(g0K27}Jj9t!oe}DeghEV*E4zPVAj>-5b>099?E%E4nw=_OZ*#Vx3t7 zz6?_IQyFXBMUGRideXHBXRLB}nEI*Z-8j_GL8OH!j%~OvNZ~D%ni*4ftdOP&^Wvm4 z013&05-I{Eqz;kL`lH_@gl{2lq-SeyV`Oe*VfPP00$xu*fBUPDR^VWY{t{9)AS7)@ zlNj0jfQV@RIFwZps!(##K8)eehZt(+C&0>!TK~y)eXIp<+^Yzq3^G>FWhmHijUx~c znfKGN8CAXUpDuM3R>+ECZ9D{plmZb_$aFP2Cc<0fLX^sz)8a5>EZ-uH5v`1eV-D-Q za*)!d)P}F+nP93O64&!(%b(#jAUV2KjHN}`-$ZtJTh&o#HtQQ5J@+bdcO!y2savj> z?haA^6{Xk!V7n_D!bl1x=#*oVAb_iBdR=fNAK6w2vjYf>?jP1A91~4 zNOBg>AzVI#LuGtgJzO=yp MKV*}yR!j@d(P3oea+qoNV>Mp;8#J-vaBKQ;vSrc>Ud|HnyT95R? z)_B9F8napNrD)Hc`4RW36|kzLxrYsN`;GSm*G-bNuT2HirB$_`@P{cd-EHA>xzdl@0esxi3YC9 z2Ln5xUlPx?QLR4z)TZ}2jUltyFS9U?%`P&$hT*EcRd z^Qc=V0VUl*e{q&UW4###H{GQHD2XKyul8j;kC-QG1e2vV&)OD^e7wS$-EwaP_OS<> zgDrdA_4apO*B4XnE&5>FX8H0ZnlmEnkQqxN#UPM+G=~cCNK2KfH<}oPr_LNoUtOC? z>2iJD^)96A%)wXCqn zWvjhOq&yPd0!TEGXDSapKo%iEC>Qo11 zMy5vtV%zjiB@Bojl#H*-xQmZ9uk7|s-p1M=OE_{cc6jWBQi6;v7U(if?HflK4nt(M zOk)i@+p%316LhLxq)ML1g0(lewK9^5alG#UBjwS!Sn~N0vI`N0v#cw<$J@j2=J#_1fbT}7X<7y0*G8$E9 zJqmq`qmw=I8o1bB(Yi~@G}Jw@Nj{NXbq>Jok;p$Fm;Iirw7EmD;I78m(~MHt;T(O? zuFF5QcBj+zDxBr@NO)$rP}?0$Gn2_^^Hgr($=H-K5xA5&qOu$3u?{CXBA#%M#~Z2U zc$0A2zi`duD1WgLO&sk#%xE+&_!7F<^|EEPn|8XNfx(?msyE?CM9#2?fDDeo2*r`;^vn$HlDwOcQ!xVwYg-U^2V zP%{FgW;#es@SVUnvEQhPVIgg42E9$XcF9W<$d7*|DKS zlF0FSFr%Z;Bcok~eIJM-u!{BtNirl_H_0T7-{K%a^$4cKk3#Yt8l=~pkP}fY&nNiI zX7ZxIo8=nX#<*?jQ8bd~a?j4R`_g%`YwrwI^QPDpDwit{ecyQ9f-CnCqliSuo)WTY zi1>()+!_L(K(dnQW^lxupj^x`Z}fVUggtdzA;RnZEWpRgm(5aC;xo+6bb&M}Og`E8 z-aA)tQLJc{5U8{5Rx~-+8E&KM!8{HlySEe@iwCsZ)~alS`z(9i$X7 z>KBWV!pG5UNIb=r;I+#!ThBl1Vt#uDg52LpG_3!sJz9;O-e2-iRcJGc~(_D-d2|ASx`d)(TkxhH{^0?Jq zneK=`X5eE!@se|TR@wpM%EM@PLgnKv;hJ9l=o9U>Tl|u5L}ryIGx11{9#JSwGE+Fo zb&%e|(e({*bo%(!VswVj&G0opUlJ_`-y~bXj-}}r4_vtU8vUKvV7yA|h!Tr;<^|uT z5KW&pPKTtHZW!|?PR_|?uh2K;Dr$NFjlSdgzYk&Di16$FP_#_GF^^8!L>1Uak6q&- zMVu!rM0UoFpz6AgS=Utbn(Gmht?MoItE4x)5%F2>;3n@bbecz6-bZ{~=FKhhuEtrX z2u7Rbi}kdOBv zsd5+W{{+2n$F)!~(X%l!ls1Lla*$t=^5S=tkYD~vO-VSIf(vRY0!Q3pr&%_BU!u>x zYFCEEq)Et>FD5-o64>+tTQmUM?n6b)LqF}9*CFVxL5%VUpM1(GM=EN?a}O8;&$M6p z*rC_X=cnVwiYDFMNl5!Fid@e}Q8$&8Fm;oAtNSaqJ{F}v_8lZP(L;=8oN0kuyOGr} z+uy~szt{=(4|8(dTP9-OHI)1;pORTqkWhDXd@HE8Ou@3y>NCHnMKE@N(sFQ^=n11Q z<7ci7+;W;ECa)NPqxb+v86&W$TkNdUvG?K0{5U+zI(-Lf{IbPQ8a5Xz(|YO6vEMQ% z27A-V!@s6wl#UVGsqJ3hc+9zHsnM0n{Xik9mXEoNzS7ueP&{Gi@%y{3<_{Mut_3)A zCz?LJ|2^qDyIssizl-1b+Tc`zhp30qELMHj8S3|h4S=G1rS2`aMk<@>d~m;K2CmQs%++1%Yw-IUYkHWaVb zdzX$qZFFjyv}Na;f?>qQ>wJnx!_Ioa+a5y*lNc472 zH_Cirg4M^oQ%4|YvLBv`c04G%+THR2y@emcQ;|IFc!9LhFsGIkV<<8vtR;N8$ZQFN zQkX{E1Xp^zkrl%*T`EAw-_z9bEym3^2AQF8au3P(A0QMHz0<>I5yU4w*!ySysd)8xzVfW@xn7wR$X3Lu&Z(p;1qAf)+c|XqiGd>TxU7lvhze3z8aR)!#Tcj<4aVr z+l21iJDnXY6Q<8hb80G^N|u-ckC{!%ufF1Ae4}6+V(gPc9@IU$#i=nZxN-1w>Xlp4 zen7dDp_j;n#|W;6FRT-O3kA1dO6=EL@Ndvt(m4DWSoH#7N5W=5+}N2_On6T&){nc7 ziAr;&sXgnkKQDoBKjA&Me-51hKkdUWa{JjBaG^G+YY$?+-j3o z7!L6XGcsK0*I*L0*G@hU5Mm0eb-ySdZ6OYR`R){gqP zHGZILK|=p+2OK&)BJR7KP<-hXk1EdUWPs^k!E9V|nT?NuwkE&axZ?e_1pJNff2{z2 z^1TF-jR#|NApI-bde2s_i9`!tZG9fmZu9^@CVrEJx#J0&_Jb$#VTgCkFg^GlAbqDr ziOLXCyhB_s9uXmke`gtsPLo}EcUrDFHOpmGOk@{(!nWsoHy^gk1ku~Ht%KB$HDh-i z8>v(qJ)ii#BAXWZ>JFS5UhXAVuj&MI%A2neL}hEn6L~kQC~-TKNU?2|+Mr{mIgiuk zi*zh)Sm+nSEQ43x6yuwMuQKeeR^QLwl0}TZXG?_+?3*icMxhke?r@*}h-p+D?`7Au zyd}N6S!*Z4nupBpxyH_pUMZlBR$fG5a%=bLj9?7)Yc7%dHg8>Qr=6uld@_{=)0;HA zSrhjXUFdF@Hn!<|os>@%yOr&;j#imIZ-@Kfa`uMx3<^ItY#^A(v|Bwv= zfbQB-j9hhmo31;El+T_PeQ%q@;@L0&nI37q{tE`KXBI?1AbGOcvfSUs7&hEFB z0nq(9K=+cznrF|f>%``Zb9`s=hFWY{j!++c6so_LSS$5iL0bV}C! zR%81G-^}{07yd_e(qP6K&<1r8=3yz7YRl>=^w+Zws&mN^h`Yf!I~&r=6*WJbL2;!cney4L+D z)+m$+4`toCba}oPWvxE%3lf zlC0IIl`Zpi7I}Xgob|HrieP{4-Gd}SgG6c4POVe3yyIjTp1ZGlkvk)moJC-2rC+fl zc7A+WN(mDdwOSHrKd1(`Q2qEyj9P9?1I&EmJ-4t>`vvjzx=kXng)q~FMUCKaEQBsO zRQ}57uP>SPGMdWdnU@@b?kkLTwIF%amek;IFc2M>cO14GAt>IEuYP_1jF0MI)A9Hg zezju8;2lhiMgEW#$0^U#&XboEZ9%gPbW&b>mYL+i4V?cDc z8ks~zFlz5Ojc_*hVA8!&{5JKM8J;t`a1+lAEuq@(Hha1l0S(~=rJC`AXQvWJ^I6~W zx1Htp%Ip_bOZzaM+S{8_DlM_kQM}ynfiO%BWY|U5Mk&a>!+F_n47+l<-m+39xTM$R zatq`ZG8|0iU)(~$ks;xnd@q5i=Z_PV|G2c2E2lI!hlraA4{h}dMhCzx5rA7d>3tsQ zZwZe3?Ek|s2s&9%=mE|Wc29gPh799WAHMu8(%kQBv+n1 zNvfxHC0*OmWswLpqm&VrV}zew==f%KUBfQrG5k^F$NpYt5$09T_97NJdyff){p19b zx7(IGWqh570xxE1*uSZTw!&eVdr3X>=X_FHr~BoJsoK4_gK7fS%dZB93pYz^$5tN| z1U0`b51ZP(KZWaQ@nV%f)uu^p63=t<#j1$nQInc6LV7^fv2s)JYFnyJd&zE$qK&K? zjE$Nq)(ayEzS-+iWO6!3Jh|hIa-U|rJQ1(!^?Ttq+@K3JbgDF7=(_&0Q^qGjeM*OW z=my*(-CPYk(NuisbVnj8Rz+tdp3T--#%uT9Q(DcZJb7Fb$zdL2u%EYvPR{Ml)b|?i zwm%cbIq@<5q{81rLOIPc3(%_MiHsQ0;Yws275;7e=QBtOX3P}sI&fqW>kF#qbZn-c z-fBWl-2rxV3uGF?h(Is*m(NaAj?QYo`7Gp?u0EfNc`7H$ZKgVqO|F=79_lJy>iG(w zl?h0zi)Xcv*Bx+hXur`4=Z|HRl`82axBgr;fegd=@sxHWrcqG^lD*8Y^MnOal?E+h zUg^6wU=o@|ol8Aitm?~f=8fNnd(G1y?Ru$zzCIi$=NU4+MR+M+dkBj{b9c+j%-c29 z#JzWx8op89(9@-wiJ0s?nzZH1ty!9n?b{`n_ic5cMZwUL#)*&!Js-gpe&y_7^5j{= z;qLKnnT=k_Lq_M2MbK=|i8G)H2S}8%fr12C^~I37J*9<3e`K6vt!ler<)vDGlp9k+-64Pt@QB z)ezGK@40oW?IU-R!1c-BbNi?^i5cw-yNsDnj-qkjZCDMHxJ{UkCubLda_jY~>%97X z%#+TOR!$|sYbq8~*~`nKO@-xejHJ-x%+L*-!-qDKyKz^NyAmhXj?9OTC7VK31u8RV zZMASn3$?6<^VVx9dpEI0*Y`HmGWKW)co)M7qbM5TYY5X^JW|GvvFnH;ouqNbLdZUe zjrEdHrW47eB2dqyv{Z@gN)S5@5OG2~&#<=X)RgY5y~8LuK( zAR%97!y(u}c!sEY*VNYTii(|$k)FAcjf{n{C9b%oy}p?X1!9{fKvGQt?&*rEF1#H4qPG}tT&~JR|euJ#rMd7NJ{C5 z49}eu+bzt;59FT2xg%V633A>{Ihok0UP`sy%$C3s644$IVMIz(a?l#s9=xfHRwgq) za+TpWNj25XMx05K-;}bp;Bs@#TPt$j&Rq(fqs+Fi=EzU#X{UPdixtHq>)%gl=k^GQ zGt8yuKfyHq98Tu$8g|>-J-BlER2NNB{0?IIYIGFrz^?3KOG1J-&^Y(>RuGMvplz=Z zc}K$t7ayl95__MNtW8sTKl&oku?ClwyJk8?yQpK$-6c;^?)p+Z+SD~Z931)SkpP2< z&mTe&JSBFYh22(|y)A{*Lx|YcHEZ`4k$pSG9V7ZHe1#V*^=InnpUscRr481!b&b(0Zvy{&5tbcED%HL8Afnq3>jNcaFMCYU8bXNo{Q_g zRr2DA8JnMSLZHL630XwY`4jngnRCjnI{p?o?y9TgRdar}kCOX@Jm%ML_LW9$f>kU%7gx|JiL&4Zm9HYx9f~#^KR#j&`X3p6{yeZt+%OM|puwm)WdQw}o zpgkV9HK4lG$d)n{MI2$oAr#X`0U+!K2B%i3QOkmwX{=(eWMionbCu%!O>f2*AH^uP-er% zu5PGXBFnq^@p?~IIXoS0xfQg2PoF@qqASX>&AM`H@8t2>nrrd!){$mzKHlugp{P8@ zfSO;H_`H6XjKI+D(hVxc6=A;!fVuJ#s%Xffq$eciy+e0 zY_f@=%h%n<`@*k~VEO=+^tEP>((_YiE*5I7rtpP##`T1x+<6az6`HNWw^Vg=4C2E> zzrjXnRJ_Dl_ASvnDjbM@1{`v*pJQU8`&5rwrpMV!tavY(F9Zo=0NDP_k{q<>yHiI` z{qzjE-}sYk@kevf?)Q0dTh((^id_DJR;G_?XZ<+z@xD;Enw8G-qtPsCl^<6c2+YO2 zK=dnVu6k|2aj;czeRHZF^C0)mRPN1l`$OCDLWx~T`7g!i7W0Dren=gk#v5gkQd4oR z9t)?QjOSQ+AWtRSI8BoeOqZa<5kbn6=i_)TsG%a@qTy7|PKQK1`jPlJi)_O4h0WJ` zk9|B`Hv6tw^r24-#5K*C-ZiR24?Al`v2rjn6&edPuL|xJoXB(J8KNKg05LK6F96`oLN{>XBO3aPDV<>tPQ5=k) zt@Z{C&gXs0?d|PWj9AD<>I56@EUY6q0>W4BO(kGyc!SKoCxted)|_~=;|<3{@c;$m znJUh@!&_L4cGfnNK8rScRq>b=vM?R*HLGayy^37neVm z(CT7mJvE$``Qr6ZIxJfJ;cJ!+Hs7F)q_ROYtu?x~BpvBd-(X(ln+Tma;pDwG z92`~39kvr&Bxs!L7&r--2RmWicrCxU4@OdzE(gfG&o8c&HbeZ3j-OTAVARfUQ_*{e zLNdk_VP3C1$)5KgR8KjnU)L@oH_)|o3K zTDIO2(ohe#rS9&DQ@d~|V4^TnEjG^_b{BT_LD+s1PBV+~bRA{Wb3?DU+E+TWOWqB{ zyti6-_t|c|+~*1n?U&9%oK8QuJDXk9J5JNv1COsPAokz#n#1JDasD)%^z}qEum=Af zdZ2s4mE<_z-4&LV`b|6D2t$?AzDSj0biCvxy9B40y|ivB!XS};%uZuo2Wp2d!B8KJ zh1zT_Tli~x(_Yz#-hEoFSkLTX35TqGFx*=C~h&=aV;!Ilw6r!1SOJ8s=ljNUKJp4_-s z|ItfC`)$=AE&a-7M7$yE2AWMwfn;1SQi$)hiHsr-F(Yw0Z6UKz*-0O?!qdi^%BcJ= z`40^()~kg`8af^@vhE!|4)M#Xj@{@toL=#6zY#~Z=FnS~+2Gc_HY4>!B(D6aU@^|n zo@4EJO)%j)A0bC6cvev^}6fI`YU z<r+_+*T-aC zb4D<97zMK5(>t0c&V3NS9WyG^&~^=k;~g$uaY*{v^UK2OXvUWeLpSl(BJ z=4&I{6+Ly8H})yANWierkh+0l`cB4Q5TuS3G6o}OrsJL4#YY54Lucr(8Kvb7zC>k{r6_&)jBzaBQQS%t>GmVO zvMwjY_9Y{XBvX1K9;BkRSe|Q+ypJ9T+0f@It^~+V=6dEgUCZXBm7+0!BMY-&b!vLJ z%YR7A)Z&%I6X$f$1-giP>w1_;*q0q%=Rql=iCFz-^ z+}~{)^Ht@!ySo#VQzo=b6DQsxY?=)svvq$=l$z?Ao?lPu*?i5@yQxj=9`H3*ZK#93 z(g&G$h3`II%$l>fYLT8?C(-bpEV;vOVPA_H*6Fn_uCFo_f?lh8b~j#4ZfV1OWPWnq zSeUbqCS3gr_+mg0$E_%5F-wTf{n&S8>C0&{&kF56@0iZRH;Sh(DF`ArG|Ee2*C}7* z-s_1B7>uWWV$G9Dz|JSfuj+q2?>LChBA8~hHT|@3b1+T1Sdgv0Hh$ykP*AnnmE$7& zC%kc8Nvz2RG^YmxK|6%m0k(VO#Ny>D2Yu*8sBdTS2sLMkXK`uCB3EC0tqOcbvBY@W zJ&6A1-TFyabgkX@%Ow(HA>=ASjUQHRI_K{SBZpguEE^Y`0s zKVh3ZEZFQ=$6blQkfvj3bo*N$4aIGT5mE^Sy9RyRtWW-)1-A`9=1kfWeZ5P3=th$3 z1v@S|deF=Jm7(K}lN7@VP0igog#)-7XM77h=XYW!gDQP6>fp^y-!Zf5Qd-?FWRnUC zGejhC;$##^GIXE3<-0&e@d4&MDz8{i=oHkW<;fvf@ zz*HM*xcBHz#3br4u7;^NQ)a^p#cFBuuck6P*Q3duKKo!9x%SNo(lEy#6ofR5j%;Tm zR%$%;6`8d5kmsv9XveRuv_>`vZn-7Vc=WAb2Z7TJ%{{C(o_{5*wdO?_oYs|Fq_buX zS|pAS!>TsV@anA}KY3g`nzfFEY*7`H^t{1Z;G|SA?rTp<&v`y-+HH?d5rnX5l>}_! zFW2Mi%gs#HhG% zgVA2#m5lIUBZT)#u2yCk#WfVGG`|ns6`io>`l?Fs?AFSmn4Uq9(Nz}1Jc;A)M0*b` z5wzAFwK_(OLsn@t1|F#mDMSp|?5{`=85+px8R3likE(~P+@aa{I^+>C%<{R{FIRh$ z?%Ip*(wRQl4Qe7o_>x;ueDiunpJhgq;WWL=;tmQ_kG1?ygveB%sjjV{5n&rXd+XfV zO2D$Po%qe_cIU9R%4F#1HKeuJT7Y-(p` zWW#1-X=w)xgwcnAK^THyqEUmGyZ|N)EG6(8Lj+Z6PDv!7dAp7w2PU*PKd?X8kOKzh zY8YhDkHdE$$GE{D0*6oY=uR#;2ODR{$7b4lX`VzXSj+fOuo23QXAsXvbv-d>AGn=p;gqwfhP3 z&%VHJff(MP5t0xiSXiJKmq&m71i7^2H&+m>ASh_pKol+r3LCib8=MhjumO}I2bvPl zJ>%yb;(?z<_a=ZNAkVa5xI&=LWBwTNBMLZ|11|$f588d%lMP1V=j3rpf<4)OkK{!o zhu@-jaVVe*XaVH>02moWsONYP3;qb>MZ@Xe{6=PmSkapTVnEte!`!8VdU4UN`sd6+ z+f^HKK;t(L`f%Bc0!Bp%YQbg4#h(a&yYSd!^Pv`83h^hx-!A+u z#DXv=z%N4liSQ2|z;8o5Kw|*4d=rvNUfV+o({YsqFg2zD9oibzdM9r25|_D7{uX$;B_N&2AUoMgibPl0O2KWgy znv1_M3oJO>6;LZKlMEE&9~^-N_YWd^fhK@L*-3&z{E}s$82{u4!WkGxRuF_A5|ceY zCy9`eONV!9I{M;+N$DOfA2A1)SCf;{4&%j}?p`7#gtMmn8Tx1*ivba{h4Y zr#*lA1fK=Qm=OemRA5+XF6iul71-L+>bD9E{2RFSxX9BN+t(n81y*hdIu&3A2L89d zln6`)@Z-w}vxAYjtiZ4;*P+*jR^UsZzv~rf3;YF9E-NtX19d12L_8N$af$N}1q%d1 z420Oz`x=}JNWz8H@P|4DF13GP{852{pF)NFX9b4U!GziZt-w&2|G^_z@V4le3Jj}z zDZI-H42Aih971phgL_$lVf8nl)?8Fz00UZqfxiP4*c6jFBt z;O3uU1=oj&mlYV+WdM3ru;_pkzeM@HaDi69(}2{ttiZ5t=TMAaD)1%9AC(J4LH;!n zK`Jn;7d6zEiwgV$z)BTbfq|buqqziHaltH*5P`N(D=sTA6yqNpfxTEIT~=V&U`;3l zI2pgO^QRq9nSy>GaDs8XNW|O_KSCv-Acz3Nb?h*p1p$(AU|s{dcFk$~4w>`{)q(J=oHwk*BN literal 0 HcmV?d00001 diff --git a/CI/physmon/workflows/physmon_truth_tracking_gx2f.py b/CI/physmon/workflows/physmon_truth_tracking_gx2f.py new file mode 100755 index 00000000000..8e70df69b24 --- /dev/null +++ b/CI/physmon/workflows/physmon_truth_tracking_gx2f.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +import tempfile +from pathlib import Path +import shutil + +import acts +from truth_tracking_gx2f import runTruthTrackingGx2f + +from physmon_common import makeSetup + +setup = makeSetup() + +with tempfile.TemporaryDirectory() as temp: + s = acts.examples.Sequencer( + events=10000, + numThreads=-1, + logLevel=acts.logging.INFO, + ) + + tp = Path(temp) + runTruthTrackingGx2f( + trackingGeometry=setup.trackingGeometry, + field=setup.field, + outputDir=tp, + digiConfigFile=setup.digiConfig, + s=s, + ) + + s.run() + del s + + perf_file = tp / "performance_gx2f.root" + assert perf_file.exists(), "Performance file not found" + shutil.copy(perf_file, setup.outdir / "performance_gx2f.root") diff --git a/Examples/Scripts/Python/truth_tracking_gx2f.py b/Examples/Scripts/Python/truth_tracking_gx2f.py index 8db31d2252b..616e08d95b2 100644 --- a/Examples/Scripts/Python/truth_tracking_gx2f.py +++ b/Examples/Scripts/Python/truth_tracking_gx2f.py @@ -108,7 +108,7 @@ def runTruthTrackingGx2f( inputSimHits="simhits", inputMeasurementParticlesMap="measurement_particles_map", inputMeasurementSimHitsMap="measurement_simhits_map", - filePath=str(outputDir / "trackstates_fitter.root"), + filePath=str(outputDir / "trackstates_gx2f.root"), ) ) @@ -118,7 +118,7 @@ def runTruthTrackingGx2f( inputTracks="tracks", inputParticles="truth_seeds_selected", inputMeasurementParticlesMap="measurement_particles_map", - filePath=str(outputDir / "tracksummary_fitter.root"), + filePath=str(outputDir / "tracksummary_gx2f.root"), writeGx2fSpecific=True, ) ) @@ -134,15 +134,15 @@ def runTruthTrackingGx2f( # ) # ) # - # s.addWriter( - # acts.examples.TrackFitterPerformanceWriter( - # level=acts.logging.INFO, - # inputTracks="tracks", - # inputParticles="truth_seeds_selected", - # inputMeasurementParticlesMap="measurement_particles_map", - # filePath=str(outputDir / "performance_track_fitter.root"), - # ) - # ) + s.addWriter( + acts.examples.TrackFitterPerformanceWriter( + level=acts.logging.INFO, + inputTracks="tracks", + inputParticles="truth_seeds_selected", + inputMeasurementParticlesMap="measurement_particles_map", + filePath=str(outputDir / "performance_gx2f.root"), + ) + ) return s From ae5640603e5117f3168c606da490a9b23e9bbc28 Mon Sep 17 00:00:00 2001 From: "Alexander J. Pfleger" <70842573+AJPfleger@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:52:24 +0100 Subject: [PATCH 03/10] fix(gx2f): propagate final covariance for trackstates (#2949) ## Issue I figured out, that the trackstates in the final track contain the wrong covariance. This occurred, while investigating the unbiased pulls. There, some dimensions had a negative covariance. https://github.com/acts-project/acts/blob/19464fa0d24f031083ef3ad3108b74f2b5fa5454/Examples/Io/Root/src/RootTrackStatesWriter.cpp#L456 ## Reason After the last update we calculate the covariance of the initial parameters and add this covariance to the final track. However, the last propagation was done with the initial guess for the covariance. Therefore, the wrong covariance got propagated and assigned to each trackstate. ## Solution Propagate an additional time, with the final parameters+covariance. ## Future Plans Since an additional propagation is quite expensive, we should look into the following two ideas: - calculate covariance after each update (matrix inverse) - toggle the re-propagation if we are not interested in the propagated covariance ## Notes This also removes `nUpdate` from the Actor since it wasn't needed anymore. ## Blocked by - https://github.com/acts-project/acts/pull/2972 - https://github.com/acts-project/acts/pull/2966 --- .../TrackFitting/GlobalChiSquareFitter.hpp | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp b/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp index ef7b6b559c4..a3a5cd637e5 100644 --- a/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp +++ b/Core/include/Acts/TrackFitting/GlobalChiSquareFitter.hpp @@ -369,13 +369,6 @@ class Gx2Fitter { /// Calibration context for the fit const CalibrationContext* calibrationContext{nullptr}; - /// The current iteration of the fitter. - /// The variable is updated in fit(). - /// The actor needs to know the current iteration for adding new - /// trackStates. During the first iteration, each measurement surfaces will - /// be added to the track. - std::size_t nUpdate = Acts::MultiTrajectoryTraits::kInvalid; - /// @brief Gx2f actor operation /// /// @tparam propagator_state_t is the type of Propagator state @@ -648,7 +641,6 @@ class Gx2Fitter { gx2fActor.extensions = gx2fOptions.extensions; gx2fActor.calibrationContext = &gx2fOptions.calibrationContext.get(); gx2fActor.actorLogger = m_actorLogger.get(); - gx2fActor.nUpdate = nUpdate; auto propagatorState = m_propagator.makeState(params, propagatorOptions); @@ -797,6 +789,37 @@ class Gx2Fitter { ACTS_VERBOSE("final covariance:\n" << fullCovariancePredicted); + // Propagate again with the final covariance matrix. This is necessary to + // obtain the propagated covariance for each state. + if (gx2fOptions.nUpdateMax > 0) { + ACTS_VERBOSE("Propagate with the final covariance."); + // update covariance + ACTS_VERBOSE("finaldeltaParams:\n" << deltaParams); + params.covariance() = fullCovariancePredicted; + + // set up propagator and co + Acts::GeometryContext geoCtx = gx2fOptions.geoContext; + Acts::MagneticFieldContext magCtx = gx2fOptions.magFieldContext; + // Set options for propagator + PropagatorOptions propagatorOptions(geoCtx, magCtx); + auto& gx2fActor = propagatorOptions.actionList.template get(); + gx2fActor.inputMeasurements = &inputMeasurements; + gx2fActor.extensions = gx2fOptions.extensions; + gx2fActor.calibrationContext = &gx2fOptions.calibrationContext.get(); + gx2fActor.actorLogger = m_actorLogger.get(); + + auto propagatorState = m_propagator.makeState(params, propagatorOptions); + + auto& r = propagatorState.template get>(); + r.fittedStates = &trackContainer.trackStateContainer(); + + // Clear the track container. It could be more performant to update the + // existing states, but this needs some more thinking. + trackContainer.clear(); + + m_propagator.template propagate(propagatorState); + } + if (!trackContainer.hasColumn( Acts::hashString(Gx2fConstants::gx2fnUpdateColumn))) { trackContainer.template addColumn("Gx2fnUpdateColumn"); From e11e99b8da27df8fe77f51a38cae20110b7227ed Mon Sep 17 00:00:00 2001 From: altsybee Date: Mon, 26 Feb 2024 11:31:39 +0100 Subject: [PATCH 04/10] feat: Add particle ID to track states in `RootTrackStatesWriter` (#2977) A TBranch was added to the trackStates tree, to save in the tree particle barcodes for hits per each surface. It's useful for layer-by-layer matching studies. This branch is vector>, so that the Barcodes are converted from uint64_t to double (ROOT supports v>, but not v>). A size of the "nested" vector depends on a type of digitization, for "smeared" digitization the size is not more than 1. --- .../Io/Root/RootTrackStatesWriter.hpp | 4 +++ .../Io/Root/src/RootTrackStatesWriter.cpp | 15 +++++++++ Examples/Python/tests/root_file_hashes.txt | 32 +++++++++---------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/Examples/Io/Root/include/ActsExamples/Io/Root/RootTrackStatesWriter.hpp b/Examples/Io/Root/include/ActsExamples/Io/Root/RootTrackStatesWriter.hpp index 8b2a0b4dc09..b3501c61e5e 100644 --- a/Examples/Io/Root/include/ActsExamples/Io/Root/RootTrackStatesWriter.hpp +++ b/Examples/Io/Root/include/ActsExamples/Io/Root/RootTrackStatesWriter.hpp @@ -144,6 +144,10 @@ class RootTrackStatesWriter final : public WriterT { /// truth parameter eT std::vector m_t_eT; + /// event-unique particle identifier a.k.a barcode for hits per each surface + std::vector> + m_particleId; // using double (8 bytes) to save uint64_t (also 8 bytes) + /// number of all states unsigned int m_nStates{0}; /// number of states with measurements diff --git a/Examples/Io/Root/src/RootTrackStatesWriter.cpp b/Examples/Io/Root/src/RootTrackStatesWriter.cpp index 8d4329b9538..942ac903f05 100644 --- a/Examples/Io/Root/src/RootTrackStatesWriter.cpp +++ b/Examples/Io/Root/src/RootTrackStatesWriter.cpp @@ -108,6 +108,7 @@ ActsExamples::RootTrackStatesWriter::RootTrackStatesWriter( m_outputTree->Branch("t_eTHETA", &m_t_eTHETA); m_outputTree->Branch("t_eQOP", &m_t_eQOP); m_outputTree->Branch("t_eT", &m_t_eT); + m_outputTree->Branch("particle_ids", &m_particleId); m_outputTree->Branch("nStates", &m_nStates); m_outputTree->Branch("nMeasurements", &m_nMeasurements); @@ -337,6 +338,10 @@ ActsExamples::ProcessCode ActsExamples::RootTrackStatesWriter::writeT( // Get the trackStates on the trajectory m_nParams = {0, 0, 0, 0}; + // particle barcodes for a given track state (size depends on a type of + // digitization, for smeared digitization is not more than 1) + std::vector particleIds; + for (const auto& state : track.trackStatesReversed()) { const auto& surface = state.referenceSurface(); @@ -360,6 +365,8 @@ ActsExamples::ProcessCode ActsExamples::RootTrackStatesWriter::writeT( float truthTHETA = nan; float truthQOP = nan; + particleIds.clear(); + if (!state.hasUncalibratedSourceLink()) { m_t_x.push_back(nan); m_t_y.push_back(nan); @@ -399,6 +406,12 @@ ActsExamples::ProcessCode ActsExamples::RootTrackStatesWriter::writeT( const auto p = simHit0.momentum4Before().template segment<3>(Acts::eMom0).norm(); truthQOP = truthQ / p; + + // extract particle ids contributed to this track state + for (auto const& [key, simHitIdx] : indices) { + const auto& simHit = *simHits.nth(simHitIdx); + particleIds.push_back(simHit.particleId().value()); + } } // fill the truth hit info @@ -643,6 +656,7 @@ ActsExamples::ProcessCode ActsExamples::RootTrackStatesWriter::writeT( m_dim_hit.push_back(state.calibratedSize()); } } + m_particleId.push_back(std::move(particleIds)); } // fill the variables for one track to tree @@ -662,6 +676,7 @@ ActsExamples::ProcessCode ActsExamples::RootTrackStatesWriter::writeT( m_t_eTHETA.clear(); m_t_eQOP.clear(); m_t_eT.clear(); + m_particleId.clear(); m_volumeID.clear(); m_layerID.clear(); diff --git a/Examples/Python/tests/root_file_hashes.txt b/Examples/Python/tests/root_file_hashes.txt index d926bbe28f8..24411e5c0a7 100644 --- a/Examples/Python/tests/root_file_hashes.txt +++ b/Examples/Python/tests/root_file_hashes.txt @@ -29,9 +29,9 @@ test_truth_tracking_kalman[odd-0.0]__performance_track_finder.root: 39aec6316cce test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: 72c79be1458c4f9c9a1661778c900f0875d257f2d391c4183a698825448919a1 test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 3d424dec9b172f253c8c4ffbda470f678fd1081a3d36dcfea517ab0f94995ae4 test_truth_tracking_kalman[odd-1000.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593 -test_truth_tracking_gsf[generic]__trackstates_gsf.root: fd0a69c496b95be6c229e7f77bbd5226e65af6f5925591136fd4897ce4278551 +test_truth_tracking_gsf[generic]__trackstates_gsf.root: b1ff88d67cb89cc76850e242aa5ad3bcfd041bf5e4a62e614a878bb974967242 test_truth_tracking_gsf[generic]__tracksummary_gsf.root: ec3ef893f7138392bcdce96322e2dd31951737271b72ac9dd3282fc187700d03 -test_truth_tracking_gsf[odd]__trackstates_gsf.root: bc765231eb5b8f59fef7caecfbcd0e370b730b17e0b0d0579396e81bb80bf122 +test_truth_tracking_gsf[odd]__trackstates_gsf.root: 4117e585b59e5332bc54d1928096d8d2477a9f5b9cacb2f010b4df25106ad768 test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 3425c0974943e0dac06dfedceaf1e9e3bec3bdc6ff73588d849a234de017e230 test_particle_gun__particles.root: 7eec62018b6944fea565dad75aa41ef87d1f2737b2a814fbab189817ac8180fe test_material_mapping__material-map_tracks.root: 6e1441c418ff0b17983c2d0483248cc1dee6b77b09d0ca9d03c742c9d1373630 @@ -44,21 +44,21 @@ test_digitization_example_input[smeared]__particles.root: 7eec62018b6944fea565da test_digitization_example_input[smeared]__measurements.root: 0c168d371d0130c68d1ee44bd77eeeb3cf702a77c2afbf12bed8354b61a29262 test_digitization_example_input[geometric]__particles.root: 7eec62018b6944fea565dad75aa41ef87d1f2737b2a814fbab189817ac8180fe test_digitization_example_input[geometric]__measurements.root: 0c6d88b4de3ee7365103b8f0d6be6b4db3d7b7f2a59d3db58a1e5f89fa8130b3 -test_ckf_tracks_example[generic-full_seeding]__trackstates_ckf.root: bb79b77abca6e0d092126201393fa4fd85fcd263e894d61e9379c635d481d0ca +test_ckf_tracks_example[generic-full_seeding]__trackstates_ckf.root: aa727b8c2c30a3d2ea155917abad1a77071da16e361c6ada500405839b697310 test_ckf_tracks_example[generic-full_seeding]__tracksummary_ckf.root: e122dd3afe20a1ebf870dab5a42ea154c3b5eedc13c60e2e99efc6bb8a417c21 test_ckf_tracks_example[generic-full_seeding]__performance_seeding_trees.root: 0e0676ffafdb27112fbda50d1cf627859fa745760f98073261dcf6db3f2f991e -test_ckf_tracks_example[generic-truth_estimated]__trackstates_ckf.root: 464212c438d86e3393ebc64530194a5f85fa60e3d3d2641bbcf2ffa3141f9912 +test_ckf_tracks_example[generic-truth_estimated]__trackstates_ckf.root: 50eb0539a059b5e7c51ad4953629e82d8b08159d179181ca39570f910be47168 test_ckf_tracks_example[generic-truth_estimated]__tracksummary_ckf.root: a474c6fbd5af9d43d973783288f980984df694a8eb8dd3ebe9e5c8df4bbd7924 test_ckf_tracks_example[generic-truth_estimated]__performance_seeding.root: 1facb05c066221f6361b61f015cdf0918e94d9f3fce2269ec7b6a4dffeb2bc7e -test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: fa1096e141c293f95a8e2b5929cd5078d7d252afe7d758be0032ab53aef4bfdd +test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: 9c7dc2b10e4d52a565e2ecd72077c4c90862a0c6ef3b4bad0b5dbfb50d8b91df test_ckf_tracks_example[generic-truth_smeared]__tracksummary_ckf.root: 987c47fc59851e6307715ceea261aa650aef352876febdd228778c4d030a8653 -test_ckf_tracks_example[odd-full_seeding]__trackstates_ckf.root: c911c6d56ee4d6ef06abb31bcd100b1f6a84e9118901ed20c4b1362fd1637eaa +test_ckf_tracks_example[odd-full_seeding]__trackstates_ckf.root: 1340a741753a4a1d6fed0de1867282e055e76fc5762655698d50c9978ba87219 test_ckf_tracks_example[odd-full_seeding]__tracksummary_ckf.root: a033bf22d4cc4c715fb948610151fcfeddc601a6ce427d21d4885fd7c1c971d4 test_ckf_tracks_example[odd-full_seeding]__performance_seeding_trees.root: 43c58577aafe07645e5660c4f43904efadf91d8cda45c5c04c248bbe0f59814f -test_ckf_tracks_example[odd-truth_estimated]__trackstates_ckf.root: ed89c1f1ea0abd0713fdf0f4002b9279ffad2bac497bc91a9240311b4888eff6 +test_ckf_tracks_example[odd-truth_estimated]__trackstates_ckf.root: 991050c7e3a2bf83f129e5725eac5a8e00a21c162199b29b69db38405fea0a34 test_ckf_tracks_example[odd-truth_estimated]__tracksummary_ckf.root: 5590db074051ab5726fcc2d30d9391f61d9beee2083a51375540d2cf9d38211c test_ckf_tracks_example[odd-truth_estimated]__performance_seeding.root: 1a36b7017e59f1c08602ef3c2cb0483c51df248f112e3780c66594110719c575 -test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: 375432cfc613f5aead63c55e73621c589c20816b4560f4b61747585fb1ed3812 +test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: 3ac3b12d50c2882d5e03fadb82884b1897dddda6366cece6a3ac433c4e156d25 test_ckf_tracks_example[odd-truth_smeared]__tracksummary_ckf.root: 3ec2e3dc3dc6dc2ed4dc112d668256f6ee0672c8e04baf7895ae473ad78b5870 test_vertex_fitting_reading[Truth-False-100]__performance_vertexing.root: 76ef6084d758dfdfc0151ddec2170e12d73394424e3dac4ffe46f0f339ec8293 test_vertex_fitting_reading[Iterative-False-100]__performance_vertexing.root: 60372210c830a04f95ceb78c6c68a9b0de217746ff59e8e73053750c837b57eb @@ -85,19 +85,19 @@ test_exatrkx[cpu-torch]__performance_track_finding.root: e0875db5eb3aa6b46ad4baf test_exatrkx[gpu-onnx]__performance_track_finding.root: 4845dc9f62e287e20c80d479e246eb69d01b279964cfdff83543bea0ea9afbed test_exatrkx[gpu-torch]__performance_track_finding.root: e0875db5eb3aa6b46ad4baf846d39b37b68f1efd3436448cc75919b637f8d8d9 test_ML_Ambiguity_Solver__performance_ambiML.root: 284ff5c3a08c0b810938e4ac2f8ba8fe2babb17d4c202b624ed69fff731a9006 -test_truth_tracking_kalman[generic-False-0.0]__trackstates_fitter.root: 26640d70f7fab870e59666b0915569a6f8f82af68c63e5505548ffa9d24a3212 +test_truth_tracking_kalman[generic-False-0.0]__trackstates_fitter.root: b598a07612c58866563ae862e651d9f42c13249d83d7176a103a565fa60f9cb3 test_truth_tracking_kalman[generic-False-0.0]__tracksummary_fitter.root: 11b2e2a50343c636fa977175a30220805412d3200e164ae4c3f439fe2087fb88 -test_truth_tracking_kalman[generic-False-1000.0]__trackstates_fitter.root: 476e0dca91e5168f0574b86aea797dc22900fd456b3c3fb24d5f571b4be804fc +test_truth_tracking_kalman[generic-False-1000.0]__trackstates_fitter.root: bdc70d86ba6e717307e32c147401dce80f76dc9f544e7ed0f26ebf2f9e5c3057 test_truth_tracking_kalman[generic-False-1000.0]__tracksummary_fitter.root: fc82abfc4e3016cda806e743a270bf78b6d4cc404cd52145ea1eabed85d32feb -test_truth_tracking_kalman[generic-True-0.0]__trackstates_fitter.root: 26640d70f7fab870e59666b0915569a6f8f82af68c63e5505548ffa9d24a3212 +test_truth_tracking_kalman[generic-True-0.0]__trackstates_fitter.root: b598a07612c58866563ae862e651d9f42c13249d83d7176a103a565fa60f9cb3 test_truth_tracking_kalman[generic-True-0.0]__tracksummary_fitter.root: 11b2e2a50343c636fa977175a30220805412d3200e164ae4c3f439fe2087fb88 -test_truth_tracking_kalman[generic-True-1000.0]__trackstates_fitter.root: 476e0dca91e5168f0574b86aea797dc22900fd456b3c3fb24d5f571b4be804fc +test_truth_tracking_kalman[generic-True-1000.0]__trackstates_fitter.root: bdc70d86ba6e717307e32c147401dce80f76dc9f544e7ed0f26ebf2f9e5c3057 test_truth_tracking_kalman[generic-True-1000.0]__tracksummary_fitter.root: fc82abfc4e3016cda806e743a270bf78b6d4cc404cd52145ea1eabed85d32feb -test_truth_tracking_kalman[odd-False-0.0]__trackstates_fitter.root: cad01486e071ffdb614d15934354a1b17f2bfa95dd5d440215f606d8a79afe17 +test_truth_tracking_kalman[odd-False-0.0]__trackstates_fitter.root: b9d96ea97b967c4fb40edc93b00fc307b80fc509309625c8e2ccc136c3e1a40a test_truth_tracking_kalman[odd-False-0.0]__tracksummary_fitter.root: f42d1cd850b78909b07cd6e412ae03c6e1ea8c99a02000892dd957319f0a825c -test_truth_tracking_kalman[odd-False-1000.0]__trackstates_fitter.root: 72c79be1458c4f9c9a1661778c900f0875d257f2d391c4183a698825448919a1 +test_truth_tracking_kalman[odd-False-1000.0]__trackstates_fitter.root: b858d09a75e852a7c23f2f3a512de8c334c593e700319d4f935e844ec00c379f test_truth_tracking_kalman[odd-False-1000.0]__tracksummary_fitter.root: 3d424dec9b172f253c8c4ffbda470f678fd1081a3d36dcfea517ab0f94995ae4 -test_truth_tracking_kalman[odd-True-0.0]__trackstates_fitter.root: cad01486e071ffdb614d15934354a1b17f2bfa95dd5d440215f606d8a79afe17 +test_truth_tracking_kalman[odd-True-0.0]__trackstates_fitter.root: b9d96ea97b967c4fb40edc93b00fc307b80fc509309625c8e2ccc136c3e1a40a test_truth_tracking_kalman[odd-True-0.0]__tracksummary_fitter.root: f42d1cd850b78909b07cd6e412ae03c6e1ea8c99a02000892dd957319f0a825c -test_truth_tracking_kalman[odd-True-1000.0]__trackstates_fitter.root: 72c79be1458c4f9c9a1661778c900f0875d257f2d391c4183a698825448919a1 +test_truth_tracking_kalman[odd-True-1000.0]__trackstates_fitter.root: b858d09a75e852a7c23f2f3a512de8c334c593e700319d4f935e844ec00c379f test_truth_tracking_kalman[odd-True-1000.0]__tracksummary_fitter.root: 3d424dec9b172f253c8c4ffbda470f678fd1081a3d36dcfea517ab0f94995ae4 From 032dd9a4c379f90c336599f1e464648607aa9606 Mon Sep 17 00:00:00 2001 From: "Alexander J. Pfleger" <70842573+AJPfleger@users.noreply.github.com> Date: Mon, 26 Feb 2024 14:59:15 +0100 Subject: [PATCH 05/10] docs: fix formatting and spelling (#2984) Collection of random fixes for formatting, spelling and grammar. In `docs/contribution/profiling.md` I changed the line breaks from `\r\n` to `\n`. --- docs/contribution/profiling.md | 324 +++++++++--------- docs/core/definitions/algebra.rst | 2 +- docs/core/geometry/layerless/building.md | 6 +- docs/core/geometry/layerless/layerless.md | 2 +- docs/core/propagation.md | 16 +- .../pattern_recognition/track_finding.md | 2 +- docs/examples/howto/add_new_algorithm.md | 27 +- docs/getting_started.md | 4 +- docs/plugins/MLAlgorithms.md | 8 +- docs/plugins/geant4.md | 90 ++--- 10 files changed, 238 insertions(+), 243 deletions(-) diff --git a/docs/contribution/profiling.md b/docs/contribution/profiling.md index b5238c858c0..3d7d2eb7e6c 100644 --- a/docs/contribution/profiling.md +++ b/docs/contribution/profiling.md @@ -1,162 +1,162 @@ -# Profiling - -Software profiling allows you to inspect the performance of a piece of software, seeing where the bottlenecks are and how they can be improved. -gperftools is a software profiling package. It contains a CPU profiler, thread-caching malloc library, memory leak detection tool, memory allocation profiler and pprof (discussed later). More information about gperftools and its components can be found on the project's [GitHub](https://github.com/gperftools/gperftools) and [documentation page](https://gperftools.github.io/gperftools/). - -## Install gperftools - -It is strongly recommended to install [libunwind](https://github.com/libunwind/libunwind) before trying to configure or install gperftools. - -### Ubuntu - -If you're using Ubuntu you can use the following command to install gperftools: - -``` -apt install google-perftools libgoogle-perftools-dev -``` - -### Other Systems - -Alternatively, you can use the following commands to install it: - -```console -$ git clone https://github.com/gperftools/gperftools -$ cd gperftools -$ git tag -l # checkout the latest release version -$ git checkout -$ ./autogen.sh -$ ./configure --prefix= -$ make -$ make install -``` - -This will install gperftools in `your/desired/install/dir/lib` which is the path you should use when specifying where gperftools is, if necessary. - -If you wish to install gperftools to a directory that is not one of the standard directories for libraries and therefore not findable by the `-l` compiler flag, you will need to specify the path to it with the `GPERF_INSTALL_DIR` option at build time. -Further information about installing gperftools is [here](https://github.com/gperftools/gperftools/blob/master/INSTALL). - -## pprof - -pprof is a tool for visualising and analysing profiling data. -An older version of pprof comes bundled with gperftools but using the newer Go version comes with several benefits: nicer looking graphs and additional options that make looking through specific sections of a program easier being among them. - -### Install Go pprof (Optional) - -First, you must install Go. Instructions to do so are available [here](https://go.dev/doc/install). -Optionally, you can install [Graphviz](http://www.graphviz.org/download/) to produce visualisations of profiles. - -Then, run the following command to install pprof itself: - -```console -$ go install github.com/google/pprof@latest -``` - -## Link gperftools Libraries When Compiling - -The library needed to run the CPU profiler should be linked into the ACTS project using the following build option: - -``` --DACTS_ENABLE_CPU_PROFILING=ON -``` - -Similarly, to enable the memory profiler the following build option should be used: - -``` --DACTS_ENABLE_MEMORY_PROFILING=ON -``` - -## Alternative to Recompiling - -Alternatively, you can avoid rebuilding the project by pointing the `LD_PRELOAD` environment variable to the profiler library for CPU profiling: - -``` -LD_PRELOAD="" -``` - -You can do the same thing with the tcmalloc library for memory profiling: - -``` -LD_PRELOAD="" -``` - -Using the `LD_PRELOAD` method is not recommended by the developers of gperftools so using the build options is preferable. Both CPU and memory profiling can be enabled at the same time but note that turning on memory profiling (or the heap checker) will affect performance. -Specify multiple libraries to load with `LD_PRELOAD` using a space-separated list e.g. - -``` -LD_PRELOAD=" " -``` - -Note that these steps don't turn on profiling, they only enable it to work. The following section details how to turn it on. - -## Produce a CPU Profile - -To turn on CPU profiling when running an executable define the `CPUPROFILE` environment variable when executing the program: - -``` -CPUPROFILE= [binary args] -``` - -This variable specifies where the profile will be written to. -There are additional environment variables that modify the behaviour of the profiler. -[Would you like to know more](https://github.com/gperftools/gperftools)? - -## Produce a Memory Profile - -To turn on memory profiling use the following command: - -``` -HEAPPROFILE= [binary args] -``` - -## Run the Heap Checker - -To run the heap checker for checking for memory leaks run the following command: - -``` -PPROF_PATH= HEAPCHECK=normal [binary args] -``` - -The CPU profiler, memory profiler and heap checker can be used in tandem. - -## Using pprof - -### View Profile as a Graph - -A graphical representation of a profile can be produced using: - -``` -pprof -pdf > -``` - -Where `path/to/binary` is the binary is used to produce the profile in the first place. -Other output formats are available. - -The following opens the graph in your web browser: - -``` -pprof -web -``` - -### Interactive Mode - -To launch pprof in interactive mode use the following command: - -``` -pprof -``` - -The following command will display the top x entries by the current sorting criteria: - -``` -top -``` - -To view the statistics of a function line by line use: - -``` -list -``` - -Various options can be specified to filter, sort and set the granularity of entries. -There are also a number of other commands available. -Read more about pprof [here](https://github.com/google/pprof). +# Profiling + +Software profiling allows you to inspect the performance of a piece of software, seeing where the bottlenecks are and how they can be improved. +gperftools is a software profiling package. It contains a CPU profiler, thread-caching malloc library, memory leak detection tool, memory allocation profiler and pprof (discussed later). More information about gperftools and its components can be found on the project's [GitHub](https://github.com/gperftools/gperftools) and [documentation page](https://gperftools.github.io/gperftools/). + +## Install gperftools + +It is strongly recommended to install [libunwind](https://github.com/libunwind/libunwind) before trying to configure or install gperftools. + +### Ubuntu + +If you're using Ubuntu you can use the following command to install gperftools: + +``` +apt install google-perftools libgoogle-perftools-dev +``` + +### Other Systems + +Alternatively, you can use the following commands to install it: + +```console +$ git clone https://github.com/gperftools/gperftools +$ cd gperftools +$ git tag -l # checkout the latest release version +$ git checkout +$ ./autogen.sh +$ ./configure --prefix= +$ make +$ make install +``` + +This will install gperftools in `your/desired/install/dir/lib` which is the path you should use when specifying where gperftools is, if necessary. + +If you wish to install gperftools to a directory that is not one of the standard directories for libraries and therefore not findable by the `-l` compiler flag, you will need to specify the path to it with the `GPERF_INSTALL_DIR` option at build time. +Further information about installing gperftools is [here](https://github.com/gperftools/gperftools/blob/master/INSTALL). + +## pprof + +pprof is a tool for visualising and analysing profiling data. +An older version of pprof comes bundled with gperftools but using the newer Go version comes with several benefits: nicer looking graphs and additional options that make looking through specific sections of a program easier being among them. + +### Install Go pprof (Optional) + +First, you must install Go. Instructions to do so are available [here](https://go.dev/doc/install). +Optionally, you can install [Graphviz](http://www.graphviz.org/download/) to produce visualisations of profiles. + +Then, run the following command to install pprof itself: + +```console +$ go install github.com/google/pprof@latest +``` + +## Link gperftools Libraries When Compiling + +The library needed to run the CPU profiler should be linked into the ACTS project using the following build option: + +``` +-DACTS_ENABLE_CPU_PROFILING=ON +``` + +Similarly, to enable the memory profiler the following build option should be used: + +``` +-DACTS_ENABLE_MEMORY_PROFILING=ON +``` + +## Alternative to Recompiling + +Alternatively, you can avoid rebuilding the project by pointing the `LD_PRELOAD` environment variable to the profiler library for CPU profiling: + +``` +LD_PRELOAD="" +``` + +You can do the same thing with the tcmalloc library for memory profiling: + +``` +LD_PRELOAD="" +``` + +Using the `LD_PRELOAD` method is not recommended by the developers of gperftools so using the build options is preferable. Both CPU and memory profiling can be enabled at the same time but note that turning on memory profiling (or the heap checker) will affect performance. +Specify multiple libraries to load with `LD_PRELOAD` using a space-separated list e.g. + +``` +LD_PRELOAD=" " +``` + +Note that these steps don't turn on profiling, they only enable it to work. The following section details how to turn it on. + +## Produce a CPU Profile + +To turn on CPU profiling when running an executable define the `CPUPROFILE` environment variable when executing the program: + +``` +CPUPROFILE= [binary args] +``` + +This variable specifies where the profile will be written to. +There are additional environment variables that modify the behaviour of the profiler. +[Would you like to know more](https://github.com/gperftools/gperftools)? + +## Produce a Memory Profile + +To turn on memory profiling use the following command: + +``` +HEAPPROFILE= [binary args] +``` + +## Run the Heap Checker + +To run the heap checker for checking for memory leaks run the following command: + +``` +PPROF_PATH= HEAPCHECK=normal [binary args] +``` + +The CPU profiler, memory profiler and heap checker can be used in tandem. + +## Using pprof + +### View Profile as a Graph + +A graphical representation of a profile can be produced using: + +``` +pprof -pdf > +``` + +Where `path/to/binary` is the binary is used to produce the profile in the first place. +Other output formats are available. + +The following opens the graph in your web browser: + +``` +pprof -web +``` + +### Interactive Mode + +To launch pprof in interactive mode use the following command: + +``` +pprof +``` + +The following command will display the top x entries by the current sorting criteria: + +``` +top +``` + +To view the statistics of a function line by line use: + +``` +list +``` + +Various options can be specified to filter, sort and set the granularity of entries. +There are also a number of other commands available. +Read more about pprof [here](https://github.com/google/pprof). diff --git a/docs/core/definitions/algebra.rst b/docs/core/definitions/algebra.rst index 87718c97a73..2bf884682b5 100644 --- a/docs/core/definitions/algebra.rst +++ b/docs/core/definitions/algebra.rst @@ -1,7 +1,7 @@ Algebra definitions =================== -The main algebra classes for Acts are defined in the `Acts/Definitions/Algebra.hpp` header file. +The main algebra classes for ACTS are defined in the `Acts/Definitions/Algebra.hpp` header file. The basic scalar type can be defined via this file and is set per default to `double`, however, if `ACTS_CUSTOM_SCALAR` is set it will be used instead. .. code-block:: cpp diff --git a/docs/core/geometry/layerless/building.md b/docs/core/geometry/layerless/building.md index 907a5ba9bc6..2cc899e6350 100644 --- a/docs/core/geometry/layerless/building.md +++ b/docs/core/geometry/layerless/building.md @@ -5,10 +5,10 @@ For cylindrical detectors there exist a generic tracking geometry building module, based on KDTree and a proto description. -This building procedure uses a {struct}`Acts::ProtoDetector` description which provides a -high level description of layers and container volumes, together with some +This building procedure uses a {struct}`Acts::ProtoDetector` description which provides a +high level description of layers and container volumes, together with some binning and ordering information. -This proto description is then used to assign surfaces that are provided to the +This proto description is then used to assign surfaces that are provided to the {class}`Acts::KDTreeTrackingGeometryBuilder` using an internal query to the KD-tree structure. ## Blueprint tree mechanism to build a tracking geometry diff --git a/docs/core/geometry/layerless/layerless.md b/docs/core/geometry/layerless/layerless.md index fe7d7f5c302..18c22c86e1e 100644 --- a/docs/core/geometry/layerless/layerless.md +++ b/docs/core/geometry/layerless/layerless.md @@ -4,7 +4,7 @@ ## Geometry module rosetta stone :::{todo} -Describe replacements of `TrackingGeometry`, `TrackingVolume` etc and how the classes map to one another. +Describe replacements of `TrackingGeometry`, `TrackingVolume` etc. and how the classes map to one another. ::: diff --git a/docs/core/propagation.md b/docs/core/propagation.md index 86219441026..6dd2aeba8d5 100644 --- a/docs/core/propagation.md +++ b/docs/core/propagation.md @@ -14,7 +14,7 @@ Following the general ACTS design, these classes do not manage their internal st The interaction of these two components is handled by the {class}`Acts::Propagator` class template that takes the stepper and the navigator as template parameters: -```c++ +```cpp Propagator ``` @@ -22,7 +22,7 @@ Additional to these mandatory components, the propagator can be equipped with ** The propagator exposes its state to the actors and aborters as arguments to `operator()`. Actors must define a default-constructable `result_type`, which can be modified in each call: -```c++ +```cpp template auto operator(propagator_state_t &state, const stepper_t &stepper, result_type &result) const { const auto &navigatorState = state.navigation; @@ -41,7 +41,7 @@ aborters. This is done with the classes {struct}`Acts::ActionList` and {struct}`Acts::AbortList` (which are in fact small wrappers around `std::tuple`): -```c++ +```cpp using MyOptions = Acts::PropagatorOptions< Acts::ActionList, Acts::AbortList @@ -50,7 +50,7 @@ using MyOptions = Acts::PropagatorOptions< The actors and aborters are instantiated with the options and can be accessed with the `get`-method that expects the corresponding actor type as template parameter. Besides this, the {struct}`Acts::PropagatorOptions` also contains a lot of general options like the `maxStepSize`: -```c++ +```cpp auto options = MyOptions(); options.actionList.get().foo = bar; options.maxStepSize = 100; @@ -68,7 +68,7 @@ To run the propagation, we must call the member function `propagate(...)` with t The result is an instance of {class}`Acts::Result`. It contains the actual result, or an error code in case something went wrong. In the actual result, the results of the different actors can again be accessed via a `get` method: -```c++ +```cpp auto res = propagator.propagate(myParams, options); if( res.ok() ) { @@ -78,7 +78,7 @@ if( res.ok() ) { ## Navigators -Acts comes with two navigators: The standard navigator {class}`Acts::Navigator` that performs the full navigation in the volume/layer/surface hierarchy, and the {class}`Acts::DirectNavigator` that takes a sequence of surfaces and just navigates to one after the other. This sequence must be initialized with a special actor, the {struct}`Acts::DirectNavigator::Initializer`. +ACTS comes with two navigators: The standard navigator {class}`Acts::Navigator` that performs the full navigation in the volume/layer/surface hierarchy, and the {class}`Acts::DirectNavigator` that takes a sequence of surfaces and just navigates to one after the other. This sequence must be initialized with a special actor, the {struct}`Acts::DirectNavigator::Initializer`. The navigators provide information about the current position inside the geometry in their state variable ({struct}`Acts::Navigator::State` and {struct}`Acts::DirectNavigator::State`), e.g. pointers to the `currentSurface` and the `currentVolume`. @@ -90,7 +90,7 @@ The {class}`Acts::Navigator` by default does a straight-line extrapolation to re ACTS also provides a variety of stepper implementations. Since these in general can work very differently internally, the state itself is not the main interface to the steppers. Instead, all steppers provide a common API, to that we can pass instances of the stepper state. This allows a generic and template-based design even for very different steppers: -```c++ +```cpp template auto operator(propagator_state_t &state, const stepper_t &stepper) const { stepper.foo(state.stepping); @@ -113,7 +113,7 @@ The extensions encapsulate the relevant equations for different environments. Th The extension can be configured via the {struct}`Acts::StepperExtensionList`: -```c++ +```cpp using Stepper = Acts::EigenStepper< Acts::StepperExtensionList< Acts::DefaultExtension, diff --git a/docs/core/reconstruction/pattern_recognition/track_finding.md b/docs/core/reconstruction/pattern_recognition/track_finding.md index a61926c32e1..4d60dd69e7f 100644 --- a/docs/core/reconstruction/pattern_recognition/track_finding.md +++ b/docs/core/reconstruction/pattern_recognition/track_finding.md @@ -56,7 +56,7 @@ and provide: - measurement calibrator - branch stopper (optional) -Typically users have to provide the tracking geometry, an implementation of a +Typically, users have to provide the tracking geometry, an implementation of a {class}`Acts::MagneticFieldProvider`, which is needed by the stepper e.g. {class}`Acts::EigenStepper` which is needed by the propagator, a source link accessor and a measurement calibrator. An implementation of a source link diff --git a/docs/examples/howto/add_new_algorithm.md b/docs/examples/howto/add_new_algorithm.md index c97b5c852e1..10de51e8d68 100644 --- a/docs/examples/howto/add_new_algorithm.md +++ b/docs/examples/howto/add_new_algorithm.md @@ -8,11 +8,7 @@ Before doing so, the ideas explored in Examples are typically first developed as In a second step, the essential parts of this code are then moved to the `Core` packages, which the algorithm then executes. - - -Code Organisation ------------------- - +## Code Organisation Algorithms reside in `Examples/Algorithms` of the repository. The code is split into a header with the algorithm class declaration @@ -87,13 +83,13 @@ It is common practice to put the algorithm code in the `ActsExamples` namespace. ## Input and Output The algorithm would be typically part of some processing sequence and thus -consume and produce some event data. In the hypothetical example discussed -here, space-points are the input and track seeds an output. +consume and produce some event data. In the hypothetical example discussed +here, space-points are the input and track seeds an output. Data is passed between algorithms through a central *event store*, basically a dictionary type that can store arbitrary value types in memory. -The data can be retrieved using special *handle* objects that encode a on +The data can be retrieved using special *handle* objects that encode an object type and the name with which they are associated in the event store. To add an input and output to your algorithm, in the class declaration add handles like @@ -135,7 +131,8 @@ store by calling the output handle like this: auto mydata = makeData(); m_outputSeeds(ctx, std::move(mydata)); ``` -The ownership of the object is transferred to the store. That is, the + +The ownership of the object is transferred to the store. That is, the destruction of this object at the end of event processing is taken care of. ## Configurability @@ -154,8 +151,9 @@ struct Config { std::vector layers; // layers to use by the seeder float deltaZ; // the maximum allowed deviation in r-z plane }; - ... +... ``` + :::{tip} It is customary to put the config structures in the ``Acts`` namespace. ::: @@ -168,6 +166,7 @@ MySeedingAlgorithm::MySeedingAlgorithm( Config cfg, Acts::Logging::Level lvl): ActsExamples::BareAlgortihm("MySeedingAlgorithm", lvl), m_cfg(std::move(cfg)){...} ``` + ## Python bindings In order to use an algorithm in standalone ACTS the algorithm @@ -195,14 +194,10 @@ help(MySeedingConfig) ``` An info about the class and config structure should be printed. -Example empty algorithm ------------------------ +## Example empty algorithm + A complete example of an algorithm called `UserAlgorithm` can be found in these two branches/locations: [Algorithm definition](https://github.com/asalzburger/acts/tree/ws-add-user-algorithm/Examples/Algorithms/Tutorial) [Python bindings definition](https://github.com/asalzburger/acts/blob/ws-add-user-algorithm-python-bindings/Examples/Python/src/Tutorial.cpp) - - - - diff --git a/docs/getting_started.md b/docs/getting_started.md index 5bd2effa723..7e3cf2ae10a 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -329,7 +329,7 @@ CMake variables](https://cmake.org/Wiki/CMake_Useful_Variables) or at the [CMake documentation](https://cmake.org/documentation/). | Option | Description | -| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +|----------------------|-----------------------------------------------------------------------------------------------------------------------------------| | CMAKE_BUILD_TYPE | Build type, e.g. Debug or Release; affects compiler flags
(if not specified **`RelWithDebInfo`** will be used as a default) | | CMAKE_CXX_COMPILER | Which C++ compiler to use, e.g. g++ or clang++ | | CMAKE_INSTALL_PREFIX | Where to install ACTS to | @@ -344,7 +344,7 @@ $ DD4hep_DIR= cmake -B -S The following environment variables might be useful. | Environment variable | Description | -| -------------------- | ---------------------------------------- | +|----------------------|------------------------------------------| | DD4hep_DIR | Search path for the DD4hep installation | | HepMC3_DIR | Search path for the HepMC3 installation | | Pythia8_DIR | Search path for the Pythia8 installation | diff --git a/docs/plugins/MLAlgorithms.md b/docs/plugins/MLAlgorithms.md index 3b4f84e0af1..5fbe25e5958 100644 --- a/docs/plugins/MLAlgorithms.md +++ b/docs/plugins/MLAlgorithms.md @@ -29,11 +29,11 @@ At this step, we have multiple clusters of tracks. We use a NN to compute a scor ### Cleaning -Finally, for the remaining tracks, there might be some fakes and duplicates. It doesn’t seem to be the case with the first tests, so the current implementation stops here. But in the future, if some configuration encounters too many fake/duplicates after the ranking, a simple classification NN could be used to separate the good tracks from the others. +Finally, for the remaining tracks, there might be some fakes and duplicates. It does not seem to be the case with the first tests, so the current implementation stops here. But in the future, if some configuration encounters too many fake/duplicates after the ranking, a simple classification NN could be used to separate the good tracks from the others. -Running the ACTS Greedy Solver after the ML Solver can be helpful in some cases; it will likely remove most of the remaining fakes while being extremely fast and not affecting the reconstruction performances (since both algorithms are orthogonal). The default implementation in the full ODD chain uses this approach. +Running the ACTS Greedy Solver after the ML Solver can be helpful in some cases; it will likely remove most of the remaining fakes while being extremely fast and not affecting the reconstruction performances (since both algorithms are orthogonal). The default implementation in the full ODD chain uses this approach. -### How to use +### How to use The ML-based Ambiguity solver comes with a pre-trained model to be used with the ODD. Using it is extremely simple; just call the `full_chain_odd.py` with the `--MLSolver` option. If you want to try this solver with another detector, a few more steps are needed. First, you need to train a model. As an input, you will need the multitrajectory output from the CKF (run a full chain up to the CKF, then use the `CSVWriter`). At least 100 ttbar events with 200 PU are needed (1000 would be ideal). You can then run `Examples/Scripts/Python/MLAmbiguityResolution/train_ambiguity_solver.py` on our dataset, 2/3 of the data should be used for the training and 1/3 for the validation. You will receive a `duplicateClassifier.onnx` file as an output, which can now be used as an input for the `AmbiguityResolutionMLAlgorithm` with your detector. @@ -59,7 +59,7 @@ The clustering is implemented with the `dbscanSeedClustering` function. Its inpu At this step, we have multiple clusters of seeds. We use a NN to compute a score for each seed. Due to the loss function used in training, the fake seed (coming from more than one truth particle) tends to have a score close to 0; we can thus remove them by cutting the low-score seed. The `minSeedScore` parameter is used to choose the cutoff value. For each cluster, we can then select the seed with the highest score to be kept. -### How to use +### How to use The ML-based Ambiguity solver comes with a pre-trained model to be used with the ODD. Using it is extremely simple; just call the `full_chain_odd.py` with the `--MLSeedFilter` option. If you want to try this solver with another detector, a few more steps are needed. First, you need to train a model. As an input, you will need the seeding and multitrajectory output from the CKF (run a full chain up to the CKF, then use the `CSVWriter` for both the seeding and the CKF). At least 1000 ttbar events with 200 PU are needed. First, we need to match the seed and the corresponding tracks together; for that, we can run `Examples/Scripts/Python/MLAmbiguityResolution/match_good_track-seed.py`. The network can then be trained with: `Examples/Scripts/Python/MLAmbiguityResolution/train_seed_solver.py ` on our dataset, 2/3 of the data should be used for the training and 1/3 for the validation. You will receive a `seedduplicateClassifier.onnx` file as an output, which can now be used as an input for the `AmbiguityResolutionMLAlgorithm` with your detector. diff --git a/docs/plugins/geant4.md b/docs/plugins/geant4.md index b3fdd41ffd7..3463077500f 100644 --- a/docs/plugins/geant4.md +++ b/docs/plugins/geant4.md @@ -14,24 +14,24 @@ The selection is hereby done by providing one or more {class}`Acts::IGeant4Physi Possible implementations of this type of conversions can be seen in the corresponding unit test `ActsUnitTestGeant4DetectorSurfaceFactory` -```c++ - // Get the box - auto nameSelector = - std::make_shared( - std::vector{"yl"}, false); +```cpp +// Get the box +auto nameSelector = + std::make_shared( + std::vector{"yl"}, false); - Acts::Geant4DetectorSurfaceFactory::Cache cache; - Acts::Geant4DetectorSurfaceFactory::Options options; - options.sensitiveSurfaceSelector = nameSelector; +Acts::Geant4DetectorSurfaceFactory::Cache cache; +Acts::Geant4DetectorSurfaceFactory::Options options; +options.sensitiveSurfaceSelector = nameSelector; - Acts::Geant4DetectorSurfaceFactory factory; - factory.construct(cache, nominal, *cylinderPV, options); +Acts::Geant4DetectorSurfaceFactory factory; +factory.construct(cache, nominal, *cylinderPV, options); - BOOST_CHECK_EQUAL(cache.sensitiveSurfaces.size(), 1u); - BOOST_CHECK_EQUAL(cache.passiveSurfaces.size(), 0u); +BOOST_CHECK_EQUAL(cache.sensitiveSurfaces.size(), 1u); +BOOST_CHECK_EQUAL(cache.passiveSurfaces.size(), 0u); - auto [ element, surface ] = cache.sensitiveSurfaces.front(); - BOOST_CHECK_EQUAL(surface->type(), Acts::Surface::SurfaceType::Cylinder); +auto [ element, surface ] = cache.sensitiveSurfaces.front(); +BOOST_CHECK_EQUAL(surface->type(), Acts::Surface::SurfaceType::Cylinder); ``` #### Inspecting surface conversion within python @@ -39,26 +39,26 @@ Possible implementations of this type of conversions can be seen in the correspo The `ActsExamples` python bindings allow to conveniently test the conversion of `Geant4` volumes into sensitive and passive surfaces, assuming you have a GDML file called `detector.gdml` where `Geant4PhysVolume` objects can be identified by a certain string, e.g. names containing the flag `Sensitive`, or `Passive`. Also, multiple match strings are allowed. The converted surfaces can then be displayed with `.obj` (part of the Core functionality) or as `.svg` files (if `ACTS_BUILD_PLUGIN_ACTSVG` is switched on) ```python - # import the necessary modules - import acts, acts.examples - from acts.examples import geant4 as acts_g4 - - # The match criteria - sensitive_matches = [ 'Sensitive' ] - passive_matches = [ 'Passive' ] - [ elements, ssurfaces, psurfaces ] = acts_g4.convertSurfaces('detector.gdml', sensitive_matches, passive_matches) - - # Some screen output - print('* Conversion yielded', len(ssurfaces)) - - # Write them to an obj file - drawContext = acts.GeometryContext() - sensitiveRgb = [ 0, 150, 150 ] - passiveRgb = [ 150, 150, 0] - # Draw the sensitive surfaces - acts.examples.writeSurfacesObj(ssurfaces, drawContext, sensitiveRgb, 'detector-sensitives.obj') - # Draw the passive surfaces - acts.examples.writeSurfacesObj(psurfaces, drawContext, passiveRgb, 'detector-passives.obj') +# import the necessary modules +import acts, acts.examples +from acts.examples import geant4 as acts_g4 + +# The match criteria +sensitive_matches = [ 'Sensitive' ] +passive_matches = [ 'Passive' ] +[ elements, ssurfaces, psurfaces ] = acts_g4.convertSurfaces('detector.gdml', sensitive_matches, passive_matches) + +# Some screen output +print('* Conversion yielded', len(ssurfaces)) + +# Write them to an obj file +drawContext = acts.GeometryContext() +sensitiveRgb = [ 0, 150, 150 ] +passiveRgb = [ 150, 150, 0] +# Draw the sensitive surfaces +acts.examples.writeSurfacesObj(ssurfaces, drawContext, sensitiveRgb, 'detector-sensitives.obj') +# Draw the passive surfaces +acts.examples.writeSurfacesObj(psurfaces, drawContext, passiveRgb, 'detector-passives.obj') ``` ## Building a Detector from Geant4 input @@ -67,17 +67,17 @@ In order to build an `Acts::Detector` object from `Geant4` input, the following * a conversion of `Geant4PhysVolume` objects into `Acts::Surface` and `Acts::DetectorVolume` objects (see before) * a build sequence needs to be defined and the converted objects identified - There are several helper methods and tools that can be used, many of them accessible through python bindings. One core component is the selection and assignment of surfaces to dedicated volume. This can be done using e.g. a KDT structure, this can be tested with: +There are several helper methods and tools that can be used, many of them accessible through python bindings. One core component is the selection and assignment of surfaces to dedicated volume. This can be done using e.g. a KDT structure, this can be tested with: - ```python - # Create a KDTree from all surfaces binned in z and r - surfacesKdt = acts.KdtSurfaces2D(buildContext, surfaces, [acts.Binning.z, acts.Binning.r]) +```python +# Create a KDTree from all surfaces binned in z and r +surfacesKdt = acts.KdtSurfaces2D(buildContext, surfaces, [acts.Binning.z, acts.Binning.r]) + +# Define a query range and select +qrange = acts.Range2D( [-580,580], [0,200]) +selected = surfacesKdt.surfaces(qrange) - # Define a query range and select - qrange = acts.Range2D( [-580,580], [0,200]) - selected = surfacesKdt.surfaces(qrange) - - # Draw, inspect the surfaces - ``` +# Draw, inspect the surfaces +``` -Selected surfaces can be put as a layer structure into a volume \ No newline at end of file +Selected surfaces can be put as a layer structure into a volume From e06342c5784660ef3ea78442e957eb902d15fffa Mon Sep 17 00:00:00 2001 From: Andreas Stefl Date: Mon, 26 Feb 2024 16:52:38 +0100 Subject: [PATCH 06/10] fix: Fix `TruthVertexFinder` for not reconstructed particles (#2979) This fixes an overlook in https://github.com/acts-project/acts/pull/2937. Non reconstructed particles result in an exception which is fixed here --- .../ActsExamples/TruthTracking/TruthVertexFinder.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Examples/Algorithms/TruthTracking/ActsExamples/TruthTracking/TruthVertexFinder.cpp b/Examples/Algorithms/TruthTracking/ActsExamples/TruthTracking/TruthVertexFinder.cpp index 3b28a9acb57..9c73b49f267 100644 --- a/Examples/Algorithms/TruthTracking/ActsExamples/TruthTracking/TruthVertexFinder.cpp +++ b/Examples/Algorithms/TruthTracking/ActsExamples/TruthTracking/TruthVertexFinder.cpp @@ -151,10 +151,11 @@ ProcessCode TruthVertexFinder::execute(const AlgorithmContext& ctx) const { std::unordered_map> protoVertexTrackMap; for (const auto& [particle, trackMatch] : particleTrackMatching) { - auto vtxId = - SimBarcode(particle).setParticle(0).setGeneration(0).setSubParticle(0); + auto vtxId = SimBarcode(particle).setParticle(0).setSubParticle(0); - protoVertexTrackMap[vtxId].push_back(trackMatch.track.value()); + if (trackMatch.track) { + protoVertexTrackMap[vtxId].push_back(trackMatch.track.value()); + } } ProtoVertexContainer protoVertices; From 1cc17595d3278f5488fb6d4eba2b6336f909903a Mon Sep 17 00:00:00 2001 From: Andreas Stefl Date: Tue, 27 Feb 2024 09:38:00 +0100 Subject: [PATCH 07/10] fix: Flag for secondary vertex labeling in `Pythia8ProcessGenerator` (#2989) Currently we label secondary vertices in `Pythia8ProcessGenerator` that are for example products of prompt decays. I flag this labeling procedure and change the default to assign everything to the primary vertex. --- .../reference/performance_ambi_ttbar.root | Bin 35344 -> 35476 bytes ...erformance_amvf_gridseeder_ttbar_hist.root | Bin 39982 -> 40132 bytes .../performance_amvf_ttbar_hist.root | Bin 39924 -> 40043 bytes .../reference/performance_ckf_ttbar.root | Bin 42939 -> 43303 bytes .../reference/performance_seeding_ttbar.root | Bin 15630 -> 16441 bytes .../tracksummary_ckf_ttbar_hist.root | Bin 41022 -> 41013 bytes .../Generators/Pythia8ProcessGenerator.cpp | 2 +- .../Generators/Pythia8ProcessGenerator.hpp | 4 ++++ Examples/Python/tests/root_file_hashes.txt | 2 +- 9 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CI/physmon/reference/performance_ambi_ttbar.root b/CI/physmon/reference/performance_ambi_ttbar.root index 9c74084d1930087da417d5b26e34cf0fecddd6e9..dcbdae93ba63073daa1c8285c8f76cef740bf25c 100644 GIT binary patch delta 27048 zcmb5Wbx<5#^esBL1$UQV!QI_8xO?yr+;wmbZow^Ba0@OW!QGv~-3K4!l6>#J->Z6c z|F~6sy1IMjbXQHSwf5@0_nCwg=#*4wQ5Q!?Hvr&99RL7W007Y`Z$skk`0qK?+i-$? z+gSnt4!i&WCJq29Kvdz!>>tdtj1*`9R%O?DqBt!p08k0|`!x%3`=ZQvwBn`bvnI(13JgfEUzh>V%z!IK}{7H#Mp>V>x~- zR;@&GNHGOeIk$#wRrlnNiN}h}@Nb_d`x~Qv-dwYg6{nDOM0Y;Ym31)Wc0^KO3N6N% zVoISysT`e*I{0~)V5mqOhIUN&d0Kn&v_ohS6QwWSi=p2iNa6ty9jleBU3tMkZ0wBo zU8SLDeFePeh3#3*LENjpRT5OBkUWHkL6B4cSFM7vl>Q8l*duW*p}M2sPc@C32ZOo9 zm+P0!?Vw_!CdV*U;m#vyF~pa9X)Dr0Qq3(CSPWl(9?+=l9C@VzxSsyG%cAuJb zleq`li&@1rCbyo`XSsGN`a(Q`mt3w`zwVH!aOzfa*toKCm{SBR4+T?+FOzV)g|f*{ zhl~npSrDP`16-Wy9m|OhK^$p(s=n+s9+D5U$={>e4@biBV-b+HDaQ)l337Ydde|Px ztyZ|#jG>*)2o&E0R6!a=%DAZn`SMrL`3n&U110GnYne$rLS+d92UM?t&IVq+n7I~! zT#2do;f#eUE4`e~%CcS_hBoYgD%rw`g1u;`S-jkMJAq!5?Osveq2*_>Kthqh98?7U zQZx>Zovv9svVzQU_t2;6G9K5~RM04fX_AI4u{ubj{Lr}B&szVZoX!KMNX4c8OCjft zfIA4@Pv?oqz|Uz;k6;_fCy954z~jrk26er6k-Ep@_bA23O{K&RxCyHIaV)DwR6%;J1I`_NQ8?@Y0GMz8pd0rO`U-!U1M`%efIylY55)fq zV`&&b+=-R^|tz+~lj9!be%GVdKndXf8`4oz+)2wTPa*lr@%y z1+YXN5DlntkOm|>KYc}ywn>q_ zR+R2u7NqnE_?f8(aK$RKMRtTsLz%h1_~!QQ+{B1{RhWzUq$1xU!2b|hj6OFLyUHCj zFRbndU=6+#x>tP+utuo>*Pqq~AG)=;`UicF)xVvK;+MLWmfaO9WCb=vJe^3R-F%`X zexmvm;@g*$YpOzh>ZqJEn$5-&jfw@8l~2&asc3d17~cOZ$hdN>UqWt_LQDzi)nF~D zbpP>3gUcfNIb6WrRog?&l_6KdRr^bF)zpXX4=bppN@s(sl^P0WIUm`>gk3vu7B;-- z&oY(GTsd!5uHqLtEzW_>-BT@r!qS%pC#*R4bGa0+a1iDtyVHg56U!=5Q)$i$gi7-& zO1B_h{&g+!Ar{c>aII#Flm_3c>;G`fWbH zPWj)b<9T`wd0GvjL@PdFk}GMj#I!sgZSz99Vd9!;5Fnj)*(0YorSiScJrX9xf?|H0 zZpCXqAG!nt#FCX4!)Jfl#Mxdx59p@3e+3Yz39$FvmKDY|lUSm&C8LhQLQN8x+7pga zGmxrMNAg+ZumQh;eZ-cK0;5RmPUEfhJc*;BO2$?8Nk{6QF`#PYoteRoDr%=9)=(ly zT`+n#k7Y-vE}+89ryuF^7Qs{Qa4}@9X?E)_V-QEX_1|ijosqAzeq{U}Uf-<<*gTJA zmpWZ_+^S|$%<;IMN;6B3MIH9!FY-SP7NGT`N?RN)r+iiwkhT&t(oj!}=KLmKoXkJ( zta&Rhtp!OcQqW=7NKZkdCyGv1%8^y?(<>TQ0nBo9Y89X8l@uS+=V)+!Yt!zBsT53o z7E5z~Z#E@)zRfDMtwZq^lrH~L4h!vnD2I^pMmb(!E*t<2>u<=wx3@{tx;|N3e`u3Q z)0fNmTK`0^SYCUvO(s5suD!AzKW1;~N^alurKNQ*!Dmo3JoH^?61|#6RCwrPsn|L9 zAF4r_FNf%;GfbkcwsuSE?RVL}WS~x_+Pq(98^U*fdA{SVcl?qBIS81r-_Z1KC#t^$ zE|vk)Qnlu4X6NUa?d*-`H9>5&n-}4@thl=RlJ1hH(MNOIbnuwd!}SoucJgHZ`Ljx4 zSuLo*BRG9%W?phx{prMK5P!IU|MglG_~(t@V-5!DvmhQo;>!eTI~I!dsOKQspiCr> z#5>Y+t41eJnZ}XKADLNpcKzs>Zoe${l(*u*RCd2|))AuT*dKRU$@u9zT|A%CjYSTeEp>F?C?>bteSySJxMczj zv5wiMKGH3HE<~5T!uK~ea}goCFLoBr%pRI|-3_7j-7iM>P#NJ|vN%hM`XY*ZF1l(@ zg&l7Ylb6ASZ!;4?d;C&8!#ZwYXF9TAb$Z|fGk#hw;V)U$x~OJSQ8Qs%pEPsRq{qFx zElM~E6gBb~xayVkG2Kg&6l8Tj=*|VY1*bkTklH7`ByV+BLOz`NKcYu_=A0GrZ9jTO zI|g@2IOoizf5`28L*KQJt(4n4LPH2O>B#~S2?JO>@p$l9r*mw^X>%uCxgd_UKMx7Jx5I-HHcHE zE+FQUZw$`Tc}D&s2)FOW4rjns*V#|yL!4(t;l1w_ZeFR@<-JGHhaH6Q}rB68cxl*N#lR-)_L`j&S`37R5;Hs8fxFYm1KtX zN;Qlxuyd3?IYyfD*kA5aYks0#t(QFBcz1T(@bQHB8 z-#aUiP`+FI_yNj*934CSusqPLMD+5#NAG>7AA5Q6lH||#H|Zit_d9-DI$M|!c}Jb= z@2|bCJ^@}If1$R7VZ|>p_Wp7Ml2JX93s$+o1NNDp5LaifIFy-zt}`Z4?Hr|PX$$&4 zh|Wn}Y$)e1MmdBU7BjwhSrO*yt#;#{l|Q_WG9k2`_}Y-qyt9d>weR3lh4=E4Uub)h zUAEN5JaB_&esbiD@iS1Y$~DrJ=^3XE=b;A$rwk~PeGLV-EE zqmpW1>m0{jw&LlOdQ!}usnNoz=s*@x*5&ERu5!83#wTyPj|Z25&vL>^WcXd#td;0d zD}2H!k7SMNQfSw<_G-#bfF3mI<}T!&r9&gyKTpTciw z^C`x3s#6)XMIK&3e?oSqtruf}QNdrDKCnCyK|LF1zdw5h&WrEO zPc!V63`IxzSM)8D8tO?N1mF4O(+6*CXB6;b+i6&jc!$TEs+&uQ))X3k2CR49vu{!t95b6L0UO5yPeJQ#8+yG82RfTBl=oj^9D1b$fm@rnu zh);VlVOb_QE&)uH<`2Lom>HH%t_?tk{3GmQBdyThYHimAUX@8mbF;tb^XK2TUg;;d zztivxrWuRqerf+?ZC!RMxf=;FBR)MwSYeJDPbz_IN-hIoMB*N)sYGtEPAEjJH)qWJ zK^3~%2!cZ(ar!2*evAxNg@BpOhIogk1Km96_CX-kNeO3c@EQ=u8u8@UjG-We;H22= z+00}Z(zM=${yQKV0yrsk>)inKbtC0XoUya6fsidz1}y2@+03kKQkk6+uJ{plSRQdw zG>mUl1Ejqx!;yz;NV*LDy(I&tj4#x4Ie)eDU~!HBSa$^p8B*I(Y*ppGOC_|LquzdR zA_T3J*BRAa4Pdy+FG_&{Y^O+MA!xKI@9^GDrc_-Lk`k#;1wMhuB&c(4T~Ml3!@v?& zk^pdrU@BOTrSmThKT4V(+a$pA?}) z=Y$ELjxK=>)IoVi=o>nlchtdoB(yz47?ymr2S)5Q3W4g8yVq^Ej^MUx)tU+#n)}DL zZN?vdaGiy2oD4aw{j(iKlwrC`1-?I#I@QDaiBGD}L)+0J@#j_QJ5pU*V=HEQvpB3# zGPtZ}5jwYyI*9iYaww600WDn63gM{j?EaHRSqlOjp`-;j4 zBQf^+EEWQt`X2QiDSBL5$1&6m2(B$9S%=p)-XFvVd#%zGxziW9NXIf!gfmePC0IUP zArnYD5~3rY^~y1O z<8|K1mMYRgb}3j@U%9ZPtv3L~uH9g!c^Yax$l z^yYRI&U_fljQL(NGvp^Z(@4S+pJwzs1D0~ln7Q3Qb3$d#kd`~$fZOP!GOzexp;elm zNu%^g2{%KEK96@snlty;J9IO03GydO_*!&ql z{H4(xxXHS*$wISF+OR(sqrN%pG^gDi<(H!V>%A zZT-(CmoI*bDN@Jw-gE9em$nwo z%5SgB{(obDu$Hz^+Zs!j=UR!2o_r{&n-2!b&*eIDsHi5`I={cp5w@=U5D= z_xB<6!1ZmFClspO`-mVgAJ(V)%QMwkD@j}PFJ%Ot2cwd8HuXm@SIEmI=<4LHI06| zkG5OfXPXJviFo&(C@_&9+eFf;zZS&ZarSnRH~gKB(Gg#JAq~ltqAsw_3W>a&=K97o zH&sKgUc1_lvdCx9xS~RSE?@Tf3VWn7V-OK~e2Fvd*vlUZCm z+wnJ9qct&z6v_TQY(uVhl5Jj!21%Y34@cIwTcppMUN`HM%@jS~cshM!4+n<1CO3Rc zFrR}fb~YVrSI3SU!=IA?LRN~Q`_dwka71;y`>MW#GvD%v0;EL;fZRE6hyVdZ# zV-;lY@%5>Exq6{{>1F3BSq+cZJTgd`HxNLBk)KnciQK_lrkB3kZ1BhFCHt)ZAwK+Y zNk^KIrKx#=XL@`AU?1~{*P(E#4fo`#M`p$d=sbGua^q8P zO%HL>nJ5@>5=P{)h#ng83`h{8tYjrK-p3i0xTE@oDz_z-tR;(#AYRK|rNn`juD3bj zHz9X1kL8}KOmc73{o>?-s!+0$#t_B*^Ma<{XGef&>WfkpMpGH<5kMM%=?BIrd@hAKc1S*vC#LlXYF+3jh zRQ!aS`x&Mw375t(l7Xv~8|9u&?&bzV%;&h%5d}uvr{gOnRu8I*Gt07DEPz^!q7^+P z@MsM$4p-<$FWI+ zA*}Icwr2K`ZysTHPF?AGL#qRgjNN%)eJf#bU=guRUZi9;xfKsvJlkoqOA6S0ly=X# z#6LKb-=xiR5FJ*|cE%t*BOqT12DSPccZ#)*f$X_3F09b@0K3cBY4&U0y@&ZyCpy~3 zr`_=+&7DrjcN6^j*(lF^N1~|iPk=n4CV~%!FL!oE_fK!&HxZt0j`s9HB_7Lp|61!M zN-BQFt9qUn=QqLAykooGo(^&x0JlziKkQez$B~Zfn*=`rlZZ%@F^EwAj!%CA3GT6B z5Nipc8(mWi2UmhKHKrV!TQ;+o8e?3yeF)YfCai7gXZ{C)^LpKctp5TA|#wQq!7j@UF4~ZYkOW;ruj%!725cnl`u)_ zYX;RwO2SLXajtA#*mbW34|^8!*^PC0X8+kps6GQt^i%B&(Xw$Bt-x@^@k)26zm-D9 z&#zo^V?{1Y8-iWZH^8nw_1~~M3>B$O3OPfunR)N*L$bIXr#iI2JY#~~>8uvP?GgiL z+1qd^TgD#VCI^dot{pbweo;mN{B9jdt|YY-UBfKo*Q4!E`UhUZs(U1kUj<5-A~h6Q zx`&24wp91}n94iEPGF4h+?D?ibQneJidn33+D=Rg~)E-ksOCFppldq&~h)+EKd>B(<%u2OR z2`J5;d&;iY@-{y7RBhk01LZ`AM3qz>`V%XOa+k=%H$P(6b=zqOJk|&Yk=FH^JDmzZ zXfXMLa}Jf~d(_x#{Ne0wyKnWVW9xP0F#EZ}r&JU%7afKT@PD}h|4n!ehNAtE|1H}v zmHq>XxY6BE;maV!UE4Z$8oEESGU(O)Ya^?OoG@!-+xlRiOQ?r@wJM8Cx*#m;fK&0g zr+tPtqNwq~V!w>%hR6g@n$!n^K&b!279`4cf$b1cE(HLd{l^I-8$+$Pau|753A;_@4NPL&@(=kYZe{&st`DA>xL@@Z%k@=JmQJmT z*t1SD*A$pE9Sj(bLdeUCk+&qor7(`Nx^|5H=^6aX9##DfF8V}1+=~Y%3B1)1cw)6- znu6J|_g={~xhhB|u+5uAcLjLj1{_Ia z^zeN5bagmV9Ys7ds(&<3);yK^F6J1xb@;Ij_^%^b2%8i%+KK6% zuh1W#i+ks>s;xVcWVNydjqC>C2tU@Qf{yKQI%)B2KIGsV+Ja@g!P>da-V-fj6)SPT z2G{DL;2Z;7Eu(M`2gSkfBe5d*nl!kh$cZAT_KD!LN%ENQRK!cR#4}vMp zj0+#mH9f+GdQgX1ESp`5T#~O?EaU5SmP%JEPjt}eCprb0cwoPo7S{-<9QuE>%^xZb zkiKs}%{(3$LS;2Y1#Q!nO7K3=o%x*n!q%ApXoDW@moE2><4xAagoXIaj1C6+PLk+1 z?l8_1Zd+iy1Ao`C5hFWV0s-rl*EcI%A3vOPZAL5^bEV%{o)FeKB9&j-ny3dKNUmNBH!d?y3?S$C(}(3lq~=*NB0uhVoU zxOfb`Nbsg2%$MKlYw1nCBtL99n~{a74E0Ve;4>z%(z=sze`F*KG?7ke@yI(bdKgmO zH#bX!;>$?8AJXN^#lhoZ$^V0`wfPa=H2z9pv)g|T$o&GkYxPeBY6U*7E(aV#Ki&0! zKP~J+yyis^?5A7tAQL$z=_dPdUUkRy5M?Nh9vn8fR9^|ct-?(W^qny$hw@IG=oHn=se#% z5%-haM2YKIIo@!*s*sWx-nddeH~8Vt2F_j6@Q zC*O^yywQcrXU&O98`fD}B&*~aT2k^J8ubly_T?;*Hvzi+7n586>5ute{h_)`ZVyua zn~{r#1+@M@VcEve5@(=$sKWLgQIiP0y6o}$@{*D$d!l3~6^`iWCfF+J#sosTsMw($ zqgdSC`RPIyzkE5|KYBbqmVK8agK@ zS>#L|iC4N46o89=GLaY4zm7ZO%#vv%JDE)wLWb&9XTC&_C36 z2EOHXf4&-W?TR9Q-vGBpv<+`)M*XL~rGy$UPw)@k0`M1J-ppPVxAALqv-xEk=Q`dt z5eso-Mav1eCFxjy3umE|#Ca(r>;Qc{FA|UM<v8V@f#r!`VC=!V=$wC@ zz<&Vzd&+ursyeyD0)G(rG$VF(4zErQ>++iQE8b8CTkbVZESHyv$tiCEMsH$)`jkO_ z9zrzqxFWy4&zN*aT%gZVS#skd8bwB`IdOi28f6^D!CdURgqy|tC#%_PXixZvm$fPD z#d6;-xjttF2iG4~aDkM=xm73%P8tcW8wn{7-chrrL(IGGO=f_}SIE0oyK}>KsmjC0 zDPzOLDa@4UHd*yrOC=p@twybqOVz98C#vh;Pc%I~y!v=HuMW0CGx~306{GtUlO{1f zM_+iZ@-D`)&c_E<(#qX zG%qEy@46n?!szwaoN?(5=l@rB(11`HrenAi`{SN-e67e8Or+w>zF(vd%jP;rmW#dl z8D(>R$)1DG&|hA<;}Rc}4~6yieeyzC1=3sJxn_4A+fKGj6mQ0U%L^ut5Jk@m#C|fk zXV2+|3wO%9yDZ(1XPRgCx#sC<-{2cxnu#!vccnNR*)Vi1LA!(+o!UPCifG9{xC-I< zOdcuDhyR#0MLHbbmN$X~ixAEeZ>S435_O%YM-ozm++{S%zBe}bd_S8(V~lgWaG{tC`644~{k!BJK+)WQjzV0))Z9gPFrD(rxd zolH{@H>l$}-}u8)0lzIFZ#t|p4fy?(4>j|L{iiOlSA|-}E;DJ-O*!4cPX%8p7Nrqo zdX0Lmu_8$`D~ZQ`LU><@WZ8!8sMp8A736u|x}W2@?>p+|ikW1cPhxfll$V=yC;5TV z6G8A?gojY}Ly=qw6}>A>@dkb07c_o{7FSAy*2(ST#kL=d>Mhy07uzmfBbrLa$B{rp zKB^JLK+ov=JGHYLFyu`4UNH>W`l{Uh~xORlRUkxWWaMS@@K z1dr}y@pVq&CMd!uQxFINI`rc@o9i!$&t>-Nx2a1~+LLA$>E3T(G}rFYIc&n5RyTzi zbUB@ZYp;IVHTNQaBt{(JKOJBj_pUPg3Kl`(JH6F+N?u40=8gjr8E!)!gDbK@ScaQ_ zOhQIFL`V&HyfmDG_RkSS*<=NDyhb)go_tN_Cmxc{Aug|az*I1h!LJ;&IRch>;;wdG zPJez1R%eN;2WiklKoM8o0WuGMzjgbfkXEVgitZ13h+Yi$)%;@9T2h8-bbP!epRSI0 zJ38d=u0BOvsH|r*s$cE>gp^0th)g4+$SEWNs$K=b5$x)gRY}w)N8Ml#1Tb;BjtN?9YCB+f53w*51h9KFA3*lrb>~Z+;t}@#i4F2xY|& zwf_n{!Fq@%z@5(f0}0t+ zta{#kgW@zzmSv<(Hf2NvZU7wtP-Nk-Iflh}CZfUmg~dz)!Qrg(T%W!jyj+Tssq>v@KN_%ofw~kvI#-|20Dbf=*ms+H@5(!~`m!4-Li$?F zewPr56+dr^J+|8hXy#6KgLGQ9~Bq?3GlQi2gFN7 zJ?b1o22nH&5&GKINTIN)_x7l%r2eBwURRUdO;QyLQlAaHzVD1XH_F53Qw&2vWfGt) z;+RAV$L;-b6Hd;Smq=z)6|v;uroTDwhXU+OC*zVh4OF2tI+M%D%`v0BTqI0$wZH$K5_u! z3l79}_;!#~*Z?Yp2O8BEjdVgI03l#R;RJD-w24y~KC`llm#wA^C*YK~khRE4kM9Jz zMmIC};;77NSFiroqGGIh3HCZc}qq$GxT$e=+6M zcj)YZJG-;VuQtdGs8d{glCzx7MNO4YL$KSwI!wE!VqL1diE~QV{WQ)+OZjM<-x5;B z|8VR754ZAvV-YJxGE@j@@?0?9-+1&62H^h>zS_!inrb*A+h2J&<+au2TfI_ZrXuSj z6H+{>hvv_x~@O-znAbr9L6wZeJe$TlT+xq~7R0I0^a*81KAq4c__u$|Y}Bw+sh>5MQv#tt-4swB5RFaaqh;H|(Af z5Rkl8Ry9_tF$5q6v7&GZ#Bu-puuFQ6`Gijy*_Z&vii!@aqUrOn{M2gL;X5#$SryrG z^Z^#v#6uyBQV$os7}%$=0}l&=LBuxC;x&6P{Zh+{zbH*CSuKDFxZlf|bnuiQOBodswAf0nQ3flIw1a6^QXFjLreE2DwEkDo7 zH$j*@hHc2PSSZ@i2L$1D*^fN7KZY`Xi2_+Dc6}EfaCTTxpWsvA6IJMJRy`68y%Mfb z?P3iQr%f}Ln=d+%#n!&^?37umNwH?7skfF1gc9jkmX6^4j>hUX>l&{kB#t}k8vG=b zGPY_>!^(?60qo1Dz_%1B<(SbjzDd<{muTzEV?T6ZR&=^6DuDLBn0B%sZq?Z~KDEdd z*Y3b(xg+X?^inrSQkG$bj{2#J??NsJ?#tX_*(o>Cu2tj}y45Uuw7U%{dUT*Y zJPMO(&Vd!r@jD_&9)){rJRIPtFsM1dZO!}4gL&Pc5m?-~vODvj>jH5Zixal%bf{W* z26m2T?B0bHdu^Hdf)D98b_OB0gI{V6o#E4k6rL)KOM(9Riwz$Ypq1=Kt#o_7(tKk; zq%92Qf6xImq#Z1=$Lhdpl)1;+DqerBz=VtOMqaMowrUjpZPlZs31R+qjqodAY$DcH zn8D^qnfu)W2nSYss`TRf3;c$3k4(DIi z$iV@gG5^-_w1GBnjU3&+j*eYpoAIrm7ZcR9+jMDhwO!ZV%ayac_^xDiz=K=K?fH&3 z=XGgshDDJ>Eih6n!mDXE6WAz`mpl7v5jkR-Q)+ctMxvUEt6I~RpL1O&c5l{TA)Jf; z7vp!?VE%o-vsTd-ianJ`0Ad|b$>Licp*Ur)Yt~j4adZC)@v*@25!M*9x0b>7O_o8f zU*VuDjyD-L79P~QVK$K7p0BvmqTg- zCh#eB)?JaHsQfN|5Ng?_)!e3ZQXx{!QuLZa*HuFi)^Ev>FSSW^R8`dhH}}f3W6~1r z%H_=l5k46cflm|h1FmRYu_HGe63sDqi}ByN_X`>!CcWs2EnTFxn_Rlv03;Rn&kypDiWqXxW$NYs9≻Q!<)wSZ6!}7VS6Y zHhtMN@F&eXtdx9M3Gn+4)Ul?lRE+QuwunGmBOEk>Ol=E**M>~=J%h&$KQSz=O*~C;nnImi_5p8guLu0=6FYw&qw%bf4Wzf;t zy)|jiB%VvH4;5dpVoB%ugN*+1M>qK*o1?~q8h7i~R1tzq+pNhQ(7Q*UJ4mBl(n#V3 zf0pm+MfW+%&qUjNkhAbbEFfl9dWXA`g(C0$k>}232T|YS@vNh6vu@6SkABW?0X26# zaGs8+`8xib%C{P^oPME*S&IG|?NYWge|M})(K4K^`Z?!oP=$!BZ{Bp-KI3Q4&%610 zxSZ5Sk{{$>bZE8^fMiKHAeIjx{ip{7Joz7#iNDL?=NdK<#{(rZ?C4`1ArguUSXi*kLx6+9~%|)Yy6Yu z&kdrEmjn%_AA`T&1Q5Z_*T65MBjrEWVcT?fz%&9ypq5oifq}ORe3JnqFv~z1F^Dtj z>`hYn3@`7yBoflHu%mPE14^~a_(6%v~ei4sE6Uq+ry8SxPjw&(X z6~PJFZ1g?Kq?=Vt^N_fF1b^`}@dnMHVthi;HomACUg;R#`_XpBxY>r1S)LQ79c%cc zE_#1+g8w)M^naMXx42^@pFOJ9|5GPL^Ne27Za)LH$AP2#h0TTpgLbGB>aBWgMn;&u z_Nb?H$teQr$JMnx4n*DY(RL4huI{=~DmOpPj@Zt2I5zm^bU7OGz-|Js&kr}@k(M2? zzaMX%of?-uF>co5SLx<8GI40QkdB~x_h3Y_-yNO@^yce8A9%Fo&a^$oq#Uka^Bt-m(df`7Fu zelEZDI_^CrV?4<4t{CmmvRY@T>&<8$em$%zWZAqy6e&Nxz5Y6}M8DB~YQH-{`}2Z0 zY&S&^i2Jf)VA)wx&n=%cM-Qv1M>uCu1DiCb9k163JqG=`@~dvQH@YuOA-z%;bpW4X zDs9fOlhA^vcaT$dY5x(4Nt6Q=rd^F(A=Ed|)F#==9QQr!rk9)f39uU&gRkeZzGYw$ zZD;@S>$VSj%(eh#MY{k`?*4D*YH}i&)u$E{ATCdJcrp5byRLSF$p)a?coXa>hZVQq z=hsqG=}Mk~f0qvF;WJk0*MZr!)+@Ic#({1TUFF@=$e<2DPLAU!Ps{Pj&yb&+#F?Evd0U(Ui8bvNgB0bV#P>V*PjJP~3|Q&Q#9X0I@qnDNnl zqLS^}7hB?(-*dm?7m)q&8I+dt2d^u&tvT4n@D7EJp8KC>EoCh6BFB+<;Lz$9cM zIE3%41s)G^fv-YbzIXZgJTVFD(Lk(hDwV}s0T@I9&jo3MbGd56o{KZD~$n9tYS;pK*WL%we*F3f;QVN!p2Mn z#fB#eIt7le7h1?RVeo;Ij%bS1bk>#T#0cB66*G5p`t%t>ND50bKnJfOISgJbb+kFB ziam!hZDrCZNaOlhZ6HEZfbOwuWA5yubJhF$KwEp!&FEY+fJfm09jRG5qtF;YD5NmY zJ#^pDj2GqtC=|VJ&d2x&C;Khdwyk%a(ku?@n=iwo^lUcnEr0LJw-QDY0xXtFn&Wje zsIyDFGrh(z&sjWp(i2Nwb()(m)IiQ*E3}rR5F%*9Z6q${%%0FpK+dUFUbYsxoUAvR zAZhN1xf z0szrS5QW6~ z3t2X0c?zc;cj9lqtoZ}<4=8>L=q5a8z5CAcwjK>e|DWN`{0HEVe+{?5aq_u)7ue`QV1Fs z(Fw=z`u!zL=x0dvVw9I76ERT5=q%b2;#+Oy^Vm>#G_KX=kl>YxAB>!PSmd10&;6oD z6c*Ox0+<)7C7`y0t%%I@VK09-pMD65Um3uU0zsudkfb01C@;*zc1{j|=O{cN2f)6P zB2tRc)hK>UVLxHbagHY)v3P{s;?Wu}P=w1wOA40p)qI-LJp~|piUBvXF#IMcl*rmU zE40!2!nZQSgmX|c&?Epo&7)|_0|TYKbU!_Le=>JMC?FRBUd?EJ`;RJ2?nLd|*Gufwj`aXovJciQTmZsesq>Ta#M@Sl} z11e~aX)0;rz=KJCv}(N%YFGY|Nw4fF&mEFWAewh|<}}(vekov^KE(55;bCtYVe1cx z!X~gSzxpanG&<~lcom2tv!wDp zC9t2klsRiYZ)K(zyqYXS#Ymswm;q!TJQu$@3X=OYd%5QdKndl{7XYz&cA=d!FYA+Auu&}PvCzDZ;U9}fq7|*0n;9#lb>5&dOK@>+=4Ut>)R2O#>_A+7VTL%O?T;5R}Y2Uj80z^sC;CQBA~qwg0kAlJx% zuTYTgMex4qdw&#*oyW_x*T#nkb34X`%5qM~uWamQZN{@Ie!HqsZn>4pM2nyXu_!tD z({&Kd9HuEqe|ip zqwdztd)XT(+85T@S}lRxrrw&$j)Qw67&%9UMnMsE0~k407*YFdSPhLTHBPzF;-5%zP-(3(3R{~=tU z{lpApz6{Umh{9*4=#$tUIO)-`_s?iu3%WS#X)!_X?KavWh#{USf?qa2Rc6irE7^bj z+%MR=&A4dbkmkWLJ~{C(v?m z`|CD0#;5%W3VAs%}+=+@YQFsU{UYA2`TCZm%N-;;wB#Pv>6;?%czbxh~trzxiHku3a(f zpF9~l4%yB2hM$@gv5Z&)4{g3yD2`zDUy-@jH5Rm8tU2H8!=!TN8M^AmvU=}atQP>$ z+&4w+bc@Ef=g(AurZ4-m1bfekkECFK`PfgnW;eupyt1*T#vw-}d#iCw{2cKkHp)*xZ~W! z%vle5GR9tgk={MiTekk#_b$o>7*7p+9>F^GB~NMW(n{*q!g{_NPsDMQQh$P%e;`Rr z0X-*Ot)e~9Bgl{MK5zE= zrBg(HzfNlUflE=KCMRk9oH%NK$vgHt7*2k_6A8Az25=Mss|x%Aca+W>^a$KH&kqoQ znl&*Odrm``eRJ2(Em&ou$3c%b-uW+UXtNUtL5~o|`~Xo@abK2BsQmK+`cs2~5P1k3 zW$y2ISF!+K8S|RZ9?skC?1S;lYsn^&84=A6bmjri^c)o~vB*-kAiY;P(+1@pLj#R2 z!V;3n6DI)K$4@Le8>_@^4nTH>GC_lzzGx{!&)Iy^_sEB$Y*S-d4yI>Pbs{;n;Gxf3 zyPfq56LS{E=;H~NGREhr8P*+{xu+%3#y}?DspI$?grdgYB-s)!BD$KZ5C3={GKnw7c@ND|XOZr2e^>v(#&5gt?2U|>25y*i8kknq@xl~lvTdKvJp?+2H)+mr03oF*}A4zvyGmMX)(AKCx!=V@pY@S+oH6&*Y zoORJ$1EoX@9N&GAm=KwU-AUXaH$av{p9LGlS~s}>Z5#CU)*V=QqxX>w>{Nab{{qkD zPv;`@@G9(F1zJ(<0_=ql!)DG0i!`SIbd_pIL9+zn=^ek=E zu(KlS+t~c#ekt*QN%yV@LGCH7@#G%zJo=}+cxnW}#CS!0em{dLon%w?>zOZl(fa#p zvsidiU<647sS$0Cr_X4lB!12~zyHvob7>8qGBuiV>%Ci<04uA`=lSD2!CbM`CdCtGK-Jq(dPz@lYAPtO z?aSsy0kfZ3Gn?ARQnjFUg_Orfw47MwmwIzg;CoYLfn1SU=LHW~6%Ts?K?YfeLF+p~ ze~|><$C%B>g;hnEN9|Ydz0-<;%`BQBFwPX=2_|k)huXfyQ!_4wDWKC2Yf=4_Id)d5 z9$0^p2**#`+)$DyA}6nJqPo`z)7swRzfxjkXeO#vcYk-*RH|qPLb+_oiwBo^U%ozn zQ0ZKlKI1a`bGZ;&iuwZ86&Bt0hL*>FXsQ2)7Q??DRfaV=E>z}k1Wttp)c*sFrn1f3 ze-z|CmDb%Glno#-G>R8!*5VkflN|k0M3-PyxA~MLA!i(rsrjQc&{I0P5P_ZE3rEN& zp&2nc8vmHm3&p374z7wIVSX)RZ6SR=bh-g-+Wqk0VddfBjaXNTAsLw)jv?WNx`pTj z1$~u_1szEaWFBMEiGEOO%N=1ctYY3dI@D+w8BbkJ(lTzWHy-`LTFeQ@n9O1c)|0Ou zl5$3bXRWYMkC#xTHB8r+_+Nc}by!s0yEY&oh=ep!($bw$l2X#$Af2@y1N@` zW~3XG79<1)P`YD?Gw`18{NDE*-|s)J+4maun(MyTv-Y!}=U#8et@y>|aH;mmaM3un znK9xMj^)9GqEtfzU**sqAoGRC3Ews)B#ZKh34J~|Oq9=cC6OC^L$gwCQ1C2I7$NFu zmH^Q7iW+qZ6!yR>Au2KeCchg#oA^=b37wu+Q26QVpfG-Vr0&)&T)VQ>o1F7^jgmK- zXGA*+&0=9d@3l;K)~-;GLyK|0*or?jECiNVEijdv*kK8a9yze$JF-hV6RUyXvA=b> zkxSbm*ujE&S-Xh6>;EOue=RD$3m{zxQvz{g+Ft~o&)~yYL z2@vI7y(A5jJd_NLOtfTt7SrWdS_Qow28)zSCV@vt0vZQ8+C5vP)cq!7A6{e*W?~F# z!w8IRRk&OCe`IK9vEQKDj%ZR=goO0$c&(7on)|3KyBgIT+$!(RN}sl5odJ6q`5Rj&nJ5eg$cxxmd2YGXdxi5DZk(QdCvZMcnHcwDui zerjpSO|TJ%&(c7`eDzMIr~}^PkUZnwJaCgM(^ZAGqs*z*M?8f5K7oFoAhIT6?zIhV zoba1gTTX9xbr?FrkX?gP+oVaWiH)ElXX=gO((APABs2sD9tx}N#umGg4Ewkb+zZ9& z0AfHk69C^g(%i8Zo9jR9m1BgnmmKsknDLImU}OX??EB=bp{<4{PUgZ+!;l2>JG^kt zH+jp-N~(FNN+ni`^7x8d4fA%N`ON0+CVJIKFG2EQ_G{9Tk4p|ZdW&BM2F>CGwwWMp zSff47n+-LDA}ST!s7UE|=+z))zHr&7ZEw*%PMKKqx4HqR2wII6qA6%gqIUu-W6y$c zyhy0gs{7qD#$oZ;#klG2Y{eLZ_XLmn)@E>EByEFob(UX~3tZt7=EcRNfx4J0dAbnYPkyp%3N^fxVpH%- z`>X@o-(w0l3DcS_63}-t{r!xkCxgQ5=a4;==+|Q`6&;~7i3jh|1%iRoc2gw&DByPO z!TjUxt4Ukt9j@j4jPh?pQ`1?pEkeh^rJ`G2p`ykqZ^1VUUe_~zv25?k1amiLgni$f z9f#cx#hek!-GPr%t$C8I$%(ZBU`#?%beFCS0U8Q;pg2^U#C zzeT;qfU?dMF=l-$daexQiOO9SonUvv+HPXb6SwfX>$H_sd_Rl6cG}xAU%QPSja#A? zd41Y?!jLbPk2zqG8vCNoy>l_bFk)>W$_&OFaaDK597Cxx+-UR!a1UPbwIbM1W~|&O zUb)=WG}zOR_&vs^`eQ6^<%S;rto7xHipWUBn0e^Rkzo0G+bAO-3Ym%+t1~>f0GFP( ziD|pue9vBi>ExaJd*d(7yzV(WE69bB>6f4Ts~-4aQ>)z29ts~*jrF;&d3inb@)woL zEL!b9;tdscDCj@Z4iJvTrW&()ao8prDGbT$KWd}&0z>z(-vW!$G@C6Z)ZEn;IOMg?(0NQji zf6iXfaxLCm;_HgueN%qVUA@F+h#1p zKz9Y@8z#Q4=T+?{3dZ-IJxK2UrK+b?mNH>`_LA}Og$i)R*-1f7bUe1P{QKx2%%~b6 z`t14FKIVfD7oIm&?J5R2zBiunDAxzKUunKf;WV%>RK}gXap~L^!-T)2g_6D6)ry&j zU7@-3h5v`^o7}O`6#%NsDoiDq6g=1Yu^U}JsQ*JQ(G^kqnI%WeTF3y8c_#mP(?~7)Sk@^x+U&bFb zUNlMWu_O1!XPjeDaNr^wvX_l`WlA=(XZqMifm$#o56UZe@gJukLE8U!z`mWErjEX4YLE@XU!jJq00ky4_7-wwBY*OGt1 zu9$8)H%!{PG^~LxC`7B?fxg?ejuC1kFZOXc^71Qojm$CCL66C2I~823Q9z476*DvV zV&pcR+iHC@-Gb>lNIpd#Xi$w~Nt&^&D@dNHw3;&)x*xA1GUZw{;P z%!9HPPsCj)emCknWBA;4$&PzPL>bfqAI)_W_pOlxqNe4`5vEDSi}c4f?@Vf)H9DlG zP|{S-Uv0z(mc%h?$Wl?i)5U$7I<`=3{k^`?|7{ac%B^S+t+caoFP5H z?4$x2=Jl`4qC|Cs1 z4>~5ID8)(U*t7o9J|9W3%&Ed$Y2(*KjGltOxOTXWON!n-#p|)?3)SB7)YyB)q~qEJ zd>*`ARB_u8Hf~`Ly}+Jtr0_h_Pdc|enVn+TUzkqvF4 z-+moTRh>gZMO6;R!jcY}ZsL*rWG{w8J}TFBRC@_xj0^#v1^;AOnbyGde~XV=w~?cr zkDi-@_B*65Zy!6Q4FzwHqr9^7GIo@v%9rAjJDvSUL=&&sVHFG)yN!#nKIUa;<;)kc z7&m;pLysixIbclNfBKmytgL$Ti&Pq8xzJ19{XGWOS2Jg-S98Wv^pGQQdf~MX-!n{h zRUHqT4j>O-Po|x-2%Lhy>3@k-4)|Wz3p`9uM<}Z1+{g?CpMMyD4Xj<89#@-Ym{$B$ zSYF$ZX^SwC{wUms{1Rk?ayfH*lJk`@oW;wp9Q ztR4#%GYzZ}+~=j-=G}hEIfnwX<*-jq4;-D5OXYt>3{cW!x^_tQZp!4zMp;UdDiSYj zNkEvM#gML#k#ZlbJwH5LN>G&8Gv!D{Y($?XZxak^rlSE_+jvB0N}W9x-iQp{WdH8v zwg8uFJMO(+EAO`_I(M6EH9XLBHDy5muD~K>M!<+ZlI_hgK6&Xwf=7&-64ScVfy%nb zD2CbQJX&j;oB2A*q13ryY{;rFiK+{oS+?m~#I1;^2%Z>H}1SEqWu`9VV0rwVwd zZc`t0T>(_MO&e`&i*P|dt5B%hQw68gQmO}q4?fSotq%^TM&TXGO$ZOUv<6u8>O^XC zIBTd{+MVA@OWK;(FP2m|n~~@iadHl&R35d+1=ZG0r^?KY6|gLnYx`WxO>oXInD;2= zkbWAI0&zFwrxy+uR)pKmTccXw1*7I?dzv0aUP-S`6D9aJ`}Fg0f=BVUEQ8;+8GYs~ z4lT;3?8#{*NhUl=4Q2AeRpLv6#!R<=y# z7Rmy)8R=UTw$n0qSiu+x(UGuuJqGu>NKZ0AvFew}wdg=9o6iv{3;guzJ=6JOzSf?} z4c2B^)z5Y59hBmA_C$e@FJifP<~+(EKUh-)MS(!AmS(4{(J#t5RTbUS&*x)ajKt)F zXzb7XG%xlrPbzkPW-EtWM3&hnCRHAV8B^@Auy4E*uCLnZ zQ7Gw=$h_)!+45lb0q{a7igwp?u+yW*DtKXud|y#-_GEzw4DRdPEs#HFbJLow>wVt@ z)6|>Q@9f-lAA*XyHbV`%TTct0;qH&y z?&oHdeI{?Qdz4)3lAeXQ;EUPDVPdny{Y!FBDG(jopd{#4M+Q8&dVtS<(qkGWVeoF% z&8d48i}oWBdU{~@<1~8S*Pyf8X>6Umnh$e& z{!%J!ib6oZ;q#OmEVuB-|0yB zbHM|Td*Kz{3s2=vc$)Bzy#EQ5AXqT_U1+3ufKYfJ8b8X}Dw)DV1zr!zJoK~PYA(75&`)10V7X$ch@E;{<#uxgH=Zk#mt(2@2UYn;fZAAb)j*t$xa zh0%Z5%e?hE(ewM=I&cQN*|^%fkSWa7*XY);h6h4OXhceJD$+VP>njZdpuwXHeA*xq z|EAOwD5V--)B*b&yIRrO^rTiKTb5s!Tudv1xW$OnjTW^a?@5T%G8wr{WC|?bm^DcH zmzg~h&Q+sNP30vZAhQ*2Vo0b8wp0~WT`nRnOGYuPa$6u15m^)d*?htV3km$1?xc6@u%-dF3h-Due&7N#FH5aKOhR4AZBlB{A(Oit31O~i=nsE|3qTg7h%ksu1 z`L$c7Yx8Wes0x-@<+eL}sfQRYQr#XRZ7K0>j9f_9+P_{*rkpUm>{2DgleXv`=(612 zx1t3N3;ql%I$Xj_)rJKu?A0bibYM;N^{k3NfCEFNo-?>bmiK|h^A+U{v2UuR%96?2 zLR`z_6vWNw6u_&%qTPUuiH?cVz0qJWfY^47BkYb6mER$RnuHcM1Mg4N5k0V+`b?uU zhP%9`RNaG!T@1cKz3i~vUv%1!T30@mpxi+Q*;HTS5#!>ptBfMJoGS8!KN?oxU=?sJ z&^;CA9`)O{a6B}#h^Bd9lvl3KSMbC^bN7*?NAd1vFkpZ1h4pczySTo1n@Y1pN{UCp zZ-e2GvTRBv)#63fzO@+s5aT0{8oKVpQ|Y#v8mo{jKr!8h(mQUV zc3r|YC27i0x5zhzj*f>t6581o|I_&Advg(sRp$vaI-}kG_pL)6jV?NS;XVCFqTtF1DX z8lwb7>2C*`t%pbJmo~O1u>4q1$jPmSRoj)tLq);)9yaY0eEbMBxzGss!15_(}fM6UTMsb z;(lhd$~Sfc7P+0Z>9nKEi;=&LmJxq5Dtmr_Rf2Y~8ziM)5h^xtOI;4~FDD;g5HL`^o>08VvmqCp0CF6l2oNcWoOvoH3%m_UKbnhFg#8w zNp|!6{oV1#7SYl4w9C=*;zNswyl`axmC-QXb(L9Kupb#AH|z87`_;2&Xos7K6`6Rg z8exIClmNjtVf~f=w=;}6NQQ{RwHi?!pNaJQ9h@2VmkRZqh(8MZ~<%9R>o~eR5 z1m#|~XJozdUj$T5jxW@7Ty&~N&=<|hvo}9z8il$kqf?vHC_i%#-wI!%;m+2^fpqB@ zzDdUgi!pcye4ExMY?rb8A|r|w#Snkdha{8ogwZb1F`iri|0}9Oe?OJYEyfE1N;t)l zI_@c6c29B5yQpEH0g4C_0~Hxy0xzuL{+8_yx4MBqH7JyFmgPAv2D*JZGhvNCI=E9=jRXfpLDwxx==QuNA)ngTQDzogXEQUfwaibR!U4bS`@*PbcQ(D_l7mz zahYt&vB8YY_1J0%qg+oSWGRQCu*SzHpTJ_Rrc%QORuOvT*$ux{Nx6QH<`faAr^yaz zoRM;U{#9LLH03rkOP*lJ*#MMtNs+2D=C-TJt&po>9oQ@6R`5WT2gQ<P@lRD|{rN5_1LpR*WhG=_xDNI3gruSeL=dha42*#_2w(dRzy&_ru~jm2tzT=TWp zmE1jhRkH!k!tk)cWk9zwgg5f!{c6C_rfk$Ig?Ya+|Fq%hRvn=O*QK>zByZBSxUN*M zdq#h6g}uoUVld)^v30}VIVAJ0!!F$|pQsA|vgs;y;%dX#-~)WFThH#M(B-T^gJqsm zS#mE30+}fGCY*u2e`BEX9RrOC{@S;Ipdt6=ruIk(Wp_*M$R{Q1`yPWOs%O-vDnb1e zOtWN6xzn+FFPNt;rRzr;{59u@sUJ09+CTmM@K7Az!T;y?h=)}L3{MKmJaO7R)g7AA zylaVS7!KM~zT36%E_31?`X6Pb`0ee$bb=;bUQyBVzkEz}^JE;Y8iV?>h!r&sFyhuN zCM>h?C|{4!OtvQtyB3$iq>zlfKua?}AhOWT9*yHA zO{FpC3NJVH=9>vbNm(f5;UxSu4){iiTTi-*C(B@5_IKoo=fSUi<-LyQQx~)~Kay$W zEwM)d?iljh(#HpZeZC+LTt~JcU#>pi z3*o1)&coo9^9#qegcFGjtI+lcvKN|#Q+1*C$3E#FAhi>v%y4f0{Of7C^k)%2rhJjaanILfr1?njmS8HbeTxpwOtocRif>!Rm za@r^vJ-&?~rQ$~~4`EfCOoR4RkkVsAT`CJkV~B!x&`U6Nu=u3vXG&h8!bgpVIkuh6 zLg`PJd{$HCH}mPKmmENZF>P05zZbZ^xm|6*WLrKpXwsI;@2VMdJAT)jv|ufM>J4NY zHc8Gheo}OeT-1YgdSUbzlV%3@j1ufp``7>g-aofymQRp*6iB&9+s1%LKQBjMg#-)&`JzMQWz?NraTO5ewv*~>CnGOv?>TKlp-A$1B+QlU|? zx6wp|)DHE<7^5in?Ry&qax`{+f<&uUQ*b?#3OWs6V)Rbik8`A)7>zr_@unR$r0W+- zvkDiPo+I0uS}^#GSy7t)tJTU9ab1)vcHg@{Wp*hf`YI&oI!Pspn5J?DLi&*a^QW7!tdGJt_~40VOzl5_}foqz{-+8Lp}4+i0W;v*5G z(Tzdco>lGKx2N;ZN6Ep}NoKJds7Mhkm=OujQF3=Qw^ZI8$T$_o4PGox{oFnW>(2<} zMCyf^iP5nxoNY^%Ld&Z*q>i$HdSfNzVzRPcWriYFE~InE}x-En2K;!|L_YtCJ7D9%6aNl9`+QZ0x`Yu)?e< zs!yipwG$f4KsTl;Wf4|cOuPtD5oKZ8^BnxHB1ms7WTK+(NRH{Uu=PG8(ZLNfk`G7f zc=uL$70Rc|yoB7){X1SulW2B05#C;fWPDG#zsi+m?_#%=3FvDm=iTy% z4X;tYW8KatxaAMLGw{~VizgcWX}D=%GX~)}ikTS?a=^Fu=jBz*;Aa|2;q(&BnEBN$ zOJADYslq9{x{X|WV#u9l3h3E>BsX!5rld$J)Rds>7yh~!0W3!acLZJ7b6_GZ=!Vy? zo(O@TDShF~5f?iA=`Z5Z~>+AYz>0m`*bYKu+Y7I%gWLy)3S6jp` z2%ombtu-%wzpJ(gM;omTk|H2Mx+HZMw}RS0EdO1L#!;rd7u1WGr#T+?iyMd+aGgFDoS-R` zRfrEyHYFnRzpaoo=T#Dx|X*wAsEt3&Co!jbyD!&+sFT&&*Yu*poT7dA!go# zCgdRC+ZThCdsCh1)kM*vY7R|}bj1|DML$4Pa1L(wsdOAMG^OtQp2)wUWz!^R!$FjG z{;PLd=1cCjr|($ImOUWrSPKnNsyJLCb>8#O`|WTc4Qpz?Fu!1K)Y!4KaNaT}hGZlN zDL*;s_*_g(a5R`#I)80bAw+hTfq>Zebs*zQ;#~W92$%m!f7(k4jad~6iq`Zl#1L<0 zz`Mxm(p%rlNV~w)Jd4v#qe)hCxDjmS@?+3_31h@dY;4A>A%Y9$`+~yNzxCucp=z2( z-aKBQUVQMQcnHK25(fDn+WeIxzV8sXfq;x{!~kR@gv!4-BchCN3g?VR-w^bvWPY_u zEeeW3Kq_&xU|dJ`xi?e!c?e<m3LTMmpIPMQb(I6|T{3gU>2;8`y51}nR_USKsnpsoI} zUZ~Y5gEdq(a!iXdfvID)KwLdw2xV(3C!6eWM>l`s%n%(;opr9XZRqUktTnQgmqcj{ z8Dbyq$XDI8stOGkD2FG9YN{xBKaT%6@4>6DJ<$*W?l}EEL4_R`N}v^q?E;L$l*826EDDHd2m$o+X-1u`6r?tvdK)&4LbwPOyMAqu1n3gEPFc#`2}*(158g z1BH+tZu=KqI$X%!I-0M_LP=vaR=w@6CSV-?yfiRjX&q9MYbI$k@=%F|yV`_yvPc;ZFhTck2rR`F%*^yIWsuDM0bz_#nTq z$Dpt8NQqe#;Fop&26}N1a=Hf**)o$9Ghx6HhJQnd-y;U@5e~K-B<0L^2(7;%1n&@b z^!Et1aBR@LEh(`WB^;#xH<0K($oC#(1;3+tTau?Q5?2G^Fq6N*B=2D}a2V@f5Rk&y z{i!YRdGV>-&+Gn%?D^{k?9iXk-5s}b-(L+sVg;VO{nyi4NI*CMD#kw#SrNti_meB0 z;{DlTpNH^YJ)4E_{_Nu^1t0P+Mu&=bm;USl2lu`I%M0uOT471wUHY?2jSAkM%_PL| z{?w4}_(25Y?g#v5qb~{GpIaIE{`))r(QE^f4-~@ta}R?6*8eHmmc;vW;o;qk{-w%H z4)5RVcUbWL@Uj~u6D)f_tN-^hEjd^k?+>|t(0;H8-k%eeV)x_!liiWP`@=IgXemS( z@8=zLAO7#h9SOWYZ!P)nrupYB01w_@pa1VQUKl>)|D$T6`#b%oh@adI`F8~q-d+B8 k`98h>#(%1n^8T~`NK@cHvb#TM>EC5Xj`GQa_Y=Z@0nKr6od5s; delta 26972 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 W@R4sJ&Hu$WBq(P?FM5IeVx|QzkPNkc>+4`R2 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%0A+o+K4$ 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 delta 22749 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 R!ijPpoxLh!Bj6kb@IUOY$V31D diff --git a/CI/physmon/reference/performance_ckf_ttbar.root b/CI/physmon/reference/performance_ckf_ttbar.root index c67a4664e021493d087a194bc6c61b4b18ae5c11..6ac13d3652130c5b84d02e0e95548014fe228c63 100644 GIT binary patch delta 35313 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

bf&;iEs& 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 delta 34939 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 z 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 diff --git a/CI/physmon/reference/tracksummary_ckf_ttbar_hist.root b/CI/physmon/reference/tracksummary_ckf_ttbar_hist.root index f49c1065e9836920e53f82037e86d6846cec717e..94e22df938515bfdcd295c314f9d1690b442e00b 100644 GIT binary patch delta 25510 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 VOV};<7!b(gEOskX+)F$j^nYlIom&6^ delta 25552 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 Date: Tue, 27 Feb 2024 16:29:52 +0100 Subject: [PATCH 08/10] refactor!: `ImpactPointEstimator` moves to cpp file (#2971) This PR moves the code of the `ImpactPointEstimator` from the header into a compiled file. To allow this, I have to make some changes to the interface to remove templates. In the process, I introduced `Eigen::Map` as an argument to `getDistanceAndMomentum` and `getVertexCompatibility`. Part of: - #2842 Blocked by: - #2953 --- .../Vertexing/AdaptiveMultiVertexFitter.hpp | 2 +- .../Acts/Vertexing/ImpactPointEstimator.hpp | 62 ++-- .../Acts/Vertexing/IterativeVertexFinder.hpp | 2 +- .../include/Acts/Vertexing/VertexingError.hpp | 1 + .../Vertexing/AdaptiveMultiVertexFitter.cpp | 17 +- Core/src/Vertexing/CMakeLists.txt | 1 + .../Vertexing/ImpactPointEstimator.cpp} | 295 +++++++++++------- Core/src/Vertexing/VertexingError.cpp | 2 + .../Vertexing/ImpactPointEstimatorTests.cpp | 19 +- .../Vertexing/KalmanVertexUpdaterTests.cpp | 2 +- 10 files changed, 235 insertions(+), 168 deletions(-) rename Core/{include/Acts/Vertexing/ImpactPointEstimator.ipp => src/Vertexing/ImpactPointEstimator.cpp} (79%) diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp index ecfcd10d602..310dff87b03 100644 --- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp +++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp @@ -40,7 +40,7 @@ class AdaptiveMultiVertexFitter { struct State { State(const MagneticFieldProvider& field, const Acts::MagneticFieldContext& magContext) - : ipState(field.makeCache(magContext)), + : ipState{field.makeCache(magContext)}, fieldCache(field.makeCache(magContext)) {} // Vertex collection to be fitted std::vector vertexCollection; diff --git a/Core/include/Acts/Vertexing/ImpactPointEstimator.hpp b/Core/include/Acts/Vertexing/ImpactPointEstimator.hpp index 92e77010377..40f3bf4208e 100644 --- a/Core/include/Acts/Vertexing/ImpactPointEstimator.hpp +++ b/Core/include/Acts/Vertexing/ImpactPointEstimator.hpp @@ -8,6 +8,7 @@ #pragma once +#include "Acts/Definitions/Algebra.hpp" #include "Acts/EventData/TrackParameters.hpp" #include "Acts/Geometry/GeometryContext.hpp" #include "Acts/MagneticField/MagneticFieldContext.hpp" @@ -47,11 +48,6 @@ class ImpactPointEstimator { public: /// State struct struct State { - /// @brief The state constructor - /// - /// @param fieldCacheIn The magnetic field cache - State(MagneticFieldProvider::Cache fieldCacheIn) - : fieldCache(std::move(fieldCacheIn)) {} /// Magnetic field cache MagneticFieldProvider::Cache fieldCache; }; @@ -139,18 +135,22 @@ class ImpactPointEstimator { /// compatible. /// /// @tparam nDim Number of dimensions used to compute compatibility - /// @note If nDim = 3 we only consider spatial dimensions; if nDim = 4, we - /// also consider time. Other values are not allowed. + /// @note If @p nDim = 3 we only consider spatial dimensions; if nDim = 4, we + /// also consider time. Other values are not allowed. /// @param gctx The Geometry context /// @param trkParams Track parameters at point of closest /// approach in 3D as retrieved by estimate3DImpactParameters /// @param vertexPos The vertex position /// /// @return The compatibility value - template + template Result getVertexCompatibility( const GeometryContext& gctx, const BoundTrackParameters* trkParams, - const ActsVector& vertexPos) const; + const ActsVector& vertexPos) const { + static_assert(nDim == 3 || nDim == 4, + "Only 3D and 4D vertex positions allowed"); + return getVertexCompatibility(gctx, trkParams, {vertexPos.data(), nDim}); + } /// @brief Calculate the distance between a track and a vertex by finding the /// corresponding 3D PCA. Returns also the momentum direction at the 3D PCA. @@ -160,17 +160,27 @@ class ImpactPointEstimator { /// tracks we use the Newton method. /// /// @tparam nDim Number of dimensions used to compute compatibility - /// @note If nDim = 3 we only consider spatial dimensions; if nDim = 4, we - /// also consider time. Other values are not allowed. + /// @note If @p nDim = 3 we only consider spatial dimensions; if nDim = 4, we + /// also consider time. Other values are not allowed. /// @param gctx Geometry context /// @param trkParams Track parameters /// @param vtxPos Vertex position /// @param state The state object - template + template Result, Acts::Vector3>> getDistanceAndMomentum(const GeometryContext& gctx, const BoundTrackParameters& trkParams, - const ActsVector& vtxPos, State& state) const; + const ActsVector& vtxPos, State& state) const { + static_assert(nDim == 3 || nDim == 4, + "Only 3D and 4D vertex positions allowed"); + auto res = + getDistanceAndMomentum(gctx, trkParams, {vtxPos.data(), nDim}, state); + if (!res.ok()) { + return res.error(); + } + auto& [distance, momentum] = *res; + return std::pair{distance.template head(), momentum}; + } /// @brief Calculates the impact parameters of a track w.r.t. a vertex. The /// corresponding errors are approximated by summing the variances of the @@ -219,6 +229,14 @@ class ImpactPointEstimator { const MagneticFieldContext& mctx) const; private: + Result> getDistanceAndMomentum( + const GeometryContext& gctx, const BoundTrackParameters& trkParams, + Eigen::Map vtxPos, State& state) const; + + Result getVertexCompatibility( + const GeometryContext& gctx, const BoundTrackParameters* trkParams, + Eigen::Map vertexPos) const; + /// Configuration object const Config m_cfg; @@ -227,24 +245,6 @@ class ImpactPointEstimator { /// Private access to logging instance const Logger& logger() const { return *m_logger; } - - /// @brief Performs a Newton approximation to retrieve a point - /// of closest approach in 3D to a reference position - /// - /// @param helixCenter Position of the helix center - /// @param vtxPos Vertex position - /// @param phi Azimuthal momentum angle - /// @note Modifying phi corresponds to moving along the track. This function - /// optimizes phi until we reach a 3D PCA. - /// @param theta Polar momentum angle (constant along the track) - /// @param rho Signed helix radius - /// - /// @return Phi value at 3D PCA - Result performNewtonOptimization(const Vector3& helixCenter, - const Vector3& vtxPos, double phi, - double theta, double rho) const; }; } // namespace Acts - -#include "Acts/Vertexing/ImpactPointEstimator.ipp" diff --git a/Core/include/Acts/Vertexing/IterativeVertexFinder.hpp b/Core/include/Acts/Vertexing/IterativeVertexFinder.hpp index f3ff4aeacb3..d31bfc195fc 100644 --- a/Core/include/Acts/Vertexing/IterativeVertexFinder.hpp +++ b/Core/include/Acts/Vertexing/IterativeVertexFinder.hpp @@ -121,7 +121,7 @@ class IterativeVertexFinder final : public IVertexFinder { State(const MagneticFieldProvider& field, const Acts::MagneticFieldContext& _magContext) : magContext(_magContext), - ipState(field.makeCache(magContext)), + ipState{field.makeCache(magContext)}, fieldCache(field.makeCache(magContext)) {} std::reference_wrapper magContext; diff --git a/Core/include/Acts/Vertexing/VertexingError.hpp b/Core/include/Acts/Vertexing/VertexingError.hpp index b1ce0da3d8f..3ef90ed463f 100644 --- a/Core/include/Acts/Vertexing/VertexingError.hpp +++ b/Core/include/Acts/Vertexing/VertexingError.hpp @@ -21,6 +21,7 @@ enum class VertexingError { NotConverged, ElementNotFound, NoCovariance, + InvalidInput, }; std::error_code make_error_code(Acts::VertexingError e); diff --git a/Core/src/Vertexing/AdaptiveMultiVertexFitter.cpp b/Core/src/Vertexing/AdaptiveMultiVertexFitter.cpp index d644a1d4be3..9e017c5af36 100644 --- a/Core/src/Vertexing/AdaptiveMultiVertexFitter.cpp +++ b/Core/src/Vertexing/AdaptiveMultiVertexFitter.cpp @@ -8,6 +8,7 @@ #include "Acts/Vertexing/AdaptiveMultiVertexFitter.hpp" +#include "Acts/Surfaces/PerigeeSurface.hpp" #include "Acts/Vertexing/KalmanVertexUpdater.hpp" #include "Acts/Vertexing/VertexingError.hpp" @@ -236,14 +237,17 @@ Acts::Result Acts::AdaptiveMultiVertexFitter::setAllVertexCompatibilities( // Set compatibility with current vertex Acts::Result compatibilityResult(0.); if (m_cfg.useTime) { - compatibilityResult = m_cfg.ipEst.template getVertexCompatibility<4>( + compatibilityResult = m_cfg.ipEst.getVertexCompatibility( vertexingOptions.geoContext, &(vtxInfo.impactParams3D.at(trk)), vtxInfo.oldPosition); } else { - compatibilityResult = m_cfg.ipEst.template getVertexCompatibility<3>( + Acts::Vector3 vertexPosOnly = + VectorHelpers::position(vtxInfo.oldPosition); + compatibilityResult = m_cfg.ipEst.getVertexCompatibility( vertexingOptions.geoContext, &(vtxInfo.impactParams3D.at(trk)), - VectorHelpers::position(vtxInfo.oldPosition)); + vertexPosOnly); } + if (!compatibilityResult.ok()) { return compatibilityResult.error(); } @@ -288,9 +292,10 @@ Acts::Result Acts::AdaptiveMultiVertexFitter::setWeightsAndUpdate( trkAtVtx.linearizedState = *result; trkAtVtx.isLinearized = true; } - // Update the vertex with the new track. The second template argument - // corresponds to the number of fitted vertex dimensions (i.e., 3 if we - // only fit spatial coordinates and 4 if we also fit time). + // Update the vertex with the new track. The second template + // argument corresponds to the number of fitted vertex dimensions + // (i.e., 3 if we only fit spatial coordinates and 4 if we also fit + // time). KalmanVertexUpdater::updateVertexWithTrack(*vtx, trkAtVtx, m_cfg.useTime ? 4 : 3); } else { diff --git a/Core/src/Vertexing/CMakeLists.txt b/Core/src/Vertexing/CMakeLists.txt index 09ea0ae12a0..8bfe7c166d6 100644 --- a/Core/src/Vertexing/CMakeLists.txt +++ b/Core/src/Vertexing/CMakeLists.txt @@ -16,4 +16,5 @@ target_sources( NumericalTrackLinearizer.cpp TrackDensityVertexFinder.cpp GaussianTrackDensity.cpp + ImpactPointEstimator.cpp ) diff --git a/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp b/Core/src/Vertexing/ImpactPointEstimator.cpp similarity index 79% rename from Core/include/Acts/Vertexing/ImpactPointEstimator.ipp rename to Core/src/Vertexing/ImpactPointEstimator.cpp index cd9dcb3de26..577d589a837 100644 --- a/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp +++ b/Core/src/Vertexing/ImpactPointEstimator.cpp @@ -6,107 +6,28 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +#include "Acts/Vertexing/ImpactPointEstimator.hpp" + +#include "Acts/Definitions/Algebra.hpp" #include "Acts/Propagator/Propagator.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" #include "Acts/Surfaces/PlaneSurface.hpp" #include "Acts/Vertexing/VertexingError.hpp" -inline Acts::Result Acts::ImpactPointEstimator::calculateDistance( - const GeometryContext& gctx, const BoundTrackParameters& trkParams, - const Vector3& vtxPos, State& state) const { - auto res = getDistanceAndMomentum<3>(gctx, trkParams, vtxPos, state); - - if (!res.ok()) { - return res.error(); - } - - // Return distance - return res.value().first.norm(); -} - -inline Acts::Result -Acts::ImpactPointEstimator::estimate3DImpactParameters( - const GeometryContext& gctx, const Acts::MagneticFieldContext& mctx, - const BoundTrackParameters& trkParams, const Vector3& vtxPos, - State& state) const { - auto res = getDistanceAndMomentum<3>(gctx, trkParams, vtxPos, state); - - if (!res.ok()) { - return res.error(); - } - - // Vector pointing from vertex to 3D PCA - Vector3 deltaR = res.value().first; - - // Get corresponding unit vector - deltaR.normalize(); - - // Momentum direction at vtxPos - Vector3 momDir = res.value().second; - - // To understand why deltaR and momDir are not orthogonal, let us look at the - // x-y-plane. Since we computed the 3D PCA, the 2D distance between the vertex - // and the PCA is not necessarily minimal (see Fig. 4.2 in the reference). As - // a consequence, the momentum and the vector connecting the vertex and the - // PCA are not orthogonal to each other. - Vector3 orthogonalDeltaR = deltaR - (deltaR.dot(momDir)) * momDir; - - // Vector perpendicular to momDir and orthogonalDeltaR - Vector3 perpDir = momDir.cross(orthogonalDeltaR); +namespace Acts { - // Cartesian coordinate system with: - // -) origin at the vertex position - // -) z-axis in momentum direction - // -) x-axis approximately in direction of the 3D PCA (slight deviations - // because it was modified to make if orthogonal to momDir) - // -) y-axis is calculated to be orthogonal to x- and z-axis - // The transformation is represented by a 4x4 matrix with 0 0 0 1 in the last - // row. - Transform3 coordinateSystem; - // First three columns correspond to coordinate system axes - coordinateSystem.matrix().block<3, 1>(0, 0) = orthogonalDeltaR; - coordinateSystem.matrix().block<3, 1>(0, 1) = perpDir; - coordinateSystem.matrix().block<3, 1>(0, 2) = momDir; - // Fourth column corresponds to origin of the coordinate system - coordinateSystem.matrix().block<3, 1>(0, 3) = vtxPos; - - // Surface with normal vector in direction of the z axis of coordinateSystem - std::shared_ptr planeSurface = - Surface::makeShared(coordinateSystem); - - auto intersection = - planeSurface - ->intersect(gctx, trkParams.position(gctx), trkParams.direction(), - BoundaryCheck(false)) - .closest(); - - // Create propagator options - PropagatorOptions<> pOptions(gctx, mctx); - pOptions.direction = - Direction::fromScalarZeroAsPositive(intersection.pathLength()); - - // Propagate to the surface; intersection corresponds to an estimate of the 3D - // PCA. If deltaR and momDir were orthogonal the calculation would be exact. - auto result = - m_cfg.propagator->propagateToSurface(trkParams, *planeSurface, pOptions); - if (result.ok()) { - return *result; - } else { - ACTS_ERROR("Error during propagation in estimate3DImpactParameters."); - ACTS_DEBUG( - "The plane surface to which we tried to propagate has its origin at\n" - << vtxPos); - return result.error(); - } -} - -template -Acts::Result Acts::ImpactPointEstimator::getVertexCompatibility( - const GeometryContext& gctx, const BoundTrackParameters* trkParams, - const ActsVector& vertexPos) const { +namespace { +template +Result getVertexCompatibilityImpl(const GeometryContext& gctx, + const BoundTrackParameters* trkParams, + const vector_t& vertexPos) { + static constexpr int nDim = vector_t::RowsAtCompileTime; static_assert(nDim == 3 || nDim == 4, "The number of dimensions nDim must be either 3 or 4."); + static_assert(vector_t::RowsAtCompileTime == nDim, + "The dimension of the vertex position vector must match nDim."); + if (trkParams == nullptr) { return VertexingError::EmptyInput; } @@ -166,10 +87,21 @@ Acts::Result Acts::ImpactPointEstimator::getVertexCompatibility( return residual.dot(weight * residual); } -inline Acts::Result -Acts::ImpactPointEstimator::performNewtonOptimization( +/// @brief Performs a Newton approximation to retrieve a point +/// of closest approach in 3D to a reference position +/// +/// @param helixCenter Position of the helix center +/// @param vtxPos Vertex position +/// @param phi Azimuthal momentum angle +/// @note Modifying phi corresponds to moving along the track. This function +/// optimizes phi until we reach a 3D PCA. +/// @param theta Polar momentum angle (constant along the track) +/// @param rho Signed helix radius +/// +/// @return Phi value at 3D PCA +Result performNewtonOptimization( const Vector3& helixCenter, const Vector3& vtxPos, double phi, double theta, - double rho) const { + double rho, const ImpactPointEstimator::Config& cfg, const Logger& logger) { double sinPhi = std::sin(phi); double cosPhi = std::cos(phi); @@ -186,9 +118,9 @@ Acts::ImpactPointEstimator::performNewtonOptimization( double yVtx = vtxPos.y(); double zVtx = vtxPos.z(); - // Iterate until convergence is reached or the maximum amount of iterations is - // exceeded - while (!hasConverged && nIter < m_cfg.maxIterations) { + // Iterate until convergence is reached or the maximum amount of iterations + // is exceeded + while (!hasConverged && nIter < cfg.maxIterations) { double derivative = rho * ((xVtx - xO) * cosPhi + (yVtx - yO) * sinPhi + (zVtx - zO + rho * phi * cotTheta) * cotTheta); double secDerivative = rho * (-(xVtx - xO) * sinPhi + (yVtx - yO) * cosPhi + @@ -196,7 +128,8 @@ Acts::ImpactPointEstimator::performNewtonOptimization( if (secDerivative < 0.) { ACTS_ERROR( - "Encountered negative second derivative during Newton optimization."); + "Encountered negative second derivative during Newton " + "optimization."); return VertexingError::NumericFailure; } @@ -208,7 +141,7 @@ Acts::ImpactPointEstimator::performNewtonOptimization( nIter += 1; - if (std::abs(deltaPhi) < m_cfg.precision) { + if (std::abs(deltaPhi) < cfg.precision) { hasConverged = true; } } // end while loop @@ -220,11 +153,13 @@ Acts::ImpactPointEstimator::performNewtonOptimization( return phi; } -template -Acts::Result, Acts::Vector3>> -Acts::ImpactPointEstimator::getDistanceAndMomentum( +// Note: always return Vector4, we'll chop off the last component if needed +template +Result> getDistanceAndMomentumImpl( const GeometryContext& gctx, const BoundTrackParameters& trkParams, - const ActsVector& vtxPos, State& state) const { + const vector_t& vtxPos, const ImpactPointEstimator::Config& cfg, + ImpactPointEstimator::State& state, const Logger& logger) { + static constexpr int nDim = vector_t::RowsAtCompileTime; static_assert(nDim == 3 || nDim == 4, "The number of dimensions nDim must be either 3 or 4."); @@ -237,7 +172,7 @@ Acts::ImpactPointEstimator::getDistanceAndMomentum( // Z-component of the B field at the reference position. // Note that we assume a constant B field here! - auto fieldRes = m_cfg.bField->getField(refPoint, state.fieldCache); + auto fieldRes = cfg.bField->getField(refPoint, state.fieldCache); if (!fieldRes.ok()) { ACTS_ERROR("In getDistanceAndMomentum, the B field at\n" << refPoint << "\ncould not be retrieved."); @@ -277,7 +212,8 @@ Acts::ImpactPointEstimator::getDistanceAndMomentum( } // Vector pointing from the vertex position to the 3D PCA - ActsVector deltaRStraightTrack = pcaStraightTrack - vtxPos; + Vector4 deltaRStraightTrack{Vector4::Zero()}; + deltaRStraightTrack.head() = pcaStraightTrack - vtxPos; return std::make_pair(deltaRStraightTrack, momDirStraightTrack); } @@ -314,7 +250,7 @@ Acts::ImpactPointEstimator::getDistanceAndMomentum( // Use Newton optimization method to iteratively change phi until we arrive at // the 3D PCA auto res = performNewtonOptimization(helixCenter, vtxPos.template head<3>(), - phi, theta, rho); + phi, theta, rho, cfg, logger); if (!res.ok()) { return res.error(); } @@ -350,15 +286,137 @@ Acts::ImpactPointEstimator::getDistanceAndMomentum( pca[3] = tP - rho / (beta * sinTheta) * (phi - phiP); } // Vector pointing from the vertex position to the 3D PCA - ActsVector deltaR = pca - vtxPos; + Vector4 deltaR{Vector4::Zero()}; + deltaR.head() = pca - vtxPos; return std::make_pair(deltaR, momDir); } -inline Acts::Result -Acts::ImpactPointEstimator::getImpactParameters( +} // namespace + +Result ImpactPointEstimator::calculateDistance( + const GeometryContext& gctx, const BoundTrackParameters& trkParams, + const Vector3& vtxPos, State& state) const { + auto res = getDistanceAndMomentumImpl(gctx, trkParams, vtxPos, m_cfg, state, + *m_logger); + + if (!res.ok()) { + return res.error(); + } + + // Return distance (we get a 4D vector in all cases, but we only need the + // position norm) + return res.value().first.template head<3>().norm(); +} + +Result ImpactPointEstimator::estimate3DImpactParameters( + const GeometryContext& gctx, const MagneticFieldContext& mctx, + const BoundTrackParameters& trkParams, const Vector3& vtxPos, + State& state) const { + auto res = getDistanceAndMomentumImpl(gctx, trkParams, vtxPos, m_cfg, state, + *m_logger); + + if (!res.ok()) { + return res.error(); + } + + // Vector pointing from vertex to 3D PCA + Vector3 deltaR = res.value().first.head<3>(); + + // Get corresponding unit vector + deltaR.normalize(); + + // Momentum direction at vtxPos + Vector3 momDir = res.value().second; + + // To understand why deltaR and momDir are not orthogonal, let us look at the + // x-y-plane. Since we computed the 3D PCA, the 2D distance between the vertex + // and the PCA is not necessarily minimal (see Fig. 4.2 in the reference). As + // a consequence, the momentum and the vector connecting the vertex and the + // PCA are not orthogonal to each other. + Vector3 orthogonalDeltaR = deltaR - (deltaR.dot(momDir)) * momDir; + + // Vector perpendicular to momDir and orthogonalDeltaR + Vector3 perpDir = momDir.cross(orthogonalDeltaR); + + // Cartesian coordinate system with: + // -) origin at the vertex position + // -) z-axis in momentum direction + // -) x-axis approximately in direction of the 3D PCA (slight deviations + // because it was modified to make if orthogonal to momDir) + // -) y-axis is calculated to be orthogonal to x- and z-axis + // The transformation is represented by a 4x4 matrix with 0 0 0 1 in the last + // row. + Transform3 coordinateSystem; + // First three columns correspond to coordinate system axes + coordinateSystem.matrix().block<3, 1>(0, 0) = orthogonalDeltaR; + coordinateSystem.matrix().block<3, 1>(0, 1) = perpDir; + coordinateSystem.matrix().block<3, 1>(0, 2) = momDir; + // Fourth column corresponds to origin of the coordinate system + coordinateSystem.matrix().block<3, 1>(0, 3) = vtxPos; + + // Surface with normal vector in direction of the z axis of coordinateSystem + std::shared_ptr planeSurface = + Surface::makeShared(coordinateSystem); + + auto intersection = + planeSurface + ->intersect(gctx, trkParams.position(gctx), trkParams.direction(), + BoundaryCheck(false)) + .closest(); + + // Create propagator options + PropagatorOptions<> pOptions(gctx, mctx); + pOptions.direction = + Direction::fromScalarZeroAsPositive(intersection.pathLength()); + + // Propagate to the surface; intersection corresponds to an estimate of the 3D + // PCA. If deltaR and momDir were orthogonal the calculation would be exact. + auto result = + m_cfg.propagator->propagateToSurface(trkParams, *planeSurface, pOptions); + if (result.ok()) { + return *result; + } else { + ACTS_ERROR("Error during propagation in estimate3DImpactParameters."); + ACTS_DEBUG( + "The plane surface to which we tried to propagate has its origin at\n" + << vtxPos); + return result.error(); + } +} + +Result ImpactPointEstimator::getVertexCompatibility( + const GeometryContext& gctx, const BoundTrackParameters* trkParams, + Eigen::Map vertexPos) const { + if (vertexPos.size() == 3) { + return getVertexCompatibilityImpl(gctx, trkParams, + vertexPos.template head<3>()); + } else if (vertexPos.size() == 4) { + return getVertexCompatibilityImpl(gctx, trkParams, + vertexPos.template head<4>()); + } else { + return VertexingError::InvalidInput; + } +} + +Result> +ImpactPointEstimator::getDistanceAndMomentum( + const GeometryContext& gctx, const BoundTrackParameters& trkParams, + Eigen::Map vtxPos, State& state) const { + if (vtxPos.size() == 3) { + return getDistanceAndMomentumImpl( + gctx, trkParams, vtxPos.template head<3>(), m_cfg, state, *m_logger); + } else if (vtxPos.size() == 4) { + return getDistanceAndMomentumImpl( + gctx, trkParams, vtxPos.template head<4>(), m_cfg, state, *m_logger); + } else { + return VertexingError::InvalidInput; + } +} + +Result ImpactPointEstimator::getImpactParameters( const BoundTrackParameters& track, const Vertex& vtx, - const GeometryContext& gctx, const Acts::MagneticFieldContext& mctx, + const GeometryContext& gctx, const MagneticFieldContext& mctx, bool calculateTimeIP) const { const std::shared_ptr perigeeSurface = Surface::makeShared(vtx.position()); @@ -379,7 +437,8 @@ Acts::ImpactPointEstimator::getImpactParameters( if (!result.ok()) { ACTS_ERROR("Error during propagation in getImpactParameters."); ACTS_DEBUG( - "The Perigee surface to which we tried to propagate has its origin at\n" + "The Perigee surface to which we tried to propagate has its origin " + "at\n" << vtx.position()); return result.error(); } @@ -438,10 +497,9 @@ Acts::ImpactPointEstimator::getImpactParameters( return ipAndSigma; } -inline Acts::Result> -Acts::ImpactPointEstimator::getLifetimeSignOfTrack( +Result> ImpactPointEstimator::getLifetimeSignOfTrack( const BoundTrackParameters& track, const Vertex& vtx, - const Acts::Vector3& direction, const GeometryContext& gctx, + const Vector3& direction, const GeometryContext& gctx, const MagneticFieldContext& mctx) const { const std::shared_ptr perigeeSurface = Surface::makeShared(vtx.position()); @@ -478,10 +536,9 @@ Acts::ImpactPointEstimator::getLifetimeSignOfTrack( return vszs; } -inline Acts::Result -Acts::ImpactPointEstimator::get3DLifetimeSignOfTrack( +Result ImpactPointEstimator::get3DLifetimeSignOfTrack( const BoundTrackParameters& track, const Vertex& vtx, - const Acts::Vector3& direction, const GeometryContext& gctx, + const Vector3& direction, const GeometryContext& gctx, const MagneticFieldContext& mctx) const { const std::shared_ptr perigeeSurface = Surface::makeShared(vtx.position()); @@ -507,3 +564,5 @@ Acts::ImpactPointEstimator::get3DLifetimeSignOfTrack( return sign >= 0. ? 1. : -1.; } + +} // namespace Acts diff --git a/Core/src/Vertexing/VertexingError.cpp b/Core/src/Vertexing/VertexingError.cpp index 6aeab9d15af..fbc8bc01aa3 100644 --- a/Core/src/Vertexing/VertexingError.cpp +++ b/Core/src/Vertexing/VertexingError.cpp @@ -34,6 +34,8 @@ class VertexingErrorCategory : public std::error_category { return "Unable to find element."; case VertexingError::NoCovariance: return "No covariance provided."; + case VertexingError::InvalidInput: + return "Invalid input provided."; default: return "unknown"; } diff --git a/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp b/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp index ad4d6b99cb2..e1769ea73c3 100644 --- a/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp +++ b/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp @@ -147,7 +147,7 @@ BOOST_DATA_TEST_CASE(SingleTrackDistanceParametersCompatibility3D, tracks, d0, par[eBoundQOverP] = particleHypothesis.qOverP(p, q); Estimator ipEstimator = makeEstimator(2_T); - Estimator::State state(magFieldCache()); + Estimator::State state{magFieldCache()}; // reference position and corresponding perigee surface Vector3 refPosition(0., 0., 0.); auto perigeeSurface = Surface::makeShared(refPosition); @@ -186,8 +186,7 @@ BOOST_DATA_TEST_CASE(SingleTrackDistanceParametersCompatibility3D, tracks, d0, // check that we get sensible compatibility scores // this is a chi2-like value and should always be positive auto compatibility = - ipEstimator - .getVertexCompatibility<3>(geoContext, &trackAtIP3d, refPosition) + ipEstimator.getVertexCompatibility(geoContext, &trackAtIP3d, refPosition) .value(); BOOST_CHECK_GT(compatibility, 0); } @@ -203,7 +202,7 @@ BOOST_DATA_TEST_CASE(TimeAtPca, tracksWithoutIPs* vertices, t0, phi, theta, p, auto propagator = std::make_shared(std::move(stepper)); Estimator::Config cfg(field, propagator); Estimator ipEstimator(cfg); - Estimator::State ipState(magFieldCache()); + Estimator::State ipState{magFieldCache()}; // Set up quantities for B = 0 auto zeroField = std::make_shared(Vector3(0, 0, 0)); @@ -212,7 +211,7 @@ BOOST_DATA_TEST_CASE(TimeAtPca, tracksWithoutIPs* vertices, t0, phi, theta, p, std::make_shared(straightLineStepper); StraightLineEstimator::Config zeroFieldCfg(zeroField, straightLinePropagator); StraightLineEstimator zeroFieldIPEstimator(zeroFieldCfg); - StraightLineEstimator::State zeroFieldIPState(magFieldCache()); + StraightLineEstimator::State zeroFieldIPState{magFieldCache()}; // Vertex position and vertex object Vector4 vtxPos(vx0, vy0, vz0, vt0); @@ -391,14 +390,14 @@ BOOST_DATA_TEST_CASE(VertexCompatibility4D, IPs* vertices, d0, l0, vx0, vy0, // Calculate the 4D vertex compatibilities of the three tracks double compatibilityClose = - ipEstimator.getVertexCompatibility<4>(geoContext, ¶msClose, vtxPos) + ipEstimator.getVertexCompatibility(geoContext, ¶msClose, vtxPos) .value(); double compatibilityCloseLargerCov = ipEstimator - .getVertexCompatibility<4>(geoContext, ¶msCloseLargerCov, vtxPos) + .getVertexCompatibility(geoContext, ¶msCloseLargerCov, vtxPos) .value(); double compatibilityFar = - ipEstimator.getVertexCompatibility<4>(geoContext, ¶msFar, vtxPos) + ipEstimator.getVertexCompatibility(geoContext, ¶msFar, vtxPos) .value(); // The track who is closer in time must have a better (i.e., smaller) @@ -417,7 +416,7 @@ BOOST_DATA_TEST_CASE(VertexCompatibility4D, IPs* vertices, d0, l0, vx0, vy0, // BOOST_AUTO_TEST_CASE(SingleTrackDistanceParametersAthenaRegression) { Estimator ipEstimator = makeEstimator(1.9971546939_T); - Estimator::State state(magFieldCache()); + Estimator::State state{magFieldCache()}; // Use same values as in Athena unit test Vector4 pos1(2_mm, 1_mm, -10_mm, 0_ns); @@ -514,7 +513,7 @@ BOOST_DATA_TEST_CASE(SingeTrackImpactParameters, tracks* vertices, d0, l0, t0, vtxPos[eTime] = vt0; Estimator ipEstimator = makeEstimator(1_T); - Estimator::State state(magFieldCache()); + Estimator::State state{magFieldCache()}; // reference position and corresponding perigee surface Vector3 refPosition(0., 0., 0.); diff --git a/Tests/UnitTests/Core/Vertexing/KalmanVertexUpdaterTests.cpp b/Tests/UnitTests/Core/Vertexing/KalmanVertexUpdaterTests.cpp index 0a50341fd37..88e956ceb72 100644 --- a/Tests/UnitTests/Core/Vertexing/KalmanVertexUpdaterTests.cpp +++ b/Tests/UnitTests/Core/Vertexing/KalmanVertexUpdaterTests.cpp @@ -228,7 +228,7 @@ BOOST_AUTO_TEST_CASE(Kalman_Vertex_TrackUpdater) { // Set up ImpactPointEstimator, used for comparisons later ImpactPointEstimator::Config ip3dEstConfig(bField, propagator); ImpactPointEstimator ip3dEst(ip3dEstConfig); - ImpactPointEstimator::State state(bField->makeCache(magFieldContext)); + ImpactPointEstimator::State state{bField->makeCache(magFieldContext)}; // Set up HelicalTrackLinearizer, needed for linearizing the tracks // Linearizer for BoundTrackParameters type test From c0c26e8181581bb547b260dce132a186cd35582f Mon Sep 17 00:00:00 2001 From: Paul Gessinger Date: Tue, 27 Feb 2024 16:33:08 +0100 Subject: [PATCH 09/10] feat: Add uber EDM4hep reader (#2939) This unifies the EDM4hep particle and simhit reader with correct particle barcodes, and working hit to particle association. I've tested to work ~ ok on ODD with ddsim inputs. ddsim produces weird hits that I haven't debugged yet, but given these inputs, the reco part seems to work somewhat ok. ![hits](https://github.com/acts-project/acts/assets/1058585/6f337824-151b-4bb6-bb66-0e30201a64c3) --- .../ActsExamples/EventData/AverageSimHits.hpp | 11 +- Examples/Io/EDM4hep/CMakeLists.txt | 3 +- .../Io/EDM4hep/EDM4hepMeasurementReader.hpp | 5 +- .../Io/EDM4hep/EDM4hepMeasurementWriter.hpp | 2 + .../EDM4hep/EDM4hepMultiTrajectoryWriter.hpp | 1 + .../Io/EDM4hep/EDM4hepParticleReader.hpp | 68 --- .../Io/EDM4hep/EDM4hepParticleWriter.hpp | 3 + .../ActsExamples/Io/EDM4hep/EDM4hepReader.hpp | 128 +++++ .../Io/EDM4hep/EDM4hepSimHitReader.hpp | 81 --- .../Io/EDM4hep/EDM4hepSimHitWriter.hpp | 2 + .../Io/EDM4hep/EDM4hepTrackReader.hpp | 7 +- .../Io/EDM4hep/EDM4hepTrackWriter.hpp | 2 + .../ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp | 12 +- .../EDM4hep/src/EDM4hepMeasurementReader.cpp | 16 +- .../EDM4hep/src/EDM4hepMeasurementWriter.cpp | 1 + .../src/EDM4hepMultiTrajectoryWriter.cpp | 1 + .../Io/EDM4hep/src/EDM4hepParticleReader.cpp | 72 --- .../Io/EDM4hep/src/EDM4hepParticleWriter.cpp | 1 + Examples/Io/EDM4hep/src/EDM4hepReader.cpp | 515 ++++++++++++++++++ .../Io/EDM4hep/src/EDM4hepSimHitReader.cpp | 105 ---- .../Io/EDM4hep/src/EDM4hepSimHitWriter.cpp | 1 + .../Io/EDM4hep/src/EDM4hepTrackReader.cpp | 16 +- .../Io/EDM4hep/src/EDM4hepTrackWriter.cpp | 1 + Examples/Io/EDM4hep/src/EDM4hepUtil.cpp | 49 +- .../Performance/VertexPerformanceWriter.cpp | 12 +- Examples/Python/src/EDM4hep.cpp | 16 +- Examples/Python/tests/test_reader.py | 73 +-- Examples/Scripts/Python/full_chain_odd.py | 185 ++++--- .../include/ActsFatras/EventData/Barcode.hpp | 27 +- 29 files changed, 904 insertions(+), 512 deletions(-) delete mode 100644 Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp create mode 100644 Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepReader.hpp delete mode 100644 Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp delete mode 100644 Examples/Io/EDM4hep/src/EDM4hepParticleReader.cpp create mode 100644 Examples/Io/EDM4hep/src/EDM4hepReader.cpp delete mode 100644 Examples/Io/EDM4hep/src/EDM4hepSimHitReader.cpp diff --git a/Examples/Framework/include/ActsExamples/EventData/AverageSimHits.hpp b/Examples/Framework/include/ActsExamples/EventData/AverageSimHits.hpp index 8191c0b6987..a88ca90aea9 100644 --- a/Examples/Framework/include/ActsExamples/EventData/AverageSimHits.hpp +++ b/Examples/Framework/include/ActsExamples/EventData/AverageSimHits.hpp @@ -9,6 +9,7 @@ #pragma once #include "Acts/Definitions/Algebra.hpp" +#include "Acts/Definitions/TrackParametrization.hpp" #include "Acts/Definitions/Units.hpp" #include "Acts/Surfaces/Surface.hpp" #include "Acts/Utilities/Logger.hpp" @@ -51,11 +52,19 @@ inline std::tuple averageSimHits( // check their validity again. const auto& simHit = *simHits.nth(simHitIdx); + // We use the thickness of the detector element as tolerance, because Geant4 + // treats the Surfaces as volumes and thus it is not ensured, that each hit + // lies exactly on the Acts::Surface + const auto tolerance = + surface.associatedDetectorElement() != nullptr + ? surface.associatedDetectorElement()->thickness() + : Acts::s_onSurfaceTolerance; + // transforming first to local positions and average that ensures that the // averaged position is still on the surface. the averaged global position // might not be on the surface anymore. auto result = surface.globalToLocal(gCtx, simHit.position(), - simHit.direction(), 0.5_um); + simHit.direction(), tolerance); if (result.ok()) { avgLocal += result.value(); } else { diff --git a/Examples/Io/EDM4hep/CMakeLists.txt b/Examples/Io/EDM4hep/CMakeLists.txt index 26e61adf5c9..9f7ddf37057 100644 --- a/Examples/Io/EDM4hep/CMakeLists.txt +++ b/Examples/Io/EDM4hep/CMakeLists.txt @@ -3,11 +3,10 @@ add_library( src/EDM4hepMeasurementReader.cpp src/EDM4hepMeasurementWriter.cpp src/EDM4hepMultiTrajectoryWriter.cpp + src/EDM4hepReader.cpp src/EDM4hepTrackWriter.cpp src/EDM4hepTrackReader.cpp - src/EDM4hepParticleReader.cpp src/EDM4hepParticleWriter.cpp - src/EDM4hepSimHitReader.cpp src/EDM4hepSimHitWriter.cpp src/EDM4hepUtil.cpp) target_include_directories( diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp index bf46a34009d..0029740f80e 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp @@ -18,6 +18,7 @@ #include #include +#include namespace ActsExamples { @@ -68,7 +69,9 @@ class EDM4hepMeasurementReader final : public IReader { std::pair m_eventsRange; std::unique_ptr m_logger; - podio::ROOTFrameReader m_reader; + tbb::enumerable_thread_specific m_reader; + + podio::ROOTFrameReader& reader(); WriteDataHandle m_outputMeasurements{ this, "OutputMeasurements"}; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementWriter.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementWriter.hpp index 27ca66b4184..f6914a4e8a1 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementWriter.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementWriter.hpp @@ -66,6 +66,8 @@ class EDM4hepMeasurementWriter final : public WriterT { podio::ROOTFrameWriter m_writer; + std::mutex m_writeMutex; + ReadDataHandle m_inputClusters{this, "InputClusters"}; }; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMultiTrajectoryWriter.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMultiTrajectoryWriter.hpp index 5bb1384b51d..a0d4e27da87 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMultiTrajectoryWriter.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMultiTrajectoryWriter.hpp @@ -68,6 +68,7 @@ class EDM4hepMultiTrajectoryWriter : public WriterT { private: Config m_cfg; + std::mutex m_writeMutex; podio::ROOTFrameWriter m_writer; ReadDataHandle> diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp deleted file mode 100644 index cac002e20a8..00000000000 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// This file is part of the Acts project. -// -// Copyright (C) 2022 CERN for the benefit of the Acts project -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#pragma once - -#include "Acts/Utilities/Logger.hpp" -#include "ActsExamples/EventData/SimParticle.hpp" -#include "ActsExamples/Framework/DataHandle.hpp" -#include "ActsExamples/Framework/IReader.hpp" - -#include -#include - -#include -#include - -namespace ActsExamples { - -/// Read particles from EDM4hep. -/// -/// Inpersistent information: -/// - particle ID -/// - process -class EDM4hepParticleReader final : public IReader { - public: - struct Config { - /// Where to read input file from. - std::string inputPath; - /// Name of the particle collection in EDM4hep. - std::string inputParticles = "MCParticles"; - /// Which particle collection to read into. - std::string outputParticles; - }; - - /// Construct the particle reader. - /// - /// @param config is the configuration object - /// @param level is the logging level - EDM4hepParticleReader(const Config& config, Acts::Logging::Level level); - - std::string name() const final; - - /// Return the available events range. - std::pair availableEvents() const final; - - /// Read out data from the input stream. - ProcessCode read(const ActsExamples::AlgorithmContext& ctx) final; - - /// Readonly access to the config - const Config& config() const { return m_cfg; } - - private: - Config m_cfg; - std::pair m_eventsRange; - std::unique_ptr m_logger; - - podio::ROOTFrameReader m_reader; - - WriteDataHandle m_outputParticles{this, - "OutputParticles"}; -}; - -} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleWriter.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleWriter.hpp index 31582497819..1fb59a067e3 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleWriter.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepParticleWriter.hpp @@ -11,6 +11,7 @@ #include "ActsExamples/EventData/SimParticle.hpp" #include "ActsExamples/Framework/WriterT.hpp" +#include #include #include @@ -55,6 +56,8 @@ class EDM4hepParticleWriter final : public WriterT { private: Config m_cfg; + std::mutex m_writeMutex; + podio::ROOTFrameWriter m_writer; }; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepReader.hpp new file mode 100644 index 00000000000..eadeec143ae --- /dev/null +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepReader.hpp @@ -0,0 +1,128 @@ +// This file is part of the Acts project. +// +// Copyright (C) 2024 CERN for the benefit of the Acts project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#pragma once + +#include "Acts/Geometry/TrackingGeometry.hpp" +#include "Acts/Utilities/Logger.hpp" +#include "ActsExamples/EventData/SimHit.hpp" +#include "ActsExamples/EventData/SimParticle.hpp" +#include "ActsExamples/Framework/DataHandle.hpp" +#include "ActsExamples/Framework/IReader.hpp" +#include "ActsFatras/EventData/Particle.hpp" + +#include +#include + +#include +#include +#include +#include + +namespace ActsExamples { + +namespace DD4hep { +struct DD4hepDetector; +} + +/// Read particles from EDM4hep. +/// +/// Inpersistent information: +/// - particle ID +/// - process +class EDM4hepReader final : public IReader { + public: + struct Config { + /// Where to read input file from. + std::string inputPath; + /// Name of the particle collection in EDM4hep. + std::string inputParticles = "MCParticles"; + /// Names of the sim hit collections + std::vector inputSimHits{}; + /// Particles at creation + std::string outputParticlesInitial; + /// Particles at their endpoints + std::string outputParticlesFinal; + /// Particles from the generator + std::string outputParticlesGenerator; + + /// Output simulated (truth) hits collection. + std::string outputSimHits; + + /// Directory into which to write graphviz files for particles + /// Empty string means no output + std::string graphvizOutput = ""; + + /// DD4hep detector for cellID resolution. + std::shared_ptr dd4hepDetector; + + /// Tracking geometry for cellID resolution. + std::shared_ptr trackingGeometry; + + /// Whether to sort sim hits in time to produce index sequence + bool sortSimHitsInTime = false; + }; + + using ParentRelationship = std::unordered_map; + + /// Construct the particle reader. + /// + /// @param config is the configuration object + /// @param level is the logging level + EDM4hepReader(const Config& config, Acts::Logging::Level level); + + std::string name() const final; + + /// Return the available events range. + std::pair availableEvents() const final; + + /// Read out data from the input stream. + ProcessCode read(const ActsExamples::AlgorithmContext& ctx) final; + + /// Readonly access to the config + const Config& config() const { return m_cfg; } + + void processChildren(const edm4hep::MCParticle& particle, SimBarcode parentId, + SimParticleContainer::sequence_type& particles, + ParentRelationship& parentRelationship, + std::unordered_map& particleMap, + std::size_t& nSecondaryVertices, + std::size_t& maxGen) const; + + static void setSubParticleIds( + const SimParticleContainer::sequence_type::iterator& begin, + const SimParticleContainer::sequence_type::iterator& end); + + private: + const Acts::Logger& logger() const { return *m_logger; } + + Config m_cfg; + std::pair m_eventsRange; + std::unique_ptr m_logger; + + std::unordered_map m_surfaceMap; + + tbb::enumerable_thread_specific m_reader; + + podio::ROOTFrameReader& reader(); + + WriteDataHandle m_outputParticlesInitial{ + this, "OutputParticlesInitial"}; + WriteDataHandle m_outputParticlesFinal{ + this, "OutputParticlesFinal"}; + WriteDataHandle m_outputParticlesGenerator{ + this, "OutputParticlesGenerator"}; + + WriteDataHandle m_outputSimHits{this, "OutputSimHits"}; + + void graphviz(std::ostream& os, + const SimParticleContainer::sequence_type& particles, + const ParentRelationship& parents) const; +}; + +} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp deleted file mode 100644 index 31d45078612..00000000000 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// This file is part of the Acts project. -// -// Copyright (C) 2022 CERN for the benefit of the Acts project -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#pragma once - -#include "Acts/Utilities/Logger.hpp" -#include "ActsExamples/DD4hepDetector/DD4hepDetector.hpp" -#include "ActsExamples/EventData/SimHit.hpp" -#include "ActsExamples/EventData/SimParticle.hpp" -#include "ActsExamples/Framework/DataHandle.hpp" -#include "ActsExamples/Framework/IReader.hpp" - -#include -#include - -#include -#include - -namespace ActsExamples { - -/// Read in a simhit collection from EDM4hep. -/// -/// Inpersistent information: -/// - particle ID -/// - after4 momentum -/// - hit index -/// - digitization channel -class EDM4hepSimHitReader final : public IReader { - public: - struct Config { - /// Where to the read input file from. - std::string inputPath; - /// Name of the particle collection in EDM4hep. - std::string inputParticles = "MCParticles"; - /// Name of the sim tracker hit collection in EDM4hep - std::string inputSimTrackerHits = "ActsSimTrackerHits"; - /// Which particle collection to read into. - std::string outputParticles; - /// Output simulated (truth) hits collection. - std::string outputSimHits; - /// DD4hep detector for cellID resolution. - std::shared_ptr dd4hepDetector; - }; - - /// Construct the simhit reader. - /// - /// @param config is the configuration object - /// @param level is the logging level - EDM4hepSimHitReader(const Config& config, Acts::Logging::Level level); - - std::string name() const final; - - /// Return the available events range. - std::pair availableEvents() const final; - - /// Read out data from the input stream. - ProcessCode read(const ActsExamples::AlgorithmContext& ctx) final; - - /// Readonly access to the config - const Config& config() const { return m_cfg; } - - private: - Config m_cfg; - std::pair m_eventsRange; - std::unique_ptr m_logger; - - podio::ROOTFrameReader m_reader; - - const Acts::Logger& logger() const { return *m_logger; } - - WriteDataHandle m_outputSimHits{this, "OutputSimHits"}; - WriteDataHandle m_outputParticles{this, - "OutputParticles"}; -}; - -} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitWriter.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitWriter.hpp index e33fb1fb411..db2b2e92a3b 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitWriter.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepSimHitWriter.hpp @@ -67,6 +67,8 @@ class EDM4hepSimHitWriter final : public WriterT { podio::ROOTFrameWriter m_writer; + std::mutex m_writeMutex; + ReadDataHandle m_inputParticles{this, "InputParticles"}; }; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackReader.hpp index 57ce35af7a8..556f809a3bf 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackReader.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackReader.hpp @@ -19,6 +19,7 @@ #include #include +#include namespace ActsExamples { @@ -54,11 +55,15 @@ class EDM4hepTrackReader : public IReader { ProcessCode read(const ActsExamples::AlgorithmContext& ctx) final; private: + std::pair m_eventsRange; + Config m_cfg; WriteDataHandle m_outputTracks{this, "OutputTracks"}; - podio::ROOTFrameReader m_reader; + tbb::enumerable_thread_specific m_reader; + + podio::ROOTFrameReader& reader(); std::unique_ptr m_logger; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackWriter.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackWriter.hpp index f98e13a1456..624abbea306 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackWriter.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepTrackWriter.hpp @@ -56,6 +56,8 @@ class EDM4hepTrackWriter : public WriterT { private: Config m_cfg; + std::mutex m_writeMutex; + podio::ROOTFrameWriter m_writer; }; diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp index 11b731125bc..38e12be6306 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp @@ -31,10 +31,15 @@ namespace ActsExamples { namespace EDM4hepUtil { using MapParticleIdFrom = - std::function; + std::function; using MapParticleIdTo = std::function; +inline ActsFatras::Barcode zeroParticleMapper( + const edm4hep::MCParticle& /*particle*/) { + return 0; +} + using MapGeometryIdFrom = std::function; using MapGeometryIdTo = @@ -45,8 +50,9 @@ using MapGeometryIdTo = /// Inpersistent information: /// - particle ID /// - process -ActsFatras::Particle readParticle(const edm4hep::MCParticle& from, - const MapParticleIdFrom& particleMapper); +ActsFatras::Particle readParticle( + const edm4hep::MCParticle& from, + const MapParticleIdFrom& particleMapper = zeroParticleMapper); /// Write a Fatras particle into EDM4hep. /// diff --git a/Examples/Io/EDM4hep/src/EDM4hepMeasurementReader.cpp b/Examples/Io/EDM4hep/src/EDM4hepMeasurementReader.cpp index 17fe4164747..66fbcce36b1 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepMeasurementReader.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepMeasurementReader.cpp @@ -33,9 +33,7 @@ EDM4hepMeasurementReader::EDM4hepMeasurementReader( throw std::invalid_argument("Missing measurement output collection"); } - m_reader.openFile(m_cfg.inputPath); - - m_eventsRange = std::make_pair(0, m_reader.getEntries("events")); + m_eventsRange = std::make_pair(0, reader().getEntries("events")); m_outputMeasurements.initialize(m_cfg.outputMeasurements); m_outputMeasurementSimHitsMap.initialize(m_cfg.outputMeasurementSimHitsMap); @@ -59,7 +57,7 @@ ProcessCode EDM4hepMeasurementReader::read(const AlgorithmContext& ctx) { IndexMultimap measurementSimHitsMap; IndexSourceLinkContainer sourceLinks; - podio::Frame frame = m_reader.readEntry("events", ctx.eventNumber); + podio::Frame frame = reader().readEntry("events", ctx.eventNumber); const auto& trackerHitPlaneCollection = frame.get("ActsTrackerHitsPlane"); @@ -87,4 +85,14 @@ ProcessCode EDM4hepMeasurementReader::read(const AlgorithmContext& ctx) { return ProcessCode::SUCCESS; } +podio::ROOTFrameReader& EDM4hepMeasurementReader::reader() { + bool exists = false; + auto& reader = m_reader.local(exists); + if (!exists) { + reader.openFile(m_cfg.inputPath); + } + + return reader; +} + } // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/src/EDM4hepMeasurementWriter.cpp b/Examples/Io/EDM4hep/src/EDM4hepMeasurementWriter.cpp index 501a416d63e..35f93cf97fe 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepMeasurementWriter.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepMeasurementWriter.cpp @@ -67,6 +67,7 @@ ActsExamples::ProcessCode EDM4hepMeasurementWriter::writeT( frame.put(std::move(hitsPlane), "ActsTrackerHitsPlane"); frame.put(std::move(hits), "ActsTrackerHitsRaw"); + std::lock_guard guard(m_writeMutex); m_writer.writeFrame(frame, "events"); return ActsExamples::ProcessCode::SUCCESS; diff --git a/Examples/Io/EDM4hep/src/EDM4hepMultiTrajectoryWriter.cpp b/Examples/Io/EDM4hep/src/EDM4hepMultiTrajectoryWriter.cpp index 0481ac4bda0..bfd48049c8c 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepMultiTrajectoryWriter.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepMultiTrajectoryWriter.cpp @@ -63,6 +63,7 @@ ProcessCode EDM4hepMultiTrajectoryWriter::writeT( frame.put(std::move(trackCollection), "ActsTracks"); + std::lock_guard guard(m_writeMutex); m_writer.writeFrame(frame, "events"); return ProcessCode::SUCCESS; diff --git a/Examples/Io/EDM4hep/src/EDM4hepParticleReader.cpp b/Examples/Io/EDM4hep/src/EDM4hepParticleReader.cpp deleted file mode 100644 index 96c6d5572b2..00000000000 --- a/Examples/Io/EDM4hep/src/EDM4hepParticleReader.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// This file is part of the Acts project. -// -// Copyright (C) 2022 CERN for the benefit of the Acts project -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp" - -#include "Acts/Definitions/Units.hpp" -#include "ActsExamples/EventData/SimParticle.hpp" -#include "ActsExamples/Framework/WhiteBoard.hpp" -#include "ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp" -#include "ActsExamples/Utilities/Paths.hpp" - -#include - -#include - -namespace ActsExamples { - -EDM4hepParticleReader::EDM4hepParticleReader( - const EDM4hepParticleReader::Config& config, Acts::Logging::Level level) - : m_cfg(config), - m_logger(Acts::getDefaultLogger("EDM4hepParticleReader", level)) { - if (m_cfg.outputParticles.empty()) { - throw std::invalid_argument("Missing output collection"); - } - - m_reader.openFile(m_cfg.inputPath); - - m_eventsRange = std::make_pair(0, m_reader.getEntries("events")); - - m_outputParticles.initialize(m_cfg.outputParticles); -} - -std::string EDM4hepParticleReader::name() const { - return "EDM4hepParticleReader"; -} - -std::pair EDM4hepParticleReader::availableEvents() - const { - return m_eventsRange; -} - -ProcessCode EDM4hepParticleReader::read(const AlgorithmContext& ctx) { - podio::Frame frame = m_reader.readEntry("events", ctx.eventNumber); - const auto& mcParticleCollection = - frame.get(m_cfg.inputParticles); - - SimParticleContainer::sequence_type unordered; - - for (const auto& mcParticle : mcParticleCollection) { - auto particle = - EDM4hepUtil::readParticle(mcParticle, [](const edm4hep::MCParticle& p) { - ActsFatras::Barcode result; - result.setParticle(EDM4hepUtil::podioObjectIDToInteger(p.id())); - return result; - }); - unordered.push_back(particle); - } - - // Write ordered particles container to the EventStore - SimParticleContainer particles; - particles.insert(unordered.begin(), unordered.end()); - m_outputParticles(ctx, std::move(particles)); - - return ProcessCode::SUCCESS; -} - -} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/src/EDM4hepParticleWriter.cpp b/Examples/Io/EDM4hep/src/EDM4hepParticleWriter.cpp index 9d64576b6fd..c4b5533e599 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepParticleWriter.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepParticleWriter.cpp @@ -52,6 +52,7 @@ ProcessCode EDM4hepParticleWriter::writeT( frame.put(std::move(mcParticleCollection), m_cfg.outputParticles); + std::lock_guard guard(m_writeMutex); m_writer.writeFrame(frame, "events"); return ProcessCode::SUCCESS; diff --git a/Examples/Io/EDM4hep/src/EDM4hepReader.cpp b/Examples/Io/EDM4hep/src/EDM4hepReader.cpp new file mode 100644 index 00000000000..80aa321f90d --- /dev/null +++ b/Examples/Io/EDM4hep/src/EDM4hepReader.cpp @@ -0,0 +1,515 @@ +// This file is part of the Acts project. +// +// Copyright (C) 2024 CERN for the benefit of the Acts project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include "ActsExamples/Io/EDM4hep/EDM4hepReader.hpp" + +#include "Acts/Definitions/Units.hpp" +#include "Acts/Geometry/GeometryContext.hpp" +#include "Acts/Geometry/GeometryIdentifier.hpp" +#include "Acts/Plugins/DD4hep/DD4hepDetectorElement.hpp" +#include "ActsExamples/DD4hepDetector/DD4hepDetector.hpp" +#include "ActsExamples/EventData/SimHit.hpp" +#include "ActsExamples/EventData/SimParticle.hpp" +#include "ActsExamples/Framework/WhiteBoard.hpp" +#include "ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp" +#include "ActsExamples/Utilities/Paths.hpp" +#include "ActsFatras/EventData/Barcode.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace ActsExamples { + +EDM4hepReader::EDM4hepReader(const Config& config, Acts::Logging::Level level) + : m_cfg(config), + m_logger(Acts::getDefaultLogger("EDM4hepParticleReader", level)) { + if (m_cfg.outputParticlesInitial.empty()) { + throw std::invalid_argument("Missing output collection initial particles"); + } + + if (m_cfg.outputParticlesFinal.empty()) { + throw std::invalid_argument("Missing output collection final particles"); + } + + if (m_cfg.outputParticlesGenerator.empty()) { + throw std::invalid_argument( + "Missing output collection generator particles"); + } + + if (m_cfg.outputSimHits.empty()) { + throw std::invalid_argument("Missing output collection sim hits"); + } + + m_eventsRange = std::make_pair(0, reader().getEntries("events")); + + m_outputParticlesInitial.initialize(m_cfg.outputParticlesInitial); + m_outputParticlesFinal.initialize(m_cfg.outputParticlesFinal); + m_outputParticlesGenerator.initialize(m_cfg.outputParticlesGenerator); + m_outputSimHits.initialize(m_cfg.outputSimHits); + + m_cfg.trackingGeometry->visitSurfaces([&](const auto* surface) { + const auto* detElement = dynamic_cast( + surface->associatedDetectorElement()); + + if (detElement == nullptr) { + ACTS_ERROR("Surface has no associated detector element"); + return; + } + + const auto translation = detElement->sourceElement() + .nominal() + .worldTransformation() + .GetTranslation(); + Acts::Vector3 position; + position << translation[0], translation[1], translation[2]; + position *= Acts::UnitConstants::cm; + + m_surfaceMap.insert({detElement->sourceElement().key(), surface}); + }); +} + +podio::ROOTFrameReader& EDM4hepReader::reader() { + bool exists = false; + auto& reader = m_reader.local(exists); + if (!exists) { + reader.openFile(m_cfg.inputPath); + } + + return reader; +} + +std::string EDM4hepReader::name() const { + return "EDM4hepReader"; +} + +std::pair EDM4hepReader::availableEvents() const { + return m_eventsRange; +} + +namespace { +std::string vid(unsigned int vtx) { + return "V" + std::to_string(vtx); +} + +std::string pid(const SimParticle& particle) { + return "P" + std::to_string(particle.particleId().value()); +} + +std::string plabel(const SimParticle& particle) { + using namespace Acts::UnitLiterals; + std::stringstream ss; + ss << particle.pdg() << "\\n(" << particle.particleId() << ")\\n" + << "p=" << std::setprecision(3) << particle.absoluteMomentum() / 1_GeV + << " GeV"; + return ss.str(); +} + +} // namespace + +void EDM4hepReader::graphviz( + std::ostream& os, const SimParticleContainer::sequence_type& particles, + const ParentRelationship& parents) const { + os << "digraph Event {\n"; + + std::set primaryVertices; + + for (const auto& particle : particles) { + if (particle.particleId().generation() == 0) { + primaryVertices.insert(particle.particleId().vertexPrimary()); + + os << vid(particle.particleId().vertexPrimary()) << " -> " + << pid(particle) << ";\n"; + } + + os << pid(particle) << " [label=\"" << plabel(particle) << "\"];\n"; + } + + for (const auto [childIdx, parentIdx] : parents) { + const auto& child = particles[childIdx]; + const auto& parent = particles[parentIdx]; + os << pid(parent) << " -> " << pid(child); + + if (parent.particleId().vertexSecondary() == + child.particleId().vertexSecondary()) { + os << " [style=dashed]"; + } + + os << ";\n"; + } + + for (unsigned int vtx : primaryVertices) { + os << vid(vtx) << " [label=\"PV" << vtx << "\"];\n"; + } + + os << "}"; +} + +ProcessCode EDM4hepReader::read(const AlgorithmContext& ctx) { + podio::Frame frame = reader().readEntry("events", ctx.eventNumber); + const auto& mcParticleCollection = + frame.get(m_cfg.inputParticles); + + ACTS_DEBUG("Reading EDM4hep inputs"); + + SimParticleContainer::sequence_type unordered; + + // Read particles from the input file + // Find particles without parents and group them by vtx position to find + // primary vertices + std::vector>> + primaryVertices; + for (const auto& particle : mcParticleCollection) { + if (particle.parents_size() > 0) { + // not a primary vertex + continue; + } + const auto& vtx = particle.getVertex(); + Acts::Vector3 vtxPos = {vtx[0], vtx[1], vtx[2]}; + vtxPos /= Acts::UnitConstants::mm; + + // linear search for vector + auto it = std::find_if( + primaryVertices.begin(), primaryVertices.end(), + [&vtxPos]( + const std::pair>& + pair) { return pair.first == vtxPos; }); + + if (it == primaryVertices.end()) { + ACTS_DEBUG("Found primary vertex at " << vtx.x << ", " << vtx.y << ", " + << vtx.z); + primaryVertices.push_back({vtxPos, {particle}}); + } else { + it->second.push_back(particle); + } + } + + ACTS_DEBUG("Found " << primaryVertices.size() << " primary vertices"); + + // key: child, value: parent + ParentRelationship parentRelationship; + + // key: input particle index, value: index in the unordered particle + // container + std::unordered_map edm4hepParticleMap; + + std::size_t nPrimaryVertices = 0; + // Walk the particle tree + for (const auto& [vtxPos, particles] : primaryVertices) { + nPrimaryVertices += 1; + ACTS_DEBUG("Walking particle tree for primary vertex at " + << vtxPos.x() << ", " << vtxPos.y() << ", " << vtxPos.z()); + std::size_t nParticles = 0; + std::size_t nSecondaryVertices = 0; + std::size_t maxGen = 0; + auto startSize = unordered.size(); + for (const auto& inParticle : particles) { + nParticles += 1; + SimParticle particle{EDM4hepUtil::readParticle(inParticle)}; + particle.setParticleId(SimBarcode{} + .setParticle(nParticles) + .setVertexPrimary(nPrimaryVertices)); + ACTS_VERBOSE("+ add particle " << particle); + ACTS_VERBOSE(" - at " << particle.position().transpose()); + ACTS_VERBOSE(" - createdInSim: " << inParticle.isCreatedInSimulation()); + ACTS_VERBOSE(" - vertexIsNotEndpointOfParent: " + << inParticle.vertexIsNotEndpointOfParent()); + ACTS_VERBOSE(" - isStopped: " << inParticle.isStopped()); + ACTS_VERBOSE(" - endpoint: " << inParticle.getEndpoint().x << ", " + << inParticle.getEndpoint().y << ", " + << inParticle.getEndpoint().z); + const auto pid = particle.particleId(); + unordered.push_back(std::move(particle)); + edm4hepParticleMap[inParticle.getObjectID().index] = unordered.size() - 1; + processChildren(inParticle, pid, unordered, parentRelationship, + edm4hepParticleMap, nSecondaryVertices, maxGen); + } + ACTS_VERBOSE("Primary vertex complete, produced " + << (unordered.size() - startSize) << " particles and " + << nSecondaryVertices << " secondary vertices in " << maxGen + << " generations"); + setSubParticleIds(std::next(unordered.begin(), startSize), unordered.end()); + } + + ACTS_DEBUG("Found " << unordered.size() << " particles"); + + // @TODO: Order simhits by time + + SimParticleContainer particlesFinal; + SimParticleContainer particlesGenerator; + for (const auto& inParticle : mcParticleCollection) { + const std::size_t index = + edm4hepParticleMap.find(inParticle.getObjectID().index)->second; + const auto& particleInitial = unordered.at(index); + if (!inParticle.isCreatedInSimulation()) { + particlesGenerator.insert(particleInitial); + } + SimParticle particleFinal = particleInitial; + + float time = inParticle.getTime() * Acts::UnitConstants::ns; + for (const auto& daughter : inParticle.getDaughters()) { + if (!daughter.vertexIsNotEndpointOfParent()) { + time = daughter.getTime() * Acts::UnitConstants::ns; + break; + } + } + + particleFinal.setPosition4( + inParticle.getEndpoint()[0] * Acts::UnitConstants::mm, + inParticle.getEndpoint()[1] * Acts::UnitConstants::mm, + inParticle.getEndpoint()[2] * Acts::UnitConstants::mm, time); + + Acts::Vector3 momentumFinal = {inParticle.getMomentumAtEndpoint()[0], + inParticle.getMomentumAtEndpoint()[1], + inParticle.getMomentumAtEndpoint()[2]}; + particleFinal.setDirection(momentumFinal.normalized()); + particleFinal.setAbsoluteMomentum(momentumFinal.norm()); + + ACTS_VERBOSE("- Updated particle initial -> final, position: " + << particleInitial.fourPosition().transpose() << " -> " + << particleFinal.fourPosition().transpose()); + ACTS_VERBOSE(" momentum: " + << particleInitial.fourMomentum().transpose() << " -> " + << particleFinal.fourMomentum().transpose()); + + particlesFinal.insert(particleFinal); + } + + // Write ordered particles container to the EventStore + SimParticleContainer particlesInitial; + particlesInitial.insert(unordered.begin(), unordered.end()); + + if (!m_cfg.graphvizOutput.empty()) { + std::string path = perEventFilepath(m_cfg.graphvizOutput, "particles.dot", + ctx.eventNumber); + std::ofstream dot(path); + graphviz(dot, unordered, parentRelationship); + } + + SimHitContainer simHits; + + ACTS_DEBUG("Reading sim hits from " << m_cfg.inputSimHits.size() + << " sim hit collections"); + for (const auto& name : m_cfg.inputSimHits) { + const auto& inputHits = frame.get(name); + + for (const auto& hit : inputHits) { + auto simHit = EDM4hepUtil::readSimHit( + hit, + [&](const auto& inParticle) { + ACTS_VERBOSE("SimHit has source particle: " + << hit.getMCParticle().getObjectID().index); + auto it = edm4hepParticleMap.find(inParticle.getObjectID().index); + if (it == edm4hepParticleMap.end()) { + ACTS_ERROR( + "SimHit has source particle that we did not see before"); + return SimBarcode{}; + } + const auto& particle = unordered.at(it->second); + ACTS_VERBOSE("- " << inParticle.getObjectID().index << " -> " + << particle.particleId()); + return particle.particleId(); + }, + [&](std::uint64_t cellId) { + ACTS_VERBOSE("CellID: " << cellId); + + const auto& vm = m_cfg.dd4hepDetector->geometryService->detector() + .volumeManager(); + + const auto detElement = vm.lookupDetElement(cellId); + + ACTS_VERBOSE(" -> detElement: " << detElement.name()); + ACTS_VERBOSE(" -> id: " << detElement.id()); + ACTS_VERBOSE(" -> key: " << detElement.key()); + + Acts::Vector3 position; + position << detElement.nominal() + .worldTransformation() + .GetTranslation()[0], + detElement.nominal().worldTransformation().GetTranslation()[1], + detElement.nominal().worldTransformation().GetTranslation()[2]; + position *= Acts::UnitConstants::cm; + + ACTS_VERBOSE(" -> detElement position: " << position.transpose()); + + auto it = m_surfaceMap.find(detElement.key()); + if (it == m_surfaceMap.end()) { + ACTS_ERROR("Unable to find surface for detElement " + << detElement.name() << " with cellId " << cellId); + } + const auto* surface = it->second; + ACTS_VERBOSE(" -> surface: " << surface->geometryId()); + return surface->geometryId(); + }); + + simHits.insert(std::move(simHit)); + } + } + + if (m_cfg.sortSimHitsInTime) { + ACTS_DEBUG("Sorting sim hits in time"); + std::multimap hitsByParticle; + + for (std::size_t i = 0; i < simHits.size(); ++i) { + hitsByParticle.insert({simHits.nth(i)->particleId(), i}); + } + + for (auto it = hitsByParticle.begin(), end = hitsByParticle.end(); + it != end; it = hitsByParticle.upper_bound(it->first)) { + std::cout << "Particle " << it->first << " has " + << hitsByParticle.count(it->first) << " hits" << std::endl; + + std::vector hitIndices; + hitIndices.reserve(hitsByParticle.count(it->first)); + for (auto hitIndex : makeRange(hitsByParticle.equal_range(it->first))) { + hitIndices.push_back(hitIndex.second); + } + + if (logger().doPrint(Acts::Logging::VERBOSE)) { + ACTS_VERBOSE("Before sorting:"); + for (const auto& hitIdx : hitIndices) { + ACTS_VERBOSE(" - " << hitIdx << " / " << simHits.nth(hitIdx)->index() + << " " << simHits.nth(hitIdx)->time()); + } + } + + std::sort(hitIndices.begin(), hitIndices.end(), + [&](std::size_t a, std::size_t b) { + return simHits.nth(a)->time() < simHits.nth(b)->time(); + }); + + for (std::size_t i = 0; i < hitIndices.size(); ++i) { + auto& hit = *simHits.nth(hitIndices[i]); + SimHit updatedHit{hit.geometryId(), hit.particleId(), + hit.fourPosition(), hit.momentum4Before(), + hit.momentum4After(), int32_t(i)}; + hit = updatedHit; + } + + if (logger().doPrint(Acts::Logging::VERBOSE)) { + ACTS_VERBOSE("After sorting:"); + for (const auto& hitIdx : hitIndices) { + ACTS_VERBOSE(" - " << hitIdx << " / " << simHits.nth(hitIdx)->index() + << " " << simHits.nth(hitIdx)->time()); + } + } + } + } + + m_outputParticlesInitial(ctx, std::move(particlesInitial)); + m_outputParticlesFinal(ctx, std::move(particlesFinal)); + m_outputParticlesGenerator(ctx, std::move(particlesGenerator)); + + m_outputSimHits(ctx, std::move(simHits)); + + return ProcessCode::SUCCESS; +} + +void EDM4hepReader::processChildren( + const edm4hep::MCParticle& inParticle, SimBarcode parentId, + SimParticleContainer::sequence_type& particles, + ParentRelationship& parentRelationship, + std::unordered_map& particleMap, + std::size_t& nSecondaryVertices, std::size_t& maxGen) const { + constexpr auto indent = [&](std::size_t n) { + std::string result; + for (std::size_t i = 0; i < n; ++i) { + result += " "; + } + return result; + }; + + const std::size_t gen = parentId.generation(); + maxGen = std::max(maxGen, gen); + + ACTS_VERBOSE(indent(gen) << " - processing daughters for input particle " + << inParticle.id()); + ACTS_VERBOSE(indent(gen) << " -> found " << inParticle.daughters_size() + << " daughter(s)"); + + bool parentDecayed = + std::any_of(inParticle.daughters_begin(), inParticle.daughters_end(), + [](const edm4hep::MCParticle& daughter) { + return !daughter.vertexIsNotEndpointOfParent(); + }); + std::size_t secondaryVertex = 0; + if (parentDecayed) { + ACTS_VERBOSE(indent(gen) << " -> parent decays"); + secondaryVertex = ++nSecondaryVertices; + } + + std::size_t parentIndex = particles.size() - 1; + + std::size_t nParticles = 0; + for (const auto& daughter : inParticle.getDaughters()) { + SimParticle particle = EDM4hepUtil::readParticle(daughter); + + auto pid = parentId.makeDescendant(nParticles++); + if (daughter.vertexIsNotEndpointOfParent()) { + // incoming particle survived, interaction via descendant + } else { + // incoming particle decayed + pid = pid.setVertexSecondary(secondaryVertex); + } + particle.setParticleId(pid); + + ACTS_VERBOSE(indent(particle.particleId().generation()) + << "+ add particle " << particle); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - generation: " << particle.particleId().generation()); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - at " << particle.position().transpose()); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - createdInSim: " + << daughter.isCreatedInSimulation()); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - vertexIsNotEndpointOfParent: " + << daughter.vertexIsNotEndpointOfParent()); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - isStopped: " << daughter.isStopped()); + ACTS_VERBOSE(indent(particle.particleId().generation()) + << " - endpoint: " << daughter.getEndpoint().x << ", " + << daughter.getEndpoint().y << ", " + << daughter.getEndpoint().z); + + particles.push_back(std::move(particle)); + particleMap[daughter.getObjectID().index] = particles.size() - 1; + parentRelationship[particles.size() - 1] = parentIndex; + processChildren(daughter, pid, particles, parentRelationship, particleMap, + nSecondaryVertices, maxGen); + } +} + +void EDM4hepReader::setSubParticleIds( + const SimParticleContainer::sequence_type::iterator& begin, + const SimParticleContainer::sequence_type::iterator& end) { + std::vector numByGeneration; + numByGeneration.reserve(10); + + for (auto it = begin; it != end; ++it) { + auto& particle = *it; + const auto pid = particle.particleId(); + if (pid.generation() >= numByGeneration.size()) { + numByGeneration.resize(pid.generation() + 1, 0); + } + unsigned int nextSubParticle = numByGeneration[pid.generation()]++; + + auto newPid = particle.particleId().setSubParticle(nextSubParticle); + particle.setParticleId(newPid); + } +} + +} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/src/EDM4hepSimHitReader.cpp b/Examples/Io/EDM4hep/src/EDM4hepSimHitReader.cpp deleted file mode 100644 index aa036811f3f..00000000000 --- a/Examples/Io/EDM4hep/src/EDM4hepSimHitReader.cpp +++ /dev/null @@ -1,105 +0,0 @@ -// This file is part of the Acts project. -// -// Copyright (C) 2022 CERN for the benefit of the Acts project -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp" - -#include "Acts/Definitions/Units.hpp" -#include "ActsExamples/EventData/SimHit.hpp" -#include "ActsExamples/EventData/SimParticle.hpp" -#include "ActsExamples/Framework/WhiteBoard.hpp" -#include "ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp" - -#include -#include -#include - -namespace ActsExamples { - -EDM4hepSimHitReader::EDM4hepSimHitReader( - const EDM4hepSimHitReader::Config& config, Acts::Logging::Level level) - : m_cfg(config), - m_logger(Acts::getDefaultLogger("EDM4hepSimHitReader", level)) { - m_reader.openFile(m_cfg.inputPath); - - m_outputParticles.maybeInitialize(m_cfg.outputParticles); - m_outputSimHits.initialize(m_cfg.outputSimHits); - - m_eventsRange = std::make_pair(0, m_reader.getEntries("events")); -} - -std::string EDM4hepSimHitReader::EDM4hepSimHitReader::name() const { - return "EDM4hepSimHitReader"; -} - -std::pair EDM4hepSimHitReader::availableEvents() - const { - return m_eventsRange; -} - -ProcessCode EDM4hepSimHitReader::read(const AlgorithmContext& ctx) { - podio::Frame frame = m_reader.readEntry("events", ctx.eventNumber); - - const auto& mcParticleCollection = - frame.get(m_cfg.inputParticles); - - if (!m_cfg.outputParticles.empty()) { - SimParticleContainer::sequence_type unordered; - - for (const auto& mcParticle : mcParticleCollection) { - auto particle = EDM4hepUtil::readParticle( - mcParticle, [](const edm4hep::MCParticle& p) { - ActsFatras::Barcode result; - result.setParticle(EDM4hepUtil::podioObjectIDToInteger(p.id())); - return result; - }); - unordered.push_back(particle); - } - - // Write ordered particles container to the EventStore - SimParticleContainer particles; - particles.insert(unordered.begin(), unordered.end()); - m_outputParticles(ctx, std::move(particles)); - } - - SimHitContainer::sequence_type unordered; - - const auto& simTrackerHitCollection = - frame.get(m_cfg.inputSimTrackerHits); - - for (const auto& simTrackerHit : simTrackerHitCollection) { - try { - auto hit = EDM4hepUtil::readSimHit( - simTrackerHit, - [](const edm4hep::MCParticle& particle) { - ActsFatras::Barcode result; - result.setParticle( - EDM4hepUtil::podioObjectIDToInteger(particle.id())); - return result; - }, - [&](std::uint64_t cellId) { - auto detElement = m_cfg.dd4hepDetector->geometryService->detector() - .volumeManager() - .lookupDetElement(cellId); - Acts::GeometryIdentifier result = detElement.volumeID(); - return result; - }); - unordered.push_back(std::move(hit)); - } catch (...) { - ACTS_ERROR("EDM4hepSimHitReader: failed to convert SimTrackerHit"); - continue; - } - } - - SimHitContainer simHits; - simHits.insert(unordered.begin(), unordered.end()); - m_outputSimHits(ctx, std::move(simHits)); - - return ProcessCode::SUCCESS; -} - -} // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/src/EDM4hepSimHitWriter.cpp b/Examples/Io/EDM4hep/src/EDM4hepSimHitWriter.cpp index 4421ce8e3a0..711a87d77ca 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepSimHitWriter.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepSimHitWriter.cpp @@ -89,6 +89,7 @@ ProcessCode EDM4hepSimHitWriter::writeT(const AlgorithmContext& ctx, frame.put(std::move(mcParticles), m_cfg.outputParticles); frame.put(std::move(simTrackerHitCollection), m_cfg.outputSimTrackerHits); + std::lock_guard lock{m_writeMutex}; m_writer.writeFrame(frame, "events"); return ProcessCode::SUCCESS; diff --git a/Examples/Io/EDM4hep/src/EDM4hepTrackReader.cpp b/Examples/Io/EDM4hep/src/EDM4hepTrackReader.cpp index a634639e489..0db917a2714 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepTrackReader.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepTrackReader.cpp @@ -28,12 +28,12 @@ EDM4hepTrackReader::EDM4hepTrackReader(const Config& config, m_outputTracks.initialize(m_cfg.outputTracks); - m_reader.openFile(m_cfg.inputPath); + m_eventsRange = {0, reader().getEntries("events")}; } std::pair EDM4hepTrackReader::availableEvents() const { - return {0, m_reader.getEntries("events")}; + return m_eventsRange; } std::string EDM4hepTrackReader::EDM4hepTrackReader::name() const { @@ -41,7 +41,7 @@ std::string EDM4hepTrackReader::EDM4hepTrackReader::name() const { } ProcessCode EDM4hepTrackReader::read(const AlgorithmContext& ctx) { - podio::Frame frame = m_reader.readEntry("events", ctx.eventNumber); + podio::Frame frame = reader().readEntry("events", ctx.eventNumber); const auto& trackCollection = frame.get(m_cfg.inputTracks); @@ -66,4 +66,14 @@ ProcessCode EDM4hepTrackReader::read(const AlgorithmContext& ctx) { return ProcessCode::SUCCESS; } +podio::ROOTFrameReader& EDM4hepTrackReader::reader() { + bool exists = false; + auto& reader = m_reader.local(exists); + if (!exists) { + reader.openFile(m_cfg.inputPath); + } + + return reader; +} + } // namespace ActsExamples diff --git a/Examples/Io/EDM4hep/src/EDM4hepTrackWriter.cpp b/Examples/Io/EDM4hep/src/EDM4hepTrackWriter.cpp index 3911bfa3c8f..c9d50032351 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepTrackWriter.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepTrackWriter.cpp @@ -48,6 +48,7 @@ ProcessCode EDM4hepTrackWriter::writeT(const AlgorithmContext& context, frame.put(std::move(trackCollection), m_cfg.outputTracks); + std::lock_guard guard(m_writeMutex); m_writer.writeFrame(frame, "events"); return ProcessCode::SUCCESS; diff --git a/Examples/Io/EDM4hep/src/EDM4hepUtil.cpp b/Examples/Io/EDM4hep/src/EDM4hepUtil.cpp index aef0d6cb191..8ec14043753 100644 --- a/Examples/Io/EDM4hep/src/EDM4hepUtil.cpp +++ b/Examples/Io/EDM4hep/src/EDM4hepUtil.cpp @@ -8,6 +8,7 @@ #include "ActsExamples/Io/EDM4hep/EDM4hepUtil.hpp" +#include "Acts/Definitions/Common.hpp" #include "Acts/Definitions/Units.hpp" #include "Acts/EventData/Charge.hpp" #include "Acts/EventData/MultiTrajectory.hpp" @@ -22,6 +23,8 @@ #include "edm4hep/TrackState.h" +using namespace Acts::UnitLiterals; + namespace ActsExamples { ActsFatras::Particle EDM4hepUtil::readParticle( @@ -42,13 +45,11 @@ ActsFatras::Particle EDM4hepUtil::readParticle( from.getTime() * Acts::UnitConstants::ns); // Only used for direction; normalization/units do not matter - to.setDirection(from.getMomentum()[0], from.getMomentum()[1], - from.getMomentum()[2]); + Acts::Vector3 momentum = {from.getMomentum()[0], from.getMomentum()[1], + from.getMomentum()[2]}; + to.setDirection(momentum.normalized()); - to.setAbsoluteMomentum(std::hypot(from.getMomentum()[0], - from.getMomentum()[1], - from.getMomentum()[2]) * - Acts::UnitConstants::GeV); + to.setAbsoluteMomentum(momentum.norm() * 1_GeV); return to; } @@ -70,38 +71,36 @@ ActsFatras::Hit EDM4hepUtil::readSimHit( const edm4hep::SimTrackerHit& from, const MapParticleIdFrom& particleMapper, const MapGeometryIdFrom& geometryMapper) { ActsFatras::Barcode particleId = particleMapper(from.getMCParticle()); - Acts::GeometryIdentifier geometryId = geometryMapper(from.getCellID()); - const auto mass = from.getMCParticle().getMass(); - const Acts::ActsVector<3> momentum{ - from.getMomentum().x * Acts::UnitConstants::GeV, - from.getMomentum().y * Acts::UnitConstants::GeV, - from.getMomentum().z * Acts::UnitConstants::GeV, + const auto mass = from.getMCParticle().getMass() * 1_GeV; + const Acts::Vector3 momentum{ + from.getMomentum().x * 1_GeV, + from.getMomentum().y * 1_GeV, + from.getMomentum().z * 1_GeV, }; const auto energy = std::hypot(momentum.norm(), mass); - ActsFatras::Hit::Vector4 pos4{ - from.getPosition().x * Acts::UnitConstants::mm, - from.getPosition().y * Acts::UnitConstants::mm, - from.getPosition().z * Acts::UnitConstants::mm, - from.getTime() * Acts::UnitConstants::ns, + Acts::Vector4 pos4{ + from.getPosition().x * 1_mm, + from.getPosition().y * 1_mm, + from.getPosition().z * 1_mm, + from.getTime() * 1_ns, }; - ActsFatras::Hit::Vector4 mom4{ + Acts::Vector4 mom4{ momentum.x(), momentum.y(), momentum.z(), energy, }; - // TODO no EDM4hep equivalent? - ActsFatras::Hit::Vector4 delta4{ - 0 * Acts::UnitConstants::GeV, 0 * Acts::UnitConstants::GeV, - 0 * Acts::UnitConstants::GeV, - 0 * Acts::UnitConstants::GeV, // sth.getEDep() - }; + Acts::Vector4 delta4 = Acts::Vector4::Zero(); + delta4[Acts::eEnergy] = -from.getEDep() * Acts::UnitConstants::GeV; + + Acts::GeometryIdentifier geometryId = geometryMapper(from.getCellID()); - // TODO no EDM4hep equivalent? + // Can extract from time, but we need a complete picture of the trajectory + // first int32_t index = -1; return ActsFatras::Hit(geometryId, particleId, pos4, mom4, mom4 + delta4, diff --git a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp index f1864b86b60..ae179a88b0c 100644 --- a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp +++ b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp @@ -195,8 +195,8 @@ int ActsExamples::VertexPerformanceWriter::getNumberOfReconstructableVertices( // traverse the array for frequency for (const auto& p : collection) { - int secVtxId = p.particleId().vertexSecondary(); - if (secVtxId != 0) { + int generation = p.particleId().generation(); + if (generation > 0) { // truthparticle from secondary vtx continue; } @@ -221,8 +221,8 @@ int ActsExamples::VertexPerformanceWriter::getNumberOfTruePriVertices( std::set allPriVtxIds; for (const auto& p : collection) { int priVtxId = p.particleId().vertexPrimary(); - int secVtxId = p.particleId().vertexSecondary(); - if (secVtxId != 0) { + int generation = p.particleId().generation(); + if (generation > 0) { // truthparticle from secondary vtx continue; } @@ -511,9 +511,9 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( for (std::size_t j = 0; j < associatedTruthParticles.size(); ++j) { const auto& particle = associatedTruthParticles[j]; int priVtxId = particle.particleId().vertexPrimary(); - int secVtxId = particle.particleId().vertexSecondary(); + int generation = particle.particleId().generation(); - if (secVtxId != 0) { + if (generation > 0) { // truthparticle from secondary vtx continue; } diff --git a/Examples/Python/src/EDM4hep.cpp b/Examples/Python/src/EDM4hep.cpp index 4daedbadada..a20c171603c 100644 --- a/Examples/Python/src/EDM4hep.cpp +++ b/Examples/Python/src/EDM4hep.cpp @@ -7,12 +7,12 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include "Acts/Plugins/Python/Utilities.hpp" +#include "ActsExamples/DD4hepDetector/DD4hepDetector.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepMeasurementWriter.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepMultiTrajectoryWriter.hpp" -#include "ActsExamples/Io/EDM4hep/EDM4hepParticleReader.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepParticleWriter.hpp" -#include "ActsExamples/Io/EDM4hep/EDM4hepSimHitReader.hpp" +#include "ActsExamples/Io/EDM4hep/EDM4hepReader.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepSimHitWriter.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepTrackReader.hpp" #include "ActsExamples/Io/EDM4hep/EDM4hepTrackWriter.hpp" @@ -33,9 +33,11 @@ void addEDM4hep(Context& ctx) { auto mex = ctx.get("examples"); auto edm4hep = mex.def_submodule("_edm4hep"); - ACTS_PYTHON_DECLARE_READER(ActsExamples::EDM4hepSimHitReader, edm4hep, - "EDM4hepSimHitReader", inputPath, inputParticles, - outputSimHits, dd4hepDetector); + ACTS_PYTHON_DECLARE_READER( + ActsExamples::EDM4hepReader, edm4hep, "EDM4hepReader", inputPath, + inputParticles, inputSimHits, outputParticlesInitial, + outputParticlesFinal, outputParticlesGenerator, outputSimHits, + graphvizOutput, dd4hepDetector, trackingGeometry, sortSimHitsInTime); ACTS_PYTHON_DECLARE_WRITER(ActsExamples::EDM4hepSimHitWriter, edm4hep, "EDM4hepSimHitWriter", inputSimHits, @@ -51,10 +53,6 @@ void addEDM4hep(Context& ctx) { "EDM4hepMeasurementWriter", inputMeasurements, inputClusters, outputPath); - ACTS_PYTHON_DECLARE_READER(ActsExamples::EDM4hepParticleReader, edm4hep, - "EDM4hepParticleReader", inputPath, inputParticles, - outputParticles); - ACTS_PYTHON_DECLARE_WRITER(ActsExamples::EDM4hepParticleWriter, edm4hep, "EDM4hepParticleWriter", inputParticles, outputPath, outputParticles); diff --git a/Examples/Python/tests/test_reader.py b/Examples/Python/tests/test_reader.py index 8100ef5489f..5850e3cd051 100644 --- a/Examples/Python/tests/test_reader.py +++ b/Examples/Python/tests/test_reader.py @@ -346,6 +346,7 @@ def generate_input_test_edm4hep_simhit_reader(input, output): ddsim.compactFile = input ddsim.enableGun = True ddsim.gun.direction = (1, 0, 0) + ddsim.gun.particle = "pi-" ddsim.gun.distribution = "eta" ddsim.numberOfEvents = 10 ddsim.outputFile = output @@ -355,8 +356,8 @@ def generate_input_test_edm4hep_simhit_reader(input, output): @pytest.mark.slow @pytest.mark.edm4hep @pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up") -def test_edm4hep_simhit_reader(tmp_path): - from acts.examples.edm4hep import EDM4hepSimHitReader +def test_edm4hep_simhit_particle_reader(tmp_path): + from acts.examples.edm4hep import EDM4hepReader tmp_file = str(tmp_path / "output_edm4hep.root") odd_xml_file = str(getOpenDataDetectorDirectory() / "xml" / "OpenDataDetector.xml") @@ -373,17 +374,34 @@ def test_edm4hep_simhit_reader(tmp_path): s = Sequencer(numThreads=1) s.addReader( - EDM4hepSimHitReader( + EDM4hepReader( level=acts.logging.INFO, inputPath=tmp_file, + inputSimHits=[ + "PixelBarrelReadout", + "PixelEndcapReadout", + "ShortStripBarrelReadout", + "ShortStripEndcapReadout", + "LongStripBarrelReadout", + "LongStripEndcapReadout", + ], + outputParticlesGenerator="particles_input", + outputParticlesInitial="particles_initial", + outputParticlesFinal="particles_final", outputSimHits="simhits", dd4hepDetector=detector, + trackingGeometry=trackingGeometry, ) ) alg = AssertCollectionExistsAlg("simhits", "check_alg", acts.logging.WARNING) s.addAlgorithm(alg) + alg = AssertCollectionExistsAlg( + "particles_input", "check_alg", acts.logging.WARNING + ) + s.addAlgorithm(alg) + s.run() assert alg.events_seen == 10 @@ -437,55 +455,6 @@ def test_edm4hep_measurement_reader(tmp_path, fatras, conf_const): assert alg.events_seen == 10 -@pytest.mark.edm4hep -@pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up") -def test_edm4hep_particle_reader(tmp_path, conf_const, ptcl_gun): - from acts.examples.edm4hep import ( - EDM4hepParticleWriter, - EDM4hepParticleReader, - ) - - s = Sequencer(numThreads=1, events=10, logLevel=acts.logging.WARNING) - evGen = ptcl_gun(s) - - out = tmp_path / "particles_edm4hep.root" - - out.mkdir() - - s.addWriter( - conf_const( - EDM4hepParticleWriter, - acts.logging.WARNING, - inputParticles=evGen.config.outputParticles, - outputPath=str(out), - ) - ) - - s.run() - - # reset the seeder - s = Sequencer(numThreads=1, logLevel=acts.logging.WARNING) - - s.addReader( - conf_const( - EDM4hepParticleReader, - acts.logging.WARNING, - inputPath=str(out), - outputParticles="input_particles", - ) - ) - - alg = AssertCollectionExistsAlg( - "input_particles", "check_alg", acts.logging.WARNING - ) - - s.addAlgorithm(alg) - - s.run() - - assert alg.events_seen == 10 - - @pytest.mark.edm4hep @pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up") def test_edm4hep_tracks_reader(tmp_path): diff --git a/Examples/Scripts/Python/full_chain_odd.py b/Examples/Scripts/Python/full_chain_odd.py index 41249f585cf..9a8040b37b7 100755 --- a/Examples/Scripts/Python/full_chain_odd.py +++ b/Examples/Scripts/Python/full_chain_odd.py @@ -11,6 +11,7 @@ addGeant4, ParticleSelectorConfig, addDigitization, + addParticleSelection, ) from acts.examples.reconstruction import ( addSeeding, @@ -28,10 +29,14 @@ ) from common import getOpenDataDetectorDirectory from acts.examples.odd import getOpenDataDetector +import acts.examples.edm4hep parser = argparse.ArgumentParser(description="Full chain with the OpenDataDetector") parser.add_argument("--events", "-n", help="Number of events", type=int, default=100) + +parser.add_argument("--skip", "-s", help="Number of events", type=int, default=0) +parser.add_argument("--edm4hep", help="Use edm4hep inputs", type=pathlib.Path) parser.add_argument( "--geant4", help="Use Geant4 instead of fatras", action="store_true" ) @@ -75,81 +80,126 @@ s = acts.examples.Sequencer( events=args["events"], - numThreads=1, + skip=args["skip"], + numThreads=1 if g4_simulation else -1, outputDir=str(outputDir), ) -if not ttbar: - addParticleGun( - s, - MomentumConfig(1.0 * u.GeV, 10.0 * u.GeV, transverse=True), - EtaConfig(-3.0, 3.0), - PhiConfig(0.0, 360.0 * u.degree), - ParticleConfig(4, acts.PdgParticle.eMuon, randomizeCharge=True), - vtxGen=acts.examples.GaussianVertexGenerator( - mean=acts.Vector4(0, 0, 0, 0), - stddev=acts.Vector4(0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 1.0 * u.ns), - ), - multiplicity=200, - rnd=rnd, +if args["edm4hep"]: + edm4hepReader = acts.examples.edm4hep.EDM4hepReader( + inputPath=str(args["edm4hep"]), + inputSimHits=[ + "PixelBarrelReadout", + "PixelEndcapReadout", + "ShortStripBarrelReadout", + "ShortStripEndcapReadout", + "LongStripBarrelReadout", + "LongStripEndcapReadout", + ], + outputParticlesGenerator="particles_input", + outputParticlesInitial="particles_initial", + outputParticlesFinal="particles_final", + outputSimHits="simhits", + graphvizOutput="graphviz", + dd4hepDetector=detector, + trackingGeometry=trackingGeometry, + sortSimHitsInTime=True, + level=acts.logging.INFO, ) -else: - addPythia8( - s, - hardProcess=["Top:qqbar2ttbar=on"], - npileup=50, - vtxGen=acts.examples.GaussianVertexGenerator( - mean=acts.Vector4(0, 0, 0, 0), - stddev=acts.Vector4(0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 5.0 * u.ns), - ), - rnd=rnd, - outputDirRoot=outputDir, - # outputDirCsv=outputDir, - ) -if g4_simulation: - if s.config.numThreads != 1: - raise ValueError("Geant 4 simulation does not support multi-threading") - - # Pythia can sometime simulate particles outside the world volume, a cut on the Z of the track help mitigate this effect - # Older version of G4 might not work, this as has been tested on version `geant4-11-00-patch-03` - # For more detail see issue #1578 - addGeant4( + s.addReader(edm4hepReader) + s.addWhiteboardAlias("particles", edm4hepReader.config.outputParticlesGenerator) + + addParticleSelection( s, - detector, - trackingGeometry, - field, - preSelectParticles=ParticleSelectorConfig( + config=ParticleSelectorConfig( rho=(0.0, 24 * u.mm), absZ=(0.0, 1.0 * u.m), eta=(-3.0, 3.0), pt=(150 * u.MeV, None), removeNeutral=True, ), - outputDirRoot=outputDir, - # outputDirCsv=outputDir, - rnd=rnd, - killVolume=trackingGeometry.worldVolume, - killAfterTime=25 * u.ns, + inputParticles="particles", + outputParticles="particles_selected", ) + + else: - addFatras( - s, - trackingGeometry, - field, - preSelectParticles=ParticleSelectorConfig( - rho=(0.0, 24 * u.mm), - absZ=(0.0, 1.0 * u.m), - eta=(-3.0, 3.0), - pt=(150 * u.MeV, None), - removeNeutral=True, + if not ttbar: + addParticleGun( + s, + MomentumConfig(1.0 * u.GeV, 10.0 * u.GeV, transverse=True), + EtaConfig(-3.0, 3.0), + PhiConfig(0.0, 360.0 * u.degree), + ParticleConfig(4, acts.PdgParticle.eMuon, randomizeCharge=True), + vtxGen=acts.examples.GaussianVertexGenerator( + mean=acts.Vector4(0, 0, 0, 0), + stddev=acts.Vector4( + 0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 1.0 * u.ns + ), + ), + multiplicity=200, + rnd=rnd, + ) + else: + addPythia8( + s, + hardProcess=["Top:qqbar2ttbar=on"], + npileup=50, + vtxGen=acts.examples.GaussianVertexGenerator( + mean=acts.Vector4(0, 0, 0, 0), + stddev=acts.Vector4( + 0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 5.0 * u.ns + ), + ), + rnd=rnd, + outputDirRoot=outputDir, + # outputDirCsv=outputDir, + ) + + if g4_simulation: + if s.config.numThreads != 1: + raise ValueError("Geant 4 simulation does not support multi-threading") + + # Pythia can sometime simulate particles outside the world volume, a cut on the Z of the track help mitigate this effect + # Older version of G4 might not work, this as has been tested on version `geant4-11-00-patch-03` + # For more detail see issue #1578 + addGeant4( + s, + detector, + trackingGeometry, + field, + preSelectParticles=ParticleSelectorConfig( + rho=(0.0, 24 * u.mm), + absZ=(0.0, 1.0 * u.m), + eta=(-3.0, 3.0), + pt=(150 * u.MeV, None), + removeNeutral=True, + ), + outputDirRoot=outputDir, + # outputDirCsv=outputDir, + rnd=rnd, + killVolume=trackingGeometry.worldVolume, + killAfterTime=25 * u.ns, + ) + else: + addFatras( + s, + trackingGeometry, + field, + preSelectParticles=ParticleSelectorConfig( + rho=(0.0, 24 * u.mm), + absZ=(0.0, 1.0 * u.m), + eta=(-3.0, 3.0), + pt=(150 * u.MeV, None), + removeNeutral=True, + ) + if ttbar + else ParticleSelectorConfig(), + enableInteractions=True, + outputDirRoot=outputDir, + # outputDirCsv=outputDir, + rnd=rnd, ) - if ttbar - else ParticleSelectorConfig(), - enableInteractions=True, - outputDirRoot=outputDir, - # outputDirCsv=outputDir, - rnd=rnd, - ) addDigitization( s, @@ -168,15 +218,6 @@ TruthSeedRanges(pt=(1.0 * u.GeV, None), eta=(-3.0, 3.0), nHits=(9, None)) if ttbar else TruthSeedRanges(), - initialSigmas=[ - 1 * u.mm, - 1 * u.mm, - 1 * u.degree, - 1 * u.degree, - 0.1 / u.GeV, - 1 * u.ns, - ], - initialVarInflation=[1.0] * 6, geoSelectionConfigFile=oddSeedingSel, outputDirRoot=outputDir, # outputDirCsv=outputDir, @@ -223,9 +264,7 @@ addAmbiguityResolution( s, AmbiguityResolutionConfig( - maximumSharedHits=3, - maximumIterations=1000000, - nMeasurementsMin=7, + maximumSharedHits=3, maximumIterations=1000000, nMeasurementsMin=7 ), outputDirRoot=outputDir, writeCovMat=True, diff --git a/Fatras/include/ActsFatras/EventData/Barcode.hpp b/Fatras/include/ActsFatras/EventData/Barcode.hpp index 84e2dd0ba78..35df07d91f1 100644 --- a/Fatras/include/ActsFatras/EventData/Barcode.hpp +++ b/Fatras/include/ActsFatras/EventData/Barcode.hpp @@ -99,7 +99,7 @@ class Barcode : public Acts::MultiIndex { using Base::Value; // Construct an invalid barcode with all levels set to zero. - Barcode() : Base(Base::Zeros()) {} + constexpr Barcode() : Base(Base::Zeros()) {} Barcode(const Barcode&) = default; Barcode(Barcode&&) = default; Barcode& operator=(const Barcode&) = default; @@ -117,15 +117,30 @@ class Barcode : public Acts::MultiIndex { constexpr Value subParticle() const { return level(4); } /// Set the primary vertex identifier. - constexpr Barcode& setVertexPrimary(Value id) { return set(0, id), *this; } + constexpr Barcode& setVertexPrimary(Value id) { + set(0, id); + return *this; + } /// Set the secondary vertex identifier. - constexpr Barcode& setVertexSecondary(Value id) { return set(1, id), *this; } + constexpr Barcode& setVertexSecondary(Value id) { + set(1, id); + return *this; + } /// Set the parent particle identifier. - constexpr Barcode& setParticle(Value id) { return set(2, id), *this; } + constexpr Barcode& setParticle(Value id) { + set(2, id); + return *this; + } /// Set the particle identifier. - constexpr Barcode& setGeneration(Value id) { return set(3, id), *this; } + constexpr Barcode& setGeneration(Value id) { + set(3, id); + return *this; + } /// Set the process identifier. - constexpr Barcode& setSubParticle(Value id) { return set(4, id), *this; } + constexpr Barcode& setSubParticle(Value id) { + set(4, id); + return *this; + } /// Construct a new barcode representing a descendant particle. /// From 6a2554575bced122e145edeab27ae2e4ed1c4200 Mon Sep 17 00:00:00 2001 From: Andreas Stefl Date: Tue, 27 Feb 2024 18:23:55 +0100 Subject: [PATCH 10/10] feat: Add setup script which also handles dependencies (#2926) Currently I use a bunch of setup scripts for my daily developments and I wondered if those can be generated by CMake. In the best case this could be the standard way to setup a dev environment once the dependencies+built is figured out Sourcing our python scripts dir is currently necessary to find the ODD directory. This can later be generalized by an environment variable. Mid term we could also think about adding a dependency build script to the repo and have a CI job monitoring the dev environment setup for one or more systems --- .github/workflows/builds.yml | 14 ++------- .gitlab-ci.yml | 17 ++-------- Examples/Python/CMakeLists.txt | 5 +-- cmake/ActsCreateSetup.cmake | 8 +++++ cmake/setup_withdeps.sh.in | 57 ++++++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 30 deletions(-) create mode 100644 cmake/setup_withdeps.sh.in diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 9fb71cc2a65..71656704057 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -146,12 +146,7 @@ jobs: PYTEST_MD_REPORT_OUTPUT: pytest.md run: > /usr/local/bin/geant4-config --install-datasets - && source /usr/local/bin/thisroot.sh - && source /usr/local/bin/thisdd4hep_only.sh - && source /usr/local/bin/geant4.sh - && source build/python/setup.sh - && export PYTHONPATH=/usr/local/python:$PYTHONPATH - && export LD_LIBRARY_PATH=$PWD/build/thirdparty/OpenDataDetector/factory:$LD_LIBRARY_PATH + && source build/this_acts_withdeps.sh && pip3 install -r Examples/Python/tests/requirements.txt && pip3 install pytest-md-report && pytest -rFsv -k "not exatrkx" -v @@ -195,13 +190,8 @@ jobs: && pip3 install histcmp==0.6.5 spyral-cli==1.1.1 matplotlib && pip3 install -r Examples/Scripts/requirements.txt && /usr/local/bin/geant4-config --install-datasets - && source /usr/local/bin/thisroot.sh - && source /usr/local/bin/thisdd4hep_only.sh - && source /usr/local/bin/geant4.sh - && source build/python/setup.sh - && export LD_LIBRARY_PATH=$PWD/build/thirdparty/OpenDataDetector/factory:$LD_LIBRARY_PATH + && source build/this_acts_withdeps.sh && echo "::endgroup::" - && export PYTHONPATH="${PYTHONPATH}":"${GITHUB_WORKSPACE}/Examples/Scripts/Python" && CI/physmon/phys_perf_mon.sh all physmon && cat physmon/summary.md >> $GITHUB_STEP_SUMMARY diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 512fbf3630f..73068b2725b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -128,8 +128,7 @@ test_exatrkx_python: script: - apt-get update -y - apt-get install -y python3 libxxhash0 - - source /usr/local/bin/thisroot.sh - - source build/python/setup.sh + - source build/this_acts_withdeps.sh - git clone $CLONE_URL src - cd src - git checkout $HEAD_SHA @@ -205,12 +204,7 @@ linux_test_examples: - cd .. - /usr/local/bin/geant4-config --install-datasets - - "source /usr/local/bin/thisroot.sh || true" - - "source /usr/local/bin/thisdd4hep_only.sh || true" - - "source /usr/local/bin/geant4.sh || true" - - source build/python/setup.sh - - export PYTHONPATH=/usr/local/python:$PYTHONPATH - - export LD_LIBRARY_PATH=$PWD/build/thirdparty/OpenDataDetector/factory:$LD_LIBRARY_PATH + - source build/this_acts_withdeps.sh - cd src - pip3 install -r Examples/Python/tests/requirements.txt - pytest -rFsv -k "not exatrkx" -v @@ -240,13 +234,8 @@ linux_physmon: - pip3 install histcmp==0.6.5 spyral-cli==1.1.0 matplotlib - pip3 install -r src/Examples/Scripts/requirements.txt - /usr/local/bin/geant4-config --install-datasets - - "source /usr/local/bin/thisroot.sh || true" - - "source /usr/local/bin/thisdd4hep_only.sh || true" - - "source /usr/local/bin/geant4.sh || true" - - source build/python/setup.sh - - export LD_LIBRARY_PATH=$PWD/build/thirdparty/OpenDataDetector/factory:$LD_LIBRARY_PATH + - source build/this_acts_withdeps.sh - cd src - - export PYTHONPATH="${PYTHONPATH}":"${PWD}/Examples/Scripts/Python" - CI/physmon/phys_perf_mon.sh all physmon ############################### diff --git a/Examples/Python/CMakeLists.txt b/Examples/Python/CMakeLists.txt index 282f4d73852..8d835a3f736 100644 --- a/Examples/Python/CMakeLists.txt +++ b/Examples/Python/CMakeLists.txt @@ -180,9 +180,8 @@ else() target_sources(ActsPythonBindings PRIVATE src/OnnxNeuralCalibratorStub.cpp) endif() -add_custom_target(ActsPythonGlueCode) configure_file(setup.sh.in ${_python_dir}/setup.sh @ONLY) -install(FILES setup.sh.in DESTINATION "python" RENAME setup.sh) +install(FILES ${_python_dir}/setup.sh DESTINATION "python") foreach(f ${py_files}) set(_target ${_python_dir}/acts/${f}) @@ -193,5 +192,3 @@ file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/python/acts/${f} ${_target} SYMBOLI endforeach() install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/python/acts/ DESTINATION ${_python_install_dir}) - -add_dependencies(ActsPythonBindings ActsPythonGlueCode) diff --git a/cmake/ActsCreateSetup.cmake b/cmake/ActsCreateSetup.cmake index 7c921e66dd6..ef37ea1db3b 100644 --- a/cmake/ActsCreateSetup.cmake +++ b/cmake/ActsCreateSetup.cmake @@ -6,3 +6,11 @@ configure_file( install( FILES ${PROJECT_BINARY_DIR}/this_acts.sh DESTINATION ${CMAKE_INSTALL_BINDIR}) + +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/setup_withdeps.sh.in + ${PROJECT_BINARY_DIR}/this_acts_withdeps.sh + @ONLY) +install( + FILES ${PROJECT_BINARY_DIR}/this_acts_withdeps.sh + DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/cmake/setup_withdeps.sh.in b/cmake/setup_withdeps.sh.in new file mode 100644 index 00000000000..953f472d78e --- /dev/null +++ b/cmake/setup_withdeps.sh.in @@ -0,0 +1,57 @@ +# This file is part of the Acts project. +# +# Copyright (C) 2024 CERN for the benefit of the Acts project +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# This script sets up the ACTS Examples environment in a somewhat robust way. + +if [ -n "$ZSH_VERSION" ]; then + script_dir=${0:a:h} +elif [ -n "$BASH_VERSION" ]; then + script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +else + # If the current shell is not ZSH or Bash, we can't guarantee that the + # script will work, so we throw an error. + echo "ERROR: neither ZSH nor Bash was detected, other shells are not supported. The environment has not been modified." + exit 1 +fi + +# source the python and ODD environment +. $script_dir/python/setup.sh + +# set ACTS and ODD environment variables +ACTS_SOURCE_DIR=@CMAKE_CURRENT_SOURCE_DIR@ +ODD_SOURCE_DIR=@CMAKE_CURRENT_SOURCE_DIR@/thirdparty/OpenDataDetector + +# modify python environment to include some ACTS helpers +export PYTHONPATH="$ACTS_SOURCE_DIR/Examples/Scripts/Python:${PYTHONPATH}" + +# make ACTS binaries available +export PATH="$script_dir/bin:${PATH}" +export LD_LIBRARY_PATH="$script_dir/lib:${LD_LIBRARY_PATH}" +export DYLD_LIBRARY_PATH="$script_dir/lib:${DYLD_LIBRARY_PATH}" + +# activate dependencies if present +if [[ -d "@ROOT_DIR@" ]]; then + . @ROOT_BINDIR@/thisroot.sh +fi +if [[ -d "@Geant4_DIR@" ]]; then + . @Geant4_INCLUDE_DIR@/../../bin/geant4.sh +fi +if [[ -d "@DD4hep_DIR@" ]]; then + . @DD4hep_INCLUDE_DIRS@/../bin/thisdd4hep.sh +fi +if [[ -d "@podio_DIR@" ]]; then + export LD_LIBRARY_PATH="@podio_LIBRARY_DIR@:${LD_LIBRARY_PATH}" + export DYLD_LIBRARY_PATH="@podio_LIBRARY_DIR@:${DYLD_LIBRARY_PATH}" + export ROOT_INCLUDE_PATH="@podio_INCLUDE_DIR@:${ROOT_INCLUDE_PATH}" + export PYTHONPATH="@podio_PYTHON_DIR@:${PYTHONPATH}" +fi +if [[ -d "@EDM4HEP_DIR@" ]]; then + export LD_LIBRARY_PATH="@EDM4HEP_LIBRARY_DIR@/lib:${LD_LIBRARY_PATH}" + export DYLD_LIBRARY_PATH="@EDM4HEP_LIBRARY_DIR@/lib:${DYLD_LIBRARY_PATH}" + export ROOT_INCLUDE_PATH="@EDM4HEP_INCLUDE_DIR@:${ROOT_INCLUDE_PATH}" +fi

*<3t+S1y*b+B8?|L3^M0h|cQf;ae85 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