From a4af653e569cb64f4575bb676d1e6c96f01182eb Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Thu, 31 Oct 2024 18:14:16 +0100 Subject: [PATCH] modified: app.py deleted: static/default_profile.png --- app.py | 23 ++++++++++++++--------- static/default_profile.png | Bin 17786 -> 0 bytes 2 files changed, 14 insertions(+), 9 deletions(-) delete mode 100644 static/default_profile.png diff --git a/app.py b/app.py index 54ff9ea..79933b8 100644 --- a/app.py +++ b/app.py @@ -114,12 +114,6 @@ def fetch_and_cache_profile_picture(user_id, avatar_url): local_image_path = os.path.join(PROFILE_IMAGE_DIR, f"{user_id}.png") - # Prüfen, ob das Bild bereits lokal gespeichert ist - if os.path.exists(local_image_path): - print(f"Profile picture for user {user_id} already exists locally.") - r.set(str(user_id), local_image_path) - return local_image_path - try: # Bild von der URL herunterladen und speichern response = requests.get(avatar_url, timeout=10) @@ -137,12 +131,23 @@ def fetch_and_cache_profile_picture(user_id, avatar_url): print(f"Error fetching profile picture for user {user_id}: {e}") return "/static/default_profile.png" - def get_profile_picture(user_id, avatar_url): - """Gibt den Pfad zum Profilbild eines Benutzers zurück, entweder aus Redis oder durch Abruf.""" + """Versucht, das Profilbild eines Benutzers aus Redis, lokalem Speicher und zuletzt durch Download zu holen.""" + # 1. Versuch: Redis cached_image = r.get(str(user_id)) if cached_image: - return cached_image.decode('utf-8') # Rückgabe des Pfads aus Redis + print(f"Redis cache hit for user {user_id}: {cached_image}") + return cached_image.decode('utf-8') + + # 2. Versuch: Lokaler Speicher + local_image_path = os.path.join(PROFILE_IMAGE_DIR, f"{user_id}.png") + if os.path.exists(local_image_path): + print(f"Local cache hit for user {user_id}") + r.set(str(user_id), local_image_path) # Cache das Bild in Redis + return local_image_path + + # 3. Download und Cache des Bilds + print(f"Downloading profile picture for user {user_id}") return fetch_and_cache_profile_picture(user_id, avatar_url) @app.context_processor diff --git a/static/default_profile.png b/static/default_profile.png deleted file mode 100644 index 2e8750094a52f7d3b811d84ae04378100dd32f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17786 zcmV)DK*7I>P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DMGr|tK~#8N?Y-HP z97mcb<`M33=22M}>OkQn34$P-H@n$QHrY43XV>WGc4S)oQt3VueWme@Gr+eu4xkpxI0R<4%4YEPA z`S2ksGSb73@BZ99BCUV+Uv}7SgHgPhrEiNuW0#4kAmU|Mg)-yc8&wp*AXT5Joqt{ao}Wq>b_2HX~4I0nBo z@MY<%O@R;_B1J@-h>xSFFH$jEdk#XQ4tJ+g+@%aCilMzLK>CqRnvaIoYDenp>%cDw zY-7O9%spcNO+>uEBi<3PElY60ZQEiz&t#tDMPAs2%^BwwPL$0QJ`yUIQ2KTu^c5V1 zt$;%fAbym+E^9Y1REz8J_XKyB2B@Nl<0#8>&g~!w$HvBjz_Ymxh0r=-w83ZqPPCmV zWnZ6^1+=1kN#HK*C=t=p!X8EaI2puA2Pc}!TDnW>o1SZm8`2X%mQ5hEEe|NHExg;{ zvl###{=xtz$oB(R2&GgU52Q?No`)fCjEAKYHN>TCU^DI7mKhW*(Z}rfXjOIvH)TL+ zJ~j16&p%gC%2Jt95@&_OEz6b`&$yFwH&Lu7iw$6=);Vt%td(WUQGBJa*E6*mRApFG zvgj$+4?+e87^`K#RDO5DXKTPHd?9S0EdRuFNc>GM_9cLAv!SEG&nTfs&+lN&vjgaO27hfvMkdaC z0^%p%W4cAk#DPSVZC&zJfD6JMecYruG~-mn{! zV((mid@`ulndh@0V2;abb!OYl^_bu+N5=}5rfl&d`^!H+)oQ8GpX&9|S6Cu2fI>{o zfRaEZL5XVS3c2wDu)s!?3Up$z z9f-=h9%_G+0h$L}A=z!g?H2vqWnTk^t~pIZvaEP=(yfKecUj=E5GYv4Szt5YVjg1- zXaM=orL9=SWsQ&>SeUR_nkOJG>d_G@4bUK68#!(R2)^fej?Gmr5%;EpBu}KwGL<7F zKyvaqdh#85^LqyiOt2J;LA{RXljS*c94-FaJ8P5@=`k;Ih&u4WV~2{OCuN)4B;Djr zAiQt}gy9f%GO=~Vw~#-R?;-a<%2%jL5C(1~5aSN7JHjR98*Q8T3K)v~7U24>>ACA0 zK3|}TGs&%@kg3J;O6Y*d#%eBW- z&;tx7HVH(^p(m6CeJ&EtW8rj|y`IZ8!D9#k`3UL2@HJn#6j4(Bi)=%1|ahG6v zbN2v9FKtU&MFwjyyJuX_!$HU-3$s8GwN8 zW&!nWgF--vqh%F)W+?2@^_ihw4=6}+J+T4io7nTjqep6iEksIzY`H!>2o0Q z0C~5vb7iO8iJ5BMdwBfuC-xt{XFSW-`hBF?y(~>e-S03GvGp(!o!;1`UDK0))$3+az$QEdhduEMtAxxEkbk%YcUW-=x@J_6>8lQEisEQ`I=FOcIjs1t?pk3-wmq=zh+CO$rM8u5 zjG*qWf>P<0ly3S7S3ed>#km?Iz7i~-+$lq!w=6@$IyU^lStT} zvB1Dm%&2Gh1kOSCp)eLjl7c<)_<^UsG5@Xa9eUu{-tjRNcmuoW%B<6{qjgly+IKsEHTr%6S z?J&(04C7EraWD)py(1x`%eM!&n+e|<6mz4@qX9%PAo0v(c=hVypuKVE@L`$f%gf6d zEB4IJ#0ah7G|^Qd@*I3hrzR$}CsWuc=v$Ab^w|KyX?mz4}Ss|j8g-0k*P z>*MN~Z{7EUA5DU`mLa3Aztv)Iz1Df<CamUM$ zB$Jwr?u+~_Vb=^WA_g!8%n`A2wNh!VuR9{O`G)VW{qTi{zxhn97E%HDyVD=DU;O;t z3m2nI)&qZTt=)!7Ointkm)vuB;vfC+$oK>sZ!kEJem{jnaD<>a8G@3g78!^VC`i8* zfbs~*%MT`s*^FhVzR|nk!MIT_GHgge3=c3eR6=Z1?BkEvPk;L1Cuh5ji6dDaG}rr% z7f3h&QkmZsekTTumO;8WKH)c8=PNu(G2fadt%xUO7ffA`D9ciz3WzTu2d9$;1_$?{E7{4T&B zdSd4=^k$VC#}B|?a|&u8P*E~cdAnXqo_KuW`RD61)65mjvst_`;K)@GCvrAD!;U>T z-Ix^1YaiTu|JV;+cMY4$<~MK zfO?`!6H@Gmj^P9!^$q4*E4COyQl0M6eme4=7Og^S9NwXk%DXN@@H9Om_U>&gUS5N* z4#SD{cF*R5!aq_M-5H7kZY>r&!|pTyMz&y?pb*SfS>bR8h86AFEDdXHW$ENI-#qxj z4;L2pl9tzfmM6-EX@q$9w|}DL`ciKpk^C9ZL-;m`TbAv>t$)d^n3h48Zlx>gj73D4RnMz^>IM zd+`_f-~VdS=94f%D4=r!lru9BINv#8yakw1-4=jqg`MZDTR45o&Xme+8@AeWga@6y za_Q6~kM4c;nT37(Xyt^nq#tM8MZitQ0DL1K=uvwWpVd6(S#(5ibJ$ugsN+g-D-d>- z7hzsF&~RP|PKz$I3P78J2ybc|0b25baE>S?io&JiaEw|Z07&QpGZTjsn%Fj^hXjM} zB=)5q0l^R^IZNS_Se}waedp~D^28M!b`lZS$XpP49Uu~%U62&8yV4LDioggk5|Bk% zMV2HRQm#Mx_`)}zKeYcKP2ZZi8}6<)_<& zU6!_78?kWWXQ>bZ23jRqE0LG??q}cm!GU}3W0g7$jwZ+;_qUYR-xAD28Mg)_gES4N zt&Noy_6S;#30M_U44Ml9Y7V2PgryD*5h|b;)9}^eMfS=oAM|3yT|q4vaoHjum}eAX zcjB@;20)B$8#$2!1T&7(#z`C_c!ztX3tv2Fs%{E$ zd2Up}pyuUmK$@{UX2M}_{${DQkzc*GQE60ld}MS81T?AuL_@lj-N5b`06=6&Yp1qL zOD8H1D)xOxr@!<4iJ(f9hObJB1o5Nmc%JXT$!W7&LRrOafYF}vHn>SbZQJ$Pkcb9H zfTZ#>MzmQS5Qcvf%dfWsDFIxN%Z?uhUhsmwlKHmh_TxTjP-($5Y%zOxuxkdu_v#pp z!>I~kxnALiEU2Id8jWHWh+#CDN}>DW0j&=SL^K*os}Wd2Q|7Y(8FGbfbRqs1n@uTI z1(|S~XH=Pja+{h_j~VGu+jaxD(TQz( z-5bM(>+rV(YNI^81rV(fkeC(6?N~B^2nR>1k$Sx&;Cd9X)92Ww#dX)4%JWc&YAg|; z!43>rTLK2PYw81TmjNSP)VF8~CUC*c=)$??$rEeFSrKTPPX+`hRO~kTWLUE8c_U30 zU5TY^AXQ17C_9XEDZyW^qf?w9Yo?;+TLL5R6apI|9kwzAJ#qBe-OD6<^NqI$ahBzr zf?7+YGK2jxIfSm+bm=qdxf$Fv6W$gK80welqS#zKL5S{oVbr%SoV)7r=|cx-Cz=q9 zcJ^d>p>pmZ7^gdLK-8$mprA%58(9|ZfFp6F=Yi6u{bV}nxhyB<7;9jlZ72A7H2Z0RZsm40;<{S9vN1QRPWKEItWmK zM5dBYoI16n?7Fl9BqtpC14<#iFYl#3>+sBsONW8C4L4=LPB2=pUf!Z!LlcqLIBDGT zoUy4XtKuQEm4Qc3T4YI#l)b!T8&E32g-wJIJWcy>Exv%M0LHDaM3iP{)Zw84^i!TPhhPQIy1b z`3OJ1d^J(2xk|l;jw40ZRFRN1^oB@uJz`)ojx*4qU#-?1$0cTPklW=Vv>gv8 zNooxSDosIcw$X{hs<61#k9#Ny5|a=kL=iOEhwCuu-9ZQZ_E3RfaYDSIPQp$gogx8; zsM;<>n4=vI>VtO{Rc*67C0QAWr z*r`f0E0unx>@2rnd<|t+o9xubS5jJ#f)8YaG`GlFfod2n*=QibUkNN&%?V&=&V16m zwiFHe0sI8Y*oX-zr4>@TaUMa@m<8>F+z6sK2|o$5?%Os7;4~UAmoqzgV(P-0^d&2A6K*;gw-b=y!{zC7<9~D{K+kaH6(=q7t6t^WfA*h0 zcl4;>Rt$SgQ!>CI3_A*-*>?Pab;kGfESR3;V8R|GES0R&VHeLwC*D8ZYIR#pL?BGK z>33du`pKsjsy>TyA}Glp4zK|jHDLjZ;#us(M=L-7>(?)xj~#om7EILZ^3i?@IE>yv9uKIr?FH5n&CoH#QxhoND# zZ+1Y@At6r8d5oil6KKQYMfU!?ODdgBqVe^XwY(gkIPvM3kDI4XwcmelC9F*QJ{zmR zM$rmBJ%Gk?9V%&mtzomD&n$%`KqNy~ zm0KviRH?W6OpK2=8q@urym)RU@TP4mbnOuB#BtAcbJqh#lCAAKF!sQM2kw6mu7_5h z5l-vfrC>!lxGfE!2nXFuY(MBkqPfBTvxr3z=CF zVx27a^NbyTBm2eAKm72+E0&n&{{FleOHwC}1%x_|VJ>)*!nxMc*jj7$;@FnCuVhW; zwW1hPc|)n1QWd4@tyZzRl0^eQ2WiaOoCU#XorbNS-pQmr;K zH|OYWzpzPA0z?btphh)-$;9^DB0i59~kMi~BSoin}Nba1oOek#U2L z?($r5)JKL=4<8N--6vyeeD~2lAJnX z7a@jGcA!ikwonyP$^;UGa0W)>m%qNaxa@b-o|sScGlYEt{hC8exNlAt3!-TkL<`=B$TVrG01dd{^PzQhd z=kI;GNG>GHXc3=CQ6QEg)MO!~?jzbPGDifU{aBSfbksjM@3mLY;Ty$VgnP2!K-e;J zc@!528|eaS)G-1XH=QePN+AICZee-tb^*0O40O(2Is*V5!;s&1--7FsQbT~q@Nczv zJ#gFcd6*?65HJ0@*Ib8RtvTVINP?H(C^e%E*XHg)@S7$8NW@T}a8==Jbd3an78-qh z)K};UKbCPNIXyv;>0NLV-#S&s8>=lDh6``JcD~s}cU;%5YCC=-Xewz@!&#c9g&C%TKTTmwh<^`87h`Nv2>Ze^3r?#9xQ~aR>ravtfi`fJ9#o<3?b>qPN=^H zfO*8fZId&@X#*TJf_d+}bMBLmBMe6ObVmjN%7D#)!`Z`+jdR}S_L^g_xxDE+>wd5v zR(qA|pi)f*kMpeOLUCzNOm0G}k?7-k7@^~Bf*C*whP}jq@yX!O;X0_Frh4l~2|G~{ zP>5cSeD6!Yz7$8H%|qk_j^itYI3)80uq>&;XzOhPnG-{OI%=jE(vzQbB~pf5H72II zy)1BMU-}OxHd+))-K3|adPvp`1s&n^`fO~R9Xe8X>=nme64o`&u5fjQWtWQVqRKAY zyr1QL1jI_Edj1@i;QFzQ!mgaK0aO4Un0-t*MMel0*`1n*fAj|nNR$FvD5LM720G@Z zT!@H5g|%(M2|R(t*OuA;^MAcls~*m>0GSuUH#js+YF(rtvYC45J40CG%eL|f09_b@ zKBv_Znx8>oTo_6pS$4P|nHM#PYc~qL(078XpI)07pFgmllIN}6E+Ybqgi;6x6~=Mo z`yO(Yu+A3tEj;t=k;fi6eDuD(M-K0C>_I)0yy)b4R2`daZgj#B{-5*@UOvwevx)*) zBKnR|(csOXsF~d|fT*Mypsf&P#qha_ZEt+_srjQv$Aq>&Bzc+`dTmnQW=5n3M*j;N z;mt38zPh&TuC6M_t$|wIUccHHkKq%`(z*ssdi_Z=fI5Ibw`2g(5yj9q+99W}Ar;0g z4#q6Av{o5wZ*;0*y-0-XxN+K>pJ_}@YBO(O$N=Ql+Lxln41odX&Y+J9EyS;gamMRx zeva>7@E(3>=BX$4e(U+e-~axh#Vg+0I!q8~E^?U*;bvLJk-C#rD656^>A!Rw9mzH* z3!&fC^%BU-)0Og}Dh*o4t^C+S`;6t$n>b4tTIWskstapaSz_=0=3JiER30J_vboD0 z*a!NS7W_)H)RJX@1JiGMQz$;|Q5D*MYlh`z~@0RU2czr#!?R9_c+tMwhaC?r}ZeO42?h zr)6a}O8-(=GJwWw#2i(Cid&oj>FEUKMHIPUsl#GX3?|1=jzoo&%s@#& z!!xI#c$}UWm6kx)UVU?|-FI8PY;1BSO2C3*dU~qeULP`v*7S9+QG;%go))5qiu5ye zx?;pg6dD5gx_l%yt|v2bGxZJFer<+j~gFvaU!wQ=xp|z|>d>d4ahH z*|hZNX6%C72nX;1#gU*`0wFUltaaG0UOk_QJ$5B*CvDr~81;H*!>@Q=;37fG^9269 zS`A&tw{tENZs!#tL#wFT3?VskAEJKF2B})lijF0i>xT-JOHmDiEVA;*wepHZ4?&`{ zW|-w*9p6imB)3&384RpgirU4c^cSzLBM`N?m0AVlgG{vsB%SECZ6WouD!!kk7?h)s zw~;`=BhXZaQs75Q@dH9y{LgymH@R-crGzDMXvqkHDHMSKpJ*4i#?hxQw*jtic3M9? z4vx`^RT?K7GH-L<_e9^d+Pqk+x}CiQX@qA6z%nsR4Sfi?BXSs zv8rStB#s{QrQBNEYo?m5RmZXG^(qG4Tv<(%s8$VTX9C*kPYMCwwK*Y((c4}qG6i}@ z7@Y?rmK1}oss@$NhaE=q)aTKcr|7XzXJDsHiXbgFFT$(K@p{6R2jD9iOzMj64~0-P ztHsMUp_QNsO+OfwGC(DDG)UWrd?X<#M$h%3rzF1G;+Vpl*40!u6p9-_TZ^(BkshIr zWeqIRA8Qn@-^sFzozBT>V}0RZe)Pfc=&=SW(xfl%Cx9i@dO)C0e9wiE?|0a{Z(r2* ztpp5plP+V8n&&yt-*&r&3u!c1UA=bs(vofWndn<~Pe0_P%`03HZO-5xvN|TBehkqK zVBF(WSkmEr!PfcnY`kFpFh-=_P?O}sRn#Bg??j_otGbnnRS8%SB8clUyRYoHuptc)V2;R@!KUR| zqc$d(-(Ky&kWJLRLiSm);dtv@KvVTA2|zfS0uj_bnEGMgOzZT~$~M|d_uO-MVuJZT zibKy(I~)^;Xv*TmAYhC7!|vl7n$L!$L%)x|b#)LUfloa~HS@y;oR|{)GGEWN??m<`R1d_vr3sNZ+C&{|ZTfOe(Fzox` zzya^$44$+~aZB9zZ;DnI$<2 zdrt1T$*~8fUijfdKmL#QKKtz4%a_{Ula>-(;zxo z1Px`Y0MMUR+w0kt%gi&6LX|nhDB>cB2;WLa^q!EUl)j+vNY;pMj$_fEb>a`8MM{0+rA!I7gdK;?~4gSLS4?q4Go2;;S&}!6GuUqV!XJ30_{42)}LfC~Z zm6WiK2+Lq${J>4p?!=_`?6Zd-d6f10^kyNIQCBA>+4J9=eC**vS<=69>C>AG7{QRO zl=JDOR$%D1185#-(Bq;f^oOAe6r46Dktf3-9g8NX5s1><$0(z(Yn(pbq(98g(n5$p z2rtW%-k=p$ok6rwtJ3-uQa)RGTvfTMF$GIP0XVf&Dpv{UBVmEeWvmzVVBvcayKr7b zgDgj|2SJ2>Xr$!>i#m%zBK)aVi@giZ(PK2J7t=OC-;#c#W`TK)8oT%49D-n=ZS}y= z!1ub{9?Y*LRL;`FM@Sr}CW)6eY%|Yb9``P=g9jV+8jK}v=Gh!G+9V{PE`WX~KRhRC z5IV{PkOt#~5@U@<7j#5iAX7;S79kFh7Lq~AtjWd;Hg|CEM!$_-Q3X&qz1BlH1~te> zP=BOmc7$OXj22On*0A776MX?+kSjupi?qW-q=oJpVZRPYCbWG-LWd*nS#S2yC5#xt zawEW5Fe{my3??UikWWuq!EVxc<48$FnE^X?4Co5Bw)AIElotN^oHdwY*;kw9%ok(-f4V zhnXC~u3Wi->#hqYem$TP;tDOi82d~AO?IZ=O*ybdO35lr1mz`C2y!qOKe8^Rio8hc z6CphrEMjF1dIQ34+JVa+BrK>xJhQw=w7hG<2Ya^w(Ld#@X__N|(N^0Til9ljwh(qd z%VZQG;&g=52>dbOcnH--)OdaD35bm_S3o_dI5JuCRwKsK2air zC_R&Mz0)3_7;`*#Fc@6DdKCkjsQ4)FguWAot~=)Ves{n&dNdV+!ia2)y}oXm9ufv4 zl4k`pKy$_{vX7>_fbtxaMJR0ZAkM5_!XmwKk2WzXcJUmv9ErJ=r*=*)QL?XdI!(+Q z;1&$nynz_tdkxzPX|C+%%p@?`<0k6jFhu4ANy_T#Y8*pC@mY^;J8D{sT#2P-vfN}4 zXQ)G5K%{vqk=>Z)^4|Smv2c7nV^h=`l|8f5&Gk0u$!)LQiCayUGPc%?qog2_ENFq# z_SmbhF9~nVc7jpUXV^eMJA-JBqu)!Hm#EvcLJ0;C54OOlBjxS3-RsBQs6fmEK7#LW z|Azh5&)Wav|8Vjz{_Ks1c2MyPsT3gLtez|jD5veY7e0QTOUC+e`-anDP`@uQSuX86zSq6!Y zlR=inS(;By%pt)2^{=j7y2SQRPQ)pP#X|ypb%}lWK6~%|MaHUAlk<`uP|`#n_5szx z`q5@n3rQ2t;dJl~eTkFn>0|6I5-#8O7ccaF{);Pr`llcL(I36^XMcA5wU<8q_*Ccg z>D7&vw5=+)=t+NFJs7aHS7ijK^3P-dO2B6l1JV=$%qB5!0i}H~?ic5}9|QyB)V4s> zsAF-8rbm$s3++bs9DAbO7H=KD@ZLMo@(MjBS#Nl2O?Ldv`1Lm~T)7-2sl!D81Dwhz zN%~_$@?X0u6jxWCb*4lZb!xn9zYi_V>SJ~;0+wC@AZ)Ke>)P{r_y&6S~(nY>w z3;2>WfwXQ1bkBfZC!kvj_WEnhzxmmRfAcpV9RJPbm1W*)A`Pr@Yhusjz0=bNAx2RO zO#%flG@}8dfa`{iH=l}td>9H+cuDUN%MfWibZqZ^2ld16^aYjD95z}8LxW;OeKP^e zZA8{+9-#uX%d539((In4;A`xd5q?Wo)7Oij+laen5^rH@Xn_M-5uH?O?> z(#5xa^XWTpFD}eK)alBx`dFrDqnMG1P00WuLRt>WRIzsK*zAFWLI+?df&PPz#$Dio znTUX-*zdgE`S4`3-4TH|CsiYfJGk{Y^N=tfmFYYbW|gR~?=xmuE0!^Fpw7+= z&?Q`$+9c5%VP&u18f%2}vty4Q#RZTVbVmb~CK@A?%r41{rPN$5q@xgVLH^IGlSfEH4}vZF6RYH|W_b*W|?ugO%kX&uK4E zk_d=DZlcuQx+vUQQdgYm7Es`+02e(=@hp3yTCczk;VZd`4g5L-_x-VT2)kKLgO@85a^dpyc znjyt4vJ8Z`a$*?m%z=e9w$&)DBtB8dr$220yk2>>9cU^jjdGd5y!c+#VNFs00uXeiCWH9MD2V7@g8v9Wnv5kbcK(IZv8{=zSxD0IN>?&p6`@ts)aKh4P3*MIb5L-huaL-& zeAJ+)GyufqvG>&_5l4LSRq8VVEjMZ(s#_bAW;SpIVXQkK$ z8iTmdap0$GzTXJLhVM;Vb_jt0ISS^Cjg9R;urM)EYj@VrHM(U4NQtO*NIG04gcRp= zxx|uKbPMOSmAK+spDw~$@+_rQB%yN}3Xp)h7;Z2)tVBb}p5ZqDU4HoC=0M4;1qbD+ zocB8HfBEC{fAVk7{`7Cwe)Vd6=?d%gXaIT6(ijShx?OUx)T~~f#FtQHJ)uNB*&G

6~8eDHZY~L<)l#7Lsy~ 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 Rihck9002ovPDHLkV1hG^K9~Ri