From 2b22df9b23d5393fbed83af9ac7c76a7c8ffc62b Mon Sep 17 00:00:00 2001 From: dantleech Date: Fri, 27 Feb 2015 14:50:14 +0000 Subject: [PATCH] Added depth mapping --- doctrine-phpcr-odm-mapping.xsd | 6 ++++ lib/Doctrine/ODM/PHPCR/.UnitOfWork.php.swl | Bin 0 -> 192512 bytes .../ODM/PHPCR/Mapping/Annotations/Depth.php | 30 ++++++++++++++++++ .../ODM/PHPCR/Mapping/ClassMetadata.php | 22 +++++++++++++ .../PHPCR/Mapping/Driver/AnnotationDriver.php | 3 ++ .../ODM/PHPCR/Mapping/Driver/XmlDriver.php | 4 +++ .../ODM/PHPCR/Mapping/Driver/YamlDriver.php | 3 ++ lib/Doctrine/ODM/PHPCR/UnitOfWork.php | 10 +++++- .../ODM/PHPCR/Functional/BasicCrudTest.php | 30 ++++++++++++++++++ .../Mapping/AnnotationMappingTest.php | 2 ++ .../Mapping/AbstractMappingDriverTest.php | 16 ++++++++++ .../Mapping/Model/DepthMappingObject.php | 19 +++++++++++ ...R.Mapping.Model.DepthMappingObject.dcm.xml | 10 ++++++ ...R.Mapping.Model.DepthMappingObject.dcm.yml | 3 ++ 14 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 lib/Doctrine/ODM/PHPCR/.UnitOfWork.php.swl create mode 100644 lib/Doctrine/ODM/PHPCR/Mapping/Annotations/Depth.php create mode 100644 tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/DepthMappingObject.php create mode 100644 tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/xml/Doctrine.Tests.ODM.PHPCR.Mapping.Model.DepthMappingObject.dcm.xml create mode 100644 tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/yml/Doctrine.Tests.ODM.PHPCR.Mapping.Model.DepthMappingObject.dcm.yml diff --git a/doctrine-phpcr-odm-mapping.xsd b/doctrine-phpcr-odm-mapping.xsd index dd8e960f4..679fdbb31 100644 --- a/doctrine-phpcr-odm-mapping.xsd +++ b/doctrine-phpcr-odm-mapping.xsd @@ -146,6 +146,7 @@ + @@ -173,6 +174,11 @@ + + + + + diff --git a/lib/Doctrine/ODM/PHPCR/.UnitOfWork.php.swl b/lib/Doctrine/ODM/PHPCR/.UnitOfWork.php.swl new file mode 100644 index 0000000000000000000000000000000000000000..07c797ded50d3f4ead3119379cdb2a643580ca63 GIT binary patch literal 192512 zcmeF433!}Wb@!))r9jyCu)Q`)Bqg?-5GddzCXOU03bt${IU(4=j5H%_u%uCEMs^eu z_PvF&Q`WELgF=C@mz`3e1WKW$>;(!mEMYHOSy~9+?|+x~z3(;}*$&J1XdeGPns>R& zx%ZxX&bjBFJAL{^W4ogJ4c({0=hl_Viy!^NsW07kTjh#IrBbUdHtO@b(fw2F%y;f{ z#_8Q3;_jntf?JLpIkKhJoawY0i}fu_b4xR=&CS}vmifl?mJxq>_sFg-doI{BJh5f( zVxzNr_Tpyi&=AkAn#uYD>l9e0K%N52o!QOzzeVNDd)t9}uZl9e0 zz&ZuiDX>m~bqcIgV4VW%6j-Og|F;zAEN!kln%dpK)$pME{-ezICinX(?t3nCf3y32 z$bJ7XbN@!}cfb4I=Q8m5+|XU$=DwehxqoAK{X+Ns51IQnb=S{z-#2p=^6CGvyM9~u zeL?2_kh|{7|B%f6o4NZ{_x-`l{hPb%4|3mqC)huH{wKQY-kj3R+`osr@ALm+=Kek1 z{b~2T!x7A^hWB{|@f@0r&mx%>6sM>l5z#B-dg6`*(8Jefj1y_wVfP54-R8 zWbWU^T|eD@|0Z+)BzOHx_r1k+XrKRG-SrvwJ)OCKH+Q|}zCV$w zo(E>Z1Ho;;SJA8937!Ndz-_??(bYZx-U^-vt^_qO3T_L2gs%7r@Cxu$um~o>1n38+ zfQ{fpa8vLubk}ErE5R7J1Naj9@|(cpzy;tY-~{kv1ot0;&w+P=mx4!wM}foOpFfuCSQ_%Zkn_&oRocpZ2x_`l$Ma9bc-#x=Che*(4B=harLeIh|D@jcbcu0=$xq9YE@ST2G26jMW=3Y-_f~;tF36ialzPs zQN7h}G#CB1dwFcJQ*X^yXX^Vd^)F4esxyb8!}jrL&Slb^jXHDn__8lUJ33O2W?FR$ zwkc{X*6NqlYti&d)LxoD(42lmeWr6@uG*e6X_wbztkzzw7N&|N$uw$EqtRK}Rb4uk zWNHh%y|_F-Ura~bS`68DRTrxV>#cNIW}1ubPBb~SeQNZ;$mrDe;R{AbNbNp0sqpT^ z=&s!tnVVSYzWsc2^WOQJf1;poxq6k9g5DYw%W~3rxBfP zeSe0g-Gy`K8;zx*nYp4j4>xMjdCN0%3)RI%y~ywK$Iol2kPm7s9*oYO*5Boi?p!`p zZATBP&e88C7aE&RuFYJN5dJdc8B$Y#q!OX-~C1Q=N}4sL#*VX{&mJVl6gi zstf0u{|l>eVY5|hMCUaR9;8go=eOfF<>SLaE4|75)_eh@*;_@cXZ zR;8k6E#KJNY0U2*Z`SHiZmHfnD|>5CwKG?8YwzB%k^C*CHMK$s#+#FL5dU-ZvYGl) zhZ2Q3jCJY@F=JH~#@B!uC^?|*M?d7GVW~)=LP1Ki~?S@$9ZYok$UWI8U&lTQQ zfn&BA7Iseyy0$tis$6(INiXvnwWAnKXljTGgE2j1KYnwLX~T;b+w-QV`-8tHJG@sv zxDsAdvDz0`TMNF8R!MGGgZ5uM7^Ir1ZPEM9=6rjkvP&-`2U&UZ~P!@#XRt z4>P6i-_<-^AJt#v*k0vXy2IWj2-@=tJCQ8Z#%*fVJfvQm9tFeAg$3jl!+%Wa^;fnO z?xEr4{5(9B5#8RO{GBPWdzN8(*$Tav|4SZ_=%cdD)c2d()5FY^Uq%X_aPGaGjoJFl z%FKKzO-kR~y*NByueMgnF}Ph>tS;2sOGt7BLj}@00paXmhN)#|B+Z*cnn9|IwW!hd z(@HIZ`_@}V{tITCp=bw^#zM1INAR0%w&+>Ve^b=1*OkT;l4I0v&UTJec|sBpG;M2M zI^3M6>sOInxeCXdUN#LEEx;TkJ0dcyNS16MGb~r<+oYxhckhU%E*P7PCU@_cx_JA< z=%#4&qS5haY)7`#DF43jQy~7toBinZ&SeeQVjExWP z+&eNhettAQdj8I_^GC;rN2A>n(e9}WMkg*NrNL zPL7%yUNE|Q!ep^?Y`e{GQ*`kKqe@0^4(}eHn%F)(wF$X!Vr+OS3LYc7sofJ(N@isH z)b>rvf6v739b;3IXX)?r_LBeT2?{_fo)lgeUpbmF41;ZgG23Bgo1 z(%htkCijdEk8R%xfgduuYtPQ@6PK9sQJ=}t2k#|GZaRuiMhQ7LQR=B^e7C99?u*AM zC)pS(jB#i8#AI~ds3F46(P#&^MB0(DiBXYgY&`jEcx;4BD1ZvHJ=(KM`@o?-kcoXxqWQc=*W<$J-*xYhpA}tg6%tZ(p5&ude0>jW9MIB3KUXDH^->i z7}TOGO>C!1qlN^#Mkj_Z;HPU(Ltz@lGzCRgfi`ZZRVFu@TdKk6L-tIlrKnIoO;ybG zwiJ0%J(=XxU>8yCk?6cj(q*U3caDrgJ2iGlOoY11*$>>uRr}g z`u%mpvmEhsv5^yfq0PX@l!+ZY8qk`+-`2l~v- zajZ|9BKx;rhvfanY&1}q28)8R{Vzyja4>pgMH$=wmzJkl+K6VC7maNXqmV3x=g&8% ztMmEX%@tWHeK|}@;d1CwwN+h+vd_84qI2!-q(bh7zdzM<1&FHAK~o0(h6d3Q7NDBT zooHDWbz>)sE9Z=xSf2RAE1;$HUc`#OdE3Ey$1f%f^etF3_r89N*3Fr5)+gKjmkw^; z)~YXHp4Fv3OXo&deby>XEiwQp{hef~PCrs&|%Ki$Nh03aIuo zIE;j)9*oX8hZ58;V+|4!%~!SU#Z8rP%a+Kc%EIgXN=argI%S)abt z2yTHxMVkduj?bzh=_(jlz2 zJ5?67S%M7;X$ollMnY<2+T^?y?{i{WCspt0oNczfR9{=EE-ja@j&1cMhkboBa?sek zO-tIB?lU7o9V2OCPnuM1!-KfPW&ElC*&?Vs_ zwfcN@1zvJcP9(%fvl`)I{Yd1wC=M0)vP3g;jrkgV6xUvyQKGr(Vf-KJ{I(9YwNzbH zued&@f4f0aKQiV9cF0rp_?1zeGCEya7yPHV;}^3Py>n$WBZYs!usIyZ(oRJ1)sS=e zO!VzIoAFx0HORa#Q$aGJ!2MeFKZUk9=*71)9Y85{a2Lr;W4c^ilhxWT%^U&*rvy>QxT`AI1Mq?y2>%WSLOp3BnK37X9|W%i&je2a_XeB5*U;}@2F8H)1pEg5UV8%G16~SV0v-mo zfs?@Z(Cxnq{v9lWv%zmD$2Y*|z-Pgm!6H}yX91P-mz4Jx((S?3;3eP?m;g5bKSZzp zFYxc+&%j0C{@@gF8}Max{l|g}!P(#}pnU?j0iVYf@+fd6(4K%3z_s}Q|1)?8cstO( zfCqxjU=#QO`vBew{sz1Rycj$f{01NYZvgEL_$-(O`@udi3~mm-C*OYXpWwaVIbaYB zfSZEBi!YAcS18OyR8d>SsBxdZg`8X3xVrGAUfK*5QtxUILYhpRfWLx z3zhI^kCS^kQ&g9wR-Hw#dNkW;wP}@VtroHS1mEu?bEqY=#ClFEeOB>GBnYSGSv|pR zuo&p8&UEnOE|czMBZ5U}hOsMO&N`H;P_I&th(JBqjv>GF8M94p!6_`8qDL&VNw0mV zvBVl(l|52aM=$t~Q*)xV={ecz1=MgxGfNJZ@#-y8!`TT>85wAQiQA#sPLIKHUjoNVcaUbU81oUKI@BKoD#~tF?H~&Gl0%D7CY^I z{r(0ku(E;Xu0~t^3wHJo8qpbEa!J|;(+T=(Bo}N*6`7n;m`lZ7PbU*!B%Q!s@yLqW zJiEA#^uN0`Y_{@_cx$h-thm*E)2wg>?KX~1v6WAVJ7`i3m)o5=HQBn0_x!n?xmNQ? z+iot5_aV7g}V9uvA1T(lPcOQj%#+& z(Qjr+sS|aYwy8ETx)?~EsM=u@3;>@4(7l^!6o1n@J;mjtH3PS0DglG|84Ls@GqbV zZU_DvJ^mx;>aPb!zzxCQqN6_wTncUpeu_T+W$+*172qOp3Xpz&IXDO03)}*n2t>1& zfhQ(w>#P~n#?H4Go~>Ki$$!a# zsoe+kU7EX}geE(T=6!v$oYYYhuQf{z#wc8{YN5K9H(U7~y=RzjBvZ86+#R!7T(C?F z>|zOu;06POo1)W^MY1x8lJK9dc2WOOpQ!{?P0wQfcKD6dRwbB3^$^U>bvncfwjxH& z`C1%zVus(wPCnm6l#8Eak6_8iw3l`$#%o`Nd&;9LuJ9ALo71fbc|o$|=zX*O7u|EH7VK+bH+ALniCqUg&{?T(+{K)g<6RjRlIhZyDCdV8{t{ z+1g}Yq1OjW&Fb9GWLrY40^#51Ufykr?ZW;&(SF0R@Xxh!!rkL+thJ)2FN3~)JBnPU z|8Cyq`U0l#gd?W;aWcQSSK`*%WxXY>6G8lXHe;!XM9F9%T3#;ZplCPssLg60i|g@L z@6yvb59mG7W87Bg27w5}NyAPhQywFK1T73X14Q zznfwlxopH7$kU2f*8@(FrnPD3+OHtX-vSxZ(+;Z%xOJm_^ei#kY6tO)>3+n73}NF$F# z%gZR>n2qL41PjDRS*pB%nfw(LgcrpGVwtg>W^~M%i>h9|HiGtDHk#AjDtszU0K-@l zk}wHcXRty`D)l*FUI;uEAcxlf?~A(nN~iz(`0cMi-+wlE7T5;9fv*2`@G9^^@Rwi` zoCMy6&i^;yb?Evp1J4D|0g3~-3)~re7G3`{;4i>~z>UDq(e1wvz6Z3{|2*(8a3MGs zJP@1&zJZ?qHgGxE0JOgU5%65F3=V+P!57f;{{}o6{3$pWC{Fw{z(wFpa2KF8{U4$K ze+^s%{v2!pzrY6Y9q?7~6`=L}CxSbGYq0~o4_pNv1{BY46F3c=2o$sL`QQ;?KbQay z26qKtfVQIV)4`vM&Ly9uDb>AgTQ*ybgN^V;czv-tuYRQ+TH<*5Zb3f~mPL&A-#XRH0=8 zm*Hn=a|^|_%pfi0#09U$W2KZzVMg#^le^&)nOs%rzC-o;lC4^*W-5KYKEcxzLo7HU zp?Sl2RGD;xrcE_rSh#3|yiSAi70lZCLMWrv3ZiFBF_OeLZ<{eKSR2SO_so+qXTyXa z%cpGbT1i4D8G$oNJNHHlfjN0PD~+T}A6TAM>_m1q>1QN$<4l@loNBW)snWlca;7&r znbqoTZbG`WsEZUmD6P{-AO{ZBR}L7*VK2dN-j+(z_rP|J>`YCVhL>50GRsZ&Ef##u zz$JAplyv0HE5$?0CslV7a`Q?(R^8JRP`={%Dp>)630&aF8*`%RQc^MsI#^gr|FlXJh$CxYrsdS^-)w?twa8q)7X0Bdao+siV^MA`rAXFfhdJA9kwg@{NuSIm}YqZDf zN7ghM#NyIB!GrPc0l*l9fWQ)S6kW=<?hQ^f zBTqXIvH&hC84;bC5iw?&X>77C=N&hJI%T*G9phBeeJcG+{jPLHqJN4BaLmLZY%DA+ zcjV|F4fGE=0vMS(BY3%D1jenQej|eMR$Sb8cS-88!J%jm0T(d>x?rPWsOPO))jU!t z?RPLUZ;kqg2n9U5bt}=Xr<$x_rCP!zhQ^+)p0ARx=j}y=-<+hxeNxx zP6G1^?im}mn4g;UH?lywF}@jGPcted&XCp6)V_Xsutc*g39xuS(_D~Sz{V|GW}Czx zXl=AUQS=D2!=o9s2taKN2Se$KE6sf6b=CI$u_Utb)~yYU&j+jX#u^&37uU7D6_hcj zis~_FBmI97{rr;L|oH0}TY6nGJM3}}Hr1v;1Nv*`R+f+ko5cLSeB|JPXnTfu*l zmiGCZG)r{d^~>uNSf{``1=cCBPJwj_tW#i}0_zl5r@%S|jspdx9{EpRc`DYEyX@Cb zTai%{jT=Q?_md0P{0_5@ws{){DzmDTQcBH>8Esw#wJD;BI{n(4hH|c*sn{vGyRjdy zue`n!bEQ)QlTsGgwv(G#D}y6jYW*5BXE(aZ;*@$mFzu*l1#QzUJtb#tB0fCAh%>#W zh)nRAeA}Rx`VVnhR9>G^%yMxSLhqQHA zwvG*5Ns=-`7L%aZ@y;aedPg@J71Ssv}jh2RBP<>M*r9Ob2nyyV)1iT$Q3Ty%&W{v-~;H5x&`!5B3K-tXzI^S-wJnF9UxDw0Hmh;5XFwjo?|J1%^RCxIGXpgkP|(|8wvmpndx% zfd7V8KLsxb4+a0jdj3CvgWwYI5MVxPUjHfR>9!|ltYO_oQ)(@1oeL#iH0xZb;`^Dt zkC_YQJ8J<$RZebUp`yRDAMXyfub(LehRHS%9c|WsX+EfsUQNuEm267pwzq}n-;UqR zPlxOrV6(!QUjUd;LDIel1G(IMxi#5jRwlv$n4V#BbL>Kcqb%e6ocln=Ss^>Y_D*)U zRN_dhZ7+Tz?7uWuAwxd5R8@S_G>}p;vdg~y#B(!GZIfE|1-G+u<#*7yF^v;{l7co( z7g$XjU(rc!q0@Mpwr2Ozc~tDubc3hKpfnQUq|o`!cdNoSD;QqLE84B1S(}AFj%38C zV>mo{F4vU2A&*6gET(cQdemXaMZS5W0kcDf4IXoBOc`Vcvw3=UeuZtBI*T=zrZ4re z4F*eVmjBAfK`Q6`Kv;E*4?7_(=mkzxG`pj{Jk82S+`hAod6p#Uvf(wk;g4{VQN_*9OKEn_))Gu73@m2ssJJVyb9{HMv{R|Sm+Jg#E zQUC>4P$YG8aHT0h&#k-1ysDjfzAf|o35-RXPkk=U-!L(SJ zYPqnksZyGC>9~(MIz`)}(|e&pT)REuAcY%bE?^T%wKX#*mjZD|>ZjcJ@*7>OhXZ3c zRbX}CJe$$g%!~BH;@yX(PO0Td>rUdaP_{Qcx0^B=itL^_&&BvT6bmPd@=DVaxUSP~ zIF_4$@}W0Kd#JyFhnaHP(0m-jSF%xlm0gE!A*T6O43*fEbnP34ZCcy2%Ey35&{}ucH zjFE5{fx)A6c$$%G zm35SwoZ3D$dSGO9YWwg7qa#}@zIOh*#9h|$A`D<7&SYqY=zv@&b?B^oux!$7x#z6c zkphP49K`LcIESk4zGw~QW=@{kJ+gaiG;AE^6nc5)kPMh3 zR+p`5(>14@G}7~NE?-xxwbIKq9Nv@3{OTJX9^ws=!O_*L5nz1u;-nC5jy^GwyW0w3 z5b|zfGjl~kU@Qb=8qODk4C7AV9;Ws>DtyxUnOfP$I-3?&<8Xt6-RrU%$0?-;OD_Xu zxVk81%~33>`pK9BrBgp+t5goc3^4K;rUL<^_2hEbU6wMivmQb>`=rWuo{Q0*+) z^A*>#&(+=eD`$7Dq{)!==~Y>sNjjBG$_A|-+>EM+<)hrH6IQ#8e{?k8Y%aB<0d=4x zhMf+Mw$fue@geNNxjC*)y0}@l$%qg1kV>4a7bF?!wm$uF7=ySC@y^6^l^uixhOb3u zpWNQopSFx79V8POqrHS(r8AqDBt)|fjrIYXWKa&@w2!Q)5WIF+10X)UsMhq|*>_|= z05(OZ_*N_)l1_vjw7ol_k(bZ9r0f$8I;g)ys;Q00uH2b3mpq%y7TU)!+G1*}$WAmo zrz=^qB-TK8+dt)Lppm2v$Mht2A&EsK^O1Uy;{eiH7V9$#OVV2D^$;b?a6EMb$8En= z&WTQbRnRD6W-RJdCBFdZY=t(ee`X;tpk~f+=tWsMEZe2TWRXr?#8M(cW_0sVz2l_k zSZSmenBs&&Ui@0p{G?G7IKGc~1{{+Wzo5tT(VU+@kv{3b1Fqj@3dOImxML)xj zIZ$isR-|$pJ}jVkK{~c(l`sL9uW`D~o}9ILo2^bV0R1@gDadi!K9kHgB}u_NCYPt% zGaNb(Q(htH_=4Zn#cAjA`7N$S!ecc0Q@d|^=w`{=u+rut4*vu?I(X1*NUlewsBNd7 zyS)KwD&LP7B0-<&ZKFsj3+iPv#BgY&bUm?bv==>Vn>J<$*e)gRxQ`opnP(i+@XvUf znx_g5P4oS<*-LfoP%0M5PlT#@zVs+RBa{lS2UHlEzx7zc;5`wF$dZ>|qT zI}~`6xwYzo#s!@~J!GZ1%tkb8)Uh7?7?w9lptoB{j5Rox;DeWkN~gOCt&=a*<0wS~ zxe2deyxAT0+TCjRhO{{{h4TSC1w12RxLMYwlR*+jGnfnr4JX%{JY2G+Wst27p1R3U zNb|wc`I~(t;oQRC67oE0#H8a$d)oS;0T?vbQK&nr(gs(jHSEwbY%yVAYmo)z|9=~l zOs!o@|9_BEINyuz|90>;pg4f90#5)B0}lXafNx;~xCT55jDhRW{l5-A3qAv$3Toi) z;N$4~iV5&3^!(R?M}To~fAGiPU(oR{0jGi+fcK-*zY_cfcm_BJ`~uzm8t_j*I{i!0 z)t?M51d8APJ@oQVg6D&WfUls7zXDta&IGpuzeEpLjQ$6KGr(QJO~L=7hyMtC7kmf2 z7(5Rwfs=srbH(Pr6euSDhrsheYRx}X)`P*F`tzvRgHOS$4Jj*Yo@w~UV|mv;UobQK zC;PX1ldswAiu$r*XB+vWR9Ss;#zoIvF|{V*uvVw+YlcA~lj%FdHGEE`gDuB9{2OLa z1VXc`OqR76c3|(B?M*V=1{zB{iFNpGy~3V#Zop)^nHaGrOFD z-k3ehML$#8q8EMECDZU4wcA)Z7|hE5X%?9NCCcZolwa+BM|a~{*URu;C2-M5ebXRE zCi=KuEczJQS#dMps+k1s>0PTdZ#sRQH5Mk8gCT=h@9aIVUb~S1L z%?pI_!1iDRs}4nb5owHwrkAT$-6p7JG!SQ^MT)^>(fud{9$!~|`^L3~1y5ra!_m_Z z)!!dPmt_@pmw;H2bl|l8woJyHeC8US{ySyK)#*L1d6ZOi4vK*+3q@h~<*11mU zfGHI^R7~F?y|vEu!P3$G2hdPO3_@$iy|4$4JP5eMh>b8Vy=P5KA}=g@nX;SIsOC8O zMnrhbG8F~ITr*EmhZqhm97(KZB9vxAF3QrJ54LF7gU?t>u*B3X|B6diEN_~5TB1Rj zeX$~P`A@!A7SDC2w+B8zPSPYM*ePk>v#nc)w@(gl9~nKcXLMq6Y;r0$ApE+tR8lA7 zx|M3Is7dM1s`xU-^Q38}0}FNHm&fiiv4G-4Yq@#2RLw2(Cv0!Rw3kUu z;$-4GW?*A4vt`*K;H%?hSX;l?n$^uxl^DTO9n96#C1k$JZCV-Kpu9T1d>FQ*|D&E) z{@v;S^G=8T7W(~Xz^B1qf~Nt+0k|Bj0L2107swWH51{=4-^B)?IDzsLSOhg7e*v8n zpfdu`06H(=$Kb=@YVa%|KZ3(x3fu$S1Sp2UYn;tso^PEK_@Cgb;KkqoxCA@|+!UMu zK9Ai%=LWtUJOxaHuV6QL2e=P76$}FT2)qZp8SDkS!8nM(N#Htc37-HT1^)z|2mS)o zzyrZ)U<0@T_#^N!Yz=P)&jb$z!{F}V+t?f43|Qqvkp`E09%<}qm zA4z#J(0|e)Jkz}7sGK2saAr`;ln5)erX7XJT1ZMRsp!?DkZyDoy%caty`zu6M6Io$ z?8ccZO3AW*wmgGb8)JTmhMm%!2;<~(KU87q?beJjdtoy)L7dzVdjwK2{*$_z8n^}V zgd2oeW$UFkjJ)feL%Y6h_+CZt=#$P@SB{;9n6myhct|frwauCskOEh}R{c1aH0Kd_ z+?~SKwCG*h(QUQk8D-UOS~e1Lix53{AZABVz@y`S9hS@vn{4c}0br#Pjrt`*9K)^0EP;;5)x}ToXr^J!8IM3rbhgD4W{CAW-kjJCDtAmBJOb{+F z$Ku^NeXfr-YUkG%*^_~xnJHZs5O&VRRZ4fk@>l59flukyt#-3LYyG4bw5Va=&I8f% z?}F@OnYCnA#c~hSQ;=h}n*3UMNuE z)3izdiugEcG}H}u9ocly7N|NnRB^KS)S&;KR5 z``3VC0DJ;m4(<#dhps*k4uKQFzo4r>7TgYe5}o`VK>q#D1h)e3MJIm)cqRBh;AP`ghUA zuL4g4ZBPXd2e$&!&))>D0E6IW;JfJK?*lIfj|Fuw0UiwGC-7SEQt%RR5S#%{2R}g< ze;v?S0P+(!6Z`^gyB?UL*1ojVa$g^(2l`H?QA+{8^!{aM25VI zPfFizJh)DuECs=KX5fL=Ez^gYEjBuuWb`onCKo+9h;f<}lJQc}TmECqCIMAP!S-oF ztPQKU{!&Vqj^A>&P`%RCI$H5>=sQ1z9SJ!<&0uyL6y{&)D@XZHJ<{es1PmXc`uZpqEUqLn-wD;~uKvGWSM zh;z4#2>`iG2VnPP(kJ~4rUT-VtNDS1hbN|aoZ`*K%WAa8Zk)lhG-YMNj>*PQJN~U@r%-_qs6cLB@Z|FP8|M#DZR0?$l#0VR$o+9sMbVJJ~Lx!7QgECWi z@8@D?-F7Rct>a}X(|dy6k-0tHY!dB!5!<=q>Su0x0hpqf+%Yp==AK&^i)mnPAH9(5 zNF2MV40{?o-WL)xoGUX-$o6~*r07r2^8|*<)r!MLY=a+o1#9C zC7)A;jYHN@4!{yi9r7U!LT`!DRi~n zK}kxE8r=oi2_LbfK*~yzvNZ`Ts+cX=@M{9)1s%oMOyjqbB`CXlH}R2jBC2D`P)W8{ z|4RpKx%}K$G;EnUVP1L8^4Yfb4hP=Pr5l93h1)0#!7QHdg!wC!j4WHtBT>%2W&#Gt z(th5`_IA5*aB%@WKi4%)rVJ%3b<}c)0VxCZPzf0q)aMyaTel*6>@ne+bTQZ==Ldnr zCX+7mmpNq8nvlngkxdEuPpv*%<=p5bVuQbth$iJe6Wa-Y@9zjK02{|YWKu}sY~{Z9@suPId=Z|=m@>VHfRAeD^=!IK-(!2M&Z3Mjr}#@ zD!wj8$|;e`O@Zl9g%VlFmQ1AVF|56v2FAsfGdcQ(^vUEiw`CoZ>DJYDtTx0sPD3UD zm~6-ScZ!K$d{vb!pr5b1z9p40Z0p9@TM6%E|F(tAn-Ih2;&QL@m}7G8#9o;x%EE5? z)MNUTr)M$wvhFK!ZbQpfa-lCm1fhi9!?Z&h)(tAi8vjtay+0-uCIWaC~>J2G; z#{0wcd9#-;v`PC8l6of2A>Z`2uZ9W64;Sd%vcu~9P*shvcXL$^a0}>xv%FiLXe=VV zFSxBSi#8}YOl&Bx>M2Ppn8d6MulvS=jozbJoTf_HqBfDd%bvvDTeL#O6H4DXPImkR z2~&=s>xb=-@P^fd2%Abz0>rSoSAp zn)ncjC{&W3pYP41EPt6GD(vkrLPJ?$eEBVfB3pj@!<#OPrL;>DvoxlvbzWnzm!34Mv{0yD{zrf?bI5;237vMVd z{hxuSg2#iq0mb6RF z5Pkoz!397u{IvG}T<|pT1n_vUA6x{sfZKtupMb3a{0De7csV!%CcrjuA8-e7d+<^0 z06W0h;4JVX=>0<=y1!Pm@8QFsGoRz*dTp3TY*=j*CW)!b%(UaMl@h(dcO1EnR9tZ~ zHs@ZHgAq44nOptQ8*DzU9<%`i;kxL6t$JIL2iJT?s-5fM;HEABxVfea-vSTz~P=j@>2L&?%`{k3PYU+G`EV*6LtCeHDv)_s5Pas&NVaUG55xVO`oZyTN1{7eX?V8}k& zjot|=Zt^u|a`mMRd-slwc-^|u)-QteUPeSqxUYG$NTglenPQnt?E*71I)(A7l<^j; zn`&hD_nP9Q^UjE`shi^TGj^pDn?NW(`(aGBsbT~~FvBQ)Gsr9bS~?>YJ+4?7))ygo zO!3<4k%*{mr_yHXG?nv_!(Xlw5e~>4Yu#QNiVj!j8=7S$iTfa#sjk^)_#q5+{#dN2l^ z#ok6Iw%d*>{LqRj#zLaXSgW=o&3f+Y~Lay%v?kJ>s70DZ(Y?^c1>kasX)L#y@Ry;FnE_}EjUPPWi zT4>$NWil}Ma0N1RhQr)bv-8XCIi7Ky;8b5u*9xhK#+zVDEfZuHUgU)mMU`}8O?skO z7Q6~hJt`*=pI!u{UahCbR?Y@!Uv+C_u)3_HP1Mz9>Jtb!O?KAF85^!Iv#Bpj z5o58;%~h#vxd=iOyqo4)Y5{$0D-0jyYLRj($jZzke;|uRX<{9nnI~>BM+?Wsvf*n( zha9qX>TFCW`d*w+#WYS}$+4^{Tqq(1GwjSe=7^ryW)X7}7f?34PNdO#^vgtK{JR|H zhLaxc+DJ^S%s|)r{{Xt@E2M+6{{IlChyEkF{s)2f{*Qod;2a=dfZKwfq3{1Uct3bI zco!H3=K%QudGv!0_*_if}4O3p!>fK zXg~j7f){`e*abF#UtkCL0r(cU7CZ?&2J8i=gP&ppke%S$vIT&*f+cWoa0ZZ{z*E5p zxFL{D;CbK)KzsP*E6@i{1lr3lpMhrsogug#+#UQqc7R#%33U8-fp>z3fbXK?`#t-Q z=I_(M9e{Lx(fa@PsPn5i%#g_Zhb(6P&sa0fB@^Gtn2Gd=SXXgUbi>Wt(7DFkdPS&&+jk6^64Fp_@5<}$8%airYj!*Z#WCK_>BTmu+*)Z( z-KVwCSgiZ1r=6wU=uHwRBtf=zzR<~QX@24J${GAJy~v;R5%eN@j=LIZLAs;keib{9 zl}!^k&o8bhI#D83C*6eiSuRZTWR!?mwtX1hT$@H^SUEyyRRZsoF=i5h*VHc~%5YSh z-i+R}SR)Gd5-Fe{@$!(2C^{0*c2-~F>E({Grt&hYP%8dPqVtldjSfxuSZ7^k3CRob z9R4?t(j{jM64jy?hAkqeVuWQ;F;cR;r0eDshh#Q#^F^wUXPC8btC&+Kjb9|b2s||S|N|I%p+!mq}phYE-aB~Z1BkCD?&Fg z_g&7O@=}wNZLOpiWrY=@x^0Nnik^J+c8yM)Kbnpyz9Fb)yyS}|&{+!@TfufL)#H&B z{hvFu!|LL7(}>9%DxRAlXr{D+GH82g(mKgs$|3zrSDcuXH$Ji$eVGKL+%#j}QjE{= zjQY4lMyN9H7EIdoH4;sRtnqQTr#9@-9cy(D6-g!`d3+@8rQG#d(=-t{c@!lT+)m22 z7ItEbWdARmf=r3K)65UiOaYJE)Rc(nN7cWx<3vqa-UAHFNE%I*&?UQDC9bLK_9dOa z)-?To5>wQCJpa>85N2Ql$rvy_&ZoI4+CRY=D#)BHMf!)ulmrt9A zv@punp>1A=s`w7<@^^d(O6ti~&b*TTKZ%ZM_NJr%pYQblSEA$pIgk&4_WoZBz6st5 z>Yxv3t^eWRLNEqy1wMvu|0?i2@MQ2LunX)2CxG{(*Z(;<6MP*V{uAIzuo>J6{2IOe zSKx!-3UF8Oadh=R2Q{z({13YNr@&u>E5KdAf1{&+0VwwWd0-Q`2L1fiK>GTf!41HN z(ABk`ueJPpfS;qQe;mkWZ;<1-Li(Df;?bfavtJHR$e+oV|ScW(>cx zGii1p`)88@#W1xa#w>q3hsuD#2Yt)GoG=%=Hw`;i+wDz@-3^PQnfescJ+JGGM@h|@ zl?CNcYWX=XlZW@X8Zq15UBz~@<3HTVCmO_cE;)8n>2~LXK@ugURT^DxnJlbbqN2ac zKAtA&?b?a>Ui4n@jz7w}QuLg^mQ)6o+xg`ktKoc4}?c z5t0qEU`0?r*(>NXE9?pDG=9g)T^Adn`yh1UNcV@5Jk+%$S*_{}?nRDO5;V+t$6tvgy;wq=_6`BN{ zEztEvg5%&NY{S!pfw_F`irJpF5H}W=3wBiKJ?t!p>UEi?>d}1la{Qp;Wp>?O8tUuX;S#udx%caIz21XdEy$dU)@8|e)rpxmx#wb-NvomfWlj&IR`Ys$gc z!k(DeL>+peF>@fA(Ghd;mE2uf$*Dvoq-VYt=C7C>Tu&qUbg0%aF+T!|yupGpl$lCQ zKEZRrn9A7KD`Bqw@8W{%ZV!u28~v1Fy1CsqhvC?0p^5n!r>#b<>l%yW0fA4K+4h&= zG$p&qvK_?NjE>T7!0XMpcLa)ig4r6Ov1tmO7|8w0`X+%f>kMek)$~noXBCiMIlg9n2< z0>$^cA2`wJ`fo?azYLrMP6KxbcLNphVRZd>f_H$&gG<0}Fb+-zI{)w4;52YY@EUaf zmjJEXKMRZj`S_m(P6mD8Zr~bh0bc~~0M7;uFapj7U%(!q{r)-&@GS6S>;az#^67sR z_!ICm==Ub@C?HxM0@;smI{#hL3H|9H@O}5^=55~Co>=94BKoGo?KReTqI@tQnH}Sq zKProp~xXm${m_NBon{(+@!?JA=wQ#;leRG6xaU zFa6qSs~`%Mw=@TZ4kVZY)w<9G8@vraF0f6f`*8YK#0PUi{jjNc`ZP*YmDK*=)GkQC@6?lkd{1 zwX`Wm7NaZqWo+&CJW`*ZPjXUMNav<2uC7i(9>;;)3NNcu+r5&iO>rLiTushWE6Nua zjU*S4RIlih*t3WcXvHk_Bjd;*$#5W1TvJQP_GSBjad~ua6*F&Hne?if+$?_eYL06x z`m@Fo1CTih%rVe`ek*(RZ;JZanxRd1k|%?oHr#bhSF|YPzs*yFrM36HdoAm3rs8yo zRSlC#>-5{51ncI;a3swabZB)ReY)Jz?Ox1{a1FC$qHVv<#HMh8tJ?YkzIr{F`^FX) zmODBF-PrxKW|T;LzaO@L<1}taw!WezmH4;WWi8oR{of&j8t4fb*Hp`7~Q`KE(P}nTKoSz_!saI@L}*iumDDY{QhqYuEP%SdGJZ_Ht-an zGXfq9R=@+n{lQ(p|6(Kf33w-X3wR2c0cU`Ia0>V__JSXQt3V6`z&3CWPz*us4N%;GaiG|N+7F=EfnNa606V~q!TYfvJOjw5U>N9ZzyHF9 z@Q>gb;4$DZSOQIO5XjD;JpwlZ*J4Nb3V0fL0+6ji@dQ7L4dIPIF$EMq;FjPs*b$x! z9tSQ48-d~k+zi|lD2Ct?I0c*t)IPs1uqkA13~T!xcCWnnblh}i>uZ`5U3}kE7j`mV zGA@w%;)M!d%{hk?Ug6D`gsrtd^}icK8d0)pmqR3c@$ z`oUb9yIzjz78d|D!vF14$m&i;*(tCIC9}L1QU1TN>m2t!>btb}K-gu4xXen7r+SGS zo%7{#T`i@v78z`;?WI=}jqk4&^^s(QZ(%g*-%AQ{3yBeyuZ`>yV}0{rC>HY_@)^lxD9&AJu5ni~0KNsvoCTiXcp4y|!)-?!g{h z5%K&dPuk-)xlN4jm>8YB;P-oW6CJv<7~j=bw(u20rqU)Nx1>4QZ5 zPLy<<(cELH5O+#QpOSOh9N$=8%zMUrrj*gkbJ@9lHA$h4`^kjX97)DA)mq&P6Gje# zz4&4lavD3etRndbCQYB%^|N{A_iD?Gr=zd(T9+-3ZcZG%j158rgNxX+m7Nob?I>&R z!Ny_yRD7{YXT*5M%U8q~E$F%a5?#SLj9InO4fTxwx-DAhz;4D+ZnJ$>0Eni-eUz-0 z*o54=ek>Rew{pHoB=DB@j(OuXd*()(Gi+d6bRja3Gi=o?wR|A3c$1v7Kby_&HW39z zX46}zzn%CN;dpR_U1}9opkRq6&56>#^h!)+yAbB5*krKrS7=X&eX0W5E1lyjZKMkW z+1RJI*jaO-RIr|95c&V#52f*co&Ns_r$FlLzj<&b_%V9@SAk;wKL)hG95@K1_umiv z2^a#m1~&!&fPUWrIvY?r{{w(x0e&5P0K5n+fqR3Sf-j-ZzXUu3JOMl&oDQ}Ce=fkQ z(C04$JHSccmO#D(PXtc@r+_b`$G;1_6Fdhz6+8u84u-&uz_-xrwSVBP;BUY|ApZfy z0g&E*U+_!x`CkAZEAUGGz5;9m=K$&ZHw0frzn9McVel&OLU07sfno%l3*=*P9XkK_ zz&pXEU^jRGP%ObA@C$VQ&w`JEe+GxaGMEIn2LFH!;LYH#!4wz-YP0`2dYgdyN%-lq zTQSq^liua|nbm6e<@Fh#a6FOe@RUSZ^zRu@S^opaSj)xYmx6rlP|G;ObQ#%p@a$|7 zLC6Q`+}H0n4{(+UHV3;9(`KLGatp`RPJhPemQ>TN9J&$d64hFqr5UFby0pUT$4f`% zlpkM7JyD6NV-vPfv(BGyPFLqgnI<{|=Krl*mzwR)4h1hFDlks=yUem=%iP@FI>>1{ zen~Smv!|)TNhWN-?6Avyahd0yttwx1pj4s@q80!vV&1=A*#-@XWZVDXWJr?(c+^V%)0F^LJku8 zDJG%Py%M1k|IcV(fBbCr-LPTwiaz-Q>T2I|=Q38*IZkJ~I&&zbmG0_eEF(OXqKLhf zOf5K#saj??tG}o34gm=4^sHZnCC|mk&KJ}clDIkxjZ||g&C=qz-V%rUY~wl~)ZG0wh+$61>g72N3lx(j%l zd)r;_{xVS$aHY>@?XL5(ud;2+_-DGA)I@L@EgmOt#O=LzvAw*s)NG;6Pt+Oa4USA+ z*^TgHqKOCHxaZC=UFW!|Ynks%_>2$;Q9`W zn-e%5)jCZdz?8ul=o^ww${Q*Ba*Fj@62U{iWGndg0bSn8Ts|kWsVC?Cy;`F&sC#ZTWohT} zY}8ISE5|~tn*?(Hl1gEfPh1^DB}HH{;Xl}v;jgzVCV`AwYDWbJEHTy-s%4boc{kI z^nR`VKL}_afb0PB1GqK#KKlK~!E3-%KnHSq4$3hC>G!txEW9^z@LK; zfVYCb1+NBk;2_urZVx_&{{PS5ao_>qJLvlF1&;-aBXA8m{R_bp!5@R4p}T(zXl?(w z;9=lS;OFSuaB1gp?y8Zor8buIC_Fmvk@Ftqm`AshQh>%A(xM z^CpMHYtwoB26^S;(S$iA8-c|CE4G^U|AGuvF5|qst8p2EZy(-Xjm1nolA-A;V;-_9 zt$lv=jFO#N=`-90`X`XM+frAT=9Xq!Tb;oWR>-L=@>Y&!8?82`%gH*22z5G3?X6q3 z97HZ$o*rV3*aBIMU380ieRH$6u;obOP-Dw5QR$isn@#O6Nk&Fj0tGE%jS=3)VgodA5Hyh)g03VtR%3lp{q!SIj+AWJ zAN&(pY2awHj#Hbi2&X>=%uQ8;ffUqIO^|7*_(_t=9M`9m#z{jF zl(KInnW_ku#Ic@(vSmt~pFI8YSM+RY&uslWZ@g40O^k&7rk%!vbcKq=}R`q%pcW?R5tM^W$xPB+@ympe`8D!s?;eovg- zWACA~E|5ydH5VriyHbWu<`w^_|5nG`;5Po-R`6`ig)=TVVJKXs9+VDivF8>lmWfumudjNkl5;<% zO`Hp#q8<-FhLO7>7z4O3gjJftM>Q}ohhZ2oJ=j=H+~MgiOeVe38&@#7KyA~%=mg%% z(uR}Jjh8xe>29EGT=k)5dwH6%cVI?z8R(m4gTA?Eqj3qFrhE80&M#C zBJA82#_4Ayx?F8z>_a)He{70omlusyjV;S0+BZEYlaK-uv}y#F4}>jy#dm}Q9Lcye zVEV)X2F9{Xvq~_<;nOW??kDjvE$3p|7;&0S7?O4Md7_KcOl+L6=gpgfrF>$NF%l1> z)C!8fny$WvQ!otFJo-R!(bJIIzi4c5Y+l89>&~*{v{^}DCWxu;KkmR;L+Of=vi&g^ zz0n!KV`FffOHPkZ$C{6yOSE-#ZgEmp#ck>6!tqn42#IrD;z+7MmP4q00^y@DmCbF$CGHa$oGsQd|UB<%8tu~K%q?-v!i zJQB0ygukQ*TKX5%D`BY_LUmoBOv@RWM@tqhm9uznp{SBd!i-Mo|JwiGar*y+)BnGO zp8qtk8Qc^68+yIs{=FOB{VMP}@B}aj?g~x<*PyrmCy)=neD^aj8GnlF z|55byM}yr!asTcF6bIll=;tp2)8IznyXfbi0iOoa*KYtmjE;Uam;tAOtI*L8fqMYO z>Aw!${MX>U;5}duI0RHjc7Xc>t-nim|0i_xkASCxCxa(}M**GXcRwKi z{O_ZuD>mT2f)9hsf%N!MaC`7k==cJlH~^w)8)QFfB7M?b#?7^bdqQm}49Sf%9qf0U z_gOVZ)L?b<8*3^iN%tS@@ewRuwyM+9yo%UGgkJbyELAy8TZe@*wPLQSB23%!YwNW* zC3U0zN1)m27%;cv&q$=OY{@>v_H7DDDzB$&f>A6|!)hzwTtE$8NL3UaImQ9&V{*`%IGh)5Ewg-X-3C891F{t_}`J0tm618L@x zJcm3IWRzSFGfDT{^e@U#w&}6#crd*p|AwPKB1|d7;(76A$H1jxkM`ZRJH^l0zMH@2 z2wRtb#!lINa7}2BEgo(js<*UQsz1{E9*qcWZ)i+df|tC{NSQ=BooO|u>$S-hl3zf$ zGb-w)C|`8LyDO@-|HSP+$%19D)|RZQ(6EwBz4{%trxMAxV*ZMrEAAb!h-o#Jels=| zMHJr{>5Sy2m$M&pFI1CbVNd!VMK$RdJ7TvKc+1Uqg2bQ>ic z2x)QEOz$Z;&{@y>Pr5)>8ypOanQv0PYM4=+(Zce4r(sk`T;VXQ1&OB26+Tmam(!_O zE%fgyXN_hXXfYVjfu8H1)wgLzXziO`w$!a#O<{L%l!i5w#x+r!o1Ls-68>-BCTcln z?sG3@LLvGW{I_YGZhhHQW0%{~mFLDvr69!oZOhhlY50HLl|VoFSZm3r|Nd!_?L@l}c_@7L>^K@Pg$(yNKYrYuP%W%@sk! zN3Ul9UbbR}9Nd_|IA&F0+=>wK!>b+nlC|%f3c8Y}iX}D_$A0Od4iwaMu|&YhjRrz^R}Q{1BVK)!=pDW#FY?FOaR^#^B4?1|AQVf!6#L zH}GrN2eiijRB!;C4P-0OIe#w$XM&@RbA~cNsKtkG9jCci87F~};>iMr=s1D7l$uV%Qt0oVr}9en&HT946MvBNaF2Cc zU%1Wm0j8EUbU(3Pqtngk^tbAClQYm3n~R$db1v3$b-qlmQztKyb90SG@-x`f(d|(3 zP$dpyj?=0u>p4Zw5)RwUU3P1PR>$yDvs7j>lcBd${u8YL! z)mRacvMR^pwNmVoJU*+%F0tdZVyx5xHApIh3>W*(2-bP^Ob_y}F?jrbNxpd|n7?8u zUVoqlRGz60)Apew@+TeP zD<q{gUL?axz^dZ14PdEf!%!bnhjlC)ki;-2_t2lW;NL`K==F z-B$cnFBq1r*JO>8{xy6Y`qB*#1+=u4U#dX~tS&@ur6%_lwPBL_XzU4OT4l`g)!#U^(gt}PrTNHs=nvQb3-lD9`HBdl|b?Pc7mIOZ=uJ35Ih;wz%aNDJ^qW}L*O65qron47offU zuK`zphk{GMPtfOI3myv20G~#e*IxYy+!sCmRzNZRpARkrN5BT~0rdA*gNK1l-~;IG z?*~_cJAxlUk7okW1cpW|Ps5tY=+u6Vs9sZph*P?GB+FXHCCM-mm54Tab-v0~UH$a}^^WNXwv)UMCZZr#f6 z%BkjLhZyRf&(OkN&tXIwwzQW+-`iWa(*Mm*9Ci*9Ydo2vRGqSq`u~Q^P?L<}r<;L( zX3wpulJ}>C(XxbfeQlhSQukJ7^$k6^WB z%x=^+g-VZ-gh0JAO+%;3YT5KQjEZ%fqO?u*XAc`DDxTAgYwG<(g5%uUpC9Kb-b$`-6yjI65&p zK0I1JB5L*7DsBcz1idhI|MxK!L^42m{_IDtN1RvCnd`qE%g_TMY(eI#ty)Pz;?RO| ztNRI9zDgN`iKkq71Ft@2%HLJ$j^(!Mgj1+*FYV#CoPmyiJ8)a@26Xxn@Okw3&w&?%+k$^X zkAEh(C-?+<`~*7uCh#Hj_C4TV(bvboAA{$jt2aPD_!N5jKA^gM+tnlaQUk5_F%3wp zv-!H+o)r++`3&Ry8<1I6x#V%lyd$g;Lg%tUoGn1`wz|8Qk%@C;&xt@D-yu)0i?li@ zp`0NVJY?>r&id-oJHxzjI*-mhTy2HLk0!jjfqf`Az&Y{(Lc;_yf14@J$kX2KDbZjh zrgWcxePTTb1OCyF3X-5R#)v$Pk|_idYC{8GewOW(XlyzoOqbo{XVN|H>dHuGTVEttr_1GJ?J0F zHalA%t;sjp-mY~AQ*)nDPj%})-}olb_v*%h;pQS6KH)?}J%d8}W=A7?M@;E)q&Ds7 zt5V;Zm;o>$*vjySsf=+E;Kwws48A@xG$0}=X`a?T$@mUe<2-N#^=Ywa_XpN;hl)3}6KrboF(vI6C5(^kweGn17|#Pd^yS3M`{Kf*4xenb&3 zgijg6ZAyDY9!cNrL7fua4F^{tVyz)<$E*0pDf-U!(M)aPsn_T}cEeR5$9dw_%|T78 z^tmuErK_xbZ#UXbYSPT+qBs#F&bC+T21*{(cSI&k83~7u)Ir^-%;_q-_;Yn8w8B@Yff0U;yRj5$g&xWe)d>} zqxM!XJ+&$;B7&D&VEO%9eu=fdo|a(@A3B;P80r6~p(Ni*0UN+y zq2u2Xd>g&~LEsbU@vi}Y3$}x|q065IzJMt75m1or_O z!R>+Sbz88OkNS@PaLsyl9on1Cba)x~KC`r56TVIrRs`gvZfJ9K`QUOVBX zl0lF#>Xr?#ZFB;~o6IC>H{NCwEs$uF6rEV&#Eq=KqYj@nbx@87c*--ll9e1yhjd1) zH6?6JClwLSfAXZwU(vJ0S9Pb)oWZu5<=8xF%eu7OI#@T&!MOnVzN)Q8R(H}!KbXj0 z@H)Sz%BNyH#c6kwbV*|;MORX>q$~az2#UJy^q*q&#|i>5KZzH}jMigQMGY)ZHQTf* zRxl@-8m#R+=<=2-zhiQ(=>OF|3ESUg*AL=Yhyx{o>*8tNM6z=RkZLTOI7`P+G-}Q) z2xNhyT5r#YhdSxTXcEU^B_7ibrJIqTQM7=zAxCtHK4v#V4JnGCaMi_5gTUi+^_fG) z93W%Qe6xATM`t76yEZvEX}Yo+wR>9S^NFm*z!%z8F;Q5ctWlqJl2XOxojD__u=sAtj4w`Bc@$- zHj3~X+^WLtA<(heGgn=G33Jomy^}^y=g9*j_2vSdyK03uCM0Kn@CpQ~vWd{?tme`m z2F)pD{(*>NP@L6rrpehaL`jqZ#J6@ux%c`xW-9uO)s7McD+y-&Q_Nk_y%3!j%83~TNGHZyRLuFW;IJRRK4=c;@vKCy1!y?3E- z^c=knK53vebhw~dk!!RkXTqyt>4hinlxcS3lq`Mu5iKW1#}Osch$EV5uyB)o841_S z&wf7^bW|NiZ@ASxoY0&+b3HETnEoB~g#tCBh~&NZ)H@#SFvIK68@gCRDKlC3>g-L98N|3`(dyhS=P z`u~hml>dSC|M!8H0L1|O33h-_fmeekf(HWm1^hAi8Mc9MfiHv41MLm?SD+YyuLLt- zA5a{Ce(*DF2pzXyK>o&lZ?c7R)gTY%4L z4*_@)cnWwjxEO2%8^EWqQ@jEk0Ji||z*g~c@J#SH@K|tXa1C~ftAWn&dmK0o+zR{( z+W!E29ef%52lxzl7f`#r83Z3Ql;U7^E@CKsJJ!xCdZHk#Tzb5vf9aJH9^P$Nr8$)j zFR@iOQ?{GS1haC+4k9*7lEd;*vWqfagDc(_>32_ZI-Wv%7C%(BancQoHEfzR?Cp4N zm~`d7UQ8W!&=&^bmleY-Hz7?Counfc)UrYG>qo|F<<^4@&Q6h%+7ui{A-}8%WAnBH z2O5OKYjhff55K(5uCy}g$iCnTf@YVPft|c=EDG=}I@ee>9=`gioo)(iQ}*Y2M3IG9@UaUL}rrQ7-w>sWOzW{D>w9%pyuT z4U+0J{JbUVycNZOmWEVXS3jq)IfSzul*ew0ZH!XI9mf*HWET(hAsc;LS+OM7Y0b;B zmaqja-d938>+hqX!s%uepA0xv&t{g&B_o@ZnLnwjF>(6Z2C>}3LMBR+_L$DFW`qb~ z-obEa*Q^Ky?ssRPHz9(^xy%SBa<7dBQYgul>JI5`|Q%;vTh8n8Gi@1J>SNOuq6q?%= zYB`3?V(0_zrR*>XE$e8yXQA0t?kTkje~P~t|N^1X zLpE8FZrcHvmH1_w4$cVBJNC(=ko@yh)i^I1`nuI^`0Kv(f@6#3Y;y6`ESB)~NT3Sr zH4%8rA1zY|Ois3^tU)QzTV`50&WeGpMUD@ctb7;@Q|Wvt6|e9&*AN2Q@Be?dbWHUB zno~5dMd$wtcs+PExD1Sg`+!rxb?E(n59WYk0^ASW5quE+Uhx2=>)!-?1zrA`U?127 zeuWd+gH}Eg$@QMeZeFC3Fhkpfl8t4F>3or#P1ll(+49)^~0Jj7m zMYsO|coz6Ga53luHv@_V_`l#S;4$FQU;*3@NdNy7csY13cn+w7`+zgSN6_(~4Gx3d z;B@c<^nAq#d>?odcoq0-@K@k3K?BH#;cnoL;QQ$Rp8!{Z*MXM-#U3~V=zPHMVh4B~ z*aq$c&IBie@6ax48`%OfAN4^0iG`QL3T;lTGKIY$bm!&u#c@Q6>}IJx_n5dWu2MRC z+Pra*eS5&)moOD@fy^;*X|9pj=*AY|n~mD`)DeDUH(f*2qbf73Uw zdoL&Sng`u*stdU9Y9v0rMgmz=j^WNph<^(W0_wpF;6G@Zxh8O(xh4ny?az~#Sn zYc5su+EGkoK`-%@)pxh)>e#2Mcrq`Zdx9y-95nL>X|J*+&s(hAoRe{w@$+`3Io!j` zi!FC@rtb)e+{7EE?S1Q|c}zU$WIOC-(3!@UQq|4*C!RNLCAZJdPr1O^3UZW`js9(P zx=gL&JaXg6j8VgX85o(j3Wl_pVeB4WE<=0Ln0&308NaofSu1Xs?sQht<#KhQTbHp7 z;cdY#jDYba<`ti_HLDz5m@(5n9C(s6$uWu9EwjOSt%A0Bi$YXHq@!R_=^m{_^eMjD z{f_Qha~$>>b0R~l-d;6SMEr*On(02~)%e8Vc!7w})pSB@2y*1d0lfL6h>FsKmT$f_M$GEs*xATS4x2%y%7XXgvyPr-*Ef{n92F4Gj&Y z=X9kSjH6^|#x_g%j-57R`?Hr6WKSv|q1K{g?=u)F2>;t+@P}_C27ogy`TFTQ>0wI6 z^rw{h$3L4NjpZ|?5BhNQ7ATd)cPl56w>Y?kbA#eDL|qKd3A+H?%j6gftZlRZzaPc& zQyKmLGwApS!KGlo)Az4Jzke)v4A40M_W<8V$NwJqICu=$tKaDPIt%cvU>ney{+Zx* z;1=LSa6|BV^nKX@9t~E2_7Yr&-v2J}R`3?^TJSJ12DXE{0L2ebjKIGHmjl@b+Takl z7q}U?0Z?3lPl6W#*#hnd&H$%_0q_HK|7(G40n=a~xH-_d0DlVx!Eey@e-7RT-UuEI z?hozjp z0(S?BMX0vUUrlZF8Mi#=DD;aQJ0CU=#VKYusiwxs5t5e1yv|^KRU%0&d zzxLh(PR^^m_aD0HrUg^)NC@xBmIMY2Hw(5UYb9A=TZ&dTA(9cR-I28R?#{BslCWvP zG$#u6U;@3(m@EYTVVEB17qZ6ZamKx2n&?)`Q?gg z*m#Hhy?O3BF<)t;{xJkP|Sk;@bOv^|tl zVE~mVq6tJ=@>()C}wNH0}Ve1!2}SO0Vv;xY)LD zvWpGSvY(mHeihqvmx22!KA9HM>9Uf$g|JeeSL$<-U`>0aTbAypn2Y=Jbbj_r-Tgia zaoIUV#-YZs8tm~zjaHZjUcPDk#fjqXoG!@Z1cPfYbjnUY&^<=5bOeCL`A4Q^S!XjA zFtL&~Q4?jSj~!?ahoMu$-L3XyA94=;<@J0%zmV#lY^e>BoX z#i0qh$aQ?0$j|9vIVN@pQO`BzQ(P^509OOof$?51`oW}hHyZw0hiF0C;`^dfW4bf; zhMmM7k1NV5+CbA+T}*^!SsYx%nq|=#45AQORmFe$lw|j~+MEq@O`<%-ax<|Ldly z+S0R=L(`6?H_dUR<9da0nwoT@)G#pvzlM7YW~5PXy6MTc#htKJCx!iS?dhJ{c$Uq4 zmx|lb%5vDS`~yZGBBPfP7ZY^*=AW}kC2KKgZN(W3UR9-Dwt_LsymqlZiCiwnN0j}Q za}&(|F;C)CK;VUpX>nq8m|uQ1q|0G_$7eLSe8BUE=>fmxWe=Ewmy61$_qdI84{8SJ zbfwPOWC}`n_LE6YE>1KhW~JJzl1=I|w&LL27UrwJxkjDNl$wP+@pb^lVIdnR_XYVl z=4HrtfF3G@1DDItlwGfR76Cou$(3M?u;g~pMb@@*>J7lvt~|FJx0$dERCaOT0CT~h zhSD7!oFS)V=B-*NW&eLDqT@e%`Trs>M*bZ#{|kY10M7uw3ho7T58yO-Jop~6{ujZ! zfn@)AZ~*KFZSYW_I|1$obT5G71KtPR4SXG0|BK*Hf$seq2j_r|;7lMrzzyJ1@CQ~dI0xSa-vM6-ig$1|cr|!AcpBIQjt3gIFZI<8 z_%-8Hu1;KEL3Ab;XKQTdhMk-C5TS3wmQAAtJ#s0VB$6?S{Mqj0R(%hat2;BdwAdMg zk(%y=CFw#7K%ufsT2{@>PV5-`Di`jP`M35cA?hX;jUA5M11xNtW6oCMviz&x<9r|% zN97h^J0_Q=JCj=p*Ei37Pc?C2jMhE#q@E^FSS`(dWfqLh91Z7v)f7t{(^E0SyLNzL$lzJe%%)Yps({m#`!2f;eYjm0WcO#d)rvT-hK0=k=xowE0$aDCdmB(iR;l986R zCZhmhZ6YjpXW9CkxaBC;Nit6_5crnGZ$Hp_vl9AT{9C)nswoAxOok^*)S2CVm26z0 zVbYA~apxj5PCYn3zA)FFos^o@gbi41DNM)r!)hqtqGnXF5akWdt&+0!q?6PqwOuJY zHl4HW{7s`HieHqev})_u+o3~C3rgPbFn4)R=zOE3)NuQ^JMT?wEkZm_FD)D>^J3zX zk6zV^sQw6Y3#`BnhdIA&geW$Fuia+&0hjOEtw|rRDtvj?_mW z7ERf$&>v-|I_i~r&H5lb7l#qrWv6gtm0b~syN{DZk4ae>giubenYavF)t#T?{!W&$ zHd>-J8s%k23E5(bfc%9+%w7{ZO`H@94KeN_B6Cn>qGP&P*Fz_{1J#|Wd6YvsU?jz< z;>5f3!u=+6?T7EPnuoxjNPY*;^RvHoH0G~){s8w4 z*El!wNs~N54GxQ>x_fD-@hP9~HA%`Tqlpx0-45#)MLChiTG6U6o@M-87e zhPAD(G38$`v0tg9p5*o{T@R;47b@UlgIT>p4o!8TPZ??AFtU3z1_7B0$4Q;ake-Kx zc4q1M73{RAzYorj&#h>w65(abEYu?e7iE=gjG;tyW|iH+N&2CC3l2wlg&(9_I2wx7 z3Ki0Oz0-r1Inf8DQ{`7=p}qV(Bih=D?v|!=d`zd2k&PS1Hf|W*w8wD^_3CRM7DJM% z@4qSTf^_l!5hGh~_VWK;FaIwg>t6&e1gpVkkoR8?eha)3JPSMs=w5&yBHt?pz~2Gg z33x70yuf>byMnubpCR*q2>dm89e53RCeU30-$&km3%Cee0LFlH0lFt}6#N9)|NG$M z;BDYd;FaJdU<5n?JP6!~+^@R=bsj+X349P-1^y@42mU))2iAi7fqMd-4Y(ut06Kv8 z0_g-!20upbzX7}tya~J!JP%w9a4Q}DZSXDdVXy=w%m17)cpvx^@D^ZW;>JU>L$7ism7nyxDY#~(DdN%|RPbkY zreW0VUN5nx(job9c3Z22q@KOL(aR~U%E%idBNL`t)Ul^C4-+UEotW%e!`1lRMjxRc zL7>a^lrDSk4Q2_qPP!P}Zim=9xo+q&L+h4pNR_x~9Sse+oP4%Q(hBA2y`k?y4Olb& zg7WUXl+UxWS%iM0DVA=dzsxbTi|<{fGj=4Dm$K7(i~{D?$t^DLE_bt~Om#Xx{!q!y zD1=MP0A`N1%Qq=6fStGb)O|y7m6|ceQ}|rYR|^l7qJ=|4iL5n-)T#Hqn_^qj0g924 zDQ@A|KR%sJ*`n*yL0-NVpQ2gcRQm zw8iydSh(4sgkj^|uaK54j7-$G;a_kZQ`AuVRQ@e`9&ndnXVObZ)gD7XB1deean#P;ia0=> z`GZpnooFWYVq(bI)fkG%Kd<~~ZbWE{w4tUliX~}G^ek!$V}{X8_&>$5%C~S?<(~@& zi6h2%Pf=%8O0&z|E~LJ&_z(?#mg#aQ&1$3{HYnX`&0JzV>Xw_(zOT;wC?bL_b~Z|cddk}Z40|7VM|@1tt0(SYJPm|G{mpzm~^C%z=}vT!lP zgJ^Zw#U{7T;`&u4#$l7Nq-Q~D;ck_g@mbVKT(jcBTHy#hPd;tCObop)i*J6ayWnRM zHBUUbZ)Tz(=GmGx2zTjxAoAYJ1{S*EIOb&uLg4r}SR7GJoM9u1fp_)%G}IuDv+KBw z9(dKCmFR!;ZxxLmP1P%A)v}LKozhgWPZCmYVRVw398tuDKUL&ZNuJ}22pnRhC0A+z zJL2L5UEQhWJH0_z=SiAWJVDivb=xNcB<#}Iu?b6%fbC`v)hzbwkUEH zd4o~NO7^Kk^;x!I#4GBsZ26|?=$M}@0*+0`I1@ZayzIao?J(UILuBk;p`DL5oM4=izOy`YHGqQNbsK$G&dS?KXQeTc ztZ!Cxr1mJ*L(qudNEj))@#`zaJH;YuNd7&Iuy0+`b_2OfY^MlWsplBW!nbu z1{ewp%&u!HHw0EzuywlS;Z!Aq-Th3nLj1o=kT-Sy|2!}Me+`-ci$E~|{t;XY6btaz zK?iIGCxV|M|9=F$16&E70-gv?06#(QS3H21f;lh-9uB^Q%>NPaZm%b#{TPKe z{l}2sCD+e@Q^B3V=aAw53MkIsv%zuT&B*V61U7+(f`3PTzXm)9oCbc5-2M+hHhSGf z_&o4j@F;L2efn46I-vf24#-|w7Ws>~s2EThENd=OHTLqHyJGBG`P2HloLS*lzj~TN z!bLW~$1WS6-QTH{Q{Q`(Z_tUs+ZgLp;oR7~V%GdUa08Teb0hSNUIUzT%NDD9rvCqm zRoqVAIoPWIQht-dX2K$M=F6LW%Hsj$gYJ_UEBBOj(yk$>opHNFt8FzskbhTu7`Xs7 z#QwtrJ>1yk0~8u|;sKII%}3v+G!H)0e24W7R>Y*5MX7}SX0fvwTR{4DxIWSQ^pgbK z*zMvu*Pfm?#%I0QBgS%|NSv}wUc;3m|y)#RGxpTFN)z7LSYNg>wvvt%E?}luNvU+5@J29i{ zE=gKktWx2X6^(Zny$%__Ru!sRin4YY(IxJD1I<0ET56z=qMB~wak3soQ$MpEcx~}qDuy}-> z&VFvtY1F@l3hoT#|NlYo=iplK zd*Cu~F<1hR09PQ>zZhHwHiCaap4Z)hTfmo);a>+jKsNl9;DJEr`#*_1|65=?_*dlj zKLb0!@!)O9@UH-;0{QPh5_|#q{nbD|`ws(m1n)wA|3mQqfXl&U;6>mP@H8+A6u_!FTiDBJGeWzntrvu zwSH|^UIUBfQb+H4Y(-8!JhOv`1u07t~KXoxi*HDk1hSzd5%TKCZ{TqE7R1!T&Kz2Wfu4gZ;dCDQY`m*uG zJqA(r?PAt?YLl&}kfq*>CqpMxiAlq=i5?v*ISRG$UDaHBE!t4KY>9`=XNVZE;ktO;oyEA+(mkrN2CWV`GWZOnaiz#BO1b?qu6d^w{%Vm`;zzRdu zQmw+PKE09-p(>XRuM8DZo&7c&`#RSpNXbMP4$eS!XAu15&_Qe{{I%Gl*_v%Q8K0zV zTeq?@cWmAa)Vy4=RL{6zQq|~sgPS#CM&{~#ZgUoC2`sp6Cb+59H<^0*%Cb7mEtg>@ zovzM^r+56TXRAy+QE-e<#jeN$qJ%nlj2-ozQ3ZV+8J4SS^h0$ zn!lO{uc0R4Aw&^H#`4?PYP0`83EA|2dij6M%m3d)-v2t#JpjK06bJBr;1=Y5odtLc zP~87#0L2147byO}VgX7Aum#*5d<~iZMxgWm*MVOLvi08;$j&caz!gCD{uco01wMfM ze+{?_yaSvCzKR~;E8tDwQt&wNGjsvp2A6;tFah=go$tRl_yKx>_k-7i*MaTef#7ZE z2HpTRfhU0{g72dTxDMR;gN^ z^-g#q9*q(MbVNC;<4y2)`t{hm4V>i>^w4%Y2&eN6;jY_ERd57-)Y!lEj&ttAUQ>O6 zcb;qNKGlfs^DN?#XVlPJ%CgFdsA#65Zk0CIN_j*(&sfPEc92~szZF{2)ghf**Q2%= zG!j-_x%l=P779_`E-Ux~e^|x%t8$9h2QOx7^C@j6)yY_HflW=-oO2@;sC~|ARr3o% zOx(Sy30mrd{FRvc`iO-UP#JY~;WGL$Zu~1RP9uv}UTlvp^K+=qt7~4@D_EJEw^47F zx%TSPGF8zyHMC#9mXDT8>PR}bnom&)n}VS~!yIQiHUzI`rcbz|j zL%AH#WMFQE9Q1Cqtg-BvED3#nL0U%yvt=|umOB1E!@A)ZO?1)lJ(TgA<;=NliZGMp zk<6r=ykz4MCEa{pZw!;#+qaGJjx;wt&G*Lm`((R@L{Y_NGbn*~@MZsm2- z-$s+N@Ewhd!noSnqet9#sSj#-sVaKieqFG2VS^5kH1|L{q2AnnJJHnmQ%-i0KBG$R zdefUcWsT(60D1<}1*DEEq@XnANR*${t0kFmYY+uNi0!}8?<#IrtW18Z`m$$MS}G>I zT&xu>#u}&W53Mwo_xqhKR= zGI%)nB6@<)fUCeCfjMv?I0HNwd;?vQ3ag=9 zj=?9yt&Hqs)-E=@%;P|Fu@DuiNu#FWl9o!Es~BoC$u?-~Ysa@j4U2bGtbHD#K(_5u z)aW(s%^S`h+thA2KkJ*~ykRbN;`)xx;?g{dUkR9jZzYxt@~ysEnCndFI6Jox@=w7? z-2KWjs1c~vH5unQ#T zwA!3p?`PEjVHt0SxLsj&mL4B|8{_oNXdV;|?YMZJ;fFYy zN-ZChFhd7$7E#h>%Fz2ZKx4Xlj)-3=AwUPGSHU*$MZ27?|^2NPM?|;xl^A zS0^Mqi!=X(0d@&X#=nx%F=bTEFU!Wnv)x&7gPgpKM#IK*q4=}A82mf^attZ+D;Ni; zt+8D4Sv6?|I7YbjtUEzUcnjb0MRv%JU!&^B6=DR;84fi?qX;e(BC_Mc-H6|=P zby61;&N(r0NtV~7xmYp~#lr- zXVFALI=8waWeH!mEr6YPig3PMmv^|h4R+xNoWW>!Lboxch#$`DLGjP(*@T|d=DUt~ zBrrjpeftP^j2juQ0fZGHNV+!k-d7_OBNIv}C_qM48WR_EB_~Je+Gyv#;1kB1qwQpz zSfk;BiiKe2+CR$KQIwQzEVNq$tNuXIj_d(e7KwWX`t;@ahWFZ#SsW_ zGNiJ(RFWH?d9kC<#v@iH&}e6xxGi>b4dDtyLJQgwazo0nbE z!msorhF>>c7Csp_2zFRsWHGw8!F?E^^4Z8yPw}31xQK%N(7Mnsu7jlD-D+GXO!>Uc z9koEOP|qws&-?gsafC9P3I8=y$GX{9DY2FQ3tC+f^47KU$8YY;s>u~9T7>7 zpLg**L78*AeV}_#>^_XhBx-XiZGAEcM5tPmTzYAe;3o@kq{};XB_zmRzuYfOu z&w{suE5S~14tN|m8QdG(1$-DCz~6!;uo;{Tq#I~~_apbe5p=-Q!O36+&>aCkMCSi4 z_zw6wcq14GzXo(~V7M>fPmufn7dRhm2TugwMAp|Cg6qHwz!W$KoB>V+I#cj7wW7t~pVw}aOMjqPS|JHBjUX8)OcO%}?i| zH$Osax4SDlWG|M%Zyrf}Gj=&M#t*%=OEESA_FtXdWk23hKFoJjx>(V z*@89sd&5P>MsSE2I1ERqirN+~4aMZ-30$awvc)6G2LX-x7CjulO`X1+o-$NE_+K>d zg{W;j)4o|@3gbg9t8(T>Z~eB=?$c>fuxQgy%uYkM`F#CbjQVDxlSM3(LS@>C5l**~ zWmtWS>^1`FO+@|))#bDlQHG6UQqRy7-?%wg~O&lOt9Jc>QM!K^b3AsGK#xAtl=04a@8|L?O zFM{W;W=i&}k>_H{Soh{vLWbx43_L4vVb$vSpv1}0z~RVhnwmh-H;H+p_shkEojzH3 z8LLkUF9p?8)Wq?6lCS`hcwA2tq{6Unofz3Woq4a;x~-6{>ko&D_|@4vL8yiH``)Qc zfbRV>;#mF1AfliG@IN-wkO@uHU^-7E!{)Ek%qI12&xKP`=~d`@u*!!3(TEv|@k>WW zlq$D}HJRaadl$XEnI_?58*CF zg$0wmC&R`XT^3;}=qcC~bAKl|sRB#x(={Z)MBobv8qXe8s-$8%>!MWuiVT8J6%y-? z5LdeN87K_bIQs&jji``M#-nZgeFyrYs_I?XP9( zG+hn5ahRdyz8G~+nf|q$KZ!{!T^!)f7WQXTQ@v6?sc)2M9gzq6F^H8+G{-Zih|v6k z2Mk#=XHv*G&tioDqPqSC{W#Nrj;_Qws8`f?kLFGyuPR2>5uZBWJs4(v_`30=SnScF z!k$TQYS+=-)l#wU^rU32=Jb=@)Ynqg^R?w!*>Y%oD*x8B0IMl-ntrUNp=8PsZ>p8< z*WK1pJNKe*$^)iWo8D92`wq(fkC@#0Q`wA>|0leV_|fAD2w`Okox!TZ3UgKL58|IY$L-~r(7;5hJk z)#As2`&WNz%PR#@DOlc zaCdMVXn}VjlfMK!A3Os*9^4lk2Xz1672r3)EZ7I`4s<@?W@PYx1iuX~0Xioz2iAb^ zAd|lyC|1BL!C|lf=D~&F31BVwBJ%mGzj;WM3&Ct4N!etVmcE>^LR}_mXkD*MV+VF^<{ZEasg`G_$oTx0jm1_ss5J zvMaXi#vjG&AcZypJ9wvU0NZ$|-`0Kjgi_vKF2PbAwC>lm_jl2sqv@TuHV0u3>Iffo zF-?u}mfcT2vykToLIcmtS>K8OimjmK$rvz+U2HF*-In9MRH2@`P2@1jt98xws<=Wo zYzwFvvrfk{=>tnPyqFjAODFb#KK5VwB+Cn8Am3-V@-Y1kx7R;c`>?x=s$`&<2ztvr3KzE(LcPpkTU{&|*A zC}&S$06dI1ohf?qHIH_R>yu~tM7L9pkw;Gk;Jl#lx7RaqbMWF0yNoKEtNow!rvh3b zr|P>`E_I~NIvdTBZb2cGn-pDKxZ?Vv?iQQ~u0-v#{^wa}B#2niSu=ZqBsakzn0coD0tDy&y3!F_J} zM!$IH37<>KWGj3bdSPnQvz>u#b8fP$({^UNHd!I1CPf#{%8scMH&Y|Bc{>$m`z*-vXZk9|M06J^)??k) zt>6!UWc%}gWcs&)7lBK`8t`T0_RoUdKz{j;0E++j3;I>}`n?Cd8>pXO4(cz>8NH5# zSg-QxUN_unlY#ZwxWws5*eja|1uqeph@94y)BCoh`W2O2P3p<3)PGioNml0~m><&gdduQaU%Q*ykYf1vxL|1N$jOiGO+G!>64{ zkB+JC%lIU?FjOjADcWRPB?&V~^$$wB%G1lKmi(}0oK3mf zqg2tLU6Kc9FAbC1n@j#7UhbANvoiS5cW|c0lv|#=hGv$gab?wwZ!WaGcR{Gdu}{oH zAY6$(ZqigK`HqC+B*$rrV2%Y;D)JfVJo=d&(RB1 zobIW0gqLy`h52wVC+Nt8ctOz!y&ouA- zA!_R8FRdQUyaD9In71Nywj1=2ThXQE%yU%0aY-eOu!%+;q}vJOY*h-LB9raI9nX?b z>=6quWj$2!QY0^HqXr!{q4I;A(|DB^+U~nHI@r<2eOyk>Z!}d-G%ii@SVe6dp5nN< znvvBwQzM~C`;)0}TB@C1190|A=E}ze)ohE9vzRPOSrzi-(1Y8G(~3XBMB-1+G}oBr z^+#i&Q01$y|5A?HPeJx2?O8h$Q=4(AEvs>4Rx6x!5GvXkXAS8?CFPjIhP^P!3C{js z$uV?(o+E3JOlOj1CM2rnkz==R{|6Tuimd-# z@ExF-e=h`Uzz31}uK>>htH8IB>0bc$fvrHX{oW7$6kG}30OV&s15N^;Mz&uB>%sBh zW@P#c!A@`{cmg;HtOj4D57m#0jq-ga@%!;}jGHreBnoqk)(kO38EGgOx!c5kQBwNy zlNwh4ruVn{#S>O;N}0gGIcoOStN}W(C^Gc$T2!ZK#{=hA~@glms{7@E~H|4&U_bjy!R2 z#sFIMD@qvP5~NfiO|#UAlo@ZYPu*w?*ZF;~;!ZtTWag@bH?WC&rBNpDTx)QjC;MTCck4XOaVDn8er;d5THENRcx-{24q!^^8$6QAhmWI=2q1tYP$ESSQLcR2! z=B%a8=Im}3FD^9;rm-L>V~S)HGjCiueLKs|U=?+wOR8GE9a>WQvb@4CTUM@=ftQsP za62z6SKp&qR{4|vwadyvM;-HYO;gqKQ%rTqoc5t30YHGX8$oUASTF5jf z-WwI{jBL``7&pm6+QCS7NPRm}?oh-L6YlDRM>N5frEZq{F-;gZlDBuy9bLDDr~35S zvOR==fr+O_7p48xCG!PdK=P<2(R2^5EI?U$6p|e|g!FBh;WGR}WwS4y?bCQwtDvgL z@tdVft#BqZC$cUT-pco1@IR5@9K25ABU$+OkS;KvdGL?m!6+^A1-Tx(6}m4GrqoZ1 zUJcw&O&v4vwVmvq$r1Tb2b4*wa7-jx4tV&ug=Vsrpu@iB9|Dai#pnC;rNq@ zp?CvXk2mh$l?u3tm$-AyjY6AQRB>>z9Q;{!e*LTMKqG-L;9v_3)OeE zYBwrjvoQ>s*s|;kYFm(u5zcPw#dw*qf@)a0cMJ+rEJ~N?9L7>aY*orE40Z{r>k*3* z>HoB^i?(a^$^L&oMAL73`G3xfsUJhue-F4Ebipa$A>baM1%86e|6}l7$^PJ7;I%;a z1D*z+1pW#6|0Ce9fzAdf9^hla56}U~FW?ZE2GR-Wod4I+0el2p2mTbi1H2u)30wyD zgJ*$L!Gpnl!Kcv=+z5UHJQRE#9l^(e?g@Aqcq)+I;88&515N-pp)YtHxC}f890sR> zo1`xQH-I;SOTe?i9M}Zz0X~He;bY+M!3V(W!1>^j;2+Q@+z74);jF+R{+z9fl7I4>pUi?@TNy5>h^C+!_HsxZxgyp_a-%GZJ#N~;V_llGodp9X}R{<7P5JwLiFl&cH`L2Ys3jrKWPz;F3fiv zq1l;MaXoRKs)*zXQI3Bz6^+$JE58CS7iXv0HRMfi zTnl_+d6scxWaEahjT=Tc?b*3w!?|N;Z`iqY+qrSA_F#p28}dT=KE^F1+SMS=ojQAj zwulg%eR&|`J4NqZX0Au7Tx}c+`+3>blnr#~;Qul*&+)s;>boteyyX8!B9iK^I@$j( z;!Q94|4aVY9RPd5Zty5@U!Zt@x(7h_0KOSq0OSX70(da^9y0zPf!Bl6!4tqbuogTT zd;?iu@c{k^{2n+LDE9wfAkV)Q`~esP4*-hy|Ch-1hrv8}5V$w^E9CfVfMWSc#$ONa z2L25>{wv_i;Jx74pabM1@NdZP9|M04-UHqZE(d3W1k~eT(4CNbd+*l z<&XEI_*cU?JjPa!=FWkHjVgPr+*RFE|s@O)rd$Fx(p*w~Oq!dfm`^ zLKMzT?{R|U9z{+khZ9mS7Hir=d-g1L$84euInrLv zLEIb`rzVmR%|knt-fFN$(UMJH;G>}8SUTe+uG*|rUD$HH^bth6LO&7UC`sxFC z1SsMMao`rJ=UzsMemp-zRBS>l`qL{qr4cL2-=RJl#$``Cc$Rf}pW?IK(I^&`>jL_+ zBm#lf1t!={NB3CJ=qKOmG^Ml>8x>H!9*ry&RT#uev`2l*+AFWn0>>_=8tONr7w(5D zL!KE+()?~V1-cA^ZE+b>V6`099rQ7cbaH%hT(n*3>8U^y6Wvlf^s=_3suq=6W^_vp zjxsu`_^V~#N9)#G1XD!;RI1Bp82%>KU>d#8e zDo5OCrLsEPh(_g*g4*epS|`TR(}6HAd{aILfeC3cEG28_(D=+8hq<73Ivd8L{DTxj zk4cn5(sB}j0xOkL3?|M^WyMU*k|_m<=JL-qM?se6BMDuITngbLt^O8+Prl1j@kF2z zdKZq#4rRI6y3lOF<$Km)56YSDAY>9OX^V{~ESu07qgHjzp+ z4s~A!mndWO!fJ2(*MBn2^xBco7iZh_sc(LwbFS)Xlc{u1pIwxv-RZxf;Da$_AvJ29 z0aY1pv<(&Yx{bC|x1v*fRQM6^4W39>FCuBwHuWISgQ`dT1ZmbP_Q>1p|A^!kb58RA zycZ;IM81C+cqw=m7zSTQwwJB{dT=ec2D}u!1Z)GV!9Bp;!57H%FTm9x+zI$P{(cR3 zHF!C=2q<2FbOa9vx)<zFW1B>8(;4a`s!41S8-{}!+WX2H|IDEK9CA8<3W|0lpz;I-ft z;5WgO!3a13d=Q!cufTQSe}LD5-vO@#o51Nn=MbbD_#rw0#S#2YRX3nn(vx!-(+;$R z?Cm3D*JC!X_bjEY*OpDWxR-C?t|%k?o~jZTJ%;{{G`+nvht$DlXrZ_u{b~E?NoWHb z+vW1u4qNGHXKwL8PqsZObUCTrbxxdP9s7Hmu@1pJ#UY@S8;fjT%sL~#TJ)Zm&wdwC zc8#Y8Ru$Ds9AAC{ZTSi;D~4n;Yfg!ZR)o!>d4M50slmfpd#SUSww}@^mR`d5bS|Fi zF2Px-n_yQMg0^uAm093z96aNq5@+R9Qc5y(L+hr^vPHDV!VJqR0oS9g+;_J)Pkl6t zXZq5M7VU+lxw-B<^K{C|p$)3wFx&R$L1D0_?A$iGjcMHG+_wZ?F_A16;z_34Bwg(P zwxUcDF)&mmT~J4CV~+VwvoM(WOS4l1**qhgNIGKbXYbO|)Z`Y$MNMqQ??G9{`E8C3cMf$XmK;B*uAroe>F&bPyceB&>`0-K=TUI) zW$$z(?QvD!ocz@m*AP@-Jr{7v3Y4E%LCIKaF4voz-8|JL_LENdvtIQ%TdB%N3&XyT z>6|4dF=4R%gJf?kL`zwQmw6gl^^i?Du*Y5SLl;iWkEj+p(Ccf{3hDLU&`>2yqg-}+ z8fHE07P)1cQ=4V-J@S^;OD%ga&=eJ{SNW^jQj~dKK1y0aEqluUXAkoXo}>$Tyi*%E zIgQCFUTWx_hvz!OL)>uB-ADewhO|FJc7lC{9}Lu$4TDjze=HdI`6XL(&_5#$HU^ZK z1XL)`0-i}a0?qZAw!{@59j}0?{REigF;37adaUL<7`kVM@ZM*Z8|0O?9dcHL?bdzJxrPf(RWp<<4kF0Tt)?JiH_RvNZ&1 z8yVTQT{gl!V_VPJe)gt4=Wp6E#>cJaZrL+--uCU=cI@0VnpCNo)izBbQ5DJeigzNH z)gf2op<)`94b|Lg?EJos)l*pwZu@ptd$VUXvnJ#^1711l33yFl~Tuz!1Ve51c*FyiX5^aqv40~~ScMtibS0KQ!80##Hvlu&jhO0Ie z56Rs@X}^%Qs2wxf9$#AQ23j0Kwz$nKxyySuj^>j)hw`~ML0Y6zK8^8aBk|KE(f{|Rst_%L`bxEPFsXMo25#Rj+o zP;5Y*2lyU%JGc_)9DsBKdw}i=fZqTw2D`!e;5={+xFfg~ zJ;2w%KY>33SAomG^T2b#5_kmoC2#|Jg7<-EgC~Jo(GPqL{1dnwTn6@lr+`y{;tL)J zzKX8k7VsJHZmU3jP&+fpiHk1CIm4U&cm8iHl&PMpim zu|Tw;eDf$5swY^?%gDf0^5F4s&>(Cks>EOw$jbIRP{j=Eya6|;vcnC8z3QRVYnyRu z%g{N|2g&IBK1ne{PPH99@Zw(46yR3*NOUzChc+5zI8>mtjwr+agLx0 zhHhzyW`}gkJhY^2C2cPmYq6s(p53P@{8RR(aNo9rTq;Z>w?aUu94 zpTWK)s_K;0+4d^&p{cDVeO!cY0_j_N13Vt)6+Vou#@$un6eukDoD-Ci|F`jL9|U6W6150KB$1v>5{iE-UhPsy0B+fEq zkVY?(0q95i)<5Ro+8eD!x9_5NtGDN(_hg*Ozda~LLN}CKL0EEY+99C?{E?BdojVW? zvz4TdSw7bxonqEHT{gc)y5V(f`6ggxlBu|IsC8B&&0cSFQi(Q4-4Iw+MMwfk*rNn) zw(i+Cg_#ytCL_pXj9P=FIfI%exXr3PuCIGP-d(Kapz_MXU3pYLR`I!MAyQ$laCJud z6^i{g#k~kAiR$SJBHwtt34c9O6^v@1Z0)3JJzJXJoTsYQyl9#G6R7UpsvTgTj_cTZ zy}oNNzlv2Cy<9)?hnBMCmT#&pC8;f7`;z~{Bx)i9ElYGeu>oVKW!T+qR@gCNb-B?Y zZ*K9tMP2c3-HcA#%|TzuP*;|$M#0S)mqON?Ms5S;+2R4jDZ1@24w`nyV7Q2IR=Vqn z`DJBYXDN=RBV%sR7rIH>JW*gIqwOlB@2$nosd#AQmS9@wYrLB5On0POKPvN8tzGV_ z+riuA(%&BKn(z2)caOpvD!Wg!%NOr zj6vNo@MiFPU=rv~LCO684g3h1{)gb-!E3=f@J(d-tHCsQFgPCk92x!x;G^L0z~6$G z0>uP)CXl?ZxBw>u$^7>Nx>xX@kmWxQJ`MgB{3UobcoldV(3ye*U?VsajDT+<>wg8@ z2tEkj4&Da-5a_OgOF#!qg5BVk!71S0Kyd}`3~pf_d;%!8znfW%*es?F(0fl)+_dD}ro z?zhwcjHJlPKaT($S(qB>fjW7TsnF!KTj!F++g(Rx~zVFYp?1p zdUjo!D{I5Bk8`(P7w>&sEjrWF@*IuM`rWqn+V;ZygzWO+0o+f=_aOka(Rjd|>8H@h zwb^&ZB8#z~)wABmHnd)|w8(q0oALJ;0JNq51I|IQ|{o0!6Rsq=I6%`4_C^=!tDAAZ`;^8YkbG8whTfu z!+faZ;HQP1st7UIsx!q``N-zVImR^|!9)oY*)=qDVrZBdRe}_@+~l@VIr9)2)i?~?#sl1{D_!QYv^!C=I-w0tygOq! z4+R?=ycc@sc&z!%c4uX9c9Go%uTUb0xUu8#1&xsJ2oC-o3C82|hoiCB=(Ubjx%KF6 ziQd-hKd~(@uEP|~M}BCVqF=W$LNB26B4{h8JNp*bvKZ%A+8HhLn7^pgnTziF61q5a z$1Q=5e5pjfG5M6!0WNooyFz=XrSpfDjW6nqfnxA1_!K;H@WA2RrLDsOgZW6SofqBs z^uciyO-_44Epcsgv&$8J@Bmwbt0z5^-1qJNXBLc0>k?4l${BRQY#}Rq>|9|odY|s2 z87AM~&VSsWU?{2)o0v#Ik^+bW7PsS(4RS_x_lu7YvgzVo%9kFZaMKDNP)#AummH^!+{xgfYLEhvI}GE2RC|9t1kv|Lu6@As*9`}fHI z@46t22BQh>fhNd5s_i^nxW3%YwD5K4Y1TETTg*bB-kiiK)NV7cOgFRtpMog&V<`c$ z^Z&m<#{VJsGWaaG7F+}V82m1{0vrTEN3e^($H0@o6Tv!gFQ7O9H=+~xFt{2#A1FTH z-N0SJXVD2<0XBg3tOlP%-v20gCwMcM0uw;70&hUZzYe?yyc=8vo(W|8KN%bk zK8ehKDUhB2Uy$_`D_|dZD0l$)7IOSYfX)RdM!@AjX9L!Pe@9;b7w}^6d~h;Q{J%Q_ z#s9k%d>>p14uNNb^T9*F^~m6tfVDv5_M@tgzhv{}UTwWjvj5H9g-zcGdsxQK3C4x? z>R__Doi3qszBl7mWy?Ed<7z%)*VWnf7@C6bH+L(Am15LszUyq__``E9{+X|7 z$`%po{5a0W>J5#KW=9qy_HfTHCS@ z(XiCeJ(U!4fwtI z7r`7%t_$5S(c3EtNBl}r=bA6LZl$tm505Hqt9}THwer}L={S~I90jYG7Rvumx&A*+ zxe^W2obVJWEaps)y!LdAms3olj(w@g9?pVI&OnsHBm5axL*W0&m}MP~f~B8zzQmUp zG7kh$`3L`@W*Qfs$g0y=hnCuv>$DpQkWb~`^hBQ*3JrhB%)0h=?GfhUpjD?O6)MKg zahTN{)V*v%{&bh48~%V->@Y%xi{>7A(z}sJEm<}t)pujHHx)C zcpTRadLjmq4xI1DRO6FmPw^kkyCLkb+a>o;clVA@i+t#2S1Y#nw&=$=kfg%Mp$a$7 z!7?@bk+%5lg`Fg7i^)S1EF3T{AMHPl*ea`;I@?UDRAcqEeIMvdM^jAmB&B~Ux%-D! zR|`qSsYiT~NN?%TAter7h!itE%@L|~W-i)eCkcnVImGvZe>NWJi<7ne)bO;olN3HF zp~&1eqDB%mVc*n#JHMjiNzrbScfNo2;5?2i=Y&8!<+D%MZ>(;!B!x5$d4&0z6M{-L z!lWG_w?Gk$NStGqvr1;6oGe9AE7yEI6kN%zKbAOK2>-66Ee)7nz87+fTJ~ISH7iQc zj=%PFd#Y*$<8c=W6(*eHj0?ETcQ2A-)Z|P?TPp*es=8esBYvzKinNeWWaXw$^90_r zM^Q77Iwlr}LsxmzpL!&4Cy_byB(5Q8OI;LcM6`JoQ`}GFioU?n%O1}cbFTUMJl<2i z0!Pf_x}a5`_I9b!RNu} zz^8!j0#w}pXMj_I;sBlijtB2WmcJIf25bQ9!H;-3nM+4m# zcpPYfcOlEa6C4Ec0XPHb-az^EzXHg%|5)%Ca6h0pfp-P(M}|KeJPkYqd>%RebKnD@ z19pL515XB$@t*+JfIEPnAm85tLX5x*`Fj#P5J>j_6f*uNf#L&R2v&jOM&7791rde{stLewtC$=_&9J9_#U$Uw}9;OF9-j@czpwC+`g`{TlS^7t5->- z2RO@;F1tmgCJsR+wei{U{cz;&lO5L6pD3EzWf(BR%XOyrjf}9>``B)Qp21}~vcVF} zD1kOX!pcbpC-+46^w`b~J2&k)XT!N0ws3$jKa%EBLN8oiY=vRnnjSBSu)c_95>Zk6 zrl+W+(<0QVL?aItc#F`;pa#KiFuQ;dqn>KnFhmBY;HW}zB$0UPH5h7JlJ=8>8sp(J zt8i42nX+7BWf&qh`vuu6%TekEZA{2+r!y}s9_UUw>$BJ4t5T-?2oZb8@@yAUh=Ic> zQp&bge26B7t;2T`2q z@Wr9Sp(z&=0`exne(0fEd9=W zs3WH-^D3)o^GDd4hgIMROL(p%CQBF<=2`N{SqD)9Pi9PHk!`j{TujF8Ds(d)%b9XT zJ2mm8I_h3um<~)%;UlsrrRKbahKe=KnxD>2s-tV=_Uy`@W93zGk(y=+RX{ng`o?$k zWc?D`Nx#VHz*eKaP1U zO;`kUueM+ErCj~qH7{*HT9czn|w8g zE>eE_%~1-DX$LuQu$izKBaLlW`Y$Qz!;bIQ)v?b98)ry>%Pis%LGhKqN&Wje6Ne|JJEl3< zFuy;$Wrelq`Jb89<@x%MeWbh1KU{+}f}I=F4tWSrCK9loZ3QP!qiy z?Q=h*8Q$Z0sL|NcUPVgT+nF3Y%%(d-%l(?H)Vn-TrjkOx^xZ{#W`4TSnSqt#PtR6W R1`Qgmiv%K@Ew7N){{h1h&aMCe literal 0 HcmV?d00001 diff --git a/lib/Doctrine/ODM/PHPCR/Mapping/Annotations/Depth.php b/lib/Doctrine/ODM/PHPCR/Mapping/Annotations/Depth.php new file mode 100644 index 000000000..1d2907276 --- /dev/null +++ b/lib/Doctrine/ODM/PHPCR/Mapping/Annotations/Depth.php @@ -0,0 +1,30 @@ +. + */ + +namespace Doctrine\ODM\PHPCR\Mapping\Annotations; + +use Doctrine\Common\Annotations\Annotation; + +/** + * @Annotation + * @Target("PROPERTY") + */ +final class Depth +{ +} diff --git a/lib/Doctrine/ODM/PHPCR/Mapping/ClassMetadata.php b/lib/Doctrine/ODM/PHPCR/Mapping/ClassMetadata.php index d9e741a15..2a356a076 100644 --- a/lib/Doctrine/ODM/PHPCR/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ODM/PHPCR/Mapping/ClassMetadata.php @@ -256,6 +256,13 @@ class ClassMetadata implements ClassMetadataInterface */ public $localeMapping; + /** + * READ-ONLY: Name of the depth property + * + * @var string + */ + public $depthMapping; + /** * READ-ONLY: Name of the version name property of this document * @@ -766,6 +773,13 @@ public function mapLocale(array $mapping, ClassMetadata $inherited = null) $this->localeMapping = $mapping['fieldName']; } + public function mapDepth(array $mapping, ClassMetadata $inherited = null) + { + $mapping['type'] = 'depth'; + $mapping = $this->validateAndCompleteFieldMapping($mapping, $inherited, false, false); + $this->depthMapping = $mapping['fieldName']; + } + public function mapVersionName(array $mapping, ClassMetadata $inherited = null) { $mapping['type'] = 'versionname'; @@ -1117,6 +1131,7 @@ public function hasField($fieldName) || isset($this->inheritedFields[$fieldName]) || $this->identifier === $fieldName || $this->localeMapping === $fieldName + || $this->depthMapping === $fieldName || $this->node === $fieldName || $this->nodename === $fieldName || $this->versionNameField === $fieldName @@ -1198,6 +1213,9 @@ public function getFieldNames() if ($this->localeMapping) { $fields[] = $this->localeMapping; } + if ($this->depthMapping) { + $fields[] = $this->depthMapping; + } if ($this->node) { $fields[] = $this->node; } @@ -1450,6 +1468,10 @@ public function __sleep() $serialized[] = 'localeMapping'; } + if ($this->depthMapping) { + $serialized[] = 'depthMapping'; + } + if ($this->translator) { $serialized[] = 'translator'; } diff --git a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/AnnotationDriver.php index 355566562..1ce45b056 100644 --- a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/AnnotationDriver.php @@ -156,6 +156,9 @@ public function loadMetadataForClass($className, ClassMetadata $metadata) } elseif ($fieldAnnot instanceof ODM\Locale) { $mapping = array_merge($mapping, (array) $fieldAnnot); $metadata->mapLocale($mapping); + } elseif ($fieldAnnot instanceof ODM\Depth) { + $mapping = array_merge($mapping, (array) $fieldAnnot); + $metadata->mapDepth($mapping); } elseif ($fieldAnnot instanceof ODM\VersionName) { $mapping = array_merge($mapping, (array) $fieldAnnot); $metadata->mapVersionName($mapping); diff --git a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/XmlDriver.php index b12dd51e9..a0b15ae04 100644 --- a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/XmlDriver.php @@ -190,6 +190,10 @@ public function loadMetadataForClass($className, ClassMetadata $class) $class->mapLocale(array('fieldName' => (string) $xmlRoot->locale->attributes()->name)); } + if (isset($xmlRoot->depth)) { + $class->mapDepth(array('fieldName' => (string) $xmlRoot->depth->attributes()->name)); + } + if (isset($xmlRoot->{'mixed-referrers'})) { foreach ($xmlRoot->{'mixed-referrers'} as $mixedReferrers) { $attributes = $mixedReferrers->attributes(); diff --git a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/YamlDriver.php index 613d4fe68..671432984 100644 --- a/lib/Doctrine/ODM/PHPCR/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ODM/PHPCR/Mapping/Driver/YamlDriver.php @@ -201,6 +201,9 @@ public function loadMetadataForClass($className, ClassMetadata $class) $class->mapLocale(array('fieldName' => $element['locale'])); } + if (isset($element['depth'])) { + $class->mapDepth(array('fieldName' => $element['depth'])); + } if (isset($element['mixedReferrers'])) { foreach ($element['mixedReferrers'] as $name => $attributes) { diff --git a/lib/Doctrine/ODM/PHPCR/UnitOfWork.php b/lib/Doctrine/ODM/PHPCR/UnitOfWork.php index ab9a8fde2..388537531 100644 --- a/lib/Doctrine/ODM/PHPCR/UnitOfWork.php +++ b/lib/Doctrine/ODM/PHPCR/UnitOfWork.php @@ -543,6 +543,10 @@ public function getOrCreateDocuments($className, $nodes, array &$hints = array() $documentState[$class->parentMapping] = $this->getOrCreateProxyFromNode($node->getParent(), $locale); } + if ($class->depthMapping) { + $documentState[$class->depthMapping] = $node->getDepth(); + } + foreach ($class->childMappings as $fieldName) { $mapping = $class->mappings[$fieldName]; $documentState[$fieldName] = $node->hasNode($mapping['nodeName']) @@ -2703,7 +2707,7 @@ private function executeMoves($documents) $this->session->move($sourcePath, $targetPath); - // update fields nodename and parentMapping if they exist in this type + // update fields nodename, parentMapping and depth if they exist in this type $node = $this->session->getNode($targetPath); // get node from session, document class might not map it if ($class->nodename) { $class->setFieldValue($document, $class->nodename, $node->getName()); @@ -2713,6 +2717,10 @@ private function executeMoves($documents) $class->setFieldValue($document, $class->parentMapping, $this->getOrCreateProxyFromNode($node->getParent(), $this->getCurrentLocale($document, $class))); } + if ($class->depthMapping) { + $class->setFieldValue($document, $class->depthMapping, $node->getDepth()); + } + // update all cached children of the document to reflect the move (path id changes) foreach ($this->documentIds as $childOid => $id) { if (0 !== strpos($id, $sourcePath)) { diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Functional/BasicCrudTest.php b/tests/Doctrine/Tests/ODM/PHPCR/Functional/BasicCrudTest.php index f9d7a5e86..047d7f527 100644 --- a/tests/Doctrine/Tests/ODM/PHPCR/Functional/BasicCrudTest.php +++ b/tests/Doctrine/Tests/ODM/PHPCR/Functional/BasicCrudTest.php @@ -9,6 +9,7 @@ use PHPCR\Util\UUIDHelper; use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; +use PHPCR\Util\NodeHelper; /** * @group functional @@ -584,6 +585,23 @@ public function testVersionedDocument() $this->assertEquals($user->numbers, $userNew->numbers); } + public function testDepth() + { + $object = new DepthMappingObject(); + $object->id = '/functional/test'; + $this->dm->persist($object); + $this->dm->flush(); + $this->dm->clear(); + + $object = $this->dm->find(null, '/functional/test'); + $this->assertEquals(2, $object->depth); + + NodeHelper::createPath($this->dm->getPhpcrSession(), '/functional/newtest/foobar'); + $this->dm->move($object, '/functional/newtest/foobar/test'); + $this->dm->flush(); + $this->assertEquals(4, $object->depth); + } + /** * Create a node with a bad name and explicitly persist it without * adding it to any parent's children collection. @@ -762,3 +780,15 @@ class UserWithUuid extends User /** @PHPCRODM\Uuid */ public $uuid; } + +/** + * @PHPCRODM\Document + */ +class DepthMappingObject +{ + /** @PHPCRODM\Id */ + public $id; + + /** @PHPCRODM\Depth */ + public $depth; +} diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Functional/Mapping/AnnotationMappingTest.php b/tests/Doctrine/Tests/ODM/PHPCR/Functional/Mapping/AnnotationMappingTest.php index d2128983d..61abe6b7a 100644 --- a/tests/Doctrine/Tests/ODM/PHPCR/Functional/Mapping/AnnotationMappingTest.php +++ b/tests/Doctrine/Tests/ODM/PHPCR/Functional/Mapping/AnnotationMappingTest.php @@ -211,6 +211,8 @@ class Testclass public $node; /** @PHPCRODM\String */ public $text; + /** @PHPCRODM\Depth */ + public $depth; public $callback_run = 0; /** diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/AbstractMappingDriverTest.php index 1f5215394..6539b4ca9 100644 --- a/tests/Doctrine/Tests/ODM/PHPCR/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/AbstractMappingDriverTest.php @@ -319,6 +319,22 @@ public function testParentDocumentMapping($class) $this->assertEquals('parent', $class->parentMapping); } + public function testLoadDepthMapping() + { + $className = 'Doctrine\Tests\ODM\PHPCR\Mapping\Model\DepthMappingObject'; + return $this->loadMetadataForClassname($className); + } + + /** + * @depends testLoadDepthMapping + * @param ClassMetadata $class + */ + public function testDepthMapping($class) + { + $this->assertTrue(isset($class->depthMapping)); + $this->assertEquals('depth', $class->depthMapping); + } + public function testParentWithPrivatePropertyMapping() { $className = 'Doctrine\Tests\ODM\PHPCR\Mapping\Model\ParentWithPrivatePropertyObject'; diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/DepthMappingObject.php b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/DepthMappingObject.php new file mode 100644 index 000000000..ef8507ce3 --- /dev/null +++ b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/DepthMappingObject.php @@ -0,0 +1,19 @@ + + + + + + + diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/yml/Doctrine.Tests.ODM.PHPCR.Mapping.Model.DepthMappingObject.dcm.yml b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/yml/Doctrine.Tests.ODM.PHPCR.Mapping.Model.DepthMappingObject.dcm.yml new file mode 100644 index 000000000..ab13f137f --- /dev/null +++ b/tests/Doctrine/Tests/ODM/PHPCR/Mapping/Model/yml/Doctrine.Tests.ODM.PHPCR.Mapping.Model.DepthMappingObject.dcm.yml @@ -0,0 +1,3 @@ +Doctrine\Tests\ODM\PHPCR\Mapping\Model\DepthMappingObject: + id: id + depth: depth