add success message to add patient, edit patient,patient notes, patient files.

update note and file view to match UI.
restrict file types in file uploud.
add image viewer
This commit is contained in:
2024-07-04 13:34:55 +02:00
parent 0c40888907
commit 643f4cd39d
34 changed files with 377 additions and 112 deletions

View File

@@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
class BuildFileView extends StatefulWidget {
final String pdfLink;
const BuildFileView({super.key, required this.pdfLink});
@override
State<BuildFileView> createState() => _BuildFileViewState();
}
class _BuildFileViewState extends State<BuildFileView> {
late PdfViewerController pdfViewerController = PdfViewerController();
String getExtType(String pdfLink) {
//print(pdfLink.split(".")[1]);
return pdfLink.split(".")[1];
}
@override
Widget build(BuildContext context) {
if (getExtType(widget.pdfLink).toLowerCase() == "pdf") {
return SizedBox(
width: 700,
child: Column(
children: [
Expanded(
child: SfPdfViewer.network(
widget.pdfLink,
controller: pdfViewerController,
),
),
],
),
);
} else {
return InteractiveViewer(
maxScale: 5.0,
//minScale: 0.,
child: Image.network(widget.pdfLink),
);
}
}
}

View File

@@ -1,26 +0,0 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
class BuildPDFView extends StatefulWidget {
final String pdfLink;
const BuildPDFView({super.key, required this.pdfLink});
@override
State<BuildPDFView> createState() => _BuildPDFViewState();
}
class _BuildPDFViewState extends State<BuildPDFView> {
@override
Widget build(BuildContext context) {
return SizedBox(
width: 700,
child: Column(
children: [
Expanded(
child: SfPdfViewer.network(widget.pdfLink),
),
],
),
);
}
}

View File

@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:patient_manager/components/BuildPdfView.dart';
import 'package:patient_manager/components/BuildFileView.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/objects/files.dart';
import 'dart:js' as js;
//import 'dart:js' as js;
import "package:universal_html/html.dart" as html;
class BuildFilesList extends StatefulWidget {
final List<PFile> files;
@@ -14,9 +16,78 @@ class BuildFilesList extends StatefulWidget {
State<BuildFilesList> createState() => _BuildFilesListState();
}
int indexOn = 0;
class _BuildFilesListState extends State<BuildFilesList> {
int indexOn = 0;
void viewFilePopUp(String filename) {
showDialog(
context: context,
builder: (context) => Dialog(
child: Stack(
children: [
Container(
padding: const EdgeInsets.all(10.0),
width: 800.0,
//height: 475.0,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25.0),
border: Border.all(color: Colors.blueAccent, width: 5.0),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
filename,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.blueAccent,
fontSize: 35.0,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25.0),
Expanded(
child: BuildFileView(
pdfLink: "http://localhost:9000/mih/$filename")),
SizedBox(
width: 300,
height: 100,
child: MyButton(
onTap: () {
html.window.open(
'http://localhost:9000/mih/$filename', 'download');
},
buttonText: "Dowload",
buttonColor: Colors.blueAccent,
textColor: Colors.white,
),
)
],
),
),
Positioned(
top: 5,
right: 5,
width: 50,
height: 50,
child: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: const Icon(
Icons.close,
color: Colors.red,
size: 35,
),
),
),
],
),
),
);
}
@override
Widget build(BuildContext context) {
return SizedBox(
@@ -35,36 +106,7 @@ class _BuildFilesListState extends State<BuildFilesList> {
subtitle: Text(widget.files[index].insert_date),
trailing: const Icon(Icons.arrow_forward),
onTap: () {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(widget.files[index].file_name),
IconButton(
onPressed: () {
js.context.callMethod('open', [
'http://localhost:9000/mih/${widget.files[index].file_name}'
]);
//print(object)
},
icon: const Icon(Icons.download),
),
],
),
content: BuildPDFView(
pdfLink:
"http://localhost:9000/mih/${widget.files[index].file_name}"),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Close"))
],
),
);
viewFilePopUp(widget.files[index].file_name);
},
);
},

