From 575f8880bf8498ee05a8e197fc2ed85db6880361 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 23 Aug 2022 13:55:43 +0100 Subject: [PATCH] GH-96068: Document object layout (GH-96069) --- Objects/object_layout.md | 82 +++++++++++++++++++++++++++++ Objects/object_layout_312.gv | 50 ++++++++++++++++++ Objects/object_layout_312.png | Bin 0 -> 30688 bytes Objects/object_layout_full_312.gv | 25 +++++++++ Objects/object_layout_full_312.png | Bin 0 -> 17092 bytes 5 files changed, 157 insertions(+) create mode 100644 Objects/object_layout.md create mode 100644 Objects/object_layout_312.gv create mode 100644 Objects/object_layout_312.png create mode 100644 Objects/object_layout_full_312.gv create mode 100644 Objects/object_layout_full_312.png diff --git a/Objects/object_layout.md b/Objects/object_layout.md new file mode 100644 index 00000000000..9380b57938c --- /dev/null +++ b/Objects/object_layout.md @@ -0,0 +1,82 @@ +# Object layout + +## Common header + +Each Python object starts with two fields: + +* ob_refcnt +* ob_type + +which the form the header common to all Python objects, for all versions, +and hold the reference count and class of the object, respectively. + +## Pre-header + +Since the introduction of the cycle GC, there has also been a pre-header. +Before 3.11, this pre-header was two words in size. +It should be considered opaque to all code except the cycle GC. + +## 3.11 pre-header + +In 3.11 the pre-header was extended to include pointers to the VM managed ``__dict__``. +The reason for moving the ``__dict__`` to the pre-header is that it allows +faster access, as it is at a fixed offset, and it also allows object's +dictionaries to be lazily created when the ``__dict__`` attribute is +specifically asked for. + +In the 3.11 the non-GC part of the pre-header consists of two pointers: + +* dict +* values + +The values pointer refers to the ``PyDictValues`` array which holds the +values of the objects's attributes. +Should the dictionary be needed, then ``values`` is set to ``NULL`` +and the ``dict`` field points to the dictionary. + +## 3.12 pre-header + +In 3.12 the the pointer to the list of weak references is added to the +pre-header. In order to make space for it, the ``dict`` and ``values`` +pointers are combined into a single tagged pointer: + +* weakreflist +* dict_or_values + +If the object has no physical dictionary, then the ``dict_or_values`` +has its low bit set to one, and points to the values array. +If the object has a physical dictioanry, then the ``dict_or_values`` +has its low bit set to zero, and points to the dictionary. + +The untagged form is chosen for the dictionary pointer, rather than +the values pointer, to enable the (legacy) C-API function +`_PyObject_GetDictPtr(PyObject *obj)` to work. + + +## Layout of a "normal" Python object in 3.12: + +* weakreflist +* dict_or_values +* GC 1 +* GC 2 +* ob_refcnt +* ob_type + +For a "normal" Python object, that is one that doesn't inherit from a builtin +class or have slots, the header and pre-header form the entire object. + +![Layout of "normal" object in 3.12](./object_layout_312.png) + +There are several advantages to this layout: + +* It allows lazy `__dict__`s, as described above. +* The regular layout allows us to create tailored traversal and deallocation + functions based on layout, rather than inheritance. +* Multiple inheritance works properly, + as the weakrefs and dict are always at the same offset. + +The full layout object, with an opaque part defined by a C extension, +and `__slots__` looks like this: + +![Layout of "full" object in 3.12](./object_layout_full_312.png) + diff --git a/Objects/object_layout_312.gv b/Objects/object_layout_312.gv new file mode 100644 index 00000000000..c0068d78568 --- /dev/null +++ b/Objects/object_layout_312.gv @@ -0,0 +1,50 @@ +digraph ideal { + + rankdir = "LR" + + + object [ + shape = none + label = < + + + + + + + +
object
weakrefs
dict or values
GC info 0
GC info 1
refcount
__class__
> + ] + + values [ + shape = none + label = < + + + + +
values
values[0]
values[1]
...
> + + ] + + class [ + shape = none + label = < + + + + + +
class
...
dict_offset
...
cached_keys
> + ] + + keys [label = "dictionary keys"; fillcolor="lightgreen"; style="filled"] + NULL [ label = " NULL"; shape="plain"] + object:w -> NULL + object:h -> class:head + object:dv -> values:0 + class:k -> keys + + oop [ label = "pointer"; shape="plain"] + oop -> object:r +} diff --git a/Objects/object_layout_312.png b/Objects/object_layout_312.png new file mode 100644 index 0000000000000000000000000000000000000000..396dab183b3e9b2f39edb49b033a612e66d3a09a GIT binary patch literal 30688 zcmce;2RN4h-#>h6NE*n<$X~RyIjg5*d*ZLR3U%NKqn6$W~U_M5H1km60T} zm7Vdt&VKjr-uM0d|Htth&u<*xzHwdGd4A5%=ly=I_jOZ8TXhRHD>Xq7TaKzJ>k-5n zcY>feLq&eBmO~oMnhGZSSA1auq-v2Ah?L5%7+a+;zzqZ&B8oa6(&EXKYws% zZ+p5y2bDChW}BRPM_xc&$s_Sk{3oi_8l3l@jy-D|6i2I~CVp;n-A9Q+iBHMgn)&`r z>i6%ouBbe~prD{iX3J3Vy4#0~gOhnr z;ZMw#jx>VqfB&HFA1#A_4;AOHZeS;WD|TDo_i*x8G;caN*ONbaqP)L^{0Xx@Pkfhn z9cxx=>Mz}r_-yEstFKnFsFf((r zii%2m-IsD7uLmO%b)5TO%IxrBxA$OS|&b_@C5G{DDv0YbJ_wZfOlg&>J zg}o=MHqhQw9_lHRAs$-2xpPZBrF}8$b6suiI->dcdHsD3pBaXShlf5F2pbq0+J%i6 z4olRT7?SJIxmsk~E_6F4=Jfa1k!qTn2Cn-<#b-^)waQz4UsJPIUS9rnV`Fvh>6%;7 z(T|31FJDgSODwPVLr)zzt27DsYy8?aoA zTiFl#3uxUlu-i^cOR%%EZ)TI)tQx^_eAWeaAE|rYM?2}J zrl#75*$=u>$+(Z#CdhexZ*=T_vEJ9$H(uU{6>oXt$rAyQ-MhsvbnS176;~>jcC7Z_ zIR7&>(VX@DO?p9ECMKi77t4z?UgzcNOdf4}N3MOlF1A@%qDmFBw!`l7C`uA`$v5IcA7JcNrUxTK}G8yOkVhP(>i93fse%t#)J zITbZEDya)yL8Ya#+^65Xd82gX$oe2PwIN%cZ8vl6KS_uj&;Nch05?fpMPsn1u7^$f zLf4^G?FZ)RVQPGe*a*1H8@i8F+V#(dig%ovT+4_zRjm(aZ%NVEo|e`&W_mw*+D=M@_nEETPt{rO6xO?r9b*Om2w^XZ7FU1``?+a4q>6_t6NlD2q zDhdn_-+Jx(^%4F%smBt_XRds@AK7pgwPwSP9Xpz{Ps%8(sGOM{{p2w{L`R;yNM2P% zt+9nyl=v*o`2BRYwzfL@`bzhu9B8+1ug7ABUY#hhoOr!BGa`PbHptjkN!jhP&@aOs z`<)1GZf?hdW3%VTgR*`T(?ieSKVq@uD4RUIypgf7K}SNEs+yWI>n_m?Xdd$PJRraD zo!+e2iDI|ubC3GSy>%uvwR2s0?#V}^1#)w9(_FfThK7nbYCb))7QZywS=1xu<%Y|e zU!LpDJ6%J$L*~+ECMKr&;f$O;p1;mAv$1_lrx6www*QpB9!nJX^r@|!Y7?{N1dVx# zrQ=)2isc&-@{3farl!@LBTGw5tRox;oY!$)ndg39P|%WNq0sfhZ4;qmWF+9e(DC-I zR(AK#*3{G1)*H06w4OVBVWOj>bFP0Me_*YbmzRy5T@C8xg$oy6zj;%Wee&g=Q=8&HJgK0iNy{dCO@ZZR<$ui4S6?w9U;BO@mUYqLK* zJ{rA05Btv-yQ_?`Vr5ZSetBA-fq~&`)%6XNzke&8I>ohvon04~owf2n#+{atF`yw@ zu>X5Q^icOpX^Fjilb$@e@zQ;w!{fj#o-0{G$xjOn-Q3yPd1`v7W&Zbj1q!02rG@-a zTU*=Y*Q&K@eB1nQ+^Bx@W>a={cC3PLd9$&K3S|(L!{_Je717n}^78Ux54s68y?r~? zySlP{E#>Az-rlmwj~)$-r=Ty+{y@oh%q%V4@yz-?CEe-H+|zrcr0R+<_LE)Cti*YJ zQc_a;=cap-o3`CtNB$1+I5pMs_m8)PUq{x7kHtr`0s}WRHa70TZXFsPuKx6iMcF?_ z*mw<5T3V`OYDz6FEv=TK=i%XTNJC@OlP6DR=Esja;03fC9O2{LFKg=RD7TB69m3+E zDbj7*b}gJ;M(Ch28n$|TSDy6jM+@J+zM4S7?}^s^H6AN*35$!1gx~cIG##G{hqWg0 z+O&cm95!rAD#FRh$xn^%+OubS2`*95tq~k@+ddoj_$kqL=?fdRv}Z{NO-kH2Hvg#9bmkB6A|{Q15#1cN3`c$yS9exkh@P5)|Ptyo@@|I z4`NEVk{RG7N#%H*6c8!zHNW{bkd|7I_Jnfm4TY=hChdf zs4VL1>dN`f%u2=Fy-O~6Zhn6CaC=7Ij~_Q4KjvGStf9$${@md2dk&HBX;O5d+yBpJ zA?XdGyLMIKVG#tLcUp&vKs1G4SL;(zQPG0%)926cl091D^XC$<%4_zCu99a?vLYgy zq75RVqLjpyr}-Q^&~~sv>zd;BPAv>3_P=`|V^ZSGuc@iYz|LwJDrrhS7(B`w=vHey z%8xo>$Ds{S@hGBnXE<1|A+Tv)zkA2@Su1|O?)Zmpg~U6C#>RmW5i|t37#2P=jQRQb zPBX)XOVh2#Y(6~RXq08To+$QRl}C|`1YENFm|fM|%SklnTWKU!+?RIb;o|xlaQE8r zF+DxKucM=(ID<)8E^JiFjvNcIqUuJpufsukMSKzxQ7>G7DgqsxJ$qJ}UQqk7;IRa% z`ijM2VN=`%`vGTv`NbjL4;>v(q#Qms7xiAz7#J9E_Bn53LrdI~^~^W(JamXCux$@+ zYj022x-a$o+*{U?LI8$TfVz$K6$?Mugm&-d=Shx=+IDaMMV|9^cKUy2$9|4}dN$)B zbz2_`yng-qNR;aWhc9$QeXg`XoM{iucH!Mw6GrFtZ=W^yTg zD9^I~8@bfaZRmcyPo!~kb2}3F3U_5rw(2c)DClJW0mx)#VWA-8=fAF9ullO-&6~W- zGq$J>YjHq7=2+Ax9|`$ehbV)K0<5>F;It>mdR`-OCQdoA$7Ax;de!z~Igd#K6{FaD zLBc50^R zeL~-d6b+OddBIC4BphG8#+fah$?Nf6a2ByB-+{L$(cQd0KfvQM-MhQ!i`S;7U5j75 z;5m4ZRbgpzEuJ-dy5h{TE!0N=|Os7b@wj z?9V7{^w4*81qb~Qn*KjNx&OQN&CneOw(&#;SxhttOGxOo=u>|B^od#Cd;c9Vi}1?I zL(0m^hm4JlTTX)sc&+t5Zq(5E>C@?iA%X?|6 zK6vX*;MNnB4G*I7a&s%wbRRLWQ+jPYBIthl^yyeB2UdG~ds;d=3VnV3fVvvo5P;o!D5gVEj!&crK=>B&lGLdA_} zJO;wW`HjuZ!~OgSTwK-b*HpgCGuz2qd{X=OhfLeIZ*X^aUz+)7VNz(%Qd(A)^z`Y| zp|mG9WGW0@ykG962hO)nBBkKEU<1pZF;@-!7Xay?3aWK@)% zqh*J5oF*kusfnrS8Jq#Cty}A`v8Qr;mo-|Fc4eJ!ebO*yVPatLm^=buI|SV`4uj@4HG zz(6GtCUR4|489u})9T^I>3VM4uHJHbPhG5^@pz|3f&C}F;_uTy(BvU>zMCXOfAi^p zxw$#v_xiP($%zx>LIDELqap@e;gt6dA`zBQjG_qBBbES`Y~|axS0Q3M{?y*22Wg|)xbg70b5EKroSh}M(bKnN7>l8m z&(F`F`cmlNu{3|NETPwUYWk->iN}DHuid=4adCDmq_}uL$vx58s!_S#+&szdHr#gf zf;_f61#xHh34z<_g)~I2%b<4WmoG}HsvA%iRu|s;n(r3_dK_5PR#$&2<(tv-#S>=@ z`|Pm3KE1=2!XwJc{!XK9>H0%mC3~l5X7Zf+6iNJb^XAPNS0n7+tFa%PE?p9^wjM0% znZScO|F!b!<0ns4&=!@IZ$EgTH9I>?7F?7*#covQ7Idogw6vhY3*G8lw{E>18>!h81IBAOqmMg#>7VX^js z;sl3<@yBVZ$a&5385$a{In?Vj$9}TZBNA*}r9Ohw_h+ZFGT5;Io>9r1t)-fKwAN|(y;*R{K$Uz?p=8K^6Uw9O-=8S zJV~ax@oxHey9gW?0iNXidXKrd$^eDZm|+Pi-I?#%xw&`>DH?bE^YJv>?VRVZ@%6E<8>*_V zk`2`MV>UaU=*Eo%A+c}YpFlEFPYFsG$^Gc%n(~6ryE#k_X=0eZ%jrti0FyUFMxGLxEWI9%bd{ zj=l104k_K(oTPDAl#Y3W?3H+a_V{hmF8UPea7=uIpC#KV-#Pj12&mdT#>u7 zvS4jvYipEI;raU_1qn|{1u z=L(Nh|law}qH1R@j!iK6v149(=)^E zCZ!(Y=ibF{L_u^N?Tn;<>0a5|N?-X~jz-L)JQR=j^y^#P)l;By6z>z{NI5|sA{!qc zA632Wy_}rnVIMCLtBfu)t)oY;nuyea3R0rk-M(|@%%^;-q1IFyh%h}iW_7X70PyXf zaJIRl8=R(xbVs{N=+Ql1p`ct`UGXt{;kpt3`750rvasN+{CzfE07sf65as3aXDluI zhKEi2pR!LbQMzx~u%YRJOp&&9RE7QM_PnAZ)iY;!)~sE7+Qufxv3!B@@ZrNbT{K?4 z05;UZl_ah~DSMdwtHL4-cRf6~H8_+O5{3Ujk}aG>Ml z6w4G)QC01~?^vF$zd1Co?q)Qe+S~ims)_PGli+AcO_#oaJ z>#2tC*tLU~2SQgLo_OqDYwfVRi*}E)vUYo)Ja7y;(7-V8Ky_y)Gm#6a#5SWApKVfL z%LpYW4~H4NVngNcHzhzlY}(_U!Yn{aD4V=R=ST2(@~qx4dCz{bR*b`iqNCmT_U#P% zVr5s?4zw~zS~aNLr_Y_EBsvT1w&RA$T^ujtzBM2qpxE=bz?IcycdR#MngL=w@)t1oUV8ts}l|1^PkkQLHD6xmE@D%0p-EmavA(2G9`uo{Q2{`XjVV5e%0c@c^_I^AK{K#&|Y_m zh=kUj5r6wY#`r=AHSrwi-1NCkq}lQIy9PojB=A2!+9>FoQ4Trrs6e!?lhYo2PGnx5 zc-;N_t-l7|WXL7`k^0JiA}QB>B1Eh_?P5qI>PMuB$P@Atumg61azQOQnxc14&Pz%w zLAKYqM>vQ`U4ZqeYZ8&lZq!&%_EFu?-T7YXxMxo-@SX6oxp1qDtR`(OH%RKxwnd7y&pb&_}+MPC}!^U zrmb65w6))T*__j}4DmZw#$6Pmk!M8?fZ680ZF2;xxF*2VxRy>}%fK0)~$;p{?(!*oFq{HXi?-JxRP`3BE{Lox;sIRXNU=Oy` znnPeSVxc4G-j6dfG&az1Jch#%92CTrXQC-3C1qf0s{TJwft(Iwz`B|7?)yYDbk~4i zxG@soqLu0cPJHU@)B!f!wR?Bih2C;4oSU=O)`D$!8_urt12BV3fRAnio_e}?jA!rO zXl#Rx1V9%ZT?;rb34O7IyLfr8tAsKi#&%+0W7AMp#x*@h6N+j$>k3juqT%PypW9BX zB?(9AWT~V8VLlIalb0ZG2OA;<9Gbiu{J2@cH>~Wv3m-U7?U}r;KQ|*H1c`k(1|`2x zWmqNHTFXm!$EHLDPGS#s10)Mh@Jb4T z6gAO!v9bZpPl}6~6A}_k^3JS>Q9ux|GL*3T=!3(uQgo+(G{uoZMSOfbA-kHE2BnQu zN$cR1(6O^`!LyqG^9NLngG5T8vL=?kdg%-!A9LzKd3F|k)-7@V_TvZT*9F^p>qH+C zi^bl%muyjSh1B-#!t{9}NwucfZRC#5xl^b7(2n|nvI#$MDG`%g!unnOVK@?mtS>F- zh9{ETE z>-Uk)rGZAqk}*zTMRCXzr2RqKqRPs(8e%`wGct^YTXDS0%P)Z%s!@n8^3~IgeE%EumVy8haoo28xIhqi+|C2%&Yf%S=uiO`^c$X&E^7i5+GF3j z2mRk+oHyNxc9@$s8oTz<2Tkd6|B zMU%42k{#J6L-2c+3%>^1-#NA~jt&$Yb9?g7EP#S9st%;3!^XzjflPNnTMxXlym)$| zr>tPbEXFF_K;Q~YFy{drF6Vj{%gk*#UAsyeSKB{cihCvnen$8K+e))m{Gu^y*Ek*n zZ=)F+nja~-08by*(P?Ij=w?oT`cx5T4&o3qSp1bgW722OojZf-Jk(pUszI-4701gi zbICs;fdfZ;pb^6OS^}2bN4EO6%=)5e`Ug&&IFXi?b_zHP|46%3>YS4F%h_O{ObfDG zpoxeIjurN5FbEbG>>;wxB_?wEt!5QAZ<6waO(_hy;sy%WYdNjh`1nwe(W+Ok))W4n zLiN5Zk!tH8u#G~zf%g5%eDEyb^TtW_qjFnfJ!GU`CVg zwVC}O1HjblhK4HiT5_-SSsQF`lu(8IP1?)Ks;X}sn6Hd>irbt&PsRn@X8@uCBRf8@AEXLDGYk zO%0?#s=d&aC?~x)F??Mp(>PIRe;DR-!4%jtEiJ8IeEbelFNTkfP7*8cbC7cD4k~MF zYxrtZ{j0zA_nM!D@lEb{GqdW6W0EX1jg*(ZS)UiFlDU4*JaIzOmq`+XMo0kE$B zy1=>6xIr0cmxA;uNQWCpY*O_joT!(V#;WtJ-sqT_ZAR$>^HxFuLp39nWa1PyKPlT? zxF8DFaab92^Vox4eak0kjjF1uq*{itHgqNc76W)!w9TY}MC%P^lN>h;F<3w26nW+?1vHNEuPSSOp&&OEXg4u445%f_x`?gL^y|>X;#;lFZZXXr_;cao+F$=y=fCK zdM(7#6d;W^Wfm?jE<8L!A|j99E3C$2L#3mOxk4s4#s0#f*0r(OIWRa#PuBvM?)8Tc zQRshZxDMBEwHtXZm%FL_7gCX)oSbax{WVMHyZ7qyoa6(EEu; zx6h`Ti!^Cw$G)`U|8|-6CzAGb42?0-O$FKsg*3j|iw`h#;v2PsP0Pc>;~{+epIAL* zA@u9Rhg>4&rSk!7*D6Bq-)Dp3cX4G2ZR+-zH*z5if8B`xzybc|SL_abp_nmN&i?j2$KSRuxYoNXVTg2!;GK^lA zRONSx3K8GGf4_U>hkzaPzpx5}g`c#tgDjS#zWYn`d7wWApd;Ma%Kmgnr&D9y`t?>;Yh_hcUA-p5DC=_8?0;t*lnv~R%a8uo%mGevl)Kag z9i3Z~EO|M9KIH@7Ub=K?X2&keOm5OX)zQ_ZL*YK{=tx6PPmkh}bn@jT6sjX&Ek@a9 z$FsEHLVyiI>ZJjxK7^wNyxv*nC7o?i5e{Bh>ZHkYIm_qG|KvaXYV@Hv1hi*nX7(^O zH4ymiRLzYoIqfuFt4sgJS$Y?&3xoe1OW{sDGHeygvurpclkl`iob2p?M@c$V_Me|`BrVNt+qT`h zcP|(~on!FbgX;walIZ((?5&lR1gU?3=m^)dA@G94)MnOwRDdcgD=Qw0)4M>&ry6~L zGXGm*GaK{g%tRu@J6=&y?UvK8r)FkeMJTKU;iyj8?z0>X@JN&~dW1T;dB=WQ!fEQ; z5kN5NdLiR+L^}kF)SV!Aku@GfpxE{2HfZ|+mK_}(aQfGNE^>^(&2?xrf%rh3@D=s} zL*a&nA}%hzXU`s>{oUu@Cxr29+^IyTf~V~*+@E{n4GfVM?$@6R9oS&^aWjQ5vQt}T zUhR*OG2%svs;k16^Xk>B&NojQLdmWqh3|<$m`$Uj_5hP__%9iHdU#Y;S0~q5!YPB5 z=H%+?5Buq_H{8?HvqxO~Ff0KkG4sv5yu7h-aU_l){NUss;@ifJ$QGbPwT~)(PVpYc6PS)nSlBT@~{EueL#wpW1kHz902%0;oIX6JhAyps8&b+cS5B< zuE4QcDtQR*zl}w!36@3C6LcmsD+@h?0^yXUrQh$X^J;6Ar-$3gYy{X_Cl-W5;fh)6 z+>@tIskOA;emp3K=%D|V7$rRE>xp(g#r2A>p{_%fD zli-jP6$$<|Jb>U`0XG{P8o0siqty7ofrOqX%6dw$u(CGJc%nN)Xh{JK)H65d0I#@Z zA|k-X##T~j_^Q61o?w-`>{>8K<#%H<%P-T393cWNf2wYI-z9YZ>Gu|vaBq#<7T{E<3tVsh)jg9kbm0?~8?wk{o=+^RbX zZ%d{Cp+Qsb5IVR9IyzW%F@R}1#l<6`EZcx?gG4GKkfN+iz9p*nf3#?Ld6I$JwuQVB z^L`IVvk%6WX#^a|I6TG??{auh*3vm$dA4MANKWQ?ZvSZ;?9cXaEXbRzP(-CP<0RID zAs|^5c;iN$T^RVPNo{@on-~D0jfrdreOJ6)$38RSz2^}-h>VWD4ye}lne*SXATn%- zL|PT#(_JwOk_Xw@8!Yp7f?r>m~5?|goq9@(C?*x#h$heal-4-k?l zWN>JniqK%g!^2GwWH=$e7HBIRa8gL!}@dq7iqLgQAe}7&|+=66kR5MB3~gwG^ZmO2mZ_Em>Q6;$==m zdm_M563N`aA_MY~7kKSJw~dW0gk|qJ(itJ`6m(hh{fU0}d}j>@2jCFgN=OKYm_)TY zmG1p;5Gb(u!v{qW%$C$+ob!u|JpBCYAuK(e>DU1GiXEvD+s}m#n+RxZ2qLP4xnZqH zAs2}3L!+|TfddO+h2c87>GJ$`LKz|0i39;4GSK+8sR>Ld46K0li{VNV{`I!-`*-i| z$h>1MM8K5vcu=nhzsX6b5}$r_3o_)O`QRWUj>CEkJW7h_cHwm)}I@FYbY4OUBNSb_FU$ zpT9Ht`22sSFy%2D7=<|bfk5Etvvm1`UhJ09DY%*UC zhGEl@$wF%Gb9|O?pyAR`Zr^^F)e=ph9+?_icJ|$K24g6h4^vVCAZ&H8D%kA@&XSdr zBNcoy8-VB^Z8%O=A9i=_zVlICJ}HLAssvFy2LUQxqrBSDp#n%W^CF8}r;*ez_xrAZFAJlYVxm?Xwzd~ zwr|=lS_>UV7d{1Q5$WjQgawd+jZbY24IAO&)gsE(oOMFlzPFqmJ$L8s-LD|Ew=FrIu9hopzv@?BL1KowX#2~Sww41(~c>t9X)y&aj;*%e_sT` zCHx?u0i_@Yy%q@)@& zT8<$3p%W+AE?&IoEL;#%!~pwn6G{dd8i)56SY55yRq9C(v4`mg?u-HWlOV812tU9% zupF*^`wY~YkTl69@8U!udD&#Nprqsg0qh_IdSs}6AcoIUVg@x8?aUk6dj*my$sZk8O%t|~;Q zETi$UF|Es&FGJ}P{ETca6b{mNC~+D5fV&>}5sg)#qhn-ZBHa*eG|{#^OVxvJ!wgv_ zdDliqM@c&Y&+%puawJ-3&!0aE*Qc$_%l+WRZ|msfdd>Ow?~er+CG7?zB+rB386aM- zEY?G9)l=%({$l~_lhNLvrNeADO}Y?M8wB$&>wA{uI=fhOINem{fna#5EloFg>p&S3 z3(JBLhri8Em;t#SQ)f!vl;^Y;U2>&L_>IJt!vAJu^mxS#PP%a@+Jr(U4MXzv3>y4LHuUcZ$G^^P*y$h(cu%QMXfPjDi*>FJGzmANAAQG8rR+4XeA5a)N z`9tg<62dC;90q*M^P0P0R&j;ht|Qa4FIIWl^v|7?$B!$kswjZ0$jEeE1ZM<_2U^xZ z%%3%Wh)7t%Gbdx)va+(~88o=u(UYX7EF>;YS6Em`#+6{Lk{L!Q$o;SYuR}SKUz$|f z0hKgc3xdZ%_wi8JbA1^(c_gCnKL7)iV|cf~J{UD1-H_>@tpIBJslOlo15zJsx5CA-uF)Ph zkwil#EnuYEV39gniUD6 zBEBL-J5l~;D}XPlZ?61KT>T1*mdu+$_SH2qx`EZZ9`rYl&dPc%=#VlL%F3z!dT|J3 zq~Z=>S_O@goM50>OF5ZhL>_6e1k$%8jelb%Mn-<`3qvp;TMF!q@tFEsk0~4hH%^fC)U)$d_K(|ZeP(HX%E{UJ z8bYNQx>*mFWmfLZ0=521)_xXjhZ~{)HvlmX<}UI2Bu9Hk2PFa9r{l9R@GT(6X$Obh z#>g&iCE7VCVXW5OrU2l$2S~Aoh>DJeUao7&PKx|-aTEmVEFa%x(6DO$_K!))dOqqM z21eUyIAjR|l3QcU{kXWpXncq|<+O{TPIcVE0MXO)hz+5ekvsj?ty>2R&i9tfkvtTq z7Ek_30&gZ8#3rH=hw&--QA#k9a%=6KO0bd5~V;vb3%UeU_p9Uya$3e1?C^# zBEgSKwH7~vga2r~7?Eic4@ipLRJ2VE2dqf-)h)#kjgB(BM2NHiZ2r>C!0E$gBH>m(xg8ns+ zu%2jcZaxHC7NquHGNX@EQcfe3z`Wmy3nHV1$JQV!tnaOcvzUZpjMA(V!m@1z8$~SM zV?d&gIYSJn+jIutiG)g!qe;kt=Bosy9$`i*Dyqs@am&fMUf)eL(nKXr8y!NXP&2*Z zn;>284_t!}0))uDvV6H@(U3HQt2=~!R~7_UmM45IVcYCSo{b>q6HH!S+6}_zFE@^4 zKrp~#HS{DX3yNJZ`r%5kN>Y>FB~UrkeLG|ilK@|#msV;he6xo*2jZrRVI$a%R8aci z1DCZNuxd>CwesPqOL{iWy^)3Tw19iXGfFGS&;%Esd}be#bL5QR-)wH9*KP@kZAiI0 zPSYNQ{j$B=$7n}|K|1oU(F2K25d7saC&$j=Q4$A4f zBo4}i&@e*tJC`;xs{1P>eOs*JGdJ_#Njf|KOiO98W zf4ayKT($v9ruf;{wB)b_23Me$>=YK(cQwI1#(wY+6m}<@o6h}o!Q@dNV6wn=oc?_h zbQencS^@z)PEtNnfLBV3Le61~D-`DcHn2P6^m*7AWbM*KPZ&CL z6+%s*TGffZD;tkYNH6ERn0RyGu=kDLO1{OU#`+A22zi#uG_P{F<8L=HbC`lb)d=Kk@zN&!br2 zBotU@CnqlCOA!$LcSgIS8Hg-Db_hbRkKrhh8CL{%b=mUj56?B?br~F@jYM2*>@AFCqQtg$c6|C2hjKBpyKwu1{_V^5LI?xJ0e=iE zZlL7&CnMRPgql69WA&J_dq4Oh$S#k**ho5+Uv0sIU2f^Jt z8skAhB%dJ26;=F%tmQ_6Ur>-Iw>AvWbLCo zZ?KWRv$1~i$0u5BrY~G~L54qJbE3C_UH9!^v8V!D@^HgR$lQoNQE%Kx*9d7!8+PV% znAZp2=N*4`u7QlR0>f>Kl1ct}-(>~>0nd8oY>}yh@MWYAppjpNh^5m3#boH`&pyPh zg2KX%AYX_u?!f1gmoNKCJ04_5+-K2ME#-r)4^+Li1T@3|2?qxU;t*`Huqm^bm$m@O zz%5lOu!Ox#5PxSxaIb>yOGs!HBM$E1SaA4&@5<7qh`YCM69jtabSZg0mQVYk7 z(64U*Fjf4D-EwlEh6(B*lJr8Mp`m2-_%i#mCoX1p6ScIUqz`;v)jv6CafQZrbQQ)?RLTBJN|Z#s!h=^K{{TamFW9} zqtb^qPCCd)00m>d<1~V*&c_%rA4omD8h!#fL<<*i_(82s>w)Yy?~kdcpPz$>zE)S zC3=X4hhb%7Akzeukc*3p0G@Wj&=H~oNd4@=ej^`N$EnhGU3$4S^GSsv(M>i)Vge zp$b_GP%1LjOo}pt2hN>8zmY(gi=4~`lcuAmUrUftT&R>5cJCw~AA3iBnZR&nq3Uj+ z74b@3c9i|u)Rc34r!={ zmKNP?`?vQbs|y)paWehu715{o~2O zaWSW?lw4w)Men8mNsU=%ndd|^79MbrW+AvB*)NFpeHsq#t6rt0m(PN zH*-5=^oE+-KaGQJ3q#71wGMU~#`U)3M~*1Xg4*PrZxyHuXMaO~Og72uy9o=gYWTWl zhbCcL(Y0&WLTMvoo#je&id4Eq_AmNvKOx~R@jJSyGgajK-vVSP`bb*R( zl~`&@GIpR1pFmtf^46&D*<16TJ*&Y$iCFo(VsBCqHOwzdYwOg%m)~|+Vo;mB*yOE| z-~YEi3~52q1qFJ91CJ28ac>{_Dz|I6R7d1ItB|EWaCthd^t}oGK8+`;YhxLU%q0;7 zt6JQdaW~2jcp4rw3j+-J1ajei+jd2D-Lx%2S`FU9HK2Pa6jsR2zsUb(9&>4V(M=_M z$5Di=#W9{+nZh$EYi;%0yv7UUl0?bLkC#_9QyrPcc zfr0t6=*bumSO|9`b8>hVFhu)tsgPhEkP{BAF%fLiWOM|!#B2Rya>tb_$CckPI!2WTaQw4U*Mg%!`S`xVUSpCcyI;n%E5l(r^r+>O zrR8;%M~5G^U`ozUJ>`SDO){wo^Kx@vh2#BGhJo9^n3n~&^#kdNbzJZ{5{BW*?L~OQ z+;f1Dax-%!u*n+A@A%`ZQE8s+2gYpSA z1Dq-txvXcnR_IGJ>`#f%urRzfy}Sln^kvj{Z38yMmI%zqTKqhSq=xH64?EmTR79li zOE0vIGa;i57&-qfL@f8&Gs~%Oudq*zO^oOn85lqv6tT3}OntaOJfj`l6zuh)7y?8KklCO44RX-j}K}J2I=-9 zc`Fg(i2;hKU%#pw8-v|@JOgpB;i#+BZ~SS$CG1Lm=kX)X`nGj~r%LbXAtV!a!Ep(O zsVw2xBg-!?uG`SmWB~i(QR(W+pWx)3>gUcqS+f%)-iYCd?iI}Mtk(gcPqiD2F*esl z(ueVg?rli(R)|f%$Op!KRa2wniBA|eHEJc)L9tWby?yu22=l!unhCPU&v)h~t=Wn1 zg9xsusECS*F?<^-e;KkaLyUR~dd)7d-_&p8T&PMK9pB9%(yPoQ3v6Z}h)!S=9u55CP&26Luf2#1!j(2CUQBW`- z&vitXVIZrhM~{41IE`e;xe?|DBQDqqpanoaJRg$_R`3skuV26ZZFDpfV@7JwOLQ^v zGj3wk>O{lq?j98%pZRxm7kP7k|W8re$jOIQV; zxo{yHlNV+*4QeFuuAo*!iObjxh}ze@TXtt*x`* z1!KmB?%mkkjn~$1VhB@tv|mO>81*16>JsM>*jOLn{0M!vq zi^0|$c~=sX_F(@-#f#3)AK2$+W(?t-lQlKSi!Z_|AZ=_P>lPF+K}=R4l=lmE_3tj1 z_YKrv{yc24aZT*~9F;18Q#;g|$BWUFQ|(U;!4Jm@T~O4kQ4d&vPjwcl+;N&2$)`|; zLJ)MYx}_x&v6@_@XUS+cNEM@Y=>v`kmvNDSCN$CnDRtj66a|wX_BxK@H+7R-S+yB9b!vuEKeM zM1e1qMWm$eU-z%D$;89qgXp`ipDXg)T6`QXoF7nKx5tT zH#x&vv@1+fFD);7j${?>_x#02rk3Hh^(M7@AWMRQj9bXHOhS^UXJDuWh4=h3Rup&8 z%{H#~Ez)oxDNi)xs<8(Tz$~Jmpde?GmPRaA*Qgsi`A)Z}mM+hJvDwE8M-&q_XF;bl z;gm&1Mahs0zPv|=qoDV)Tj%RYUJ9JgkOW>jMnq}=v;7b+F#J=1asr^kfMqAY1EILM z*x-+30IlNCTLDiIVP*D@aH-%Lz`=M3k?hxvP3Z3ZXpP_K@a+dpD8tAuJ%ogh?`lx% z<=%*&3Pg3ai-VtJ<-c0{OV@{Uk?bUp`aBWDWWg7Pkl!q#u>(!}>D?ymVI;F|hK04e zGbcxJ_%2;6Yw{Hq75&j}Y+;4X8IABxmQ+yNH>M5#nhzA)%LOn`@9euD%d5mY1kUuSfMF;};xQB!F8+!-`e?})q0g3oo&fa7F;bEM^Zm%9# zb-m^i;QJBjRTDy65HFHOt9W}DUj_x6$g0wh0!=F)5@}%hy`qctb($u7`;yG{yN=I? zJDm}z8oClHNKXR@Vl}&~VNu5;fyja+AbuS1nB)R!A{!${ zSXBQ$oZ=0*aqbI%fAz2xSfuQkG0xgoHrMkAWbPkJv+n4)Kka~oq@)$b-o3FE$^C{D zNd)#j^+!0(i;-e2@CnMo-YZKUva+&gdCj=}J=FeQ zUNjzt3t~wKqP~M)OU}b09#2x#LqA`4@5bwP29x7E_$sVq@CSSckfue_Chl6^!`K3~ zKAwv|QxCY0??4U(ar_$yD15+IfdJz;%FK1Be*x$xYf2Cu?*+CgAW>b(zaJ`%yhMW6 z_yO_>nV2x+>xha+7EH64j_8uHLNs)A_c(ul|3HQ;KuuQiH3m1)^+{6)GRb^J42XVk zNXT(mLL@N8sb*kgl=I&iK$|=s?G9G+v`8asnYzzwSS2(Zv~sQD_gGtI~fVJ!NPa#B+bs{aOl za@iX(OmMg;mDFUhlSt49ndBS39t^@1F6$LyQtufuv#?kc!20h@@uTN-RzEJRE=#tyY-`DPWNwd{E8^KKWlv! z|L_iZ$)TLKzd96oSDu>N)(_#2ZMw`={*v_5?7{OII1nA$X2KJcOv#r%@$vp=!t`G$ z)c^K3qb`E}X>?G!N*FF~+{?DtCy-|)`E6@d^c~(mT^n^@+DDN~ZoAoq&4tz7K67GE zt%byev$yD@9+4z!P7OOnISk*~6MmR}t*6qFE!)a@<701%FK$($x)^cx9atJp3p)tV z|M&;8e7LErYf=kJ#ee-iCm5IKNLd(W-=OtofVVedXhqL`@!e>~1g+aPQT|-J718AD zk96bGhh(4Zz5Zh>&n}+yuKtrb@Vrk6(JQ`7#_f69&AdID*ae~^q& zH&t_MtY$^ra^sG@&&2zeLnd0?RR&bYs9iQ4n0}ii6h7{&y&?X|ct zmgBBVR}ANTsJLx8;>gD_lb!IQF?-=Qu~5YKc(eKy-7nu#shY=`BxP(Yl!r;59BH2zJuy4r9gq{~lO^MRV{9`~x0|!RE}hL$ru^&Dn&4l- zo%xF_?q<^5WX4H^$!pY`?1{|S2>#Ana;S;D4=t8{~x!X$b1f@J+H z_*~Fz=PfsFM_Ibpui?I+%R;kNx$lhE$%VKF)}8X!GM+4+`+l}5yUW^pG0XIHSA}Gl zKR*5P#%O#|^q8Zgs=h^y&1y@hWS-^wYB`aT7whzeTh;5ycQKNy2p+8P;gGhF7G1d% zsiiM{ak_VQ+)IvwQJiNZ@+Does->!wP*ii-P&$E{Mo4be8nKsvA{TmuRlgq zCO%%aw6#+IlH~An-;?O<($*pErUUY+n(Pi&?~J(={{9{>cya7UaHDd-`*oa6_DwsR zc9%|=FdR8Ol9}bo@g=Tf`NShBW&<=p}bj_gQjZ+PzAQ5M1$= zeNcBv$fc_!%q6bEZnW`T)k}^`4@U2Q+Bbb6O{Syr5k<%&CIubYi`L)N!quO=e=cto z?(UVuR^dIpY5SEjzxT?CUbgyH$<-fPq6U=iv@Q>fyZV;M$O+8tEbIBSKR^1}@efuF z4l~t1mhtk%nUGAc^Xz|?=ji7Rxymd?-s(@tri836ZT?03uWmQdKB(KR>WpGz+NyIhd4<4@OG3B6a~hI4>V{{@_ftC`zTotK=;(-#ig^<%Mp^SGTGi^K%pu+azqh zw)h?XP1!d-xKcSshn`hH|FJPGk+$HC0J(!CtCt1blNZ&T1(ma&ALSsWROoix!}5walafTKxZ%_LWgluF?J|CWstGk>)5V zNREKCB1lRjND4!zG?IFhR6sySSd>^U?r;HjA%vfc!NU5G{z<+?eb7UK$ zt)u|6gqNVd1dX$@y&?CDy%%ZenGq>5D)54cdY-x>Wkc^9|2KAk4xE*c*>#44rCr?c%tP{?_RBUtOUT!R|ivK zF#Ee__3;-8_khJ)_MQz}K{Y<+dlo$~Uyw`&-j6Ww8VsitITkgrHBc}zsw}i=l8}-( z|tPmcTdrCDSH#?K#fLGNnqp7pZ_Etdioimo?8pX zHV%q_3tQo`_>{wxfg$({R3hNK0aa3cW1~L?04cROQ@allqOeL+DLJ^gfsPLVrU+sK z%7M~T>r#_`Bzx6aAYik{Ww_iLAs`q&@NE3qt7&Akj!Vg>#m<7*p?IV{GAu6t>3qs> z^Voq{W7R@)w)=Ze_ogzYKO{seD(hZ`=hJkwl@<2Ro?Xp?MnmLD_K_*G`TMB&^jwQP z!3@Xlrn2&iu2vK^h)^rYVWa_ge#=8!OBR|%_+aM%JiZAZ479}00hj=5R!8~U*)s2W z{@ziriOay4tF(_(j6tK{k|+KrYf;&%i$aW0BeECBLRlG z$J*6(R6PnH83JT~^P0>!a3`QWj)&3AnPci2I^`${mx#s0ZIj_0ZO4PY6fz}8iaA=( zzcHW?ZMAFLqI=PnuAckV#v~AapkG-&^2G3?ku)^1@>k@Uk0a!k(siWV-+b7#x;l7^ zi(vafJ^!MJ;U++Rgv1V*C1{dX|J^I3=H%Vn1VOC~j6Pw$DjDs#(S_AGozI~$hUvf^Kf&p3UkE0k-Qotd81<{(BE5ZoHAz%)U78IAgF~ z>Z3P9I8x!tEzgEQvqzW6Yt zD0V;iH&wP-Q)E^@H0>}p#IM?ov&)cBuql}W;#*cRQe)5}{y|8Su>D5?OWeek;$7c& zvKJ2#t0IzpaW^unf(#}(XkD*_2Q|^tbeBCuLKSaqCSw~oY%{Mpp0NS)sSdX@g9YKq zfxX_JyLDPOKl$cr9*>$yvIQSR)~KeocYgn{Cg@ZRhFf6MDHJ zH@mpQbyI>xq`LY@ymW8%_cWm#qf{ZUb_8D)C*drDZ$eEby?3A6@syNbl8(x;&D8E##;`- zfA#*Vt$nGC6yclgp{r0@s9!3z=-vsgft(?&3Nk_s56_#*GIitWZ}Z|BVcO_u<**TA zVf9au*bRQcupw8SteY(&R5)S^15B$OU(6=$ycXr#G6?3_V>>#(IUCs_VLW&K;R~y7 z#U6(zMx(~TvO$CTZME*_`SCGU`tQnvGGo}l>8O{!pa2h%hw0hYOMkB}-iMAnw`AC^ zxYY6a-UI$fjuc+|l;Wh?!qd$P?KxPThU&LLL7xl)-Sk%*13_JK!;x@CK$+*Od9*Ud zAtc3cg1s>EeL{50;qQ%slg8uo)|EMfU8S<0HKrz}>uCc=K1Db%5r{AV89DNpptG2W z5OD3&^i-aII*nKUGYT)4E3a5p=ZaA}I)DgnZE-qqP`+(*G-Glp8y!e(YA^N{lL=OO1|s*@!T@N#)$HcUCM0Z8HgUyaMeFH6eqx>c3Fh5`B7H03z1 zDeekmcx_`#y80H`Leyo0kCuwN^RH9xecz{oewgq(oA)sVp{w-chuZ@V%reZzL!Hrt zPEx#IPuq8^N6W2kR0cP2k1#Ng{5VQp=^kVJ!7k~uOM&*;MhgoThqq~v5GnZj(t;K%cMz7oj z$r)hk1kbMJT>|w8!oF@`-AIgZ%PT7#zz)Bd?4*s=`Tb6YVy9bvH*4jJ`YVZsqJ}wR!s7=|P8pFMh2%Tfn>7_8IJ8cpUmG!`wUlvhdZXAz!w#Zf#+@pm z?mq|kv$C(>he%o#en-5tQohoFm=D5+HE%qW*kNn}U;kf11PAA9c4lhYdqk8elyYtipW#5fS{FrL<}#*Uj+bV5Yr68G zx*-6Q`a5flW~%Yii`Tp;{^^dNlEOvDXEFs-Ci0mau523oh0$ijsG9v;P5)sfTEg{w z=d!kwrjr$Ig7Vt_tGC;+g;kgNxaD_DmknBy$E#-x9~kP0=%_;##U0_w zshx|lTMlap6M@dO7OnVJE5uha;oHK{xn)S})i3*3QsX6QytKXGSJX8w_Y{Kb>v+gd zul{Ide7@oOWyhwP55=F3@5H*ll?c*EPuE=!!s8j=sC}b*A^3@{pO>id&<`rSq;5y_}N?>w_`jnh_#N1@w^zOt{Y}q$Gcu7)}6|gmrWpqcE znRkqW4}HRcU}kr$auxM1YYMZs6mj^u#KU9e2czfs;IW`I)CtlcW&5q9^AI)+L&;Uo z^nz;pb&*5EHDuSc3_SAB`VI|twtNamLI;IXpT?Nm0(FaX0vUr;k51o@f=C}kLcj=_ zD~877?lZ?8li|_POWqXhM~xm+XxUw#z7?uCDy@oRE)I>TWoM)Y@{>#2RFglgDVs%c zTFZx_1?Izu`-giT6CIdtE879n_VTtPl?HOd8?7sqeiqwB17=~`*GON6z9qva+sm$2 zJWKZ2xCqVf#fuj{ch6yWVZOOT&-GNoRCw5ES$QX>vK#sB_-cG0D4{OA1SjBXo6smh zJqH;#1j#dKB0qh$czAb<@sMxsXy1$N)F*uBcLD-AX%j}=Y30HOKqmrrMS~G%T$}{&2mE2S7FR!H({J zVRyDyMrR4PTSwBI>}B759>9yCK-TBH(u%u$HKOij~+m~D{)NrWN0)b2b5)j9+nDZ}=D`%+>ru!=mE7{RmO|BvFJGSi+cCx>?A_=1GCaRfjx;8DQgara78fuHuTlZ6_;aUVd1hTRkZdLp{(rWJE7tuZ~~`R!ML zUATDFBrJQ#6ydNo);vSM>66aC7*)tsfTAe`#;pTG#fu z6~(a-t2w2%cx|Apf7Jq;G9CRd%vIEyr)act?do6u$fgX9ew06~1P;cpXMSVv-BDtMYMjTKl7xy844YD5GRH3(4lTT%o~gV*AYdfG3##J~j$lO0L->ziV;Y7fm1Q z_dSwEyCQr2kfm+>!{T*X5A5k-W5{iDt8cZc50TbE7*{dKbSkB%L-GSjkLlHaQz zqRV9!hcvOOPxkj>=jOuE>{pFJGe*gQlhQ}rPJcClgivDmD} zOYSdyw6&!jc(UM&lF=QWYwZPlwcoV&wq{H?Fi^R1p2S;|$aL5JE#0EgA=g-EwI~+e7&7*1UFLSwU2H*|h z+#DG8!C6z}GOrHV4X0|s&B5NvGu0Y~@C+^j=DR|cf6_MdyB$1mrFu+1I6GKW{) zh%7f0MZw<4QsI0&LLG8BjCER<#2^{3ZXdX~G7FKKF$btQ0n`nEbYMMXv|hj^9Tsb( z@v9a2u6u@%Dh{1^WzN-pBPPH*DRC-2YwT|AT$R+TNd*R)sttuH#~}*&^($JEBf>|Q z!rwYCQTJX{ zw94X-qFxM8U6_}p=Q}Mt8GSvD&MW7M)^*A}blh;QL>^7Qj-hyQ=jux`4Z-)mOi9I+ z?N_~6DPOjA3xaQ2{LpagM?Wr>_(bA9fIwtoG`v7b#fy(zVoyr61KtMeR{M!J12jiv zuI@~W=9I(9D~~V{^qf^4Dn}B~vtjoTv?r*D&0Uuek`PseYsz+FjoG1@bNja1O?POW z`*e;ApusJ*+dIX(^xD{z#bWJ2COPk2{sve)5)?kmE3}#qhdrmPt*n|s!A}LsPsjpx z$1S!4BnJkp^_CAtme6~_UO+A|qL=jM3uicC!Cgugik(QE;7@u}gV@IcTSLT`iDdu9 zgLQrBhDIj^}A2dsk20H#ada9}2=P#IiU3vZIgm+qcNf0Yl47aquMVt3=G-i~U(?{Pcuy^c^TvL8kUuJ)5K8 z0%#Dh-?S8UHy!HA3Nc#FX{DUExs9O@hti+HUU&iS@V)QPnGZ3~E5t|1kO-vUvCWrd zZwnO*bNaZmwc{srHTlHOHcTtH68#$b1Fq(-=1WHWbWy<}Q62erN?~1ftS_>mKU|A= zBjZCV61E_B^7M#Loi=Lz(u4V-tL@8TEikrJAekg+9(a0-V4g7kXle{N< zL(!H1T&gk2Icd9IOLr;ZS+``KL{s~X;(MB=xFH$=r5hR-H{jEI0vcMXdzOFuWb7D^ zc@gK{6H$9gKFF7y-&Y{l5OJY~c85Na?Xfv1w%kSRBE_OX{v$F0bC$Qzu_z4HYBoKs zB4Uc8H^p5bUXxt&1o9hAdw*#uCEksIix|Mg5D=m3t0i%#RD_jAwC$lv!R8D6uM0zz zO*2*r)O@yQjJ($x4LYJybO2<11jy+0a^aTB$m{C3uiJHxxO!;>U=eRW##8SN$Soxd zN~(H==iD&#I0Z`mWWTi+6CDj3xSUyzYF$knqmP@CwP&WB-X}9mr6^$<2kqM!Aa!+} ztIM1fEYK1MSx@!juAFF|1Ulsd7PVnK6-Yj<>pBeKM;A6OO~$EptjZMfP*r%a)62Sh z&u!!~T;E@c?U_Gz-ue08390Mvfev-~=PcDFe(`8{?XTn(?~LLX0K+FM|dC3W9TG36Eo=J z*LTw}Ycxy#gZlX^tI}MbKeEH5JJnD@0i*G`%yY_B5|gfmzI$e1g=9#x`j@&wcpvZ0 zLKeWH=q0r<2&bA8eM7?ui4GkSC+|REW1PjG);1>S!q80(tbKL0s$q|9vs!cF<$I6k zW>nQD)aN?0i4hrX1nX+l$n#2qI1R8pat;<2e^A*JnGe%QsRWwLngsT#^5{wq(DW4) zn2i>5FbEUg0klLM?Ad3>$}@O8;>BR`8YJ{{8`8%dx+k!f91TYkW9y zxyz@32qb{nF~Fq|!0ZC?%6kB2hop{8%>R>+LR(;iGq~EC-8R8eV_qi$cg@bSL$FJ=G4iC^iQM6r4alRfnpG0|bL9jCpLC1$WWqN4E%P5x3Ks!+m0 z7-x26Zw1Ft$R9FAOtm!Qb|=sI@A=2tw63jhr)mT$|8H4Vj#h5`u7b$Fq-jw60=S02 zogM&^TxSSa^F^R zuG4stHDxq;)_ggyt*@yBtXW)eoGG*E`?$@%6!?zS{6o^m$Ah7F`Hx#WdmU}Zg5W3; z`vQ9i+QdRb4MIK;m)_4W=;e$j>}^0Elfa+?eo(NigZ~Ob3sm&==`IFe)DN$0Pm%Zg zkoZwQBdjQxk4BFSu+iA33C1SKf8tQoGv8-`#rw>!W^8Km1_;VWO^>qLdb0$qp*42l z^a<^Gl%>>Ca7HU3mrpZlc$rB^ytH*xF+_p==WU`-?C7A>!&?CD0H$-hl`HMj*?K$6kEj{Xb86_yfm#>bme8U4L$(w@BT%_GrD}NvYpbVVx&c1WG{Zt- zQ@bn9sui+G>gutlL(9*>0V7Lxc;Imx+uJY03y`_G`nkKfKvR7dQgZ`oEXWA3CR{a+ zOmMNlF#@3MzRk`~h-oLJnL?sfOJYJq!~-zK$00!m3r@}XV|x$@LP`#iHHrp&%K#Uu z=Js0N<+oUs_`}m(Pz$upx!xiH8v#^?=|77Ee)xaBIh1t5B + object + weakrefs + dict or values + GC info 0 + GC info 1 + refcount + __class__ + opaque (extension) data + ... + __slot__ 0 + ... + > + ] + + oop [ label = "pointer"; shape="plain"] + oop -> object:r +} diff --git a/Objects/object_layout_full_312.png b/Objects/object_layout_full_312.png new file mode 100644 index 0000000000000000000000000000000000000000..4f46ca86091d452c52f53dcb102b72e7c0954e41 GIT binary patch literal 17092 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