From 5a3f62c1ff49ae705d56dead191a595b014fcd01 Mon Sep 17 00:00:00 2001 From: yaso-meth Date: Thu, 20 Jun 2024 10:07:52 +0200 Subject: [PATCH] Update API to update patient. Update mytextfield to table is editable paramiter. add edit page to edit user information. --- .../lib/components/buildPatientList.dart | 1 + .../lib/components/myTextInput.dart | 11 + .../lib/components/patientDetails.dart | 28 +- .../objects/emailAndPatientScreenArgs.dart | 6 + .../patient_manager/lib/pages/patientAdd.dart | 31 +- .../lib/pages/patientEdit.dart | 305 ++++++++++++++++++ .../patient_manager/lib/pages/register.dart | 2 + .../patient_manager/lib/pages/signin.dart | 1 + .../lib/router/routeGenerator.dart | 10 + .../__pycache__/patients.cpython-310.pyc | Bin 4887 -> 4659 bytes backend/routers/patients.py | 6 +- database/#ib_16384_0.dblwr | Bin 196608 -> 196608 bytes database/#innodb_redo/#ib_redo10 | Bin 3276800 -> 3276800 bytes database/binlog.000014 | Bin 3539 -> 7365 bytes database/ibdata1 | Bin 12582912 -> 12582912 bytes database/mysql.ibd | Bin 32505856 -> 32505856 bytes database/patient_manager/patients.ibd | Bin 131072 -> 131072 bytes database/undo_001 | Bin 16777216 -> 16777216 bytes database/undo_002 | Bin 16777216 -> 16777216 bytes 19 files changed, 375 insertions(+), 26 deletions(-) create mode 100644 Frontend/patient_manager/lib/objects/emailAndPatientScreenArgs.dart create mode 100644 Frontend/patient_manager/lib/pages/patientEdit.dart diff --git a/Frontend/patient_manager/lib/components/buildPatientList.dart b/Frontend/patient_manager/lib/components/buildPatientList.dart index b0085dde..bad6bfa0 100644 --- a/Frontend/patient_manager/lib/components/buildPatientList.dart +++ b/Frontend/patient_manager/lib/components/buildPatientList.dart @@ -4,6 +4,7 @@ import 'package:patient_manager/objects/patients.dart'; class BuildPatientsList extends StatefulWidget { final List patients; final searchString; + const BuildPatientsList({ super.key, required this.patients, diff --git a/Frontend/patient_manager/lib/components/myTextInput.dart b/Frontend/patient_manager/lib/components/myTextInput.dart index 446195ae..da1ab217 100644 --- a/Frontend/patient_manager/lib/components/myTextInput.dart +++ b/Frontend/patient_manager/lib/components/myTextInput.dart @@ -3,19 +3,30 @@ import 'package:flutter/material.dart'; class MyTextField extends StatelessWidget { final controller; final String hintText; + final bool editable; const MyTextField({ super.key, required this.controller, required this.hintText, + required this.editable, }); + bool makeEditable() { + if (editable) { + return false; + } else { + return true; + } + } + @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 25.0), child: TextField( controller: controller, + readOnly: makeEditable(), obscureText: false, decoration: InputDecoration( fillColor: Colors.white, diff --git a/Frontend/patient_manager/lib/components/patientDetails.dart b/Frontend/patient_manager/lib/components/patientDetails.dart index c33de7f4..8f4c2c71 100644 --- a/Frontend/patient_manager/lib/components/patientDetails.dart +++ b/Frontend/patient_manager/lib/components/patientDetails.dart @@ -30,13 +30,27 @@ class _PatientDetailsState extends State { child: SelectionArea( child: Column( children: [ - const Text( - "Patient Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 35, - fontWeight: FontWeight.bold, - ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Patient Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 35, + fontWeight: FontWeight.bold, + ), + ), + IconButton( + icon: const Icon(Icons.edit), + alignment: Alignment.topRight, + onPressed: () { + Navigator.of(context).pushNamed( + '/patient-manager/patient/edit', + arguments: widget.selectedPatient); + }, + ) + ], ), const Divider(), const SizedBox(height: 10), diff --git a/Frontend/patient_manager/lib/objects/emailAndPatientScreenArgs.dart b/Frontend/patient_manager/lib/objects/emailAndPatientScreenArgs.dart new file mode 100644 index 00000000..a24e9d4a --- /dev/null +++ b/Frontend/patient_manager/lib/objects/emailAndPatientScreenArgs.dart @@ -0,0 +1,6 @@ +class EditScreenArguments { + final String useremail; + final String selectedPatient; + + EditScreenArguments({required this.useremail, required this.selectedPatient}); +} diff --git a/Frontend/patient_manager/lib/pages/patientAdd.dart b/Frontend/patient_manager/lib/pages/patientAdd.dart index 2c4a78f3..3d060e73 100644 --- a/Frontend/patient_manager/lib/pages/patientAdd.dart +++ b/Frontend/patient_manager/lib/pages/patientAdd.dart @@ -34,18 +34,11 @@ class _AddPatientState extends State { late int futureDocOfficeId; Future getOfficeIdByUser(String endpoint) async { - print("here1.1"); final response = await http.get(Uri.parse(endpoint)); - print("here1.2"); if (response.statusCode == 200) { - print("here1.3"); String body = response.body; - print(body); - print("here1.4"); var decodedData = jsonDecode(body); - print("here1.5"); AppUser u = AppUser.fromJson(decodedData as Map); - print("here1.6"); setState(() { futureDocOfficeId = u.docOffice_id; //print(futureDocOfficeId); @@ -56,10 +49,8 @@ class _AddPatientState extends State { } Future addPatientAPICall() async { - print("here1"); await getOfficeIdByUser(docOfficeIdApiUrl + widget.userEmail); print(futureDocOfficeId.toString()); - print("here2"); var response = await http.post( Uri.parse(apiUrl), headers: { @@ -78,14 +69,12 @@ class _AddPatientState extends State { "doc_office_id": futureDocOfficeId, }), ); - print("here3"); if (response.statusCode == 201) { Navigator.of(context) .pushNamed('/patient-manager', arguments: widget.userEmail); - messagePopUp(fnameController.text + - " " + - lnameController.text + - " Successfully added"); + String message = + "${fnameController.text} ${lnameController.text} Successfully added"; + messagePopUp(message); } else { messagePopUp("error"); } @@ -124,8 +113,10 @@ class _AddPatientState extends State { children: [ Expanded( child: MyTextField( - controller: idController, - hintText: "13 digit ID Number or Passport"), + controller: idController, + hintText: "13 digit ID Number or Passport", + editable: true, + ), ), ], ), @@ -136,6 +127,7 @@ class _AddPatientState extends State { child: MyTextField( controller: fnameController, hintText: "First Name", + editable: true, ), ), ], @@ -147,6 +139,7 @@ class _AddPatientState extends State { child: MyTextField( controller: lnameController, hintText: "Last Name", + editable: true, ), ), ], @@ -158,6 +151,7 @@ class _AddPatientState extends State { child: MyTextField( controller: cellController, hintText: "Cell Number", + editable: true, ), ), ], @@ -169,6 +163,7 @@ class _AddPatientState extends State { child: MyTextField( controller: emailController, hintText: "Email", + editable: true, ), ), ], @@ -180,6 +175,7 @@ class _AddPatientState extends State { child: MyTextField( controller: addressController, hintText: "Address", + editable: true, ), ), ], @@ -201,6 +197,7 @@ class _AddPatientState extends State { child: MyTextField( controller: medNoController, hintText: "Medical Aid No.", + editable: true, ), ), ], @@ -212,6 +209,7 @@ class _AddPatientState extends State { child: MyTextField( controller: medNameController, hintText: "Medical Aid Name", + editable: true, ), ), ], @@ -223,6 +221,7 @@ class _AddPatientState extends State { child: MyTextField( controller: medSchemeController, hintText: "Medical Aid Scheme", + editable: true, ), ), ], diff --git a/Frontend/patient_manager/lib/pages/patientEdit.dart b/Frontend/patient_manager/lib/pages/patientEdit.dart new file mode 100644 index 00000000..575b3a97 --- /dev/null +++ b/Frontend/patient_manager/lib/pages/patientEdit.dart @@ -0,0 +1,305 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:patient_manager/components/myTextInput.dart'; +import 'package:patient_manager/components/mybutton.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; +import '../components/myAppBar.dart'; +import 'package:http/http.dart' as http; +import '../objects/AppUser.dart'; +import '../objects/patients.dart'; + +class EditPatient extends StatefulWidget { + final Patient selectedPatient; + + const EditPatient({ + super.key, + required this.selectedPatient, + }); + + @override + State createState() => _EditPatientState(); +} + +class _EditPatientState extends State { + var idController = TextEditingController(); + final fnameController = TextEditingController(); + final lnameController = TextEditingController(); + final cellController = TextEditingController(); + final emailController = TextEditingController(); + final medNoController = TextEditingController(); + final medNameController = TextEditingController(); + final medSchemeController = TextEditingController(); + final addressController = TextEditingController(); + final docOfficeIdApiUrl = "http://localhost:80/docOffices/user/"; + final apiUrl = "http://localhost:80/patients/update/"; + late int futureDocOfficeId; + late String userEmail; + + Future getOfficeIdByUser(String endpoint) async { + final response = await http.get(Uri.parse(endpoint)); + if (response.statusCode == 200) { + String body = response.body; + var decodedData = jsonDecode(body); + AppUser u = AppUser.fromJson(decodedData as Map); + setState(() { + futureDocOfficeId = u.docOffice_id; + //print(futureDocOfficeId); + }); + } else { + throw Exception('failed to load patients'); + } + } + + Future updatePatientApiCall() async { + print("Here1"); + //userEmail = getLoginUserEmail() as String; + print(userEmail); + print("Here2"); + await getOfficeIdByUser(docOfficeIdApiUrl + userEmail); + print(futureDocOfficeId.toString()); + print("Here3"); + var response = await http.put( + Uri.parse(apiUrl), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "id_no": idController.text, + "first_name": fnameController.text, + "last_name": lnameController.text, + "email": emailController.text, + "cell_no": cellController.text, + "medical_aid_name": medNameController.text, + "medical_aid_no": medNoController.text, + "medical_aid_scheme": medSchemeController.text, + "address": addressController.text, + "doc_office_id": futureDocOfficeId, + }), + ); + print("Here4"); + print(response.statusCode); + if (response.statusCode == 200) { + Navigator.of(context).pushNamed('/patient-manager', arguments: userEmail); + String message = + "${fnameController.text} ${lnameController.text} Successfully Updated"; + messagePopUp(message); + } else { + messagePopUp("error ${response.statusCode}"); + } + } + + Future getLoginUserEmail() async { + userEmail = + (await Supabase.instance.client.auth.currentUser?.email.toString())!; + //print(userEmail); + } + + void messagePopUp(error) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(error), + ); + }, + ); + } + + @override + void initState() { + getLoginUserEmail(); + setState(() { + idController.value = TextEditingValue(text: widget.selectedPatient.id_no); + fnameController.value = + TextEditingValue(text: widget.selectedPatient.first_name); + lnameController.value = + TextEditingValue(text: widget.selectedPatient.last_name); + cellController.value = + TextEditingValue(text: widget.selectedPatient.cell_no); + emailController.value = + TextEditingValue(text: widget.selectedPatient.email); + medNameController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_name); + medNoController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_no); + medSchemeController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_scheme); + addressController.value = + TextEditingValue(text: widget.selectedPatient.address); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const MyAppBar(barTitle: "Edit Patient"), + body: Padding( + padding: const EdgeInsets.all(15.0), + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Personal Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, + ), + ), + IconButton( + icon: const Icon(Icons.delete), + alignment: Alignment.topRight, + onPressed: () { + // Navigator.of(context).pushNamed( + // '/patient-manager/patient/edit', + // arguments: widget.selectedPatient); + }, + ) + ], + ), + Row( + children: [ + Expanded( + child: MyTextField( + controller: idController, + hintText: "13 digit ID Number or Passport", + editable: false, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: fnameController, + hintText: "First Name", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: lnameController, + hintText: "Last Name", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: cellController, + hintText: "Cell Number", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: emailController, + hintText: "Email", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: addressController, + hintText: "Address", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 15.0), + const Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, + ), + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNoController, + hintText: "Medical Aid No.", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNameController, + hintText: "Medical Aid Name", + editable: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medSchemeController, + hintText: "Medical Aid Scheme", + editable: true, + ), + ), + ], + ), + //const SizedBox(height: 10.0), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 500.0, + height: 100.0, + child: MyButton( + onTap: () { + updatePatientApiCall(); + }, + buttonText: "Update", + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/Frontend/patient_manager/lib/pages/register.dart b/Frontend/patient_manager/lib/pages/register.dart index e50ef938..610f5fd7 100644 --- a/Frontend/patient_manager/lib/pages/register.dart +++ b/Frontend/patient_manager/lib/pages/register.dart @@ -95,6 +95,7 @@ class _RegisterState extends State { child: MyTextField( controller: officeID, hintText: 'OfficeID', + editable: true, ), ), //spacer @@ -105,6 +106,7 @@ class _RegisterState extends State { child: MyTextField( controller: emailController, hintText: 'Email', + editable: true, ), ), //spacer diff --git a/Frontend/patient_manager/lib/pages/signin.dart b/Frontend/patient_manager/lib/pages/signin.dart index 289d7c51..2cd4e26d 100644 --- a/Frontend/patient_manager/lib/pages/signin.dart +++ b/Frontend/patient_manager/lib/pages/signin.dart @@ -82,6 +82,7 @@ class _SignInState extends State { child: MyTextField( controller: emailController, hintText: 'Email', + editable: true, ), ), //spacer diff --git a/Frontend/patient_manager/lib/router/routeGenerator.dart b/Frontend/patient_manager/lib/router/routeGenerator.dart index 3cafda8e..9240d0f1 100644 --- a/Frontend/patient_manager/lib/router/routeGenerator.dart +++ b/Frontend/patient_manager/lib/router/routeGenerator.dart @@ -8,6 +8,7 @@ import 'package:patient_manager/objects/patients.dart'; import 'package:patient_manager/pages/home.dart'; import 'package:patient_manager/pages/patientManager.dart'; import 'package:patient_manager/pages/patientView.dart'; +import '../pages/patientEdit.dart'; class RouteGenerator { static Route generateRoute(RouteSettings settings) { @@ -45,6 +46,15 @@ class RouteGenerator { ); } return _errorRoute(); + case '/patient-manager/patient/edit': + if (args is Patient) { + return MaterialPageRoute( + builder: (_) => EditPatient( + selectedPatient: args, + ), + ); + } + return _errorRoute(); case '/signin': return MaterialPageRoute(builder: (_) => const SignInOrRegister()); // //case '/signIn': diff --git a/backend/routers/__pycache__/patients.cpython-310.pyc b/backend/routers/__pycache__/patients.cpython-310.pyc index 3ee63dc916842d86b47118f7243b6ec1b7b74688..cd0a9bc83d4aaedbffc298a6ec34306330840147 100644 GIT binary patch delta 1064 zcma)5OH30{6z!W%hv_&SXfZ&bK*3VdU<=AmLXoeC^3j+mQDbW9Ol1tT<;|d}R-=ha zO-yd0TiMxQOiVYf+_*6@vT`*hZdke`Mi>6xo$?c0*vUIN_rCk?Ilc4dX{Z?VWIP_p z!G2#p8mSkrJa-A%fQRH8DZm46RH$V;v=%;aA-BjVt_}FX)e#YDoc=Oe#u8x}R-9F^ z=8CjaAB$&bB|};|y3Oj4)iXGV#BWD%jt>)eG0#sB`I4lo*@UTUY16=79QDC>*I>-e zDlJZ(qwPpsOUoL~S-fs)i@OxCxm7{6gc{%MF_Jqq)(nQwO?sdp_<5OCz)z{RxGqc( zA;==?f_|~J`!Lc70vaxG78mWH-CJ=I*EEw>W7vZ*gfNUS%E02Y8N;Mg ZNS)bblTPE#j)~GmgHOH|q5!F^`U4Dp>lOe2 delta 1289 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 aM1Tko0U|&IhyW2F0z}~dmB2{nq5lE+gR|oR delta 29646 zcmeIuF-ikr5C+iw*IgZ>1_Te_VlT0^3|NVk-~}u^f&Hp5eHuMO5WyfAyg={}9zgIC zE(DKY_lg;Y?}I5`-+z{VnAdS#k8YRytNN$3)x+`k`TCwsx@KtRf6d9o-Sd59l#DuK zBcsV^Gd44}GKPFRW0bLzv752?9^>XTs(E!?RaKdFSC1d1eY%;Br;F~gG-q!|2kXDf z!&UuNYyt!b5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N m0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk|0l4Ryp&(_ed6%| diff --git a/database/binlog.000014 b/database/binlog.000014 index 4892af236e5a4434aa8ac9dfd30da2515a684de3..8b985b3dbf03c0e8b069515c82faa8c3dc58d64b 100644 GIT binary patch literal 7365 zcmchb3vg7`8OP7wT{br_5+0$cAlV55(Ll1v=CRR$hz5)aA_-7J3$l_8Mw1QMY#B)% zDhkrnh%&%{TCt^-v5iIKky@OAB2|i@r!k&i0{$#eVS~-A-p-B95=0h{RWv~B3bA-#X&zI z77NEs*wl4hqeVhO!fm&Sp#>r#i<0Ed{n2)uGX|+MXxc*46Eua}wDFtsbKVZtWgn@jw- zjF!S_Zwb{p`UHMSy+ixNQeUXv9|%3z=nMFk_=93<+4S=JzkMNf6Lg0`cQH+`$^6w& z5O$F=@FZRBXc39_6ryYt*7dHEivsPeV?{Q-xV;SW7LTx~Vd`jjP&zWRoo#Z8R~?qV+;T2NS2 z94Dsw0*}t{*T&}+6z3OuJw+vnVs_A1TOX=#3iuk5M1iZiKG@Xas%rAp=A9B^@acKA z=u|2?h3b7rcB;irtJL;w${d!y-%`B}u21-Y0drXv>@yDA_426kNSTbtRTX3Eh4p%eGFy z$xQhjdGaXST-5Fho|sokVZKL(s6aUUmAPinl`0g@IJLG8l-nfbrnf$KL5?ZclbkMo zp>(3AykYMf&Cq4aM`br-NqO=^Z62hMlowHlCk#Tb2izk`w966lw}c#G;M`6-)Lw+_ zIA9QFwILK@*M)K8q0fb=kowt*_r7yG*X*Y-7ve=3Mi(MB%_x9TuNA@S01D9{3sL#> zrMDr+h4_Nxbg^A&MO}!$CWMwjmkTk+3CUO%;?bt!{YW7TaW{!?wxnRYCsV))&aQlP zz-(ZBeDBE~NHFVPNr`ESm3LQn#)#ioSUcm)^CPTj24kZn_olVCn5EcbL6gBJ8e;j`Yy3G23>}D)kx1|g}gcQu$A>X|NOh1^eB+S~=pAJ|rcx(4rNHFU$ zQldsN`}lar!pRh7Uk7Elzm8=~GZ@Q?QDD&zKKri8`j*NAKY<*xexKxYK`%VnqGtW) zAC_i8mswAYhhQvO*SAl~L<(lT)RKaIO;?~;7sxB(8CY-Lw6+Km%=$Sg(V$pYoP1&S zoC6ltAIUIF3|!F+#)kbpY3)y&tS8hx9)KLPE}}04T^v?2QL}#V);&(>GV2%c*a6c9@$1=_Vs-cUceSr z&0uWU|McYr&zP*Y+@d!^j#+OdIbD3H6ryIGdT{j<&}G(x@CJ)1>rpkWFCzuBzSok1 zSr4JCVb(?Jn$!ZU?+;Ab3JGStL`o#7XF=O!@o5i*nRTZO_t&v(X$E7%{;S$rpEp@& zx7|?*Ic7bWUM9LYp%kKKy>i6DanNPf&3H-0l=Zs9$38;}X1&{zf>{rxtYOy0>YCI7 ztk2cVIs*x2eNsw{RjfnvFQz>Co`rQLp8i*Fn!#A!9dz89Ti0}%taD3`Jq9^u-AZ!0 z_=^&Znsxk;)JxE1*4?t3v3y=Tl2>FP1+#WhZ;f&?>tVDj%-XB2NiD$oaHsnfNHFU= zrNkD+`scy919T#gjXy4{k3Sr4bIVb&$+fZ4$Mi(l$zAi=CVq{KnR z`hzLk6ZJzD)>mZM)EKa)8H|lb&4_Qh=>_5!-_3xpW)%sU+AlH4Jn8?9jgtK~BQ<(Yb|m+vy_Ngq;-@v_*P~#H+)u zG2V5o=7W_;z|=S6zK$vN-#t0&Wu(YJZ*Hd99@tr>P}DKvg>Z67p}R28TUg*Jc6&X8 zM2)YdDc>0Mq753b`|6;V*W;#EWEu1dkAiti62#q2LBFfox6B_LF1)V0f+2sf-q#?9 zy0+Yt37zzR+UeZrm%5RF?Q}u*w_5fkHp8cvhqT^~ z6w*$ZIn$vYPH{~;-Kd&I@>87h({(pJKt3jb}zbFVyd-eRbb49ogN znrViSj2HB*vZOlGP~Rw@zX5V=s4kMzMSjc-m6Vu%I})&=yx%md9UDXCx$l^O6l|z( z-DIY?rlD?FQ6o9(M!ETPj_)PlVM8sGcp8+Ux{p-uSog8TQ18lcBrnN*nqegQokP2N zI{mN0P~jKe)H~0<2{|^@xREf_Jux%X%#FEok$?@=MhT3^M{ErB{Oqcakb+-$+eVow nu4$+nRntg*k}q4g=X$^Jo|?b@eZXNmy({5#D?6R}B(3AW#4V6n delta 7 OcmX?Vd0BeHWnKUe4g-Av diff --git a/database/ibdata1 b/database/ibdata1 index 20f9dadafcfc3371a96e8d78884c4a07b10b9b3e..2db0c7392e99d9e33aa0a3f7e60bd646c42a9b51 100644 GIT binary patch delta 638 zcmX|-)mD@N00#G81hHd{HL(M+F)(1U8^uNp?7;41L>)0fQBko43~W@yyz^l^K7{Oz zbIx4Ncl7~D#H|Wq(cgdmR)#{M#76%U4yPB?M`J-GGsvhb2qHm6R#DK99G}LM1QM16 zX(EY|Buyn*nn`nMAuXkqw3ar~R@zB>iAV?OD4nFUM5T*#m2T2qdPq-6kzUeU`bb~t zC;erB43t4KSW;z(q{&bjCc|ZfjFeF_TGC~VjFoXRUNU5YOq5A7Su!O{Vv;RWWU5S) z=`urR$}E{Jb7Zc}llihha%7<_l3ZCVOJu1mljX8PR!W|%l6+Y$Yh9FT)@NDj*pIV#8GxSWuaa!QH>IW5I* delta 638 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 diff --git a/database/undo_001 b/database/undo_001 index 8fd87f119efd59850b21cc56016f9b02aeab8fb4..d401acdeb84953b241bdf3d2430ac6de7d2e7d50 100644 GIT binary patch delta 1450 zcmZ9L37Cyl7{|ZwyK~KTORg}kt!peX8YY8@OxzhaODjoIB9%fKqC$)Q7{B&KlWwU* zF-b|Ky6xUfrbT-yZPLCF+O%qXpUFHA=XuWezRx-T^E?0Nea|N;qF|Q0LUbIIZ31q=C7RKsf*;oXtk43QqumiCM*g;rBEQU404#pZ|O|Yg|4%Q5dW6iM^ zSWB!G)*3qmOH^7LD|W*xw)*$7zX`|NyHZnAv)%Ec)zK|}R^vFeU&pJzK2xmRk*=Sl zw^pS(rx)AcDHSoVBr|nR?wIUWiJrBDM3Lh}tKGdgKf2S?+p1EXyh)J?*IU&gx@DB( zloteoMEAA+cH^cMS@NTsl|6Fovx*il$ttRI%dO0d#+WNf<< z-$z5=S>5ow`0#XGrTOWU^^bdry!7Z~ZmGK{y+r+I)@$s>y122l8*bY?)4QZ}P2V;F zBRJD<1lc|-RtNGE&uh_S4{Jdx<)iXzQB}35CT^@%9m-Amr~nZh89sjJOdr)~UsT@4 z|7|4$R@Xf&Z(cpW#AWH&?9yl`$EOV)I5;QMy(G1+ZzQ02UfxEOLPw(kl^STpvlb5N z2XLc{ib4_=Qc*YkR$=g&Jv+Jt0g509Vb-aI_Zht zz?SJRvZbu1wRfNga)Hy z(6Q(^bUZo%ors2@q39$u44sUIqf^ibbSfH&PD7`oQRoab8jV3`qOs^KbT&E%jYH?6 z^U!!S0Zl~bqeSj$yY5Q;0ryOTP zd{rW>jIxlMS=K2J`Z7O^WnkN2nOG3(g>8%V#u@IJp?SS>ecEqx={@6}f z7|X$S#&*F5V7p?uSYDImTY1gc)s3mT^lT#FZiyt5$#ntOt?#uY}B z80UCv7R8FaMyr`PJLE z_fKczl$BoCqQzd!4hp;3MP6;Bur+On6Y`vl!kom2Xk}|fzMttUtCr81m&yrsBeXAE z+ev7M#lmjpz%IamtpF#|T2bmJIw|3xth$*gKvs7^TSt#+I!-8UnO7W%hP_zCrw(qY z9o>>XymuhYE2xa+CQ72Q#T7xH=CrqUpcopBs+u&$idQr{MX4GE-D;%1Q;!<1lXOeH zVvPwWVv*{+&S&c9txvC-;U%NhBNLPJqsnUuxfQuVpXh%`RE=uT!RQclC^`%sj*dWM z(UIsVbTm2!9gB`b$DES`T4uhBQ? zTl5|J9<4+_pjBu!`VswvenxB1TJ#J075#?Rq4nr@^auJAwWAHF1O0{mM*pCH(SK+o L`X6m-Qc{}%Lf0sM diff --git a/database/undo_002 b/database/undo_002 index 6c421e2945c6ce57e966970fee863e61e8389e78..29b07173c60ce59e47201de740c0f9bcba9277da 100644 GIT binary patch delta 2929 zcmZvc33wcJ8OCQPd(IxSn`G*i9^2LgOPVIB1c>cY-ZaN{3rWQqGzAk|D78vUrO4&M zHpVwd4}?&s1~o)V0MSB3SdSL}DH0DP6)h?dqNue;3@WvPXPEy^GTroXo@b9|zW4jh zw>#f&GMS7&BVV1aPPMaOpF0!ZGX79VQItaKAc-)m_$5xhvGzL&=z`R(DZ&D7+Lt3O_}FLZb*$gebxk5el6m zN)e+dq$r{&rZ6aGP`ra8PBD|>9Ew>Kvnl3K%%wTD&)#6!klb+{Jsn zSDLTYuiR^1eWZTb?8NzYXQJA=f!(etjP+UchDAJ646Rl>-lVt+=E-`Qtk2bIbM=_&c3*qLV2j5ud#xjAuJ)#^j-A2w zW<_<&Q&YsZWXF0#J03jNq!hU4$f2;uszh)thn=u z!8c`FiMiXgKr{FIQq@NASZJh4@#M3E$Lvr=D6Ol5Ev7}RHbQOTx@N_j4-1XR+%}EWuoD<<{oTO%FO|9s?@9sq&!BrE|P3k{Q1c6i)Npmt}y2X zQvvhda2mw}k>MsKkdF)x(E=HnPw%FkB!ch9XA)Bjukd3;e3{UT2^X&F8j{NYgU`R(R8pl z6Wi6SMDi)Ib7gjsc_Nx#X2c2$^(IBnXT=J0^^kkprrS150b}Z_ViW$9X5Jr26`6@x z+M~vHSt6WRTrU@2F8a&QFIa8uTtY6>)FGd0XA2NL96dE%0R4z%ZR$o<)sL7joVT(k zd)YIo-J#iui)>7yMp2@N^QBeqv88?0mNt6ojIYN80FNYgSLCU(P6J z>Rj2GPL4hG_*yHp(7uZOE+6z~5A5sJH%}kfdvs57RgK$w)DqKr$h?%j+_kF56HVlv z8f< zEpa7r74adWjc6x6Ospf;6IT=05F3bViH*cZh)u*tiH{N25u1rE#P!5h;^V{(#5Uqa z;uFM8#LdJl#I3|_#3zYQ5uYYLL)=bei0woN@mZpi_#8o^i@1aMJaH$ngV;&zB6bsZ z5nmwgChj4+iF=7X#1{#Z*h_qg=ppVSzD#_D_$tv$+)wloUn3qM_7M*f{lr7W!^9)R z*NI1oZxG)k_7jg0j}rsLw}>Z*Zxc@vPZ3$-JH&U1?-Ac84iE>4r->gBf*2$Y5zi1m zB%URPh#wI@CVoQvlz5K#8Sy+ZOdKYDPP{<;g7_tIgm{to74d80H^fWC%fu_h2=OX0 zO8l1i9q}6Rd*TnoABm&HpNM0`apDAVk{BcYOpFt+6MrH8O8kv@gE&R}oj6VWgLsp8 Vi})w;FXG?Ce~AAQ|LezucpI0=PfGv* delta 1352 zcmZ9K3wYII9LLW&ZS6$qvaJqjm1~z(6V1}(yPVprxs2RuN)4ghNACVOKFMgroS{)! zQ^=*s$#p+PZXv`dw-_P|$)%!s|Lv*g+5XS-{{Qdud%mB~`}@D|>v>+-^G7Tg3&q;i zBzci-<K3He03)U6uhNWU@SUT1n>w!hEeX;$p zp4k3aFDwJ=jrGC$Vh3OcVh3RdV~1deV*RlG*Z^!GmWd6*24h38EbK6BD0Vn@1U3xI z#*V~tu;JKI*a$2aI~p5_9fJwW!$#HGv0h}#pdItw26k=rw_8`#$0J^JP<*taJwhq{ z;}flKeWF)hbp6P%4+LGH){82)CSK9#=+suU+rvO;ccr>%R3NC zU7X0ZXnATd#0p}^MRMy>);WK_HvZyx#0oPjqlK@+;=BaSadg=j1)LdT;M(23|I6mW#~$D6`Fyr zM%SQg(RJv0bOX8(-Gn@JGr9%ciel(C1e%F%N3+l!s2tsi?n1Ls1-cvEgXW-n(S4{A z-H+m^3O#@xL=U04s2V+t9zpZae6#>PifYh8REr)%i_l{9IC=s-iI$+J(9`G{^ekG6 z>dHTni^K;NS8P$T*t{eXT%8_`ebXS50Z pf|}4~^eg%e{f@SvKhRe6C;AKhjs8K~&~~%~{fquXJ8RW!{{sP*7VQ84