View File

@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
import 'package:patient_manager/components/myMLTextInput.dart';
//import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/objects/notes.dart';
class BuildNotesList extends StatefulWidget {
@@ -12,9 +14,87 @@ class BuildNotesList extends StatefulWidget {
State<BuildNotesList> createState() => _BuildNotesListState();
}
int indexOn = 0;
class _BuildNotesListState extends State<BuildNotesList> {
final noteTextController = TextEditingController();
int indexOn = 0;
void viewNotePopUp(String title, String note) {
setState(() {
noteTextController.text = note;
});
showDialog(
context: context,
builder: (context) => Dialog(
child: Stack(
children: [
Container(
padding: const EdgeInsets.all(10.0),
width: 700.0,
//height: 475.0,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25.0),
border: Border.all(color: Colors.blueAccent, width: 5.0),
),
child: Column(
//mainAxisSize: MainAxisSize.max,
children: [
Text(
title,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.blueAccent,
fontSize: 35.0,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25.0),
Expanded(
child: MyMLTextField(
controller: noteTextController,
hintText: "Note Details",
editable: false,
required: false,
),
),
const SizedBox(height: 25.0),
// SizedBox(
// width: 300,
// height: 100,
// child: MyButton(
// onTap: () {
// Navigator.pop(context);
// },
// buttonText: "Close",
// buttonColor: Colors.blueAccent,
// textColor: Colors.white,
// ),
// )
],
),
),
Positioned(
top: 5,
right: 5,
width: 50,
height: 50,
child: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: const Icon(
Icons.close,
color: Colors.red,
size: 35,
),
),
),
],
),
),
);
}
@override
Widget build(BuildContext context) {
return SizedBox(
@@ -34,27 +114,29 @@ class _BuildNotesListState extends State<BuildNotesList> {
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}"), //Text(widget.notes[index].note_text),
trailing: const Icon(Icons.arrow_forward),
onTap: () {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Center(child: Text(widget.notes[index].note_name)),
content: SizedBox(
width: 700,
height: 250,
child: Text(
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}",
style: TextStyle(fontSize: 16),
),
),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Close"))
],
),
);
viewNotePopUp(widget.notes[index].note_name,
"${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}");
// showDialog(
// context: context,
// builder: (context) => AlertDialog(
// title: Center(child: Text(widget.notes[index].note_name)),
// content: SizedBox(
// width: 700,
// height: 250,
// child: Text(
// "${widget.notes[index].insert_date}:\n${widget.notes[index].note_text}",
// style: TextStyle(fontSize: 16),
// ),
// ),
// actions: [
// TextButton(
// onPressed: () {
// Navigator.pop(context);
// },
// child: const Text("Close"))
// ],
// ),
// );
},
);
},

View File

