From 31c259927615bc19d7c1016573360d71835991fd Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Thu, 13 Jan 2022 10:56:05 +0100 Subject: [PATCH 01/35] Handle BadPaddingException if the key in the Keystore got invalidated Recover from BadPaddingException which can be thrown on some devices if the key in the keystore is invalidated e.g. due to a fingerprint added because of an upstream error in Android, fixes #400 --- .../util/BiometricAuthentication.kt | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/util/BiometricAuthentication.kt b/presentation/src/main/java/org/cryptomator/presentation/util/BiometricAuthentication.kt index 2782c83f4..15485ff01 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/util/BiometricAuthentication.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/util/BiometricAuthentication.kt @@ -1,9 +1,7 @@ package org.cryptomator.presentation.util import android.content.Context -import android.os.Build import android.security.keystore.KeyPermanentlyInvalidatedException -import androidx.annotation.RequiresApi import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment @@ -12,8 +10,9 @@ import org.cryptomator.presentation.R import org.cryptomator.presentation.model.VaultModel import org.cryptomator.util.crypto.BiometricAuthCryptor import org.cryptomator.util.crypto.UnrecoverableStorageKeyException -import java.util.concurrent.Executor import timber.log.Timber +import java.util.concurrent.Executor +import javax.crypto.BadPaddingException class BiometricAuthentication(val callback: Callback, val context: Context, val cryptoMode: CryptoMode, private val useConfirmationInFaceUnlockAuth: Boolean) { @@ -72,20 +71,28 @@ class BiometricAuthentication(val callback: Callback, val context: Context, val val cipher = result.cryptoObject?.cipher - val transformedPassword = if (cryptoMode == CryptoMode.ENCRYPT) { - biometricAuthCryptor.encrypt(cipher, vaultModel.password) - } else { - biometricAuthCryptor.decrypt(cipher, vaultModel.password) + try { + val transformedPassword = if (cryptoMode == CryptoMode.ENCRYPT) { + biometricAuthCryptor.encrypt(cipher, vaultModel.password) + } else { + biometricAuthCryptor.decrypt(cipher, vaultModel.password) + } + + val vaultModelPasswordAware = VaultModel( + Vault // + .aCopyOf(vaultModel.toVault()) // + .withSavedPassword(transformedPassword) // + .build() + ) + + callback.onBiometricAuthenticated(vaultModelPasswordAware) + } catch (e: BadPaddingException) { + Timber.tag("BiometricAuthentication").i( + e, + "Recover from BadPaddingException which can be thrown on some devices if the key in the keystore is invalidated e.g. due to a fingerprint added because of an upstream error in Android, see #400 for more info" + ) + callback.onBiometricKeyInvalidated(vaultModel) } - - val vaultModelPasswordAware = VaultModel( - Vault // - .aCopyOf(vaultModel.toVault()) // - .withSavedPassword(transformedPassword) // - .build() - ) - - callback.onBiometricAuthenticated(vaultModelPasswordAware) } override fun onAuthenticationFailed() { From 40d8ff7d1753879ecfd32743813887e5f07f56ce Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Thu, 13 Jan 2022 17:43:15 +0100 Subject: [PATCH 02/35] Update dependencies --- build.gradle | 4 ++-- buildsystem/dependencies.gradle | 12 ++++++------ lib/google-http-client-1.40.1.jar | Bin 283686 -> 0 bytes lib/google-http-client-1.41.1.jar | Bin 0 -> 286011 bytes lib/google-http-client-android-1.40.1.jar | Bin 17016 -> 0 bytes lib/google-http-client-android-1.41.1.jar | Bin 0 -> 17112 bytes lib/msa-auth-for-android | 2 +- lib/pcloud-sdk-java | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 lib/google-http-client-1.40.1.jar create mode 100644 lib/google-http-client-1.41.1.jar delete mode 100644 lib/google-http-client-android-1.40.1.jar create mode 100644 lib/google-http-client-android-1.41.1.jar diff --git a/build.gradle b/build.gradle index 05a3cc127..386f17da1 100644 --- a/build.gradle +++ b/build.gradle @@ -2,13 +2,13 @@ apply from: 'buildsystem/dependencies.gradle' apply plugin: "com.vanniktech.android.junit.jacoco" buildscript { - ext.kotlin_version = '1.6.0' + ext.kotlin_version = '1.6.10' repositories { mavenCentral() google() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'com.android.tools.build:gradle:7.0.4' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 3375dcb97..a2915e488 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -29,7 +29,7 @@ ext { rxAndroidVersion = '2.1.1' rxBindingVersion = '2.2.0' - daggerVersion = '2.40.2' + daggerVersion = '2.40.5' gsonVersion = '2.8.9' @@ -52,20 +52,20 @@ ext { // cloud provider libs cryptolibVersion = '2.0.2' - dropboxVersion = '5.0.0' + dropboxVersion = '5.1.1' googleApiServicesVersion = 'v3-rev20210919-1.32.1' googlePlayServicesVersion = '19.2.0' - googleClientVersion = '1.32.1' // keep in sync with https://github.com/SailReal/google-http-java-client + googleClientVersion = '1.33.0' // keep in sync with https://github.com/SailReal/google-http-java-client /* update using https://github.com/SailReal/google-http-java-client with `mvn clean install`, copying `google-http-client-*.jar` and `google-http-client-android-*.jar` into the lib folder of this project */ - trackingFreeGoogleCLientVersion = '1.40.1' + trackingFreeGoogleCLientVersion = '1.41.1' msgraphVersion = '2.10.0' - minIoVersion = '8.3.3' + minIoVersion = '8.3.5' staxVersion = '1.2.0' // needed for minIO commonsCodecVersion = '1.15' @@ -76,7 +76,7 @@ ext { jUnitVersion = '5.8.2' assertJVersion = '1.7.1' - mockitoVersion = '4.1.0' + mockitoVersion = '4.2.0' mockitoKotlinVersion = '4.0.0' hamcrestVersion = '1.3' dexmakerVersion = '1.0' diff --git a/lib/google-http-client-1.40.1.jar b/lib/google-http-client-1.40.1.jar deleted file mode 100644 index 175ee6fcfa4ea297653e9665d13c37fcdc8b5c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283686 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%0AKxybm(B+ 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
@W5U=-@B?nw4c<5i8RXgt%O8)6-}}v*tll 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

%=AE>1K$P<3mLzxlWH0k@BI=?k?j(H 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

U)@)V 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%0D@t&dtc~K5@D$2^e}o7@Fni3 zC{o9$1v0>wN$LlDg78IKqZ39H23Bs*CK97-ciYbdGi*wBV73$rk41BirXdAvBlj{M ztR{Y0>EHVJ;=BjtKz4=F#@QT*ERp~=LS0!PM!nv(5*|D_D&jpSK;^onhUC5k<`(#s zJfvjU@+gFGs1JN0B=h3dBxtxN#NOK(011ULEk`U&$OeD=4!syUdj^%ylsl%9$#yZi>fH@WJ)+pL8Dw?DqBE*=NIR3PjF-eNl-O( zY9e?u3v%F2wN&NCV|Dvw@4dDmar(r$vcV1>5%q-G!lk5V1 z#y(G|t1X*|YW1C@Q#@EsKz@Zk^8V#LZ6H3nQSFPs#G7iJS$Qj2N>>@EQFEGq@1SaW z+T`De_!ioj;Lcfm)-`zYdJ~sYfbCFWRn@lgqw#6U2&5UJKG^EVOkXTB0W{OBbF3?{yc3 zSAN#d05Yh)DXm&vd1=?Is<>n#cv_02Ymc?*QDdDWeJtw{-=%uaHEqQrS?z>C=*vrc z90edO&icPG!9k$z4!XW<+&Jiz&Y0RgD^p{a{&pz zAIVP#$bzp0mT5(sA<$)2OdQ$_rHM~}1C`K?&YoGWE_bv&xlNTmv=zAl_oP#TEe85x zI*+i?aTn0zYp;5Y%f>lU1F9hjH4#CVlV&b2Wc1>RyLsVkpoN*juTDje2#XcU)B zilLmP0?(9TV=g^#JbZN~IPpGM6e#K?*C*5|h_q>I|>?# z7W|w3d^Ct}_Usf}!WB4k!=)F&POT4VlKu~t1y2NCF?X1d<$#=?W6)v= z+l5G`db#&^cUcu0ViTL=28sanLcEDux4Ix~l zbw1aPsV?CiQo?s{K{uR#pl)Xnw(!SU&Lg}Spx&!F0X{n7?BC`!?rKFtE`QIHnx=Z|TeLTFclhHw>h$BH-L4lQee7I&G5*AE{Kv zNI;q-+H)F%@f8w9SyXVz{=YYKvjdI7fpD-@C0KX6jspwzyo`d5hoy9aQc*CEAS=>txkf@($h^(h^BLA$K7W0huFT4CuI z2N@cuKWcSxx_8K@z*-z(;QF!CzPl#UZ4K^{+3e`?`FHW^_ko{2trEHKet9IigvlCG z!xCBSuT2QhMOt|Qm}LO$%`Rg}hELBfmxx~Jc^bhWP;{{3WSQ^#r<&@syNA6OI=6?Z zILCe2br>y>y&QfC5`RjT)WHmV=Rs% zKFs;}vA}(S{4=9R7h*nN4*BcXKE}T*GWhSI!~ZOpR0DHWTtfOw!!VYS*7*mX-*#0} z4v!*E$dcp|udgtHR}2(*GdN9zo;D4|WSg+H(H}WNy{uUlPOxgJ*a?K`w_I6x>tgu2 zl!b-G%hEMR`rnr>mIN@uIZ4A*@ zJUxdiYuQAZBKbwz3emzZ=L-vE=s7CBK2i59mkCW97!*01@kd|)q&@V{)zkZ7aV?|wwTsPeW6%0_1!VWvtqG*z3 z9o}p8Z7`LxYY^m+3PM5na}SUgTXhwlx}7%^Iq|0$MJ-(zU~V~Fm;gDtSvh;t;J1`K z9hw5@VmTVgZz+sFrLTw7VG5=D2C3w+2q~<7vgR+-`RW!$3`&_qMD}EQHmk_-%^B7C zphE!LMN3Q(DsLIo)#}@`vRX@u9i4moOB5Cv!Q0ihEVlvy&GAt{91_3~bAJh2~^S z!3Z$RSnd47ST%+)GX+Q*(}|P6q*9!0Bi@7pTBm{>#*{RwHNnLrWlC?wjN8U4A5KN7 zh&@iqQfcBI-s36?__zcyQINqS#rg?7jtYm!lXJrZz7jsw8<$KO4jQI|%*)d=O`}|E zAy3FkmE=NX>>G8=da$jKY|+|_x_Vpl+wodeYx4UbqhG}`lLsgiJ;kq$BzcZ5mOsE$cn1M_Bi8j_Vwm-Nvl16s>#YGkG%%4Q7*B@a8(Z;7c4*GP}v-MI?I z+LV#3LO~;si>aU};rtfjH$g9u&IpJL^2r??X(`gksK&^= zaQP?5KxTKrM?2vJH2w1M@n!-(`v(8e`@?Znlbz~Q5)qlFsMvs;W6_t4dubN$+iUWn zGy?69;UcnjnYJcUcfFeVHOz#gI0r>F_m^T*^=L+%1@TQl2Ei?01?{nhME1Mp7YM|l zsf+e00g@WT^#@S3s`oLGb4OGG2n`HAgByErp@U0Mjn-c3W*~32vM#5avM>nP&7~)} z^*F;KGk4sw(L0$n^|Y6%$M3R>m0lQ0S2x(-pD1mTLRGAuWct&9PNIh~P${_AVzEpJ zd_>@wDmrXokvoq&apl==YO6c%Goe471G- zA2#wz&Fwy7$h}h;x4(w>UdB-{Ed+4fDVcS406}{P%A$+UDMWU|S?>hYYsn9W7$zj9(EDJGO6F~gX^?d~7*h2;YCf=w*s0Md~ z?a#CZ4eVcxs%fFZQmcIW4z@y+O%z4&UF6WCuy#Wm@WP@u;q7;<&}6RsLkX_py7#%i z?uDDk$(iIXEWZA(51VfnB;TuYc-;ae+-u%vxT^OtkY^9UVY3aCj+h#Hf=`l_fBc%= zPhhFuHI2tCbD%+%aHO>5l9zLGAPLpIKx{tJp0mQdj5jPOeMO?&4Ij1LAaZRjg%uqezia7VkM ziFw3_UK`Vuc6L#}UM)fa@CAT0wVa90wLC~fWe8)#Tb3dsEJu}t-6;qR(#h-!7Fxt3 zE9@|R{u_o_X57R6LtuL#qIwsh#=0wL~E#L~F{ z4%E65#xYe<{?_~6n36Snk+Z3&)C-jlO;Hs|FT{u?vyrWh&5;R$5TN+;t0&D>Kc za;P#j?snzgGKOb7{xE1_bZ=<*D8~7$M7c=C6hYt7cy?FzZp7>_5-n>4E6pYT2PNZM3BCkAO0dL&P~j%w1E zeQ00qC#e8Q_bnjnF5cV{5KQspptvda%%UWe;qno;)NbKItbcH4_z=NJ!oq zt!=GwFP$sHcr>umtCiPcgg0PFi)<%NliZ~thp3ow`c7@#9&1ss=#pnzk!v1b_c4zE zJa5~AZfLZgOL3PZFy9(U5`%yA98S5erev8L;t=0C>(T5eWO>G3_XASmjOcM1w8YH) zg{c)uuDRQOBL0Y}8*Wa;Hx7HFJc$UZFN`Ua*&zb-L$)`f@^b&}=8QMIhcDSrbg1@g zp$-}ebPtoe@?fWgsnsHpX~oq62uL`y`wWpVaK=^66o(44hq zgohng(?(#3Es(n%(bJ~nR*T#R6)S%l3fTj_QS=`9d1ui_Ctb_)d^$PuJwSlkJ z3}~wyt8K#Qz?43x&S65Wf@B|+KDl!kJ$H?XZcA#=#-QdU68G{+gZ9un{idG13(A`h zO4|p>XI$Mq?88)t@s()#4OK_6y^O^j$!FTt)ufY8pU#<|ruTQ$-c4@McHhpM-8^^A zF3u~-m1+$3XM`8H)7VhY9ZoboaQxiJx=$LI+Y{W9aWRI_*2FE3KD%uufX%=MHZj?# zLhX6$7uU8MruK3%>qjcW7Puz(vnu}Q2_uBDV_xn;SD?;0eaEvl&eIgSc=o|^Cbw`a zeJCQqPJ`$pp2pvjAg=LlyBh=g6DyTj5)*a>gJSUGbT%`uF`hO}_i9m@?1IA?73X_P z6S9Y0)Z+u19qW*VuczpbsmucT4C#z6W$3O9u9w>Ftnoay!36FkHycUvo2WXO> z7egxeh*mf7v(wu69M>%HHrCDrG71kCdx;6db@tFL=zJZj3#brV6A3XhH8+~;dp4L| zY@J}11K4YeJ9dvdU)InNtXm^@2I%|{no7yA1}7e9>_I&eWtW1@5=?#*iR}mNA`}|z zW{nz1(=O{K!eJL6=K+I)tAlCt*-2BcX-W+=s(Q&?C3VI10_pY;y5e0v;X7`7BOZcR z*te%Y$oFbm10uEz*(Ci7hffTGuE}+tfuJ*V#xeWooxT`oAsnHUR&CjJxDWju{P9GV z%cF?n zMU;`2`l<{LtPibj;>OVz0!ln02H~hxp_)J+h}K~h+$uG@M&8;}*9AEWmQhf+nG%sq zU?gJB!D7(37qHu=XG1VJeT`nnc-ubnRk_A*@frG=q_j4?(3g0luaYPa=}#}f8zp^D zKK~4V%;}AlZhlA@C%AtX(f{AUpZ_6f_)oq?#liz)3C=sF@tJ&le-xa#2`pLwAnqsv zGm|$=6W)NL4r5Ket3Cpk;#FR=|#opvgS z5(e!}k~C@RHWNYJG1K$3({66mj)buur8lCBoDr%eFHG-yxHT?l31E<@B; zk0IrNjKtu08kKCMFa|51M4D#2;QP=8NX5C;(TTJCv_WF@(qj-%7a(i(ejsdH4xTNbf)dg`G^iB{cg-GO zreSNAeC05wz%}yNMLSay*Wp}lFpV#LIh)eO^j8bChx!04cJY1w)OuYUWL8e|62Fh2 zz#kJ)pE~mbizf?tzS9_U)B%(-efsCtgeJ7rND#SlMU}|X8Er<0wMWao zePE3)-l+X#Pv6={fzC1U-jt8u>|6! zIw#Ezad{>AzF<_EcEn-(g(4gCjaF`))&29j5Dr%z5#fo)(}X^qy;dcnJ>dXGMoRMG z0lFdiDA3eqt&rq?Uw`DXnju2~bCTEc!&qP2gKc&*gc8s9%L3#Tbo?(%P@}g#)pWpD zB1rD6>Iio9SW#Qya)zv58iQ~4(BkfcB$>4U^hB4}Cf!XgO`ck}*w?ZZ!uU=;7Rmnk#o1Pto#F@n#& zxo!%Mi%5G$8WG_jpEigK2A_z?Ky5q;DA3m@uTot_^k<_P7Cld|5rV_;IY* znPRyWuuGP z0WHg?^p4mOV}U++A<6{mH_Nqfutn$^yLJk6ch^W{*G1VIAOdslER_Ye7{=*B17{^-v*70-etdr03JIBtN;b^P_`pq?Fiq~ji?WA*uZW?h{>(4 z+(pAbRKq`Hdxw7KzV3fO!gfmJI*;`jI5eLqh^`mGB8t(}FQ;-doX5a(D*ezoz0E1$ zdP9}+kAtG!Hx!~=q3fQfavr71GEWlL!Ou+zTT>a$Q#lJbV>*+yfUCTm&5IZCDP%(H z7ARtx5+pjHi$}iiwn#nQ?mf(qO=`(&tx2?E8rRjX>3vSB^LkB?l=R#BrLtg#jzQMX zlhP}oE8m9qiao7Orl2n9S%J@iE*=`r`d2hO5sisj?8~#(11jbfN1^(lLd>P5+poq- zpL?w#dI+o^>ZLmdf;v-i9WkC^Bhjbd4X}^-h=7$OXm2kjuW4)uoqGOgarvu^iL)+@ zB*7}terNr-IffqPFe8VvJ;DBov`Cdk$kksTt8g~>4n^<|8cW${$e@+Hz%`T;OOT|i z4d2DMdvew@46n{TM47suQzYGoz(T|hoFXt+^l$p!`yV-^2l9LJ%SGUmPFHyrJkVuKKHhLCpE!d zUzx6GlLYH;2zU9rore ziApHrB-uXkp8_l|jE%zK@}R%|AYHAYBmOD+b+VAEvk&c%b`#Dl z#0XCtod1wpJL=0JcDAOhvD{2$>~;BccK>D_Ar;8C)jLp6p-awgEX!=(mec*})jUgb zqxVzQLC^u~&KpTa=O$OLR`0IBQpn0Hp*;^=&yYRe_ZCVH-n_y8XK$P_kPna(?=0V&{NU-G~%G?Mw6p5(9lR{qv;swx#7Md zMht#{EzNdcU?fxq0XO-M=GF8Ljs*bcIL(e{eHR5X@pqR85sjVT>BA0|cQ_-vJfOw0 z{FeqSk}`Ab>7Q@9{o^E&_`mwDKkZj~PL_`U>*uXf_^$?;Ep_BRWE$71@W2RqI&OW} zGThW8V*c|7N34n1E6KGirN78OYxDE>U($m#DpRR(0R$Z9X`>%||Ju#r=jYQGh_8xj zbzWfEuOrxnQrP2|BNQ@tGxz*0F6BA`MQw|MEo41&qb7y`@@k;cpj19l)fg+C$I2@r z@liiyyZj_Od>3{&5Nf6R8mStir~^v8*L3p|XevEBB64&yiuE>(Lu=4&&8t7H(yQ1q z9*3K}uj~bxt18wh2QcS^Drp+-1>6&yb^^^Y-7@I9*|kh;OQaxqoAo(}derm6S0`W9 z;xI-mdy-uBb&~A#OWfU}$y;&Lpf&~H_aGU8XZ#HP(@5c3bEcPnRJHj{MaIEeh8ON@ z_b2MQQcFSdn!V5~{1%oCe`CX=r(iv=`&gqo={_(jbF5D+zp6w)>Ga8LF$fp^WPqpX zmzM;lAWV#J8Uz|$&%sJf-ecb;x{-;0-cj2+25|Kydm3M1Ix1_fyj3EOX)(S+hWw)3 zCDuqrY(YDU*m*nB*YN883&jWKb73Kr0s4Cz1#=4T+JC^qrB?M;*$(9e)hp+V-UPe$ zyL8uVpKgQQqrugmNO-!=OS$Y{%bAx8j1ZxJWcpt}&xY^+?AiS1I}xz4wl*?wG_$e( z=gL(DDVv3#e=&iEr8*9`25}5r-^DakwM_bU_+`U^p7_52q&^kv^ILb zPr#OGKi`W)N=sFR37r0PY~K#!6{rq7@-1i*vXThpBpLS_uj}2CwU_|t?$YaB;kdhr zBS2i7R}oIS^AWPV|MZD-Z9mPMy+L@TQ+cK9=3<{iYOUv_KNiw|BaXN;6y<{XJlYbJ4l?~QC5Wsv?b z<-6eA-TMyK;1=2zlWJ}L0^5Y6`kAOypJ_Hft~}g&h1U{w(b{*HVTm!Sl#SXN#LfZ4 zZFy^MEU)tYFEgqv5($6iACK*)(CU9*^7h{$$p1_n`7eJ+mEwjx0v{|_!bW_pc&iR# zjay(?!;XQE2O^1gFW{$K@~4>&7!sZeko$7dQs(81 zdyDJqYh=adSFv0qL13+aXgH}pQ7eGCfs{7ERxsADg!3`FtiYfIdjnKSWsT*vZNja-+eDq9A719PrKA3z6+}%Hx^N80pb0tSQ14q9 z$cVFL#*O{>wa^1(Yl_x_eQJ5gt)A7%j_N6>5WM>CcVoZ27RT#od$@itB$!xYriEIo z;J=Q=LHPhtdWz#lgoz#v$8O$+Li7yGR{4&Z-Mlec%^`m!ki)#@w(!BVh$i+Xnzp2_ zt3V3f#i@ym2W~09d+;J(Yr^%80s2fFAn%weE>ZK3;S}}v3dShxFsk` zSRlPj%HbKwk&ec~x)E8VSWzUQgEK}sc}2fFgD6e}{#E0{Cp z2q5NGbw_dICEo$za6Yk+S7py?$vpoVN4Ry)upazKu;_sUW3B`*fqjNbGoKtbw1ALX;mqN)3TFdf0 z`TODaSTo{#Yg|a%dt8ko>$)UaBlHqwQEPqc8BBpRrZ^;ey3}!-f zY^pF3anf`gSm($M#k_ZH-rXdgvb5l7&$U}1JzLY44J!gpLGFC(kZdZu|Z( z2l+GGBb@=LA88QgzspVek9i{c#SgY^5BJl;%Ktq9(6C^9=|*QG$fwCr@P{f)TA4BmKk5NJ+9eyUcR-zAGD4pcs>>z zelb@_(~$4l4w&@@i3bshlo-#RU_OPF9WQi zrNUH|-Kaw?@_zv@hsn|eL95joy#oVYJU#9?nvcg*hGIZj3i>V#yg)u!g&Dd;R>osmnmRra{v91_9m0UaNLk@D%uj5G;H!ip{9L`~8Fn&*EyN;1_ zVkE}9+gI)!i(&@6T5Z<-Yw8qWmJmOD5bvy5AKI=j(lL+FMn)~CioCj_lHPSCMX#ql@H;ZxcZUa+`$Pq)@;m_!VL>u&;d%y z<9%K2j(*)V%5R>NuTVcZvD@@Uwj_3Aj7(Y|=ZYc&Bpn`7RQZgQj@_=LXnVW^Kw{!B?%9}#I!Fq3(ZY?H)u`}`}ljS7( z=-9A01uVT&j^9VnxmH~unv}<#gKGr_3@WQ1NSZ|hvSSH6Sa@A{6>&?m*4ehP;Cwv;dl{85{-Mia~f8ZmqAk#~yD+&{n z>yHI+ad(*J#H`#jiP}BknHw@hbK7Fq>s84;I3z6%Q^k}_;sqkq3b9dWa7#mS9q3RBSu;Kw@HlwZZAJ^1Af__)*Orys2ulsv6z>`BGBAsjI7!TX* zyGvO7Hq%{&R>ArDndH4iIR>&sRbu52!vPaW&WM@%%$upAdSh`ID_AmD9ZRZ$N-Pq^-%cR0Uy@H-hv@%t7pi11V6RLd>ot$C>XsN!S-f zK)o@e;XL%WPM!gL6v^zWi`}#$HEAJ7px$YvLEK_*+MWJ39d}rOK9sAI~tF7O-IPGb3VF-VpZAA=y z4tWV-&B84s9EF=j(h02Mf=8|5q5(npu|FvWW}eb)MLYsHzd5Qbb`T$TdCqo4iBWHN zNixmB9d30dn~5#1nU)0?tN^}E0KUcDW}dZyn&iQip!~i-FrfcrpmUD%!9c+FgSsb1 z1U>nRw6Tc=U8$Fq!{cIMDn3{tw7?9J#Lrn$OXW1BSfsXSNleVHRoC9Fr$@lO503k$ zce~DGj!H$Po$0ZeAJV2QxDci$}?=b zX73}XrKvi)Kd%+d#I)&f0tpxY0_mv)Z%$^580B~1lG#~pZcagX`_4l6P~{B@bwc8~ z+$9r$uWKtTP1-_IO||=r0#(^x9&{x8BFMI70icq{;m*P2YAxUHm>9u3F^YPTh z?@d1YqVDxF=E9yxZzxT*|7qp!%|@z8b)13D%>@eb{mXCHtu%MW3tEX!XNrvyN}GR+ z>!j`yGZ{pHL6r;LGQ01oK*r2W!nF(9TART(KMA!(A8frAUCle~B=j*=eZ0k6qWQi| zebnc7l-yZdZY3)5b;V8zgKaD_fwOfWuTh3wcx7(5~j{LluYzftlafIqNO2^{I0 zTK_V}0lHe#J0slzE~HksTjEK)ZF@C}nI%lR!f`^O%BPz40I z$_6pTnX_e(-WO!6|4gpAvSU%UXAZJ~DugASxc5yf`1%#|dePBbHsSgR={?~bw{#;8 z@%oPHFRQAkX9}Y^YAT_RIeJryLlabshW2baB+!r<{gB)%8{|$d|CTkjfQ_n2`?I;H zf~h1-$VScKDwDd7A#HA3cqwA>6pP?iw_xX_seW~$do7L;>U=nXv(?J>(|O8g<>& z598lH;pWz8{k2zTBUk#CR^Gpt<2|8dzxqR3C%}u~4b# zyW)TWY2eRQ)Zl6O+INUvft7E&(RU2xx+630s`3G>s8Z*~nU~3Dm8}eefNy-`K^rWZ z{I>N}%(dWRBSe)#7sMG3JA}fNRb&-SDCF-Wf~lNVliTwbha*N6SBcf*Q7l$#=z(_% z4sTG*ROM!C@oV_1kO|cVQj9Tki*xtz)4*ktK>z**`i?!oK_YUI>PB2bZ%VEZ+MIGW zauu8h!lYsP8WH;7TK3L}t})2Jg_sO>ih!y}uY*>vW;m^+vzZ}1%pZ8^ci}Yg~Zk)=E?_QaPW^$SC>M~~}JCWU0j@rFJBeGO4GCBSh zMGD0-T5j^eN66!r&asoyz%6W)PgK7vm;vWG~LDpqy_jm7`(5# z_aVEPaRQSDs%|T)CfAqoe@&6+I;aXu#SftSVo1-Zk2vpz;L^=F3)B~JpMDsJk}i_r zr}ecQdXnj@ZpD{fF*a9-%6Rq7x_4HlTXEqjYT`|)oc`+8-x;Y1#rGK3lRC4lKyLaO zG_%pdSap-TGVkE7)Vnhhd6)YY8xyyc7!i){>aviEox$kmXUI+B-Xyh7Q}AdD#=t&G z{oLg?+;MiFE(N+?ocapL6AivTbU*9UVk81yk=j%AYMmG z>iS*;ym~fXXga*Um2ro@ah3iAA^K$Ed@{-;d|S;O!hZvG{$+Gtj4w1-8uIN*DCUx{ z2sBf#bh48Ekg6(gG+H8usY#DEPg+qg=DW=1vTLs8`P1%(y*aJB&1ZdX0>j+PdyS_6 zWq%B-5#3^oXcWL1{8In>^H;PvO4EG5dZ(7v@>^FVl}*L*DfeT!hNA~pD0Y+3$}pVr zkn)rw(z$ZgmsGhFNo>E_QZ+ky#ovE{gJ0JPYVSXwS?Pz%Wcv5O`3EpNI9dI7W{@QL z3G1IYTdsswto>FqGgCA0Mj|S_x&rjU`cNPwTv=bCa?rYr)&j%cXTfRIahO}U&tDhf zor3_*l&_?NO$qt9K|l~OH(W294l|tIf8XDsdZ`+%5M>W*F)4N9@}BuS;k)PmdLf~w zaYl-iouvzghw9xmhbOfS)XrUI&KZM(RB3~q$nMu-CGOF_`bB^GEeFWH>lc3FD$+Cm zolTANDLt@5FLS+p3B_GBaGUJSHc>|cnNZauElt(4x|YSLD7DwLtqpbx&Pt0z6lR}B zzwV~9@5f=Vb)!c-TmAIFi4k`sMZ#dRwAZw^MN>g7cPNE~XwwVUZ&)&@g?^$Vn!rMu zATe7^8H+m&39NK>#O==(RZN!okTQXmSzTS{~X^@l&tsTGWyB1k?@UmGy^P>9V`b;j!iB` z)*vTqj`bA=R18-vk8Z%!Xn(X%8PiHV$N1u%E@comxs1f=o!Ng3qVbwLYZyu6wVx1l zjoaMb{(if;$@X&2{`Yc*>-x{SWKUZtlXC%0G=XZLPCrr_v!t=wmKED7wwtt_dC!HJ<+Ozfhn z5F3P(*oAb(?7}p$i^fB_dK`SAfRldF(ooy^IvJs*)F6B^VJJf2JKjGvNag;m3{RH1 zqK2v4n!;SUy&Q2w%;H!L%oc1Lx3?et7|{qwNWRcF?^Ey1nu(Xpbgu)`0F@-q1a`U@qU3km zBwZe#JD6dc@kcp-9iNqyz2W0{m-a(K1*QUf0wB9ECr3Iu)u{c?5e4HG(jOyp8k`Lh ziN-A1o-Efq_!rH+zR1H{~o1)+Dq1l4VNVFtIN=ysQa2I+6^OV*8 zCUm5wINhS2)$AUP{o%UVkX1!KTC*&v#n4I1a*c68$DT^hCbWG1WzVqWTX1D-vrHO5 zU?mxQ-i^8VRJA0NJ92p324&wroLjN7^eXCUv-<1Je34HNDA=$~dlb^^=y<*`oJvFy zJ%H1Qu2CY}79Gg7t&8Za2)nhZoG2xcIzggXsrpP>aNoaDv53f1Oo+BqnLtm?np8$E z?k73&0)(wV1)GvdU4oA>|qwwg4`6oD*cClh^Zs4Zerqjbh4aS35Um?pq@K zJ!4--Kl}QX4^rp^@CE=`pyzCs<_@4t>i+V($a)cr^YtW_51;XLA&P{tl~3iXlH>s+ z{-gC)LE*C}WZ&cb7lA7H!9(FPji>NP%%#DrUa?;;4|i{StnQZI)UF?6<6J?^9T?iv z*|7r1IV+^&*+~JfB`&-v$CIn@{*M07)a{5Nox12xumC3hzYD$kAB5yTCkhn(@R159 zPTx3U&q+rYEX<$+w6LL68>ESWzP~|efj38ER)PH!62Z^(BSzy3Kw>yIh>I9CR;(=+ z_%lorVjW}A(IMbl#5!nK#hRVhmaVqto3u8puGocjPc}V>v?l7MydQ2zyk5L_ z+&*XCrVl<2SE#!l>3xw3+jIl8`~-x4gM%G;e0_Xw*YePxUTt@&KoEikSqQ|*<|paa z*sN;*AqhupRYVjZ(nJV__5dlE>#IF}iV5uWvlWdX>=Xza40WOKc{0C?GbOBsOH6e( zk&kHTbl-`TWIsYj5tl2@)f56E2a~9YjH=a@l_*4dF%L7OoWI!FfkP7`eut-<;;Gc2 z$4#D;my1I0uT<5hM~4M zp~2#ZbCP82T|0*+<9vMIR^FA~I&iq=P(!&G2 z!GkULB&;$q)dae*AfMt8=yhgWzma0%O_)#!NwM)sqY;x0Tk8B^@YVioYj_}QBV)$n z7l;UBA7;v*jhcO5OLe>6_R~Qv^6O!)NtXSXp(bf6)cXneJSH2{NnM9v9U8KivQ``% zJVYpyA@^#{K+F3PMNV8}HUv4qfFEqFgxOER8o8Ftg$M0-?y1^B@p?GPL{KmtH1NuG zR*@rnOV*!X*&A)Eit!l2G6+80#K{ ztbI#eixAx`x;9YIG^cqoh-VOo?9~7%XXvCju;fHmM$(|KFZOhwmK+Sy%#UN9v~^$! z=GFeA2OBbH1O*XO&JIz>&}T;1r`f(CJYTkx1`X8qj);}@`!V`GG+g8kmG5Y@UU9WJ z4S__UN@M_mJUh`lEt=Q*H(%Ihi6Uo|Nh_@}LCS=7yHrrVwnWNFsw?sg*=u+>Ph2hO z%$D=;)PXIW^sXC_juKsXf*Ji*S+{8~O_GY)&HDbu=|;MlO|p{K#EN34FI{j(s6DrN z9di%i_5AzTq8oZSLJ8W~u2vo#+*5vd3hngWxCwR-;vm>v`gYrIlI}i6kn|v_K8nCM zH6_lYE&ACxgS#Mq8z~=hU6bL20mza5!+w^#a=|w>YxyTPElRvcdTk}!?2iG)J+tgk zVo;ut9@xDaIM25rnXRZ2%RsDQw&xAvX=ec6zE2j@7nI}AUGuALZ&9VDJr3b6Pu;{HE`onvoq z0hDlWZ*5z*wr$(CZCkgtZQHinr?&0(*0$bGGLy{Ahk5_O$xcqr$kR({ z>I6kttu{i8IS6pqq{AVw5$R34kIym;Kfu3~`u)mZV12ocvW*iIYy3Pz*AXCF#%d7W zO7C@fr&6-4px+N}A;Yaq^V3|jy+30kpkMR~DNU{@)$G;lbVIk593*NLH88U^4au>T zUji5oUi<$CvNuO|Tr>@zQ`P&}94ZNi{kWIC^Jrk!6fXNtm$(568_!Gpy zk=H}iC;euz5@{U=t_YJQQ7Bc)rLD7>P=B)$?&B|~g;KVaE19&U$@;w+tKpSsP^w6^ zsYtY8{^p?lAzUIkELc-5c;`cefO_LoL&vJ;wfhUjR}6ptpkom)qOmL0%A5FAP2AoS zI)n4V(B=t)(JGx;Xb7mYjKST;#b@!MGtM}op<5p9wwo!PMn+Fu$#jTlB)H=26@m45 zfp2{Z$`p!8=l0M3oo_c=E4LM8$y(kA zCEz|XB%E6@f?9QMO+I~cd9hm>F&!m$&oi?YI}-*wo7H=&ZN%vi2rFC5~Omo{eoyJz_>K__o{oaI?SSnH!{m zVyT+8H9tC;sIu~;J(@+%luP+l<&ksuTSG|O2esSBP^r!KuVDxccR$18gffm0{6IsS zE<85GLnoVyDV;DTa}c97m(98h?~~Tzy$lud(H0vAO%aOo)2|fDxGwFs%0Gqb|M?oJ zW%d925@$a%vvvDarip`%(llLte5Gi|3#!W2X7B{pYA*VcT>te9$m82vS@F;#tqE)0p}Tl+->bu2xc zW>InbaJn{qMM8ZeqxDRp_*O8c&cA_!lt@)2&?c>3pQTj>yGv@GXoStDGCm{q=H7?% zY76n&3HJE*PN`iSTYc=wpzKp63LEQGo_-RZa@zL)tp0)7nCdFm!pSlAa}HpJa;rjQdGVqV9ls3*`Xf;%_9R)H?)u>IEc~3U1k0_ z`Hh6~&cJ>gYd|tnW$WO+8N*P;6O63|#Z9L_hp5~EEt}61oEgLKKws`-LeNaU6f9O} zgTr>s9o>UAT&?_6TK9X%r%q0SlyP*=mG=12{oaWK5&I=JHnCFnS9rQ z!rUs9vK28lE*_d8+_F$zM=MD%Id4dK$*rs*L$J30(3WkqIirr)>eCp1BpT3;2frS4(QjBZj(HbCDk17eI_raVO67iWP<;f0CM5tB z|9cc=W^)RW7Tw3461dy&7C#*6dvm>iB9m8kt2G=8;6zK6!pm>4!Cg!4uvyd0j2lEk~64wasE<$ zMy^SmFl`VFLxIB;d_a+PRw2z&YJW_=I9@w3h^QQWaFl)Uay$)Kcv)C@VZv`Mp)F+6 zS<14NZUi{kniY0Q^5z0^--SmIQKb01KQYF+4_<1-UwC^tm#4TQhBu{r?P2aaUOZZE zwYT?o(M5jlP}I0L!SKx}YGWO-)SPVm0xG+r$X08RUn+R9!h2F%v6=fYovFtEu`18e z%HD3NO9N4t{#lL>VTCG;y&8gxFbLac7k|G+-uk+auwOQu{}+b-hw=mueL6`&MTJZoBv%kmsG@?a7*Iki_{KMfmQtyo%pF zR26cLw2sn6F#Ps=oYoLB^+M4Wtzyx-v`W0x{hc(pWBVXwZ17sYvoD)nt1sO1pQ%w{ zG5SB1n$^UC9cNaSoPKyYQ$rEDzs^xahZ=4FIB>nP1#-$+h8LxLqLjW~H)g_YR7LIv zpZT@qx4%!rGYrw+A^vBq= zuW6BXm?rDp=y)x_p#APJ~d@yE2UO~&>jt@-D z22|&rJz|LF=^*AHeQS1uwR?=UJ6QCMpzDE1Ho}cMOf4-8y6vWV+*!zW13f+e&xlcL z=4t?wSJXww2=!Llwn^+~63Sa_9;2jnkYy&UlZ~sCE%j8JQNHhtK9+J^?s>Qj z_%Vo%u!L>U7g8@Hv|Gg7n5oq~-OQdVrlPV-jMJh!R&@c^fkTY0fti{@^)0WSpPH-! z?gI5xetE92Qv`Kswuoa{b25K@a{hoSTx&H{rOlGMS!UpdjniK1RBKV7DTO3xT_-x7 z=>rfCSm5{nS_(s8nB5bg{`z%H_v;tc|GgCcPrJT~qxF9RLYk1?$S29)z42A?N4Ng{ ze}6gQw;0nC5EFyJ05I$g1A+JG{r_6SxA3P#!Tq)oib;qoIZe(ivJuQ2;xQM3i=x;H zdiZ10>ejhslWEg=%G$}(deSnMF#Ftt8EvdV`t{iXIX~&W^S=Gq{p@#*{c2_Ba|QY< zbzyOS2OdG&yWuUde}+$2k1#ViNmQ-n8a5|F zMRZWXR&!>;t$mZ%>C+jFAR~aE1Ax@!lkYyT*;OA*&jjz%%!0y_*euo6G@$GpkGq8lgW1MwR3gTO-Lpr z0Gftu>9+v+fY-@ttZ5>-B5^nyhC0-Z)x02FrK8u=7VI{Gf15m%SzW6ZyP_A03Bw#V z`R6L*LiU{8N#9`NW7aPy7Zen5dv=^)q()Z{L& ztkI}EHL*p07@weB5_hf;`)Q2-^qJH6;dN7Au-*iW{Lxn%3;{zwp~jE{QF`8gQ^qiFq>z-t>hbULIz~HDZ^Nv@g2B zc3Dy@!oNCyEn;D4PQ^X()Sy)xFkAGXo2MWop6IHOKaYsOZo9H@2u^;KCdKhKd%D2Sd%htpL1VvKeVwl`s(pF6!$O_8t#>i-_QczV8d}(|jhd*aE9z%p zWNW5<&W*+%%f*S!%y4N!U_EXPoQ&U2`BMY+}DwmCAbZCnFhM09d^t`*)!qotHgr77r11#Cz-|l-Q6S;^A)%{`c4}$ ztS`z~5V$WtGHI7lO`&+6diUD3;RhLTt|{IzMO;1;P^QRCOpOkqcxOWnXWkExZ-NFr z66wj7leZlAixT`xiv9KWR&XfyiZJ0xj2y=H zFXSy+MpDuCT3@nbz8P-3KK!j7?U8KNFuGSV!K=S)JF8w2{rL{)v^xte-OX3biGtw$ zhIgF1Y0f1pWH^GTkGSWkkG;boO`*>Uo8xkL-x6ruinhF)72v z4+PV8t0U7S44ABp+a|}0SRJvI|2$40GZb!(WvnK71S#Sa4nJa|?B4~d(Kqv^+j~b&C)b+v2lo29Dv#qGYb;V$YKyPtMAb(KTPRmCKM4=^ z*4RcTN24|S$MaOjZOKkaavMmosmJndI40ljzwtO`hcAsJC~CXL@EwUf24IaIg-r=^ zfD#vV`D+BgAQDkt#SLIem~tRZv5m}Hv|~B+kX_B5zd?AO_kNvUPTdZa9ULkBpq$0F z8`Iutxv?U|=dRf+=dQv)oTS_OY8OJwm^g$UTPt}&iZ}+pLnriYUW=73mAe+jfI#f( zp%ZFiU^20iXgKd5KEp!jBUVHB(0-{I*u5*fv?|IBa}yeWHRQwFTF_X>YVQS6nR?=o&=+<$lI^c}mz#dwMRX(tL=B(b&=%i1(xU zc6e0ZTBa}8fWhc5B^?0D0 z+;_I(x5F1(SB|2t)`_-lb-N~?OhbyAIIDr*F2(8djr{Bk&a7e{Me&1F1`S~|Fc#^n zuG=yuJf=78LclLx2{@pyvWY8RXP$vRGOH_u7-#GLvIsWGUh9Avugh1Sf5%od;<^h= zB3yhl2M+s{boN*%v$6tyqSYJIJ0$kEZd{w@!UXH5V7`phmg@psuafh>*0NOTo6Rf0 z18Nq?r|WLZ_aGuKRHy-3#;nloo$;u|#j52~Rl(`)Nt*ovNirPK4(%Vdrpa(rz6&&x zp}8~1WJ!h%C5xNMYEzKy*0Bv4Zqa$iwoq%9Z#Jf4>X3-MOb9rA#9z`UGt^&`2eDC8 zCo_Vo-*-`2zodR&nOr^BSG~WU0zEwhl8*>c-y3Y77^RKhGu@b{crfAen67)?=%jey zdQ4#-HtQ-rwuPN~a4)_2|Ql`8JIc zQ5o0%Z1*cOmUAV(4{N6~y1@c&p3yIHUXcKM6F9ghYeT6D(Y5w1KB$o#PUq}yYP;vs z-!j&Ht%w6|t6kTQn%?-Kx4=gcxG5GfRJID~vS+f6I!bN{N3GfOrXJs{;3?Af%jDqZ(X=NadjV ztiE5iczxAmS#7svxA-RhQ7b^{T=u2iU$U>o@wH3-yGrEtxey?72U{b%&^;j6MCA6_ z5IIKJK_1aa_76dgN{LB&zT>`cnD0j_aDZGRLSKK$t`yX;rI_c+^3Vb5E+nwaBL*3d zx?i;2!q)8J7A>;PEi#~lPsT9)`x9euk1S{WW>ELwVN(4L#owJ&1?5^z+!^AZZgDB9yYryaDkfCmqFXLp zFypE@qT%Zwv@iAWf%J(i{ub*##RE9#Sz@_zMviepijEvcFd{fbjGM>ZN)R^vc5&9( ztDWehBIJcdQ^rCH(+tR9#_Wnc7AUIsP z78y3U;&fyx%&C0+`@@TrX3d6BBMmG7OJ1ykAr`ICp~BvwLe5Xb)!sCaT!ltLKK6E4 z(ayD^M>Dw8w2_0t#KF(DCcWP9*}_$rd(?{C<$40)+o)L{7=wbhmqNLvjl19JcDS{k zqpdR4h38}TRed?OwN73e9-X(Z%LTA?K(T1@;{4XYvEz%5WuoO_`0Lx_ok0iuVqN11 z-jH-(nw+>3Z5@Jcvv}Ez*#bh+S{YWD=s=||IHZgx`qm`CrZI3z@b1?pdONe0$r*c_CvNZPmpI@3BYP^{HRvSL zwJ*Q{K*egQo9G%6ysAqfl52*atMmlFFNFkF&2qv(qs|%$+t^jGQYV!&tk%Zuqtk91 zR?MWKH5v7*eqwy z=JDCvlrx<0g!Oa_FL!q-x882}c_Gr=6g06*wKg2z(|>v=CDx=p?acKfo#%Pg#G1VH6`VKiE+G~HE4By zlH2cxe75QPjQJ7L=1-T>$%j;=$E`sW(#a$P@tKDFf{L;rColUWTYtkuo3E6d8K%z9 z0{(yq?T9QNIZ(s7QM^It@TA?pNlkjr15oxt<$_>TCA)D@?F=e*q5?X$2YzR(p1aG8 z*s0xZopVb&vzf($#>?F~A~J2TUYXc;zW0*R5Jl1uf#3R(S%En)7)>jm(x0+fPus1v z_XXwM}O_N`6AhcnIK8o!=ztgFtSV_go8)sz$%=f3wHiRQtg-oY ztxJr;ul`e}2wz3=PG8Asa%yDhGq`)j;u>ja-6e!_e}-lej6WVwpNbCG6i~HQS=U6f zk1dP%B~~nFq9H29BDT@sRYjPc82Qf!u7+*xq<;S|EHu{zR1)a5CL~NXGxT;OE;{PM zd-eF#tZ8GBA}fE(nfVR(6$D(|IR;#5daI_sGG!{$VZ1zbg3;WSuXQUR0^-q8?et1A z75w}ZCfU4>za5bL*f-53WTcHyw5@Ycqd+}9%Z~0Rvsm|tInoH#-9&LQCmFR+Vwl4U z`%_!huAUN>&J5;iZkH9-j#i~qB};b*TL51hJbSpr@Lgow{JCf=U~ahWfKD6fS>EYG zi;2ZP6>`O)YqHAa+_@YTz`1Oo9=aumJPp~?-3!n`L+2G~UtFU=+HExatMd_ts{GuP zTS8G?0hSBAN zzghXClAZsjv$mkGyR+we-$~<-!pvVV8{Edp7cQ^-vaIg1z}m3wfc{Q_EFffal4QNVp_LL$@H&Ux z%S(ImC1VvV#6-1D_F6rDVMpD6(J!N3D`6XLWV>kHmegclF|d^LN{AY#btq1H8Z=KS zK5Uc0d^;a+-nRCQpa0OrVR;RSe4@{otoO7#PA|9gmD&tr*kG4fU8Ysrh{RJ;`!} zFk-f6{5;JXd|*?R?6Vh24&AL6#_V~QZ>>rz)Mqg3wS?nH*SUAHK=0MF3}z83PIm26 zp)jobg}*ZCxtaqI@+Krjp^{t&EJDF_M=M@9%J; zL0p)KRnMu9DRASyWt~lK%M^Z=XR;p@b6v6?lT$n!?pJKB44Y#WiYQ4QfGUGQx;#O` zWir1nqs%pn)RuZPhIStNjO8rrcmVZ3W>a0;#*D_;fOTMP2mHe>uTctD-lYhh{C^`A z=&j;x`Y`xY+GU$vs^ndTxt{JLhdXJ6`lXIZ^ggp8D(k=$> zJfOC*#+O>jEuop&qe|#b8n%OU`YuYirFd(ylnO&zfPAYey}ACM@RLYq2KesJhSlH) z!DaiuH?9A1jVU1~;%;PO{~rPYaRXap>;IB@1ph}pQ2?Pz*GP2*JVH!v8)Zm<`?yG7 zoF8IH%Qmro%{gtdYHfSB)#C>EgWSOtz94Tkw8l1~qQ>{z-3Qn{a1aM`Z+$qK!ibs& zTPxf_m%U7*Ow}}L-QDqfzfCdRz<4n6#3crA&)kA-*&SPwDV=VOV$Xfx zqx56bzB+JiI7;4I;vA{}1gy`BIf1dfCXx#L3Cj#rnS>vi~u}YE>I2WEB)&+eFvQy8Kzfyj8*c z770xaL}3dA3n@z?0{^0FjQ)JsQsufK&Dy#CoL zBH|4H4KiYkfhJ@Ef8y_(@bVF+4?;%LjdwsQ#h7k&-D~g2M}eKL{L#`-@$fY!=@?^J z33)zyLNdpn3*v}tT0d;2m>^-jKbXLomP%BOjMoKenj~VEz`{-91~L>A^r4t zGpuStl(%;&LHF5Xp!LY=BgS3+4g*+070^@sOfEqcw6sM2#6rq$Sj~*6*Q!{})Wt}} ztScBJre)oIf1o;pUKYvz9ja$wLXv)&j zeCy#nwco|ldFHeF9Y1pA20)JGvh7s$eYK?^kzCa3T5f|mX~@>fw3m2_LGQ?ajttG; zsag1kmCec7L55SS*=(I^E4%U);E%YeK39CRrBErbA#%Qp1DVSR^9tiEHFmfFYdBYM zw1$|gQ*An&H<(Qk`E02>w(>SgEI_jxw+B(_Kq-;Ts)_T{f+ynLSJPWZs3e#MzbGh~Lf z-E($y#5Vf^{6nMtI6L1dx+Ojh=ox5}{x$$E ze6~l+SkIZBhA%2`Otfk1f8xxP<0!?gv1t)#CLYv<87tvl#p*818T^fNM~qDBSE5lw z#_)mcDU?YlspO|$0M56c^q1VQCwgq^^oEu8JH#qqMiIY&JA0U&+R*yS!%Mto$E0j)n_Uw6kg;J9V<8y2ze6BEU=Sc6kAsUSbrPi1S1$lQH;O~x z`@q$xx%@s&EyXHUpeFu?k<~OU>v~pNR(fB}PX_0DTJPUWnj)_=?ax=Hjb3b-58uu7 zjZ99{-cHl$Oed4t?*n8zFKE9ek-%~P@K@xS#{s27fM#xLZL;XL*0z?Ie3Eu^1;uHc z+IB1>#w~eg<`^Oneu$kpEo_ z0jJkis{#+o&FL^AdWBW!pV%4E`PqZOV0ZWY~BF$iS0kVmk|BN6D7?uF;@9521W-ri^USP1saq_x z4a`d`tM&QvyAWP)?eI#S%r#u-LkNE#{;q!`OWR*?PGI8V%la=s3Wf~pWUvRNc9{Up zq*$79ZNB~JLAAyGnP)HFpJ?69x~87Oa$EyPsAxbeTa!mT7<5`M7BhCcO+45mfU*FK zR3!wMSJSSrmJi1gI-dC5eHRIqHUuo_LcZ^^FdwLaQjJr~GBzgr`VZO!vpQUK6IFoc zXv3t6r+Hy6ik{jWbDfI0;{40Uxbr3r9$;P7au%c#!4WtR6P@JVg&(>~bq@(vGe4SD zI7342efg2Xki6K58vseZ-Wo}x--Y+HWXvVp9(c4Uy1 zKa(ug-Oa8B{vqVu93nt*PGxN@@;wPGwg2dl(VXv(G_EA=gmW(5jdNoBwAr6?<`?ER z$o8M_C%z?|SNL#}`(cS0p#vF9`E0cPcAcqFS_c?*Uh2if`qQ92tJGwC2-MGIYQPkP zMn~<&j?jRxxYcjiW%)pXTrl37M4Xk*PPSI-)w=cTM`t@Zqmsyjk?ENLDn!e5wzH#U ztZ^E2l`E4Im2GsmknxrCBi`QH_0s1Kp&XjGSL%O%Dl=8JHRnu-G=(Cym{*}TMu}Y} zfM!8}o__hRPdCojFo%z--^0Py1XLo95A^7_b!x$bu?2NkE7)B=J-V-HEEXSZ$7igk z9b>_|_BRJ@9mIN6V>~yl9%$=uFPyWq0l6+PAU^U05;JmrKFJj@u3pXUlD4H=Z`+Cc zHFF^tCzV@|t%lP$2*HxJTGpk0?*G$o>&?9Z5T*!M!cv#|dHM>LIE^&Cy~ zD(FS1n7>*qYplL-?(=l#4+P&M(42g$82SMgzx7}*>Q~#XBwj8_F`2;9L96j-GwABb;B+eST7X~F~ar0Ak!$`DLjHu-nsBwG| z8gUkpj7ip^#EC43NSrW4E5@_u2QfzT4$Sg<%<~)9!lpenH@Bjr!{3|+nK8eSc|oHY z-P);r7oS;bIdP7lkkFqQXjOTM0h_s9%OccdIY0@l3#@QPIA&pCWvjBXQrFqh+}WNV z7w;Jnmu>u&Qj|jn-6K~rs$k^th^7fQWp<&{9jejQC-53c5o5zy|4rn>Z6k`>Pwk!# zcVGg03Fi*#TQwlZ{6f*iNxsSUns7L}yxCQP)JfDz1+81?)YJ7g?+AD8m)}q4p=QzT zNq%g%iv6h>xS|mdjB5j1eSVh8!rWSGb*|pgbgM}E9t~#KXBSS5A@*bkP@en82kk4i z=gu*436J#=uV51VL5iMpFNgJkxy@?W{&(c^@gl4Q3?ein+ptL4I0LS8ier9CZ!I0z z&)-e?r4r09&~4$|SAw~0jA{Rcl@onb&0$$EU0V&HagKld1`oS!6kc8=7K5YmLN+i- zP_-lJIBA|qxvUN6j{h~R`c5DyM_De~I`d~dA0&C)pE-k&qp*ME1`-z@q(|cUF@zP1 zN;_WY=`SS|EJ-cRR`?PE^u9XO)D^GJFicSUAh8q@C}mj!c^uMlGZD(Lz0v6SG_`Y_ z?~j>FRma8y&C+=~S&fb^HzU}C7=#jv94R6uBH@0Na2;XJRmruvD>%;a$j%Vbs}@zr zoeoDPv#P73)cdU9tQ^jHUmbOV8D~WH{3AY{tvVpfA2fKS|AN$CNq)>)+A>6rsd zcED-sVe%~IOpjnQoBNm>wscn+YRz1_AP=!5R+<4v5(gj&s}n_;NO%RCvrV048rGRH z?8B>4DqG+;Hn;B#Yql%Ri2&@`yRuci;zY`1mzFP}sDw66xrxxuDWbopE`(;@hJcQ!M%7n3+GYqM5RSR0U|a`} z-dId0&}O}AuohNoFbdnIJZyqRD>goEB|7R)yoAk!62Vn~m^Y$_?B+th<4;vDF|2~c z>XfHt%@i`UdHD!FCQucFPans8s87{WzFK1d?pgxxnz#VV$-#!z+(sK@F_>bjW`Yjt z=UyIS#c`*!ve?SX#!5FaAg7>SDaMh4%_h)uSB=f1+r7#BTNbyP3X=6{f~D*CO1u!s zN@N|e3o~1hO6xs04g!{zIerI=_KcW%J=v;hiGvM+8##{l{`H(w9k@gTHuHtZ`dIU~ zFQGW^Fv|X4Q0I@{)ssJ+7yH;rK5Y_%Q{wMjt*N*&&I|yF#nDe**w0nFb$#kPd)V%+ zeIa=8Lw)|iKOy@mCb~EE2F!4&awg~|0c|3K)#Bwo`DErMUR}2P%SIjGMze6RwfliC zD7m3;EpaT4$s^~FAWr(USBp1Tu6>w*&mS+aog9XIM|>yfz$c31kaZe~Lw5+<&9vi# zd%$w^PtPFCOSwy8F!MGgDSkvgoSBZ~&5D0(aE+efxnN({ab^$)Uu*8ryd$7>|MCLV zZf_kI%NOmMIor;Myy*Ec@c^=MqdlyMOIuzdanfwtO@T7fjc8KVj$0z?xYC_&V8~xa z8Y=IBs83mHFyEfv&JCQc@+Y->v9eB{XvTiS%iSliBLKb~m}`W|{g<9%TV-gfVd(Nv zGv^OD{y?b82Y0TZ9zTX1*LD|#K4@$VABWZ;Z|<<@FdgA!xRBHmZ!cXqG6%sru+-Mp zkd2qLRqWrQ-kZ1(JpsweMhOG-&PQI?)_bZBFbQ`M?-Qn(5p{*w`y-R$ZfYj(nA)$S_7VD1Qq!Hy--XE*tN!Hkwr#CM*Zm3hEu>bIG0?29g_bLSsS4RKeLj*jDg=&UH{X;Jer4C^;Vs>ByY)Kk68wr;E&=+HvJZNDmW2Q& z%^FVDdMK>uDlj%zhRL+xdh+%nUxc9GIGT?puBAep1sqy;27P&UEp+E^Og`c<--ih^ zmJN1vWA$lK{i^ol*tJgRJ9%-||G~Svs&^>fs=)dIvSErG1}S}QcaL+eUZ8EKnKCjz zd3lx}sbKx4bVNu&Meeb=J>@b-R;rzz{VZRwukcKq-Co|1z&}(6*}zS$No-CvUc4Ne z4R%cNMVOYf{-qH)YrKdBL5D&iO&wd-sAXQBJcECHdj2__8=L9LFf&GU57Tg54 zHVR+CC3d2`IugszHR^vFEmoNm23|)mPKPYF08);r^N|Woj>l74 zTWf1{1*j`i(=;cM*0PXP9%%u>fVW=VJ0kY>Y$F)tL|TxS`5B%|d2xf`@dW4@A_b!4)q! z;7iPl(T|9!FbM8q&`6sBztz(~0eh4;)KU?&XJuYc$k|OOvSUJ!#AuN5%5Mj>#j;2v zgxh$8IE?gc($91Xz`k~ex6*mr4kPtFh`CbRVSgD$P9{=(y`$f^$ygeH1SXV0ht#tq z?6_1r@#f4Oojyx2<|0-xj3D!EfIR&X(gC3s@2$z#O|l5l&%k6Y(z%gGj?zCOsbb26 zE;J~cKGxXS1a|$Hx0(&vg7^%xA>=cA@wn6{qJ}Nmbsw&)1^SY)I>a@@>!!gr%uTtC zk+MAeV0`P#y`z@!-NOe;ne>h1=?xVwmGn6znK2=h6YrAlJQshfn{2}GdU;_J{ z-+yEI=SYm#r_SSKAASfThM^*^K@SRbbDP}+6(kWar9$kXMwqbyWi{hQQ41rPve+{Ba7)3n=8LMU0GBW4ZSu&fh9H2$ zY16m^{WkeTwIlF@qQ=k;A9imh%vV6~7|Xa5O$UXlhDEYk|B`4sbPWkkyYfsCLDouc8`uA2o%1 zm<3^?s7jYUaeXVCpFgpcn#8;s9I|!ecGd|OkYk)+&Kf#r72M$A8Vf}Aj^n!gYJ~?kCi)mPe*dK+ zGPWpCcnf1H>0sQZuk51N4Sl?ez+iiLi(>`zpjyN!rCBhtT}5}e<^IT7U_R1{+&F1J zO35&-_I6SQO3}usyq#GJESBYpyroz~St&4<#X%p;no@(?L*P#!GE|IRBxH^^CYEIagii6oMeB~nq@;mmX#yZuuv_fX~V@#_zDv5JD zda!L4_SB5UdY2d$)zE@T{y$EKgulrE;kT^%ok;y(6L8de6Iw&CXsg=j1l{`@>V7C4 z+Q8B;eBt@=ae+TJ8Cw{wn)=w6gMuT&0N9)y5bmnk|{+iiQ7V7In+eloLa9W zjdBuAJk3KfG$sa5RNf-ONPswo+amr`>|i8-90L+`qz6rKgqDb|KAV;hz9Z2hUNEXS zZ-_$~Q68zOih_?29>xWOjpZlcMGdWD52;#Zw?#%_8$>%i6pkyk7MPZXcXUJ=#YY%L zhd7L+;FpyE~0J&oWxr6=vx`FbCDv|$AjD__NZur-+jh4hT z8hQ~svN9Yl($qB%C-SzO1F3x!KrquNvh)w)jD{AsQ|N$FT$osrU<^j~Z@Ktjvz)eB zFgbQ0_-r6ocgtb#&P0N&prVMdk~KSN1u+F`qIPlWI)Mfr#4*qoakK~#SMe4y0u6ED zNX0gY7&}afZgpwqaB){sLJbQiQCMEml(0w|(Lni2X~884nB^k=WE`79a|9`yAE^Q1 zfZWEoWxBd8S><_xyhoV15|lE|bz>ElO*X$n05XD>b$pfhHAn<<_TN?5j5b85;T#m% zJmNK_Y7`k)svZW5;dh8l9f}KQR1;S5d)7#_Ow^q;^7omwj&3vS83DC|whOu3rKgiT zDho_Gq`5tmh)mP$z|>X3a#>-ddXag{*dk8IF$zLYR?q}2Xo*akgwt?w-8zwZ+gM{y zq=a0=IV*~|$)-4GgoMLgXH~)kzAx;43$i_F7}*JS8|k4}Im1^0sH`lwQh3>w)$#k3 zAQkbZTEx)E@lh=z^Cq#z21p4KL5G_t;%73%ZSvmZ z4?{8U7K&#o+et1LW&2yOpIu>z@e6ql4!>=Q=1r&FPNQ@N%ZXE$N(HK8`m$G}nxS%& zOHWZs23&q$q4pIL-n45HjhHH$iGtwOOmY9#t5M;2*@hR9eT3k~@+T{lxXGffngVEw zNi6%?=LU_g8`*cUZlvot|GcBIeH3qA(M*}?3e|bszjsVZ=I~+)pM^*kPJWEnZTE?>%8w-`M+gM6V2TJ>})$L$pD z-#O9D{tlGa8lAv*LfY0lUli9QCX_9Y=?4ciVdsV_sArnNeM1=7ei2~IT$1flBc5an z2mfo^!!TX8oIE!%+p{olNl}VgYl1M#Z%!Z_&_yBB8L>#aa2^8Otw(qt(#A08YG~}yvO=iM1VGeq z0w9}*H(ACnu#RwsbqdQSG`!Cc7O^~YTz-wSUvS!B{F7B%gX|I>0Lo*@bv$08?3(_) zF4)j~`?pp5E&&-m^{A~*2w&f&u^VVHsBxRyb*Q3cB^3?3znT;~2xha$P*D}}cLt}S z5qp?WoSy1u7fGAdnQLTY1kg=ZLKiT7Oq-q?grucZnaBZJvQ`#J={TJC146tBXR;E` zLi+Ym#~E_l#trSlvrusRfRpTgwN+*8p3OxY;8FO7331b{qGfSc$+O~3Lf)kGBA#nZ z>?)}iHK!8gAPOtp_BV~@6?<`;pQV7_&L zVmlOI0xgY@&L3(GZove6GSMnu*0rC|gM&InjX%&?C{Y_eTQSt70o~h?2&5R?HZgM- zt{wAfjJHkhZP(y5l+2iqo2E7hneo?7g1}1+O#kzds=J15px*f9jaWPIc4Fr)vImXn z==m%`?FfS-+jI)s{%;Sengp+Uo$VO4QLcKiD!jy{Zbv>|Qv4yJ zI|6P>e89;e`VGk|L=SCml-;<{OUeh7FJUhw^J^J-Qfzqo9VCOAuMYDB*|5o7o&5yS zzNd%sCLz(jfrm6Vfm}rCA=5slha@*yE-KxqU8LHf+tAF>^U(QSle-iz-4|gm-F6~h zT>2eoI-Oop;UWBy`)fiLr61+V=*l6|tJC~It#PJzcGErfX^LH3%ytsqE7uyGAKl;` zykn?$B=b|rri_hO`DNpxYwQQ|=@tH6-bbT1e-91(MDHl_9qwzCw;C_iH*GK3x7L@s z?;pKne58@su)8R4EudF_!o!gWWo8l~3Pr|b3CR@2>O=DTvSQsaA}(@e%_Q$5q%#{e z0J&9i{rHh&`o1cFif3H7SdT*ulJX=zTUy1H0@av8DVeLhOU!}dnM!5+By3|)GWsrz zQOQF&y_matl7K3s^h3N|{xw{&va4i~qLvDs!j2sJH41QV@Ov68v<*g8fz=P?ZsQJ|mRkB4O z@E;=Q;h3yCHLE;M93B2&XyMvb2#;}Y3^MMaV*W3<8pO;t^koY4h^ZkuVDAVicM*IM zs3ym~z*m$|Som+iaI$SU=qp}@83)+?jj;1F8hz>Rc64>4)a+|dyAa~UiFy{sgcvMM43fyhGeO@?|H$nnyha1oC$ zoJDq<(@b{T(_CZJ_Kkt3t-^8%!b`5NDd=0pEZ{#6SC|~rhE8ZkP3#(BHSA*S3>rsM zgU%)|-?b6ZJ(Yr8ZW4>Azr)O4-B-A83av;qSmf9w#StD`#S@~ZNceID!Rv|Bi`HKX zw(o>I>uFEEC0|t)3w=O!^C3;|3)T=|N$BjWxJ4Q9YlSXoU&W^3eG~LfJWcF}EJHF)q=!NGQHFRlnH6UY-%xr*}2vYohmh z7Nc(oQG5f)-Q_A-4uJDDl?FyDEjblQF0*na14`B;LdoUXpsZGm(?L3&kuqV8j1~5# zHf9ucD5;FW#lBIXJ&Y+DKS0AKGzY8rV9`>?jH2(@Gll&SCRUBPmvPf5O?gM8;a+Py zQ;bfB_?i+BQSTxf<+er`kHRl&g#H4`0dKy?ut2b*n@?ea&!a2(k0W4gz_%X$jdkq< z2Vk`}W(2U(7^`-^>rr4V_5O z-wgNa4*Z=#nr{Ubf$xm}N`3JXrwJeW;tI`uby?H?|AP8L_FwFne~3j`yO^7ivHY`+ zvrTo<0gV}*Um;wMM@|~2u-95R&5Fu|Obe5^5VTE2rl?52(G}0~V5JSX27GD+#k5-s z91cd>D?#?4P!+P%foVMQ@go%Y!5HxNaZDT7(@9Vi?j1=q3d082@OfufWaG4MX8)=` zW@YBP^08voYO2Q&>gJGoA-d%55Uyh(n>N|*n^q%-nDIN* zik0v4bO3&k?O8(+`-M#q@beOa&}zZWTf?bul2!d@8q1C8G2pxRC-I1SxKx*6(zcGk zuQbu0%fDsAEgoA~w@nR88C2j#J}3&*uqFI*EJXyA!x~+B^&GHBCD?uKLfaLx+*Dti z%FquGOwHQMyIdE-w9Gu8SHns?KB(|9nPpiOAzwk*H`t!Yrst`NXJDtNXN?GDT_dbY z)P9Uu7vC;@vvf-50`kqMXA~rPeB z&xRvqZfs`m;!5_ zl(;lne*b=w<7oN)ak0UJ5QOef1C*GGW=L8L*}U@nyW+*h_f>Qp4|sV_1ml;D_G@09 zMgL`VFk=p@Tdm$pxLM1{9acJE|7;<;>=l1g#o|AKk~SgOx7Ob6ab4hT#>%&fw%cb+;SU*;R#{W zyRigLk_Ki<)c8zJf8mp86xpDOcPUtIv2nP>-%++x@i|>O-EMKEYyG62c$L(2ZI`3c z7pX$t>k^}yb=a%oz5*?*iU;MU-ILMC%P8aba$t_%hT2H{+}m9^J(jGb@`q0--&i}J zFjthbA|D2Mco$KIv90aJA^x4sx}PRiO*q}$<&VYHQeIJ)>E_TL6PH;uwVn}E+hP&Z zPS>Gw)UW{gpYu~;XZkSnt#fcfIvR*X(qTWKF$bK2TIFBP5~ot11}4(m4M7Q1{Wc4c}*}2MMBBY!pg~5-B}xlxu+u~3&dLVe=Plx4s0Q0PCK^nc|4 zeUT__M1k~Xg9|$!I`EXQCOMz1WYPX@XLt|vS7X+>e1yE? z8Ykv{dHE{<1}M%clJI2RFT6u`8I!@%z_whcY?G~0QiZW4lr`lVO<17k#vGK)x9NBH zol>HFczi8QTNKcYdE(Cz^W4}z@!&AtF3{A|zOx)>j;ruy49F>4Xaye8Xh$R>jV(>^ZW0)8^ zP|>?&csYxMUYM9SgDnj4k>ZuIvNVQz;#7@!nhg!z9xL6px@DWTw#f?p)MDS$t*4V| zvy(pN)?LAZpHn_xN*~wPwO_4Y(fn`LI|{%9Rm-*w5`{E`=ZTQ+P^vdgwo`abn`R;f zxR=oKw=iKY=7*1V#JE_z@(Gp?_uILP#H=p2q$(GMsH}2Vo1LVA-LKs%kfGA@V=Ub( zPy{#Cdy9o2Y@rKrMbpG7?Zg|K+trlFrCLx!of8!E7%<|z;+j{(<#amPbK>Via%jqemrkcKDGI{g#8D-l1T!xs$@Ai1nFYD8 z0RX{NjY~SDiD@S7x?Zf<^3L})vms*R4_6U2Y+Ktoe^j`YZf%|uacXJZz&lKo!dxLL z1<6sHxQQ}8u@bj)q6{XmhOIIj2YlVgzP*%nJ3Df*xlO?Ya0EK_Vun!8wE058DPY4R z9-?YYb6%^eIE6447dn1-r&O8&0O)3opA6eU)5uYJnVB4qE3WRrLnkv>-|>WuRg}9e zmT83z&dlw}LFxj2$-9jl?B9#lisnDkAy^3G*Gaon%U+8?^MDZK#*bwG!I|1;Z);c5 z%`hO0p*U!Q_Ly2WBJe=(P{u`2!~uO`w{dC*vH8P(K0hOt0V{9DL9LNvLg5|*3755D zsmwW>H98%`u4Phh$H7>{%;Q0~Y=rHBu7xk#@h9>T11Fc%Z5=bl9yX?29jEq$qKrQk z8R68XQG@L)DpAX~50cnH=}#U1ey4+zZVu#CaGR4P>+KTC%BC)Go`YF90x~Z+|5YTa zoxuUlwow@b)}u8sZSx8Rp}VV(ZL5iHBad5EE`-3ABB!krGJKC4l?8RYt*b;cWO{2q zYIq~mq|3Pma&x$Qd*8v2+j`2TUnm5wi=Qz+_sIl-0fi*~BI>!lJ3f@)^kkB)GdHKN zFPxy^f=t`xA`M56T&OWiS+{c+Y%j;s zj>7)bc(3NIFQ=^&+$?1Tk2{8gI3WL=rNsw`!Xi$18JLGR?m&4k5jE-OM0u&Q&w%g) zx(9{EmFvB@Q^8_^pxvZWLSn1Eiag!wJWh;iqpQcj8?7NA0rF`mgG=S%;Y|6UW|SC5 ze#)kqtMbplUueKl7QxcqO#*gwLQJl-LhSQy-DU`{xB(Ksn z79U*^&UA7f1;r~_FsJ(bs}RSb4mD4$5Xn8|(0Oi)0(_Q-b99tRw@2q~UwIKijV|wY zFi#{tg=UfkCtV21N`ZK#H)IPg8T-U<<4|w=n>2WHd%Si|lqUmr_A|yI7}Fs6OMBE@ zQq0uU?zDvg`7mqme4?fokdQmpH?@$ngT%1CuU>sck@IWVaU*}cQI*2CDY^BJgRr1A z`Y?+8K?K$I#SsjG3CZgW3loNUc!78%f2Mh|s`OUHiWYZ|M1)+tu>FgN6xpA#-|>t? z!SMYqoMAzXLkLB2NkVU)Wmd7V&uYwMSbwV14DUT=5j>Nds|~_3t{>at^ddSY&T_K1 zv(?(#YpHdVI-C!Yn~^FMzafkiM`yoapz+;McnyLR_Ch$;-1s2u1bI+jPZoWYuVDs7 zP8-3%XrB%olnt0{fDeUkNeipoptJ6TJgGmIKn4UOB@fcz<@AyeDBSRQ={^sN+fVY} zU>)?$RSfMyUK;0~zU+xUONI5j61*a9%(!YDZ#5EFJH~z=Mpp3nDFemYoSyNP0ZHfz ztvtT0E3(~7QG+shyn^(n_GnI1rj_|pDi|m zoP#TK6=say=@g04%_uYY*_A9SprIQ#MU&&Cli=e_G)qfK>JyiU?`9+GuF?=Nivf#% zjt8i*A;Eu)qoYc~b8)amc#m>0(L!+HN!obgDJClZGAwj7EpNErqYCBT?n@Huq%78S z%hIWdbXS|BFfdL`QWJYAVOd9uzQC|Yuc8@J7EQou6?IslgrptCZtXD%3omhow{+?? zTp8i@>5)!^Mx)gv%${O z#0HBrASnVD)%iq$L^<-#qg*pE2+j%*`|y0KBUw24VJ*lsE+9vAYkMG$bxn;S=Gi`u zvIoSx`OyX%h-Girdw8K^cpZ?FUJ3lj?~=ds-!e1sQK^Ow^$<>-(=%65&e^*&OC%6x zG3o75_|Y|!I2INmv2I5hU`G&WRoW@2pdR-@OMx=f3}lLL*M}6uqa&SSBN_-92P~oE zA($!iqU&^DZJNviPI&$_?Nnl$;CQWI;N*wUjtAI-?ofDo*t$)ySr6MFtlmT}rM8dN zFFWDaSGYs>o`xx_sR8)san6}BgziUq3@xp;O=wSMO3E{>=#(^mm)F_FfO4rNm`M1P(I*PiM$Nt zrQ!X*8P9&k#D=k^+9vaIiC2w=A?S7u4WB~xA~tB=LLxX0=OB+B!~W90UBl$~#_;)P z*p$C$2AQ&|qWmpio^1d%Lx~UCezaqTnhJiumHk{l9@|XrXNKbXCY%$vUyR9eZj%YkVlLC#uCb=?btl`3qK<{p> zhK76sr%-4TSo?nG&S08C6ZhRY3gObtq*T=XS*OD=NzNY(HgjF7of&Yr!}l&ebflcI zl67swQ;wFm?}CVm!@r9$$>btL2-EXM|`gJsh)_rLk`6DP0JLP}QxmQ=Jc8 z9D&$`xuV2!ebkKuHrK0w;mWLoMizp_8)x64sc^CU;VGUV)I1Wd-;0fePpaJ{?dTU& zI|mcSh`xwv8AlX>P&d3^Hx8t{t=dvA?hb0FeR@zC;Gcwv9~VgnlOqI#3Q`>7Xdo6i9}y(Ro5Sr<;(Vmmc|)&Duxyut zD2_w-q3;oQ#!v5KAXMKjf3^=@D>2fXzC0Z^u=yewRyfg3*(>vH(Z};*3bG20{T7&= zi3~EdRf_5#ckfSvh$nHN#T6^&oOy!9rVt?YInQDnb`1M-Y)mSbTpJ@{8kMNNS^E>i z`8-n!c+Zi8ce)yNfym>XiNs!In>*yq@UW_t=073!YnsLfXFL;6tE-YR5tDo@Ya~FX zG#O#qwfvT4C8yGF@rCZiA)L%Se(f|hyo^{!$(||Z-YwkmvQm0w#8!+tk1l1i^F*O# zfiz<;<@)#`pQf(@sWF}24i+26N8*=F^RJ80%C4raqEVWfl(SkC2-(h115%qa^!{{g z?_P=28JH8;76t_o-6j)pd3~LiTw6~*ovMVkMNMZ_uIi45?~ZeaveVP$a%3sv(_=Pj zsQShx-g7WWS!z&Yl&q_alN{<72jeO~R;BneHm<1oGjP`J$@8>1<$x?X$ymCFEiQUk zH3S@qUd>-R$n;sfDTm-=doClsMv6V-#h9cmWwF+f1~$qi`*T{!#d11c>w$5Ko*`cJ z8N!@}AjCi8gJO~|$zfHM1u;@msu$5zBVq+s12oJW|E_x@=>P4{e zYp`EZ+O%w~N(sDl(w|QXkY0s_?Qq?6PosNll+2d0;cr=%_Mt}+yur>43l<7riezOt zFWGT%A_9#CvBi)St;&Bid0L;qYdo1I`^|Te;n>ElKd__E65VwPHPX%sLM= z-e6~!TwZxKyVA+8@6MJ1H#&CQHZ)WS(^k^n4oykY=WuNuoBMT%Gv@X=RO-!JsSxHK zF3Kvy-M&C?fCSP31(m(b;L)kw)0j8ESn)y3RAr=pK7mYr`|!b)#sx`BqlJO7@}bmI zOTHKE`rPIqRN0QF7+;!Xt^-Lq-bGhp%@0t+56p{$BC?j`k>wXQh4LYbpx)?H! zNo1DI46Q}lY1gP}Acx8p*=TCw4JR{MEDDs<`igFUD_^um0wwnOyhR=l7aG8@!XhxzA~v80j~1Q$kkgnAEe7gNC0wl6t9Z85|s$ z8U(pekrD@wV}CkR|Kz~0+0h1+Z%6S7m}EWAP5Bz1s}%K6v!+AhKNO@HK;K1u)kfuo z8^0+CI4g9Q^C`G>PfO-$b0Ey8<8TT8T9VVVYd=#Y z1n-N%MW>ve{vle6(>l^ZFa4^as|W^XI%T-kCAM$dqF9#8z>}}x)qk-~RGh|b6}s6J z&uYtB5QSWTSZ?~6ND$Fm-}?HJSX+p0lm(85GVK)4g_eiug7TdxLIJXotwkfvfoPt~ z1Fb^j{-kA$#($n+jeRXyHa-l>T}q=2->mF>i1ey`7`3jCpTCLgO1T{)aah;1@0P>Q zA=5P`ne8oW_)vN}Zk|dU1XFO+CI8u3Nxj>30HL1h=t%obN!o%)81T1C-2osU5Dl`& zmH1o%ECLjuT&*~2H{Vukv~CkpQBGJV50`0$!vC9zY)a z_;n@?p3wvU6a~k1Me&sa-|m7IAPLU@`koS$6l+j0(#Vw|H~@99{p%W%V7RYq zd+^7>=Mbh>W1o88`46QH&jkJ-IEHPbvrt(dAkU!c%Wp(`Ou&v|cnpd(b}+&5oA9%z z{mo<%73#FRJ=&Gp#q+$kR-rxT%vK}?0q8}R(Ma`GhUm&V!bl6;M$_F$nx8^YX2 za5>o0@|&o7%R#u=DC_X7QjT6w*Z}wjHI+PJb*_-tBvPsb-pXh?rG65nhOR&y+n}$N zZM8e(pLVcHmGKDOsOZy7yLBM~#U$?Mkk&!36Qe~pau%Hr7)iLFaxtt05^LG4kT;DOp^t;y#1$%QIl>WV^jiHW(%$TW!&Ue+m9k7m_tu1X7bKbL|XQN_?) zh;Q|e=z7-Un}H;fVVFI%Zr{sAoXI?Ixv;`!n$UF);Hw9*m$W36%6=E(Gz-ZSD^d0Y zW?Kf)q)g-qO=A^engzr11mln(xP!3^!Y%26vd=;+tuHWrv*~Op&CVll`-!py?IF!> z8KfgxIOG1UZ7w-=7ki1sQVBo4P@+3TCl!K5p%5NRNtRA&j61}}9n!sswDNFUxXmJH zL!q$V`CHo*sCzJL7VoOd){_xcWY#jX7qe z0BGCS4cNdfSy?LC<_hDxfwPa|FJ;pyF``yx=n2)e3FRHZ+vKrUYT^sWxkI%vz%A*5 z|FXwYB8FSyvQ)y&753YMw&~@qM9?l2pinC447BMGl6QhE;|)$GlT=FkUHBlU)Y{-x zW`d=ZhglglQ`ns=9Ond%;RLmu24O=NgmVgNQvy*vfxSdwsg!~ztlkr{@%1023T^a- z+;t0Wa)rh7gr}Xs*~jtK*x;5(K-<M;1YIFEYW!i=Q3WWyF-`u+(s#ma=FlGw<4?(KcviCjDx=CDb2p1qN@w>mW zINUuXF)ay^E&V-C-_yMAk}WpS99k&w4FB*E`(!ri|K&rcwCwjrLU&eO_Algf6yF%M zBl~uW_Jf4}K`rJ|auKKxfaTz-wi@;oDwNdba=C zBGN82&9|8DOXgpM()1mpuVZR#ydvuWA2%(J={^t=yf zt^rX%Y_w}*5MC* zJ%x>zUbn4q;gE>J#(T=o{)F$(3`&y*Fy7UOgOxNveV14dO~n(}D253`4bMH<-8GZ` zc}I$K(9zAiE*=PV`iGkDHiYjp1p&|s52vi#gzqnM(uP|=$AIz%NxOS(MA36+#4KAd z^znP+N?(qwE6_{|PT{&Oc*}9PA_D_(xZ{yVJp)kN+xpYROxth^rrI3^o zrac`!d7L=XXL>MyUqAPeJh2Lb+tNXLIGNgDBgkBNlp-+&9Ik>U;S3n%Qh z5dM9DUko;2L2)D`FpQ_9+6@EJn)i3K5h|KRr&xg&?0P_Ry!8!&X1npJLI!6W@`4NW zONhW@KKuD`k!zhj@yDrNlL%5>0?&Jlx_4I-+TNPt%c<_Lv;hixltajL^;OjrCGTZY5A?YZfDj0&ku*1CwJApgD3>S1dI2oRt+7fm*T=Pax>TEKdseW zB9Wis=)!G5m1|U_dw`Q zeZO8JEXh`;UO%mC(qwqZPfu)Sm2t0rAd@ZT27qAI!mC{aPtvOe^w{*1DozomajUnG zNWs)a$HUWOX4TpKJb$Nob)KH_KA_7$3^Ug)lD%1s>29sb0N8qv#9hh?Z@Sp+e}=yK};N7}46`n}{>Zr?=Ck%>y3t&CKTNo_$+ zfZosNIu26%P#6JO@J-lu|Kcp}YaXx^d1kUCd~2-f+L-XGRs{)f0zdMQvba|HeNQlc z6-;Fnknl#n`=_AO8qX z%cQLXyqaLdiE#9F&Z-{MsD>J|O)W<1s0Jm-N~8@x0=?g4q=?1;fGd^q`$a^}3(#Vc zEi53A;uB5gC_p&t9R@xF3CQ)b+e%4Lq~y93zyIgRcd|~uX2hahJQRX#e760!XE@NB z#Oi0e#8mp9rJ*TAsAK5VB$?+Fzj;buXK>~p;?2pTxpJ{Jm*?2AHGkJG243l8-G#}? z!A#bY2XEhpSqgmz3lu?_mU~Xma{S8(J7BUN4#laPfu}Z${=9FBJYf0<QvM2CC>MvoRC`Tdes#QogUV(TWcU!2+h$ zBRxSFG4>Dd{ClItus6VVEKoPw6!}SdEzx5sKG{S^s5F9EaC|2KfU4LqWf}5VjnP4X zIVg;2G5(e>lUQfJ7-pIz)Kg4YljcUOX7rq;kD1iSm6^o*TLy*NIWHM&GD!LgUpyxi z#%nKoreuK!`2G2POm7!q@U1_477OJf@Ru2ZZ%3Nw>wUH7Zn^y@@|Ntc$A|sCzt137 ze|P-1T4GL=p3jT?-zn^$U$#D}?12J;x(bGb{ys=&6yuze&NhMsTM+l}1kv5I1jC}a zBz%et;(d&BEtCV;gE9V&>-!Cn1IPRM8QjW+efn~pgaM=JkY#e0@(gze1cgBGtOsE# zOS4&EV(B*@F!fxoci*sG+3uH-Xf+-u`f<$Eu*3#B5}+Qu`2;GUh%O8*)tpI|8|s9X zwn$qWf;NpES!E@-zBa_coIkfBbPu!)fua0#GWGjf{h1S~-)_0vV4nE=Peoe|}Zf^!9Y{GH=*QdMlA;_zt6kni&kDGk1%pfyZ+xlMby)wz_ekG9qynVQ`* z8~Hc`9_SX@*dUZ^t*S5`)hf3jIS~q}IbX9x6j<***Q9QuB%NZ{ zYm3l4Xsq=f+gnjM0b8IS9<2+`+APg8F+AAQBHI?2OaPYgmg>J4=z)}!^%#*E$m|+| z?|y>*>)xxG?vfVRSF4(RXb=##|9OvE*u>S%#n{yCALNQJsZF;pam0V_!KSGj|D!Jr zKcjpz*?MZZw6$<)J19j?yX=SwGxUlKIWe)7jHO#{)mKd!14U2P^k`B7&j+~RE!4A# zZ6`eC z%XCNW2VCKqpi2bqUnd#?ps7Ll1N9gN;q7Ds}p8 z&q6uVr|rcJq77q*&CTTY!GT=!Zr=6tRJa<8+r~!Z0{o#Q&Ag^cv()EW)mH7e!s?_xFI~XpIF%g+3~^`*K-XuCtKCG3p7TWMc^%+ z6^6X9uZbs_o+gH}YqSxjts?^&M0>Sr92)BD^>z#_xZK&;G|PYfGz}tFxz4JC6fJKc zUo*`=Kvh&W|M}_IA!Z8Kr2;zXX*eW~O=uLh|85nuL^bA==hJ3TVamJ2&=7Apc1x^5 zu6M#CV3H|_S9_XG-=@_k3Z{NAq-@e>o|;$GMm<<$!t%F!n+Ob#F(=)*X0;x7rd-2u zK4-kS&bE$zn)#*06Z^Y|+{}G$Bk=68F?{r&ETh9i8$hUmky zO5P`l=2Z++N}u{zoB5-vES~VT*OoaU5*%wfVG z;)T^2fo6dAR(*4vkd2QQ_YG%d8{4-Sa4Wg>NRL1+4V8(ZyZ30gX8$?;xW|(3VReNkV!5Iu#21`l^w=ApuP&3e6#T&R)e6 zx^vMC-}i62R+`fwvbIia{Zb7njP?3f4oBXiH@+)%w+~}sNc70N;}_WJ>Cg3ZyWxhT z?4G{7Nck&c;B5)^LI~8NX(lcbVO6Jt9!e%UBF}rQBb9OyMeRqH0O7(1p@<;k=oBA% zS0(GNSUAggpvLq-N?j5tEd|an`CGtw!HF19y>EVl=L|$a1u%aUA%oJ043yqcGB9mL zh!Jd%vu7aUoKi-=Wj(GlejAqFq6k2WP1&NnmQ84WB>Y!U30K=9gZkofv3&sx!~YB_ z{~J?_jQO8%5~r%~xX6Ug|66l|!Oj@>(3Pp3WkZbwo`6?9yIO%L?W=t-8e^4ZTRuw< z86wUnEExb5=^ex${b01thz5-<`O0?Jb(a5W^yBt^(*s0tzLqGWHzYWQLxA8#a^nXO zE5dtFKu>(+Rip7A+kEzizU(=_93n85WSBx{VTEYEXO_ytx0gswA z-X3YAQxA$zKHB2}mM>@GU_yii2sS+$u%V zrZOLojzZT3eQSoDi&t`|NeZS6h~^rV9!1fT+Nd_lnzvGvDscwTtSe&-zpR)#TMT^? zeU);H^!xQxSBu@YZ1jE$%C(S4hrj7jqj(fENs9&3cY~TU*#&wTJQAEm9a+=uL+0&} z)yPNU)v5QtKumqYo}yj3bc(x1F;P7@=Um27!+JErXw_K#rRy;~n(WM9<5zkV49Pp3 z7~?M2OdroPv5@nyMn5~s_YjhMvXmQ)tvV|(wa+gP2rB1N6uoaBxh}L=g<5O-Va^xo z7{;m#>(~Ep^gwTyYxJWplfr`p0pb78CiUO+z<&?}&Hwp9)y>$={J$(r?Lq-f82zJM zzq^$|MF?3*IaRg?0#jMo>KHM&>Z>6Q_+R!^W9{b4j`^9<^0{t%xbE74!|>0m%r9dUDV{?$cWk*V}T)!KyURo zK?jj;GxMI$UkKZDYgSia@To%J)K=QO#>zO57JjZA+38C^o*$D!0mRZ+zo7 zNwuEt1ZqkN{TPRVqXE8)n!o#$Ag2T<*ojF&*!{U0)D#YZtw#(b7x*;6m5Ur5)Ba|z$7tFE%kZvfp4 zjnv@z$C>x$ljS6HWn}=B4l~5-il0}_p0iJAfKZ0C6k{tzeOGyL7{OX&a7aE^U|xJz!?4)fSd;r!Y+v7Tw~$@H!gH_VL@qal@*?cb>_{%otDivN z5y*0YqT%VZB&AT^SyamvG8~#0xsyvVRB(8k<@Nj5Ok}VQ>$FkkvJ~P|qt4B~ zC2b_QCH}DK+(F&twEa$&q&#|DqKnKM55~vv`eUB8Nce|YA7~-CS*oQ8%x+@F%5rmS zU}=CUA!Q2`&6ByRsS-`?fxzZSW^0(W@g^TE^q@`6poHD2v28FIY}NM4#Z#7Cc0a7PM+Y@ojqjtjsn8N<>=vHtMzbd`mMnsb(G6% z%ew|7l6Rot84YNT$GP4B#*#)`^2`bbr~QneD2Eob4d4{g*?(d7VdMlc01)EF>TEkb zLcfYk`%Sl8nMy4b_Nd1FGw;KFMGX(i&*^Qc^w4PBt!)U98?O8|L_DR-57*2NU+u&~ z?du`!N4$RK>0cJLS%v;(7~|6V9CZHqL@-+LuXCJ$&E^T&*ZlSl^B;BTZCo847-har z|F6ioPD5W6O%vd+0ID4sBP2w#va*JW!;!SSvC^8vh@uv11W`n|F=OnCgUR_7H%rq$ zK0W-HNj-ZgUaT>A&f&@XVc8N2f@_>>aG9U*^u|5w?*8K#S{!cn zUM6a$GJfv6+23UC^!|V(jqti4c<>o`r;h6 zAv}x>%fDTW{mc@FU?FS^$pXK>m?g@no-)W+kX_2tkSw5amGn25b2-v_}vgizolY^h(mG56$O3 z@00yLt0bE@LUqz8#d}^3wKb?ulvx!?msy2p!qy)_j-x(oD6M;b8n?@w%8ujN5Hv~K z3V6f)+XYGCVzU!iH98L|U>(hd>ZdS^#TficP2f-s>Zc`PT{v~heX4Lai8)nz)Z2q< zV=yjN`*Eh@aVF&p%kgpqoizq^hx*2q_$6T}JAj(6&>V}}R~(5w6}etpC6*dF?oxJZ zi_PCQCtJ$;8Gn8zf&4C2O*ThL%GPA1#-?a z&yeR?Wm6>E2js2bzz=|HeH89xDNWl+B z#8Ok#5{7hh;BsEg#lDJ6r-~1z^~WdDzrxNoDps7}S8Yw=R~*FjpMm@zL65tusH2&= z>wkqlssDE&#F%Bu+=7yf?gG^De7dEs%=W@fc(AQwWtb_{CQNb0PXvt%)Z|KMWXfSl zkZ(|A3{D_0e}-V9z)pjoxu6{)wJBlIV!)CvryV~7W@j!hHm_$5L5xsR$%ct`5TXp$ zAoSs1IkzL~)xOhSBzLu+r-4H1YyOQUq+^a$l*j5e<_yVF`4iM?P*+roUE>W z`5m2#U^8UuLeM@2YMuX zR(Lgcwlz9yb2+DIuLaY*w#W>NGm5DsVa! zp`N2%#$Xgnh6dGFA=fQ4)S(vyBzzy_K?oIaDI6`#cxN!=_wx<*jZ@v9rf`R%vQbE*Q-p^&gvRxbxjav#sArDHG3i>^sI*{mIhZ|f04Ikh*b~;4 zRYYBzi%fza$gM6iRzauEkng7e+!4$h>ZaM605az_X>QRN7p>yY8*3I{P?LKTHf}n< zmw$6c!K(%#=dXxL@oQo7e-Ks4o4Z*#n*FyUCXN3istOOtU?^&JGp09(BHj}U<#GZc zR<|ycDyp(N+eXm%MI*1|?8T@ch35%E0Lx4*_55>?^~2%=+vjq&;Ry-Ea&4A0EDLV| z!Yt983h4!oQcgsZv3k)*l_7 zTvDQ#AN$Y9+TmX%vW{p!g2!hqig#SOnxN7iLY~i@Id1QwqovatJWDZKl0uo z#pS+ArB9v_F5PL?$#U`_XPd;^Z%79?zW-#sR8aTX{a-kW5<{;>FaDT7`h}mwUkBI! zjH8y0j+S=j^j2SKPkK{3>wly@om?E9%w629&0S?@XBB6qm#3+yspsTp#^t7I=V@i> zX=bKoTiBOanU`3>|7{^Vb6FxA_GL5L|GyPT{#P2MO=VC4ml@elA>9sD1S|-XDuaLv zS*R8nHG_x@rwx=k5H?KIG5(MYF&=-V=N@frM|{u^M^tWHp25BT*^a>%git0|X^8<|4szzjBK-d4&&Rht$WvIb zp|t6`NA9+4wlkWFVjag#Moh%Ir2Uip2i|zVE_eIy$`F#(@1x8rP z&`H9(A205qI>-LD+azLLeochO-8UFPPJwrj$(P6&G9qE5^9kbkGKA83n4p&bn`aJu zd8Q2;W#c~pwf<{y^&bXFQpft=1}RNVU-2um!!O#QuVoVyoJK>W)@qoV)?hXKYy`Gp zwwNs>bz`qhVgB>GWlLW5?K)v8BZtfZ(v2kcwSz8Ed15z`tK~_)>uesc$Kz8$K|hF{ z@z?;sgr}A4K#EDOV3W{pv8}Isos0W4-bAVwJzuE-U=nsP&-F$4Ke61uU;;$P+hxg9 z=P+>E8)nASc2-QWmigXK`|MwP#q(hpxVi%ez>|x9;)kz7*oy7cV;qx~uAfo$mmsPQ zT&+0VN{yidRgNyH_OnxwQEad4f$*hFXfoy4&0#qt@+OEL?qL|WudsjR}_G{$W-!+x)SRYTJ&@-Z%`t!iv#GscQy_^nBbnBy00zbF;%T zhBeOYSmUfwvDPjrF`{)aq6kSd?61a;iuDiUO|2h)2!Bnm+gv8Uf_sUCEiukfktOyF z3_Dxb#f-l~sEnmClp9(d*FJ)^nEtfcWe!MFqcAx#Hp z<-Y%6&iIG>{JPb~(fJ=DSS@f_VnR73yU+!@@zKkOuEcU!qnsHIdTR zwdJ&4#lopw^*&WiqSD147ASj0xzCU0@ji4s{?uJG`8k{uQH+_D4S@;I|zb4Or zxaiSfylWB?2#EaG?D-$!9(5OMHFJ9>yZ42ZjCr*oy*mZcFI7Oe$3c}s*ReAmrP)aI~ItkBLg|Cq|?pfIMCgyH0H2E!DJ=L zE79SM2}osuyg>X8LN0IeaZUT8VzxS&y*s<$!#DfJcYXg}aHyW&|G2~oqA}sXd1u6G z#JL}++DL|eQO}PVgCC>SHt5;OfexcPuV$}FgVC^^1AX1peVAl4f$Djo`@OxrmHoFh z*FtxXvF%|{IES$E;_cqJk-Z`fUez{sY{Q=ch>mXwQNEeMCVjXt5(&%gZg?Fc)IqNL zTsR8bG>z(X+o!_B(eUUwR6!niUb-|W@dTt^m9&{_Vgf$mhYQ|F<%5<+-BB!4$f@xQ zt0{B<8Eu##XBNPDlTJLWh1wFM{e*A}2O%r-aCg;~gW^{$559ExirVyiwO-0&32w|xtw`}+Yu&?{m2${IdU?+80CsH>D%?I< zRW9$LUt5@R-)}Vt=)yNc$|~8E%!_f@gYUM2+3wSgXsDdrpbjUJ;V9cjBCpewZRP34 zV1r^#$rL)ih}CMb=d*~-@f zy-Du9QHu*{Gws?H%Gl-*spAnSI84xz(3d9{XGI$xHJ1Rc<+L(Yp4Q5gppf8^l)x(vS{w4AqQ0m|C@7~M*k2tA zPHO_<&TGRc;``D%RojCet&pnvkio!AJkkCxO1$${RDxDoIRc>y7`V`^5>b1zHwscw zWsfZALoRth>{uNYwXMtl#n?MIXZmexyXj8SaXL0Sw(X8>+cw_Vwr$(CZQHiZleNFK zPkq0As@6VL&tLG=9GLgK#<H3B_^k4X8^3oU3v_36NzXT10QJ zJrQxcxx$Ib6BATHB-tk1{ai-|TN9=k7 z!MpQp>4UzrWKx)-8spKMEbx#mrjV7pV=qtY3q$RmI-_3leosP-qc}76zEYyE4F6sd z!X5CtNlYUG5)x-If`{cswSisII8VU7dd*B8uL?rJ>ZLuTOJ-prrMgw0glga}iFlIi z95t?JM}ZUJtiExmR~9+sz`3^{b>0Y`WiHc9QboA02#Gb5aVF}{R9Eb4QGn8lNUjKg zfka3G9dZ-$HXXr73}yra4O`^dQ6AtRK)K+nL3^X@%$`wlM$lsrE9#*kHWMZ=Ca6Jw zO@yee1jr{f*9O(HlgEeWyy#KBRs^0(b%ymKNM;e;Shr`likU;4EY8bq+=XEe(On2h z`cW>Y)}ga&ogh|D4l|Q!1?kh1+JoE5GGZJZ?<^kTGHiND6ew zK`KpAjC)#MbJTog7vY6B11>z`&RB5^q~=Ufb*w_xgqIW-jMlx9xxnUSzNl84<}_4( zfYd>(btoBVy}#$ZOh5y&xOJE8TU~$s%uJ7hwC@iaXU^5719#Dl;$n3&i^t=z+LnSB zkv^Yq9{?&C;l?ILW|ng!tFBF%dK(YQ(MjgiQGt?X%uS6}58xTxpFhV{(IL$3>8jEg2aJ$pgt}bxs-#Ajo(E~V$+8;s%|La< zxR@pu;35Xy+Z;L~peP@fq$v>5;wbP+Ts(dJkJJ}Ju4O|@(7`5; z?oKusAJ;zRm~H?dVRUN&(Igs}Hgw%Z<0-$@Uea`jq-ar_+|=4gvQQl@6b4>Ap>zK+ zTnVQWi*Saz%ki+|+6d3I*F6uNM z4fM>}^EHV_TD_bEzP2$?k(mOAz$`^CR}wRivEHf&IX|q@ErPv%hBk{U9cueX;z6BQ z+%YFr6#mSlCf??9p)G00rx=&8MQ$`fZBpfKrgt?JZf*Q?OwL&D( z(^}aP^dGv@7ElbWtsLepeljiJtl#O#&p#S>gG_esa-%Sr}!q0PSJJ^TA!uC}CZo}(t^ z(h8pKji;v(F4t3r*BhJ$8CCbDDVur!TX(zRgQ}Tb}L5Hn8hX@1kZ`pr_Z3 z4`&@XT%z&Y3qT={7hD!0q+tUFSH6x48tFBvGw$UO0U*HahM_#{H^J7`$xs%Zlm$TW z^Jjs5O;z;d4e}btS?C97C%$$Kf|A@G4SN64E!_2M$5hV>%YF3JxnRgvC9JcAIS;3s z#)O4J?;BA$n|Qw)jjm+&y!I~51M({u@Uvd`S`gU$<6j!cZ*r4!AxTl@E} zdAlI93n~BOyQ)G7a2L0?_5Gf@X{+(hZPMe7ALEuH<(53<*n%z3xgz8=hraZC%_{Yd zJ2V&I=)CCdty4|CZOp~pWh$AF%Z!<;O9n!`xGK-j66*i;2d84 z2FdU}-?bd(|IlRkYljQ5YLxO_?(jNAIdTcDO-l6-QSG-!rd|pai>(6Q7{p}-$emU1 zbMU-K6J;Dnz7o#%q~9%yi-OYVUaeRsDd5(yMKCjo=@tMn99FB;Np^NHRLcuCJ0&}~ zF5}Iv8Ys8IMc)d{;H(BA9F_a`C{gaTJ-H|;`jGCl#&<_voVx7q(1##Y#2$+=!%#i71y?)v%BQ_y|S$2&{Cb2c)b&-~r z;nX3RFG>L@45tKWQh&r*by1E76Y`*~R%($!PJCZ|UrV$qVT8r`Rg4v2q#<~EZ^;tA z?$~#Y-6EeF(-m|3(4tXy(ti!<&hOCP)2>6Se+;rJdBe zxyDz1g;bd=61Q${e$%&QQ2bfk`ah%qgAbcKc{PBLp#)Tod6%Z5wAVw7+%VD-plwUZg{8s{O-xb;tZ)_jo` z8x+eU`KklUX5NIVh@lL2J5)^E)2(E`gjcap!kS|@qVc$Kvo2sd<%o)?&4#d-R=;ui{!e)*TdyN_;Ul&va!XOS?WS`y7p?pjy z5u~eFG;Tr&%VJ9z?BEC>${CL#bZmjsEp+Vo+$ANG>9QF5Oc?HVd1muz8eYbUvYgDz zqDd3)B5@w4af(wO`?V?^*o`g&(Zc7YxoaN0-iDn!g}Q{PhcHDyJ>|eLW_Qum>w5L> zm7syq*LQoVQ=gqeGM(p$aGuRlp_5Ls?b4ezhq(Sz!9B2b*G|J_^dG;uwxzO8oQyiT zUfrJS-(_*R(hu_b!qtb}j`N;og|G6WE_0$T1zX(VSVlaGW8Y*ca0?4?va`7Pcs%0C z-u1&nqX_VgZIkZlsoZ^0z6ixH{G1iI2SA?TUJvHb;)Uz4HYXJ1CT+ytB0XcMu-M>x z95>2aY*2sBX2)%G6dRbtPanU*#jYKzF8tKOx_KOMpePdV+w5fBy_hm;*A(=aoi(%d zQcHbogKVl-SP(BDvKSLVvjjfs6{Rem?h1W5nYRHYcI#cTHK?bspmZE@T!|S0XTKmX ztNpFKm{7yTd9}${xG^;sFNoUD>a4Y{?F}7l{Iy3Q!7lyhFXH;>&9Bha5>RGwsICqJ znxk^So`l8Wm|oJ{2gg6J_D+icl8|rZ?bo+;CEI_NCVP zclkdeM}gwjzo6hxt2koIWj^(4nK?0;>3VRVMU)&9(KrQE7Ewul|JS_r{3b)&HcaL; zsh!_8gEyjIKRs>+*mt3)(UWg_gpJ)F2f(sC9EGy5rZ%kR7&mC;=;OGahMqi*(l_ic zKMuBrcz&P_iJ@Ub8LC0(>a>>#;=(2~j=3$16yDre17TW6vDsxZJ&;-F7 zB;OXT+ohNOHk_otAKi#!0BoorID-7}NAjN;fNL#JYrSLU|HCa8`o|Yom(;E*NY@>g z8?Cax;V9TrOvn~Iht?I{)%uPpleW1fb~wp8EObsX=81weoB-NSFDkyM$0kP-+;Y>T z&jkdS6=RSN)XzCaS5KQ9I>V4nj};f!rSWfJ>j@Mz8QP#Y^oJXwfe2@w4hS?ID9L`) zWxb#ztK9)ID2Z)o&J@yFB-q4hV9wGyUo$yf6|v*fy{ z20S@4QY5wJLc`3Ys7gg6Ea>D(Xa1C#rLs?TD~u8vrZ5GiNrhkn;DMI4q50S5`RJ1- zjTZt8WG9YLjN?l5I{&sin7saO<{=NTv`EA`O)oTp%sKIDbjpj^*ne0A8eYj_N!yK& z4o^%^o61KGGh?3fe&Bpb#Y?VD1nI+*WD%_FR6}u$NrF*3St^HQ5nEq8SXYN;Z!$oZ zI4{~NLhC)a@N_wAk%A`I?>MwX?$2nof;#Qc(ZE*K37&RyI&G+EcRj@RHFQ}J|C{*N z${I|7{tQ_*;X(Z28op2W32nB*Kh^r2R-(!B@(a_^V6$`$nXYV1C2$RXQtS#uDy)=> zd_86a2IUk)1DU9!P@Y(Ht{$sthxGM_<e036J2KDWD;Z-mkcKTd1-yUIt5txxlCSNPv)bx8s;Y%B1*Q&o))S=oOXPBo8 z+H7;s;_+avaimewF}{vL!VC%c`m(?gajTaDx{IsO@J}ZjAm&3tGpMj9**}=^O=(4W z@N#-?!YsBn_xHf}T)j}g;WuX3MKZksdK(2;S1qo<>R8g!k%zK`f`R6wE~8@xMC2$R zlLOFgq4O^Wc?MsJ%+2u2e=tpM@6iLV*$m$WZQ>U5xWzZUb`qq2<%jy}r1{d|_%c@i;JH7DYP$34T=>%0{xsnDvaWyq zT1oP%!T#c-_)^y9-mv_<(Kh>t?RvRxD~aWKe5PwMGMO^3d9x}wzxEO);kIQ$wVe~R zv#ye8+>J;YhJ1ZOr2Y$Nmf-$nl5y_!&;0fmN;ymo1_%fg7YK;%Kj$|^JB$B%fiX1r zFN*Zv;%$KngbvaI`sb$sOWcM;Wx$^?JYEnxIAvMhSR_zr1gIZ)d=L$e%Nc}WX&VlX zz&KpzmKPpLr3&iit`utgw2C#2%W7`wW><@ut8Hp!A~{=WDO|N}swU#gDNR=&S6!P= zxYoE_o?E~`lL=7or2H+vqF`yrK>%&x8$zT;{a}2UPM7q3WW0jLj5v}NNbxL8)(?3I z+%TTliqoJKJN+^ye`3&rQ}FazF(8L>jX04pBnkrglhkV}omt`O2-2V_Ox1o~Rbzms zrY;%}Sct05JpUbfb??FUm{4b$2QOTsnDG~HSz*L4JP>9&jh}q*4a7gkk}M))DuP03 zK{D92$P!zJ?x|-qd>X7Q>pQd|PYr&fL*#|2a~L1Q>gnB8iptNek-5rFSk^xePZ9O8 zUKWGK1QrTq&PppY2rSNHGj_Za;Y7x!XOQEVUrDdj$H4$i05&p{92bebs4raCd?XZ| z>i!91eEO|l`Z9={m{=c2K9PVJhIsab7XGxFIFmN?3JN6d2|qU)JCB-4$k{Xxl;lyH zF4YZ*WKK^QOz7}RFhpOP4u>RY;Z7y&Mq$1n<%C@la0|lEtFCj2Cc1C!4^LBKbgzk_ ze^&{$XG$;HbEia{KU@(8bbR&FAu>rOQKp%TG_LA^K=(BPXo!iwTd346YL zu5^Fq;IJpxOO#-vLe`fGwbvK*u$-MEJS1d+kgnK^!+_2lI5C~d+jm+Ul<4c&uaM)> zf;=I#l>baYY{$@Oa=c*MQkzem=#`Zx;~Ot(N7j%9ZW}`jx`OioSVgJI8C$AK#ODikqoC$&V=*Z4V`W0Ib^mOHL34+8lq!9h z-%+$&S}GFWc?v$d1Bl~ipg!k(Eb?K!iMMx{fOZILqsZZjppKA;#5hD$l*4{}Q8|~p z3U;gRH7x7aNL2;O4P+@(XE*jQwgVz~d6ZSfrEU&DJJc0%=k8(VxtJ4Y3jMAwB-@+8 z^XQ%_?uQ$o{r6Q-?MQfSSQx4Lc*>|L?)(j2z{^QJ(}hGM>tOTNZ-(Ghj3#k>GE@pw4x6jcjX>pbH@BU`)^12M;Rh}eW{*v znbY+g9TxKD?Rj@u=(e|Oc*OwjyuG?-EX+=>(&!oyCIH1!MK`L$ddaGU_UfG|VE7HN z9^q!viLIPgek{X?ypaK0oj?Ln9S0I0=my#&A&+V-5wpw~I2*B#YWo-Y_{O3(RpKZ# z#GaY67)fHKA=5Wxs|g{de8^yik$!F$U4fAWGCPgN$xz>OXkgVTYq+r36LT76;)gR~ zDPPD*3p=MtV3nF7OgMCme}|6zmICh`06S_I)0h009kY8FVREkU^Mpf|sB}5b$rTF~ zLo9dK(6uGNb4xbDwzDlA_%*Zjmpczd#XQsBgE3r*6OcE(y2vOPBSN#c1_T}hJeI&9 z{h8{Vb%fSd%c)E*%MS?iV#|I#VSR0%cV{dB_d6QT%(Xl=Pv2Ba8IZF2aUwY84^-{@ z>ZjYy2IX3?3??RUjnss_*xp&@HUuagb7-ogRl zqff0N+-sz;-N4GQHf7C~HV=8!F-ct$vuA=i3kVA~u;@;TQ*-9Wd&h_SR_L-NLW}AA zy9Q&Jj?qa^4@RrUaOexh3auh-$Z~1_2$fbZI})yv9@2~zrP0OrGc#c=*<|)1E5pA2 zVv!ZR?U3aP&Ftt%)hP+>3l-$r5@NS0Ldk|X6{nSivaT6Oq#dfDsnqYP-XyZ^qzY6D@{Tf1H$JLIYK9fU*7m=6s!s`K*zIA@{;hoeH zYr+b#)lNW(`^U}AU@=1ji9|IOcWk;fW?@E}JDEA7KI}p~kW*uz%lGc?4vppCXC0Ye&=_wX+19?M?~)R_*nRNDAWo+scq;3B5Pvs} zEPurJ{(_Al5Ur+TPiLiVtw+1SjY9wWrLj1Xl}XRm^;+TW9bq&}t`GnC!}={+o-Eh5 z_ISTNu21d9)=oj?BS^&?M+h84UD(C&ei}Nc%*jPV)JZ}{$Auv5?ibU9?$&sb&d^uS zxxogaZM0PeNSTz;7}AGkWo<$Rw9!$J!dGH{Ff#L!kYYL0K5Awi65_bADV5*0DYxG< zV&?Ai6i^rTj+2r`WEty`AZV7?P7~Z#Z&T9&kU^K^>$g+G`AFC`3pXGL$ZLq_`7x%4 z;qnklR?79Sx#>eV|CrU&+T7akp&@e^IxKo-1Cvai*Df2q?6^bH%G>aG-&1;`@b(Ii z&*_CiNh4sA^=IDoLw&?vJ=oJ)E7){*m!10T$v&um3qxp%0%f%cERTdv?avd;M( z_|=>o4eOb+#MOFkXFnY3m8EnJ9)X*SH2CL0dHnY8y$Ox-;^4>wdZaTcP z1TWu+G%(ZaP?>nQ(5TUezV|?z{$4BdThMQ|s5*WulVhxSZZ|>k$DOr^7as71hW7=zWg|5O8?BZv@YWBpkUJe8F zsI~4>1=$cd&GYzrtGR;>HB|Jx(zTPQppv!$r;<`N-}*cPt$=C-g5B)UTVNg#%Pkq^ zf6s0w{c7kthBWIr^=mGH4yu+WdjVG?u8z8FP1qub^^4L0R9ite#fVnq!Y*R>lZ@3w zteXv9msmQO|R)RxLpg4;PlXWi4z%QCvk3n&+Ud)_$qNJ{-%_<&o*+6x zrLAZmBn-t%)*?24*t|x$?j7CuzI;UF9s)Ph`E>O&+A8Dv@zMQmo(XGcYOQ|gQfKK= z4)%aXSJfdY`KVoNiuT91CH%0adl^<`QzPxG+iGI?US*p??TBdn&`A(tO1p#_n>?pu z?!2XR7?;{`90h@40OhV(%LVU-rhF#6ss*kd;t_Fv3PSw*+3?KRQ$2*ct=m~FFq-*O zJqXu$BG}#hpE>fIRkQRX3)?eH;aU8O#$wZ2e_nZ`s8uYTY`Mu;IC(22yaq?+C3Pebr;kW)o+~Y=YEwNqD|#f>bG!-zhEQw#>8QDPgpw_8GMEm zMqW|OH=WjMxxq>822-SsXxXLuG*VLh5?#<24hjQ1zc5xSlgcyJ8oBl4i#r#tATo59D?&Q!LkSzy1d&*$Y$? zcm9om?S6yq{|jRxWNKmfkBOy>c=LZzV1Zj?9n-DxKkX1@kp?WoDDksp{`!dIGK&1v z+h23!Xbc;(s>{H5kxn(q)nTM_e-uWavS68*RTAWO;IKbzpK2LDII6Pd0a_nY`-$h! z52pmj8?QTQ1KSY07f)Gvf-KMQy)}`K0!ns92}*J2G|<^h*-THkS%XKz$%6L`dWL9@ zc>t2XE0t$@>om1sjVK~rqAgzhifB5-85#mKDVw(VB5&T`)O3xS1*^>ja;~NfI#l*> zFpWysVu3PD7eClbi*-A2xIkT!j!^V8MN)W;mI_B0l8f%1{J76>_q{;sWRsNgJ=F+$ z#2qeCJR1ra@)w;zf%-ai2t9vLswYYxa$rxkb+$SL^j@jOJt=>bYa*!|QZE2hzqtpl z%&x{wA*Va-;x(mfn)<-N-xjpVCM_olzg%64DH*pfx7Ewm8PbVR!*KW$81cBeXl%H) z4qE(6-2$$kc2j6`-EegVP$Uv@F`34^Rf>($+*XFVkMneh&ENFsuoQ2fwoITefw!E+N#kk%+Vk=U<*p)dSsk6zHetF{cFJ?FSz^X41)9~di$PCldNVTEVUSBUxYexPkEt<0UyDeVVR{f0$V8Tbp(%a1_7fFdE|Jx}A5_7rOCy4fR{x#yarhF8pg${T3mlJyPWQ4{hV zHUG;x2R>bUQ+-~5gUP=nTzy>!Q){b#<7o=&|B9Z^!g%U#ETnhmhZ9aOQ4kV+ex`V%N z*9AE!O-VAjk)WAk;xFXT`c2D4iy>aX(IUD-+vtT8k#yqEA>Cw#P~(!@6vw#0ov+x{ zgiad@KQuuxezhUAL39)jW7&jSBksD>UQdi+a#erJ5(BhfzU)t$XVDD#Va7dokREbF zf}mV7b*B$enc7mj2!%}J$Iams@thkRkX-oM>4DC#zntCiz z&DbKIuG;L%`|n{b`hVL_FID*%%^C#)L-48Z;rH5T+Q-HHMAgMpIW{~ zSDkvP?<~ev>fCcS(*~Q%A!991+FLn}Q;NKl1Ptl+TbUKg*c3ujw@$}1`+}|SL_%_Y zsrC^B)>OOhqy$_XL-l2wlnl}ebUd+R)Y=lvQLFTs7O`my)SiJNeejW57P2FC7XPW1 zm_yIY@}aCS1prS=CMxZTx$&TJLDg^OuvAjBtQyyDb=S6BO?&S2Du)}OsttwE+_MD^ zz~M`sVO89r;XRug=)@W}{_r8n6>^q~r{pA?Ma#IFRm6ZIW9i)oqDtcGnNRb&9+__U z25BK%9tl(jDcj*z0zdtcu~*NNe`E`yo=q6I&_s1lM zu*bAd`2D_?)f1kM)8VHPR7QSq-n;}dI(99FD_q4e`N#;W63U*LfIosP7_bzq*(p!E{P^deAU|O4 zJ^oGz7GOX?4FCC0h+5eI9ONDB40SF4SxprzrRQXjJgG6w*~xpI(bUhMsn#%O81Oq&pJGeNe>@)Ay?cY9z zmaKseuQ?;B1qcO@9S8<#t(%c6_FIY8=I=`j&>IceH7M-07L>x6E>C`GJCy>owlhnV z?JE0DyaJbV4^-S!bV)O|mbT7PD>#TEVkwK_C(a$dpgrk#k7Ke)n|-wcOS9#B0lxsUjtK&+c8Y8coD}|Qc`Fx+U6cC!7Gif+emHMBzMQ_aC5n3o%QAH zqka3GYQK$``z9K=F6aikqc6j+!Z$@!*9SMz;|(0-7d_8>NM-}sO#86&XC3`W#H?j=mZ@8*+8b_QJX#;^8w3XoCSXz^F5N~=_kJ%CEY3g0iss=_ zXp&Lbgl{Nx%$6&a?p@*+9r>p$PTS@IiCE7qAIEtJrv2>iu0zMRctUEDZk}`Bv1FpZkl%wU#KPM=mFW^bVw8 z5{3ZZML|jmF4yy;A020&QPboPA=CFI8226Y^B2zijo(ercUe7fW|4#mR7P2V{Vyjh*L>{DGry~SKdg1+HM)DN)@G$HSp4dpjc z%r;|%j>y?^Xu1b1X*RW3#Zzw7Q(b~@pe9z(tfVJ34`p*Er)D~*svEIpnZJ8BA`4F! zZWjkSlG)mOiO2@Wa`X4)>snElS4>b#bkMnos#G%Qvx0KKQ7e-wI%LcD(7_DN3`Cd4 z^&>{5RerP8(kZ+QVe9MZP6O@MYtXs=2cgzhkK$Cbnr_xP=z~8JH=!1;2=r1<+DA49h3R8bTIwrg>Pn_(dH~`Fd;@ z;>}w`M|OqQdPQ(6R$vS@piaxThpfhx=j@-UnPRPzA}!PTCkB0$_m)J;o%d-7h*eA< zfezzp+Bu@~i>_62$Tk6gh{7gR3(PkqK2LuTW*u74!IhpY<0bs^H`AyyTspK#{U{Wk zB!|_`BlmWH*LKjGH+pTnF(@bUYMCoL;l)L4anB(Fy4t2bu`ELzxEb-o(6AL@w!5&j zYG|hX)eOQ$qN=Dm2WuTym!D5nGuj66-}G$JbYVug(?X`}bZ;7y#3JmtPjM`g8WeD2 zlOjLQDks}0H~}s3956%$e3bFay&oacGa9^v+(mF7j8uB{AJNQ4z}iu?sEH(C@BgF9 z-CZi+PJGvT5aJb&-2*W5Sj~X-@tugDmG#F)#3K?@ z`Lno)=O;lF_?bleCyrxYbQB*A;?!K2uKgAR~qG51(xu zcUS|x_(&31X7DpFVXv)^r=V@xDjvyZ)4YYp%EXa0S=-^>N!8NubMs!IG4=Y6jz@3x z)9@k->R)hHMYH*HT8V`0Ot;0=&mmNg4vD{RWe)hOCZ+D_QF~EN-&ZA$imI+hXeMm~ z7aQ5fbzF|(5udiJGW>sF?$Za00U=R3vhoAtt-!$ahJFm)- z)}F)0@tDNMp_h|UB-r=?_RsEzE}ExvsQ|BbXL zuYDseXkQt`7sR^!P@s?sr1(h&^5BhsM8tFA@n;yREKLiLZPKVm5-+SIn1gpeK3R@& zyNg)~U}2!0duD90a32PYzdsM#LD??*T2cPm8c_B)E;s6}r;pApC$=@*&z1)wZ>x6H zzrdUb?erKk{nPYCS_*lAW`((Z4EAcXMkc2Vk{g%$*Z#eTKc2Uf;G%1O()an~GvP|A zDveI(nh8Y_!)P*Gn5;H3%pl&QE!d%tjhp%<#i|W1QrWM~v|EjvsRrsu)eTuJOdkCz zSB=<_Aw`MYs%piFG%pA@s*nC{IKi(*T~sLIf{&!_U@<;k2#>?g@$##39^R$h)8p|OiPIC)v)svKT@$i}w`$0fc3;juWTpUUtmM66PaN1=sY> z{PH^xRwwA_#?22pm9?YKlWgcyd_)>2a#U1paW?6q=yiYQYpc_%&jmJVNjVepk>6f4 z^V!4^8U3H^{RE5G74SCRi12tTZn#-VfE%rziiG@ZVGd^k@w`!ZAzkcj$#^Mw!M{Sg<=GZM`&laIa%~m<9xu5qNJv+ox zVSL+5!Avi|7eT*2C5m+~oplL%&>GJ*m9b7FENPJW;8*gjmN#RG0}5Qaf+KRZ*)4`8 z(=^_6!koy|?~`j`@NND2ZSo2aU+4;QL1brGRo!CAzk0h7er9miSc$@DQ^*l@FoZ`r z9i~Kb-Dlx@jRlno&_~r|!`YF+rTd|gw{WHs1!^Ja^VpRg#}d+_9z5%Y zYBk5QcSLxH>}m@J{EU(J{7e2>iM2B+JtP{D`PQIFyd54HyK3q0lNXm$SE$O))D~7n{xdR9v z^*5^!x)yO$Xm8L7BN!nWd@jE#((m8{T+w5a96ik&74#;;+dz1P*Hb%QyIV8l*euPM zaySYN=TY9-)z2SEVg2%+TEf)rDzEW_;{XpIocz)*2u$ZW5a40_pOxBOwW-v z(P48GKZJcydn=@mk^NfZdL{f_=%*o3?Rv+jqm zlQi2FOgM)~BA8Y%#SX(f9M+GclJWQNsDCD51UeR|=ib53gQ1@hmI z$i-jnM48rm*gY_s&i6Uj)bC&aqi=}jt;);zz8$-MH~Gx}xyhFVSU8y4=-N5_yLTY` zhJyaR|1{&@J5|2YjN{N!L007;>;L-nlL54CAbj~16!Nd5Lsx-qY|<5XM;r3`ckF#Y zBKm!PcY}EYr++)l_JUGld8@A3=FRW(7ED&MFx-7zoS%2Te4H|Q12m-Z{cW(|A!Pf} zlo-vmOH`F6wnJB^kte2GOep|sR-{gAffX$Cg_^YzX-cTL)9HAQ{49VsVtzbj9Jmg_ zK`6>YC;xN*X$e}3-w|uOW(h3n1GcwCe+FzNM6irSu1cg82V^Ev?Ye4*n0jH4G(zkB zp=+T>P@1@~1BVC*4#3!cDV38dNQ))+)|Z`ru!fd)_1q{T=DUjZQc5xOH&pHqhvL77 z``57w?>ty#2vNs@Ye(DQprR2sm#8Xkl+!`42L*54YlK0^#3~*@#~E(yKdrtYZ@L#N zL92}zVprG%)7!0PQnD7FAhiCrB zAyq0dm%En=ILX35-Hl?OMlVSiChqQsA#sc8WFF3%L5oubJ7=5VQz4|V!n#i6+}c5y zAY6hwX$7tmzzr{-TQe zpse@G?9U$5o+M%0=~MjvlOd=?Z*uo3^HuQUbp{wifZoY}9}M*49W11cx0RU`BzpWI z?j4d)wRho9>pHQhST=g9SF%bbD+KO8W|^N%~<%%He1g(0oyxVs?cCNWIZw;5Hky z<#@DF)_GOQ941Y0g==UVidXUZn<9Qbl~mRHUKaB@n&aIyd3m!J&r*kDyO20ruMXW7 z-xaeFPsK|@aqHh0-^TgI;Y_2E_Vdm*rvhU(l3P~DwlQ!qB|*uyxO*2@jjCKM52m)3 z8t&3W^2LZe0&j08((T?e+26artslg*yqn>?6Ggjz>w5 ziyxZok16TI&UMln2TEaybWyKbO*JGf{o+Z-b-DspexlcNT|wn>=`cgJ(wRWMcp6N zw%`S_6q^{awt6u##2W9@BUAa-I@u(@DHkvIeUD zxSKSrh3;Y0k1m(*su79?soG#e+UVPvvf2wrsT02yRx1uNBVQax%RE)_50Xj8WukLu ztkXfTP;zB;`pS|6KAwE&e73I?YOt4P9GzAoFPy|pO6}%9EcLO1&J@?ZF-1jY?86d| zvalY@^&iXq0piM8^qhV7R8hxHyGH0u#mBwW5F@AX6mO1rk^+Ti63d+z>_iZyY=$W$ zff`=L8l>gJoqw1Wdx`w^%_#=zu5pk%nj@SwZNZ^x5f>Poqe7wGmelG7ej@jHn}3^K z5Hyu72YIem8E>dJa+NU}Id>Gqa-B%bDG`e7odbeGDcvfFz{b*Qi0SJD`^aV%chUHy z2CG9q&~iL9)nH{2Fbho+#MIe2I6@rp6b1HwMd&HR!0IRrCWrbp$2rho7L20^cGQW% z(U6tfhVMm(_mN-jsu%3>M9z?>2+bgnMZ-%*!PXV{&ISg;c%5cnNY9XkgXHMm5|Cf& z9tH{yaWAnQy3PgeQK%pWg+QRADE}yM6O1Z zuSz^pB%^+8Lqo^4#*~*S^WLShRLUmHt`NtD#6TLCp{U3f?GZJL$u|Q1Eoa{38#Gc+ zZX#P9GQd^1Ys=Zg5Tp&J3_cD=lO6E6?1a6t|DYZT?c~vkI}8Q?tcTu=Cvr zCjBIHo5jl1Lq3CWZEz&(m&g~KC~;2a)|G@xonEwTnI(YL{#H*ubAdxc#ovjWb3}1Ure+YDO#P<6E0<=k4mH7UaSLQ z5k_70C;`;eEvKoGWDWd%qbW`s(s4U=JJ!W|49iJAu;>R?K z85DheZo}PhmKi=JrcuL~3Y)eK^Fu|Ug4GtNXZ4ny*@aUwvVk*9FMKqN{v^g16cQP% zh=q=WZgL)?3Et=w`J&l5_+w;R%ZVcC5w=0m2QU+D&JAnTDq(N2KG-KIlloqwR3@?c zwh%f}R3_yKQw0`h4Mn^(yN}()2kYhY?aeVztt_IY%_oN$osQz4lZsO+@VN^6EERho z!UDh5%~8C<9`(MBDl@#v)qHU#xa-dv5Jk3{m5Y;=1D_QpDCb|cfA@=cE)O4SjQFLNy3x!p(ZYxdDORXcX|7GGFhvx?ano5+HBUdgVH)6W;Wc8Yxp=igUg zoL-^%zdS!<7>UEHg=E=NlO>jShS}0tfmOGq1lGoz+k%(C-#3dFdzzE3dv$%5Al9Qy zO$Wz9?7XXxpFL_92c9kTnB{sfK|Q;2FO1&5ZGL}rYHdfE&{ZUW;izFPlm3!2ttC`Y z>K;3~IY!rbna~?1Z*b*c)&a^u%U8fIyu!>N2ZYmeN72}#9g#`wWJhy%2laXiymT)? z7|+9TpR7FpkM(VrSv^08zI_i+5rKf{|Fb-C2D3NA6s8zN-k-R5J#?4 zU-GECcK_j7c(N6<7xHnrv0|u;I&bgFI=+?(#&+Q4tJ* z{oM}97xOIOOo@XVma0pj8$cjC7S6U~J0$Awv@-LkLddNbd5_^ZTaRp_d7;js_VjRd zVyP^%(6Ys9;-4pELAidktYlHH>i63dIWZ$TY5sts3U^v2(vY0oK_OR+w~y&1Q?Zg*(zt8~4YG0H>6{7^>8@blC7{JSBclssDk8x zP!4vFF(Tx?6&z3ysp!lii_4JFXdClWsHV1(`@%ikF6Q21S(E7VM>)#&R{1sx%P{C^ z8fp>>(3Uq7pC?sbYMgXiKLGy075hps!#5T_#88nt9>W*B#AJFV7zWac{QqI>9it-; zw{7oEI<{@wX2-T|+jdg1ZQFJ_w(X8>yWi}4Fz(*ty=R{fHL5<>A8S2p&H0-!*5maB zyUu(($f5;i%6%Du9`Q2aH^p5uL(6O1YJA1T zt>@+d)xtDnrKx7l$AEG}Y{Fdh$#qvmNy_zl9kEdP9b!bVDD!cYM7Q%3ltf+GZ5up= zx#~PagE{k)AvjcSmxp}6xxgf}DdR!$v;>$-M{{!2mxaboYpK3BK~{}2a2S30AzNH8 z29}v(=dx3V^#V~QO7WCR0a>JoZp?24Qm`wBrR596Q~667oRI%->j0ei)`aR78=N_W zzAz}I5eoIN%2bGszvBHxMW*d+AkgP%X1hFoqW~}aOp3)%E;xdUyhU-6$+VM{;ov~- zGXR>ZJfG%k3E(W0We`Cve%1khwCwIxQ=Pu>8&;}~Wc{m2TTBcJ9QCAXkIre3Nmw1~ zX_J@6t^&h%_-W3^#Lw73 zww}gN7fr@SZdOL?_0NLhuzeOh#)6-K?~?1*Fo@Zz&VgOCA}JH_0lx%4D@m0eK;mRU zxR?O)DXpg;Um1iz+c*_$!EqGE6E>Jn)>w#(Qfo_GGkJbmwA%OZA59cS_BvMZ`YeZoJ~iuL^@S!i>4lriP)q~N}iC6 zE(bQq7f%J3A>%>{4B`q%tTex^Y3j|bRYjOz7t{nIKgi2@C=nb8pWdNX?k12jxLyd; zPgaZ!(KY?L7nlmYctQT1MkrG6mS2a-4KSIn+Yt*{~#(P0kT*p1p&4_&*DET7YaPU2F+D7)a=n}Z&OQ>*msK!c0M>a>yB}Ny#)I#x~#z1 zr*?RCNNM{P)Y&878X=(b;i=52Ad|8{omj)g2Fq0XK%3Y-fO8sO7*e}|u1PP@?cBnX zYcw8M%7Ly~Tv=a%w*MHknLsx2YPfTHn~ zXZkJEJMNZIs1CE-Z0VL5q9Fq$!Uu~$Cyael3UlMHh#r2f#t0BKVS9PlMe9RIY+uFP zU2+)k1^5hFr}c{2!x1C>?w)*7VA{n|Sa@l{J`Rr`$K}2e>XHRmi=puERiwTt!Q2t? zw}1xfIm_hMnuS{ zy?FG_Tsfltb~ICNs>IMASJBOIz%0)4!nTU2i385@;0|cDIATY_0{wl+FUOy%m#G8% z9+;0w0v=S_P&9w=!6DS>xOz4LI2yRV1-C38#IIjkLQA;-08@)b zsC5i!ZL2Zwo27xv?(5(&yDFUncg&h=m^P*kgA?- z{TN#Je-80>IlhmdlkDM^*O%7`OWx6Z!E-Z%PD&9lxI2l#sN)7prrsA*eQ~97jvC6P z!B|vI@`%2rRVCz0tYJRkW269J5Uw43U*e#W&?lf3Hlsh()hbD3V?ExDDH!S^A~)A!+sCa|Do z`}@u4l93%2WY~`-w6!(+cWI+amg_>)Zlo#by9a1x{0Mm>=aZBm+|h-ki8|=9rsuqb zJw6{g|hyGK;nykEG`@QSt&CJ{ww2_oVmTYg*);yl?03`$w=u)N>i9jk+jdyq6RB0Hx z6*YkMMiW=o#zUC#MloEL2uhMl=5aUW<#w80TdV*3@%akfYs4c-6j&DUJ*P*4p+24l zA9=$0ZL*Siyr}{cj^2-cMk=&8&Yqy&TM$qbjv@^5;SY0~ZD!}SrQ#CsjL~XKMWOQHhx=$Rlh7?x3i8svtk_Gn&?$8UogwH7 zjIngp9@oIaSg}oU#}i|E#Pv9H1zv~&!{)@2tqYv5VwTBjdc107w}BxpJ0{u-!Dw7= zKZmNGtO0DR^yV;bM;U@YGmeH6<&~R`cqd+&ZQk4ap?A>kW!A68isjY%0ePzqDsNqA zE}3m^mkc}+CY4hz-GNicPdbYNXNs~5m>0< zZtQT&z6cftQ1g4d6xmDbUBtirA*Fv*6B5VR%fH5 zg49cs3(g#vSYMqebM6n!CmNF{!Pp1|-iS^^=ELw~Zs3RLF1C993+}KTjShhhMaV=m z^g++8D~J}MaFlg`HKIilgf03rMZ;QXuMf|U{^SzlUCBgCO89yiU8SCa3y4?eU24aN zqDcNa#38>7-m!)ya&|tT2W*5^%<6 zFc86jt~!fm7B;OfU%fm3B-hKoY}wb&I-5?u2g=#s%!q%ZG5ilMrh|)#le6e|l$@R8 zf6^kVRivD-MG(G3H9bf@Y(^sP5kMg5#b#(?Y#`!s4XrhpzP%n}ig-gt-8l*D3QdO1 z1rX#{?M_GJzfciTD|XU;{thoV(WoZnZz+hT4$V%#O#kY+%DKw%`+C2(`*H7%Ao4>1 zGa(RR7-O1ev1etmWZAMzs}sK6mN|+RlXjqI3_+U23NaWl9#Mq>E`+c$Gj<7J!Iq)D zv<|3Xhuv;i^4YMh6v1kFb<^3dUt!&1t0sp*+?dzQZm~eLtzZ#s_q1mtS0_i6-h~-x zs~eup7>?aEOv4A=)2w4u9v49z(7aWFw8Mj?AziN*=5Fk2D%;BIXqT7cB zwcA4)sN!dZ@(tbKR!!WM-7`@J-QG*dUl_}>OB}vs+m3h8=<9TkHMmOtIfj6{4J!0j zjD}|_yDZGXCx1g|N_jXc;%1h(@qUCipjf~%IS^rkSq<>}4dN;&fJDg@SEn|WA_I=u zB8GK>_c%jJ%>2gmuItj@Ci&c+LVsBKN z=uS06H8-xTODIwfQ}8hP%#tw*=MwFn+6v}ROw?IjjGRK%7#3r7hF6ll5^3R(og4nO zV`ar9n*R)s@4L&jit>qSHUa3^L7ht z<5Ijs=x)`1v_S>7RuHb^{Ara{*O(2Txvx@89fLXiA~lZ0+69b=+y~q6iY^T}SW2gm zRmnTj)bevIrq03o&0(18WKHqCi;(b1|Cn_bRbVjZ84{3Z$!)J%sE0C201T6SS`?chOXTn30;N zH6jTEY5K*eq>2`6T!bk87W#7e!FL3aird@cI0|a4F0?J=vDfA}rsYDx z&tt?3>`d6-J?_0{oT>MJ?KCRl<1*8}OWVqKY2*H%2QdE?KKcI^DO-Julrem#mmQ3i z^|eKm>8M;q$|Ldu=hDIh!lognjo*qZi<6REHRM#j67g9OS$uE6UkanHPes}DUjkTs zX5Msjj=QrzzwYnR{XJ-o;{{TL6yk-@h5p98_Ob9RxJ5bIjI@9Vt^8bZ8xjIksa84f z!*p=oQF-Pu(Wv*;?1BXBuK_gNU?-ex^e{FA7o$g-lAI_#vY# zhsYAKF>t}4u=*%QI8lu_W*D+%aUoZjm&a>QAuv&>%dQzQG^q>=Xv7MttI?=Ew0lKj zq^QUa7y$Dh7>-)HD7F(4(&cHxCI!e2m0&S$5&KjFlYSk|l0=vj_L{ZS!Fo{J$i9C% z&Nt`_wlcO>S*&y?G1N=c7_ngLUEj6f+Ub9!b4OK zj0RAjOnVthirth;a$t$5tVy;4eq{~tVsqj6ncWV`z!e)!NUG&awlGY!6sgE{<|@C5 zBCyiDms4YNIy9VTNvot6;Eww5LXAafgLW)ndN7|J6wMd_4p`qjF};3#zPT~ztbwnX z!P`Ggt#AkubN&c9z)f&E83xuF5J8b(o{tKO(IEID^+@YKU?qAuFH$<`5~vNxJfMBe zA;um-efWuD`e?Vq&mbMOZ_}^q2qc+wfefs3N&G(k@u)q2jK&-EKlgI3w~w(v-<2}-TW|1h>^ahQZqg>M zCf5H~#r%(TT5|H`Kf>z(e@@Lb(V&uue1QuZX!{Go@cq+f^(ojAAeQ~eCR`hI=C4v* zp)o#BaovG*1Hws=ko~@YBzc;4uC;7j!e=;}JxzN2@i0A-em}mh{qsY$E?pR6mxBnY zAdE2zubjL>QAI{)jhkmLV+vt|L3&`@7-C{g@getJf*?Gfg9LH_!$5t$Dx*LvMfWg5 zlO3hn(tbgeszpaFV%Z`-_vQ?)yK8rZcAI3yV2a5`lG0JBl^VucjUz@9V}L_w9CwS2 zwbD9`Yrwr;sKt(*qJ<6w8Hq`d;Q$JbZ?Qd0FPe`Z&vIVR zpK&EjQyK%e1y8i$#qkiDy*FZtat-e_QRKY?Ta4e}gV>aNmj@xMTkwvG6V^;5|4Q(O zi^6KvB#9jl31q;}PhdU;xc{vByYK#`AqxfQmYy;tcO(qTnapHC6Og$jJDVE6VY?Nx>#3So4s_ZjdlymGPG~-8i==c zZUd`-@n_MdT-_$f9=doI_u9(o+EW(c3g;$*#-;Y=AZ$AM+_%9u`&oTs;S};qcf~8s%>#8D4Q6f=o}|a4gpvHE0-EUzD@H(c zSqQ3`e1cY+;84s{Dr5c!Nqus+I46y}_@t1e&of~+yl@A8RMHc%intNXuki;$S}>yG zPw|leajEI$CqkLGc)oo%U!jn32OVATgaXA&^kaB7eLRl>96 zr{nS^ZBv-3HnKM~?4&Q~(y^4ZI0{>1!*%|4x# zUEv}ZCNpMuI=r~(w*8~|u4Q%n?C1B2+WVtNQJ&PE+u}-8u_Rq`A}nQ&c&v#Imb<}Z zBYhOb2dy}n5msv3FC__6i#_`4HY;a4PJggm4Lz-VV%KIi6s!4y z^0GFj1?*!NA*|oDXHUMP2#4Z{cq1pubLaWv2q&m5o$3S#d_@Je}onMg1xY&ND zfesnTt-e{j2TX@FNL!9*FSXOGA=jQUa8VfP<6PNxQIyUCo2jfZI~AB0fj3-Y*+T2a z>^eEwKA(rbGF!RR5drZAB3KLAt~?q2X<)KwWqe_ihqRBakmTEf$OJyv2P2RFV7Bfu@ZM3am-8a6<--+8YkCaiDw zx*S7HIa^ zNHykDM9Q?pOs?OjtH)mKh#oSjj%U{Qz08@qAv1bGOdId&`A0edKe}tK$6npY?sRbf ziye3DdO9TpfH`Ah>qvxbcf*wBxa6|7pM?yORZwXhJE|#Q-6}xwBbln5xzZ$S zL+u80u95|0Nq=n8B+*gPEU+oHJM`RIB#6}(VZ_K{s==L!3e>$#oVg`n+kk%kmXNPN z;e+wA;sz4ywK?xk^as`K8*QwgncvzP``utk@(6o(&x6eD6`$oORvC16usZa0p(p;h zT+9TC&u5H14wd0*o*r!t6A2s8u^N=tN5Q?8w*70CvpO{v)NlWeSWn%VE5cr@cf9Fa zPha>{cONr&HTUk0(AmnmRncC`~INdW09uUHk~duIbl|eF+yAs2r@9SBh0Js3*J@dRAE+<|mYBi?38hzGtKG zTUkt_038gIDEefq4HM!_6Jk9|R$tv^4kfl@d5h^kNsLdskPS8U7z8%-*_iZ*IvXRs z(iE{;h1q}l(61(qjFVg3jy>ULrNzGNKSOxPR0p~}c=X2}CJFh}?_M`fR-wA~AA3$bMk zt7{7?!x+xP=nKOrKDL5c*rP)m$JrlA(S=IRhlVRM57 z@n%ac>r2Du?xFQ9y7_LZz~i20(=lT*E5Dh$T&J0d#$$Xh;9e%za(`fe zMrRRk0y#wpa1Nb}ieSJaBk4)13N{7}QH1=Ye3v97`-zMF z&W+9P_WbN*kr}2KMnWq>IV0^WrAB4LAB8|@Y6ArAC4t*gh&uk(k z1s0@MlF-k6)ZL*?I{vz> zle4J;N#=WL1i$>E4^s4%-ZXk!fObc_EH?Zw$YL7QME8*q`n>58b zE9Cp90*PU;<|PD9k0i9x^;I|{S7=UM`6w%fiT-Ga)on43`UMa{3=|^WcXcJlXKXzM zI>G3;Nt1*=?%sUPFc%3vn^r5#+Uel8=*aghKsqp~dL*Nn#^DXzmIJ2hFU4ZQ^esq# z#+ak|a&hJ|gnH`qW|mYmpobUP%qaxOTf$dka5tfc2}pO9Q=PW9i3;%TiqBe|CJ+RD&6A%&zCLgnCQ;T^ zhzws1>PBJJD{$3b+$iZ6-t;+$mkz0F3y;YMA}uOirFGBr*Am$Tw2~Vui4c#^R8r96 z!boXvG-@Ph=BuSCUW{AvcVS=WXQd`?{w^CqBAi2Q z(;D=;R%O97g0{jZG%QDz)Ssr(!=xzEJQD%ZpBwflNT+YxBqh} zy{8SICQg?+$mCUIAalDY`Z>O&nVfE^>J9J=U)RKj+iwKML%ZeN7F|US4R*MiZEsHH zSHFdjNL_O``i7;J*=6suAGys$!u79|-U- z*g$|FF-tf*v*nAT598>=?k&jfQ+KXIafpJzKxG7sII>A<>`TcmPF)`@k&OUpE)ArA ziXg_`FHF^pXLQt3qlE{nbYnX1OA+M^Dv2&hKf%Fp-&wGbAy3T@&(`0Vc#HI^iDV5k zFFF_DtfIhymH(pHMHnh!Lc=2Ry;3d;$ji#eZy8%ku^DS?NMN%bSh=n8w+nkA>q%}5 zSyXeWU|N#;ZD>jG24?cd)=vF?I8cB}swS(L#wU!OU?%(pu1D%o=upxiC9C2K>t0x=S4$@yVL$iP?Nz*ho5hZamQF`DY&-uq$2 zgS2VeJe@>wk82(-($hpr+Zh^+TL0{B&AbnRDh(MEWuPEL0BD%E^FD; z>BarV&f;ogSpujpl7b8-p)HvgmTJNCRr$Kr6w1`h==TlGS}qATwzD?>rP}Gi#9&2a#;i{fI5p6va$GE`UmQ-)iez;vJ}qw^syJDj z!}VSU&$K!%*S=PRQyia9JFi18j$RgmMaMGSG%Fw;(P-}_Ti@KxDXW7TRm)dbi23cY`$cL@v z3NNNK=Pv)bSco$LQ6vyr%R(US{?#PR9(OC7bYxx_m}nd)?p4bhg6ea1#!-XWSK-=G z`>2}RJI}GaqLr1xXl=|fis5Hzt*plC$UD*qCNY z^7eX)p7)1NEUYG8mo9G!x@!9jMV9!8#x3n!gg6CBD)`ByRXa%?&R*e ziryiGC&-b{8{NlZElaTb5dkexe+*-L2DErviDUK{C5x1}E!HS@Z%0zAxEdIr-yXr$ z%%Ru@C6|EJ(+UTE$f2wxMGr^pM6#kGLjlJ{Q_iS_Q5kvUI9v4@Ll&(UgVXtI$pIQ) zlJ2-+#6|S>7f+OBM~wjHa({qJ8&vc|3m*2IaF&HAI`8A2X2cEILm?=WW_}(lViPeG zJzy@NQ{s-GrWC%4ZqI-{#t>R|zM`}qbtXTyqx+I02-h9)CkHe>wa+tWxCjQcc#g zx(EFA3kyTar?2I0k|mJA@AJ_1PrmR9#~5mtB9WAj{th&ZIu^s!8mFlW8$Hr*=K6%v zsK3JhZX2OEX!O;4n`;f){bhkNX9no?fBU!jdrcd}ADSe2z0jcr6s7Ca5PTr@*Uh$k z=*>Os8ktUAIv-oen<=(V*&v`pZ+<)ER}kKZ?IU)5QBd(Xop+-S#hF}_H=#C#QTI%> z1GMBrv=o9i62@52UAI(oR9yho9jru9Gkub-G@cTmJu07rfFZ;%xCB|r^0bYL? z@TK7*PiSxws*=#|5Hlk`rmDd)fDFkp6!jg#X`}ha~?Q z^%sDu{;U{r~MFF#>%r&ieW>o>tm{5$3$Xj1FGRake`e0;2Oq+ zNesO+PB|8YvLX1$1KF7p-e?C*Cw`B2<;+>d;w1P@3{joI97?1WGXsiMy^IU{>U>pL zICwvB!qlZu8F8A>QoN9^cY>eRNYRa0w-o25=-C8DDaZ^aK=R$H{S^ za3Fe?4724hT+o#*h#=3LWC!1d@0^q@n`#2Kiyf)XE5(%__%B_+6-W|%M;DZfR`bPl zOB_rdJJJ;!B%3VN!3S&_z)S%$MUBs>Rrh<`7m+-taF?i(z?!RhKF3V3ZVvFH)s7Cj z17uf9paVY_Pwn()Mwx||rrE2!0}k~L%F(Q=5aWRC;=nH!wu{TesPqnnZF4ke!&=PO zC~z~mcqR$e;ch9^+GRSVFBo(7I5lMZr2hPiQ$svgrn2$-mVy4hef}4y8%2}8CIqW|_LIwCl*TUby1v!xa_Q)#e;cOz{ z=xFfI7=U6G9W`tflr1+V196;n7E=9U3Sa+MOCcKt>mS%<)fP(T*kQoF&KLlOOA=&q z_Nt+~A#^_xe4iVUl?E#bgEi91nJ@Ui0MDx_gn1HGEqo@Yt8}L)POm>scD{e_SA>3` zJJ7>`0>M_q5WHb1mS~M7>9k&`V-}j4NsqKt@H9?&&@%s?sLndZ?1Z*WPE5_W8?IUR zj@gy&vj4Nn$P}YMYZkHDSb2Ey=FOK&5i%DW2dL}y3o$t3d})v7dWK0nu51P)N0=yU zq8jo1pk-u9M10l;e=oQ4?c4=(um2#@eZe!cI#1&*~t92A4l1k5p6KYU^>ua&! zV{&I*uu;6r64bzlPc&!91sG&%av+i7*EPX#Yi&70!^f^I9l@#8JldFN5$>%Q8nA+i zm;GRvHdG!s=i2VY7%1Pr_DIOL_JCQB*=4CJrUm4?_jC*K6H$|RNR4c`hZ_7!nDjUl z6^Td-t9@K8!JCu{+zF0xLoAiCWir(F*p)pKmvBpz#yGau6%rjGp^J-~Sqn7nLuDEQ zOQNL%tLW)(EdkBMd++3)v+iUSX}S%fx7aP_Ahw1E9pjqgCZoI^Jr7 zlU2OaQ>$02Ap*v!GMb+v3sJ60=mzFX85%G*>Fu>VC_x@P(?xQ!-o;{Bs}P zoTPxRDAhxj07PS(z_L0s5<4aId`E~#KjJddk|K#?ZtMrRhJYt}V!4m`*aOf*Y1oy4 z{R5#P<0BzaA>*U&+l`m`8NB?@x!s;W_NJ^1p8oNB6X%hwbm1?xrfPm~Z+5NHT! z3DYIr2^f=qGX&&;i45SvDu`;Rng6AaNVDk;)Tng~+#pI=Fj+IM1S-zGYOZ-0T%|6J7#>c_n7T7^o0l5r%OoizO=2heZLrBYXzHl=aM@N;JY8q2iGYwP*@5>b``d! z%a~hujT{~I%Q`IVCnmUWai7LEd=sL$GY(B{Mm9Rg&C(V&4b1IR6Ha>|sTi9KbWqMw zt$%S3OluYN&zjzrKHo8GPCpE$GEU7g(FvJ}Yc||vYAPn4hEcDE$*_oO{BfRu#Td5d zz6#ru1%&I6$c-3Aa$446;dDx|YX2S&A}} z%%X}Y3b1=pyymw*w?8l38*m@r3I;BBh?ve(4JLW&t;j(v)c0>V{G>$dLkNA$beIf26+?8#NRe(xA&B2zARJgw-4CzCs0_k{t&gg|hM=FhatEG)yR13%6e%zb+JJW4mE+lhzBluh&%2L>xL? zK@+MHQ?QhiIq{Y2;NLOXl8?P->zSpHSv;~C+vrry)rrb}a(wd>`xr#cQ|Q!mYEIEp z)EP!(QbAaNc=+TR?Gy1Iy0R3$<`4WXQ3;Ho;C2~E)2v61qFx;oKn603r|e79I;Qj43Oj^*xa&q zTTD)lOXnm&OYJkj`e2=DncJ3?uTiLT)xq;9(~wLSh)SJvEmBsOmH2a1dmR7th@;M%0x6JX_}yvlwIV_{DhQVmoydq9U38O(tO2$ z-S0w&aHeRyEKCL^6%c)KS9y^(Ft*XOJ2yLLEDs@+i(TIxpJl;hEmcJ2M&)};gBZ?t zNnwv@-SUYPxw|(Nbrj8#P6bQ9Iv*{)OcRVlKvtfMe)!fD#n#Jcr)D}Ua?dhvC$~V= z$!4PNO_G|vH{Hf&l2Alya-PAN&k1mU4neeA&RgW`=|?gtD}1}bzP%+_QcTrhl(%7v zMXH4p^onaLJ#`w;T!wEf@2zQ~rDW-^Gti_QnF<)Dew&=f?YDOS3w?S@U9!M&TzJHY zu^b}Eyx1vdCGDi6KnFzDgr5}firA#4btqw{uY0V)X;R+?JNzdI+r}{`=Crb&3h+1 z0@qOsgbc3UF}<*XF^0LdKUS$fCL&B<7+_nSIw#P&L1#2UKkph)LmM{xXxH&2r2AEz zXabu<7@qL#Z+45bg_$z~-SdoWOu5=bMxS5kh3Mw?H@t&{xOOa;bgV#YIf83h6#US| z+!VWL6YgP>CW- z$ayRG>?DwRB@!eLbIrl0_{%Nc$Tt4=Pbj>%_Ow#b`5zl05F61L=gA0TT{4ITkajyV z>8)g4A+2Lff*#)B*9n(iBsww)&@cWheElPQcN%Y^Idih31H4f>0`&RM3cBD4yiyp0 zV|dnS7*Pm83RMP1>Qc{WuHp^t%-5x(CAhibY=~z?fkHB%;9O*=g|XrrFGK)<7lfxX z;_27{t2EwudxVjieE}0ZdDxHyOP!L*=q-_>_8#QH;|oge>nLJ^cHW=kHt{!Lc2bi9 zSIdpH3Dvy}b7RaVX6hnQDGa?)4$PjUWT|)c-#K6(o|fW@QBHn& zvi`{ggMR~iwI!?6R0Uv%>aY$Dj2@nogVE?zUf~v@=1J9najo;COl%y;d}N4`S+2@h zdOveEWU&kIQfeGm$-|y z#^d*Cm*?Z!YyKaT`cgvv`S;x()>w3{P%+iA(X_r9s`I-BAc*twl|n+eLfTxI13XOC zH0%wMxR@y@{q|c~@!utKp6kGJs|mt=T)xvBT8ozXVMwtxk$m6FAb2iMU}Y|h3}8ER zGl-zAlTag>{}OI!K4$MSFrZJ9Q}IK)QDV6ev>I#OxoICxXg)f>P$nc?0$mivi2 zlN&|}MQusIotc}{4>`fQ_a}@M#vGzhmcd8vEQ{nwjyPyWmmhCNM>tylF`?Rqa{ zELftmRN#ZJ;^6jzpdzdf77~PhQjv}3&!!f#RnS$nMH0~&g})A$|(;mdw?Qi{0S(pr7bLkWM4wo=Ph zoAf<5X&+D=BMc#(rqT2EDe(_bsNPJDh}K6OqexL_)B{{1^w(o~e${sqES6lKAO1@N z`-6FKckTN;ZHD=8^_lN^P( za4uh9WvGW3+&5sZUQ{(UBFLZQFKKRkS=$shsqHjYgLU`hF1x4o}Ff1msOdG291)8)Pe@mG0?{pm59Do;>|;DkX3YfhY#R{|=u zStzV5M^JQEw~NUZ1<_3%U~px@gnub~doIa=HRl|Z&ot@Qd`C!%#xy7$329_rR&%=e zppRtPpddz+Px1#wyl}QuT$B+9#%a0SU}?3tu7E2ja)fQv=3?nsI@D?^y<*N<}4{*<(23N@jk1~fm+l{xcj{?&+Y^=tNV9F9}VYSi> zqc%t!gsow&D!~?}dSu0DliD=|xir*Tj6Mq3vJCW+`aBB}g5 z{jv}$|B2fs*q_YAH8-@ABd~}*;7fr-Th0KA z2sLA=TW9uFlCr4+B6$-^ltvVJZcMDpM9m-3<^&9TxA5oMm=BafJn<_QKWg{!J#~Rqgs8pxw;qNOHrY1UG9-WFk zT@P&p2ilRRs=C3DDECMVPq~vP+ey~Z`~s*jvstnsC~av$ruqCXNwQ+Tr_dc^EIOub zlR0^{-5@gr$c%cTrKR+U4gX^)&D6l6lOs;zMaflNP$iC$4q&M642p?tbS}`@#8?I^ zCw~3G+FfmvZS%zj&KCwR(Iz$Q>zy`zcZw+vJ(ejM26f)`@Nu!$l5K5Kg&B8)*y&10 z=s`j_i?S`bjJ+A~lY=75r%@-}`|?ilcBsgU5MuFo%p&g&# zh0XG&?j!(N;h=Z_rE7JRK8@VV^sr@36H>1TC2MMFM$!aac5gy(RSo0KvAxJdE8z+v zlKoL}FA9~tQi(}+pVCsWJa&>I0tVfT`%gpi91>5o83_;dKBt31(=}g%|0zf$+(?vw zjhcE>CH?3NRnIViU1WK_fRqcs%JJU&nDeD8{w`kxyU4esN(uJbmw9b zSh7rRPUY4X5jx5sd3^9p15!#SMq)E7Y^mR5JD7O}AE0Qd{*${SDU9?t3s*C)!%RUv zxwG+^j-f!yUbZD|aMb!54mb>Iz@$x0u8uTfV&5b@L5{{Y9mbKU5#sK%IZ<|_@;=ad zGNM%gvr|sKaPB10c--0%?$T5mUcwD`r>m1F#ie?j+-<y%Q{BCKXmWF*!?s>T6RP-VU}3Vk5LQQ@(Dmxej&g2~Qrz9-8VB zHZ=Ab#I;f(6{wdIhx7`z5|WPld{XXU9G_#TIh>}TB+Ix&p&xS1* z(0Xj{sM$Cn@j~O|{C;Iy;gHfjGbVM$7AE9ZKB3?Yy23zrTH+7waipwpZM}{tq{dDO z%J)#3V={ue7X0W8JEa(}$4*`qie8CkX+>{dHKVFyAskfv6%{P72xY+76Lg)>@rSqq z`QkUoRB9Z#K~At|0cxaOdP)N;8G0T|jEX}SV~mRf3qB)lMw2JMz!gz5mV!wiK!Vrc zw-vC>=l-g5F*SdTtJ;v_;M`?J?3>YTHP?nT>(UF38i<@p0^awUN8nWnvjZlGfX~<;ZOfeZCyW(?Y(#waV%)6)KYu1~c(icq5M%0O0B3&Y*p_(aBFW4ZY7D;zaqHq}g5qd?!@kyC6YIlmm zc}}vwi6tMe;cLp;2fL{+s8i@+K^%QSTcUQLEN-ip-hVN!c>Eh6aZbnw_}4!PY~8r| zQ%JUn!=4cxN;f?G5?=fX_{4>WEB?d6Wp~C$ivjR0!H4q9`1ynL1dpgV+yjKuA~yZ=A;qfvI=lHWvXYC)B~CA6$Toh zW_BETB3&&tKiu(F_CU*w8)a3mi7V|$AF>aUJ1zKwbBQSOFGfddZ?WHW(y^+gqH83h z0g8p#iiO;Y#CJyH8=o+6Y?yz^B>Pt5u{zxQn^wpxsMMhvrGn$ z4m@KNP16k0^n&z?-d#zm!Q+Y|C(kcIL*qvER47$3($Gn%3%wzb_8#AO&e$eNf9xtK zvi8kpBX?h}%}lUVnl-8>Art0YyM(?*?JzJLO;WMel1Y7{VjM^Q+VY6=aFY4 z{h{s6_a@5Y`>ghF96kTpG5%xN`QK+V853u7JLCV9WGl+pAu}TQ$R^T2LQ4qc?`HbW z+5-2BLpVU#|3D2uQCytg%#Ln$SX(t&iQLf(7!(@tAu5DQfS122u_;6TtHet>KR?~XxTPMa&q&A6Y$|Nl|;j^T0e>)vP^ z+g6)2w%Mdj(%3c|+cqZV#I|kQwr$&Kl6TgA)?VkV=Un^U>wK8Gu9?sG|K<<*O9>4l z9jh~X7V`PIgwNcdwK%E#uxxu}T@5lWmfu8GBzlo+(JLoxCNa!-oXEhhYEn2ygmg8` zTkH^o2qK!&aA{nR9b_HEa6$vyu`1NN$A0|o-`U?fcvlj$&mD~fiKJOrKLVUB1>WYT z`f`F2qF7Y*n|M0mDH>2Nes$E#7tW2_7p7%X-lk;r%a6xO{dmQLJzKv2eY6sP88G4N~S zh=vY&*?|<8sE@%zOpb9aOG@2|-CdJTsovB6?j2DgGCGOYFB_J}o3SB3m3$r!XfdxL zjgwK7Ud;e^qG9N zX4+o+m#Px43M8MwEi18B0SwE4&;qvi7;4aIiMNc0S`-Y2t6fIjgU4f=)ay|uZ6Ao* zj@@0KUqoObzj}Hl&i`G0f0Oy(R|AL|rU!!dv;9W{|37)oLLfIAhkvq4WHb0N zYuQ>C7iRhS8fqhpE)i2!$1FTRH%`$ELhP#FB2kQ|>ddO4R=XpJ!3)}xF=mTQF7r)x zfMwON8;tz>*+eqS?Q15N@x-6^+jD3i$hBdT&r%}HK^QX#hKtsC1;*-hR&{xI2p6Kn zn|NUn4R=x!d?cH8NBW|h=#kNnxOMWb-~5RT91QG_gd)4E*0geuTclEfX&{yQXn7Il zSRFe;u@3NhzEYM-+d?W01Pih-FN7nUv2B7IgnS?wIF-e2@g(dfntYRVDzV7R!bAy; z3izr~66JiuxJrRus`P9TM?*7N>HaP~p%9?>4oQ3pP0?>XFfLi8vVzjA{g<~}l{kD<;0*Ob5-D9p;7cC|zyk6oO^MmtjI?qxn`cOWa5qiaaY@*_!AU=c#XirDh zl4RmXKU@t%=3r?83+iwC?s5!jY};444{+hGLr$*Y&eiR~H+PVQRO7sBQj|Vf$)%DW z)ssc5MERGso#5il-sLkQ0ZI+p0|2BEg7KbJBTGbgBV*WiZvuMAf|&xo=EP;}>vD%UV(&@Q@wW<{lu~w|8gDyey?GLwamGB^i^d z$mj?!9_klaJ?vvgy1`y&FFg*a zw3f`K0M7e^&cA0=qIY;YUeF_$`Uf2QKY9rN&k^aL$NsNL$2mlix!r(n<_m(#1WF zxkkrE{W}eniJ+Ij9mvU6L1@jBd95%^w42UQqsMmp+KWKeMz)ujz-Y)qmz1*kSR=B%rwNFI-=4Zl1m6V2llN2o zR%A*MAS?D67g2<%tIEGe^m<=7UO>{IV=hMevzA7L<7UaxB;Fpz5yG)?JK9C~Qpf%# zVfA?EZVW%AuM+}O8vI-uPI_{(IK)**PH%g_`4eoVb}3gyCg&cRK!jV!YJ!e*(q}{E zZd-sQVvOX(xI$WhfV3HB;4FexU0pPT^)hMmJDb4_EAe8;qKz=Wbgx?4@1s>+tE^5~ zDl2h}&mwyzJC1GHTYi8r93xRHlu4?@*_zM<(OOwNrWE+uj%{=qYS(X}Z&vTifwLE~ zi~`B-UZ}7@ECXSaZ7IZDoLrNHyp2BHj8(Eu+R?eDPze_ajJEH+vUVN{Jt))`gP4dw zlALu!F!=z5yb!QIB>?lJ0zC%iu`2V36_hOPMOl<0EyTIxRyKN+&1ps&l-9OFfcgi# zxBkQ{9$(kEt`2hI=>u4yGW%}QzF9G$)6EwV!fbLDKImyU~Y_o-nQenvW?O+t!79hQJnhJbYs zdW-OMYDSEOehcn=b_p7v-CpUKooXeEDVqBe0%zm!X1IHYL&Di241`6rO+Di^293I9 z>5AM##He+G2KfF z*Tm|+IZJ8-?*+OK6$kRM6LO=ZDk7&M^w*g?1`x@{P?~!L+mYLUnq*Lu8?*(EBs4SX z&Gk^0&PuPdJsV1R-2DPe#`O9f?PMQLugX-i;eeT=+}M;k#Um|4L%=v!#71MKbGMP= z1(7iEJs_6v1x3RvuAnh5nQ=+x1A5BW|0w78Vt&RiT_|L}uNr=U;e@ZDa;X(e#8MeX zVb5kS6c)n-T0IX?{?vq0sBSH=YFa|da)UX)lx%Zhnd^W%&mV)$CSg9y4cJ!!g>fSr%i67nh zYALR2V_pH*9soRai6pekWU@B80jHe-=gnMRbe$geo_7udmZ)nz1R2>hOu{?Loj05> z{Z}yYUxGV@D%d2BKM}6LN&iNkkiC)KWwe{K$2zn{N<99cCM<;1^a;_!^(VUdz<|0U z>xiZ4#1`H)cjHEVg;tDYc#~4ILh1qsiQB#ZP4MCuaoqSb2y3K(@aYrx|L>gq7Xk5~ zO)kh6XjK@4*PPFQhXe;KsWLC1p!k`R1eVxAR0AgI6I=ABe6iU&%$o%)oZ%QlQSDdb zm)MCq7Ba$@=s|~qPO9053-JU<_UJg=+L?>?!!%y^%acp*cMrrZETo;_EPnpnP;yol z6F__6z6FoUR*E(&TduC%==@EE#vJnlKj8AVhorsiR(`rcJT3dV!Zi8f5CO3`yBsGc zm@2rm=~KMk4gza?5x#51_{cVA-p-Y=p|&0F080a~G+>1Fi+)tAE04xZ+b>*C8HQ_9 z;;o!eWm23RX&;w-D2g#o&(G&gd0B!&6fHO}lW;~R!?w;1vZ{M-2|Q$gj=3qIx<@nh zy+i2{KZBqqGTD7v3Q6BxDaeA4XdY17x-UOa*T*L>$Ywh4C{Ea=1nE!B*T)9fm=)}u zvUf@t-PJ&wTU7E0#}Eu(m`yNmVK|wElWB9zAsh(ylf%r^Ekm+oic)nr&+@NW~G#~TE@pixzNxQMZtYFAB3{EUfJiVU!Buxv;a}!OnY@}>rPF`z@ ze0JpK5Wym3Z8(K&C5Y^mq(d)}(4Qfx=gHt)E)te8e0Co{dr}je4cRm5s94JbcTbdq zIfCxayax-Xqo6SD32SDF0{ z6zt=H^8vQ+3AJbtn_IA7Ga_IBi_BIAT0Ou8co4GaL*0!W8n{BeSIxglvreZX`u=}Z6d~bl5&3prQ40MPx@gT^N zfO4R_KRWo{qJ`nn;`-r(?icA)N8o#CJvA_1LzfBQMB`s2uY!ipaX-sa8{FsFN7cW% zA4TU}MH@7~H~JEk9c=9N5MC*Qx$MaiRi$1^hCP!5rLM?HDR!|wJAHCiW`mSMvkS43 z*I7%MO;veSnXT#XC~o&6@{{}yk!_x?A&p`itX@c?LT-~n12{4dkqzw09WzjJAP ztd{jGBL+anSq)y#(C|z6bv>dLcXSm>;#aGZY)qlmI_Y-j+1xn=Gm#LMEo0ljKFA+F zUjjKNgj?BKiDNx?1~0j;-FG&K;2Rb;@#HcgcI9K){gui}-7WGK6c_xrL+1_n0NCaXwn#@XjrF&po80oV)G`O~ zL|}^Ba`$2qb0Jr0Ae--f@|jCRZ%`^W4`Vf;`O6ew2_fYy%3%1PwKk4jB#swES zTIu!E<1i6QAR`rXt-rk#0?Wn%{PP!>Qc3PHut?;jvfsabEq1oSmP<^D=7-pc7@{fI z#%EIwa5F&DWNN@5J&&0pKj?BA!KWI_wJE>KX^gJgRD z7cIJfL(TnnbzPNTRmRX7#7dBZz==T-uRIQ1ImpQqt1QT)!r4_GKw`E^p8!=?Tn$Cl z3Q~%EYtIXcJJ9#B;OrPgLHYssja<6bFc<XNdx_plWb5dZsJXH3FDxMvJ=})- zZ_f6~_A9@%?MQ@i4;T!-=|L2KrP@W<%ox6AoLIa4rGU=V&1laj0Si|F(MOJJr4z6u zXXvNw%W4KR(H-QHhJU^$l#BuH_D9wY&@STt!| zBIzMJ4dq^H53Sh&_{U*LRJ~-UCe%1qe1nvbT?ZS}8Yui)3`y#$3F=k(;!q0q<2_d4b!zu= z*t_ntgx@l^SPy*%F701kqQxrb@9`(V?UFS~?>AbtX3{InZ&LBQFf4_2GyZRUQ* z2l&i7zSbj$3K2wojeXjw`r~{||1?fBJlNC_)%ZnE`wuk7iS52tJ3Zy)={@njV0(tF z-OD%4{I#>)-5_F%Eos>CFvU4$Bg%p1=<`J4^q0RCi3bxsNG#A6WCiEbC+h#P>vnW7 zwO|mm(6hG}vof;&D-Yy@zy}KVgdgv-qzr?=-28r+iEvCy1+$#JGAF z-q=O<=#DvpuS5zQ>)EXi6NrZgY>Um!u$1}rL{0wGR?>!vt!b^u9L_QnE1n;h`KGZ2 z^8X-<-bc9>j+(<)##Bp_}kj<8}DN|LxFG&c_=h^j9P1Vz*B2$he6 zrFAtY1|w^C6W@B$)ZuQhnC~rqIVqMvE4RbMRHfXq2*#V9qxQYg=X4O)@Su+DCi#5% zlY4$;wuwwEAFL32nvLdsX8X5N8~EV#wvA-#AG;h5p~gJ7!ca1oL?4P3^FDMpV8R^a zuSR?c+crORMa67&-3?Mc%j+tvZxNQiMYHP4ZTuq_b(8(nF)4Da{ALyL#6d3644#tx zt2;b*0r}=&lbX2AL~5D^OZ(K)`s6*hZ1QeBD5|nb0rGB+p`i-4c;_s2UY>$&WF>yEFjI5>UIcxn<10G5=*h;AA6Cz zDmga(s*>vGu48d0^&?G6#LqX8Cx3EFE8Ox(-py{~)Zj7+J&ALPEm6?b%WgHFnO6NJ z<5Gos*gQpMqp8Xg?lNL+nDb-o?rIRR)9A@D1?x^?WSpA5E3i%lA7={DO-ln~(9~gG z0u@^VH4(!Giz>f3O+zuj@V!~y)_fM6kQdHP>5iCMmQCM=E5TW(&fFGU)1RkaB?WG#B+CMrXvn-`fW^--pI!H-~zOKRlhIDeK>5x%NS zN{VfHzpref(B}P9!lc-xC(n#uz2E69D}Jo6*5M%~fQShgnHE-B!Z8^QykDY1Mt>+6 zC@~%05SG&{-l4|*5?D~jVyV@no<(2(?c$ON@#fKV)zP~|=8>ZLR3{~_`P^DHMH6!` zAOvfBFwp!sT(V=OsGB{_U}$K+=N0lRxL14l12k#Ux`KkWeKq9>$y0PF@+g!}4-`Xp zyIjA>mE1(VXx^4?($;Chm6v8eg$+77fG=OKn(?U(VUgJ%3BvikJPywyl1X#ZTWavZ!2J_abWW zN5i8{(?(ZQ)CzrCZ5sXD6+QSHGG~fO5!5piEEX9g#8wzeaQYG<&Y-a2Rz0AIAa%&$ zfU!$SG^zRM+G|0tN*+pZHfZ(s_vtgU(28dXKJID&s)+3U7Si?79ey!t9@9cBiBq(G zPijD3KHRGQ$InnO08`GE9wx|;b(A$l;R&5dGz>Ex6Ye?-vJGnRTOMs=A*98OG zpq`gWu#Gz(byN0Q$|LNY-STem+jK@z16hFvT%sc8Nvgh2pPpnt&?R)rB5`8oDEAg& ze46r}w|r;y2?;#4)H+sptM7P>uA^+L^-R;+c6B7Jmgu|xEsR+(v|oZag^OB~0ajx> zpr^$IrmQ4WYg0pM(tu`wzRLDRLa=v^ov}58Y+o6xuPB&NtikSN+%^H*L|IPZyTI8& zgAign?|P?@j779uTqB3;`pF!cks?c&{VddE>yotD#2O;?&9D=aWHh@Zlej*cd8;O% zqqmIHsL#TcKre!V!n$a6IY@wtt}Wv8P?Ei{oW0TO)K`MDPx$cZjfF2c!)XJ`N!T?E zjR%_P=QonW+Tr%SPYcfRfBd78H(6YD(onO9i?`CL7Zlb7_)cjC-;~RmW!wXoGm{ z2}vrAV^y+pll(qP#buI8>L{h*HZVAiUU;GeAY_&IVzXfIKMz?$*05nu9!b+&*09eU z&d&nu7o=P8nv8iBd9z)(Q5Q6FYAOy41nqL>x(X#r^$fZefT33hTCigj3B3UXqtDT* z$X&yObYC{_-nb?#Tr%vPH`)|ClxlB#({7bUY>Pbx4Hr9uTyKtq?==yQmWJ;fC3RAfY8Kb5LuJTcvW{xPhP;l7Sh<1Yd2 z$}2`3mKtE#-hyeCSsl`}KRG-*d?s7rtFf@JyB921+WoNRx`Q&e5A*WraFO>!_4{i` zH^ZW>rGJ1uK^}`seo!~*PfL8zmK-)epc(JmaITwUjCq37Je77eq;ikxbw-hG+Owz7IWeq3-TsTgfz>kG8{6ox4FVoO0&nlLMLTv^RES#OXsn6RtO zfqJc;D^=}1-k7Q;u+?8g+!*$?(U+nkyC{{N&IbXWs;EWFLH)k{uUk58@I*N?9{3o^ zTV%OQqA61Om$(8Piwt;v?BPR{4Negx3qni-UYaWt>55YqwLhFna`zOCn`_r>IjpXi zN7E@FF*BLNNB!tC%@HQ}H4p3&w?ng1-434Dl&5fSvNQ(P4jcT4?w-E?#swGOEd3sO zuSI5H6R*tzBXayIpyiawGq-<5l}%qLHhk6WK{UX?8h%PECO-+yF)tp&VbL-{1vS_> zJrX5GgPb#HtTQ%&<}mj{5MU3(VIAv_DcIx)(FhBX&UXlNfw2_m#?_)yb#V#o2;ZWy z(?oYjHY?gQZ`AW;OK5e6$lK_?rU0uKbO|Oj!g+;eGRBB>+r&!bt9b_B7P4ruSQ-}m>+Lj+YCXi z;PVr7NpofFDRA~Feunt{@#($adEoRW-`Bqj=8 zLBjikY1|oa?v(7v2LLC8tS5ru#s~FSC z6nWXiA#re0gCq`sF;wqf#GqF2U7?R5X2FrAIxQXxratlg3;-Ez>CjPA0IlHm4>t1a z&w@Q}ygNv}M#U`Y?M$asm*zuyLj5I?G^(#*@*H=T&Rx+tHG&r!?nJ#KnQ9b1!p-F| z9*Yi|gNRUU0x}@AE^MLFrv7LkI(oAK7?B&FU^8oG)jpA+#~@Eu%_!k&eMVH|YeMJX zD-y^!W^zwD>b2o1D$Taq5#e^9VF4dOyo%0lyzJ-Ll$xlspjF4pes57%8vYcyZ|g(X z{6gikKzWMpKlxpVs)Ef6NZEFg%W9nEm2SR#)0!B0Rp+o#a>{g9)Opa zcZ{_HFJHzk9LN(D3d%Kp)M#aa2^QOh98K%~_55nta!>vj!nq|J^Z75b@l4EYc)Pzz zOY2!Q`QpF-ilE(@%S0J{oVxb)ps3OIial=A{_I>${ESg0mf(lBypt_EPeFT|WD@rc zFN#tTqL60(a%jFNef#7%uyiIrJ+h=vE~bdu%&skn?wC!suu!ZlSq$^&^=|}kW8?{@ zJWycnfIc+;_W=E+=U}L4YH9ed_>7Q%>tVzRIJ7Rk58?I8vO?TJ_3(kW&BhMCE)>=$ zu{_z<1Zf$O3HP_NjB%v;x_-BI{-jW+@GBt3&NzlA5g+R&Cy+U%96Nqdcr5=go$uBr zmW0@V!Zp4}G&OAey>A3vT|)&kG;xJ7`*k&HQ&7NKFWxr4;W_1Pnoyn<*8j&lOnQ91 z=2$qb1br}LcQo&{L_x%-zlT%aZ>iHzi$F3bS_Cot0cO}DX>H-qGyQXjp4!z(e(ztB&U6fHHzl{>1x#!LE zRd%i$XL?>wT6cmc^@^AxFpl9!3vN25Y3ZH(>6$^*OKzy-@RT^(FNBViVhIZ)vpTE% z;TG5bHP$o_BkvlmcQoo5y#n6q^5m2!N~+gbbiLYQv~x6CR$>*`z?K|Qh#$!q*D8Z@ zaZY{~&2iQcCxKW@uG(|fv!_3WEMT9hO5E%k8RAEBan{y%0M10~S_Kc{Df$KI{62!X znf=v*tp4dS<{ESgGEK8&4YVdi2}%9*?m_8TNsW`(_6+6i_T3n)*;q#$xQHPs4kTu# zg7?}=zNahIBT_fC!BsGoq-pXiMNsfe(AsUNr6u^C>11{LexU3cu`Pc8!AUC`9t$Q_ zFtqd$QmflUKg!a}Sosh(=RSxnzN&WQ!W)4Px6wu5zd|tqFvpA3YTPqYki+;r$@*X( zsbdbuA0}5iEm$Lag2jYD&*KQ()|{^ySFf%9-J;ZfoU58 zrJ_`Ub}A zw_pjnq94({pR8tH(ICNQ8HemRdjWE~-*61EnYs&@#uYUw*6C^#kbqn48#yuCmSaJm z?1_IK;4XRkH9dIpxQJ6PS%~;Z;(U#QT!RHaVinhte}zr9{x;Fbod!HVyWFxmY7<=m zXDz5_YQD-{Q=>9^j5d(q4~7pi(t~-9hj(I@A>ObABGif9Yzm38>x*6J6-&itb&@ty zKk|v+_=plce2sBTBpt0L?WY{prX3dlE><1Z2lCW`9ySq`k1U^1t>exdh%FmXF)j<+ zV5FaqA_L;P-eAUftos`qH}h zGKVvV1WS-$9c<9gpa4j>!Zx}7h$_pe2uU(*{;bFps!gC26TFS{0`c-5p?bU45IscU zI2#W}{X4W@QBA0`>ra?1w-R$Bj;7@;wwwF2IP0P&G=nS&d&j4Rq@sIp1)hKe{GO<8w3efgf5b~Rn^3x;EVQt>NP|Te68rl|S*j~W|0MFl^P%#q-cSmLM$oBk8Kpa{|AAt({{bvmi_HpUl8tx za~<{%=L(1YSp}Y>lrWQ+sl%fsVI3ptG9jlamI@)h`P)?)qNq({-6UDvo^OAQpZuh% z9}AcBSwvBEqg!)1!+^!BHy>5aE*37A#v6$XF4IV0kTO+JIB0hWcavW%c?-EsC zDnwis^?+-33EKVP+iLsCZtQZCU*Hyq^$OPcyyXDdHoh*)=pIzdSZh@D8=(Ho?Iei1 zBq(~O7eMV)UyO63Q(O?L7U|U>3X<|b&P2Nk@{zRI{47KZO|^m8Caww#Q_kML$f=FA zw;$H??tv`$@#)`hY}Cfcn;M{`q67Eoli2^gv9bp_wiq%9n_3uxS}Z+;t~@CiXw_U zsxWe|<#ns9%$XN^}^x*+)sLjkW;(Jmdf>nY7*W$vsof~WA*Pbjl{FeBXMMPA8zoa}jzim5` z)wX#|;!y20MH}&d*fubW+{B8WuT|7h;*yZX=0|QD&;)|gN#0gnC<~5J(;b|17!C5# z0ZPEd-bs9p;gPyB2M6xU>JACV6@+&{Ol1if_q%|W#%nky!894(U$%XoL%D0{G7f&6#P+Xbeqk@TwAjCH{Wup|JIObX40_rQh8p zGh3w=(z(B8$!sp-MlN_8d`9BL8k41e0nB;fSnTCa%oVDGo9@+8 zUII}M7b#TZ{y??MqfH>#}7M#(;>9LCUblHL?oY<8(f^&2X>ZH?g zOq)f!D+rC_`#mw>n?*YQOVmykRE;Cj^uy@Sl{9M_{BPx3MBUCdO3{WmrVq{X_Nhhd zBErn7a@SORzk}JIznsp1LwBUgwNZi%6|44xkEp6OomZ0dN{zgFXVSxUWaSRJy&A?W zkmiH+_MLKGLd6a0y9 zp=?V8G+Y^M-!>dj?}<3ms1dO-lnHlmO>{lEMDlP3B)& z?5~8CuDEJ9D~iIKyM!9E9}u9ctJkc9!Ic$Ad#0aCi-HD|1YvUpuEEKQ~S-O-@|k)#0J zh93^|04m6f7sCOn_nN&d^iWCDYMD)st71!O z)9j_E-fF&iS7|YTq0P*n-AU25k`z|kTe`~ zH4ora#!%{*TT|V?$1JY2NIG1yS|%Sq=3yoOBjPvr{PucR?K{e1@ItInk978&*+o+p zcUue5;!jSYPSdLor>u zC}ei~!P$njhDBW=x0Bwit$E>gq!^SMqIo0;tG1d(=IBq5Z&|k>wTY1UgSge=H5Dfk#Jw5#A1Y zd-4+rzcp|}EnF{UOM2(K8d3vsv>*|TQ*10Gk6208Pj}wBJsV$TfZ88Sa@!E)V~Lax zy))NDD^A7?c*>O^AhA&PB+2%GEt5}3&v|Iiz86g7HuC|cHSA-wa^Qj-%PXAwM^K7O zXx|h|4XK;WA=sKEPfckbWrgfpS&$y9K@##3#v4hmz^8tj_zWS?3RwyqkPSrbU(wD&7SkBop{+URymos*Lc6n2bknY z*yIZa7ECH&#e1|l@!m}E>7GWKQ8o3KI}}qU5<1cszls31b$%*U6~4b&RCsInAa(?qYdJTGubT$(KwIFNc-Z zo1ecArUVk)ki!|`P%^ij1%j`_3r=FQ|A=#%OeB$gkQLjERKkI6U5-%db3ZA^37DQn zQdyg~1?X!*$+O{XlrP_&OZ!uJ2q|cR>El7eM++*ZYnmGSMY{ovd`i4ANMJw&R7d>GwlCJ2h(y8 z2=i9c)JNnGlVqA$0dBNWf=yNrZE26@m6(TBvypkBJ@=2$tPpBa`Zbq9VIH zNMRRE>SFH-DR*!yX3Y%a0Mu5bjO123SiVQ|mb7vY%;lq|d7(V4ES@FuIfNU+&@%VFmHas{yzWk$KqOjHx%Uf-EqH6~fCq)&+Ehb8vw=U2JeNEZ1z{X8MX5{vXh z-b=1Q+ndwJsLW4JR|_H$*@XFr-=$|&CFr3-MbwA;uCnD)4#~$!KS;x2&L>3D^|mE7 zVJd{sZgYVwxVV6Q)s*U^pTFwDaWj7|&+qRl?Alj|%FvPht`|V=&ZQ!PHG=S9; ziRh{0LV)UWwgyOwfK_$Ohv z*amj!y|#BL17wO~cP5;dKZMgjqxDOCtvF6L;Z{070YKl?ahpZsIMtpjv^?7??d`ny zrul$Gp<^(^(d&>Tbo0|R<+qnbqh&r3IIri@ChrRp>sGfHvWF!0DMCu0ama#ceW>eN zW-zU;ElEv);atTx)od-q(qBZnIpx60RW0szaTE~rD4&s5MUz+s{;z(eoiyu8`if-yUH_WG6caeM_{YTMTMo%jQc zJnGh#pD{|tVM!Z#p?r_pZp^+r+GhHzzTRlSNOdmEJmSwa0$*HIQn-GUS6nwZ`LLw$ z$rLsCSz~`$uPH?gSn#9fY0z0L8*nCR1+1#Odh=f+)bez}MW$z8`)NFe-lWWoai=yy zJ5V>g;NI-qWHtqN_>7q>}xj+xJ~Z6CBvzWslJ1Af-TF^(yj4^goe=8 zPYUY=yR`Knoq0p6zFMN`Vpk;0o@xH{N~0}U`xoMdhi`Sqig(YZrG3LLyxdt%|=PPjGZI?J9s2~ zl%Ai9#t!(L8#l1Sl@M9|b2`RX##!4s1b=vlA(R68)%=BKM{%ARY^K=iAqKX64$T@U zt#Z56qSGH*ZvS>pije+2DhAqmXn`&)KmL>C{{NX7{>{KPU+Gl^UkKx!999xW;tPM4 zE=@NaIq|vQ6db93Ob{gcPc;82vsQ}%0}wN6Tv(m=U54-F6EC0FEx`wQl$-JGCj?o} z3|?cWg9%U1M=zG!!_6OWaJmRQpIx><=X?`>n%;QJa~df+Gb3%SgwWHCVI;`BKB=JY z9VuSn{e#34oIE3L2=JkLxG>)bE5~W+iTQ?Vw$s!%ox6qSh8w5J%dxn1gL>a`atc?m z3+1Yv=3d7Q93HC#iJKA0)d^{Tms4RIL~Rhmef-wPl(i+bW^lwM6yOF5{VnWI#MC<>Au@#nmf*=Hfgo*d2mpKG>vCd<8)KX?S+R{uK2Yiun_bz4|_ugPCFZ&c^D=t;*e~Qe`}hF zv`l(_^563g!HqIl4e8n?a3-w{ZhfoN72?_GhZxNBqw1r&sLnv0Xv;bh+(sv13*+4Q z9o!K+f(Qp4jCx7a6ojiEW(7Zv8o>*2-!|%t*?VpuB&$<{v`?ZS$cNib;`}_=96g-l zRkYPnW@6qSw}1OPr2E6>GIe@sX{a%_SPYU1C6jAkl{pk*dm#ix`Zv!Yb??#hXLc)} zhPoIIwnCCpWlpaXv~gI?tbma1l4iYPQ$2k3=_mD7>d+@vPlxLX z7P~}Z(Y~2bwFp`hE%cW(KmI;Gk*C=TZn$C;!YJ81I%m!(tpGd(qHh%FmL*7nkJo3J z2`4bZ4D!vA3*~YmE7Ny`W&x-Ef;o)2 zSMoorN1y#pajydKJ(EtYi7>lanM%%@#n9rsx#uu+=lt-uZu_-r50UfQbVIPd**buW z#}Gq;LUNnB=LM5FC0?9D66W}#(_ffGOlLRBP4yFgxDWXV-^-Und#hZxZXer)y{-2c z@r&5(Yp_rzv5k-O5wkns0<_b*-*P6Eul_NGNmhCsM-xT31KQLg zd(%2@2PM`D?R3fJgOB65^(ad&e;#IA1@?o|G;-D%8oiE3N@Wp^e3)I@hkTehl8#i< zhS-l;T9>0r>>XAdu^^4NOVICKtsFwBd{XQbRji`>7CV6x?PIDSC^vnV35TMyS^Zw9 zoWeCzMtg+Se8u-mpl}q_8Z)?McfY5{-M1G5l_dD8`Ss9glP19G$KUu5k!=Q>JfOX7 z8utHs2mYUTvwwA?^{TEOiYl1zRt+4#~TNl%&ft3Jq2i#3?a2E-ZyNFww%IA)&eU3^8R{$Bm`$fZu1I!b;3UW+2H zRx1_B1M8@#zJGmGCt6=f$iJ$@dr%8_6;P#r284691x z9SZj}2>t${)0EKlStr0ZCV9hn8dte?%s|Rm*)cgkd5{d%S92%l89`%8MaM~#EScL< zzC^sWL0S1^>beq<9uGhbXZ7;=_bmkgq7uBg>QL2?!PEX$*81;&xvj0ps*_6<0cF~s z4Uqc?G(G&yla)&d<5&xrsTQ-p;VivoRE^PT673Xqab15A5h?qivX#zHKrR#%qo;HAZxGyDM_me`v1a@2pVl2yA^vRFi71i$lW~qq3(vPHbf$dFD zW08WO$}S>8@l4qZ=xXZ zS!t2#&MoMG2$q`IdFsbXIn--CDzD&)1MKHjE&_p{&vjs=tjw(1@s6bm!OCYo3J@j~ zf-?E1C8P_5E74RVXimWD|HIfjMpxE0-NM~b2Rk-9wr$(CZFih>Y}>Z2j&0kv?VLRN z#<}nDo%eZv>@oJ=Rcl>!Rn4k7Cvh)QqsBrIXQ*C3wc+9JzO9()wrN0G&VVK|p&4+g zw_bF3M|IB9Dx($`E~8|t|Jvn+^{>XqMhKm255FpgiCVq+2mZ|8RTR zi_5Io`s<5fE@4Wy~~=8|*U zj68T2aS?bBEbdhFLzk+i~ETi=BIbUFBqCQ zyX+)sp*S}d2G-9n77lO_=l-zaFbbut<5#|MVO=r_^%s+^{5){U(pAqJYkrBt`U$re zOX?c>0c-CuH1~5qHDf3=YAX)`XWs=-gtkE3;N}Kx%IEgo#lUHhaw}& zI(SW&ZlcPyIuJRnhr#cFO`Y^74WG6Qza|sV8Z3d3x%b4%-7U+e;s`)!7%LumC}}sr z&{EO;<9$ySDYMIT3lp9Tb?H1)oR*m)J(lw&oy{Hw*|thq6ss4dan9O%El>I0ZqZYUf0n}=P-plgznlSM zYnvR{m)EXVr7^5jOhILdCc;vfj>8*RXF;NgDYca#1QWuy(wdRGdGty$l($U9aKR#b zyz?lm-#u9+EJuM@^mo?tXsHK4v%S%?#rJWQ`0S+#3%1!Z5Wj+LA&U78lCb3aFVW}* z(d5ZYnzZ-JrTmCm=9{X7a3UeZ>R!(~BJ{*(IbJ zN2lchLIRLHM&^=L_(>|j&{8^#%d+t=R8z|9dljZcO7HvJJ=@HN&uYAMiRs%n9L+Ua zN504Fp0oV2N-yy&fDOwR3&{*9Grn{OKq<_o!bGYPYbTwI22!B!HqJ{};uR>i@(?v9 z>y4*#@+xQn?@Qi6#mwgg2yhd<>=$t=(50w+WA8}y+cS1}LrKbTC6g$j>5GIc&o6UD z;r%Vqx1O~j-fsftcHpBKY}NM+_3j44cF^iMzpKk+5Ut6CnCuKPI+-)(4g=M;tE$-Q z0+0x9@&Hf_)*RrsE93NIxRvvywoYZXR<|AiDnoQn;Z?=V-^E1lT$ah?lOhg}KZTK| zKF>kAeLNU*(WHuVES#vEX1N~ST()yR7JR=q*CbhY{Vte?%Co&@dBdjN^j8CX(n^iB zNCMRoS|%RBgpI^nzQrA}_0b4Ge1J;Z^jLCmp>sKu{TyV9O7U{zKETYLRqV@y(hs%2 zvUv;A4IAeOCg(-U?1iyuh?ZrDEG&_Ci`_yY-a^>{)g<-;N>mM{6eh#%$m`3!VZ5$A zUiO6fGgLEPnF?OX6V^!SIIE$uGmhz5hSN(?H<{-QM9=0@{Yq#_HLN#HN;yAWUH)^> zf;tnw-(uLJ0lW{tCh-jxi@0c=PrD5fxjD?#c{cUcbe=1o_c0ghF^zcHR0f+|6=jq; z;?$VUSYK_+xP_7iC5+xstFQtIDoilP009VDth+jNQd-VpIS)<;%llT$so7i{+HIZ3 z2RKQ$zMLm)k*DLS+HC56MH&=KbYoy7L;Pz}ryd5s&Ah6*T9eLlbVj`>_qBO355S=eW za|-dN2Ay=%6vUb^;)`B-5q6U4K4`0_R=(Q1*zDo?UiOcgaIrBUv1alE2kFH;4`ZTr z30q%eT4`#n5CcmbihNS5p7ZixWW-GPGe(0r35>IH{{;M~g#K90ku(`j_$DQM>p{Gb z<{D50KnPW=ZL~h=v{gXQ)7VWut-5MU$_2hzQ}XgR%HXX(22Xk*Jm|eu;=fq}dA`UO za(82n5;-Z$4aNxLsOUY3$;j35O36g&LiY_RR0MuBJB%8UH-E25iNE!ULw;=vcYSrw zT>qQS`EMxuU;E~`^?z7b1xyl}rTb51A&tlY$IIhVA#`j3$%()#t?=f|kJR6Cq7l*AF$0mvMt zs$HjKQ+T%jV(NF!%XjG<-{uNU>ibv`g(r# zn3u}Mtb1{L3Xryrzy{!8a?qT)$95#^2gOU zH~4&LEI^&*o*@2;y+7^9KAn7xb2(7HedGS$d}RNDXa4rF{Tqo_eN{m^MEBxeTK6#m z*M``@PaU9Mlu{}NvKH(Y2dVc~r4tTXhZj!Ns^uutUm-R#ms+VWOd=e(i&e*5jmMaA z>&~xuuQwn_3ExEk~~bRJ+I z5{TRv9KtfPs3>>$_|8Q>%6wLsF_ZBw9(_DTm_C(h7M*K_E0KvoeQhl-WhFWv+`lzE zUT*;8LFfg?ZG){TiGL;~Wuil2#f&O-PJVY9kHH{+fCEz)NfBI-GVm8;rgXnUN;p!2 z8kkhVXsW9NmIYbx!K)kMHEK4aeoYtOZ%iMMfk~#MSgOTQjpBtYoP=h*Vo3{koXLJqvp z;X$FvF{TCIpw`xp4dtWKgxQ4%EbL249D7*JObx`=5tM#ji{6MQ8rK(_CNTTkm*j)q zn|TOz8z(%sCg9_2t#T7s$XAIUI+@U~gnOX6w1Ic_9>sH;s$45s=2gzl{NdD4sdw$h z!awCL@})-R=+e~LZW7Dxp}h|uID;>yik-8VB{LyuMLv_S!E^^nOt6NRC9Xg7_FAaF zaaGJ*D%-JG8Vr|I+d~FjR$j+K;}CiWc`WB$p4QU4%hBof4*e1muD<>bbIN5K44bNz zFjeO^Fcmw%cJO{OG_BPLL@?gGhfW{r&l8LX+Di_jC%9Du`s8YoWD(*&b|mitokwrg zk+TCX44T;NK=9i!kAtlooXG`(-f*&nHSn;+Ow)Ldm`AE0pH`YzfwmBzdQuo?E6xu+ zgD8&nj8J(O(apmi*9vAYR_s_^t6wY}O0gA7`80@MSRWXGT+~G@&z(WAX2p&9bK2Wn zvP5*a2i&k>wl)5X8whG9P1-w=Kw_knY%fEbIoA-LpRQ~t99SBvoRS(dalpfUfZwhGU8_(bcbr6ItB=6>9Ryi$kmp=u9Z~pA9|3KN@Iw9z(%gx`GXL@4?%2c zgSOcV3R+d-g1w0v%>5!;U02g1d1&I(HPJs7k3YCP>+gd>KcJAB5{JEBH0_j-$<|6S z;NY`<3=%bWhfd~+%feJ>5@=LgYrM?Yuos+I6T3(ZHU{B0#eoC!$h{kgkwnNjE2lep zh*ok2B+TD)XD4h$_mFZ7^kKrya#gtiD%| zN4Mj^b!`(a=?NprX5|qni}kFwTrKSJ^nrkh68C)P$JAr!e;G8%Uo$DfgB~WQd?ihq zL-I?ZDRgd7DvW>g7E}m{wm}%B#AP%W25GMR&Tq6vSroLt(mCivSz@LtQ^gdzJ_#FleSlQghQn6ku_w@KPa96~xQLL(tV} zbTcxp#H+1=cLf~w0`~m<*@tfgR%|#Y{nJ}1LTbDT4}&Mbevg^lhTkfEur{suHF?bb zEx2>kMb@j>e~Pzzytr3cldyoB=9|sVpm)OygqQfW{XIjQP=Sp@#Y#NOHB6SozE;v9 zp?}z(D1=l5OZG;$dg2T8+&cd|C-eQj**K7t!}~<*Gj)`rKInqRgP3g@1XLT3vOdRg zMq8^jNmHEcAIfOgdnx9jrZ7^3DWZ>Ql0oFQut&-gAf6`A2Z^5jaYk4b#b^Y=_h4XW zoaqkEy+)2D>ZwhSACusa>b*iyU7OP!Q*-oD@6K2E^jIBEmpoFptY`Ell>}RD<&bLy zzTz7Uj|#(HcN&vzF%jUm&Lk~=&<55`yK#C>a#GyI)`PUUA8*-ul{rh=wE|J;lJE|54G%EK$FV(o`2VV(}3R zD~^AHhqmNyF|YT?xdl+$x$AYQH4S}R+=2+K(tQ6>h2ocZ`;#?r6I%tk4syH4{He$mR$X81E~t4<57s)o?z7(rmY z-wa*duOZk4z%|@tCp?Mk9Q#f%%tiL#!{}UCoibUG>?BmPPFLSf7AjTzO?RHOR zYm0SK3pLrPss$hJ7d{+S2=APN$RzS&Ojnj&??nn1Qeia1G2f)U_}w3kL*B4;c1(51 ziaLU+Hgejix=VevY_6l^MtWBF^Nr3?0~oz^OA*tYu)quXU(l^;vb7cf^+^L(Yp&bO z;27ARI2*hb`QDZW-?*{}1qxw}KXxgew^W&4LGK3$Mw-SU+PVIt$=Nxm6>TuKzcc3b zfH~L0(lo^;rPwpm>cthB#T{nI#>L7Q1NM8}Km?TQ&W-ALsS+eX^q8CeV9dNp{T0wqDfc&uPHgcNd+4g#V8~yzL*D9)hVwmILt9pw2+G6;B zn}h!UO`-on0z+HhAz!xCra}xY@uJBj^zKQ0R3Cx z`R@P{idj22>RB5YiP~5i{>N-JLtaV-=u6rf)G)~iw9lqJ`G}8o$?t~&Au$+HEG`Z% zG0y0W?r<&BpML)=Assnaq-hgG3kEV$Z7lH|iycA@2wB!aJbFgmqT%G$>b`3=`s<_}4d9|AS)& z%ia%=zrMvc)e6J2uQ#amwZijXG-DK9ZH*iV>Ha^?pn{abtSk~&)z5sY9IBz9V&py` zt5T3F4LCmklnEr&dU{|A{ufg}Gx^zgpU$0`2uxIV;GUuIi+8!m#{$q&BQW~go7gyq z$(F~Cv@cDuFJEPFo8GH#8a!NrV3@#sYn8cJt0c)vb0vX!DL;)$b!TV=DlA1;Dz=1l z{Uh5^VJbGUx3&524DkM6mYFfr5Gi;aW#?w4C2B;!tlX1MsgK7o61OMlo)nJnX>)_c zf=7?OR^f-{VF24)d|v_bYGoBSo{JQ=3O%H~ z)kWt@HRgw>Zmz?7$mEu0I)_S&)fM2e;9-3V^fR)g@%9F2orGnUt=Mr_-b1KY9A(N? z%2tE>{SD;KjC#{M3GgKO^0(A8Bdxy19GQnqk!PES`L8g4G>`caI}HS9O)N;maEF_W|irDoy+K{naxS;%Q5Ax@bJu9tH78pxfUth z!uC~Yy9jR~7yhF53nl2doGPKsB6bE1W)IU&0VCd$;&E(2n$vi-IK>*(st`JqOD`P# zMB3u-#C4t#LUI$TFpjW7<+5vxKr>B#-DK~dc68csi_uHFcGnIw8s5qz#34*VGMGr) zd0aV$kzMfyqM`QSPQjIkYpgxlJ3Rb5nD8FSh3@hG-J#%h*nnz;_cz|(0^g#p`|2cI zgc&FGEz_7s`}FFa<6L|fwn#*MCc&RN;f@~jg}|38Nyu1+q=t*?eXsft0uC5BNvLvK zgtD_E$T#WU;4_Lut+5QwR2Y66`IR#RYs7y-40L9`GKyE@(qYm)l# zB;DB!O?3y4sh5q!Qsr$Y);wedsJ~iK4F-!TGd;BK)ij zZklFE(H*RH>iiq|rt1vIH2W*an_s{GlAvVt&5aBkzf#n{FpYo+zAsWUoY3czxjFI~ zykIMHum~I|>P`=0ADX$iWWE?zIuz_yPG9l*YtZv=x~S)W+I5G(3q;9^J8vgAB*Qy3gBh;{xPWwk|Z&VteE z{4wGJDadyVoVV{Eq;#h_?UZQA!)e2hID4;$w@_Wc6NvTT&H-hL$C_m2cRj`Y0F5eN zmRw>!!%`w!Ur&CU%0=~%#sasL@s=wH81ThE6^#q7=Mi-$W)u(^EU1Z~uo1L5f5zLY zBK*TBRc**KQxj4kF2gB$=9}p_7e~Je>zwvVKk%k;O>)it&b>6y#VgzR$RGY`#;gWE zmy7XNK7Y9W(hrpai97R*jmn(m_NhiKi+HJze!CaI>VKs#mG2gKtT8Zclp`}M!(3gvLu);#2;Fbjy&BxH>nb0+*T} z&UA%anW0~UPC^8a|J`st*=&=4t3%#_Ux6DCQ z&BY}Sc-C-M1jtx&`JKISZ8{i%srn2ISOQ?F?)=a}{IxB${^)a#KiaGMOW|54M_LsO z03YAFVe}WrvL2O_edvoyOibo;LB~PHv)paJK749p8nnkG$3GA`GC!)2NKisq0gk>%hk zGbc5H@wI>OEJCV$K{>DaHn3-*EJqNBh&D^)s9?~4QbD(j*4A#oKQ zpA)qIFvAwZ@+FG>8iXqXw}&_aFCtF!0#AD$GZ0u#2~DDpT!Y|o_A`yipHZ&+vaP^l zpocKldB=kw5EI3$k`Va}&=C31@Vd2T<|CS>#^do?JWvE~5+nWq+4Hu=!gUMQ7_BES znQYz_C=Gd)>f_FFE}$yxBuNv!RH!Gdfh$7u3UN(O{(fNgNOXR9T#F)_Mlt}YKY}R_usDkC~ z;83BYNPLt?WuQ3X7%`KHT%6_~0C`B9t%R+GTTX2?%Q;$O`xjfZngDt+)=Sjzy{*?(&w+&KXMWvp-Bw z_(**?%-iQhl}I)?V(mdKt&u1>;&waab^nvhf{TSBLurR$%4C2Aa6Z2CZ|2VB3fV(Z z)&C){k4hymyhps!2*2F@Y^Axvf9Z~D;rpQcWcKNc+mVa8Nh|hS3mLH1i?o&LPbIwR znSU&;ia{_MZt8+MUGOFFx+-`HqkmaC^!@SUPZ+6+Ay=Q7igBO|BVp!YTpv6=yiY^O z-Vag$kOO8@W(OC@OCA{Gjt@N@5{~M?FO;Kl-}Pl+32c~m60`T*A0N)p#zjHLkDBAU z3k9&zL@N?GucXOA^}IuJCN%{Gt=?Nlng+UFs3qihNHtzUhwrKL< z;^XD@%aBK|ZAP|xs`9P&@=;RG7Ff4CfG1PPnrFM zv`bWo9^(Yvw+K!l(n>>3g|+1yhOLx9UgVcdKEN>J{3&qPa!EP;GT3DSMR|fNOA!rk zjgqDr;1^h;Yn8bgT%<`cxoAlNPxo$4L|COfOffWN_B1F+e{U-AClCfZ1Dv5=v#;pF zf2~zIGiRK%BJpOTWZ{>i#nJS173|s^S+ydFcJ9I1Bm; z^k=f$+5k2*Fgrjna+Mu;BHQYwC-;6ssmV^sxX%%=Lp_|KFxYKiTQE4Yf>Kgw7;)Mh zq&KpAdJ4eX)mJoR;+<72*ya|Pb)`X0wqFoi5?0tN?_WP>qUh9&Z>6SUwqIKxpYQ1I2b-C& z=C&AzBs1X6fDtnV%+9hwKIgIIdWg#T{J5)%Du0{z`r+;wJOaGJz?t6=NJ)ADUxDl* zsU|~vU=)!n?|N#e`~rV}#Q?R8mM6+YfPsygGDb@5 zi4zxPSb(%H(yS-HtpVsG5&lEkiwdYX`+UXbnA`=eaJah{&4IcN714nAFP$h|k`7JD zi;Xk!C_&tmxRIiWA^#XcMYOnG8lP3Fn2SH#F*M?spB4!B;3j#{4*{B|t;xRF&J9(6 zf&J@I14EP;`-cd2+1F9~e_H_k^Qe7YU;k1*QZO>Gu{Lzzvo@60v$py7>B~^sv{_X| z`moktG_#GPJRL!MXKJ*5mODwbswUPjTeKd-v-+-*04ZaAQixN@g9V1u3mH=Y58%(;o|v=SmN$+``Fp}4zUHsJR^!*!Z)3x&$}f| zu*8zeH+6^A>ve_!J^AZx>d3#+qV;j{=(lIJ@1>32Sr=(ay;`_O^A(gcz zO^;|>b#9%c^SLSfAs#iY3Bx5B$6{o(GPB78s~ELv=?mKIT&&{V*Q}jx)`fN*hOP1^R84VL3 zjk7Dk2>Yjey${S*;?k!}#s2QpL~Zw>!!vVq3vyv{xAVEgp`*BdVlQkuj+Rl0sE|d$ z_hd|ZU3=2aglr3*Ly+eKhh-1D$qu2g9HsQgU?PKznyf-DK4!5ulKtaKVQD}iG$zkX zgEZ`QrzQX*qVnunb5>YQV^+t#R6Sv!*5g-c2`?dOjb0HTl?iW&prxW_FbUlg$#`0k zEO$u$NY@VNBkhsfMHvDu0!NW`!b>W3s;OVG`E>6b2pYS2lXzZ*N_yh-pPx<-L z{Z?ZVSLKofd*QQ$X4-sA(gtuCuX8grQ@>9P+!cUMrUTJrw_q-u{DfFoou^PeUgx$z z+kXD|E%BCOR-pLtz0_XT%SZB91(0<7jAMS2{f3HACTWqHS=GsxSvSS`h|Rb!LMk?q z9FI;TCmsApwjYSGCK$fPKTJP`dNBb=tCpx*asjVcUHHup0y;#f z(y~C~7?|7#3SH@w*PLRw9L8>XMLu~JZ=gaz^BA@33|_aMqRX=>$A$7StPGc&l`6DWm*kxEwI|IaDWcuS9J_eI*V?Oo*GHADO$q36qEDD?+hE zxKjCWlLYmNo_!|Eg#sWJkq&zx4Xz z28g8$Dr_`0gjis9W_E~4NgJru{i#Xpz!gXsh{WD$?C?mRzI(;HkocZX=pU?c9HzfM zeLOz_+4{VH!|Am%hRW1Pvl#B@zm}vhGw&!*I55z&%(Z&pWR2?D8dMcX%i&TKo>u`> z#LW)E@H+wt(zOPogOx4C^cym#Xm2V!Pm}wOe&Y)K&};**3>bbEU{6vThr`H~RKiO$ zz96L|^y|EM>*JR5GRP0dq6t$>RERMj5k&k$$>5r&IrU0oe{hDrqhVl}Vk)Opn`{k@t#vkisyu=L z@AbEti8rVHy5(0$ZN6IW|AJKfM{kY(KVkhBtRE1d#0%Ql2{Qnfp1pFp^$ep4+81Hv}cxWVg?JCD2H8C197spmdLr0<}0Qs>#mUt&m)XWRN?T>U- zlDkY)7=pmP4gasK?vho^VcJ=FVeN1*Ep*M0N@BxCBd(k(q3j)2(2U|L{=kZb-+i#? z_C5fjaRt+GF1GM^rkpU)z!pP8qi5Gcie6bdd#r-H#u@gHP?Racj{`#De;K zlrY&-=v^~R^4%t*xh57xTkCMZiMoFdpvDLPJgvK6-(=YIOBH82>(z6u+X*+q`!m}XkSOOyyw9f#51CVM>P%)Axu zyvYyivz6#{oBQ_HRm32ZY6#kM{|!ZJ>{i--{<myZ!w2x;xP<3E;(<(#AfMR?VeV zhdB^Dms}r1nwKDbd8TtN4MhTZ()m}f4cNF^^`Zmt$IH?be>D1?ZvUQf3e?%O%QzTdG12D6guYi3NHCfWBQSB_IszZKWePjON=X(8zp-uONVH89!_H~)uovR zK-x;TnKW@tm1cG7B;D&=M@B<>uLzUG!IIMFt2;HXARF0XC z?&bge!r?81W}?=FNj#c<1hcYxhCjKAvC)m-?oM@?g0sQ3lVGrxK*2vt;U5;#fpur; zO-WHFzquD)1es`ng4qyyY<+~hic~%ay-s~vNwm;C8hvEgvsS}kR~AZ`dEY=*hEHSe z6Lv>?>JwZZV&Mjz#)QX=MgH7smm~l>+#6_hk~>Ce)6jUnxjR6vrX=!+NquRJaM>0& zk2eM}KPB5k-IiPV)98c__GgSTTp#{{^jFHHy7~APRipSKB6|Wq7u1H)m0C~eg>p^J zBa)`<0_(~<(PN(_xC~N5%@>2SGKtn2vjWQ1Q}RP3S1W0{zEBG;;)q_W0S`wd zAw9S{Y+H--5se0Z!Q`hw>=oAxrx?6f|Fga>eN)i$!QBqd#v8QXCfxbiC!JRoFd6-G zGUvk})*E7njJ57}mKH5*J^e)906V1W2?pt(yt@OsK$Y~(7Ht^5H?Vigkg&9v_G|e;P{! zLU=)@^G64KJ7gj|>DmltXeJS5C_NPgTk1g6(ZWgkgw-hh$vkYT+R|C~X;Lh8M0yIV z3NVIJTQkCCBAz?`#|vi4oxZw7>I6fls~7evUL5;G6tui&oAt#qLF}v3V;(6#yi68=!4V>60!y89M!+9 z@tD5Obf78EZnyuOpLf`oOFVxm@Vdfwd{}-3Jc|GRyj{)uX5DKkfGFTVpK{e3gaT3V zUDVV7jWu?2s0cn|6@GLE-w=+)F)eEafK6syb&^PR3TcuIP2_JT7o6TrLRTlCK%^zleDvR=jW zUdG;nsdyEis|^zVW0U4p?;dgw!h3A6&4HB@37$&u3SfYN^%4e;gP;F?^cJ>pvW@rR zZkL=Fleb(rd`oFr{MB|FK^O%(tl?Om!fKBPr?*A2?orNL{15$@jj1{74B5Qg zlQ`dVu--7)0y8nK`pP6oS24QnwAv1veC!ZBNipyrv=Qj?YAHx3q^rR{M~uf9jmYbw z7zc&$O#-UHd*@THF9!l%DUzYKP^=jo<-o*qslMO$>7c~>y9Va0_=q)+(w3kdi;mFB zV?+&+mvWkf0Ja#lJp+fGmkr$7>u#PGT^z>R%(;a_@t zFXEr6W5pZtrrJ`t!z{|8>H29FpFHG{50HI-wWXHyt(A4@4{{dt zO4mru0%+Hp-Mt<}tw^BoW~yS4K*VUMAb!<=HuIfzErxHl>{s6Z?DVpVdD1dTLW{d7H{+Q4KpXUz0)wV0nz3)S+*;z)) zgg)VzaV>Z)Wo1x+AMqexl7VeFis{{W(g1UXFB@F94tsw45+3BinA3G=G-#^~cI)J@ z_LQfLdj-(t6m;Vn)}7I{H400wAC+30N`U83&1dLRr!Z^>A5TX=ZA9MFgj{X%t%@Q7 zB{{@FLhv$b{o>h};aLnAokF#YwgkH?x7rWJMgk$KxY@VRa{naw&7Us6i=L@2&eC`N z_EtbIhziwIk20u_&mG!6c~f3u>OTZuemgm87ap!3_2DV1-y`L~4kIei^d-7l9(|_T@|6j7Agpy`fW{yUNV%E059RD?P`d1yCp(y8o z_@(=2-FnWf2gO(qZe^xWOe7YNJ(q|fNa~xPPlZ7_Q`#&=b38L{Ey)~ybQI1Wew4<* zx$PI#kJ zYjm$-KazrH94kZkUyl{qu7d!qI1km{n7nu z^C5@Df))uw)7RpP)rf~`lNA~CvbfZ$&A}|9h2&<_!%TkZ0qB~hwIt)0nn&BPhGLn-NS;={)QwH3r4pNb9!PO(4d+5`6z*us6$B%{xiyfo zO^3HOflk^H0q>8wW|n6AG+e?kQmlHK(SE2ij3<;zu}4<3k3Vtvlz`j2lC z5o<#c$2$YqqTLhq<~ye7hI=tO87}rpPIjC+^darB(uTQvVhEce-mV%@m}TIZ&fs-@ zsMtbODxR~&+2VAF5Dtw5``yPtA#s*@LRfQEBs3fBY^sd)>Z?UVt&n%s5New-nY$GQMu&eK zy&x~2UaMqnHEf!N)mmKIU=#@uVC$$PL|C7$fJH^IVP$3i$kGSTy7vA^AHN2b-X2XP zPK9(uV$2tnnPd)e%?{X776|zf#IH74x+iej%vjNnr7REgxpY?1jMG$AyvJ49Iq!$#ZC%IP=j_#Ckt!%M<$&j00@1XBL#1qv-N)6T)u|N+Xc)-@XBV%`pDU z7~`J{V*ko;1z%kHw0+M{?uF}-o729;bHWiaei)6~U94#0Mgs)6MBwnVANF?BcuCXxhG#w z5)6k!UQ<4zHy&NRCjVhBCQ_yK^f3AjC4>uO1Y}?nZ3ERhGGO<8oWfvRQQS{q>t;=V zW(k`C|M(zc+t8&dhB@eWRK1Lfmc{UUXen|WHdx+rg zF;f^=!8C%JVt5%AlP@Q$I>T6m;v<%sw4T=lTOXqP41?(Pl_@s_{}A$d|x#`^BO>um+$8q~?X-IE}u-+&!{;Xb$lq<(<822zFw91gXeE<$U?+ z50_>Z<8m?Lhgbv881}-UVfI2@bDyEiG4Gi0_`a* zb10Y;ZJT-8xQPiW=RSSm->i-J{Il|9HX&%h$ENtyehdMoMQZdT2hM5Vq1xM|zCQPIknIdvq~a z4A2AP_(kAjLEKoz9y0>oMUdRY8K1rj?;FdmFtD-N>F{Tui$+t`|h0CVc4`S6e2%B@4lxlz8~yLf~mdTr61s{Y=hI@j>(Q z?Ppt^O>hUQmNG;xyNnED?qNUtL+apZx&?(p$trI1wy32FpGo4){1wDPlpC1Z6tB@+M6wLyCG*VIp9dSIkJcH zLm{w%n^Pi-LMagYT<8(SNRE<(?m4Ja1Jz^>u<@@R1K<;n} zXnACcxb#XCamzfjj z3FL6}(AJ+)k>u}Eux_%GP@nPQ8`P==XW!MFvX$YRq>CH%b8nGRgo}TK3ib}9fgEdd z)QW|8kB;1oZn+dAk+jz4^xlk5c?#yO7PLRCu-u4~JWB!%`6bw!1ZimOr<>rJ&{bQj zvL(k^xeKw3LVU2&Gt#%=BbYuShJpT0bNUntVww=@wP6g3#hSlcZMencUew|N(pj-x z#_lD;+;ZHXsyT{)1VN$%%p^CTvSdS8C2hFlN#^=?%AT2MvcG_m$l`vA&RMq2hVAzx zEH)9lyI@OCuGQTWS7)Bk?Ut^nq@CSi*hEoCD402TY4KDT$rG()s0o8#D^EX1Ht{|7 zD9RDA4T^#y9uHcTXK3uxmhGAjEvuV5E2Fx&Vme z+6ubJ@eM*7A(;uKDY-!$r|Frlfaa&C`LM8m!)Uv6o^i zQdg#y+Z?H8{JHZl4_KR8>9iL4P=`}hXfihE52g>{-pvuU^GnEqq%%GuIbG@NXjRB6 zdez@myFU#t+zl@z#9==|`i(jhx_lUwYTTuab#Y@PF+Hh#mcy4jw{)1^(jtEkKBm~A zrgX3nLoZx)6#JvtDWWeM2wIPT>12P^B6i2Ca{9Tt+pm0$;c5NKiFRNbFCSdkpFWSE zg)4A%HGlBiW4IPU9!hHtRR)V|7On_VW5NtnT)M)tws@G{6bFBA`&sS|jcbvy4HS%} z(*Nm*w#i?ZbD#4_?< zRrmQ!*uO@UE@8V@Cf1)pb}U-kppkQx9(2{z{UtekqN?MoGDv#H)&ha&!ZtSp0o8s_ z^sb;UwbK;A1boBX*Zr*eyT6u3H-V!SD2qNGlu8Tg$DSyYR+v%owFCVQXL{-r+ zRk!^<%55Bp^fCr@)R9;$lFMKMlFZyPBFODPM~8)knQ)xq>}=;maYtH0w-{>Spif+l z`U%6B{;Z}Qk$eYViK67J&UTRz(t_#k9MkX+$(q(c<<% z8NC+NDorDF-js$}YMSLrBYRA>tA;x&ch5tLpQWmTOzqaAe?I|2=VoFY>0HWBmSPb*b(R4p0i{5eb)P|>%E!3?Y1tRAQ;VHxXZbk^-!_$-}jp;rT~9GaS)X# z9jXA3kkN~JNg3~Z6Q(VbjlNbFvhyNW7a}1wYe|??4pM)n8g-l_j7fK+W9(IM@eG<& z5U&s7=Sht9&S~;T#NbrG~aTqjix86ORg#WQhBi%ugD7J!nX+Up%m{+R++8 z^T$qKJ}(8kI-ggmSu(eJC8AZ#ia_FnuuaU^;|Gdn9;;2rekMJ*i(^mX6b^0|HH*0- zIU5IftjPjc&MDbSkmeD>l(SWh(}Md6^w2QX*y?ihec;^!iB~iLcLi8tX|sh zBB}G#2068yvtlyNy?Ax{!Op^FF9nb53L0$l9{J>}EVRtY5>XzAX@&!8NJ*=g$`yCN zCG*ROa9c=z5Cx61J$B&pDwCzCS|mb{;_L8XZ2OV=*9c$-r|?D#w(`1SKK=5lHn9uQ z;tdSnp@i2CSeeunb(x1S)sD(L-Z967#1T9saAd_5bc&e2@^q^kuUpYRu6E##D)KhT z^3absT9(4~j*H&IN~Z}27(TQESTquggT@a?+!L;aYdBt zgHHCU3KRM^%n0GcB!@wep&WC)!U*T1An3Sqnx@84Nl4WB+beZX@rFpL1M;|$p;)1zRiL<-Jtx(+L5Wvx{IKi+a{4o4+!`7bVZP8&npswLB`eRe;dv(Ij zjwkrt;e6K5nw?8jm#l&t~y7CKWp^1Cqp9%xh9}d3}k_ilq%2y&q<%cC7;8XpD(26j} zZBWVw&`?YhmFDsH&z0XWDMywn>j%?Ag=EfY8rAlRJ7kHQ>Tq&*^N=aSyR)x7kT2k_hLy&f!lwi1z zpvxypak(#!qgy6w3xEHrUi43zYWllD-E-vJGHG(CM#Veb>#-WAFw7!v6r&37TOw)a z1~(!{*fz?Exe~uyVVtw0;^h?tl`~`-qY2%9u0!k83o;4lStjXCh*9H%uyb<(b#?Eq z%SZM6%91N0sVlP`C#r>0`u4}|eCnyovKf>nmp9y9;$thAytf?EX^*%&=+b3{>k)iJ z-S!=1HoG6M4f#__PVl-e&%qP);X{*l>c|z|OuY+4%oBRe6Fms;fa5zj!8`ihHPT~a zPJM@0kM$!#$I7%VwfB?*-s~T|eUUD>os@}L-MVhCK2OeZ>^EfHUOLzahQod!P!}}E zI;F-LlNk85Dj`1h7pDl8x=8*_--mo{En#YFQsfkeWkKmnG|E(c*i(m+*7Ob;bEl5e zAcZ?3gCeyehMQ0|>8VV~n?g0BB?ee!ND&&zQ|1HXvC~|t1e+!akWoO^uDZUn*2Nb1`DnVRg`kmX`wwvz6q9E{b@8LyQ1p?X{jNK=CKQd_RaO5Qdu+> z?JH()&Lt8V+EJ+++f+k^il8{qRrFS|nXbmU-ox^*}QrT-YBy9hvCg^57K47;uM6tsDnOyg?3CVbzJ+1P$tEzsSS`@JX zjD}m23In-Y9EiJH^Cs@*+T^S>w-rgxxLDf&<|9e2jwL}BqfMphG}h)&-Z{2o{w?+q zLRj*0%bdk>_!(8jwAx5Vxbhp$&+w$zEP^RP8<(-Tz9)TL|JG|mw2Ygze)G9cc5XUH zNIV;W&8P6xd0MQ)l+(ZxOL`~p;-32iGAH}$c^{V@Flt0?6lplh`hfGNii1rEgCh+| z*ctJVC0Clq;v;Tc(FA~TW_rAutVCwKHH%3`F5YZ|c7bbXbR#oZLx8Hf8&MC^iGA(G zGubJ@uZaYy+jGxwZqGc^d4}M<8tK{5_W93Hp57()Bv05bLuBKV&YA}v<=00k3S6$b zCxYZ)z(igMdTdD2pZX;xB=9*MG!Jnij}2!H)rj13i#e=}0hm1pit~(A#i0GF4XAaG zRrt39F&5Ap;feoq|Lh-q_7`KRhx@(yf}&9Cmh{Vh7J3+`nJOqPWH<|ZwSx?tFd9f@3>HUkfR}Z zu=e@p5jBKsKol`^2JPdbCgp#WMUg2QcVrwgGOzk zZr|((=sx1=ZC5%rS;k)4y~=~kQe}V@fDiMEkK|&h7OZWG(TR*Faq&f2jQ4&cHBe26 z#OX<0xv#Vk^WjPu+&lPpNqR8b&+$cR$+3t27(_iHd&2k}xz&?YWRaj-9w0|O((lrH zh0g{cRYO}tKt#@<_Ntei+Y%m2KFrNiWkxgpLS59JB-lUHg#`63?Ms2-l^RTE}PlBvG=f5b}p(2$HB{Q==R=Xh77G$Kx(`fX1 zLMwULVq|##+bvZiLr7JxC``hMZYaeAJpZ%^VK8qIwS3`wM?uJ9FlL?w)q-Btg-G;C zfr2nAKo4grqqNDEhQ(Hq)*vzD=jlu|CZm`1JQdCFODc1HAAJ?Z6W#YIHH;@%L zsLHc{S8cb>%gB)NGnFNO0sbEzK5%&CNzA#jx6EexUYlJ5ErGMSU&>v20LL?Y$eM*s zY4c4z-X5o)Oehqoxoagby-`u@%`Af875E52nFJuAc=~e9;6s12NYDC49|a8CKT2;! z^C87kG+Lp5F(=Gb-LS}W6D4r5qOz>6_)$uEF7+KR+yy^u^O@Xx6%S&CrapJ#*DUMb zXJc!H(P}&+R_}4o%0Y{WPNruOqAwD68SI*C2~JyHzod@~POiV@o$t5>;5y-SneSPk zc1546jg4Q6B$7%S1pxT{9~6R0u&6ddGtj|Ub`pcIG}F%wlUc?ecTrjg`&e(N zjh%fK&>pQ}pUuH%8=@2JDFGgm4z`pU(&vrWI2$4d=&eEJwdA6L`cXw)QYu47;)l)~ z`g<}^+w;hZbhc1Q-HTZ2`yEu}9#_rRUXAjh_@u9ze`4sJE9Oy3Exu;@xLZ?RnDbGD zDQ+kf(*_1&#CTAiOTRt_`gAr#CF#8wZJ0onx58~p#nmxW_tD>Rq_#gMPT5v*x%Bdo z-pCXOeA=dIexWB^tk~@GJI+&k^@>TZs9stN>I)BJEp0b3QE4#Ga{+eI%o&sEP(E{6 za~-BBsM?+GJA=>~_vVrHNYS$1lY(^D2@u7lg0FqOJ1f`W%w3DB1q7b6)^1Ru%9I{4 z*^&aHo&$n-_mrhkdre*6+?{+64139~J*9D89ttCSL6B@nRwGxKyxQhQd$FD)f?5{f z7|FKGbGRRx!)J<@y8yda8ba-ALg}uubY^-gD<^PF3m*M2={QX2UuL_y&n*QtMS013 zg57;2i*3K_66T^_PZ~&gLZNop_El_FG^cABZgeT~WqUvix0tdI9hJ#eO!o>3 z>zzK9-v-)Jucx48jrMsz_`cEk+f50GYtzXWjJ^ zs#i9*pi-mg9Q$-PFXkW8zq8YRuYU`OckV!?M`aA$1V^S#-E^rW?TKUPl{H(EiRZ78 zA0A*aj7M!@W+HvF#H2BL74lF6W8*^zhsfl*S z66=H^3w+}qBMo^zLvNqrx`03v-HFjueR0j zwo$6CSID92KjP1LDR28UUqR zTY^o!P#Zxw;|;X~*G^Q>`q(No<4^ZGp2erKNjTG(GXR^?s^MfEjik$R^=Aq>8fn#H zuosWVBplj&9g{lZLOD-=TW{hK(0bEnN^E?1p_Jd)J*dq}O(z40LlnYd>Bv8V%K#smEl-Y zvZqd04_~crICWK7nTAetaAt`w{sq65`w@j?7nQF5xM_~MZb!BKB&14bS$p!+AtuO@ z1q$`}cU|*VS+a{n*96u{BbOk~Eiixqd<7W=CCsLYGZJMqqI67!jPLPAl1FQoUjGO^QH9w$|sVi%gK z!eRQ_A!Xt&0y(^#{<-y^`!{#9Acwy+lFs9BdnqbPi-`{%3qVXDQy%x{f83pu93DlJ z-_^Vk(VEIdl({Q;{V5=~N=Vlq4j7IPK9afcv+NkDE7)Dk7Hs>%}EorZGOKGSzvIzq^S`*!=;h1CX zy_0xPH0S3USJA4S_S$kOl&)X~0+?CSP&ZFa@MYMek#!KKz?*;l)L=G5+}NwB0ln>c zm^q37*l03_Qc?SrKHi-f6wHoV(k%cgBXRKoR#nt-5weevX9ZiYlBE$VkBX>EG-7#v zK$E$GM$OVhRlVCn)l3k_OQhYWlWTKt{?;RxRZm7F5HImr8{R&{{v1h7uT6bnFUVQQ z52)cEfw5Z$Rw`MtSe>3yoq>u4PdVZiwLX$;)NcB_e9%%CQc1(zkAY@Ii|aL}^_}Uw zSad0fNTrgQiz#q2l<#WoIH^qY8=*V-Z-EYF0qLM=IbX9p=iP7C8~y(YpO z*w4MzV{He#Z3tXRWX+y7|FT8h@kqVj+i&W16XGDEBHC=3nr>O)$$6g}v!)#i!Bryc z#N5069l@GjPNCX$Z>pCyQpTkJGbuy-*tZZ&Efytj&iVXy(VNNC&2vL7;<@@IW(Yri94ER~n$lJl@Hw&!=F0$~N6(`I z7v%HBm?;&8QsuQhy%3lnxl%-`(Fd#3uHe5SZ22X9k#PQ$EBpaYi+%pSr!b!?bS(LY zs^EN=I=Xr)*qe)#Of#IXJtlpNCMI``s9ct{`_z&crTzdYcPUhd?Zj` zEoAe*lk$1V^N$HZbsvUy7QE`^YqBaij|s|!ABMuFyz1MlvP+iVuc;q~;)BO*AHvv# zvJRFb)9S=wpM_ItCTxm7y-Gj|(JlfuOl)32cp1;dW8UL)k{kH5la8M!;*aUmJMQVQ zm_C7uTl%R^g{+f~$s@^6`$EmL$Sw!av&3nuZ6CPFRuvHUA zE$ASY`=V+bKHT572n+3~b#-FVtdylwbj5LV(o*rekFW&;J>NxC4~eH@WX|1JyM({j z%G|X)Vz5KDjM_wFdWTqkcyW^qlP0PjmKMYBYtoN4)t07j$d+|U1Ww;@dhn3pe$AiL zOstIKWUELO#gZzXm8iHuPDy!yi)2-pdZD3O-a8sV7#-RR*YuRkkM&5?*+JD`ORw#( zqX%o!|ExmxBvt`g8M-&NsSN}v*e4@crVNaKy zTUAnaqMV?~Y-l;5x3oN*C|FTDTwRZ9Zzo*l(dw}iNJ=Ob+98L0WV*e94tggZ+E;wtOnQaiEaTG-GqAo8$Teq0wKpk6aofN+ z9r(U5O7MrtR#~l`C_$NB_Pi?*HEE0`P`XFm7G=H$97@V@AxK_{^1atTwhV>7(mwA| zhjwaGBVFild_usk41l%@ct3!ZpGl|s-&P{wWr_HW*rHniT`)h~^{x+z}MtO^L+=J{eP(j4{Eujp5dsEWPM zwICa|qf#YBxdhFtb8S27ql3w}8>?Rb#=gdn=W03@(vuS!nIaDoox}LPdz$mpJ~-#6 z&Sp&w$j8`?7|l9A(DjDm+|3u3xjVA8q=C$jR^6E}8kuwTTwR~?K*)Kd#(A7Ij3Bch zjNhGja2PA5^E6Z|l?$k{8xR$G1+XrJ9Cb;bBFF7`F_*#OK5XhWZFsWh!}H>assm)a z;W)5%eG5MuX3htuUG{#*kIvrEx)^xo4c$9HF+efG;n&REBOAxZ$aJ=L9Q$py7U3U+ zI@NzEb z-@O8PyCKy)k3{dr#aVst;%AwMocwrh;KTDlSqXp1kVLuL^MV+*5v7mP8p&jWEimM| z>lI2I`JG9aAWvkiMW$FQUc85x=4YH1cEJFpI%cUwI@rp8w4=k0p{?L=ofZ*dgqxlC z@|=_z+;ZSJn#gF_nn@g_K*4C3HxVbyAd7nEP(~GJUltFkPD**m)!de0i1HS{h+262s0t*h0-Re2`5B#V^oXbyH=M%(AbQRS$v8iu0%L9v*+D7VZu{YTrAbTc6)M$kSIfxX zgm~H;FtzTA!!`7j|{nY3l$o&vMB@NFJZ!@R4oZk?nn4?d>u-6@++ujcrLLL{uN2yum z4W^TAAJLD}R`m1F!H2N@^zY$K8IW296bL?1ek#G;*=t<=>^(wqCuUjmvAN27dF?|e z>H^xB6~u{ zHt#2t?cHU`+$Cq53s&R;!E5Q=Cuds<#>n>1W|4Y~gg5I~-J?h9rv06w2#Cq?*pNz-WWj-sdpjZKz_ZILe&U z`)MY@d_^AtH?lfN^xFdM15k7PBNzqGS6QpJU!=~Zu2fuUFtGJ?~{;5)_~Z4~9ImPuPB7WNQdbd1jKgi6B|015LtpO|nkK5{q; zWprp~bO1GhWoLxSOjDS`b~Z-kWHfO&N@Z+VNFzU%ieXgTov55So6oxW9%G?V+az?# z_No`@?l`}q`Os--S*aGCp7HF_+F7NwfKf>dqBsIqze+65e)vU*BIh!DCSw%WZalU1 zTX{hqMfgv-SnG_8z^@aV{*gho)u_>P?&1;dz#Q&WQr^C@bN(?yT8dS!=L7Fw>L|Jd zZ)!c~CKzA%*2c2-C0v0lZh^#m1uLX6`w%Y}-cwr#M(jO-*GyZ+s<*f{Z@$@fLfHkB z+_dVyrt~Y-pdhlX-NcW^#_gN2e?NB#Jb!TaJ}kN>@bS&=T`*&1rvs)c3%L67WA7p& z-+ytbho!M)P7DNg65szVfCNTj2nl1RW@Mc_y(1;%?Pg2yW}iUEt@vrtguc7l3;m z!SsiM22Me&=;pKRN`7``RDQ)F0&~Gq$?q$^rdOU8j*!o7?QIr@u`8A3J*xbJt4ky; z`j;p+iI-|w{>{)kJs||ng@PkMa!3rIRH@oZ4O-+-%3e{5Z#Zu1EUsrW3l1?z3@g7k zy`r5m&-t4ummZ@n7^^?34BbYmp9w(1H6-o@ZyQa&c1gtz%<;?Q;$c7|2bN$N<=7RP z9oGVRh|OEzYo8-0f-Bm_6??n%mWyOpWrE_Ci(;21Oa-Z`k+Iq2&dI)8i^O)aVr|o* zHs+V`xsrY+&^#N`iwL<0Rs`LuniToe5Hx^1Jjy=POeuFkEv|Ob5E*kH`WU325Ww|D zyh7BZO546}F%&2ynVRf_Tp$J56D1368dcIFK|%9S#dlfFf-^L3Np&)NI|zq;(PDL$ zd(u6RrFGi>;8^BqYZt6O8ye>5>=Lv-A40(KZVg&pibsE-LKOA~~7VFr+#KSXBS>N9WT+E^3;aR6}-`L4^ zI1UW`I&@ymdEPTm2|?7ITR*h>$UiJ!A?ZxD248|=XM-uQMU`$0y;KUGuglCyI-f4D zLpZKo=0GD@*o8!uR|Ozh3jte)z&+J|of{rMvNi9qKi@!-cLhma<2@?o z;GySy$e*st(EyJHq^+JGX5M98d3wa>ba&wap$|168-$+CK>wB-rrUcqsyKKfPSJE0 zR*R-=C9RT!Tuxt&_v8RSuM)MtQTaP?kYusff10I*E$bzDzoBhjg)%9rgnDl30`)5PDt`AfwFVT8bgKVTX^W z+^+P?oFlJ03SM-=Aqj8`LQkQ^=Wjm_AGizZ9>c&q4jex2zlDTLK1WHBnRDm@bO>|8 zo9l8e9JJ%piynU-FF_T~lWiQCJ8Bs@v#k?aE3Ce~u(1w@eugzy4 zOLi=&Rvo7wQ5Ey0U=>6gj}S#Snq$AZ&y^$Px3Q-08_MeWZo!$d!bBPP8g4~qh=S>L zG=}NNZk3JbA@2O3(rCiv+#|pRnw22dL(tNOu@3QMN)NdOo4Gq8h{O}SBA9QBI;yr} za(4D&is=$qcFrAyvt!(D3yJnz#&vflGN-WN%qxr0=?BNWLH|G}1_dNKaqY$NPT7tD zN{0lil*;N%i^8Mkq3Z{|74OVB3^?W@v2!Tr`hVd?h;>((%@`bY69^Urh)nZbroNr< z&KLMy`~Lj+MH1V4z%H#J)7A*TE&mg*ph@J8ZICMp9um1ITO3oOihSqaxD2n|UhCA~ zO5w@x^S^Yv1dRTt+hrvy{STa3*1d&QMYA^wSLjJ^0YBGcW3wjp(&n59KbKfLPI987 zV)LrM&tw2^4<4}$a%BkU(T(x#5%bygKzg{!TBQAQ9*^xtm8#PKP>glSv zchIW)+<{#71j^ASDI{EJV{}b8ipKWrF(zge4I_oiFL}_Wy3q!74+)}x@`esa&imOx z;o!PPHX~cEF~y3b=Wp;%zMWOAp)JD-I-y~5t`#F$P2tq&yJrK<3|ooA!1_<|jq83o z#I6(3-3nJ+Q0UVvGVF+1fT$1=!`VXse+vI00lW)B++58V)@zo>SMtj0QEGLVLrQ?6 zgxSY@<+P z=f8Cqs~H0955B+k(6`d}e*qKzla=@14aTJS(eE7-=)+$LlVx@Zu{3hd61mQhIKr8^ zp_0U?

6MguPalpp1(vu+jbN*Pz%tbA++3KX4&$q5y?dV#s($>ppi+6YuX2-?W*x z9To{P%~H0~{2^OvF+yAt@ls+^Rtba4h`IyXcL0VVAh_I<7a?7L_yR8i&ffwdMA*rP zeg99hoXN?g+@RPEA0>u~XFT~w$OgLvsCxO{b=m?^+FGsMl>fdS3QX`4VOk#U*g0PW zy_tr?pR}sGgRUslDNR#OwSEpkhrFp;i92AFs75a2I779Z0I4SU!M@@EsMZlVk3xea z?r%JE3f7-IdC$>C9b>YNt(iXM;0vEGHo-%DH^HCjUMS=J;s@jRV$bOe7v6~A+{k4N zc5#M%$jLJ4kUWA!8JxnwB|dE=HDBAy{Lf=*r!9u{F5yfrQ$4u^9#;(X6IZ7CG0yA(Gq~=p0wy+H3@Q_hpnm}2xO4L~aaB$(-Tq#LHGyX& z#T>N(SdG>)oVG~o?0LbO2lRW6wjDcM_|<8q-XRa=9{x#4OtN)1Za~irU>x%*8>4>2 zces$yq!#9jm*mY|RM0+|7}fDCtTi4lYlAeaEN-YDf3+=lv*Xsvzy1y0>$_B%9{YV$ z3ctPB|3XaphX)h1ak6&&#^uR6IsUtpN&de{3G>BK#j~&8sGk zWYu$QOL0t!djrE@&;0&`t=GWsWH(cdU3{!GM^oQpE>mr7ZeAYVK()c_VC02XYBUTZ z43S#Ts$HaoEjgvm`LIe8AE<)Pib4Wb^o0@Q4?6d`%fb7EU@7|4vD7u>MvMp9+o(G5 zkhtWu@`U$eE#az$h~x;&J{-nBr5S6rK`RJl*#)~u2)j}mF}Zl|u?Xk|nK7RAH)Dc$ zT*M`_A|!(!)_Cn%$(}h-!!6JE#M?Bqs}-SOf)~Wocx1A(X6q!#4iEwwypXP&5gFPW z=_l#l=`&A1k6|7ZnP{f`r1pHTz&8QAHJ~buAS!157q2vm z?ms(7V+D8@D+x+sOHQ4Cq4(s{WA@RN-R~0_P*;)R@b=Jbyu{RYb73QK$<{#)l`PDD z8+Odz(i>;`V7mfmdVaDf@jlc|>9o!?Yn`CmMhcVL%(aR2} z-p*_?>WMun4{N*6|ahad|@Rh+qK_DpGF#%x2pfuKz zqG4hDVst`q_+i6Fe`5*8&yDehwi$4xm~Os*DgX|Xn;|5-TEfXmcKUdE9n9AOdu0US z)SJzvM4t_2<$>_<)z2WSUA_FL3p|}D_VP3~d?f`W8Dcnfk+Qq^2y1!)g9O>SZFy;~ z1e=DnNNo-0X2sj5ocmMC8Led{qB-N$tOKyD>}JPJ5e{ph#=_9T~?e#%?g z+8i`cPQ)m1HiXgYy1wj{pGR1x@`3-RnJEbp+@Jyd@gv|{CC&Js<3nLrTN~?d5SW?1 z#|j2Li17`VK$c7U{S1Le1Pop01PU${sv&MR-#9ZfFP)An zI8jqyTUkhPR5JU%P`P1>p@=9grI2K)kfhDBYM4-dUOz$srJC-MVQh?EQc0%V`F82? zb!K0k84m_Y1RI7l;ZqLW{B@(I!4{A9MI z9DbgX-b19j7ED?>GYV#Q>MV0hXudXe0XE9dMQkbzIVx3`=nCTrI%$9oADJ-nt2t^_ zvV4GspM+==$wi=@fD_C*rV{hAvzVjtDRmD3bU*^AVXs$kpkKbynoVc@0+{ zP38R{;hCCYL8LU5f-oV1Vphg7>Ar}7tfZA;*(5`Au5j*%0(HlBW0N|E2fT#f_&3A^ z-~g{#C*9|aaRCm|$i?R{Fw4B2&cvqeUnrEZ)U;a5m?RYoj?#H}t>Bjvd-GeBXXoUu zeO$+RWaV#O1u;%YpsKM}mx~Arehb$6s7YZv{RL%!hYay%gw2=eS=>QU+&;hXBzdtb z%-VAqVh9ZgT=UZWCYo|FaL8n&B1TaFl&ZWb(knEokD2h`zaW`tDx!izK!X8e zyS7>wxEu`VmoacL)oX7h$G+*62I@2-5e$gRgpM92FUE_WD(Y>8MYCAG_^U&NI zQn{e9B*{bmJ(r@Hq=Cn&k|y*{Q*gx_b7)$+mTsm>RI=b+4BESThWzu#ovgomi|O~6 zqxC})cNbv(WQlJ&D*NpP>K8dhFcyQ@$+Sn5N|#n8ZuCcR$RU)9KWHzF7)*X@!6noe zR;Zb~Q*&pjJq{q2YIAg5$;&qboabim`2*<7|KQC!PwDWfP)WMHN;`S$kW!BhV_==& zB+5lR%(sK?m*#%lEjYTdiM-INr(IyUFlm$7~g1r+Mw0Ek{@m@>~P5U$+VsWR3Gdnsb_-|6RqO-?L6O#5tpG zE{-}(C*0`U9W3cAgk(qM(R@L&y5stq9wxrN!^%)sO$0xRcWl@{CRf|gTs`Z^=3K9k7VJ~wpYsDueQ$Wnu#>_gm@}I zUUj8VTS6Z7Bp38F8wxiQ30DV$rw=wIH#?<(!4n+h;0kptzK6u|u>hQFOfHW1V@tXp zAKciq8@1OX&^0?yAk6L*#pzFerE20+IAXff;k(m~{PuByPXDY5O@4scS<4FX_rgr3 z&!XR8TDjKkq2^j+rTkHN{ykLf;^|d1a@=g4)QJwX{kFHzK=MH&%AmKX*#vWTP<6QF zvkfq$HN|peB|W~B3z(|p6BY-jluWxEdACj?OPZc3(y@B()a?7}@P}fqoA}`M0-tKn z>N>w=NY>ih+IJQ#O?;Qydz4BJJCHGH6Q_`Rl|A37wE;tYz(@?<>)T~f|tFJAsWCL^DTspW5r$xue>?OxMNkMb)_zaJz%(7~>3k;xW(qvANk?A!E=@3( zn8P&Y&{0OM&@#(1rGxIW7^^v=01UW6H6(?rRlbwBP~~J=KGLl6z`R9G>sUol8@*#Y zd|G9an$HD})sV7_Ac#ikLkYqHOd>)Q4oeTY9lPiePs1u z>_5KT$A=s*3a~77;#*%NdQj`g>dk+HS`&C7*=lTaKFu_{8>a*`2V|z!26dv1_sqej?E(q#_!Xn)-8`ecU$v%?j9jf0?f725Jp2L0}>%%vBeL(!dy!GLh7D z$$Vf~jtnnKGm2QxR(YtbA8L^<=xbUC-aWNHv1ZJaHf~5uQ>v$Hpwo3%)6mhOk)}O3 zk{Hwy$&sZld|>JqJKC&t8WKX*7eW?N&h#CF=VXb`YdX?H$DFdnoQAHlTshO&a-jC$ zM&LY0EXz@vrMcyipO{R%_oPT$bU<*-m*j5=$GukwMl{uoHdZ)V-yrJLufe#~C}%05 zXhepZFZ#wb3-+(V(T}z zMLMEvHNCd?>5d%GT55n!KgVpgn(Pu1Z?mAhVw?5N;Y}kokkpT)tBs?hp%0{q+>Q|F zHv&;rirl9V9Olo14j-p9>Mt~$k1EVhb^B}_vq~V1zQvnG!mDVdanBdL7h+L&t=&eK zZY|qORy#+CVCSwmPQG^p@CghS;>i_0q`mwN8uI0&C>H7=N2pa>aG)&m^vl2e!b28D zd_pc1TAZ^X{!`mNDt#I|V{0ki%hZ49f)_*OB7M6kD~=9V+Dnr(v?qV^EM!SPK7%$x z8Z$8e&EGBDY1kg5g&n?>frgDDv5o;h@aHqea1V&a1aer&2=QH0LI(+U_Q^Yf1N`k_ zDS)st_a{)0%sbI2WGCiq=LW2LcC|N+ZTg>J1Xo7_Fb|3Qn+7^BE!~V0E9`G#If6~o zRkf@!7p9;;9)h*&o2mUttk!R!XImZ1-!Nz1&<#!=gNm@<>h`TMSh$nKE>^_bq_hOn z_ObEvp_D-iqpDHvMl;94U#%&L)X@8$+pLbTT8HPeByDl3scwfqK~pDn${YL2V7W&qQW?KARoNr zbvUXVf#y1bMS%A%lOEkSx60Q?+q2?X!oidC2m?cyut;%5Sl$t-x}c0ghNRWvCi-#) ziC&d0=%0~u;y$qV?u5CEg;@M)jV6GGn(>Dwe++>`<4udJBdu;dOFEwCUop#E8E)y> z8X3X~c1x-y>X;mpNyTRWhU&zhUKYBk`h7+8Gf7NUf9zSOa@5LIdZ1F^1RVEG(_3-- zR_h(Eu{O(9wbQ~84Ip~HO|ixO`RS$Pz2m{O52o=Fr{XQZ>;33-&w9cZ;-nkmU%WJ! z9vhXrrVUlTDWi8$iT@sj|9-~zZVc~D2>zvt|0xdt=?wpQ^}{ovHTBFjs#47&>}vOt z7Odxs#aB~qDEW7t*R_K?=pN%6=&Qu?#}W5L=g$gh0sA=;(lqXg?mlLAoy2`C`^=Pm z2zHvW8!G}oaR}hs^GtrM4`uWoH|SXxZ2FB}GGR6a^F!W$HF`ZK-c-!rAXfbEXurM*p;X|13$VXxd__Vtht7-Hy$1(1){zeOJfL6t?3_3&VU{>Dj`8DXc9i zh8LLOYl@m0!#XP}RqC|yiM$O3mz`v#$}4Y2wO=Tms-`l0FQ=oC|Lhkz#% zcY~S%=3Nc-NFnXW#!Sbz+qBy+s@<*^Cd)t@VYETBzP^ycg78s4v)oK5lpQk-R;4gd zD3fS4i!X}Ivz2Ai7CYtX6+b?YAepv|R+E=0;ZIJmA&3G=Q1oFCOn*|FMBa&%TdoW$ zO*v3^h~3niq5X-c&4vLWu~eAOUZV`?{D%*{> zzzhN+wMhg?jGn5KLa&-pwp^@*SqHgvb=WVlq`X3&z$z0yuo|heteHj_OooWM2)h~(X5o7mHm?1s&q{TgutVj;yJ@qOt}A+RH;j> zT+&)5$IMP+>MS%vi=Q%_tEXh9jYM}I%kEU>)4l4_nZ#AURym)m#cHW*d|>+JkE71} z^`})^_#5Et2x-~I>`HVsirk{Ps8yvvp1~m2pEX%&L=};G(W$$3wNwlD2GS?IoK~%> zg}*?bJi4?Q7&~VRwk2XPdtZ1{eqhp&7>lqKCP)EmA+~?fB4E&bns#oOu-iUlxm7lS z`17m*JChA?^e6iqw9u0K!Nr`7Fr#CY#iY}HyWY7sGmd|g7|KP7uS%2yvA5&e8pR7U znt-U*Y2Ua$5>d^o0%YWuFR$--1f`aaTAZ*~O)%9Z>WZNFy6IaORL4PzklFaUTzc>A9oZzdEI3sk?yr|vldr4~93XK&&e zMhrU=d5iRa;puIN6bW2|pKpVc*AP{?pU07i6otKk>`CpwfCxV4@;P|euiZ+F-ifps zlN4Qs6kVE?WqjDQgWeGBT8%zFhr7Xm)S44at7E}d;ncA5Yui6&8icS?iFw0Jj5?zv z_gI~6<=!)^-GP$EurqhaX+MEa-*Ug57mDYrmy%R8T1#s*UMVa?7X)TOU%L8OKi|u3 z+X2NHyI*9cRV)D?i6=|w zVBVteRJJ3z;p_*P$J@-*kdKStSK|sRqZ$C4@K?~lU-MUpEi)0eC{I!|dn^hTD>Y0X zvE`7>PH_7?;uh>JD-MESO!B{ujsSvr${;A~;a`HeC1rfN;c#qZIyf_0!0c<)8DYGHX9aF%N|wg2E+ z_#qtUu)fVc(0T{#e|OMgfXV1o03$2kp4NDH2~zq;(v&Cv*IX}OJAHO)|5N*Z7_p^z zMfGses0;_pN@G!{Eem88RDU+*#8@QkDlI7vMoL0A_y18443D4jVVw- zPn-*eHhTv+!n?M30e7~`(wFA(r{ftL^Ms~$h3DXj{)KDs!P9HASilx2n}-*(Ywd|C z_{=qQ4RUb9mhmJ!u{Yl8TNC@HtdM=+4k5d5@eI`Ehqs%d)`z0i&*%!fJ#_aB>m63{ zjMEjtyZ`n~S)|hk_o2fRHra@l$DQGY(`UxjqnO$ijFENl`x+V02$3MzIwD4UU9lj$ z2_|llzquK?MiRAIMbyX3J%AnP#1Lptl z5&VYYtK-F|>XZ+K6kRG7^k{w0p>=N2Sw1u;zXj+|*vXAe9y!8=4`}azC!zbE*~U6* zxBpNe>-OT&cp-|mdY=akL1t{o)1)MsZvV~+;TGN>7oh(3df&HvKt&0h@UWZtzCI8V z;?>z8>8M1dIH@%_WzfT3(dhLi*&vQx0$0&g;+DG#k ziSTUe#8*JR8^*fY4Dfs1=zBvGhdh^tN}<;Kac_cE3c_E=bGXKvqKodA-}zkw<661| zi8@7JM!eATm4Tmm?S?c0n88Yl@*D^82wg_h7cq)pu&aODFmXg#Wy;r zXfh|G!Li8@v0a1)g23AogJ>}nnvdI<*DU&H?e*~C2BU`sl{-A939JEBG+ce&64OY0okKvZ>tjWleW-UE7%)mc6R2lb) zpY)A1b& z1<-kPCZdQ~2S{tA{M@I<&mlUQrBU8;*{$=0O*=4I;Fj%`3f+}UP7lkN6(nAb?Sk8^ zcaO7CLJP?GpsZd?zo|GK{2MZl+7*Ocio@(58|Cc3xI8^{50BfA37uJd9Hp&Z0UEwzdxU{&y zrfNEibV9LHIs-(bAc>U;nHe;B;^(QunvYd_+CB5U$=tBioGK*5Ws9l+_CjwC-mLP(dFWk z+cib`i9wOdW3WJjK#WvBlV!N8O`0K;SRXekaOFPenR#|&3>Dlx^8o{lmLV{MDl0|q zqfVR5$jb#`cGNB@zGbtFmV#w`Zj$q+6*dk%tog67R~BaV1=uo_6xgK$3_!9E|UJoLK!b6 zLaMkOu~bw(()_9fW12li+Fb4vM+?&hH)CN>bIdApO6QgxHwOCrgs&6&9QeaOKCL~s zOV>p#{w#4MTn#r8#&w2hhwLE$Ma1xyiE~E)QUOKE%v?D9MizI{cupcY*2GaT&C*F1 zkOg989{5ctpAeyd1=O0qollGe{}!x3{tS?6PI%gMCQ74bHH;d@F-IZiqU=@6+&J!$ zxey0|jy0%1%ND#zuN}FW1Fpx)(bz0O?GYiAPk0ON38)ZI3npM@GBX7wn{I-|z0cmD z9g6Lu=d#7W%7hXRK>`cORFz<%#-vtqsB7F;`vF`L3OZnzKUOz~cYzt@6c$JT!7oQ~ z^|I%$q8-fRb1=w|bI=vmIm9&>tgvLyM+f-Ss~cqya1w3DPLmlo3r)K_*dWUVvTg7_ z=t2t5Rn}CK{+})K?4=EPrv=~kn&{uca@u%{#1atXm{}@{ z99yTr6DJC$uGUxXySuOjTU4K_FGw-SA`KT#yxJEGr>Z(7B#Iiy#C%Vy&{LvJ9>}d! zWzILCMaSfbaV4_IMm8528)))AfL|doKYT>B2Ry1aQVl>P`gUL`-zwtd$M)B9GlF+t zT7-F2AG?q!-TW@Gr5J4}w`4*C@=TypBaUhed*M`lw6qBJbz{WSEcI;>-6F>As3!|h zh2kv(rTH_x+%97WnDDQbi2sgP1-1*R4@DM$V(NV8FX#fqYo2N%?`l^W0H2drAp)Nh zEtmQ^rJbMpJ^rppXc%}EALYiPBtFL^EKSQ#Z1X&N;T~9YPH_#JBdI=xlH8_?;OeQ~ zgd^4K{bZX^b5e%J9q|84{~lvk$z+@hZ*~!kC1!PE!2wv_JVzf~r3Vb$tDO4coFC}RM#tQU9PuL?=jS{Ja z$rgm@ zr%I{Tg&p={6HC$7z0EZA?F<>dQ37};;EArrtl1i@)0%`}3xh?>N(bAKBN6Pyeoalw z<{o;BaaRUU{@wj>VMbyzWa>+LBS(@S(j~cPKqVU=8way;EcZKnA{ZI>n76m1!$0l$ zAiF9X4pr`!MiRK+Xa%~^rN%FrXDn@G>6t!_#o=MGk^?5X`3l*R+ApB-H2p?Lx9H$R zo`oB5TnuR%3BGgrtSd>xhIk+F$aD{C%ofGs24Xgy(ES*iXstzIXe}0=;x5gz^cC&3 zI70rumdzyM>b6$U#2!A4z3PX6%NT%nPWe84)40hQyrVqdq~tWb`&gCM9|aIBaSyYe zey}yAz(~UJS@vu`rh=*Klibt=3feUd@bVjDC4*YCd3V@tI60T)xP|$+;3DbC6YTP* z0n6`Yt;sgF-<1D-$gLXaipmP-Ixb{Q3AI;h30HIog2|UrKFO|0GW_EJLl>^lDE;gZ zl%t2TG=Gx2lZ&Wo!EUp)XlcI$%bYHg-@T;fU0_wB7OQaXpOINsSu>T*SAAcWCFE`C zW_0GnGOyb`uWZ47M+a;SF|m9l;V&(6*&j4GHUfS!wb$`y5PeL|$+#Obf)iD(yK24O z1v;xoL0Y6&Yjb%^$FE+KU%l({dW-1od&|lwJ2OSDe#9c z?JDkTz(=UnHwgQKRMSAV8ifx&_Gco}18YW)MnP(`7^Tm!*@r*&jf^Mew|?apCa+$5 zchvXHolsVX;HAr}7wmnDq<9MIpr^-JAe<6EJaZqFGGw?aWknyMW#9BBj2`N`Q0NLV zmVPrC^1EQFtQ!G-hUW<70K6P|RG878ow}=h%K*I`brvGCu#2Su{JUK6H2OkAu#LF$ z6F@$Lab8%hp%K+1C3gSnJV@mz54nHgn3@lGJMC_lM8djgHgT)84f6;%-o7unh+8+$_L@mMwDml#ekEkZqvRRI%!^(a{1-yx`vAg$m#;Ek+lYQ6XD%O zOE8teZdS?Ho=Sn16r}h2<6M@iv?CvCevW6U$_IZl7vpxZWh*)kfxgIwYEW}dJuXAy zlu$R@*Wd2fT?#`jjMH`lDOP|J!+e5ly)n!#YlSjC|6v>=Sk~-S^K*C$KMe`p|I-2f zt0DPcOfWJ|%L4HaQqXpM!Kz_g{dsU#`BSG!!KqC2lDKnKh0?G6f+< z2%#?fgvdt$?mDC#+k}dooBkvirX0516a9o20jH9JW*CFwBL>ucs^vteLRAL2b+R~= zw>(L&M9hqS_h*l~FLr2fOMVjRy9;D)Xa%_u9yHc^v%PV_>#8ITRZ8@t1t}Jd^Uzgu zPgoTQ6olKo*nL-%r%l=Irn%y#Fpdc$9duze-rUAM2iK2a%)H!&v-&xRk4-6&iRfc? z6NyIU95KSl$Km?a*=G^4e(8+0BAglG_jM_f39GE97v0^m=Z+#gxwFUc$B_1*W_tXM z)e`-I-3D1nxPNZ8h(Z~>sp=(-T!%a=ZXoeCC|O5eX|gFy^T%Sd{W^aGne1^jJAiOB z#yLefX=wI(MQyeIg1w1x0F1tQ$#a|E`gLW(rc--^NSR%6co@KP&ia*VrADOt#i@=v zRr3Tqb($Cion)yVL2a3w-?~;O_3|I&#K6jkD%hXM!~6`yDF5&1|I0eyUwvq%{Qm@= z`zP)g3gx#N7LiSZf&)qeppj(6ie#3T{X=*!OsNs03#XPVsnn-F@IbvTUI?BypfC9Y z?eham6lk6)shrRI6YMTm&$v3>zg_<}LO_s#kSWmzGxVQgcMS_nPU3A`U5f6ajmad) zU6Bja&R&3|n5ZI-TC<79`6l7xmdctEM?x|dJECcP#!0uk^YR7iu@7Sg3%AXvV|Tf` zUdxeAR;=#@!5WUqnv;5s)}WCS>KL|jr#idJ#22Fw`<>IsD0yeINm!Rq^;epbfKc

flH^WMdM@fns_Mg(H9C!%5QAeg;Fp1}|3tSVU5NXx*wRh549d33c@tF04WvcFV5^vI-f|f8=Oxz$VZ45xzIk1mA zRqnHylMap2M=s0fqkr-c1Mj77n~!C#d^S!bl z?70^$Uh#`ID=R%xez!D;W)#z4oGR{Ry7NQS8zhQBnuKi9&vpIxn#THYqfPCy7l)}~ z{VcmX)e^M0q=1x}2a*WN?HSz}5g-g6g-YO&)(9abvf=HAdJ@M5k8xrsBZ!5V z3q>fnW>{G_7K^V6cR&yEc8Wox+g9O}E^Hn{?6=lFfSp@!es{nV4pR~>;}(r<>%&dL zl6Eb@nR^||iVZ{HCd6CR*8t0%OQcLZ6Ub*3uvmBJoEyv3326#UR|cqL1eXytRo$T3 zW|Q-&MW+!0nd}*Yy zd_d>}g%l2y=WjHBg#hp#Q0#?PwTba^>T~om>n~8%$eCdI5IkYtF#v<-yFVoAX~y;n z-Ng&w3DG|ZNARZ&t`b7)(G4LRg4@%%X;&7m!=K5v$cy5WZQZB}M1x-uwc<2WUtdTV zi4vEu9BC;yPms3ePN|Fhgfjp*_aRh!Szr;>Z774%a#?p8yE4>rFv>GmD79cv_}ZWZ zsVcPhojmgiVmnxFN?gjqrvc8ZA5P$qR*Mf-g;RZXy9%^RFxrgDA7TvwZ*EF2bgc3` zZz*m+R^z%!6>FSKG}Df?Q2SE44Wv)VG*3NFFo5pA0N!6o;nBVT%^qTxV1v+EbqjK( zs3LWxMIEG;yuVXZE$UTeuKy9xwxZ#?QY>A!#CsE5{*g+GCd`}xHGi;m#Ox$0kDj&YOHeSAoP z(|oz|a`4~ZLaZZw<{RL826-gPTB4$wFh&6Wg~W{~7NpIYzPkY4}>PRZwM6qkGa?!)X0| z&0BF-k*3~q98B2zwGqrZAvY6$jdkV0i_q+Idv>kIJ1iXouuoEqS86(|R_{8J2qm}T zi+)}lkZd=yVQT-~u=kNjy{Z<2$OP@8vFMH>-ITn&0io`7IPXYStT4kW!|}sE+r^(^ zhZi##Re74<_{yK7Me>}K%V&oat3SebRa`V>ebI}UzxO`s!*@_fIcW%uZY|_;DT2v{ z94EF1P97U7UZn|TK6KFx&?`sO(?`;o@A5{W>J`9NV$X^--mT(FPl?OVR(4eV<#N4R zM!{YOC%ke30w8V^c)n`x>jg@YwWu}cq(r!;GTRakY0A2o_e`WUd4qi3*7L zOfxwGS*!v&SODD{d!djOeT`LlupFNK` zx7j@ky1!m8U49{!48!rs{t*>I} z57l|10H-n={X6Jo78)uR!{u1Aa#oiuUL2P%CLYKZ#UCO_F{2+8Y7{1*pw~~S5goue zG53dU(Uhcp0g^*z$X2}vK*J#T=(Q1hHG!;YJo44;JPMk0ev#0E*-!kl{kn=yQ^v`D zPXlHC5Y6sGR0v_2%!!DgRsvgw@9ibQ?>v}6&K|qJ3_N$9;)i@+0>o-#TfZmdB`Rv; zQkx%Rr6ImeW=%Fyj)us^S$O?dKn~Gp($XFnmobC$>_dB=j&dVZ533ifn*_@a;XnZ!(Yqll9N;K44B1n9P|c=Ig#X^@oPsGR7qO+fa2zU^ zy`8`Iks1R<$J)Bu;kdNP+I}|FQj2js%^<|YhvC2)jmWJoeSZ*+(LCw$hQ0Dnk!9pA z(&6MHRQYYnwJa<5X~k^SPLe9OmOZmq_+QWE*)wlDmka!N(qmiBM_>c6?uR?{+R3o& zwXbJla`=F^gBrmH=H}Cxw}-vZOrNrJ&j~PMap(Ej*A9FFIj=zLkjjS^UA2wa%;@;0 z*k|Az-ST^OHbr`*BrIfAD1%LP>XwaJ&2{`%SZ;;#(3x`Bhv@KSw9P>w%3`@(A2gl6 zxq>dVa0R$@32x9yqg{S+qfNGNdpJ`aeK)iSyX0D+aCsJKRp^4TgLw8YamEN)%ww(~ zBb>XDqwUo-;!BcPMBD2?mnasqtSt@VIJ_HHoF}o61_%p)A#XWQ7B6d{s(G6P723Ub zXBuR=*>DhFl8n88WURzvG0pW-m8jdI2gmY%|GFoet9NjCo?H(W1N>-{v(a9E>oujn zBKNQI(#`RklRryO9GHrm;Ww{4yJl$u0LwRu1{8}WqeCeWw*6fNd?Q*XisK3W^RTPo zDZ-OIE(8BFefL~mYZ z%T-#-(MvWm1VSHucsPPoI0+Dm=CI<|rz}?aX7bL>d)aq8VmCXmHzJ|+=LABq7%4>e z##`eP2cP?o&^`D|Tn8~OyDuqxzIs>E{~%tT-WtD4gU}1)mPLfgpxS%cknm)`Otb95(TJ<2e}ij1&Y#J>s3Mo0ru-g<@a zBneDu&m;%&S!tkV^+g7r6bdmnf~awK5eJYxB9S>Z+%4#}LBYta^A%f<4E+_&}9OY8%a69UjJH;&+g%IHU%F=s(C!y;egLcHH~Da*f!hMr{sFT~Ktp^3pL5Nn)8 znlBg6D#R*HDiM>3T4U07urseM+Dj-of8|503sUbmhbqUE9Ot5d+Z{S=AeaO%VF=@9 zR0m9DjNoCWH9*7jIa3m4cHnJxP@Awft}0erP_M)gokuhG2>$Q!IuKvKLimYSn$Khcq${~vEB9O>*oiEt*;g;$}S!wWGrU91$i7QF+-)HTzHYPdcd0Dw8$|JnDbv` zHXxG<2qhhOchcf$FV~ay8$c*HxTj>bTCOyq+s6b0((#dGnkBG)x4Sg3Or%y<(PM^k z@casLiK8KN{9OGarl#bMX`Sk{){Q}}{ zv>yn&BY?iVl__t`p}XGT;q<7p&C&Qiz5UbgQ|UAN;}anfDM1kq(pj}Rbsn`br=J@x zX^B*0NLAT*Y&d3ek2h-;kJ9O1Iow~isaPzw?lTfKZuUj-Wg=uS2}rL~W20R|Z?a^h zbt!T06m`$VW}qM>=EB7#cum`zQ_@C9=&6fPd zZ!~95>K=-jf#8I&W-t{|HfN&RY@l9C-MXXZY+E`AY9B_gBOc#PuXIoJK+ZRhH>o&C z3+gm*O?ts%WBd^4-=8EIWT?@?V0-3T_K>E@C-HwfGf819E4^{=FOmvs>=i8O%vXP_ zl?&XbchDF0_<(+HF+dvNHK}4ax*)}qw^L6a$WXP`%rrX?K%>w}@#5Z&;8A~FzJ4#6JnyiG~HrjD}WLmK|Z#skbn1VSEoC$1A)aZ>EaxveA08NYHRjpkvupWXS060zdLRck%S0%U3b!_V?=pdJj|* zqiF6lAMfz5IVe=iY9kiz>QhmLhD0+?@iyO8=mZ00L6NPtUOE!3b&HXcMwFK^D~1Tv zB?=)6g${%w!i^&I)p2wv{Sm$(1GEgiGoLvTc*=%Lx|<>>3LC&xHSi@9rzii?aEnAJ zdo+6600Sfgk6p9%J52>Q{3kyW820(cmhkbwJf{*LH5IlYJ57uDsJEpsDcg*hqR|2* zN(p7Dig7R*(5wTt!q%X?G|I00N)xsz^YfZz`Cf-v(||31wrRUR#}jRLkFeA~f7U30 z!u+a|j8>>T&KJ77clDaLKT>3S^kLjAq@e0* zFz%eg#p+Msee?pXf(Bv+qcnRddlkxW-!+ce^{l>tt;S-TsCOhwet*xfMs%h*9N~+J z#cCJ6JMsn2_%Oew&!&9hR&Q)K+@lr6aCI5#t-PJ!%vZLdPz8ZQ_kbK$UZ8ES>{v#7 zp&l5fC~zuFbvRbMsjT%j-bUMYoMZxNqVyu(Jv=0-)!OI7Nej>$Gk3eHj(5SE9pZdp z*D#zpW4G&pG&~a1{4<73Ejjn#sjv0tH%(0gLlgN>%qAhWCDUL^32baXOGh^r`D=p_1WJa`*^P&sX1 zXoIG!!8wxDWT$9y3R!<(3S5zlIr5cLLmC>84?23sJvw!{v*%rx>@k8fX!tslx4#|hA`Y33ba9u&+!=XV zO}9-bQe)UwR5`ChMiEKXi(+t5&&1b5asiUbbZQ7lD4Q}sqGZ>1wy&rMgy1eabBKzV)2)#-t>}mwP9I-3$l9Ye&rpw zQsN;yw^J;DS@H|=-wTD>bGVRyEHb$LdDf`^?ub``)jhN^ICZiV59s>k{MZJ%+%M$o=$8{0eB?1l)lsuha z6hxW&KErRT2#l@*<)=KMASRh>Mer-2=ZRRc)7w}nQA_C-snPT=tX35XyHo9^a zH{HEqgPuzFIbDuXLHU8&>~1uxbM{yYT1&xXq@uYJe6rL%YgTGaz*hroWU->t2rYHf zL+gUF?b}nuwc<39B}6fVe~G;2HH@{;*yMt>{0a2$=WYw*U&r-x=IKA6z<;5zi5UGr zyJiOezy*keE%i+PSxzJ>T+7VMB5~Vno-84wIrs@6C5B%1B);y?qhL+^Nur{vZ5w#$ z?O0ToXj`(x_DSX=5X|4L_er?zVsHwhub_3Kz20(|;%>cuT7Q<&`OP%|h)y5mM0tWP z4ab&cb@N=M=T>zYJVfWnZLs`w*=50fh);Xrx`AHM1E&((gCx+_+P>_)A z#NRiCPq`l!hE>Hd@d3j0p%<-*Wou*Fyv@M1G_>Lr4GWT3`xpI5Yr8Z;1r8wg%P-7g zgi%sSYa5ys{irc~qG(HuAXgR;Wx!crP>L#?Mi2x9%1A1^23GNwlwBKkOBT{tqsrzQ z+C!`TJHv%L%<{WGjK?h1lCq{{dDlxNBr0K_=X#aECTr=F3T1hG>skRr7&_E@Qs+JdZz{c{m?&e3R5t&t#u^|xCRBNH`5ysfrP9RH z(xa2+(8W9b58sKr6zwpgAKwt8vF)ODY>vTVtUq5N59kZ9js{4ewSrgRyAG=8ySVr$ zLWxwASp*IsBsaCZH^6I)4oFw}%wzKzvouI!F{Z!m?W|6L?t{N`$6H7%1j6auh2isA z8S4C84Y{zt0iNVJ{0y}nvjpMaLTcy<4tNlG+Q~9^-slSysIUciJ_Z#_;A$ex^d<89 zEL5YX-pPc(gva?>lm1gxCzhmhCK~1U_kbIb6Zyh55wWD_ zlAB|s|Lv{o0hibV;-4$R6iZ|AWwDAYl9&r9O7Khk?sAJ8nwy!A@brO?K^qlYd|@yy)O9RF znWwnPLx~`fZW(L}`oWS0kEul~G_%@}W`ta_kAP}Pw$k(%Ji@Gqx^sEhpy)9CQoAm* zdLMua-u2COJ4w+#o6mh=NQeUf3_>$WszAL8^1NhF-Zz@YJp5TCIKGHssp*l4mxVHT z@l-YF5Gh+Ub=|?w)j?2eCTAa^B4>UgcB)s9_fS+2-M%zxyhc6;R)}%+rRhsmKmbrj z1>{chnu#%VfzP4l6AEjkB3I3JO7dtt7;&`AbtstRklfwns{tI7@z&Ro1YW99IQ~{q zhbjNTYPJ?8S>ZbpTg$ICkXk#Etj8-su~UZBRbY1*7 zDoHAk|XS5sH95wIxYm$%tXrOHCX%!WdLz-fMzLMfdn9H-bIo7hCqQr|s*cQ=2cRfg%_;IcB zysd4?rk!6lQH6tQ@MWv5Qf@xNM4m~Pm#1nMk;A$dS5o=$!a*=mOOBDHgs&B!_pH)? zR?_5SXxEiuNI%0#N+c?Dc_V0@c_Vip*3QJ&f`cS*ec6y&^?de5tatBpy$Wq>5p&v7 z)Wp^Nb4%58M6y5u$5Wk-Hjbc*cX9G*xxl|kugRL7Pd4#)=x-1X!`sG0H)@kqO14VQ6TgJk)u0 zcdMfDX;<@ zQN(F5?$%UTuB&37E{g7JsbvRRumbn+46G|}ADub=XYFOct%#lCu!C!s`#?(Exh0m> zqaM^SbHuspZ(4|>jI7q#l+w7W6-gbjhN*@*yuoD*%f|Mwebll(9eMVfx*Xyf_BjPz zUAFu%t*s0Txau;+kG3;N;5kEvdoI=DB7d8+7ZmM$zoyPsyRsO6NEj#_PYqkCowBZU znpIrQvaHAX>7FT?dvlLXrhW95Gkuz*<*E%_O-xP9l~qRj$4TGJ-9i;m6D+7IrC)d0 z*xQ5IwXUbZxq=K|K1*u9;pT3*n^-JZW2??19OOkwg!4MZ<6;}Nn}-?ImfjL$S^kJw za3nJ4Km9Tkf#{1A+gWe&-gkf630oBhqZ!L4RCG*(oJN)m&{UzakSW+>KR6vbRh-R= zk}D)b-fx$3O!Eg%>WyPO!{pjBfu0|dG-_eg7iuk-j~KE(34vL?JD!-+I6cu9FFVcv zFf)VAZOvWoN2&uA)*)DDVa~vCD>aIa>@u}!vak<2U}`1j&d4>=b|@f>#b7~ZLpAa! zZWH%?;P%Q$$Lbb+B1t^HpwF-(Oq-bM>Dl1g#JbphN#o%TctVMkPPatC*vci~WTh;j zQyYZ5H%Y8|h=3sv$#`sFs9!D9)gaMyZj#EnJyAL7PoP=IBwZ(=T|-rIC=YkFfSH@? zA~R6V7@_FJL~P$Tq-{R_v(_)Ny?o1KfrIO;h$ylxuc>r-6lWO6{(ihEzXbCM5K z_4EgZBaYu{Rb8Emju)j6`Xwz~ua>BTT<=u`&WnIKMW9)+gN`Icp;lr7w5B@MYYq?O z0|R}3g9>KjQc#Bd`01AFijVQbNmfJ}Se1J_^fpK58T5nceNv z)9gW>iaSsO!`^2Qv$mWwN;YP(IF8m37I(lV9&K<{UxvFI{88C8)9c)VmVVnD#yA{} zyL(MVRxz}_Kb%md%$pk|9detdW68mP*1VHp5m#c8Ibv*4SeN z{v3c6KB$~WCKF0o`r#}QDt^AnSQs$OpiO0Fvp%;Zm&9=hO}-yxuqA0HSNC`ndM_P% zFTW9OW%sQcex745%@ba_(Pu__2q}5jN;xeyr~nXd^|>G(IH(s|RVUOf*;`h>5FBNo zXZl6I5KtDq+c)z8ID?g+qH^d7J;cVp*a{Zer*MeXKR7JQi(TYqd;hF0z9#Z0a`K*j zvYDPL|4tprpLF-AfU&4yMzAD)s%%(E)60980ilZ)1)c#oG-3l9Rvvw~4FoHx5WXgg0 zR_{ll-vn=dyb0s-v>}grOe*di`w;=_w43N%7N5eiU4=QX@8YIN?Gu|iX9BVK5w=4u zK741#QwO~z#4-aoM}wUwlO+{)e zy*w_``Vq~1q0igptI~VY9kYLNT9Wv=a^lwx+a_ZaJ64s&4FUX7`NR9NExI;8ro;)M zYv8Y2imE==lZANE-E_1gK@Ui616v&v7Z}0C)_K1V8-VLWqeQRJE#&L1)n2DnVQbQ*cx)HD5b;V2nIrA zluZlFWaQg&z)bU{d><%v=jL9+>3ub%OK24z zx#8mP35VBN*_OEqlc}ZF4SX){SqIOVSu`t{i6K46Azv?9Q&wKBa71;PHQIN*;7y}S zSR!xLEeSykA-R@zGkzz1j|bev6R=tN#q-&tE3dgPtn)kv4B36M$un-ye07v_J@lq4 z_rG9s$L@D$$OIPg3~oyUF%=W5dht*BOPJqbL{BH}?fG2q`HWmE_`vVu9I`LnCPCP5 zx*>U_g0ME%vsiP72$9;VG(#gJXJhnlZnUQ>Ibc0^VUaLw@J3Bn!nE5%nrx@la5h^y z1~FH484WkjBC~XO+SseK7MrH!&+eN(aA0^v4e6WBeXjk^xOSOrdDuBke$xW2!M~`r zxebUMh3wQ5s88;y*{!9~Nzss<7J;g+wZxKPN>ofN`B`FAQ!HwLR!N~&Gjsjm@uA&q z1Lad@Dx;%bR@E*{zNB^N9I?A=!Ze?ZL~+Uj!BP=`)rZpfl=V`<+g_uK2YAEY2LMaCF&x} z?wh|e>%eo_FWBghUZ38vYDMKueoxJS-O+NBWpWc0KfJfE^87=S0Em#_U&oJ=#C#Xx zIFer{g_CS?5HoNHj-EhDOe`~ME$vJ(I+Vg=Q*XF!5SKWDK~RkG2P#qCdC#q6k@`i4 zMBCqS*Xs&pHVmv>Jdz^akXqXAus~>>t~bqow(8gYw^Y&qblqRk=72i|d14{1w-pUeFmf=^QwX66yv!ftxTgkgV*0ohr!y%yz13-ytx;7||4Y~>0WF1l@U7cBf2MP4Ve_E3F5y~5O3 zAquIi_HCqHh9`^#r8e#`=Cs~*y>fd>mbL(tCO2^cMME3|J=KH@-XwT67EkGp1I^?O zrCHGN^S|RF6Fr7V$v=41_zyPn|H`Fg_~)ciUP|U?#LS)PHZi}8k4phSf#A!w-xo$R zj0WXvdbcn*uhw$THI`p6pVlPsz}u=P)Ypf*6V0&Eg|43 zwj>fHjXVxY!IXXiJJg`Jkq-HrjV;bd*R)e!IB*$iQo1>N52WANEV!etX)Z3jIxJaT z4Dp4GY!b4X7x66;m3$4Vymp(_+Hhyf;%n(mcR=>3Pytk&Bgk<0N+M`g6a7_>2}|@@ z42nqz#a;tq6IEKs2SKtg_YO+t&Vu|T_GSNN&IM#^^gBWss917w{2N6D$qm0#W$B?! z=Y)E<>{xD?c#Exhu;%U?2I{geN|XFq5sAkk_e{-jrlY-RVM(F+nE`9<6NwV)d^v@p zACSvX6~g+UAG4D7`($65wfk*ZO!H|9?bNy9M%%ptzmQqCMT~PcN1&WW#3r8 z_UTG5l&+WI${?|VMX8V(^!VT7+jVFjQ1KJnQ{ex)I7ZUO#N_|~W=2H|nIE<^_xv)y znlFIR7DU(DohlGgjVdy(SUdqP9Z`^s1ol~qRWg-Ef=^*6e_rU%E>$D0`b~WaaVF1` zi_F&N4Tq~t&dbxO)VG7Q0V$7LFP61f55^{Wl~mN_8%{Q#b=gkSw=3Aoi3>?JiLKS+BMo(w1548^id`1&#x{&~~2}j4^ zkv=#>Uzm)J*le3#Q@4);k1}a$0>lWQk-V|7m?kAOz3F0jLRp&Tsa1U?aUI!tePft& zkYr`D{FJa298CY+$$_By5#7~Pib%KlB<2WUm$5t^h=`O0TJQo9B@Ib zq}0JAcVMG~_j;$GhVwR7iH+_$a$*b{zJ843JF->Ob?FaS6?NdN7R#Zh;K&o-dB-Q$ zAEog;7Iz&NiFG#O4h z)aJIXcP^nH)Uvi<>lD3XmO{s0Di=yI zaTC&#S^DzxKueS1f)=9snaDg4A@a#5NT}?3^J(*Fg%!lMf z4kj%QvGqNqZ$R9x7`ADVFERHvOGwOz{Sx(k6?U1A_ik;1wl8_aQe2XRHSmJmU;n`r z-@$JBy86j(0Y8JX|AP9;8d=F3=@}Z?6Db%O{9}szzez4pUdrYlpiNe|!P3zn*uLb#rv{OmhQ%4B?SFAUeoGg173wV!@DeKV*mGxe1Ugi#2)y zP^1*8GW>;V`V9}D;|EZ~Kw^T<*JhH;*LP6z6iKf7mUCH`TF9jQi}DpwfOC#$H5kpB7{7+&cYw?PGnBv z=tA25P&|64QI!dd+HzKYqw6Kt&>@}aG7N=XPFUbq*av1)`gn@F%{sgD`S{#SgRGuJH<|*rFft&^(+N0s>gJ#U3G) z5_2mMgN|agH4s0oT{a|oIJx{p2ylGeI8fbtHJ zy=aRGv-F?zgXw)izP6v6BM0{D7uWwitN9mBOC)b>z{tqR{y$S2c_RlWOUHjgw@O+z zh$?X02G#Yoo%m69X>2hZeEgQlbyBk(5C;E(0S1lB8mx8}S zyHvb@7ntN@-vHn8AsnhvOZ+q{V<^;~r#fAZCQ_rZzaO7*eE>>!tO4K!mB=vk(Fmwg zw{o|hI+_fAWTYCb*z5LQoyY4@UDhv4O#n+7ERMsr>+X|}l}(GKD9!=pdeC-6UmW@x?S{C&^b=kQ1UzZv)-3@GLZK#Rdkn-5r@aa2h}P$yBH_b!Yz`$1FiN;Y{w z0Tu_nl>3pU;PkC|k;+2X&7g4!L_*##4x2t#>|c#kIx^;MaZu5QedgM1aBG6+0p(GK zv1rOtmSaSG>8P2BoSdznII!WvLUw41vwGE8ms!%!srjpJv&*n`wZ$@*EXPJm8jro0z^#!jHtpCz4=onu9rZc{K6;$#yk``eTg*@ zPqGnc?8*brQtBRDGh<>kEoE%fu-9!bNQbieBl9ZU-a8^$ESJrnV4f?coWJomZzTIy z=~YvwdkgorQCHhA#va?Z#S`h~?x62?gKo+AB+-h@oZ9OPuydzyLq->4Z$hD8A$k-6$0c?#{E<&^wkbzcnY|Ox9{As=i7|J0U|oQ+o;gs8`93z zGnt1^oT+J?+-C+bx#1JStok&`o>O+wV*qj?fX(RTUD1jM!D2aKp{J-^sKnUsuG%jUH@fZ&=$$+?Xw%Z=V8+z6n=Irh{yQm0OeZbSaACprQ& zMvPkp>fYLUcN5g!%X|3_BZDC5Puba)_`T5``ef6>I?yf6*Gl049?{tox03{Kc#5Wy z-8Gu7m=hcqx}R_Ra!1- z`~^ZEBDpq@N*#cO`2*tL>nWues}wlspLz=Wzs_#{$E@LpMgG4DAXCl4R?`UGyKB?I znKj)io@tfD3<0e0psw|a-!z_yg}O4JK+H@$N2s=Vb-w1(nDxS1++Sa*EJTG5Zagz= zNn$aNsZ*oyr%q}7rE<+TWR(+~!hs6yaM?3=wBWEP~Zyg^h_;DyOR}FR24=^xI z_SB54G;xyRJ>z70#PhU>;R(T^tu%3ThYi#KTx~aUX#4;pL&j8w$O!V8jX4f^Ab+0L zR;mDdMKCH>#M9M;*2xrl5`$Fs-<3usPW=B|Jxh$Y!kh4UXXt^*;{ zX_27ur9&;TQ%pE4$L^TKY64)%yY_1~6B8++C43^|qCCr8OMWU%IXt6#5Tp7|TT``w z!4snsoEMsieM+VXV1{u^BEDrwebfce`9ga+iEOIk-Ju9?ZPWqIjx(>PE16IQXm|M% zIb1rVVr?t|PO36R12KQnC8y|iVu>wr z)%Oyi!@J<#YEw0pR6!V*XZQ31Y$@X*6BFaO(g<{?+@5IvxI+eBYr?MkCp6H#gj_2L z;nsx6fe|C;x4)@t241T4aT!c|h{6;k*_X-cM@?wlPD*mZ;1!w^2G%6w#rbF;pB_Q) zPm&MNF><4>mK1u1s@lL$Pq5D@ZASW`E`WndcF7qGtHS!iTq*-zyq;JoikhOz} zZpoT5cR74E;|RzlEkS=S>QiJ!IO@hj3egC3HY6pD(4LI;(GBkCLM@kvw*#@it9fX~ zS7L%opcxg2YjNr!Hp2L)3JzK3=Df~GdZfmP-Zuk?*ehDFYPH{s4MOddjwSM1_fC}( za+B~SAT12;JA|1iQjt{z4z)Ex!GVd@UV+3(<3l6hB?=NH zJmUm8MmdSgE$2CzWJRXW3c;v}O^ioP4eZ2e2HP42FF7JV6Emx*^tN`Za*6Wa9b}9= z)jv9^(4*V7UyPa`*DYO5e2T{N-5PmLfTFz-gI`ezaflL;t+hB9$|wrW3c&6vM65bO z2#HuP-6x#ms0$zpJ%!5K?zbP?aWd_%@YM9#O&0+qO#aYI5e_csU0t{@Cz735nlNmu zdrq}Q*h-DS?0W_pNyW?!#n+dLIfzIqhZw0jaS+opnvuoQDXg%r% zuOcFn)IVLdb**OCgBXm*Mu?1JP`Tf4`J0NVVN!8vli{(Bm<{3aqRgs7g>2$9B@XobE{NNOiT^*s z-m$&XFx}R!if!Arok~)%ZQHggwr$(CF=JM2+xE`t?zP{&`go7kALbvJ^O^VkT;n>& z7zhxVA--2Y5>wYYtsFMJkqQScO%-FCO(_-YsvdBCam~tiYMU;@^2VI1b`F1Q(=xyk zC8%i~3KNa7s-zV;cPLD|#BZmNQu?}5hY&Tt+ZrQ>A3QE_pdI)7O{#Qq+@UI_i94To z%FA3Yps3{W%a-!b4re)HsL^NM4K(-t@%SUeG(Vt^*Im&z3J`5WT0U{uD6CnFE-XOY zaPu5pZf#JEG4{@zuz4{6Xy<*-I5Tk6OH{CSA>m=s7tNqQt%l?^4hWs)geT6_jOE2E z4indggq>b@rm@_~sW49A(Lf$Kf6E+!J|^b_Y5Kv>9wkp-9{6B}thS5FYmmG1!D?sj zNV{gaIBiTlW^{RaO2E7Z^2; z;XUMuO^?J%R|U}?%(vJ}={yfCR4u+gyErdsIB@e_LfrW;{1u}L)T64@r$||w`Cc@< zA~mi@^vnq*P_Mu7#F)H$93kYuPn3 z1tIE<^4YjKHX%fBss)U2C|`LleYv?OueELdz07))rCp}ab71{Gmt?o$DB2p5yKBpB zT_^VxH@&;_&fa@@+#1&9mELwnt;A4&iB-$5_MzsDUHge0dw6%X`=?kR8PY;>C&&%K z=d#p;Tv;mc4a<-d^!44nRa#g)y-FZwSlJ`3qWq#v(huUeHQdEjfaOD`5S=2}rl|6j z=`)_*G2U-ryxq9h2$pUAgTSAX!Fz!=0LYCoCwSMEvhw4DO$jdv&K;_9dg-O46Ew9B z-1&~AKD>-mJO%Lpb>po;hjdHKH*>5vOs_>YHlgBpaSEa;Ys(zKV}=7NTj{&lp8Z@B zE}`g2Y8FX=ZNU@$defj7y|LN+Me5OdmAH7^-Roj@LjE=ugpr zUjk?#R&AW;TYy#T1?+)jc^x0hx#mA{h&CJrMZKvt^nRf3_P!8-^)^pfBrFfN3^^lw;Ifu4Ov>L{qncGQJn(ubu3@jVCzRN zXOM(9;$@E%RWeY?Rh5RoyFKqKpej~H_!(2?k<9G5oFt+DEQl_D3D`4;y%Wkp@MAaf z8QqGqQvHhbFY1+cj;SSugyWi)$gxe9!K~u`D)~SP3c1Nk#8x7-7ZA2^c_{BvcC;vQ!8Xs?)bfe=X4R9Vm?y~;D|1aY&e;^B zUFIC>_9(WKini56UQbME2F)i!{6Z#GQu(axnOKk=!x0`=3PHC}n9gY)vnr~zT`4r} zf5}w1isM&W{oy_-ljcK>N~`DQ*;uRMi!_O=Z>?Rk`N$+;`H)h#iy~;<^vXk)N~M2s zZ$IgHTBVz;JJtls${2x~X-JKTqzn`Vq&r#*h8t2Pbit`F zsj}V@f^AAUA2TW+bTS|Hf=H0P(JnvOqpYG<+zS{W;vRglN0jU zNeL`Octu3zWJzY)t}?b+mrbrY+e|tda8*Aj%f|3ZP3H^4+Hd?PBopsIb$D=JxjI;4cycRuI@`^NILJXO+R(hpA#NiKTQPtD}i*6o{bM)T{-|snSkyt zo|qo`nz(RWI{0K1w^}3lw|BBF%&E3_=i_oa=hzEy9e>~7&aIF52FhO9qO=Y4d97(MH<60a70yZw&WL5 z=#Hl5q5OXa_j8@m?cG~H)UbVeLvN|va%lyN|IxS?Khj(*V!hV-4L#lCbgFqFqn0N8O)eF2uR?{QRnp`swrEYBHoU3lf?DM2XK$9Lu!KQYKYY9OD+HEn<7!N{Vu}$)~m>-jl4NL2K# zoQ=h7t-ck!e-2zl@&D)(3jRvaQLtRlxO$)yu7ozUCw-_#_?>s0Kli}`=WLWN7LS%Q z_+&@g`d`HCjTF|5zur(_n&Zb*8s^j+;0*f@u+@P+p)s-cFEI7~x--|T=quMor@;UR zt*SzF&MqVRUPj){_jE;BgQng!ZI~A1vO7Lm^Prqjiz~i zWTa%12Qbt2%LTI~LpJemZ4OiEpSeadaKa!B_wZ&$Nedb$a_i@qQUeT=cas1d6RN$x zX~-FeI)?bCaoq%$9n_G zZi0=**3r5`@Yh$UiYa=p;W!eWYhYj%^Pz-m?-`%7Alp-2=#Lol9(>1>{Ws?L*6n!N z)${dD8-1rQOd@z)OF~eX{ff=gZHNf-w?>!Z&7;GBoMdqtmrm3kkjhlme#md1VK!-- zau{2{U1-7$&gHgD^mxVen1kQUOq>mk1yL73MhU*oY%e8~TA(5+HaT>fB=rplHf}w_ zc#ktn9fRc}LP z7TXJu8=8`!ZqNq?erl_awnpot8ufdN%$N2k{w}h$KE)BmKW}r!om%Nd0$5JdY>4vHvNk{RT z%K_Z5bN@Kq`T&*=M7g4SQkp!uViyzgmbeFaL8>r=G*VNVa5dLn%{5yr*zSyXLl5nsad8s9DDrLX0oNi&F z4A?fbW$Lw+3TAe8+wxu^JIRa{Tjf#b(Y0O>-U~w+!vK|Z9*27fv1q_s_cePOcZ=Qy z#g%u42_a&g`VsJ``?6egu>IBBD?ftSac=h7+DA#9%~tYafK~imFEi*oNDc9=W*Hnjip56eQ{`Vbdec%r;GpEfc|InT&rI< z+5TvROc%7#ll&T1gzcZ9W`ZFvY_o1+w$0ognhDat+DM=WI9qxE4a~3mR!xtUXYW1E z58$7tKd*)tXPf=o)bxO@8JqoN(vRO^+th4uC;iUmQNm1?x$txV1+MntJB~2Jon^St z59wD#mjg9oR=cCHFxRZWYtY$Sg9Pq6A8%}~KKKfHs6W42P&VlyaEPn^JRN`Wp?Lja zTkrqD_ZtqsuOHx_SP#2I%qpr2;n&P>uZ(v%aa@aJIdzU~F#ZxV$ab>}m42zu(-M^8 zgXqQ6unnOkGj=QZHemDg#!JYc;3J^^j$} zP_J}Q(s#G_1VOWHJK(qy)D)p6$cgd#ZziswEUliQ?^Dt3JK_F6 z7##nhCjR4+`@fQ6mCBj|wkQHGF>NIRb!{7#9g;2tIw6hW3Y-9l6|z_;s0@*4H%Xs* zp#V*&wtG|mA*=n^XONd)jy9@pqEeBYq%sx#OBM=hi782JAevkoMN(l}_T{{Hdx_~` z&6m#`@GlTeAGdAgJTtRj!~W+EBJU&?+h! zGmbE};JgAWBoDIbi0Vc6SyM|XrZ}#SSX?YF&}`eG?KBkepjyoV%6kTu61OQvsSQS& zggn}2e#BXm`<=${Czj3_cnl!rXAlX(6-|2?Om1y0|A;A*P1m-x&dV2p(ZYC;IaC^}V80qx~SXfKAMDyQAG7z=hk^}&V`ccZn>B{Zmp zF;*)^?x&%sCR;;8gU5k#87H$cw8E<`p2b4FNaEd9Zy1FNH<2DvOnoAW%k>p<%c4oq zf5(@wNbOPl@mFGtEEb9OY0t(2eX2-`uj5S)5u?2sArGte~kdxNT>IpaEnXB%36t5YwUGI`LU zqegK>*RXg+aU@B|UWo9>Rh*%r3n{LPDKhU{Gqr1ONG717*#p=nobE@eT_}B>sK&0h z^^Uz?yj0<{Y#>Sf$0CzL8*4j-+(IR}K#G{t!nW~_xKBn5}mSsh^d+6M@x zrP~xjV)Z45PKaV6z}&Uu+!#|9iTA2cDVpm$;Yh88kWs{yy>mv8(sA! ztGc%OjN}TpMLrUP{J77`1DagUaFQ94Y*vK515~#XNMVA_a7Vxa2QixN+@nV@E0M~h zZ3HkFjqdaN&4Gwr3k;f8q`vCthE5Hh$3c6-8E!&L?vx-q=FMGa?>q2(i?s(7J4!+-tkf&tCc4~;@$=)Hy>HbXF29v%XnJ6;vp+BGZv zBMEcwDNGaD)BpQtj+_0_%UX|k$p$E?k_aW1?Oywzib1!4v?JRucS1+P)U1LQyxQMi z{4*6o0GMRP5E7NReq=kIp>QKik`IC#4Wdh(Ilc&RqaDJo`69$R>Vsb;SD15Dr}S4R zA>ipH-W)z_n`!_)<{{Yy2$75Gibmfi{+hA5p7E@MkHN|iD*=t!dBgvo>y^8OoDTo*IY8@g??2@K z|3LSzt(o%L_X|J97jC_NLaiT0TTu}TbaNYD-pVXjs^BJ$q736MCONsubUxz@(k`Swkw4&<`Vk^bV*aqEhM~Sg zoqw_??5ydB{AXy}$75s86P*JV0ck!&UI+p^GVJj8AihT8NQ+5Z)!1vq?r=qUc4V1Q22UjZ)6B|tUG~2QKtio352IQZbU|dhmrSNl|)HC-`MPaarjDIM*vBg zr?%y3jG|K0W|A_?}aIetPO7WYs|vLEHPGpQzelUv|R^b`Y<$y z*-6l}9)Y+|g@VG$P>k(HmJeAuqnCO z!YC_`K9Uc<3D`ePLNsEs897cVlZ426{DS6JpPz8lE>lr9vF|Hb}9C0Ku_%_0E4GD38ATc^$)}-dT|?+D}mRQuDc_ z<~(T)CoJF#m3L3kufR1lBnC%T2j+xE*JG^o-p_F(If+T!k4{&}=tsARAyhAWgwZl` z!|13?b|6*tn;?wwpK=V#QwUSmZb}hGOo6Rbr`UlSFp1QLDT{kPXR1X@d+Q@iqqg4Z zr~!z2tGc*v5l>ri+qEw3DI7nIq|HqlmI5d*8;@Xv=ZLJBGJoa_60&xHN7>ZWspb%; z6P;r9Q7=5M)J=SseOigacvTO_Bk}4`SxmjiNM;um=(=UoY9G!yetkV^kz+^#yb13C zho<;SOKTXF$yXf?TYCj@lG?1(bml%g1{ljG6m;Uo+ds|GfnZJ;0=3hT62O8{p*&

zkl%Rc-}KLTF)ovj-=EeO80R3=y3;pXA@7s};m_F6c+y=$vOun*s{JNPZ_FA^!+-Y; zD}6Xc`7((!zG5dsGb5Lct%A;Y*GrtU-XXEdp`ch|gq6&z^uZsb9_jz*TaW4pYufhr zBL@DRe6o^sTNK&>Tc=;Zp4210ZqqglrH^QbP{9zHKM+zw&y6i3u?yCpy|GYP zxGSe?IS;PIQN8xiV+H;mYicx5A1v(ox1YSWHg#>mvffdU#Kf_A2N9`CNm{ZBsmI-?j#hB##g^ySJMWe}!MB^r4X zbBQnxBY0j!{F!%7my&!B9L#_TyEmy*vIv-#ybhA7Br;UwqT69Y zZ`^Dn+(#2KY7m3pzBr#bb%1)b0cpNF4cmao$X9Jc;h?FGoyvU8A=1UxnRn%wBxQ_w z-x$X{K~`k>ftYUPLBK z30_{K1Twwk%K^-sYqAA7P5@1=1BWnm^#BrCo*SB7soF0iHAv)%1>A{z2!CER|FwY@ zhR&2WyeK=0$V5?!Zge!S|;8{M?5ueP%~US!-UOLrkSBT z7ju>SUc4&P+zdRGg{2H#*&`qjEID=%caBaE#+AX3L2}OJN7;2E->dFC^Yz1HVLOVO0|; zIC6bLmiN_UhJH`?7XOb-L-qj9V1*QZduoQc2D+vr$R)8V2Qi`~0j?OBdYB-HJ^O{a zOAT#*hQbO3aYaKh9F=s;eGE9QjRr0aS04SF?nW(HC}Wc(a8nrZ6nL@S=b5zQO^ltp zWb*THWYZC{#UdN%U}I4#d+d9Se%nBhU{ukLbxQ}`;5T_DYEl2c`dXO559X_mzEZS+ z?e7Y1ZQ{B2fO85Ppd34yCi|TUnc?aoXVyYM3tO^Gx+te!DaThPvAhF3*R{4it{AKz0b)0f$gmSgz%b?E302@UPQBW%>|LUZ zQ@wkjvI5y!^jC4cutlfu)@-J#7s4N)D3sMw#wwJ_M6;}~$I-Lm6qX-j-Gnz-KgsIf z6zk8HL&t1HN|~C8Qr3v?;jaG;(k3ZEK|=nHL*O9%k0RJNn(gdh?&PlQWN!7Z!LLdk zQcY{g`4fKNI(X+N6Ovc}o0a8H5Ujk(x!e)3KpK#Ks*!reu#A#fU=b{n>&_4>1#Sx@ zPMfSj>s5}b_2RPCVF{d~q;>)$(z?t+mEFSV2DXg(M(I_jtvNPjRO+uT=81loh#n>U z^ryp3&t%Uj-%n4v&imDd9FSUJj}Hoez^^(;dI=C#Kqa!uOx?gIUQb5oV6bKqTTYn5GpKRmaX4o+Dzu}!qW9-% zqCbyi6<;dQ^yj4yJ{1Tlcn9~ZCfi#b1UqIaQyqpRNQ6mwfiU|fqXFqE5~QV|oYoe@ zavn}OV;#yk2SSvlC}EtEAOC_B9K=C_VMd=f2`s&T|Ujf&?A5Q{l-=4W=S&} z77^fNPrp&HyW%-*V4Z~bk2LAmLmpUP+ByW7STWWr6IyEO47NJepcV_f*4yhdNLG~u ztwCgbdRx=Ni>xDBo0AKIX(SbC`xmvvf5h#i9z<89veEa-d2n8wo2;9e-ZfuPO7g7} zmQKJpyPS)s+p^F4@dD|RpxGxu^^K(=PC>U}Or%dq>3|*)gE)EKl7HWV|56djkPPpKX}F;WM~d4Om%{{H z2Z;{)9+*t38v;C}O?CkFDlK5MJBh^pFB~9dbzavJ>ZeETMz3aQxOuu+j-9o1jk?zk z00fWiCNy}94zzf~Cv%V<%Pk|UWe?ZC33`n5#br6VjA2kLV6%@-I3$sdkC~qhn~r5M{!HW-2LFA}NlP6R#*<3qEH^9VPlM?rGjJiyt`--+ zp6D2CXewy9l3UuWj&2sp^3fUwz}X{!r{5ZNdly@!V#-B8{}ee|{# zab=&rddVm$Ut_l0)z+LbOfEUQ!eO}Cr!PK?(fM01hc}Z314PYvycM3W)$=(sM;)~X z%dn$3;0Wc}6GLMb%i5Y#E$UBkqEPsCdL^mab8>d1(-FL$9jS07@iv?Rlx;tXQf`Ei zYfA4r(tnD@Kj2BPi=tw3gLTuWr9g9;PQZaH&vzCu7pqdCI84OQ@9Z#n!RoSKqmy;# z)z>+=!E<&E!o zk$r=DOvZ3FBud8WJwNOJ4lc>ZmYbrTJ>38U`&J+|Q5_-0fxyQ2O$d|E3oIQXy0ilh z+SdCpm}z+9Qa8ByJOTkB&Lm@qzF4wS^Zd{%=qhnKMM7tnNBNNl8GlFZdCnWHrXrOe z1_xB`Ym-7LxG4?0_fB4n8{Ra^RY~cY7C_zoEi*}EIis19&^;DL+Et#Pe_BdquwD1e ztCDt|&xjFy>N)Iw)nCcE7Co77le?#ODH>97dB=^0hY6%4O#Lmllm_GVRA)-d&3sp< z=j7ir4$?Cyf5oAG3$e?eZP8XcN`O$D!VUEL=jf zpl132GN&*5vlPXt^w&YYWPmk@OjndUJ`B1euFnN%lroorA*AE8u9Dj1Ld%|g;3ie_ zanXx{!eE|?y$*Z|^(4HGKa_%M0;(K=qh;dow?|faSRD-Gcf;(w=Z#F*+WMp$01L z)SzlqC?E*}Z*6wTwMOZ2~&cY(W3{;6j(87Xwl zM889WMWyMuWh14T@6$0CT@UWYZQ}d6gs31}E4NsA9>0R~{K<5|t5uA?48(72ZN7Y` zd2o2>?@dm$++j?L%wON*LxH%qwBP<TX%9E^6(=l@HqFSenb!)h>5?1OSlrJ#Bv{NhwdA zi!}Ybte_s&$s-=i{_|1elu(1_buu@p_?a6w2CL!r_R06RC&SI~llwhZ`(*2G%_00)CcYEBZuOV-n>qkvM#>79!O!$vGB9$kCOY(vPGOSFqYy% znf?KJJ@vidVsRyze2)PVAk&>I<>|vCI4Uz10a$-{jyQw;jtR@Y>)m-#`&2n}3elsZy+dna^Ao1?@n_5s*TU*AV$nFo0 zgmrHFftOnq*xbO{#${bX)YTCFcj|9O{l%>9n2Y@-m~bHly>1_6Lz&u|>h=LB~ zXu>LA5H52O-c%eDlvr2ZpTBDkgSEH4XMi z+G({a$0tvWsj^IiSJM*uMbAZ28I>rCV@+uiWwB#QP$#K0`F;uy5!H!pfEOim_52B3 zGb@!tv%90Ipm5%!((jNciZl{8%llRMn>+IplKz@s&F6Ysd)J}Hn6HTOCSf*`zAUhHM*Zt$iOV4O9}CM9FsGdkP~X!nN)oec%|-=C2i!O)Mth!#fCm z(3(v6L?!GJ7|2vrgiBQsDNf(V;UL(bMCV8{?zzKW7FniuBzW*ISipR+FXS=3Czh1Lg9zzdO-S2E2tC)1$hvfuQc ziZFkIy6ah!nUcB z_&Av>%rm;aEOgsWN;0NV!Il*TSKY$#ZM+n5X#sHL}*~0EG|ZMt<{F!sGBbT!HQ| zjWRUe&ld#K7MD3kG_*{$>119l&^FafwQX$f?w$h(TB02wiR#q+# z$O+c6VfyC^)mr=kB|izC1m|5ipRFg`2+7pg&y%i5Q!u){^oX;5UA{35Ctz( zE}-G$HzkC&y`HF~rnBo#sI1D07KYO@yKVCnux{{~L%Zd&roj?Go0|>nd_zeGDL4JU z78W9&*BvM4x4Lt?Pg<#q%EvIrQ`C8*HP)qtsMHO$4h33O~*+7! zbH4cClI}yBvPSvBf^`6AZrH^efn|P#xHGS=1HJ_t?g9I^zK+38{flRSZI6rUS;rAJ zN%-L4q~V#XT3i%qy#?0VmL_3IGG0Sm58$d*=pQ|BbHt3CemZ_Zm` zgsijw`O#N)yaK{6haY}9|3;pHFOQIYee)H!-)VdQp{qs2+}O%U+{VQApUbBtHE1`b zA=FP(_KXZGIs`!=5Rl|26XekRd=kb#eqt<;W<&^bPAlsq>{c#&d~SbN%k`SJ3lE(TLuY&sH?7z*NQ-@P(mI$Or!qN@_`f&@ zm`mVs!0fuO+jssb3MIp#*Mr`2e_($c2>6zEdA+>K5F;Run6n$O3iz^6F$`-eZ1o68 ztF*@jXu;axy3c@$Jl4>|4t0Rk3x3iG<=Xu*Q=~BnUZvzlDqz_^!-xX%lQ(a#YOs_h zUZ!FIaI5ht8xNX6&uuz1Wu-&Q7wT6=+hfo(5F=bt*}{jc1&FlutkJ-ONE4$_#{edB zN#)QjprJYXt$`xCOcyj1_;GlXI8zB~d$%8W{p={P?m`T*>6o#KMze*fKl)mCAVqm1 zu=e_LAI9;af($=XG2xWmOhh&~z!O-c78ybDeqJG%R)=En0KQAB7^iy?mH{Dng@`q(jyGB4y z2NS%beD#hN?vXxT4ZEIluecM$#H~r|%r+%EU2hQ9;aMvL`ga?mWMr5gGgX|Xp=dO~ zO>$A}1PV8)6luoYN~m?giaAP5iFTfx`@}hpRY`?ng8IUC0uhLIYEqw}#`B+6A+9XY+@xNE z8HyAWqY4#UEMkUYvbQAMheT(ujVYIqU4K3|2A zO!g|`IcCGfAGqjDsY)+~CCuB|qtX6Yuj4?vu`OdS_`QaE92?rE2+*FBEjTG56(KlI z!BYw&q5jLu#pmaFvcF$GYf*OCm(VGMc{c2=R1s9?}P zO-FX&;ro|D7Y8==w~P*r7XGHuZwrnT5pPV3eBPoRM_`EQ^lla#FwLk?Z1`MaaCpR| z`{MTpP~4d9h{3d;jx`9_f_u0bRZ3+qb$}{~lB0pXr99Ve1y^^lC@p=>wP20L``idnRPy+Y|J=y-mU}W zm)7S>O#yfpPspRTNnm6sX6$0zR96}nEU1_GJGir#W_`Dbh~;D~KSiIf8UPWesZ>K> zZ zSE`|X_3cb9>$2Y~c}@$?8F#rx7eePeV6DK_iY=>#6IEgz>Y2N-d=IXb8*=8P9tjF~ zfXz~?hnJ6n&d5avDTZ}v-#9IDyK$e0FDfPlr-zPYWpkYe7O5zaCYmphx=|WM`RJOs z3g$B%Jmdnw2+$LSn;o*Fa__J1Ekp_TqCsA1v570?5 zzPd6e9x;X6_d7&JO{KaE1++5guwZ&7D!=Qrs2|NBi3-=gh z(-{QEhAYkFXmA5@(`2BxrS9y~2wU-0Q!RCdtb`Nt;-+V)glxlV#B3EDIqbIN5nrh5 zECu=?h3le+sQB4T-asspn1vkCXZHXt;jU0Q{`bsLv)Ze788S7;2UE~8mytwhEtk>U zv%+f*pLqEWjBTdvv3ktuYs7lMMZOwHy}(2LF!*(K4*pu8-n+=(T*&%-ZGT|4yJAkA<!_U6gxVC%ALiZz$;nRdrk22h$S-hI1{(+JxyCD=G9QTc zIP{wQpv8=(4U}k6AdxD{0UoBXwKj#H#r0F1KUx_C_Y z+ANG>rtMiA)Vnu#HeFw+{j7?PcyxjMzbqjmkM(bp@IsQCu+^vhcPoYL8aceBc~jNe zOFjvTTM{n;6U017slpQ3;WU~1Pik1enKAN4yJ@M@NfFyaK%D?}_{>cF7)7@n2c2{~ zEYrl`yAcwcAQnN{DGttrp(}g4?0yc|pol@t#h-a~M7PsQXU+XZmrU6Poe_p~u%kQg z@>`ItgV_N2IfXBjuU8L7fL{TH)i&sK4IQ`N8~H^)#HZR!fTYV#v^cl?0d=Xk-iiEQ zrPgq50Au;`LIjr|6qkN{O|DMWf~pa^DZXfRY(qK)Z?h@8$tx7rfXnUs4BXnS`%^`&+Te>WdMcM4XWt{-~o27y*E;3EG8lUkmoQsg;?Re; zt|g;{8Bquu4GC5aLR+Aqse?1~Fl5Wf-nvWTs^gHG+A&B#Kr+QTqH z#(2|fMq7Pw&o&C$)U&l17u^#+r`Itf2F#;+5WzRQfSA6B2fcZ|_5C|WV4KYlYtMwZ z)ZUJ93germ^oXj?Ew+hX>(qhsGszzo=r5fO@3z(LWpcVq^th)}MRu9``CR5LOioQ8 zo_Q=h#$$PWoMRz%#(b`v?#=`b2(FFifXCoD5El|V*S*YvyN1j=ZQ<(tN>MrXk`Y!} z0}emg$L)FWn;%a;-P?U2c!!^soI^Dr-G#keDmH809B2B+#zQMz&+Wh!&2591%wbGN zgzHNYyi6t8>jR2a?>Ut;%TwQ_5*1tGx$DBM8`7Z{1eKS{HrMu7FiN4b`M)@6;+@0> zUBuwHhA;#iB$@nK6^%N~kTOkE?^e7&-J}K*;(u)lU2y-#*a|YJ#GQADo*SUsN;qCG zIF?^ct0Hry^rRWKUr~X0q36R4v=u|&%#wF2*j1q9nMRw6BPXw=*Y=SO_ll;qWnAT$ z8kIs%yC<1@z!}LEy~cE}qxH?B%`qKKxP;?LF5XoO5AQ4t$4;P9_^?xKzivo-Cm5#g zD7q$HryWS8o~FO(%e#l>DM5*BVk51Kr4Angaj#AdWw%ncl@pAAvnXG6c^3Fq-3U65 zG_UEnqXmPsk9dl!#kRS*<&`qEEf(tPi$S_uENp{{Yu_80Dl5VH*CnwJ6C^Be8hJl^ zWiHgE%&tG;0?^gmboNgrwS3dKbqEi-|A=&kE4$H#U6rL~4L+UjXQ`~Y?xI6F_(vT= z+GQpGA`6t&FAsi8w%pB3K!6%Es85aOjOF&Y)@uJ=(xZq;xLZl7h_5Di|EcQ7O1$j8Cso&dlp<{#isOfBmOmwwzUWY_vzXu~$Fh&5Z zR1!iPos`R()aq*geNU2V%4ON%!d;sumoGP>N_2W(4Q=yyp->B%b~9^Obrt0?7W4%Q z*%+4_(n7Q`)@Ee^y`wlPv-)}!fsE=Dxe?qht;Y$!Y_3sF{vRKn2@@KVvghf~eb2VCephKUq0*zutyp+7m>ViU zL`ff$9>indrR!s!EE=cK1O$JTFAQQyd$HccFlBcklqv1aPh@^{Z+%Zn=P^0D-9Oa^ z?mz?~00{DkLH)7ZhgYp8n9arb_NEktDk!4Ry}X{`z%n#BjgQ#0TR- z3Cj%NsDy@*)7MWCrx+{oggVKM+-X2>l5c&%QCE#ql2jODU;^s()q=f7Ycp+AzIH4~ z2#mF%Hgrc3znBxX%h z3;sUgdJ^Dpny5k6=Xh**=(8pEGF=YFD%ztzjTEhUSDCKyDw=uenYEikNLmn^r}`C$ zYf{OyH+O0BR;oU+!?R&~g2Sw+vjuRKnJ9MWP0?s2Dt1gDlr3xbG3XYMUq!#-?y$H4 zQ0NvG+g5g?cd`R=nPAeB@(E|QF0Tcy35~;^5@TP0hw5>2NKhh}GN4wBCsce(U(&e8@dmAGN{NCJt#i4Rp&!;kL%nx0K z)+g+O*UE-w$&o~c*kr2cC27g#&G^QZB%E@~UAqa(j-&MR_3!=Y5CT(8e5lh!^u5TR zj(tVeCNmD2S)g=6la)&s30XIXox!TArqJLSC{kPvddC($lql_`^*;Jkv4 z9ij6Yeuz=yda$^|-iFF{pK1EH+VpAi6p5$rM{o3d^Zy^V{&xC?minf~wC4YJn9q`x z{>RpT9=@P%VKIO}2UNDbG!&dZT#f=H5Y4yOBrP~QE*4?WQ=N$=B;$qEUUcHeF0Qgtp^GcEKt0RyDIZB$YV;9 zEiRT$NE16-9T0dzws(sy#i8BEx5_&0ZHk@2?Q_rf8`t_8c86+hhQ3Bf2dn7oheaPX zIhO+cS~-++CpirFg@$~`TC!)dJwS#I#)Mv71Y@%6=ymj@c!#X-=gy-pIOwnZ` zr4o;_qy;+pm;_1yVL#gr5C6i{OK!l8%*Kbfpm|#~!QYzdH%=ZH=)HJNL0Z$b_hM#j zhy#(m2UXQzKFz^(Ruv{H{)@&%#=r!DL;tj!G7trFpjyD2HM2Jn|EUnAGYj3>{nBk#?#x7&M5 zcpex%zw*Cwc{4Z-V4C1GmIV6ESY>XOG>Gg8D~noe*=D@+Qt2md=P<;U6FO-OU`&Kc zgt>VdA;DNduMv?K!NjXc6R?kI>OrT4Ni3?i%Bjegb-Lt{`@bwr`$zr{VecGVX}E2B zcXw>twr$%sR&3k0Z9D1McG9tJr(-+$vd=m9-m`aowfCP{m8w*&_syKon9rEMVYHU% z5y9FR3NQE@RA&TO`k?xDXJ%^7jWI{3nw~{l&~iQm{;zyZzQDb#Vj3gqd>u)m3|8Ga zB~h_F2I?$DS_L2@W`DNKZj2qCbI#l_wX2RZg*CdWoStoCL1{SV5g&&~U?kJ7pg&0a zcCV<3sEyHv^py#6l@r~M7iLSyV~KQvka1rhOeC-nMmKXzG(1_8H@J-1nnxy#L;Y?f0WDT7O zaL3ei?!>TFNaKki!7_1ms4SKTFlfnAO{Glk-~Oej4cEytBtWGAHZ=4&PHNE^*y9d) zt3P#f;MaDqjG3RQ&P%l9QjFQ+E{kz`YnAWnGIGR7v2@FfK{-Ls#m^N8e*h(lXM&2b zNP5~M5!f!@ho;{_YVGjEH!q%)B{E#Y=-~)sx^aQorp z38pJ+gQ;}7H()`cvV2hInrJL^m2FjTFHbAitQz8k@#dUDg(N*7;hjbJUE3%yBAO+% z&6IQHDD|ux5DjAhXozvN$6YLTpiUt#ot7n@b37l^ddMiM%ofbhili zrxw(74hyPZnb40s*2tMSlqV%mWqedB?OAR}x?Du1Q@DfgDlSN&Z&mI)NTmI3Hn3 zclJiZD+ZQHqs3YCLw4j8b{DEuW`Gyx&Hk+nWhC8b37ejzt3@h%d=_BQx}G~#E!=_s zQ4mA7`{Pb`A@ZP&#LvmHRSKX9n9IqDBzv870(ULw26c68p_@qcNHk0b->BT@-H=O& zQXZ3jq-sn$e;uLkOJ4{8;1ID7MoC}>l4?}lJ&m}Dw%=#7Q@h|&%j*>o99Gu!4Oq=i zHUwQ0apDdc5_4N}2nKKVf@lSfpez_0+=neZD)3=tEG#P0Y%X&R#x+*!QnKmjgfX$>zJy_ zolx$4Q-XFit!N!gmD8JW=CH_m@`ONGNfNM&#nBd({e$e_V^|{YXWli8^0nx6CP{A3 zpHfKfacAAIXYFa0Ex(r+norGs*NE+W@jy(0L;3*M_1oE z?jVvb8acuhL1ihpu{n6z?ZCAo&sqm?9zy1>7x*RRoxD&7SROD{p#eMF0Nd!^W}L4bWRk z+Mvtyu*LLv~ZLhEvin&w5wzRB?S!Tm=ynn%qFZT z5af7xP&mUU(#K>fIFIP^HJ`eX<)naWkU$7nH))cCV<@wG8+O80GqAP>S>1Z^Y~ zH8HyZgev2P2;6gyC@ofzQ2R5YX2H{Jwl-ktQi1Ds#lUrNH$0r}>6R8ImaFRm%|ME0 zAOiAg&>OM$KTC|u!4C;QuU^rdXE&zrLl1SyiiBwJ^ueE-XLodQ$J=`42e!IP)w?av zYB=F@iFKrBjaOi8PXv07zaI^hE?~pzjwq?7ziFjcagDL<)R%`5#QOziMtHwezzXCD z2a%x|hA83ahXgALCkLKSaHZ>%qJ4>0I>0m+eUw#julYH&c_rmz8S-&Wi@E!xeIcWv zm&sF^_x!bkd{-bA#Ld1AG=no)f6^4i7=(n(K<3A>Nu!yPG0A(GLvshEXHsI^$;Iy6 zd1qDtt8Rl|vdi<|G4W<#b*&C#B~{vWaS;@T+LKitjl+P2+QpK0zzGStlB9iNwTSZMyj1(eeIGPorHbD>*~yo7WQd&s^SdV zeEQ%xZ(u8;l)dr&^HCMw=xq)ETh23o%lZGneOESfuyq9(SQ-DHRZB&we;|=RnC;05w4|Q#SRV0-ZT!rQ&0Nvb168$3at|^c*p-CHMs3Ol+;(OiU z@ZQY|qa8T%C12;9uCEO;4tb~xd7bsg6G^~_E`BLj>f=cjQWPf}>1DAkZNrjynTCo0#Ib;7I7ziD_su?8Z0Cn8A zxCAH`#b~>M5dp=W2|G3;Xp>pJYsCyX=qbnL&8=*8Y4b!^p>5(zD6T8-E;_wnre!gq zX+4D#66;LRRP(t#3#Sb%UCHBGlFLwyPQij+J~2u(HbNUW)!!b~=q2@LvcJZto?piN zX$QpiC!^86jrc_*!79bK5C7MG5^Q;zemb>$sYOk^h+)L2bePSMdP+0~i#8Lk{0E3m z&-*j98mUto`x*g?th5SxJ|gAC<}gk{4;O7A(bMR9gqBHbY^c5K`u$vjp4k`IZRznE z8q)<|KdeTGK@{c3zbt~H3akuce#^~&h<4(CKR1#xcK<(uQ%X*d0X}%z&+VsPo>kNh zf<&0jd4Dk#558u4FOYiV|Cip}hxpc;q`S=jS8slP>&<-Y;h^CmW4_Q( z0v6gff(6Is$t%tVe|dA(Z69anlLqFa>beAl6hO5qLD0ZI^yY13dS=}rx3MhyWlgq4 z(R@(gJ-43Tm3q!tlh`;0l=9z4&JWgID<1A0{3>z*tuK7JtqeB`eP%Zw^oL6>nqT?k zmBhLHx2*_cdz5<-j>-zXDWkud>xkas%XBEjYVe0~Ey`-J4e`MK<)8S{?$@Nz_kt}P z@{b?n|Ngs`ko#ZrxMVd5SEOZ>&m0o&X7pMbDVc+lKQ^UG<2|0 zb=*Hd^`hcLy~Nh-Y$W;Lae)-4sO|AZGYQOfI2*ubb44;w-nR23)?WhCr+>`fx@N^w zr~$CNVvZwMo1Q&ao32;hwz^+e!Kpv0MtZo({iXc1hPaa;m2nqh%s$IdBcENN@fL(q z_)kfROw_f2wYx)p!i~vS_ZAxPD*G=II8NX(Oo}T%S=tZaMPPbN+?G-k{k__%%Os@O zfla@$|Jg&Q&&4L~>q?zdAD}9@JiJyP$fdY6aiR;+1djqqNur$GyT*~nIYPr@E#A6h z*=N3T*+-~MRi>ao1yoxW_Pe)JenI*#WD0my4`eJY6G}srIx*UC;E>(q2qU#xt>BQe zI>iigXl^4)wo^JoWZ|!|*&x8_M@g^ZHi{}EzCy+Li~8?9j}3ecDcWBK9RW?hs2E)m zOvDKDqmLc6fl@cNKvAO25Xt5KLI_1-jyNYc^E)E$Oa8=(i_uhW?5CsOW^B-x2G$#p zFAZpcSTMG>)_dVz0(4CbC*N8JM!4?jI2qOOB_^f-sD( zn!>HsiU@A^ue^kC&Yy1O7a-{r(H9&G7Ztmuuo#I2##FOnFRmkRjAf7OIpJQbZjk!h zqNzK8i~uQ`cSN`n;qUCOh?8P2c8B!ak)KS43(;bLaDn_ag>EmTu-AWYQcp% zwI8Q9gmgJX9f&y>#(2dTw$4CU6#Gllz)ME?P!fG1fCqYD@i?(YLHo@YqAP|AqfMZp|Q3QzS+rav9_nzGXwBNXsW=QD#>T zN$M3O!obGEVl5OU*B^wXV5gL4DO@wpP|%5Vw*%g%jM=vlHD>2w%@a{-_jWp0xyEHp z5Uk%kK%X4dvNBi|27B#!hRy6X#s+Y^H1t=c1cCU0?x`OIK3 zct#yUGSQASOWDHNGAB(04F$oBFg4g^g&}`dFUeiq?=X79n|D;T$Gc2jyzZ5@o}RMh zd|`*1Pj9<4Q;s#8jS(hh`BoV!FLAx~S@*L-6s*HH*uioKD6Yc_KuiO zmY_=cvrbD!$zuq^g_O7hr68!p53MOP)J(H16(nv2PVVe)tr62Z4X5W@iYHG5EQ0oCZVDDqcXx8a%JNNu+f2BC(lW+|%t7 z2-SH3Ecs6*!yymCJtn5HY`sx2ux96x@7owoT7{t5oA9l#+2t3SwhTbrIZ+!>QZfpb zOU3DiWb#@YcyMV}m~r){mAG;zRSMZW#^s4SKp{GmICW{}<}n7=vRNipC)IP^e1|&a zz(B3|X6E@qJer++-t=8r91gcoK@m|H)(?KTk?MuN&b%B&>>nS(TewZ6$Q@HH+DNrr zdg2_5$K|)_Qv<0sf1Z{#tK-5r-`3j`Z<2Ne-<@Y~FsfR*ltyfAm8p^0QV-SO38R;w zxRwd`CxbF)ja`N;ymSJ+W~KrEXQ9(I3!G z8?xnNjjqrbqOqJIlG`tGtW`s~H?5Dnqjovkyw%x?oF|iznYE!tI>3~r_}ekyLZ+2A z9W#?JeU?xhzl=D%pWZCblX+J%OjG|O(1a3UZk|Wc`Bkt|d5BV1QVRcTjNrf&D|h;u zkFPi{YndH_08H|lI=A?7$HFU7j^(%C@pY#)FCLQJ`fy9HF_#Kv=7y5I$pp{iwMqM` zK}VTPB>+*06%2%K=hvp}-KNZHsO{=L9p?-k2Y&_7J^aOH5*21hr@6!fh>DUc)> z^{hN#E2n1LqxhQ|PVf%QlJ*&V95b?_ZxUyS+uUT0)b>?6MKy+tz0tM{$s{}wBtOYe zkg1iPgUQ6Zm_yw-_*QjY%^npc#kS0=2qv+B7-x7BEO~P`7lI!JV~`GPsCQT_LAN5W z_Q6;?!T1JaZ~KW9GO&{j@A18$^oPKY*~Yv)KQ% zLV}&%Ti5Wj`n8K^a;uxdOCR$IhE;BFaHtnU`L^^{Z8(?fnwnR|{TM0jm~)*R$n~$v zf-DjD=<>A84)ahdnZ0N`=j8T068jT7G8>GJ=>@fg7#Nb;*iWvki}x&U^YM==Ws1<7 zTABg3AgIJ$7(u*Z2gSmGaXmC;>UOWJ1DL4T5PR7 zOxd4rcN+Uln1yD$mhFo9GoVM2bT*>rMrP+q*0`vvEB)cIWPZkG@ZGmisE_AkHDeTmc=rA#Q0*~(h~$YS~|(NQOdN>a3W5LD^i3{V!}w-zE+K}vi`;I}xiUa=YLuV1%nA?AK| zy;nhk|DQl6CY|wOEL^XZbdH8&uha&nx3}q7y&owGvIPD`kRn2G9vE|;?{R24my3~C zE{|4JMkh2}IY`w^#Lk5k1+f5S(k8(X8XMrBe2m#9X#o*Ne4yXWdx1U(5Mn&eN516U zbGat6Wfzfhwxa8nUpuy$@)5#jGDWnU`twfKMOB=hVnRAv#d7_ZEf%o5G8a}% zPPU!?;=*bDY$EbhF>kBYHK5;n)w~QrYSZXiw@wyTdB;S6&WthbvBo)H=|kPNHzzZE zMRl#@wiCv-rrfO-no^zkVuvdNyfcz|mwZoQrLySB?~NbQZ2M=#en-l#YPZy-g&-67$}2_%*e$=_f|bQViP5v)y1NGCb{ampFg_MUHH*>!(oPC0mFsJ>e6mp!W^9 zXY+^;5-+#k;9s@wCf%w7Vj^&cO~j*qx-`vq{7QTfm=vcpVmw4Gte$y ze2^erBR{3H7g<;Gz^kJ@Fe?%}Y!UH;7YVKNfRHZM7z%0a&bL|hL?gM9g*%@^L;}c7 za_{Z)UrgA0cg}%F-|s!|w+dwV_wWC=d%zfA{S9^%vbAwCw)r21hED9JB+x%3;lkSD zD^$S_7I{G1b-mgi9C$DYRhQg;ZPB*^=2FO=gu?3$MKo1w)Yl)Co^mxI&DFcY`%!Ht zug~9VSI(*;siJR)WvhLSJ!Ev#H&JA)^`^dAME~o0bUt=h3@b-N#dFrv=WXebg&pLxMM`vwNxG zxS6v$e-h@sgZ0ld8dC~Q@&4~G%=#OO`yb?;vb&wJBQe8&*NEtZb(`-2O~{wEGWb^@1G`3d_F!Ou=;rZfhf#Y>bN#}e`-HFP~eoR6RzDHX!i_u3P46e&HyO5LdWfX`R@41)UX(s0=`!Jq=7x} zJ)b#|tenFSr~@wWG`1M%PwT)hU;y>7C^Jp_fk6D#cqIgO?~T<+V%CQACvNU0wJBFTDIe z%IB~i-4B@Hby-PE}*3Kh(=Y|U~LX1@XUqVqjbS-w%Y-x0qf zZi+*=If{+7Ab9IZ&X&@5ji$S3|NI_gI=L^VE>V&^79oK4L+?ZC|+*K7PcU>G!C3|ru6 ze=a1AZm#Y!0oqD5;j3}_-u^&WTLI}wsDzG9>I zyMpLXl)8+la<~QiH3EJbvlw9rPqq*)=b&6clpS$e-%HUy)66fj{_V)lxwVL9EfESE z(uiRK6^%0h$&`i&RUC3E*8$K90Am1|+Q)z>WFW$p3ikL7qF!b7k`uI9uhM!}G#D0* zXBn>jW=#Je8INa*E(STBOow8yEq87$FMkt8zXJ9-)|o(fbs?;#u`M{_ z^dF!8NXVo*CKX!;3>9ePLImw`z4*;AonfZ#7ykoh2+@ntLvI)S{BZ z!(PUV?XZrV)9XjsF7m=p5sfkVFl+z_|L*<@53-=^TzWYZP3anTbBVn`z}-)8ILn&= z9pus#vG@PdIS0}l6v=sF>1x%J`Ozm0cb@8IL*CQtk}lSdq75^P=a5wYV6s&h%I6Ua z1XK`Te%vFb98yndVwc&z$tHNo?d*>_KX}|t5(;byGL;3eS7e&o47`;{zcM=7CDq~ zH+_=0bX_xFh;}Kze__sx-~Bp|tr(KTwh9Z+U`z<1^j@ic=Tx4g4T&HkTiPss>^%3@ zAdR%^Q1`!dMA@pupt$ei?)!Zz{13%l@Y~EJXJYa{#a&@tcAX!dCz0LW4o5t%aiivE zpA=2m0-8JtxbUxEqQrs$XpIa~jkQ$@=lDLAd-;m-&wf72>vc$!Tl%;zw4N?U=ULmn zK0H9r5yn^;f+XO!T`uU&P4|P@x4(WDg?HIhHMY83!3a(l|yNf+TBG zc#78()o>Fp-;Vm!Ki}WT)8kANn8ugt2i_=0t}28y)IV4%=xTgvyA9qJ6Gd#8y&1~C zH5370ErB31=R)!D{QSZaTpbNXKYP*&;WTxq4mdnJI6Qq-KvijKCT=@gD6NF+sufB-8)1q42 zb60jv=@GTsL7y}t!RZK|r+?wtr&TfbfqXyFneTG_A1rGB^Hl%WST;Iw`X4sQksdfy zRuIbK-zw#*nw20H8dzNb>55t4B9i#AzV+Jdy#?bGYN2_)!9-snx*TbqXRv2BjE9SQ zWx2+NKbh%IcT7ySzMr3;K)p%}_1~DVfiZ$$X28G$nC$k`TaMG9JV$kD5$n_n`LsL5 zhTO%zp`gGx6VlaV@^Lu=fkrj6lJ8!;2&e{D8}^aCq03wh*`YjW&;q$OLX|_q+@$_b z5UfZJYCw9e9ieRSKE$T$S{KqOrr>Ma+*oHAq^ormd~>y^@3f^!lb}!ky2F`8?JIRI zyLH#Ce`5D-EHS~hq9$$>7!L+^M9xUYP|6i#4b?A{OT%KGj2zE9PI&B@%&pG}KMDi_ zEHLbfpUZ`$fNn$eCb|#?p`(X%s!-7v52Jkoz{NHVTVuQcJuarZ)2WeRWG(Uw`L=l@ z9gLUD9mBc*7|Un@nSQ7A2p(9qSD|1+|JSgldO+=~O%+T7+kH7E1?blN+P5cwq-vU) zB)ZHHjjb)RKfV{+W|wu^)y-7@1`N4{jz6etj`4h2FHSN?O$seds-M%;5>X_D>Rs(e zEWi-VeL=n#X{sSoWhrGPv|)$#QbZ*}eZc!#%6>Yfc50DTJrndpu&+PREW4K!x9*_Y zWIAqmH{DHErH9~)C4fe@U!6A+@{kmkyby7`rfbffQ~e(cAHsN$Kixzs+E*ex3&t?)i#6yrs3$~9LE?n zUDPm7lFB(I{Fy?&cSYV{-~>oTO3i%8qT}dH(J9s}gUh*zPL1mm+ZhLHTXFn^)69g% z$Fh~kMt+AW#*0-3(Zf)wYc$lL{C z7*G3TiU}d@VLVQez|WSWJX5$waS!Rl$4#`*q>q(6M(c#LRZH{){fcZxS%0#f{&wws zY<ayc(rD4fsxV77s{t}y?uJWe zRZ+wb<*z!uxcM~c;MW}AFNy~zf87|-DGk_oP$FS^NQfZlq>d{~(@mQE zM>bXIBy7Mg1xA}R{^Kn?#1S=T_@^u>WOJ22j=|hpcL<&Kx=bBxJ?p{)f`q<6Ut53s zW9IMgRY;sv;!6++SCJvhyafBZt_nayKUYTbePgGS?rRsJ9Z^GO%$5!rE0QQa=3tjv z3$|lHJG)^@4JK3bHXWmYlIUu}nH>|Q9_CMLw5neqx6mzCsuj&GZ9oIc4TNMog|+-| z@B}VQ@?5)1Tx|WAJN{?M6O1DBncy;F*_ki2bk=sfGw1zzB``ON4s(>8A!;=9HtzyW zjfY2%0lCB5v!$b&HU74`go42Ari0Yx(gd()Z^|?4bIRmJ7Fz=Ro?Sxf4#un6=ER4j6KZ z*<;Bq*ja)6UX`=!3`z8Gi6)H){k6^1-SN);?kDs-OE!bi3IRb3{>ZvTFzW0}a`}ht z4SCsW2A*?70Wk`p-tsptp!bz*yBrfeNEReFVd~l;+=&nyZhU-SlXXS{6ao0!pgE-P zvx%ntLt3vV52okV_;pf@9n-D+%mtmT3?WhK_ts%mup=)U!C!OVNoot0ta3owKqZUz zyS_8j+cwrp>Dl>9OpuSwA72>kJIzO;!Gg-wnmpeybt9HHl6(8p&Mziu@C7^f;BSlk zS*3%wHHhTBp)e65<6j}%`?FIx#m_{Q2ek1$+knr3^Y?XlgKk^{+z>niFb{^nU*!`a zMu9kqT+1KXWeKgJQNKQ-#B-D3_L?W+PnRY(%@f+dkGv`g??}al=dDn% zpl%Mn{#m$~{%P>4`JQ+keS2bg{=Mq|AFiRGyOZ&MX&5ad12{a&*83cQdRaT(6sauV$|H|6X) zlm1e`DZOx%?GHuFlBIK*=D1pR-#YF*=JEaf7`Ocqv!AK>ytAD5cO?W7#JOQO0HGmE zeHv)`+(l=F65SY((4abe+m8G^Fj-g(uHO-&h+{m15|k**nc|R@WIY^J zg(9_Fd8Y|!&o3*bigj2!@;BeJR35zSI7z+@!~i?iwm?Bm9EPi&J9-a!)%-5q9~j>Gv_G? zsH~|s&b2j;>iY~5kb{i*)v}lE!^1L#7hOzbDj{zp?A6AY?3R%Qjigz+=cFS{P?+C7GM2wtF}|88HU=IsJ!=Y6WF0D)7gcy~v2lAjp8M z$y$MNnL6x-V;uGt=BXtQiM}2h*M?ioLW^`OlOF)&VIL_{EVlX9HA4@sC-U8c!t5+l z{rsc@tCz-v-(=*vE@YkaQa>xa8&5`{+|tCF$lN7z-K7FN=nGiV$X9KI$E*L%HZp?? zajQNj($OHUrP)Ivs94-UGO*kbGfJ6elE-m266R3GNgG zB7hQN6qm#RE{nEQ6_ns&W?k#%>GRjQbhZ`rKu&yChlvpsK{BwMpf2$?yVS;&v|MB% z1Jj;hBxtV+AzRmyYlJo&s@Rpm+{D;a)oy%1cBO4^?@UI>lmD@uwd3+G7d<~{+4<^> zMwnH+e`t1ACi5Hh&!%0WavTJ$`X-h7Nk6)HIVY;AfPzi?`|uLdWvdDYquApz|8T;A zo`FTUMkS7BVbwh0f|~q~m|GHMVa)^P#-L5-Z2=`c!G|7E>mnP7H{X&jJdICF`Tj2r zQT9+sCwuQ4PhEcG&F7>Hab8yK2_OejdU6L+`IiIfori&aZs2V`?J`VCmLyB?*(C2u z0jK3(JJV*A8-(#{?AI5dMlE{z64}~F_#in0cT1DA@E4kQocN4*T&H5kI9ETC ziGtj<%tGSe8R-*Dk)f+)!#pqPOQR2)!N=?*PtjHpPMz(D^6!-T9e2Hs1EH%mEPric zXM|BWo)%Un#a=5bj7IT;RK5187AUbS*dItdF6?`P0GXk3k6BIWq#h?s|a~yGgG|*A)&PH7DmC{uk5E7VTbIo-s|*9XrZKn z5(Gy(K=s(lgKveAi{NDIx_Yk-b1Zi&ftq5S4J$OOQt1(MCuXN;^$Leims#M|8irmL z&;nn^fEp8Y8+42Pvx$UzF%Q$UNv`3S<=v&azENBdaaW4C-QfH4pF2Ut{)}(hwZASe6O|hE((FP=td6uQo5kWB!frUYg6bABO3EL}wE{NDG491fCbi(9E z7XpSer0t$cckr%EkJKG6R`6B9x4MX6W2}NUE$%NiEZ=>Ffr(@HkaII`4+}(�n%-xif%?(}5!wmz z;Wq|PZ>*gF=hv=a@-sxb7&#fiIQ8PEO=mlgRCDSMb$8urCkYK_x$v-MkrY81j%%EY zrNYkhvpEFaT-Ay{YfX)d8%WSAcC5p5s-VB+^p~t$+(*=l@_@qTrOv!8pe!zCPk5px zJD_BPpNt6L0D;2p((k%ivH-5zpZf3g-0u^1t3Wa=pMS}5`;9vFa9q`Rn8TfA5N6WNRR8-HSLyl!0D1$<7F z(}eR0Ee??(TF>o#`)tl@f@R?&7Qqn6{d2^7??8QqY=I}06nNI_5epR-?BnBXC3*j* z0jIIj6OmQWz*~N{k1`&TguAEDEGHQfRfvx!ZA2UgJ@CU{UMhs1cI}lQjY$G_Jd*cp zemA^}xh>pwnYnWs%Z;S8$vb{l#1-y&7?gK669&9ZNhb5OiS(Q+r)Kvizpa%2iIimD zF39@Q1`enj+se*#{u_F5yO1nc`W}#7mzCbdHD_Q9akzPzJJV(Lrv}WJ;Y#w4Ndb4M z@eefPKEq}0#qvd9w3dc)Gfv5%_%Avnz3mIZ)17YF_Y)=&@k$<2w}W*7FEr-n=lUC| z+{7BRx9Zw1xSqQ$$x9g}-Y=`tmmVNTFNb6rxli_MPK#*UfU2H+Ei%3WM2ydl&r4s-;48Ibi zJdRjmSi@NLMISl(O|{)j%`@4N6h?ADEo-XKorOxVZ<9voae5j4N|mKam+kmKTiQ>e zy*P<_6E$(iG~mQ(vg!+4aeKzYvu?4m7rx>eObyVR!-JWV_p!z8Ncl_OMR>^@Vse#8 zXyGxuRnOLyLFplppQ4kXRCWcEG;Iyz=!z{EJ?zs;f9iCPbTQueskQa=I{U7qy!?x9 zRg*GF5cr;M0sZIcmXMXLq2>R%x(JpZm;J?n%o7|xYcJp1LS+ypfW|yrJPb1{4Akyd zOIM5$k-aoAFc|BwE4kkfcU>5jJtnw0bFj7U=^^Xs$=kE_P3AS=n6#BfVAMALo8@2gb~@TELkG! zzHb=4|J`NQ23Yo8ITF0VVn$mdzZFNB!yx;P- z$eaqbj7S7&#ghDZ!)1zd>Glr?0=-&DYyR(0}K}w*?zQOs1imQC{kNyMuNZ#05 z(HQW5(-Xh5rT%f+{=!)?64I6r%$r>r_WU(y)`coh0G`4s3@i+^m0|}?^@rAmHNv{7 z`H^$J+o=Rj7VmZ8CjTO=8KgvZy@hlBYZT-6$J8HCe_=7xF=$WP?H8YISD)>}gIr(V zFQi^vuTwFU3Keop?rX-X_9DGmLygUe!I)T`J@e4Mb(^#h$FzJ-Yz)<1L$jn%Xev}X z?aonaUf$jZdz-iXemXl<`h`%WVj&TLmQgEcQ<+ko;s9lp$x24ELtT`yaXoj597dhf z(oP8y6}u?w(zK%p3!`mEqI39|$@+VcRt*3K6J0f8UV`@mI^inBm~l`??jRc!XPutO zI(~3`W$Uj&V|e86#adVa&|LaBdg-ZJQf!LQM*xt7gD9_DB|O`RP)rU)aLXZ)PiIUt z<<<;*KWWHyq;{?Q8si8IfM;4hGiT@Yk1Utc=qy5rxLeW2wV8qYiS}5F*-C_U5aJc@ zQYQEIHV5+pPn;1rDoT++rs=a&m7XiMP2}4pzq*L95YjhIk@pxoFk>F)Haeielwn*4 zshww(4y`r)$U2^p$yDh5`1R? zmwTgd4V(^g>Ci4*v=+DRrJdj{V?IL;!vsivgiT0_nuH|aBQ2!GSe8?DmWgkxuY(d1 z^OYZA>;6}7YtHf86QkLFlEr>!qg9nMO`$zsOo3j~Bg9@|fBdYQk-8gm833FtT+Q1e zf_57Ix4QQAO{qVV%Ig|IBTlL~4d5|i7ug;MH_&gBj4oeb5YMe2TU4vBhg#+^;4mVg zwyYm1u-UbbaQGtbIU-&9WfGiKILv->a{7nYd+e~L@cqI=h0&r!GLw>*7%z3N{JCr} z*2&E5d#?l4`fUxO{dwaR>~}!+5f5YbU(~8|WDjU8P{{JC7u8ic(~(OR?OTRyDgr1U>}A6qH+C~tT_?88s^OuTqA1dxxA&7X z6>t&UJ?-YORi{4}l<%-Dd;(qMDx_yxVtV;61o{X9*r5YeqeV!x`-$;QE8|GSJ$T}Y z(*3qXhze)d2Tc&tGWF295JESJ+9VS?s$xkpeS%pdhgC_+ zxCcX0LgkaWjbkXI>{&ZSS^c z0=AAc&U>QU!OY|)ckLKYE;<4Sy|Fba8cU0i@0;TU@h{_D0=D{+2%~v=XO*R#PfuNB#6D46Q{Xvxgrz>80>Ml%1y( zv971*2(y*A1!DIhi~x=|l^1G1v%_GWb&jjOvm>8cHdl@F zrzw`9DpIN=qFmp^g9AQa7@ps9h8b9n*Yo4P(5nIqaVyB?w<4ypD0f>46{uy&8d($ z>AUDM7y}ifl2B*&_jm$E=J;}d6+kZ!*{Ld1}KN@{MKQhlir5}0T-ukop z&v4cK;gu4s0{hvMUxIrMWr>VMjYY^GG&=ESdtlEB!|S06eS;E5Tj^ZKS)P}jzMY*v z*$1ivkcFIk@me_{iVAh_?0aYe2+; z=L^=_vK#!U?b%{Bxkp+`{j5LL*f{;h_g@b>lAcImzW2T#+Y0(x+wN)YNe(wC-msqs zD^bslgi=NS8v72jrQCd^2&MXhbYT;D4WBv)Fov~ytm>z(Os`!s zH!aj0Rip^5Sv^7?ItIU%;phh)QiSd$Z6^G40p4^6@y|NUoY8@2_*;iPeOn3W{{6H1 zXDh*fUnnH2NZBH(A%9l$Os!0@Lx6%M2qGZ{j_k)l)R0~jnd8S9?8P;Qck&xBFc6vc z)5GpFSTs|c7t^+vX*OAD`j^%JfasSJbeb3ORl>{Sax_fPkE2@Ub)DMhI_5f_c+mUe z^@Z3W?v}(4D1(*|fX0D-k-TXCCMs3L6lYpC>)Kn5KRkrka=l_qGc6xaHl4dKKP_Q! zzN2*H;25$iS`dwi6UGEZ6$QwWL-SM~$tbx>w^Yzke}|9c{vfknek?^Vu;`wEI#Zm9 z#tlik&~55A(H|n7TcI+{4S@E*2w4}GZdDo2Z7AD|(wssMKKrav#a4 z9MUCV)myUqBzr&~C;XF$F@^#?c#8f$hc!szY(e-;bij!{wnfT9;G9v8Sr{w7nPtCOn&INhj|*2RCDbp^>8g^hz^G zXRE**IbOSpr89!X@(xl-O9$sr09ta^nZ|aQ;mkSmN(-KPU+Q+_+n3?-b1zSZ7-QF# zeP({(3a>rkxdmzDk4J#4iVs)(`4VJoUn5yuQ($bohj<0~rY=7kTf@3|t?kTE_YlP# zOb7vcbgbXbV7`Xk-XB8r(gs52QU-y9o2O)I?o*J2jS{n1@?)YR*1BT>CPTl$ZYaiJ z^oUXBZlM7Mz7kvD+_>s1?~^yzLf`LLMVL96JtcpiU^_x$C9RWSnft4dF9N?S7@SON zNdRPSyth}Vb%A*%saD!8boR*hzO&3X~CcR{t**%-+10eo|Pede}Ywi;N zG2)3&glGW|xVH_sOG6>n1xE}~ZH-K8RCoqz%Y~1$LDnT;n@*4B7RuSBXvC|_O)NTQ zxS^KH+Q72;@QPfm8N6T{J*TBP;(0~uh=qRh#*!;sbqC4?<7Qfzha!i}*@cGgV`|hv zK1UXJc(*NMbeMNS3TvClM;>+8CQOIjs%AztJ9K>h1%(s7{QpWqR0NIkl2Uaw!S|3} z=X;5W|GOl}h$sutNXUxPSp!^*ZRiYbt!YhdZB4C=Y0aFR>}U+F%)d=}bpQPk&Hw($ z?)x|0tgR-|*KO8W@4NK+Ks?Pt!kp$%hqzVvYdN(-+M(j~SEyuW8Lh*S#VK7B4z^vz zH;q>x=3G`1haCArk3~b%Ov72yakO=>vi$S=4t%4D%b`sBU1BhT8Vq1|c75g`u5-*pZqU#DKY@wZiu0!C4- zZhkt`hC3)H8pGehUb}tC*~{)RCX5IPhQ3%lzSu?zVU4nB+%$d;vLrHYOT?Ce^bc+R zjefGSLgo6Pt33t5ed(H&0-S0G+3O{WM$9l#$m1l-0vd+JAs>y^D=#q({cV8u9ohmo zuqe9>uP{NvJszh5GmG!NSzG})eJr~{Z#axUxlL*kNA!yeRgp7vW%D>-+xG6w%&X;%Ut z)78a?*3#PdQk8@uL`g-W)EZf27g@v-A0zX^q+=$TMG_QK4Jx%YK9t&r*h)}7sv2V7 zeYVsZf*_V^mEc3a|DBmP$$fcq=cRr9&2P%j{Qvi!bMCq4oV&b(vvyDXq)uMUk&`(y znt!~$s$$~~uUPM?Zb40NyVdMa7}G4`dgX7M_SO6LEljUHy_0KpGsD+88%CNkS_W5& zx_ab>>+v}*z2g>FdR{%==Y_lH^#_;o2lRb4w`x>-^|4h0mp{1Me{IkFm40XIrnXjR zyqi6(@8z6XnZ-KerZn#-r+41*D)>b;(XYuy^QLvzwKEjIe3_XN8dCdBwXo-hvqBFX zf9=w6+C+^a^5npr<26s59uePR*Ou`S=ekZjz2L{7M`Pw^|59z-cb!$+Ctp+>EBU^z zf5CO&t;@|?Y5Y9{-gqBgpOdaAs8P#xb?=^YUp~C~+0HjbZ= zpZlqAvqz?$H4kp+6_Fb`_1XGy83i};9~HgwF%DVx!+t}~Ah!l1+BO|zTGvVQ*+(6R zoUav9t-D*eVTS6`3q+$Xs0-8aUK zLt8F2{Mjw8SFcyazhq7PbxQ8Q@!46svTHsp@cLK7qbYYjUo|}Z`UJlV6Kj38e(TB? ziOurklC~rs-t(v2cj)+{+>)+2XO={5`QY>16$+2LbDzE0@Ot9Z@CSWo-2Cg4DP89^ zEI2+nB69hkkBZlJXmqe->%j{n*Zdmz>zn^f(Ds?{T`BzBq=cHqZ}aut_ATgLC$Q+u zGwVfgg>r|vgdr%mQ`1{J3d{n+DZSZG+s z-@~?qpFZ9Hbnu0fZQHdw6OP*ePqx1q;(5%ogDj-=-MhuU=4W$OACJnM(fR39b**P% zHJ{bog|}^0s@(7$ObFGh%l4y@XIj4f;yS{{)LJqb{?`7OP2_*=Ge)>?L~vk0bWF$a zKq~^)eNpfy2=<@gf3TOu_SBU<@~w;QEp~*mKO@rN{~`Itzq38$XP@Gan456H6=|xK zNcf8y{10U07lUoTuufgfAJ(CM_$B>AMY4+dz^SO>l~9#GBBV zfVlO(OhflL1azu(Igeu*OwZXslC1{9x*=HSVrc>5234h#%>RWXAA43OXX%Y*QoCCBz#EmYHj46_OS!t~EHSwvL z{Q~zHQI6{dTkFcR;M;6^3>tBJq1=Bs*5pE9iGhj)D9Uy%hmhs7g}=S339V=2wa9%b zmR(qHlE7m35;2&@{7B%Es7g?vA=YY>kncf;SJ#J_3L9Zw52g58V{hy~;gb_`vVm5d zctvf+zqWz!7Ct0a;~%qWT<3}rm%o=(*vSba;%{#N!DW1Wcp`k8O<#LU;&M(=xp~5z z5?DtT#?+@2#WXNVkRxv$kqVuj(}~OM#OV1`pMYc_436yh;2*Q;94xW|B$oXk3Rs~y z&-{Ctk1xW^U)Pt(0(laAn@u0~aK>YCk-P^doeDxc5gQeTlZP7XJ7dK;U2CfPZU#po zK4f1b|Cmj&{uSbMuB)u@ue4<2OcEkodW;PZkVM6ID@Lc#=##ZNgS@X%rM9p03eE3u z>*9WOp|<1Tgl*d&vneiE5?`PyjZ<3I^u=YDa_GhEb{NEN=n!oeJ29r&c45(1xekf* zydL}2iBxoAXgL?yEwVy9)G<_{xY8dghgZQc3Tj|2p7HWBo2nvrk=UCsZE6@dmQxe! zi{es@aE9W2+Nyt&u?7_7eS<1q5}R{-i%&M~&ct8VVosbwdwFZa*_L>beU$YYM&A6)rk`dzqOhdHBsgbqv6Q{et1lMw!};G-uj{N4mrYyd@RDTKJvZ+AI`k0Es+af9-n7gaQj zj7E%kIy4=+$0=^4R-HaZt4kiON+9J|E)NOJW`Ra)+&_ZI$E+kwPX*t#==s4ss70FE5sG88l_Pfj5-c{j;7FB z!eB&qbPkwRTp=EdA;^Qu?7bD5w#Ii|`xDU7k4SN89bI@-Au4;9m~_*9t7oo(DM0@+ zFWMyjWYSqmw9eH`}X1j*4h@LU2u(N0uy0y9sNg}kh{6*e#eSs5xr_Q!1c z;svt@1l&oz;oWa{9tlC~UC?^kwU4h{$w9`K1XxeoxfVhpZc+KNQL+-Wm4Cer-)ys~ zPE{tdbCEY2`>6U380$q0J8~@n|Cmh!sxhHSYpvtiQQmQ>c#5ShV`XjUczV4ewEl(4= zav=}bO%k1L=<$-ZT^}Z#erDDx>U|bM^nys~bTzYwBpQj`xu1Mz_svihtVx#SPBe{*v>6pEGfA8vxfZtz3sQh{n zOp1Usl&-L+PNh)WDiw%*RSD_rK=iP((~uxI!R9T6EYx5svM9 z3KN1$3MRB|ii_2$#kCNydr`F;uq2=e+?ro16PUC)xPL%e0+(!1X*JABL7ks*Neg`U zX6T_G$oR)>N=tJ}!e7c$(bD4S!>(@CuxVpge_>S6@(ZV=OfQ`t;4w81@*+114d(lT zZ?j3i*eSB}?#ONbgtS4WsWuD=w&sb$1q5hq5Q(L&w>(pv{>;JqJh z?vnzs^oJ&B(Tq6j6g`|XjMgeekjcim4gt?+w?cc}@S!8?56?4^%kM|%Sh^2U7)+dc zxGFRQ?H^puoy}vj5V`*icjh3b`EKX4)?^j!Q#6H6h~`{mc9t~5Qh$I46F1%@Z}%Lc zolP(^8hU#^6T06Jl@sXtlL~{jq1BDhYFb78FEgP@tNA%U7`N)`$VBRBMg8`^S^Bw% zEW%+4w22M6!eoinsbaV>$!dq=I`yK_{cDJ&DyC+-M%VcP6WLLSB(8xzHR3XdAdsx$ zBCLHkc*3MX;9{*UDOokFJlU44hfr`K1~@IBpWiUy1668{>ApYsCj7_kK>ixYbY^NA;aJr+_pr!D!%|8j#1G zE_wIR4Ku}iAW76pFWOpA+O7g z10Ow{@7G{*1&m2Hq%*tWet(7G0OF}BwT0cNge;OFr?SJ@9u%|Fg*m>PS1o}~#zACs z-P)}olPesVuPRxgGuXO9%DWD>CvZ#MKiCFQt%s=MU}XGbHq~#!(Y*iZ<{8qS)_Q|y?*j()(__J1x=v5Bhq`A__& zcHxYFsd)E~_h1oA;Ph#4Fsg%7DqCvAEQ73{J7@7i^d%pC>CW36zRjlPotOlCSS{7< zjQ#!D>`Lg#G>jqIJJh|MzwU9#_ikhY zMs1N^8Sd7T$szOv;_&-_`b72^7P}ULLjA!0m`&?~nDAx8A4fSz(6aCiBmk-b0=h1G zJA?^tm5)X8!5S4QwV)vDU{k|NmzKZzBT89{9Dx?l!%!xPeFq40SU-#ZqhB!`lq=kZ zpItn}Tqi{`;ceT2d{OQn&5;h-3$JX~zvspk|0dAJW{~<)gva8f5JpFbMPnlfXRwXJ zfHb_8LGLickaa$A^Abcis;O`|_8BULPNaY0mbT6Fjt23ZEFFEL$Gwh|LS%7ed|#}o zkvLI-SCKziJyBp}(n;fPltdWwv`u3+a|l3eW^k~Ty2aZX9eM)(Ou5MTK#~-SQlT-6 zN&as0PQHX`N7odVat9?>l!mqSjZ=G$It0~BfNE%ot;4o-hQw%3$)fn~Bel<7z;DM4 zOwW#asZ0uL)@<1f8)za%M!r@n9InFxWP|KdHG{0!29uF{9L3KPwBm!veo=A{P2DXi(;5}_r}5mb~nlx;%?sJC#@rk7odPr z+#Y^Bb+mgC3_J@KM~8luawTxtt&Q2C#S;o=$AbW_O|Un;$6g5}f{xgzE?y7%K}m{A!!VdUsBv65kI8I%^OGb09ksMD)g3*$hEH1xx645$u61Ld1DCq@ zVdc@wfmVPI-P%=$n5fo`cJ?<_33ElylZ`W<0&^x>OXFr9X5vN|)oSdoFgjRJxMJ>I z{|=-Z0%t<|;zLK6xVCG_rDeLqGp6QLhs$b!DU5bmm2jMbF&u2`ro=|ASKi{DEb&n= zBl_E)-9h0GiZ&1w|Cmkj*a^U(2vh0#tG9$gui7B=1c{_J0F$oD9zM&&M0>5V1NNh9 zHA=m&Mj4^dXdT#0;-qaQb)eUI<#c=fB9n$-G7c0??xDM;2BsGJrESLNS0=8lOyX$8 zbH~2en=c`j>2Pp#8hHN_6PKvb{t7OKnmqq*rK>q`(I$lA?RYif+idED0}l*MM(fp# zIqlH0ma~=uHVUn#=d`xBn6PESD0!G_3~FD>GIbGgYm{w|J@!6!54{6Zq^+^lJtmpO zX^CTc*V|Jx1#{#O$hxnu6BeUpMrry*AwGDWTKYO zNW`V%VNSW<8%-ub6rG7&bYl|O9hIZWc<_H499sn=eD8f>0daUMCbI2#yWePqF2Hiq zUFX2b?!7nhV;}f&R|tnLAjY(n!Vs%bk-gP65^?$L_F8jK3;FyT@}cYA*F2?gL}Gz3 zQL7u{NJ<53ga7D>klX{?-|0Sl-$@caS>Dtbn0?^pKbVTm#xeu?L02g|beF=x1ovP6 zpD%I%d>#U#6C+IzDd4<-#KoWS!#A7i0J$~{iB9#^y_o3y#NkNp-Sd1??x5M5;A`9| z&wHQ`6F5Yx(l{!nzN?)RO!g~~vIjjoKkmx}wfO)?jcsyAb8iZkYgNS!4DL}4A!z(M z1xvXMY^-f_UA)CXw>+pjoy@quqtW!@Y+LN~WPp}E@FNbLTzksa9)Mj8i=e&S@_|g~ zvcY_yS~1FjJc8#BzY~Ck-vd~Nq2s@gu{Va%bUx}9Z}y43%7zOdk>hAO?HzWGV#3Uud65yyKU zPT%tH^AoTKAT*{|hRNZF$?Qr{rNt&5z@N7 zhatewEq~{(IPB{5CF>_cK%b%$ew2gmJ(&s1XWcPcYgQk`sd1!NZb_I~MG0Mty7ls4 z|DN!O^i1sfC6mzR5yjr$BFsKBmc-{C1V$jZ_MhX*~MURbvKO9(6s zc1!D_-#1Kb5@_k|cU23U{J47L=SDPHg&>74Mb(|fgca9=xUx4bK6<(V+C8P5|GA7g zPl63OsU*Z5@%ios@T3rIoAZz6nTf&$;H!G$J_4)|%+YU?=G zJMcyF?1uFlz;||a6WUDoMNDY^;5;LNuJ-GZHh;ku|A1en1C~Wt(q=R}P{pZ{GCNxP z`Epn_b2o^hCiF>X6*sptajip^(c;tY3qnfZ4$7Y!Q{qwsMvI-F8(X8B<@+IYNHSVF z$XK(B3C*a*d48{Hqkuy(VsVWYM3vo4%rXgf`{_iq&-dJ`&({o?WK_+s{Xq`5d z+~MG0u5Rr6>!D^40gRn@!*n)lWrVC#x zU5Z+*Kng0uVubG(E`^S}$%Lk6c=2Wn-~L&O-KdC(ZJS~2)i>v%qww`|rBp5tnN($b ziWL0{Uu#v$Q|AejhkD7CFrE;;rKuEk{_jjwd*Cas0O5-{N^$>J!o)3oO^2|l!uLm% zLT0~YLeitCe0#-iqAvyi2`4HAw>84eh+Vi?{xE{4?Oyt_T@kx@xsn?(PH+?!34Mf_rd+yF+jd5co*bHn+KL|IOF? z%@h38%KeC6B^Mt@Ti`>CvjKm1iAZd?^~0RxegpfwF!``vOt zC(V4RxBQ$cQ6m9XSyO!pg>sbF#1#E!bQLJ-eW>vLI7l1)kQ6cUv4*${7l;JKgm@-_ zjr9BE<%cS{Py0Qo>Ud=d_a`r`I^jYws~X*{UW9XW6~8V23?lm^Gt`sJK)=ZRBL;V&_?a2v`=(S%Pm^v>t#6@gZ=a!{DTBm^%r$AHN~-=M zBt*!jGz%@I|b`P!W$I>f=sa)pu6z3P~<^P zS8J~@-*tI{mm7^9#i&B6r)Mw1$5rI>#fzj_O%`Uv3hy>OBw<2s8K-Tn62jD=i%YM& z-IX5k1z}t|v3>TIU)0-e5%JyR7HBKbpqfLW>sksz1y|;PUf^z61krVETcxkMNedWy z9Y9~NF&D-^UY!*6sYdX|HY0mCz;yGpk6#S#8hqz^F=~jmDt1s1bTJ7V;l-eh*dVPf zlF*>+mv9?#=#TU=i_K9K;M=myv_ANT82R#0bIby!MrH-)C!u?#>ZuG>bCO65>lF$J zr?bOQ!gtUDk~NDPM27>6OyFo-q+4B7rXUA&eN}1;>gu*+>&W~_s|M|F~1MW zf}MJh>nKFH=AT1Ut&>6Oi0>>ZHWx+q_PMg_3r%+js>ik$3?@eh;Ks5!bF9GY$b$yKCde_E9_=BPXawjh z;h*{yx8R#%J=R{-9&*~^=B!$nqZq=DU;Dy00eAyXvV!O-;Sce9cSXu$ctX{=auiZb zq#d~wDFTJGcvot((%+Bb89rGSVs&Sq2^REO3;uRBQU_dfWG?p@7nBl zyojpww0Dp^xniN8(dJ)#+OH}t{^Z|eb?xj8?Y`-Cz6zuZW)I4PNL*{&yD02FIx$uO z7*g?&R9X3UQ^e1}`C(Wd`D~)IqL{8ou3Lc37+y9v0bk(!{4HW++7H+)PI~fIgQ`)8 zSzzKOWEVhgZzlZtR~A&~s__Nd&h{4OT&1uFkRO@I^UFGn?0Ibb9f4RW{TyC&y9QVOAjz_22 z)cC327xfZ@HQdViOL=+VHhi|_I6BFOb3Qu(;bGPfhl82jC$Yn{uFq(g?WoD%{3Jhi z+yz&amJfcw>ow}6rJbJWWcvox>ytYzqvgJ?FIt@K=@6|hAuBvr z>$+Y%o#D}ECus4}ciHQZ#NM5o@e%jP@iG)H!W}XwoD^BYk_rtN@@mAn#-QRTbP&7-+XEr~|5yTUbX{W_9 z)>%~KznFSSIhyDo&JdqnUuKv*(CnI*!`^Eevc!!Rb>;9|yQ`7B6|LkwEQ}+)Lq3Num$8k*ci<5|@Me)A6p|76;<$a|l+L zU_iD6MmRM1L}?19RM88P(mJvPVx4aC4e9w}O{KdZt2MJ@x7b~;gt@F7YIee2a11$~ zMPW|1I#?69GY|R;P8!(-G{xxGOGH=1KjTLi$ESDmByLSNzq;6ECz{Fg-=K1C@jEfg zV-sednwsGJbje<#0hL)p(RXejV3aXFIcAuL_>w^8&O`*dFY!Iql6lXik^e^Bc285$!yK$9H7qcQsfDuO|Bvu-lVm8$mh3I65P1**95i?S_@b!$I*rUAdk_V$Hae<^M zy#a$psaOR{1auP0Rz0UfQKeKG_v?YuQaY8m7w<49_llfBd6&J;a#QZNQhdX;oF_^C zlEY$6JB2lqq-%v=7{_&$&`Z@uE(-U__Ji8IP^WyfQC3;Dx9&_lT8XO@TD zb*{_||Hti^7w@ETR8F~>i*A69D%eQnl!$QM1F*EyA3KGmHo$#t6N z2T&ou8&(?FpH^Di+KOXRBNqsWhK!y|6EE%@T{olz_{9vRV3Ck3$_;F~5SMm?Dk+`| zpYs@*BC#ID@F$k+_AM4WDO2a|su56iHHhnKbAlAtV2h(8vsy$%@y#V>uV z?yYlQ+_e(h>gZ>5yf$E&@6kseFpRKoihJ_LlF))@6s|-2b#CdHCyfX=Z{*0SxIDz! z-lDNK-q?GV_ixyx5P?`y1(TKtgSp&4p9%GTR#A>d*C!tyG5>*jx@ie3r%3G_?S4eA zm~x0VQ5BO$1VzaL%TY}xGFW5N>>k@ zJ1?24{=#Km5=}aVvLTIsR{Y9o;S|2alB2J`x1|W%K5JS$L5;sSk+crWq|ViMTTObV zB(FR`*Nm)rWZG?l_HbTwEr$pZtk2djP`_mOWg@gM+0?7vPwZw2WwuKC5(0fW#N3xt zoD|p@Y99w0O3TW*7U$c@7w0hw;#T#6jHMrSS|$$$*tC`;S(8fSoAbSN6$CgQ-{75M ztr1kECmJqN9!%~f0LF2=T<;Fcv88GWL$_^e%S~O#J|aX;2$!Mc@(X)piocxz$QPBj zG9hwg#E(esVyb<#Q4?lW%g_9>Gq8eX8paF=3q(a| zY)68NsTEPtwkAgv#hKczr7@CkwdRUb9L|x*U79O&d1H?ashn_JxMs8q#wt?;;+hxq zx}(kkZV}`Jv=A`Beba9;#Qs=GTxRxsuRm$Y>*BS zHsdw$ECaK|(>o<(Z&q}%eYgYPW4^ppnxQ4Qxk_pFeQFC(&4oDISmoeO83vd|c8 z#16J5?8>MZDBCq?6{+!M*lrhc0nw<8v>0^uaNu3m5us{Bt9o%c3y*c7PtByb8*(E# z2Z|pmD`skqYCm0TfX|RK>;hFR#(9i57NPHS2&x=4nPL>Ok~FV#f{cBF(%IAIUo;y& zSPq7YntNb6&?Oga`|%YU^T-WM&KY1kx~zD0Tof4X5n%{$T&wK7ah1>IuDca|FSuw*`8*h$_{cE~A*y0EpaTTmYn$oeoAdqEn zIgeUd^=53ML|4ykL8*s9xanzR#Mb~$G&&?#usa4`c`C@lw{OCQZ{5x+HE|Xv4IL5h z<^aLt^E8&&-Es^K?a~ah!jLVr1FoV;ak*?OJ@8Ssx?;G*V%t-4k_`qpn1}w(ay(|a zUs$bfUq!ubO2Om6*1+Ye*;_L+pRj+%MR|h7Wi5t)@LV~A)+bDd2N;C(7)iljX_62d ztCGgi;W9;fVW`#kVl6{wI#k|?_+UL!M@e+z?Y+&CswY}p&D@M0f8{=5@g*7N*0#>{ zKwPH&qzY&$H`Sg3A$f7ed@u|j81{*sq@?H(DPTergi~Y zuy#aX-AZ}3*n5kjYBLHcioH=56}^>hm?uvyl!gClZgPgrh1BY6<&Dq4tt$X zyf4vV#GaI{3C_kYb7+nHibMCkumeXa#i36cZEmw$w%_@(zeoqFba}ECou{3U)TKDs zjyG=@wHwlktG29NjWMWjiViq+@936myy z(IbNBku! z!n*oTmsZzr2iH2~JC!M67)Qy-VRl5!d)m>B&=xz5z%DDN+`>`Da$+j$cx3k1InAq(^l&u`SAH6>f zt-U$a%L2{CVl~uPDo9W`3543xcGUhwr*VjJ9`b|V(2${=(JoDxjvVI>3QLh2JtZ+o zO}$EWSf+|YV2?BQkP|i@h{QeCb5$o!)%r%tn@ojDtpqO9{H`~57w?7-+t0nl=xV85 z!1xaa*yYO<#TPn9&n@3j9@MT3JGLD@Knf z`jOv-2dn}ikUk;8ZW8hHu~4eL>I0a)e+3{qkL%>%VeCS zY{;t>fEw=D{gQS`!Mk`pr;ngYRHaJ?PHIQ$)gYH8tju=>G0w>o=GV5dE>uO+bOC_1 zs$)=Vh7IAUtG5oa8+in1;0!xT9_o}FX5+$9D(5ID9X4L&_#lOZ^me0U9JQUMWUW3B zW&*Sx3FSwSS`6y0N0VAI$Lz&uOj*=H;Up#i&?xf{;XZ}yH?SMF9uY6V+oCtfymVM+ z@+!NC7%EZv7$l2*a5s{D@`Gg1!AtRU2LhG{!-?(gG8&v6Num|8YppKxr7O$9)heru zhS0Y)T#?t4dmPP}k0}eXd7}@Cksz5kjT`Mh7WCTe@jwB#8{L!vp}Fs4qK3t(-)gD8 z)@!`_xQcMZP83M)Ft&^^mAT6zTasWG_(rvgM8oWMAmSD;;!#3ZxFwZ#{^R-3s1@yS zX7e0kk8F*X=#}rrhln!ufttslYLcm9;zqYyz?DqZH21~(&~k)Td~7!1EC4KfN_roJ z&P~knl%{5RMf=sBv}Z`KlVz(IL0xRWebmvQnKX7ze!~Gvw^x3{%fq)mW-{RpP-^%W zhI$~_ZnZ4j9gV&D07N{hoXB;b))XDyNioFlU_-`EnR`lEDE$pxJ4yZZyA{30m&j|2##_^p_D zuclw!ov^iy#nd>+!r;}&sUd>St_1G*y-_NNPLnqxNf&Kr?3Cq?PO02- zIvWTK2ZoC%^RTeL6|q8A%Db?{Ts~DjquFC8-VtGM|{jV80O5 z%UG@F(vg<=`JzfTsaO-m@eGbe@~a>>yT)S>o?{R+63@-|)VzRr5{6nwCHZ#^)ZTCo zb6>AKyybG2IlJcZz6V>y$1%1A#Wki4Sg=T{dEJ4{TxxMt{W;(R7qhtqx8XT@+UVS( z@%gJrn(E!)9)Cw>L*_*8=T^7{a#H#N{%u$;^<~sk<_Dd**<|@AM%Y8wffd=;vBnUb z-em>@VLS6Exj3^?bjK}c0JYSK7%!7VkQw(J-2z1?bKz;n(kR+8ss&Px`WRn490>l~ zdJ50n&^basI&9cvWoYz(gH|I6jz++m*Tb}JXmy`5Q=ZXM*w~nMb^ddZO1*LpMuyjR zLrFDeuFTQ71B#Wp3ZmN&?~By^^vq+an+-<=3Xc@-Th7Y}-Op`RExd93PUKnodiz)f9Oh*S#|{D-(_T`k8GV6U^OIR9ZFtq3g@FYnHz7 zgR~qhMv}048}b**kBZ3Ap!2=l$%kIKbEz3fty*plKd zvz*jFv(bXtA)CYJVWOC&HTqOS1|k=^JSV$D#LZJUGHTmU)ZD{rCY^AYy5+#n^oG=l zKZ%TiyfjH+=U%q@4am@o99e7^x=Cnd>eO{}h4hB5To8V{GfG$d=b4n_7>C2uEshnE zwp)4ZAIZ2zs;FVQ8V=|y%{vno>aCHC)WqK`;~IwsZIn;dt4;QXZOQdYTF)sgT~G~} zvZln)m0%eO>PYReMm0D@tU6*>=(0viVQcI0_oZ=i_4Wqj=7JY@8QMdtv$w5hLPkf9 z23ghL>?hhbf3feLpx!U4DLoupNeTjt%V9^`#B#G#9LWfHMaP*fxXEsXA7X6lm1;3z ziQROMrCkZhBF4F52p0i6e-60{RmOweab8G9pdok2QQ$jrQkKUSR^{TqtRMRLW^CF!ZvES_Ig}$=K3`bF{gc}<896XA`^eJ4 z6{EkHl=Nk`6v=?`Qr)#k5@;Pza0)qtaM5@e6oZWrM7{_s4Zg!aLU)sAj4w2%4E@*= z@04N^?>+{F7Okf%Sc{Y6_+_5|vSgr`SyCoooD>=yhZ)iQ;ZkhVv@FNikfojT0oG0ChRI^HzlvY6()hNjtJ>4Sb8uucIv+skZW8<|8 z$Q+t=>~jgo>$U)Ar^P$FxG@drcl`XvpYR+IRqz)nx5(ZO7NcG`g1AAuM9;4p2N8toROfx;ta;6YT=VIn;6|K! z5qHu+`ZDQXXIewH=6C_&pRHzt!yXepN^cfgir3KPFI{l0GZ1+QTJl`JG+Acco2(W@ z>YKv5brze5THk&DgO}xlYyR>SfKPbxv?Bk;%YF-464L$ZWEC}KCS}pQV4(+vV?&{y zdu1te-)BMP;D=es+Eh9kq@isDCIQd`=i};;XrwNBIgnbX)uk?kr4rEA;Z8)*SDfvw zLK*06P2cWtavk@%uGo*XJ>J~Hv=d&SN%My4;YtgeG7j4bc9MqE1t~xmqL0v~8=@J@ zqL1|0;2?eCM$aDyOCsP*jkA&KG<>EsV7-vtlu1{QJn5d5z*({RI;_f&qCj8Ws>lK~ zvy>76`JL1dib+!%BJ0Ohqeh{Xns9Np+6>{Ys8ZyPx-M1UkK&lyzWuC^ zB_bHSXGUZ46nKHku*_zOLOeOiMyMAWFt{sF5n-O3Xp7AP3O+032;GpkuhnJ&pqWil znDSUTHzb^;9H8x^9nGSnq@|=^>@EvH?$e61_0gvxpd#?E<@LKQR=z8i=b1L+Q96(_ zY4Sa6^1Us!CvSNDB^PV!olm-*=FnUFh*y=szAm0kb9FF7&|rW^}2p3g4%-qd5> z1tdk^*Ln#P#(Dbp+X>ajTa-$K8n|mZ#U$+0i&y7T>l1Fke9S1r95(z2bER39i_+@P zmB{4iy-D(b?rv_5KPOP#TmZK#m{4*kfT<+>sM<}C+>U%I)U0scjiDSvLcPi@xsG2C z4e%gz~>P-E6^&HQWH*2&#gsovzqSh7$za>`#gm&E?7x!r(xo_n4;=Eb&{4 zcSp%_pr9Uryc1YkP=vbUaflf{6Q6%z(bZbX)B>{5CyRz2R2|-mfZBnBw&X)g_V_#Y=5$#PLQZqP zVCS?-6~&j&OAbmy2R_a{vMq zwItDzD@o7%)o0YenY074^X})~1_C^fd7Cpd@zKdfwUfP82MAEa$R8<}_ro|kDqWUm zlrIf5SBhn0A4)#8Bh_VIv{y4nU!`th?2TG)8{B5HG& zjJoEYD&^$1fk`gfc1{5@QNIZ^e=q6!Ci>@#ZFmd#LQQrCy4M}78ArR%h-t-^`SxmD zn214oGh-WZ@IQx4y*j!SstP77(3>|M_Qiii_~v(fkP#3O&~f zy@Iw*sl7XwVoKYWm}3~gO_DzG2Q zF{G>Eb2ux1AV62xig-0dVxN}~0*)80&o^FPRd~I~d+-XG+M807CV?Mag_DV&XhQD| z1<%BUv$KBrVp>X-*bawZNaOf;uLsz~_|;_sdw;%iGZ#kG7uu=CVGV(x0!8~M1ObXE z@?=+&bg5hhtDr=y3JasF`b^toHiIb4T8~~FCI==YW>@Z|T<10trAP3s_PzUy@??qQ& zZJ&*X9J8sp_!3pa8qTr$BsypxCL}Urlp+tY(#XL|yk^I}ZrU&2F&tbo7*F?Kqy2al zOBr6rgB(*K9(#~i?Nj!S;+6Ir{OI-9RSO^QfX}4J&RC^4MOi9T54?RZi-Ej2AOKrB zFGwbj$*?3vL{Ot^9O%s7Kl`K3k@**G9zOZrDv&3=`xztrr7+~zgskXOal|(p%#hbK z|5{=YZ&l+YWr0yQuUuM;ONc)rfD#*mNYTTu)-mPdnPw4WFu#;y=*)bpau3$Fuh8Si z(~e8DEcMbnpKKj^k>d^9&T`ktVY_E1R+^rIO}%as5Ro#9t88iHYWzH#$s*>wosLTfC|1FIIvZ3fBK z6jaU=l_VRQd@$&P*cA8vmI#sNsOHc;h2j)<5xND-yYz|+y{LRD-Q)tBjD4_5onz@a zd|s9EB!jyFFP5Ss_hk&~h=mHG1YNP?d)pQjRr>~Uz2UBUM8_T_(0e9Om9Nl~mh

  • q4!UF* z9tkox{Tx+G;z6T}gAycSEGtBKpS@Xb%g$%ya<;M@m(~~b?&whB?fmqkqhN=KP`*vw8XX`SD3!d((`h9)C${jbg0$=RA-*F(^33Aecr=5-V-Ixyf0Ibqh!jSMr?3j|d1qykd< z;U3wzCH*Ls?BvBCZ7aO7`b_)DmmfYAJZSukZT&}ald!3Up`fmVuEN(+r{B&ufB54! z!>d!aRKZk&_o9Zhc>NM8py4C=URsds>pEo$zJxRUDWK`G1lfgVF~C~f2dl-U+8*x- z?Nt@7K46iNaj&E3l946Q*Kx>PIJdgTL!X8j7)CQVS}L?2Pf2_*i%MKjwaIV9g)ogc zY!MoihIO?%{QQJapxUBz#72hf8VQ1}6&+p?!6+-1=}DtuP2e1sPL9#WP&w)kl&9QCnyp#Y1CHb|NlA3$SGlE*Q3& zEC|IP2n+4HD%cE7erAYP2UJq2u$1}fhx=(=1{Aks9@^j zDNRjg5|ruLQFg&+*1SL-Yf7lRF{?}87-^1;$Ga;0^iJ0ZTBP4o6YZ)#U}(&<6WhPu zLUl2P0cK|F!fj(%zR`_el+*ELRO>PuM*%4jBqt5l(F?SBK|Z^&ZuG7(F+C^p;7v{s z2~(L0<2VNT?potb2@2t!>m3!Pq!QH*0dU7P)l3!6y#VO}rc7DR>_*O2lUVo28|dPj zS=DOi^GKU#3oo5AOyz2!E6Ahm?b#Wa92KigrSDVMjZ@6*wpTig?EyRRM^H3K4oJ>s z^8j{NtrpK6bwfHbF7uEzglYSeb4!`m> z1xRKrXxq6GMJ~I6$m-e>lN(4_fwvVK@wEnx>WXa81bi)ZC8)FxYo?8XWI_2g{t(2UJMm-+gYe**CLW2-` z8p>7K{cOH^#uUZP*Jj;0;ClQ4>kaH!ESFE*l0e>jd(;w-ns9)oiTmzDY5jp~R9iRq zNGq?k9;)Yioq+b+nzJpOoI5m^P(HWoG~7-Uj1>`*$m_iZV-PtD`DD15ZUV|xI{B$D z6Qnxfx06Z};!}RzOx@4CnS|-LD|*SwnY|sck)G?ueN_9h#I(!kEjmie?~UZ~x# z=MqeN9ZN^ui~tORO4dceX&}$&DhQ9R@TG%q6!jV0A03;|VyhhNQ#d65$+1cQ4;|Y# zS5~g9u7ae3`~V9|9MPpDCrDm=iRi~vUSAI^-xMC%i_y(r>KKRB6+0lAoESeH8tj?trNtvLvjox4+NnTg2&ER`gYs84ET_$G=1EW&gl=_uLIE%O2t zLt(GDIFtf-sd!;qlR@<=F|jtCpKmVEAk1hFHZGPE9Zdx=92;xsn6O-b{Q4k+F#%mfd9_&TWaY=y~` ztkNBEVl{bjY!YG%GJ{0g^O<%QG^X>eGjgBdYx>rR%>6PLK^h}?Hqx4U!i~sI_y|q= zA$O4^*i_Hvl6ckmZa3=W>U-|$d*@Q^^Y>KFT>*%dhKRc8D@4oScTVkEU=Cft=;aEo z+v{Wuz*6W+l~V7AqpV;*z(QNB4v6A^kiTZj>{xpY)ip74vPoV%yw3AhZ5G-B107}E zb62D=UBIWuZ$M_~6C#Gk#y8jPJlIIrPXfyWKSVUh>b$tvf3JMxc-{tBLwtXHX%2x)%5w1f$W%|V$5wcXU-O!Z0r#1`i z_>@;_j5=L(vVH_(HO08w3`yFf>=d}Y2q4Bbk~&vH)2nN#Qs54KJ}*XnMg>xW1zdzy zT~KPlpfr2M(;!2a>=u*XQ7mnh#gi0a9APvD=kVS)nZXv?y&|^B3R6y@Xc^Q7;C~t0 z-m5hn@H35U477{Q0U)wJ=9r9E8t9}jIN;*GNO!dwh%(?>AzCUADymRgnL1&QPN~iec zk16L)DqpVCLNKu$dk#F#AwUHzg!xN7I8Cv+y4m0=WpW&9L9r^V|jF4`<8OBF9$(e5M4b4!f zT~ZHzv!{8OkNOUF$%DXjx&y{{8~k~5L*Fi;w6^y|yr#%`WH-6sBh@CoE|%Z+I6iGJ^6ml#4qjN#m9d^B;+8MSUejPtnX+c%L56KH z%}0)z20YMfk-*`H(1_Kn79qXQy6p3T4;n|ahyu5Ykj+{T@@?hQ+30W;0LnImIkbnY zAA27bRjyo6(q3=jW0}1wJ^7iqtO2;S0b#2^!}prSRj-vJ^!66zlb6qkPSwt{2%YiI z@LW8)$L#O#LRJL(kD;0oV?~96QGH=)>UTd?jJpPy>?7b8_xUb>xv4b!&vp2U2TA9q z^vZ-LjgEzmnm)e3-;_x2Qc3Qe5#7Lyd(32fA1GAgf4s|fn;kaDkstwJ98sXC1<_p6 z%*6ojV;rOr@=lt-6!vC?C#j3dM0s}s3gO+WMU5iYb7TvAE8V`xMsCJixa35BgqHL8 z!*vaAp(Y0Kv4BwS+#rYzlw2_>A!4Y(HDuJmja}mi z%F37S8Zu6wV8k+`@QkO!^}z5V?hK|6f*N`?v{dkw45f_LHb!^0yTSV%4REss*2U8l z?6x)u3AdQQjJh$$m||7QbVjwcG3{HIEY4oe=cjT55GWFg#4wEU-AKWwj|feKRqL7p z7HJAoFkdp9ci+Lu>I|9IEr-f*wP*XmkrzGK!Cby!){+Ks0sg)LSv~d168M)ZE)VRr7ihS?2ea8F)}t zRiUeTwcx#R2`h{bNk7go8*f>HJzfT1Oxtr1_FATF^VjV_%+D}R9U1`R*P(OfYo$$h zHM~GS8dC^qMUqPa#R7MY^Fvib!#l^FV7G}0Vh{&!#!#fEsH@=N>n|%F9L3)%XiuS2 zrM5j}T5AG^Ckj3fG5T1FvVnt)kbcoFMp%#+9A>o8dk3v8eHszxFR4ug={8FenXZ_x zqc!q2FY|ox<6|_b7={^zJ?V}zb&7T&T0G*J53w9QYtbaJ<}%G@M{T8Ws4e~@USyDK zI>dBY%$^dbpu}?zLknNPwbp*>IG%Nkw!{UUY>rGrgTw`%Y))Wv&G0foC9n2ulCC)L zg3t$dmE!xc0Qw4gv;oq(Gd`@BM6fg9y8&xrf;iVquWfTx$V)BI_NC!SnkL?BXix4= z7?lOi?Jd$iBly5Nj2-c+Sd(3BxdYERATdl9(c-pyGb9Cgk>c&p#if9Kv8`sH$kc$8 zGY*+)hi6d61pHWXp2TNHrInIWNH$gE;Qg(eN{7a;W0kq~eGpB% znst*9iG+8yFfe2*{N=Y0`C-@Lv2&| zQ(o;0ruC0zc7JELvr&*hRu)i>h{&4bLBE@cWd=zUokrMt1M}T3zV?rOev}CKY7dG} zugw3-E^O?qZ4B)kObzWND9HyTB_yd&C99-HM`cFErazF9k&Q`>3`l;U7?&EBAR8Q& zTob1mq@e;L7aJL!_9vYbkndGWQd3M%d24K5WUQBE+z<8?ICut(4D!7z;K#PNC&_<# z@_fJk_q%cbM-$vP4u9Q*_KhAM=#cMgNaA-6e@FIoQUCS%O1ALy`&*0JS5f~Q=xdYO zx92Oxm#3d!DZY7`r#`2@Cj8p8_U-vfNchG5Kk8M>2lQi;-EW9_ zzDQ4Q;U8<=ui^0jXu10l=*Rx2??7wdKLPZ2-B3S5{#d&D9Wn*sUqJq$ko8B*A1l+o zV^Tl4uYWwBKYr%#d981Og8xGOp;F^JY69lJK>cIg#*d&sCa=GPUg7);(BDG6f0oMr zQG_28sozC7eD$*;{P#WKN3uh+^Sr}oEV`gc@b=Km4u_d~m^1lZHo U0tAHf^w09?$a?t%0R;5_0D1Cg761SM diff --git a/lib/google-http-client-android-1.41.1.jar b/lib/google-http-client-android-1.41.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c7cf44b8f06367c7d3d0d9b3ce9a6f5e85640dbf GIT binary patch literal 17112 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 literal 0 HcmV?d00001 diff --git a/lib/msa-auth-for-android b/lib/msa-auth-for-android index 3b48a4973..e930a7361 160000 --- a/lib/msa-auth-for-android +++ b/lib/msa-auth-for-android @@ -1 +1 @@ -Subproject commit 3b48a4973fddaec258edfb702fc242261d81cd1c +Subproject commit e930a73612d0eee17710f5a9460c9a943efb090f diff --git a/lib/pcloud-sdk-java b/lib/pcloud-sdk-java index b2db89269..c96155934 160000 --- a/lib/pcloud-sdk-java +++ b/lib/pcloud-sdk-java @@ -1 +1 @@ -Subproject commit b2db89269e8e4059a7415e0364e427e71682700d +Subproject commit c961559344afe200a576b2ec5288a95c06876a4d From da5ef4dbbe2cb1dcd48b2b52d794c47e8c168ddd Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 17 Jan 2022 22:15:28 +0100 Subject: [PATCH 03/35] Use a contains search instead of startsWith (fixes #403) --- .../cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt index 4079d8889..30edadbdc 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BrowseFilesAdapter.kt @@ -117,7 +117,7 @@ constructor( if (sharedPreferencesHandler.useGlobSearch()) { nodes?.filter { cloudNode -> PatternMatcher(filterText, PatternMatcher.PATTERN_SIMPLE_GLOB).match(cloudNode.name) } } else { - nodes?.filter { cloudNode -> cloudNode.name.lowercase().startsWith(filterText.lowercase()) } + nodes?.filter { cloudNode -> cloudNode.name.contains(filterText, true) } } } else { nodes From d602cbbfd7834e81f2be71f735a8b6a43ff384ab Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Tue, 18 Jan 2022 17:53:54 +0100 Subject: [PATCH 04/35] New Crowdin updates (#398) and french playstore/f-droid description * New translations strings.xml (Arabic, Chinese Traditional, German, Hebrew, Hong Kong, Indonesian, Japanese, Norwegian Bokmal, Portuguese, Brazilian, Slovak, Spanish, Turkish) * update french full description * fix typo in short description [ci skip] Co-authored-by: Taink --- .../android/fr-FR/full_description.txt | 30 +-- .../android/fr-FR/short_description.txt | 2 +- .../src/main/res/values-ar-rSA/strings.xml | 33 ++- .../src/main/res/values-de-rDE/strings.xml | 10 +- .../src/main/res/values-es-rES/strings.xml | 112 ++++----- .../src/main/res/values-in-rID/strings.xml | 4 +- .../src/main/res/values-iw-rIL/strings.xml | 217 ++++++++++++++++++ .../src/main/res/values-ja-rJP/strings.xml | 5 + .../src/main/res/values-nb-rNO/strings.xml | 22 ++ .../src/main/res/values-pt-rBR/strings.xml | 5 + .../src/main/res/values-sk-rSK/strings.xml | 26 +-- .../src/main/res/values-tr-rTR/strings.xml | 4 +- .../src/main/res/values-zh-rHK/strings.xml | 37 +++ 13 files changed, 405 insertions(+), 102 deletions(-) create mode 100644 presentation/src/main/res/values-zh-rHK/strings.xml diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 4bfd34cb3..a16658322 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -1,8 +1,8 @@ -Cryptomator rend votre stockage dans le cloud beaucoup plus sûr. L'application chiffre les fichiers sur votre appareil mobile avant qu'ils ne soient envoyés dans votre cloud. Même si une tierce partie obtient un accès non autorisé à vos fichiers (par exemple, une attaque de pirates informatiques), vos fichiers sont à l'abri des regards indiscrets. +Avec Cryptomator, la clé de vos données est dans vos mains. Cryptomator chiffre vos données rapidement et facilement. Vous les envoyez sur votre service cloud favori. -SIMPLICITÉ +SIMPLE D'UTILISATION -Cryptomator a été développé en mettant l'accent sur la convivialité. +Cryptomator est un outil d'auto-défense numérique. Il vous permet de protéger vos données stockées sur le cloud vous-même et en indépendance. • Il suffit de créer un coffre-fort et d'y attribuer un mot de passe • Aucun compte ou configuration supplémentaire n'est nécessaire @@ -10,30 +10,30 @@ Cryptomator a été développé en mettant l'accent sur la convivialité. * à partir d'Android 6.0 et sur smartphones avec capteur biométrique d'empreintes digitales -COMPATIBILITÉ +COMPATIBLE Cryptomator est compatible avec les systèmes de stockage dans le cloud les plus couramment utilisés et disponible pour tous les principaux systèmes d'exploitation. -• Compatible avec Dropbox, Google Drive, OneDrive et les services de stockage dans le nuage basés sur WebDAV -• Créer des coffres-forts dans le stockage local d'Android (par exemple, fonctionne avec des applications de synchronisation tierces) +• Compatible avec Dropbox, Google Drive, OneDrive et les services de stockage dans le cloud basés sur WebDAV +• Créer des coffres-forts sur le stockage local d'Android (fonctionne donc avec des applications de synchronisation tierces) • Accédez à vos coffres-forts sur tous vos appareils mobiles et ordinateurs -SÉCURITÉ +SÉCURISÉ -Cryptomator pour Android est basé sur le projet open-source de Cryptomator pour Ordinateur de bureau. +Vous n'avez pas à aveuglément accorder votre confiance à Cryptomator, car c'est un logiciel open-source. Pour vous utilisateur, cela signifie que n'importe qui peut voir le code. • Chiffrement du contenu et des noms de fichiers via AES et une longueur de clé de 256 bits -• Le mot de passe du coffre-fort est sécurisé par cryptage pour une meilleure résistance aux attaque par force brut -• Les coffre-forts sont automatiquement verrouillées après la mise en arrière-plan de l'application -• La mise en œuvre de Crypto est basée sur la bibliothèque open-source CryptoLib et est documentée publiquement +• Le mot de passe du coffre-fort est sécurisé par cryptage pour une meilleure résistance aux attaques par force brute +• Les coffre-forts sont automatiquement verrouillés après la mise en arrière-plan de l'application +• La mise en œuvre de Crypto est documentée publiquement -UNE GÉNIALITUDE GÉNÉRAL +LAURÉAT -Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs du Cryptomator. +Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs de Cryptomator. LA COMMUNAUTÉ CRYPTOMATOR Rejoignez la communauté de Cryptomator et participez aux conversations avec les autres utilisateurs de Cryptomator: https://community.cryptomator.org -- Suivez-nous sur Twitter @Cryptomator -- Comme nous sur Facebook/Cryptomator \ No newline at end of file +- Suivez-nous sur Twitter @Cryptomator +- Likez-nous sur Facebook /Cryptomator diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt index 0a4252a1b..1410c4b97 100644 --- a/fastlane/metadata/android/fr-FR/short_description.txt +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -1 +1 @@ -Verrouillé votre cloud: Prenez en mains la sécurité de vos données \ No newline at end of file +Verrouillez votre cloud: Prenez en main la sécurité de vos données diff --git a/presentation/src/main/res/values-ar-rSA/strings.xml b/presentation/src/main/res/values-ar-rSA/strings.xml index 33799525b..04349bbdd 100644 --- a/presentation/src/main/res/values-ar-rSA/strings.xml +++ b/presentation/src/main/res/values-ar-rSA/strings.xml @@ -4,28 +4,34 @@ تشفير حدث خطأ ما - المصادقة فشلت + فشلت المصادقة فشلت عملية المصادقة، الرجاء تسجيل الدخول باستخدام %1$s لا يوجد اتصال بالشبكة - كلمة المرور غير صحيحة + كلمة المرور خاطئة المجلد أو الملف موجود مسبقاُ. - نوع المخزن غير مدعوم. تم إنشاء هذا المخزن باستخدام نسخة أخري من Cryptomator. + نوع المخزن غير مدعوم. تم إنشاء هذا المخزن باستخدام إصدار آخر من Cryptomator. المخزن موجود مسبقاً. ملف غير موجود. تم قفل المخزن. موفر الخدمة السحابية موجود مسبقاً. الرجاء تحميل تطبيق يمكنه فتح هذا الملف. - لم يتم العثور على الخادم. - فشل التصدير. حاول إزالة الأحرف الخاصة من أسماء الملفات وتصديرها مرة أخرى. - لا يمكن أن يحتوي علي رموز خاصة. - اسم الملف لا يمكن أن يحتوي علي رموز خاصة. - اسم المخزن لا يمكن أن يحتوي علي رموز خاصة. + لم يتم العثور على المخدم. + الرجاء فتح إعدادات جهازك وتعيين قفل الشاشة يدوياً + فشل التصدير. حاول إزالة المحارف الخاصة من أسماء الملفات وتصديرها مرة أخرى. + لا يمكن أن يحتوي على محارف خاصة. + اسم الملف لا يمكن أن يحتوي على محارف خاصة. + اسم المخزن لا يمكن أن يحتوي على محارف خاصة. فشل التحقق من التحديث. حدث خطأ عام. فشل التحقق من التحديث. التجزئة المحسوبة لا تتطابق مع الملف المرفوع فشل التحقق من التحديث. لا يوجد اتصال بالإنترنت. + فشل فك تشفير كلمة المرور WebDAV، الرجاء إضافتها في الإعدادات + خدمات متجر Google غير مثبتة! تم إلغاء استخدام البصمة في عملية التوثيق + الإصدار المحدد في %1$s يختلف عن %2$s + %1$s لا يتطابق مع هذا %2$s خطأ عام أثناء تحميل إعدادات المخزن بعد إعادة التبديل الي Cryptomator لم يعد الملف المحلي موجود. لايمكن نشر التعديلات الي موفر الخدمة السحابية. + لا يوجد مخزن بهذه المعلومات في S3 موقع المفتاح الرئيسي غير مدعوم بعد @@ -35,6 +41,7 @@ Cryptomator يحتاج صلاحية الوصول الي التخزين لكي يستطيع تصدير الملفات Cryptomator يحتاج صلاحية الوصول الي التخزين لكي يستطيع رفع الملفات Cryptomator يحتاج صلاحية الوصول الي التخزين لكي تستطيع مشاركة الملفات + لقد فقد Cryptomator الإذن للوصول إلى هذا الموقع. الرجاء تحديد هذا المجلد مرة أخرى لاستعادة الإذن. الإعدادات بحث السابق @@ -119,11 +126,13 @@ الاسم المعروض مفتاح الوصول المفتاح السري + مخزن موجود مسبقاً نقطة الوصول المنطقة إسم العرض لا يمكن أن يكون فارغاً مفتاح الوصول لا يمكن أن يكون فارغاً المفتاح السري لا يمكن أن يكون فارغاً + المخزن لايمكن ان يكون فارغاً نقطة الوصول أو المنطقة لا يمكن أن تكون فارغة إسم المخزن لايمكن ان يكون فارغاً. @@ -146,11 +155,15 @@ إستخدام البصمة تنشيط توثيق البصمة تأكيد فتح الوجه (إذا كان متوفراً) + حظر التطبيق عندما يحجب + حظر اعتراض الإدخال وعرض واجهة مستخدم خاطئة حظر لقطات الشاشة حظر لقطات الشاشة في قائمة التطبيقات الحديثة وداخل التطبيق بحث بحث مباشر تحديث نتائج البحث أثناء إدخال الإستعلام + البحث باستخدام نمط المطابقة glob + استخدام نمط المطابقة glob مثل alice.*.jpg قفل تلقائي أقفال بعد عند تعطيل الشاشة @@ -174,6 +187,7 @@ وضع التصحيح ارسال ملفات السجل فشل الإرسال + تلميحات الأمان الإصدارة إعدادات متقدمة تسريع فتح القفل @@ -212,6 +226,7 @@ إستبدال الملف \'%1$s\' موجود مسبقاً. هل تريد استبداله؟ الملفات موجودة مسبقاً. هل تريد استبدالها؟ + %1$d ملفات موجودة مسبقاً. هل تريد استبدالها؟ استبدال الملف؟ استبدال الملفات؟ غير قادر علي مشاركة الملفات @@ -266,6 +281,7 @@ انتباه تعطيل التطبيق غامض + يقوم تطبيق آخر بعرض شيء فوق Cryptomator (على سبيل المثال فلتر الضوء الأزرق أو تطبيق الوضع الليلي). تم تعطيل Cryptomator لأسباب أمنية.\n\nكيفية تمكين Cryptomator إغلاق هذا الإعداد هو ميزة أمنية ويمنع التطبيقات الأخرى من خداع المستخدمين لفعل أشياء لا يريدون القيام بها.\n\nبتعطيليها, أنت تؤكد أنك على علم بالمخاطر. هل ترغب حقّا بحذف هذا الإتصال الخاص بمقدم الخدمة السحابية؟ @@ -328,6 +344,7 @@ حدث خطأ عام أثناء الرفع. المجلد المحدد للرفع لم يعد متوفرًا. اذهب إلى الإعدادات واختيار واحد جديد تم قفل المخزن اثناء الرفع، الرجاء قم بفتحه لمتابعة الرفع + المخزن المحدد للتحميل التلقائي لم يعد موجودا. فتح ملف قابل للكتابة سوف يبقى المخزن مفتوحاً حتي يتم التعديل تم تثبيت آخر إصدارة diff --git a/presentation/src/main/res/values-de-rDE/strings.xml b/presentation/src/main/res/values-de-rDE/strings.xml index 36da0782f..d8504bd1a 100644 --- a/presentation/src/main/res/values-de-rDE/strings.xml +++ b/presentation/src/main/res/values-de-rDE/strings.xml @@ -236,15 +236,15 @@ Datei ersetzen? Dateien ersetzen? Teilen nicht möglich - Sie haben keinen Tresor eingerichtet. Bitte legen Sie zuerst einen Tresor mit der Cryptomator-App an. + Du hast keinen Tresor eingerichtet. Bitte lege zuerst einen Tresor mit der Cryptomator-App an. OK Tresor erstellen %1$s kann nicht geöffnet werden - Bitte installieren Sie eine App, die diese Datei öffnen kann. Möchten Sie die Datei stattdessen auf dem Gerät speichern? + Bitte installiere eine App, die diese Datei öffnen kann. Möchtest du die Datei stattdessen auf dem Gerät speichern? Tresor umbenennen Ordner umbenennen Datei umbenennen - Sie haben ungespeicherte Änderungen + Du hast nicht gespeicherte Änderungen Möchtest du wirklich beenden, ohne zu speichern? Verwerfen text.txt @@ -301,7 +301,7 @@ Möchtest du dieses Element wirklich löschen? Dieser Vorgang wird den gesamten Ordnerinhalt löschen. Bist du sicher, dass du diesen Ordner löschen möchtest? Biometrischer Login deaktiviert - Da der Schlüssel nicht mehr zur Verfügung steht, wurde der Biometrischer Login deaktiviert. Zur Reaktivierung öffnen Sie die Cryptomator-Einstellungen. + Da der Schlüssel nicht mehr zur Verfügung steht, wurde der Biometrischer Login deaktiviert. Zur Reaktivierung öffne die Cryptomator-Einstellungen. APK-Store Lizenz Cryptomator wurde nicht über den Google Play Store installiert; gib daher eine gültige Lizenz ein. Diese kann auf https://cryptomator.org/android/ erworben werden. Die eingegebene Lizenz ist ungültig. Stelle sicher, dass sie korrekt eingegeben wurde. @@ -317,7 +317,7 @@ Download in Ausführung Lade die aktuelle Version von Cryptomator herunter Dieser Ordner ist ein symbolischer Link - Sie können nicht in diesen symbolischen Link navigieren + Du kannst nicht in diesen symbolischen Link navigieren Zurück Verzeichnisinhalt kann nicht geladen werden Der Ordner \'%1$s\' in der Cloud hat keine gültige Verzeichnis-Datei. Es könnte sein, dass der Ordner auf einem anderen Gerät erstellt und noch nicht vollständig mit der Cloud synchronisiert wurde. Bitte überprüfe, ob die folgende Datei in der Cloud existiert und nicht leer ist:\n%2$s diff --git a/presentation/src/main/res/values-es-rES/strings.xml b/presentation/src/main/res/values-es-rES/strings.xml index a63fe476e..89af69212 100644 --- a/presentation/src/main/res/values-es-rES/strings.xml +++ b/presentation/src/main/res/values-es-rES/strings.xml @@ -5,16 +5,16 @@ Se ha producido un error Ha fallado la autenticación - Autenticación fallida. Por favor, inicie sesión usando %1$s + Error de autenticación. Por favor, inicie sesión usando %1$s No hay conexión de red Contraseña incorrecta Ya existe un archivo o carpeta. - Caja fuerte no soportada. Se ha creado con otra versión de Cryptomator. - La caja fuerte ya existe. + Bóveda no soportada. Se ha creado con otra versión de Cryptomator. + La bóveda ya existe. El archivo no existe. - Se ha bloqueado la caja fuerte. + Se ha bloqueado la bóveda. La nube ya existe. - Por favor, descarga una aplicación que pueda abrir este archivo. + Descargue una aplicación que pueda abrir este archivo. Servidor no encontrado. Abra los ajustes de su dispositivo y establezca el bloqueo de pantalla manualmente Exportación fallida. Intente eliminar los caracteres especiales de los nombres de archivo y vuelva a exportar. @@ -38,9 +38,9 @@ Almacenamiento local - Cryptomator necesita acceso al almacenamiento para exportar archivos. - Cryptomator necesita acceso al almacenamiento para subir archivos. - Cryptomator necesita acceso al almacenamiento para compartir archivos. + Cryptomator necesita acceso al almacenamiento para exportar archivos + Cryptomator necesita acceso al almacenamiento para subir archivos + Cryptomator necesita acceso al almacenamiento para compartir archivos Cryptomator ha perdido permiso para acceder a esta ubicación. Seleccione esta carpeta de nuevo para restaurar el permiso. Configuración Buscar @@ -56,16 +56,16 @@ Añadir a Cryptomator - Crear nueva caja fuerte - Añadir caja fuerte existente + Crear bóveda nueva + Añadir bóveda existente Eliminar - Haz clic aquí para crear una caja fuerte + Haga clic aquí para crear una bóveda Contraseña cambiada con éxito - Caja fuerte + Bóveda Seleccionar archivo masterkey Dejar aquí - Nombre de caja fuerte: %1$s + Nombre de la bóveda: %1$s Mover %1$s a Mover %2$d elementos a @@ -106,7 +106,7 @@ texto archivo archivos - Los nombres de archivo deben ser únicos. Renombra los duplicados. + Los nombres de archivo deben ser únicos. Renombre los duplicados. Guardar ubicación Guardar Cifrado completado @@ -114,7 +114,7 @@ Servicio de nube Elegir ubicación - Haz clic aquí para añadir ubicaciones + Haga clic aquí para añadir ubicaciones El servidor no parece ser compatible con WebDAV No hay ubicaciones extra disponibles. @@ -124,7 +124,7 @@ Conectar La URL no puede estar vacía. La URL no es válida. - El nombre de usuario no puede estar vacio. + El nombre de usuario no puede estar vacío. La contraseña no puede estar vacía. Nombre para mostrar @@ -139,15 +139,15 @@ La cubeta no puede estar vacía El punto final o la región no puede estar vacío - El nombre de la caja fuerte no puede estar vacío. - Nombre de la caja fuerte + El nombre de la bóveda no puede estar vacío. + Nombre de la bóveda Crear Establecer contraseña Las contraseñas no coinciden. Completado IMPORTANTE: si olvida su contraseña no habrá manera de recuperar los datos. - Reescriba la contraseña + Repita la contraseña Demasiado débil para crear una bóveda Débil Aceptable @@ -181,15 +181,15 @@ Cargar videos Guardar archivos de carga automática en… Web de Cryptomator - Síguenos en Twitter - Danos me gusta en Facebook + Síganos en Twitter + Denos me gusta en Facebook Legal Licencias Términos de la licencia Soporte Solicitar ayuda Modo de depuración - Enviar archivo de trazas + Enviar archivo de registro Error en el envío Consejos de seguridad Versión @@ -213,12 +213,12 @@ Cancelar Desbloquear - Antigua contraseña - Nueva contraseña + Contraseña anterior + Contraseña nueva Cambiar contraseña - La antigua contraseña no puede estar vacía. - La nueva contraseña no puede estar vacía. - Las nuevas contraseñas no coinciden. + La contraseña anterior no puede estar vacía. + La contraseña nueva no puede estar vacía. + Las contraseñas nuevas no coinciden. Bóveda %1$s no encontrada La bóveda ha sido renombrada, movida o eliminada. Eliminar esta bóveda de la lista y añadirla de nuevo para continuar. ¿Eliminar ahora? @@ -230,53 +230,53 @@ Reemplazar todos Reemplazar existentes Reemplazar - Ya existe un archivo llamado %1$s. ¿Quieres reemplazarlo? - Todos los archivos existen ya. ¿Quieres reemplazarlos? - %1$d archivos existen ya. ¿Quieres reemplazarlos? - \"¿Reemplazar archivo? - \"¿Reemplazar archivos? + Ya existe un archivo llamado %1$s. ¿Desea reemplazarlo? + Todos los archivos ya existen. ¿Desea reemplazarlos? + %1$d archivos ya existen. ¿Desea reemplazarlos? + ¿Reemplazar archivo? + ¿Reemplazar archivos? No se puede compartir archivos - No ha configurado ninguna caja fuerte. Cree antes una nueva caja fuerte con la aplicación Cryptomator. + No ha configurado ninguna bóveda. Cree primero una bóveda nueva con la aplicación Cryptomator. Aceptar - Crear caja fuerte + Crear bóveda No se puede abrir %1$s - Descarga una aplicación que pueda abrir el archivo o, ¿quieres guardarlo en el dispositivo? - Renombrar caja fuerte + Descargue una aplicación que pueda abrir el archivo o ¿desea guardarlo en el dispositivo? + Renombrar bóveda Renombrar carpeta Renombrar archivo - Tienes cambios sin guardar - \"¿De verdad quieres salir sin guardar? + Tiene cambios sin guardar + ¿Realmente desea salir sin guardar? Descartar texto.txt - \"¿Estás seguro de que quieres eliminar esta caja fuerte? - Esta acción solo eliminará la caja fuerte de esta lista y no la borrará físicamente. - Sube… + ¿Está seguro que desea eliminar esta bóveda? + Esta acción solo borrará la bóveda de esta lista y no la eliminará físicamente. + Subiendo… Archivo %1$d de %2$d Exportando (%1$d/%2$d) - Espera, por favor… + Por favor espere… Creando carpeta… Creando archivo de texto… Autenticación… Renombrando… - Borrando… - Desbloqueando caja fuerte… + Eliminando… + Desbloqueando bóveda… Cambiando contraseña… - Creando caja fuerte… + Creando bóveda… Subiendo… Descargando… Cifrando… Descifrando… Moviendo… Bloquear - Invalidar certificado SSL - El certificado SSL no es válido. ¿Quiere confiar en él de todas formas? + Certificado SSL inválido + El certificado SSL es inválido. ¿Desea confiar en él de todas formas? Detalles Esto podría ser un riesgo para la seguridad. Sé lo que estoy haciendo. El uso de HTTP no es seguro. Recomendamos usar HTTPS en su lugar. Si conoce los riesgos puede seguir usando HTTP. Cambiar a HTTPS \"¿Usar HTPPS? - No se ha establecido el bloqueo de pantalla. Para almacenar las credenciales de forma segura, establece con Aceptar un patrón o contraseña. - \"¿Establecer bloqueo de pantalla? + No se ha establecido el bloqueo de pantalla. Para almacenar las credenciales de forma segura, defina con OK un patrón o contraseña. + ¿Establecer bloqueo de pantalla? Establecer bloqueo de pantalla No hay autenticación básica configurada en el sistema Registre al menos un dedo/rostro para usar este servicio. @@ -294,12 +294,12 @@ La bóveda es la carpeta raíz de la conexión a la nube Crear una conexión nueva en la nube donde seleccione al menos la carpeta padre de esta carpeta de bóveda como directorio raíz para añadir esta bóveda. Esta opción es una función de seguridad y evita que otras aplicaciones engañen a los usuarios para que hagan cosas que no quieren hacer.\n\nAl desactivar, confirma que es consciente de los riesgos. - \"¿Estás seguro de que quieres eliminar esta conexión de nube? - Esta acción eliminará la conexión de nube y todas las cajas fuertes de esta nube. + \"¿Está seguro que desea eliminar esta conexión a la nube? + Esta acción eliminará la conexión a la nube y todas las bóvedas de esta nube. ¿Eliminar %1$d elementos? ¿Está seguro que desea eliminar estos elementos? - \"¿Estás seguro de que quieres borrar este archivo? - Esto borrará todo el contenido de la carpeta. ¿Estás seguro de que quiere borrar esta carpeta? + ¿Está seguro que desea eliminar este archivo? + Esto borrará todo el contenido de la carpeta. ¿Está seguro que desea eliminar esta carpeta? Función de autenticación biométrica desactivada Debido a que la clave ha sido invalidada, la función de autenticación biométrica ha sido desactivada. Para reactivarla, abra los ajustes de Cryptomator. Proporcione una licencia válida @@ -356,8 +356,8 @@ Usar contraseña de la bóveda No se pueden cargar archivos automáticamente - Cajas fuertes desbloqueadas: %1$d - Autobloqueo en %1$s + Bóvedas desbloqueadas: %1$d + Autobloquear en %1$s Bloquear todas Cancelar carga Carga automática de fotos en ejecución @@ -378,7 +378,7 @@ Vaciar la caché Los cambios se aplicarán en el próximo reinicio de la aplicación Registrado para - \"%1$s + %1$s Actualizar intervalo de verificación Comprobar atualizaciones Última ejecución %1$s diff --git a/presentation/src/main/res/values-in-rID/strings.xml b/presentation/src/main/res/values-in-rID/strings.xml index 06b766c5b..399ee6539 100644 --- a/presentation/src/main/res/values-in-rID/strings.xml +++ b/presentation/src/main/res/values-in-rID/strings.xml @@ -211,7 +211,7 @@ Batalkan - Buka Gembok + Buka Kunci Kata sandi lama Kata sandi baru Ubah kata sandi @@ -266,7 +266,7 @@ Mengenkripsi… Mendekripsi… Memnindahkan… - Gembok + Kunci Sertifikat SSL tidak valid Sertifikat SSL tidak valid. Apakah Anda ingin mempercayainya? Rincian diff --git a/presentation/src/main/res/values-iw-rIL/strings.xml b/presentation/src/main/res/values-iw-rIL/strings.xml index bef634e19..b7c128f55 100644 --- a/presentation/src/main/res/values-iw-rIL/strings.xml +++ b/presentation/src/main/res/values-iw-rIL/strings.xml @@ -1,45 +1,262 @@ + הצפן + ארעה שגיאה + האימות נכשל + אין חיבור לרשת + סיסמה שגויה + כבר קיימים תיקייה או קובץ בשם זה. + הכספת לא נתמכת. כספת זו נוצרה בגרסה אחרת של Cryptomator. + כספת כבר קיימת. + הקובץ לא קיים. + הכספת ננעלה. + אחסון ענן זה כבר בשימוש. + אנא הורד אפליקציה שתומכת בפתיחה של קובץ זה. + שרת לא נמצא. + אחסון מקומי + הגדרות + חיפוש + הקודם המשך + מיון + א - ת + ת - א + החדש ביותר + הישן ביותר + הכבד ביותר + הקל ביותר + הוסף ל-Cryptomator + צור כספת חדשה + הוסף כספת קיימת + מחק + ליצירת כספת חדשה לחץ כאן + הסיסמה שונתה בהצלחה כספת + בחר קובץ masterkey + שם כספת: %1$s + שנה מיקום + תיקיה ריקה + שונה לפני %1$s + שתף באמצעות + בחר מיקום חדש + בחר + קבצים + שתף + שנה שם + ערוך + ייצא + מחק + פתח באמצעות… + בחר פריטים + %1$d נבחר + בחר + בחר הכל + רענן + אין חיבור לרשת + נסה שוב + נשמר בהצלחה + שמור את %1$s… + טקסט + קובץ + קבצים + מיקום שמירה + שמור + הצפנה הושלמה + שירותי אחסון בענן + בחר מיקום + כתובת URL + שם משתמש + סיסמה + התחבר + יש להזין כתובת URL. + כתובת ה-URL אינה חוקית. + יש להזין שם משתמש. + יש להזין סיסמה. + יש להזין שם כספת. + שם כספת + צור + הגדר סיסמה סיום + חלשה + סבירה + חזקה + חזקה מאוד + שירותי אחסון בענן + אימות ביומטרי + הפעל אימות ביומטרי + חיפוש + הפעל + לאתר Cryptomator + עקבו אחרינו ב-Twitter + תנו לנו לייק ב-Facebook + היבטים משפטיים + רישיונות + תמיכה + בקש תמיכה + מצב ניפוי תקלות + שלח יומן אירועים + השליחה נכשלה + גרסה + הגדרות מתקדמות + חיבורי WebDAV + חיבורי pCloud + חיבורי S3 + התחבר אל + התנתק מ + האימות אל \'%1$s\' נכשל. + עדכן את פרטי ההתחברות אל pCloud ביטול בטל נעילה + סיסמה ישנה + סיסמה חדשה + שנה סיסמה + יש להזין סיסמה ישנה. + יש להזין סיסמה חדשה. + הכספת %1$s לא נמצאה + מחק + הקובץ כבר קיים + החלף + כבר קיים קובץ בשם %1$s. + החלף הכל + החלף + להחליף את הקובץ? + להחליף את הקבצים? + אישור + צור כספת חדשה + הקובץ %1$s לא נתמך + שנה שם כספת + שנה שם תיקיה + שינוי שם קובץ + יש לך שינויים שלא נשמרו + אתה בטוח שברצנוך לצאת מבלי לשמור את השינויים שביצעת? + ביטול + text.txt + אתה בטוח שברצונך למחוק כספת זו? + שולח… + קובץ %1$d מתוך %2$d + מיצא (%2$d/%1$d) + אנא המתן… + יוצר תיקייה… + יוצר קובץ טקסט… + אימות… + משנה שם… + מוחק… + פותח כספת… + משנה סיסמה… + יוצר כספת… + שולח… + מוריד… + מצפין… + מפענח… + מעביר… נעילה + תעודת SSL לא חוקית + תעודת SSL לא חוקית. תרצה לבטוח בתעודה זו בכל מקרה? + פרטים + עבור ל-HTTPS + להשתמש ב-HTTPS? + שים לב + שים לב + אפליקציה אחרת מציגה משהו מעל Cryptomator (לדוגמה, אפליקציית סינון אור כחול למצב לילה). מטעמי אבטחה, Cryptomator ייסגר עכשיו.\n\nאיך להפעיל את Cryptomator סגור + למחוק %1$d פריטים? + אתה בטוח שברצונך למחוק קבצים אלו? + אתה בטוח שברצונך למחוק קובץ זה? + אתה בטוח שברצונך למחוק תיקייה זו? הפעולה תמחק גם את כל הקבצים שנמצאים בתוך התיקייה. + האימות הביומטרי בוטל + שימוש במפתח רישיון + זיהינו שהתקנת את Cryptomator לא דרך ה-Google Play Store. להפעלת האפליקציה, יש להכניס מפתח רישיון. ניתן לרכוש מפתח ב-https://cryptomator.org/android/ + המפתח לא אומת. וודא כי הזנת אותו כהלכה. + לא הוזן מפתח, אנא הזן מפתח רישיון תקין. + יציאה + מפתח הרישיון אומת + תודה %1$s, על כך שהזנת מפתח רישיון תקין. + עדכן עכשיו + מאוחר יותר + מוריד + מוריד את הגרסה העדכנית ביותר של Cryptomator חזור + bytes + kB + MB + GB + TB + שנייה + שניות + דקה + דקות + שעה + שעות + יום + ימים + שבוע + שבועות + חודש + חודש + שנה + שנים + אימות ביומטרי + התחבר באמצעות אימות ביומטרי + כספות פתוחות: %1$d + נעילה אוטומטית בעוד %1$s + נעל הכל + מעלה %1d/%2d + מטמון + נפח מטמון + נקה מטמון + רשום עבור + %1$s + מיידי + דקה + 2 דקות + 5 דקות + 10 דקות + אף פעם + 50 MB + 100 MB + 250 MB + 500 MB + 1 GB + 5 GB + עיצוב + אוטומטי (לפי מערכת הפעלה) + בהיר + כהה + פעם ביום + פעם בשבוע + פעם בחודש diff --git a/presentation/src/main/res/values-ja-rJP/strings.xml b/presentation/src/main/res/values-ja-rJP/strings.xml index f4c66fafc..94a15db9d 100644 --- a/presentation/src/main/res/values-ja-rJP/strings.xml +++ b/presentation/src/main/res/values-ja-rJP/strings.xml @@ -40,6 +40,7 @@ ファイルをエクスポートするには、Cryptomator がストレージにアクセスする許可が必要です ファイルをアップロードするには、Cryptomator がストレージにアクセスする許可が必要です ファイルを共有するには、Cryptomator がストレージにアクセスする許可が必要です + Cryptomator がこの場所にアクセスする権限がなくなりました。このフォルダーを再度選択して権限を再度取得してください。 設定 検索 戻る @@ -188,6 +189,7 @@ セキュリティのヒント バージョン 高度な設定 + 解錠 パスワードまたは生体による認証中に、バックグラウンドで金庫の設定をダウンロードします 解錠したままにする ファイルの編集中は金庫を解錠しておく @@ -313,6 +315,7 @@ ディレクトリのコンテンツを読み込むことができません 表示する画像がありません… \'%1$s\' の資格情報が更新されました + pCloud アカウントを追加するには、次のリンクをクリックしてください www.pcloud.com。現在のアカウントからログアウトし、このアプリの「+」を再度クリックして、新しいクラウド接続を作成してください。 ローカルの金庫を使用するには、Cryptomator がストレージにアクセスする許可が必要です 自動的に画像をアップロードするには、Cryptomator がストレージにアクセスする許可が必要です @@ -355,7 +358,9 @@ %1$d 個の画像を金庫にアップロードしました 写真の自動アップロードが失敗しました アップロード中にエラーが発生しました。 + アップロード用として選択されたフォルダーを利用できません。設定に移動して新しいフォルダーを選択してください。 アップロード中は金庫が施錠されます。続けるには金庫を再度開いてください。 + 自動アップロードに設定された金庫が存在しません。 書き込み可能なファイルを開く 編集が完了するまで金庫は施錠されます 最新バージョンがインストールされました diff --git a/presentation/src/main/res/values-nb-rNO/strings.xml b/presentation/src/main/res/values-nb-rNO/strings.xml index d1342c6ff..358be81a8 100644 --- a/presentation/src/main/res/values-nb-rNO/strings.xml +++ b/presentation/src/main/res/values-nb-rNO/strings.xml @@ -22,11 +22,18 @@ Filnavn kan ikke inneholde spesialtegn. Navn på hvelvet kan ikke inneholde spesialtegn. Oppdateringskontrollen mislyktes. Det oppstod en generell feil. + Oppdateringskontrollen mislyktes. Den beregnede hash-koden stemmer ikke med den opplastede filen + Biometrisk autentisering avbrutt + Egendefinert posisjon for Masterkey er foreløpig ikke støttet Lokal lagring + Cryptomator trenger lagringstilgang for å eksportere filer + Cryptomator trenger lagringstilgang for å laste opp filer + Cryptomator trenger lagringstilgang for å dele filer + Cryptomator har mistet tilgangen til denne plasseringen. Velg mappen på nytt for å gjenopprette tillatelsen. Innstillinger Søk Forrige @@ -68,6 +75,7 @@ Eksporter Slett Åpne med… + Velg elementer %1$d valgt Velg alle Oppdater @@ -80,7 +88,9 @@ tekst fil filer + Filnavnene må være unike, velg nye navn på duplikatene. Lagre + Kryptering fullført Skylagringstjeneste @@ -88,12 +98,21 @@ URL Brukernavn Passord + URL-adressen kan ikke være tomt. + Brukernavnet kan ikke være tomt. + Passordet kan ikke være tomt. + Visningsnavn + Visningsnavn kan ikke være tomt + Tilgangsnøkkel kan ikke være tom + Hemmelig nøkkel kan ikke være tom + Navnet på hvelvet kan ikke være tomt. Hvelvnavn Opprett Angi passord + Passordene stemmer ikke overens. Ferdig Gjenta passordet Svakt @@ -103,6 +122,9 @@ Generelt Skylagringstjenester + Biometrisk autentisering + Aktiver biometrisk autentisering + Bekreft ansiktsopplåsing (hvis tilgjengelig) Søk Lås etter Aktiver diff --git a/presentation/src/main/res/values-pt-rBR/strings.xml b/presentation/src/main/res/values-pt-rBR/strings.xml index 0e1818565..6678a2dff 100644 --- a/presentation/src/main/res/values-pt-rBR/strings.xml +++ b/presentation/src/main/res/values-pt-rBR/strings.xml @@ -41,6 +41,7 @@ Cryptomator precisa de permissão de acesso ao armazenamento para exportar arquivos Cryptomator precisa de permissão de acesso ao armazenamento para fazer upload de arquivos Cryptomator precisa de permissão de acesso ao armazenamento para compartilhar arquivos + O Cryptomator perdeu a permissão para acessar este local. Por favor, selecione esta pasta novamente para restaurar sua permissão. Configurações Buscar Anterior @@ -288,6 +289,10 @@ O aplicativo está escuro Outro aplicativo está exibindo algo no topo do Cryptomator (por exemplo, um filtro de luz azul ou aplicativo de modo noturno). Por razões de segurança, o Cryptomator está desativado.\n\nComo ativar o Cryptomator Fechar + Por favor, readicione cofres para %1s nuvem + Durante a migração para esta versão do aplicativo, precisamos remover os seguintes cofres do aplicativo:\n%2s \n\nEsses cofres não são removidos da nuvem, mas apenas deste aplicativo. Desculpe o incômodo e por favor adicione novamente estes cofres para continuar a trabalhar com eles. + O cofre é a pasta raiz da conexão com a nuvem + Crie uma nova conexão com a nuvem onde você seleciona pelo menos a pasta principal desta pasta de cofre como o diretório raiz para adicionar este cofre. Esta configuração é um recurso de segurança e impede que outros aplicativos induzam os usuários a fazer coisas que não devem fazer.\n\nAo desativar, você confirma que está ciente dos riscos. Tem certeza de que deseja remover esta conexão com a nuvem? Esta ação removerá a conexão com o provedor de nuvem e todos os cofres desta nuvem. diff --git a/presentation/src/main/res/values-sk-rSK/strings.xml b/presentation/src/main/res/values-sk-rSK/strings.xml index 5220bfdf9..66c3ba80a 100644 --- a/presentation/src/main/res/values-sk-rSK/strings.xml +++ b/presentation/src/main/res/values-sk-rSK/strings.xml @@ -3,7 +3,7 @@ Zašifrovať - Vyskytol sa problém + Vyskytla sa chyba Neúspešná autentikácia Neúspešná autentikácia, prosím prihláste sa pomocou %1$s Chýba sieťové pripojenie @@ -16,11 +16,11 @@ Cloud už existuje. Prosím stiahnite takú aplikáciu ktorá dokáže otvoriť tento súbor. Server nenájdený. - Prosím otvorte nastavenia zaridenia a nastavte uzamykanie obrazovky ručne + Prosím otvorte nastavenia zariadenia a nastavte uzamykanie obrazovky ručne Export neúspešný. Pokúste sa odstrániť špeciálne znaky z názvov súborov a exportujte znovu. Nemôže obsahovať špeciálne znaky. - Názvy súborov nesmú obsahovať špecálne znaky. - Meno trezoru nemôže obsahovať špecálne znaky. + Názvy súborov nesmú obsahovať špeciálne znaky. + Meno trezoru nemôže obsahovať špeciálne znaky. Kontrola aktualizácie zlyhala. Vyskytol sa problém. Kontrola aktualizácie zlyhala. Vypočítaný hash nekorešponduje s nahratým súborom Kontrola aktualizácie zlyhala. Neexistuje spojenie s internetom. @@ -31,7 +31,7 @@ %1$s nezodpovedá s týmto %2$s Chyba počas zavádzania konfigurácie trezora Lokálny súbor nie je viac prezentovaný po prepnutí naspäť do Cryptomator-a. Možné zmeny sa neprenesú späť do cloudu. - Žiadna taká nádoba + Bucket neexistuje Voliteľnost umiestnenia hlavného kľúča zatiaľ nie je podporovaná @@ -59,7 +59,7 @@ Vytvoriť nový trezor Pridať existujúci trezor Odstrániť - Sem kliknúť pre vytvorenie nového trezoru + Kliknite sem pre vytvorenie nového trezora Heslo úspešne zmenené Trezor @@ -132,13 +132,13 @@ Zobrazované meno Prístupový kľúč Tajný kľúč - Existujúce vedro + Existujúci bucket Koncový bod Región Zobrazované meno nemôže byť prázdne Prístupový kľúč nemôže byť prázdny Tajný kľúč nesmie byť prázdny - Vedro nemôže byť prázdne + Bucket nemôže byť prázdny Koncový bod alebo región nemôže byť prázdny Meno trezora nemôže byť prázdne. @@ -163,8 +163,8 @@ Potvrďte odomykanie tvárou (ak je dostupné) Blokovanie aplikácie pri zatemnení Blokovanie zachytávania vstupu a zobrazovania falošného uživateľského rozhrania - Blokovanie snímkov obrazovky - Blokovanie snímkov obrazovky v nedávnom zozname a vo vnútri aplikácie + Blokovanie vytvorenia snímkov obrazovky + Zakázať vytváranie snímkov obrazovky v tejto aplikácii a v zozname bežiacich aplikácií Hľadať Živé vyhľadávanie Aktualizovať výsledky hľadania počas zadávania otázky @@ -292,7 +292,7 @@ Ďalšia aplikácia zobrazuje niečo na vrchu Cryptomator-a (ako napr. modré svetlo alebo nočný režim). Z bezpečnostných dôvodov je Cryptomator zakázaný.\n\nAko povoliť Cryptomator Zavrieť Prosím zadajte znovu trezory pre %1s cloud - Počas migrácie na túto verziu aplikácie potrebujeme odstrániť nasledujúce trezory z aplikácie:\n%2s \n\n Tieto trezory nebudú odstránené z clodu ale len z tejto aplikácie. Prepáčte za nepohodlie a prosím znovu zadajte trezory pre pokračovanie ich používania. + Počas migrácie na túto verziu aplikácie potrebujeme odstrániť nasledujúce trezory z aplikácie:\n%2s \n\n Tieto trezory nebudú odstránené z cloudu, ale len z tejto aplikácie. Prepáčte za nepohodlie a prosím znovu zadajte trezory pre pokračovanie ich používania. Trezor je koreňovým adresárom cloudového spojenia Vytvorte nové cloudové pripojenie kde vyberiete minimálne nadradený adresár tohto trezora ako koreňový adresár pre pridanie tohot trezora. Toto nastavenie je bezpečnostná vlastnosť a zabraňuje ostatným aplikáciám klamať užívateľov robiť veci čo nechcú robiť.\n\nVypnutím súhlasíte s tým žeste si vedomí rizika. @@ -304,11 +304,11 @@ Toto zmaže obsah celého adresára. Ste si istý že chcete zmazať tento adresár? Funkcia biometrickej autentikácie je deaktivovaná Pretože kľúč bol zneplatnený, funkcia biometrickej autentikácie bola deaktivovaná. Pre opätovné povolenie, otvorte nastavenia Cryptomator-a. - Poskytnite platnú licenciu + Zadajte platný licenčný kľúč Detekovali sme že máte nainštalovaný Cryptomator bez použitia Google Play Store. Poskytnite platnú licenciu, ktorá bola zakúpená v https://cryptomator.org/android/ Poskytnutá licencia nie je platná. Uistite sa či bola zadaná korektne. Licencia neposkytnutá. Prosím zadajte platnú licenciu. - Výstup + Ukončiť Potvrdenie licencie Ďakujeme %1$s za poskytnutie Vašej platnej licencie. Aktualizácia k dispozícii diff --git a/presentation/src/main/res/values-tr-rTR/strings.xml b/presentation/src/main/res/values-tr-rTR/strings.xml index d6d099f45..ef4c48c22 100644 --- a/presentation/src/main/res/values-tr-rTR/strings.xml +++ b/presentation/src/main/res/values-tr-rTR/strings.xml @@ -4,10 +4,10 @@ Şifrele Bir hata oluştu - Kullanıcı adı veya şifre yanlış + Kimlik doğrulaması başarısız oldu Kimlik doğrulama başarısız, lütfen %1$s kullanarak giriş yapınız Ağ bağlantısı yok - Şifre yanlış + Şifre hatalı Dosya veya klasör zaten var. Kasa Desteklenmiyor. Bu kasa, Cryptomator\'un başka bir sürümüyle oluşturuldu. Kasa zaten var. diff --git a/presentation/src/main/res/values-zh-rHK/strings.xml b/presentation/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..0c5cc3282 --- /dev/null +++ b/presentation/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7704ab5b872fd84baf07689642447cc0fdd5d4d2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 24 Jan 2022 11:48:37 +0100 Subject: [PATCH 05/35] Update msgraph-sdk version to 5.12.0 (#405) * Update API level level to 26 * Support multi OneDrive accounts * Migrate to the new authentication library --- .gitmodules | 3 - .idea/vcs.xml | 3 +- buildsystem/dependencies.gradle | 19 +- data/build.gradle | 5 +- .../data/db/UpgradeDatabaseTest.kt | 39 ++ .../onedrive/MSAAuthAndroidAdapterImpl.java | 25 - .../cloud/onedrive/OnedriveClientFactory.kt | 93 ++- .../OnedriveCloudContentRepository.kt | 18 +- ...OnedriveCloudContentRepositoryFactory.java | 12 +- .../onedrive/OnedriveCloudNodeFactory.kt | 29 +- .../cloud/onedrive/OnedriveHttpProvider.java | 575 ------------------ .../data/cloud/onedrive/OnedriveImpl.kt | 254 +++----- .../cloud/onedrive/graph/ClientException.java | 29 - .../graph/IAuthenticationAdapter.java | 40 -- .../data/cloud/onedrive/graph/ICallback.java | 45 -- .../onedrive/graph/IProgressCallback.java | 39 -- .../onedrive/graph/MSAAuthAndroidAdapter.java | 275 --------- .../graph/MicrosoftOAuth2Endpoint.java | 44 -- .../cloud/onedrive/graph/SimpleWaiter.java | 65 -- .../cryptomator/data/db/DatabaseUpgrades.java | 17 +- .../org/cryptomator/data/db/Upgrade10To11.kt | 25 + .../org/cryptomator/domain/OnedriveCloud.java | 6 +- lib/msa-auth-for-android | 1 - presentation/build.gradle | 16 +- presentation/prebuild.gradle | 36 ++ .../presenter/AuthenticateCloudPresenter.kt | 128 +++- presentation/src/main/AndroidManifest.xml | 11 + .../presentation/model/CloudTypeModel.kt | 1 + .../presentation/model/OnedriveCloudModel.kt | 4 + .../presenter/CloudConnectionListPresenter.kt | 145 +++-- .../presenter/CloudSettingsPresenter.kt | 9 + .../ui/adapter/CloudConnectionListAdapter.kt | 10 + .../ui/adapter/CloudSettingsAdapter.kt | 1 + .../CloudConnectionSettingsBottomSheet.kt | 7 + .../dialog/PCloudCredentialsUpdatedDialog.kt | 2 +- presentation/src/main/res/raw/.gitignore | 1 + presentation/src/main/res/values/strings.xml | 1 + .../presenter/AuthenticateCloudPresenter.kt | 123 +++- settings.gradle | 3 +- 39 files changed, 665 insertions(+), 1494 deletions(-) delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/MSAAuthAndroidAdapterImpl.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveHttpProvider.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ClientException.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IAuthenticationAdapter.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ICallback.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IProgressCallback.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MicrosoftOAuth2Endpoint.java delete mode 100644 data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/SimpleWaiter.java create mode 100644 data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt delete mode 160000 lib/msa-auth-for-android create mode 100644 presentation/prebuild.gradle create mode 100644 presentation/src/main/res/raw/.gitignore diff --git a/.gitmodules b/.gitmodules index f3a2516ea..4f05b3345 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "msa-auth-for-android"] - path = lib/msa-auth-for-android - url = https://github.com/SailReal/msa-auth-for-android.git [submodule "subsampling-scale-image-view"] path = lib/subsampling-scale-image-view url = https://github.com/SailReal/subsampling-scale-image-view.git diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 65b6cf640..a51d7b336 100755 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,8 +2,7 @@ - - + \ No newline at end of file diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index a2915e488..a12e59f02 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -2,12 +2,25 @@ allprojects { repositories { mavenCentral() maven { url 'https://jitpack.io' } + // needed for 'com.microsoft.device.display' required by 'com.microsoft.graph:microsoft-graph' + exclusiveContent { + forRepository { + maven { + url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1' + name 'Duo-SDK-Feed' + } + } + filter { + // this repository *only* contains artifacts with group "com.microsoft.device.display" + includeGroup "com.microsoft.device.display" + } + } } } ext { androidBuildToolsVersion = "30.0.2" - androidMinSdkVersion = 24 + androidMinSdkVersion = 26 androidTargetSdkVersion = 30 androidCompileSdkVersion = 30 @@ -63,7 +76,8 @@ ext { */ trackingFreeGoogleCLientVersion = '1.41.1' - msgraphVersion = '2.10.0' + msgraphVersion = '5.12.0' + msgraphAuthVersion = '2.2.3' minIoVersion = '8.3.5' staxVersion = '1.2.0' // needed for minIO @@ -139,6 +153,7 @@ ext { mockitoInline : "org.mockito:mockito-inline:${mockitoVersion}", mockitoKotlin : "org.mockito.kotlin:mockito-kotlin:${mockitoKotlinVersion}", msgraph : "com.microsoft.graph:microsoft-graph:${msgraphVersion}", + msgraphAuth : "com.microsoft.identity.client:msal:${msgraphAuthVersion}", multidex : "androidx.multidex:multidex:${multidexVersion}", okHttp : "com.squareup.okhttp3:okhttp:${okHttpVersion}", okHttpDigest : "io.github.rburgst:okhttp-digest:${okHttpDigestVersion}", diff --git a/data/build.gradle b/data/build.gradle index 4d2111a27..d401ab6aa 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -78,11 +78,12 @@ android { packagingOptions { exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/NOTICE.md' } } greendao { - schemaVersion 10 + schemaVersion 11 } configurations.all { @@ -95,7 +96,6 @@ dependencies { implementation project(':domain') implementation project(':util') - implementation project(':msa-auth-for-android') implementation project(':pcloud-sdk-java') coreLibraryDesugaring dependencies.coreDesugaring @@ -115,6 +115,7 @@ dependencies { // cloud implementation dependencies.dropbox + implementation dependencies.msgraphAuth implementation dependencies.msgraph implementation dependencies.stax diff --git a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt index 1e0ad4c0a..a2c19c7fd 100644 --- a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt +++ b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt @@ -51,6 +51,7 @@ class UpgradeDatabaseTest { Upgrade7To8().applyTo(db, 7) Upgrade8To9(sharedPreferencesHandler).applyTo(db, 8) Upgrade9To10(sharedPreferencesHandler).applyTo(db, 9) + Upgrade10To11().applyTo(db, 10) CloudEntityDao(DaoConfig(db, CloudEntityDao::class.java)).loadAll() VaultEntityDao(DaoConfig(db, VaultEntityDao::class.java)).loadAll() @@ -470,4 +471,42 @@ class UpgradeDatabaseTest { Assert.assertThat(sharedPreferencesHandler.vaultsRemovedDuringMigration(), CoreMatchers.`is`(Pair("LOCAL", arrayListOf("pathOfVault26")))) } + @Test + fun upgrade10To11() { + Upgrade0To1().applyTo(db, 0) + Upgrade1To2().applyTo(db, 1) + Upgrade2To3(context).applyTo(db, 2) + Upgrade3To4().applyTo(db, 3) + Upgrade4To5().applyTo(db, 4) + Upgrade5To6().applyTo(db, 5) + Upgrade6To7().applyTo(db, 6) + Upgrade7To8().applyTo(db, 7) + Upgrade8To9(sharedPreferencesHandler).applyTo(db, 8) + Upgrade9To10(sharedPreferencesHandler).applyTo(db, 9) + + Sql.insertInto("VAULT_ENTITY") // + .integer("_id", 25) // + .integer("FOLDER_CLOUD_ID", 3) // + .text("FOLDER_PATH", "path") // + .text("FOLDER_NAME", "name") // + .text("CLOUD_TYPE", CloudType.ONEDRIVE.name) // + .text("PASSWORD", "password") // + .integer("POSITION", 10) // + .executeOn(db) + + Sql.query("CLOUD_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(3)) + } + + Upgrade10To11().applyTo(db, 10) + + Sql.query("VAULT_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(1)) + } + + Sql.query("CLOUD_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(2)) + } + } + } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/MSAAuthAndroidAdapterImpl.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/MSAAuthAndroidAdapterImpl.java deleted file mode 100644 index 1cf2556cf..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/MSAAuthAndroidAdapterImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.cryptomator.data.cloud.onedrive; - -import android.content.Context; - -import org.cryptomator.data.BuildConfig; -import org.cryptomator.data.cloud.onedrive.graph.MSAAuthAndroidAdapter; - -public class MSAAuthAndroidAdapterImpl extends MSAAuthAndroidAdapter { - - private static final String[] SCOPES = new String[] {"https://graph.microsoft.com/Files.ReadWrite", "offline_access", "openid"}; - - public MSAAuthAndroidAdapterImpl(Context context, String refreshToken) { - super(context, refreshToken); - } - - @Override - public String getClientId() { - return BuildConfig.ONEDRIVE_API_KEY; - } - - @Override - public String[] getScopes() { - return SCOPES; - } -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt index 272071b5c..27ac7cf5d 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt @@ -1,68 +1,59 @@ package org.cryptomator.data.cloud.onedrive import android.content.Context -import com.microsoft.graph.authentication.IAuthenticationProvider -import com.microsoft.graph.core.DefaultClientConfig -import com.microsoft.graph.models.extensions.IGraphServiceClient -import com.microsoft.graph.requests.extensions.GraphServiceClient -import org.cryptomator.data.cloud.okhttplogging.HttpLoggingInterceptor -import org.cryptomator.data.cloud.onedrive.graph.MSAAuthAndroidAdapter -import org.cryptomator.data.util.NetworkTimeout -import okhttp3.Interceptor -import okhttp3.OkHttpClient +import com.microsoft.graph.authentication.BaseAuthenticationProvider +import com.microsoft.graph.logger.ILogger +import com.microsoft.graph.logger.LoggerLevel +import com.microsoft.graph.requests.GraphServiceClient +import org.cryptomator.util.SharedPreferencesHandler +import org.cryptomator.util.crypto.CredentialCryptor +import java.net.URL +import java.util.concurrent.CompletableFuture +import okhttp3.Request import timber.log.Timber + class OnedriveClientFactory private constructor() { companion object { - @Volatile - private var instance: IGraphServiceClient? = null - - @Volatile - private var authenticationAdapter: MSAAuthAndroidAdapter? = null - - @Synchronized - fun getInstance(context: Context, refreshToken: String?): IGraphServiceClient = instance ?: createClient(context, refreshToken).also { instance = it } - - @Synchronized - fun getAuthAdapter(context: Context, refreshToken: String?): MSAAuthAndroidAdapter = authenticationAdapter ?: MSAAuthAndroidAdapterImpl(context, refreshToken).also { authenticationAdapter = it } - - private fun createClient(context: Context, refreshToken: String?): IGraphServiceClient { - val builder = OkHttpClient() // - .newBuilder() // - .connectTimeout(NetworkTimeout.CONNECTION.timeout, NetworkTimeout.CONNECTION.unit) // - .readTimeout(NetworkTimeout.READ.timeout, NetworkTimeout.READ.unit) // - .writeTimeout(NetworkTimeout.WRITE.timeout, NetworkTimeout.WRITE.unit) // - .addInterceptor(httpLoggingInterceptor(context)) - - val onedriveHttpProvider = OnedriveHttpProvider(object : DefaultClientConfig() { - override fun getAuthenticationProvider(): IAuthenticationProvider { - return getAuthAdapter(context, refreshToken) + fun createInstance(context: Context, token: String?, sharedPreferencesHandler: SharedPreferencesHandler): GraphServiceClient { + val tokenAuthenticationProvider = object : BaseAuthenticationProvider() { + override fun getAuthorizationTokenAsync(requestUrl: URL): CompletableFuture { + return if (shouldAuthenticateRequestWithUrl(requestUrl)) { + val decryptedToken = CredentialCryptor.getInstance(context).decrypt(token) + CompletableFuture.completedFuture(decryptedToken) + } else { + CompletableFuture.completedFuture(null) + } } - }, builder.build()) + } return GraphServiceClient // .builder() // - .authenticationProvider(authenticationAdapter) // - .httpProvider(onedriveHttpProvider) // + .authenticationProvider(tokenAuthenticationProvider) // + .logger(object : ILogger { + override fun getLoggingLevel(): LoggerLevel { + return if(sharedPreferencesHandler.debugMode()) { + LoggerLevel.DEBUG + } else { + LoggerLevel.ERROR + } + } + + override fun logDebug(message: String) { + Timber.tag("OnedriveClientFactory").d(message) + } + + override fun logError(message: String, throwable: Throwable?) { + Timber.tag("OnedriveClientFactory").e(throwable, message) + } + + override fun setLoggingLevel(level: LoggerLevel) { + TODO("Not yet implemented") // FIXME + } + }) .buildClient() } - - - private fun httpLoggingInterceptor(context: Context): Interceptor { - val logger = object : HttpLoggingInterceptor.Logger { - override fun log(message: String) { - Timber.tag("OkHttp").d(message) - } - } - - return HttpLoggingInterceptor(logger, context) - } - - @Synchronized - fun logout() { - instance = null - } } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt index 6db19a322..4c91ad332 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt @@ -2,8 +2,10 @@ package org.cryptomator.data.cloud.onedrive import android.content.Context import com.microsoft.graph.core.GraphErrorCodes +import com.microsoft.graph.http.GraphServiceException +import com.microsoft.graph.requests.GraphServiceClient +import com.microsoft.identity.common.exception.ClientException import org.cryptomator.data.cloud.InterceptingCloudContentRepository -import org.cryptomator.data.cloud.onedrive.graph.ClientException import org.cryptomator.domain.OnedriveCloud import org.cryptomator.domain.exception.BackendException import org.cryptomator.domain.exception.FatalBackendException @@ -20,8 +22,10 @@ import java.io.File import java.io.IOException import java.io.OutputStream import java.net.SocketTimeoutException +import okhttp3.Request -internal class OnedriveCloudContentRepository(private val cloud: OnedriveCloud, context: Context) : InterceptingCloudContentRepository(Intercepted(cloud, context)) { +internal class OnedriveCloudContentRepository(private val cloud: OnedriveCloud, context: Context, graphServiceClient: GraphServiceClient) + : InterceptingCloudContentRepository(Intercepted(cloud, context, graphServiceClient)) { @Throws(BackendException::class) override fun throwWrappedIfRequired(e: Exception) { @@ -38,19 +42,21 @@ internal class OnedriveCloudContentRepository(private val cloud: OnedriveCloud, private fun throwWrongCredentialsExceptionIfRequired(e: Exception) { if (isAuthenticationError(e)) { + logout(cloud) throw WrongCredentialsException(cloud) } } private fun isAuthenticationError(e: Throwable?): Boolean { return (e != null // - && (e is ClientException && e.errorCode() == GraphErrorCodes.AUTHENTICATION_FAILURE // + && (e is ClientException && e.errorCode == GraphErrorCodes.AUTHENTICATION_FAILURE.name // + || e is GraphServiceException && e.serviceError?.code?.equals("InvalidAuthenticationToken") == true || isAuthenticationError(e.cause))) } - private class Intercepted(cloud: OnedriveCloud, context: Context) : CloudContentRepository { + private class Intercepted(cloud: OnedriveCloud, context: Context, graphServiceClient: GraphServiceClient) : CloudContentRepository { - private val oneDriveImpl: OnedriveImpl = OnedriveImpl(cloud, context, OnedriveIdCache()) + private val oneDriveImpl: OnedriveImpl = OnedriveImpl(cloud, context, graphServiceClient, OnedriveIdCache()) override fun root(cloud: OnedriveCloud): OnedriveFolder { return oneDriveImpl.root() @@ -141,7 +147,7 @@ internal class OnedriveCloudContentRepository(private val cloud: OnedriveCloud, @Throws(BackendException::class) override fun checkAuthenticationAndRetrieveCurrentAccount(cloud: OnedriveCloud): String { - return oneDriveImpl.currentAccount() + return oneDriveImpl.currentAccount(cloud.username()) } override fun logout(cloud: OnedriveCloud) { diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java index 243f80390..badaf5e30 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java @@ -1,25 +1,28 @@ package org.cryptomator.data.cloud.onedrive; +import static org.cryptomator.domain.CloudType.ONEDRIVE; + import android.content.Context; import org.cryptomator.data.repository.CloudContentRepositoryFactory; import org.cryptomator.domain.Cloud; import org.cryptomator.domain.OnedriveCloud; import org.cryptomator.domain.repository.CloudContentRepository; +import org.cryptomator.util.SharedPreferencesHandler; import javax.inject.Inject; import javax.inject.Singleton; -import static org.cryptomator.domain.CloudType.ONEDRIVE; - @Singleton public class OnedriveCloudContentRepositoryFactory implements CloudContentRepositoryFactory { private final Context context; + private final SharedPreferencesHandler sharedPreferencesHandler; @Inject - public OnedriveCloudContentRepositoryFactory(Context context) { + public OnedriveCloudContentRepositoryFactory(Context context, SharedPreferencesHandler sharedPreferencesHandler) { this.context = context; + this.sharedPreferencesHandler = sharedPreferencesHandler; } @Override @@ -29,6 +32,7 @@ public boolean supports(Cloud cloud) { @Override public CloudContentRepository cloudContentRepositoryFor(Cloud cloud) { - return new OnedriveCloudContentRepository((OnedriveCloud) cloud, context); + OnedriveCloud onedriveCloud = (OnedriveCloud) cloud; + return new OnedriveCloudContentRepository(onedriveCloud, context, OnedriveClientFactory.Companion.createInstance(context, onedriveCloud.accessToken(), sharedPreferencesHandler)); } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt index 85aa7b455..3d0036ee9 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt @@ -1,6 +1,7 @@ package org.cryptomator.data.cloud.onedrive -import com.microsoft.graph.models.extensions.DriveItem +import com.microsoft.graph.models.DriveItem +import org.cryptomator.domain.exception.FatalBackendException import java.util.Date internal object OnedriveCloudNodeFactory { @@ -15,11 +16,15 @@ internal object OnedriveCloudNodeFactory { } private fun file(parent: OnedriveFolder, item: DriveItem): OnedriveFile { - return OnedriveFile(parent, item.name, getNodePath(parent, item.name), item.size, lastModified(item)) + item.name?.let { + return OnedriveFile(parent, it, getNodePath(parent, it), item.size, lastModified(item)) + } ?: throw FatalBackendException("Item name shouldn't be null") } fun file(parent: OnedriveFolder, item: DriveItem, lastModified: Date?): OnedriveFile { - return OnedriveFile(parent, item.name, getNodePath(parent, item.name), item.size, lastModified) + item.name?.let { + return OnedriveFile(parent, it, getNodePath(parent, it), item.size, lastModified) + } ?: throw FatalBackendException("Item name shouldn't be null") } fun file(parent: OnedriveFolder, name: String, size: Long?): OnedriveFile { @@ -31,7 +36,9 @@ internal object OnedriveCloudNodeFactory { } fun folder(parent: OnedriveFolder, item: DriveItem): OnedriveFolder { - return OnedriveFolder(parent, item.name, getNodePath(parent, item.name)) + item.name?.let { + return OnedriveFolder(parent, it, getNodePath(parent, it)) + } ?: throw FatalBackendException("Item name shouldn't be null") } fun folder(parent: OnedriveFolder, name: String): OnedriveFolder { @@ -48,25 +55,27 @@ internal object OnedriveCloudNodeFactory { @JvmStatic fun getId(item: DriveItem): String { - return if (item.remoteItem != null) item.remoteItem.id - else item.id + return if (item.remoteItem != null) item.remoteItem?.id!! + else item.id!! } @JvmStatic fun getDriveId(item: DriveItem): String? { return when { - item.remoteItem != null -> item.remoteItem.parentReference.driveId - item.parentReference != null -> item.parentReference.driveId + item.remoteItem != null -> item.remoteItem?.parentReference?.driveId + item.parentReference != null -> item.parentReference?.driveId else -> null } } @JvmStatic fun isFolder(item: DriveItem): Boolean { - return item.folder != null || item.remoteItem != null && item.remoteItem.folder != null + return item.folder != null || item.remoteItem != null && item.remoteItem?.folder != null } private fun lastModified(item: DriveItem): Date? { - return item.lastModifiedDateTime?.time + return item.lastModifiedDateTime?.let { + return Date.from(it.toInstant()) + } } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveHttpProvider.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveHttpProvider.java deleted file mode 100644 index f3910ac03..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveHttpProvider.java +++ /dev/null @@ -1,575 +0,0 @@ -// ------------------------------------------------------------------------------ -// Copyright (c) 2015 Microsoft Corporation -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF WILDCARD_MIME_TYPE KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR WILDCARD_MIME_TYPE CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// ------------------------------------------------------------------------------ -package org.cryptomator.data.cloud.onedrive; - -import com.google.common.annotations.VisibleForTesting; -import com.microsoft.graph.authentication.IAuthenticationProvider; -import com.microsoft.graph.concurrency.ICallback; -import com.microsoft.graph.concurrency.IExecutors; -import com.microsoft.graph.concurrency.IProgressCallback; -import com.microsoft.graph.core.ClientException; -import com.microsoft.graph.core.Constants; -import com.microsoft.graph.core.DefaultConnectionConfig; -import com.microsoft.graph.core.IClientConfig; -import com.microsoft.graph.core.IConnectionConfig; -import com.microsoft.graph.http.GraphServiceException; -import com.microsoft.graph.http.HttpMethod; -import com.microsoft.graph.http.HttpResponseCode; -import com.microsoft.graph.http.HttpResponseHeadersHelper; -import com.microsoft.graph.http.IHttpProvider; -import com.microsoft.graph.http.IHttpRequest; -import com.microsoft.graph.http.IStatefulResponseHandler; -import com.microsoft.graph.httpcore.HttpClients; -import com.microsoft.graph.httpcore.ICoreAuthenticationProvider; -import com.microsoft.graph.httpcore.middlewareoption.RedirectOptions; -import com.microsoft.graph.httpcore.middlewareoption.RetryOptions; -import com.microsoft.graph.logger.ILogger; -import com.microsoft.graph.logger.LoggerLevel; -import com.microsoft.graph.options.HeaderOption; -import com.microsoft.graph.serializer.ISerializer; - -import org.jetbrains.annotations.NotNull; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Scanner; -import java.util.concurrent.TimeUnit; - -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Protocol; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okio.BufferedSink; - -/** - * Http provider based off of URLConnection. - */ -public class OnedriveHttpProvider implements IHttpProvider { - - private final HttpResponseHeadersHelper responseHeadersHelper = new HttpResponseHeadersHelper(); - - /** - * The serializer - */ - private final ISerializer serializer; - - /** - * The authentication provider - */ - private final IAuthenticationProvider authenticationProvider; - - /** - * The executors - */ - private final IExecutors executors; - - /** - * The logger - */ - private final ILogger logger; - - /** - * The connection config - */ - private IConnectionConfig connectionConfig; - - /** - * The OkHttpClient that handles all requests - */ - private OkHttpClient corehttpClient; - - /** - * Creates the DefaultHttpProvider - * - * @param serializer the serializer - * @param authenticationProvider the authentication provider - * @param executors the executors - * @param logger the logger for diagnostic information - */ - public OnedriveHttpProvider(final ISerializer serializer, final IAuthenticationProvider authenticationProvider, final IExecutors executors, final ILogger logger) { - this.serializer = serializer; - this.authenticationProvider = authenticationProvider; - this.executors = executors; - this.logger = logger; - } - - /** - * Creates the DefaultHttpProvider - * - * @param clientConfig the client configuration to use for the provider - * @param httpClient the http client to execute the requests with - */ - public OnedriveHttpProvider(final IClientConfig clientConfig, final OkHttpClient httpClient) { - this(clientConfig.getSerializer(), clientConfig.getAuthenticationProvider(), clientConfig.getExecutors(), clientConfig.getLogger()); - this.corehttpClient = httpClient; - } - - /** - * Reads in a stream and converts it into a string - * - * @param input the response body stream - * @return the string result - */ - public static String streamToString(final InputStream input) { - final String httpStreamEncoding = "UTF-8"; - final String endOfFile = "\\A"; - final Scanner scanner = new Scanner(input, httpStreamEncoding); - String scannerString = ""; - try { - scanner.useDelimiter(endOfFile); - scannerString = scanner.next(); - } finally { - scanner.close(); - } - return scannerString; - } - - /** - * Searches for the given header in a list of HeaderOptions - * - * @param headers the list of headers to search through - * @param header the header name to search for (case insensitive) - * @return true if the header has already been set - */ - @VisibleForTesting - static boolean hasHeader(List headers, String header) { - for (HeaderOption option : headers) { - if (option.getName().equalsIgnoreCase(header)) { - return true; - } - } - return false; - } - - /** - * Gets the serializer for this HTTP provider - * - * @return the serializer for this provider - */ - @Override - public ISerializer getSerializer() { - return serializer; - } - - /** - * Sends the HTTP request asynchronously - * - * @param request the request description - * @param callback the callback to be called after success or failure - * @param resultClass the class of the response from the service - * @param serializable the object to send to the service in the body of the request - * @param the type of the response object - * @param the type of the object to send to the service in the body of the request - */ - @Override - public void send(final IHttpRequest request, final ICallback callback, final Class resultClass, final Body serializable) { - final IProgressCallback progressCallback; - if (callback instanceof IProgressCallback) { - progressCallback = (IProgressCallback) callback; - } else { - progressCallback = null; - } - - executors.performOnBackground(() -> { - try { - executors.performOnForeground(sendRequestInternal(request, resultClass, serializable, progressCallback, null), callback); - } catch (final ClientException e) { - executors.performOnForeground(e, callback); - } - }); - } - - /** - * Sends the HTTP request - * - * @param request the request description - * @param resultClass the class of the response from the service - * @param serializable the object to send to the service in the body of the request - * @param the type of the response object - * @param the type of the object to send to the service in the body of the request - * @return the result from the request - * @throws ClientException an exception occurs if the request was unable to complete for any reason - */ - @Override - public Result send(final IHttpRequest request, final Class resultClass, final Body serializable) throws ClientException { - return send(request, resultClass, serializable, null); - } - - /** - * Sends the HTTP request - * - * @param request the request description - * @param resultClass the class of the response from the service - * @param serializable the object to send to the service in the body of the request - * @param handler the handler for stateful response - * @param the type of the response object - * @param the type of the object to send to the service in the body of the request - * @param the response handler for stateful response - * @return the result from the request - * @throws ClientException this exception occurs if the request was unable to complete for any reason - */ - public Result send(final IHttpRequest request, final Class resultClass, final Body serializable, final IStatefulResponseHandler handler) throws ClientException { - return sendRequestInternal(request, resultClass, serializable, null, handler); - } - - /** - * Sends the HTTP request - * - * @param request the request description - * @param resultClass the class of the response from the service - * @param serializable the object to send to the service in the body of the request - * @param progress the progress callback for the request - * @param the type of the response object - * @param the type of the object to send to the service in the body of the request - * @return the result from the request - * @throws ClientException an exception occurs if the request was unable to complete for any reason - */ - public Request getHttpRequest(final IHttpRequest request, final Class resultClass, final Body serializable, final IProgressCallback progress) throws ClientException { - final int defaultBufferSize = 4096; - - final URL requestUrl = request.getRequestUrl(); - logger.logDebug("Starting to send request, URL " + requestUrl.toString()); - - if (this.connectionConfig == null) { - this.connectionConfig = new DefaultConnectionConfig(); - } - - // Request level middleware options - RedirectOptions redirectOptions = new RedirectOptions(request.getMaxRedirects() > 0 ? request.getMaxRedirects() : this.connectionConfig.getMaxRedirects(), request.getShouldRedirect() != null ? request.getShouldRedirect() : this.connectionConfig.getShouldRedirect()); - RetryOptions retryOptions = new RetryOptions(request.getShouldRetry() != null ? request.getShouldRetry() : this.connectionConfig.getShouldRetry(), request.getMaxRetries() > 0 ? request.getMaxRetries() : this.connectionConfig.getMaxRetries(), request.getDelay() > 0 ? request.getDelay() : this.connectionConfig.getDelay()); - - Request coreHttpRequest = convertIHttpRequestToOkHttpRequest(request); - Request.Builder corehttpRequestBuilder = coreHttpRequest.newBuilder().tag(RedirectOptions.class, redirectOptions).tag(RetryOptions.class, retryOptions); - - String contenttype = null; - - logger.logDebug("Request Method " + request.getHttpMethod().toString()); - List requestHeaders = request.getHeaders(); - - for (HeaderOption headerOption : requestHeaders) { - if (headerOption.getName().equalsIgnoreCase(Constants.CONTENT_TYPE_HEADER_NAME)) { - contenttype = headerOption.getValue().toString(); - break; - } - } - - final byte[] bytesToWrite; - corehttpRequestBuilder.addHeader("Accept", "*/*"); - if (serializable == null) { - // Send an empty body through with a POST request - // This ensures that the Content-Length header is properly set - if (request.getHttpMethod() == HttpMethod.POST) { - bytesToWrite = new byte[0]; - if (contenttype == null) { - contenttype = Constants.BINARY_CONTENT_TYPE; - } - } else { - bytesToWrite = null; - } - } else if (serializable instanceof byte[]) { - logger.logDebug("Sending byte[] as request body"); - bytesToWrite = (byte[]) serializable; - - // If the user hasn't specified a Content-Type for the request - if (!hasHeader(requestHeaders, Constants.CONTENT_TYPE_HEADER_NAME)) { - corehttpRequestBuilder.addHeader(Constants.CONTENT_TYPE_HEADER_NAME, Constants.BINARY_CONTENT_TYPE); - contenttype = Constants.BINARY_CONTENT_TYPE; - } - } else { - logger.logDebug("Sending " + serializable.getClass().getName() + " as request body"); - final String serializeObject = serializer.serializeObject(serializable); - try { - bytesToWrite = serializeObject.getBytes(Constants.JSON_ENCODING); - } catch (final UnsupportedEncodingException ex) { - final ClientException clientException = new ClientException("Unsupported encoding problem: ", ex); - logger.logError("Unsupported encoding problem: " + ex.getMessage(), ex); - throw clientException; - } - - // If the user hasn't specified a Content-Type for the request - if (!hasHeader(requestHeaders, Constants.CONTENT_TYPE_HEADER_NAME)) { - corehttpRequestBuilder.addHeader(Constants.CONTENT_TYPE_HEADER_NAME, Constants.JSON_CONTENT_TYPE); - contenttype = Constants.JSON_CONTENT_TYPE; - } - } - - RequestBody requestBody = null; - // Handle cases where we've got a body to process. - if (bytesToWrite != null) { - final String mediaContentType = contenttype; - requestBody = new RequestBody() { - @Override - public long contentLength() { - return bytesToWrite.length; - } - - @Override - public void writeTo(@NotNull BufferedSink sink) throws IOException { - OutputStream out = sink.outputStream(); - int writtenSoFar = 0; - BufferedOutputStream bos = new BufferedOutputStream(out); - int toWrite; - do { - toWrite = Math.min(defaultBufferSize, bytesToWrite.length - writtenSoFar); - bos.write(bytesToWrite, writtenSoFar, toWrite); - writtenSoFar = writtenSoFar + toWrite; - if (progress != null) { - executors.performOnForeground(writtenSoFar, bytesToWrite.length, progress); - } - } while (toWrite > 0); - bos.close(); - out.close(); - } - - @Override - public MediaType contentType() { - return MediaType.parse(mediaContentType); - } - }; - } - - corehttpRequestBuilder.method(request.getHttpMethod().toString(), requestBody); - return corehttpRequestBuilder.build(); - } - - /** - * Sends the HTTP request - * - * @param request the request description - * @param resultClass the class of the response from the service - * @param serializable the object to send to the service in the body of the request - * @param progress the progress callback for the request - * @param handler the handler for stateful response - * @param the type of the response object - * @param the type of the object to send to the service in the body of the request - * @param the response handler for stateful response - * @return the result from the request - * @throws ClientException an exception occurs if the request was unable to complete for any reason - */ - @SuppressWarnings("unchecked") - private Result sendRequestInternal(final IHttpRequest request, final Class resultClass, final Body serializable, final IProgressCallback progress, final IStatefulResponseHandler handler) throws ClientException { - - try { - if (this.connectionConfig == null) { - this.connectionConfig = new DefaultConnectionConfig(); - } - if (this.corehttpClient == null) { - final ICoreAuthenticationProvider authProvider = request1 -> request1; - this.corehttpClient = HttpClients.createDefault(authProvider).newBuilder().connectTimeout(connectionConfig.getConnectTimeout(), TimeUnit.MILLISECONDS).readTimeout(connectionConfig.getReadTimeout(), TimeUnit.MILLISECONDS).followRedirects(false) // TODO https://github.com/microsoftgraph/msgraph-sdk-java/issues/516 - .protocols(Collections.singletonList(Protocol.HTTP_1_1)) // https://stackoverflow.com/questions/62031298/sockettimeout-on-java-11-but-not-on-java-8 - .build(); - } - if (authenticationProvider != null) { // TODO https://github.com/microsoftgraph/msgraph-sdk-java/issues/517 - authenticationProvider.authenticateRequest(request); - } - Request coreHttpRequest = getHttpRequest(request, resultClass, serializable, progress); - Response response = corehttpClient.newCall(coreHttpRequest).execute(); - InputStream in = null; - boolean isBinaryStreamInput = false; - try { - - // Call being executed - - if (handler != null) { - handler.configConnection(response); - } - - logger.logDebug(String.format("Response code %d, %s", response.code(), response.message())); - - if (handler != null) { - logger.logDebug("StatefulResponse is handling the HTTP response."); - return handler.generateResult(request, response, this.getSerializer(), this.logger); - } - - if (response.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) { - logger.logDebug("Handling error response"); - in = response.body().byteStream(); - handleErrorResponse(request, serializable, response); - } - - if (response.code() == HttpResponseCode.HTTP_NOBODY || response.code() == HttpResponseCode.HTTP_NOT_MODIFIED) { - logger.logDebug("Handling response with no body"); - return handleEmptyResponse(responseHeadersHelper.getResponseHeadersAsMapOfStringList(response), resultClass); - } - - if (response.code() == HttpResponseCode.HTTP_ACCEPTED) { - logger.logDebug("Handling accepted response"); - return handleEmptyResponse(responseHeadersHelper.getResponseHeadersAsMapOfStringList(response), resultClass); - } - - in = new BufferedInputStream(response.body().byteStream()); - - final Map headers = responseHeadersHelper.getResponseHeadersAsMapStringString(response); - - if (response.body() == null || response.body().contentLength() == 0) { - return (Result) null; - } - - final String contentType = headers.get(Constants.CONTENT_TYPE_HEADER_NAME); - if (contentType != null && resultClass != InputStream.class && contentType.contains(Constants.JSON_CONTENT_TYPE)) { - logger.logDebug("Response json"); - return handleJsonResponse(in, responseHeadersHelper.getResponseHeadersAsMapOfStringList(response), resultClass); - } else if (resultClass == InputStream.class) { - logger.logDebug("Response binary"); - isBinaryStreamInput = true; - return (Result) handleBinaryStream(in); - } else { - return (Result) null; - } - } finally { - if (!isBinaryStreamInput) { - try { - if (in != null) { - in.close(); - } - } catch (IOException e) { - logger.logError(e.getMessage(), e); - } - if (response != null) { - response.close(); - } - } - } - } catch (final GraphServiceException ex) { - final boolean shouldLogVerbosely = logger.getLoggingLevel() == LoggerLevel.DEBUG; - logger.logError("Graph service exception " + ex.getMessage(shouldLogVerbosely), ex); - throw ex; - } catch (final Exception ex) { - final ClientException clientException = new ClientException("Error during http request", ex); - logger.logError("Error during http request", clientException); - throw clientException; - } - } - - private Request convertIHttpRequestToOkHttpRequest(IHttpRequest request) { - if (request != null) { - Request.Builder requestBuilder = new Request.Builder(); - requestBuilder.url(request.getRequestUrl()); - for (final HeaderOption header : request.getHeaders()) { - requestBuilder.addHeader(header.getName(), header.getValue().toString()); - } - return requestBuilder.build(); - } - return null; - } - - /** - * Handles the event of an error response - * - * @param request the request that caused the failed response - * @param serializable the body of the request - * @param connection the URL connection - * @param the type of the request body - * @throws IOException an exception occurs if there were any problems interacting with the connection object - */ - private void handleErrorResponse(final IHttpRequest request, final Body serializable, final Response response) throws IOException { - throw GraphServiceException.createFromConnection(request, serializable, serializer, response, logger); - } - - /** - * Handles the cause where the response is a binary stream - * - * @param in the input stream from the response - * @return the input stream to return to the caller - */ - private InputStream handleBinaryStream(final InputStream in) { - return in; - } - - /** - * Handles the cause where the response is a JSON object - * - * @param in the input stream from the response - * @param responseHeaders the response header - * @param clazz the class of the response object - * @param the type of the response object - * @return the JSON object - */ - private Result handleJsonResponse(final InputStream in, Map> responseHeaders, final Class clazz) { - if (clazz == null) { - return null; - } - - final String rawJson = streamToString(in); - return getSerializer().deserializeObject(rawJson, clazz, responseHeaders); - } - - /** - * Handles the case where the response body is empty - * - * @param responseHeaders the response headers - * @param clazz the type of the response object - * @return the JSON object - */ - private Result handleEmptyResponse(Map> responseHeaders, final Class clazz) throws UnsupportedEncodingException { - // Create an empty object to attach the response headers to - InputStream in = new ByteArrayInputStream("{}".getBytes(Constants.JSON_ENCODING)); - return handleJsonResponse(in, responseHeaders, clazz); - } - - @VisibleForTesting - public ILogger getLogger() { - return logger; - } - - @VisibleForTesting - public IExecutors getExecutors() { - return executors; - } - - @VisibleForTesting - public IAuthenticationProvider getAuthenticationProvider() { - return authenticationProvider; - } - - /** - * Get connection config for read and connect timeout in requests - * - * @return Connection configuration to be used for timeout values - */ - public IConnectionConfig getConnectionConfig() { - if (this.connectionConfig == null) { - this.connectionConfig = new DefaultConnectionConfig(); - } - return connectionConfig; - } - - /** - * Set connection config for read and connect timeout in requests - * - * @param connectionConfig Connection configuration to be used for timeout values - */ - public void setConnectionConfig(IConnectionConfig connectionConfig) { - this.connectionConfig = connectionConfig; - } -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt index 2e3343ed6..116f3ffa5 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt @@ -2,26 +2,25 @@ package org.cryptomator.data.cloud.onedrive import android.content.Context import android.net.Uri -import com.microsoft.graph.concurrency.ChunkedUploadProvider import com.microsoft.graph.http.GraphServiceException -import com.microsoft.graph.models.extensions.DriveItem -import com.microsoft.graph.models.extensions.DriveItemUploadableProperties -import com.microsoft.graph.models.extensions.Folder -import com.microsoft.graph.models.extensions.IGraphServiceClient -import com.microsoft.graph.models.extensions.ItemReference +import com.microsoft.graph.models.DriveItem +import com.microsoft.graph.models.DriveItemCreateUploadSessionParameterSet +import com.microsoft.graph.models.DriveItemUploadableProperties +import com.microsoft.graph.models.Folder +import com.microsoft.graph.models.ItemReference import com.microsoft.graph.options.Option import com.microsoft.graph.options.QueryOption -import com.microsoft.graph.requests.extensions.IDriveRequestBuilder +import com.microsoft.graph.requests.DriveRequestBuilder +import com.microsoft.graph.requests.GraphServiceClient +import com.microsoft.graph.tasks.LargeFileUploadTask import com.tomclaw.cache.DiskLruCache import org.cryptomator.data.cloud.onedrive.OnedriveCloudNodeFactory.folder import org.cryptomator.data.cloud.onedrive.OnedriveCloudNodeFactory.from import org.cryptomator.data.cloud.onedrive.OnedriveCloudNodeFactory.getDriveId import org.cryptomator.data.cloud.onedrive.OnedriveCloudNodeFactory.getId import org.cryptomator.data.cloud.onedrive.OnedriveCloudNodeFactory.isFolder -import org.cryptomator.data.cloud.onedrive.graph.ClientException -import org.cryptomator.data.cloud.onedrive.graph.ICallback -import org.cryptomator.data.cloud.onedrive.graph.IProgressCallback import org.cryptomator.data.util.CopyStream +import org.cryptomator.data.util.TransferredBytesAwareInputStream import org.cryptomator.data.util.TransferredBytesAwareOutputStream import org.cryptomator.domain.OnedriveCloud import org.cryptomator.domain.exception.BackendException @@ -45,22 +44,20 @@ import java.util.ArrayList import java.util.Date import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutionException +import okhttp3.Request import timber.log.Timber -internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCache: OnedriveIdCache) { +internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, graphServiceClient: GraphServiceClient, nodeInfoCache: OnedriveIdCache) { private val cloud: OnedriveCloud private val context: Context + private val graphServiceClient: GraphServiceClient private val nodeInfoCache: OnedriveIdCache private val sharedPreferencesHandler: SharedPreferencesHandler private var diskLruCache: DiskLruCache? = null - private fun client(): IGraphServiceClient { - return OnedriveClientFactory.getInstance(context, cloud.accessToken()) - } - - private fun drive(driveId: String?): IDriveRequestBuilder { - return if (driveId == null) client().me().drive() else client().drives(driveId) + private fun drive(driveId: String?): DriveRequestBuilder { + return if (driveId == null) graphServiceClient.me().drive() else graphServiceClient.drives(driveId) } fun root(): OnedriveFolder { @@ -90,11 +87,7 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach private fun childByName(parentId: String, parentDriveId: String, name: String): DriveItem? { return try { - drive(parentDriveId) // - .items(parentId) // - .itemWithPath(Uri.encode(name)) // - .buildRequest() // - .get() + drive(parentDriveId).items(parentId).itemWithPath(Uri.encode(name)).buildRequest().get() } catch (e: GraphServiceException) { if (isNotFoundError(e)) { null @@ -138,18 +131,14 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach fun list(folder: OnedriveFolder): List { val result: MutableList = ArrayList() val nodeInfo = requireNodeInfo(folder) - var page = drive(nodeInfo.driveId) // - .items(nodeInfo.id) // - .children() // - .buildRequest() // - .get() + var page = drive(nodeInfo.driveId).items(nodeInfo.id).children().buildRequest().get() do { removeChildNodeInfo(folder) - page.currentPage?.forEach { + page?.currentPage?.forEach { result.add(cacheNodeInfo(from(folder, it), it)) } - page = if (page.nextPage != null) { - page.nextPage.buildRequest().get() + page = if (page?.nextPage != null) { + page.nextPage?.buildRequest()?.get() } else { null } @@ -170,10 +159,7 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach folderToCreate.name = folder.name folderToCreate.folder = Folder() val parentNodeInfo = requireNodeInfo(parentFolder) - val createdFolder = drive(parentNodeInfo.driveId) // - .items(parentNodeInfo.id).children() // - .buildRequest() // - .post(folderToCreate) + val createdFolder = drive(parentNodeInfo.driveId).items(parentNodeInfo.id).children().buildRequest().post(folderToCreate) return cacheNodeInfo(folder(parentFolder, createdFolder), createdFolder) } ?: throw ParentFolderIsNullException(folder.name) } @@ -192,12 +178,10 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach targetParentReference.driveId = targetNodeInfo?.driveId targetItem.parentReference = targetParentReference val sourceNodeInfo = requireNodeInfo(source) - val movedItem = drive(sourceNodeInfo.driveId) // - .items(sourceNodeInfo.id) // - .buildRequest() // - .patch(targetItem) - removeNodeInfo(source) - return cacheNodeInfo(from(targetsParent, movedItem), movedItem) + drive(sourceNodeInfo.driveId).items(sourceNodeInfo.id).buildRequest().patch(targetItem)?.let { + removeNodeInfo(source) + return cacheNodeInfo(from(targetsParent, it), it) + } ?: throw FatalBackendException("Failed to move file, response is null") } ?: throw ParentFolderIsNullException(target.name) } @@ -214,7 +198,7 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach val conflictBehaviorOption: Option = QueryOption("@name.conflictBehavior", uploadMode) val result = CompletableFuture() if (size <= CHUNKED_UPLOAD_MAX_SIZE) { - uploadFile(file, data, progressAware, result, conflictBehaviorOption) + uploadFile(file, data, progressAware, result, conflictBehaviorOption, size) } else { try { chunkedUploadFile(file, data, progressAware, result, conflictBehaviorOption, size) @@ -233,88 +217,67 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } @Throws(NoSuchCloudFileException::class) - private fun uploadFile( // - file: OnedriveFile, // - data: DataSource, // - progressAware: ProgressAware, // - result: CompletableFuture, // - conflictBehaviorOption: Option - ) { - val parentNodeInfo = requireNodeInfo(file.parent) - try { - data.open(context)?.use { inputStream -> - drive(parentNodeInfo.driveId) // - .items(parentNodeInfo.id) // - .itemWithPath(file.name) // - .content() // - .buildRequest(listOf(conflictBehaviorOption)) // - .put(CopyStream.toByteArray(inputStream), object : IProgressCallback { - override fun progress(current: Long, max: Long) { - progressAware // - .onProgress( - Progress.progress(UploadState.upload(file)) // - .between(0) // - .and(max) // - .withValue(current) - ) - } - - override fun success(item: DriveItem) { - progressAware.onProgress(Progress.completed(UploadState.upload(file))) - result.complete(item) - cacheNodeInfo(file, item) - } - - override fun failure(ex: com.microsoft.graph.core.ClientException) { - result.completeExceptionally(ex) + private fun uploadFile(file: OnedriveFile, data: DataSource, progressAware: ProgressAware, result: CompletableFuture, conflictBehaviorOption: Option, size: Long) { + data.open(context)?.use { inputStream -> + object : TransferredBytesAwareInputStream(inputStream) { + override fun bytesTransferred(transferred: Long) { + progressAware.onProgress(Progress.progress(UploadState.upload(file)).between(0).and(size).withValue(transferred)) + } + }.use { + val parentNodeInfo = requireNodeInfo(file.parent) + try { + drive(parentNodeInfo.driveId) // + .items(parentNodeInfo.id) // + .itemWithPath(file.name) // + .content() // + .buildRequest(listOf(conflictBehaviorOption)) // + .putAsync(CopyStream.toByteArray(it)) // + .whenComplete { driveItem, error -> + run { + if (error == null) { + progressAware.onProgress(Progress.completed(UploadState.upload(file))) + result.complete(driveItem) + cacheNodeInfo(file, driveItem) + } else { + result.completeExceptionally(error) + } + } } - }) - } ?: throw FatalBackendException("InputStream shouldn't be null") - } catch (e: IOException) { - throw FatalBackendException(e) - } + } catch (e: IOException) { + throw FatalBackendException(e) + } + } + } ?: throw FatalBackendException("InputStream shouldn't bee null") } @Throws(IOException::class, NoSuchCloudFileException::class) - private fun chunkedUploadFile( // - file: OnedriveFile, // - data: DataSource, // - progressAware: ProgressAware, // - result: CompletableFuture, // - conflictBehaviorOption: Option, // - size: Long - ) { + private fun chunkedUploadFile(file: OnedriveFile, data: DataSource, progressAware: ProgressAware, result: CompletableFuture, conflictBehaviorOption: Option, size: Long) { val parentNodeInfo = requireNodeInfo(file.parent) - val uploadSession = drive(parentNodeInfo.driveId) // + drive(parentNodeInfo.driveId) // .items(parentNodeInfo.id) // .itemWithPath(file.name) // - .createUploadSession(DriveItemUploadableProperties()) // + .createUploadSession(DriveItemCreateUploadSessionParameterSet.newBuilder().withItem(DriveItemUploadableProperties()).build()) // .buildRequest() // - .post() - data.open(context).use { inputStream -> - ChunkedUploadProvider(uploadSession, client(), inputStream, size, DriveItem::class.java) // - .upload(listOf(conflictBehaviorOption), object : IProgressCallback { - override fun progress(current: Long, max: Long) { - progressAware.onProgress( - Progress // - .progress(UploadState.upload(file)) // - .between(0) // - .and(max) // - .withValue(current) - ) - } - - override fun success(item: DriveItem) { - progressAware.onProgress(Progress.completed(UploadState.upload(file))) - result.complete(item) - cacheNodeInfo(file, item) - } - - override fun failure(ex: com.microsoft.graph.core.ClientException) { - result.completeExceptionally(ex) - } - }, CHUNKED_UPLOAD_CHUNK_SIZE, CHUNKED_UPLOAD_MAX_ATTEMPTS) - } + .post()?.let { uploadSession -> + data.open(context)?.use { inputStream -> + LargeFileUploadTask(uploadSession, graphServiceClient, inputStream, size, DriveItem::class.java) // + .uploadAsync(CHUNKED_UPLOAD_CHUNK_SIZE, listOf(conflictBehaviorOption)) { current, max -> + progressAware.onProgress( + Progress.progress(UploadState.upload(file)).between(0).and(max).withValue(current) + ) + }.whenComplete { driveItemResult, error -> + run { + if (error == null && driveItemResult.responseBody != null) { + progressAware.onProgress(Progress.completed(UploadState.upload(file))) + result.complete(driveItemResult.responseBody) + cacheNodeInfo(file, driveItemResult.responseBody!!) + } else { + result.completeExceptionally(error) + } + } + } + } ?: throw FatalBackendException("InputStream shouldn't bee null") + } ?: throw FatalBackendException("Failed to create upload session, response is null") } @Throws(BackendException::class, IOException::class) @@ -340,27 +303,12 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } @Throws(IOException::class) - private fun writeToData( - file: OnedriveFile, // - nodeInfo: OnedriveIdCache.NodeInfo, // - data: OutputStream, // - encryptedTmpFile: File?, // - cacheKey: String?, // - progressAware: ProgressAware - ) { - val request = drive(nodeInfo.driveId) // - .items(nodeInfo.id) // - .content() // - .buildRequest() - request.get().use { inputStream -> + private fun writeToData(file: OnedriveFile, nodeInfo: OnedriveIdCache.NodeInfo, data: OutputStream, encryptedTmpFile: File?, cacheKey: String?, progressAware: ProgressAware) { + val request = drive(nodeInfo.driveId).items(nodeInfo.id).content().buildRequest() + request.get()?.use { inputStream -> object : TransferredBytesAwareOutputStream(data) { override fun bytesTransferred(transferred: Long) { - progressAware.onProgress( // - Progress.progress(DownloadState.download(file)) // - .between(0) // - .and(file.size ?: Long.MAX_VALUE) // - .withValue(transferred) - ) + progressAware.onProgress(Progress.progress(DownloadState.download(file)).between(0).and(file.size ?: Long.MAX_VALUE).withValue(transferred)) } }.use { out -> CopyStream.copyStreamToStream(inputStream, out) } } @@ -391,10 +339,7 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach @Throws(NoSuchCloudFileException::class) fun delete(node: OnedriveNode) { val nodeInfo = requireNodeInfo(node) - drive(nodeInfo.driveId) // - .items(nodeInfo.id) // - .buildRequest() // - .delete() + drive(nodeInfo.driveId).items(nodeInfo.id).buildRequest().delete() removeNodeInfo(node) } @@ -440,8 +385,9 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } private fun loadRootNodeInfo(): OnedriveIdCache.NodeInfo { - val item = drive(null).root().buildRequest().get() - return OnedriveIdCache.NodeInfo(getId(item), getDriveId(item), true, item.cTag) + return drive(null).root().buildRequest().get()?.let { rootItem -> + OnedriveIdCache.NodeInfo(getId(rootItem), getDriveId(rootItem), true, rootItem.cTag) + } ?: throw FatalBackendException("Failed to load root item, item is null") } private fun loadNonRootNodeInfo(node: OnedriveNode): OnedriveIdCache.NodeInfo? { @@ -459,37 +405,20 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } ?: throw ParentFolderIsNullException(node.name) } - fun currentAccount(): String { - return client().me().drive().buildRequest().get().owner.user.displayName + fun currentAccount(username: String): String { + // used to check authentication + graphServiceClient.me().drive().buildRequest().get()?.owner?.user + return username } fun logout() { - val result = CompletableFuture() - OnedriveClientFactory.getAuthAdapter(context, cloud.accessToken()).logout(object : ICallback { - override fun success(aVoid: Void?) { - result.complete(null) - } - - override fun failure(e: ClientException) { - result.completeExceptionally(e) - } - }) - try { - result.get() - } catch (e: InterruptedException) { - throw FatalBackendException(e) - } catch (e: ExecutionException) { - throw FatalBackendException(e) - } - - OnedriveClientFactory.logout() + // FIXME what about logout? } companion object { private const val CHUNKED_UPLOAD_MAX_SIZE = 4L shl 20 private const val CHUNKED_UPLOAD_CHUNK_SIZE = 327680 * 32 - private const val CHUNKED_UPLOAD_MAX_ATTEMPTS = 5 private const val REPLACE_MODE = "replace" private const val NON_REPLACING_MODE = "rename" } @@ -500,6 +429,7 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } this.cloud = cloud this.context = context + this.graphServiceClient = graphServiceClient this.nodeInfoCache = nodeInfoCache sharedPreferencesHandler = SharedPreferencesHandler(context) } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ClientException.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ClientException.java deleted file mode 100644 index 4c3641cc5..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ClientException.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -import com.microsoft.graph.core.GraphErrorCodes; - -/** - * An exception from the client. - */ -public class ClientException extends com.microsoft.graph.core.ClientException { - - private static final long serialVersionUID = -10662352567392559L; - - private final Enum errorCode; - - /** - * Creates the client exception - * - * @param message the message to display - * @param ex the exception from - */ - public ClientException(final String message, final Throwable ex, Enum errorCode) { - super(message, ex); - - this.errorCode = errorCode; - } - - public Enum errorCode() { - return errorCode; - } -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IAuthenticationAdapter.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IAuthenticationAdapter.java deleted file mode 100644 index 653e5d8d6..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IAuthenticationAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -import android.app.Activity; - -import com.microsoft.graph.authentication.IAuthenticationProvider; - -/** - * An authentication adapter for signing requests, logging in, and logging out. - */ -public interface IAuthenticationAdapter extends IAuthenticationProvider { - - /** - * Logs out the user - * - * @param callback The callback when the logout is complete or an error occurs - */ - void logout(final ICallback callback); - - /** - * Login a user by popping UI - * - * @param activity The current activity - * @param callback The callback when the login is complete or an error occurs - */ - void login(final Activity activity, final ICallback callback); - - /** - * Login a user with no ui - * - * @param callback The callback when the login is complete or an error occurs - */ - void loginSilent(final ICallback callback); - - /** - * Gets the access token for the session of a logged in user - * - * @return the access token - */ - String getAccessToken() throws ClientException; -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ICallback.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ICallback.java deleted file mode 100644 index e02bada90..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/ICallback.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -// ------------------------------------------------------------------------------ -// Copyright (c) 2017 Microsoft Corporation -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sub-license, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// ------------------------------------------------------------------------------ - -/** - * A callback that describes how to deal with success and failure - * - * @param the result type of the successful action - */ -public interface ICallback { - - /** - * How successful results are handled - * - * @param result the result - */ - void success(final Result result); - - /** - * How failures are handled - * - * @param ex the exception - */ - void failure(final ClientException ex); -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IProgressCallback.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IProgressCallback.java deleted file mode 100644 index 98012d50e..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/IProgressCallback.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -// ------------------------------------------------------------------------------ -// Copyright (c) 2017 Microsoft Corporation -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sub-license, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// ------------------------------------------------------------------------------ - -/** - * A callback that describes how to deal with success, failure, and progress - * - * @param the result type of the successful action - */ -public interface IProgressCallback extends com.microsoft.graph.concurrency.IProgressCallback { - - /** - * How progress updates are handled for this callback - * - * @param current the current amount of progress - * @param max the max amount of progress - */ - void progress(final long current, final long max); -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java deleted file mode 100644 index 4fdb3224b..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java +++ /dev/null @@ -1,275 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -import android.app.Activity; -import android.content.Context; - -import com.microsoft.graph.http.IHttpRequest; -import com.microsoft.graph.options.HeaderOption; -import com.microsoft.services.msa.LiveAuthClient; -import com.microsoft.services.msa.LiveAuthException; -import com.microsoft.services.msa.LiveAuthListener; -import com.microsoft.services.msa.LiveConnectSession; -import com.microsoft.services.msa.LiveStatus; - -import org.cryptomator.util.crypto.CredentialCryptor; - -import java.util.Arrays; -import java.util.concurrent.atomic.AtomicReference; - -import timber.log.Timber; - -import static com.microsoft.graph.core.GraphErrorCodes.AUTHENTICATION_FAILURE; - -/** - * Supports login, logout, and signing requests with authorization information. - */ -public abstract class MSAAuthAndroidAdapter implements IAuthenticationAdapter { - - /** - * The authorization header name. - */ - private static final String AUTHORIZATION_HEADER_NAME = "Authorization"; - - /** - * The bearer prefix. - */ - private static final String OAUTH_BEARER_PREFIX = "bearer "; - - /** - * The live auth client. - */ - private final LiveAuthClient mLiveAuthClient; - private Context context; - - /** - * Create a new instance of the provider - * - * @param context the application context instance - * @param refreshToken - */ - protected MSAAuthAndroidAdapter(final Context context, String refreshToken) { - this.context = context; - mLiveAuthClient = new LiveAuthClient(context, getClientId(), Arrays.asList(getScopes()), MicrosoftOAuth2Endpoint.getInstance(), refreshToken); - } - - /** - * The client id for this authenticator. - * http://graph.microsoft.io/en-us/app-registration - * - * @return The client id. - */ - protected abstract String getClientId(); - - /** - * The scopes for this application. - * http://graph.microsoft.io/en-us/docs/authorization/permission_scopes - * - * @return The scopes for this application. - */ - protected abstract String[] getScopes(); - - @Override - public void authenticateRequest(final IHttpRequest request) { - Timber.tag("MSAAuthAndroidAdapter").d("Authenticating request, %s", request.getRequestUrl()); - - // If the request already has an authorization header, do not intercept it. - for (final HeaderOption option : request.getHeaders()) { - if (option.getName().equals(AUTHORIZATION_HEADER_NAME)) { - Timber.tag("MSAAuthAndroidAdapter").d("Found an existing authorization header!"); - return; - } - } - - try { - final String accessToken = getAccessToken(); - request.addHeader(AUTHORIZATION_HEADER_NAME, OAUTH_BEARER_PREFIX + accessToken); - } catch (ClientException e) { - final String message = "Unable to authenticate request, No active account found"; - final ClientException exception = new ClientException(message, e, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(exception, message); - throw exception; - } - } - - @Override - public String getAccessToken() throws ClientException { - if (hasValidSession()) { - Timber.tag("MSAAuthAndroidAdapter").d("Found account information"); - if (mLiveAuthClient.getSession().isExpired()) { - Timber.tag("MSAAuthAndroidAdapter").d("Account access token is expired, refreshing"); - loginSilentBlocking(); - } - return mLiveAuthClient.getSession().getAccessToken(); - } else { - final String message = "Unable to get access token, No active account found"; - final ClientException exception = new ClientException(message, null, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(exception, message); - throw exception; - } - } - - @Override - public void logout(final ICallback callback) { - Timber.tag("MSAAuthAndroidAdapter").d("Logout started"); - - if (callback == null) { - throw new IllegalArgumentException("callback"); - } - - mLiveAuthClient.logout(new LiveAuthListener() { - @Override - public void onAuthComplete(final LiveStatus status, final LiveConnectSession session, final Object userState) { - Timber.tag("MSAAuthAndroidAdapter").d("Logout complete"); - callback.success(null); - } - - @Override - public void onAuthError(final LiveAuthException exception, final Object userState) { - final ClientException clientException = new ClientException("Logout failure", exception, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(clientException); - callback.failure(clientException); - } - }); - } - - @Override - public void login(final Activity activity, final ICallback callback) { - Timber.tag("MSAAuthAndroidAdapter").d("Login started"); - - if (callback == null) { - throw new IllegalArgumentException("callback"); - } - - if (hasValidSession()) { - Timber.tag("MSAAuthAndroidAdapter").d("Already logged in"); - callback.success(null); - return; - } - - final LiveAuthListener listener = new LiveAuthListener() { - @Override - public void onAuthComplete(final LiveStatus status, final LiveConnectSession session, final Object userState) { - Timber.tag("MSAAuthAndroidAdapter").d(String.format("LiveStatus: %s, LiveConnectSession good?: %s, UserState %s", status, session != null, userState)); - - if (status == LiveStatus.NOT_CONNECTED && session.getRefreshToken() == null) { - Timber.tag("MSAAuthAndroidAdapter").d("Received invalid login failure from silent authentication, ignoring."); - return; - } - - if (status == LiveStatus.CONNECTED) { - Timber.tag("MSAAuthAndroidAdapter").d("Login completed"); - callback.success(encrypt(session.getRefreshToken())); - return; - } - - final ClientException clientException = new ClientException("Unable to login successfully", null, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(clientException); - callback.failure(clientException); - } - - @Override - public void onAuthError(final LiveAuthException exception, final Object userState) { - final ClientException clientException = new ClientException("Login failure", exception, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(clientException); - callback.failure(clientException); - } - }; - - // Make sure the login process is started with the current activity information - activity.runOnUiThread(() -> mLiveAuthClient.login(activity, listener)); - } - - private String encrypt(String refreshToken) { - if (refreshToken == null) { - return null; - } - return CredentialCryptor // - .getInstance(context) // - .encrypt(refreshToken); - } - - /** - * Login a user with no ui - * - * @param callback The callback when the login is complete or an error occurs - */ - @Override - public void loginSilent(final ICallback callback) { - Timber.tag("MSAAuthAndroidAdapter").d("Login silent started"); - - if (callback == null) { - throw new IllegalArgumentException("callback"); - } - - final LiveAuthListener listener = new LiveAuthListener() { - @Override - public void onAuthComplete(final LiveStatus status, final LiveConnectSession session, final Object userState) { - Timber.tag("MSAAuthAndroidAdapter").d(String.format("LiveStatus: %s, LiveConnectSession good?: %s, UserState %s", status, session != null, userState)); - - if (status == LiveStatus.CONNECTED) { - Timber.tag("MSAAuthAndroidAdapter").d("Login completed"); - callback.success(null); - return; - } - - final ClientException clientException = new ClientException("Unable to login silently", null, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(clientException); - callback.failure(clientException); - } - - @Override - public void onAuthError(final LiveAuthException exception, final Object userState) { - final ClientException clientException = new ClientException("Unable to login silently", null, AUTHENTICATION_FAILURE); - Timber.tag("MSAAuthAndroidAdapter").e(clientException); - callback.failure(clientException); - } - }; - - mLiveAuthClient.loginSilent(listener); - } - - /** - * Login silently while blocking for the call to return - * - * @return the result of the login attempt - * @throws ClientException The exception if there was an issue during the login attempt - */ - private Void loginSilentBlocking() throws ClientException { - Timber.tag("MSAAuthAndroidAdapter").d("Login silent blocking started"); - final SimpleWaiter waiter = new SimpleWaiter(); - final AtomicReference returnValue = new AtomicReference<>(); - final AtomicReference exceptionValue = new AtomicReference<>(); - - loginSilent(new ICallback() { - @Override - public void success(final Void aVoid) { - returnValue.set(aVoid); - waiter.signal(); - } - - @Override - public void failure(ClientException ex) { - exceptionValue.set(ex); - waiter.signal(); - } - }); - - waiter.waitForSignal(); - - // noinspection ThrowableResultOfMethodCallIgnored - if (exceptionValue.get() != null) { - throw exceptionValue.get(); - } - - return returnValue.get(); - } - - /** - * Is the session object valid - * - * @return true, if the session is valid (but not necessary unexpired) - */ - private boolean hasValidSession() { - return mLiveAuthClient.getSession() != null && mLiveAuthClient.getSession().getAccessToken() != null; - } -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MicrosoftOAuth2Endpoint.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MicrosoftOAuth2Endpoint.java deleted file mode 100644 index 5d964fdbe..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MicrosoftOAuth2Endpoint.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -import android.net.Uri; - -import com.microsoft.services.msa.OAuthConfig; - -import org.cryptomator.data.BuildConfig; - -class MicrosoftOAuth2Endpoint implements OAuthConfig { - - /** - * The current instance of this class - */ - private static final MicrosoftOAuth2Endpoint sInstance = new MicrosoftOAuth2Endpoint(); - - /** - * The current instance of this class - * - * @return The instance - */ - static MicrosoftOAuth2Endpoint getInstance() { - return sInstance; - } - - @Override - public Uri getAuthorizeUri() { - return Uri.parse("https://login.microsoftonline.com/common/oauth2/v2.0/authorize"); - } - - @Override - public Uri getDesktopUri() { - return Uri.parse(BuildConfig.ONEDRIVE_API_REDIRCT_URI); - } - - @Override - public Uri getLogoutUri() { - return Uri.parse("https://login.microsoftonline.com/common/oauth2/v2.0/logout"); - } - - @Override - public Uri getTokenUri() { - return Uri.parse("https://login.microsoftonline.com/common/oauth2/v2.0/token"); - } -} diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/SimpleWaiter.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/SimpleWaiter.java deleted file mode 100644 index 96f3e6231..000000000 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/SimpleWaiter.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.cryptomator.data.cloud.onedrive.graph; - -// ------------------------------------------------------------------------------ -// Copyright (c) 2015 Microsoft Corporation -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// ------------------------------------------------------------------------------ - -/** - * A simple signal/waiter interface for synchronizing multi-threaded actions. - */ -public class SimpleWaiter { - - /** - * The internal lock object for this waiter. - */ - private final Object mInternalLock = new Object(); - - /** - * Indicates if this waiter has been triggered. - */ - private boolean mTriggerState; - - /** - * BLOCKING: Waits for the signal to be triggered, or returns immediately if it has already been triggered. - */ - public void waitForSignal() { - synchronized (mInternalLock) { - if (this.mTriggerState) { - return; - } - try { - mInternalLock.wait(); - } catch (final InterruptedException e) { - throw new RuntimeException(e); - } - } - } - - /** - * Triggers the signal for this waiter. - */ - public void signal() { - synchronized (mInternalLock) { - mTriggerState = true; - mInternalLock.notifyAll(); - } - } -} diff --git a/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java b/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java index 638c5c76e..77239abe8 100644 --- a/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java +++ b/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java @@ -1,5 +1,7 @@ package org.cryptomator.data.db; +import static java.lang.String.format; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -10,8 +12,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import static java.lang.String.format; - @Singleton class DatabaseUpgrades { @@ -28,7 +28,9 @@ public DatabaseUpgrades( // Upgrade6To7 upgrade6To7, // Upgrade7To8 upgrade7To8, // Upgrade8To9 upgrade8To9, // - Upgrade9To10 upgrade9To10) { + Upgrade9To10 upgrade9To10, // + Upgrade10To11 upgrade10To11 + ) { availableUpgrades = defineUpgrades( // upgrade0To1, // @@ -40,11 +42,8 @@ public DatabaseUpgrades( // upgrade6To7, // upgrade7To8, // upgrade8To9, // - upgrade9To10); - } - - private static Comparator reverseOrder() { - return (a, b) -> b.compareTo(a); + upgrade9To10, // + upgrade10To11); } private Map> defineUpgrades(DatabaseUpgrade... upgrades) { @@ -56,7 +55,7 @@ private Map> defineUpgrades(DatabaseUpgrade... up result.get(upgrade.from()).add(upgrade); } for (List list : result.values()) { - Collections.sort(list, reverseOrder()); + Collections.sort(list, Comparator.reverseOrder()); } return result; } diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt new file mode 100644 index 000000000..dffc9d36d --- /dev/null +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt @@ -0,0 +1,25 @@ +package org.cryptomator.data.db + +import org.greenrobot.greendao.database.Database +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +internal class Upgrade10To11 @Inject constructor() : DatabaseUpgrade(10, 11) { + + private val onedriveCloudId = 3L + + override fun internalApplyTo(db: Database, origin: Int) { + db.beginTransaction() + try { + Sql.deleteFrom("CLOUD_ENTITY") + .where("_id", Sql.eq(onedriveCloudId)) + .where("TYPE", Sql.eq("ONEDRIVE")) + .executeOn(db) + + db.setTransactionSuccessful() + } finally { + db.endTransaction() + } + } +} diff --git a/domain/src/main/java/org/cryptomator/domain/OnedriveCloud.java b/domain/src/main/java/org/cryptomator/domain/OnedriveCloud.java index a56accf0f..8791bb7e3 100644 --- a/domain/src/main/java/org/cryptomator/domain/OnedriveCloud.java +++ b/domain/src/main/java/org/cryptomator/domain/OnedriveCloud.java @@ -55,7 +55,11 @@ public boolean requiresNetwork() { @Override public boolean configurationMatches(Cloud cloud) { - return true; + return cloud instanceof OnedriveCloud && configurationMatches((OnedriveCloud) cloud); + } + + private boolean configurationMatches(OnedriveCloud cloud) { + return username.equals(cloud.username); } @NotNull diff --git a/lib/msa-auth-for-android b/lib/msa-auth-for-android deleted file mode 160000 index e930a7361..000000000 --- a/lib/msa-auth-for-android +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e930a73612d0eee17710f5a9460c9a943efb090f diff --git a/presentation/build.gradle b/presentation/build.gradle index 90e807f55..3d63162cd 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions' apply plugin: 'de.mannodermaus.android-junit5' +apply from: 'prebuild.gradle' android { signingConfigs { @@ -51,9 +52,10 @@ android { shrinkResources false buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY') + "\"" - manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY')] buildConfigField "String", "PCLOUD_CLIENT_ID", "\"" + getApiKey('PCLOUD_CLIENT_ID') + "\"" + manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY'), ONEDRIVE_API_KEY_DECODED: getOnedriveApiKey()] + resValue "string", "app_id", androidApplicationId } @@ -66,9 +68,10 @@ android { testCoverageEnabled false buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY_DEBUG') + "\"" - manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY_DEBUG')] buildConfigField "String", "PCLOUD_CLIENT_ID", "\"" + getApiKey('PCLOUD_CLIENT_ID_DEBUG') + "\"" + manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY_DEBUG'), ONEDRIVE_API_KEY_DECODED: getOnedriveApiKey()] + applicationIdSuffix ".debug" versionNameSuffix '-DEBUG' @@ -108,6 +111,7 @@ android { packagingOptions { exclude 'META-INF/jersey-module-version' + exclude 'META-INF/NOTICE.md' exclude 'META-INF/DEPENDENCIES' } } @@ -145,6 +149,7 @@ dependencies { // cloud implementation dependencies.dropbox implementation dependencies.msgraph + implementation dependencies.msgraphAuth playstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' @@ -248,6 +253,13 @@ static def getApiKey(key) { return System.getenv().getOrDefault(key, "") } +static def getOnedriveApiKey() { + String onedrivePath = "" + getApiKey('ONEDRIVE_API_REDIRCT_URI') + String idStr = onedrivePath.substring(onedrivePath.lastIndexOf('/') + 1) + URI uri = new URI(idStr) + return uri.path +} + tasks.withType(Test) { testLogging { events "failed" diff --git a/presentation/prebuild.gradle b/presentation/prebuild.gradle new file mode 100644 index 000000000..b7a5e16ca --- /dev/null +++ b/presentation/prebuild.gradle @@ -0,0 +1,36 @@ +import groovy.json.JsonOutput +import groovy.json.JsonSlurper + +task generateAppConfigurationFile() { + def jsonSlurper = new JsonSlurper() + + def apiKey = "" + getApiKey('ONEDRIVE_API_KEY') + def redirectUri = "" + getApiKey('ONEDRIVE_API_REDIRCT_URI') + + def jsonString = """ + { + "client_id" : "${apiKey}", + "authorization_user_agent" : "DEFAULT", + "redirect_uri" : "${redirectUri}", + "broker_redirect_uri_registered": true, + "shared_device_mode_supported": true, + "authorities" : [ + { + "type": "AAD", + "audience": { + "type": "AzureADandPersonalMicrosoftAccount", + "tenant_id": "common" + } + } + ] + }""" + + def config_file = new File('presentation/src/main/res/raw/auth_config_onedrive.json') + config_file.write(JsonOutput.prettyPrint(JsonOutput.toJson(jsonSlurper.parseText(jsonString)))) +} + +static def getApiKey(key) { + return System.getenv().getOrDefault(key, "") +} + +build.dependsOn generateAppConfigurationFile diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index eac080bf4..f8e595d7a 100644 --- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -210,49 +210,113 @@ class AuthenticateCloudPresenter @Inject constructor( // } } - private inner class OnedriveAuthStrategy : AuthStrategy { + private fun startAuthentication(cloud: CloudModel) { + authenticationStarted = true + + PublicClientApplication.createMultipleAccountPublicClientApplication( + context(), + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + if (accounts.isEmpty()) { + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } else { + accounts.find { account -> account.username == cloud.username() }?.let { + application.acquireTokenSilentAsync( + onedriveScopes(), + it, + "https://login.microsoftonline.com/common", + getAuthSilentCallback(cloud, application) + ) + } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + failAuthentication(cloud.name()) + } + }) + } - private var authenticationStarted = false - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.ONEDRIVE - } + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") + failAuthentication(cloud.name()) + } + }) + } - override fun resumed(intent: AuthenticateCloudIntent) { - if (!authenticationStarted) { - startAuthentication(intent.cloud()) + private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken) } - } - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - val authenticationAdapter = OnedriveClientFactory.getAuthAdapter(context(), (cloud.toCloud() as OnedriveCloud).accessToken()) - authenticationAdapter.login(activity(), object : ICallback { - override fun success(accessToken: String?) { - if (accessToken == null) { - Timber.tag("AuthicateCloudPrester").e("Onedrive access token is empty") + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") + when (e) { + is MsalClientException -> { + /* Exception inside MSAL, more info inside MsalError.java */ + failAuthentication(cloud.name()) + } + is MsalServiceException -> { + /* Exception when communicating with the STS, likely config issue */ failAuthentication(cloud.name()) - } else { - showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION)) - handleAuthenticationResult(cloud, accessToken) + } + is MsalUiRequiredException -> { + /* Tokens expired or no session, retry with interactive */ + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) } } + } - override fun failure(ex: ClientException) { - Timber.tag("AuthicateCloudPrester").e(ex) - failAuthentication(cloud.name()) - } - }) + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } } + } - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(accessToken) // - .build() - ) + private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") + failAuthentication(cloud.name()) + } + + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } } } + private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { + getUsernameAndSuceedAuthentication( // + OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // + .withAccessToken(encrypt(accessToken)) // + .build() + ) + } + + private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { + getUsernameAndSuceedAuthentication( // + OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // + .withAccessToken(encrypt(accessToken)) // + .withUsername(username) + .build() + ) + } +} + private inner class PCloudAuthStrategy : AuthStrategy { private var authenticationStarted = false @@ -512,6 +576,10 @@ class AuthenticateCloudPresenter @Inject constructor( // companion object { const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate" + + fun onedriveScopes(): Array { + return arrayOf("User.Read", "Files.ReadWrite") + } } init { diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index 5852673c5..9c449d8b0 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -159,6 +159,17 @@ + + + + + + + + requestActivityResult( - ActivityResultCallbacks.addChangeMultiCloud(), // - Intents.webDavAddOrChangeIntent() - ) - CloudTypeModel.PCLOUD -> { - requestActivityResult( - ActivityResultCallbacks.pCloudAuthenticationFinished(), // - Intents.authenticatePCloudIntent() - ) - } - CloudTypeModel.S3 -> requestActivityResult( - ActivityResultCallbacks.addChangeMultiCloud(), // - Intents.s3AddOrChangeIntent() - ) + CloudTypeModel.ONEDRIVE -> addOnedriveCloud() + CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), Intents.webDavAddOrChangeIntent()) + CloudTypeModel.PCLOUD -> requestActivityResult(ActivityResultCallbacks.pCloudAuthenticationFinished(), Intents.authenticatePCloudIntent()) + CloudTypeModel.S3 -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), Intents.s3AddOrChangeIntent()) CloudTypeModel.LOCAL -> openDocumentTree() } } + private fun addOnedriveCloud() { + PublicClientApplication.createMultipleAccountPublicClientApplication( + context(), + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + application.acquireToken(activity(), AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback()) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + showError(e); + } + }) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") + showError(e); + } + }) + } + + private fun getAuthInteractiveCallback(): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + val accessToken = CredentialCryptor.getInstance(context()).encrypt(authenticationResult.accessToken) + val onedriveSkeleton = OnedriveCloud.aOnedriveCloud().withAccessToken(accessToken).withUsername(authenticationResult.account.username).build() + saveOnedriveCloud(onedriveSkeleton) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") + showError(e); + } + + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } + } + } + + private fun saveOnedriveCloud(onedriveSkeleton: OnedriveCloud) { + getUsernameUseCase // + .withCloud(onedriveSkeleton) // + .run(object : DefaultResultHandler() { + override fun onSuccess(username: String) { + prepareForSavingOnedriveCloud(OnedriveCloud.aCopyOf(onedriveSkeleton).withUsername(username).build()) + } + }) + } + + fun prepareForSavingOnedriveCloud(cloud: OnedriveCloud) { + getCloudsUseCase // + .withCloudType(CloudTypeModel.valueOf(selectedCloudType.get())) // + .run(object : DefaultResultHandler>() { + override fun onSuccess(clouds: List) { + clouds.firstOrNull { + (it as OnedriveCloud).username() == cloud.username() + }?.let { + saveCloud(OnedriveCloud.aCopyOf(it as OnedriveCloud).withAccessToken(cloud.accessToken()).build()) + Timber.tag("CloudConnListPresenter").i("OneDrive access token updated") + } ?: saveCloud(cloud) + } + }) + } + private fun openDocumentTree() { try { - requestActivityResult( // - ActivityResultCallbacks.pickedLocalStorageLocation(), // - Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - ) + requestActivityResult(ActivityResultCallbacks.pickedLocalStorageLocation(), Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)) } catch (exception: ActivityNotFoundException) { - Toast // - .makeText( // - activity().applicationContext, // - context().getText(R.string.screen_cloud_local_error_no_content_provider), // - Toast.LENGTH_SHORT - ) // - .show() + Toast.makeText(activity().applicationContext, context().getText(R.string.screen_cloud_local_error_no_content_provider), Toast.LENGTH_SHORT).show() Timber.tag("CloudConnListPresenter").e(exception, "No ContentProvider on system") } } @@ -198,14 +258,8 @@ class CloudConnectionListPresenter @Inject constructor( // if (!code.isNullOrEmpty() && !hostname.isNullOrEmpty()) { Timber.tag("CloudConnectionListPresenter").i("PCloud OAuth code successfully retrieved") - - val accessToken = CredentialCryptor // - .getInstance(this.context()) // - .encrypt(code) - val pCloudSkeleton = PCloud.aPCloud() // - .withAccessToken(accessToken) - .withUrl(hostname) - .build(); + val accessToken = CredentialCryptor.getInstance(this.context()).encrypt(code) + val pCloudSkeleton = PCloud.aPCloud().withAccessToken(accessToken).withUrl(hostname).build(); getUsernameUseCase // .withCloud(pCloudSkeleton) // .run(object : DefaultResultHandler() { @@ -226,19 +280,14 @@ class CloudConnectionListPresenter @Inject constructor( // clouds.firstOrNull { (it as PCloud).username() == cloud.username() }?.let { - saveCloud( - PCloud.aCopyOf(it as PCloud) // - .withUrl(cloud.url()) - .withAccessToken(cloud.accessToken()) - .build() - ) + saveCloud(PCloud.aCopyOf(it as PCloud).withUrl(cloud.url()).withAccessToken(cloud.accessToken()).build()) view?.showDialog(PCloudCredentialsUpdatedDialog.newInstance(it.username())) } ?: saveCloud(cloud) } }) } - fun saveCloud(cloud: PCloud) { + fun saveCloud(cloud: Cloud) { addOrChangeCloudConnectionUseCase // .withCloud(cloud) // .run(object : DefaultResultHandler() { @@ -252,15 +301,13 @@ class CloudConnectionListPresenter @Inject constructor( // fun pickedLocalStorageLocation(result: ActivityResult) { val rootTreeUriOfLocalStorage = result.intent().data persistUriPermission(rootTreeUriOfLocalStorage) - addOrChangeCloudConnectionUseCase.withCloud( - LocalStorageCloud.aLocalStorage() // - .withRootUri(rootTreeUriOfLocalStorage.toString()) // - .build() - ).run(object : DefaultResultHandler() { - override fun onSuccess(void: Void?) { - loadCloudList() - } - }) + addOrChangeCloudConnectionUseCase + .withCloud(LocalStorageCloud.aLocalStorage().withRootUri(rootTreeUriOfLocalStorage.toString()).build()) + .run(object : DefaultResultHandler() { + override fun onSuccess(void: Void?) { + loadCloudList() + } + }) } private fun persistUriPermission(rootTreeUriOfLocalStorage: Uri?) { diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt index 9117574b0..79ca7a355 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt @@ -2,6 +2,7 @@ package org.cryptomator.presentation.presenter import org.cryptomator.domain.Cloud import org.cryptomator.domain.LocalStorageCloud +import org.cryptomator.domain.OnedriveCloud import org.cryptomator.domain.PCloud import org.cryptomator.domain.S3Cloud import org.cryptomator.domain.WebDavCloud @@ -18,6 +19,7 @@ import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.CloudTypeModel import org.cryptomator.presentation.model.LocalStorageModel +import org.cryptomator.presentation.model.OnedriveCloudModel import org.cryptomator.presentation.model.PCloudModel import org.cryptomator.presentation.model.S3CloudModel import org.cryptomator.presentation.model.WebDavCloudModel @@ -39,6 +41,7 @@ class CloudSettingsPresenter @Inject constructor( // private val nonSingleLoginClouds: Set = EnumSet.of( // CloudTypeModel.CRYPTO, // CloudTypeModel.LOCAL, // + CloudTypeModel.ONEDRIVE, // CloudTypeModel.PCLOUD, // CloudTypeModel.S3, // CloudTypeModel.WEBDAV @@ -95,6 +98,7 @@ class CloudSettingsPresenter @Inject constructor( // private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String { when (cloudTypeModel) { + CloudTypeModel.ONEDRIVE -> return context().getString(R.string.screen_cloud_settings_onedrive_connections) CloudTypeModel.PCLOUD -> return context().getString(R.string.screen_cloud_settings_pcloud_connections) CloudTypeModel.WEBDAV -> return context().getString(R.string.screen_cloud_settings_webdav_connections) CloudTypeModel.S3 -> return context().getString(R.string.screen_cloud_settings_s3_connections) @@ -130,6 +134,7 @@ class CloudSettingsPresenter @Inject constructor( // .filter { cloud -> !(BuildConfig.FLAVOR == "fdroid" && cloud.cloudType() == CloudTypeModel.GOOGLE_DRIVE) } // .toMutableList() // .also { + it.add(aOnedriveCloud()) it.add(aPCloud()) it.add(aWebdavCloud()) it.add(aS3Cloud()) @@ -138,6 +143,10 @@ class CloudSettingsPresenter @Inject constructor( // view?.render(cloudModel) } + private fun aOnedriveCloud(): OnedriveCloudModel { + return OnedriveCloudModel(OnedriveCloud.aOnedriveCloud().build()) + } + private fun aPCloud(): PCloudModel { return PCloudModel(PCloud.aPCloud().build()) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt index f2cedc793..ea6c6f706 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt @@ -7,6 +7,7 @@ import org.cryptomator.domain.exception.FatalBackendException import org.cryptomator.presentation.R import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.LocalStorageModel +import org.cryptomator.presentation.model.OnedriveCloudModel import org.cryptomator.presentation.model.PCloudModel import org.cryptomator.presentation.model.S3CloudModel import org.cryptomator.presentation.model.WebDavCloudModel @@ -55,6 +56,9 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter { + bindOnedriveCloudModel(cloudModel) + } is WebDavCloudModel -> { bindWebDavCloudModel(cloudModel) } @@ -70,6 +74,12 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_onedrive_connections) CloudTypeModel.PCLOUD -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_pcloud_connections) CloudTypeModel.S3 -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_s3_connections) CloudTypeModel.WEBDAV -> itemView.cloudName.text = context.getString(R.string.screen_cloud_settings_webdav_connections) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt index 6d967b513..ffdc61674 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/bottomsheet/CloudConnectionSettingsBottomSheet.kt @@ -7,6 +7,7 @@ import org.cryptomator.presentation.R import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.CloudTypeModel import org.cryptomator.presentation.model.LocalStorageModel +import org.cryptomator.presentation.model.OnedriveCloudModel import org.cryptomator.presentation.model.PCloudModel import org.cryptomator.presentation.model.S3CloudModel import org.cryptomator.presentation.model.WebDavCloudModel @@ -29,6 +30,7 @@ class CloudConnectionSettingsBottomSheet : BaseBottomSheet bindViewForOnedrive(cloudModel as OnedriveCloudModel) CloudTypeModel.WEBDAV -> bindViewForWebDAV(cloudModel as WebDavCloudModel) CloudTypeModel.PCLOUD -> bindViewForPCloud(cloudModel as PCloudModel) CloudTypeModel.S3 -> bindViewForS3(cloudModel as S3CloudModel) @@ -57,6 +59,11 @@ class CloudConnectionSettingsBottomSheet : BaseBottomSheet @string/screen_settings_cloud_settings_label + OneDrive connections WebDAV connections pCloud connections S3 connections diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index 7e12859bc..f04548498 100644 --- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -9,9 +9,16 @@ import android.widget.Toast import com.dropbox.core.android.Auth import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential import com.google.api.services.drive.DriveScopes -import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory -import org.cryptomator.data.cloud.onedrive.graph.ClientException -import org.cryptomator.data.cloud.onedrive.graph.ICallback +import com.microsoft.identity.client.AuthenticationCallback +import com.microsoft.identity.client.IAccount +import com.microsoft.identity.client.IAuthenticationResult +import com.microsoft.identity.client.IMultipleAccountPublicClientApplication +import com.microsoft.identity.client.IPublicClientApplication +import com.microsoft.identity.client.PublicClientApplication +import com.microsoft.identity.client.exception.MsalClientException +import com.microsoft.identity.client.exception.MsalException +import com.microsoft.identity.client.exception.MsalServiceException +import com.microsoft.identity.client.exception.MsalUiRequiredException import org.cryptomator.data.util.X509CertificateHelper import org.cryptomator.domain.Cloud import org.cryptomator.domain.CloudType @@ -35,7 +42,6 @@ import org.cryptomator.generator.Callback import org.cryptomator.presentation.BuildConfig import org.cryptomator.presentation.R import org.cryptomator.presentation.exception.ExceptionHandlers -import org.cryptomator.presentation.exception.PermissionNotGrantedException import org.cryptomator.presentation.intent.AuthenticateCloudIntent import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.model.CloudModel @@ -151,10 +157,6 @@ class AuthenticateCloudPresenter @Inject constructor( // finish() } - private fun failAuthentication(error: PermissionNotGrantedException) { - finishWithResult(error) - } - private inner class DropboxAuthStrategy : AuthStrategy { private var authenticationStarted = false @@ -271,29 +273,106 @@ class AuthenticateCloudPresenter @Inject constructor( // private fun startAuthentication(cloud: CloudModel) { authenticationStarted = true - val authenticationAdapter = OnedriveClientFactory.getAuthAdapter(context(), (cloud.toCloud() as OnedriveCloud).accessToken()) - authenticationAdapter.login(activity(), object : ICallback { - override fun success(accessToken: String?) { - if (accessToken == null) { - Timber.tag("AuthicateCloudPrester").e("Onedrive access token is empty") + + PublicClientApplication.createMultipleAccountPublicClientApplication( + context(), + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + if (accounts.isEmpty()) { + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } else { + accounts.find { account -> account.username == cloud.username() }?.let { + application.acquireTokenSilentAsync( + onedriveScopes(), + it, + "https://login.microsoftonline.com/common", + getAuthSilentCallback(cloud, application) + ) + } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + failAuthentication(cloud.name()) + } + }) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") failAuthentication(cloud.name()) - } else { - showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION)) - handleAuthenticationResult(cloud, accessToken) + } + }) + } + + private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") + when (e) { + is MsalClientException -> { + /* Exception inside MSAL, more info inside MsalError.java */ + failAuthentication(cloud.name()) + } + is MsalServiceException -> { + /* Exception when communicating with the STS, likely config issue */ + failAuthentication(cloud.name()) + } + is MsalUiRequiredException -> { + /* Tokens expired or no session, retry with interactive */ + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } } } - override fun failure(ex: ClientException) { - Timber.tag("AuthicateCloudPrester").e(ex) + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } + } + } + + private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") failAuthentication(cloud.name()) } - }) + + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } + } } private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { getUsernameAndSuceedAuthentication( // OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(accessToken) // + .withAccessToken(encrypt(accessToken)) // + .build() + ) + } + + private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { + getUsernameAndSuceedAuthentication( // + OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // + .withAccessToken(encrypt(accessToken)) // + .withUsername(username) .build() ) } @@ -558,6 +637,10 @@ class AuthenticateCloudPresenter @Inject constructor( // companion object { const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate" + + fun onedriveScopes(): Array { + return arrayOf("User.Read", "Files.ReadWrite") + } } init { diff --git a/settings.gradle b/settings.gradle index 6398dc179..cf7883a7d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,7 @@ -include ':generator', ':presentation', ':generator-api', ':domain', ':data', ':util', ':msa-auth-for-android', ':pcloud-sdk-java-root', ':pcloud-sdk-java', ':subsampling-image-view' +include ':generator', ':presentation', ':generator-api', ':domain', ':data', ':util', ':pcloud-sdk-java-root', ':pcloud-sdk-java', ':subsampling-image-view' var libFolder = new File(rootDir, 'lib') -project(':msa-auth-for-android').projectDir = file(new File(libFolder, 'msa-auth-for-android')) project(':pcloud-sdk-java-root').projectDir = file(new File(libFolder, 'pcloud-sdk-java')) project(':pcloud-sdk-java').projectDir = file(new File(libFolder, 'pcloud-sdk-java/java-core')) project(':subsampling-image-view').projectDir = file(new File(libFolder, 'subsampling-scale-image-view/library')) From 2613ba5eaea989c6ece6a62efa3733607035922f Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 24 Jan 2022 17:09:46 +0100 Subject: [PATCH 06/35] Fix build -.- --- .../presenter/AuthenticateCloudPresenter.kt | 194 ++++++++++-------- 1 file changed, 107 insertions(+), 87 deletions(-) diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index f8e595d7a..564192ed1 100644 --- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -6,9 +6,16 @@ import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE import android.provider.DocumentsContract import android.widget.Toast import com.dropbox.core.android.Auth -import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory -import org.cryptomator.data.cloud.onedrive.graph.ClientException -import org.cryptomator.data.cloud.onedrive.graph.ICallback +import com.microsoft.identity.client.AuthenticationCallback +import com.microsoft.identity.client.IAccount +import com.microsoft.identity.client.IAuthenticationResult +import com.microsoft.identity.client.IMultipleAccountPublicClientApplication +import com.microsoft.identity.client.IPublicClientApplication +import com.microsoft.identity.client.PublicClientApplication +import com.microsoft.identity.client.exception.MsalClientException +import com.microsoft.identity.client.exception.MsalException +import com.microsoft.identity.client.exception.MsalServiceException +import com.microsoft.identity.client.exception.MsalUiRequiredException import org.cryptomator.data.util.X509CertificateHelper import org.cryptomator.domain.Cloud import org.cryptomator.domain.CloudType @@ -210,112 +217,125 @@ class AuthenticateCloudPresenter @Inject constructor( // } } - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - - PublicClientApplication.createMultipleAccountPublicClientApplication( - context(), - R.raw.auth_config_onedrive, - object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { - override fun onCreated(application: IMultipleAccountPublicClientApplication) { - application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { - override fun onTaskCompleted(accounts: List) { - if (accounts.isEmpty()) { - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } else { - accounts.find { account -> account.username == cloud.username() }?.let { - application.acquireTokenSilentAsync( - onedriveScopes(), - it, - "https://login.microsoftonline.com/common", - getAuthSilentCallback(cloud, application) - ) - } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } - } + private inner class OnedriveAuthStrategy : AuthStrategy { - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") - failAuthentication(cloud.name()) - } - }) - } + private var authenticationStarted = false + override fun supports(cloud: CloudModel): Boolean { + return cloud.cloudType() == CloudTypeModel.ONEDRIVE + } - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") - failAuthentication(cloud.name()) - } - }) - } + override fun resumed(intent: AuthenticateCloudIntent) { + if (!authenticationStarted) { + startAuthentication(intent.cloud()) + } + } - private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { - return object : AuthenticationCallback { + private fun startAuthentication(cloud: CloudModel) { + authenticationStarted = true - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken) - } + PublicClientApplication.createMultipleAccountPublicClientApplication( + context(), + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + if (accounts.isEmpty()) { + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } else { + accounts.find { account -> account.username == cloud.username() }?.let { + application.acquireTokenSilentAsync( + onedriveScopes(), + it, + "https://login.microsoftonline.com/common", + getAuthSilentCallback(cloud, application) + ) + } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } + } - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") - when (e) { - is MsalClientException -> { - /* Exception inside MSAL, more info inside MsalError.java */ - failAuthentication(cloud.name()) + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + failAuthentication(cloud.name()) + } + }) } - is MsalServiceException -> { - /* Exception when communicating with the STS, likely config issue */ + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") failAuthentication(cloud.name()) } - is MsalUiRequiredException -> { - /* Tokens expired or no session, retry with interactive */ - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + }) + } + + private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") + when (e) { + is MsalClientException -> { + /* Exception inside MSAL, more info inside MsalError.java */ + failAuthentication(cloud.name()) + } + is MsalServiceException -> { + /* Exception when communicating with the STS, likely config issue */ + failAuthentication(cloud.name()) + } + is MsalUiRequiredException -> { + /* Tokens expired or no session, retry with interactive */ + application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) + } } } - } - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } } } - } - private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { - return object : AuthenticationCallback { + private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { + return object : AuthenticationCallback { - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) - } + override fun onSuccess(authenticationResult: IAuthenticationResult) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) + } - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") - failAuthentication(cloud.name()) - } + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") + failAuthentication(cloud.name()) + } - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } } } - } - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .build() - ) - } + private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { + getUsernameAndSuceedAuthentication( // + OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // + .withAccessToken(encrypt(accessToken)) // + .build() + ) + } - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .withUsername(username) - .build() - ) + private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { + getUsernameAndSuceedAuthentication( // + OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // + .withAccessToken(encrypt(accessToken)) // + .withUsername(username) + .build() + ) + } } -} private inner class PCloudAuthStrategy : AuthStrategy { From 1d808edd8d7558d8f1e8de11e60a6eca84a5afd5 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 25 Jan 2022 11:45:26 +0100 Subject: [PATCH 07/35] Delete Onedrive cloud only when not set up (#405) --- .../data/db/UpgradeDatabaseTest.kt | 50 ++++++++++++++++++- .../org/cryptomator/data/db/Upgrade10To11.kt | 14 ++++-- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt index a2c19c7fd..108b31a8c 100644 --- a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt +++ b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt @@ -472,7 +472,7 @@ class UpgradeDatabaseTest { } @Test - fun upgrade10To11() { + fun upgrade10To11EmptyOnedriveCloudRemovesCloud() { Upgrade0To1().applyTo(db, 0) Upgrade1To2().applyTo(db, 1) Upgrade2To3(context).applyTo(db, 2) @@ -509,4 +509,52 @@ class UpgradeDatabaseTest { } } + + @Test + fun upgrade10To11UsedOnedriveCloudPreservesCloud() { + Upgrade0To1().applyTo(db, 0) + Upgrade1To2().applyTo(db, 1) + Upgrade2To3(context).applyTo(db, 2) + Upgrade3To4().applyTo(db, 3) + Upgrade4To5().applyTo(db, 4) + Upgrade5To6().applyTo(db, 5) + Upgrade6To7().applyTo(db, 6) + Upgrade7To8().applyTo(db, 7) + Upgrade8To9(sharedPreferencesHandler).applyTo(db, 8) + Upgrade9To10(sharedPreferencesHandler).applyTo(db, 9) + + Sql.insertInto("VAULT_ENTITY") // + .integer("_id", 25) // + .integer("FOLDER_CLOUD_ID", 3) // + .text("FOLDER_PATH", "path") // + .text("FOLDER_NAME", "name") // + .text("CLOUD_TYPE", CloudType.ONEDRIVE.name) // + .text("PASSWORD", "password") // + .integer("POSITION", 10) // + .executeOn(db) + + Sql.query("CLOUD_ENTITY").executeOn(db).use { + while (it.moveToNext()) { + Sql.update("CLOUD_ENTITY") + .where("_id", Sql.eq(3L)) + .set("ACCESS_TOKEN", Sql.toString("Access token 3000")) + .set("USERNAME", Sql.toString("foo@bar.baz")) + .executeOn(db) + } + } + Sql.query("CLOUD_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(3)) + } + + Upgrade10To11().applyTo(db, 10) + + Sql.query("VAULT_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(1)) + } + + Sql.query("CLOUD_ENTITY").executeOn(db).use { + Assert.assertThat(it.count, CoreMatchers.`is`(3)) + } + } + } diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt index dffc9d36d..b143cc3d5 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt @@ -12,14 +12,18 @@ internal class Upgrade10To11 @Inject constructor() : DatabaseUpgrade(10, 11) { override fun internalApplyTo(db: Database, origin: Int) { db.beginTransaction() try { - Sql.deleteFrom("CLOUD_ENTITY") - .where("_id", Sql.eq(onedriveCloudId)) - .where("TYPE", Sql.eq("ONEDRIVE")) - .executeOn(db) - + deleteOnedriveCloudIfNotSetUp(db) db.setTransactionSuccessful() } finally { db.endTransaction() } } + + private fun deleteOnedriveCloudIfNotSetUp(db: Database) { + Sql.deleteFrom("CLOUD_ENTITY") + .where("_id", Sql.eq(onedriveCloudId)) + .where("TYPE", Sql.eq("ONEDRIVE")) + .where("ACCESS_TOKEN", Sql.isNull()) + .executeOn(db) + } } From 4221d299ce6f05decb57798bfec6a2100743338a Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 26 Jan 2022 10:32:55 +0100 Subject: [PATCH 08/35] Update Gradle to version 7.2 --- .idea/misc.xml | 13 +++++++++++-- build.gradle | 2 +- buildsystem/dependencies.gradle | 2 +- data/build.gradle | 17 +++++++++-------- domain/build.gradle | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- presentation/build.gradle | 18 +++++++++--------- util/build.gradle | 17 +++++++++++------ 8 files changed, 46 insertions(+), 31 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 7dccb1654..1d3e3ba73 100755 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,13 @@ + + + - + diff --git a/build.gradle b/build.gradle index 386f17da1..e8063c7f2 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.4' + classpath 'com.android.tools.build:gradle:7.1.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index a12e59f02..db3b501f5 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -19,7 +19,7 @@ allprojects { } ext { - androidBuildToolsVersion = "30.0.2" + androidBuildToolsVersion = "30.0.3" androidMinSdkVersion = 26 androidTargetSdkVersion = 30 androidCompileSdkVersion = 30 diff --git a/data/build.gradle b/data/build.gradle index d401ab6aa..ccc9b45c0 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -28,11 +28,6 @@ android { coreLibraryDesugaringEnabled true } - lintOptions { - quiet true - abortOnError false - ignoreWarnings true - } buildTypes { release { @@ -75,10 +70,16 @@ android { java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/'] } } - packagingOptions { - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/NOTICE.md' + resources { + excludes += ['META-INF/DEPENDENCIES', 'META-INF/NOTICE.md'] + } + } + + lint { + abortOnError false + ignoreWarnings true + quiet true } } diff --git a/domain/build.gradle b/domain/build.gradle index 9bc1cd3f8..ef0b1bc2e 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -26,12 +26,12 @@ android { coreLibraryDesugaringEnabled true } - - lintOptions { - quiet true + lint { abortOnError false ignoreWarnings true + quiet true } + } dependencies { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f80bbf51..ffed3a254 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/presentation/build.gradle b/presentation/build.gradle index 3d63162cd..43b5e91ee 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -39,11 +39,6 @@ android { coreLibraryDesugaringEnabled true } - lintOptions { - quiet true - abortOnError false - ignoreWarnings true - } buildTypes { release { @@ -108,11 +103,16 @@ android { java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/'] } } - packagingOptions { - exclude 'META-INF/jersey-module-version' - exclude 'META-INF/NOTICE.md' - exclude 'META-INF/DEPENDENCIES' + resources { + excludes += ['META-INF/jersey-module-version', 'META-INF/NOTICE.md', 'META-INF/DEPENDENCIES'] + } + } + + lint { + abortOnError false + ignoreWarnings true + quiet true } } diff --git a/util/build.gradle b/util/build.gradle index b2dbdbf01..93407bdda 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -24,15 +24,20 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + packagingOptions { + jniLibs { + pickFirsts += ['META-INF/*'] + } + resources { + pickFirsts += ['META-INF/*'] + } + } - lintOptions { - quiet true + + lint { abortOnError false ignoreWarnings true - } - - packagingOptions { - pickFirst 'META-INF/*' + quiet true } } From e11759b23f2b2cc948f0fbc3c4de6330d3aa062a Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 26 Jan 2022 11:30:21 +0100 Subject: [PATCH 09/35] Bug fixes and cleanup (#405) --- .../cloud/onedrive/OnedriveClientFactory.kt | 46 +++++++++---------- .../OnedriveCloudContentRepository.kt | 1 - .../data/cloud/onedrive/OnedriveImpl.kt | 1 - .../DispatchingCloudContentRepository.kt | 4 +- .../presentation/model/CryptoCloudModel.kt | 2 +- .../presenter/BrowseFilesPresenter.kt | 26 +++++------ 6 files changed, 37 insertions(+), 43 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt index 27ac7cf5d..294f278ad 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt @@ -17,42 +17,42 @@ class OnedriveClientFactory private constructor() { companion object { - fun createInstance(context: Context, token: String?, sharedPreferencesHandler: SharedPreferencesHandler): GraphServiceClient { + fun createInstance(context: Context, encryptedToken: String, sharedPreferencesHandler: SharedPreferencesHandler): GraphServiceClient { val tokenAuthenticationProvider = object : BaseAuthenticationProvider() { + val token = CompletableFuture.completedFuture(CredentialCryptor.getInstance(context).decrypt(encryptedToken)) override fun getAuthorizationTokenAsync(requestUrl: URL): CompletableFuture { return if (shouldAuthenticateRequestWithUrl(requestUrl)) { - val decryptedToken = CredentialCryptor.getInstance(context).decrypt(token) - CompletableFuture.completedFuture(decryptedToken) + token } else { CompletableFuture.completedFuture(null) } } } - return GraphServiceClient // - .builder() // - .authenticationProvider(tokenAuthenticationProvider) // - .logger(object : ILogger { - override fun getLoggingLevel(): LoggerLevel { - return if(sharedPreferencesHandler.debugMode()) { - LoggerLevel.DEBUG - } else { - LoggerLevel.ERROR - } + val logger = object : ILogger { + override fun getLoggingLevel(): LoggerLevel { + return if(sharedPreferencesHandler.debugMode()) { + LoggerLevel.DEBUG + } else { + LoggerLevel.ERROR } + } - override fun logDebug(message: String) { - Timber.tag("OnedriveClientFactory").d(message) - } + override fun logDebug(message: String) { + Timber.tag("OnedriveClientFactory").d(message) + } - override fun logError(message: String, throwable: Throwable?) { - Timber.tag("OnedriveClientFactory").e(throwable, message) - } + override fun logError(message: String, throwable: Throwable?) { + Timber.tag("OnedriveClientFactory").e(throwable, message) + } - override fun setLoggingLevel(level: LoggerLevel) { - TODO("Not yet implemented") // FIXME - } - }) + override fun setLoggingLevel(level: LoggerLevel) {} + } + + return GraphServiceClient // + .builder() // + .authenticationProvider(tokenAuthenticationProvider) // + .logger(logger) .buildClient() } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt index 4c91ad332..2832a50d0 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt @@ -42,7 +42,6 @@ internal class OnedriveCloudContentRepository(private val cloud: OnedriveCloud, private fun throwWrongCredentialsExceptionIfRequired(e: Exception) { if (isAuthenticationError(e)) { - logout(cloud) throw WrongCredentialsException(cloud) } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt index 116f3ffa5..b77eab342 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt @@ -40,7 +40,6 @@ import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache import java.io.File import java.io.IOException import java.io.OutputStream -import java.util.ArrayList import java.util.Date import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutionException diff --git a/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt index 602c0cd0f..85e5e5fd5 100644 --- a/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt @@ -219,9 +219,9 @@ class DispatchingCloudContentRepository @Inject constructor( } private fun delegateFor(cloud: Cloud): CloudContentRepository { - return delegates.getOrPut(cloud, { + return delegates.getOrPut(cloud) { createCloudContentRepositoryFor(cloud) - }) + } } private fun createCloudContentRepositoryFor(cloud: Cloud): CloudContentRepository { diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/CryptoCloudModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/CryptoCloudModel.kt index edde63124..83744b92a 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/CryptoCloudModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/CryptoCloudModel.kt @@ -11,7 +11,7 @@ class CryptoCloudModel(cloud: Cloud) : CloudModel(cloud) { throw IllegalStateException("Should not be invoked") } - override fun username(): String? { + override fun username(): String { return "" } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index 391d30a9e..e3bdf105e 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -49,7 +49,6 @@ import org.cryptomator.presentation.intent.IntentBuilder import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.model.CloudFileModel import org.cryptomator.presentation.model.CloudFolderModel -import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.CloudNodeModel import org.cryptomator.presentation.model.ImagePreviewFilesStore import org.cryptomator.presentation.model.ProgressModel @@ -224,10 +223,7 @@ class BrowseFilesPresenter @Inject constructor( // @Callback fun getCloudListAfterAuthentication(result: ActivityResult, cloudFolderModel: CloudFolderModel) { - val cloudModel = result.getSingleResult(CloudModel::class.java) - cloudFolderModel.toCloudNode().withCloud(cloudModel.toCloud())?.let { - getCloudList(cloudFolderModelMapper.toModel(it)) - } ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null") + getCloudList(cloudFolderModel) } fun onCreateFolderPressed(cloudFolder: CloudFolderModel, folderName: String?) { @@ -245,16 +241,16 @@ class BrowseFilesPresenter @Inject constructor( // private fun copyFile(downloadFiles: List) { downloadFiles.forEach { downloadFile -> try { - val source = FileInputStream(fileUtil.fileFor(cloudFileModelMapper.toModel(downloadFile.downloadFile))) - - copyDataUseCase // - .withSource(source) // - .andTarget(downloadFile.dataSink) // - .run(object : DefaultResultHandler() { - override fun onFinished() { - view?.showMessage(R.string.screen_file_browser_msg_file_exported) - } - }) + FileInputStream(fileUtil.fileFor(cloudFileModelMapper.toModel(downloadFile.downloadFile))).use { + copyDataUseCase // + .withSource(it) // + .andTarget(downloadFile.dataSink) // + .run(object : DefaultResultHandler() { + override fun onFinished() { + view?.showMessage(R.string.screen_file_browser_msg_file_exported) + } + }) + } } catch (e: FileNotFoundException) { showError(e) } From 11f5a617898736d3a52037e339eb6aa0bd0ccd3f Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 26 Jan 2022 16:02:29 +0100 Subject: [PATCH 10/35] Fix listing when credential changed in background due to auth problem E.g. the token is expired and was refreshed --- .../data/cloud/crypto/CryptoCloud.java | 2 +- .../presenter/BrowseFilesPresenter.kt | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java index eeadb1358..7dc116cdc 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java @@ -8,7 +8,7 @@ public class CryptoCloud implements Cloud { private final Vault vault; - CryptoCloud(Vault vault) { + public CryptoCloud(Vault vault) { this.vault = vault; } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index e3bdf105e..c54568414 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -6,9 +6,12 @@ import android.content.Intent import android.net.Uri import android.provider.DocumentsContract import android.widget.Toast +import org.cryptomator.data.cloud.crypto.CryptoCloud +import org.cryptomator.data.cloud.crypto.CryptoFolder import org.cryptomator.domain.CloudFile import org.cryptomator.domain.CloudFolder import org.cryptomator.domain.CloudNode +import org.cryptomator.domain.Vault import org.cryptomator.domain.di.PerView import org.cryptomator.domain.exception.CloudNodeAlreadyExistsException import org.cryptomator.domain.exception.EmptyDirFileException @@ -49,6 +52,7 @@ import org.cryptomator.presentation.intent.IntentBuilder import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.model.CloudFileModel import org.cryptomator.presentation.model.CloudFolderModel +import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.CloudNodeModel import org.cryptomator.presentation.model.ImagePreviewFilesStore import org.cryptomator.presentation.model.ProgressModel @@ -223,7 +227,18 @@ class BrowseFilesPresenter @Inject constructor( // @Callback fun getCloudListAfterAuthentication(result: ActivityResult, cloudFolderModel: CloudFolderModel) { - getCloudList(cloudFolderModel) + val cloudModel = result.getSingleResult(CloudModel::class.java) + val cloudNode = cloudFolderModel.toCloudNode() + + val updatedCloud = if (cloudNode is CryptoFolder) { + CryptoCloud(Vault.aCopyOf(cloudFolderModel.vault()?.toVault()).withCloud(cloudModel.toCloud()).build()) + } else { + cloudModel.toCloud() + } + + cloudNode.withCloud(updatedCloud)?.let { + getCloudList(cloudFolderModelMapper.toModel(it)) + } ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null") } fun onCreateFolderPressed(cloudFolder: CloudFolderModel, folderName: String?) { From db050e04f096b78103feb3117c3d3ab63b0ac89c Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 28 Jan 2022 17:38:53 +0100 Subject: [PATCH 11/35] Update folder in the BrowseFilesFragment too when credentials changed --- .../presentation/presenter/BrowseFilesPresenter.kt | 4 +++- .../presentation/ui/activity/BrowseFilesActivity.kt | 5 ++++- .../presentation/ui/activity/view/BrowseFilesView.kt | 1 + .../presentation/ui/fragment/BrowseFilesFragment.kt | 6 ++++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index c54568414..790822055 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -237,7 +237,9 @@ class BrowseFilesPresenter @Inject constructor( // } cloudNode.withCloud(updatedCloud)?.let { - getCloudList(cloudFolderModelMapper.toModel(it)) + val folder = cloudFolderModelMapper.toModel(it) + view?.updateActiveFolderDueToAuthenticationProblem(folder) + getCloudList(folder) } ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null") } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt index 29c8e9496..bd49f2d21 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt @@ -50,7 +50,6 @@ import org.cryptomator.presentation.ui.dialog.ReplaceDialog import org.cryptomator.presentation.ui.dialog.SymLinkDialog import org.cryptomator.presentation.ui.dialog.UploadCloudFileDialog import org.cryptomator.presentation.ui.fragment.BrowseFilesFragment -import java.util.ArrayList import java.util.regex.Pattern import javax.inject.Inject import kotlinx.android.synthetic.main.toolbar_layout.toolbar @@ -615,6 +614,10 @@ class BrowseFilesActivity : BaseActivity(), // showDialog(NoDirFileDialog.newInstance(cryptoFolderName, cloudFolderPath)) } + override fun updateActiveFolderDueToAuthenticationProblem(folder: CloudFolderModel) { + browseFilesFragment().folder = folder + } + override fun navigateFolderBackBecauseSymlink() { onBackPressed() } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt index 3adac8502..11beedce3 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/BrowseFilesView.kt @@ -35,5 +35,6 @@ interface BrowseFilesView : View { fun disableSelectionMode() fun showSymLinkDialog() fun showNoDirFileDialog(cryptoFolderName: String, cloudFolderPath: String) + fun updateActiveFolderDueToAuthenticationProblem(folder: CloudFolderModel) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/BrowseFilesFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/BrowseFilesFragment.kt index e6c6c3ecc..6a98cd7ed 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/BrowseFilesFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/BrowseFilesFragment.kt @@ -26,7 +26,6 @@ import org.cryptomator.presentation.model.ProgressModel import org.cryptomator.presentation.presenter.BrowseFilesPresenter import org.cryptomator.presentation.ui.adapter.BrowseFilesAdapter import org.cryptomator.presentation.util.ResourceHelper.Companion.getPixelOffset -import java.util.Comparator import java.util.Optional import javax.inject.Inject import kotlinx.android.synthetic.main.floating_action_button_layout.floatingActionButton @@ -51,8 +50,11 @@ class BrowseFilesFragment : BaseFragment() { private var filterText: String = "" - val folder: CloudFolderModel + var folder: CloudFolderModel get() = requireArguments().getSerializable(ARG_FOLDER) as CloudFolderModel + set(updatedFolder) { + arguments?.putSerializable(ARG_FOLDER, updatedFolder) + } private val chooseCloudNodeSettings: ChooseCloudNodeSettings? get() = requireArguments().getSerializable(ARG_CHOOSE_CLOUD_NODE_SETTINGS) as ChooseCloudNodeSettings? From f586e447f5acca26fe3fc915254438b5ae0d69d8 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 28 Jan 2022 18:20:41 +0100 Subject: [PATCH 12/35] Show notification when Onedrive authentication starts --- presentation/src/main/res/values/strings.xml | 2 ++ .../presentation/presenter/AuthenticateCloudPresenter.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 77d6a204b..03d574f8c 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -547,6 +547,8 @@ Latest version installed + Authenticating… + Cache @string/screen_settings_section_auto_photo_upload_toggle Cache recently accessed files encrypted locally on the device for later reuse when reopened diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index f04548498..f84f0af1c 100644 --- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -274,6 +274,8 @@ class AuthenticateCloudPresenter @Inject constructor( // private fun startAuthentication(cloud: CloudModel) { authenticationStarted = true + Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show() + PublicClientApplication.createMultipleAccountPublicClientApplication( context(), R.raw.auth_config_onedrive, From 022e42b8c8014238af8307e2f47d5d8177967160 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 28 Jan 2022 18:23:33 +0100 Subject: [PATCH 13/35] Remove build warnings --- build.gradle | 3 --- data/build.gradle | 2 -- domain/build.gradle | 2 -- util/build.gradle | 2 -- 4 files changed, 9 deletions(-) diff --git a/build.gradle b/build.gradle index e8063c7f2..d3ef45a8f 100644 --- a/build.gradle +++ b/build.gradle @@ -46,9 +46,6 @@ allprojects { maven { url "https://maven.google.com" } - flatDir { - dirs '../libs' - } google() } } diff --git a/data/build.gradle b/data/build.gradle index ccc9b45c0..6bfed5437 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -4,8 +4,6 @@ apply plugin: 'kotlin-android' apply plugin: 'de.mannodermaus.android-junit5' android { - defaultPublishConfig "debug" - def globalConfiguration = rootProject.extensions.getByName("ext") compileSdkVersion globalConfiguration["androidCompileSdkVersion"] diff --git a/domain/build.gradle b/domain/build.gradle index ef0b1bc2e..6279e6522 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -3,8 +3,6 @@ apply plugin: 'kotlin-android' apply plugin: 'de.mannodermaus.android-junit5' android { - defaultPublishConfig "debug" - def globalConfiguration = rootProject.extensions.getByName("ext") compileSdkVersion globalConfiguration["androidCompileSdkVersion"] diff --git a/util/build.gradle b/util/build.gradle index 93407bdda..ab081d0bb 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -3,8 +3,6 @@ apply plugin: 'kotlin-android' apply plugin: 'de.mannodermaus.android-junit5' android { - defaultPublishConfig "debug" - def globalConfiguration = rootProject.extensions.getByName("ext") compileSdkVersion globalConfiguration["androidCompileSdkVersion"] From d93624c5dd93bdbb947d645187c1a5b0fed34c1b Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Thu, 3 Feb 2022 22:37:03 +0100 Subject: [PATCH 14/35] Fix race condition when AuthActivity finished and resumes BrowseFiles CloudList gets refreshed and token is updated, if the token update is faster, resuming overwrites the delegates in DispatchingCloudContentRepository again due to authentication fail because the old folder is used in the onFolderReloadContent because folder in BrowseFilesActivity isn't yet updated. --- .../data/cloud/crypto/CryptoCloud.java | 2 +- .../domain/usecases/vault/ReloadVault.java | 24 --------- .../presenter/BrowseFilesPresenter.kt | 49 ++++++++++++++----- 3 files changed, 39 insertions(+), 36 deletions(-) delete mode 100644 domain/src/main/java/org/cryptomator/domain/usecases/vault/ReloadVault.java diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java index 7dc116cdc..eeadb1358 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloud.java @@ -8,7 +8,7 @@ public class CryptoCloud implements Cloud { private final Vault vault; - public CryptoCloud(Vault vault) { + CryptoCloud(Vault vault) { this.vault = vault; } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/ReloadVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/ReloadVault.java deleted file mode 100644 index 55196adaf..000000000 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/ReloadVault.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.cryptomator.domain.usecases.vault; - -import org.cryptomator.domain.Vault; -import org.cryptomator.domain.exception.BackendException; -import org.cryptomator.domain.repository.VaultRepository; -import org.cryptomator.generator.Parameter; -import org.cryptomator.generator.UseCase; - -@UseCase -class ReloadVault { - - private final VaultRepository vaultRepository; - private final Vault vault; - - public ReloadVault(VaultRepository vaultRepository, @Parameter Vault vault) { - this.vaultRepository = vaultRepository; - this.vault = vault; - } - - public Vault execute() throws BackendException { - return vaultRepository.load(vault.getId()); - } - -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index 790822055..fffe28096 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -6,8 +6,8 @@ import android.content.Intent import android.net.Uri import android.provider.DocumentsContract import android.widget.Toast -import org.cryptomator.data.cloud.crypto.CryptoCloud import org.cryptomator.data.cloud.crypto.CryptoFolder +import org.cryptomator.domain.Cloud import org.cryptomator.domain.CloudFile import org.cryptomator.domain.CloudFolder import org.cryptomator.domain.CloudNode @@ -23,6 +23,7 @@ import org.cryptomator.domain.usecases.CloudFolderRecursiveListing import org.cryptomator.domain.usecases.CloudNodeRecursiveListing import org.cryptomator.domain.usecases.CopyDataUseCase import org.cryptomator.domain.usecases.DownloadFile +import org.cryptomator.domain.usecases.GetDecryptedCloudForVaultUseCase import org.cryptomator.domain.usecases.ResultRenamed import org.cryptomator.domain.usecases.cloud.CreateFolderUseCase import org.cryptomator.domain.usecases.cloud.DeleteNodesUseCase @@ -110,6 +111,7 @@ class BrowseFilesPresenter @Inject constructor( // private val moveFilesUseCase: MoveFilesUseCase, // private val moveFoldersUseCase: MoveFoldersUseCase, // private val getCloudListRecursiveUseCase: GetCloudListRecursiveUseCase, // + private val getDecryptedCloudForVaultUseCase: GetDecryptedCloudForVaultUseCase, // private val contentResolverUtil: ContentResolverUtil, // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, // @@ -132,6 +134,8 @@ class BrowseFilesPresenter @Inject constructor( // private lateinit var existingFilesForUpload: MutableMap private lateinit var downloadFiles: MutableList + private var resumedAfterAuthentication = false + @InjectIntent lateinit var intent: BrowseFilesIntent @@ -206,6 +210,7 @@ class BrowseFilesPresenter @Inject constructor( // view?.showLoading(false) when { authenticationExceptionHandler.handleAuthenticationException(this@BrowseFilesPresenter, e, ActivityResultCallbacks.getCloudListAfterAuthentication(cloudFolderModel)) -> { + resumedAfterAuthentication = true return } e is EmptyDirFileException -> { @@ -225,24 +230,42 @@ class BrowseFilesPresenter @Inject constructor( // }) } - @Callback + @Callback(dispatchResultOkOnly = false) fun getCloudListAfterAuthentication(result: ActivityResult, cloudFolderModel: CloudFolderModel) { - val cloudModel = result.getSingleResult(CloudModel::class.java) - val cloudNode = cloudFolderModel.toCloudNode() - - val updatedCloud = if (cloudNode is CryptoFolder) { - CryptoCloud(Vault.aCopyOf(cloudFolderModel.vault()?.toVault()).withCloud(cloudModel.toCloud()).build()) + resumedAfterAuthentication = false + if(result.isResultOk) { + val cloudModel = result.getSingleResult(CloudModel::class.java) // FIXME update other vaults using this cloud as well + val cloudNode = cloudFolderModel.toCloudNode() + if (cloudNode is CryptoFolder) { + updatedDecryptedCloudFor(Vault.aCopyOf(cloudFolderModel.vault()!!.toVault()).withCloud(cloudModel.toCloud()).build(), cloudFolderModel) + } else { + updatePlaintextCloud(cloudFolderModel, cloudModel) + } } else { - cloudModel.toCloud() + Timber.tag("BrowseFilesPresenter").e("Authentication failed") } + } - cloudNode.withCloud(updatedCloud)?.let { + private fun updatePlaintextCloud(cloudFolderModel: CloudFolderModel, updatedCloud: CloudModel) { + cloudFolderModel.toCloudNode().withCloud(updatedCloud.toCloud())?.let { val folder = cloudFolderModelMapper.toModel(it) view?.updateActiveFolderDueToAuthenticationProblem(folder) getCloudList(folder) } ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null") } + private fun updatedDecryptedCloudFor(vault: Vault, cloudFolderModel: CloudFolderModel) { + getDecryptedCloudForVaultUseCase // + .withVault(vault) // + .run(object : DefaultResultHandler() { + override fun onSuccess(cloud: Cloud) { + val folder = cloudFolderModelMapper.toModel(cloudFolderModel.toCloudNode().withCloud(cloud)!!) + view?.updateActiveFolderDueToAuthenticationProblem(folder) + getCloudList(folder) + } + }) + } + fun onCreateFolderPressed(cloudFolder: CloudFolderModel, folderName: String?) { createFolderUseCase // .withParent(cloudFolder.toCloudNode()) // @@ -1128,7 +1151,9 @@ class BrowseFilesPresenter @Inject constructor( // } fun onFolderReloadContent(folder: CloudFolderModel) { - getCloudList(folder) + if(!resumedAfterAuthentication) { + getCloudList(folder) + } } fun onExportFolderClicked(cloudFolder: CloudFolderModel, exportTriggeredByUser: ExportOperation) { @@ -1262,6 +1287,7 @@ class BrowseFilesPresenter @Inject constructor( // companion object { const val OPEN_FILE_FINISHED = 12 + val EXPORT_AFTER_APP_CHOOSER: ExportOperation = object : ExportOperation { override fun export(presenter: BrowseFilesPresenter, downloadFiles: List) { presenter.copyFile(downloadFiles) @@ -1285,7 +1311,8 @@ class BrowseFilesPresenter @Inject constructor( // renameFolderUseCase, // copyDataUseCase, // moveFilesUseCase, // - moveFoldersUseCase + moveFoldersUseCase, // + getDecryptedCloudForVaultUseCase ) this.authenticationExceptionHandler = authenticationExceptionHandler } From f10ac8798a08242363ae879779e13f3dc7bf5917 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 4 Feb 2022 15:45:59 +0100 Subject: [PATCH 15/35] Show specific message if the server doesn't support WebDAV Fix wrong exception exposed --- .../java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt | 8 +++++++- .../network/ServerNotWebdavCompatibleException.java | 7 +++++++ .../cryptomator/data/cloud/webdav/network/WebDavClient.kt | 2 -- .../exception/ServerNotWebdavCompatibleException.java | 5 ----- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 data/src/main/java/org/cryptomator/data/cloud/webdav/network/ServerNotWebdavCompatibleException.java delete mode 100644 domain/src/main/java/org/cryptomator/domain/exception/ServerNotWebdavCompatibleException.java diff --git a/data/src/main/java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt index f8b66e753..368783319 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt @@ -2,6 +2,7 @@ package org.cryptomator.data.cloud.webdav import android.content.Context import org.cryptomator.data.cloud.webdav.network.ConnectionHandlerHandlerImpl +import org.cryptomator.data.cloud.webdav.network.ServerNotWebdavCompatibleException import org.cryptomator.data.util.CopyStream import org.cryptomator.data.util.TransferredBytesAwareInputStream import org.cryptomator.data.util.TransferredBytesAwareOutputStream @@ -14,6 +15,7 @@ import org.cryptomator.domain.exception.FatalBackendException import org.cryptomator.domain.exception.NotFoundException import org.cryptomator.domain.exception.ParentFolderDoesNotExistException import org.cryptomator.domain.exception.ParentFolderIsNullException +import org.cryptomator.domain.exception.authentication.WebDavNotSupportedException import org.cryptomator.domain.usecases.ProgressAware import org.cryptomator.domain.usecases.cloud.DataSource import org.cryptomator.domain.usecases.cloud.DownloadState @@ -142,7 +144,11 @@ internal class WebDavImpl(private val cloud: WebDavCloud, private val connection @Throws(BackendException::class) fun checkAuthenticationAndServerCompatibility(url: String) { - connectionHandler.checkAuthenticationAndServerCompatibility(url) + try { + connectionHandler.checkAuthenticationAndServerCompatibility(url) + } catch (ex: ServerNotWebdavCompatibleException) { + throw WebDavNotSupportedException(cloud) + } } @Throws(BackendException::class, IOException::class) diff --git a/data/src/main/java/org/cryptomator/data/cloud/webdav/network/ServerNotWebdavCompatibleException.java b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/ServerNotWebdavCompatibleException.java new file mode 100644 index 000000000..9d54ff0f8 --- /dev/null +++ b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/ServerNotWebdavCompatibleException.java @@ -0,0 +1,7 @@ +package org.cryptomator.data.cloud.webdav.network; + +import org.cryptomator.domain.exception.BackendException; + +public class ServerNotWebdavCompatibleException extends BackendException { + +} diff --git a/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavClient.kt b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavClient.kt index 7bb6bd4c9..620412335 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavClient.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavClient.kt @@ -10,7 +10,6 @@ import org.cryptomator.domain.exception.FatalBackendException import org.cryptomator.domain.exception.ForbiddenException import org.cryptomator.domain.exception.NotFoundException import org.cryptomator.domain.exception.ParentFolderDoesNotExistException -import org.cryptomator.domain.exception.ServerNotWebdavCompatibleException import org.cryptomator.domain.exception.TypeMismatchException import org.cryptomator.domain.exception.UnauthorizedException import org.xmlpull.v1.XmlPullParserException @@ -18,7 +17,6 @@ import java.io.ByteArrayInputStream import java.io.IOException import java.io.InputStream import java.net.HttpURLConnection -import java.util.ArrayList import java.util.Collections import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.Request diff --git a/domain/src/main/java/org/cryptomator/domain/exception/ServerNotWebdavCompatibleException.java b/domain/src/main/java/org/cryptomator/domain/exception/ServerNotWebdavCompatibleException.java deleted file mode 100644 index 60287ac66..000000000 --- a/domain/src/main/java/org/cryptomator/domain/exception/ServerNotWebdavCompatibleException.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.cryptomator.domain.exception; - -public class ServerNotWebdavCompatibleException extends BackendException { - -} From 00bc4e4e3553fa11c9471bbe8a7d686fd3336d47 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 4 Feb 2022 18:57:31 +0100 Subject: [PATCH 16/35] Fix race condition when AuthActivity finished and resumes BrowseFiles Callback method is executed before races against onStart of the Fragment so the fix of d93624c5dd93bdbb947d645187c1a5b0fed34c1b doesn't always help. --- .../presentation/presenter/BrowseFilesPresenter.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index fffe28096..9ff476f80 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -232,7 +232,6 @@ class BrowseFilesPresenter @Inject constructor( // @Callback(dispatchResultOkOnly = false) fun getCloudListAfterAuthentication(result: ActivityResult, cloudFolderModel: CloudFolderModel) { - resumedAfterAuthentication = false if(result.isResultOk) { val cloudModel = result.getSingleResult(CloudModel::class.java) // FIXME update other vaults using this cloud as well val cloudNode = cloudFolderModel.toCloudNode() @@ -251,6 +250,7 @@ class BrowseFilesPresenter @Inject constructor( // val folder = cloudFolderModelMapper.toModel(it) view?.updateActiveFolderDueToAuthenticationProblem(folder) getCloudList(folder) + resumedAfterAuthentication = false } ?: throw FatalBackendException("cloudFolderModel with updated Cloud shouldn't be null") } @@ -263,6 +263,9 @@ class BrowseFilesPresenter @Inject constructor( // view?.updateActiveFolderDueToAuthenticationProblem(folder) getCloudList(folder) } + override fun onFinished() { + resumedAfterAuthentication = false + } }) } From b753ec4c01e4bf837cbf40de337e1b09f8ce15e5 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 8 Feb 2022 14:58:49 +0100 Subject: [PATCH 17/35] Reduce connection timeouts from two to one minute --- .../main/java/org/cryptomator/data/util/NetworkTimeout.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/util/NetworkTimeout.kt b/data/src/main/java/org/cryptomator/data/util/NetworkTimeout.kt index 808600b36..9bcbb832a 100644 --- a/data/src/main/java/org/cryptomator/data/util/NetworkTimeout.kt +++ b/data/src/main/java/org/cryptomator/data/util/NetworkTimeout.kt @@ -3,9 +3,9 @@ package org.cryptomator.data.util import java.util.concurrent.TimeUnit enum class NetworkTimeout(val timeout: Long, val unit: TimeUnit) { - CONNECTION(2L, TimeUnit.MINUTES), // - READ(2L, TimeUnit.MINUTES), // - WRITE(2L, TimeUnit.MINUTES); + CONNECTION(1L, TimeUnit.MINUTES), // + READ(1L, TimeUnit.MINUTES), // + WRITE(1L, TimeUnit.MINUTES); fun asMilliseconds(): Long { return unit.toMillis(timeout) From a651b273fb9c766c759c9957e7b25f3af893c838 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Thu, 10 Feb 2022 15:23:48 +0100 Subject: [PATCH 18/35] Add access to shortcuts of folders in Google Drive Workaround for #411 ("Shared with me") #363 ("Computers") and #354 ("Shared drives") --- .../googledrive/GoogleDriveCloudNodeFactory.kt | 18 ++++++++++++++---- .../data/cloud/googledrive/GoogleDriveImpl.kt | 7 ++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt index a78d7751a..f6cab838d 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt @@ -38,10 +38,16 @@ internal object GoogleDriveCloudNodeFactory { } fun from(parent: GoogleDriveFolder, file: File): GoogleDriveNode { - return if (isFolder(file)) { - folder(parent, file) - } else { - file(parent, file) + return when { + isFolder(file) -> { + folder(parent, file) + } + isShortcutFolder(file) -> { + folder(parent, file.name, getNodePath(parent, file.name), file.shortcutDetails.targetId) + } + else -> { + file(parent, file) + } } } @@ -49,6 +55,10 @@ internal object GoogleDriveCloudNodeFactory { return file.mimeType == "application/vnd.google-apps.folder" } + fun isShortcutFolder(file: File): Boolean { + return file.mimeType == "application/vnd.google-apps.shortcut" && file.shortcutDetails.targetMimeType == "application/vnd.google-apps.folder" + } + fun getNodePath(parent: GoogleDriveFolder, name: String): String { return parent.path + "/" + name } diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt index fe0213687..0f3cb14e4 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt @@ -25,7 +25,6 @@ import org.cryptomator.util.file.LruFileCacheUtil import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache import java.io.IOException import java.io.OutputStream -import java.util.ArrayList import timber.log.Timber internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCloud, idCache: GoogleDriveIdCache) { @@ -57,7 +56,7 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl @Throws(IOException::class) private fun findFile(parentDriveId: String?, name: String): File? { - val fileListQuery = client().files().list().setFields("files(id,mimeType,name,size)") + val fileListQuery = client().files().list().setFields("files(id,mimeType,name,size,shortcutDetails)") fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false" return fileListQuery.execute().files.firstOrNull { it.name == name } } @@ -99,6 +98,8 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl folder?.let { if (GoogleDriveCloudNodeFactory.isFolder(it)) { return idCache.cache(GoogleDriveCloudNodeFactory.folder(parent, it)) + } else if(GoogleDriveCloudNodeFactory.isShortcutFolder(it)) { + return idCache.cache(GoogleDriveCloudNodeFactory.folder(parent, name, path, it.shortcutDetails.targetId)) } } @@ -127,7 +128,7 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl val fileListQuery = client() // .files() // .list() // - .setFields("nextPageToken,files(id,mimeType,modifiedTime,name,size)") // + .setFields("nextPageToken,files(id,mimeType,modifiedTime,name,size,shortcutDetails)") // .setPageSize(1000) // .setPageToken(pageToken) fileListQuery.q = "'" + folder.driveId + "' in parents and trashed = false" From d9801662dd6c3277baeca54641207efbda6deb29 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 11 Feb 2022 12:11:21 +0100 Subject: [PATCH 19/35] Close buffer and null-check response body --- .../repository/UpdateCheckRepositoryImpl.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/repository/UpdateCheckRepositoryImpl.java b/data/src/main/java/org/cryptomator/data/repository/UpdateCheckRepositoryImpl.java index 048a18fff..b768ad661 100644 --- a/data/src/main/java/org/cryptomator/data/repository/UpdateCheckRepositoryImpl.java +++ b/data/src/main/java/org/cryptomator/data/repository/UpdateCheckRepositoryImpl.java @@ -38,6 +38,7 @@ import okhttp3.Request; import okhttp3.Response; import okio.BufferedSink; +import okio.BufferedSource; import okio.Okio; @Singleton @@ -112,20 +113,20 @@ public void update(File file) throws GeneralUpdateErrorException { final Response response = httpClient.newCall(request).execute(); - if (response.isSuccessful()) { - final BufferedSink sink = Okio.buffer(Okio.sink(file)); - sink.writeAll(response.body().source()); - sink.flush(); - sink.close(); + if (response.isSuccessful() && response.body() != null) { + try (BufferedSource source = response.body().source(); BufferedSink sink = Okio.buffer(Okio.sink(file))) { + sink.writeAll(source); + sink.flush(); - String apkSha256 = calculateSha256(file); + String apkSha256 = calculateSha256(file); - if (!apkSha256.equals(entity.getApkSha256())) { - file.delete(); - throw new HashMismatchUpdateCheckException(String.format( // - "Sha of calculated hash (%s) doesn't match the specified one (%s)", // - apkSha256, // - entity.getApkSha256())); + if (!apkSha256.equals(entity.getApkSha256())) { + file.delete(); + throw new HashMismatchUpdateCheckException(String.format( // + "Sha of calculated hash (%s) doesn't match the specified one (%s)", // + apkSha256, // + entity.getApkSha256())); + } } } else { throw new GeneralUpdateErrorException("Failed to load update file, status code is not correct: " + response.code()); @@ -174,7 +175,7 @@ private UpdateCheck loadUpdateStatus(LatestVersion latestVersion) throws Backend } private LatestVersion toLatestVersion(Response response) throws IOException, GeneralUpdateErrorException { - if (response.isSuccessful()) { + if (response.isSuccessful() && response.body() != null) { return new LatestVersion(response.body().string()); } else { throw new GeneralUpdateErrorException("Failed to update. Wrong status code in response from server: " + response.code()); @@ -182,7 +183,7 @@ private LatestVersion toLatestVersion(Response response) throws IOException, Gen } private UpdateCheck toUpdateCheck(Response response, LatestVersion latestVersion) throws IOException, GeneralUpdateErrorException { - if (response.isSuccessful()) { + if (response.isSuccessful() && response.body() != null) { final String releaseNote = response.body().string(); return new UpdateCheckImpl(releaseNote, latestVersion); } else { From 017ab520a219726318cefa4b8f2bb95d73197d92 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sat, 12 Feb 2022 22:22:00 +0100 Subject: [PATCH 20/35] Preserve Cryptors of the same cloud if the cloud gets updated If e.g. a cloud gets updated during token refresh while browsing files we authenticate, save the updated cloud, update the vault and now no longer lock other vaults from the same cloud but update them too. --- .../crypto/CryptoCloudContentRepositoryFactory.java | 9 +++++++++ .../org/cryptomator/data/cloud/crypto/Cryptors.kt | 11 +++++++++++ .../data/repository/CloudRepositoryImpl.java | 2 +- .../repository/DispatchingCloudContentRepository.kt | 10 ++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepositoryFactory.java b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepositoryFactory.java index 50c53d371..eb6bcaf06 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepositoryFactory.java +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepositoryFactory.java @@ -78,4 +78,13 @@ void registerCryptor(Vault vault, Cryptor cryptor) { throw new IllegalStateException(format("Cryptor already registered for vault %s", vault)); } } + + public void updateCloudInCryptor(Vault vault, Cloud cloud) { + try { + Cryptor cryptor = cryptors.get(vault).get(); + cryptors.replace(vault, Vault.aCopyOf(vault).withCloud(cloud).build(), cryptor); + } catch (MissingCryptorException e) { + // no-op + } + } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/Cryptors.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/Cryptors.kt index 485c50785..9e6040fbf 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/Cryptors.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/Cryptors.kt @@ -20,6 +20,8 @@ abstract class Cryptors internal constructor() { abstract fun putIfAbsent(vault: Vault, cryptor: Cryptor): Boolean + abstract fun replace(old: Vault, updated: Vault, cryptor: Cryptor) + class Delegating : Cryptors() { private val fallback = Default() @@ -65,6 +67,10 @@ abstract class Cryptors internal constructor() { return delegate().putIfAbsent(vault, cryptor) } + override fun replace(old: Vault, updated: Vault, cryptor: Cryptor) { + return delegate().replace(old, updated, cryptor) + } + @Synchronized private fun delegate(): Cryptors { return delegate ?: fallback @@ -108,6 +114,11 @@ abstract class Cryptors internal constructor() { } } + override fun replace(old: Vault, updated: Vault, cryptor: Cryptor) { + cryptors.remove(old) + cryptors[updated] = cryptor + } + fun setOnChangeListener(onChangeListener: Runnable) { this.onChangeListener = onChangeListener } diff --git a/data/src/main/java/org/cryptomator/data/repository/CloudRepositoryImpl.java b/data/src/main/java/org/cryptomator/data/repository/CloudRepositoryImpl.java index 61f1307c3..aeef7a0bf 100644 --- a/data/src/main/java/org/cryptomator/data/repository/CloudRepositoryImpl.java +++ b/data/src/main/java/org/cryptomator/data/repository/CloudRepositoryImpl.java @@ -68,7 +68,7 @@ public Cloud store(Cloud cloud) { Cloud storedCloud = mapper.fromEntity(database.store(mapper.toEntity(cloud))); - dispatchingCloudContentRepository.removeCloudContentRepositoryFor(storedCloud); + dispatchingCloudContentRepository.updateCloudContentRepositoryFor(storedCloud); database.clearCache(); return storedCloud; diff --git a/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt index 85e5e5fd5..05b61418c 100644 --- a/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/repository/DispatchingCloudContentRepository.kt @@ -204,6 +204,16 @@ class DispatchingCloudContentRepository @Inject constructor( } } + fun updateCloudContentRepositoryFor(cloud: Cloud) { + val clouds = delegates.keys.iterator() + while (clouds.hasNext()) { + val current = clouds.next() + if (cloudIsDelegateOfCryptoCloud(current, cloud)) { + cryptoCloudContentRepositoryFactory.updateCloudInCryptor((current as CryptoCloud).vault, cloud) + } + } + } + private fun cloudIsDelegateOfCryptoCloud(potentialCryptoCloud: Cloud, cloud: Cloud): Boolean { if (potentialCryptoCloud is CryptoCloud) { val delegate = potentialCryptoCloud.vault.cloud From 6b708554e5679ec3144697991a8c76ab4a29d551 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sat, 12 Feb 2022 23:13:40 +0100 Subject: [PATCH 21/35] Update dependencies --- build.gradle | 2 +- buildsystem/dependencies.gradle | 14 +++++++------- ...41.1.jar => google-http-client-1.41.4.jar} | Bin 286011 -> 286042 bytes ... => google-http-client-android-1.41.4.jar} | Bin 17112 -> 17109 bytes lib/pcloud-sdk-java | 2 +- presentation/build.gradle | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename lib/{google-http-client-1.41.1.jar => google-http-client-1.41.4.jar} (86%) rename lib/{google-http-client-android-1.41.1.jar => google-http-client-android-1.41.4.jar} (70%) diff --git a/build.gradle b/build.gradle index d3ef45a8f..a7a365c33 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.0' + classpath 'com.android.tools.build:gradle:7.1.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index db3b501f5..364ce24da 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -46,7 +46,7 @@ ext { gsonVersion = '2.8.9' - okHttpVersion = '4.9.2' + okHttpVersion = '4.9.3' okHttpDigestVersion = '2.6' velocityVersion = '2.3' @@ -67,19 +67,19 @@ ext { dropboxVersion = '5.1.1' - googleApiServicesVersion = 'v3-rev20210919-1.32.1' + googleApiServicesVersion = 'v3-rev20220110-1.32.1' googlePlayServicesVersion = '19.2.0' - googleClientVersion = '1.33.0' // keep in sync with https://github.com/SailReal/google-http-java-client + googleClientVersion = '1.33.2' // keep in sync with https://github.com/SailReal/google-http-java-client /* update using https://github.com/SailReal/google-http-java-client with `mvn clean install`, copying `google-http-client-*.jar` and `google-http-client-android-*.jar` into the lib folder of this project */ - trackingFreeGoogleCLientVersion = '1.41.1' + trackingFreeGoogleCLientVersion = '1.41.4' - msgraphVersion = '5.12.0' + msgraphVersion = '5.14.0' msgraphAuthVersion = '2.2.3' - minIoVersion = '8.3.5' + minIoVersion = '8.3.6' staxVersion = '1.2.0' // needed for minIO commonsCodecVersion = '1.15' @@ -90,7 +90,7 @@ ext { jUnitVersion = '5.8.2' assertJVersion = '1.7.1' - mockitoVersion = '4.2.0' + mockitoVersion = '4.3.1' mockitoKotlinVersion = '4.0.0' hamcrestVersion = '1.3' dexmakerVersion = '1.0' diff --git a/lib/google-http-client-1.41.1.jar b/lib/google-http-client-1.41.4.jar similarity index 86% rename from lib/google-http-client-1.41.1.jar rename to lib/google-http-client-1.41.4.jar index 6c7e3d70091878c4fdf1ae5c8b809de44e929721..5f98cfce425461578f26a068a56d0f378824be6c 100644 GIT binary patch delta 13619 zcmZu%1z1$e7vCGZur$)rC?FsmqS7TTAo?WiKokW;pZW~I78J!*#{yA#wxXi0hzK?Y zVFw1b54(eh{?DDcEUxd*_wjL=Q@;~)X70?bJfeB~h^A^x1j8x`1d0NIfizNL%$jIx z!+(n0fAOQ=r$1s@f#9H8p}tXeL;6Ec?PFcu`405nR!YpPWi^$uRN zF*T#IsAS#xu6B7QwT3#+4{6wJeO{;+Vb!Q-^dM83mE=?`8ggaw+Z9*XZVr`2t=Zk5 zxotk7!5ld5>bgF)>{a=MjGcD6gMc!}IUS7QR*ka|_ zvv*(J(GD4H7Cu{HjqZBU{ZP>stu+t+?svRvif88a<5LPnS({X!@7D|I_o8j;44r}# z8AeNw8L=sro~JUWjZB^}Sh;@TUTY8g<8R`vv-6&usc5nou=q!}pyAiVDWmgiOb=Ly z#+N3J>ngNZ-(}F_iuf2+1^=GbqPJ^I%)XAWco2O4)PC*38%<)$ZcY?N#(#yaYXS-UE4rAcPhoWB#*rrBIS`K|5l%cd*c7n-kmdiUi!_5OCRUl_j$ z9wkh2?>lem?a|6&t8oXV^}Q$c8r3b|(Vf(EjhM-~0F#jcQ zcdi=#eZa)zA)W=#hbQ_CC`p#Q$RB+mc#ulH>xgZ;3u_K+G0C>Gj#`mXqc+%F@@C*o zU6+C5X4M~#GCO4EA62*aG=0TjYEpLY_JE`nXUk6P{oun$CRe_UDVz5E&LFMcb4+LT z9x$}i7Kg$BH{m| zL}dr|aH6k#`))LO)6&kXv!mVKFWPhS;OApyx#!-@KQHb& zY+QG!{HWpI;^w=$HCIh;9o4eacAA#EL{R48S`2BbI50`*&B>OYo)xRY_ zbs{e{tF2FPYTdNPY&%lv*K203wO0SVkN>Lvw4;1n>uI$&%kS0yHMi{h^^fH%X3Tzh z;i8XI7o!E4`h%51P^Nalk)jFDtR-b^XGtu3lhK8i(Ou|+|Be^-;s1A(WQc^47eXcc z|5srM{_8IaZl@zZT~;Wm5)p>!iq?{tyF&erP6TS>1+pLHT+0{%hni#uud+=6OQ3W` zRzbPFeQ{Vo6>2V`gpx7^qWh=<0oSI`8yoMf=#BqQSMxQmk zTZZe3L&g61Z>cz*<1TL%*V6dmj7qAxCWrRLJQvTG&?$A41%e2PdAzwqy{8a4idb=Z zx`U1oGcRyep|G)4ZmnvZ5N$MK*%w+MkSHQemNr6-%B)U#qq{1D*_%Cs$wN1<9*WqA znM!Iv8HD8_{Ca~CE99jPiP#%dfd$fnKM{eEVS@?0(-E^+ObUrPPe@wvLlrTGKa)RW zO8TJB7*zR~Av1{3vtg>3rTj~3F%eol{v~->kVz5d{E7Btq;m2QB4s@Fr5aYKvcR5< zcrBX2^DNfDBa-?8V)N`${Vq5FPcGMQoFEbiD%4S|Hv}NYfE7!sE~u27l+O}jZ5t}i z5G7-(%82RC)pIwZInBnnXv#}kd>M>yg8z2Ai$a0mKqsWpgTgh4b{VtAPP0W6=QR)h0rk z`iv1;X3iR-qbDgv>Cv7P35RsG7iCRh?te0#3^}PP5L5%>Ny-uxbY<10ln+&>ij7{1 zpu&j(lW59?#Uf`%Iwyvz3j{_Mh*F`=QHeb*LVjwrNSYr<4OGW+Plr({I`}DO3gtq; z&YMbYB~Cfcq@qnQHD?{=LG)J?QH|tjaS3Hfz^z~FaofdMAlTg(Wi(Od(&mj+lrffb zs;1(Iu6ZY^7$SG`H04FYtapy;OKhf|rzR1;=6WiRP{&`U4pU+sn2DSAt^a9`9IjHs zG$;!J*NDg_h)deWtJF85qv$$iLGX-qv)sRWaO}{2%rh2p`dFo?8KP1%dX0)~#XG>h=5gSMe1T7SoU~_4@4Ly{?eZ}R7d*?pj z%}gkDZ!|29vOsm$p-hzQ=oF%Fl0EG~!0&c$w^r;%#}HKSdeCurI!Hsj>G8@qFNZ>D zPa^v+oE8#~zD3Z>h?d1MbSNqC8-LJQL`zf>?TF`}G2Gl zX!3MuGObJa8m7=0=r_cK+C`eQ9BFC;J%;o!kygaT8t`hT0@nr14_%?36FV=i)A1z# zIbIX*ra@(-gJN3=B{o4rqgX}hpEv251l;FabTDzu=N|o$Jh?xjzmg}X=X8W7#yRU7 zeNqqOtQp`ow-MCcXC;jhMrh~)S}4uXWWEucY1+(qqWO*vV@<|H`pjc8_R4^nM4m<( zGBZS2pKWR8KfVA_iRKyruTb5BNhFMEU6}U-%&>0Ed{S90j?7U)-R{g3kjVGy&G?Y9 z>0V4Ld79?K^d}H5`L%;-4PXut>VY8U33*x{!c-9($q~$MGNuy6^dpJ!cHeuSbJ$&h zn_Wietr!YtX*BbasGb$e93c7F_d;W#J$Ukt=30jlatdITr78WHK%#N?0A>*p>6ySR zQp3()tQo0|K;#0A-VFoYB|eOr^m_`kjfni6%Cr)Z&1p<;^7LQ=qe;Min#jbHZWEcq z+#?e9vl%TRRz0sMx%xEhTc)ZI*voD)N@&m(Mo~Ir0dtMaix1Z}RL%zTk@Tu8#$1}S zm|08I7#A>SiIHc^nW4mR_)5ls)YtUY%z45Wx|T`Cn*-_AZA=gW^ZFo@LnJZ}GyGCm zUcn@jXgaQ+U^NWhN+;`+bk`)Z8q%;zCX-C6s?*G9B5YO5B#0*!Bn?DNPJt9TjD|KQIio`^i{)s{bwQLD9>2iu%3S=GOLu#l){!cZr^@rc=Q^fUzpLPg>&LELVLwqHU<9Orky>v zdfC-yZx@*P-M{WXSuM|N%c>3Ib!MJXdi5jQcca<1pmD_ko~B<_59TY5SU$%zBh36C z^Yu-opQcMq0~H2O_|f<}=JMh`)zf-?Y`uF|_4~Ce8||F0#QSclxcprGyI$J zs#h$e*X%70DD)1|n>Vsx-j)+S7L_HsyH_0R5gHbBMSG1!!^%TmpFeh6u$symT~MWD zo{)Gdz$)AFvuiK*xN>3l!#)8+8>{;F>~*xr$lP|sfrqY>Jl7Z*Z_Y9pXZdi1`kt3w z4Owo5iT&9n>!vWEjFhPEnVGEp?1EroqO7r$*1dYtk);H~0cf=Y!xcfKquTs(1p5HTfW|8xb znhq$O6MW5V@wMk){HwLc{KY1?2&n0k-Luja1gRZmaar_(y%|Bx=?v3ec zU^LR;{UhmE*BX=DouZ$QPfzz=*DE~K_p;yEc~R4@DotwpSA6hUV)mra&JXv@ zUAe6JV@#;w^~~5od+K$TihdYKlb<&2eA;8u@$i=AEp=P;pDG{LmzF+m%&r-keWx<$ z=*6G@na`i;ims(ml^1LNRXKBQyHKnRz>pF*HZ(aG%QJ&>HX@~iiWb$)eE*p){nYqIqv*Up?j~hV^7v)r}to1%$;~I`RozPhhcp- zWIcJbx$O0lk0(w3jeAuT{j}I+Z}x?$1G-kObX@Wy zr=yc>^Q8MvUmL#VX4T$xp6TE2<#bP_*KYZFM*nKt?q?s_4L`i}*94C1opS#|i6Lt3 z`|-7@+`c}3dml+(ZxqR}`C2&(m0{CQ(b|mcBox`Rtf41&1`!n;?{6O#9pXqh{@>}S zKmen%pVC}wq`P=|Gb|IrY<@*jk9Sk_rB8%9T@k9SN-Pftl3h5Ur9G1{xd zs!`j}3zqewudxz;2Yuu(WNm4&5T4D@5+RFU|Im6NYe)xkgO=!C``{~Xa6UKafILON zayAMjnL(Cl5e%AfD_c7n?ysHf9}b(Q2srJLnwS@VCjy;`+@K|D)M6FTu67EBut|h+ zwOLD)ufX$Hih=);Nb+vKvE8rH{M~9-Ijcq}R*^M9jYh1v1GzD%q6TvmM{Z+@IMvj8 z?tcS(zJsb1fANvJMkpHQtZD~*P6w^4h;n;UCTO6T)xes@aij5g)EKpmrGN1X<6ohO zGNTz2+h3~Tcl_pZ`0J3F66@5VTSbgwZ_>sRQ?Xc8zM>kSqNqqzt;Cver%9+;3I3mk zVw71Mxp;9W?=lnc&{Osgm!&FBAQanMrwqPmE8$8Qs>UixdMK%)X>NREC>5aIR{^RI zN>*VzVUbL3Fv0-_qfnCy&)LEambl{LaaUzcaGlH;n*4YtSiTLv?lJ@dL1}K88)s2+ z-mMc_Z_2BvPz4pc-8llnP#WD;kh&UAHBkfVH_vuz7i?hF^ZeJ>6$FBRI|&3Kat8dp za3MCTvDO&$cTRkI5DfZai>6#gBvEtISHs?DEKJz|Iq`WYSDlT;OlK`y`e?v5?gB8n z$}!DE@6_1<3?%c+*QGWvA>X?dOL3m5dRz3rODh>lk7+)am6Z=Gjc1p!ruEL zIN>Izav^%B$p&JTw!_-2b$}rpoQRZT${o@U(-IBV<+HJ`6F49k&QW?u?1!tM^juYyjMtI)ja5Y1T0FIYqwX8uPUUmM4VGlK4=SKQZPo-s|9GKE^B$l&0J~s$ z=%pw}n}SWwrByT2Ltg_@0^wa@k9#cu*nXbcj!3o*Ojan|? zMs3hD9o7H`C9%N8!xFR(hx0`*InDhS5zQHk3_5}`UKf;HT})J$>GFN&0XO=rfQ)w0 z<2~E(?a|K576QTZxL;c+H#M5kP(8L6MpdK-qOJR(8@i%~Xx@Q;xxvE~Fla7ms8B}X zhO7z>mfMQBr-QgSK)`y)q0L1Z`fLbRS)mWouGL(Fm4s9qbj&Y910d8K=hUJE1HKw3 z%rO{a0xI+1*HTVp2r4vS-Efqu!-|)F0^(9&>R1gpSGLw-l*ejSP`6GzeDls==gB#g zsn5Df)XuA+?9T1A!BMtc01tl><}AnLd=Wy{ z=fPBvFS-B}W5gGooB!ZVweYHVU;p5c%Xlb_;&fj2!K_z$bg|JW7YsePBjKf z>norHqC{hUZC&WEn9t4a8}REQ5Ah?;n&T&-#OEWK-#Gpq=f=O|HTuL$7@&L;KFVuN z!06_$I59`Qsv{*Q-Y~oTaBVoaZ3^9|yPV;TG`eKV>T?$?$jOw&ho&gT6!f@@Iw*Oj zuqJT}?M{v|MFCS#vnfkj^{tlqyF8&)KY(n=hkmLO$7+K1nz3rAuNlvOW7e74B;Zei zRN*}o52-X)y_1Z;8#dTv1_o;kWTU#MyE)q(lak=PnhrOSku*?QPfCb(n)Au2;pky@ zGCBqzM&mr$PB^xH3+vZ@2Fv+S+d*O(}LnfqvdiH>whipC0?E*^kd&=n8vMOq};d8h|^{MY=fawBo z<(Hv-UNRvCbkU2_>rfig6_hr4b97?_r{XMkZco;!T^y+;f{@xGsLrxBs%{CC9?^u7 z_JYz!!z|g(IOelBQd%4#$Qawb}(V$hV!E)$K88T&D2w2^; zVB7g8z;q*|BcWXv{4LF0vreWi9Q*f*({i~;21*&dEuy-0%&^pMK>xc$MrYB{63QH- zz@|DbB7UD}bsJ?un(Dv4Dsa=v*#^{xRTGZnYRUkOYoEIFJt8w+`}B_7#xqI-ND}j*METq7Z_@I z;lloO+}8*M_HzE*xsL~U~RE~YaGD89&gEL zW#Zd@MtpnwMKyKyJqN+mlnK|Plp~)zs^KNWcoQQXBVE-U2 zXq+o{?tFf)W%tXZK*J=kD!(^V^dwgIa)Dms&Klx$ZGZh`y*XE`h5~`JoYg_F0&%J# z`Wk4I6JOvbk2nclLwdJ?XO43Gb)keGW}O*U9l9ZECpY1g|5Iv;u!6|~aM**NYnx0h z-UPwiDTXd44@D!AsJ4v!HNc;e-}h;O1e?LDS)d%0%`t=@&H^;ixfogx?_Dvds^+F3 zJ-}WDg8p(sum6wQmv>K|9@!J<&&SH>CU`}|P6U~+sQU(y>ZkJi zwqiyG;eXYWwZm0n*bB7OO(vsIC2HvHWcrua!&w~tDXi#RK7LO5)q&d_>HTz67zkC6 z)*H@pG-klZ06SFqs2tkmlJo}@>^?vu-=$&}$b`t|ba8J`^==U!U3G;PqlVtB7G4U( zdx}(!K|Vf1c;&199-_QhvcgAuf%vBaq7<$iS){gi3fX#SnPg50gu3 zxC9GHniWN8f-kF${`F$ba9~WmL8r><4)PFhwhM-o%}7?XLd_<@G>Veb)`m8Ev&pz+ z_<;0?;tpv)7{Gc5bCeAwzfh{d->p8Z9wr~>$bO|AWH76V(n`S{Q(r#w4!*$ibXx}x zAh*Jaw-THRSAvk&fV19m(Ecj#V4q$C(c2{f?prTd~JajiQc*bfsdTv{evBX zfJG67`?2O2>I6T4VOiZl_NxZHGL`FQJY1R#VafwMk#Z`B)^x}K7CYqQ&wCc-4=Sxr zU@}^AgHb>Q{;W2RdR+0tDb}FwF8p?rQ=`0o+y~Aty#iQm?4e_w zZvF?5TLSX7a`I(od3ynTigv;S-BQbqnyfkpcW~Us4eQqo?_8mcu2UWBaVjO3tYfvh`5(s4Wg`ySxMWvm%yfC(}S;%zzxflc}bu?g4T zVq|s$Qa2UoSe@KWzMRd3n?#7a*+=JsSS{?seNLb1Z9-c1fKf$`x1jhsYtXhn2pAG1PA+{SJD&+7zluT4Ej7LO1(l@ zJ|oLh(4?? z#=6I4&cw%%Ywj*pzFt0{oIZTL9N|Qb^<`RF^tBIbg$kftn9$yXWM4D<-VMK-6Mo38ChC>M^Cw)=I=>lW zEry;Yzh|4%1?>xCyP^$Um`?xMiPt=z)!iMc&kSJ6ukTaQ-Y_;8$Gy^J%ky-I%}SV> z@@E#56VbiL3$C{>b>ZjE{cU0Iy`cfyYW%LW#+mTnab~p9?r^?@j)p_*VtW%(TR6X0 zGKhfD3i-+=xu(C z3Od(*D8r^N3*+8LxaCKFvUdt3{E$)7k7vRIeIba9HU}|E|9O#XsNkj8HyNv-mBmZM3D}rc*xkv2Gf(N=w6d64n#m|6_Pe^`$6Py-JSPP;VEo9n$ znCK7;heaihal z5?wfiKl|}#d8Y9|TE3c)65{#5{>6kk-RbB>I{S3+=U*6vpDzEP{U!vtOk`#Je{^1v&y%o|{s*uXbVRp51^ zYT$L|mv_1po5WD=RBHTx7M-a#2tRCURMCckeCGEI1XVe=Nakgw7`;m}cNu8O22k=# zSO2?23w)QPfZ`MQS&*6lTI}x2NS&~6coppUZ0Yx^o{pLmSo~o;GD`&co==H9t~B^; z$xwE5n9q>|UlMZrriZ-3{Sh&Gxj!If{)5!@E#bFM;=6xX5@O=eZh hxeEpS0RZrE8&dgG$OMLM=hs7qgV@fZRt7qU;D3v(qqzV8 delta 13672 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 delta 2200 zcmaJ?2~-nD7~br1hBG0as|4ge5;^1w;Rq-gP(cJy1fTJuR*^$0uOI}fkVvhXj95^# z2x#Gnpg^r!@WLa4h#(3I9%wu(R6JtwfX;3(8hx+(-n{>x@BijM=HHpQo=fS@rI>_= zVj2tt(a}L1e`ZDg(a%`)lZ0a~oJ~FJWbEIUX_h9_bom!!*VYYC$MBN;ESHU+6(6!o zd}r}rLS|w>pUt6Gzl!QAdavpF8?p9+GPx)*$>b!zSA6|;NSot;j_A+?&ad)|uV22+ zz0cfR<@NS}tNYfhj!wNHhbxTO&Iz^Ovo(%6ojYr3@Z{Reqfe=}mG(BPtA-3IL|#;w z7eeGEF)-CtP8{ImDHDSN=uxamIgMgZN&&^0lm!$nDLX0CNr|KUQON~-cE?I@|d(Yi&YK_v3NQ5QQ{13^T32oeO& zppM{$k1^QG)ULCjM{AJW%&`fYq|%Qs$4DiTsi2U`Y;yyp5;rAT>A2mJuT&=67%EL{ z+j~ksG**Vv&o&ngif&9kD^eJcnoC_`>Q|v)@lUZ1VI6%*0`EX#2Hl<@p+47QuJgd5h_wT0a6uCtW zEiCV4c)D7*SXGxYH52ZstI zD36*P-z}N%vn!jvs_BGaC*3MYkz#;VwDBs1DY|yr$vT(xTY@(x)UUdyKa$6m%S2L> z35p#9%v)LuKlFFFv~(r8MQqB`WXw8PkUAWbaZsN8Cc3~w^Xj1df|$DZW7j*HqT2qs z%hqV5MG^Nv(OIlux(yatJ`31=x$RDqm@8&4zNAehtt>3%shSc=1 z@D1KF&qqc4`aPM}IW~rw*$F*0w!P^aZpOXGPAAW6X3RM|Usre1T;HP9FvG@8J1>Sx z7k|+DeD4q^skrbhcP4@$k#K~8tJrif>>lpCv?5-niG+tzPzLtZ9R+z(I3TL}%5xA< z?_oinS%C*WsUBKp&xqu)_;Z4$DxIkA5OB)_AJ+p3%Mug5vFUr_oR6cn_{7BcH7mZR z5NWDDBb8>1^z*ENz|)jT)TDx;GFCMqIP-wB*93>JQc~latMNsUZ~4D`J2n0V$oC}f z7_i0*M-5QWM{@$lz4TSkLIQGtw;}BlMA;AgIX>hpn}bsZ;mjF?v$WKr5-)@*5LDDF z4+O&;Q*!s2-Z+|sfp*N+@yjB=Ud~hbA~vO-STMu>bFYa#6yybuWS|JbhPSM@ijE-V zIVKup35zu7fXh`@7RtrZ$665fmilUeN-mu&=OjeW(I7f=G#Li@+7aFlOWT%EH4$XQ z06~bq@6%VFlQ@=e1M+=vGlH17Z(Rk7A&3N$gFmsLEYG=%E8|ThV@>wO(I6&70>B1e za}p|nke@k(oIt;?DG3?+;b_#( zsD|WwaHw}6$AwJf1kdz~_o$CI1{J%)P6h(+026Za)XuhA*b;Y=IP7i+P6ZfiMR^d` F{{RtH(7gZv diff --git a/lib/pcloud-sdk-java b/lib/pcloud-sdk-java index c96155934..dc4d0897f 160000 --- a/lib/pcloud-sdk-java +++ b/lib/pcloud-sdk-java @@ -1 +1 @@ -Subproject commit c961559344afe200a576b2ec5288a95c06876a4d +Subproject commit dc4d0897f7917f026376d35f9a6eaf6edbc7115d diff --git a/presentation/build.gradle b/presentation/build.gradle index 43b5e91ee..c3bef3757 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -105,7 +105,7 @@ android { } packagingOptions { resources { - excludes += ['META-INF/jersey-module-version', 'META-INF/NOTICE.md', 'META-INF/DEPENDENCIES'] + excludes += ['META-INF/jersey-module-version', 'META-INF/NOTICE.md', 'META-INF/DEPENDENCIES', 'META-INF/INDEX.LIST'] } } From 10cb02f4759d21d5b38ca7f7ab67158ee3c804dc Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 14 Feb 2022 17:10:42 +0100 Subject: [PATCH 22/35] Store vault metadata like format in database and refresh while unlock For example, if authentication recovery fails, we load the vault from the database, which may result in a vault format -1 before this commit. We try to avoid this by overwriting the state after the authentication succeeds again, but we can't always avoid the vault format being -1 if, for example, during authentication the user changes activity, so we now store these fields in the database and update them if they have changed during unlock to prevent these states. Alternatively we could have locked the vault but from a UX point of view it makes no sense that the user has to unlock the vault again just because e.g. the token has to be refreshed. --- data/build.gradle | 2 +- .../data/db/UpgradeDatabaseTest.kt | 25 +++++++++- .../org/cryptomator/data/db/Upgrade10To11.kt | 48 ++++++++++++++++++- .../data/db/entities/VaultEntity.java | 27 ++++++++++- .../data/db/mappers/VaultEntityMapper.java | 4 ++ ...UpdateVaultParameterIfChangedRemotely.java | 29 +++++++++++ .../presenter/VaultListPresenter.kt | 24 +++++++--- .../presenter/VaultListPresenterTest.java | 15 +++--- 8 files changed, 157 insertions(+), 17 deletions(-) create mode 100644 domain/src/main/java/org/cryptomator/domain/usecases/vault/UpdateVaultParameterIfChangedRemotely.java diff --git a/data/build.gradle b/data/build.gradle index 6bfed5437..5284ae6b5 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -70,7 +70,7 @@ android { } packagingOptions { resources { - excludes += ['META-INF/DEPENDENCIES', 'META-INF/NOTICE.md'] + excludes += ['META-INF/DEPENDENCIES', 'META-INF/NOTICE.md', 'META-INF/INDEX.LIST'] } } diff --git a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt index 108b31a8c..665899722 100644 --- a/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt +++ b/data/src/androidTest/java/org/cryptomator/data/db/UpgradeDatabaseTest.kt @@ -504,12 +504,23 @@ class UpgradeDatabaseTest { Assert.assertThat(it.count, CoreMatchers.`is`(1)) } + Sql.query("VAULT_ENTITY").executeOn(db).use { + it.moveToFirst() + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_CLOUD_ID")), CoreMatchers.`is`("3")) + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_PATH")), CoreMatchers.`is`("path")) + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_NAME")), CoreMatchers.`is`("name")) + Assert.assertThat(it.getString(it.getColumnIndex("CLOUD_TYPE")), CoreMatchers.`is`(CloudType.ONEDRIVE.name)) + Assert.assertThat(it.getString(it.getColumnIndex("PASSWORD")), CoreMatchers.`is`("password")) + Assert.assertThat(it.getString(it.getColumnIndex("POSITION")), CoreMatchers.`is`("10")) + Assert.assertThat(it.getString(it.getColumnIndex("FORMAT")), CoreMatchers.`is`("8")) + Assert.assertThat(it.getString(it.getColumnIndex("SHORTENING_THRESHOLD")), CoreMatchers.`is`("220")) + } + Sql.query("CLOUD_ENTITY").executeOn(db).use { Assert.assertThat(it.count, CoreMatchers.`is`(2)) } } - @Test fun upgrade10To11UsedOnedriveCloudPreservesCloud() { Upgrade0To1().applyTo(db, 0) @@ -552,6 +563,18 @@ class UpgradeDatabaseTest { Assert.assertThat(it.count, CoreMatchers.`is`(1)) } + Sql.query("VAULT_ENTITY").executeOn(db).use { + it.moveToFirst() + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_CLOUD_ID")), CoreMatchers.`is`("3")) + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_PATH")), CoreMatchers.`is`("path")) + Assert.assertThat(it.getString(it.getColumnIndex("FOLDER_NAME")), CoreMatchers.`is`("name")) + Assert.assertThat(it.getString(it.getColumnIndex("CLOUD_TYPE")), CoreMatchers.`is`(CloudType.ONEDRIVE.name)) + Assert.assertThat(it.getString(it.getColumnIndex("PASSWORD")), CoreMatchers.`is`("password")) + Assert.assertThat(it.getString(it.getColumnIndex("POSITION")), CoreMatchers.`is`("10")) + Assert.assertThat(it.getString(it.getColumnIndex("FORMAT")), CoreMatchers.`is`("8")) + Assert.assertThat(it.getString(it.getColumnIndex("SHORTENING_THRESHOLD")), CoreMatchers.`is`("220")) + } + Sql.query("CLOUD_ENTITY").executeOn(db).use { Assert.assertThat(it.count, CoreMatchers.`is`(3)) } diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt index b143cc3d5..263f18fd3 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade10To11.kt @@ -6,19 +6,65 @@ import javax.inject.Singleton @Singleton internal class Upgrade10To11 @Inject constructor() : DatabaseUpgrade(10, 11) { - + private val defaultThreshold = 220 + private val defaultVaultFormat = 8 private val onedriveCloudId = 3L override fun internalApplyTo(db: Database, origin: Int) { db.beginTransaction() try { + addFormatAndShorteningToDbEntity(db) + addDefaultFormatAndShorteningThresholdToVaults(db) + deleteOnedriveCloudIfNotSetUp(db) + db.setTransactionSuccessful() } finally { db.endTransaction() } } + private fun addFormatAndShorteningToDbEntity(db: Database) { + Sql.alterTable("VAULT_ENTITY").renameTo("VAULT_ENTITY_OLD").executeOn(db) + Sql.createTable("VAULT_ENTITY") // + .id() // + .optionalInt("FOLDER_CLOUD_ID") // + .optionalText("FOLDER_PATH") // + .optionalText("FOLDER_NAME") // + .requiredText("CLOUD_TYPE") // + .optionalText("PASSWORD") // + .optionalInt("POSITION") // + .optionalInt("FORMAT") // + .optionalInt("SHORTENING_THRESHOLD") // + .foreignKey("FOLDER_CLOUD_ID", "CLOUD_ENTITY", Sql.SqlCreateTableBuilder.ForeignKeyBehaviour.ON_DELETE_SET_NULL) // + .executeOn(db) + + Sql.insertInto("VAULT_ENTITY") // + .select("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "PASSWORD", "POSITION", "CLOUD_ENTITY.TYPE") // + .columns("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "PASSWORD", "POSITION", "CLOUD_TYPE") // + .from("VAULT_ENTITY_OLD") // + .join("CLOUD_ENTITY", "VAULT_ENTITY_OLD.FOLDER_CLOUD_ID") // + .executeOn(db) + + Sql.dropIndex("IDX_VAULT_ENTITY_FOLDER_PATH_FOLDER_CLOUD_ID").executeOn(db) + + Sql.createUniqueIndex("IDX_VAULT_ENTITY_FOLDER_PATH_FOLDER_CLOUD_ID") // + .on("VAULT_ENTITY") // + .asc("FOLDER_PATH") // + .asc("FOLDER_CLOUD_ID") // + .executeOn(db) + + Sql.dropTable("VAULT_ENTITY_OLD").executeOn(db) + } + + + private fun addDefaultFormatAndShorteningThresholdToVaults(db: Database) { + Sql.update("VAULT_ENTITY") + .set("FORMAT", Sql.toInteger(defaultVaultFormat)) + .set("SHORTENING_THRESHOLD", Sql.toInteger(defaultThreshold)) + .executeOn(db) + } + private fun deleteOnedriveCloudIfNotSetUp(db: Database) { Sql.deleteFrom("CLOUD_ENTITY") .where("_id", Sql.eq(onedriveCloudId)) diff --git a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java index b8d683fcc..9f384b3c6 100644 --- a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java +++ b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java @@ -29,6 +29,11 @@ public class VaultEntity extends DatabaseEntity { private String password; private Integer position; + + private Integer format; + + private Integer shorteningThreshold; + /** * Used for active entity operations. */ @@ -42,8 +47,8 @@ public class VaultEntity extends DatabaseEntity { @Generated(hash = 229273163) private transient Long folderCloud__resolvedKey; - @Generated(hash = 825602374) - public VaultEntity(Long id, Long folderCloudId, String folderPath, String folderName, @NotNull String cloudType, String password, Integer position) { + @Generated(hash = 530735379) + public VaultEntity(Long id, Long folderCloudId, String folderPath, String folderName, @NotNull String cloudType, String password, Integer position, Integer format, Integer shorteningThreshold) { this.id = id; this.folderCloudId = folderCloudId; this.folderPath = folderPath; @@ -51,6 +56,8 @@ public VaultEntity(Long id, Long folderCloudId, String folderPath, String folder this.cloudType = cloudType; this.password = password; this.position = position; + this.format = format; + this.shorteningThreshold = shorteningThreshold; } @Generated(hash = 691253864) @@ -182,6 +189,22 @@ public void setPosition(Integer position) { this.position = position; } + public Integer getFormat() { + return this.format; + } + + public void setFormat(Integer format) { + this.format = format; + } + + public Integer getShorteningThreshold() { + return this.shorteningThreshold; + } + + public void setShorteningThreshold(Integer shorteningThreshold) { + this.shorteningThreshold = shorteningThreshold; + } + /** called by internal mechanisms, do not call yourself. */ @Generated(hash = 674742652) public void __setDaoSession(DaoSession daoSession) { diff --git a/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java b/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java index aabbfff1b..2659922d7 100644 --- a/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java +++ b/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java @@ -31,6 +31,8 @@ public Vault fromEntity(VaultEntity entity) throws BackendException { .withCloudType(CloudType.valueOf(entity.getCloudType())) // .withSavedPassword(entity.getPassword()) // .withPosition(entity.getPosition()) // + .withFormat(entity.getFormat()) // + .withShorteningThreshold(entity.getShorteningThreshold()) // .build(); } @@ -53,6 +55,8 @@ public VaultEntity toEntity(Vault domainObject) { entity.setCloudType(domainObject.getCloudType().name()); entity.setPassword(domainObject.getPassword()); entity.setPosition(domainObject.getPosition()); + entity.setFormat(domainObject.getFormat()); + entity.setShorteningThreshold(domainObject.getShorteningThreshold()); return entity; } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/UpdateVaultParameterIfChangedRemotely.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/UpdateVaultParameterIfChangedRemotely.java new file mode 100644 index 000000000..8b85d17ee --- /dev/null +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/UpdateVaultParameterIfChangedRemotely.java @@ -0,0 +1,29 @@ +package org.cryptomator.domain.usecases.vault; + +import org.cryptomator.domain.Vault; +import org.cryptomator.domain.exception.BackendException; +import org.cryptomator.domain.repository.VaultRepository; +import org.cryptomator.generator.Parameter; +import org.cryptomator.generator.UseCase; + +@UseCase +class UpdateVaultParameterIfChangedRemotely { + + private final VaultRepository vaultRepository; + private final Vault vault; + + public UpdateVaultParameterIfChangedRemotely(VaultRepository vaultRepository, @Parameter Vault vault) { + this.vaultRepository = vaultRepository; + this.vault = vault; + } + + public Vault execute() throws BackendException { + Vault oldVault = vaultRepository.load(vault.getId()); + if(oldVault.getFormat() == vault.getFormat() && oldVault.getShorteningThreshold() == vault.getShorteningThreshold()) { + return vault; + } else { + return vaultRepository.store(vault); + } + } + +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 4b19ef9de..521083a28 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -32,6 +32,7 @@ import org.cryptomator.domain.usecases.vault.LockVaultUseCase import org.cryptomator.domain.usecases.vault.MoveVaultPositionUseCase import org.cryptomator.domain.usecases.vault.RenameVaultUseCase import org.cryptomator.domain.usecases.vault.SaveVaultUseCase +import org.cryptomator.domain.usecases.vault.UpdateVaultParameterIfChangedRemotelyUseCase import org.cryptomator.generator.Callback import org.cryptomator.presentation.BuildConfig import org.cryptomator.presentation.CryptomatorApp @@ -78,6 +79,7 @@ class VaultListPresenter @Inject constructor( // private val licenseCheckUseCase: DoLicenseCheckUseCase, // private val updateCheckUseCase: DoUpdateCheckUseCase, // private val updateUseCase: DoUpdateUseCase, // + private val updateVaultParameterIfChangedRemotelyUseCase: UpdateVaultParameterIfChangedRemotelyUseCase, // private val networkConnectionCheck: NetworkConnectionCheck, // private val fileUtil: FileUtil, // private val authenticationExceptionHandler: AuthenticationExceptionHandler, // @@ -115,7 +117,7 @@ class VaultListPresenter @Inject constructor( // checkLicense() - if(sharedPreferencesHandler.usePhotoUpload()) { + if (sharedPreferencesHandler.usePhotoUpload()) { checkLocalStoragePermissionRegardingAutoUpload() } } @@ -399,16 +401,25 @@ class VaultListPresenter @Inject constructor( // @Callback fun vaultUnlockedVaultList(result: ActivityResult) { val cloud = result.intent().getSerializableExtra(SINGLE_RESULT) as Cloud - navigateToVaultContent(cloud) + getRootFolderOf(cloud) } - private fun navigateToVaultContent(cloud: Cloud) { + private fun getRootFolderOf(cloud: Cloud) { getRootFolderUseCase // .withCloud(cloud) // .run(object : DefaultResultHandler() { override fun onSuccess(folder: CloudFolder) { - val cryptoCloud = (folder.cloud as CryptoCloud) - val vault = cryptoCloud.vault + navigateToVaultContent(folder) + } + }) + } + + private fun navigateToVaultContent(folder: CloudFolder) { + val cryptoCloud = (folder.cloud as CryptoCloud) + updateVaultParameterIfChangedRemotelyUseCase // + .withVault(cryptoCloud.vault) // + .run(object : DefaultResultHandler() { + override fun onSuccess(vault: Vault) { view?.addOrUpdateVault(VaultModel(vault)) navigateToVaultContent(vault, folder) view?.showProgress(ProgressModel.COMPLETED) @@ -530,7 +541,8 @@ class VaultListPresenter @Inject constructor( // moveVaultPositionUseCase, // licenseCheckUseCase, // updateCheckUseCase, // - updateUseCase + updateUseCase, // + updateVaultParameterIfChangedRemotelyUseCase ) } } diff --git a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java index 699008f65..874b49ee9 100644 --- a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java +++ b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java @@ -1,5 +1,11 @@ package org.cryptomator.presentation.presenter; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static java.util.Arrays.asList; + import android.app.Activity; import org.cryptomator.data.util.NetworkConnectionCheck; @@ -20,6 +26,7 @@ import org.cryptomator.domain.usecases.vault.RenameVaultUseCase; import org.cryptomator.domain.usecases.vault.SaveVaultUseCase; import org.cryptomator.domain.usecases.vault.UnlockToken; +import org.cryptomator.domain.usecases.vault.UpdateVaultParameterIfChangedRemotelyUseCase; import org.cryptomator.presentation.exception.ExceptionHandlers; import org.cryptomator.presentation.model.VaultModel; import org.cryptomator.presentation.model.mappers.CloudFolderModelMapper; @@ -37,12 +44,6 @@ import java.util.Collections; import java.util.List; -import static java.util.Arrays.asList; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - public class VaultListPresenterTest { private static final String A_NEW_VAULT_NAME = "Haribo"; @@ -103,6 +104,7 @@ public class VaultListPresenterTest { private DoLicenseCheckUseCase doLicenceCheckUsecase = Mockito.mock(DoLicenseCheckUseCase.class); private DoUpdateCheckUseCase updateCheckUseCase = Mockito.mock(DoUpdateCheckUseCase.class); private DoUpdateUseCase updateUseCase = Mockito.mock(DoUpdateUseCase.class); + private UpdateVaultParameterIfChangedRemotelyUseCase updateVaultParameterIfChangedRemotelyUseCase = Mockito.mock(UpdateVaultParameterIfChangedRemotelyUseCase.class); private NetworkConnectionCheck networkConnectionCheck = Mockito.mock(NetworkConnectionCheck.class); private FileUtil fileUtil = Mockito.mock(FileUtil.class); private AuthenticationExceptionHandler authenticationExceptionHandler = Mockito.mock(AuthenticationExceptionHandler.class); @@ -125,6 +127,7 @@ public void setup() { doLicenceCheckUsecase, // updateCheckUseCase, // updateUseCase, // + updateVaultParameterIfChangedRemotelyUseCase, // networkConnectionCheck, // fileUtil, // authenticationExceptionHandler, // From 7758971d99c87dbf2a46d5284aabb03d18e91267 Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Mon, 14 Feb 2022 17:52:34 +0100 Subject: [PATCH 23/35] New Crowdin updates (#404) New translations strings.xml (Bengali, Chinese Simplified, Czech, Dutch, French, German, Greek, Hebrew, Hindi, Indonesian, Japanese, Polish, Portuguese, Brazilian, Russian, Slovak, Spanish, Thai, Turkish, Ukrainian) --- .../src/main/res/values-bn-rBD/strings.xml | 157 ++++++++++++++++++ .../src/main/res/values-cs-rCZ/strings.xml | 11 ++ .../src/main/res/values-de-rDE/strings.xml | 4 +- .../src/main/res/values-el-rGR/strings.xml | 2 + .../src/main/res/values-es-rES/strings.xml | 2 + .../src/main/res/values-fr-rFR/strings.xml | 2 + .../src/main/res/values-hi-rIN/strings.xml | 11 ++ .../src/main/res/values-in-rID/strings.xml | 60 +++---- .../src/main/res/values-iw-rIL/strings.xml | 100 +++++++++++ .../src/main/res/values-ja-rJP/strings.xml | 112 ++++++------- .../src/main/res/values-nl-rNL/strings.xml | 2 + .../src/main/res/values-pl-rPL/strings.xml | 2 + .../src/main/res/values-pt-rBR/strings.xml | 2 + .../src/main/res/values-pt-rPT/strings.xml | 2 + .../src/main/res/values-ru-rRU/strings.xml | 2 + .../src/main/res/values-sk-rSK/strings.xml | 2 + .../src/main/res/values-th-rTH/strings.xml | 8 + .../src/main/res/values-tr-rTR/strings.xml | 2 + .../src/main/res/values-uk-rUA/strings.xml | 24 +++ .../src/main/res/values-zh-rCN/strings.xml | 2 + 20 files changed, 423 insertions(+), 86 deletions(-) create mode 100644 presentation/src/main/res/values-bn-rBD/strings.xml diff --git a/presentation/src/main/res/values-bn-rBD/strings.xml b/presentation/src/main/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..e2a575588 --- /dev/null +++ b/presentation/src/main/res/values-bn-rBD/strings.xml @@ -0,0 +1,157 @@ + + + + এনক্রিপ্ট করুন + + একটি ত্রুটি ঘটেছে + সনাক্তকরণ ব্যর্থ হয়েছে + সনাক্তকরণ ব্যর্থ হয়েছে, অনুগ্রহ করে %1$s ব্যবহার করে লগইন করুন + কোনো নেটওয়ার্ক সংযোগ নেই + ভুল পাসওয়ার্ড + একটি ফাইল অথবা ফোল্ডার ইতিমধ্যে রয়েছে। + অসমর্থিত ভোল্ট। এই ভোল্টটি ক্রিপ্টোমেটরের অন্য একটি ভার্সন দিয়ে তৈরি হয়েছিল। + ভোল্টটি ইতিমধ্যে রয়েছে। + ফাইলটি নেই। + ভোল্টটি লক করা হয়েছে। + ফাইলটি খুলতে পারে এমন একটি আ্যপ ডাউনলোড করুন। + সার্ভার খুজে পাওয়া যায়নি। + অনুগ্রহ করে ডিভাইস সেটিংস খুলে নিজে স্ক্রিন লক লাগিয়ে নিন। + এক্সপোর্ট ব্যর্থ হয়েছে। ফাইলের নাম থেকে বিশেষ অক্ষরগুলো সরিয়ে আবার এক্সপোর্ট করুন। + বিশেষ অক্ষর থাকা যাবে। + ফাইলের নামে বিশেষ অক্ষর থাকা যাবে না। + ভোল্ট নামে বিশেষ অক্ষর থাকা যাবে না। + সাধারণ ত্রুটি, হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে। + হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে। গণনা করা হ্যাশ আপলোড করা ফাইলের সাথে মেলে না + ইন্টারনেট সংযোগ নেই। হালনাগাদ পরীক্ষায় ব্যর্থ হয়েছে। + WebDev পাসওয়ার্ড ডিক্রিপশন ব্যর্থ হয়েছে, অনুগ্রহ করে সেটিংসে পুনরায় যোগ করুন + গুগল প্লে সার্ভিস ইন্সটল করা নয়। + বায়োমেট্রিক সনাক্তকরণ ব্যর্থ হয়েছে + %1$s এ ভার্সনটি %2$s এর ভার্সন থেকে ভিন্ন + %1$s এই %2$s এর সাথে মেলে না + ভোল্ট কোনফিগারেশন লোডিংএ সাধারণ ত্রুটি দেখা দিয়েছে + ক্রিপ্টোমেটরে ফিরে যাওয়ার পর লোকাল ফাইলটি বিদ্যমান নয়। তাই সম্ভাব্য পরিবর্তনগুলো আবার ক্লাউডে স্থানান্তর করা হবে না। + + + সিস্টেম স্টোরেজ + + + সেটিংস + খুঁজুন + পিছনে + পরবর্তী + সাজান + A - Z + Z - A + নতুন থেকে + পুরনো থেকে + বড় আকারের থেকে + ছোট আকারের থেকে + + + ক্রিপ্টোমেটরে যুক্ত করুন + নতুন ভোল্ট তৈরি করুন + বিদ্যমান কোনো ভোল্ট যুক্ত করুন + বাতিল + নতুন ভোল্ট তৈরি করতে এখানে ক্লিক করুন + পাসওয়ার্ড সফলভাবে পরিবর্তিত হয়েছে + + ভোল্ট + মাস্টার কী ফাইলটি নির্বাচন করুন + এখানে রাখুন + ভোল্টের নাম: %1$s + + %1$s স্থানান্তর করুন + %2$d আইটেম স্থানান্তর করুন + + স্থানান্তর করুন + খালি ফোল্ডার + %1$s আগে পরিবর্তিত হয়েছে + শেয়ার করুন + একটি গন্তব্য নির্বাচন করুন + বাছুন + শেয়ার করার মত কিছু নেই + %1$s এ যুক্ত করুন + ফোল্ডার তৈরি করুন + টেক্সট ফাইল তৈরি করুন + ফাইল আপলোড করুন + ফাইল + ফাইল এক্সপোর্ট হয়েছে + ফাইলগুলো এক্সপোর্ট হয়েছে + এক্সপোর্ট করার মত কিছু নেই + ডাউনলোড ডিরেক্টরি তৈরিতে ব্যর্থ হয়েছে + শেয়ার + নাম পরিবর্তন করুন + এডিট + এক্সপোর্ট + মুছুন + খোলা হক… + আইটেম বাছুন + %1$dটি নির্বাচিত + নির্বাচন করুন + সবগুলো নির্বাচন করুন + রিফ্রেশ + কোনো সংযোগ নেই + পুনরায় চেষ্টা করুন + + সফলভাবে সংরক্ষিত হয়েছে + + %1$s … তে সংরক্ষণ করুন + টেক্সট + ফাইল + ফাইল + ফাইলের নাম অনন্য হতে হবে, অনুগ্রহ করে একই নাম পরিবর্তন করুন। + সংরক্ষণের ঠিকানা + সংরক্ষণ করুন + এনক্রিপশন সম্পন্ন হয়েছে + + ক্লাউড পরিষেবা + + একটি ঠিকানা বাছাই করুন + ঠিকানা যোগ করতে এখানে ক্লিক করুন + + ইউআরএল + ব্যবহারকারীর নাম + পাসওয়ার্ড + কানেক্ট + URL খালি রাখা যাবে না। + URL টি ভুল। + ব্যবহারকারীর নাম খালি রাখা যাবে না। + পাসওয়ার্ড খালি থাকতে পারবে না। + + নাম প্রদর্শন করুন + নাম খালি হতে পারব না + + + পাসওয়ার্ড সেট করুন + পাসওয়ার্ড মেলেনা, আবার লিখুন। + সম্পন্ন হয়েছে + পুনরায় পাসওয়ার্ডটি লিখুন + দুর্বল + ভালো + শক্তিশালী + খুবই শক্তিশালী + + সাধারণ বিষয়াদি + ক্লাউড পরিষেবাসমূহ + বায়োমেট্রিক সনাক্তকরণ + বায়োমেট্রিক সনাক্তকরণ সক্রিয় করুন + স্ক্রিনশট নিতে বাধা দিন + খুঁজুন + + + + + + + বাতিল + + + + + + + + + + + diff --git a/presentation/src/main/res/values-cs-rCZ/strings.xml b/presentation/src/main/res/values-cs-rCZ/strings.xml index 0e14cf7b7..2b25ada53 100644 --- a/presentation/src/main/res/values-cs-rCZ/strings.xml +++ b/presentation/src/main/res/values-cs-rCZ/strings.xml @@ -16,6 +16,7 @@ Cloud již existuje. Stáhněte si prosím aplikaci, která umí otevřít tento soubor. Server nenalezen. + Otevřete prosím nastavení zařízení a nastavte zámek obrazovky ručně Export se nezdařil. Zkuste odstranit speciální znaky z názvů souborů a znovu exportovat. Nesmí obsahovat speciální znaky. Názvy souborů nesmí obsahovat speciální znaky. @@ -23,8 +24,11 @@ Kontrola aktualizací se nezdařila. Došlo k obecné chybě. Kontrola aktualizace se nezdařila. Hash neodpovídá nahranému souboru Kontrola aktualizací se nezdařila. Žádné připojení k internetu. + Dešifrování WebDAV hesla se nezdařilo, přidejte jej prosím znovu do nastavení Obchod Google Play není nainstalován Ověření pomocí otisků prstů selhalo + Verze zadaná v %1$s se liší od verze %2$s + %1$s se neshoduje s %2$s Obecná chyba při načítání konfigurace trezoru Místní soubor již není přítomen po přepnutí zpět na Cryptomator. Možné změny nelze promítnout zpět do cloudu. Bucket neexistuje @@ -37,6 +41,7 @@ Cryptomator potřebuje přístup k úložišti pro export souborů Cryptomator potřebuje přístup k úložišti pro nahrávání souborů Cryptomator potřebuje přístup k úložišti pro sdílení souborů + Cryptomator ztratil oprávnění pro přístup k tomuto umístění. Prosím vyberte tuto složku znovu pro obnovení oprávnění. Nastavení Vyhledat Předchozí @@ -196,6 +201,7 @@ Ponechat odemčené Ponechat trezory odemčené při úpravách souborů + Spojení OneDrive Připojení WebDAV pCloud připojení S3 připojení @@ -218,6 +224,7 @@ Hesla se neshodují. Trezor %1$s nebyl nalezen + Trezor byl přejmenován, přesunut nebo odstraněn. Odstraňte tento trezor ze seznamu a znovu jej přidejte pro pokračování. Odstranit nyní? Odstranit Soubor již existuje Nahradit @@ -286,6 +293,9 @@ Jiná aplikace zobrazuje něco nad Cryptomatorem (např. filtr modrého světla nebo aplikace pro noční režim). Z bezpečnostních důvodů je Cryptomator zakázán.\n\nJak povolit Cryptomator Zavřít Prosím znovu přidejte trezory pro %1s cloud + Při migraci na tuto verzi aplikace musíme z aplikace odstranit následující trezory:\n%2s \n\nTyto trezory nejsou odebrány z cloudu, ale pouze z této aplikace. Omlouváme se za nepříjemnosti a znovu přidejte tyto trezory, abyste s nimi mohli dále pracovat. + Trezor je kořenovou složkou cloudového připojení + Vytvořte nové připojení do cloudu, kde jako kořenový adresář zvolíte alespoň nadřazenou složku tohoto trezoru. Toto nastavení je bezpečnostní funkce a brání ostatním aplikacím v tom, aby oklamaly uživatele dělat věci, se kterými nesouhlasí.\n\nZakázáním potvrzujete, že jste si vědomi rizik. Opravdu chcete odstranit toto cloudové připojení? Tato akce odstraní cloudové připojení a všechny trezory tohoto cloudu. @@ -365,6 +375,7 @@ Otevřít zapisovatelný soubor Trezor zůstane odemknutý dokud nejsou dokončené úpravy Nainstalována aktuální verze + Ověřování… Mezipaměť Uložit nedávno otevřené soubory šifrovaně do lokální mezipaměti pro pozdější použití Velikost mezipaměti diff --git a/presentation/src/main/res/values-de-rDE/strings.xml b/presentation/src/main/res/values-de-rDE/strings.xml index d8504bd1a..160e309a1 100644 --- a/presentation/src/main/res/values-de-rDE/strings.xml +++ b/presentation/src/main/res/values-de-rDE/strings.xml @@ -28,7 +28,7 @@ Die Google Play Services sind nicht installiert Biometrischer Login abgebrochen Die in %1$s angegebene Version ist nicht identisch mit der Version in %2$s - %1$s-Datei stimmt nicht mit der %2$s-Datei überein + %1$s stimmt nicht mit %2$s überein Allgemeiner Fehler beim Laden der Tresorkonfiguration Lokale Datei ist nach dem Zurückwechseln zu Cryptomator nicht mehr vorhanden. Mögliche Änderungen können nicht in die Cloud übertragen werden. Bucket existiert nicht @@ -199,6 +199,7 @@ Entsperrt bleiben Halte Tresore geöffnet während dem Editieren einer Datei + OneDrive Verbindungen WebDAV-Verbindungen pCloud-Verbindungen S3-Verbindungen @@ -372,6 +373,7 @@ Datei mit Schreibrechten geöffnet Tresor bleibt entsperrt bis die Datei nicht mehr editiert wird Neueste Version installiert + Melde an… Zwischenspeicher Speichere kürzlich geöffnete Dateien lokal und verschlüsselt auf dem Gerät für eine spätere Wiederverwendung beim erneuten öffnen Zwischenspeichergröße insgesamt diff --git a/presentation/src/main/res/values-el-rGR/strings.xml b/presentation/src/main/res/values-el-rGR/strings.xml index b964817b0..001cc4555 100644 --- a/presentation/src/main/res/values-el-rGR/strings.xml +++ b/presentation/src/main/res/values-el-rGR/strings.xml @@ -199,6 +199,7 @@ Κρατήστε ξεκλείδωτο Κρατήστε τις κρύπτες ξεκλειδωμένες κατά την επεξεργασία αρχείων + Συνδέσεις OneDrive Συνδέσεις WebDAV Συνδέσεις pCloud Συνδέσεις S3 @@ -372,6 +373,7 @@ Άνοιγμα εγγράψιμου αρχείου Η κρύπτη παραμένει ξεκλείδωτη μέχρι να τελειώσει η επεξεργασία Τελευταία έκδοση εγκατεστημένη + Ταυτοποίηση… Προσωρινή μνήμη Η προσωρινή μνήμη απέκτησε πρόσφατα πρόσβαση σε αρχεία που έχουν κρυπτογραφηθεί τοπικά στη συσκευή για μελλοντική επαναχρησιμοποίηση όταν ανοίξουν ξανά Συνολικό μέγεθος προσωρινής μνήμης diff --git a/presentation/src/main/res/values-es-rES/strings.xml b/presentation/src/main/res/values-es-rES/strings.xml index 89af69212..570fb2789 100644 --- a/presentation/src/main/res/values-es-rES/strings.xml +++ b/presentation/src/main/res/values-es-rES/strings.xml @@ -199,6 +199,7 @@ Mantener desbloqueado Mantener las bóvedas desbloqueadas durante la edición de archivos + Conexiones de OneDrive Conexiones de WebDAV Conexiones de pCloud Conexiones S3 @@ -372,6 +373,7 @@ Abrir archivo escribible La bóveda permanece desbloqueada hasta finalizar la edición Última versión instalada + Autenticando… Caché Almacene en caché los archivos a los que se accedió recientemente cifrados localmente en el dispositivo para su posterior reutilización cuando se vuelva a abrir Tamaño total de la caché diff --git a/presentation/src/main/res/values-fr-rFR/strings.xml b/presentation/src/main/res/values-fr-rFR/strings.xml index 4f5663abc..a32fd77a1 100644 --- a/presentation/src/main/res/values-fr-rFR/strings.xml +++ b/presentation/src/main/res/values-fr-rFR/strings.xml @@ -199,6 +199,7 @@ Maintenir deverouillé Gardez les coffres forts déverrouillées pendant l\'édition des fichiers + Connexions OneDrive Connexions WebDAV Connexions pCloud Connexions S3 @@ -372,6 +373,7 @@ Ouvrir un fichier accessible en écriture Le coffre-fort reste déverrouillé jusqu\'à la fin des modifications Dernière version installée + Authentification en cours… Cache Mettre en cache les fichiers récemment consultés chiffrés localement sur l\'appareil pour une réutilisation lors d\'une réouverture ultérieure Taille totale du cache diff --git a/presentation/src/main/res/values-hi-rIN/strings.xml b/presentation/src/main/res/values-hi-rIN/strings.xml index 6c5b4ef43..65cdd4c70 100644 --- a/presentation/src/main/res/values-hi-rIN/strings.xml +++ b/presentation/src/main/res/values-hi-rIN/strings.xml @@ -10,7 +10,10 @@ गलत कूटशब्द! दस्तावेज आथ्वा फ़ोल्डर उपलब्ध नहीं है दस्तावेज उपलब्ध नहीं है + कृपया एक ऐप डाउनलोड करें जो इस फाइल को खोल सकता है। सर्वर नहीं मिला। + फ़ाइल नामों में विशेष वर्ण नहीं हो सकते हैं। + गुप्त तिजोरी के नाम में विशेष वर्ण नहीं हो सकते हैं। @@ -19,14 +22,19 @@ खोज करें पिछला अगला + सबसे नया पहले + सबसे पुराना पहले क्रिप्टोमेटर में जोड़ें हटाएँ गुप्त तिजोरी + मूव करें चुनें + फोल्डर बनाएं नया दस्तावेज बनाए + फ़ाइल अपलोड करें दस्तावेज दस्तावेज निर्यात हुआ दस्तावेज निर्यात हुए @@ -62,6 +70,8 @@ क्षेत्र + गुप्त तिजोरी का नाम + बनाएं हो गया कमजोर @@ -79,6 +89,7 @@ अनलॉक करें हटाएँ + गुप्त तिजोरी बनाएं लॉक करें बंद करें पीछे जाएं diff --git a/presentation/src/main/res/values-in-rID/strings.xml b/presentation/src/main/res/values-in-rID/strings.xml index 399ee6539..f6baeb881 100644 --- a/presentation/src/main/res/values-in-rID/strings.xml +++ b/presentation/src/main/res/values-in-rID/strings.xml @@ -4,15 +4,15 @@ Enkripsi Kesalahan terjadi - Otentikasi gagal - Otentikasi gagal, mohon masuk menggunakan %1$s + Autentikasi gagal + Autentikasi gagal, mohon masuk menggunakan %1$s Tidak ada koneksi jaringan Kata sandi salah Berkas atau folder sudah ada. Vault tidak didukung. Vault ini telah dibuat dengan Cryptomator versi lain. Vault sudah ada. Berkas tidak ada. - Vaukt telah terkunci. + Vault telah dikunci. Cloud sudah ada. Silakan unduh aplikasi yang dapat membuka file ini. Server tidak ditemukan. @@ -26,11 +26,11 @@ Pemeriksaan pembaruan gagal. Tidak ada koneksi internet. Gagal mendekripsi kata sandi WebDAV, harap tambahkan kembali di pengaturan Google Play Services belum terpasang - Otentikasi biometrik gagal + Autentikasi biometrik dibatalkan Versi yang ditentukan di %1$s berbeda dengan %2$s %1$s tidak cocok dengan %2$s ini Terjadi kesalahan saat memuat konfigurasi vault - File lokal tidak ada lagi setelah beralih kembali ke Cryptomator. Kemungkinan perubahan tidak dapat disebarkan kembali ke cloud. + File lokal sudah tidak tersedia setelah beralih kembali ke Cryptomator. Perubahan yang ada tidak dapat disimpan kembali ke cloud. Bucket tidak ada Lokasi Masterkey khusus belum didukung @@ -57,9 +57,9 @@ Tambah ke Cryptomator Buat vault baru - Tambahkan vault yang ada + Tambahkan vault yang sudah ada Hapus - Klik disini untuk membuat vault baru + Ketuk disini untuk membuat vault baru Kasa Sandi berhasil diubah Vault @@ -70,7 +70,7 @@ Pindah %2$d item ke Pindah - Filder kosong + Folder kosong dimodifikasi %1$s lalu Bagikan dengan Pilih tujuan @@ -113,7 +113,7 @@ Layanan Cloud Pilih lokasi - Klik disini untuk menambahkan lokasi + Ketuk disini untuk menambahkan lokasi Server tampaknya tidak kompatibel dengan WebDAV Tidak ada lokasi tambahan yang tersedia. @@ -155,11 +155,11 @@ Umum Layanan cloud - Otentikasi biometrik - Aktifkan otentikas biometrik + Autentikasi biometrik + Aktifkan autentikasi biometrik Konfirmasi face unlock (jika tersedia) - Blokir aplikasi saat disamarkan - Blokir mencegat input dan menampilkan antarmuka pengguna yang salah + Blokir aplikasi ketika dihalangi + Memblokir pembajakan input serta tampilan antarmuka pengguna yang menyesatkan Blokir screenshot Blokir screenshot di daftar terbaru dan di dalam aplikasi Cari @@ -173,7 +173,7 @@ Unggah foto otomatis Pilih vault untuk unggah Aktifkan - Ambil gambar di background dan setelah vault yang dipilih dibuka, mulai mengunggah + Ambil gambar di background, kemudian mulai proses unggah setelah vault terpilih dibuka Unggah instan Unggah langsung jika vault tidak terkunci Hanya unggah melalui WIFI @@ -198,11 +198,12 @@ Biarkan tidak terkunci Biarkan vault tidak terkunci saat mengedit file + Koneksi OneDrive Koneksi WebDAV koneksi pCloud Koneksi S3 Lokasi penyimpanan lokal - Masuk ke + Login ke Keluar dari @@ -235,7 +236,7 @@ Menimpa file? Menimpa file? Tidak dapat membagikan file - Anda belum menyiapkan vault apa pun. Silakan buat vault baru dengan aplikasi Cryptomator terlebih dahulu. + Anda belum menyiapkan vault sama sekali. Silahkan buat vault baru terlebih dahulu melalui aplikasi Cryptomator. OK Buat vault Tidak dapat membuka %1$s @@ -255,7 +256,7 @@ Mohon tunggu… Membuat folder… Membuat file teks… - Otentikasi… + Autentikasi… Mengganti nama… Menghapus… Membuka vault… @@ -277,16 +278,16 @@ Tidak ada kunci layar yang disetel. Untuk menyimpan kredensial Anda dengan cara yang aman, atur dengan OK pola atau kata sandi. Atur kunci layar? Atur kunci layar - Tidak ada otentikasi dasar yang diatur dalam sistem + Tidak ada autentikasi dasar yang disetel dalam sistem Daftarkan setidaknya satu jari/wajah untuk menggunakan layanan ini. - Dalam mode ini, data sensitif dapat ditulis ke file log di perangkat Anda (misalnya, nama file dan jalur). Kata sandi, cookie, dll. secara eksplisit dikecualikan.\n\nIngat untuk menonaktifkan mode debug sesegera mungkin. + Dalam mode ini, data sensitif dapat ditulis ke file log di perangkat Anda (misalnya, nama dan lokasi file). Kata sandi, cookie, dll secara eksplisit dikecualikan.\n\nJangan lupa untuk menonaktifkan mode debug sesegera mungkin. Perhatian - Aktif - Setelan ini adalah fitur keamanan dan mencegah aplikasi lain menipu pengguna agar melakukan hal-hal yang tidak ingin mereka lakukan.\n\nDengan menonaktifkan, Anda mengonfirmasi bahwa Anda sadar akan risiko. + Aktifkan + Setelan ini adalah fitur keamanan yang dapat mencegah aplikasi lain menipu pengguna agar melakukan hal-hal yang tidak ingin mereka lakukan.\n\nDengan menonaktifkan, artinya mengonfirmasi bahwa Anda paham dengan resikonya. Perhatian Matikan - Aplikasi tidak jelas - Aplikasi lain menampilkan sesuatu di atas Cryptomator (misal, Filter cahaya biru atau aplikasi mode malam). Untuk alasan keamanan, Cryptomator dinonaktifkan.\n\nCara mengaktifkan Cryptomator + Aplikasi terhalang + Aplikasi lain menampilkan sesuatu di atas tampilan Cryptomator (misal, Filter cahaya biru atau aplikasi mode malam). Untuk alasan keamanan, Cryptomator dinonaktifkan.\n\nCara mengaktifkan Cryptomator Tutup Harap tambahkan kembali vault untuk cloud %1s Saat bermigrasi ke versi aplikasi ini, kita perlu menghapus vault berikut dari aplikasi:\n%2s \n\nVault tersebut tidak dihapus dari cloud, tetapi hanya dari aplikasi ini. Maaf atas ketidaknyamanan ini dan harap tambahkan kembali vault ini untuk terus bekerja dengannya. @@ -299,8 +300,8 @@ Anda yakin ingin menghapus item ini? Anda yakin ingin menghapus berkas ini? Ini akan menghapus semua isi folder. Anda yakin ingin menghapus folder ini? - Fitur otentikasi biometrik dinonaktifkan - Karena kunci telah dibatalkan, fitur otentikasi biometrik telah dinonaktifkan. Untuk mengaktifkan kembali, buka pengaturan Cryptomator. + Fitur autentikasi biometrik dinonaktifkan + Karena kunci telah dibatalkan, fitur autentikasi biometrik telah dinonaktifkan. Untuk mengaktifkan kembali, buka pengaturan Cryptomator. Berikan lisensi yang valid Kami mendeteksi bahwa Anda menginstal Cryptomator tanpa menggunakan Google Play Store. Berikan lisensi yang valid, yang dapat dibeli di https://cryptomator.org/android/ Lisensi yang diberikan tidak valid. Pastikan Anda memasukkannya dengan benar. @@ -322,7 +323,7 @@ Folder cloud \'%1$s\' tidak memiliki file direktori yang valid. Bisa jadi folder tersebut dibuat di perangkat lain dan belum sepenuhnya tersinkronisasi ke cloud. Harap periksa di cloud Anda jika file berikut ada dan tidak kosong:\n%2$s Tidak ada lagi gambar untuk ditampilkan… Kredensial \'%1$s\' diperbarui - Jika Anda ingin menambahkan akun pCloud baru, klik url ini www.pcloud.com, keluar dari akun saat ini dan klik lagi \'+\' di aplikasi ini untuk membuat koneksi cloud baru. + Jika Anda ingin menambahkan akun pCloud baru, ketuk url berikut www.pcloud.com, keluar dari akun saat ini kemudian ketuk tombol \'+\' lagi di aplikasi ini untuk membuat koneksi cloud baru. Cryptomator membutuhkan akses penyimpanan untuk menggunakan vault lokal Cryptomator membutuhkan akses penyimpanan untuk menggunakan unggahan foto otomatis @@ -350,10 +351,10 @@ tahun tahun - Masuk dengan biometrik + Login dengan biometrik Buka kunci dengan kredensial biometrik Gunakan kata sandi vault - Tidak dapat mengunggah file + Tidak dapat mengunggah file secara otomatis Vaults tidak terkunci: %1$d Otomatis terkunci dalam %1$s @@ -371,8 +372,9 @@ Buka file yang dapat ditulis Vault tetap tidak terkunci sampai selesai mengedit Versi terbaru sudah terpasang + Mengautentikasi… Cache - Cache file yang baru saja diakses yang dienkripsi secara lokal di perangkat untuk digunakan kembali nanti saat dibuka kembali + Gunakan cache yang terenkripsi di perangkat lokal untuk file yang baru-baru ini diakses agar bisa digunakan lagi ketika dibuka kembali Total ukuran cache Bersihkan Cache Perubahan akan diterapkan pada saat aplikasi dibuka kembali diff --git a/presentation/src/main/res/values-iw-rIL/strings.xml b/presentation/src/main/res/values-iw-rIL/strings.xml index b7c128f55..ecce94b77 100644 --- a/presentation/src/main/res/values-iw-rIL/strings.xml +++ b/presentation/src/main/res/values-iw-rIL/strings.xml @@ -5,6 +5,7 @@ ארעה שגיאה האימות נכשל + האימות נכשל, אנא התחבר באמצעות %1$s אין חיבור לרשת סיסמה שגויה כבר קיימים תיקייה או קובץ בשם זה. @@ -15,11 +16,31 @@ אחסון ענן זה כבר בשימוש. אנא הורד אפליקציה שתומכת בפתיחה של קובץ זה. שרת לא נמצא. + אנא הפעל מסך נעילה בהגדרות המכשיר + הייצוא נכשל. מחק תווים מיוחדים משמות הקבצים ונסה שוב. + הקלט לא יכול להכיל תווים מיוחדים. + שם קובץ לא יכול להכיל תווים מיוחדים. + שם הכספת לא יכול להכיל תווים מיוחדים. + עדכון גרסה נכשל. התרחשה שגיאה כללית. + עדכון גרסה נכשל. אין תאימות בין הקובץ שהועלה לערך ה hash שחושב + עדכון גרסה נכשל. אין חיבור לאינטרנט. + פענוח סיסמת WebDAV נכשל, וודא בהגדרות האפליקצייה שהסיסמה שהוכנסה נכונה + שירותי Google Play אינם מותקנים + אימות ביומטרי הופסק + הגרסה ב %1$s שונה מזו שב %2$s + %1$s ו %2$s אינם תואמים + שגיאה כללית בזמן טעינת הגדרות הכספת + דלי לא נמצא + שינוי מיקום ה Masterkey עדיין לא נתמך אחסון מקומי + Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לייצא קבצים + Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי להעלות קבצים + Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לשתף קבצים + Cryptomator איבד את הרשאות הגישה לתיקייה זו. אנא בחר תיקייה זו בשנית כדי להחזיר את הרשאה. הגדרות חיפוש הקודם @@ -42,6 +63,7 @@ כספת בחר קובץ masterkey + מקם כאן שם כספת: %1$s שנה מיקום תיקיה ריקה @@ -49,7 +71,16 @@ שתף באמצעות בחר מיקום חדש בחר + אין מה לשתף + הוסף ל %1$s + צור תיקייה + צור קובץ טקסט + העלה קובצים קבצים + הקובץ יוצא + הקבצים יוצאו + אין מה לייצא + יצירת תיקייה להורדות נכשלה שתף שנה שם ערוך @@ -70,6 +101,7 @@ טקסט קובץ קבצים + שם קובץ חייב להיות ייחודי. אנא שנה שמות קבצים בעלי שם זהה. מיקום שמירה שמור הצפנה הושלמה @@ -77,6 +109,8 @@ שירותי אחסון בענן בחר מיקום + להוספת מיקומים, לחץ כאן + נראה שהשרת אינו תומך ב WebDAV כתובת URL שם משתמש @@ -87,28 +121,59 @@ יש להזין שם משתמש. יש להזין סיסמה. + שם תצוגה + מפתח גישה + מפתח סודי + דלי קיים + נקודת גישה + אזור + יש להזין שם תצוגה + יש להזין מפתח גישה + יש להזין מפתח סודי + יש להזין דלי + יש להזין מפתח גישה יש להזין שם כספת. שם כספת צור הגדר סיסמה + סיסמת האימות אינה תואמת לסיסמה שהוזנה. סיום + שים לב שאינך שוכח את סיסמתך! לא ניתן לשחזר את המידע שלך בחזרה מבלי הסיסמה. + חזור על הסיסמה + סיסמה חלשה מידי ליצירת כספת חלשה סבירה חזקה חזקה מאוד + כללי שירותי אחסון בענן אימות ביומטרי הפעל אימות ביומטרי + אפשר פתיחה באמצעות זיהוי פנים (במידה שזמין) + חסום צילומי מסך + חסום צילומי מסך באפליקציה וברשימת היישומים שנפתחו לאחרונה חיפוש + חפש באמצעות תבניות Glob + השתמש בתבניות Glob כדי לבצע חיפוש כדוגמת alice.*.jpg + נעילה אוטומטית + נעל לאחר + כאשר מסך המכשיר נכבה + העלאה אוטומטית של תמונות + בחר כספת להעלאת תמונות הפעל + העלאה מיידית + העלה רק כאשר המכשיר מחובר ל WiFi + העלה סרטוני וידאו + שמור קבצים מועלים אוטומטית ל… לאתר Cryptomator עקבו אחרינו ב-Twitter תנו לנו לייק ב-Facebook היבטים משפטיים רישיונות + תנאי שימוש תמיכה בקש תמיכה מצב ניפוי תקלות @@ -117,9 +182,11 @@ גרסה הגדרות מתקדמות + חיבורי OneDrive חיבורי WebDAV חיבורי pCloud חיבורי S3 + מקומות אחסון במכשיר התחבר אל התנתק מ @@ -141,13 +208,18 @@ הקובץ כבר קיים החלף כבר קיים קובץ בשם %1$s. + דלג על קיימים החלף הכל + החלף קיימים החלף להחליף את הקובץ? להחליף את הקבצים? + אין אפשרות לשתף את הקבצים + עדיין לא הגדרת כספת. צור כספת חדשה בעזרת אפליקציית Cryptomator. אישור צור כספת חדשה הקובץ %1$s לא נתמך + לא נמצאה אפליקצייה שיכולה להציג את הקובץ. האם תרצה לשמור קובץ זה על המכשיר? שנה שם כספת שנה שם תיקיה שינוי שם קובץ @@ -156,6 +228,7 @@ ביטול text.txt אתה בטוח שברצונך למחוק כספת זו? + פעולה זו תעלים את הכספת מהרשימה, אך לא תמחק אותה לחלוטין ממקום האחסון. שולח… קובץ %1$d מתוך %2$d מיצא (%2$d/%1$d) @@ -177,10 +250,14 @@ תעודת SSL לא חוקית תעודת SSL לא חוקית. תרצה לבטוח בתעודה זו בכל מקרה? פרטים + פעולה זו יכולה לגרום לפרצות אבטחה. אני מבין מהם ההשלכות. + HTTP הוא פרוטוקול לא מאובטח. אנו ממליצים להשתמש ב HTTPS במקום. אם אתה מבין את הסיכונים בכך, אתה יכול להמשיך להשתמש ב HTTP. עבור ל-HTTPS להשתמש ב-HTTPS? שים לב + הפעל שים לב + כבה אפליקציה אחרת מציגה משהו מעל Cryptomator (לדוגמה, אפליקציית סינון אור כחול למצב לילה). מטעמי אבטחה, Cryptomator ייסגר עכשיו.\n\nאיך להפעיל את Cryptomator סגור למחוק %1$d פריטים? @@ -195,14 +272,25 @@ יציאה מפתח הרישיון אומת תודה %1$s, על כך שהזנת מפתח רישיון תקין. + עדכון זמין + עדכן לגרסה החדשה ביותר של Cryptomator. לאחר שתסכים, העדכון ירד ברקע וכשההורדה תסתיים, תתבקש לבצע את ההתקנה. עדכן עכשיו + למעבר לאתר הההורדות מאוחר יותר מוריד מוריד את הגרסה העדכנית ביותר של Cryptomator + התיקייה היא קישור סימבולי + לא ניתן לנווט אל תוך קישור סימבולי זה חזור + טעינת תיקייה זו נכשלה + אין עוד תמונות להציג… + אם ברצונך להוסיף משתמש pCloud נוסף, לחץ על הקישור www.pcloud.com, התנתק מהמשתמש הנוכחי ולחץ על ה \'+\' באפליקצייה כדי להוסיף חיבור חדש. + Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי להשתמש בכספת מקומית + Cryptomator זקוק להרשאת גישה לזיכרון המכשיר כדי לבצע העלאה אוטומטית של תמונות + 0 kB bytes kB MB @@ -226,16 +314,28 @@ אימות ביומטרי התחבר באמצעות אימות ביומטרי + השתמש בסיסמת הכספת + לא ניתן לבצע העלאה אוטומטית של קבצים כספות פתוחות: %1$d נעילה אוטומטית בעוד %1$s נעל הכל + בטל העלאה + מתבצעת העלאה אוטומטית של תמונות מעלה %1d/%2d + העלאה אוטומטית של תמונות הסתיימה + העלאה אוטומטית של תמונות נכשלה + הכספת המוגדרת להעלאה אוטומטית של קבצים לא קיימת יותר. + הגרסה העדכנית ביותר מותקנת מטמון נפח מטמון נקה מטמון רשום עבור %1$s + בדוק עדכונים אוטומטית + חפש עדכונים + בדיקה אחרונה %1$s + גודל המטמון עבור כל שירות ענן מיידי דקה diff --git a/presentation/src/main/res/values-ja-rJP/strings.xml b/presentation/src/main/res/values-ja-rJP/strings.xml index 94a15db9d..98e936300 100644 --- a/presentation/src/main/res/values-ja-rJP/strings.xml +++ b/presentation/src/main/res/values-ja-rJP/strings.xml @@ -9,7 +9,7 @@ ネットワーク接続がありません パスワードが正しくありません ファイルかフォルダーが既に存在します。 - サポートされない金庫です。この金庫は別のバージョンの Cryptomator を使用して作成されました。 + サポートされない金庫です。この金庫は別のバージョンの Cryptomator で作成されました。 金庫が既に存在します。 ファイルが存在しません。 金庫が施錠されました。 @@ -20,18 +20,18 @@ エクスポートに失敗しました。ファイル名から特殊文字を削除して再度エクスポートしてください。 特殊文字を含めることはできません。 特殊文字を含むファイル名は使用できません。 - 特殊文字を含む金庫名は使用できません。 + 金庫名に特殊文字を含めることはできません。 更新の確認に失敗しました。エラーが発生しました。 更新の確認に失敗しました。ハッシュ値がアップロードされたファイルと一致しません。 更新の確認に失敗しました。インターネット接続がありません。 WebDAV パスワードの復号に失敗しました。設定を再度追加してください - Google Play Services がインストールされていません + Google Playサービスがインストールされていません 生体認証が中断されました %1$s で指定されたバージョンが %2$s と異なります %1$s はこの %2$s と一致しません 金庫の設定を読み込み中に失敗しました - Bucket がありません - 自由に Masterkey の場所を設定することはまだできません + バケットがありません + 好きな場所に Masterkey を置くことはまだできません ローカルストレージ @@ -44,7 +44,7 @@ 設定 検索 戻る - 次へ + 進む ソート A - Z Z - A @@ -77,16 +77,16 @@ テキスト ファイルを作成 ファイルをアップロード ファイル - エクスポートされたファイル - エクスポートされたファイル + ファイルをエクスポートしました + ファイルをエクスポートしました エクスポートするものがありません - ダウンロード ディレクトリの作成に失敗しました + ダウンロードディレクトリの作成に失敗しました 共有 - 名前の変更 + 名前を変更 編集 エクスポート 削除 - 次で開く… + …で開く アイテムを選択 %1$d 個選択済み 選択 @@ -101,15 +101,15 @@ テキスト ファイル ファイル - ファイル名は重複しない必要があります。名前を変更してください + ファイル名は重複してはなりません。名前を変更してください 保存先 保存 暗号化が完了しました - クラウド サービス + クラウド・サービス 接続先を選択 - ここをタップして場所を追加する + ここをタップして接続先を追加する サーバーに WebDAV との互換性がありません 追加の利用できる保存先はありません。 @@ -123,16 +123,16 @@ パスワードは空にできません。 表示名 - 接続キー - 秘密鍵 - 既存の Bucket + アクセスキー + シークレットキー + 既存のバケット エンドポイント - 地域 + リージョン 表示名は空にできません - 接続キーは空にできません - 秘密キーは空にできません - Bucket は空にできません - エンドポイントまたは地域は空にできません + アクセスキーは空にできません + シークレットキーは空にできません + バケットは空にできません + エンドポイントまたはリージョンは空にできません 金庫名は空にできません。 金庫の名前 @@ -150,10 +150,10 @@ 非常に強い 基本設定 - クラウド サービス + クラウド・サービス 生体認証 生体認証を有効にする - 顔認証のロック解除 (利用できる場合) + 顔認証のロック解除(利用できる場合) 他のアプリが重なるときにアプリを停止 入力をブロックし、偽のユーザー インターフェイスを表示する スクリーンショットをブロック @@ -164,7 +164,7 @@ glob パターンを使用して検索 alice.*.jpg のような glob パターン一致を使用する 自動的な施錠 - 次の場合にロックする + 次の場合に施錠する 画面がロックされたとき 自動的に画像をアップロード アップロードする金庫を選択 @@ -173,7 +173,7 @@ インスタントをアップロード 金庫が解錠されているときに直接アップロード WIFI を使用しているときのみアップロード - ビデオをアップロード + 動画をアップロード … へのファイルの自動アップロードを保存 Cryptomator のウェブサイト Twitter でフォローする @@ -184,12 +184,12 @@ サポート ヘルプを求める デバッグ モード - ログ ファイルを送信 + ログファイルを送信 送信できませんでした - セキュリティのヒント + セキュリティの心得 バージョン 高度な設定 - 解錠 + 高速な解錠 パスワードまたは生体による認証中に、バックグラウンドで金庫の設定をダウンロードします 解錠したままにする ファイルの編集中は金庫を解錠しておく @@ -197,13 +197,13 @@ WebDAV 接続 pCloud 接続 S3 接続 - ローカル ストレージの場所 + ローカル・ストレージの場所 ログイン 次からサインアウト %1$s は認証できませんでした。 - pCloud 資格情報を更新 + pCloud アカウント情報を更新 キャンセル @@ -225,7 +225,7 @@ すべて置換 今のものを置き換える 置換 - ファイル名 \"%1$s\" が既に存在します。置き換えますか? + ファイル名 \"%1$s\" が既に存在します。上書きしますか? すべてのファイルが既に存在します。すべて置き換えますか? %1$d ファイルが既に存在します。すべて置き換えますか? ファイルを置き換えますか? @@ -238,7 +238,7 @@ このファイルを開くことができるアプリをダウンロードしてください。それともデバイスに保存しますか? 金庫の名前を変更 フォルダーの名前を変更 - ファイルの名前を変更 + ファイル名を変更 保存していない変更があります 保存せずに終了してもよろしいですか? 破棄 @@ -266,51 +266,51 @@ 不正な SSL 証明書です SSL 証明書が無効です。それでも信頼しますか? 詳細 - これはセキュリティ リスクになる可能性があります。リスクについて理解していますか - HTTP の使用は安全ではありません。代わりに HTTPS を使用することを推奨します。リスクを承知の上であれば HTTP をご使用ください。 - HTTPS に変更 - HTTPS を使用しますか? + これはセキュリティリスクになる可能性があります。リスクについて理解していますか + HTTP は安全ではありません。代わりに HTTPS を使用することを推奨します。リスクを承知の上であれば HTTP をご使用ください。 + HTTPS を使用 + HTTPS を使用しますか? 画面ロックが設定されていません。認証情報を安全に保存するには、パターンまたはパスワードを設定してください。 - 画面ロックを設定しますか? + 画面ロックを設定しますか? 画面ロックを設定 システムに基本的な認証が設定されていません このサービスを利用するには少なくとも 1 つの指紋/顔を登録してください。 このモードでは、デバイスのログファイルに機密情報が書き込まれることがあります(例: ファイル名やパス)。パスワードや cookie 等は除外されます。\n\n できるだけ早くデバッグ モードを無効化をすることを忘れないでください。 注意 - 有効 + 有効にする この設定は安全のための機能です。他のアプリがユーザーを騙してしまうことを防ぎます。\n\n無効にすることで、 リスクを認識していること に留意する必要があります。 注意 無効 アプリが重なっています - 他のアプリケーションが Cryptomator の上に何かを表示しています (例: ブルーライト フィルターや night mode アプリ)。このため、セキュリティの観点から Cryptomator が無効化されています。\n\nCryptomator を有効にするには + 他のアプリケーションが Cryptomator の上に何かを表示しています(例: ブルーライト フィルターやナイト・モードアプリ)。このため、セキュリティの観点から Cryptomator が無効化されています。\n\nCryptomator を有効にするには 閉じる %1s クラウンドの金庫を再追加してください 金庫がクラウト接続のルート フォルダーです この設定は安全のための機能です。他のアプリがユーザーを騙してしまうことを防ぎます。\n\n無効にすることで、 リスクを認識していること に留意する必要があります。 本当にこのクラウド接続を削除しますか? この操作により、クラウド接続とクラウドのすべての金庫が削除されます。 - %1$d 個の項目を削除しますか? - 本当にこれらの項目を削除してもよろしいですか? + %1$d 個の項目を削除しますか? + 本当にこれらの項目を削除してもよろしいですか? 本当にこのファイルを削除してもよろしいですか? - この操作はフォルダーの内容をすべて削除します。本当にこのフォルダーを削除してもよろしいですか? + この操作はフォルダーの内容をすべて削除します。本当にこのフォルダーを削除してもよろしいですか? 生体認証機能が無効になりました - 鍵が無効になったため、生体認証が無効になりました。再度有効にするには、Cryptomator 設定を開いてください。 + 鍵が無効になったため、生体認証が無効になりました。再度有効にするには、Cryptomator の設定を開いてください。 有効なライセンスを入力してください - Google Play Store を使用せずに Cryptomator をインストールしたことを検出しました。有効なライセンスを購入してください: https://cryptomator.org/android/ + Google Play ストアを使用せずに Cryptomator をインストールしたことを検出しました。有効なライセンスを購入してください: https://cryptomator.org/android/ 入力されたライセンスが無効です。正しく入力されていることを確認してください。 ライセンスがありません。有効なライセンスを入力してください。 終了 - ライセンスの確認 + ライセンスの確認を完了 %1$s-san 有効なライセンスを入力していただきありがとうございます。 利用可能なアップデートがあります Cryptomator を最新のバージョンに更新します。OK を押すとバックグラウンドでアプリがダウンロードされ、インストール可能になると通知されます。 すぐに更新 - ダウンロード サイトに行く + ダウンロードサイトに行く あとで ダウンロード中 Cryptomator の最新バージョンをダウンロード中 - フォルダがシンボリック リンクです - このシンボリック リンクに移動することはできません + フォルダがシンボリックリンクです + このシンボリックリンクに移動することはできません 戻る ディレクトリのコンテンツを読み込むことができません 表示する画像がありません… @@ -375,12 +375,12 @@ 最終実行 %1$s クラウドごとのキャッシュ サイズ - インスタント - 1分 - 2分 - 5分 - 10分 - 無期限 + 即時 + 1分経過後 + 2分経過後 + 5分経過後 + 10分経過後 + ロックしない 50 MB 100 MB @@ -390,7 +390,7 @@ 5 GB 外観 - 自動 (システムに従う) + 自動(システムに従う) ライト ダーク diff --git a/presentation/src/main/res/values-nl-rNL/strings.xml b/presentation/src/main/res/values-nl-rNL/strings.xml index b7d858230..9555ccd2f 100644 --- a/presentation/src/main/res/values-nl-rNL/strings.xml +++ b/presentation/src/main/res/values-nl-rNL/strings.xml @@ -199,6 +199,7 @@ Ontgrendeld houden Houd kluizen ontgrendeld tijdens het bewerken van bestanden + OneDrive verbindingen WebDAV verbindingen pCloud verbindingen S3 verbindingen @@ -372,6 +373,7 @@ Open schrijfbaar bestand Kluis blijft ontgrendeld tot het bewerken voltooid is Laatste versie geïnstalleerd + Verifiëren… Cache Bewaar recent geopende bestanden versleuteld en lokaal op het apparaat voor later hergebruik Totale cache grootte diff --git a/presentation/src/main/res/values-pl-rPL/strings.xml b/presentation/src/main/res/values-pl-rPL/strings.xml index 06ad41373..0a34f5930 100644 --- a/presentation/src/main/res/values-pl-rPL/strings.xml +++ b/presentation/src/main/res/values-pl-rPL/strings.xml @@ -201,6 +201,7 @@ Zachowaj odblokowany Zachowaj odblokowane sejfy podczas edycji plików + Połączenia OneDrive Połączenia WebDAV Połączenia pCloud Połączenia S3 @@ -374,6 +375,7 @@ Otwórz plik zapisywalny Sejf pozostaje odblokowany do czasu zakończenia edycji Zainstalowano najnowszą wersję + Uwierzytelnianie… Pamięć podręczna Pamięć podręczna ostatnio uruchomionych plików zaszyfrowanych lokalnie na urządzeniu w celu ponownego użycia po ponownym otwarciu Rozmiar całkowity pamięci podręcznej diff --git a/presentation/src/main/res/values-pt-rBR/strings.xml b/presentation/src/main/res/values-pt-rBR/strings.xml index 6678a2dff..15ba8d4a7 100644 --- a/presentation/src/main/res/values-pt-rBR/strings.xml +++ b/presentation/src/main/res/values-pt-rBR/strings.xml @@ -199,6 +199,7 @@ Manter desbloqueado Mantenha cofres desbloqueados durante a edição de arquivos + Conexões OneDrive Conexões WebDAV conexões pCloud Conexões S3 @@ -372,6 +373,7 @@ Abrir arquivo gravável Cofre permanece desbloqueado até terminar de editar Versão mais recente instalada + Autenticando… Cache Cache de arquivos acessados recentemente criptografados localmente no dispositivo para reutilização posterior quando reaberto Tamanho total do cache diff --git a/presentation/src/main/res/values-pt-rPT/strings.xml b/presentation/src/main/res/values-pt-rPT/strings.xml index 2230353ad..092fbf672 100644 --- a/presentation/src/main/res/values-pt-rPT/strings.xml +++ b/presentation/src/main/res/values-pt-rPT/strings.xml @@ -40,6 +40,7 @@ Geral + Conexões do OneDrive @@ -56,6 +57,7 @@ + Autenticação… diff --git a/presentation/src/main/res/values-ru-rRU/strings.xml b/presentation/src/main/res/values-ru-rRU/strings.xml index 4cd391699..fa3baf338 100644 --- a/presentation/src/main/res/values-ru-rRU/strings.xml +++ b/presentation/src/main/res/values-ru-rRU/strings.xml @@ -201,6 +201,7 @@ Держать разблокированным Не блокировать при редактировании + Подключения OneDrive Подключения WebDAV Подключения pCloud Подключения S3 @@ -374,6 +375,7 @@ Открыть файл, доступный для записи Хранилище разблокировано до завершения редактирования Установлена новейшая версия + Аутентификация… Кэш Кэшировать зашифрованные локально на устройстве файлы, к которым недавно был доступ, для последующего использования при повторном открытии Общий размер кэша diff --git a/presentation/src/main/res/values-sk-rSK/strings.xml b/presentation/src/main/res/values-sk-rSK/strings.xml index 66c3ba80a..2ee484c1d 100644 --- a/presentation/src/main/res/values-sk-rSK/strings.xml +++ b/presentation/src/main/res/values-sk-rSK/strings.xml @@ -201,6 +201,7 @@ Držať odomknuté Držať trezory odomknuté pokiaľ sa editujú súbory + OneDrive pripojenia WebDAV pripojenia pCloud pripojenia S3 pripojenia @@ -374,6 +375,7 @@ Otvoriť zapisovateľný súbor Trezor zostáva odomknutý pokial nie je ukončené editovanie Najnovšia verzia inštalovaná + Autentikujem… Vyrovnávacia pamäť Nedávno sprístupnené súbory vyrovnávaciej pamäťe lokálne zašifrované na zariadení pre neskoršie použitie pri novom otvoreni Celková veľkosť vyrovovnávacej pamäte diff --git a/presentation/src/main/res/values-th-rTH/strings.xml b/presentation/src/main/res/values-th-rTH/strings.xml index 0c5cc3282..b3ae0ca6e 100644 --- a/presentation/src/main/res/values-th-rTH/strings.xml +++ b/presentation/src/main/res/values-th-rTH/strings.xml @@ -6,9 +6,11 @@ + ถัดไป + Vault @@ -17,13 +19,19 @@ + เสร็จสิ้น + ยกเลิก + ปลดล็อก + ล็อก + ปิด + ย้อนกลับ diff --git a/presentation/src/main/res/values-tr-rTR/strings.xml b/presentation/src/main/res/values-tr-rTR/strings.xml index ef4c48c22..19a9f8ba3 100644 --- a/presentation/src/main/res/values-tr-rTR/strings.xml +++ b/presentation/src/main/res/values-tr-rTR/strings.xml @@ -199,6 +199,7 @@ Kilidi açık tut Düzenlerken kasa kilidi açık + OneDrive bağlantıları WebDAV bağlantıları pCloud bağlantıları S3 bağlantıları @@ -372,6 +373,7 @@ Yazılabilir dosyayı aç Düzenleme tamamlanana kadar, uygulamalar kasası kilidi açık kalır En son sürüm yüklendi + Doğrulanıyor… Önbellek Yeniden açıldıklarında daha sonra yeniden kullanılmak üzere, cihazda yerel olarak şifrelenmiş yakın zamanda erişilen dosyaları önbelleğe alın Toplam önbellek boyutu diff --git a/presentation/src/main/res/values-uk-rUA/strings.xml b/presentation/src/main/res/values-uk-rUA/strings.xml index ebe8f04aa..9cd2874e9 100644 --- a/presentation/src/main/res/values-uk-rUA/strings.xml +++ b/presentation/src/main/res/values-uk-rUA/strings.xml @@ -250,18 +250,42 @@ Файл %1$d з %2$d Завантаження… Заблокувати + Використовувати HTTPS? + Увімкнути + Вимкнути Закрити Ця дія видалить підключення до хмари та всі сховища з цієї хмари. Видалити %1$d об\'єкти? Ви впевнені, що бажаєте видалити ці об\'єкти? Ви впевнені, що бажаєте видалити цей файл? + Вийти + Оновити зараз + Перейти на сторінку завантаження + Пізніше Назад + секунда + секунд + хвилину + хвилин + годин + годин + день + днів + тиждень + тижнів + місяць + місяців + рік + років + Біометричний вхід + Зареєстровано за + Перевiрити наявнiсть оновлень diff --git a/presentation/src/main/res/values-zh-rCN/strings.xml b/presentation/src/main/res/values-zh-rCN/strings.xml index 444d8f4ec..ea58d5ffa 100644 --- a/presentation/src/main/res/values-zh-rCN/strings.xml +++ b/presentation/src/main/res/values-zh-rCN/strings.xml @@ -198,6 +198,7 @@ 保持解锁状态 编辑文件时保持保险库解锁 + OneDrive 连接 WebDAV 连接 pCloud 连接 S3 连接 @@ -371,6 +372,7 @@ 打开可写文件 编辑期间保险库保持解锁 已安装最新版本 + 正在验证 … 缓存 缓存最近在本地加密的访问文件,用以下次快速加载 缓存总大小 From 7699943dced92158060058b1c8cafd72ff8b8d36 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 09:49:06 +0100 Subject: [PATCH 24/35] Update dependencies --- Gemfile.lock | 54 ++++++++++++++++++--------------- buildsystem/dependencies.gradle | 2 +- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 32f78abe1..e21da1079 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,24 +10,24 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.535.0) - aws-sdk-core (3.123.0) + aws-partitions (1.554.0) + aws-sdk-core (3.126.1) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.51.0) - aws-sdk-core (~> 3, >= 3.122.0) + aws-sdk-kms (1.54.0) + aws-sdk-core (~> 3, >= 3.126.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.107.0) - aws-sdk-core (~> 3, >= 3.122.0) + aws-sdk-s3 (1.112.0) + aws-sdk-core (~> 3, >= 3.126.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) bcrypt_pbkdf (1.1.0) - claide (1.0.3) + claide (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) @@ -38,19 +38,20 @@ GEM domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) - ed25519 (1.2.4) + ed25519 (1.3.0) emoji_regex (3.2.3) - excon (0.88.0) - faraday (1.8.0) + excon (0.91.0) + faraday (1.9.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) + faraday-net_http_persistent (~> 1.0) faraday-patron (~> 1.0) faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) @@ -59,14 +60,17 @@ GEM faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) faraday-net_http (1.0.1) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) + faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.5) - fastlane (2.198.1) + fastimage (2.2.6) + fastlane (2.204.3) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -111,9 +115,9 @@ GEM mime-types (~> 3.3) fastlane-plugin-get_version_name (0.2.2) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.13.0) + google-apis-androidpublisher_v3 (0.16.0) google-apis-core (>= 0.4, < 2.a) - google-apis-core (0.4.1) + google-apis-core (0.4.2) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -122,11 +126,11 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.8.0) + google-apis-iamcredentials_v1 (0.10.0) google-apis-core (>= 0.4, < 2.a) - google-apis-playcustomapp_v1 (0.6.0) + google-apis-playcustomapp_v1 (0.7.0) google-apis-core (>= 0.4, < 2.a) - google-apis-storage_v1 (0.9.0) + google-apis-storage_v1 (0.11.0) google-apis-core (>= 0.4, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) @@ -134,15 +138,15 @@ GEM google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.2.0) - google-cloud-storage (1.34.1) - addressable (~> 2.5) + google-cloud-storage (1.36.1) + addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) google-apis-storage_v1 (~> 0.1) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.1.0) + googleauth (1.1.1) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -153,13 +157,13 @@ GEM http-cookie (1.0.4) domain_name (~> 0.5) httpclient (2.8.3) - jmespath (1.4.0) + jmespath (1.6.0) json (2.6.1) jwt (2.3.0) memoist (0.16.2) mime-types (3.4.1) mime-types-data (~> 3.2015) - mime-types-data (3.2021.1115) + mime-types-data (3.2022.0105) mini_magick (4.11.0) mini_mime (1.1.2) multi_json (1.15.0) diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 364ce24da..7e5d3df53 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -44,7 +44,7 @@ ext { daggerVersion = '2.40.5' - gsonVersion = '2.8.9' + gsonVersion = '2.9.0' okHttpVersion = '4.9.3' okHttpDigestVersion = '2.6' From bf1279743e42f18f42eddeebacccd428e7ac46f5 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 09:50:58 +0100 Subject: [PATCH 25/35] Use custom HTTP client for OneDrive to increase timeouts --- .../cloud/onedrive/OnedriveClientFactory.kt | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt index 294f278ad..5dc4f4c3b 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt @@ -2,13 +2,15 @@ package org.cryptomator.data.cloud.onedrive import android.content.Context import com.microsoft.graph.authentication.BaseAuthenticationProvider -import com.microsoft.graph.logger.ILogger -import com.microsoft.graph.logger.LoggerLevel +import com.microsoft.graph.httpcore.HttpClients import com.microsoft.graph.requests.GraphServiceClient +import org.cryptomator.data.cloud.okhttplogging.HttpLoggingInterceptor +import org.cryptomator.data.util.NetworkTimeout import org.cryptomator.util.SharedPreferencesHandler import org.cryptomator.util.crypto.CredentialCryptor import java.net.URL import java.util.concurrent.CompletableFuture +import okhttp3.Interceptor import okhttp3.Request import timber.log.Timber @@ -29,31 +31,28 @@ class OnedriveClientFactory private constructor() { } } - val logger = object : ILogger { - override fun getLoggingLevel(): LoggerLevel { - return if(sharedPreferencesHandler.debugMode()) { - LoggerLevel.DEBUG - } else { - LoggerLevel.ERROR - } - } - - override fun logDebug(message: String) { - Timber.tag("OnedriveClientFactory").d(message) - } - - override fun logError(message: String, throwable: Throwable?) { - Timber.tag("OnedriveClientFactory").e(throwable, message) - } - - override fun setLoggingLevel(level: LoggerLevel) {} - } + val httpClient = HttpClients.createDefault(tokenAuthenticationProvider) + .newBuilder() + .connectTimeout(NetworkTimeout.CONNECTION.timeout, NetworkTimeout.CONNECTION.unit) // + .readTimeout(NetworkTimeout.READ.timeout, NetworkTimeout.READ.unit) // + .writeTimeout(NetworkTimeout.WRITE.timeout, NetworkTimeout.WRITE.unit) // + .addInterceptor(httpLoggingInterceptor(context)) // + .build(); return GraphServiceClient // .builder() // + .httpClient(httpClient) // .authenticationProvider(tokenAuthenticationProvider) // - .logger(logger) .buildClient() } + + private fun httpLoggingInterceptor(context: Context): Interceptor { + val logger = object : HttpLoggingInterceptor.Logger { + override fun log(message: String) { + Timber.tag("OkHttp").d(message) + } + } + return HttpLoggingInterceptor(logger, context) + } } } From 7e25b3cd406b0ee02b46519c0c1afa260b190197 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 10:40:22 +0100 Subject: [PATCH 26/35] Minor clean-up --- .../data/cloud/crypto/CryptoCloudContentRepository.kt | 3 +-- .../presentation/ui/activity/BrowseFilesActivity.kt | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepository.kt index 095193418..76da49932 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoCloudContentRepository.kt @@ -118,11 +118,10 @@ internal class CryptoCloudContentRepository(context: Context, cloudContentReposi } cryptoImpl = when (cloud.vault.format) { - 7 -> CryptoImplVaultFormat7(context, cryptor, cloudContentRepository, vaultLocation, DirIdCacheFormat7()) 8 -> CryptoImplVaultFormat8(context, cryptor, cloudContentRepository, vaultLocation, DirIdCacheFormat7(), cloud.vault.shorteningThreshold) + 7 -> CryptoImplVaultFormat7(context, cryptor, cloudContentRepository, vaultLocation, DirIdCacheFormat7()) 6, 5 -> CryptoImplVaultFormatPre7(context, cryptor, cloudContentRepository, vaultLocation, DirIdCacheFormatPre7()) else -> throw IllegalStateException(String.format("No CryptoImpl for vault format %d.", cloud.vault.format)) } } - } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt index bd49f2d21..6ebb9189d 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BrowseFilesActivity.kt @@ -124,11 +124,7 @@ class BrowseFilesActivity : BaseActivity(), // override fun onReceive(context: Context, intent: Intent) { finish() } - } - - finishActivityDueToScreenLockEventReceiver?.let { - LocalBroadcastManager.getInstance(this).registerReceiver(it, IntentFilter(CryptorsService.SCREEN_AND_VAULT_LOCKED)) - } + }.also { LocalBroadcastManager.getInstance(this).registerReceiver(it, IntentFilter(CryptorsService.SCREEN_AND_VAULT_LOCKED)) } } override fun onBackPressed() { From cc51c5140e2434d493c0e5c47d4076e5764f346d Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 10:57:44 +0100 Subject: [PATCH 27/35] Update release notes [ci skip] --- fastlane/metadata/android/de-DE/changelogs/default.txt | 7 +++++-- fastlane/metadata/android/en-US/changelogs/default.txt | 7 +++++-- fastlane/release-notes.html | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fastlane/metadata/android/de-DE/changelogs/default.txt b/fastlane/metadata/android/de-DE/changelogs/default.txt index 65c197145..7965b83b9 100644 --- a/fastlane/metadata/android/de-DE/changelogs/default.txt +++ b/fastlane/metadata/android/de-DE/changelogs/default.txt @@ -1,2 +1,5 @@ -- Zeige Dialog und Benachrichtigung an, wenn die Berechtigung "Dateien" widerrufen wird, erforderlich für den automatischen Upload -- Das Abmelden von einer Cloud löscht nun auch die Anmeldeinformationen einer aktiven Verbindung zu ihr \ No newline at end of file +- Unterstützung für mehrere OneDrive-Konten hinzugefügt +- Zugriff auf Tresore, die sich in "Shared with Me", "My Computer" und "My Drive" von Google Drive befinden, wurde mit Hilfe von Shortcuts hinzugefügt +- Viele Übersetzungen hinzugefügt +- Verbesserte Suchfunktion, nun wird eine "enthält"-Suche anstelle von "beginnt mit" verwendet +- Absturz auf einigen Geräten während des Entsperrens aufgrund einer Keystore-Ausnahme behoben \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt index 553889a42..7cc731fec 100644 --- a/fastlane/metadata/android/en-US/changelogs/default.txt +++ b/fastlane/metadata/android/en-US/changelogs/default.txt @@ -1,2 +1,5 @@ -- Show information when "Storage" permission revoked, required for auto upload -- Logging out of a cloud now also clears the credentials of an active connection to it \ No newline at end of file +- Added support for multiple OneDrive accounts +- Added access to vaults located in "Shared with Me", "My Computer" and "My Drive" of Google Drive using shortcuts +- Added a lot of translations +- Improved search functionality, now a "contains" search is used instead of "starts with" +- Fixed crash on some devices during unlock due to keystore exception \ No newline at end of file diff --git a/fastlane/release-notes.html b/fastlane/release-notes.html index f9ebcce60..9b07bdd6b 100644 --- a/fastlane/release-notes.html +++ b/fastlane/release-notes.html @@ -1,4 +1,7 @@
      -
    • Show information when "Storage" permission revoked, required for auto upload
    • -
    • Logging out of a cloud now also clears the credentials of an active connection to it
    • +
    • Added support for multiple OneDrive accounts
    • +
    • Added access to vaults located in "Shared with Me", "My Computer" and "My Drive" of Google Drive using shortcuts
    • +
    • Added a lot of translations
    • +
    • Improved search functionality, now a "contains" search is used instead of "starts with"
    • +
    • Fixed crash on some devices during unlock due to keystore exception
    \ No newline at end of file From 5ad18dd13a98a7cd08f5541b68503974b6a5b01c Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 11:01:50 +0100 Subject: [PATCH 28/35] Bump to version 1.7.0-beta1 [ci skip] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a7a365c33..120e86592 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.7.0-SNAPSHOT' + androidVersionName = '1.7.0-beta1' } repositories { mavenCentral() From 4d7b5f297182b4a76372fd8a6f9f67051b1706e0 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 13:04:20 +0100 Subject: [PATCH 29/35] Fix deleting cloud a also removes vaults of cloud b of the same type Fixes #414 --- .../presentation/presenter/CloudConnectionListPresenter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt index 23890000f..1beb659fe 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -93,7 +93,7 @@ class CloudConnectionListPresenter @Inject constructor( // } private fun vaultsFor(cloudModel: CloudModel, allVaults: List): ArrayList { - return allVaults.filterTo(ArrayList()) { it.cloud.type() == cloudModel.toCloud().type() } + return allVaults.filterTo(ArrayList()) { it.cloud.id() == cloudModel.toCloud().id() } } fun onDeleteCloudConnectionAndVaults(cloudModel: CloudModel, vaultsOfCloud: ArrayList) { From d08ffe68ef8af65c47f6afc9aeef79cf705d45b2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 15:02:26 +0100 Subject: [PATCH 30/35] Remove race conditions which could cause ConcurrentModificationException --- .../domain/usecases/vault/DeleteVault.java | 9 +----- .../domain/usecases/vault/DeleteVaults.java | 30 +++++++++++++++++++ .../domain/usecases/vault/MoveVaultHelper.kt | 5 ++-- .../presenter/CloudConnectionListPresenter.kt | 27 ++++++++++------- 4 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVaults.java diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java index 7a807060f..7ff6cb17b 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java @@ -6,8 +6,6 @@ import org.cryptomator.generator.Parameter; import org.cryptomator.generator.UseCase; -import java.util.List; - @UseCase class DeleteVault { @@ -20,12 +18,7 @@ public DeleteVault(VaultRepository vaultRepository, @Parameter Vault vault) { } public Long execute() throws BackendException { - Long vaultId = vaultRepository.delete(vault); - - List reorderVaults = MoveVaultHelper.Companion.reorderVaults(vaultRepository); - MoveVaultHelper.Companion.updateVaultsInDatabase(reorderVaults, vaultRepository); - - return vaultId; + return vaultRepository.delete(vault); } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVaults.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVaults.java new file mode 100644 index 000000000..3ad3738c5 --- /dev/null +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVaults.java @@ -0,0 +1,30 @@ +package org.cryptomator.domain.usecases.vault; + +import org.cryptomator.domain.Vault; +import org.cryptomator.domain.exception.BackendException; +import org.cryptomator.domain.repository.VaultRepository; +import org.cryptomator.generator.Parameter; +import org.cryptomator.generator.UseCase; + +import java.util.ArrayList; +import java.util.List; + +@UseCase +class DeleteVaults { + + private final VaultRepository vaultRepository; + private final List vaults; + + public DeleteVaults(VaultRepository vaultRepository, @Parameter List vaults) { + this.vaultRepository = vaultRepository; + this.vaults = vaults; + } + + public List execute() throws BackendException { + List ids = new ArrayList<>(); + for (Vault vault : vaults) { + ids.add(vaultRepository.delete(vault)); + } + return ids; + } +} diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt index 1495e19c7..3e5977e63 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt @@ -3,7 +3,6 @@ package org.cryptomator.domain.usecases.vault; import org.cryptomator.domain.Vault import org.cryptomator.domain.repository.VaultRepository import java.util.Collections -import java.util.Comparator class MoveVaultHelper { @@ -40,7 +39,9 @@ class MoveVaultHelper { } fun updateVaultsInDatabase(vaults: List, vaultRepository: VaultRepository): List { - vaults.forEach { vault -> vaultRepository.store(vault) } + for(vault in vaults) { + vaultRepository.store(vault) + } return vaultRepository.vaults() } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt index 1beb659fe..bc7c5df81 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -21,7 +21,7 @@ import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase import org.cryptomator.domain.usecases.cloud.RemoveCloudUseCase -import org.cryptomator.domain.usecases.vault.DeleteVaultUseCase +import org.cryptomator.domain.usecases.vault.DeleteVaultsUseCase import org.cryptomator.domain.usecases.vault.GetVaultListUseCase import org.cryptomator.generator.Callback import org.cryptomator.presentation.R @@ -48,7 +48,7 @@ class CloudConnectionListPresenter @Inject constructor( // private val removeCloudUseCase: RemoveCloudUseCase, // private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, // private val getVaultListUseCase: GetVaultListUseCase, // - private val deleteVaultUseCase: DeleteVaultUseCase, // + private val deleteVaultsUseCase: DeleteVaultsUseCase, // private val cloudModelMapper: CloudModelMapper, // exceptionMappings: ExceptionHandlers ) : Presenter(exceptionMappings) { @@ -97,14 +97,21 @@ class CloudConnectionListPresenter @Inject constructor( // } fun onDeleteCloudConnectionAndVaults(cloudModel: CloudModel, vaultsOfCloud: ArrayList) { - vaultsOfCloud.forEach { vault -> - deleteVault(vault) - } - deleteCloud(cloudModel) - } + if (vaultsOfCloud.isEmpty()) { + deleteCloud(cloudModel) + } else { + deleteVaultsUseCase + .withVaults(vaultsOfCloud) + .run(object : DefaultResultHandler>() { + override fun onFinished() { + deleteCloud(cloudModel) + } - private fun deleteVault(vault: Vault) { - deleteVaultUseCase.withVault(vault).run(DefaultResultHandler()) + override fun onError(e: Throwable) { + Timber.tag("CloudConnectionListPresenter").e(e, "Failed to remove all vaults") + } + }) + } } private fun deleteCloud(cloudModel: CloudModel) { @@ -345,6 +352,6 @@ class CloudConnectionListPresenter @Inject constructor( // } init { - unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultUseCase) + unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultsUseCase) } } From 00fdb7e69b4caa503e2128ee60618429f6c5b3b3 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 15:11:20 +0100 Subject: [PATCH 31/35] Show toast while refreshing token using OneDrive in the FOSS version too --- .../presentation/presenter/AuthenticateCloudPresenter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index 564192ed1..a7871af46 100644 --- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -233,6 +233,8 @@ class AuthenticateCloudPresenter @Inject constructor( // private fun startAuthentication(cloud: CloudModel) { authenticationStarted = true + Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show() + PublicClientApplication.createMultipleAccountPublicClientApplication( context(), R.raw.auth_config_onedrive, From 71dc76b1575acc3b33cb98b63f19893fae1e1d30 Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Tue, 15 Feb 2022 15:14:39 +0100 Subject: [PATCH 32/35] New Crowdin updates (#413) New translations strings.xml (Bengali) --- .../src/main/res/values-bn-rBD/strings.xml | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/presentation/src/main/res/values-bn-rBD/strings.xml b/presentation/src/main/res/values-bn-rBD/strings.xml index e2a575588..0a49197f1 100644 --- a/presentation/src/main/res/values-bn-rBD/strings.xml +++ b/presentation/src/main/res/values-bn-rBD/strings.xml @@ -119,13 +119,20 @@ পাসওয়ার্ড খালি থাকতে পারবে না। নাম প্রদর্শন করুন + বিদ্যমান বাকেট + এন্ডপয়েন্ট + অঞ্চল নাম খালি হতে পারব না + ভোল্ট এর নাম + তৈরি করুন পাসওয়ার্ড সেট করুন পাসওয়ার্ড মেলেনা, আবার লিখুন। সম্পন্ন হয়েছে + সতর্কতা: আপনি যদি আপনার পাসওয়ার্ড ভুলে যান, তাহলে পাসওয়ার্ডটি পুনরুদ্ধার করার কোনো উপায় থাকবে না। পুনরায় পাসওয়ার্ডটি লিখুন + ভোল্টটি তৈরির জন্য পাসওয়ার্ডটি অত্যন্ত দুর্বল দুর্বল ভালো শক্তিশালী @@ -135,15 +142,70 @@ ক্লাউড পরিষেবাসমূহ বায়োমেট্রিক সনাক্তকরণ বায়োমেট্রিক সনাক্তকরণ সক্রিয় করুন + ফেইস আনলক নিশ্চিত করুন (যদি থাকে) + অন্যান্য আ্যপকে ক্রিপ্টোমেটর ব্যবহারে বাধা দিন স্ক্রিনশট নিতে বাধা দিন খুঁজুন + যখন স্ক্রিন বন্ধ থাকে + স্বয়ংক্রিয় ছবি আপলোড + আপলোডের জন্য ভোল্ট নির্বাচন করুন + সক্রিয় করুন + ব্যাকগ্রাউন্ডে ছবি তুলুন এবং যখন নির্বাচিত ভোল্টটি আনলক করা হবে, আপলোড করুন + ভোল্ট আনলোক থাকলে সরাসরি আপলোড করুন + শুধু WiFi ব্যবহার করে আপলোড করুন + ভিডিও আপলোড করুন + … তে অটো আপলোড ফাইলগুলি সংরক্ষণ করুন + ক্রিপ্টোমেটরের ওয়েবসাইট + টুইটারে আমাদের অনুসরণ করুন + ফেসবুকে আমাদের লাইক দিন + আইনি + লাইসেন্স + লাইসেন্স এর শর্তাবলি + সহায়তা + সাহায্য জিজ্ঞাসা + ডিবাগ মোড + লগ ফাইলটি পাঠান + পাঠাতে ব্যর্থ হয়েছে + সংস্করণ + অ্যাডভান্স সেটিংস + আনলক রাখুন + ফাইল সম্পাদনার সময় ভোল্ট আনলক রাখুন + OneDrive সংযোগ + WebDAV সংযোগ + pCloud সংযোগ + S3 সংযোগ + লোকাল স্টোরেজ এর ঠিকানা + লগ ইন + সাইন আউট + বাতিল করুন + আনলক করুন + পুরাতন পাসওয়ার্ড + নতুন পাসওয়ার্ড + পাসওয়ার্ড পরিবর্তন করুন + পুরনো পাসওয়ার্ড অংশ খালি থাকতে পারবে না। + নতুন পাসওয়ার্ড অংশ খালি থাকতে পারবে না। + নতুন পাসওয়ার্ডটি পুনরায় টাইপ করা পাসওয়ার্ডের সাথে মেলে না। + %1$s ভোল্টটি পাওয়া যায়নি + ভোল্টটির হয়তো নাম পরিবর্তন, স্থানান্তর বা মুছে ফেলা হয়েছে। তালিকা থেকে ভোল্টটি সরান এবং চালিয়ে যেতে পুনরায় যোগ করুন। ভোল্টটি সরাবেন? বাতিল + ফাইলটি ইতিমধ্যে রয়েছে + প্রতিস্থাপন করুন + %1$s নামে একটি ফাইল ইতিমধ্যে রয়েছে. + বিদ্যমান ফাইলটি এড়িয়ে যান + সবগুলো প্রতিস্থাপন করুন + বিদ্যমানটি প্রতিস্থাপন করুন + প্রতিস্থাপন করুন + %1$s নামে একটি ফাইল ইতিমধ্যে রয়েছে। আপনি কি এটা প্রতিস্থাপন করতে চান? + সব ফাইলগুলি ইতিমধ্যে রয়েছে। আপনি কি তাদের প্রতিস্থাপন করতে চান? + লক করুন + বন্ধ করুন + পিছনে From 95bde8ca45eeadc3f8687503f0aeb4e39cd5317f Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 15:58:29 +0100 Subject: [PATCH 33/35] Update release notes [ci skip] --- fastlane/metadata/android/de-DE/changelogs/default.txt | 3 ++- fastlane/metadata/android/en-US/changelogs/default.txt | 3 ++- fastlane/release-notes.html | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/de-DE/changelogs/default.txt b/fastlane/metadata/android/de-DE/changelogs/default.txt index 7965b83b9..7e9ce8c07 100644 --- a/fastlane/metadata/android/de-DE/changelogs/default.txt +++ b/fastlane/metadata/android/de-DE/changelogs/default.txt @@ -2,4 +2,5 @@ - Zugriff auf Tresore, die sich in "Shared with Me", "My Computer" und "My Drive" von Google Drive befinden, wurde mit Hilfe von Shortcuts hinzugefügt - Viele Übersetzungen hinzugefügt - Verbesserte Suchfunktion, nun wird eine "enthält"-Suche anstelle von "beginnt mit" verwendet -- Absturz auf einigen Geräten während des Entsperrens aufgrund einer Keystore-Ausnahme behoben \ No newline at end of file +- Absturz auf einigen Geräten während des Entsperrens aufgrund einer Keystore-Ausnahme behoben +- Problem beim Löschen einer Cloud behoben \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt index 7cc731fec..5a29c08bb 100644 --- a/fastlane/metadata/android/en-US/changelogs/default.txt +++ b/fastlane/metadata/android/en-US/changelogs/default.txt @@ -2,4 +2,5 @@ - Added access to vaults located in "Shared with Me", "My Computer" and "My Drive" of Google Drive using shortcuts - Added a lot of translations - Improved search functionality, now a "contains" search is used instead of "starts with" -- Fixed crash on some devices during unlock due to keystore exception \ No newline at end of file +- Fixed crash on some devices during unlock due to keystore exception +- Fixed problem during deletion of a cloud \ No newline at end of file diff --git a/fastlane/release-notes.html b/fastlane/release-notes.html index 9b07bdd6b..2a6b198a1 100644 --- a/fastlane/release-notes.html +++ b/fastlane/release-notes.html @@ -4,4 +4,5 @@
  • Added a lot of translations
  • Improved search functionality, now a "contains" search is used instead of "starts with"
  • Fixed crash on some devices during unlock due to keystore exception
  • +
  • Fixed problem during deletion of a cloud
  • \ No newline at end of file From 1a01ba6f546b318faa47d015b2edc8ecb1915b38 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 15 Feb 2022 17:18:17 +0100 Subject: [PATCH 34/35] Update izzyscript results due to Microsoft Graph changes [ci skip] --- fastlane/izzyscript/result_apkstore.json | 2 +- fastlane/izzyscript/result_fdroid.json | 2 +- fastlane/izzyscript/result_playstore.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fastlane/izzyscript/result_apkstore.json b/fastlane/izzyscript/result_apkstore.json index 7ff782e7d..a4f48c840 100644 --- a/fastlane/izzyscript/result_apkstore.json +++ b/fastlane/izzyscript/result_apkstore.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • Google Mobile Services (/com/google/android/gms): NonFreeDep
    • \n
    • Google API Client Libraries (/com/google/api/client): NonFreeNet
    • \n
    • MSA Auth for Android (/com/microsoft/services/msa): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n5 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/services/msa","name":"MSA Auth for Android","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2687 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 28256 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 60 libraries, 5 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Azure SDK for Java (/com/azure): NonFreeNet
    • \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • Google Mobile Services (/com/google/android/gms): NonFreeDep
    • \n
    • Google API Client Libraries (/com/google/api/client): NonFreeNet
    • \n
    • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
    • \n
    • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n7 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":""},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":""},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":""},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2793 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 44689 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 73 libraries, 7 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/fastlane/izzyscript/result_fdroid.json b/fastlane/izzyscript/result_fdroid.json index 103caca54..cf8c10bc4 100644 --- a/fastlane/izzyscript/result_fdroid.json +++ b/fastlane/izzyscript/result_fdroid.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • MSA Auth for Android (/com/microsoft/services/msa): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n3 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/services/msa","name":"MSA Auth for Android","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2543 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 23715 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 57 libraries, 3 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Azure SDK for Java (/com/azure): NonFreeNet
    • \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n4 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":""},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":""},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":""},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2793 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 39621 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 69 libraries, 4 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/fastlane/izzyscript/result_playstore.json b/fastlane/izzyscript/result_playstore.json index 7ff782e7d..a4f48c840 100644 --- a/fastlane/izzyscript/result_playstore.json +++ b/fastlane/izzyscript/result_playstore.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • Google Mobile Services (/com/google/android/gms): NonFreeDep
    • \n
    • Google API Client Libraries (/com/google/api/client): NonFreeNet
    • \n
    • MSA Auth for Android (/com/microsoft/services/msa): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n5 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/services/msa","name":"MSA Auth for Android","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2687 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 28256 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 60 libraries, 5 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

    APK library scanner

    \nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
    \n
      \n
    • Azure SDK for Java (/com/azure): NonFreeNet
    • \n
    • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
    • \n
    • Google Mobile Services (/com/google/android/gms): NonFreeDep
    • \n
    • Google API Client Libraries (/com/google/api/client): NonFreeNet
    • \n
    • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
    • \n
    • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
    • \n
    • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
    • \n
    \n7 offender(s). Full report available here.
    \n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":""},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":""},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":""},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2793 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 44689 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 73 libraries, 7 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file From 5d2cf771b40b08f3396a7220efb787f7c19240b7 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 2 Mar 2022 15:43:33 +0100 Subject: [PATCH 35/35] Bump to version 1.7.0 [ci skip] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 120e86592..49cbd7174 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.7.0-beta1' + androidVersionName = '1.7.0' } repositories { mavenCentral()