From 03aee891b4691a9623904be5b91c96f9d1ea4ceb Mon Sep 17 00:00:00 2001 From: liq <3403517738@qq.com> Date: Mon, 29 Sep 2025 18:48:05 +0800 Subject: [PATCH] 9-29 --- doc/read.md | 173 ++++++++++++++++++++++++++++++++++++++++++++++ src/untitled1.iml | 11 --- src/untitled1.jar | Bin 11680 -> 0 bytes 3 files changed, 173 insertions(+), 11 deletions(-) delete mode 100644 src/untitled1.iml delete mode 100644 src/untitled1.jar diff --git a/doc/read.md b/doc/read.md index e69de29..64f0257 100644 --- a/doc/read.md +++ b/doc/read.md @@ -0,0 +1,173 @@ +中小学数学卷子自动生成系统 - 项目说明文档 + +## 项目概述 + +本项目是一个基于 Java 开发的中小学数学卷子自动生成系统,为不同学段的数学教师提供智能化的题目生成和试卷管理服务。系统支持小学、初中和高中三个难度级别,具备完整的用户认证、题目生成、历史记录和文件管理功能。 + +## 系统架构 + +### 核心类设计 + +| 类名 | 职责描述 | +| ------------------- | ------------------------------------------ | +| `Main` | 程序主入口,负责用户交互和流程控制 | +| `User` | 用户实体类,存储用户信息和权限 | +| `DifficultyLevel` | 难度级别枚举,定义小学、初中、高中三个等级 | +| `QuestionGenerator` | 题目生成器,根据难度生成不同类型的数学题目 | +| `QuestionPaper` | 试卷类,管理题目集合和格式化输出 | +| `FileManager` | 文件管理器,负责试卷的保存和目录管理 | + +### 类关系图 + +``` +User → DifficultyLevel + ↓ +Main → QuestionGenerator → QuestionPaper → FileManager +``` + +## 功能特性 + +### 1. 分层用户系统 +- **小学用户**: 张三1, 张三2, 张三3 (密码: 123) +- **初中用户**: 李四1, 李四2, 李四3 (密码: 123) +- **高中用户**: 王五1, 王五2, 王五3 (密码: 123) + +### 2. 智能题目生成 +- **小学题目**: 基础四则运算(+、-、×、÷),支持括号 +- **初中题目**: 在小学基础上增加平方(²)和开根号(√)运算 +- **高中题目**: 在初中基础上增加三角函数(sin、cos、tan) + +### 3. 高级去重机制 +- 实时检测当前会话中已生成的题目 +- 自动加载用户历史题目并进行去重检查 +- 防止题目重复生成,确保试卷多样性 + +### 4. 灵活的操作模式 +- 支持动态切换难度级别("切换为小学/初中/高中") +- 题目数量可配置(10-30题) +- 支持用户退出重新登录(输入-1) + +### 5. 智能文件管理 +- 按用户名分目录存储试卷文件 +- 时间戳命名格式:`yyyy-MM-dd-HH-mm-ss.txt` +- 自动创建目录结构,确保文件组织有序 + +## 核心算法说明 + +### 题目生成策略 + +```java +// 基础题目生成 +private String generateBasicQuestion(int operandCount, String[] operators, boolean useParentheses) + +// 难度特定增强 +private String addPowerOrRoot(String originalQuestion) // 初中:平方/开根 +private String addTrigonometricFunction(String originalQuestion) // 高中:三角函数 +``` + +### 去重算法 +```java +// 双重检查机制 +while (generatedQuestions.contains(question) || userHistoryQuestions.contains(question)) { + // 重新生成题目 +} +``` + +## 使用指南 + +### 启动程序 +```bash +java Main +``` + +### 操作流程示例 + +1. **用户登录** + ``` + 请输入用户名和密码(用空格隔开): + 张三1 123 + 当前选择为小学出题 + ``` + +2. **生成试卷** + ``` + 准备生成小学数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录): + 15 + 试卷已保存至: papers/张三1/2025-09-28-14-30-25.txt + 已生成15道小学数学题目 + ``` + +3. **切换难度** + + ``` + 切换为初中 + 准备生成初中数学题目,请输入生成题目数量 +``` + +4. **退出系统** + + ``` + -1 + 请输入用户名和密码(用空格隔开): + ``` + +## 文件存储结构 + +``` +项目根目录/ +├── papers/ # 试卷存储根目录 +│ ├── 张三1/ # 用户个人目录 +│ │ ├── 2025-01-20-10-15-30.txt +│ │ └── 2025-01-20-14-20-45.txt +│ ├── 李四1/ +│ │ └── 2025-01-20-11-25-10.txt +│ └── 王五1/ +│ └── 2025-01-20-09-10-20.txt +├── DifficultyLevel.java +├── FileManager.java +├── Main.java +├── QuestionGenerator.java +├── QuestionPaper.java +└── User.java +``` + +## 技术特色 + +### 1. 面向对象设计 +- 清晰的类职责分离 +- 枚举类型管理难度级别 +- 实体类封装核心数据 + +### 2. 算法优化 +- 智能题目生成,确保符合难度要求 +- 高效去重算法,避免重复题目 +- 随机数合理分布,保证题目多样性 + +### 3. 用户体验 +- 中文界面,操作直观 +- 实时反馈,错误提示明确 +- 历史记录持久化,跨会话保持 + +### 4. 健壮性保障 +- 输入验证和异常处理 +- 文件操作安全可靠 +- 内存管理优化 + +## 扩展性设计 + +系统采用模块化设计,便于后续扩展: +- 可轻松添加新的难度级别 +- 支持扩展新的数学运算类型 +- 文件存储格式易于解析和处理 +- 用户管理系统可集成数据库 + +## 环境要求 + +- **JDK版本**: 17 +- **编码格式**: UTF-8 +- **操作系统**: Windows +- **存储空间**: 至少 10MB 可用空间 + +--- + +*本系统专为中小学数学教育设计,致力于为教师提供高效、便捷的试卷生成工具。* \ No newline at end of file diff --git a/src/untitled1.iml b/src/untitled1.iml deleted file mode 100644 index b107a2d..0000000 --- a/src/untitled1.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/untitled1.jar b/src/untitled1.jar deleted file mode 100644 index 544ef0541cc71f29eef3070631d8de54d8899827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11680 zcmaKy1yEewvhQ(s_u%gC?(XgccXtR726uOt;4T3|U~nh6ySqEQQ#e&WHK?Q*mnx3u`lXJ2!86a}RSnMl(ATS66#=IW=?iPEE_UL||9!j1@6qmq)MS1DiTD92u|& zm+>+>mNJ{->}t@XSGT2bA1%cJW7{9XVcHq#AVM3Xot~U%A(mK_R@Yr$7(YZPFLJxu z5_hKHu|n7+EEt)c8jlgp&hhMS{TMp;2`$YngTyI2(QKKusHbv^_Q31T!P8bFq-F~$ zqg$wpBuVZ5@Nmy`c3+I+TKO6^f+Z^FoJW}RFg*j{pZmLwahcdL_&97^q zO}=Xe2Yiu_UqIiJUMUi)fAJ`w_TMGUiSvCtaVlS9?(s3t51Ag8&5=!%Ti$9qe1Bxz z-Z9MU5!EYS2h~I8ak&C-I)2-%!T3c?ll4qnDz|0mF0l zR*}ETuFRa^-eD*R3v`x11BlNuo8$GA>ls0x@i(G9M-ROIl68?))8}P!u>dO15{%S3U1by0)D6oD{D+CYGLYdI@yi|!9S zF=e16P@!2-hZ)EOG+n+6>Q5d)MHVCC|$4P4Q^wnxs<;} z-ARME)3yV(fekqw^Omn&WWdV%qreqCk-6jZP9(F2iJ@BbN$;(FfiF76iH?O>va)!; zoLd;{@{rN4hhQ*lz0?QjpWJ+4FuTzK2LZu``v2u7>hIi?w6-%>FmW)kG2k2zT|qo40g+PgL@$w;adq8 z0m36F#c`J>uXJ*q+W1m%GP$W55=nf1df0o%7u0(mSW$T&QJOO2%pW{OA3m(or%+&p=q;AqEbA}X;q0oEm~`C#`fjoI*0JSrpXy)s!900}rPTGQ)X)t;M*@dc)i z(7<=zL0|d#T#DHTZG6fMf*X4pKSVxUUfZLpA;jClIbq~nt+9dO_RP#GS}c-U*v|Yd z33R3{b3iJ(1gi9kYnZplBLbnCsHSuhsa8t$Np*?k9LnO`rc=P%zJJhd6Ou17Be6L~|vUPVGEE z_pDQ}our1i(4hf>MtIMUE1ie^OH|RfJ)Z#%4;xJavGLf#C?EfwIPGl0hpjNPft428 zOVj6_A2_${qJc;!0^OeFDqbhB=grnHn)B^4FqZ5FQf2VfEvB4xPHQ~HCOqJr8@IwM z4@ndo-WHu)TXayO0@SQyk3eB8?i=R$tB?8K%C+p%Ky_9WUAKN$#nJh=^+GRN}RPQ9vjY#$R%MvD|+jr!98*D`oG z$7Mkl4F12Y2n$*v1aJkia_K@0kmoL@@Ty^0WGi*n;d6j7ll$zTSF`3E1Dp3?^_C+#o;kwMGPP6@p zUU!zG3yD9KJx(QJGVz4fPxDOKm@O0J!Wd0N-Zu}GN{3((zvihb2Z~XT z>+_$u&kf7P0!kO~hm;qLej)CU8G==j#WL5!#>k3EC5o9Iona5wQoHIAY8}WlA>|fc*{}QF-9- zB||NV3ThbL+uavyoVLn$ChxDP8DBk~H>|j;NajSobkbC{p)O-p( zp?XZdg*p=iVn4#o2mUFr^Gl`Sq>vyWBCvlKSdo8gw%~pjSOpVnhksSp9Bo)H^*PLU zN6O(Wc_JBU80l~o-DEp@6K9i3vP)wj3XalIH0kWU`|s5}U@fbiaL}jHzc!~5=;wAu z5n8o~HEh}t<6e+lWq#g57tb>j(x_5!D4(rt-fFaWMZNyW)TN7PU?&77Fvg=KFV8wx z*oUO9uzedV&#@ka0cDtVE^l$jm(mNHi-t<5vGxa?Q^wj)p~RU z6WJ!s=sWsYbyzuDFU3Tq!6SGgp-s3Eqic;g4Z`WCot(nAtzLI@X|S1%AsCX@lH%s| zaU*ISwc+hR0uV3r6z8F;MJmI#vU%Jn9S@TUy{8|`7FAFP<(tjGpbg^AULSYYMRRSRxupSx&OKdQAuKvy!`_FXb+k@BV_=;b08d9A zJIA}KO%|_ij)nxhrXhEP&jcMkyIEi5lfmIHpWd9?N{YZ26c4#OzQRrU74mcrLd7|} zw{UbBQcb*sdHZr?zStvP=2wx3c&r_VC@+>`Em6TAVvVD_rn6YQgOm}BQGun!W(Mk7 zpkh|qxU*KW1OHg~vmDQ?TIcizEvm$!GSd-s^itPt^H^IZJjI^x*v&4LK{1U%(W94j z20uAx%aHJ4D_|ay5T|LoB+3v4(W1|Bc> zC-MEmd7Y@mwh19$N)%(9_3gI(pu;}Ptn$X3S8-#r0%N<@AlV|-CNV+)9WhJ0xJq?= zf>6cIml22Nt?Ju!xaVs`hf$5QpJtDVfI)YH-mP^}Rrq8dhDKRT)#@$ebOJ-uFx7S- zI&W^D+G!Q)_l&4$U2B3oy-Y2WL6x9U-`LX=!AsGF+$4cJWWcgV7!na(Ccnw??gZP4 z50SSDkPS@hmf;7pcH_ux+T$w+fWxt9v??XLX@@5$!avl_$#x+Z3JYxkfiSSR(&XZi zT6#1!23f$brSVNBV&0jMX%m740YVFsv_D5?&~%y{zRZn%i`}|A6WUlv5KbR6$+jM; zis{5k622Z@d`XCuYoI-OVkcYQ8of;rPxEj$q+myBGXfgEMKp>9*pVG2js$KHkGmY> zH!)^p#L#yM+;IMi!7uBka*e2Q>=G}M5tvQkF9tb4$NPisgfC-{;w2=_nD>&_aOTpV zQ0ONz4ee34xav>s4Y~ZIdY^UU!5r{Ht+wS$vn9R&(hiHGK^s)O0NzdV3`d9xZ$76@ z_r=|eXL!QyzFO_MYq&X2uT&pz?{I?LYwhQl&dOKK&4$%<+H1xAgkf(?PD$PKnrl4G zDJ73R#7>RzNYvKj8dtB&LF^Y=1#eU`K46JUNBsye!>w%6+=~{WTQ8O@=}NPikGP}J z&ga*6Nds`H{Q>T(Yg%fqSB=@paFYF_gZqjVRUdkjhEYe&5y|rBYyq6%78}x_pHO+- zi4Zic2n)KB<()H^NL&aNJ7hh3@FSdLvQKf6W;q{4Bu<0mai4|T1ig11!_~9=4U!Lg z#|3=D`nL$tY=Eb-gna~f6E5DQ*j7^QOoyHsiJ7ZXrd%q|K%2~y8y!1xN&5_IjTc(* zZxN*HBxvG=l4cuuqv%!ay!iJVMzgK4kyy#yJhZHA$$S+TS}YeeB+7rp*sn6W z1#uKSGZavrba)D_&t1kVGdvzSMG0-xcWu0>M832JtbYO)!b%h*>G>QVw^?{)UHXU5 z3*5yR_$ql^I3nk)kujxtB#=6teYEEp6vKWF)y*VL70B{LtlKxyqjik#Ct{sNup$lV zx-#1nN6!G``BY6?sYqi+&u2kU%MR-_R7+!sw!TS?nzmSK8$L!84}EWF!C8`R)XbKkLu%G6KbLndRM_T$)ppN1V$ z2+f{dv9B&*)ans@U1gp8;hETlo9?4?>Fexmw8v*grAg^eb6=+!+O`n{O@OL2LmI)W z1;Kt4L!W4=)q_Q8(z%6|iyl*#vj!xzjGWRf`w%9}oMv;Ox{!;I_-?>9eQc76PJeMKw&==2eSeo5$-i z>+2CcgSDa)HCO$cy3f?gFyM=Ut_cGhxW#LB-}%F0H@?t0kqxLN#(AfQqd~Fe;k7z> zfTsS8FsBB}CQkQ<*l}Rd;qA`6xy62j3pulAE(cPQc%cH_vJdnLv}k&b9xZ?!vqO@d zZ(sv9+7(;1*vvXz^j+nfN$lGT3SVQ8 zd4`#cZ?V)|@S3kCS90SdxfAd6H-O4LzQ2>_J3{Ddc9NkHuAz=M%pIk`uFOx-SNu_W z#V4DvN03lFCK{wCdlZ=^Zdvnh4mjbDnxS4Fw*phqXD6T{#tDJ zr(tB>m@jdLr<*&QRV>!AKxzD>)Efu_GhOFh>O}M9+*Iq3^W=-k3JlKNLVT{GNP$gl z@~O~W{KqREu*#tt+0rR-P!syXd3N<3-70ezfi_rd6X;dPx=OIfo(SpAt;e~5;fR*JHqz2W}2XW?Ac{4o^k&IND9 zrsIiB*p^nX9`~*MB5lDM6+4OgC2hnOu4bUSU6i|)cbhR^n1xBMsO*(9!s{7tiGI{s zg>N~nb+c-QlaKENW`KPd46*EawKo`c{PEe}dHb-xhO)DGzZ*R@F?FM8N9WDziVRcP z2xCj~3M6PHR-L_p$Rpl$C8H@!$CgjWwgcu>QFH0s%HKR`_@WZdr7rX}j3(h#PyBF0 zjXoz1{xKd^+|1R=%968zrUOR+FO|mb%kY_3PW{^{yXuPb$~EO{CuFxEV%e@WA3w(1 zIeW$O741eqARf~lN4t|m|4bA_ON;m~F`&jOkWvY(50<3ZNGBYd6DFZJAZhM``7VnV zP>F|4Y7mV=#`4_#r|XvR$CDO>2Lbtx@vpA?cYh57^1l%0@0R=@#QC4eB<}C8skocF zx>-9qNSQmByO_8+x{$N{t5-KyS#g*VMiE$P^DxyvZYn_B(_B_Y6ILfCA%c@GFE$>6 zG^G~xU*=x17~Pim0dWQX3OD)XD~jkFh#(w`t%f>jYFFdI>1oDJ#ztTO5olW+KBI-Q zi?Mfl=s5F-^!ddowbs&LY&uN8u~OTJ#E7zO%RTQ0p`(VfWPi}f76w0{A3HfyhENEr zUfQcPX@CKcBKas{G2J%0!Bu)|c^?et&3$GecU-+LLf? z@=o^t1<~i-kXSVs zu=s9k`IOZQaHSC^7;C*;0s&79n3ef`u9 zyaNQ~u6Yt;nP3oL%uIiNVQR?vvJ*@QQ;!}TV$WEpZ1&4JKGr^np5_;7P^sMa)MPtr z>F@hcUF0TB=MC(jnK0n6O)~Rt_6yBx6dmqM--V?;tvye4C3|x(2xMC7vm1o&Zzd1? zS|8rlAG~X&HoQM>bwKDO(x4@rsGV$_3bgb6(tb!e#va%A?BDTu;*zN4KbA_71$-%?F@&~e?^zN`iDLI5;;z4rDG@%%!RB!+A89Doly3ZEI1 zyR?qQ;(o|)Tu908Dux^y4H25Fmes{MDpZP$@0TUnV8Hra1gJ`n?j$uVb)KYUaHfvo z{)X;B{T_qf2~1VFev1d}X_Mq5;O#@L5s+>-L*72*6LQgLe>1^!z)E)@3{Q9iS>lot z{kD=X-rWU)^QIQe9|T?74oL{d%dr}{LTQksp(lsu^O$PYWR^!$)@TdwTyb)7nGe}2 z2VY$xH+%0nYp>!Q_T_RY#sN{_a8HsJHAeZEB2->m*bWmPqVv-lk;CG8lfc~6EOCbY zFO)uuVD74{0umZ^k+{WDQ}_$VMDkD5Q(^Yx5q-S_>v!O4@ovM7D;%p4alh`r-A*Jo zlPGy&va7*+SWT5kB#psi(zrFV`CKY#CI`x?a9P-1AN&KxZdT<3w*a^ z3f$j@r(%j;|2QuwIzSG1eg#r73I?9O(#3f@A!Et?43q;>QEb{!6S3V%(^IgW1|UA{ z%&5~^oN{!SejSrR_n`6ma&%VNkEq{ltSxDR`sy<`+Dwrq;5ac{s9;Ox$i2}ee1;SF ztc{i0OE`b&?I&VUFWwtI-GNt2lVdSwo3`L515~@t>@>NMW=l*mYxTN{29Tl0Lc~N! zA#IienB=I`#@qZuBT)gmA(0ygl`8$8E;VYmZT&dpa+$2S0Xw%V1d~Vtn6NSJY6kXN zL5CZf%=?{>-vQX>IW*?s_Td}${X3VL$qLOdSGJAfDk-A)8@y*ta16HR^;60bB>a1p@mDwhWv7b zisV!6^w*Gto^*%OB=LZ)KEP4w@Tq2VlAa~M-OxEL8k^mWn4xvpZo0XjbGoP?aQ3OVHK@(?@X| z{PBbiW^Gb$JaP!SrX4!Jk4m*<1Oh$=>k@426A%KTsGf#uGWskK{ZNAS38+hq;KBA6y`o-<@m7UMW;)4&@MiA zp!3@2*t7N2ekTuI?04AFfD zZE}hIF>cfC(;R{>VQs!ShJBH?Kbr0GYCvl(U5L9qQFqz+$wRLF96>b&CI#j)YSpDL zoos4L%CnsR3EQF<4E(Fh>lQ)_ujl8fydKA<6dBw%^Rl`|7`=zI@C3RIJQ0bk7YM+v zef>W*|VUoHPl?iCf6N(?)?q;H#A`S z=#S#aoNImp3Y^Rxu8R5a<2iv#W4iSN#`7&qA=tN{{r{L`Up{O$PX z56ng)QNf{UDm5^ZFPGOeeV9!J>RaOH!}c}0_%1_`J!Xa@U*_pmNQ8bsGnyrxVjpE25ixzmsUlbkw-3E&)wtT@e{ z>bGkO_!`nGEc3$b9ww2@n8JrPacK*nHO;dQEp3(XQrg1dc$K85Dz}m|RG!P3wl@?s zj%N3oFIcx2#V2bY&G#V-NTjOGYrP%_dfTeJtezcQf@R)dp84IV`{KS#eg>-OybXLc z50+x9(QmtOK4yFxdJ!709icWgJB`>m(XT6mG=7$bTYQahzV$NlMVS)2PSA|7Mw%vw z6A$J2!Qh$u`;6Vo4YGhC88|^B6XAOvKO@+C9)Bam`*y!csFz6pNl4#gI`CM8T%lAY zG9o(f>Y|#pROUI(kWS_s2Gqq3Va%DMb+os#YwUnL?C+0;C)ylyDfSc3vfVSoa=ypl zxY_YF7?)kiJ;T6DNWZe`ppJ^wo3RwvolbM27hhvCM|f6xE;H1Y!k~DL0%Y4M$KmDP zj)PvyVG0uctTZ2c&0~q%tL(`t+ygeY8^Iatr|2Qyv4lMbUI=P1Tt9e@Q-WOHG~L3XJ1fGH z34K^_U`v4i!Fm7Ur4BJ~bEM3P>7K21BhK=XU~j3>YpS8g!*mwl+mBFKb-6oUC_468 zR5zHakAB<0u4F9Rz;JR|BK9;sp=hbtNjdSLTG~T3w-!!lvYlSf0NQi-<&v#5v@P04 z*Cy4IL&|+yE8ROH5@YxiK|`*0#O^OlG(@y;cY&bBi8AM$CK;#?Cm7wI^|$QnP_a58 zHw3$9%@rdl++VNjpN3NM4q(e5E5I~3t(_oBmT-?kezbxWwJ}3os#20{q6Ys4C9l-* zduC$n*4+k5M(>52BgRuqGR>41;OFvP5HWj6jO)wP}nnb z^~U6HX)%8wKN43Bb z5HcD1$;TW{CawIDiw5QAqhx9UsWU@j*}-&;IJPDwlpKVc2^mg=qQzbh6D~uG9G_4{ z&k0d$bOT#Kizr&sZQ@X^F)~@S_7Lw~r2PcGc!?VH6T96Z#{!8H@&#P1>a))jPWl6I zh1NkbiCk8kDD%A^s5-J8+Yb`%HjY^a zziV`ib@p&S-*Yn(Wy!TmalYy>o@o++Cqr#?f4*$23{5vlm~4s*hwL>eCUv7(A~*t#D-A2=?F`D|mBFO< zr0Siv1w#_apS$Am!UcJnvc7A#n0IhYTLwn3Txp<(5=UGuK?lZ1q&c?0H&-jn9Qkcz z^K9^JjNQImFd2c4ZRJA2HU!7VGJnT;Zhe%?Wppk}4`^#Q-xC1T=&aOt(T5NyRnaNq zLisC?H_9DBF6`CHcN|+Q6H84Y8i>Tj8s4(pR?SsaSf=Gjb(*##B;*j+sFE~_kltH< zX8{rG$&V#LV7ujHQgb(?W=0qs*9^_*Q-dT!Ad3mjK3GLYYJsC(t8erfC$bfLLixbeV|vSQoMHo= zAt%p%Bff;8pu{C;%D?nX8`)+hEA=JaF_qdZeUG21+I0cTIUd1#@~lFbi;!p9ZKj@Z zUpMxmPVHpZ_yETARjFIiU)NTjXlKfN=b2f)g@TV8pSU5Vp<`TNk`_WMY3bI$97gN- z%4%?@$TsK3>%HIK5Vq5{-DP}SkFI4SrxZ#a9xHmLG5)Z9x+fw`q&tl|(FvC%bEc!{ z3eLPC-Wuwb>fvW1v~un#$u;h>)F=NG$?*f&X{u;j_L&ne{XxXM4@w6}{n4)&+5%6o zx;CHQ&^UFy)qi1Lc^A6d{Uo!%9YaGe>JF!`h8<}71a8vvxD{S8s&xD@1PjgXo^+Gk z5tAW2&(}Z=?+qQE*kM-6kB#p4f@AI#rA~|G(-M_5@W?n3>1X#T3GD}oOucguAchOg z_v1jy275*{ecY)7y()*j*Q2&1H{-3GdpGWQ*uKykRF=`5~zmzcqkVV1RG2k$o z3+E>R!lU!3?%C7Mm_im-I&Hqiwd@>-IElRP7=c0f*t}%CJH4Ma<6Jr~D8N%1oNmqs zS6$EBA1J#&USAx{PO&(%sR`VTY6+-JSyoh(>k+5wtc4JVx2D zc_u*beL_NShf}Ff1R2Me^$~y|IZDQz5usx=2UV)|{?$BIJKc$fd&3h%p#Mo>A!f$j zL^Y_wgPWf;S;}vD57W*}0nEeGl$Kbm!8x+m;V`#?&2+sKubb3)@n9V%+H{W}lY6Cm zy{+mkuK}!m7%A0~M9gs-hf0r|p>nIH4W~B&VHEMTK9R~w&PS%<`L|ujq{r+{aziV+ zJF@d1{ykJjZT;`uNCsD{Ng^WK_vB0tzf9O}?ahx$9KUu(^LI74**EYW?k*NS&`JpI zaWuHUK&P+e_SEsQC7-V0(i&k_$T)_epndE4@|=5ET@Y@Y+>Fj&vjdgSzm!I!j!tn}5vyH$(qNxbkNl9LRr$?f;D1`3>g(@B06q?$3h%Mz4S1`#%Qvd;R|r z#s9mTzqi6aoc151{C)es-298${=1XEi^-o|^B-HI_{Yg#d+5JA_&YxS=YO|J{dWaY YmV^AQ!2|(;{eAKOjwi)Ga%qtN1FXbCRsaA1 -- 2.34.1