From 480d169631d2a8f359140544b3c69ffe71a517d4 Mon Sep 17 00:00:00 2001 From: TrudeEH Date: Wed, 9 Apr 2025 12:02:19 +0100 Subject: [PATCH] Continued work on Linux note --- content/.obsidian/workspace.json | 15 +- .../linux/Pasted image 20250409112858.png | Bin 0 -> 56914 bytes content/drafts/linux/index.md | 639 ++++++++++-------- content/posts/dotfiles.md | 23 +- 4 files changed, 368 insertions(+), 309 deletions(-) create mode 100644 content/drafts/linux/Pasted image 20250409112858.png diff --git a/content/.obsidian/workspace.json b/content/.obsidian/workspace.json index 89af47c..dc4f5a6 100644 --- a/content/.obsidian/workspace.json +++ b/content/.obsidian/workspace.json @@ -27,7 +27,7 @@ "state": { "type": "markdown", "state": { - "file": "notes/index/index.md", + "file": "notes/how_to_computer/index.md", "mode": "source", "source": false }, @@ -195,11 +195,15 @@ }, "active": "c01600dff17cd347", "lastOpenFiles": [ - "notes/index/index.md", + "drafts/linux/Pasted image 20250409112858.png", "drafts/linux/index.md", + "notes/how_to_computer/index.md", + "notes/index/index.md", + "notes/git.md", + "posts/dotfiles.md", + "drafts/linux-encrypt/index.md", "drafts/bash.md", "notes/c-language.md", - "drafts/linux-encrypt/index.md", "drafts/linux/image7.png", "drafts/linux/image6.png", "drafts/linux/image5.png", @@ -224,22 +228,17 @@ "notes/drafts/linux-encrypt/index.md", "notes/compiling.md", "notes/firewall.md", - "notes/git.md", "notes/gdb.md", "notes/drafts/linux/Pasted image 20250401143509.png", "Pasted image 20250401143252.png", "debian-12.10.0-amd64-netinst.iso", "notes/encryption.md", - "notes/wsl2.md", - "notes/ready/encrypt-files.md", "notes/drafts/linux/EXT3.png", - "notes/algorithms_and_data/index.md", "notes/index", "notes/cs", "textgenerator/templates/awesomePrompts", "textgenerator/templates", "textgenerator", - "notes/how_to_computer/Pasted image 20250319161431.png", "posts/exploring-freebsd" ] } \ No newline at end of file diff --git a/content/drafts/linux/Pasted image 20250409112858.png b/content/drafts/linux/Pasted image 20250409112858.png new file mode 100644 index 0000000000000000000000000000000000000000..84c7055f6442fdeab2dea325ace7989e092cdce0 GIT binary patch literal 56914 zcmeFZX*|_!`#rp6%n%7Fl_5n^A!Qyzl1iG8d59)+*qJkjG$|?~X+oxiY($yoCKZ{d zCUb^N&pNyB`~QFYynJ3fzt8>qbah?q{r#TjaURDy)>_9IVQ_FS2kTl^3WdV4Pgl#3 zLZKI;Q0UxPnDB2Z|D5N?9}I4q`;M~U|9n_%!}0eu?%GD~N1RT%ds?~LQS2R^&f9Hs zvvIYvb98fXavz~DRmBf&CqJ~u)y~TOw3DOI(bMPcC@1V}g`^aOG@M<9WTa$v2}w&U z%E&A3k`mH5Aap|e$WhgDXK@Neh_X*h-z{yN;+#CwgC@P`Fqw3H|4PQ2|#kQ2zH93C^Q*!vFnG`@j;v&SdgSp6pYa;8_Mb0a$a+l-aJb}Wr)Ss>-ZnO(Y~+~MKj0XJ{nv~DOh&OOzxTKVAv&kK`nPmW6H z9ykyZ9?o*L##Zo!^0t#NgPAziI%gh};GLPB^)*QiU3Yi4(CxbD zJ0ZJ%f6b%czrW7<(2m=6!t(O`vTGZdoAy&EGi9A3;W5E0)+@fo<0hFGU!+_uI`X|a znZEZZgO!n_q@?Bdcd1f7GtLh0A8{C+JQ;*_a*$nnRWFrm{d$h+;cr0)?(PmWd@8H= z$m&g~Mv6`}mM^8{b=rwcAt9mH;uE_!lc%()x}tG+_j#OJB_)Bc`A$vp$Hs=t0(tOj*bR6l`hlZ@3B*7NtV}`_0Y$()v}K5{A3rfjyLr-Jxop2(A8xrC@6US z{rzK&WP_n?Df@10mhxZp;a7AQf8qFTZF+k8>-u_jtZlWeOn6L8*kIHBH;W5%!s6mj zjOq*@A6zf*Gb1%Q{7ryi8TMA$e{tQTg9(2F&!)Od8s{+ZZ8Kr`n08{YWB>mBLB-zF zmvVD+59ekL^i)JP7kQ3Y9}?u_W7>M+d2m)%7Iy>ZzMKbNQ}%M|>+8Q&=3!-=&=)GZbY`qqoG&t4yw6pkqr_KW+qP}d*MCm^ZWHH@Fc9UovbGj+YS`vZ95s~LbuI=CpBMFacCkIuk6*^e$48+AgeM)9(Aa!qY}h02?%g+6h4)yt zJ~uOUOU`+CJj28QtNjFL#>m8E{P}k7{-7Tp(}Ge{H{~as`S`3tk^3;i`^SgE5M?e0 zLJW@_>26Nm6SBMXZ{LkWT`_8l0aw;5X~s$%qXz1H~UxixsI$g_8X!jlZ2s&Brbar`)+L!JqRBDHg8(982}<@l(i6Pf1P+avSx zcFj+|KSYyRSXhYmV}6bU(oCbe4R5#HFfcGc{xRj$mKcY;uhS-mLu-)r!(-w|z^3`& z16h_Yr}OmmBu6%sL!cbdn(Q{%NFE3;B<0+tKGadHqB_Lk12l4;U#F*)tzl zK0P;M!!heGv9Y&j{@I#2n5dwk#lpc6;ypdAaqgVthjimrik`#l^vo;zB(l~kc?6I3 zR=t@RY+`G8iQ|)%pFe0`XDd_S(#sSa9PBewyM^(5+sly62kr!@3sJO!fBic5#3WCG zB}CJq?PbQ{+?#Saxw&QU-{)2jUbMEh7E)0u*6Ke(@_WxlyRR=!(*`--y?bXlH}%`O zzm`{Bi$WoXPF_JlBllDTc1hz8K3b~gD=7hhFUW%lIz~5 z?q40JOqCgV9+aOicTe8s0mIqH?jJHO?t8PSB4zdT^d#BU-4fzqO~xNOO-B-&9b`va zE&R(0-3DtP`aBEZ5>#opD;M@9*FGpAVZH3>cMQnnTH4xWLCl<8$S5N!qwYh^bR~a( zY#qMf`@{&+gKt zMf!mDgkLo3M1kwl;+&J${ERe(!p<*6S+{Oo(#1bNu3o>s?Dh@|CN?%U@*=HAwKI;t zX-U~zNbPS)(x5jgblr3`!-SXOni;I(HA->ppw%4Mi2&l?b%ux1H>~C3<0B+0%5bXj z-g1?TlL4%2hd4bzhxn@jKd$Kzc~m; zjBHCgje6s(wWaQ-jFVMA^EQcyEW3B_o_eaG%gC`z^Ywh&O8-B~# zuG?ASt06vLdh3Oim6h}CxLt?r4vUiD=4ONE%M3G2b`4*CoJ`6=lz`lo))!kxgpC8* zZzQA04fz`EmXu`oTUziO&OeE|mX&kfHb+>nPBh%ZBpJbpU z-1xlv{MXToi`h9j?~0;vyt@DX`8hiI{m5|f@VBBjzrN(s2~GE@ii@)(DpQxee{>)S z`AFkUD2E0rZd<-nSydJDcC%Lx-Ex$XU1oYBcNDY&jF33}UhhBHm|*GX*jW52e_Pt| z3|0%DF-G<^GQn+vI7wb(J&dT6>c@{CcR9Y2LYe&aWtC3!T1K;1?twU_>K~sS(?~Vc z(AQ^YU|@RcxvZR=WwCmUD_5@U`u&>&0UGk+#S0lDfmeNMB{v!C1uqKMT>qN9huPiD zZO_xA&n67aTwP@r$Ln_R3ko(BXO0L@BB@T42yk%)JU*E4Ztk@iO6El`FOmjVQkokZ zSJ2bb7v=yr)x{Qh{5I+E^k1B{AI?SUaElMRbcy@~Gdq8PhK9zIk7rh{lok_XZc0>1 zyD{BW7WCwJTA}NzRjXXeE-}(hzdZM)-1oWR(@`9=q2Irwjg5^Je{R{diIG!KHR{5T z57IMJv)y5W1}L{V^E16Mith^x3zKzHx@B;_Sq>aHP}p=b?@UOHpxQv~$_Ooa*FIf# z4vzkeNZKD1>(C>Q^rdIUSs0d~K#7kCH;;}wuT%1nbb1xBO3d2UR#YxpC#4LjA;myk z)*&%<|LvY=0Xg~BjFXRdMjME~J=^+x?9;VmK^BWFOFAUCAM@sy-y|q`dfDZjZ{zdz z@hNC}|NgzpXjd6OAK#Pmr>Gw-+xiTX)P*f!s&D8&yS6i zE`6d_TcmxozIahlQ9;2S>_>CZf%slKl6>m!d3T77$Ufn%|h zjWRPoJHdT^W4wN7B;U54*j?UJ=gg;0<~t_ey(=&>ow!#=hsnIanGWc*c56zP>NuA3 zqTA!gk0&0zmuqM*bdwelxisBY-?o9Q)bGK_i!8p2^RxV1TuGh^Ku&t8hCYk)3I`Ju z^YmXH))3fzE*y!$lqps(b-KWy83%Y`D*o`{!$VzNNuDNha&nG}Pmf-<@L$+9{RJ=T z_0zIEc=^S;p$|`2g$4&ZzuzZ%T{D-Fk#X$S;OA@`9pl@7=chaU3ngo6Y6{%H8+Oot z*UmVL+~W8OC;=Hkti)?fb1={&RxczlF!1x^LxRQq>y*8&-aVdd(3QL=thu#yH7{#O zo8yxoDrRys|#+#_#HD8x`x0W-a4hyY`uzW#b_vhlBUzv-MxT z2Rx@vu&!94J61yowC5o#ij>J7c=#oSdzNudfMa8%2@y z6KnN^RTuEmi`UP0er}|c7P;=PgwT!62g;E)tut<1y~?#t##T3e(F2IPqrhd4eF?&M z*1Pm1-gnI!V~3HWvxmx44Y&ABG|08vdyaJUH` z73)nN{mhnPTt+vNKlkI~RtAc`o?cJJNO_4x)-prqlf0tx@^PM4+nO%%UhV4Y5~Yz)^{i&!3G9#CZ&g zJkC3G&=gwJlTqoU>}q)m0Cku%(t5Hi%a#%NOgb6t;^(hl%kL?;bs_soA(71>@fEbu z5C=&3uWM?aR?DQJy+;1Q8Dr4Z)um({XX6mq9gN!Md_eDO-dX08FV6)c3k&$fZ#SnA z#9@$WuENE_Am!4d<%N*Hr|P?wPtu5DQyJBLNA=;ON9D5yXw(%MvMBgvTHG_UU(9ei-`ZGW0DD1tEWz z_Uj65%jAWo8 z6!aC?uUnGF%Lo)2@7ou&eLqSPme(bdRQXSzKACREBUxt~4SJ(QXsd?foF|=r|0wBr zny`!vx2?>Y4+xe!a!!p4oG9F{v#j1&qU11{ZKect`preRJ`@80CJ2AqHjZcb$c8(+ zf;57diu3P*8X2p6PMscJ&%nfVNmq2))~#EIT2h#0&wu4XZ6*!&Kx4wmzCB&3WpCdy z>~`v4e-p+z*l|Q6*15Z!F~vjZ+O1nm;nlyJun!C;o}0GBKi?a(fkyXha@R^%;DG4j z2Q3b-@z#~m0?cj$^>nDspkBJZe_xKnx^upq$Fe?7y1Br`X83}6?yIgY%jfauk>)L% zlQg=}k=hyqX@#<{DPO2`b#+bhTlm{dpqt+rl;bS?O|wpV*RBx2gRv>}Sswzi+Aizq zNH;}Rl#NeP{Ns2j=gyrwXF8V_nZap*dKj>x_Uftl{^bFlJoha@0{luT%ij%ZC>QTfnAHH1f2i+qHLsO?usYx zK~e5*l$n*3Q7m1%a-yp5WlCXw!^Vvp52v&w>56Jb>jdFoe13Tz5Rv9KxWe<}!>;vF zC^%z|hwbg`x)W8rodI9Oujv*{+gMvW1KnI~J+P=G6kd4ZG`gD@e3u60H4adB?A8+o z0M_rd_U^s?<>lYSxe;k_4R=qRIU_Okvy~Gdy1os7Q5BVEZ^FoG8vUj48FW+kRJ?b8 z%CrzfKwVxXcChcxoBrQwe>=&3t{a49rX>oFLu2c1qXARLjhlYE* zMajL^hcB~~giw{+Wv^YkCT~;8-Z6;CD@T5Dyn~t`GxvLiz;5=Spdf1LH;{?e(Q9{c zQJevIhDJtWT3TB8*RPMxcl=h4=yU1Z@oPo(B}TSUskB_vX zLLA=_FJUx(J4Ut_5#ZvMY!HriZ(w1?_3PKAq@`Da0z8vvQeRV3R$s5r&dFJY)Xz_= zIiul^W~XDR0V!%F#Tjwm?hV$mfKFMDGxlW%TjBgv%QXO; zxYyQ@pUBrP&#|j({`Bcq+ac7eNYC`B@Nn@P7Yy&YsN+~kAusGOr#+dz(#UM&A#hu? z?j1NWH#L@wUDgtDeARPQ{T+bc$c8zmbA`jm{cOjEUHLaHd|&^;ua`lYjp7 zn{SQPn_rmjWc#MEIz6Dh*!#qwC~8Yh-1Y0_2R7cQnY{Im}}?ay-M;x;>3Fg*_ki)_rKp91Mlbhekd(~ zeXVSGo7!pFwKSLB&<@GzkXi*Dccz!d$NTp`A7?i3 zVia9+5yc4uM{Q!u$Ut$InEU?yyVv48)%1nKO2^I;v&RttD{nJS=8xC%E4Yf5P$!ro z_nVlQB(MI=o_A&9#0n6vCdS6X>cfnWXbWB)g&`$2=gU~DK}B46v_{r}EAt&fdTT=9 zMz-VXrlzKoiyh+@>|4?!PM$`@ZAT0j^J%5Dbb*e}^7#FA)1B4-fXn!FPRhqK8Y0(* zCf&K$t(z}X5w7WXb-r++zc?(MmUtJrreHe*{jy~R=FT8>DU>8INd|dmj)AA)TD6Lv za5IP&SCybXyH-#)c;N(gB*!q|)^a3X4IwUdq&Kf(DzJAMdYsE2=MI|h%zXGzv}2A? zZh0mR#f?8hvxV@K1Ao{uV{p(%$Hy-*b8g_dV})weT;l8f{6s9$tjhtlqY}LBU~(^A zy3|pmOes_e?*Fs<)_t))(l?Yh5sC+$mwQLk&%@g}ecN8W=o_hF zUWrvw2gBrar@FdYB;N&?xbV>`N>YBrkqy{P(^Yk}1#NeC_kFzr99j(7M(iX$r%`Xf zkUM9py-+yk;?SH#mnpWR&~!ydM~CA3+1c4LkQ;2<9)qAV-MKO2_{pKqOtW{{Ss9iM zeaU^?xMY3W7zC64J^5>O8)NnU?Dm#eKI<>0nVi+U;O9r)p$x6aYovc*H6vr=GBjCM z1NHG2A0N`yZB}^xXQ*Y*P6goFalKI5R!d@lZdy?x`oK*b9`MqgTZdC8+P@yqPo z8F}oMPD;z&6Ow!ruUsXceS0NbaN#Fk)Y@IFCG+F^!EN{6+5#kJYGzheQIV=YXu)5) zFeRWLFB2l?6$c(J-K^;4+aR56&6Ji=iCQYZ&B@iu3h(n{4vX_>o3lvm+SPx-?#q+I zDVjyi^-Gcw>O$h5YOJWjVq$ykRY3BQhkSX&_?Hdq6-%?v%6+cXYyEv{$vc7RA-a4o z9yJ_&n<;saA&gV7(R;YMtxcfuo`TKQoTb@8L5KDN=?~A%1QON!SD?=bL9p=6u3x=+ zwZqpJThdJnxlQsN7dohYv3CX0A$GhPpPmjgEAr5=v=jmo*Mx#*g@Qi%JHOM_tOZ4N z?Wv|jv&~H&Pyk$-#OV4w$`bC=*up4;hJ5KARYK&iLWvo$J zs!qGf_sgT*fai~o9uN$nX0tp;%!lLCK;M^4Tbo-!f*z01EbdC{hZ= ziW%pub}R?VqiOtN#Yx;VIJ{58(9rPmh1AYBZ|Hq|eW{$sMMOZJe=lA&nalusU_J>UIS{#z0?Ps zdi~~2kavQ=zd6X)ju{2X@XMEFW@Ziu>Om933vz^RW41T_pBI2raD|2MA6`%9jE6r% zC4?BPC=XInh~z@K+V`mi6Z(ha_$PEkUd)FB+Jowm1iMklDoWChteu~qPx4<{WZIGjqEyPU zT|Qxz6=Xnum5Z_kuU_4%u?!E%24NGY;I{e1th(0d*jOMs?=>4#eH>n_)9M!IxvaT2 zv+)pk_xR4Tjgvv)VDJso|J=WJ?eG8kVlN}$MIv*YrxfT!;6VpM(uBn+aKJ1!i*Umfhkth~4r6|Uj{j<_?a$!)m z)+$$3>4ES9xAqXPm7O?PBZF9Ye!?Bq0JEoUsjNhH0FV((=1Rf_j7perWSy`P^S z)A}v6bZCNX;Mb22&ITbhmO*9eLi@kX^@a7G9I&=VuiUqI9^+iuO&WNo4rS=yQhK4| zQBZFh_uUho;v6YrH5=W24wMlRR)2B7L~N~QTf~XYth=)%wv4nLoSjwzgM-`_`LW@N zbYhG2hmX_cpEUN3^hB*wxGraS5kl~}&XR@V&bpeKEidMNBh9Q4J$V>eXD(=XGk8wO z(fhL>rLhZ%IF%lM*Z+u>Wvu1;(vO=c1bE`Wh=}Ex3$}>$$a7Ao#fLkJ*+2`?1*%g3 zoV%Xu_kZj5nw#22YEy#Zg#!8nos>W<&d+TlXeYw3BxA!jA&xkTeSUgG>~pcVT>8oU z6%P$h8}BfGdiqoPnqO`CF(;D8CnkcBYcxsr!Iw&%s^@q1^bCWVw^QH52Uw79@0E3d z;1KB4hl3^oOF|nHl=gs@N`kCQT56*LXRG**FWHD~-mS-9L#?33a;mARea<_(I=6Oj z8U4*{&PK)&@mo4wf%Me=CtIA4%M&a<(l?)aGb^@E=$B-o~DB0c2XFB?zlRgzfVw1OK?_jo)@JQ z5$Kwmpm)h6V<5W7#?jGyX#I`(-V^;7#79*_aaMQQH}<_WgZ5fbSjhX82X)J>t+l;< z-7C+L73e4x-z$I>F~40g*6{A#^=Wk<9i7mQ!JM_b&b(C-d-v+XS!n9wlM0*x?Y-kb zchr$Q$8UG?{ZTXfr^>rgLAr352h2h6-)}WljDhel(U``%xH&S?Wjp68tu0*wObRps5Bo{lvil+Xep&^_>daFChu+Ke$1_7Bhf#=xJ&^zWdj#VL7i zpH6zEnH&Hrxs2#+^n38amcKq{H|INb=9o#*OH;>f`DJWbrWMg3`ThMa<~2FAGM__0 z&XFDe|G_)#A&&@|S-7owyF73}CTiH{S?}QYVZafdIC=`s^yi82&u}Cp8<2BAt`%?{d4;~!Y?)5R_?1w3lSC4FzdoW@C(!Vc;OC7VA>#}v~;{bv2V*ZB75KA zfa`$}b;ODD_2v1xFOYLO_6$PNf|&Y2q%HxXZexih>8F+YWa9M)w;!SktEz5*<43;e z!cV4EoAsOH8yg$1cpu!C(!!Ir@3hrTW3@U_<6E!;@ZGq6y+HM8p2@Zj2u7tdJ#4?g zbK%g%%FV2|9;>8_xO`dSaN?6E;#&3VH)=gS`oJVZ2U08p1p%=UP0i7?kL{M1z|kq% zeRy)1-pth0i;4=8g-16+Z9|jBlzGU7@cJ8O8`M@{RaO86Ui;#alatfK!3F7O426n? z@;TT3P=}FFcsP)F1sa<1T5q(`hkWg3!zetk!sFunjLWaiQnjyNzH~!@r`i|`i2(7H)aSQEt=VY++&VDVQ^7`a z?PqloNKkMK72w&{G~XKldj&VgUj>NF34uz)wt~zd=`Q%(DV+;?N{6gw{ZL7Wh0PD(!n?5mARoYrwsUL(tmGi826-`u3O z)CFlG8_Z*Yeba`7Ki<$TMFzKWu{a}kY0_JuH9RN$^hkzD-eoy)JM0Zuy&h;)|9;1{ zUk`?vzJ*iTBG(!VltQJPge>2-_x{N&U3}*G3LtUfQ#2IQk%>#a0eyXaT{z~=Wo2}L z8)Ntgc)F(?YWFj~g_Ddp4LUR`K){B9 zL_IL^hEr|y<>3zTEXMo`)TaT&Ze>y8Q)5@t*!W4on4k};m_*ZkwH-I;PopKy7Dd1E zqQ3PA{#kna_TggV#zd96xx{1%p+7%cs{#Tj33M;eDm!Uey>0L815;HMEtAl>|MvFp z393#>GKHp%X$(Ko0>JL~fI@T6fgNIE@z6L>;5((b#N=Iaa#g_4#hwEDM7e*xe+-lm z`Xm4?RySV6{gcMxpS%7W&?SB@@^ngY1-VxsGxPAAJSt~-(4vFLvlML9&vewqy(^+mrV>5d$A`%=D zQbvAd#hFtM$bm#aA4PHq@-Q|xCC&)2C(ggW?lNbl`^!{K?03+j_o%A}98`d&83xcl zmPn;kfBOXM5J&>Axt4MiNOsc_pZMu{1M^$+4a|_7O$%Kax0@Ci{IavtKqGyw?Ip(s zWv|zBrC^yq8keFW8?D<>O7k?RfZb3NQC#@vT4Le~_>#Px_z0{j_Rc@Z2gNht&(<3? zUC1QCuvhV%RZt5C?V^G7QP|2I@vzzPH%a(ScR-?B46cb)Msn=J3kY4)oqTQqmIdpx zBPZU3Y6*P#@2ysSrAbGO%UOLyyVl>&h#(IEnZw-_V|*Y|l*0=Cmoad7i1Y~7kY%|! zIY^$p5S6mw7Uk#R30|{iP29C>$!;f>2~F!6b`0Y05UdRztiu-##=8CaajavIkjc}= zNczKH^CG8b;ZX7F^hbtHKH)cUJC^+RE+^PVX;c)>@}ag0I1>cb{OapK^!xuv@R*+& zoB8|aY{v^?HB)s$pYW=vXyT+awG2Cfa917sYy8NK2WLFb#5 zkpc%Ya(gZgHm*;}$VDMf0dAU*$!zBI9y|vft`r~fh3WY)By?01y`uW!9>lfi&BK-U5)29{N z#5Zqd^8WLqVy^MFgEKJUn7nN@ZeT7=1a1M4FBE zLhz<9UIdy#Ms7xhwe;V=e|yr6b8F8PFTk8ao5!zcAH2WBe+x^7&+Ad$`gz?`>_vfH z9bZ&rWbf22ENpL2k27?|kVYFsI?bjQr#o)R-*;(Yn(TB!XMq0ZH^8=QMN_(#mNd8o zcR|uvws-GdhmX&A(NV(qKjU!mhzQGrUx1UGashYH1HFB#1s7BxWMpgKPJnwXA~OP& zS&O)}3aAsOA}+ol{SN>D)7stVSb)Nbw-YRy;DyZnp-DJKg!RnI&hBP%{WCqy%*h#J z9rO4-GCIGqmlQEI%E-vP{`PG>7(zAqNZ8Kg6%{q{j>Hs~WFSsVZKPWRau2H8%1NY2 zotOL7*;)ScuQj-Ig8t9XXz+7@XZ-IkSjqmgl>T@0fa%-+i)n+< zEk7v?Rt`j{CK@xEy4$bPQKI%Bv2a{{Hc9-1pi}oBt3;<>h7+eAp%;cG2E{7&)jhaU zc(Dl%0a~eILP8WjSd%_U*KQ(4Gh$#vYBt)tMa~p{VkltsicB%%FJi=Z5K}ZPY*mU( z8b`&SEYmzH4`!Dhh<&%NvG3o>K)~m<57XaSo;kxxnoMxBWsofOOb^1~mE=1&#iW1S z^~|UA<=B!?kn5Mi!uCegW#{KJpFDYze)HBf2#L)H@3Fv;6bP3dJqVN6O-(Tu(p>{H zGPX&ce92B4M%Ti77w);ffkbPxx7iBnQZsfF-iGv)n*z|NjP?qJvo61Gt4+L9P)bL! z2=%%A@0PFHoMa?f2~N@)Nj-j0Iv5zbEGmkfC}@b{olQqfU^YFX42P+XmKOZNZ-JY8 zAXml@N^m00t=h!BoMesq+^gDK@wv$A^=?;1jl1nO1c-7x0@YMmRnu{3*QRmNZ}VRUsi%3wnG2BSxl@KH89>@CKw5;3i66Ia>%oz5>Z#KRKnsS(^O#? zq8SKV7;*Rv7*{{wjnIM@;>>`8?)CIh8BX=fP4Vfm5&nvx-#3dZaA9 zy78_YC-G|a*T&*4|MzMS($cn`$@|LcomU8&X=bQpqyC{o_K6kED+E>7S?eTL=#qx%Q;|TSKiAGNiPM%6dT72oM`KiD5pa$Y+(Xw*6a19g8FL0|657bOXpOp2mR-O_ zV;$dt3blr^?zix#74KEC6N?RjDsE6{Uyfn5GG*VbuTU=8+1cL$YRWVjegZfah}GM) zLCGVEdMhUjM}wqi{eAn&3JT=!srjo;=-XMrTIzyFBaT1Ar#$ffkHQyMi3%XyblilP z36F~NcufzRy~xY6OAM1tgvL%}eP!l-*JCvY=yY?AqWwxn9H;D!k!iA)gkxY7@bGh? zn?07b7O2k3(2yH7vJ1*s7MT0`ow2d|Z%LLRUmtyX)O0WXl`B__@*T|vzNmgc(XxTH z9CHCOO`3e2IOz}Y$?%HpY|^}LThYou@ng6&6JAK2*nAXTUif-36cTV@T?!FuKxBrZ zJP;@IPkB2{d@FoI4x|=9viQ-O$w@~?C&U+NymzNOLfRQZ=o451K(y~c;^+b{3r2w= zRN3pcw!0VJTIbqSt#IfpQSm{+BKqDZmvHMGmtLKrZ$)zQa9iVrjjDuM9&o>=@o8P( zbOEaX`E0rNm98X6j^ zR^D%nd5#nA9v(Wt3V2(X>bzuk?XpX(<6ng74-hU86gpm~({)b2K1m~J6sepaZn7Z^KWN$$j)jh%FA2AqN|FL0xBP0<9#(jJncnq@159Z;tEA?*jemN{3$kx zRYm~5Tts|9gIGQ}>FzVyrBS$6@;UgZq3-TLG|y-&Ym_->yNMs*;%kw8@8ZY-+2o3} zhXW#ULGC_a1p#H9zSHX`Br9EsFOruxL@zbR@R%mWwW_Gl{X4gah(xTO&)n4c!l8>7 zYp!o1*%$I3PQ<1O#1F6Ex=q(b>tgHaui8eiFJDgLY#n6c2}wzGs#<7a1{9*c1IrX7 z-dgOAE0QE+wSy8v6@sCB`~miHR9OtD|H`y4;fq=BJGb6(%dG24wov%a^t z_bHqCbcLIjE9xT`IYJE zl6Xj~l6l)2GYqfbv>7r6i|(_jMGo=1ie6C#MI{N-QxlT?8qmi`?SkBhVEf+J7Yr;* z94A|kr&}h5#oqV(yM=gX5$Yt2r>Cpn%;2zZxMMd;{WH=jxKTtzYV+pMS=Sq>Zm9bN zVgvpB%loHoQPR|^L1@^ZYghs6IQ76MXsn<#oXB8hs+3pl zM|HhYIzP@98WxtKnf&_ZO&*LfJkl5(L%)=yB~k{bij;+Uj=SU67t7IQ?r9pmDtcN! zo>{2I`mBvj5J2<{Jn&e>yBJBrZf9f2qdqrl609%Ard%LMdWDTfFz7U=XD|dHUMJ1)3P32#a*&f`u zvFh2!Gd>vFg6(J^zBXw0?%kMlF{QzQ2^E_svO>_OhYHIdG5uh$K-yx%J1GRve}bb9 z!NFIDM(Y7sBp9wjuvt&wD|l5{Xk}uu7Iv=~YT`I?f*h8JwMO#ADM`S;>4T^z1@H%Q zh(HyTSs1EPKO@jJOMAPz0stVq(3%X)?tAkTH5>2uf8VJyt+-ePZHXnm-~z94Fwj^f zu+*8m_nQFj9_WgeoGp#+dwy~`EWlarHg zH}1V+2}hBt_f!;B^<5UocU}+$|EUW#*qo9RPmi7%bzzst0V~YEcI{=fkk*N*%7o`6 zTa1tSQ9G+bKmpuU;rsUO14bgNLFicJ)u)Z#ym|9&Ev(yPHRA>I^#D$e@rT+dr5n7mr-giBOB>rS@5Nt5Gx&YnO z=lba5FeIa5o`Sm()OFn8mP}HtzVzo3>Iz=QvZOl>Tza{wZZs3 zL~uFwCm(6f3j=ssTI?(=Pd=!GYXf_uaU;RKLQa%8QTuWDl2@5~J8y6{Q!(CD0@IvADu`3}_S4xBlEK6=B34IkF; z+IL-FmM%arP^fkd(LBM1l2N-Z>}Gne&j-@?uUo%98JdxEZzabkms*vk#FVxu?*DlK zROoTo5CY7wR;!~bb)#=jw^_poNy@0mV;ixbg9p_!Z6pI&2zd;qCWA0&&a_bDhilho z>WjUlwe>Q9GA8{4H-kyn570vNB2ebliYqj@Vz~zLgsw|Epie9DndLtF;YpctUDb1V z=3z?Z0j$O`j63)3)h^7|CSg|QA1bzCANf`kh84OkX>6S(lL4&}2aMo#2t;wQu^})_ zCKU-stp@_q(bjG;(h%JzbC`wUa3djdiA9D+qp5GdoqJ`X1r|U?pw3I6RNg@DG^(0) zAXDZrVXee000TslU~qG9kfDvMBz9g|r?3pV20g}UFzORtR*MFb_^1gAhg2MJ|Gwbo zFJE9f;r83zY;Nzc=Q1Fs)(<4)*@dJuTHYSlk8GukehgcE3;T(J3GL(Rfb z(a{x<8VLY|FJH=nGqz^U&QstFBpTzSgZ|+v66~Ubn3*JGC*X0D@_ubMd<1w!XQ+C} z8&RMo*6oy$A#E*cek5FEr1u2rnPQT0N@j$ND`_UH!%&Tbj)9y2*!=5T_i20LA&3AX zV0&G3-@9;va_<46k$xGhgH>Xx$Q>ky=g*&`9HfIx5&*+SkQyLE94G^f4rpLZ1fDFb zTgkBXljBDEcDPo3(A+Fy2%^6Afc6wl@ytMj!2kMMJpx5*ND;+qe}<+!U@Y+fG`f0- zW*K}Mzt9fN0TD?Z`0??0XnqtqQKWn|1vdqY7nSvF^3Rv1d|E z$6I`$HIqI-kzNROldRmbKJ#lwo*pfLgp4nG#62I>ul;}k&)e1hN|D<-FNo0GHC;_iXj?M4%dxOqis_EEa!eOGWNH=L*w@r&B(J9%5tPyfci2N&!;Eq)DIO4V z2! z@*;k4OD(>+8{r0Q^>0FcaMl3r+GRo}ps2uDRsrERwr;a+{}%$$44+C)FQtj@JMMs5 zzVD`9DuisS0R@Rjj3B(mYnkRdqQT;=K%-7f_O-S$%HC6w6Ure}{2Zx6@X|;(85)u* zh*oIk*O#3)bwy!(zQnmfdFIKmdiErsl=zLBEYQmT0lna-()&Q!+W@1ORmeUd0|_|6 zJ{SbWH)#i|2cXX&yzfzo*rA>t!{JKSHSmU4zI|&6Zz(~fRK2rc1hbHW;e0t?-wP_< zCNYiX4S5Kyk?p^|*)~D3-Q)qaDLnkc)>ZU}?#TzjlUIPLQN-XKJRELc(5Lw?slqEC zMNL%RVfHE*#1YV7J@~Q&3^HR7oD*Qr0M!u~(it>Xy<6;Fw0F`H5|{s#raVM<>}MR2 zjUqh|fU*7OV6MY?UNr{vTAzDVmT08dQG$8E>=Lj3Ks?_L^C&cr*otUeP+^<+IDHW|om>z-%D(R_z({lcTV(gE(0E4d@oN z4$)wz7^;mum)f#rIbfADIMMpn$ZP~W&Npf6p$L&tjeo>Tp^>8RUw6`oqgqQ7?j-dV zm6CJ)FU&(JKnmna0esI7B9lYfC@S&}DUoP=hZ^1ulM!Y(I52s48E-51V?HAzV+=+! zjR-BnE#4}Bf23uOg3yb*dNly;KY?V(66z>}17C~^FoB9TLLP>z0b}rpACUQu8{){d zV2~ISqFBm$a(e`b@_(FG?$M)<_2VxQXq0LgflZSAK_kfAx<*{P&GA&>v&4B7%R^ z9e5kS=B9uWLor5ltRW)>XuCnt6~Nvl6JLdFad`8Me6RVg42!uGfL-yJ68yvCCLb_E6|%)U-im+iWej%&V}Zn zEkZM*x7uI#x+EuAK@q^O2#mPIE(U%c9|F)IT{0pH!6E54R`Qu zc~Me0B74)6xy{Ci%~MaFh)U?#M6dOZ-gV1Tqvh?TC*lt*HL{u??i=xCm15T~Dpec5 zv4cTUmulZt*!t?zb(Nxa??&NB&r>4{uL=rS)bhv4@EHy(us>;(vZ3P2Z+Yh7r?#nNyd=YOq&K(G>} z8XjByL}lX{h1k{Tl0$Ln1Y|5+sS|xe>`?iqPkb1eE-&KMhJt+U-o5(Ur81S1fuqaP zFU83@ZGfJU1*1y0nNjzt`nW*wDfd*ok9*y|{K&Px7WqU>lzTaxubn?mYT}&hrW)4Y zl{+*udsB{>E)Jl0mmq~*#vG?;t}(gNgIS9 zPNAeOh8rC(fDoaXYykL41PyBMZ*)yT_;z&bk3Zjb$vy$K_AU6JtKcnxeIV|4rDc|A zVyq(A)0-D=?%>eS2S6F+MN*X#%H51cj9Jdzny`Agy6v>5?nZ-y@on4&aRjeYiyM&; z^&z16p#>t$ENHF^kX?Gw{^0T<+ycbcQTiYbL5nuv+SRKRv@ZzrH=jNo_sYEO0?9Ey zKYw&Xl(f!81H2M=Ab6B~M#2Kg{3;olLcZ-blXylFIaHPEhK3MmHMsA{{M9hDE(kru z#n4^6buE$~5hnp@uj-0on1HzWaHEX~t<8T+tlowIsmjR^?99D6+%Cg~=|5zcK+^vqn*{3L%$DtdLx7h)FUw6MkPK9 zXhk;B1Xj{f&{^)FG2294+rVSl-;O84aDkM4H@jTBxYxnZl< zDY$BRtv)Ubp+o!VQ65Y_O3>Kms(@5*{{kIy2E-k8iC7UKA$6}EQx{3yLdW6i=7yCE zLn-Km$8bw-?|o$|w_?JvA(dhu`%EcJ6(U1o2 z!@1#%IYaD18%D2iSx?{op~-4!s>vVE;D0NT6G7^-j=a5m3hWtd5J4sxp)duZFh?Lq z-2OTekA@2I!UHu%}fpVtxNrsq^EX}x6&242JuG#eO`G{Ru5nvFTU0V_=6m6jMuJ!f1E(+ycgJ-q+;|UpG%N7BU%MY} zd+r=NWPQ*t!hl?`%ak{T#I8dd2Ihc8F<}KtE$aOaGs4lMMSMKk_`j{T#yw>C0%up( zo_#-SpW=9KR93#Hc3|5^Qa^FJQc^ae?dUio2>-pNrKM%Z!=(GZQ}Lq{)|-C9+8-Vn z8HC;+?*_~j1{gC?yd8%a!O^XP6KD~<+Oq#Gcwymdx-&OExu)aJFzD-m@{Fjl!n8xw z-7vi(^^x22;PI0DR8oma=F-K#Y`_KpY}%yE-51^@$OjJ}9S+ZnGb!8?0*8Q;&4!d0BE9#MDp2A4^ z0zd&7bCp@xk;`LKQ;(ov-GE0%TT9Ep**R-SuYWsQ%p}0^cPQ@Fm6ea)PR+r|`wTa2 z`GNzJwXNnd6z7=)Kgr#uwpYy+>bt9pi?GN8@P7taX&8-lK0rHu=OD|ocCAE#aM+vf zp)&FCH7_xkN~SqRCni?m1*3_94r852Y~@8a_X2w05Ts7Ad;`lvE*1bKhHTH{SCT%7 zIw^t?RLJmq938iVLLm2tbr%ugC4T znBKPq{|yzqQwCQ6pueN%j$iUDcO2~D*w&_8at!A)vMPE`>m1`OV%U%!5xXxvoBegmGJgaos|epKtX zuur(a3W+icdrvP^rt&$NN(uIE#yGkn_{tH&Xm%xOY+Jn{NMNi_p4+ zZD&&jPAovrdfX!dcXzYAv$$GFsKr_Dm7s23%p+`YYK=DBrZDiP!4Qjp&9$ zQFInR%x~jZBf|i&fK*dngnOSBrcNT&K_^+Ka*+q*1b0V7aRR)cxG{tF@g>Ft_W;yV zgm8qx#_k2>6LNo*O?o>}?;0UOR8z+p!1w~6jsdgd1c}kYgcV(S81UAX=g)7W)v@9C zs=(4?u}JD*-=J*dC3f5$*;(7!dGw@{8Z;6x&O#CrtcX!C*&w!6a1ltzeF2;LuH`#k zvp3_)uqdG8U+slQ@G>1Z-?)El6D=$md6?WpcrPI##B+8BEUhR?8xdHzkAYv-;p*tY zbO&N&^Yomy9nqzLPhB7c2nsJ{bq} zTD_+QH#-1^i|pRb2j>KL$Dp0xZ2#)Mfq@=mR7~InkE;G^z`bcJ@HGGIdBf9?B2c;m zL1BaZ%0@en%fXJ!%*s@ivD0}bY} zl1w2a$yAXkQ)Wd`l+u96w3Rf;oXkU^C}N{z9!kdAYz?A8>iezs^M3E~9LM`Sn_c() z|6kWy=Q`K9&ei6K1*3{#Bt^6%YDF*Z`ipz+eGL4Tp0KTxiBNBO-#bz;R`F;6I}=7=j1L zpH=qu$+5{ubDie5Y}R@z-^>)6psSvq1QKv#bIt)5DTmi)Gfz=!h1Saq5ItmLbz7o0 zO_>2}zwIwxwIHNjeYrK2%-k@rd$Z-_;Z$cL8a0-=5_aV4tMwEkGjAVNI_m(VDAtXlyZS2Vl| z1(o5^8JA8M+iFHq5dqTu%PSHw^22wi5l0!9tyq$kT;k-ilMs-+LU zdVt)?;P{h*>nSUj;L{mR`5`aDhMIcZqoGJk;g5X${keR9FBexr4iX*# znz&L zBZA+tqbEMTye8;Jj_%*Zc=jlW33c!y{$%9P4XuHtcy^4WyX;?Xu$V)Y&VW>N+UZ1b zVC!g)gdkn2O(1;QhE}6^wk|+3Y6@n3bO^I_z%_D%%^c=%c-J4NpdnfelfryQr=H2` zy~pw90D)pY;kVAfh;cPRs!>r?~E#tbC%6GrJ?3+V(? zJ*T>&M7~n4(>&ej<2%@Pu0)~ahFQpJ+HkKfuZS%e)IoVXzk`#ytZUfl0)lAF*YGhl zc;ZxX8{BA-e*F5CTCW%*=`eI6h=HPrW|quAFzDC$s>7APp+PW)7{>n`CPmb&1nc(& z1*1uF*4AbGy2*U?qh!J-^nwKrwr#5~aM1Ihs&)gjKk`8o;tI*7-FhECYf3YYD-odw z=3i>O0eV>h@QlUgRWWpXE2Q?xDP$;mGl0Euk$tCA)6O*nA~TZAVTecD+A7cMN7GIg z8=FMhV)wh1N86| z_PA^Qto`{j@JIn80n~H}5S0b7J0#HJmNpw&JneVEIa*x|$TR}|a(LV1CJY(4sb&aQ z#J^nMh@M+2jp+Q(pZE4}er4mIK`^m!K(62R$iX=>`_@)`%X}aT1x}RD{Z17s&WlWNmcw zjLm(#AJ{Hu0zql$Il6=VQR%to)3%+xaKYa;!D!#UpP`+GY7w#z9XeF-?9@S~cVmR1 z_Ws?E-}vV3+sd;S=I{kuQV>i=m0OfuT~mK|2)bYWt97(m|k&=8`b(Iy;| zgMpk(V%vJ`+Xasm0wE@dtFH1i-?~Knhi&4Cinmdr6z6UzYE(3LAye4CP-Ub75RNl9h^>hC$E+ql?Ljjf-3t!rV2YStx+KC}xM=ghL_pY;`z>93QS(IyGz-GN=5v zZBO{fQ;m@$Vr#o~_wL>DRCyX{M8Yu21mn}0*U^gScK;P~ExZlFBx~e2RD}#zGzFe# zQj`fEKj(KN1A2M|BRIEj-?oG%WCEs+|Kt0Nl<$M(S$%2-VfKpB?j`aIJHsn6Ez&YK zegI=Q^*DF@3yq5GI$gPZSqFnjK)=_js`dh+!5ya5(D}2Pq$8&g5*!l)tSn~p)p22t z;&@C^$RP}aJS6*-+;%znW=-#t2gHCi$m`w-nkqW52q1|e-Lu;> zw0(z2c<RI~uW!@fse-7$ba{$g zFw8@n=Z!#30uGJg zWnxbst)_5GEB;iiq3|~9F2CvRq9{dBs_G>_`YIm01O$J^eHhLz zHrJfOdjgE2lnI1GY+Mv;0vU=Usz0+}oDC;WD(3$E+wj=HPT;5=#kL{sObMti9Bruj zv<+v17BI2Gd=$n7`-+Vde=t=gj1j{Zt#jjbdo%dSli0a?x9C}3L)6x4yLY0|bAh2R5 z306Xhpn_{>g1&-`$vTqM$nxW;L{|_gp%IqkCQtLw{#83Za*!r8!Dw2*T#lyi?XEv= z!3{wol|R%_Ciex6LVk`wi-9g;2U@5YkWbn*vm;;R?R2o%*a6WO5d!jl$`WbnF$+&W z!*5+>B8SBCn0*?a{V;&|D&2pFz?;B~PwYew?MV>D6^$J0jYl}dwZj^!53z${KJ(m( z-oF-cnw4b21`Q=l6Zigw)ZZc)hX_x*Ry_k4seycvAa^}~+74V8v|vFg1~f}MMbfa) zH8$R^qOl*>%s|g<||DolGd&G-z|9Wc6%|AGTN-<)hRw<$&e}q#Qt=VFkP1r%x*s zq9E}e$!&cCzo)AGHDHAUoWdUWiUA%6nsr-UFceTQ!2E-L0--NyQr&pv5Ni(*s!kq^X2J><0XR86(hjTyu*SVf- zMVWGMG@2m_*d2f`qVkLT;0EyhNLqs7J{DfjrBbluL-|LrySGi)6W&PLU5rWH1B+H?ez7g0EXgWkAk z@=WHltH*c_EJMQZfzv_^l)7>G@|zGS*>Pi9N@h`lpzbAOE$Z%S~NhHXL zapZvxkC;+b^WSWea$HAn3Hf#I+_~>iQe&bMTx{#U7(#W3!r%)ev1kx!Ug-=R*baHr z$2(ijm0EJD8gd;%$^TM{Q)K_r!>AXysBUC*!fxn8q?Sl6Py-L`v*g9Z3eR(Avsus} zK4&xth*6rkUzVbiZ3++Iwas?mf<=ph(Bi#^J0L7@IEm$=d*sD`>&c6^c?tEpGa@2{ zN?(l^fAB2+I9Ad6Pe)A_y9$`*Er@K86q-~=OnZ5JYGNmuG~p`=kH>t(sbbp^pYXN< zH|Gy^e0hNWEo%8tuD%qM>(|dgB3Z4Z*1HeS&F&(WVK9(2ej)9`nf!T2+~y(2uMMGV zK%cH;OFP3eGGzt0fVUX6aN)uOx$Ep(kZwH{cEdv3n$;s$4JM!n2*!Q#r1K3Y50i}C zo!pgh*r;2tU(fJR&j?zC6pESfn;fF)?|(BpVW0rKsnnH6tLDw2QlgotP!Qw%@yt;z zD$@h41K_$QtF&B9dCQX`Z>g%OrNKxx!Q+;&vY`PTF9VF7THxCSJT^*h>^h<^uFpbE z^DJOKjg$U}8VBNOv%O(DC81wb_Z;;uBSUbYQkT4etPLpDThQ`2Mg+kW5q2pz{MsEs zQ+tyEKO#EV1KM)RMfbdBk+xG$f9^9oy+7t^OHlj)lSr~sCNYOV4ArN6s@3IccEgl* zt8IdqC2}=S4&dq1LJh`p@$!q`TD|8tA-R*o46Bp(*9@XrMYu-x;8Vw9PTo&{dRRhE zqoUNZ=TiB%YE>Wg69SHJZ?CoCJIZndPMUNlPKG0A(NvgXIFdiBt?wLI8{#8d6Y+u~`dF zuP&7aOC#irU2|ma0ZypG<0 zic#g^6$4Fg;c47YA`Tf?7^BCtvtvdOHx|A;8&7K8qs=6BDhdTYXcL5W5HR&B zI>QXp?K^jFWEUxM(^q{SN4#%HDFP=>FY;ZZ&}m~@^2l}q_0u2=v_d5r*xZ-Q#e+gS zkh1nI%8$;JdeXDWJ-BBAN0GpG2LOD(ELt1BiBzsii%6$>sLQ9Fj!Zw8|sa4yUEHLum)gz3J0>%u+0IS){u#TM$xzqbOM_g}bLh z96AZJ_Ih{LtXbm^J%aI|k^ClSnUtlJ#l{Z$hN#&d>lRtU;j-@KDG%>+PriReElY?J=!CL_M>yx>-7vuBmd^YV zB@Tl%f;fxy`=+#o+8oaG750=-?v?-3nt?a-J5Ea%Ap^feT0`Wk__YyK03e`Y6_sa$ zmcr{X7NCk@t;8Hu`ao#asO|yM5OHi2xPALbV1#*9K^Hk+jp=h(^1sCg+r1J30~A_U zmGWCawhcJe#El+K$(QZ7^GAL|yn~a{Xk2%shQCc1Jp6PKT`PZTQMID5=witBWWropUzlmFC|e?-87>p9Vzr}`JDCisT`Wf z{v_}OC7L9glT%o`#Nax-c?MSHN(%mJ3mBp{$L)`8<|(smP<{wJzrinaM5v^ICRVhw zC&CsUYfUD8o;FxU6N`v17u4@f*|kn!}u_37!%E%34 zQ5|6cm_b3!(?HEJAF59%2n1YhD*vjWHr46gJ;20uc0=ywdd8fvjvXlE6mcGl>_+nU zazpnt%5U&u2A-WDk@~PPu*m$Z&$K3%gA#cWX%8MWg3QCQY1(3>e5W;9z*$Yj>vIEr^MhmU(hu~b39G_<;aK7`#^)Il<0hw& zt~fVj&t8G3uzu2k;kr_FpP8H4!V7I<+O?z>go_Q0r4xx`mgp8Uf)RNd0i|1tewK4^c$4t@+ua;Y5>oq8s>G3v*?*N{6)Glb+PC3zc}I3WkU zN1=Cld44^hh5~U>pT*C{dGya{l8%wF8eKu^D5_6awDXlt+R*USWU|gIe^$Gevk6b~ zo9vERvnY^r=ZEqn4H*m2W-eermp*J;U@Dkd;-$5pumF_S)O#i|Gy_PPC|ac^@EDcR zWCRTd>7vn`qpR~}!%}<~5FUI`QazCc`U@npU@Fyye_5K@^x*2ctga(Kgd2u)R%H2| zM#qjl>wXh(Vz}OJB?ZFSBx)Q`cPGTLAY^cI1rAvL<#Yeel7f*=E|?4f>PYkhW=Q9W zsWi-OJuEWHQehOOYT=c@?H~lG^RI!4$PG=|TU_s3)1FN5z;RIzf_BYx(|DE9IfYUW zyBuEe6F2V%?b94b$O22jG+ab+gM-#HW27NJ z<%JPgAa^H_iFI{Zj6`#&yXcBtivklVe|7T;oxH`e+2q7iR$V@taZ#*^paB5ycV~zu zlf8HKfM%I9e&tNC$mi&L?)ytvo&m_2fme*M%n~zZ>bTo77YuZH{xD+kym|gS$Xnb$ z`2#*_HWA9|c}G(hg%BiQ;ApfpY+LA!J*&`OvVo8Cchje&t<5?H!56b$?tsOy`RO9D z5+Z_f(cJuyicUz1HGt2IuPa`^JU4nq@*ZI%x+J$Z3YRD9RhB&pX>WDGtRqvo;|c}X zr)TjiIBIe+$)|KLHll1Kb%6}f(G{&7myFj6n!ODfqpX`I2`PJF>Gw5sC+S?G)XV_* z%Rr#R35b0q1s%Ey`df|P1j-T)X@gRQf(f}9P;UGe+)CS;dwKZg63*)@_y$mIjrb$} z0)MKIULm5Sdw8rHW9);Yl?}KTM+P7G=*B|rqhtVdr=T%Y!$ML2fgZT7u<-pG9$FoS}vlxXqkzHl zoGUGhjYH)P7(&4H`1PhW=SKBsetz*0#;_4OW!!u{u+0o}Y(uyFvL&p=gX z`#dMKw1a)-mt0@!!UysyKoNf$ZjTxubW);Zi{*W9q?|H z;=Rnwq9G}FWzKEzOLn9sPw-`&$&E%y+|xywxI(k!Hq8AkDzPwYT^Tu?M3T_ZV3zRg zrArA6+4t(#Pp^0Hb5_^%^zm|Nuce0krOK+RUA75bTDIJs?7pJrp!}=!KUr?< zaGn=+X?@gy4$T5?89d4#d!}qilvimZ81Sv+TQ|^j%-7`u(t~W`b+=htVW}ETM%oGG zGKyASs}3E;(LC#pi0b%^OU4KG@1MvnA>V)34C;vf;nNH}@`m$YC~#0PR9Z|v=5R`@ zaP=ULpM$S=-z6`0(xSBHL-ahqc((J)gd<1n(AkcOx3fEDKVsk-K2iSi0kv&9`4o5( z*hdq5x}&bko-!a}4hTAc*6rQ2w9Qzp9|MPk@7!tG>p%!o5=W^k!y_Zd^AO75`|G_{ z)?a-?p_Za8x5qwqWK%x<^RbtVY~(;f`NcV$FfcScKKk{_x~EXteTX9a2Wt9#K$Zfy z{+JUyfbCY%hbjJf!bd1^CIi1R8ItBB==biuo7Kh>ID+y$fgZ+Tu1xz}Wx3*5XOnwH zd#!alGnLiiLfub4b|zmbu+su!*%Q`FuUxzK2<%kQ>09}&0;iwS(=}XPm=ipY0YlHP z%{5r#VKaVwx6qNpxoz>tNG8!LOuutyGTqF+OJ9Y<)@07@g?qHoT8mQ-V|mhjDCKCv zr{`+dJ-dka0V+D{Blr%xZ4+WC7$k_a`m0S|L$Bgg6}jJ~KYu>haEitk65VkWKb059 zj2|Blldy>WTkYDnpNwP3P>f)RL2@K$S{wB3d%?Pj-zz8gD9s4+L2U9Tl&t2m_sgEQ zSz1;WM=`VKZb@JujcQx^b4Q>@MQf@*V8G?uzaH>jJJ@=vs#}%~U?FQXM z0$;Z{aPVN8LA7^Yf8?7#xv^=J^dS)^O-90%^85R>GJyPJGRo+LoG^RCo?)&jfrz*y zjs^y@lFAyAyhrw*Rr0=E3+i4MS)|*qF{S~NwUW-Ai>1}R3yrCK%IkOn*RzCKNLZKa z89=-(04G*nB;pVJ^zq|F%pLT}=S4HZVM^**g70H4U%uR;aNR#o3>GmYF6Px6nSi^O znMt3k%W*U-JoMdkBS~N3caxmr&_|#A#&)sV)cDU z7X=ImpNE62_glWnG5hHSJ-)c_0`FvFdN#t^nm(cT3Gd})CS3M-(A`cv-1;tivmek$ zJUGtsIO={sdN^aL#A9)Y&7Lx_L$gsuleg6z2-`^*2-?FGSQf25TcY&GqM`|~I4x%x zIGa~~Y$-Wv-hu_Yk*apn)7$$hsiAtOaqNA&`voFYM={2Fn7un~-ap8-0t|4aL{a7Rk z=Od-3thVjfuc1b2TAKKv{etVLe&8s-k1xu^ zL17^pBm0!~Yp&w2EEjA3{LeE|ZbY1&fDYmq*%Hx>{@}savepC*nr0O6<4C@eYF$7| z90O|^SP+%jr?x#c1BN$)4O#`&`|+HbJ3vAO(Ew7(Xc3!eAbm9yyGD0?LJ#0CbMN)n zmqN^0(-KLjB^Z>U%lOpu(Zh#F&^T6My;BGT^}IiL%|F(Zp=E3WY~fQ+c_(8USqq}P zM?&J=Z|_41vGe-x?}H(W+RF|o`HejGM_={!-Oqgdco$`{E!DpN_3qNW^QK0Vw?WH4 z1{CgMNp=v9Q_+c;pGsS7veO9|ep|Wue=qeQ4!tR57vPGX=X#kVMCG&3b$6d2 z0dDrKt&`|%yFm#H6l1nBb4EEZ;|Y7=xiQgH@pi=azV5jZfMXj8_ei|M3$&|X8a|Sr{g+LJ;z}Mf8ZU}r{98SeY$MK&C1j%Ip0&EEZG*9? zg~8k=UO@Ol0{AiTAg|UUn>*`9Hz7Pc+?vo33s(Jjsy`g|Klo=bv#t>;8iW58SX2`S|_2yom6Kh;iiA zj~_o;_n!Z^{%U6^*94-&EB1{3o11bF3RmC2U>n6-Cba~0Ug;^E0B=Z~C&*3Wlc;@j zr`gOW>q4501rmMUAk9?@0s}Qw)x&fQgLdrbjsd$2Fa3lPx_KSsJc7@&8e_CqR4-h$ zNl5VUPs!n^U|KrO{}3Sf--Uo}d6yKK@-dkzNT7rBJHDteSawg43iQp)!tm`_NSsKV z>6~{f&xc6TEMW3&q(|EU)1$aj4`=9M6GMG0UNrT-4jwefj>nq&NWQ2%Z~!#`9cY&^p00BOSgoSP!HvDcea34?RDzn|!qf(NS@4k5x0WxyF`j*K6 zf$nl$+2fKrwy4Xy@Ey=K`^~G1hc9}4v8Q)UOa!5oaAjP1F z;brT_Y%-p7{>&Nq0ad^vyr%siEA9WkEnrfB1WNp+o*>MT zY{M-JVUl}FK~-(!%*nCYJFTKo_KX-5Y3yDZyutkZ^rgO67E(<8SmwCt<%(Rrl~PKK!8e{?IcdAu^+))dM3QU#O+^3p z^!9;*56avA;&tYrX)j>%DnT*>?dPL}mpU-Vq>rRYln;W4{eQ6wRuku-0KVODO78?R z->z|bU4ZL<4PLh_cRh*?RH1jNEE+cJu)pY*FCi?91?hyWZ4j%&p&_ix9#xym-eQ3& zT>k<@0-dQ<&hjGhpo_#6`6x5eec;cmuB|D^^5r1a!Bvi24(y-4kx{Um0}xcK;gp)% zFV!TsK0I+LcF?533AU3;fU&9x@cwg`Ewkk@nWTh^(F1xU;DOzVr^J=X1?#uAsA=dY zH9>^#XSnt7Lx*fZ%J!VSeNHP&j>A0f=d5n=TJ<>jAE(`$zKnnVVY$;jl+llI&}iI) zeO+;2ogALvkG->4vw$Yw7PcrJJ^U_6ifsi^D&5)Zx+k!va`?*!4|=*E1gcC#zM^kx zx|8g>uRQKNXBpFmJ`$1;37HW=sk8e**r>^()}=OF4J}lKZitnOJVCm3$6%;M zV_U_HU1RSeYRLyt78XUyTZtle^kt9IYJ0+BPCRwnA)t;345S+{f!LupVZtM?eUY>9 zKo_(mpP?!(@wMZWxl>d8VWNb7pt1|ZhPR@ey z*TUVEUJ^@Y&9`1xmnWMEe?3jr+cmDrUdCLpa$6JRN?Fwq+x#E_QkJrA* zDdP#t02lWGH5+Z8=fm7-XBsQRok+C z``?czRMZ}%n=fgQ1C%2Gmh&IJf4@|-2~tY8QXAp>yOUFO?PbbV|7NS9atwe*dEF-0 zJ`B!F*>nfjW8UescfGnICzQ7b*Ahy$7>+{i2$F(q9H^~ejw-+Z(V?x}>)zmHvu|jd z?A81=xb*BYtx&z9yxN*0kGbT5HCOEaO)sjv0Zi;mm^Sg&zBhx$gH&S=7njblGAA-{ z6f(ZzhA$-z~s!kcLV?G zx70>BluZNrF3j?QqgS=`9cbeeM`K&=sMlMB(!;FF?hVu-NLfo!NOs#D96Z+d;KqTU zO!x{PxkR+q4@(dW)aX(`C#y`BccRU(Wr(3wt5)^}7m+xa{Q1M^e$U564=F31s{W!G zxaQl7Fe%1F#(|_Q460-p;cI-G;kxI6ZR= z^bV^P$C8h_Q5KN4DwpZixHG?Hi2@;>h&+j2O6fAY&*4QgFE96HE_E0ufWLb`St-!r zL_7$wm1AxCrB&#<*u8w!>V_LcXDdz3DY}0o(Ew2JP3tY~8rE~|p+2@^QuyPyZ`F@C zCfbboTeWtMHlDB12uNF9-9G))5jHH%(Z1iD+c0!A?3)?y)fT@V4nBG8_wNry^;Pe-m}?O9&gJ-k=H(YJ|8w;9@imt&RGm68ebn1E z&!=5@_H@wKqwQ4;9hR#%x1ZZ6@LNYKpRQf6d?^o5FCR5-qJ8~4Uw#hx;`y%kqm(f^ zUp79pq4#iW}40JEsh1HL@QS%qYCBr#R$4?VRk{1X0`;Ry_ zEu?Lf4DQ?(?H56t)o^pb{%0;-5-INLjj1LZW87U_e9#ir^wCgo{&aS?-6HyLM0&J>E|Jyd z*wfG)LJa+B&-Y0jUwIzYy6ARE zhwt!^K^HY#r+N54?>Pv4WxA1gKZ^B&9?I4_&1HqS>>fn1Oob4;=XBLlBylp{0EP~t z&K`Ekp$kfQVN;&H!1xiJj4T{rE)$!S{JbC1P6N2po$oWVQ{G;9Di^9^SzQTz;0G30 zn7luQUSTtQA?36(U~L4;%$`+~2wZ_fNd2s6yd7b`k7iD3(lG5H1eCi;t&|y4uNr^q z22doO+WhM-8QrU5XV5?nMEuuk7K+NUY% zkaj?r7t%l)G>_MX^5w{?jW~QzOWwP8PxqL;4a7^&HHjEtHrIf7i|3GKQ#eYP@7g+e zTcD7!(~GVE4s>-VnHn+&nHja2mh?OH z>FM+`vyM+Ok`)u+=|QuSK-(N-EuRkq82eakf7Uqkec28+(vw*{$lFGD8rQFPJ#Y#| zr7Q~muG>zt;hh!p9ya@FJS{G;AoQ(Wpz0!`=CAcRp6=J$e7Kc{l8#UL{N+9r?Pv*p zTo`P#k`p}ucXLiZ1E!qXwZ}HlD`J<{gDnuK*DF7_zn*gVumX1HCY_#p4;nP~(0H;D z^}-W2xS+8ZmBcnG(s z+7!tZ9Vq?iRMPtS?qE(ZCkVh z@tCwFMLoP{&mMl+=DQd2vp^j4a%wAJC~w{ zv1mQYz|F)$A~I>^9T9O*%drvW-dbp%2KC;knfILVbZY+@5jQZf!}qizj8DW8oSWSR zxg-7=@$;K2JGC{z0vh$L<+yPnw)-CK*k)s9X|1aPfKmejC``N-(?NG^cRaj3MJMt} zKN@{OK|v^Go&Ra?)U}21NwS&uH633(ZfqX(ZJMlV&L?XP6f42V0gd3z$B$dkiKL87 zEOSkSSVlHp88ejbF;HF0H^gKzYqF89346%}NAV&G1wK&5zAkj-%;&kTDArX_A~!(x zljYdEYgg+pyTkd;m@T!&uLjLNNM?{lASatpBb{-E6lCxddld>q^UD?UEIv}}-$Z|g z2OY}o?De_^Ew;&JVWb&d`ld49Ss`a9MeP3bDd8o^Duc>QE*gJY(w28JUkY--%7V=6U@klM~$UOLL7K&gbE$&v%l@<`{$yc4e`TGvN~QBhU3*DY!nA|e+6hWn7B;YX~zuk)y-YbPU< z0LAdIuwiIa%g~`rgeV==PPs0C_cV z0z80n(33U5lyG)%i}I1tOS-*0J8v%gB+YWOvUb+6Hco!=rkctCA<={x<0I0&2e?}! z7U&)}`u3wr6q*vP*;6oq(ZcD^2Vt}){~Bcy6`xD|ji~+MQLXOygnL;i4)gsd(t=vi zVHB^4OLx2c6yEH-UH&f{dSM}`O5pk+W&zm-N3x4SfVJr4B_d+(zV&ny`mkLA0;0px zHC_Q5y61n?s0mtfW<+?obiA4*~TE1C4(pZ?9#2e z%~cEV`RPg$C2le?pJ?-Z+qR4L6^-r^PRt-oL5R`BS|~?+YSL%`Iaij|ju+E|O=)&A zLP_cFo#4G>$&xcHy09)@`crrHE*c9oBSu$S={))0nzV&;N^WUxYqK@Wa3r4nMoW*s_qM3b@j zR0@D2fcJju=1m3fT%YM6?iQG{5r`2-(I!CKdJ68z;+bPhzAl_MFaBq%OBKg@7su2q zB&L|ccLPI9(>(cuxEhd}uLh!UT09<|xh%3>cM4$5yRdGdaVOp@#hP0QzcC zEn3R(d@yR2o5UJE-1Gy3MA{2wrNVtIim=*UlHa+xDqAs|)vV(fBQ0to6NLYK-Su=e ztFBaZ(?mZ`Z}a*eI`A^t%?NH|ZEfw)N7H0_a`$c-_TnkKUG6IzN0?O`frO-QnG|-U zCR`nSXg-#{949h4(e}bT^(fzv>SEe9Y7k7EY$7KBL(8aISlqbhux*l>=AshPH|=wZ zIojUa6cee13ZZy8GHELZD~++W)w?kLj}4Wt#}{u|b}s;fUc4Md7Mt!}*M0ZL=!RwSEyi}dg!aZf_%>pJiiC>@0i($t?+0vWer_}rSarnv?&k<- zv519!{0n%D=R)i1!eX4tFz1EqZ2zE7YGwQ~?GlEIyZBU`ZI*4C5%S#%2O!@UYFjr3 zgA_i z7WW$rP>2@+!;7L30^nnY+&{N!5M~7~2&t;8y?WqB09aEL$Ji7A*qBpjOoAh+6-GoM zo1{5XvZ9B~tP`%YSq4Swa|@BpQskO!7S+&q4>eJhUYR(vu(Xwz>F(V#q<608 z1&C`>!Pk8|Y}geu>&nR=gE(fOU&mtn1M-=O6zQ5fvUD_p{qC{#fCZY}`#26kV^WT8wV-!=~Eb+O_HD z1X%U%Jsjye2Aqe#H`~}WFpVYv~9=)f1AwB@n16!jnn)6@leH> zuDi-tj=y?n|5kQiB3y*E(mHU8T@o(%zQVju`RbO)Hga<1vz#|mhaSKxw#Vdt+s?Aq zo-<~XGOEL!La&uG&(_Y9@I~@J^{O!^$&$(o63iEM?QE(s89KtF?jjBD z`97v?n>5@qY4e1O&F(UcaDL_Q8{;-^G^fOJ9;TJzjMP352IQY_IFQRI$~e88m(E^` ziVfJpVr*WK+!e5K2N;n}LHmSV&`|AgEapta;3OHBzbK>PJl+XS8e%rgz50N#`D5@f zO=Jz6A@#7)_D6m~=TxLkgj#rN^PxwJZL77i!MxUSy(>r3{Ilts+>VczTJb{nQJYQw zrv<2VX|l7lX2EaB^%$g7i5+%FM*eYXx>NmAV?U<#NR&xb|LdH_c5P8|!5l!FcT8>B zv=h~PpBp?TlbQinpqHY-V`TfyY&U_)#SGy7JoSu#NBs8^jF?0N%4ue3>3#2sN;lzr zvY_S#QtIjH>Feur&2t~{o3d#riBAHsO{q9$m&u(KrlzKrlvZwB{S^kj5G zC(^c#u9*GNYDu0UttVnYl=|l)mAWJKX}o`X9R#nya!JONWO=z1zAJ-k6+VPm{8E1I zakV+|y;850N-!k>nBU6v0W-O*+boJK_h>`8MkD9^99_j>ggekwqsV1Ij@y^okj~j2 zOQW=lOM3;+%b#}I&AWG1DbEa_?zqtd9qjdr>Abl<)irF%;m~I6Fi=Mm@(yB0a{m4M zjmfZ7Vu?N8-K{8NRI8Z16Y$G2uqqy_VB_SmdB~*CupYdLRv%SyLkSJ_x76{W4_3SG z_}s9+nKBXA7bbv3l{<-ECSdR|4??Wp06J@~Hg-ZRDvJk!9Hg1;^6l7e%k&tb_SwLI z|6M(`@z?OA<<4aD_$&Jj9Xj+CRA1EAAFhVhmzgELcmIBuD>H3*W1nAh(?lXUV7pOy zA9l0k_B^+d==&k~)Se~o&^)uSnU{{38ZsNDXbiZjg#ricBedC@-&rBDKr|Sizl4vwwSi`M|Bdu> zlSlVx4LQW`fEq(Ov?l(>j{V8n2B(@w0}^FQf57%wKE!TtVBUiH^G9-0;>jxjirQ;r zO~A1vOVM>|ef8$>d);%6w;O|E4lq4${`_5ui6+OME(!_>d9t77ZsVY%<2P@vr>je! zKtPM(p2xuL(We~F^+}G3hA;>>`DZ$Ey*bhw&&N5FFgK9 zs?H2B(%e{YCAxlDWI@j>0I4$C!hA*sMM!Yo@KYM6*37G7IpnJgt&U>0EAix}pI;~` zH*$g*d}Sc8zBDygH!RTNPa%8lA$o7_n00Acq(jD;{xUT+0L_lDzqEbcq-s06~jID3cJVKuNovtOP+deAp)i-#vv_|PqU zbKU#en`aBW9A!3-491+Q*1uGREYs@>x071q#)6NTdU|)z{rWIeHe$z2 zXHo|Wla%D=*khwb|E(pdtR__B#}^b9Mjt&IxNexHYJJRsjLGzq=wYCGY-4xq{H_a6 zWe+$d`AD$90oS8#n`C?$>pvYQ&@!=V3S;wp@Mg_ct+HUNE4$}t=QL7PpwSsL)VoSl zi5eQ5Y#z>eCLL&KOz*CPR)s~|@#idG-KVPZjVkZgT}QDH=p{-J8obq4sq0}g7ILx& zePNkN7?odK$smoehb?#Sn+I1*nS0M-nDLb__g&e%F@~B&Zd;APs@bzUgU3R+&ZGF+ zkK5LsmLH9J zUgJG2Xu_i{n>U}YS=+nPD;}}zc|cH4Sz!Z#yaP(oXx5#_b74H?pH~r&jAredFy64b zzRYLywIwE@s~%=8wp3jBe3r?wzzogB<(Q}Iy9?wZD$8sdtn~=oE~Uvq69aed@kS|M zp~H%~s(TIY_Tg^Tdg8R8+N{~Lz(|9}kj%HaE4T$UT(Dq4a}CT@nrmvtCv6*tkjRhvUIAbECiq!+N4nz!gTP# z;nO}U`viyG|0KG7G4Y;kWDapZa>*c9Rb@-f9}VMRq2er zw0VW49wS(RWFDax@PKiHY?a1bq-;yx!5tbyM+O$ZtIg=qhhZBirFv4?jrkG*h|B>i zj;DhmzZcF2*0C2tFCB`Fm~P;v_bIcO#4}(=p8P+kb}k$&G}!?afMem+>pj|-ICa&H z0r^e2Y8>^Km#LdayO1CkBz01*vNLQu1jy8jg9I+k_p|CuRjSim6`S9_bDAJa-zNL` zppV}TXogJ+E))Sc$P@M7eft(7U-)EyBom0_R7j;nkh}NqZ-KA>_V2$kyf5`KPFgZ( z{{{QDPE?1MlnNEzpd(Yr5jrMQU!<_W10&nnEFSWjnSk-0n8*u~rL<_vGI*LGlQXCH zGE~d|8bDRtjMwC6sbjftVL|(AXU*C+89DDU$Aw0gm3}J$*jmF1DB`SPy2TDzjBI)O zmUuI)V66ap6-|opr=u@Ug#B#N)>Ogg7Hex>cICkIzOh(Do(gN#Kp_zu{gARkXl8!G zVU(icc1>Yq_|DkWT$6w1N9fmOuOMxn_-Etl`Ow19;w#=n!F%ug#fkd2S>EeChJ3?8v9(o z+h+2_i9USu@YhaYDJkhlr?f(3XbN>@V$7x~kW)>D4<9b0Jrt9lU$c)p zi+(L=FZ}gT7q2Sj6=10?0b!snlsUfR^puO=_m(bZ+4r|IV$YO`GYic$S7IJE^I+&W>Rv5EKsF3i#~_Z*d!y_>3yLUNJUw&Qpg6B$!i zbfAB7;hD%@spT7@WVqfFYisIiBcC=6=7XOa!vb!a-Mdep`o+3Emybc(qNET?T9Tsl zM@AjAi<&f0&NMiX`+xusa@s48cP4zUYW;eW-%$a`SRg1g3&9$}X*Sw6t*=CIb&jMJ z)j7=-yu_OcpS0+S7+LyoulFkTqIWB!Z%B7XGCz)XknMe&Y5AgRI;Xqr)`CX8Ev2YQ z)mKK$KrcMY%_lkH-{M*H8)T>#9iez_(%{iCF;VBfGje?+!!c}h{pg9RtPCdJFOHb6 zc=xmCw1adX1y4J&>;kE&(;|nAeXoC(l_?a=2P|IVnWvnQASf4SW{w}>z-8gWK;Z~z z_z;lkV!m(s9f;%tG@u}tVdEncq8=vpW{W{JX{UlMFA~E!(F%{SZVyQ)gaJf|CbY?J zJzBA5O*$_p>+%ZM^Gjdv-Ld#Mi*$uJgPms{Log1F9)*I96z#y*iTe-!XqVQcIbYqy z^xjSKrG#CzmnY7gX-*BChThnhQhPSl3GwL;XNMX7!&7FqR0OKF*cNAhiIo){Y8I%g ztIK>hQ*;ROJ$`*VuvKXi_mLWVU#-8HxxTQSD|$KXqV~MD&hEE2Dioo;M>Y ztpinQOOa;=S0u5)vKyz0k=~doJt|?sm|z>l`;}5PSHT*j&NyyKZavlZ5kxmmMK>9v z!c#B5X>(9cjeQZpCAmaN0cVvi9(ZV>R$fyHsSRkSBk$P7>!wVu3BG`Bm1sHnA0wHZuY0TdcRU>yDS8nJZ6Ul&NOze zXz3vH!G-Ag!u$BhG23v4L4QUTO8-TjTy2nvEZ(22TllA$sV2qCkgKp?4i za&vRF8V1&lv^7*PnC+GxBd~yCNxb-9L&30nykU~#$sc3qXPUTmGgzDQ_^ESs{7%dy zu>RuTDEt<@ZJWXK6fQ?)pJZOeEqZBT`}PGuL%L}mHeUM^bL@0jfw8mB#Ra?2=sLsj z7prjV-3%^Yl$mpLmvLaXFKrT|PdJ`E-EU;&&AL;izd#26xH!U1Ny`%XMn!!lU;7}R z*iOGuAg~R=nj(cxCy-Wlzr+JYxvNahOY;0NA0y?KH-k+Ua8D?yrI8QW za5u3(RfG(RCUix?9-;ubLfyEx%V&h&ediq?b!HljNLei90H!e3NX3+ z`(s=7qg!FOG?I08Iz@tVAnPU_W93%pVQL)NJ;_tJZ!kmQXv0SHsZt>DSofT2wxuL{6)I{dUJ9FS?&u4&2W%e> zqlic;p$_ zp-D|lE1@2Vgn~fU<`C&lCbhn^!V&2qotA9cw-gPV1Er~g1VGH1<@Kb?`xloPgm z>KHW1fGg5oRFg8RjW0x8LIS3VwhJsxwoKZ^-=nz_ODWlwiP7!a77yDuqx;HaNki~} z8TR@!udMXnG5ar8!Et(GcHKTgoj`ND+`A92-^7QtKh^?}e=1T{1m-IO6 z%2z;nw$?d7786j@7vn@{U)8tw?9$Hn__;D`i(g*eT1X9gtkN2!GV7}7Lt^Hymr+aX z`C3EiETa1s+pH5i4(2P_j2lOV0NL(PmEu}j5{yh|)v8tKEj#;K7QZU7irxvd!ge&o z&uaF8a&DO0SGxFc3N_2tL z&;z!2VNO%J!*qB%+|keo!&Erq_XVUkG)zWWTl06QM(U<3_U#)*iA9h{&jWUx{+o6P z4KE66)cBLAA2l^KrTwL$0TMp>xadQI9wM0z)9||mx3iOS8`G-7|DpDB_!1$TKr!H_ z(9;boXmXn>OZIL=88-8n6qj&5Z4w-UEu`0g?OVdaG=RUpP*ka?6lgR9v)<*H{dM5L zu&yoK;<|&8q?ZCcvK$4ISpU&ARQSLweW02LS7`l4YOX}08}w7Z-J2QWtSIMFVKP%W z$l^6Upy{VoyG5zBc12^Sq})(+TY{X~2~iv%4k1h+8;zyNEL;1q7t45=0?wvCFpM z=#L9kR6EjpzNvCtMDuOd(#-`1l@#X>mn2J&n)lbWMNbWhhsU4PkRM$530h0Lg|=_F zB|4KI1I;gr9A>qptbpQ5hj+_n*{Hc#1`eg7VeQhrM@vzq$|3+Pol>D`Nfj&uZs*gc zb~Gh(0AR=M@_usi@CDTw1eG;fs9MbT_nN2X(`MNA^un>wjXQAYS{M=vYiMf8%}rvm z_x$4L%{cm5&!4mLmc=rubY4wyLJHlyN{ZhD49d^J$G&-RI`1N@0Lk$!1{Op|$gowh z+o9kCH1F`3VV}LaG?VCMNk3=(&*KlZI?98@Lqd)pN*P|DBn(;W3PXoi!E#&}PI;0d zSOuel`H+IZA@kk{jRgr21N17I{G9d*PpP<>fBIm1EA zsVgEz8jd2)lA2}78?Ry%hz+)j*@86!a>OAM*3lG)w3>61d+k?Kkz*-i4B1 zW|1+;_=oFLEajWc*s)#UuDSHwt?u@??eDzW3U9bS zk2cMyDi~>fA6cd!O3UnBfc8coMq|j0#rUQPe~PG8tnFYCH9B=V9j1LK)g!O$-`8!J zwcYd3oYlbGr$wKZZ<@@EgRCDT*vsAEY;e7a^P=jC+G}QE;hdm-jm6j)fmXQI0HnIW zl7Tbi&%v6BKlE$8?clK(t=FLk!n6NyZk@lMpV+8krrkw)U^hnmSIz`_ooyJ%H!GSt zOY4)ykOfPZJ}8>pVf1uZm{Z|by3H~p+DiwkrkoXcR$pHvCewaxgj8w;izX^6Di(gD zDLNlnn79bdZKxV+#rmKObS`UtA&YrO1y;1ghv8RIpm`auV~Yge6SFn*wn;A(*_xC0 z96Wg9lWW9*1C972oUXz~m)TaOG^MhmvE@U14Xx*eDi;3oE29$ zmi=WVrhJ;pOC}~idASK0z{;0mY5eKz!>{7iuDJQ+NqFKMOWRon4) z(UdtAV6r|{K_`M87)$GA@9LEyJ4&Y)-6=hCdCqx065U)SSvbvx2n?&FSf+9&LLmdf z8S38o`HVd>5t(};cV1_54o_#$??6>{ay7+SDwh z(1#f^sCXZ2;xuq;YQ+-~ItHrJV%&1!LSL4i33E&+R`s`n{M#JJuUdU%RdsWNhr9OB zECI6q$7&)4(4_q@7+zn$Af;#(d%x}8CI@Arx5ObN_nPsZP~JbtoT4E5oCP)loBPf& z%|-F~W*Csexgc>s;qVnDeIUgsDn5St8BHjdPM5V>dBa zp`$C#ttWQWwf5BgC-hTIfh*;yWEkCPHT89MIGR6jEROHx;qNy$nd-@Q{1xSPht%{?0e{6I{h zj{ZvS%>0KDEb3}X1F@QETG`%6FA$%$yZUS@ z3Jv<~ejmji3E)xfGCUU*;DhZWkLS`EtY$xoR{ALj?Ev@?L?SY!z7Q`5XX}aab|p#k z6yksh^B`XSg1zD9m8k-lxu#i$!b}Vpz1BNr+{vT_aXy&&jbFr09_t2fw;>xo-S58G zhjzlXvr{}0#eR#mbJ9;k9XYmXOo|ulfv^qcTg&nsHt;AEA-GhMo&r)*{wzMRrB_>R zBZO~WHs3gg3LkqzfBxg^s|1@qcFlONmJF=t7ZeUD*C<#v?UjOGOD3^(>_i z6_a^;<*r0lQ~my96pD^>#20{TdYdm;!VK*c;pSr_j+QM7jM|($rdt`q!gh!eaJp~` z3Er9pRF$e~w3ZAe*3~Csw>#vqp2YvJc%DWretSPn~13^dY9- zrbPPzD8;eAxf$I37^FiwJsCDs{CWNl7stE@3WpM0mZx0Q3MsedBI1S_h}ho#qG6Ma z!E%eI{yJfA$mo$0Z~BBzsNp^q0a!XaYa`Rr+_k@OxL-S+PokWFAYXy$-t()gg)c!Z zXEeF$HGu7(B`ED_BEjUJ3lrJ)h@ap9Z zTT#Gawzh87sgtcJGovQz$I;q<%oiAAyl=7@T6r;}U}jAxdg9Rwc?`#n!6r32IeEy& z?f8-4!6REoS7G7 zRk6@3c*`{g-E-LbzFB}t<7Oaz8f-JvysWi>^nsPj$E=-Ezf|PjBAq*TCB*>I86v3n zZ-aS>O(Eg|4sLM|J`b?{us$fU9E9OVC5RNDbL(J8_L-|3{h9i|KFGLolRv2tCM=`*6Dhxxuonki{-4pIy1Nf?D zG=16lS|5Q7M4v3Ltr!TI$nptozG-t@FF8*#>H`-GZE=%m94g8H$WE<>qiNc(Il3h& ziTUETo+k2Qv7Cut~os{aSmh*D0IDpb)3ekX&^Y6 zLE>P^jx&doj=sDwT+k2mX{AFz>thSwwax)IzWs+ks4zn4&85QVavH=M7=72>a(L?Y z7JtfGk}n>$f7UHeg-7&;4@D*fv;#MgNSvE&5EOtG4j9WLU0#WSdGOA*CEaD{yp8ZgiJ|220eZZ)Ux zA3vBZSrVZVAxk2XrG#p9j%5f*C^?qYR5B@hlx%6DEPZVyOR0!T(?U@(DKZlh6;UbC zLS?H+^?f~Ne&4_0cP?|e=DLp4>GSzK&vW1J?GDVYhwm!`|5abhptF^bUrYcUK->VO z$oj7z?ZqLcxyk&-FD5>s3TL?)Z&aJ)q6%~w0H}VB$A9$5Yo07Wd6mb;wpP!OPr`8^qKX)O#n@`u>7mrA%Ll5r9oLKFNN%ZO9NKlmPi2s9FXM3B}e@T;a-g zjGlJu$f_Aj|6ni7Lm)gczd!SIrV-RYhbfR4mKjzmek}Qn)BGPkzdIC8^GEHYFSIS) zG>uQk>RKM98fWhE#TN}AQIMREtQYAU8_VCG<`fQN9aX-(VE|Utj$Y3*keDIt7=YSsmthRn~WTUmY%v9jHAO21V^HsR@u4oIYzmWa!y_zoy_O3f3aen@-DATPTHo&W_xE3{)3%yCrDPRn-7G+) zB{8^-&(M!F5%eI24vH&+TH!XgBaV;{)MZ}t_*z2Y&)y_- znXt$Cg<4=2LM2BcP898+g zFpU|%_?_AR$ienB!eS7$FgL*>Vc-zVx8P1G7S!z~2b8CG#`RK%vG~_h4cccu4Ug=c zSvw}hdBri?x67B$^6TCM>jvBmL`+>sezS&RJ{ZBme^S<$mMz^h%fO%sCUG zQjY8KQe9YCSuUtk24>2M##*e>n^Vq1!-Q8hj)B_$v0oh0fbvJ1DU|U@Niq=s>X9WX z=r93JL7B{$H0spcj{GT={e1gG6(|EIJZhkGA1)*}{bdK-NcSG;c3+r7#Hb>;f*(W; zh`PiS>dL#{2Q3;KaAb*GRTIvW=L+3QcuHKKomC#oKgj7h0?HvZz1eM?J`?N^#+D5o z#$*JMm?lroe>6A;+k7#PVY@I00zq2+0zlDYdzXUlgKoe_gMg=mOxFYi#GA zUqBm^_EKR{`^vn?z2v^27<6WiU$yYr!bOXu&WS-_^V)pf$p2iC6l2*_R8krdP+m#jss1!=1Q~ju zf*^ZBXsX^!461lPJ&q-AH;^lYDThQ{5Rz3Pyxf=sziCo_#g zSvh1X6TdgDT9`tMYblo(kE-Cz{N4m0Cagw89#WVFCge|{)Uka>Kjd|Pnb!Rko8;P)m=hvhYg8*NSG+$3>3L)gkR~jd}-0B zSl8_^C%6caY}=wP0X$3>VViiOzBSgxj!R=%3B4URJOR{EA4h95E-aBZ%UKg{;TplD zfsN3IX-WP>B9=tP#y%{_!0((}SR)*HIG|Aai2~%>jpXE9FvH)=4L>$Eid5NGA4CEe>Cbk`4L;2}F`l@RHdmAAIOC?Fjc5=YvoN_B|j>ElthM z>9xnjs6!G5b|DDVygpAV{#AY<&zKnbEsz~ZLlLOJW(Dzc+{SF*hgOb+TM%Wr^v2P~ z?4LO9MNK4;-Bf7O-O}M zX7~v_&BmtmhFX(|sBdi@ntG2h={K^ctaoPxXPsVilnY01k=<3wJZihaBL2zZ$4};d z`}tYWvh1kA2QKPLgX2dY$#LweQs1eoW&8?*?&G9Gzm7|`J>1oO*Y<~#V;^dIC4bs{ z{=4#t&&@kr9-2(8`&91v;N=VX=}%tiZy#h55rFw2Wz*%B6mxTP@Bz`I@ax1u&MsQA z#LPm4|LKH&)+fgygOxep+gd%Sbk_#f8||`LvL)*T>+`D>Ugndd!&3j#Pd}xebLSJCtHoW1NDPMlXIwi*H%N zo>jpv)5A02nM-I?RLiGGw9otPYHxm;C*I%~^k)6R2q(n)*4880W5SHZ0M6!LcP%mL z6qc*a`LU_cVElN?gEPW>eOrt&8lMytjKDLj-dNH&<4=P@Qfb==m<1ZqeK`(hGMR!X z!M6wR-``2T}EqS+G`P_hj9uiX_>Ul<>HrC~p^neXj9?i|ofK!K0oWOHax_&MI z7^hF}ix&qu!cgGdA_+Y;HC0qWSLsjFQ%hK18uX}36C97UES0cL{Jdq$wTv{J%lxcN z%lXsxkwvS-AYFbJU0q#f9`-{8+j_0w+t~h%I=-t^9Y(vSx|*W7sGuF>w)3!0NeGXO zENc5>Ga}na*Q%0jZwEN7UE5n`vF2oi)9MN8;TJDD-l>`P>F@E63k$XP?Aha<*xKqf z*{y7E-j-BQBYizROv2N&&OBTl=ljehsZn?0M5~ymPxl11ySGQlSliy--kr%B%`3i0 zrB@bTo?u|`7s8mVmPUJ?Z(U@XM}vZNJW^YOMyPk`+BFa)5GuuwidddEj-&7>Ozj+Z z_djrp9;})+Z0OKgHa0=1@(vp2S1(p9@$Q+s?ja2YpEIwhkL)(P*!!+FR#sMGG>NvZ zt_;lq!XCJACFR@nLvDz8Gh8MK1|59oK+9ChOcDKa;zYl09Xmu_zI;AP=d;H&cJ&X; zN)L^Q=*Y!wumhU^9jT3GN?Pcr1Ey1M#wT3uU>!2@`<41{X!BxF?xiLWT6W@>t>psf&KOm$6-$ms50tErs3 zRIRElc_(@&{pzCX+=Oe_4jJW_mrR;E>GkGuwN^bd^!{GDrm6cq8i5NjF%L#EF0-SId<7}e;KuhM<=C9_n>g2MqJ3364j=4te5t)>~-AQ8c+~lFes@ql&(@$A> zT-oNZ+{y`~9uc5tK?Vl|h3I~$T*38rpFOJ?6%}DLRqm8AVhUe9YELK*|jXtQ*SvmOy7;rtiNI;>(q+qvipPl+O-h0Lz z3_t!;2mEZe-u~bnB%TwiTltCHgu7^1X1ZLniMD(EFmB`B0b5Fs%p9mz_Zyb#bv{2n z5s>3_vC8*?|C6{yMbR_QWcU%8WQNt#*G>xVju-UH#j^pd+PHVMC-qLvMTZ)nmvA`4 zc4GZeU*F%xjyCo6Z56XxVpAK`0oxZ?T8eQ?TuL#hiJ~PeZ-k{^sN}l7*BYRMf{op+ ztOgGuEQ~)5$JXx}b=DBtxtkCxQj@$JpX?aaQF#}q098?LUY?!Fa6>~?ej)B?&m+N} zKQ(M;37T!%^u_$_Azxp|lg(SVc>7kS-$8ZA-Zxcf3VEPJHw2lcs-dx09($K*fgu4^ zm6hJ}BF$*^I6*X?3!SZ>pJHTYD05EEIjQ5M0+oLAs4pQ=FcSkf63{CqxEciK2s{C0 z5IgUH0Bb-~Y&N+?MF%*RmFw1Bzn6SGu0Jv`avOH%ea-|iYGPklAeRRi6mKopd}t<> zPB`jz*6+YSduvza_DlL|ysNA0XJu7ECU{>-*_$`RDV9{s^N_2}EGsV`5b%sK>YnXD zwQZXl5CgLVp{e@#(S5%iE<=c1nTpJ9>1Q;&7VHQz>4mhk;#F}YQ{`g;dWH=72u+-Q zbK9q%yv3|XqbXB(M@ouKZAwjya$WS*s|(mDXM~|IZh60fC|f?7vcfuTN3x_RZk>_Z z+J`}M|0*p#N2%f8?E1G}w~QA@)f#*7_rcjdU3*@Bs>9vTa=;_hOGRbqtz%{7>{+4O ze(y@sOJ3P7iQOw-wrmumA9}n8LWDS#=1r)ouI@!u;1}wf;}H1mn+KNV@~fttn62=1R`*Ly{pqe)y9&O zt5kiGzl3(U+C?h8CL$0nMkxknPjF@*$BsOST1+Vi6MAw~)^3#hLyEMdnWpZxsA9GGE3y{@FWxw_=(<(L04*zpe^KtGcP%tYypkr`)(PcnIL4 zDTjE=WFd3|dXBFvDlBA7Ru3vQL9xJzuuzeQ7T(x0R!Fj`=3dmh^4zuUOn&vtu<0C( zJcDlxI}5J@Ppp${8rT8t5kUngQ_Hw*|K@knCUBb{}-2K^V$Fa literal 0 HcmV?d00001 diff --git a/content/drafts/linux/index.md b/content/drafts/linux/index.md index 20a6f07..9ab8693 100644 --- a/content/drafts/linux/index.md +++ b/content/drafts/linux/index.md @@ -1,277 +1,22 @@ --- -title: Linux Architecture +title: index description: -date: 2025-02-17T08:32:33+00:00 draft: true tags: - computer-science - os author: TrudeEH showToc: true +summary: --- -## What is Linux - -TODO - -## Disk & Data Storage - -### Disk Partitions - -Except for the `/boot` and `/root` partitions, all partitions are optional and flexible. You can add any partitions to your disk, however, these are the most common ones: - -| Partition | Needed | File System | Recommended Size | Description | -| ------------ | -------------------------------------- | ---------------- | --------------------- | ------------------------------------------------------------------------------------------- | -| `/boot` | Yes | `ext2` | 512 MB | Store kernels and boot info. This should always be the first partition on the drive. | -| `/boot/efi` | Depends | `FAT-32` | 512 MB | Needed to boot with UEFI. | -| `/BIOS Boot` | Depends | Not formatted | 1 MB | Only applies to GPT, and is usually a 1 MB partition for GRUB to install the bootloader on. | -| `/root` | Yes | `ext4` | 20+ GB | Stores system files. | -| `/swap` | No | `swap` (header) | 2x RAM; at least 2 GB | Use the disk as 'slower RAM', if the system RAM is full. | -| `/tmp` | No (can be mounted on the `/root` dir) | `tmpfs` / `ext3` | 10 GB | Temporary file system. | -| `/home` | No (can be mounted on the `/root` dir) | `ext4` | max | Stores user files. | - -#### Manage Partitions - -One of the most common programs to manage partitions is `fdisk`. - -```sh -sudo fdisk /dev/sdX -``` - -Then, type `m` to read the manual. - -#### Format Partitions - -Use the `mkfs` command to format existing partitions. - -```sh -mkfs -v -t ext4 /dev/sdX -``` - -For initializing `swap`, use `mkswap /dev/sdX` instead. - -#### Mount Partitions - -A partition must be mounted for the host system to be able to access it. - -```sh -mkdir -p -mount /dev/sdX -``` - -> Use the `-t ` flag to specify the file system if `mount` fails to detect it automatically. - -### File Systems - -> This section is heavily simplified and only covers `EXT2-4`. - -#### Concepts - -- An `inode` provides the following information: - - Pointer to the file - - Creation date / Modified times - - Permissions -- A `directory (table)` contains the data before the current directory, the directory itself, and every file inside that directory. -- A `block` is the standard data unit for data in a hard drive. (Same size as memory pages. Ex `x86` CPU would use `4 KB` as the block size.) - - -#### EXT2 - -Uses linked lists to store and lookup data, to keep the implementation of the filesystem itself as simple as possible. A simple filesystem makes it easier to repair (or skip) broken sectors on the hard drive. - -#### Partition Layout - -![EXT2](EXT2.png) - -#### EXT3 - -##### Journal - -`EXT3` implements a journal to act as a buffer after a crash. If any operation in the journal fails, because it was logged, the filesystem is able to recover and finish any pending operations quickly, and not lose data. `EXT2` had another issue, where if an opened directory were deleted, its `inode` wouldn't be deleted, leaving an orphaned, empty `inode` on the filesystem. If the program holding it was to be closed, the `inode` would be deleted, but in the event of a crash, the `inode` would be left in the filesystem, with no way to be freed. - -##### HTrees - -`EXT3` can also use a [index](notes/algorithms_and_data/index.md) instead of a linked list to store directory entries, making lookup times much faster. To build the HTree, all filenames are hashed and ordered, making the implementation more complex. This feature is disabled by default. - -##### Scalability - -Before, only one core could write to the *superblock* at a time, but `EXT3` updates `inode` and `block` count at the *block group descrip_t_or* level. The superblock is only updated through a system call: `statfs()`, or if the filesystem is unmounted. -`EXT3` also removed *big kernel locks* (deprecated feature that added the ability to freeze the kernel), and `sleep_on()`, which was replaced with `wait_event()`, preventing infinite loops. -These patches improved multicore performance by over 10x. - -##### Preallocation / Reservation - -Writing two files simultaneously can create noncontinuous space. -![image6](image6.png) -Because `EXT3` was designed to be used with HDDs, and separate portions of a file would slow down read speeds, `EXT3` implemented a preallocation/reservation system. -Inside the block bitmap, a few extra blocks were preallocated, storing both files in separate locations. -![image7](image7.png) -Instead of `EXT2`, where errors were corrected directly in the hard drive, `EXT3` reserves space for each specific `inode` in memory. In the event of a crash, all data would be stored in memory, and thus, not corrupting the HDD itself. - -##### Online Resizer - -`EXT3` also implements a protocol to support `LVM`, which allows for many disks to be used as a single partition. The largest possible space `EXT3` supports without patches is 16 GB. - -##### Partition Layout - -![EXT3](EXT3.png) - -#### EXT4 - -##### Larger FS - -`EXT3` can only support up to 16 TB. This is why `EXT4` was created. -Instead of ==32 bits== capacity to count blocks, `EXT4` divides each entry in the block descriptor table in two parts: An upper, and a lower entry. This lower entry extends the upper one, and since each supports up to ==32 bits==, the total supported block count (in the block descriptor table) rises to ==64 bits== (16 TB → 1,000,000,000 TB). - -##### Extents - -Instead of using block mapping (the filesystem allocates blocks individually for each file), which can lead to fragmentation, `EXT4` uses **extents**, a range of contiguous blocks, allocated to each file. -This uses a 48 bit system, which limits the FS capacity to 1 EB (1,000,000 TB). -Each extent can point to 128 MB of data, or 1 block group. - -##### Compatibility - -The `EXT4` driver supports `EXT3` as well, and so, the Linux kernel only uses the `EXT2` and `EXT4` drivers. The `EXT3` driver was removed as the new one is more performant. - -##### HTrees - -HTrees are now enabled by default, allowing up to 10 million subdirectories. However, `EXT4` implements a Three Level HTree, which can be enabled using the `large_dir` flag, and extends this limit to 2 Billion subdirectories. - -##### Fast FS Check - -The `big_itable_unused` field was added to the block descriptor table, allowing for fast filesystem checks and error correction, as well as some other improvements. - -##### Multiblock Allocation - -Previously, each block needed one call to be allocated. `EXT4` added support for multi-block allocation, which means that only one call is needed to allocate multiple blocks. - -##### Delayed Allocation - -Every write command is delayed for as long as possible, making it so that changes can be made in memory before they affect (and possible fragment) the actual drive. - -##### Persistent PreAllocaition - -The FS can now be called to preallocate an empty extent, so, once that file is populated, it stays as a contiguous space. - -##### Metadata Checksums - -Metadata is checked often, which helps find any issues with the file system, as each data structure is now properly 'documented'. - -##### Better Times - -- A creation time was added; -- The time precision was increased to nanoseconds instead of only seconds; -- The maximum supported time was increased as well (the standard UNIX time can only go up to 2038). - -##### Extended Attributes - -The filesystem can also be customized with new entries at the end of each `inode`. - -##### Quotas - -`EXT4` also supports adding limits to the size of a file, or even multiple files spread across the filesystem. - -##### Barriers - -Some hard drives have caches, which impact the journal, sometimes causing it to be written after the cache, which would create conflicts. To fix this issue, `EXT4` creates a 'barrier', preventing the disk from writing data before the journal is written to the drive. This feature impacts performance, but is also very needed. - -##### Flexible Block Groups - -Groups blocks together, isolating chucks to write data on, which helps make data more contiguous. - -##### Meta Block Groups - -If the whole filesystem was only a single block group, it would max out at 256 TB of total data. Using meta block groups, this limit is increased to 32 bits of block group descriptor, which makes the **total capacity of the filesystem** ==**512 PB**==. - -##### Partition Layout - -[https://maplecircuit.dev/linux/fs/ext/ext4.html](https://maplecircuit.dev/linux/fs/ext/ext4.html) - -### File Permissions - -TODO - -```sh -chown root:root $LFS -chmod 755 $LFS -``` - -### `/root` Directory Structure - -Root directories might vary slightly between distributions (and other UNIX systems), however, the 'base' is always the same. For example, a Debian root directory would be the following: - -``` -/ -├── bin -> /usr/bin -├── boot (Mount point for /boot partition) -│ ├── grub/grub2 (GRUB configuration and modules) -│ ├── efi (EFI System Partition - UEFI systems) -│ └── kernels (Kernel images - may be under grub) -├── dev -│ ├── pts (Pseudo-terminals) -│ ├── shm (Shared memory) -│ ├── null (Null device) -│ ├── zero (Zero device) -│ ├── random (Random number generator) -│ └── urandom (Non-blocking random number generator) -├── etc (Configuration files) -│ ├── network (Networking configuration) -│ ├── systemd (Systemd configuration) -│ ├── default (Default settings for programs) -│ ├── init.d (Legacy init scripts / systemd link) -│ ├── ssh (SSH server and client configuration) -│ ├── X11 (X Window System configuration) -│ ├── pam.d (PAM configuration) -│ └── security (Security-related configuration) -├── home (Home Directories) -├── lib -> /usr/lib -├── lib64 -> /usr/lib64 -├── media (Mount Point for Removable Media) -├── mnt (Temporary Mount Point) -├── opt (Optional Packages) -├── proc (Process Information - Virtual Filesystem) -│ ├── self (Symbolic link to the current process's directory) -│ ├── cpuinfo (CPU information) -│ ├── meminfo (Memory information) -│ ├── mounts (Mounted file systems) -│ ├── cmdline (Kernel command line) -│ ├── (Directories for each process, named by PID) -├── root (Root User's Home Directory) -├── run -│ ├── systemd (Systemd runtime data) -│ ├── user (User-specific runtime data) -│ └── lock (Lock files) -├── sbin -> /usr/sbin -├── srv (Service Data) -├── sys (System Information - Virtual Filesystem) -│ ├── devices (Device tree) -│ ├── firmware (Firmware information) -│ ├── power (Power management settings) -│ ├── kernel (Kernel parameters) -│ └── module (Kernel modules) -├── tmp (Temporary Files) -├── usr (User Programs and Data) -│ ├── bin (User binaries) -│ ├── sbin (Non-essential system administration commands) -│ ├── lib (Libraries for /usr/bin and /usr/sbin) -│ ├── include (Header files for C/C++ development) -│ ├── share (Architecture-independent data) -│ └── local (Locally installed software) -└── var (Variable Data) - ├── log (System log files) - ├── tmp (Temporary files that persist across reboots) - ├── lib (Variable data for installed programs) - ├── cache (Cached data for applications) - └── spool (Spool directories) -``` - ## Kernel -Linux is a kernel: the core of an operative system. OSes that use the Linux kernel are called Linux Distros (Distributions). -A Kernel does the following: -- Executes first when the computer boots up and has full access to the hardware. +Linux is a kernel: the core of an operative system. Operating systems that use the Linux kernel are called Linux Distros (Distributions). +A Kernel: +- Executes first when the computer finishes booting up and has full access to the hardware. - Implements drivers to control peripherals, network devices and other resources. -- Runs other programs (userland software) and allows them to communicate with each other and with the hardware. +- Runs other programs (userland software) and allows them to communicate with each other and with the hardware through system calls. ### Compiling @@ -399,7 +144,7 @@ make clean # Delete the object files created at compile time ### Syscalls -To "ask" the kernel to perform a hardware task, to access the file system or access other resources, a program executes a `syscall`. +To "ask" the kernel to perform a hardware task and to access the file system or another resource, a program executes a `syscall`. For example, in x64 assembly: @@ -418,12 +163,19 @@ A C program generally uses libraries, which then implement system calls to perfo ### Processes -TODO - How does the kernel execute programs? What are processes? -Executables can either be ELF files, or a script starting with `#!` (`script_format`). +A process is an instance of a running program: When a program is executed, the kernel assigns a **PID** (Process ID) to it, defines a **state** (wether it is running, stopped, etc), defines which process spawned the program, and assigns it **memory space** (or address space): Virtual memory, preventing the program from accessing the memory assigned to other processes. + +![[image5.png]] + +After creating the process, the kernel loads the program into memory and starts it. Once the program finishes or is terminated, the kernel reclaims its resources. + +When a program is compiled, it is turned into an executable, which is usually an ELF file. Scripts starting with `#!` (`script_format`) are also valid executables. #### Execute Programs -When executing a program, the kernel first parses the executable to detect whether it is a script or ELF executable, then, CPU registers are updated (the `instruction pointer` -> `ELF entry point`, etc). Finally, the program is executed, instruction by instruction, on the CPU. +To execute a program, the kernel first parses the executable to detect whether it is a script or ELF file, and then, CPU registers are updated (`instruction pointer` -> `ELF entry point`, etc). Finally, the program is executed, instruction by instruction, on the CPU. + +To run multiple processes concurrently, the kernel takes a "snapshot" of the CPU state (registers) of the current process, and loads the next process with its own state. This cycle is repeated to alternate between threads. Modern CPUs have multiple cores, which often have two threads each, and it's the kernel scheduler's job to manage these resources efficiently. ### Devices @@ -485,7 +237,7 @@ sudo apt install ../bash*.deb ## Programs -*Bash* includes a set of *builtins*: Command-line utilities that come within bash itself. However, these are very limited, and to actually make the computer useful, more programs are needed. +Bash includes a set of *builtins*: Command-line utilities that come within bash itself. However, these are very limited, and to actually make the computer useful, more programs are needed. > To learn more about a specific program, use: `man program_name`. @@ -516,20 +268,20 @@ sudo apt install ../bash*.deb | `unlink` | `uptime` | `users` | `vdir` | `wc` | | `who` | `whoami` | `yes` | | | -The most popular set of *coreutils* by far is [GNU's coreutils](https://www.gnu.org/software/coreutils/). For embedded systems, it's common to use [BusyBox](https://www.busybox.net/) instead. There is also an ongoing effort to port *GNU's coreutils* to Rust: [uutils coreutils](). +The most popular set of *coreutils* by far is [GNU's coreutils](https://www.gnu.org/software/coreutils/). For embedded systems, it's common to use [BusyBox](https://www.busybox.net/) instead, as it is much lighter on resources. There is also an ongoing effort to port *GNU's coreutils* to Rust: [uutils coreutils](). ### `util-linux` -*Util-Linux*, much like *coreutils*, is a collection of smaller programs. These are used mainly for maintenance, and interface with the kernel, filesystems, the clock, etc. +*Util-Linux*, much like *coreutils*, is a collection of smaller programs. These are used mainly for maintenance and interfacing with the kernel, filesystems, the clock, etc. -Unlike the *coreutils*, which are present in almost every system, distributions often pick which programs to ship from the `util-linux` package. For example, Debian doesn't ship `rename`, `hwclock`, and `cal` by default, among others. +Unlike the *coreutils*, which are present in almost every system, distributions often pick which programs to ship from the `util-linux` package. For example, Debian doesn't ship `rename`, `hwclock`, and `cal` by default, among some others. -| Path | Utility | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `bin/` | `dmesg` `kill` `lsblk` `more` `mountpoint` `su` `wdctlfindmnt` `login` `lsfd` `mount` `pipesz` `umount` | -| `sbin/` | `agetty` `cfdisk` `fsck.cramfs` `mkfs` `pivot_root` `swapon` `blkdiscard` `chcpu` `fsck.minix` `mkfs.bfs` `runuser` `switch_root` `blkid` `ctrlaltdel` `fsfreeze` `mkfs.cramfs` `sfdisk` `wipefs` `blkpr` `fdisk` `fstrim` `mkfs.minix` `sulogin` `zramctl` `blkzone` `findfs` `hwclock` `mkswap` `swaplabel` `blockdev` `fsck` `losetup` `nologin` `swapoff` | +| Path | Utility | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `bin/` | `dmesg` `kill` `lsblk` `more` `mountpoint` `su` `wdctlfindmnt` `login` `lsfd` `mount` `pipesz` `umount` | +| `sbin/` | `agetty` `cfdisk` `fsck.cramfs` `mkfs` `pivot_root` `swapon` `blkdiscard` `chcpu` `fsck.minix` `mkfs.bfs` `runuser` `switch_root` `blkid` `ctrlaltdel` `fsfreeze` `mkfs.cramfs` `sfdisk` `wipefs` `blkpr` `fdisk` `fstrim` `mkfs.minix` `sulogin` `zramctl` `blkzone` `findfs` `hwclock` `mkswap` `swaplabel` `blockdev` `fsck` `losetup` `nologin` `swapoff` | | `usr/bin/` | `bits` `column` `hardlink` `logger` `mcookie` `scriptreplay` `utmpdump` `cal` `coresched` `hexdump` `look` `mesg` `setarch` `uuidgen` `chfn` `eject` `ionice` `lsclocks` `namei` `setpgid` `uuidparse` `chmem` `enosys` `ipcmk` `lscpu` `nsenter` `setpriv` `waitpid` `choom` `exch` `ipcrm` `lsipc` `prlimit` `setsid` `wall` `chrt` `fadvise` `ipcs` `lsirq` `rename` `setterm` `whereis` `chsh` `fallocate` `irqtop` `lslocks` `renice` `taskset` `col` `fincore` `isosize` `lslogins` `rev` `uclampset` `colcrt` `flock` `last` `lsmem` `script` `ul` `colrm` `getopt` `lastlog2` `lsns` `scriptlive` `unshare` | -| `usr/sbin` | `addpart` `ldattach` `readprofile` `rfkill` `uuidd` `delpart` `partx` `resizepart` `rtcwake` | +| `usr/sbin` | `addpart` `ldattach` `readprofile` `rfkill` `uuidd` `delpart` `partx` `resizepart` `rtcwake` | ### Text Editor @@ -569,9 +321,9 @@ The `/bin/vi` path on Debian is a symlink to `vim.tiny`, which is a version of V #### Nano -Nano is a more friendly and simpler alternative to Vim. It is not nearly as efficient, but it's more approachable for new users who might not be willing to learn Vim's complex keyboard shortcuts. +Nano is a more friendly and simple alternative to Vim. It isn't nearly as efficient, but it's more approachable for new users who might not be willing to learn Vim's complex keyboard shortcuts. -Debian also provides a tiny version of Nano, `nano-tiny`, at only 139 kB. +Debian also provides a tiny version of Nano in its repositories, `nano-tiny`, at only 139 kB. ## Libraries @@ -579,7 +331,7 @@ Libraries are collections of reusable code that programs can access. On Linux sy ### Glibc -Glibc is the GNU's implementation of the C standard library, which is needed for almost all C programs. It provides wrappers for system calls, and bundles `ld-linux`, which is the dynamic linker/loader for ELF executables. +Glibc is the GNU's implementation of the C standard library, which is needed for almost all C programs. It provides wrappers for system calls and bundles `ld-linux`, which is the dynamic linker/loader for ELF executables. To see which dynamic libraries are linked to a binary, run: `ldd /path/to/executable`. @@ -610,25 +362,330 @@ Unit files are usually located under `/lib/systemd/system/` and `/etc/systemd/sy ## GRUB +GRUB allows the user to select which kernel to boot to, load kernel modules before the kernel starts, and is responsible for loading the initial RAM disk (initrd), and thus, starting the system. + +Once GRUB finishes, it is no longer loaded, and the kernel takes control of the system. + +To change GRUB configurations, edit `/etc/default/grub`, and then run `update-grub` to generate the configuration file that GRUB reads at boot time (`/boot/grub/grub.cfg`). + +## Disk & Data Storage + +The previous building blocks are all that is needed for the system to boot, however, those files must be loaded from somewhere: The disk. + +When the computer starts, the motherboard's firmware (BIOS or UEFI) initialize the hardware. It then performs a POST check to verify if every component is functioning correctly. Then, the firmware determines which disk (or another storage device) to boot from, and executes the bootloader (GRUB in our case). + +### Disk Partitions + +Except for the `/boot` and `/root` partitions, all partitions are optional and flexible. Any optional partitions can be added to the disk, however, these are the most common ones: + +| Partition | File System | Description | +| ------------ | --------------- | ------------------------------------------------------------------------------------------- | +| `/boot` | `ext2` | Store kernels and boot info. This should always be the first partition on the drive. | +| `/boot/efi` | `FAT-32` | Needed to boot with UEFI. | +| `/BIOS Boot` | | Only applies to GPT, and is usually a 1 MB partition for GRUB to install the bootloader on. | +| `/root` | `ext4` | Stores system files. | +| `/swap` | `swap` (header) | Use the disk as 'slower RAM', if the system RAM is full. | +| `/tmp` | `tmpfs`/`ext3` | Temporary file system. | +| `/home` | `ext4` | Stores user files. | + +#### Manage Partitions + +`fdisk` (from *util-linux*) is one of the most common programs to manage partitions. + +```sh +sudo fdisk /dev/sdX +``` + +Then, type `m` to read the manual. + +#### Format Partitions + +Use the `mkfs` command to format existing partitions. + +```sh +mkfs -v -t ext4 /dev/sdX +``` + +For initializing `swap`, use `mkswap /dev/sdX` instead. + +#### Mount Partitions + +A partition must be mounted for the host system to be able to access it. + +```sh +mkdir -p +mount /dev/sdX +``` + +> Use the `-t ` flag to specify the file system if `mount` fails to detect it automatically. + +### File Systems + +#### Concepts + +- An `inode` provides the following information: + - Pointer to the file + - Creation date / Modified times + - Permissions +- A `directory (table)` contains the data before the current directory, the directory itself, and every file inside that directory. +- A `block` is the standard data unit for data in a hard drive. (Same size as memory pages. Ex `x86` CPU would use `4 KB` as the block size.) + + +#### EXT2 + +Uses linked lists to store and lookup data, to keep the implementation of the filesystem itself as simple as possible. A simple filesystem makes it easier to repair (or skip) broken sectors on the hard drive. + +#### Partition Layout + +![EXT2](EXT2.png) + +#### EXT3 + +##### Journal + +`EXT3` implements a journal to act as a buffer after a crash. If any operation in the journal fails, because it was logged, the filesystem is able to recover and finish any pending operations quickly, and not lose data. `EXT2` had another issue, where if an opened directory were deleted, its `inode` wouldn't be deleted, leaving an orphaned, empty `inode` on the filesystem. If the program holding it was to be closed, the `inode` would be deleted, but in the event of a crash, the `inode` would be left in the filesystem, with no way to be freed. + +##### HTrees + +`EXT3` can also use a [index](notes/algorithms_and_data/index.md) instead of a linked list to store directory entries, making lookup times much faster. To build the HTree, all filenames are hashed and ordered, making the implementation more complex. This feature is disabled by default. + +##### Scalability + +Before, only one core could write to the *superblock* at a time, but `EXT3` updates `inode` and `block` count at the *block group descrip_t_or* level. The superblock is only updated through a system call: `statfs()`, or if the filesystem is unmounted. +`EXT3` also removed *big kernel locks* (deprecated feature that added the ability to freeze the kernel), and `sleep_on()`, which was replaced with `wait_event()`, preventing infinite loops. +These patches improved multicore performance by over 10x. + +##### Preallocation / Reservation + +Writing two files simultaneously can create noncontinuous space. + +![image6](image6.png) + +Because `EXT3` was designed to be used with HDDs, and separate portions of a file would slow down read speeds, `EXT3` implemented a preallocation/reservation system. +Inside the block bitmap, a few extra blocks were preallocated, storing both files in separate locations. + +![image7](image7.png) + +Instead of `EXT2`, where errors were corrected directly in the hard drive, `EXT3` reserves space for each specific `inode` in memory. In the event of a crash, all data would be stored in memory, and thus, not corrupting the HDD itself. + +##### Online Resizer + +`EXT3` also implements a protocol to support `LVM`, which allows for many disks to be used as a single partition. The largest possible space `EXT3` supports without patches is 16 GB. + +##### Partition Layout + +![EXT3](EXT3.png) + +#### EXT4 + +##### Larger FS + +`EXT3` can only support up to 16 TB. This is why `EXT4` was created. +Instead of ==32 bits== capacity to count blocks, `EXT4` divides each entry in the block descriptor table in two parts: An upper, and a lower entry. This lower entry extends the upper one, and since each supports up to ==32 bits==, the total supported block count (in the block descriptor table) rises to ==64 bits== (16 TB → 1,000,000,000 TB). + +##### Extents + +Instead of using block mapping (the filesystem allocates blocks individually for each file), which can lead to fragmentation, `EXT4` uses **extents**, a range of contiguous blocks, allocated to each file. +This uses a 48 bit system, which limits the FS capacity to 1 EB (1,000,000 TB). +Each extent can point to 128 MB of data, or 1 block group. + +##### Compatibility + +The `EXT4` driver supports `EXT3` as well, and so, the Linux kernel only uses the `EXT2` and `EXT4` drivers. The `EXT3` driver was removed as the new one is more performant. + +##### HTrees + +HTrees are now enabled by default, allowing up to 10 million subdirectories. However, `EXT4` implements a Three Level HTree, which can be enabled using the `large_dir` flag, and extends this limit to 2 Billion subdirectories. + +##### Fast FS Check + +The `big_itable_unused` field was added to the block descriptor table, allowing for fast filesystem checks and error correction, as well as some other improvements. + +##### Multiblock Allocation + +Previously, each block needed one call to be allocated. `EXT4` added support for multi-block allocation, which means that only one call is needed to allocate multiple blocks. + +##### Delayed Allocation + +Every write command is delayed for as long as possible, making it so that changes can be made in memory before they affect (and possible fragment) the actual drive. + +##### Persistent PreAllocaition + +The FS can now be called to preallocate an empty extent, so, once that file is populated, it stays as a contiguous space. + +##### Metadata Checksums + +Metadata is checked often, which helps find any issues with the file system, as each data structure is now properly 'documented'. + +##### Better Times + +- A creation time was added; +- The time precision was increased to nanoseconds instead of only seconds; +- The maximum supported time was increased as well (the standard UNIX time can only go up to 2038). + +##### Extended Attributes + +The filesystem can also be customized with new entries at the end of each `inode`. + +##### Quotas + +`EXT4` also supports adding limits to the size of a file, or even multiple files spread across the filesystem. + +##### Barriers + +Some hard drives have caches, which impact the journal, sometimes causing it to be written after the cache, which would create conflicts. To fix this issue, `EXT4` creates a 'barrier', preventing the disk from writing data before the journal is written to the drive. This feature impacts performance, but is also very needed. + +##### Flexible Block Groups + +Groups blocks together, isolating chucks to write data on, which helps make data more contiguous. + +##### Meta Block Groups + +If the whole filesystem was only a single block group, it would max out at 256 TB of total data. Using meta block groups, this limit is increased to 32 bits of block group descriptor, which makes the **total capacity of the filesystem** ==**512 PB**==. + +##### [Partition Layout](https://maplecircuit.dev/linux/fs/ext/ext4.html) + +#### exFAT + +#### Conclusion + +- `FAT-32`: Use for small USB/SD devices, if no file exceeds 4GB. This is the most compatible format, so it ca nbe used with very old systems and some embedded devices. +- `exFAT`: Use for external drives and large USB/SD devices, if compatibility with macOS and Window is needed. +- `EXT2`: Use for very simple filesystems, such as the `/boot` partition, where journaling is not needed. +- `EXT3`: Deprecated. The `ext3` module is handled by `ext4` on recent systems. +- `EXT4`: Use for system partitions, and for any SSD or large storage device under Linux. + +### File Permissions + +Both `EXT2` and `EXT4` support basic file permissions such as these, but `EXT4` adds some more advanced features. + +#### Permission Groups + +- **Owner**: Permissions for whoever owns the file. +- **Group**: Permissions for the group assigned to the file. +- **Others**: Permissions for everyone else. + +#### Permissions + +File permissions can be represented by characters or binary. + +- **Read**: `r--` `4` +- **Write**: `-w-` `2` +- **Execute**: `--x` `1` + +- **Read**, **Write** and **Execute**: `rwx` `7` +- **Read** and **Write**: `rw-` `6` +- **Read** and **Execute**: `r-x` `5` + +#### Manage Permissions + +##### Read Permissions + +```sh +ls -l +> drwxr-xr-x 2 trude trude 4096 Apr 5 18:56 Desktop +``` + +![[Pasted image 20250409112858.png]] + +In this example, the binary representation would be `755`. + +##### Modify Permissions + +```bash +# Change the owner +sudo chown owner filename + +# Change the owner and group +sudo chown owner:group filename + +# Change permissions +sudo chmod 774 filename +``` + +##### Common Permissions + +- `644`: File Baseline +- `755`: Directory Baseline +- `400`: Key Pair + +### `/root` Directory Structure + +Root directories might vary slightly between distributions (and other UNIX systems), however, the 'base' is always the same. For example, a Debian root directory would be the following: + +``` +/ +├── bin -> /usr/bin +├── boot (Mount point for /boot partition) +│ ├── grub/grub2 (GRUB configuration and modules) +│ ├── efi (EFI System Partition - UEFI systems) +│ └── kernels (Kernel images - may be under grub) +├── dev +│ ├── pts (Pseudo-terminals) +│ ├── shm (Shared memory) +│ ├── null (Null device) +│ ├── zero (Zero device) +│ ├── random (Random number generator) +│ └── urandom (Non-blocking random number generator) +├── etc (Configuration files) +│ ├── network (Networking configuration) +│ ├── systemd (Systemd configuration) +│ ├── default (Default settings for programs) +│ ├── init.d (Legacy init scripts / systemd link) +│ ├── ssh (SSH server and client configuration) +│ ├── X11 (X Window System configuration) +│ ├── pam.d (PAM configuration) +│ └── security (Security-related configuration) +├── home (Home Directories) +├── lib -> /usr/lib +├── lib64 -> /usr/lib64 +├── media (Mount Point for Removable Media) +├── mnt (Temporary Mount Point) +├── opt (Optional Packages) +├── proc (Process Information - Virtual Filesystem) +│ ├── self (Symbolic link to the current process's directory) +│ ├── cpuinfo (CPU information) +│ ├── meminfo (Memory information) +│ ├── mounts (Mounted file systems) +│ ├── cmdline (Kernel command line) +│ ├── (Directories for each process, named by PID) +├── root (Root User's Home Directory) +├── run +│ ├── systemd (Systemd runtime data) +│ ├── user (User-specific runtime data) +│ └── lock (Lock files) +├── sbin -> /usr/sbin +├── srv (Service Data) +├── sys (System Information - Virtual Filesystem) +│ ├── devices (Device tree) +│ ├── firmware (Firmware information) +│ ├── power (Power management settings) +│ ├── kernel (Kernel parameters) +│ └── module (Kernel modules) +├── tmp (Temporary Files) +├── usr (User Programs and Data) +│ ├── bin (User binaries) +│ ├── sbin (Non-essential system administration commands) +│ ├── lib (Libraries for /usr/bin and /usr/sbin) +│ ├── include (Header files for C/C++ development) +│ ├── share (Architecture-independent data) +│ └── local (Locally installed software) +└── var (Variable Data) + ├── log (System log files) + ├── tmp (Temporary files that persist across reboots) + ├── lib (Variable data for installed programs) + ├── cache (Cached data for applications) + └── spool (Spool directories) +``` + ## Networking -## Compilers +## Compilers??? ## Desktop +Environments + ### Wayland ### Window Managers - -### Desktop Environments - -## INC =------- - -## Processes - -TODO -A program is an executable containing machine code. When a computer executes a program, it is first loaded into memory. -![image5](image5.png) -A program loaded in memory is a process. - -> Note: For interpreted languages, the interpreter creates a process that executes code directly. diff --git a/content/posts/dotfiles.md b/content/posts/dotfiles.md index c91e9c1..36edf75 100644 --- a/content/posts/dotfiles.md +++ b/content/posts/dotfiles.md @@ -1,19 +1,22 @@ --- -# Post draft: false searchHidden: false -showToc: true # Table of Contents -author: "TrudeEH" +showToc: true +author: TrudeEH title: "Dotfiles: Configuration Files" date: 2024-05-30T17:35:03+01:00 -tags: ["linux", "macos", "github", "git"] -description: "How to I set up my dotfiles in a UNIX system." +tags: + - linux + - macos + - github + - git +description: How I set up my dotfiles in a UNIX system. cover: - image: "" # image path/url - alt: "" # alt text - caption: "" # display caption under cover - relative: false # when using page bundles set this to true - hidden: true # only hide on current single page + image: "" + alt: "" + caption: "" + relative: false + hidden: true --- ## What Are Dotfiles and why Should I Care?