`L iddlZddlZddlZddlmZmZddlmZddl m Z ddl m Z ddlmZddlmZddlmZmZmZdd lmZdd lmZdd lmZmZmZmZej>jAd eefd Z!ej>jAdddggidfdddgddggidfddgdggidfgdZ"ej>jAdddgdZ#dZ$ej>jAdgdej>jAdddgdZ%ej>jAde&ddej>jAd e&ddej>jAdd!d"gej>jAdd#dgd$Z'ej>jAd%d&gd'd(gd)Z(ej>jAgd*d!ddejRddgdd+gd,d-ggfd!dejRgd.ejRddgd/d+gd,d-ggfd!d/dejRddgdd,gd/d0gd,d-ggfd"ddejRddgddgd,d-ggfd"dejRgd.ejRddgdd+gd,d-ggfgd1Z*ej>jAd%d&gd'd(gd2Z+d3Z,d4Z-ej>jAdddgd5Z.ej>jAd%d&gd'd(gej>jAdgd6d7Z/d8Z0ej>jAde&ddej>jAdd!d"gej>jAdgd9ej>jAd:d;djAd dd0gej>jAd:djAddd/gej>jAdgd9ej>jAd>d;djAddd@idAfddBidAfddCidAfddDidEfgdFZ3ejhdGZ5ej>jAdHddjAdKdgezezdLZ7ejhdMZ8ej>jAdHddjAdKdgezezdWZ9dXZ:ej>jAgdYddjAdZed[Z>ej>jAgdYddjAd\ed]Z?ej>jAd^gd_ej>jAd`gdaej>jAdbdjAd:djAd\edcZ@ej>jAgdYddjAd\eddZAej>jAgdegdfej>jAd\edgZBej>jAd:dbggdhej>jAd\ediZCej>jAgdjgdkej>jAd\edlZDej>jAdbdjAd:djAd\edmZEej>jAdndodpde;ejejejjdzfdqde;ejejejjfgej>jAdbdjAd:djAd\edrZJej>jAdbdjAd:djAd\edsZKej>jAdteezduZLdvZMej>jejdwk(dxdjAd\edzZPy){N)assert_allcloseassert_array_equal)sparse)BSpline)random)LinearRegression)Pipeline)KBinsDiscretizerPolynomialFeaturesSplineTransformer)_get_sizeof_LARGEST_INT_t)assert_array_almost_equal)CSC_CONTAINERSCSR_CONTAINERS parse_version sp_versionestc*tjdjdd}d}||j|sJ||dj|sJtj|dj|sJy) z+Test that output array has the given order. c@tj|jS)N)np isfortranT)as q/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sklearn/preprocessing/tests/test_polynomial.pyis_c_contiguousz?test_polynomial_and_spline_array_order..is_c_contiguous"s||ACC  C)orderFN)rarangereshape fit_transformr)rXrs r&test_polynomial_and_spline_array_orderr's~ " a#A! 35..q1 22 2 3S>77: ;; ; <<#44Q7 88 8rzparams, err_msgknotsz0Number of knots, knots.shape\[0\], must be >= 2.rz*knots.shape\[1\] == n_features is violatedz(knots must be sorted without duplicates.cdgdgg}tjt|5tdi|j |dddy#1swYyxYw)zATest that we raise errors for invalid input in SplineTransformer.r)rmatchN)pytestraises ValueErrorr fitparamserr_msgr&s r(test_spline_transformer_input_validationr5*sJ qc A z 1+#F#''*+++ AA extrapolationcontinueperiodicctjdjdd}ddgddgddgddgddgg}td || j |}y ) zATest that SplineTransformer accepts integer value knot positions.rrrr)r )degreer(r7N)rr#r$r r%)r7r&r(_s r%test_spline_transformer_integer_knotsrA:s` " b!$AVaVaVb"XBx 8E] mArc@tjdjdd}tdddj |}|j }t |gdtdddj |}|j d d g}t |gd y ) zT)n_knotsr? include_bias) x0_sp_0x0_sp_1x0_sp_2x0_sp_3x0_sp_4x1_sp_0x1_sp_1x1_sp_2x1_sp_3x1_sp_4Frb)a_sp_0a_sp_1a_sp_2a_sp_3b_sp_0b_sp_1b_sp_2b_sp_3N)rr#r$r r1get_feature_names_outr)r&splt feature_namess r%test_spline_transformer_feature_namesr[Ds " b!$A Qqt D H H KD..0M  Qqu E I I! LD..Sz:M  r)constantlinearr8r9r?r>c<tjdjdd}t||j |}|j ddg}t ||jk(sJ|j|}|jdt |k(sJy) zsTest feature names are correct for different extrapolations and degree. Non-regression test for gh-25292. r;rr)r?r7rrOr)N) rr#r$r r1rXlenn_features_out_ transformshape)r7r?r&rYrZX_transs r7test_split_transform_feature_names_extrapolation_degreerdjs " b!$A F- H L LQ OD..Sz:M } !5!5 55 5nnQG == s=1 11 1rrrCuniformquantiler\chtjddddddf}tjdgg|dddddfdggf}|dddddf}|dk(r||z}t|||d|}|j |||fD]2}t tj |j|d d4y) zTest that B-splines are indeed a decomposition of unity. Splines basis functions must sum up to 1 per row, if we stay in between boundaries. rr)dNrr9T)rCr?r(rDr7axis)rlinspacer_r r1rsumra)r?rCr(r7r&X_trainX_testrYs r+test_spline_transformer_unity_decompositionrp}s Aq#q$w'AeeaSE1SqS!V9se+,G qt!tQwZF "F" #  D HHWv >t~~a0q91=>rbias interceptTFFTc .tjddddddf}tj|dddfdz}tdt dd|d fd t | fg }|j ||t|j||dy)z7Test that B-splines fit a sinusodial curve pretty well.rrrhNrspliner>r\rCr?rDr7ols fit_interceptstepsMbP?rtol) rrksinr r rr1rpredict)rqrrr&ypipes r)test_spline_transformer_linear_regressionrs Ar34(A qAw!A !!%",  $9= >   D HHQNDLLOQT2r)r(rC sample_weightexpected_knots)rrr)r)rr>r)rc tjddgddgddgddgddgddgddgg}tj|||| }t ||y ) zJCheck the behaviour to find knot positions with and without sample_weight.rrr>rrrrr)r&r(rCrN)rarrayr _get_base_knot_positionsr)r(rCrrr& base_knotss r/test_spline_transformer_get_base_knot_positionsrsb0 1a&1a&1a&1a&1a&1a&1b'JKA";; 5'JJ/rc d}tjddddddf}tdtdd|d fd t | fg }|j |||dddftjddddddf}|j |}t|||dddfddt|dd|dddy)z5Test that B-splines fit a periodic curve pretty well.ctjdtjz|ztjdtjz|zz dzS)Nrrr>)rrpi)xs rfz=test_spline_transformer_periodic_linear_regression..fs<vva"%%i!m$rvva"%%i!m'<r9rxryrzr|ri-g{Gz?)atolrrhr~r)rrkr r rr1rr)rqrrrr&rX_ predictionss r2test_spline_transformer_periodic_linear_regressionrs A Aq#q$w'A !!%",  $9= >   D HHQ!AqD'  RC D )B,,r"KK2ad84dCK#& C(<4HrcJtjddddddf}d}t|ddgdgd gg }|j|}tjd dgdd gd dgdd gg}t tj d d ||d}||ddd f}t||y)z@Test that the backport of extrapolate="periodic" works correctlyg @rNrr9g?r?r7r(rr)rrkr r%rrr#r)r&r? transformerXtcoefsplXspls r0test_spline_transformer_periodic_spline_backportrs BR D)A F$Zu7MK  " "1 %B 88c3Z#sc3Z#sD ED "))B"D&* =C qAwr9rr@@@ @rg"@)rrr)rr>)rrkr r%r)r& transformer_1 transformer_2Xt_1Xt_2s r4test_spline_transformer_periodic_splines_periodicityrs Ar34(A% usecUSEC53%8M & usecUSEC53%8M  & &q )D  & &q )DD$q/123rc ,tjddddddf}t|ddgdgdgd gd gd gg }|j|}|j |j z t |z }d|z}|}td |d zD]F}tj|d}tj|j |ksJ||z }Htj|d}tj|j d kDsJy)z?Test that spline transformation is smooth at first / last knot.rri'Nr9rrrrrrrr)rri) rrkr r%maxminr_rangediffabs) r?r&rrdeltatoldXtdrs r3test_spline_transformer_periodic_splines_smoothnessrs BF#AtG,A# usecUSEC53%8K  " "1 %B UUWquuw #a& (E u*C C1fqj !wws#vvd|!C'''Ul  773Q D 66$<    !! !r)r)rr>rrc tjddddddf}|j}tdt d||dgd t | gg}|j ||t|jd gd ggddgtdt d||d gd t | gg}|j ||t|jd gd ggd d gt d||d}|j |d}tjt|5|jd ggdddtjt|5|jd ggdddy#1swYAxYw#1swYyxYw)z1Test that B-spline extrapolation works correctly.rr)rhNrvrr\rxryrzirr]error0X contains values beyond the limits of the knotsr+) rrksqueezer r rr1rrr.r/r0ra)rqrrr?r&rrrYmsgs r%test_spline_transformer_extrapolationr?s B34(A A !!!%",  $9= >  D HHQNDLL3%!.Q8 !!!%"*  $9= >  D HHQNDLL3%!.a9 &t7 D HHQK *~/D/D/MM MM>#9#9#;< GGAA E GGAA Eee EAIub)2;;ueai+LLG@ ]]:S 1 *   ) * ]]:S 1 +  ! !' * + +    );+@+@+I+Q+Q+S  * * + +s:H1HHHrct|||||}tjddddddf}|j||j |j d|j k(sJy)z8Test that transform results in n_features_out_ features.)rCr?rDr7rrr)rN)r rrkr1rarbr`)rCrDr?r7rrYr&s r&test_spline_transformer_n_features_outrsm !##  D Aq"ag&AHHQK >>!  " "1 %)=)= == =r)rrz°ree=\(min_degree, max_degree\) must)rg?r>r)r)rr>z'int or tuple \(min_degree, max_degree\)cdgdgg}tjt|5tdi|j |dddy#1swYyxYw)zBTest that we raise errors for invalid input in PolynomialFeatures.r)rr+Nr-)r.r/r0r r1r2s r)test_polynomial_features_input_validationrsJ qc A z 1,$V$((+,,,r6ctjdddtjf}tjtj|||dz|dzg}||fS)Nrrr>)rr#newaxishstack ones_like)r&Ps rsingle_feature_degree3rsL ! Q ]#A 2<<?Aq!tQT23A a4Krz/degree, include_bias, interaction_only, indicesrr>)rrr> X_containercJ|\}}|||}t|||j|}|j|} || j} t | |dd|f|j dkDr2|j j|j |jfk(sJyy)z9Test PolynomialFeatures on single feature up to degree 3.Nr?rDinteraction_onlyr r r1rarrn_output_features_powers_rbn_features_in_) rr?rDrindicesrr&rtfouts r$test_polynomial_features_one_featurers. "DAq N LCS  c!f ,,q/CkkmC1g:' q zzB$9$92;L;L#MMMM!rcptjdjd}|ddddf}|ddddf}tj|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzz|dz|dzzg }||fS)Nrrr)rrr>)rr#r$r)r&x1x2rs rtwo_features_degree3rs ! V$A 1bqb5B 1ab5B EBEM EBEM EBEM EBEM EBEM EBEM EBEM EBEM EBEM EBEM  A a4Kr)rr)rr)r)rrrr)rr>rr)r>rr)rr>rrrr r>r>)rrrrr)rrrrcJ|\}}|||}t|||j|}|j|} || j} t | |dd|f|j dkDr2|j j|j |jfk(sJyy)z5Test PolynomialFeatures on 2 features up to degree 3.Nrrr) rr?rDrrrr&rrrs r%test_polynomial_features_two_featuresr1sF DAq N LCS  c!f ,,q/CkkmC1g:' q zzB$9$92;L;L#MMMM!rc tjdjdd}tddj |}|j }t gd|t||j|jdk(sJtdd j |}|j gd }t gd |t||j|jdk(sJtd d j |}|j gd }t gd |t||j|jdk(sJtdddj |}|j gd }t ddg|t||j|jdk(sJtddj |}|j gd}t gd|y)Nrr>rTr?rD) 1x0rrzx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r)F)rrOc)rrOr a^2a ba cb^2b cc^2a^3a^2 ba^2 ca b^2a b ca c^2b^3b^2 cb c^2c^3r)r r r rrrrrrrrrrrrrrrrr)F40D☮א)rrrr) rr#r$r r1rXrr_rarb)r&polyrZs rtest_polynomial_feature_namesrbs " b!$A QT : > >q AD..0MR } !2!8!8!; ;; ; QU ; ? ? BD..?M * -0 } !2!8!8!; ;; ; V% @ D DQ GD..?M $ '* } !2!8!8!; ;; ; D4  c!f ..?MW~}5 } !2!8!8!; ;; ; QT : > >q AD../QRM> Nr)degrDrdtype csc_containerctjj|}|jddd}||}t |||} | j |j |} | j |j |} tj| r| jdk(sJ| j| jk(sJt| j| y)NrrrhrrDrcsc rrrrandintr r%astyperrrr!rr) r rDrr!r"rrr&X_cscrXt_cscXt_denses rtest_polynomial_features_csc_Xr-s" ))   2 3C Aq(#A ! E  ,9I C  u||E2 3F  %1H ??6 "v}}'== = <<8>> )) )fnn.9r csr_containerctjj|}|jddd}||}t |||} | j |j |} | j |j |d} tj| r| jdk(sJ| j| jk(sJt| j| y)Nrrr$r%F)copyrr') r rDrr!r.rrr&X_csrrXt_csrr,s rtest_polynomial_features_csr_Xr3s ))   2 3C Aq(#A ! E  ,9I C  u||E2 3F  %e!<=H ??6 "v}}'== = <<8>> )) )fnn.9r n_features)r)rrzmin_degree, max_degree))rr))rr)r)r>)rr)r>rrc|dgdg|dz gff}t|||}|j||j}tj|d|||} |t | D cgc]} dc} k(sJycc} w)z? Test that n_output_features_ is calculated correctly. r)r)r?rrDr4 min_degree max_degreerrDN)r r1r _combinationsrm) r4r7r8rrDr.rr num_comboscombosr@s rtest_num_combinationsr<s saS:>"2345A )! C GGAJ''J  - -)! F 0Aa01 11 10s" A7 c|tddd|}|j}t|||}|j|j |} |j|j |} t j | r| jdk(sJ| j| jk(sJt| j| y)Nr? random_stater%r) sparse_randomrr r%r)rrrr!r) r rDrr!r.rr1r&rr2r,s r%test_polynomial_features_csr_X_floatsrC s -b#DVW XE A  ,9I C  u||E2 3F  %1H ??6 "v}}'== = <<8>> )) )fnn.9r)zero_row_indexr r) )rrT)r)rTrrT)rr>T)r)r>T)rr>T)rrF)r)rFrrF)rr>F)r)r>F)rr>Fcv|tddd|}d||ddf<|j}t|d|}|j|}|j|} t j |r|j dk(sJ|j| jk(sJt|j| y) Nr>rrr@rFr%r rBrr r%rrrr!r) rDr rr.rr1r&rr2r,s r'test_polynomial_features_csr_X_zero_rowrI's* -2sAST UE"E.!  A SuGW XC   u %F  #H ??6 "v}}'== = <<8>> )) )fnn.9r))TTrsrt)FFcd|tddd|}|j}td||}|j|}|j|}t j |r|j dk(sJ|j|jk(sJt|j|y)Nr>rr?r@rr%rrH) rDrr.rr1r&rr2r,s r'test_polynomial_features_csr_X_degree_4rKKs -b#DVW XE A  7G C  u %F  #H ??6 "v}}'== = <<8>> )) )fnn.9r)r dimr) )rr)TrE)r>r)T)r>rT)r>r>T)rr)FrF)r>r)F)r>rF)r>r>Fcb|td|d|}|j}t||}|j|}|j|} t j |r|j dk(sJ|j| jk(sJt|j| y)Nr>r?r@)rrrH) r rLrr.rr1r&rr2r,s r(test_polynomial_features_csr_X_dim_edgesrNas& dC3EF E  A S3C DC   u %F  #H ??6 "v}}'== = <<8>> )) )fnn.9rc Zfd}d}d}tj}tjddtj}tj|dz |dz |dz |dz g}tj|dz |dz |dz |dz gtj} |||| ff||f|} t |d } | j |d d| j| j } | tjtjjkDr8d } tjt| 5| j| dddy| j!| }|j#\}}||z}||| t% | d|z}|r dg|dz zng}|r d g|dz zng}t'dD]}|d|z}|d|zdz}| d|z}| d|zdz}|r"|j)d|j)d |j+||g|j+|t%|z|t%|zgsS|j+||z||z||zg|j+|||||z|||||z|||||zg|j+||zg|j)|||||zt%|dzdt% zz}| j,|dzk(sJ|j.|k(sJ|j0||dzfk(sJ|j2j.|j4j.cxk(rtjk(sJJ|j4jtjtj6jkDsJ|rt9t'|dz ng}|j+|dz g|z|dz g|zzt;|j<|t?||t?||y#1swYyxYw)aCheck the automatic index dtype promotion to `np.int64` when needed. This ensures that sufficiently large input configurations get properly promoted to use `np.int64` for index and indptr representation while preserving data integrity. Non-regression test for gh-16803. Note that this is only possible for Python runtimes with a 64 bit address space. On 32 bit platforms, a `ValueError` is raised instead. cdr||z|dzd|zzdzz dz |zS||z|dz|zdzz |zS)Nrr>r)r-)rijrs r degree_2_calczRtest_csr_polynomial_expansion_index_overflow_non_regression..degree_2_calcsP q5AqD1q5LQ..2Q6 6q5AqD1H?*Q. .r ir)rr!r)rbr!rrDr?rr6tThe output that would result from the current configuration would have \d* features which is too large to be indexedr+Nr>) rfloat32r#int64rr _num_combinationsrrDiinfointprr.r/r0r1r%nonzerointrappendextendrr!rbindptrrint32listrdatar)rrDr.rS n_samplesr4 data_dtyperdrowcolr&pfnum_combinationsrrc row_nonzero col_nonzeron_degree_1_features_outmax_degree_2_idx data_targetcol_nonzero_targetrQrrx_idxy_idx nnz_per_rowrow_nonzero_targets` r;test_csr_polynomial_expansion_index_overflow_non_regressionrusV / IJJ 99Q *D ((IM9q=)a-QO PC (( aaaaHPRPXPX C  Sz*% A ) Q B ++,,__ ,"((277+/// > ]]:S 1  FF1I q!G&0K(<7j#c.>*>&?"@#a&I ! ",81#Q'RK2>! A .B 1X QK QOAE AEAI    q !  % %a (Aq6"!! S& &L0A(A B    Aq1ua!e4 5  % %!*eU;>UU!*eU;>UU!*eU;>UU    Aw '  % %j%7:QQ /6l#a'!c6F2F.G*GGK $4q$8 88 8 ==J && & ==Y(81(<= == = >>  7??#8#8 DBHH DD DD D ??   288BHH#5#9#9 99 97CeIM23 Q+%Q+(EEGLL+.{$67{$67w s 1P!!P*zdegree, n_features)r)r>i( )r>rvcdg}|dz tjtjjkrtjntj}tj dg|}tj |dz g|}|dz t |zg} | j||dzzdz| dz| j||dzz|dzzdz| dz||||ff} t|||} | j|d|| j| j} | tjtjjkDr8d } tjt| 5| j!| d d d y t"t%d krD|d k(r?|dk(r:|s8d} tjt| 5| j'| }d d d y | j'| }| tjtjjkDrtjntj}d|dz t | zz}t ||z}|j(| j(k(sJ|j*d| j,fk(sJ|j.j(|j0j(cxk(r|k(sJJ|j2|k(sJ|r|dtj4dk(sJt7|D]$}|d| |ftj4dk(r$J||z}|dk(r|d|zz}| j,| |dz dz|z k(sJy #1swYy xYw#1swYy xYw)zTests known edge-cases to the dtype promotion strategy and custom Cython code, including a current bug in the upstream `scipy.sparse.hstack`. rr)rrUrrrVr6rWr+Nz1.9.2rvz>In scipy versions `<1.9.2`, the function `scipy.sparse.hstack`rrr>)rr[rbrrYrr^r_r rZrrDr\r.r/r0r1rrr%r!rbrrarnnzapproxr)r?r4rrDr.rd indices_dtypergrhexpected_indicesr&rirjrrcexpected_dtypenon_bias_terms expected_nnzidxoffsets r,test_csr_polynomial_expansion_index_overflowrsa4 5D *Q"((2882D2H2H HBHHbhhM ((A3m ,C ((JN#= 9C Q\**J*q.9Q>AQRSATTUj1n%a8A=@PQR@SS tc3Z()A ) V B ++,,__ ,"((277+/// > ]]:S 1  FF1I  ]7++ %  aK O ]]:S 1 *&&q)G *q!G!1BHHRXX4F4J4J!JRXXPRPXPXN&1*0@,@(AAAN|$~5L ==AGG ## # ==Q 5 56 66 6 >>  7??#8#8 JN JJ JJ J ;;, && &t} c 2222^$Gq*3//0FMM#4FFFFG *F {!j.  $4VaZ$@1$Dv$M MM MM  *s3M* M6*M36M?ctjtjjdz}dg}dg}|dz g}||||ff}t ||d}d} t j t| 5|j|dddt j t| 5|j|dddy#1swY?xYw#1swYyxYw) Nrrrr)rrVrWr+) rr[rYrr r.r/r0r1r%) rrDr.r4rdrgrhr&rirs r0test_csr_polynomial_expansion_too_large_to_indexr^s "((#''1,J 5D #C > Ctc3Z()A ) V B 6 z - q  z - s4C)CC Csparse_containercntjd}tdd}d}tjt |5|j |dddtdd}d }tjt |5|j |ddd|||fD]s}tdd }|j |}tj|r|j}t|tj|jdd fuy#1swYxYw#1swYxYw) zCheck that PolynomialFeatures raises error when degree=0 and include_bias=False, and output a single constant column when include_bias=True )rrrFrzWSetting degree to zero and include_bias to False would result in an empty output array.r+NrxzoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr)) ronesr r.r/r0r%rrrrrb)rr&rr4_Xoutputs r1test_polynomial_features_behaviour_on_zero_degreervs A QU ;D "  z 1 1 V% @D 8  z 1 1"1%&=!>##B' ??6 "^^%F6277AGGAJ?#;< =sDD+D(+D4ctjdk(s&tjdkrtjdk7rd}nd}t|k(sJy)Nwin32 emscriptenr)sysplatformmaxsizer ) expected_sizes rtest_sizeof_LARGEST_INT_trsB ||w u!=  $ &- 77 7rrzyOn Windows, scikit-learn is typically compiled with MSVC that does not support int128 arithmetic (at the time of writing))reasonruncttjtjjdzdz}dg}dg}|dz g}|dz g}|j t||dzzdz|dz|j t||dzz|dzzdz|dz||||ff}t ddd }tjd kr8d }tjt| 5|j|dddy|j|} tdD]$} | d|| ftjdk(r$Jy#1swYyxYw) NgUUUUUU?r>rrr)rrFrVrrWr+)r^rr[rYrr_r rrr.r/r0r%rrz) r.r4rdrgrhr|r&rirrcrs r*test_csr_polynomial_expansion_windows_failrsRXXbhh'++6:;J 5D #C > C Q J*q. )Q .1A!1D DE J*q. )Z!^ < ADTUVDW WX tc3Z()A Uq QB {{e : ]]:S 1   Q   ""1%8 KC1.s334 c8JJ JJ K   s 1EE)Qrnumpyrr. numpy.testingrrscipyrscipy.interpolater scipy.sparserrBsklearn.linear_modelrsklearn.pipeliner sklearn.preprocessingr r r /sklearn.preprocessing._csr_polynomial_expansionr sklearn.utils._testingrsklearn.utils.fixesrrrrmark parametrizer'r5rAr[rdrrprrrrrrrrrrrrfixturerslicerrrrr^rXfloat64r-r3r<rCrIrKrNrusqrtr[rYrrrrrxfailrrr-rrrs   =%01% =!35F GH 9I 9 QC5 NO QFQF# $&ST QC!:  JK++:z*BCD#L2Aq6* 2+  25A;/E!QK09j"9::z*BC>D;10>2&+. 0NO3P3,; AtXRXX1v1v2w&?@A  BHH* + BHHq!fq!fq"g. /  AtXRXX1v1v2wB&HIJ QhbhhAAB'@AB  BHH* + BHHq!fq!fq"g. /  (0)(0&+. 0NOIPI>$4,Aq6*#"+#"L&+. 0NO?334P3l025A;/9j"9:L%7- 8;0 - `QG,$7Aq6*L5$-8>9+8->" G GH H HI F FG I  JK ,, 5 D%tT*+ E5%4.) D$A E4! ui( 1v& taS! b!  (?.(PQNR N.*5 D%q!% E5%1+& D$ % E4# ul+ y) taV$ qc" D%tT*+ E5%4.) D$ % E4# u67 uQ~. taV$ qc" uo. |, taS! b!)2(?.(PQNR34N.IOX8 D% D% D%$ D%$ E5"**% E4$ E5"**% E4$  .9:: :$8 D% D% D%$ D%$ E5"**% E4$  .9:: :$y1F+dE];$7.92:8<2228 D%$ D%$ E5"**% E4$ .9:::"1 ".9 ::#$ :$'(@.9::  :"& .9:: :"+dE];$7.9o8:8<o8d  C*../!3 45 C*../ 01  +dE];$7.9QN:8