@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:patient_manager/components/buildFilesList.dart';
import 'package:patient_manager/components/medCertInput.dart';
import 'package:patient_manager/components/myErrorMessage.dart';
import 'package:patient_manager/components/mySuccessMessage.dart';
import 'package:patient_manager/components/myTextInput.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/main.dart';
@@ -47,6 +48,16 @@ class _PatientFilesState extends State<PatientFiles> {
late PlatformFile selected;
Future<void> generateMedCert() async {
//start loading circle
showDialog(
context: context,
builder: (context) {
return const Center(
child: CircularProgressIndicator(),
);
},
);
var response1 = await http.post(
Uri.parse(endpointGenFiles),
headers: <String, String>{
@@ -85,8 +96,11 @@ class _PatientFilesState extends State<PatientFiles> {
futueFiles =
fetchFiles(endpointFiles + widget.patientIndex.toString());
});
String message = "Successfully added file";
messagePopUp(message);
// end loading circle
Navigator.of(context).pop();
String message =
"The medical certificate $fileName has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
@@ -97,12 +111,22 @@ class _PatientFilesState extends State<PatientFiles> {
Future<void> uploadSelectedFile(PlatformFile file) async {
//var strem = new http.ByteStream.fromBytes(file.bytes.)
//start loading circle
showDialog(
context: context,
builder: (context) {
return const Center(
child: CircularProgressIndicator(),
);
},
);
var request = http.MultipartRequest('POST', Uri.parse(endpointFileUpload));
request.headers['Content-Type'] = 'multipart/form-data';
request.files.add(await http.MultipartFile.fromBytes('file', file.bytes!,
filename: file.name.replaceAll(RegExp(r' '), '-')));
var response1 = await request.send();
print(response1.statusCode);
//print(response1.statusCode);
if (response1.statusCode == 200) {
var response2 = await http.post(
Uri.parse(endpointInsertFiles),
@@ -115,15 +139,18 @@ class _PatientFilesState extends State<PatientFiles> {
"patient_id": widget.patientIndex
}),
);
print(response2.statusCode);
//print(response2.statusCode);
if (response2.statusCode == 201) {
setState(() {
selectedFileController.clear();
futueFiles =
fetchFiles(endpointFiles + widget.patientIndex.toString());
});
String message = "Successfully added file";
messagePopUp(message);
// end loading circle
Navigator.of(context).pop();
String message =
"The medical certificate ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
@@ -170,6 +197,18 @@ class _PatientFilesState extends State<PatientFiles> {
}
}
void successPopUp(String message) {
showDialog(
context: context,
builder: (context) {
return MySuccessMessage(
successType: "Success",
successMessage: message,
);
},
);
}
void messagePopUp(error) {
showDialog(
context: context,
@@ -232,7 +271,7 @@ class _PatientFilesState extends State<PatientFiles> {
);
}
},
buttonText: "Add Note",
buttonText: "Generate",
buttonColor: Colors.blueAccent,
textColor: Colors.white,
),
@@ -295,7 +334,10 @@ class _PatientFilesState extends State<PatientFiles> {
child: MyButton(
onTap: () async {
FilePickerResult? result =
await FilePicker.platform.pickFiles();
await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['jpg', 'pdf'],
);
if (result == null) return;
final selectedFile = result.files.first;
setState(() {
@@ -335,7 +377,7 @@ class _PatientFilesState extends State<PatientFiles> {
);
}
},
buttonText: "Add Note",
buttonText: "Add File",
buttonColor: Colors.blueAccent,
textColor: Colors.white,
),

View File

@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:patient_manager/components/buildNotesList.dart';
import 'package:patient_manager/components/myErrorMessage.dart';
import 'package:patient_manager/components/myMLTextInput.dart';
import 'package:patient_manager/components/mySuccessMessage.dart';
import 'package:patient_manager/components/myTextInput.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/objects/notes.dart';
@@ -56,13 +57,26 @@ class _PatientNotesState extends State<PatientNotes> {
});
// Navigator.of(context)
// .pushNamed('/patient-manager', arguments: widget.userEmail);
String message = "Successfully added Note";
messagePopUp(message);
String message =
"Your note has been successfully added to the patients medical record. You can now view it alongside their other important information.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
}
void successPopUp(String message) {
showDialog(
context: context,
builder: (context) {
return MySuccessMessage(
successType: "Success",
successMessage: message,
);
},
);
}
void internetConnectionPopUp() {
showDialog(
context: context,

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:patient_manager/components/myErrorMessage.dart';
import 'package:patient_manager/components/mySuccessMessage.dart';
import 'package:patient_manager/components/myTextInput.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/objects/appUser.dart';
@@ -91,8 +92,8 @@ class _AddPatientState extends State<AddPatient> {
Navigator.of(context)
.pushNamed('/patient-manager', arguments: widget.userEmail);
String message =
"${fnameController.text} ${lnameController.text} Successfully added";
messagePopUp(message);
"${fnameController.text} ${lnameController.text} has been successfully added to the Patient Manager! You can now view their details, add notes & documents, and update their information.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
@@ -118,6 +119,18 @@ class _AddPatientState extends State<AddPatient> {
);
}
void successPopUp(String message) {
showDialog(
context: context,
builder: (context) {
return MySuccessMessage(
successType: "Success",
successMessage: message,
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:patient_manager/components/myErrorMessage.dart';
import 'package:patient_manager/components/mySuccessMessage.dart';
import 'package:patient_manager/components/myTextInput.dart';
import 'package:patient_manager/components/mybutton.dart';
import 'package:patient_manager/objects/appUser.dart';
@@ -85,8 +86,8 @@ class _EditPatientState extends State<EditPatient> {
if (response.statusCode == 200) {
Navigator.of(context).pushNamed('/patient-manager', arguments: userEmail);
String message =
"${fnameController.text} ${lnameController.text} Successfully Updated";
messagePopUp(message);
"${fnameController.text} ${lnameController.text}'s information has been updated successfully! Their medical records and details are now current.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
@@ -116,8 +117,8 @@ class _EditPatientState extends State<EditPatient> {
if (response.statusCode == 200) {
Navigator.of(context).pushNamed('/patient-manager', arguments: userEmail);
String message =
"${fnameController.text} ${lnameController.text} Successfully Deleted";
messagePopUp(message);
"${fnameController.text} ${lnameController.text}'s record has been deleted successfully. This means it will no longer be visible in patient manager and cannot be used for future appointments.";
successPopUp(message);
} else {
internetConnectionPopUp();
}
@@ -256,6 +257,18 @@ class _EditPatientState extends State<EditPatient> {
);
}
void successPopUp(String message) {
showDialog(
context: context,
builder: (context) {
return MySuccessMessage(
successType: "Success",
successMessage: message,
);
},
);
}
bool isFieldsFilled() {
if (idController.text.isEmpty ||
fnameController.text.isEmpty ||

View File

@@ -185,6 +185,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.0"
charcode:
dependency: transitive
description:
name: charcode
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
url: "https://pub.dev"
source: hosted
version: "1.3.1"
checked_yaml:
dependency: transitive
description:
@@ -241,6 +249,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.3"
csslib:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
cupertino_icons:
dependency: "direct main"
description:
@@ -416,6 +432,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
html:
dependency: transitive
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
url: "https://pub.dev"
source: hosted
version: "0.15.4"
http:
dependency: "direct main"
description:
@@ -989,6 +1013,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
universal_html:
dependency: "direct main"
description:
name: universal_html
sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971"
url: "https://pub.dev"
source: hosted
version: "2.2.4"
universal_io:
dependency: transitive
description:
name: universal_io
sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
url_launcher:
dependency: transitive
description:

View File

@@ -36,6 +36,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
syncfusion_flutter_pdfviewer: ^26.1.39
universal_html: ^2.2.4
file_picker: ^8.0.5
supabase_auth_ui: ^0.4.1
supabase_flutter: ^2.4.0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -17,17 +17,17 @@ endobj
endobj
4 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1025 /Subtype /Image
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 100 /Length 1042 /Subtype /Image
/Type /XObject /Width 100
>>
stream
Gb"/_960,J$j1SN95!t'!&SE)RS!u@.12^HrpC3WCGe^0]%f$R\j5/BAT,S;1FqQ%RD]l]I4RHPAaElT.(`#M<b2I'IE1BQWht65"#s+IQ1`si?!20Z7p(&'GijEmI_T3h3mkF<iihBj=aAmp=A?\XQPeT6:&!''G[FKA]An<B*USm].SS(E`NOW2n+Z/91&n1j=n03UPon*4k5FK0G(&iW/M$hpD6,o^au&O7[B%$.r=r73I/Xs5Pm;JcpHS"PWbY-B?CaC\WL`KA^&La,DRumT=B>5a]9jABMu%"]55K\1H$uCk]>QE$?o4mY5DrrL4NIY+M^[T$BT?@,':;h>K1o[\La!n!k1IX,JSAQ*knfB^G#Z11*gBsGnbL@c"<aI-+KO_?M[H/sfMd4nX/u*"2mYQ"jK\Z3gaaBhc9'%Q0j\#QG\+kS&MGOFlg.fYm@]KMjSEG!oV;*/bEl+h+Ij9%lASp%$j0eXMS&d@<\_&Oi^6Hs_gSVfmND_96`-s[]TX'M,m)&Zl'.%I1M-.DPa2*JXAp)>c0o*-Bac:Lh3Sl6QPJBk<q(73Am-94F'g,/oHD,XiiF2XTjD5rBss/X>'>Z,Wg+<#HO6aB*W>rjrFX_sg1cMnYHm0&hT6+nm_kl\O"maVn"YoXpYTJn=0WZd]H9V:)r4$_[2mqe(#PA.@R&$)Pp!tO$GKs^m<kr,PSKgrij3,->PPSP0#g_k0pVdKNihYSb=[Wd/nTK%?L!o'3\!?F>?8dm=ac*k(K]R@=W^,hYMi/dJ*b@YX@t`/qZn_6!\:<*?:Xf\L,"2E<E?aK1`?f[h5SAAN8_Z:M]to!nTbj"mh4H)W^Z5Z2ZHY9;*'(hap'YgeN6q0bbi#0EsOl+LsDpPh+p,LIFS)CXLu.XO/(KYG>i7P1QCS`QW72Uiq`GCAu0Uj0kWH\<04eB=d>9PpjZGc]lNZ!YGHEDi04ruaNBQAK8?E!]F35Wf(%_tPZ:jP)Tp?$'_gSFIJaQcf'u_2ZASKiF[s2fS:BDLGdd~>endstream
Gb"/`8Tr!*$q#CA9;d-[QmedaFhh9"$H)W(eHtAN1e:$Gm$Oq.VXJ-Mc.Lpt$@,2iZGl3;QAnf0gI^'aWj4*).Eg7Zh0CmMMB&!nlCbGq]44oC^>0B%gdRfSht/qo=B9"P1\9cOc70:@?"A1t='!%@=o!5jb_cp/o0]7!^)qQcq4kZ8jnD3CpmA-@n)%b:laubsXSfQb`p0[Y9]_jI>P4-Iq^W_WZL[0eXABtEUNq?o1K1D!;0]FBWA!Y5mcj[+=RhL5]hF=o*%']AZTdG24Eaj>rCnVMKhTt<;F_)b5ooch$tI:543I&iNYLPqGqPMPC!Cm77iC15Ob.s5cQs5\/W)LQ,"$APkan9HB;Y"q%acr1W&5*rkquC/a&;W:7sS#2ZL[\3C7mdQk3Yun!qZ-P3('hg+d/_8,KY[NbNdc^9JRq.)=gbgR1?cLoZKkhN3(Wd-l"L+O\@`K%(VGEb/uq!X77&7.7Fd]1X'H$)'f(qgpaB-l5cs"nao#qM-f!BLm[O&=Ui#SptMDdZWV$!*g07lA``C(b259hd(u]p/3BdQ`JK&^YcJgF4L9-"V9F]mLXY0r@p)s@XNG9#CU-9lB45E?j:'_0%$=g6j7YsRQW71N(hQ9&b`Pe;AM_lHAm([6L!HL+=_`+5ToJH0I9HCCZ?#Xp&X4')j(I\F/i"L*c_dfA.4]&T/eK;e6;1HH),)gHFjS#SG$0s[>\X_/`7)CNKm]YXFl\W^AQ;cD=eRH[Ge*!Gd/=eV.a..EeTuafb%a()3p>J"ZCdP?]Ziq>dPi2<s0di5bKld&C3'kW^$qBJNRe2WIsH/d5G,7PkGq^)([93UjSc&or#pY:A'9:bN??7=Z<G5>`/81s?DLO-_:4f4[rD7+c98?haDC/>CKB42M9A3Q]K7PWl(miorN[oR=Zg#?PEhaulB3nr"]9*=?WLaW++>Oe8Wn:)ok1AM.4]mA<d]uI\s.OUP'?X2;!bQLoC#eoXNG93Z7HM>A+5KkK'[Bp6[>DgVIgZoT6<L*VOc3YU&%Yf*HQZ1Gg!O\~>endstream
endobj
5 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.cd283a2c1d6ad3d76ad89881508b17eb 4 0 R
/FormXob.38e804a25cd7412fc4aa43f361bf60ca 4 0 R
>>
>> /Rotate 0 /Trans <<
@@ -42,7 +42,7 @@ endobj
endobj
7 0 obj
<<
/Author (anonymous) /CreationDate (D:20240627140120+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240627140120+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Author (anonymous) /CreationDate (D:20240704093659+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240704093659+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (unspecified) /Title (untitled) /Trapped /False
>>
endobj
@@ -56,7 +56,7 @@ endobj
/Filter [ /ASCII85Decode /FlateDecode ] /Length 446
>>
stream
Gas2F>>rBm&;B$=/'anN6V0U_4K?3TN9D[8d)S%=V:m8"Jdh\9["(PTR!-p$mXF>02\a2:Zs,s.gi2m5'U4.bTRe28hdamD1]Q\L&I_%!`F4FE8GseO-K$a6=PP,uNtE.4K"lqFrR)N"Bkco:M_VMI"V,;po2;A!DIm>#_S-q6$pAM`,`#]HHr2M)DkeI:jp#F[)SBD&n&>m*NVO:SFGZiY$J>WYk;MtB%;:H=>M]!^s0!#90QI;oZ9M^;<cY$od^6lj0iI+8lfOtW'FV#n'TK792HHGUU<P0QW)e2Ch@AN*N:c&CoX_+R1t&HDFkD89&Toh.XUaQt](P'1<gXun%,@Gc4`ZWk*[P?$@\:)bmO'N"Y<UE/rLu)Tj=D1E9[Gmoo0FGPeYXTK,Y:I8R:2o)Vu?.Z@5mH3jI@Z?4O$<pg(o.\`m34V"n)[R`Oc'~>endstream
Gas2F>>p/.&;B$;($AGb.3p'5qWOc9c<)*(*qV0]K1-q\RbI#@Qh7"dFZO%UYhAK8h1^H&(L>ou"'c*Wf+aH8Pb:/$&9etKkf@tZ7IWSYZ[S485G3!n$jqdp-\V4b^W-W?V\!bXB0S3W7Qc\/_d\R@=Zg)OoX%N%`hdQY<H_TE&#%#qAd!Bm:<]^u]&bKmR^n$>8V`Z(na5feUS536;U.#Kg0h5'eWUM,C]`2'QfZC8=hJYu'[-Zq)kDq#g.O%l=ZJ,dS^V2.V/>+R\XHZ*UMOc\Yd*t*+7)a&7b*E2AR9l(`=_A,YOo-#CUDeI>-h;H+N,+hc07.@HO4"oN":$YYbtoj!p!u^$/)+rcRt(B-EER`\[HAHCaX4+k^mcq1,\GGcUu0QjCt%EFAh6h8R0s4EVK@WCd%%Bh`4UNGT&)HHjd]2gW_]sL$0HnBY*I~>endstream
endobj
xref
0 10
@@ -65,15 +65,15 @@ xref
0000000114 00000 n
0000000221 00000 n
0000000333 00000 n
0000001549 00000 n
0000001815 00000 n
0000001883 00000 n
0000002179 00000 n
0000002238 00000 n
0000001566 00000 n
0000001832 00000 n
0000001900 00000 n
0000002196 00000 n
0000002255 00000 n
trailer
<<
/ID
[<712dd983c575d0108ff950f2c16588c6><712dd983c575d0108ff950f2c16588c6>]
[<9654e78acfa3634d4603cd72a8d4f7eb><9654e78acfa3634d4603cd72a8d4f7eb>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 7 0 R
@@ -81,5 +81,5 @@ trailer
/Size 10
>>
startxref
2774
2791
%%EOF