From 5c7640acdc30110f3a8b32470a383979e18b1398 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Wed, 9 Nov 2022 17:29:06 +0800 Subject: [PATCH] add sql --- .gitignore | 4 +- sql/db_create.sql | 111 ++++++++++++++++++++++++++++++++++++++++++++++ sql/trigger.sql | 55 +++++++++++++++++++++++ 表设计.xlsx | Bin 50352 -> 50546 bytes 设计文档.md | 1 - 5 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 sql/db_create.sql create mode 100644 sql/trigger.sql diff --git a/.gitignore b/.gitignore index 8a4e0e5..63af88a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ *.o *.dtmp *.tmp -$* \ No newline at end of file +$* +~$* +.$* \ No newline at end of file diff --git a/sql/db_create.sql b/sql/db_create.sql new file mode 100644 index 0000000..3353906 --- /dev/null +++ b/sql/db_create.sql @@ -0,0 +1,111 @@ +drop database if exists bigwork; +create database bigwork; + +create table `admin` +( + passwd varchar(100) NOT NULL +); + +insert into `admin` (`passwd`) values(''); + +create table user +( +user_id int PRIMARY KEY AUTO_INCREMENT, +user_name varchar(100) NOT NULL, +user_mail varchar(100) NOT NULL, +user_passwd varchar(100) NOT NULL, +user_limit int NOT NULL, +user_regtime datetime NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table book +( +book_id int PRIMARY KEY AUTO_INCREMENT, +book_name varchar(100) NOT NULL, +book_isbn varchar(100) DEFAULT NULL, +book_publisher varchar(100) DEFAULT NULL, +book_pubdate datetime DEFAULT NULL, +book_lang varchar(100) DEFAULT NULL, +user_id int NOT NULL, +CONSTRAINT `fk_book_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table document +( +doc_id int PRIMARY KEY AUTO_INCREMENT, +doc_name varchar(100) NOT NULL, +doc_url varchar(100) NOT NULL, +doc_size int NOT NULL, +doc_date datetime NOT NULL, +doc_type varchar(100) NOT NULL, +book_id int NOT NULL, +user_id int NOT NULL, +CONSTRAINT `fk_document_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`), +CONSTRAINT `fk_document_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`), +INDEX (doc_name(10)), +INDEX (doc_date) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table note +( +note_id int PRIMARY KEY AUTO_INCREMENT, +note_name varchar(100) NOT NULL, +note_date datetime NOT NULL, +note_content mediumtext NOT NULL DEFAULT '', +book_id int NOT NULL, +user_id int NOT NULL, +CONSTRAINT `fk_note_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`), +CONSTRAINT `fk_note_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`), +INDEX (note_name(10)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table record +( +record_time timestamp PRIMARY KEY, +record_type varchar(10) NOT NULL, +doc_URL varchar(100) NOT NULL, +user_id int NOT NULL, +INDEX (record_type) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table typetable +( +type_id int PRIMARY KEY AUTO_INCREMENT, +type_name varchar(20) NOT NULL, +UNIQUE (type_name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table author +( +author_id int PRIMARY KEY AUTO_INCREMENT, +author_name varchar(50) NOT NULL, +INDEX (author_name(10)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table book_author +( +author_id int NOT NULL, +book_id int NOT NULL, +PRIMARY KEY (`author_id`, `book_id`), +CONSTRAINT `fk_ba_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`), +CONSTRAINT `fk_ba_author_id` FOREIGN KEY (`author_id`) REFERENCES author(`author_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table book_type +( +type_id int NOT NULL, +book_id int NOT NULL, +PRIMARY KEY (`type_id`, `book_id`), +CONSTRAINT `fk_bt_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`), +CONSTRAINT `fk_bt_type_id` FOREIGN KEY (`type_id`) REFERENCES typetable(`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +create table book_type +( +user_id int PRIMARY KEY, +user_usedspace int NOT NULL DEFAULT 0, +user_bookcount int NOT NULL DEFAULT 0, +user_doccount int NOT NULL DEFAULT 0, +user_typecount int NOT NULL DEFAULT 0, +CONSTRAINT `fk_user_stat_user` FOREIGN KEY REFERENCES user(`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; diff --git a/sql/trigger.sql b/sql/trigger.sql new file mode 100644 index 0000000..27f832a --- /dev/null +++ b/sql/trigger.sql @@ -0,0 +1,55 @@ +drop trigger if exists `trig_update_stat_book_ins`; +DELIMITER ## +create trigger `trig_update_stat_book_ins` + after insert on book + for each row begin + update user_stat set user_bookcount=user_bookcount+1 where user_stat.user_id=NEW.user_id; +end ## +DELIMITER ; + +drop trigger if exists `trig_update_stat_book_del`; +DELIMITER ## +create trigger `trig_update_stat_book_del` + after delete on book + for each row begin + update user_stat set user_bookcount=user_bookcount-1 where user_stat.user_id=OLD.user_id; +end ## +DELIMITER ; + +drop trigger if exists `trig_update_stat_doc_ins`; +DELIMITER ## +create trigger `trig_update_stat_doc_ins` + after insert on document + for each row begin + update user_stat set user_doccount=user_doccount+1 where user_stat.user_id=NEW.user_id; + update user_stat set user_usedspace=user_usedspace+NEW.doc_size where user_stat.user_id=NEW.user_id; +end ## +DELIMITER ; + +drop trigger if exists `trig_update_stat_doc_del`; +DELIMITER ## +create trigger `trig_update_stat_doc_del` + after delete on document + for each row begin + update user_stat set user_doccount=user_doccount-1 where user_stat.user_id=OLD.user_id; + update user_stat set user_usedspace=user_usedspace-OLD.doc_size where user_stat.user_id=OLD.user_id; +end ## +DELIMITER ; + +drop trigger if exists `trig_update_stat_type_ins`; +DELIMITER ## +create trigger `trig_update_stat_type_ins` + after insert on typetable + for each row begin + update user_stat set user_typecount=user_typecount+1 where user_stat.user_id=NEW.user_id; +end ## +DELIMITER ; + +drop trigger if exists `trig_update_stat_type_del`; +DELIMITER ## +create trigger `trig_update_stat_type_del` + after delete on typetable + for each row begin + update user_stat set user_typecount=user_typecount-1 where user_stat.user_id=OLD.user_id; +end ## +DELIMITER ; \ No newline at end of file diff --git a/表设计.xlsx b/表设计.xlsx index d295563ff8e0b83963bb876acf295b3821b92c02..7381e546c646a547f43de3cd584564225f79abad 100644 GIT binary patch delta 11282 zcmZ{Kby!>95-si$DDG~-okDTf;#M4ryB7)W9voU+in}`$cPLUyDGtSoOOcn-d+$%) zd-((A%U;>}a?V>qWE#*YAGAgt6QvcfvAk@; z-iS#GBYl9$xQat5-{$ETDLA1`u5r}EF(q?}j65epfNSe)rI;y2dt6WaK$eFMO|#cs z+EtB>`Z7ni?6z#yMPs+LkSA`Q#o@E#X7^Lu8}+NY+zTn_fVS9q++C&81N){vTpKp4 zVA~}|hH^kSqdw?|eLwr?3hrPBllvIEP^WmImM0RWAYw2c{D_lyeN`XNS|IxyDvXO2 zTLVsGSa72*S_%ABpNx*hzaK<2cK?X&o zA&?U8B--jYFsmqz4OMMp=)D{6Jh#YeT29R}`A9wC3FIN~!Z>63#hZSZgUl9c+C#lK zd;KzD;o;jjMgi8>+Gm7F-T~pGKRbF{LTQmU%eK-#M{FWj3hX(ZEauo$4SlF!V0hCy z^yCp@!oUog#=k+K9u;q}Isq6lk^-rDkaNhJ+*8GIKCtxHscEEs@zgU>&76|+4aS?| z&=ro%pwV*EBkZQsPL3ql1B8&ytX^*hKpEj-Bz0^m2A(XApcigKcZw&8qTF_cRa2rC zzpCcK%RJ|Ev?1);RB7O6Cz+^SjofK(Du<86Qb__0c=`cvktf;N#u9~15 z&zEhWpgqOLo@@IF4i>AaeXGJE;T|vNOl6Ypl5z##Uty>nze?1urDhw`#fH&q}jo8BUtEhDiMkk>+s{- zFI*J!Dx-o(>az1VgURT~{4C&eYshdMZ6wXP)JWe%Ox+P| zDpJZG$ZRXH=8QE^wcU6idn9*k?TQZV$3*OP2_?wkNbc;JiuHLjP#U^34SbFGfpdAu z>e8$qAxhb%nBt*ldSl6zn@`T()0__cF{=xVdyH@7J9P67L`3~f>*7m8^B+ z1|!o>o)>S8awp8a;J@PpJvn%=dmPw6sU%FdWG{ScCNxu?&uv9jL`8oKVlv~ozOmsO zZ^ZLjj&3k@CWuSlsmrqzf16{HUX}!-C4I=v{fJhZ+cNZMz@qP2WPOUJ?ApHC2y5aN z9nq*UoAZu=R?oaTYfz_4i~pKKzJ)?2T07?Yr(W^X<7+tulUS}4%!KjDS0ZsD7V3ka zVlVig)YBPE@UH4sdIXvLLHY`+@60}VF8z$HnL%H8V9h!*&zM^y?>8lsIyGh2tx6J8 z!`Z8K%D|A0HYH;1|4bt{C*mdyq&;@x!>xV2eIb$TN2Jc1bNP5nx&Hl87d#nfYu042 zfjbr=>y#_%Hb_CzPnMdip^VR;@#`}ezH`%F#v#J{spA9N!2Ii<`1%U+r8mmA)jK~4 zw~DX4jFTwjom(bJb-nchUsx$HlcUX5>6+lE{gi7soW%bUMgGexp{UxK2W{4wKgP5$ z;{CbwQwI&}S-q1lmT3pdP%n)Vc*gwRi1q;Z1YhrpDF}n|?oGyLe#q@c#{dTs5rR1X z-0zjR-}n0jcuAUY(hCr$U@%XyPx5dqD;u&MLhFr+{dkn!^rPLABHVznGeQeS$av~{ z>iZfvJUHnaMhtEnqbyFyKycWB8uvla{Y}>e*M{y;W|G{hs92owNdLt{`-ovyY$bGd zc*r1Lp-0sOV`B%xC%asIE09z1tTab>^;;!-+kh0mq$D>$7pctC$PL02Q^n#&P)LO9mxLs4_RHF@6Ew);V87A$AjoZ1lnXpQlE5C@a7$3yo zMW~Y-syR@%s#*}Sz56x{&7Ar~^HKbMI;TJF>JSD#+$%Q&RrcC{ahx z24A1Fw$63CVi&H3*dz1Mxh{bv>XUQor$_d<7a$?>se5h=eATvbvU=6CG)4NN9@68s zGc*nO45{0pnCbn(>nRmzpI=N@9~!mR_`yG0xw0jJ;a1y|g}_R_)iZh=%tTu;n3KZ| z4ib-_&@`+@#*tT^)u0f{(dqKZgPZ);L;HtMUbGr^z*X(eCpc3BK^!s!)u0EDu#vG% z5@wl_d=CIUX}WDBj_*5pHyMoggBTAj_(kO$QNc9mn^plhU5(1+M!S)&cZ?jb=r_FN z6oZ-N!U~ul9O;fyo}i(io}Qq7|EWk_jSFH2NE?M-Kua=!9uZ{mUVjL#p)uT-j%ojO zwW7B&>-e@)j16su3w$*$LrJdE?_}Giuf4N4=IO>FNtJ(EE*SsArWIinwGCTS-j#QH%y9JhD zKi5m=dZNRCmw2^8nXAguEB;rSlFHO>ff7h`!P?=Hqw zI8ON5YP2&>b-Z<@8H9mkscgn#1SO7P5t+F=(qgw4!}EB`?!j;wLBtJB5rUak=!wBR zGQ|kn>=8M(0P4%+EOP2qI8!)Faf^gBj=G3A)hPNGmGt?{8)^gdxeN%WX6TakYn1YQ z$m$`@WLcDk!fVVM;sf*FKPq8Gmhd*&TPy99n0_62#QlK@{z=+^^6jj5O9rCY`Dev~ z+3^rT|Bx#QI6z!$xo+jyK=ab+zsEE9`FLJRnT@uhHAawr;v>8Fd31U`yAoI{?nxUN zl;Ab(Y!K~WkVL+g^FVl7VP-HJu%n>H7Ox(sWAI;5kFb)TaYR5 z^eZju^F^>UD|`UQfO;A!fy}@YMQ6Xr*B){=BoWbI&AVG&|2UsEN^p_GnZOe=n zAFC+mtIAuC`|O?MQ{cYGV>`R5Jo@24O<;BDjh{kP9S{ie52ZZ`QL3t0_slQ_{z$q< zF0tlEO{*nm0gtQHbDy2--t5uq;_fcbZPk{Qb(?ck!yo@-PqEBp9N}aV-VI^hDFFGS zEUoah@+~w2y%%fk!NZCN1sOyLF_nTj-Q;Msb=qR zX>`SWNJA2D##l_hdR*I97G+;^gB}APbkKYzvo7~nOlOSRjt%*)iW(40!4E6y1tBeyas{KRD^R@4L6uNam)l}uMorZ2hxb&&c;+S*J6u%b0D+yg_l7`X7sUY`3^#EB$++#FRBf`_ z#&NCJ<1euTiuvnSf*Ip)(5HQ+4>x!?$Fdwo!$f0qsYfXbrL9J(oz)YexVN#Y*JCib zF|m4StrM2#_6_ZjxRLNGNkHO6Awy%-{ijjmxhUBJo3IlS<_z?zwHXqj=z&o^pG!!@ znP6nM6UC&=5j6SD?b6?q$9xvj3iC-E=3uMbe^pC4{X!?yWq2iPkoxre1+u6*8Q~E(u1lY zuyM4yk=Uzbj^n;Ws`Ej0SVMsyg&Z%JQ3wxPMMWxNIFG}+2P~5IoY3+eD4m#GfQqBYYlN?Sf8a7$ zQ7YzqaDbr~qw$5|_~&PkUB(gGPZwD=^ynbtahx=kPJqifl7w~&PR*=ob*?*pL|~ZU z;o3r7y>=#c{C6C_cE4TZ%9oOM=G3d+0c!b@j~(`n>sbi9!lB6cTjowuHv@~D{nzdC z@+bwBRoU_89{acc_c0bR(Zu`ykKybleP|@+pa93xJu{Zj0%9QOUGOLJkXXl>N6!pj zwy~hc$XPGKso+R_i?MkHt@2_0!p(Vo%V_3IwtkDGiKp4+hGeh42aN$y&1vs+kQ`%{ z65_*svQxu}@9da!!DSVukXZ&4G9D42lO0LMHGq~|NerJ_|$_0 zH=&yNr|VdsnW1VBMRQ~SO41Ew9|H2$wl}<1E?sRCIi_(Qap8C6qq5+c-oZ4ncR;>=~s@6BX%Z#|nOuqxqFc7NDKE18WJNvtAQ)ZrJ`#Y@;pj5U| zj6fZ^0;D%m^aomwju!P$v!C4BO+bbO!E3h?-H)NB{MQea){geNZ`MS>2V$~`Xyiv0 zHQk0yR03;<@kjDIziwq{j5rO~SZ4?Sa1`!a9O(EA@fL?T8K0bOb~6uU~^~x3|gmr z$HaANdhOPVj}L?Xr58LxZE=pkxU~9`V)Jx^3tRL1_=wSTeX-46{(3D0nrLR0I_6B- zz)j3Am?HD&dj)5n{31h4fMn#Sq)Ej(*N?QFrNt!|0oD*+M9gIR;R3{*F=)b7$+y$! zGU>!IJigK<&a?ZUpJ1P}X6CJ~RXfDdFhzN;b9w&Mx&PFk-0NYcW&1CknwsR6kTMr# zaNfhP>~2*sLCK@&0#Io#1Y2-Bf%fQg<)p!~99*mBNsImvfV~$|W!}uVAAbUL6pwW8 zDEBHCWY|Y$_DcudvkO|)H=+kn%kJ695%1mwaR7;4f4yr9#{f|`@me)CYAl+ z!xP!~;B~06hsW6Rf;N0CG;?EUhRl4M=)zQFBA7oWfy!gS`tpF5{lZ;o+z5Nd5Ze`$ zR4m6k@{~0)IQplg{gXG7SL1>yAa(7hpHM~f-A!U(P2iNt8?a$xmT6l%$g%r%6g$_q zR)_#CyLwDSe;ja6tg>S^`hM*O%Y1@UxL9P#=PI_@&1VJ zl`fjlh=}OyaXBPLT#ezXhL>oW`xqEGq^|iW#*HsK_{MMjF=SVTu`bs_>9} z$y&fyS^aU+$Np^ekLliQpdA$Myg^Fqm=MCw`)0Cr$5qlwtkRvjpk!IRIL(G)G-C9v z^nC|MAhB94v!Oty>1KkEINX=B1?nai_#a~qMP$+W!>1vV-UGk18;X&5M3Z$_Jydz& zJXFKtq&E{$;yRvM^ohc?QYN*( zQ7u^MdnOqs1Cd%7@r*kXX7eRE)U#%`TPjifAezxade#i@|D!h~=@+9cw_9rPQP+HB zC^!fQU?MVRlg@>eS4jr$Qir>1eD2Us+xyjA zltnqDGy7SxG%jUt80}qpCx~wq*vY|Swg4?|DL=2bf=@vFg;Or3>6`UqfAoGN$yv0Gl~Gz13s3MiBP)zSNw7pZ&%ti zM#um_)|OXsueW6NgsKILM&w1;!YSzH1*}@cTMD8fqLG$!DN9j}y$py^vF)-K84{qo zkZ(JBVpRl~O?db&_27dvZklM}M^bRRdh+@D=(Lx9w!77CyGK3>6`z`EYG!1~Snmvq zy>#B~y&plZm+I0f9_x5F`k24muv617p&j>DDRM{blv3P_m-OL0xW3anMX)<1$%ql_ zaL$+?TI;HJG+0hs-ac%9isBe{k-c}%7(ZNesTTePyB}8Y6et!XpAdxB^`m2wEpu#U zA*WHjKFlukA^(b;(5M+N#EeZgcdeIQ%C90l@4LqIRlYftI&A=qip<&iaNyjqNsN!- z3SQl?f|>}5cgj~O{>6YY5iIfV75E&EjoP z@{CI$S(M1vCZuq3H{ueJ@vAFQLNEJs&culLUHh{M3y;5eXk6-8y0i#)P}0VD-DzEa z$;KAzaNtHRB1ho$kzDQI^PLD9i?;9|oEKO`ONk@G$nG7o&_=@ie)9_veX^jHy!eAWf z;fIzWk1c*q#(Pfyw0Z9m%3_3O4fT-k@rkX4gc`Q}cEIF0a%8hh&u}zhtu0|tr-tC= zYaD5Q0#yO(`X>n5eTq)i?E!!759x1~RN#Feq}TpKdcHrTA8}auZHU0%VZfZ=NwFBh zjfvSTTC+;cTq>$lN3%1Q(R9*Ct#wj+%RyZm!zFN2C!Rl$obFy6=W5o#9u!)m^z}u+ zO(Us~zBNc7UrP(-K+fJ(8cDIvrBL}kyn6W1zW;40wjA0wAY>4?@TzNq(LEnw!oW%o zWaU)IspT49?V)5~8<^&osKp(ZPx<)`@0RTF5eu5Srdm&5L}l0@IVB#>b&J3D*ur~j zy{|!YUmco`L+>21XyKs+$DrR%_=H*km$56sggb-&w)(VDTsx%iAS zY2SHb@knJa#KoD?;2QKItZ2SZ*@O576cn}AM3ZWubBfCBO>O5D=-xfHqYp_2Q>MMC z;M@C63Nrt6%vokK^ua^2dO1#$Q+8eE<$JaaC51@AukN@yr6?{_XW=2!%MB1i1li}B z3G+kj%o?2bZ$m^JDD!NHnDMS&$l$~$9Eb+)9b!A738n}4?PD_D-FsHQ4PhLej-EWY zuXr{@5NI`g%kQ=8pWs{!d~lQ{Qcb$wo1C3lLo4U1s|qUCVKB#tqX@&Yv{Q#GZ-xsW zTkPA8C$SStAx9@tHBAyf9B?}^iQvU4hZ0PMS`)-`rJ_F>$@y%9z+N;vSbFu@3HvZi zZ>TYPa18th+5YeWirV{)Cxj15&wK!@bijkM!Mc#T9Vc`Rcqu~B9jq(fmz$v4WW8Hd z)+Q{tgI%$d{$-L={j&R7yh(mvf*ad7*spstIDRM|k+zeR0O+Qkzlx3H_?!PF_dQ34=e z9$OoI*owpG4R7K94y>PzD53&a1fJ?1}TojQ(pI;|2`-zuW>Rslq087Y!8 z6m6HzQty=fKnZqcbP5;L{t#G3F~{(f0C-7weS1r3?D(|rQ>|BCoh^4W53g*RED_^^ zKbx|U<#5Lp6+YZZ5$NfBO27+Y!@$1!g)N9QWy5y?I1>$;H}^ftvBLFJ!RQ~v@N0)SWVLB<`wWWt1dP76 z@3ll!U`x)-*7r0bj#`}n1G+>-{ZHDnhPP~g>%hTE7{4otYE%Az2&+c)Opu1^lu2nM za3!Ml=qUQBFWo^8KV&!y(>qvkLG$xz9nfsyTaFenWf1c%1M$bVX;8ZEC3JyG9p{f? z3(;OhEnmNNB<0)SY%R^paJ-NhbVnjAm=Dr${Iz7#5>JT7l_(mtCy9crP0vqLs%)O{ z(+yHURKI|yQ3eL4Gz`yP=}TCI4$N!iqZNi@$H5NvKoB?r{ z#?(-BtZFrsZpdr37d>H;wF#nM}cAGSc@GIK(Zb1JKreAwnXn74j;y!zfE~JHp z7{lZxf#7=vk`EzEA425-v1+LpkJW{p=SKez)`OmDZ;zh&oAnj{VLj?&|1<0Nve?Fn z&GSDVd`R;ntUrEiXhXs>kCa(PX+?!K=jr?k$9u~93sIMCBSq88=Uh+29Y{G;EF7g< z#975;9+N~K;ww0S(JwLX#Pb4~CPKL|!O1;HBIt)C0))kX>Kf7Ku}B z9li97^`?8V0Rq=klxGJMsbfe6kZ?5x@VI5o(I7fLts(v{bkXg@yXuyH=X_KsC_->8 z86Fsi10SRWX$L3rRfu!M&!Go5Mt=+w9f-(is&6o`59Klg_}pbH7O>&nw~$Dz=v;e*Ah(Frn<% zt{(rR6GLQ)Feq%PV)$r}CvsT5Z+uo&%A9}FM3bHR^Gu~Vz z@A(V35eZ&w8YWi_GN9JcjGKo1taR6VcsZ3*ui}llD@4NPEeF7yV|Y-ZI|}{#$RkA+ zGV;KAu4}QN_tV9xOxrQ~5^lB?L-;q3OB&Vo{Ln;(5kb~uyQ{M+`he9U`(I_p2jXA5 z{Dbr-sqoy^E*s|xBnE>Nsu7pzhqh*A;!Y8r*tCt@+sRR`0fV+UqS*rac z0oaZ4jD0cJ8W~eDRV-nIk?2VOr%NpYED<^qWf|+lPuXY@^?i6kzot?u!s*`Yx1=r>poWfFJnw-JfNRka+r`Wra_Vq>vqC;eAi!qnV3MMYD06YSRDn z`M9+xr+eZD=z3A^Jv8J){&gZJh=f$Y9Acy(eU*7pg0K^%d(13Dpj6DzAuB!wav;Ez zW(KJCCD8t>vaKavZ+VK-0y<3)KvJ2?H~@x>pCw$Re$L}5bT0J<*4Ia(F2VcEzy7>y z%~ztydzk4hLgbiY)=shydaQid>s4OGmkH|c3>#McD$EHMOY?B;@$ivP^M!ax|$$VNQ2Jm=96-B$}T_5ku5-y76}Pk;KMH;6x^|#1RR@ z+3JC8u|)xPIo zq%nK#dKt7sl|n$2W;j%~Cl2T4Nl_l$N(wqF^w6uE@;<8MM;`ByRQ4M{?I^$j4Uohj z+MeX0EgRub3v!|zpmraarQ8i_hwMCk!P+E$2sM+F;P-2KAQ~?s2;5Q25581wAt;&G z=C(KwtsodnEF4a%$Fc^m%1K{d8dcd?>RX2db@QsO=}0!DpLs=Q zyeQ3%JU6!CT5wLJ)tgD-%*Shy|Xgq0jtYibAr2k&5}S zo1jev$F(LFiN!HJA4xD11I3d*_2TiaStEuRY|e+-gy}3rvFn9!p|5REJOx4uyDz9VRHa zt?;~?F=5eT%gJJ?qyMT?g?F6b3Na1lrsEvcNBb`?lj?SOZu`^M0T?Y=IT!mvs$*{K1*iD0@v-khDlTLWl>$dFLe)K zijc*ytPD{WC{eylW15A7|zB`rBnTUxPtJUvn2qIPbrwyO&U#Cj5DDXXOh%n9>3fNNJi zx7YJAN0z>+s_;yxg_ZPRH0lCGf44=lqM$QhHyxB8csJ-hPYcpuQkL~7#1Ym&*(c!r ziXS@TbadGS6MiqG#KwP!^#F{Kg7 z{Q^f;IuU?3uW=-s;X2U~FgbC3y>JvNna4+T@J6Kp_vrw>+{|K@WMtJS(n*ipnQ)p+ zmH8&u)C$cI1Q5NMAa0C{td5edrwBSRD=$eZhS|BEGIB~3 z|c5K1GJwyQ@Ijogd|GjiPbGB&%X zZGJeSzY^l*WhW#Xn>NYISW+L?BCen2h_7eXc=@_Z=v4w$2Inxc@9woNce~0`1QVuZ zPGWr`nlDFjE8?;XK4C;q~{&Khe4N9ha1|fIglKf?P{2L_21OX9&Y1#lJe|3ug2A#1y z?*w9j2WNHwNd8e=|8+4T(MOJF;7SKOObZVfy;B56<`r1ElbrZ}#RMS~6wW_BatMy- z6oZMA0@rpEgLgW)VG^XDLlkKg@MsSJyd@2QT*Lpqz%tK^=rVs6cV+&*m@50c2$21= z_(S&Ziy3myi%i|z(AnUcZW6E$B+3Cp_mF_cySZTs6rYz#d$?hWm7YTir9a#JQu_Ng zWy;Ts-90=oRglWaj0Q~9%Ldb<`y4t#!dWv&$Osy|iAd_dn gKL9QH;BWmxF#Sc(8;TCFL4O824ZK9yZT$`VKLv~EoB#j- delta 11032 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