+
+
+
+## What each engine checks
+
+| Check | PostgreSQL | MySQL and MariaDB |
+|---|---|---|
+| Bloated tables | At least 1,000 dead rows and at least a fifth of the live rows, from `pg_stat_user_tables`, with the last vacuum | Not checked |
+| Unused indexes | Never scanned, from `pg_stat_user_indexes` | No reads recorded, from `performance_schema` |
+| Redundant indexes | Not checked | An index whose columns lead another index of the same type |
+| Tables without a primary key | Yes | Yes |
+| Foreign keys without an index | No index starts with the key's columns | Not checked: InnoDB indexes a foreign key's columns itself |
+
+PostgreSQL reports on the database the connection is using, in every schema. MySQL and MariaDB report on every database except the system ones. Other engines show **Table Health Not Available**.
+
+A unique index, a primary key and an index behind a constraint never count as unused: they enforce something even when no query reads them.
+
+## Read the statistics window
+
+An index looks unused when nothing scanned it since the counters started. The note at the top of the list says when that was:
+
+- **PostgreSQL**: when the database's statistics were last reset, or that they never were.
+- **MySQL and MariaDB**: when the server started, since `performance_schema` counts from there. With `performance_schema` off, the server records no index usage and no index shows as unused. MariaDB ships with it off; set `performance_schema=ON` and restart to turn it on.
+
+Check an index against a period of normal traffic before dropping it. One a monthly report reads looks unused for the other 29 days.
+
+## Act on a finding
+
+Select a finding to preview the SQL that fixes it:
+
+| Finding | Preview |
+|---|---|
+| Bloated table | `VACUUM (ANALYZE)` |
+| Unused or redundant index | `DROP INDEX CONCURRENTLY` on PostgreSQL, `ALTER TABLE orders DROP INDEX orders_note_idx` on MySQL |
+| Table without a primary key | `ALTER TABLE logs ADD PRIMARY KEY (column_name)`. Replace `column_name` with the columns that identify a row |
+| Foreign key without an index | `CREATE INDEX CONCURRENTLY` on the key's columns |
+
+TablePro never runs the preview. **Open in Editor** puts it in a new query tab for you to review and run. **Copy** puts it on the clipboard. **Open Table**, or a double-click on the finding, opens the table. The same actions are in the finding's context menu.
+
+`VACUUM`, `CREATE INDEX CONCURRENTLY` and `DROP INDEX CONCURRENTLY` cannot run inside a transaction, so run them with auto-commit on.
+
+## When a check fails
+
+A check the account cannot read shows the server's error in its own section, and the other checks still run. On MySQL and MariaDB, the unused index check needs `SELECT` on `performance_schema`.
diff --git a/images/table-health-dark.png b/images/table-health-dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..19c7edc7023a03fb6feb773b0b7eaff71cfa5ae1
GIT binary patch
literal 19540
zcmeHvd0345-+zuJ$5O|!6r~VCltgLKILDGuAw=6C71F-1(>Wou3rQ)2&@vP)S_Ubl
zWfaM@O{J!Nowli2ey=;u_xk!>=Xsv<{aw%RKlkNwH8c0}xj&!x@_N1A@B6;APgiU9
zj72kqgoI{m@7jJqNNAe4kkI6p(|^J@yH+$S2?_0$(BA&rLAUDeI(NJ1R`1XK(!Nu-
z`U?HLR=e-z0gdgKRaS?ot=j#mrES9sqbpWf$w|5=)b*>ZO;ogNoHW8eKCiHkE6_Ho
zIbEP#s~!CyZEjtf*^ZCDnLJyyUs!biRX6D+LMOC;S)%(>o3wiMACrFh>C)8aOGvS_
z>wB6Sd;DCN=8!de*$eI+c!U87`HCJmMT}Kw`qH0?kH1{`Cm)1<-$mTcl5@+6z5k~V
z|L~;Wc02aujsK9CYL;om58_id^;Kd*7q~dm)rVIK``3!K&dbwr3mp@il zzp(#OP$KMAIP+)Oy*HlNHNKXx$!P3Iph`J7tkk(VSV{F68lebAOeW2kSn#IQSYB7C zWp=z?Z2gntdEt7Rs?D@+S0`fIsG=gR>d;(iK=vLi*OFVa#wM4;%IbNMke%(-7fWl6 z@iavy$nhKr?mI+G_9t83VZ_iuqg?}^%|fheGwhd-x4XEy_EtZ)s!BG2DZjrwUyiW< zsWTVM;+v&f()mHm(ICQxGjEnKxus0W6mwja#O=$IP_gOi>EXZpO-)_hwF}|kZ7_{j zL(Ac?qIxr1V_xl#gO8F0ofO{7$)cN$%JL%Vbo$3*ByOYVmswGJXNzcCj^(v>#d!8a zDp~3dM_5~1i{iW&W=mWU=sG(&ovlM?{ggz4f#>#}S6FM5w)VoA_pbHst?=MR$4Oh8 zt#|GImu#~>xFkxY_mh$BVlEdpLmSEIU99SGvUwY9K$AcEMUTWAG{_yehLB!xyVG7% zz@byvQOv+OOzN7kqz1QvB3TOei?pk=^Q}D3T3i{nXOlDZiS9F;>PK}o%5v%Mq|*2m zdlZ6vHrQgCm#WMn3}b{Q;5mK{d6bnkUL+gq#c7G4uvIAR%W}!$eOWUXtQ~zLtEu>I z(`xBctddAe=kQU{9p4<~-PP6lJufD*yVX*e<5A418#ef!wUaE#5P;Sb@mjzE>pkB{^z zgIW~0>I3nPG<}}flE8g>dh}QxBbJBUuaSOv9`C?MKT*xk<>iW_t|Y|k*|a+qyY@zJ z?$?hU``FM*c56H@=qK^to^lzoIenV*g~a~?OS0*+O(N5Lkln;MiqW=8v4Yq~g&}+9 zq#7;GLAqj&eM&ETyv%%Xc$i-bLkXRqk(k(3AYnT=SIYP4lI4@^`X4`hD4t#2gb^}1 zWv&-y$;*(k#sg@h0R;sGuV~Igl?Jihr AK8EMW%%q1Zzsy;hae)rV~$paP;B2ChK7pAVJcA@sBYhlpk z3;ly1^jaS;%O9^&+rlnUQvCQSKW GkVZs~=OTy~3o?SG!!C7P;>h&tBV!wUl73 zJS@f+6tyr)S_PJCsL>kk0~A58V9Pu2T)2reh1>s%PIf3-QCV5(Q#Sb*<(g@}#;Q(j z?_;?|v9sI;Zn@SM6*WXDTaR&DNz#7GwF^1Z;TMDtIPjANJ-z%M41Jfqy}dxTl^#ph z*LN&SpG8hPdlW&{SC;9;E(LsO?Ykze?$X6+jTN+MkrvTjM1DlH1ak4Pm&)TPv)%cT z?^F=+D6Uw|@(^}YfPznle(WNzr;S%u>~TopEu5H{Is3_EQuB(Xs^zt{wXl}sug{HE zcAwp;`Ff^8_WGN%ZJJ6XnAyYCR(>NErrB=&s{Z$O1T2{CULDI86JVcNg$pBT-d(>} zJkpOhg;B97b|UV=W87Gdh5&%z%i9p!+6+b6ZMQVNJrL@vOkC@HTdl0Dc+tXyoFT4o zGb&0rdhq(ytAX5NvU|%lMUUff!Lf$Wjfmlnnn^i>6?=q9oE8NNrx-BH{YEQ*X2B6t zudD3w+>ke+uD59qEqvB$>bskNc%T!P{cxR+vpW0L($mHYRX-7zxR^}~sle1I5NDFl zTpqdiuz^9u_3I17#3-wb`UVFFyXvxB1E(?5ZJ7 F ztJ|Tu(_VN?)IPbOH(%!qFGrM}-r8unhAFw(Zi$0OQAdNUaAN&W1ROf{Ot5tCa!qz5 zz1F41`uus0v+RfRS~*_rH0e@R%cDmb{+kV?dzk#jcL=aG^n<3St*nZ>MNYwC7IE)g z7ABI2YVs}`Tb-7AmXV_2Wo`E2>aoICTH(pS>zZ$#i;A(G55Ouo+{nusGqp1pKgr4Q z?hBtfb?SpfLf{P!EXUY!KZkLpd7yTCqE?~^|Q5%d5V;dMC{#LpYt|&G1eJ~prgBci$AT2 z!lw(4nwTtZeeubxKHI%Fo2?s7jj|46C3hp=?^+q&pHTJjpn-uj$)`3<`N6;$7MrUy zRcJf^+&$D))=Uy7+W?2Ys`7r8md2+FhG;HbpB2aY0|EkMb#89FIVU-HtV3~zcEaJL z%VBlztj`ViGD#FZcaom`ktfI4tkU3Tiq{N?h_+fN<5bI&n$J___y!O@1MA}TQb@9v z*>j$rEV{D4r_K@RJtTiiCa4U6@Vi&^-r7ud^xIlQqXyZkB%{{#5>|*j96{s^Bl}5& zDcI>g(2JGwQ~sF%{*IgYi(P9K-_3bfTukD%>$P%&n66B3fE&e!S_u8o>>Ds~4@7KV zS!zbp<%LQXn=1+qB4zL?4|cW )}c7rB+C?G)HtV8E;-{wp~+cgo7&AckL$%~WLnpxO)@9}>)-`Y`W13HrM59O zHk !yY`88D-}cTW^L7N$B7=?~{9sqExdMC5*~sv1GU+##Q=G4{?NcY~W)6hK1IhUGg5 z5U%Lfc^@#tt3{5?`9R`*c$HvL_9`Be0z7p5Ww@}YRANFx){T&6ZX~CFAaZOg(3oGW zajqBVl)PYyuia@0p+KvkprFYyt5>bcK!!Tul=ZOIvp0u4UR?!7>Nun}_tKjP8n=b+ z-Q(y-)so2k^UptPY_htUf^iC|;c)*#BCcM@zTTSHg+&C40(RI`Wz3cqe4$9T+)DfP z(i_k%aGtSOw4t`R5Z0N};?37cN+eTFed)IMceeS(auHw+O-*}bWrdD}O?kPaqdT1$ z1IXwrYfIw|e~8y34Zhz77;Nd8>s`93s@9Rdg^_c5Y;4TK)06J*R}a8>_wL=2=fA_< zTx;#$g7r!P%ZVXgo~^o(c;snQcr3RWs8g-E*QWZ}YT4pj%bKYC4(bAV mvl}xE~uF4s03ZR1Eg8TZDA1j%^y9(@| z40>C7bJOJEChv|%@z)i|nvSdzM^E?C(o$qQ9*yeVZN)IyY+e0K!MlA=ET_cM2O&DQ zzd(YZeCtmy3EKs@W}AO`K5*w^)+R{}w>~7(-;y5;j`n|{49HRjhNzS+VY_D4Z{`v+ zAgkGb2`K*yrnerb6kPCv>QVw--`x>#ILYw2$56-P$B&l^_Uh|@aLr}k3h+`r0H=w8 z)7a2sw!96Imd?Im#Yiz1bc3UTB%X!aTfQ)*-oE`(@#hIQZ3L1o1Z(zWm#T>JlW@8r z1aLAfH$J|#tvpUgM+bKY(E>nRclodR`T6jmLx&C#Yy9E9yt-=-mnIky@T&x4WG(iL z^s|hCJZXL(J67N&P-25CkjI~Y{Rgb_;K2h(10XX_5F=b&Wq-X?QBgrqv&apg+7@>D z;u@1D5S7cFcYWZ=Il|IjeOBagL&W<~_s(|{u}4m3nNm8O0+Id A2v3Rc=9Ijw*&^}w+-aG*9^9o+a`)t7lhh~yTUsDBR zRA?_%m6afekK^Lv9zJ}Sn3$NItr59bH&&D9Wz#xENKtp&fen!*8oS~@u;%&pH`(%8 zwm`K?2&J3Z{I$q<*eo}7MFAfJ&sq* $ lK;w2n8xe21(qrK3vr6~U(T0+=&)Dp z+=2xQAP}%M5`%v7H7-J(k)bRkMg`Zk_3kt>O1CL(^d*gzhw$4%_z&aaWDLw~7%43z zL8~AeHfKEhb7kew7iq!hD`9ELfXi3y8(#iFFgc)Zx`RXU6Fza*A7c4~G;W08?y{EF zl8^xU!N9ZoD+oNtD-4qnStB$(B5l&v!=9ewz|(HU>(YtnBki`I-WSiHYmRrxglJUM z)<(0%+#zn+`mm!6Oq?r;2-heU<<*ecPv90PDOxZsvn@{%CBW+`;~(|)0JQlRBy7Za z>(Vid9CtPgVhW8)rMlL#*u+3S?n0*1?0Y#GYLMW0m1$?j1Xd_Cf@;J)RYsy8251J8 zB48ItlnGcM2)ksqQQvwO v+G%nhbhW$aiAq_}(c?y|I%;PRGmCWY+2*PqwjdC}*U z@ijm`ynnyNlQ~|Gkmp)soen4M(5PK6A~Zn$ZOyeADEn{azB5T+mEAHjGEzrafx`_9 z3_ztoKpY+(Mr6eQ$QRvA8b!e8c@B3iWYN3{B?x9jh*;&c!tKix@jXzVg{kF^9Xl+j zOh_C(Jw3s}!8jPa0=a3Mzlb$6H|NfsrP8dlhY#DX0O CYcJ>HNE>a4x9=|uYTz6}qCY(R&&fD=TjIiEQ?v1w~-8yFb;OOTY1kPwyD z HDvij9b(D3drx4V*fN*>5B(0`v|h2q9}NS `XF-TR!3Jwn=u0kbw_Wb!K6_xl8?Z~-c98u2#-bUmO-tYQC z8%v-8fNqeT^(ZA}0N!>3BD0y {BN;R0!bS&vH=}e!ROUpu?!BQb9DJ_HO?2f;=gYl$IvJ>*W z*afJxP!W6(w_5w2BY!}LH-35|KX|daDO|9p$A+zaWQTJ(2%zC`KZvr<^smD>4x%PK z{`u`n-RRGPA_#l$-@gYbgHQ`1`QbzO(XfLD4r~BH!ys`}m=dIvE|2@>#n<7kono}n z9adHeN6!Zso0*we>^QJp5;66h5Rvzcr;}RdUIHvyXB6h);Q<1j2B*`H*Y$3wS}=b; zsE!$=R7P>_ {{rY+gKi@?`z8m3lE=m4^%n&c#|FZ-ERpyyGX|0R1~a-@c_$DhlIn zh$k}CUA%5aYAd9qV!lK9-5n6$SZJVmefgeaxNf}8img(J81FPS-TE3-LsH?e0Fx*@ zyct*VtwF?y l?531R!P{YQ?tjSaRV!d$<89Ww=$sTtWICnrZH z_FQ?0`vdDcpn(W$sCPisKd^s)7_RH#p{Ay$8>4a5z#!eVx1Pmfg=N1!xj_}MX|?`? z<>5uBO@LgXJTWpfWWH0~x#OUtqa)1m&Nlxtm$(FkDeQZad>quD zs>GQy)!@Yt+vpvR9zMbBi>sjTDp{7H;DVLeAYB0Sgo}Lo^r=L)AB7f3?wNIA-fK0< zaU}7w)=Ag%dY1^bl0~wD& LarrE~wEYBD zr|9GcM|KA0E*;^&&Xvh~c~yVkz9(M`HNzBzyliH%eAZc@O2*8wF*$i+OHNFLVEhSH zj+&Yprq6hHl2N({t>wd!KnA4`?qPyT%;W{`AU_rtl9G~4P;koi9yi6eNI*(Kj?npu z0usc!ZMw%?o`H|8HGH;e8H{HP`mVI5m)kk2UFG9LC?SXsc&b@_O2pL&)c`3ruQz8C zcQ5n{YzGe=DvjCV32%hG6T)_;qoqL7PP2vUCiNkmeCUuf*dZOx)^`I+yeaBdAX !&Ft6UP`hOFIu?lO$&tcZb%(d<%;}dH)++)ji;|170TGR?#PoR zo_yw~Ps(F+UvFmTyd?Y`Xg|2`aXRc1NY9eby@3wssLz zuS~3VqXZezm6gZ`+TIp($HcL86ZBs>1qEr&2pr%< O!F8)wFXVf#GtTIHgDKUG7Uypo?44ug6m98qyUzaYVuZrQ1H!KxJg2TT z&Ugawo|I&L!(jXmhf&U=0KY~J$%$$FMc#Vy68d5dxAmSLnXpKJkX!1mF_lBcGK#3^ z8rfvtfB10KnDs{!)GrZs;1vu81EG7@@-=JL021HaeLqFE6>HCjV*C`9yQO;R%T5$s zS;4T5L4HUB2Es9LPK;oZ>`OwL2luQNXv9N*!HmtGJ-fTR`_`>nh(s{P8|#n%4#oo8 zO`#r#?-1mYCU)uW2?@_y7w zZ?(^_hinDU9iJh(Sj`E6v`a2p(|e4##Ns4K#KSeVl;$w4Y2+#;x0Rlro(NaLlBy2a zaj!er% Tw2Ku-fr@bYftF$=x{9)L50ge> z@5X)zVGGtC3GH5a{``5BIwyTcM|NhCKfMxuRve)~&T_HlcFdl%A!0$=^XI5m!1yue zOH+3zBlA6ZVn<9l*t73sR$}va{st+0y$EU>Ln+1b#Tz4DzkW>sbi^ANHmYl9K+k%5 zH1!Wc8Y}IZn1{xZxkLe6kP4gXLFltW_^^C&_a3hD>d&d*6o(MIw 2IHi?F_#x= zjm;2}=0LaQcBRslm6Z!3N2at>q$(>aP_npAR9^SiWMRm#XuF|~%E$nZ88c@RwOrVr zg_u=f`3;^43S^Ovsgs382qNGYp+JD>#6+Sh!?=pZ0~f?A(TsxiQInT7!TjhN?2^7# zThL;n?4D|&!#YXSmNC@Mt}e-e`4(#``lx+`MUW^y*)-o4LM`u`Azac7utKB}lx}8o zB63kR!#N0Cl K=jH*ow rv9_x`bTak0Or+1PBP$Fub)Ienf%-m?0+V`I*Y5`~dV(9NxDN zXij5E9C5dZIE?(6M7aaSY(l6kxf}mgF~G7ZT-$A4mIHhN>m+0Wai>E&_V3@1+9&FN z{*3Ij+qWBn)q8G$*<}kvSs^6;==#dlagQFIMtKkA&O(=1aK9XOnYx(@%QyWxL)aUk zk+`wQ>bF>kk)ArEqemm_qRjy~g+(OWD2zhT%P12vA!Km(R<#Z3oddeYO+vE7Am15x zUfrUinQm}o|9<-i21fvn#=FxkEmLxGc$Z{jK0_8=U$ww|fj5y7dulTyry1_sw;rem z!BOOB|4zrsiiR~;YreP#*82$3jUjJTR1APUNs)ZK3MU~JyvWMZe{^toIRyv9Fxs8Q zP~unrFi9Vf|HzRWbxuI<4xopy5KGU~M!Lc5l93gj<%c1Nn1yU{0jocrs{rIdfKa=J zmjFA{jJur=3u}vz$Y%EIqx~nZH6T3_$_Slz^C#b#MkXe85J$2B(ZZOA)=aBgavB+r z&{GN84x;;(YC7d=PIDuKSVAcPqEo%12xJlKHBi)b=FjTtYQD;iPKxp h9 rp%&)GNLux=-AiE_FQv4H}kq z32f%NX_9OyATzvHN@1^=Kqr`Jxv8lchXOg9=Fu6XQr|`!TbY_Psw&R2*Mxa?k-RK& z6{N+Tns_xIxLuYc2_2)7##XDfA{W?>zAeqN^Mx8Kl!Xey0DEUkC?7m{kXS?DMQC7= z<6a@nny2~`vYrw-g=k%Ixuzq~KMzhcp4h{yt*#z}5UhjbP)}Z^=(dfCT7Y*$q?e$I z2$VN(-c0q-hm_0EImx2OQu-QRDK2vCs}Z2Gqk5&BkU-Gh)8)K#a!-jfRuov{q!bfr z1x2pSK;KB))ipI*nF~K1&3TPWs%Kq34qa-Sk83?f^NQKj7*Ye+XW>s!4%hDLO%GzP zMoZIM8@r)*VVg}l2)P94Y)nB(6|F$f5QTk=MtYevr}l~x1^TdlXx u?pU*?t=dR~omk>&Db)80Hdu52J>*I>TwKw41D zwP?xKIBsrNea?9FwgdmyjYg!+4)u!td1}Ub6v`lE5 J!0<^!-vxc~vn0)q}L~>LZ1melMwdzOek-cj8ZsN+XAT zrCABnYGoC78jEXDqDNv2QVoMQj@g=jKm5`6DD)7T{Y70-W!rkM4>~I5KB~a)Z1zY@ zYmT8(x}qA%EZ8nQB5;z*u{B^lv@9KvTcTKqG-lq@ZGyCm;A=>1YFu?xgtCS{8A+r6 zXsOwoQ>G9J#9Qh<6n0zQ6PS`@1doBN9TVJCHOlA=Ra;S&2eDLflEF?&8}m1z*Y~Z3 z-i+2hQ=gWUavI>Y_RiX6Agvp@!L-(6%M*l9J5HT>QOcw3j+5G!F`Dbzg23O#FEx8f z4foWkH(a?76b9j|MB5f})Uq&y|0V+XMU~B)KcCRu+T&xT;tW0urbnV4&A{ySuB)l6 z+;r0<-0Wnro`a`GtbaP`_1vLJist8{-iB;=6_~%@NrV}(RAqqVANzA0*DEOhm7SEx zlW4)ciNfgsYI> _uMcSB_Ab0g+7m$e0wGl}lK zf!tI>mvRcZo?nyLT@_U8sN1>+J{fc*OcQ2u&tx<_-|kzaV`S z@*RLNi2 E{QF19z3M9wRstNX5X|K7W0&9rURM>kOUH z{ALm1iPnu=MC4Ykau(WWD4f8BN pMPyJgAy(splEj1 z@VJX`IEXkH&0?9%xms(ky#Q)VrD-6)f6jS5NoyBi#1<5?TCN$0D1`$x5EsXZqv|fp zDHTQzpE-T%RG}t;{&wCF-#Ktbi$XYnwAfpn r7rF^f7C&1Nb4`(S!fvYvkY^r;>dXb|6r=+m>Yu>lJ_d)o-uYS;3wH0Z#igMvfK zV3wfktQ)z7aCHCxV4`)A=a*jE-ZW6GKqk6fr>jD>vb40sAkIN9K%)cHS*+7wETIIU zK$|Qu?VX%G-jfCRUHl+c&u1V!%eB`Ai;=h*Y7L|sNsea;r(ffftzelwPynH3pfj$_ zd0Bdk0RJ&HKB1kU!f?307BB!1J$P&}XVZgeQ&usJm=68$DFf+~y&Y#L$;IOE9hFv>}2`@j|v5h0oz9G9L>NI0nCy3Bg9 zqzza$qy0ftO27tKFi~B*y><2{pc=rupp<3i*=Tx$t^>KExaSHe{Z}?k>a)UPs+|42 zKI2hP{teZ1L@w|>+>6>c4+X|WjW1F$1hkC}K N~`+L}j~PPIYmemmGr)*$L3D1CuSnyc?x7FPJCU&&j0 zB`cUEySHot=x%;VNa? ig?fDsB v7sKX+e?^*sU zBkE*&TAI`rk3le8;8RE|s+1^r0#OhLDTFFP6u!~l1VVg0B7!iV`Sa1w1lBT+C6(2S zIeY5VX7qO<3Tj?eeA_fWUZO-trEDfDrLa3HcwAy)Nv)E+V~6KgRT)7TbqWAeOkdks zy?7b1@fF<@-Ia?mG~zJCkBz4f5O#khIwmFtIwe>;NIp (3szmJn^BrF)5g?cz5?qP}^PP+{PM{2GZN z(N#dJ(qn(kZ>tU}c#C+e7)iqPL4``8<|xE!qI!+9y*~Fdm?3I$XlTGea7s)UkR7}O zvmqH!JJ~LVua|zifhZ*oE1w}iDnh)ap-{&3uYk-h3>6Hb?O1nM_9t mugk3=9Wx zlqawQAwa{5JwJWgWZx%RxLPy?y+npN9?tvsmot1C(Hj9@eYk9*-$%$;1J;Aabb|Dk zloo341F3|T;NJFrslM>UW7BqXb}#=G3SNw|bv0NZVQdo*QOuk<^It2Vhvz6@saOF# z*YIKLx5usR`15ZPk86B;&WlLM*vjI6Ji`3-d9NSOi+;6;|LH{r-wfyPs;gh0_xkY& z^FN%zue*JF{O#}N^M^_PFv)-LI+AZ5`Qs7hZ>jCaiyr _2Uud z|8my;E^L2u#P6o?>xUmE`8S65cT@OvxBtH;nefM7ufs_qATVc1dj8+N4(EjNg?nA+ zT^M_MiM=k)H21sr-D_hma%X8L+YqlPx;S(2MVffld~HMG 8+|M8;QrImz3G=SQKz= z%hX2)JG?B`CxjDwo$z8sJe{qbr=a!gwTaK%!Rv~m+Hu)0tZ%50UMmLu`+K4O^@=F@ zfjK9P&!%-BwjqwOH+@{}9y y?A&m{ 6ATfA>beb56c1dEYPp&JXwHb;-0n&tA_e_kFLm=fXA% zlj%SF{DX{)%=FEs8+XXad^cA{X5#ZH-{2Y3C9T>rGG@7(H?H4#qPDle*W*J+Op`R& zZQ+@j;m_*>N4{@=a@kUGm3PnBRz=m&q??iEy-wG9N}VdL6Cw{f`FM{8H`FFHY^f+N zU927ERpO+TaOp=?3+lHm1JxF*<| jOuXFAzWHb#6 z9=;oRChT+%rE&~89d_5Z#1Si!F}8TTocMpinZ?9^znT)y{>KMX7JiSn1ma@X?U_jB;fI(xN&W$JG31@5L@(g!aW;i-VRk^Cj( zg$ZRYZ^u8>tTHE#`XOS!9C2Muv){%)Z#|IT^*)F{Zlv>u@e!hip~SKG&-jXXgUmpk z`O=O}31hc==gq*wbw3r08*Z-~G5w(^gn0S(wh^<7-%Q)AeuP-wd9%@PGWM4fF0pRP zX5#gYx6UrEdO87ry<9@`ijo_D^32t5iFf>DV_NvJk3+nz)!w4Z+%s04Iew8pI7Qv{ zIIKXturK&OY}S9;k^r-<+ttFfrV=MR^QW)>yudGO`HKfLf1OQyC~xP@(Cya>4z{mX z30W0SJacx@xrWyl|HHce!oB{D6V1A}ENn~UB;xG3|LDwLE`Og|Nx`y$gIc@=A*K;l zI7>ioNS@n)P2*Rva4}*3FPHP59(>uizc9=5DOL!j;&C_G_m9r}`DD*mg|#2Neo!mY z_p0gQ;^kP a;uZl;@RI*h-llUd#w6s;{PtA{mC=`K78ixySO9a`fg&83;xlWzij2)d+(z! zUE8`;TXyz^GkSz;FH_X(S!?r8obihZ|K7%zR&7eyS@;XF$eI7>%wP6sn$=;8-!?A| zjhuX8V{SCz+CN=U^j28$zsmN1^4Wir`hSZ+l0HPFXPGJg=*(Z-JTPIk>Yc@*1;wW~ zs_e5MT>A%;8QGWrQ8N2%!Y}^wSDv}(YnuEgp7}LReod3(N#bjo{QDB}7q5Ixlm7-y zHa91keiM+GLTy_yNmw6C9V`gZI&5`sE1xSBv;Fpm_jZfRq J0hKBLrn?+9F5${>h(U;i~yYEW>YX$eT^z?S>u7J6F zOuN|SnLy;g7FT7-g7@Kpdb#OG>jdZSev}1lK4bK^#qd#$Hyw3z=Xl-x19j8q=){2F zcMS~ pSe&vBSp3#?jHy&d$KC{@LcxrI(dSlKsYUfq{Xi zC(A17dNk$9l3WiTK7913k>5y9O{#NIVWFCu+HaSCUgO#Payje}qd%P0o&50O!xd*D zdpbK0ySmmh{d^7_XnA+XBzV3-Wo>P3BXKy|+uQHny&GR TkP?DX^V(~n8MfB$}BqN0I!kDRT&=F!?T zUtYU8! SH6g#!a zzcUgDkKvDfRAo>HPjOP_8+hjkx*pbLxO01YdZZJNjvuO)vBf!7Bw LO?ATTm zUiIOFZqo!JOq)Y@(TCcj+*$ZwO=#D`BZm*y;NtMle=wA>c=iQ9F4JeA`PHjedUaPk zs*)WnN#Y^C@xx27JZr2uNP{`_{<2Qv*jP)jWyGqF&0C#pZL4aZy4WV|@e+* bYhg%=}mS>jJ7Bz^Cm>i% zu-(DQ3Lee4{)`q92TkH&jgQeSTdNAg;SrFr=MV&w@$ zNCi;4KYbdDrwih%$aJG~2bA=Wf6|aNYbeo%-knoA`RUZ;nhbZ24_nw^6>rhjA0}y* zXIDRUsj_7YD!RJ5s9T+!ojY*l!`)=5en#HC^3Dzh-9P`ze6p~%>KAi0(P#VUogDf^ zmJX8{++XkN=7*h@w$Mevs<9{bBT|f~$`J65UtU`)sG^Ijl&SseTla &@~ *GllYRR1sknqADoJ+8{!aQB@4_bUtAFMxCntC4&>;s0he%aA0)COn zmE%4>jBfeSo*EuW+94ISkR&bN)U40(_~}Eje2?>kKcbCk0s{`eG{7alu&4-5X^-eU z^5OpA;9z=s`c5@3#L0$pGo}wJJxxm!RglFM3~>!(clfsi;+pAe_fqrCJa?z6j|j7p z2+cdm$?ATB7>oF_Sfe_Ge>HJDqjZ!uWMdiMy7$&TZOIR&w}zNB8_JWZQXz+1e)_jy zC0fg69rZnFzxUN=p02lD5o4jO>#-M??#>*p{FrxcvMBQ2y?b10hXF@WnSl%>muc5G z6oV)1?LJ
`9?FUNx)Di89e528N?WQWuiI&Tim6Z!6{T`Bbei2(#WGt7El_j`h(6{TE$3B&i zx&6Q9j*N^P)XH>g$jadO`#mqvLjoIRjWS769?56YG9p>8Gd2_tl~0TvxN+l#I+;an zD-4?`sq^17ezY6c&l+etEt{T}mbg3BX}GIGY`K0>GrxmDezf<+TMa!VT0XHuX&D(N zDQ6cWI-2JD)N5WBA4l4qePN?Y$O%|2-JK)pNiFMZ$j*=kS5#F=`_GX?wN*ALC+wUmh%*ax*5)12{ zJBy=q+#7Rz8N&Jw$$+xd6T79k?X-VqT(~hWvTV#=X67V?YyVfLxwL@Dy~7o@LOQLz zIFjB!nSNF8*8JOuxyec=_VNeYI8w=I#?iVt;^chau7r4&xYs@Z>V_RddtN*~)>fFW z L}Bl^a%1!+E+EfLs~X~UiIj6OQE4%;lha?kOil^N6MT2+a=wVMK8z#RnRfhN=p z3kyrK&pg)oK2Ay$?j*a65q@7I(~m)y@J*Cyt5Zx&t*pv@8x~7`+`dhl{D_fo>KMue z{8Lkyk1EyvkSy-1eth7ZaqivCp|K~LFT^wa1#RKvK52vXLz|Ukmf^Xe=@aI5g7b?O zDanLC#k0dhLqq)iDj{Q`Bz`DQzoq2Cg9m~;B*7izbl>MvaUWA=-}x LucpGUI6{*%_FCu0 zO1ny_9g*xi%i~*~a6Uf#!->^Tvf4g3T*XOat6kRdP8~MCg!jNyDwPIns7qov{Fn(V zJnZc1Pz=P=W!D)ajO|%F5 _r?JbUV`Zn9yG)>ABx9_?La zk_-Ug;nIkD9$lr&5PXPt%kE8AWVLPznnUZdVqE-Jy1G*7BLE$-$(z;ZZ}ogyJ#_so zeRm~{t@p+}QQi0KTHaY{q}s9rDAP`xE}p-5@#2Jx4X6!o3qn=JMzZUwT@_@G9jZ+` zJYHZrg5X|W7T>Y??NN-AT?xiy!>Z{YniXw_3`eRD=+P^JjRl{wyt?0a9v6+U)|vz> zF`MiHx%HW;(z6yi^&WXhO2@{ERkucX2zxW6f-3eE4$Gth1+k+f%EwnJ59^sEiBwxn zgb$XaE%GF;h%9QBFDWUZu~;ru$@WRk-x89>AIZsX&&_^4wjT){uIyYEdzr)P@5r&3 zF*(!9Z`y%bFPmQl3ArUXexrR;XKc>);r2;i#hHb-iwZd2bw_E(erspPvajy6w)VnW z$fDDf=LT=(CB^b%*n~?8I(^7 oi=CS54ph;*@0JVSpfc>Yi+O4ogA?HYU(cLC~r)fXCwQs0f~rCHpGC=MQ$G zld&=pQoItK@axxGkECr>c}H5jX3ZMD-(2GQ77ThT$BlC6bZ#Sacz75k$Pj=7c(c57 zNcG7iOHa=MWUax~W5A$7`oO1mcjOJ5Jp6seej9pap0~3}o4k#Y@M|j8M5W&sa&u=8 z$@qEyn$@cl9hoP~@0s`Z_D&kS{@~$5p}V_crd{Q%i4B{K13jhLmLAE0yy63`9N$N) zoLMp?tFucpguAAnnCHr r&$3Fl+h(TTSwoxw>M0ubvSm)uO0I!)g#sLDvI I5EQxhgDTV$zeXh^>edfle@%MVA} zr}BY#QOT^ECVoSd(zp4RKz65$T8 OmS;LXv^!%l)G)# z>r1HrqTiDVSQdTty6NJrOJo)mb*Hd_i+>cSKa;?%{d=EQ&7g~p>l-!YGH&_7!FWGi zOLuFil?LTyZmutm)E?z>I2}RoP3FLBh53hlt&w8K7|Ugzxwbv3`zgv?M%|LjmikLI z{E=Qt3+B0R?5TYUPT``vD3Q!IR<1M6NK12V%*m8ifkAamRpJ${Na>Nj%4j@UwC{%d zq%}lf|9r)=pEO-&(k9bynzX!H--LY1*!(v4>{QAcNs$IyF^{#RlGw#)cE2-&mVW2X zBEj%^P#%Z=2-Jx#dfa L8Vhl0?Yo^m!RK*i%N2t_?VbqD1MMYIqm6#tSMKh-p;5YY zl)x?Ot~$|kf9KpMGK^{54jM~Bpz}zrwn4)$N%6=sV4((S(B;dQk*EfARAt~9FAw=; zKQvZ-9d8i>7Lbsfd}Uw$O=U^{xy+NXq_G#WSQha6jW@5tOo$RH z&7n)hNB|oVIvr98M=G3*!mGFZ=Q2ZHG18ZS>IrxUAi# J$&$> z)Mr2EWOouu{Pbs?WlyUd{mRXC^dhDnY@aI9UUM9*L!4S>tRVJIkTwD#UUsLpP{~uq zb7^=0Fuxc;oFeVcu|YZX7Ypj#vX6qtr8<@TOid_7xxH4 `}kWo9|(H@keFJN20PnOifKK%K$_t!j7=r)H%OAYrpB@1mq6iTW|5k z&d$z<+bD(?GjZi&q3LVT5%$Q_6o>YrkROf^mn+vn(a6DBhsniH0rCkjOz(d&**$0A z^@P#w7thDWD&;R8Psef2h1ZuC0j{JvnM>VcjA 8fzu$vjIigbA{RcqMI0Y<0+}BJ6 ~YrV*Sd)9;TrWs?rC2=%YTTIsam1XA7ySYfrAcD sPSMhB#qX9o+e zIb?f-z}iKvJ*r=2qc!p7>cj8fBh6@#jUl-O@og-kbq9!DQTFS3ToR>2ApC6a-mXud zbU8OY+QMv!HKy0OJxop>>6|-Do3z8&O7qN(p^6m$VPdDirZ|XBaPD(+WYEG)cw{nL z=B0bX)2^l$r=gsDL^`ox7&lZ_-mr*ASOE$kfe`{8AbTWSKUz `GKl9W zzgfiRos%v$Ffi!u?v_ T zXEJ-cx(G1Mq6vRiPzY8g5u5-#7_o-~K96XG^W%V4QB^@4B{$cs2r+$DCopC3XAPk4 zKwpFZ>YnIty0zil6=hOmWu-U54WIAnxeSgEN(M0Jhx{`Cn9R$#Y?Eu_V+%8X-9cb? z^q1{t{jD B0 bm8G@f+MYdo z;P&r6e7J5A-*RVo3$boOorI=iV{02_{jAvh=IZ6CD$7-{;H~5Jex3bn1C^vbPu1)~ zK=kMQvTGF *L|=Jyi_a`fz5 z*ShrHq0aKid}w>YhJ$ZjUik6cST;7HJl>LlI;s^(MWz7YS=9U?!OES*Z-=^Cywbk( z$dMyGLEp-R$M3h2@%X+j)!A}nASt6!f9T=|JCzU=k3%ED20nd;ej|yQlZfez&RmQy zSbe`O0BTtz&CsPX@uSFy4dkA8PS#mc4Sg4KIz%A|azu83XbyygN``I%1pe*Yx9{Gq zhjNLsZ2`>};R &_>Te&8TbROgfY4Yhgm=g-GtBHw`oy12M>cXc_HM*Ff98~_h{IcySd z8f3yyU(3`o4=9iusDU++hQ~i`Yo7wYFL8ZkZDX?*k|@3smht_Jn3W1wj|>pVexg6^ z>V~!h(|IRK`9;dD>yDrc0$ZcgL7`CeV@faS`3|;1@^kQQ3!A7EX=G#s|0F?thZzB} z4D|JZc~Ih2;a-R|@Lon$$569k$E gzMx8F*`z&Jet{I&5GU_b!eE{3-3$ xs#eo(cNGK$zHkcXHd~h6i>hxi6vgp z4%
KnPv!~tp*Ml|vWLaL_m2m9Q-K`Z34TKCFtw;Iv_7-X>m|zELR^o#P z`c=BH0Oy%!3k>>Q^z)wIkp|$1m(F9u8==L*v6Tz8sYHYUj7iEKA>H6$vHbG_rvqj( z!LkU=_=R>&BXRhnJpmT$TK(wOy?ahCPE7&^r*RcMG}}ZcO1q0lP!m$<;%>y;g#3E6 zK!Bs;jfWGAxnmFk0SKy`RVAo0sFl%Z?Tq#{KwV#9lNh0OsIXtEQdr=rGz-~*h^$y6 zKY{4%RhrcdW#b&QEl|(+ybcY=99>m~tTquZEco=ol+XJ>jE&uXG^$w;yR)Yun`qVe z3S{R4@P*kr&g=iy=_;?$2Y3kPRYpT(0f|3Yq%q1`r}3TGXN-_G5#}4HGtem_`Xw+_ zVc3dz^C<6kuP-@1R0DU2ap;iiusDo}MB7bN>};&v)ccsQ-b%al=qe!^H#k;7p~aR@ ze{%g^Qc~|Ld9tY5dG0LYGr#|SqUm3gOT8whAV!#AY#SH_@C-CUSm3QIY?BQ+a`Psg zFzgs^Lm|jPM+qTxT6QdVsz$w6l>=en_7!M~)qzFkvy#E8N6?Ll#5PW{bV|O$J6{b_ z sBe|KS~#!F)_6u>j?!K|>SUtb74Qww5bP=FN81M^fRJ~2 zS+OeuN6Ln!qB3cHMTH!5ZC5Nd1bzsy%>h_s$Bt`!+ioJl^^Y$Ty4ND<2>4}me;5^w zhy%| M0-iEyYXup-oa@?3g*y07Pu`+L9kUK*!1z`-HG()9Kze zh-oz0hLO-mGmki-Gsi4D78DeuUG@m90VO3ZEe&NZHI)ZW4y_MYa}>;nbsL=9*2YHN zA#2FKtRGut=r1}Ub*`?c2-^||Oa)GNb$$|dk!Vzb1{x#N2FDaMH#ZZV*r>HDDQA9? zlY{3zO-~2%JBOI6d9@S?RMMtFuW?>Vz`@4TBviVZd}15=ZU1ORc=Q$p`>!}o_)~%@ z^r8rDXA3W{VVD9&xEU2iLVfGG_yFvm=%!KR-eZHF$U%c}12O}MgC2=Xhh!&09Yn*H zn$}7 L$-P~DgycU8LAa)}a?Y&I N$Tq=h$Uq2eXeGU078I6d3UdC~KCejDe;z5h0aM*^kQ{`uj z%}K$@tU|u?4TMecadXVUr9>O~c>^jF{h$S03lz%fI`xlE3^Y%W-ho 1dCk?LJZc6ww{1OtK@| zU)bQ{-|>|WkN0nC4_yNq30{#QT?m$wfok9h;63op+8^&=KJrUz>(Wh0Nui@>_k{k7 zh6Xw3#K5UZQ@5B+9%DbzX*h1>=O=_Ucu)>dUm@-YP6eN<_h$`yu4)y^6jc~Zc^-GS zl_ZXr9-JeiZr#?_1`kG8mOS!O7o9(l0MHjCDL#D4n~{eeXCq`R#0SxD>L`slC#&4o z*$E%(4c!jhLmz%fhSNJqbb&F^CUOO>Io*@Jedo^A09OxFSXsc4ls+^EXeixytk0Y1 z&K7%f2O!V)BW19pHD=sXJal=~vIF)5qky{Za&Tx^VC#A)Hjl`5)zuN5#;DwIs!a4U zwAo?7n!=p4;w_Jf&PdIZLmfwy;e)76MwIrg-n-wT8v~ub!EeQF6vRV6uit1m^mfDP ztvkJE 29jxM)L`r5ks6U2W|rYTri{#l4w= zs2>8%HesMO&iU@z~n^I%Q)1C{* pp4b&qrqPCv3xZ0U8l z6Z*{)mv4Xm`R9{#pUTADh^#V0^h$=o{sA(G5@v0^rnux$Y4?!%%PVH4p*Q3UJc(?$AbWED%{4B`&zdh5>v?l?kKrp~xmH=|b5FLMxFOSa zC%0o8nK 5!^-7S5OaUnp{gXwHN+ie)X zNV$JMLf5kyq>E@cthd?I);eznZwdqx3-4;w{NE(*l{e~I_$oP~g^iX;qY6LGy0CHo zGWHte7gy85^mn{#p?B_&x-ihL ;I4>|t+ zwy`m`A#I5YlKyaJ8O=>1;&0Ha=|+NZcXxMlYeYK`X7U%cD9aveYnVjJYYb{QS=KsJ z S)I)Jkj%qABcAQa2WM%5uJyElNQ^cfUZWcL z Ij00oZ08# Pq# J)k5Qa-*n|eVSAencpX-A1p&A4p2c=klME%P^2Z`Dztb#-@BX43{W+f{F4I1Xs4 z?8tQx5qC%h!&T%mk!CjOxbcUIibIyi2`TrLoNaVf3bM7%$)o#Xxt)dl0mCPb{x85J zcZ|?#*mNnMrNPgpRr}J2BCY!zrp$(vIO!93XSeYar;?ldu2c%=7}f;MKPeT8kcIuE z!jWyUM7P+7cDJmc`t5MzesA!Bj_gn~{TO3mNY7a{{# rrV|gclCS&~tozUr~Hg>CJ{I^Aj z0om5dYfH>Pz(bfN9oPj-ajt^KOypdoe5|lz&*k?O6@;pU4BS_f8qZ>}Ml*;pr<*r# zetP p~DQTq!ad4q=1C|2Y1uN>k$6%ZAm*YUv z5E;p={7Z&ux#;Ds%vLa?(ZrT?0jB?I(ag9F27vF+$;r8U_ilW=>Su8ibQ55VnNs~A zG130X!Of10g8-cI*yV7tzh3I9yAW C RrKSo1vXNX!=Z5_NS5V+d;-e3o?;2aG{!y)IWx)wc-hEz)vOuLbh z4^oc)g*)H^)Dv5K&rR*L3+J&`> nmoS+hb=ZB bao=Won;Npne`YpP(O8%p+UU z;3PzgzklT!n2-jn;KU6LvxxU0`epf7jNK1KmrZg*66Xm9HI#$oH85~QG{REnV<&i^ zBLJ(0RVkO0j07+Umv?0-^Ir{{B-FN+y&eG*h&kAh@*8Q#JKrO+x-gT9vg z*^TSr;m+LW5#mZ!A-^#HMU%`#;_jzoE^rvsLU#<1q1S^t1R2=yy8liHz?d7w^=wqx zZfB>UoDp0Aq6)OEvwF=M3@R!^`2wH 6Yjl}CGw z5Za*C;XtIX)zLvIKCa(TQDF_e7bEMK>IOZ9N?!(*2diPciQu20b1_Gctn(0A0nKuF zKhd;saWRW8kF?^zBcUpxe{cznDY!d~SiCPcXd!pqYFsRw2~xH$ IM_OJqLfp_PW 37YXbv|Ohst*A;PX*y9VF_mQ(TJ!=?EKYn3x6H#L94 zq(gh8^OKD2*=XkXv4n2r-#kCGZ2Sh wz>cW0#qa5m=;g1VO@)&JYp+Qq-NQUCgmyQoO zJdf)|RjUTV6OGI$C$b8Z3|JGxt(KOS`Y~=UE(X4X2T^x${U@dU5IKnfct=svi_dp{ zKO0*Ml8=c36ggd~oqqDJ$G>j+hG>MyJfp7G8Sju{573L+z~@6wL4))l#^>(M7{BA9 zNej&x1nLQtQZ#=t*za?E{P6K{cGKSt&w-YKb`I2dFz+b!|Gs}bD5aXXv-Hom8J?X6#LkNte>`Db(d)!mwZdgbfwv0rbG9lwYE>#qp>Y3|}bJ^1=70$+bc0C!5t z$b9`3fxj;yfAI=2VEI4M%a n%GX~Jpsd;U<;Pa;$-$@onAw_M{Z~JU za_P<0>&&<6ex37)fb~ppz53Iie(z&@#KMA#qvNk#aIBicw+p$ugmBWAstzHyuWB4E z+Sg3nrM%#Wgo>X!xcuGMiQjXX8UAw9(Rp$5AARlajXz#Aaxwi)x6)=>VMyF~X7Kb} zvBTJAgqU> Bw< zRVQ`cto<8Z(|c{)a0(gE?GK7JZ4+!}uH8gb?ghX7O1c Date: Sun, 1 Nov 2026 06:29:07 +0700 Subject: [PATCH 2/2] docs(features): match Table Health to the rewritten checks --- features/table-health.mdx | 19 ++++++++++++------- images/table-health-dark.png | Bin 19540 -> 413149 bytes images/table-health.png | Bin 19451 -> 388752 bytes 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/features/table-health.mdx b/features/table-health.mdx index 95f7da0..b8b5698 100644 --- a/features/table-health.mdx +++ b/features/table-health.mdx @@ -3,7 +3,7 @@ title: Table Health description: Find bloated tables, unused and redundant indexes, tables without a primary key, and foreign keys without an index --- -Open it from **Database > Table Health**. The report reads the server's catalogs and statistics and changes nothing. Click the refresh button to read them again. +Open it from **Database > Table Health**. The report reads the catalogs and statistics of the database selected in the sidebar and changes nothing. Press `Cmd+R` (**Database > Refresh**) or click the refresh button to read them again. Table Health**. The report reads the server's catalogs |---|---|---| | Bloated tables | At least 1,000 dead rows and at least a fifth of the live rows, from `pg_stat_user_tables`, with the last vacuum | Not checked | | Unused indexes | Never scanned, from `pg_stat_user_indexes` | No reads recorded, from `performance_schema` | -| Redundant indexes | Not checked | An index whose columns lead another index of the same type | +| Redundant indexes | Not checked | An index whose columns lead another index of the same type. Full-text indexes are not compared, since two can use different parsers | | Tables without a primary key | Yes | Yes | | Foreign keys without an index | No index starts with the key's columns | Not checked: InnoDB indexes a foreign key's columns itself | -PostgreSQL reports on the database the connection is using, in every schema. MySQL and MariaDB report on every database except the system ones. Other engines show **Table Health Not Available**. +The report covers the database selected in the sidebar, in every schema on PostgreSQL. The toolbar names it. The menu item is dimmed for other engines. -A unique index, a primary key and an index behind a constraint never count as unused: they enforce something even when no query reads them. +A unique index, a primary key and an index behind a constraint never count as unused: they enforce something even when no query reads them. Neither does an index that starts with a foreign key's columns: the key's checks need it, and on MySQL and MariaDB they read it without counting a read. On MySQL and MariaDB a full-text index is not listed as unused either, since its searches are not counted. A partitioned table is listed once, not once per partition. ## Read the statistics window An index looks unused when nothing scanned it since the counters started. The note at the top of the list says when that was: - **PostgreSQL**: when the database's statistics were last reset, or that they never were. -- **MySQL and MariaDB**: when the server started, since `performance_schema` counts from there. With `performance_schema` off, the server records no index usage and no index shows as unused. MariaDB ships with it off; set `performance_schema=ON` and restart to turn it on. +- **MySQL and MariaDB**: when the server started, since `performance_schema` counts from there. An index on a table with no recorded reads or writes since then is not listed. + +When the server records nothing to read, the check says why instead of listing every index: + +- **PostgreSQL**: `track_counts` is off. The bloat check is skipped too. +- **MySQL and MariaDB**: `performance_schema` is off, the `wait/io/table/sql/handler` instrument or the `global_instrumentation` consumer is disabled, or no table in the database has a recorded read since the server started. MariaDB ships with `performance_schema` off; set `performance_schema=ON` and restart to turn it on. Check an index against a period of normal traffic before dropping it. One a monthly report reads looks unused for the other 29 days. @@ -50,7 +55,7 @@ Select a finding to preview the SQL that fixes it: | Bloated table | `VACUUM (ANALYZE)` | | Unused or redundant index | `DROP INDEX CONCURRENTLY` on PostgreSQL, `ALTER TABLE orders DROP INDEX orders_note_idx` on MySQL | | Table without a primary key | `ALTER TABLE logs ADD PRIMARY KEY (column_name)`. Replace `column_name` with the columns that identify a row | -| Foreign key without an index | `CREATE INDEX CONCURRENTLY` on the key's columns | +| Foreign key without an index | `CREATE INDEX CONCURRENTLY` on the key's columns, or `CREATE INDEX` on a partitioned table, which cannot build one concurrently | TablePro never runs the preview. **Open in Editor** puts it in a new query tab for you to review and run. **Copy** puts it on the clipboard. **Open Table**, or a double-click on the finding, opens the table. The same actions are in the finding's context menu. @@ -58,4 +63,4 @@ TablePro never runs the preview. **Open in Editor** puts it in a new query tab f ## When a check fails -A check the account cannot read shows the server's error in its own section, and the other checks still run. On MySQL and MariaDB, the unused index check needs `SELECT` on `performance_schema`. +A check the account cannot read shows the server's error in its own section, and the other checks still run. On MySQL and MariaDB, the unused index check needs `SELECT` on `performance_schema`. A connection with no database selected asks for one. diff --git a/images/table-health-dark.png b/images/table-health-dark.png index 19c7edc7023a03fb6feb773b0b7eaff71cfa5ae1..4857af7277d1ed24ea4e0b90fff28c2a1aca8ddf 100644 GIT binary patch literal 413149 zcmbTd1z1#H*ESA_0tP7pk^<6=bSguGfCADX4&7Zth)9RhIiz%V4$=*SGy+mG
IdE7J7vhgJI>Cq!kq8uVg z1#I@C1?vy=l1xu9UsTbBvDQBV03`LH8U(lBJdCcP4GokoN1ME@jT!4wVI;MtZ-m`+ z@v}t$o+9MrbGRn5c)rMc`tFJZt&&QYNhuJBE=Tk( onF>5oqPD!Gcx`6YE|r8$j_$`;F_Q&AljE05j~|i;Afnp| zYVqyQF+SWQaFth7T&MjWSx)eZ4&eSpLhOnYM0h>PYcLiw^fGqud)45bg#a+K5^x;} z?%9XXv1^Dzu(EDPe+GzW_OeB!&Hxk|!5?n#`#(P%Tpyksar`{Z_%>ZAX>i(OSm}Yu z5O2cHlE8>4dJOjnjyI=#1P$M);h01iF-O73(ft%NHP3v2)O+(xJl*OH*;K+OeT@5B zpVQCfm(&hZhobJs!jy0hb@PoC4rm?BJKvkyod$wh=*>RIpC>r|sG_&3`rHnpH)}T- z9UeRb_eQEu){fBQ3Oc z7iMsVoM6M=xMFGBgK$C+kAkk{x_#!RsWB2%+E)YG|eR1mCKi=-Hl>8b|wLkxAZW zktBlA+GUbujo=ER3;YPlzmKs*bEg=MA{ukd4|~;b!sr$g##1Aa>Dw${eeCfmZZozq zkKP~lANcXO{&wS6&>r@EKjS?@CBIXnyYFcz03Vs6@8;azkopo$3<%PrQR$_=8~8Ru zkcog$@~t^vH35siLZ$)?P5mD7ep(=hlt2a*4E-5)#B;lh5w5!oU)8m4@%xc t#)z-7baK__(uN4okjdMx y zEZGZ5H6jb2Ph{(;QRX-0qmK)25
?+oPgjzRp<_P&xPXyKR>3 zN81M0w@wIau|z(kbuQVn2)<6`<-qRg1}=r#d)fCmkT|&6chpC@GdDk4xC;-A>bkdg z`^@o@`||cB ztl+KW&HD6dF5MapF>P0Z4yVQwmsgvO;~C?OpGEsVbkeiag~;p5%gQCl;mO(cy{kl@ ziJ(v%rnP%I^|>q>{8>Wbb $?MBKkzZob|8F! z@ZE!VNtMVzZ$a}r|o!0KH;q@DSqRz@- zYJA8LC^aJ|1ZYqo`|`HnqxvJhB%K#x&v&w3GWD`fGXYpuS=5 )A$K737F z$DICZTjR1gC$m#^nb}6O@J(a((Q|F(8Reurz2ff~-iGH@ca^(dKa~asDOB|nX;c@6 zSO!~0Zi-J76|PvS^D**8>Qu}!*92{rH->oTBUp|DHq$m^9w$Fuc>E$l?D3mt-F(D+ z^Uq@V2A*-6M_Q;=>s6oW0Ch-e3`QTC-`8O&c|Z9wWmI$O1p3H|dUSUzeT;iNWR!W- zV$>r`aXfd60T#beyYUicv2hz#GFkM^D_> 4k#>yhyzAvQv` zLhW%g86J~FV9G?&gJjm^ixiSXffR^Nah;&+eq d5%CiFq~9{1*pd!P1=WD4 z(-iQ&*ku~JwF%aX6gvs7@AW~4xd--RSHLe#UoyY!NtH<; *w`AbY^CsFroEru#T4rIdVXr+f~(Bk|Lq;IR9e?GlHh#LAWbMz3B+^Q!;B-U-tQ z>>&0ue6RS(doy<>4yLirw`8-`(tq(8ue)c&EJ%e~F`&zMqLRUT2Q+n7d-3VA{gMTl zex7m`cBy;o2il@v8hX^N<6F1=hn~{}6Ib)X Fsif z8Pqp3 *&pD`!~}_kEWL =JtKaEgT+I^>k3o~z61pEW)7|;v1_Y$vblst zbS{QqRq0n2RZ9E>{CxJaf9 ~wMLK7keB5c#_oByz z6GZ}Ve5VKIz0AOKtqA1f3&j)Pt54S^*XZzD%6xbD*03tDs_?`m9(v@jFd|fHf;8|F zD6TvK_V0d}!=NWR7qhb_n?1D?UtN|PD^>;~-N1W-&{uYvz8TLeGFRyZnZ?hS*XzMv zD(7jIRyhKb;7JL6&_~BF^*EOOR>|fsEvd{yEH;F;ylP7(3XTUke?lmP@<64V&F$wl zB*7$iIh70tA%Y(A?iQDh%WIjnaW+w<0K D-d)G`TYutRe)z8G3X qS;Tv=wUROts7N|c-roz;CrZ}LA3pbAJEX-^k> zynMgqQta@QvmI0fToy!?)PMf|;?@4dnbnp6 z#4alD+n2mRYXYyyyBVewfEO5Oc9Ce3k?4M75obZUPE=m}84d9F+8Ea%>)vP9G{bA1 zPtjgPbDQ9h&*S6qm<333wJ+JC)z-#`dq{|G&6{D&Vfz_(4`Q{!g(9SXP;;+uU1wc@ zd83_?bC;ZlICp#40817q{u&C@k~dXWMq@#>vC%NmAEVtywa`&-adh&3+cM}(Xt#dt z$3R01vOvT9`<$1k@0(XN>V0#~U*ESre?-GV{USuY-7_%$Is4vd#;t$acN$U0(4N1R zl9xw)zcz6M0&Shl?VO)d5FMd*;MmJ)JE5UHdV2Flmw!dShw6XYLS4&QOIb * z**OAf_&K;ZxM;=i($LU|I=(X%eg%;E`*PGTF-4u+C;>Tdj&O2waB=?IH|kQ+o4vxS7Vbc6ZGeRhN@u7s#JL4{ctn3) z@E?bM5BbNXTE8#l<>Gnv=cRuf`k$9-H~}4{>}*hjI*b1{*xwibdGPNGMLBO||3epl zDf-u5l%~b+igNyIHSxQAZBCacLsD1(RMb)5C^x%#-O@*WF#Yw7YTu&A*0KCJg@z`H zCJ%V7?vB3Qq8P5%lf3T6v!(AX?;S(f_gOAPMLu>n+?dqhs6DZ^rGmr>YTH42%XKb& zBE!psd~fp3eY-}nBL6&_wg)D&0qI@tCQT1GAD0`GrWbj+FozJz>xbl=Jv5}%e%Hc_ zMAEVrX5p%srVk$W#w1-we@^nCa#+5k<=N~!MXrSDs2dcrv#|{-si?rylaoDJLnjwX zZN?WPEhFm4YY@6Mrr&BOPM@U=i5=@WwUSM^N~<}wKAQNseb@|253@XJ=&Lm!4jo$G z&?({9U0{bP(9&T1wQ10dn)4T_-j92Z36T7M-nt|GEb0@KJ6bFeySYq->@(|AwKmL! z(u!)lo;I8pdR3?0MPFK`ETIGW1TEDoKDPXiB?Pu2%!ncoRpyqPGqba^BSl3;VFGpw zdfd^u*d0n?26Bb^23pf~JOZazfD+e+8SBddwW{+nvf$IZ4aq#j=mhw`Hd0m$!qF%V zmn~E2|M&ZrN%iYeM`mhTU4d&ncdl*tw+z|X*+F($h;`SwhOkX1;!&`e*U8!HyQ8w{ z`~DECDx52$&Mo;m#=q4@%SD449uK>jgY}<1|7i4I)&Bo9fCT0;*VR Y)Jl5!(YnyuRi?= z=tsk^iuo({Nk}+-+}6sjSY~@2gOV_hsMADF)v_lqu^3XXv)KYi8-CyV=sk2Cm{(@5 z$^Syj03!hQvlQQj;)&~}x<#K0AjEAv!S8ChE9@d$rh|4^;JSM8-j?X!21UsLOYp-y zLVo_{@q7ILUaMRfn3hoR_*RVX{_&Kd#Lls;=c7?WVXu>wpMV`mNHP?D>d8&X`P*C` z_|bmic%l7Lzt#KSPl1mKemG0lp4nu`ys1+Crm+G2Bif8I{rbHn2o)dWl?S`!%Tq@J z%0IlrgAg^GN^-yA|7y5c$&y-~IrGc8H)V#`i#xc<7Q3`@epjbH@KXkA3GcI@q5N|a z3!Vw?->OrkN0}}xr>OaVWx8JM@l9WN? +koOM#0$QSrWpItJBxh%78^>Ny8@Rt4l~;@1d0XK1(5Xu;0xV zj*b$hC*!kA*lz* H7KEAG*@0;cL?G*tu zH0Vg0{H^5w%{Zzcj2fB4#b!?=;(D?)$L97?!f-mWUajmpOlLgR)~&KO?3Xk*GPTiQ z%SlRLZ#I7UTg1Nv{VzZ7qx M4F9tJjVE+~;r~ qhN{a9<}kyZ)aZ-e`rqwr9BX_<#XVF zg-HJc#Qg6P 3<*qKu^F@r{DVu6o_;Kf0vE$k2HC)&IkC3321Ll190C_pBJwTf zJOT?ei=>-3YdqD<=DgC}yp)xuYXy92mkJPUH&!)yE{TDt$TywO`47?Cf(hHGLes|Q zWa<_g49z%QsLy)uT#U51TsFI4Q^%rQ^v+A8xfo-x&b4mRtgmf@_+Es4VoOt9eA&AJ zv$sBk;;hHAXepLeeys^(+eePaZ(4bVXKlq!3XUQAwMes?0Uk@~sXsN*8_*^w4!4t7 zlqyF$fzGzUKgl2;WmHT?(vx$iq-w2w*xBj9Y5HZrA9Iz5pB&7$6kAobz!Vi0oIhfU zQf$1?XBG0QzK_3QSkEi5z*aRQ&ury0mBl{Xt9^X!wU3y@`BtYn;rcDylG^uTr_OM< zK5B1()AxKJq{vYJTy}Esis^gl2udkP0 K zFIGV7q*cHbUb^(Tmlf003 v3@Hu`+0@mMdM@yv9Ebq4}(IJV>Lk$hW#={5kMd)%kjYc_2d< zZmuL`pA(syC0w4Xxp7{Ak=_l$aPXB}Jp3Os4V{3LAA>zegEb%fs;sZCz}&NO&3VSP zRlV1N$J$Q=Weg{btw+_^LB+l$rOT=MPPi_ql`)UJ^Ir|meBM+9*~w?j>B;O=J|MMu z^hejdfqv =Cbnb1`z5UN P ztp)Tqcp^ lDQT5&tJii*n5F8hzaO#?n6kF KW!nh68Jm^1=(hoaU2F;A)Q>r`T3j*8(+BA;b`9uzsKDeqeo1Nm(002?C zMl$gj7J$&ey-n9eMaeviDfn*XRh?#Zhe(-Yl#}?%C`V6&kIM~;|Gh;sqKm=T<*VwO zlNs*&tYIwjoaohXo7v=ar(^%rEoymE%@EDS4{2ETi;w1g9$G=nb?z^BRGcit;V;o_ zPc`V|RK*S|!hsDa0kZ8jbQ9)*Sj;(fV7SN)A(MSxi+M!CnT~8y%RYGnd;zTi7$xFx z5d|g5i`Ea$PzQ@Oxyka@KI^0T7RoMh;OM}uQ;AD$!Zna>zVYe#WN;}v2CeGD8v;dJ z }w6mS;!lSMp^c z+~@qb#_IaMj{%BLxnFG?&Q3|d?r2<~M4?SFuCZM{*C5JQk@Y&=cBm>Y> r>i)%=NF`xRfw;YN322%_dPZGHyG`)L)j1icvN-k^3=G zGzC>$=e0Q2?||_-fXakg@`fskTiu>L-e;;Ffac@O2mbc0`{^jOz%s=0h&9?G^L5(h zw>BAZs5-ZqNVu)aAh%yW@urTyNdsK#sIR!FQ$mcXMbNgPtE_4$d~JH90%>sF!HY2d zh6Cf|WNWVB7q}=USKmRUMZw=IStGhXrhKZhTWrm@RrFNne!>B|x@<_PcwMG)-}^+B zn5;kvb-NvksHwkHA`++fAB5b<9S2|i!_(9dL5SU=0m)Nyceu<`RNthG7{v^im*@9L zKBZ$jVah#@AK&!41yOHF_9-x4($00nb!sXml#P@A-Q&k3l#oFUCkt#|*%c*IbdQnc z;bJ{Cl(<%)mYD-rTWxM~+YU|Kr_0T#&^;cBe^53D2YvzQ4vii3&!N)d%NcF0VHDTW z7PIteCCY9^8Rr8gzEx>)vEWxx%7I<|ruO+bWb@f(9MRb8tE8l){<~MK_f&5ap%dia z@PAfqc9z)RI{!N&qL`0SgQ0bHjm|vII>9LGFOzc-YUy>F9nf0xlMkD{Dl(6zpSC@2 zaoO@Z-F1mc`1q-z|9e^+SIxk#TQ=Qq`Ywq%hCh1f^H`z7E8MHw*VsfQWiY~^tk6WI zrbCmQJRY%m5{A8X$X-Ra{g{w^m$ho*Qtt$wt9jieu;_hg#h3wcUTXI>`j~ayN^Z16 z;_vWO5;J&h4Jg36y;HZy;ZmzeHJGGvv^`T5JoC1ysw(t;9G3dp6BP8Q-elkpAsm08 z?cd14C3EAU#C5TyRS~n5kiXc +I67tJX1MR(n ruDLM~ zvt3SRzGhp1=DG-VFv^}Z<;I`Z2~tN=+^>H4---)=F{Y@@{SCGs!w9u%Vr0NnQs*jE z;5^N~sRVT2B @5ZZ!~6pF z %wI^AQujshY>oU_%6syxX; b~w4e=K5Hus3Yvh zSO4q%{xFHtW7xh)Sm9zQg~sgwdxO(2-l)6k4!V)#^;F~Q|CHna=h;wzB!1*fk~Yx@ zbua_{4>ky)vowl|y~4JpdFOsfuVbL?`Zd;)ug=|#c`DKnGbK+~dK$4HHF-KYaoSA~ zF?7mOGf?4QO8#%z3g7?zjZ{W$#3NK{d)Y%3jL+@1Zawzmf6TwDXFGHGY}b0x+;x14 zEr#lj8LPQrzw-WN<%X{8U}SmBwY72MeC}FY!)y?>kGs8P)>S@{`3{l41HE5>xuqkI zurti)nGm cw 9i{9xOH7WgA0!-L_gC7dZ$*aTuP^JZqC%{`xr1?O*okB$bt;L9^W)!~ z;Gq;+Qzi-@3R6Ai9uRz?689GL+$yO{wHM#Ot>+&GcXdfKI?HZHCSJp!+0ZNG#auec z&l>Ab2?h|KozC*&UitJ@Zj)Mr&SP&G)hMHrrH-JN&D7~-H~H0yEE)vA=u{Zohj#hm zsAW=Hd-Xg38t%=%GKDtxeLrIknDW-5>W`a}jKVx>UZg805cdW;ZCeD4jPZq72DJzj zKc9S4Hx?-cdNc$P=RWtxfk|A>sbybXyWA>8(sFTN>cwVHOu+nvOis2J#K!87W2vet z>EaQlU-I;;^FFm|&!?h-x!g@K&nbK@K=&WPT$KQ0TINkf1l2V4&hQLBVps$Ykd35p zc o;8QlsOr53zMTP}Na3#Q8e7u5&+C_JarQjFV`) zH|=Q5I`ZN)O_FNgThw9uIZ*+XpnV&q*VZIE$tQ82)K=8w4ktlp*cJ6S7(bRiVg=^X zUMy7ZKA&QaY|EGhI=JPe{`O6yW^9;;Z}X Txu ze2RR?x4?DddjsTKv9xbX#2YZc$Qy^I*ZX)=qk1Zp4I9?; OnZ);w8}D_l p1uj zzl*N^dcTJ{o0#^Qn>-*%!gV{5sK-e{;&M-F?oiOx*!ZjRqk5 v>=w1!1MR z8$A6WnGG#(-SpRGH*u|X2lu%ydJUfEbz@f9R>|IoOcj>b@!Q6dn6vo#?T6wg#F}V1 zYzh-k{9fX @8M#g>s4i?;lY3lzRYIYi-9bpOA_{XeO0dBn1uSg?(=n@=q?BqRiu9VH&BWl2Kd zHTwaE9LrTi#r0RtE8P**c`XhUwJ!l@g0y9Z5ULg*BqGA(^5g5gmkk%!KU3_4sn(;W zP#IYp3`MiNiN*NAI3U?i;xSo>1!zgqerr|b?3(-Q$@xFxpATl?UNgk^+J{6B?b8X| z=TxMw-O$G^KedvOX@v}OcZZ8LuQ1h62ISH-<$$W|oK0oTE|%$w`kqLHWzG7|KWIG( zYs)8cKi;h2{YWL`Z9Z
A9%Cq*Rb<5c!rz{FL4zK(4sHm*fQEja9;a!4jR5&6<#S7_J6I7*$TZ9%$H|x8< zEbY8CS<-1zjhbgh-q@nvXRoU(D+z~2NY;6o3*kF8@rl))i)aXW@o#pYgSWfGe25;A zlasfYmaI52sLC`AHuUzt{5?gx<0XmHPjO-;+t3I{PJ&?-UQ8N6lF*T}vcaDMBD_}o zko|F~pZeeMsFPbAfkLwy86_F7lL}O5%c-eegSJ$@*gchWwMES#Ut0{s;Wh9f-*wo_ zA2lkNGHGbt5FqarrHE%I5=we}q1-4Te0qULHH)kZ&ynvjPr1Qq^+41#(kQ@*`!ihq zweVy#jdRv3jRMV(pFd5VS}3z1Dk>_nD1xY*#`)qTO5#e;^JH7w`Ql_}eBDJDUkw&` zk3 !P4Rz<8d(-NCBIaw?oF{O4?QpF22XylpFF)#?BN^Gqm#-zczs)0cY^#$E_A$(p( z68VGrg*3EWXc%P%Ej;U^dd_F6;#DQh&xy@cpnbB}TKf7!-UVQ)88%8@_ubjJMV_Ig zd%5>-z?a4!rCuD>>R%J`Z#4dASr0*@`i{O(Mf{xJ6LDm5v=Sxpg@Y_>_* PZTwy=>-a&WZ3L{*81Z*k+V!F0%Cv}8qW6S-Qrwn{K@u=N#sd3 z6oqedlw;pqy{#mWM=@LLUczcvX0)pBng-Rm(tg#A|5j$Xv=RQug)T`HNV3Tlg^a=G zNA%970=D0SACZul$Zl?BU_U$#H_SC(3zs5`;^By3d=?d@RMmU-`9%9T*6ZO>tia$0 z*Z1I60uYrvEA0`g*p`1EWK}g&t|2qUQ}*mGOV1($&-QE_sH@HNA+lpO7gf`8;4MU| z^?T+Y8T-h8HP(Hhx<+MPrDM1lY{1!43p 5}T0MzoF~m=UAr8lJ=@{!-p6mUKzAoyxP%TX+BPW-82np9K}gIBtKyk%dK^mma~$ zSt})#NmpO0jZe#{@wWSNX9!F+G@~1kbv+OFd2=3oq-e@oZ-*Fcwz-{FUz+m34Tqcq zF?qiT#~rjaX9wBQM29&K(Vmo`YG~-*3?SAbw8U1IVQan^)4JZ+ PWyp_B2zW60`JgIC6S-*IR z##7YNiH4QT+HXSe4>KTTz`z_& 0iRBdpou z&~(#jjH HMT z00G5**Zs2R9fqOVh`ty`(7lCymu2f72Ngq=w`Avb5M(XS)wE!c+Jyn2iGok2k@|O- zAbsf113vX?k$wNj{RuCI6)iNI_w{2@|7P%hg3>!tZnf~CG7_EXSzHRiA1{rw_*pf? zeXqVN|1h- _k!hEfTK!{qtgd}W z9HCid#|4$pEkx$xz(%ePnF^7*GdwJCYg&p_ZmE%*@Pi_27tq2X1tU!?URCdRw|rDd z+t=BZu4CDG_d4(vMV{|JAR@jn>1TD=QebhL>HKC0KR+aaW(Hs(3@Sgv$OZNDO~Apm z&wJt?;-sI*$9fX>0QEm64u3MIUXYV-WqUsOsuP(*!f61AqLQd!QaNW^no%Khj=YHt z&Zry%B=DjHDOkDSv7S~EaGnxip9zjNGeGM3QVjQ{?9Wu0)!j+nlk(2WJ?qYVx^Y9y ze$PP~F@IFY$wXGZPiiGOHLp
Z4M%h_@8E^=m~__TWxeuLKqjX1M)fX8jh>=7Bil`j0?g9-^| zVwH?wS8eYCmp`~5s?-4#hcgmLC!9>`+BL{mPn(WbO>FVq>zs9Nl;5WFk!A)QVOk6o z>MODY)gH^xz|Fjme8VU16kJPPw^>HhYobcO-mi2`tjS7~WoC+OQ>-SYVp@;CwAA2M zDU-%XVd0(Fq?qT~NjuHkMVtEK!HhQCU@D`<3{M#pxhfXt%!C+HT90!#bg5-8PE5z^ z__MEbT{kWpAht5lMR^wYiCRi=Z+gU!4!rMpcj%&s5LZX9$6o^82xOmSb_C5kmK`28 zWr?`?gqIpN*$$wIvK>#V?>c&%zG_g)H~P8QUJ#?!q6uFcFENRle#OYPqev@3@j^bW zMFPD- @z}Gzj Bai#fyG z%5-s%X^?vZxKhmBUg9PJx)7R3bLymcmp2%)MpRVleY}=%Wu*f5_&M<{FdzWMtW8H; zP){>?TwR)_XnXo@c{Sn1B6sQ*7G{wLYhke6`6k`PqJt-P-C*Q0iAa3$GFc$m{I81D zzX2W9K=bDd8>_Nj>5O4i(E=2P56m;rbUk^2>6vO`(Nk;S3{QI}XcP=sOXFJYaOWs7 z!D8gD)urfJ5ZVs=b(2xL@B~gnSGA;yIhGrF&@k=M7F&@fcsjzOZGeO{zODl5 _9t{B(oPcyOSP z&q4`d+`C&iQDMF^TPL{|*q`5bc1KN|E@Q8rhpVK~hMTtYs==`0u;s!_qH3kpJ>C=4 zDNgT*KhxjaoiFLzLKW?cobB5lgo%&bP55pIMf7WeN)t_Ik4pH-zJMQYDtv?KdNp)6 zIIX85AEmK? Q*3;bdSI;*# z3SfcKUhY@R9;a_-qDG3BcLlEm_ii~oXv^yP-r|*aaV|uW>6nty3|MH z;9{?&5h>;o w-VLMwmOB;7I2*&k2|eU+R9PJtT6ny;5hz%#~tb+nGjt-Q+V z`z9|_1qmo?{Y-PpAXl?Ee9JvBuPe+0>xA=!mqNc?qRpL Bs)Tt^3Ke&NBL)X*U!xd%-aG5eQx1#XRurW-MQ>o;ZePBe$M3CDa}gD8U4MubM@e zY;yMZD6BoE9~PxjiMo@PBtLLkVE9gwbdWz{a9q;z9nU`pS}{81Of(u}XMmX0LuEhL zbC^f#KEO4EG^c?6Nd+6{*;g#;#z;h<^nDk_dv})4)YmFj^1ghTuf(}rs&`oNJo@o9 zKt1ooE4p8w1MahlgHHLrk!?W8`=F0;_ep^3`P|}Ftrd6Z!%;|$ouM;gknGLJAcpr4 zr#wgqt-Xi!%Pcm%#`mM>H-?G6VXzxNatYq$4KRlu46^R a z?nLC!qk{;EZBWJezf Ll}ljQV* z*U5+oGSfk6W6yOb6XkRP^@tw xSS>l1Gm`ANelZwSAQp3fb){ zdOgnHFOB~&@(K3cnA jL6~siY^~Z3? z>h{T{@Ly!v!K&}tcPl tD*Z1lUn2h$4W^W_y$-S_FjHdu3GQL0biLErQ@l(PbvAT(@qR|UJR-VW z`4SbK3H-NW@2Jp}nO#=S851^ejS0py7`A#RIZu<%U9wnCPmvmG3ax1v&hHYCGr10c zE>2uUs&}qXUSPwkFb!42^nAH!hR{T?zhVFt-8N>#?q6s@I#tkm8#K8uT~1As*S43} zztz~HzW);r@fA)^Obs?jaiHkHO>-LxAIl_2#$B+fb9+@E1>dfVs11KEHVf>YJFaoL zxU~n`%r)uDPRMag7-&jp-0$HDh?F2@QyVNU@`(`;e_P%~Ce?1P)JeO@VG$J;7FMeN zh&cmXMW!rXNJxnZ{fv+wjC?CUhN_~}FDglRz$kvP@Xu{r*f5EUZC-(|Ecb$Rf4=ic zG;TLc&pH)7+)N0;JR%%DopW_g|D!y3vm*BrW0>DEvM7c@#%y9Li*Q8{wf?y9jh=!k zcpie-EMkZ9@oUl&8DCspUBKskXx}`^+KI)Vqg7|*gv)h*yjbvpOY`#bLhCBx`s%w; zmAqHd3d@byoeqK~Shz&i4yvzP>DOsu(DD5~mop}?W8x0zbee63VVjJTytO>@`pPlf z>b3}~+W`_7o5-#oU!FUWJSp4xIt%6X_nEVHf8vu3;Om@8iZwq(WmK DuyI zTU4Ghm)VnN;SZYtab~d;8xoQ AZWUkypBh&@a6QWQQ2y@U z^*+SzvcFd^+Z-L4f11gqlyYF1U{RL0@|!V9VhR&6U3h>U2tR=<9HQ&RzkVRdIS^td zxIeA(vfCh_G`tN iBFfYws#pr=^-S-|lpTiW_nKy5}sE#Lg zWDW{d?8vc?OXf?{Tzy|*dLkID1L%2)Y3E$|adsI6KvuZ5kE=`!O7sPNcd=Mk-m}_t zU46wrX+<(=)w;~wA0F<#3)MQH1ulTHVovAg`7MpB_;sLsuF`<2>nk_N9M1y6sj9W; zyG%J?0Xa#MMtWy9@HOMbP TzvN&7ieD>CtKA9!^y#C9N zPJQSz68u^hYqJmkR2!=8N=V};Lsbh+YiK=xQ1L8l;~A@)V{KiUD`7lcxmoe$yxU@n z$5*2PRIZVxng;Cc0I1W`0*Q==7`x$sx9wkM*>%KEd;w=Wn4RJ({lURhDfWpn`j;W~ zvt_9=A3zKuXAgxpk+rUH?1};tYq|g>?CusAxG^W m-tYWWg zf;M=6z&a>x_u*WU;l_`{5ec|6EE0q|+2!%3vM^)ZW`+(rZsBK8}lCi&XZQ$g6ws z0WnEQ(!ckV8AI$VpSL6tn2*T2Jnm7JUBnE-CEx4j#p0W+(VsGLcsY)?M- c;jKb0B^-=@(nobpxO$CnknRQj5&m zJ=$%~!Tl(KCg|mzg*4V%_wN$%pAO>vXwK%5D=L!cbxJ+G`uVtIM$#ir?fhmzLy`*f z<8#TyUGbF{&X`AF->V|mpr#$cEL7fQ4mv2_O4xu;v4zfUy(zQ7zwDQ;rhBh0+EsQu zdvyW=D)RB(L+&lnK`%?s%}qVKk52~%Sbw^EFVlWFH_PXOxOxQkoQ(hoRy@qhr0M9c zQU5UvJ}6C=^j}-F=f8kCU8O#Q1F>O;OkNAex5+!PVk4g4As_(h)J-I%-&R9UEMLzK z2AL{4t0b3qFn++o#t*(*Yc^uwwNs1EShU*gJXerX%?kmgd;X7Snn_=xRwl?yC $Wx5G8U+a81s-7T8xMMP z(5_XnIp%%vlhAvd=*Yvc{y2Op kWV24d9qq>IGx zD3^6Zy|nohSW;%Y)>kCnVw1s!E_MPP^$DFvi{L+L6Gi#bxd1h7hOaGgMV&4%wuM@X z^y9G*ZzoNyqYNeQ__GlHw{ZH}K$#?0;3_HDJKVEY8TDX8?}@}Tb>PR4r~^5c)058I z?vI8<6w{W*B?o;*@Bh$#RYo~jjt!$usfY6Rx67{Ia70N0%x-zfs1Dz+6g8QLVj&ys zVVlRJrq&;s<&TEB^IoziN`1SI!yO4ujYc4jx9si%J|DaYr&bY+U-W__YtNlThr7vx z8=8U%mpw?>Ge)wvJ*E=OF2f8j*`4t1!myXEFHei!lr=&Yy`%2Iw6iV}$z*;iMMuY8 zI_e{pY~}h@ZdNJ&+zJ(q9QNZ-PqJu#II*sU+PcZ%lWT4%kx#Hi_)!t?M=sh92=YcU z6ncx^MWEI;)8xb-j`HqyS4ibtj)L(akkPLl;*d>qcZ#Vl`CumS2X`uh7L`o8^4B>a z-%G9*YEk!5Yur4&PdF4rJf zR!}|}!zQw!t`LWqfIn}R8KR4MEDLm=yin+$+hKx%d!qJ}su9CJoJ%8|jqnGk#~HPh zD3%3!;9U37h^gkb%qY$;CvgzZ%W*$r9<{t0boHj%;nBr${=c65WmKI!Y^_VP*Jpqj zG`W_Tta^m3gC0ESx$&UNS!03Z721pu9m9FSpBmr=e${ZltK!@K-*>hFnBQRWFLa5C zJQ7F0+4cKhhs_2$nI$L%rx#~!)V&i*U61domg9L4)<0`q8xM2-Xhk#>lbW%xF!NKQ zO6+oBa&%{;qL~XeUke0;y!$Nss)2~ kdu_2e?X8;@QE&QH@ |U~% z!%hB%q~M)#>X?W1vb00o+{sQcggrDLex_N``g}>%OK|J<|4u}!YdD$XEo>tKLR6;& zw{goCVWTphi)NK{(GAVo6|c|u;GLEQiS=ls?QHWHEE{yH=JpFy>SGLE0Fs`z@R0Va zFx7liZRaNTIL?$m v*54!PY6K zeQ`FQx#E{{Sx7F6;M#75pz5Y)IKDfqx&$%&N cVx8!L@S_Mr894i$FpLj`^0FR+a+I<7s$0K$RAlmKk6U z-<|g|HS%RGTW0=MFYS$J6GSa%cb}sc5Qj4PssiQ?4nl?860-Gw{zwlOs>7EHdU;+C z1Ifyq au|Jfu>$qhuwcv<{~rS2c^{ zCuwpMdJ^GBk+-58;z%Z_g`JsRl+Vjo!#RH(u83f~%Cbk5c7h0UX_b07wqG+{0Xj$C zp>gt`^z1G46$}Z*rc{`VJ`sM(<0dNXZl2K1Fyu}czb`5nMLg(9NkU7?xGVt=Kh!oA zNgullv)~Lam&dj!NZ~qmx=xMSOFD_}OxaSUZjM3KS}92i=0NgiSpFC nBLf{1Prqcr~Y39Pr~pe((?s2(-3&CC;12L0&y6` zjol;#=b0TO09mIttQ`5nv>ACIeboBL+R!RGBD8XBY%3QQIdMM6APN_Vn>j`Bcv5RJ zWt?7IiX1C7E!RCK|HvD1G7xqW%Fet{c6N9{JnBSwX>o+y2Q;m_Jpu!G3PI+VSKoY4 z4*sPj{(t7k;p<5I@a{xxLy?i~ozHb1<&c=P%=z<<%C!AFFhz5H{j`Sfk0>*x_sHxN zgUqRwD*FLMID9s9<4ICR>eH_u<+n2*VBjvuK-ulK30m(@kF* &hhDj40tm`@}!ULe%Co$!8^Un>FzG{wcH2$KuqYDH0qb5xOB`V`|ClzKR z=|VPYsIrRa*&9vCC pf(sni1mE$X?7;`BqY#MRldSwfE2<$*oOuc2RsfAez*)j}kuu7<{ zL&9&R3}l)b=Q!Qe#A)m>R%kL7O ?MXFx^80Niy3yVVC_-*udTCM}MNn*Dz zChw 7fe2sCw`yI>l`63>ArI(3H_&Z_cfSZw#GF(_QjA z3?w q(}%$io9IGDV>Jdu3338!9t`5F_%X?-}7=7Bcm(dq*%xJ2j1 z+}1n10~ljTX{j{ou~Z)N*_5~N>hoW-!Gl_p5xqsCcJb8b_K~rOg`3Ux$ECXr*|R~l zP1m+_hvo_MrJ2Y-!|Voj?0z%+&002KslHkthb%AamXT Y0l>Ql$8p|hp%|;hvjO~*C+d1{Qk&`c6U=y_eeIS<4CbgkCy>Xt5Sc@ z36$BGvEz|HdsH8O3xgeRhJoGpdMMNsKN3jh_GO~v1F&Dm(AYp8e3-9ta9rzOiFt%s zK5ZAXR$#OBG4%s!cQHevnIG(z+v9a|-Ie>i1ij9fUY7`Z&}VnL-W?HjMG?N@oa#Xz z*Tlz+9uM3beq|PAT`*Kdow@ E38o})O9tWVIU!5)>iJdItxnz zSd;ieO%L^B50TK;WYkDd)z>71uuOo2+&23>sE)*fs*}OY3g=AZmGTnpl@l}$cFpiv z%j#Z55nBKhn;Pr1-h|c9-a7FB?!se{JEH<8VeCE8J{3jGwUvYT#W=0CA7D0=P!uar z;d4k|DQQ6&Z_=j*)l~3tVrt)6G-nzK>4i*E@eaF#=9qKX`6p*IMU)C->_Vyo)Pa=N z`yw%cQvGgIDNV&a?PpKfv#g{LfnV_}ad$dn F!JK$yq2DEq+jX@^zM>M$}DVg;AC>NtsFmTmgT9z>bZ zeC4rOearTn&{kw8!Lt7A-DxpeBy<%exi08Ohv2idLeD7;c|Em#t^(gLN2FcKZy%G( z2A9#By^UbEl~GgP&Yv&0DB|@;yCc0u*u8wFrGdDDJF4wK;?kbiR!L#N8AR}bW|B6a z8s#Y;X=rHEmWwBMW`pCL11iY-e74D90=j&nj$JrEhOFyuP%pkVH?6;p9%gpoNfWox ze!S7doj*>%CUiy5P+D{3)S<-a4ko(ay4BEN_0a|Ue~G*>fW*rd9Jqt*jIT}9W5>JL zCs(Y#5&fV7nDWy^u+ES}TdRRiQzo@*#7?rY3tk}$_QmvyUl$LN2EsFG_1o kfr=~h1k^{?0F z6{6-N=YuxFxzaZjZej9NihGe-4Z1sK9yog{8mb*FnZ7#_Bv#A}8gZ0yAPc%!ks!z5 zj3{-wka)d6umGrbnS3qJM+@|apDf47koFypT+L}C0o^CjzKZEOG?8i!90FApX7__u ztpn!l-1^s7m3VvZpO9+!DM`>}evHwg7RQ9Y`p7F)Oo$lTP$eD?)m{?4OpO(^A;d}g zpoZjjE@(ivbB3Kp`SIS4ACjIfyxOZXSN`M*M0JFd$?H^egr3Pe^YqFUU#o0v&{^x! zH1~9#Qc?&B=SMcgr8969$-rWJdl|LI*5ZWKhDLVupk=E~^Oe*Xhd96T@FwE~Ve0Df zcPFUv@FwOpc#Wc2tL))4>}D1rGtYN~dBnWZVY;vj;yAh&>sa8#xEl#EP-!~aIxF|x zRFbAYpi;4mM4x%cWy(&ohuAs4J|6Hpf)DbXG*tKh?)aZj$-4IN>H$`J?u44yCHe`& z^1-w3ok`nuPkhr!@1Iq`z|-Za!EjT-7t_wNKC%Ft#l=ABhheBf*r8XYoUOwIWjzLM zs&NxOZP0jFI|3X1eR5TT&B8ov+nseY@C)kkY=(r_(50taNA3FH-Ra?aE5Nle{^c$B zQ)tcgs1%^A`%I283$EDkIPS`IscD|XQ{nTusWsFQ3ZcADqr~JO@2P;da({EdtL9mC zlYb=Xz+&E3MY6AW+tVOSN!NQzb~Al0p)o))dKFhXE07{b5a>iaK!UiY#OW_}I4vM9 zUc WkyFpPjlR!P%k&g4s#TLy7_O zHhW%~O%#uqMNo~G0YilOK>m~#8bkX+YWh|Uonp^|F(`s*v(fjcypGOG5EFx5ULpik zX+KxL+I~tyGW9+mn`x^vWQvAD4AizeInEgZuPSKLl7^a+cjjwOu;%#(k4F`$%+SYS zIF490_)lmfS=K`GR#Z-BFk7T%arPcVsux3c6F9am__F39J|pRkn#geSD`Rm9w8)yi zP;K~>dejz*tT8OxALnW%erEkgOn-cCZ*`G*!|N%pS?V`$H&u2H8v}_(Iit`3ux*9f z-sAW9$F=sHr+v{n^izn&X#`+ZSNA-e{yn9_n^`Ng=rc5zlD* <;vyTd#rz5{4bI(7O*x|N z+_}U|8`>xF3J|Vkzl7`CPI8M??1woMVr$%-`OhPGBkrDY8}`U4{ID=Gr0B-&ljK%S zZIVa1qg;zGq}`Ib=_8yywJ%Jq215ZQw8I)$-f3FtG;w$ nO>UQ-( zxBG3d-G{ouu55;*+eRWZMO0=phdFQFkzp*g3eF$i{^o@C?LUsnR1)7?{35YQ@-U5X z$si$sZga(WAkh?;WiWxt%1n2Qv#Wm*^&WEJuPcsIf;dM@tP2@i&YJ{dd2iHZG)T>9 z>V46b&cr?MzOu4f$d?h^5t|^=81i~$!k8P$INeeN4RjWl$RYQtLRYthpj}fa&j5d} z2a#JN&Ya=eMi)@K o@zkRCurIqy$ 5 zZM~>sCR-Ipp2qFSoyOb(lMb=b!ry*A31B&+WV F8`?cK$W3RYjqd-xD!) z8zow)N+MHir1eH?WGd2p_c vcSXk}zhqAP86$o||WWmCh$)axNwPK@<1=2b|G zFK;Px2#M(7CNrCv_!{X-pn06mL;^mk^pjJ8p|!OXw7vbL!!Dwc_fB}@_(`dldj0B2 zsIcaSk~A!TFTT(?_H`16tVxKSz^PI6Gy0TvhQ4YbsF1S0LiwBbCvX#|+j9=Jn4ir& zU{dSKpOT#HW`3{Z!+p*074(beQIG*q7IiQjTsrP3;eHv5(NTiyQ`PXD!^JLob%mP6 zit_G17*xN6{H;Ti-DLc61MlH=S!qqLe3Om)I2Pf#A7}X+r4Xn>AlNDfn4aSk#l!k~ zx%2LIwwfofba9&~55+7c7UZYl%cY$=)89N2axWA(ATa^oIfwUjl-6~UP%k41Z(I4T zXv?=2zH>8}ri5aJlGU* &;1S3tQdTPt^ymX4W%Bz}0MUZnh59`)yaR$@*uUo%9F8Uj1&(@*q)DqKW9}I-Ea7 z3#p|L5a2SM3kcB|#uP&xAt9QLZ_W!ek=VrS?D=s(cmNwT-a4`=_Km;6k4IKIQ-3lt zj~Bqpv11f7{#%eip5a!Ym2kE1c+f;|UrjdOdr96NClPipeq&qs>%Ai%el}T;p!u(R z@T!b!7D(LOOQ&f;vpc#pgOq}$E;{u* z_`pj3+a3E#CXKM^vRkD$q;+;k$R@(fBS(9O-Wf9w=w4<@4vA2{k2evQHe-m)1e|AT z0}Q-VI=*fXrW7dmGhAx%SL7c1*5QMeNUk7!$Og<$7+WPG$S7s`%cdz$aElM=yj2iW zwj7R@W^MW=kocR^d; V#C#v)QY6q+)2?F(pw^;dInk z?u3~;BQ`tKpPn}gJTGca fagN{lY)|iy4!~QQ%CWqoDm(4) zqpqjA4OrVMM%579z-H?L*Df{f#%vEaIc&}eXw@NvujaYwtVb_DjhK3Y38uT>o;kl> z*FF0ox!e==K kaP7^HZ)xo3NaVdG?|*m z)?vp)@9nv|9_=jC8ZJ00uDrCm`HS;PgaBpVN2%m_@FEvxs}QI{O>`Vw5&Ok dE0rkeE$?7)lQwQ2Q?Bv=Cf}-a2KW`zGAK9f(2cFHjwo%ZDX7ID7gIedwezUoqz| zp}7X6spENgdGSMhy>@_VjjhH-StoyWCi}9qD$Rx~E5m9UTV9>>71f4*9*>(t4nJJ4 zykml_ }+v`R5%Vg^mPjvPh z!>pX>B}x+Gzj!yj>Q`oZ`NL>j>5O%vR?+dQvuhLndi&OjOBvVe^wJ}~gm&RjqgSK- zJ9iD&3m%H@ D%f9|6|!$3rT9Z%Qg?Q Dt{^i-Cx(_M!WarzT9tj!SBA@Y8Yj z(mHpxPNR39&Sn%914uvAgPVrOCm$6=_weCHQ!+XrEbs1EB|yYoFj}|flM>GnaCK)7 z3#R0~A9y3b#Z?(f0r-Os$GWueMl~k9KoAMZXR)pvO~d*xw7EB0T{;TW+Uhj%Rt@bZ zO8URoczB~^t#NjAzf+q&LNI@0p4y9W1}%d*uZS(`;B>vyB1OWk&+|UGCn7)3(y=R& zu7Z9cC7Rf^F5hpqgJCYS$(oVG5P%UMoHPkNm#Y&xnG&69^SRd3Cz?)NaP@E-jEV6o zEf#Q$J*t~O$t{M^>cY3HmF@}KVzV5Ckc>j=9@Dp6FI^4eBz1A&5hiGw!sr|vBZ4u@ zqw@7JAz!X5@n&y(wo>(0DOVavwXhVzfP^PXbvnOF+WCVdtyaG&R{Rq(1T2yDX}O{v zCOVc`i3w-=oiV%F$GGEDT)@#Oe$s2U?#sp(A74+n4y2uvcQsToDa?%ncWTYlH?u=} zamPE3#5y9{X7^48{MK2Z?vuzWx8D=Mfb1{7dab2h@Kk^wTLY5&Dcm6nLA4myP2=Lm zGkUnu_lFjiU>X2YUuv>3Z;NnXLSl>9ZGiH@hjja0x2xA(E17=DxtsRqXV{jGlH^5& zg^D)oHbvHCmI3W}t2k2!bU73H;yG30^gZGc6*;*%eWs$z*P>NIA9 lTb(- z2qD1*UANrC`1z@5p$gN8+fByeNdwy27MSRU6T)8WPZ>{D5{(VlJTD9lWz`E?(5XxW zCMEI=l(x7h>9}ROaFg*V&Yq*9BZB=dqdZ_Dm^P&bWQ3dhae8G^^xxZg%pmmG!gA;a zkb1b<@;pp 5i$;V>^&%wlm_j4TJU-rrt#XSKTHe`{pafyXUvZjQ zl)gsNZ)3oH3ly=Pdn@-X&K@Hx JN8Gq)gvmZvOnTDCM} zs!ev}G7=<$zS#(V?PkGiR7d8gCqTW;R>w0>!%KTW%9H&lM)6<|3!zDl-#juEhC_XA zf6C#8{QNq^ppxpiiAhHa%iHhH1k2OmJ=_VRHqwLVkNx=prR|Aq@a+e@n$D8H!`v|q zWJpuNPNI0F&JNA>@j6PPrW+9NAYDVq$FJ6v=#2zYK_r!_!e9*ozL#Jn+DWd!pH3e@ zYscdOrP4CIoj;s8-GDPkF~jW!Zw39lxkoGc zdh&?iIcaDQy?&hjrTLXbSt^8_s7nt_z0bz5;W^&QDb~bW;KELr5 zB{SP6*VR{2=xC32LNx;h73uTKbantI{{Az;Qu=I>zr)PX?kyTafi!|4ahqXLHj}7y z(Xr)B)75KZV?qZ6XJQ~wXbJ!3#K73Eo=SuOdv2MAt<0HV$MVZs?Z~IiXb8nHAH`{c zowVc7Zd9pE9N&$JmYBx~*gteC6d1N=`UPPwGiZk`!Kyy-)cY OfPmFL )Ih-!D|{R*FOY*nPQOOTM` z7o6WN__nlkN6sr;YXu2Kzw?}Su#4v2naM4lNrUSvZ=Eb4Mb_!Tz8}q9KGw>4mWUJF z{MrM+cL)yoOC?hNU{4E$tS0Y$8;Yej)bx7!OEpT_w+1rm)g%4pOWw7B*{b-w0);+6 z^6EZ;&$<9cbuvu<9nI#YbXFk{dacTFFL=#L$~&6FcPz1J$##n?UX|g8PkjK&%$kKX zMgb~&n(R-N?YlW+SP`=6e(<^chvU35fNlbSND%~~Bdmv*LU?%^T`O|<5)Mgy_fp;K zfxzRf=Z6{AZ_7Zl)ypRQ0^~rHlzbGh6?MaUn|-zyEL?}C#$7Kzhg)SrzO%WSa>OWQ zs@&AKc7#2YhGGY d&bLGhywRcJ3cJsb^O^84;V` zldr9pJ%2t;b%J}sWA@$i-uA@fO|AvgY>p5a-|}#&E>dmI1FX$_qq}B+1G3D*<3)CK zczo?@2U9(GS>~Mvx)l}4+vvG?T8QOcJdQ+%jT7|H`e^|9h#2Yk)Zt5Qq#7%x;?+lS z;p}aF=8=_jzk7(Y5L*uzkHww)6x=)Ft>1+r@Uan0jNX`# z6u>LUpGVlw&OaDp^Ewvqi|h27Q;GWbH`mZPGJ6ekDs%R-a!n}WjB!mMPgv_1edxf| zn+Q8q|LPE+2^f&aC+o|SCGL|wx7`YVi# 0I(yKoMSeK!%C0o&Y*8XXc7 z*jwU)IrncurRjcnzNKP%<)rCj7R&CGWzXillUOUDj+9u7v)TLLfY2*;^e+Lew1K(f z8gH{dRA0Wd*9>-Daje{$3lgkl@-z{AF4`gHP>*2Au4$_t+S^mBw9+N=-3?2%bUc4* zV*;Z8k!Y$L1}l=Jm2k|;wf?ld{*| _u4Al1(n*OyE9NUA zJHTh9J+tt1mgzMbu*qrq-UKlCJsLs*0rm;v+3A=El)etJn02gY!a6`01@ TI+kX6SLw#sp*)|K>}*>Jd!7E$WGWh7{35T z`&&%tD?ZVqVE(a2$f`bZPr=B9vee;MY>N0){u_hyAebPzjJ2AOYx{ 4 _S1X{N9Z#tD<52 zjMbR*2vOrRjd?2nljFxTh_@;yE+5%9qg{vD$eZ&rM__0dT0Ma+R4?Te`&y)XxYnJn zMndNP=Zq0z4iw8!_l-*}Bh+4T^@6dmHvwn8$$}aNgg$JvEJm3w$`ja>O>H7`o2Kf? z);%hms;Sp^7pE#s($Z&j#LsaHM6@!5IC+lQrobcy%G;w@LrddGet8G~ou#KAvOu%N z+V1n~=}QV%$lMQXObnYEhOR%K))fC<^LakNQHQt*J6P 9?r43;x-voKRvD-K6QK^(Y0`~i`Ws8`a<6FBN8HwY9eq(?q zK7j7z>Y|QL?BbA2Wmx@M!NbWxRdZ;USsUX1{8W+JH$S#cbHTRD2NtpcU$zXuF1!;& zD#?3A{d&9YlU7ESkTXG2EbmRkMA_nCeu!@ITVo+PhK}9=3>u0-+-gns>iHVvE%uDg zmB`YKK&qELfcNuLy-(5bcu8V5XJn~sZ<+u)hfmB={JCS2$4Z{Ei?64BF6^}Bjogj~ zNy1 jlG-C*cti)E>^29^G<(ONIkZU jS?4rHIvGUe^bT)8sI&~W+%ufxkpl22MXTA zJ8 +b)&v7^JU*TC5jv0rlDUmWO5$jwAz?C)kZ;R}^&nc$x4bKj*c=^s++2a` zE=Lbo=BLJ*nyqAS8-1ioGJMeT2(5j2EdYnGyT##ppkRc+e(iCVcv+j&8>#Q1MX$6* zZVqoV%`}}iSH(NFs+=ZO&i8EkJoOn7b!!h!t3P3%Vki(AV9VRJCy|+Q+JS(Mjv{ms zF?}{Zybxt7h;<1n-l}e6f9h{eH-_X3){5c<)t~TRF;@>F-ZS5ow(2m5EaQrhpzPTf z=vT{mQ`A8GWu5B0YVtIv2n?k|XcBT_LTXcdw!S{DeAd+9RdJmxxqOV>;wpmEYwdp5 zG;XvqbCy+aW@6)Q-ZMGoEZl>Z=j3JkXjE^WUu&N-;|@@u34I&Ae_hbPEXtg!3xP^O zmoZ$CxGWyE>9Kjb(!LA5ljzL~6L{4<``|&%wXp`{=eXglF8$nTVpO9x4vJUq#+j^; ze*N}sb5`7v#eZgOkm$zb&e}`9d*-j%?&9Lht;F+|$VW%_4{pV6mJHg;-*K3A*M5#} z(;jmASt9tHg)au{SY~Ie>i3A)&!kF4XmbjFSYqEB0LlQLJ*#+#mT9G9EP{_V@GVqP zt(nNS77okwIGIv#gw97oZAlf+V(10e=H=>KIkI58jZR-p>OGxQN1$2~kqlC>a `l}icy-~r4D%xJp#r-C6bw^q`Clod1rR) z6B`~q?EI_BFaWQTUF-WUIE5#;z%S_bqC*e?(V%FbK^i|fY^Tr|CKB1+ZmoB_^C0^k zPoPBRcD@uFTZK+byFAkS3y|K>G$gC zB-F3Cz~zFfSrh<#3rbe?Z=3T=$4LtW7OIM|!ylaLA(LA2RY#8PSJOS_A_(Zg8%$#! z;_mlQiL7VWXq`Qfb8ayw+7@d_F4CwIJCP6DmpmD g*dn5`fmcE%A6 z<{4#|%r{ymKyp6MfL_XOIh}6%s||~ThLKBg65+C%OeriHe!c~U#C|+$!DKSZBK655 z0beaibqyib58M?hdn(7roPIYf(=W;zpggb0P`)hQcS8xHyQZbiPb+-R2-yb&jO8>{ z27;dB651Et?C^>r3peB4mJsUJ^paY9d(NEI-U#vWX-tNJPkPlqnEH0!wKODlkA;Gd zzgWb=Sx&eux)*2kAd+40?jYXNz>2_xlMe34Imw2!>cxpC5H9caIc%XYDs%eg18Ebv z=I8I)gJ~TSw@xZ>GIBB@PtY^qtA!c2ucrsh>t#-s1k4EYR6^7>(%*%OHOV)KeRf zZq*G+`aH&|b=$Qx5hOdU+VR!@wEHeu)0o?ZUlj0;z)J7&Gr1?!HU|i=1Uu3J7pYY` z)mZyNipF~7rsbbN_ZR>a;3&b*1NygD260S1cp4vWCy-cPZlz~NU@Q%#q=G*LFt 6c!rFeP-uI7 C&Ef*{-=|x9QISXQgB$mdkXCF@@f%U40G)+z zzf*WJr1EIXRPTeFP4azZ>hJlm2Ec(q<^QzH){h+0NS{i-=pe<3T}Lg0W&5JO!FO+W zYxe*$G`E1T0qUe5dXZHzEx6-%pDeBQWDmgls)9HuAQl~n6 cW=DsMqiu627svVxkI)Ha$C-H~nxL4$k^Qk-_rjU#%m`pS@KDA_{M~#6 zOv&aX5(cv^E|NXED%LtU93C1PN@0Bw3S7OSM1lo#QV*{;Oi155J=(oTLU?QuGBGK> zX(;A5a%nGvB=#d{^7zX`TO~ft>9%iaZnq!!r#ty7eeAnQe0WX=+@Ww7EF1xB6;5wc znMilTU`1aqulK-3 V&${gOZs|xM$!UED+SX<1>q4)zY@=EDaItK z>@;l+i-R|_BIKhybw>IZ;IDsDYzRczz6)k$E Wl zf4W%I00gd^<1yX;Q{xWYKmo8>q5%NjPf;nRo+`ia1Ip=pFV({!ZxdJau^WZtCtXpH zq~GawC(j|CD)tXV4Cx10g!JGS3Hk}?0bqpaQz-Sl`E_>YuY9@w8|;kj($;cX>_s02 z2wQC7q?0@q@oHATr}cVbJ@=l2A4|Y@>ou1g*gQ}2cGX^61c}%31yzE50PuOX`V;T` zH6Lx*VWnIUK0SD*t`DlRQSW=QnrJjUMZ5gb18J;JZQL}@aZ;b@CjfbWiPN$ilDs;~ zRiH@%L+NH(Bvh=}h@P=!&sTBLpAipG7@2qbbKq?Sl-ds7j-i!YNK=s0UP-$e0XjT; z9_D^72%%PY;dxblkzf^A4M46tL@J8^Nyfk4WU*t(f41cO&Mg0~o3bS@_o|i1;RS>p zS6~ikfVoo15$Z`-mir@l;~itOGm4ut<|_;5j(3WL7_DwdV @x8^6+wy6s!2{3) zLxKlb=tR8C%&!s Bk1z(fdjLrEsi|ias8!-o2`if{I)aeSF{avH+QJ~`)vKV zgcHn{yCxaSj_x;vCPw(#|AdlaEgaH&ax@NrN!dN}BLyHE)M67q*v