From 13b838c7c76a14aab8fc6f7eda639b39c2befbc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E5=B8=88=E5=85=84=E6=B3=95=E5=8F=B7=E9=9A=8F?= =?UTF-8?q?=E7=BC=98?= <18862253202@qq.com> Date: Fri, 26 Sep 2025 17:42:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=8D=95=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configs/Config.json | 17 +- 电子展板/App.xaml.cs | 6 +- 电子展板/Assets/InitConfig.json | 30 + 电子展板/Base/GlobalVariable.cs | 40 +- 电子展板/FodyWeavers.xml | 4 +- 电子展板/FodyWeavers.xsd | 151 +++ 电子展板/Models/MyConfig.cs | 49 +- 电子展板/Models/UploadFiles.cs | 14 + 电子展板/Upload/0.jpg | Bin 37146 -> 0 bytes 电子展板/Utility/ByteArrayStream.cs | 928 ++++++++++++++++++ 电子展板/Utility/Logs/LogHelper.cs | 144 +-- ...xtensionMultipartFormDataStreamProvider.cs | 36 + .../ViewModels/MainWindowViewModel.cs | 94 +- 电子展板/WebModule/HomeModule.cs | 31 +- 电子展板/WebModule/IndexController.cs | 182 ++++ 电子展板/WebServer.cs | 120 +++ 电子展板/电子展板.csproj | 31 +- 17 files changed, 1671 insertions(+), 206 deletions(-) create mode 100644 电子展板/Assets/InitConfig.json create mode 100644 电子展板/Models/UploadFiles.cs delete mode 100644 电子展板/Upload/0.jpg create mode 100644 电子展板/Utility/ByteArrayStream.cs create mode 100644 电子展板/Utility/Web/WithExtensionMultipartFormDataStreamProvider.cs create mode 100644 电子展板/WebModule/IndexController.cs create mode 100644 电子展板/WebServer.cs diff --git a/Configs/Config.json b/Configs/Config.json index 791b814..21ec831 100644 --- a/Configs/Config.json +++ b/Configs/Config.json @@ -11,13 +11,20 @@ "DangerPointSize": 35, /* 危险点字体大小 */ "Measures": "1.佩戴个人防护装备:所有高空作业人员必须佩戴符合国家标准的安全帽、安全带、防滑鞋等个人防护装备,并定期检查这些设备的完好性;\r\n2.设置安全设施:在可能坠落的高度处安装安全网、护栏和踢脚板,以防止施工人员意外跌落,并避免小物件掉落伤人。\r\n3.进行安全技术交底:在施工前,必须进行针对性的书面安全交底,确保所有参与人员了解安全技术措施和个人防护要求。", /* 重点措施 */ "MeasuresSize": 35, /* 重点措施字体大小 */ - "CPCMember1Path": "/Upload/0.jpg", /* 党员1图片路径 */ + "CPCMember1Path": "/upload/0.jpg", /* 党员1图片路径 */ "CPCMember1Name": "张三", /* 党员1姓名 */ - "CPCMember2Path": "/Upload/0.jpg", /* 党员2图片路径 */ + "CPCMember2Path": "/upload/0.jpg", /* 党员2图片路径 */ "CPCMember2Name": "李四", /* 党员2姓名 */ - "CPCMember3Path": "/Upload/0.jpg", /* 党员3图片路径 */ + "CPCMember3Path": "/upload/0.jpg", /* 党员3图片路径 */ "CPCMember3Name": "王五", /* 党员3姓名 */ - "CPCMember4Path": "/Upload/0.jpg", /* 党员4图片路径 */ + "CPCMember4Path": "/upload/0.jpg", /* 党员4图片路径 */ "CPCMember4Name": "赵六", /* 党员4姓名 */ - "CPCMemberSize": 35 /* 党员字体大小 */ + "CPCMemberSize": 35, /* 党员字体大小 */ + + "FileUploadList": [ + { + "Name": "0.jpg", + "Bin": "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCALuAfQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDxKiiigBmKMU+kIzQBHijFOxRigBKKWigB4qQVGKUUih5NITQSB1OKizQAjVHinUu2nsAzFOUUYpaNgHLxTqTbikAxQA7NGajxRigCWiminUAApTQKU0ANpu33qSl2+9ADAKUVIB70uKAEJppNBNNJqUA7FGKZmjNUAuaTPtRu9qbmjcB2adTNw7c0u72oTAXNLmm5pc0bASZpymos0qH5xSYGhCfkq5VOD7tWxWbGidRnNPAxUSnOasxJ15pFAi7s1aFuxpqHBq3FKADmgSZALSQ9qk+xSVeW4Vc8Zp32qqJMpbaQOOKvRRupAIqUXK+lONwp7UkixZF+XOelZ13qdtFCYixLE5wKj1C4u5srCoVT3FY5sbhmLNyTSEnclu9UmuE8sMRH2rOOSeTVkxPCSGU0B4h9402gSKuM1MIwR81K0iMCqLj3q1ZWRluAp796GrDKpZ2GAKljtWlTc3Wtl9L23A2L16/StaDTYTBPKwwscf6ngVLYGDb6aW/eY+VRlj6UrEDcgXHvmthwY7aREbGUIJrHZcQLk/NuGaqKuJjDGwHSrEMe4F3GEY4qNyQg5q1DIDZKAOhzwKpuxJbigIjAwPyopqTMsarnoMUUh3POqKKK0BuwlFFFBItJS0lAEdKKMU5V96BCilPy0ComNDZQjN7U3PtRmhRihIB6inkUqDrSkUgI8U7HvS4pcU2AUUUUAJRS0UAApaBS0AApDUgpDQA0CpQKaBUgFACAUHipGOKiY5pICF26cUzbmpSKbimAzFGKfijFAEbCkYVIRSEUARkYpwOacBTScUAOpwGajDZ7VIozmgBKfF98U1+uPSlh+/SFc1IelWwnvVe3Tjmrsa8Vm3ctsdEnzjmrqr8uPSoIx1q0F96jYBwUnpThC56DNEb7Wq3HOtUMiELjqMUNGRjPFXRcIOtRNcIelNoRSC470rAnoKuJ5bnAp/kqvvQMz9pHUUBc96uyIvHFLHGnOeKATM9gFUnriufltTJcHI6110tsrKcVUisDM4KLwKTYFWHSxGqHPbPSrkKLFjHatV7diMEDIXpVFEbaxOBj1PXmochpElo8lzJPvG1YzhOOoq+6tHBPGV5DoD+tRRqI7WHHTbke3zE01xlnHqaWw2iNx/o0/wDuE1iQKZFCqOdxrZunZbObB6pg+4yKr2MYRSZPXitIaESZVe2dHCdcjNWorSV08uFSSeuK1be1N6X2oWbsM8AepqaKGDSiZHdmuCPlSP7o+pptknK7scN5gOTx+NFbbXl07bmukz/1yFFVddgPLqKKbv8AarAdmkzSbvak3e1ADs0ZpAc05aBDQMU4mkLY7VGxzigAY5puKeo60uz3oAZilVaft96VV96BijpS0UUAFFNAxTqAFooooATFGKWnKu7PNACge9KBTlXPenhfeluAwioyKkJqMmgCQUpb2poammmApNIKa1ODZ7UABoNAoFADMUYqTFGKAIjQBTiuO9IKAEIqF16VOahftQA1atL3qqtWl70ANf7xog+/St96nW/36TEbNv8AdFXFXA61Wtx8gq6nSs2jQlQc1Y3e1V1bParAQnpUbiHrCXzg9KkNnKO1XLJduOa1TCjdqtAc69nKFzVcxuDjBrqmiQdqrNChOcVQtzEgVw/StEvhScdK0EtUOen5Uya1wvAqW7DMV3JNLGsz4KDg963NN0yKVbh5R91eKY6hYBgdaSYFMQ4/i/StLTlCyqo7VW27GBzmr+msPtQIOcVLYxs6tvklxg4wKx/KLyKuCRnkCujnOSynuMD61lhXty5B5zwazbNWrEaRqqlTyAxx7DNQFd7E5xWsthv+eS4WOAAHzZDwcjP4mmedp1nFG9tE80wbCvMMoc+1WiCkbFnsppJHEEYAPmSdOvT8as232GD5FjaeUfxv90N7D0+tVpria+m3TSFiAcew9AKktIGPzgj6HiqJFv7ma5nAZgvGMINvHpUMkSvFuYZNSXyJFcyBGJCjODVq1jDWIJ9KTBK5jQ21zcR744GK5wDRWssk6Ltt/wDV/wBaKu5J45SEUtFaiGYoxT8UYoAjHFB5oPFA5oAZmjNLt96NvvQIkXvT6RaWgBtLTaZQMnU4pajBqUt7UAMxRilzS0AKtLilFLSTAYF96lVaYBUqihMBQKRx0p5NRE0AQsc4pgNTkVGRQAbvajd7U3NGaYC0UUUASCgU4UCgBKKKKAGNTRTmpooADUTjpU1MZc4oAYnerQqBe9TigBknaltVywOaRxmrFnH83X9KQGtAcIDVpOc1FbJjHNWkGM1kyieKLuatIcZqFDxUq85qWwLUbYbOOlaEVwVXBNVbZAx9K1o4EZc461cQKUlwzDANQeY3rV9rOoTa/wB0/pVtkpipMVGDUnmeYMZqt5Dr0NTRKazbGa1ogOk3DhcEE/jVCKINDvb8q0bZwukXKniqMQItlQDdj061LYyrKh4wM1NZv5LO27tV2Kxfh3YIPemhLcMWjBkI9aQxIzLdRHanHrjApzrbxSHzI/PyARyVAP8AWpYhJNMgd8KDkKBxUQgMj+WVyfT1pJXLKcbf2lcs7jdtGQB0H0plwNoMY6Kw/ka2ktIrJmVcKGXsc1jykg7iOG3Ef99Y/pQhDIo0OeKEbZIrHqGyRTwuFBz1qKYZZh61QiG8k3yNxjc1XNPctZMp6LnFUpV3LgHg9DU1nvELjyHfd6dqTAlXey52r/32KKrNaqWyzsp9No/xop3EeT0UUV0EDiaYTQTUJNACkVKBTEHWpAKAG4p2KTFOxQAmKMVLijFAEFRNUxqOgCSNCQal8v3pYxwKmoAh20u2psUuKTQEOKSpWqBm9qAF3VJmoc04N7UAPLU0N7U0nNOBoAQ0004000AIRTc0803FMAzRmnYoxQA8UCgUCgBaKKKAI37U0VIaiNAC000maYzUAP3e1Hme1Q0ZoAm8z2rQsjnB9ayc1p2YzipkxpXNyE/uxU6DccCmW0WU+9+lXI4worJMpskjQ7easovWoN2O1SAsfu0mxF6KQo2RWjDPhSN3Ss6KFiDVhYmWrjsJssvc4xzRbTCRiCaoyI5XG2mW5eF9x/KqEb/lI3aoFhPmMFp1rcF7fBH60NP5Mg5pMZaigCq6yn5D7UoeKEYiQE+pqHe0nznv2pSuO9ZbjLGPMjy/JPeoYoysDZ7nNWzEBJHjjinpEWhAFAJWKlkDDdIxH4VZinEd5MQqhgPlGPelnURLvA+b1rPWVorl5GfJb2oKTLpctJvJz7VkXWxDEqEH5MnB9STWhGJbhsRDAAzuPQ/Smtb2cP7u6cTPGhGBwGbOe1SlYZSSCa4wkMZfb1I7VYsLRHuJBdyrAYCPMjb7xzyOPerUN2Y9OjS3/dryD3Ofqap7ixLMSWJyST1qyUiUvZWSOUha4kDHY0i7VUduKryyNepslwwbonb8BTZFzinWyZuo+exP60JibHw2skEQjjVlUdAq8UVZlDGQlZWI9aKoR4TijNR5J6mkxWwh1O2+9Lt96dQAgFOIpQKcRQAylpKWgB4NLSYxS0ARSdqh71YkHSosUAWIugqWo0HyilNADxUhqIN7UpZvWgBpqu1WDUbdqQDKKKKAFpwptOFACikNKKQ0ARminGigBTQKDQKYEqd6aakFMFACUU6oi2O1ADWPSomOKGbpxTWb2oASkopaAEpMU6nbfegCMCtqwHArIVa2rAcCokM3IX2xjipw5Yc9qhhH7sVPjishj4YyX61dSMDBIqrF8r1eMg4xzSTuBdgKheBwamMijrxWWJSOn86a0me1WCdjRFzGOppWkgYYzWIXb1pRI3rTaBK5vRToq4zmiRxMVC1gF29av2cjKA2elJsaVzpIFCRAYqQru71HA4kQEVY2s/yquc96luwBExacgn+GrNncEearAHYcZNVwttaYeaYuxHCKelRPfxNGypagZ+6+ec0JCaJ5x9oOEkVASRuY8VVdLa2H7yTzpQxxgYUGmxktNkmklXzWU5xsY/jSKaHGd3O5uMrtwOOKzpH/AHztjqanc7Iyp69Kq0DbLa8WYUdATj8aQJ8oOetORd0KrnHfHpzVgcqKBFOQdKjjl2ygY/hHf3qZkMrAj2FTQxRbZgQN7IGBI6Y7VUdwasR+Yv8AeX8zRQWDHLZz/s7cUVoZ3PDakWmVItWBLt96dTdvvTaAHGgUgp5qbgM2+9OxTdvvTsU0wHYoxT8UYpgROOlRAVYcdKhAoAsRfdpxpsX3acaAGU2pG7VC1ACUU2ikA6m0UUDSFpwpKcKBAKQ08Uw0AMpafS0ANpVpM0m9T3pgTLzmmnmot/tRvz2pNibJDUL84qykTuuQjflQVKgkrn8aYykwzSeXnvWkHDdUWlaUbDkAfTpQJMzStJirb4BBA6nFMKKe1AJlfb706pvL96btPfigExgFbdgOBWMK3LDoKlgma8ZxGKkVs9qqeaF696he8xj5qyaLNMS7SOKQ32OgrH+0OaAkkhJPGKVgNL+0F9ad9tLVRjtjz8pqbydnUHmqSGkWjcn1o8/3qn0qMybe+KYGgZ/euj0OOO8tzu+6OtcQ0zMwX1rrtMXyNPVkP3jyKQHSLc21quxRnFF9fSeThcrn0NY8Zyw+taF588ijpgCp3GimT+9xzk981PCGkhRs5BkwKp5+duOhxWjp8geLy+4OaTRSZNGgifp1qYYCDnLHk02X7/1p7HaCRz8tShGZcmoVyVABxirP2Wa5lVEjbLe1X5NGMG4seFGS+OB/9eqEKkPl2FvIRguDn8DURx/C2a1YtQhgtlQxqfLGAfbv/SqEWqMxMPlIqNjaEGCDnuetAkxLbT5ym+RVgjLghpGxx9OtVpEQRh/7TgGxnCgQs3GevUelTX8266OW3kAAknnpXMSTM9wVQ/h/M1SVw3Ogi8ryx5+oW6ydxsP+NFc/9okPLHJ9aKsk8rFTp3qAVOnetBD6KKKTYCUU6ikAKKkxQBUmKaQDSajBpxNMBoTASVvkPFRKKWQ9Kan3xTAtJ90UppE+6KU0AIaharFQNQBHRUlR0hphRSgZoxQCQq04UL3pRTTEPqJu1O3VETSAUnNNJphb2phbPagBzP04oU7qjrYt7PyoNzjBPamBS8knquaewSNSQ6s3b5TU0svlZ5xj9aoy3CPnYgGeuKQidbp5WAduKkSX5ym3r2xjNZ3me1WUfo2KYmy62Ffdj5e9RY2+9M37yTjnvTtxkOzaTjuKB3AxlcbecnFKIm37qkdPLAJckemKaJd6ZiYMfQ8GgGxhj2jLCoiN33eaeLlXcpIpyO45xTwQjA9j09xQFyHZj+Jfzq3HP5bZ6VWb5XPoelPCgrwcikGxe88uMA1KsO7PzfpVG3YLJzW9bxho89KzZSVxsNuuwDFaMNupBOKZEoAyatRd6hu5SQi2g7DNK9r0+WtCMblzUxT3pg2YUtkcZAqrJYsVrpQgNM8oH0/KmBzAsJhIvFdKr7LNBjNIYVHp+VXIIPPlVMcCgCC1UmRe25s1rXpMdywB/gq1/YpFxG8C/ICDVu+tLQSLK8uCBzioA5rOFI9a0NMH7zKROQR2FXkhsLYCRAZS3Kn0pZLmYqwRtmeu2gdyaa2MTNLO6xJ23Hn8qgF/AgHkqXI6M3Ss55nY/OxYAHjNJE4OcDFILmt/alydQt4klIR2G4e1VLmeWa4bfI5DMSRuOKgtXY6pau3RW/oakTBbex+lMB0uY4yjDkUy3QvvkHHlLvz+P/16dMNzZ6VdsI/9EvmIBAi5y2Md6AMu7bNyT6qv8qx3hbht209jnFbEy5ncZ6J/SskRkISzFj2U1pERXEzKMYb8qKeyMzZ2t+VFMk8tXvU61EKnWtBCilAoFOC0gEopWppoAkUgHmnMw4qIGnqaAGmo27VIajbtQBE1LH98UhpYv9YKYFtR8op2Kap+UU7NACVC1TVC1ACU2nU2kAAYpaQnFN3+1ANjiw78UwtTS1RlqewEmaZu9qbmjNACg0AUgNPAoAfGMyqT90HJrXJkmZQpxhcn61kKM5q7FNsi2gctwD6CpbAq3JaZ2VexwaqGI8Y5q6zqkZwuNzHv2q7pml3F8Q0att9SO9DaSuwSb2MuK2doy36VKsJXOeK6+18H3txkLhVPcitqL4fExqJJg5PUAVm6qLVKTPNirr/DQoc52fjXq/8Awr+1wCx59B0FUrvwHGuGifA9KPbIaotnm6O0bkE7h6VL5KjBB6+1bWoeFri1YkDdiskK0amJgdw5Gf1q4ST2M5QcXqUmysvlkcfzpY16KDx2NWb6ILOxHbFVKsSRMI2+4TwehqJWaN/0NWUy0IIHzI2Poajli3NvHAPWgEx2SV3KM4rY0a9XeLdznPAPv6Vj2iPvMbjGeCPQ9qFLWs6n361MtgR30cIIxVpLZueKr6VdpdWqSnqevsa1FPWsDYfFbNg8VObZvSnRSKRU4cGqWxKM/wAgUv2ZvSrhYUJKm7GetUSZzQuDjFbFq8cFop8sbwMHFN8tXB7/AEpknCGpbGRzancT5G7aPQU6AkpknJqlCmQTWjbrt21KYyR0UABRgCpZY9sZ5zQ7Zl3DtT7lvlJx95qAMN3O2RW6gmltBnd+Ap07rLO8irtyOV96s2wVIvcnNNoaQluMXKH03H8NpqGdZhOsg3CESpE2OxIJOfwFXYD/AKSzpgpGDvAPUEYB+matx2l7dARtaKibtyuzBcn0wf8APWkBVkT92Hz+FaelxRGwuDJtYzJtQD+Hryf8+lNksYbciW6O52G3bjnrmmNcRWaeQsJbLbixkxgegx7UAUb6NlnuCExnPf2rGZflDEkk9c10EmqOsZWK3hiZurBctn1yabHqLx7Q9vBNgYYyJuzVp2Ezn9yf89f/AB6itttQJbK6bZKPTy//AK9FUSeHKKmUdaiUVMo61oINvvT8VDmn7valcAPNRvxipDzUb8YoAaKmFQiphQAU006mmgCA0sX3qQ9algWmBY/hB9aSn02gAqJutPZtvaq7Se1AClqQt7VEWpC1ADy3tUe/2pCaTNABRRRQAlFLijFACCpRUQqUUATKuRn1pGIOOeBwTT4CC+09DUZQ5Cdx1qBpXRYsrF9Sv4rdOAT87Y6CvWdF0ZQiRxptRQABiuf8HaMjqJFX5XON2Og7/rXqNnZrDEAUwa5qkrux00o2jcZbWCwpgACrYhUdKsqMUN2qDQqPGOKqyxqwxjFXWPSq5HvUJDTMG+09XByOveuA1/RxCzTxpkrywH93vXqs0e5TXN6xZZQkjIIwauDd7oTipLU8qniZW2v0xtJ9R2NU3XaqDOcDFauoReQzq/Aj6H1U9KznXO3ntt/H1ruTucMt7BEVRs4+VwAR7ip34Ccfu2J49KpMSEYdOxFWIZVaPDHj0pkjniIK4PzLx9aj4ntuRh1JbNPWXKGNjlhjB9ailxBKCo4K8igDX8N3xinMTn5ZO3oa7aL5uleZWMwtdThkz8mR+R4NepWifuV5rCaszZFlEwMU4ipkHFPK0XJSKBf2pIz84q20fvSRwrvFMSRPEflptwMQv704LjvVmOynuY/ugZHc1LdhmZDHhevWr9pAJbgKT171ZXTBCp8yVeO2KtRy28P3Y8sOjUhlMwv5jIis204JxU0llMChcqir/eNWVvZNwACjPtUX37jDksPQmgCn/ZloJnkmuiAxyUTnFSPBZwbtkZlUjB3kg1b+zhn3Bc+1VpEDrg0k7jGWkkcTTpDBsAUNx834HNNM0kys0js5BzyfWo9rxsx6bhiiM7Yc+lMSYGZ7plLnoNo+gqJ+cVYkh8kiPfu2qozn2H+NQOcRtU3GV5eMUrHCqae7x/Z50K5kdVCexzzTf+WS1aZLK2G/vfpRTsGiixFjx0VIveoxUi966BjG7UL3p1FIBaQjNLRQAwClApQKUCgBaYadSGgCu/Wp4agfrU0NMTZZptOptJMCF/umqkhwRVuT7pqo/wB6mMbRRRQAUUUUAKBmlC570KM5qUDNADCvvTCamIphFAEdSCm4qQCgCeAYlWlZGkulC9WOMUxe9bemRM8oeJN0x6cZ/KokNHr/AIR0lbe0jUrtwoyK69I1GcOG+leN2w8RafOGuEnhjPQn/PWu00HWLqRgk3LDjpjNcbjZ3Oy/MdhJ5cS7pDxWPeeINJt4TI8xO0kEDk5pmqXjmBl7dq4uPQp7ws5y6k5waLp7AasvjXT92EQuPU1f0/xJp+o8eYY3zjaeaw/+ECRgN8v0qv8A8IfNps4ktpi+P4Dzmq9wlqaO78sHrWfq1mGt+maj0G7mybe7UoAPkY9PpWzdwh4GzzxTcUth3fU8N1sI1y4LZwMMPQVgrhGMD/c/hauy8W2DpcSOowSDg1x75mgyxy68Guik7owqx1IZ4S0Z7Ff1qrC2wEdatJNtG16ie0wxZJBg9iDWhiMJLqST0oMxKlmGSBn60xh5Q55zUQbPagC0v7yBW/iUV6tp7boEGMZUfyryvSVE2pQQt912ANeu2sAVeBWM9y4FxRxSFvarCQ8UghqGxtFRn5pyOVzirYtc9/0o+xn1H5VSQJldPmOBWnG7pEFzVSKFkl56VfWMEZNTIpEZprVJL/qzTV5UH1oE0JCwSUE0qt/pLcd6R1Ybdv8AeFSrH/pDFhSb0CLLdu2GD44HWqDffP0FXyyxBk7npVZwHmHlH733vbFKKCTK7qNhxxVUn9yydsVoSRrsKseT+lUJ2KwuqgqzAquD36VQmyaU+c/mg4VxuH0xVWUYxV77LNFDCkkZQJGFLPwCQOtRWtoksjC4mEYUlSGyTn1HHSlEZQdcYpSuIxzWnJp1ubdna8Qy56BCVx6VS+xyvMsNrcxTMo+YFWUY9utWkSncr0VZawvlbHlR/wDfz/61FAXR4WnephVdamFbkjjSCkNNWkBLRSA0hOaAFp1R7vak3e1ADyaYz+1Rl8dqY56UAKTk1YhqoBkmrcFMRYpKWo6QEcn3TVdqsSfdNQUANIphFSmmGmMZRRRQBMi9anUAZwMVAi9asqOtADCKjK1ORTCKAICKkVaUrS7cd6AFQda7LwXf2+nahNcz4/dxfJnuxIrkFOM16D4A0YX8F/dugMabIkyM85yf0ArKq7RuXTWp0eteMUsY4vtltNGJFDIrRhSyk4yBuJ61b8N3UOqyrNEB5ZJCkd6j1jSrfXTAlxZSTNAMK6sUH4nv0rc8PaBb6NYrDbJtJOSSxPNcrt0OuN1uGrojKxQ9etY9xrI06CKJP9a/QKuX/AH/APVXS6jakA55zWTLAVlWTykLBQu4rzj0z6UuWxcXpYwPEerX2iWcF1Pah2k+5G07sxweckYAODmrOn+KY3gjMkEiRscb1Yspx1IbAPHcH86v30KajbLb3lk0yKchTjA/DrVqwszFb/Zo7eKKAjb5ajHHpVxceqM0pLcuQGF9si8qehBrSC7kwfSqdrZCEBQMKK1EjwOtNMXS5wfi3SPOikkA6e1eUXlu0Eiydd/ysPevfdYthPZyArnjpXkepRIJ9gGQAcr9ODV03Z2ImrnDzAo9QC6dBha7OLwyNRzImFRiBnrXQaH4XFkZorSzilu1XJkmXd+KitJVIozjSkzy15jLE24dOlQqC2cDNeia+q6poV69zZww6jYMr+dFGE3oTg5H45rgwmw5zVRmpK6IqQcHZljQf+Q3aH0kH869itH3ADFeV+FrX7R4igA/gzJ+Q/8Ar16paRlTjOcVE9wWppp8y1KE96iiO1enWntJhTxQiSYcVJn2qj5vtTvPqhlsxqT0pq8sB60tsGlyegq8YVRScZrKS1LizNmXpzSpE3PDflVsbD90U9rto0G1VpJWE3cqx2kstwvylfm7j0rTazi3EvKiseuTWZcX0zptDYz6Vnb5Dwu5j6Umx2N6WG0VRJ9oD7RjaDzUBlg++I3+YfdyAPrVIPssiXbMrtxx0pZHKCIj+7mq3EWImjuHMsdod6j5g7ZX6Yq0hdiCiIp9EUDP49arWzsluyjjeSx/GnxcZppXAjdptzMZ5OWP8RqjPLI1wB1G3LsTznNXmbDEY6VUZd0rc0CTsRzRtNGdpC4OearxK1syNbuYyvIxUwG9gp6HrUEg2NjIP0NVsJO5sHUZGxsjjYAYz/kUVgeZKOFmwPTdRTsI8RWphUa96eK1AWlpKSgBTTS2O1MMntTS1AAze1IW9qaaQ0gClpKWgBV71cg6VTXvWhBTAcaaalNRGgCGTrTAMU5himigB2KrkVYxUTDFAEWKdilxRigB6d6sCq6d6sCgBmaM07b70bfegBlFP2e9Gz3oAEOM19AeBNLjsvB1gMDfKnmvj1bn+WK8AUYr6K8LXCS+GtNZOQbZB+QxWNV6JG1Le5tLAhzxUkaYJ5rMu9aj029CNLtLJvUY4J7/ANKwtT8dQ6LHukWSQt82I13cVzqaex0NXOvlRJF2nkGqy20bMBt61n6J4n0zxBZia0OVboCMHPoferkEym6dR65ptiSJRaxjsPyp4CqOgokkUYqi9ycdakDQDLT3Ybc56Vii7PrRJekrgnGapNIGixeyAQPXmHiC1DXsLIMYlXcfY9f0/lXfSzmRGUjr+lc61r9ruo89FcOR2IB//WKIzJlHSxXiiaz0mKTygXEcjKMZBYZOf1FXvC/iSLULwPcw+TeHEbsPunjAwK1dQijhtY12bkjk3bv+A8jPeuN06zjm8XZs0ZLcNvdRyFqDaO1iv4tj+y2viGXb8xijhH+8zj/CvMlbPau6+JmoZnisEc5kY3Un0PyoPyBP41yGh2n2zU44j9w/eHtXVSjaJyVmnKyOt8DWQiS4u5fvyHapI5UDk138Q43etc/ZwLCqRqAqjgYFb1q2NtK93czsXAKjIxUoFIRVIllWipWFNYUgNPTDiNavXZBjGDms/TBhBVuY521DKIV4XFVLxsdqtjmql4wZSBQUkUvOYkCpLdzHJkdxilEDeT5n6UyIF3GB0rNaMroS871yMc1LKoYjP4e1JjMgNTSjgDuelaGaJk5tBL6cY/Gmq33uOmaguGVLZFU53EOagD5VhjqMUxk8POPeoukje9PifZnjOagNxFsDNMiHtlwO9NIQSMV3keuKpsZDjJxViS6tNuBPEc9MODmmRGe/lCQ22cLglJAf54qkS0V9zetFWpNNu43KtEciirEeEZozUWaM1QyRjTWPSm5ozQAlFFFAARigDNCjNPUYoAjNOWnGmrQA4Dmr0JwtUh1q9B9ygCY1EV96lNRFfegCJ+1MqR+1MoAQ00in0hFAERFAFSEUAUAPjXOeakVcd6YrdeKdu9qAHmmmmFvaoy3tQBL5ntSbvaq272p1AFgN7V7Z8Nrz7V4XjjJybeRo/wAM5H6GvEEOM13XgTU5ba21S1jL5k8uQFeSOdpP5EVlWV0aUnqep6jc2E1xCkiRyyxsdpbnBPY+1Zl3pNo8blPMWJZCPJP3QO/Hp7VFbapY6UpRI1uJVxvf3x2HNE3iqyj3Q/Y+D1JbGe/pXIdjUuhPp+kWNqA8BFvHjBWIBRW5FAkJBXPvk5zXMjWtMkVxaSlGzxGafaazO135eMpnAb1/CqJeh1DNuHSqcq/MRVgOGAI6YprDOKkEzOaM9uaY46c1fZfemeUO/NTYbdiiVz3pbWzZJEx2GPrVrb702e7jsraS4kJ2oM8daYJXGXdqsmwSljAGyyh9uazbmS3sYJbkbbOwhQtKydXHp6nNTSavFdJ5zWblAu7LV5L4o8VX+uXU1u5EdtGdiRL047n1NaQg5OyJnNRV2c/rmqS6vq1xfygAzOWCj+FRwB+AArpPBOn/ACS38qcN8kfuO5rnLLS31C5jtk9yWI4Ar0ixjS1sooY02oowBXRJ2jY5ErmpENxxjmtGDiOsu2JaTiteKNtnSoSKJxzUoXNIq5zz+lWI4mOaaZJB5XvUbxe1X2iYComX1obEPtF/0bGOtWhEzIGH5VFbTeSoO3P41IuqgR7SuffNSkMcLaUfw1UnspPvD8qiF5cT3TYOFAztpovrg/8ALSgadjRtNLLiUzYAdML7GmQ6N9kwJ7hTkZxUcMkjo26RiCMYzUbgnG5mLd+aATLyaQZZsmZKp6nai3C7bpc88tVq0UpFluWPWsO/dnnlGfkB+Wm2NK46Ka0EKWzyyM4HEigfyNQSXtnbl12yTYyNzYUH8BVaP/XRr1DN830rOWRmlKhA3mMQAe+TxSBo6d7q1W2UAJGD/CPm/rVW5k0xSshtY5bgnAaRRg/gKzmQxTSQjnb17Ypjc3MKf7XWqSEbGpFNse2OOJip2GOFOM9uRV+HS0m2m7eOQlQFMkYB9cfLjmoZbVLm5QD53EYZU6DO6qdzfPbkQxSOpRstyCM/WmmS2bP9h2//ADwT8zRXPLqt0q4+1P8A99UVpYR4NRRTtvvVANooPFKozQA6mtT6Q0AKoqTbTFFS4oAiIppFTEVGRQA1etX4PuVRXrV+D7lAEhpDTzUJoAY/amU9+1MoAKKTNM3e1ACs2O1N3+1RsaTNAFhWzS9ahVqkPFACtTaYze1N3e1AC0tM3e1OzQBOtdT4GVH8TRwSE+XPG6EDucZH8q5ZK19AuTaa9Yzg42XCZ+hOD+hqKnwsqLs0ezi8g0OBljtQVI+Zl4J9ye9UU8UWV1IVFuUC9zjn9K6NLG3mQi4ChT2Peon0vTXTKW6Fj/FjFcSbSsdydzAk07StRkDyWysD6cfypH0ZYp1ktSVUe9b405FAEQAA7AU9bRxmlzMRHA+IxxVgNntUJgZFJagOF60JCJS/tTGbNVzOnrUTXI4+ahMaRZL+1U7tPPVYyuQxwacJQ3SlUZYH0pbjM3U18jT3CHACnivEbg/vpHPJZzmvaNf/AOQXcOeAEJNeNRRGeQIvV24rqobtmFbodL4StQYpblxkn5Qf1NdWqVn2MKWdtHboOg+Y+p7mr27HanJ3ZglYu264kFbttwAPWuchl+f0rXt5cp60ht2NUIoOQKuxbVBrJSc+tSfaD61RDNSVlwOaoyMuetVnuDiq7XBz1oGnYu7/AGptqpMxFRwKZegq9ZwnznI52iotdl7FaRVilcLzkVmCT/SFTH41o3aZYuDkHisyHKXpBFAi4bySFiB3GKshsqDjrWRdf8fB9611GEA9qAJ97J071j3Zw7/WtmQZxWPexlgX6nPNS3cZQdvnBBwRWbZsFmjJ6b1JP41YlGXwTjacj61nW673C9Mjbn3qkJnRSsZL+5d/vMckelVA3+mx8d6fudZJncZLKv8AKmIMXERHXdwaYGnduz3iknkIFB9KoGMsG3KQSc81bjuIZLplmY5IGNo+99acLQuGJGCpwRVwIZRL7TjFFXGs1Y53foaKdgPBsU7FJmn5rQCMinAUEUoFACYoIpcUoXPegBQKlxTQKdigBCKibrUhbHao2PNACR/6wVfh+5VBOtX4fuUAS1G/anhs1HI3A4oAgzTc0124pVNAAaYWoMmVIx1phNADW7U2nN2ptADxU1QipqAIjUbU9jgZphOaACpKjqSgCeLvV20+W4Q9PmHPpzVKKrKnGaQHs+p6rtiV45hgKCGXkH1NQ2ervNDGqsMr1ycdK87s9enjtBaTykxoPkP5YH05qxbam/8ADJjjG0HpXKqTOmNRM9StteQSbZMY/vZq82vWwUjfjNeSrd3BI+U47legqdLm55wjH9anksXz3PRZ9ahLFfMBJ6YNZ8mqocc1xQluGJyzY7DPSrkRJXJOc1LQ07m+dRB6HNLBcuz46VkIuWxnrW3pGnXV/MsVtE0p7gDgfU9qLFuy3NKEHH1rQtLO5vSFtYGkz36D866DSfCMcKo9+VkK8iNfu/n3rpkSK3i+UJFEvXGAFFbww7lrI5qldJ2SOWj8E289uf7TPnoRgxLwv4nqa8c1jwnFoPjK8hRT9ljAkt1P8IbkY+nI/CvVdd+KvhzRpHghlk1C4XjbajKA+7nj8s15Z4o+IE3iO7glj02KAQ5GRIWZgexPT9K6uRQjZHO5ubuyURk96nWHPeq9rcJPAkq/dcZFWlcVyFrUswW67zxWpDAdn3v0rKt5hv6frWpDOmzrTWoNXLaxYpdoqL7Wg7frTftKGqSJsSMoIqPyH9KfDIrkgGr23HfNA9yfToEKg5qx5MdvI+Djcc1SjYrIMHrVq5fMfSobKIbmxSZcQz5bOcZqhFok0M7Tbl3MMdc1PT5JWY5J60rgQx6BI84eaRcDnmtIWEKsC86hfc1lyXEvy/MemKWKQ7ATzk4pgWrhHQNskTb2wayb7d5IBkUHdnHoK0PM8xH+UjAzzWPqLgcHjPy/jQBj3CGK8DtKfJRcts/iz0/kans7awHLXDhv4SV5z/WoNQlNtctFvxGirsXHQkciq1pIguoy5wM0AdNb2+mzMrGeVTj+Jcr0x9euaaNLtMhXvQZT3Qbl/M4qvbOg3uWyTknj3pIbhllVyMgMMLmmBrnSVkn+SaIoFGRIuWB9j2rV8q1J2rLGCxzliNw/+tWbp+11ZpRkSfN6FM1Pe2ksAMoj82HsVPSmhWuRy2beYfLuYdvb5qKo/aEPaRfZk5oqriPABTqRVz3p233rUQzNOxRijNABilzikzSM2KAJRSFqjDUpoAQmms1NammgCRWqwrdeKpinLQBdD+1DNVbNP8z2oAaxzSg4phFLigBrNjtUdSMtR0AItOpq06gB4qeo4+9SNQBC1RYqVhSLHu70ALilxUixHtzQ0fvQA+LpVhDjNV4+OKsZpNASZ9qM03NGaAOr8LH+0pnsJTmYRl4m9cdR+VaU1lNbMQykj1FcpoOpDS9ds7xiQscg3n/ZPB/Q167qlrDt3heGG4e4rjr3jLQ66L0scPtPpT4wT+NdNpnhe91qc/Zoh5SnDyvwg/xPsK7rRfBlho5WRx51yv8Ay0YdP90dqdOnKprsi51YxRy3h3wbc3xW41HdbW56IPvt/wDE/wA/pXpWn2FvYW/kW0SRoOwHX6+tOjiUZxxXnfjr4jtp7PpWhTKbvO2W5U5EX+72LfyrthTjFWSOGc5Td2dd4m8Z6X4VtybmTzblh+7tUPzt9f7o9zXh3ibxtrPiaVlubjybIn5LWLhPbP8AeP1rAmv5Lqd57qWSS4c5d5H3Fj9agMgllTA+6c1oQI4c4+Q0kR2uCatgbv7v86Z5QDhgce1AmjT0eXaXtyeBl1/rWofrXOWcqw3kZRwx3bSB6Guujtd4J61y1FZmsWRQA7/vVcWRlXANOSzYE44qxHbvzUIoree5705ZJD0NWltM9qsLa9eKu9xFW3kkEnJrZhuHbCZ/GqIiAq7ZkfaFobGkXguT1pZXJ+UmtBLdWcleQaozRHzjms2gIlHOPWq8ylZSCKs7WEoGKhu2zcvxUpA9CBxnFWFj2WSzHku3SowMKD61ZjG1F+oq9hFcyAREkdqyrluSMfxCti5l524/WsS65lx7im0JMwb/AIuZyTku5P8ASktl3AnCj04qG/b/AEtzjrVi2GefWkXsbcEafY5CwxtUnHvQs6xrtTgbcdv8KjGf7Onyf4aWFP3aIi/U1O4NGvEwigReoA5PpV2DUV2NE0gZI1Ow7SAPrVGOKKNTuZ84wuOeSKHRFciM/LgDP4VadhNEbXiM2dq/lRUsWpJHGF8nOO+KKZJ8/r1p1R5xS5rYQlJTadQAUxqdUZoAkWn0xafQBE/am0snamCgB1FJRQA/d7U7NR0tAEhNOqIVYC570ARMM0zbVowtTha+1AkymyHtzSqh7c1eW268VMtv/s0kwTKaRNmrCw561aEA9KkWPjtQmCZT8haUQLV3y/YU5U69KEwTKohA6YqKSMrWgcDtVSc4WhMEyiTilVuvFDjmkXimMlJzRS9amt4xIkjn7iKWJ9hQJss6NpFzrmr2Wm2gzNdSBAf7o7t+Ayfwr36a08OaZqUNlqGqRQwrsiitXkzI5GFGQOQDXgOh306Xj3dlcS20gjMfmRvtbaR8wyOmc1ejDpeQvlw5kDF93zcHOc9euKmUVLcam1sfV6QpBGsUSKkaDaqqMACnBc968+8OeOLucwwXuxyTt3/40njzx2umxvpOmuy3rr++mX/liD2H+0f0+tatNbkt3KXxD8di183SNKm/fAFZ50/h9VX39T2ryBE8xmbOMjFaVVJX2qUAyzHOKYihMrySHYucdabHbM8iqy/eOM1rL5Yzhh+FVrmd/MNpDnzmOXbpsX/Ghq4FdzDDN5UIBl756CnGEbszFpfQE9KkW2t4lwDknqTTGlAcqASi+g6VWwmxiqjSbtoVh0ZeCK67QtZgnb7JdkJN/C3Zv/r1zn2aNx8jciozA4J3LuP94Gs3BNalc1j0ry896cEz3rB0TWmuUW2vDiccK5/j9B9a3ga5WmnqbJ2JFPzY9aGNMU0MctmkmJsETc2M1LJaGIqQ20/Skt1LSDAq3eHB3UnIpIjS+nt1AD5BOKsCW6kfzGGfQVDDEsqkmr8jbF4FJO4ivJevGuWiWqr3KiUyyx4HoKsHMjAE9iarSKHjfI6KTVJC3Fm1SxESgMc564qE6/p6IuZcZ9RWLcD71Y1xzJQmI6ufV7JpgBN+ODgVkT3lszFkuImP93cc1BZIh2713c4/Q1ftraCSRd0YIPY0JgZEkcEsqFnT3ww5rf0zSobtXa3uI0IOEBPWrf8AZlgJU/0SLr6VasrC1jAkFuinJIwMfyoTAin0+RmMQRlLAAcdx0qaPRzHbSyTgsYwzphTnAX/ABqSeV7dB9mgkckgBfMIxyOvtWmtzcEZaZ/zpgcvHLc7lU280gY4y6/Mp+la8FrbspZ2jLn7ynOfyq8+oTDO759xzz9ajmv2aUZgChVCqFOAMe1WmogVv7ItTy3m5/2Q2P5UVOt5Ft+ZTn60U+Yg+Z80uaTNLmtBiU6m06gBDSUvl+9KsZ5zxQACnGniP3oMfvQBWk7UwVO8TUzbQAyihhT1XGeaAFAxRirKwg5wKl8j/ZoArRx5NXooscmlSHB+7VlFwKAGbPen+X7/AKVJS0mxDdopdgopKAHUUUUAGaM0YoxSbAaaqT/dq2Kpy/dNMCq/JpBTj1pQme9MYqnipo5SkZT+BvvD1FQ7aUDCsx6A4NAjY0yFIbY7BjccmpFkV78kfwgD+tbtr4K1SD4fp4pkZRA0gxBjJ8g8eZn69vTmud0yNried1HyGRsn0AOKqO9xHYWmrzWcW+3JMwGFP90+v1H9ax7mRyrOzlndssx5JOM5p68fInzbepqrcF9wU4Yjrg9KucriJo7iWV1jQYJ6t1NZt/DdjUGjimYIUDrhRnPfmtK1BjKTOP3bHFV5p1ur5EtwHMeRIwPY9qQFEWTKwaS4uCf9lquQoiqVjRlT8y31NWVh3uCzBselBY5/dx59eaYD4hE7AIcnv7VH9jV5y2dwxnAFU2LCUnAU9sVKhkVt0ofA7g1SYiy1sqvvUbvboafwe+PqKkDI0e8DOOhprKjY3kj0xTsSmVrgeUDInBrqdB1sX8BinP8ApKDP++PWuPLszKSc7RipfmVlnt22SKcgispwUlqaRlY9FBp9Z+l3y39rHOoAOMOB/e710EENqcOTj2rjNdhLdf3nWmy/O2elaMf2UZw2KmWOBs57VLRSZlQHbhP1qe4IVcE1eaxiMm7H4YqG4s5Hk4HSqUSW7lazG6Zh6oao3TCPch6ycCr8S+VI/fCGs+/ffnjGKYjIu/usaxJf9Ya1rw4Q1luM4pAX7OP92Gz91wMfgavWfMg9smoLBSLPIGcSH+VXLSFvO5oA0mfDKcdKj3TLAskLkbWwyjuO9SbC3SnRHZCFwDn1ppATRyhJY2bJHG7J6itQPGehC/jWM/OKaJHH8R/Cm0BbuL2GB1LPuCnPXPNU1vxLIfMdeTkfMKhnjEse092zmqaRyRSH92HUfeztzSSG2aDXkCtjzRRWf5tv/cX/AL6/+tRVEnhuxvSl2e9WWXPelVOvNbCKwT3pyp71aKe9RFPegBiR9ealER7rmnL3qwKAIvKX0oaJfSrBphoAqMgB4qqwwcVfcc5qlN96gCNRmrMcfc1DEMtitGNd2OetACIvXmp9i+lKEx3p9ADV607FNU807NJMSYYoxRv9qN/tTAftpNvvUfmAdeKPNX1pJDSJWGaTGKhM4FJ560wLNJVNpxxSfaPepSEkWiapynINIZiO9QPLu70wHU6oN1G6mMsxo0sgRRya1NN0pta1uw0e1yXubhYi4/hz1b8Bk1VWJraHeR+9YcDPSvXPgz4XWBrjxbqSiKBI2S0MhxgfxyfTsD9aaQj0jxRFY6V8PdQtNqR2sVkYI0J4+7tQfXOK+bLWIWlqIEOQeWP95vWvQfGOvah421ZLLS45pLSFi1vbp1kx1dvfHQdh9awtd8MnQPsMVzcoLiaLc8YYEo3XAx2GQM9yDTiIqRbYowgXp3phjWMvIx5xgMRwowKhE0cMZBbkHFZNxLNrdx9ngz9lDfPJ/e+lUJIbJOb+Zba0kC26H95KfXuBWlDHHZwrHb8Y70phhtLdYok2ikhjDKSw+lAE4kT+8Pu55qvLcxqvBLN3AqaRQVyRnFZrZkYlRQ2JMmWdA4LoM+oqwt1uXAVsD2qlEoLYIzmrqgDoMVS1E2SRyx7Ww47deKhuJtny5xnvSTICN3Rh1FVc+1NsEjQCpNCDwc+o6VEkYXcMfPnH1qKKbY9W927tTQNml4a1RLDU1gl+W2uiEYk/6tux/mPxrv3gVWx1xXj94vzFT0PWvTvDGqf2to8UjtmaP9zL/vL3/EYP41yYiCWqNYOysa0lmjIduQaqtazR4xI3Pqa0WPAqB26cVhY0Ege7WPHmZApr6xeRKQ8KEA4+tSQ8LVK8P3vrTEQ3HifylIOnOxPU5xWbP4lsjbuBby57A4Gaq38jANzWDn9+x7ChoRoHV470/OBDgZ+birBaCSKNUIdwccHt2qnCiGRQyggnGK1rbRrS8AZFVJAOp9fWgCazOLYIeikkt9f/ANVX7Rsy9KitNKdGAS7ZSO5TI/GtKKymjfzJbi3lVeqhCnP1FAE0ZzmklhEO3BJ3DPNTwLFFJvlWJgDkBJWzj3BFTTvb3cnm+YUZhjAYYYe9UkJq5lkVE/ytjAP1Faa20Hefb6bjjmlOn2rKQboZ7NngU2ydjG37u1MbDYyua1zpkJ+7dQn15qvJpMitkTQnP+1igaRmZ9qK1P7Im/57Q/8AfdFAzwY09aYTShq1bJbHmoTTy3tUbN7Uxj171OpxVUPjtUiv7UAWN3tSZqDzW9aTzloAe56VSlPzGpHk6cfrVWU8mgCWH79X4mG3FZaN1qwJvl9aANDzBTfMFUfOPpSed7frQBeMophnPrVEyU0tSEX/ADj6037QP79Uc0Zpj3LT3WRwaQ3BHU1WpCM0AtScztSee1R0UAHnMaXcT3pmKcozSAeDQc1IF96CvvTSAhNW9MthJKZ5FzHFyPQnsKrrC8sipGNzMcCtS6kjtLdYVb5Y+p/vN3ppCbNLw3pb+J/FNhpaMcXEuZGH8EY5Y/gAf0r0zxn4ugubcaDoZWPSrT903l/dk28AD/ZGPxPNcNoLpoOhyzo//E01FArOvBgtz/APRn6n0GB3NVEGWAJIRjhsHtTA6vw9rdnoNvfanJbma/jTZAC42sSRwBgkng5PQY96wtf1RNV1h9XdRGZF3GPb9w8cburdPp2FLI8VtAXJCxKOCawSJdYdWdStnGflToz/AF9qBJ3Ejhl1eUnc0dmD1PBf6VrxRR26hYo1RCQAo4ApCz26ooCAY4C9qijmBfc3GO1MSRZEYyxHUjGaaoEceBzijz4zxnb9agllQHAJP1GKYmx00gZhGOQRk1HgAYAxULSfvdwHTinC5h/3aB2HMg37hxUuahaVB1JH1FOWZCCQelaJCCYNIdq9utMNu20lTk+mKltGJZgTnJzU9CQm7EVrhlO4fMDg0+ZCE3KfmHIojHzs3c9ae4IXAGSaBcxRfFwHZh06V03w8vFTVbiyc/6+MOv+8vX9D+lc4Y3gY7l4qzol1/Z/iLTrjdtAnWNj/st8p/nWdVXiy4rU9cIyahbnFaEcPluS+D6YNV5YsyHYPrXElc2bIAv7lqy7s4DfWtsLkk5rE1KMoWJppAcxq8hWJsVixSAZzxWjqEqurrnkoSPqCKwhKB14p2EbNvMPM4Ga6zTdptQ4GCa4SykzNjHWu20yUNaqo6qeaQG3bhyTs4b1p0wxIQevcUWoJyFbBIxn0qWK0kLeaxIX35ppjbKvSnF8/wAIH0pZIyrYHNRucLj1pktil+AM5pmV/iJ/OmqcnPpTJHUOeaASuSYH8RH5VXlABxuprsGxjtUeaGwF3e1FQ7feigDxXzPajzPaoKK1JJ2f2pjSe1R0Uxj9/tRv9qjxRigCTzG9aj3+1GKMUALmm7vajb703FAC1JUdSUAFFLt96NvvQAUU/b70bfegCOipNvvRt96AI6KeVx3pQuO9AEeKMVPimbfegCOnp3ptSJ3oAlVc96GoWljQyyqg6scUAXdNUW6m6Y4cDan9TT7LTzqWobpxm3j5b/absKZJ80y28Qyq/KorpNPREh8vONvOfU+taJ3JuEkCgDA6nFJPHHaQtLKQoHqatyMqDe3G0E59PesCSf8Atq8KKCLNG4B/ioTuJsckdxrDLNMCltjKJ2fHQmtKAYjFBkEaHC8AdKUDJRemRmkBBcvuPlqM7TkmmQIGUyHnHarAOGK+nfvTAdnmJ1y3Wm0A8osjKxAAQ9v5VBOgkBJqQOfKZ84Ynn39KhkBIwDigEymTmp4oYwA/LE+tSPErjGMUyFBsw3UUJCkPKhlINVXTYxGauP8ik5qBIWdiWIX61bYEIJU5Bwa0ImnIyzcHtiqwHlzjByOxq9STJbsRG4UMQwwR+tIJvMkTnOBikuwCobHOarKcZptglc0nG9SKyb7Kqw7kZH1FXYZJiFDYYVn3MjTuZG65waG7qw0z1FdR8uwt7jzXIliWQAe4zUUXipYmy0gz6GsC0vHl8M6ZGzZKxmNv+Akj+lcprly6AheK4Uje56vH420oYSVRu9ajv8AW9L1SB/JuI4mU9H4zXgwuZVfPmNx71aW9bcAeM+9U4voI7bUWCSYEg6Hp7VhFgWJPGajtdMv7xA9tICrdOatf8I7qqdVHPvU7AmXtMTcAc9a7fS+YQfWuP0+yu7ZlE8RZR3B4NdrpEZniSKNsSLxhuCRSbGblkwXcCeoq2l55VsYWjDgjC5OMCqi28kLASRuuOmV61GLiJ13OVzkj7wppATMwOMnFRkAdTimNdQIygyoNxwMsKdjcgKujEnGA1MQwxherfpVd06c1pPaLJAskJQD+NCcYpsWnyyzGPKoqnGSRj8PWnyk3MoxmmlCK3rrSPJj3wzpKO+0YIrNltpIs5U8eoxTSGZ+0+q/nRWrDpMs0KyLJGAwzhjzRRygfOuKMU/FGKsQmKMUUUAGKMUUUALimsvSn01qAIzTTTjTTQAVJt96bipaADFGaMUzNAE6inYpkZ609jTBMbikxS5pM0DAikU7qQvjtTo2wc4oAlVcd6awxUtNIzQBARTgKVuKQUASnpV6xtyttLcHjdlF/rWeo3MFHU9K2JlZFitU42Lj8e9NITY/SLPcxnkGSen0rVdRCQycEnn6U2AKsa7RgAAflVHWdQSC2JH3v4fcUySDUdRnvb5LGFiqHhselWDbixiC2427fQmq+iWYQi5lOJJFznHIrUuCqx8sMnoB6U0rgZ7XTtgOCw9BU634Y4cED1qJIiZFzxVgxp5bfLTAjkvFiGQu5j2zTYnLoFP8RxmqTf8AHzt/u8Uu4iQYOOCaVwNGOYNM6j7uePpUh57gfU1nRgs2AKtmEKpA700wHbsA5+73qKFtzEdO9M2lCQaYMg4B5NJKwmrl8DNNyF6k/jUcMcn3i5HsKbLJKhwTWorEsjqq5Yc9qsq2M8VlyTM2OcAdBV2KZdo9expCHvD5su5zwOlQTQhJ1K9CetWw4xUVw+AnGcmm0ApYAEgg/Q1lS/cq8xO3AOM1Quhg0MaZuaLcKNDnUn5onIX2zzXJ63cb5mQHmtrQmd7XVIgM7CsgH5iuWv3LXj5rla1ZqkVRT1++KYKev3xVCPRPBR23ULd1ORXqLTqELyRAszKOBx78fhXl3ggZm3/9Mxx+NemXLeWkPBOXHSuee9ik7luaGFThrSLPqUxmqssdrGhcWcB9itXXl8xcMcelVCQ6lSODTG1cdBPsJWNGRGOWVZGBB/On7wrZLSNnq0jBx+opkSqEyq7c0hX5SPWhMCzFc26ECOzt2P8Az0MKHP6VIE0wxsTo9gx9fIA/pWZuI6HFSqxP3jyO3pRzMa1LHl6aikvpNv7bVx/WmCTTiDjTI1/Mf1qJ5Txhs1fsbQMhup3jVEGfnpqTEVS+kgDdZFfpM/8AjSi4tUEhEeYxlv3jsxH/ANark0VvcNuQLj2FZ8+nxSWs14qlnRgF56Dvx0NNNslokGqIowsVmB6bn/worMCKBiimFjwIGkJoBppOKsQhalDe1MJpRQA8tQGppNANAEmaCaQGg0ARGkFKaQUAPWpKjWpKAGk1GTQTQTQBOh61MDUKHrT80xpATUbHpT2PSoiaAGM1Ojb5s46VG1SQ/wANAFxWz2p1RCpDzQBGx6UzNOY1HmgC5Zrm6Bz9zLflVy2Lz3jsxyFOPoais4H+xzzY+UgL/Wrum2YWLDjBb5yfr0FPoS2bCuiW+4nCqMn2rmDnWNaJ58iI5x61Y1m++zQG1Q8kZ/CpdGsTHbhs4HVj70xGuYwqgDGB7CogyugYxoQTgEqM1DcFkkeMH5D2qJLgRqAVJ+lUnYB7iMyBvKUHv2z+tNkddhypJ7AMRSl1b+IA+9QTN86rSTuAyOHILOTk88GooS7SSAfMeMCrJOaLTidz6AfzoAmgjMUyk1O/zNmpAMKB6VHI2xc4zT2AYVMzFlHFQhTHMARV9VAzgYqJvmpgICO5xUU5VI+BUpqLCysT1AOKolKxT57jFXIIFZQ7cj0pWQEYNOt9yooI6ZxQkA2cNnev5VXaQkqTzjNXbhwsJz3rNOV6rjNAE7TpxzWdqFwqYIPerzRpxx2zWHeuWmIP8JIpMdi/ot0Ybi9ION8O0/TOaw7pt9y7Yxk1IpLMSDio2hcdqxa1uWQZqRTRihRQNs9F8FjAj57V6VJNFmNS2OOtee+BYJHtoGA4PCntmvSoNJMrkzsyFMDap5IzzWEkVEZJMqtgAue5FRsU80Ju6+3erraZIJQtuGdf7zdVPoaqrZSWspEgJfv/APWqWxkxIRNoHWmggEEnoKgdix6ZJ6AimFieucjsRQAshDnINKkgOc4H1NVgS+cnoKcWXcCnTA4oAkPNblmthcaVm9ky8akLhiGX0HvWCpby1/dnB6E5FOQvvAGAfUNmmmBeS9t7VGSJHMhAJYmrMCtJo8rjGGckqT6f/rrMJZmLiM4PfFaEEDzaOVTBMjngnGKpEmHK/wC8PFFWpbObzDxRV2JsfOwoNAoNUAUUUtNIBpoFKaQUgJRSP2pRSP2oAiNIKU0goAkTvTjTU7040ARmkNKaQ0AWE71JUad6kpjI37VGakftUZoAiNSw/fqI1LD9+gC2KcaaKcaAIDUYqQ1GKAOl06POl2654clzV+Rkt4ZHY4GcnNQWiNFb26MNo8sY/LNZHiTUTtNsrct96q2IRQjY6lq7M2fLU5wewrqLVfLVhnPOa5/RY1WJnxy5z+FdDbtu3cY6U0gIbpi8zALwozTISAvIy3erDnIxVUAIxUcDOaHqAkyhxuxjFU8n1q3NuKhV6mqzQui5PPtSAUO4HPC+tOs5CJ3JBPA6U3cFiGaWzGZwOxIzQBqSSuIARHkZ9aqvL5q42gfSr0owlZuwmQhR3pgW47l2AULn19qR5WQZ2Z/Gn2yhIS3c0jDOKtCbsQvcBlIAIogZSp+YDnvUDEbiBSKpZgo70gL+QehpsZ5qFYwM55qF3kjP3jj1q7gX/MDybB271HNEJFwaqxylZNxp5uN1SmIilPy59K52Z90h4rXu5ioIB/hzWDI/BbrUydhpi5yxPrXZeHtKs762hN0m9nJI+lcTCf3gr1bwOizafbKyjcRjdjnrWE9EaRV2an/Cr9Kn+aIuCVzgk1C/wntxjEZb6SV38Jwc+gFWlnPpgjqM8VCb7lHF6R4WudFAWBGZAcgE5rs4b4Qtg2lwhYgbgvCnufYVHJdyOAFkA9c8VXkuZI4SAT+dKwG/Z3kUeS4zj7zYyCaS5uLBjvlciXGMAEZrlTqUqsQ7tgfxE5ND6pK7bI2OD1buaok0JLKNmLLIGQ/3Tz+Zq6tjZ85to/8AgU+awxe3AUnzP0FL9vnbjzXI7gihoDTfTdPRnZ7aXBHCpMDj6VWbR42YbPtSqMZDJn8iKrjUJB3U/hTk1C4LBQVA7cdKVhtvoXodJt0jZCt06t2Pyj8ulZSWEokKvAF/unvnsDVl9RmRsERt9KPt3mBNyqSuCNw9PehIEyzDavBbRQFlTd8zc5ya0YIxFaxoMAjOcn3rIfUNoyoAPruqIX8si5ZR1I+9TTsI1pYklkL4xntRWL/ajf8APP8A8eoqrisfOOKMVJtb+7Rtb+7VAR4padijFADDQKDQKAJhUb9qkFRv2oAjNIKU0goAkBp5NMBoJoAQ0w0Gg0AWE71JUad6kpjI2qNqkao2oAjqaL74qGpovvigCwKVqQUrUARmkjG6RB0yQKVulLZoZL2BB1LigDqNUmECgBuVHP5VxE0j3NwXbl2NbniGbExiVsgjLVj20JeTjtTehCN2zg2WqBeGAzWnFI6g7RnJyaZaQs0GR3p24CN8nHOKYDJbhVfDDB9KqpIPOJHQ066+YbqqKdzAdKAL5bdTZJMIeKaFZFJ35/CqpuDuIIzj3oAeCDkA9Ks6fh7vGOSvH4VnRyBc571Ys5M3kZU9BigDZnfcxCnFSW0CRRjAyagLjexPFWBIu0ncvHvQAzJQFVOBmopA+3C96El27t56nIpC4boc1ohMiS3Cg5YHPpTCpR1YDIqY02aTYmaaVwbJN2e1U7g4UD1qfeCoIqNo0Z922gSdysD8obse9SMgC5FOYblINVpWKJt64pDM+4b/AFnHassjFXrljlsetUG61mxj4P8AWCvWfh24kijA/g4ryWI7Wz6V6x8NeLTd6MaxqPQ0jq7HpUQw1T72kTC4JPoMVVRgELFSfpTIpgQUCYH1rNMbViSSPkfMNxOMGqrqGBXPNTSTMVxUT8AmqSEQNYB9w85QScAEVKNNjjAzIDj0FRMWI5amebIABupgTBAjMrDcCMelRP8AK2OtN3OCTvPPpTC+VxjvmgCQMvrTi27tVUrnvTgaSYErkHGCp+tKvGevp0yKgqRWaNS1MC3LZvHGWlXAHrVMyEH5alfzpEKtk/jVbaN4VjtpCGEbjnNFIzbWxlfzooA8RCe9PC570A1IDWohhi9/0qJk96tE0wiluNIrrH708R+9WFXGaeKAKpWq7Lg1ouM4qm8fPWmBXIpmPepyuO9R00wExQRT1X3o20AR7fel8v3/AEq7FF15/Spfs70AVFXGeafirJiYDOKYVPpSTArNxioWqcxs1NMTUJgVcVNEMMB6VL5LVLHB1+WhMBUHWlIpxFNIpgRHmrGlYju3uGX5YkPPpmq7c08uYNLlX+KZwuP9kDmgTM67nNzcNKT1NaWmRgyLnmstRuYCug0yDMRKjnvTE2bkO2O3z0AFZ00m6Unt1H1pbi8MalCCc+lU2mAPzd6pMQshLADpR5e2RHJ4U5PFRCYGfOKtKcsB60gJHJ4wcVRmGXq4zhRk1HsBUE8k0AUP49tWLRQk24dQKJYiPmAxU1mu+ZhnHyGgbRdtYCTuZQfqKszRBFBBA+tR2YZdysMEVZkQSNk0CKCjJxTxAq0NGY5uHBz6UpFXFWBsrOrR45xmo2Zn+8c1NNLlQFPWoGBxkjGKJAkSCbCgbenvSmUd1YfhSQKCpYjJNOf5hiqRLdiIOn96qkkgYtjmlmXawGc1VlJC8Vm3Ysp3bHfiqtPmYGTio9uKhgOU4zXr3wvs5LnTZzEhDpNwO7AjtXkajFepeApJI7WNY3K/PkkeorOauiouzuepWds8khieJkbBxu6A+9Z8fmXEKzRo6BnKxkqfn7Ej2z61aGuXSRhBICW67hlvwq9Z6nNdTpFiMyKvIPAx9KzSsU3coPaTbkVpEBJxyM4pl3YXkYIyZD/CAuDj8a6edpI7RzPb27oozwRnHrVGTXLSJUMlujo6ll2uO3/6605SWcp5jhisikMOoPanZzW5c3ui3zI/lyIxHX0/Kn2Fvolvlo7jzHHVnQk4/GkkBgUxztxXSXUOj3I+W5WB/wC8q4z9eKqDSNIlUhdUXcAAvzd6YzKYYqIfMpFbY0CE8HV489gVFSr4ejSRcX0Dqf8Aa5NCVwOdK+9P8st05rel8N75gEuVbIycHp+VOOgSxs2+E9MBg/I/SlYSZhSYVME8MuMd6g2lugzW83hq76k+Yv8AeLgUz/hELh0VoJpI/bgiiwGN5Ev9+P8A4H1oq9NpuoQylPlbHfYaKBngVLSUVbRI6iiimkMdu9qdmosUuKQmx7Gq5OKezdOKhLY7UwIyabilJpm33oGTCnovWot1TJ3piTLkKdzVtF681Xj+5VlWpMY1l6c0xowevNTZooWoFbyv9qneStTZp272oAh8laPJWrGaM0mgKckQGMVC0Rq+wzimFQetMDO8k1X1DIWGIHGEyR9TWyIlNYVy4kuHcdC1UmIdaQb2Bxmugs0aC1fPWsq0VF284rblYQ2oBGWJJNCRJls5MxB5zSlQeozSOMrn0qZV96YFJl2nGaswxsV35wCTipobEH7wyT3qbyGSMIOcE4H4UDSKTylsowHuBT1lUoKLgASfhUUcYkzntQIlJB6c1Pp4LTOAP4f6iqrqNuBxmnWMrRXLDOcr/WgDdiAB4GKlLoyg7qqu8iJzjlccio0eVlwrdKpMCR2+c1Aw6tSztIPmVifrVVp964ZcH1FVsSmTKodDJjHtQeahhcKSCevepPNX1H50FCxLszznNMc9KXeG6VDM/wBzj+KgRWMLOcsap3KFc57gitFjjFVbkAqTUNDMXHJpGGcUpPJpNu4gZqLjHIcZr07wGf3A+teaKMV6d4A5iU+hNSykeg2OyORJHG7Y3H0pLyYyTySRKFw2RjGRTkwN+TjGKR4xswOC3JNZpBa5BJcTFWOWweozVSNA0hyOtWZNxxgZpqp15PTPNUmA77v+RUe8Nyy5PrmhxubcOh6UhQL0oTExGGVJVyw9z0qOKVY2ztpSD1Q55wRjmo/Lw5Byp7AjrVJhsWftG5h82FboT610+j2ZNoYpzCwJypU9B+IrmbKzkuJF8sEgsC2OCOevNdZp85id4JY08qNtiyDgkD17GgEULzSgb2Yxl0jWElTg8H61Xh1OeJdjXUiY/hzkVu6vcSC1mSHO4KcH1rltRhjQQbVZZGXcxPTFAyW41PPzNdjdtzsHSoRrV9FkpMVBGCaz23spVAAPYUgGalsC6t8dvzM2f980VSxRSuB4vRRRWgh9FNooAdRRRQMaxxioSvvVjGe9MK470khEDL703b71ZK+9N2+9MCFalQdaXb708L70ATI/Xipg3tVZR1qYCgY/NOzUdLQBJml3e1R4paAJd/tRv9qizRmgCbNGabmjNAD5HCQsTXPwx+Y+T0FbU5zA/FVbGEjGBQkS2WoIVVQT0ApskksrE4wKsSoywEAdcUkKHapPGK0SsIq5+UqRirkAAVQWAz60TId3yj61csLdOJXXf6DHSpSAsQRhULkdKq7muJ2fspqSf90Thmx9abaCQRM2zJJ3Mc9M9KYEUsA5fGSetVGi8pzxgNWoHjY4Y4NZl7cIsmwcgUAV5WwajspAdRj4yOcioJZsgjvTtN51KBexbB/I0AdDezBFAI74p1u4+zFfSs+ch5DjtWgkRihBP8YzTE2RtxiqEmN5x0q2/wA4wOnrTFRVAAHStGCRXjAZwpOM1MFVFAxmmtHhwyjmnkVKQXIJIz95aqlie9WpzsBUHrVcrhSfShgIZMnpVa5k2xucZwKtIcZrOvyQAB3qWxlMirem2pl8+faxjiTrjuf8mqYNex+AvC2/wIlxLCr/AG2R5iSOdoO0fyP51nJ2RSR5Iy72Jziu/wDAkqu8SRyLvUklc89KzPEPhkWc7tCpAHpXMRTz2dws1vI0UyH5XU8is07lJXPoeJN+/wCYDp1q5OlpGhHzOe53YryOw+It7An+mwLOw6uvBP1FdDZ/EDTbptstreRt2MeCRSuB1VyF3KY5S2RzkdDTV3DOGH4c1kweK9GZtgknG7sY+Sfz4rRN9arhS6RYOcdMfjTAszFEjRCu07ecjj8KrMhxwM1BNqUBbDHzAPulScYqsdSs2LHzAmf9r/GgQ9oXT7wxTVu47Z1kGN/fIp8t3bTQIrXCbc4wcA1QjNqlwkv2piyMDgKCMfjTBo60X8d5pkjWSKkjfK3PQd+apWLTBkBuXCAkFCAwJ6Dk9PwrHWe3huGe2kOGOdmcAValugtuVMyAe2BSbA6q5mLWN0kJ3RxQjMgPXrXN3EtxdSby+cDGMdKmj1K1h0S7YSBXdFQj37YrMtr+KRSd/HYnpTlICVyY42yOtM6qD609WilOAwbFLEiK25yAB3PAqEx7EeKKlchm3IqspGc7qKY+U8SzRmjNGa1IHA0tNFOoAdRTQ2e1OoGApwpopRQIWiiim2Am33qQL702nihIaYYpRSr3paQkxKWkpaaQJjqKbRSBMdRS0lAJirRSikoBMdJHujZc9a1dQ0i70NRHNbPEBAZGZxweO/6VShTcjN6sa1tV1vV9TtorO+v3lt4wF8oqMkDoC3Uj2qkriZk2kTXECPKRu2irDoAuRxT4YGI3bto7H1prOWBUjkVadhEsVuoIyPmbqatQxiGEDpgZNEJRxu3UGQGYxjnHepAozxu75ZgC7AbT6d6kdwuM8Uk8kbS7s4VBgfXvWbc3uASucUANvbkRuSDWLNNufPWnzu0rZJ/CqzDNABuzVixfF9CxHAbJqGOMyNgVp2dqxniSNSW3DpSQ2jStEUzNKfmGcD3NLc3YaUknrUs+2CMQxDcE+8fU1mgeZJ1qhJltJkJwGp+QaiCKO1Nlix8yirbFsSzOUTjvQoyoNVAMU4SOp45oAnkXc2c1Ay+9OaRlUlhURuFpAMJ2sR6Vj3jHzyp6CtLzAodm9M1huxdyx6k1LGPFfUGiJJo3hjT7RlG2K3SM898c/rmvnfwlph1bxdpVljKvcKzfRfmP6A19K6juFqig4BYdqwqPWxpA5zW7C01GCQxgByPunoa8k13RzaTlmXAPPSvX9TDiRjEP4dprhvE19Db2EkVzCHY8Kc4NZplHnm3Heum8LWYuGkJ5wMVy5mGeAa6Lwrrlvp9yIroHy3/j9D71TRKOt/sFN4kMedpBxS3qicbBaqpB6rXTWtxa3dsdkinvj29aia0UsTIQT60hnGokocMpKEdwakZblhgyMrAZ4PIrpZNPjZidoqCa15K7ABRewHLy3M8bYMzt9TUZu5SMbiBWzHoTLLJK8rMzfdHTaPpVZtJZWJJIB6YouIdZX0DW8ondFccgYPIqlPeDzmEcwIHdAQP1qydKY/wsPqKgk05gduKYWuQx6hOF2pI2fcYzQl7OzAZUfhTjZmIjcevt0NTi3Y/w0CZC13cqyhGBJ7gniopr2/kk+eX5fTtVyO22tluasiFZc4AbacUhmWNSvAMb1/KitX7LH6D8qKdwueaA04GoQ/tShvatSSwDTqiDZ7U8GmkAtLSZpc0hpDhSim0oppAOopBS0CSHUopgbPang0A0OBpc00ClxSbGkLRRRTAVadTB3paSYh1FFFMBN3tTs0lLQBp2in7KpAzkmpTAfKYk5bvTrQqII0XsKsTNsiY4zVpktguFiBJ4qssYmnwTjJz+FXgoaIA0hQCQP0G3BosJsr3aiOJcDoeKzZL14j8nfrVm8lznJwO1Ycs+JGDntgUNWGLJfcFmzliSeaoTTlzx0p8rZ28dBioApJqWwE5PerMVsJDhjU1tYGVgzcAe3StFbZI1AXj1pJAVorXYMY/Gtm2t1tUy4xJJwq+grPj5mVelTXF3mYM46DAqthkkzqBgjNZ5Xa+4GnNdgnOabuB6GmtBEynOadK52hFGfU01XULSwHeCenNUIjMTBc9aSLkGrI+ZSKYq7ST60xIjPBIqpKF3nbV5+ENVhCqnJGc0NDWpQvfltmUHljWb92r2of6/YOiDA+tUS1ZtDPS/g1pX2rX7zUXXi2h8uP8A33/+xB/Ovab9g8caA85GfauI+Fdj/Zvg6CUjEl47XDfQ8L+grr5sx5mJyB1rnluap2MbVI2iklfdgY64rynxXceahDcEH5fpXrms3du0CNG3D5H6V4t4uUiQD0pWu7g3Y5h0JPApVcDOaYWxSqMoK1IOs8OauYpUt5pCRnEbentXYPc3nllkupSFPKls4Hr9K8us9xuEwM/MK9e0Gze7gjZU4PXPVT6Vk0UZX9ragJNwuTjsCo4pH1e+ZtzTBifVBV3UtLa3kODwSSBjpVBIMEBx1AIpA2J/a98rM2Y2LDBylKmp3r5ysfH+xRNCkahi6qCwUbjjk9Ka0RXhuD6UAXBqs+MbY+P9mqz30oI+WI59FqMjb785prRHjHNSMmOqYQj7Mm89cGov7RC9YP1qEQue1I9ueMDFUInGqoP+WH607+1ox/yw/WqRtm9aYYGpXAvf2pD/AM8j+dFUPKaijmA88Bp4NRA04GulsSdiVX9qkD+1V1NSA0ATbvapFbrxVTd7VIrUAWs0oquGz2p4bFAE4pajVxThQA6nCm04UmxNj6KSigYtLSUtAC0UUUAFKtJSigTQ6lAyQPU4pKsWMXmXkZxwo3E0WA1o4ERcAVVLknk5xV6Vtq5xk9h61WjgZZU3D7x6elaWJTuWUn2RrvQr6ZqvNciGPrlm60l9Iqpg9hWLKC7ZLU0wFuJzK+c8VRlGYzUjxuvKmk8smpAaLcSHHWtG3tFWPmnwIoYnFW8RhSQ3T2oSArKm1mXPA6U4jFN84MxIFI75xxTasAiv96XaB2GKozrKZOuK1ViVYMFcZpHiEq4P4GkBl/ZyCCeaGizjbWiI2MQGKheMoMmnYSdyhubo3IHarEM3l8EcVCVLnIqWBQ0gBpIZaWXdyFYUhuE9akwFGBUFwmRuqxDHnDSBRzTmYKpJ7DNVCKS7Bihxu+ZvvfSlcDMkYvK7k9TT7Sze/v7a0iQtJPKsS49WOKbiut+Gdil343tZpB8trG8/4gYH6n9Kze1yktT3S0ijtrb7NCgWKCNI4x/sqMD+VZq3EzXJjTnd1HrV+D51kPTIqhYj/iaO3oK5tyzH1ZTEZNrcY4GOleceMIRbi2kyWaRSzE16tqFqstzLCxzIwJ6V5l4ubyG+yS8hCSj96YHEMMNihjhFpZBhs9jSHmtiS5YLm4XnuDXuHheQXFhE8L5dFAfjn/64rxHTP+Pk/SvVPC959gmgfd1Qrhec1mxno6aXY3aia8ti8jE8qev4VMdBsLm3VJbfCg5A4H8qDdC3tYyy5YgcZqzBI8y5jGAenPX/AOvTiBjy+FdIEhzEw+rE05dB0RRjym/4ECRWuqGRioLAg4qYRptAx0qrIDDOhaXIxY29vjviPGP0rNm8JaMWyLt4Qf4ciupdREuQpP0FQsrSRjMfX3qbJdAOYbwdppUbb9lHoSDVc+DYCSRqQYfxEqOD+ddZGoKZ2kfUVn3kYjY4T5W6hRRyoDAPgYSMNt+jEZ52dOD71XuPA0qKFS9i+bqSCAP1rcs2jiv4izBAcryfWneIklSS2WOR8kPuZSQDjHFHKgOU/wCEJu/+fy1/76orQ2XP/PaT/vs0UcsQPnuiiitQbDNSZqPFGKAJaWoqdQA/NOzUeadmgCZXFSeaKq5ozQBcDipAwqiGqQP7UAXg4pQaqK+e1TB8dqQkiYGlBqINjtTg/tTaGSUtR7val3e1CQElFMopAS1p6VGoSSU8noPaskGtJ4zDZwiL7xXNCVncRdE2+Urjge9XF4zWPaPMsoUqCGPOavyXSbgp4Ktg1oTsV9QTMWzNZyw5jX5v0q9ON75Ug1GE296AK7Q7VJIy38NJDbEsARnAJq/Dh1JIoT77N2PFA0xDsij29M96ypnIkODitObLSYUZPpUAtv7/AOFDRLZRQOucCrCJI5+YYqWFPnYHqKsow8zBFCVxkMsiNt5IwMcims2xd1PuIvO5HBqhQBdiYsgodQcZGarRSuAQozVgNI3VB+FUIh2471EUPmbw2KmMi554qvNKcjaaTVhlonIFQzgswXOB3qVCWXk9KR+MUwbIGjUMpHAAyazrmRpJiWHHarF7cEFY0OD1NUm6Fv0qZAmRtxivRvhFah77Vbph91EiB9yST/IV5xXrfwvtDB4bE7D5riZ3/AYA/lWU3ZFJanfn9zFIrenBrP0ps6mxxWnE32mJo5OvY1l7G0+d2UZz36VgmWQSy48RyOxyChC+9eZ+OXEuocdCDkV6NqBkhuMKcA859a8v8SHdeqCOACSPWmkJq5yuSgx1X0NS+UsiFo2zj+E9aaeCaRcq25Thh3rS9xF7SELXLY54r0fRFBkgyM4OPz//AFVwugsZpvIiCiZmBAPc+1eiaFbtHeQxSQsuApK+24VDGmejX7KLdY1cPtABIPeqNvqEsbFVQYPTeOhqzeAs5B4+YlSOQR2NZMo8qVGwevIBxRcDpre58uMb1YMeuOQakRpXYAYX6msKC6k3h9wKjuRk1sjUo1Q7lO7sMYzTuBMBl8MvPr2pwIQkE1SS63tkKFz6dKsedIi5WEEk4wGxxTFsKYyuC3AzjNVLoKUbdxjvU6Sv5hR14+tZ+oTQiLapw/8AKmJq5AsI3xSsoIVsgMOtTeIBuFu3TCn+lVhNM6pEJgxIADYxz9adrV0HZUUh2jQEjsc+n5UJ3Aw5YX8w/P8A+PUUouBJlmYxkn7vpRSsM+ecUYpaWtGxDMUYp1FMY2ilxRigBKWkxS4oAWnimUgoAlopm72p+aAFBp4f2qIN7UCgCwJPanCT2/Wq4NKDQBaD+1KG9qrB/alD+1AF0N7U8N7VUEntThJ7UAXY13yIgPLMAK3GjMzZHCgYFZWkIZb4MOAiljW8BnPNNK6uS2Jaf6s8Dr6VRmIkuWA9avLjZ8o+90qGSMI6Y75piKzwgLgHGareYzDk1bkOBk1VEDuA3TNMCSO7giXEmR6E8Cni5gk6Spx71GLVmUETvj0OCKe0T7S0gt3P+1HigCNJA8pZD0qViT1rOkU7srbquf8Anm5FPR5Dkt54A78NTTEW26sV6kYqSFBtUg/MDn6CqpboPPBPoyFTUkUvmE44296Bj7kN5eEGSeKqm3cLnjPpVqNy8xz2OKWQjIoauBVtxhmBqyKgLhJCQM5oMwPaqAJ1X7ymqTCpXJc9cConX5c56VDQCxq7Lwx4GeKYxJc85HY1JaqXhOBz0JpjgBzgYoaAo8+YQRjND/cNSNyc+tQt97HpQBXkO1sV7z4WsTZeFdMh24YW6s31b5v614MB5s0UfTewXPpk4r6YihEUSIvRVCj8BisKhpDUqLcNHLyasXUwltG3c8VSuztbOKjkmKxSLjIxWRRnXF152FBztyM96858S5TUCjDBCiu2swtzcsoGQMk1xviiP/iZHJ5I5NUhSOXPJpVGc009alj5zVJEm1oFpEdQinZclWBzXtOkQb7ZbifBngAUEnGRnpXlfhm3U20krHIVOnfOa9Ssrlrjwybi4PzsPmfbjOOBUtjSudFaXyzw/ZrmLy5mOWwRt/A5pDpWmyszZUHGB+8B/rXHRhnjZ06AZ+tRbGftijmG1Y7UaW0aubZs7gCMimSaUDIJHeUKOpK8D8q5NJJE2gM4CjABpzXsqMQHcEdw5FHMLlb3OthnjgBR497A8MO/vzSRPNLO5ddgU/3uv5Vyh1C573Ug/Gp4tYurcMUnUk/fDpuzQ2CVzqndUDykjpxk9R3/AKVzc0TtO6liuBnJHWli18qQZIBIQ20naAMe1Lca/EZ/MjtEUkY3lySfypgPsUmjkd4pQ5Hytk9j1NJqS7bkuxAO1VX260i6pAZROLZt/wDsuMU6bVLactvQgAAFSVBI+mOaExGOkiKuMlvdjzRWlPe2UbqhgbhRjaVxiimB83ZozTKWtASH0UlFLYBRQKBQKYD6KKKYDdvvRt96dRSbAZig06igBopRRilFACilFIKUUk7gOooopgKrU8GoxTxQ2Bv6FDuhlnORnAXB781fNw43L+tN02IW+kR7hgNlyfTNR7ZHYsRwelaLYlluOddgB4NQzSuZ0XPYnNSzQrHatjtWQ0pRwRQIvkjOXwfrU0ZV4ieymsg3DqMsox7nmrQuB9kWMDrzRe4F9MGMYOagnDSOEX86dEwaJcHoMUu3HekkBWnhBUFO3WpY0Xy1GOgxSuwRCxPSmo2Y1NG4DZELMSPyqaK3WO0lJGScnP0pFlCXCernCj2pL+4KJsA6nGc0wKCyGKTjtUEt22cFSfpUmSzAHvTjCnpTSApG6yRkEfWmyXHy4B60tzEoHSqeMd6TQGgjgxriiqSFydoq0gJHLZpp2AsWw+9+FVJXw7D3xUkburlT0NQSHMpNACO+04xVaR8IeKllPzVTnbPy1LYBAc3UC9zIoH5ivp62lWa1Icj5OOtfNehw/ade0+HGd9wg/XNfQkMp8o+5zWFTcuGpDqIIYcd6oXcn7huO1byNHIu2THNZOpWuYpZI/ugVmWZWgnEtx7VyXivH284GM8V2ekIY4rgkdSa4nxN/x/OaUd7DZyU6YkJ6L60sYw2ByD0NSy/6s1QjleJsg5HYVqZpndeGg6oAPmUttZfXpXfaXKzeH2hk+VMlR1OVJzXAeGn+06RNJC2GSQKy9wPWuz09nW0WIdx8498GoZRqQPhEQDIwQG9/SpZIWTAC4PcZpUWPaiAEkjLEDrTmDQEMruCfekMqkhX2gYWo3IG7AxuNPkIfg5P97jpTZIwxBDEj2HNAyEjNIsh24PODirDQArhhkEZBpscBjcHaW9VzSSHciJzSGNT2qdoGCqxONwLY71Awz2I5xzRsITyVKgelQyRhTkd6nXlcYGR1zzSXGAowwOfSjYRF5i/881opmP8Aab86KOYqx4Zt96NtS7fejb710N2MrXI6Kl2+9G33oAiFPFOC+9KF96AGUU/b70bfehuwCUU7b70u33pcwDMUYqTb70bfelzARYp2Kft96NvvTbsA3FGKkxRt96TdgI6dinU3FJNgJUsUbSyIijJcgfnUeKvaWmbvzCcBFJ/HtRG7eoHTqyE+UB8sYAFTOgYLjjDCsqCYQsSauC7wpO7pXUkZjb92CbFH1rGkO2QHrirT3Xm7j3FVHGcUhiMelIbzy/lZM+69aXae/FMW35Jc5JqbAWYL6zZSXlKH0PFWDdQN/qJl2+xrPGnDzgzDj+VTf2PGwJbjHtQBYMnmfxZxSpcBAFKge4rKl0xoxuEjIvfFMtPOE0YWdmUHL/SgDRkDjUY52/1YIAFXnWOZtyuWAGOar3ErJiRIwykZJIzVL+1pomKhI8duKAL89oYo/M6BetJCd7Y6VlXGsSXUXl7QBnJwaktLs8c1VwLV5bkNkDGKpSQ7ccYraR1lUEGoLiAMpIOKqwrmPB9+rC96rgETnIxUq96lIZIgL7uOAMmqykOSSKuSEraO0Y5Y7RVEJIg2u2B3xTbAinZVwwOSe1VNjfMzcCr3lpECxG8+9UJP3svzdBUMDa8JAt4t00DoZeD+Br3eFdtoPevE/ACI/jnTFc8Bmf8AJDXvl1EohTy8EVzz3NIvS5lSvtrPnupIo38tenXmr12pQuSKwtQciAgcVBRLDKkokMZ5ftXBa+WN9LuGPxrchuxbStuOFzg+9YOtSrNcvIn3T0p7CbsYMn3WHpVVF3NjOKtMhG+oIjl6olnYeGilmJCI9wlIL/QV6DbafJNa+dZsHDjH0PuOtcNoIyn4V2+nF4GVlkZR3KnFSyiS3uZYXFvPEyy9BkbefTNXPM3ZGNpH3h75qz9olnixPIZR0O7HI/Q0w29jtDfZhuPXBIp8oyHBHUcelNZ8BQ0fIPVu9WfLs+ohlz7SVPDFYLx5cvIx8zZoaBMzS+OQ209jQJCGBPOKvmzsWzGl1cJ6DANC2tmsgQTbzggZQg0gRlPITjGDgY4OaazF2LE1oixt5Zd0d2I1AwAR1P5USaeNjbLtG9c4oSC5klsKTjpURlc+g+gwK0JtHkDtKjoy9SNw/E4FVzp900bOLdWCnHyP/LNCQFOipvsl5/z5S/mP8aKQ7nh1FLt96MVqZ7BRS7fejb70wFopaKAEpKdSgZpNAJRS4pMUcoBRRin4pWAZijFPxRiiwDcUYp2KMUwG4pMU8LnvTiKAIsVr2Ftts2ccB24+grMVCzBVGSa6RVEcSRAfKqhaqKJZGsXyhzyT14qndMVcYNasa5jHtVG7heVxgdK1EZ4mf1qeMso8xucdRUlraMJWBXPy1Y8kjINMCqzCRQq8k1Ou2Nwmwlh1xUbP5TEKAB3Jqg14m/5Gzmk2BrGR1/5Zg/U1HJezbcgqMe1U4nmuHEcShye3/wBftWyunQQ27ySkySYPI6UIDHnmuHQSPIoi9JAB+VS6fl9RkiY/JHF0HGScc1D4jjkfY8QZkYDBVc0XbNZtBdr1MYWYDoP88UwNOMIV2j5iOlVbiBCpLRgE9AKjS6DMHU5B54q5butxkt1oQGI9h04qv5D9K6gxe/6Uw2imTeBn2o5RJmHazCHr2rSjdZUDKfwqxJYRyrjA/KqcthJby/uBkdwTQlYZBcocbxUcUbnPFXLiJhHkimxHc+09D1oSE2LzsCkYOc1nTk7iwGa0X+fPNQuuENU0NIzHEsh2gYzUQTyz061edygUCqUp3fjWTVmNs6P4dLu8daec/dEh/wDHDXu0Ewf92/Q968N+Gi7vGURzjbDIf0xXtgGK5qnxXNIbXGalCPKfmuVv0H2Zm9GxXXCfepV+hrA1y2MNgFUcbiaExnFzjMRrkr6RkvQAa6uf/VtXJXw/0ljVJEsYZQ8b7T0Gaith+8qJWznP3uh9xVmBdpD5+U9DQB2nh8fuU+ldzYKZANo5HauI0FcRpzXb6aMMjA8r0rMto0lUfddSCPWnlMd6mlOFz6VBmtSE7D+4PpSNwKa3ao92O1AJDXyu3Dd+xpmWeQHcB9aczFt2e4xUIX/d/CkFy0rFGBB+v1p/mueCeO4wKhVcqDnrSlivQ02STW58qWaQ4IjiZjg9qibUTLbKks62hIaTDHI47cdOtPtlVoLucSKf3JBTPOSRzXP3RjLkJ/rO59KGrFE73tyZG/0x+DjpRVHZ70VJdzyDFGKmxRirTsZkWKMVPijFDYEG33o2+9WPL9/0o8v3/SgCDZ70bPerHl+9Hl+9AEO33o2+9Tbfejb70AQ4oxU3l+9Hl+9AEOKXFS7fel2+9AEWKMVPijFAEGKXFSbfenYppDQtmv8ApSMVDBeTmtGSXzDkcVVhDYbaM1LGN7Y6VaJZejYbARyKnVqqJFsX5Rz60iiZ0K7sDuR1/CtW7EkkkwEuFAZ8Y68D60qRZGX70jRRQurAYpJZuqqfqaLAZuoSfKQBmsa3snvbsRQL1+8ewHrWrefxfSqmh3Xk6iQzffBXPoetIDpbCzh0+DYuCf4m7k0+6mPkPkgZXHSoBPufan51HPAR8xck+9A2ynFLKYxD5hC1cezjltpIW53LiqQBPQZq/b3HmABj84/WhMlo5aPzLeV4mJBQ4q/a3TxOWPze1WNYsi7/AGiMcnh6qpAy4PpSasxpm9BcmXGIjz6HNSC4jXhjg+lQQqRGM1BcjPznr3q07oWxNc3awqQhz61UEzsmc4qgz+1PWaQHgZpNgaEcgki2PULERKQCCx4+lMSmRj52z1FNoBfMZfvDj1zULybzx0p85ylVwG/hpMa1GyDpVSQfIanlOPlqCQ/IazaBux2HwvX/AIqe5OfuWrfjllFexg52+9eVfB+1FxrWpORnbaqMfV//AK1etbGWWND3zzXNNam0HoVbpgrtjnFYt1cBo2ilGVPfPStW7b9/IcdGNc/dsNrsDnFSM5q+haJmXqCMqw7iuNvOLiQeld3Ku+0/eoTGD8pHY1wt7G8dxKrjGAce9XchozF7n1q3YSN9qUE5B7VWHKketXtMTdc5z90ZpiTO90QIbdHTsMEV2WlRM7BkHK1xejXT6c6Sr86t95COMd67a1kBiW5s5AIdu50J+Ye2Kks1JDxtABJ6ZHNVgArZJH3j1FWYoLi4AYW0y/XAI/WrVzBetI5+yMisAdo2n+tUS2ZQbrS1M1reMM/ZpBg55Qiho3BAZGU46bSKpibKXKkEfoKfnNOcKGwTj3oXAbBZefepaAsMC9uMdjjHaqWw9st9TWjGiSghvn6Z280SmL7TgRhVXjiqEVoyqWVwNuCFAIyOhYVh3MDqNozg9wcfnXVvHaXluYoJmSXahkZVyyn+6a5S4uBHcMkx+ZW/iPORUscdCqJPLG0oMj2op51O1BxtZvfFFTyso8rxTttSbfel2+9aA2Q4oxU2KMe9AIhxRj3qbFGKATIMU7FSYp233oBIi2+9Ls96ft96dt96B7Ee33pNvvUmKMUCsM2+9JipMUYoHsM2+9N2e9TYpu33phYiK470mKnAxSxpucc8YzijqS3YtoAsaoDnHJ+tJtCdB1qoZnRgc5qeJ/MXOMen1rUhsuQIGUk1MXVB94H6VXt1Z1wSQg9KllVChyAOM8VVxFG9uC0oAyMVUM7ipJO59KrfboIVJLZzUgNnUtGcuenasy3G24z6Nmp7jVocFUVmP5VU3tLL125obA66zlDpkd6ncfIaxdLY4Me7DqMgeorVEgbpzTAhUYjWoZ22ruAwakkfaucZqlNdBVBBxim2Bdt9QUABzwe1JO9sz7o5NoJ6Y6ViE47U3J9aV7gbc94qDZGd3rzWfPcllAJxUO/apOOlOgiE0w8x0jUjCl2AAPv6fWne4hnTkA4PQkYqwZVhiLEcD+dRj94yxq5Yj1qxJBuQBu9KKAopfyGTLdDWjG4kG4VlT2TRksoyDU1nceU+18jNUgLjqG69KjA2sR1qVGGw543HNROelJuwyrPy9VpOEqxLwuarzcsDUNAepfBSLJ1ufOCI4k6dOWOa9UWRGceZwR+tec/BqApoGrT9N9yifkn/ANeu/ufnUDpXNLc1WyMrVP8AlpjoTwa5u8GLc/WulvJUKrDn15rm9SiMW4HoOgqGrlGRIR9mWEybWbkDPTNcZrYeGYxmTdGRnOeRXRaoxSXepwQK5jVGMmA3U960SFJ2M1RhHHYjrV7SV3TOvqKpK2wmMn936ela2gRb9RXjOCPwGabZB1rxrHOsQ5CjDe5rb04TKsjQSsjIvVe9Y0qsuoT7hj94a3NOl2W83O3cAfr71JZYm1e/gG0XUhA6Zbn86rjxDq4Vh9rkXcc9eaju5f4MfjmqnVlG5Rk45PT61rGIjZi1PVCFaS+myTnlueParbarfrvP26QjOQTg5BrGikw2GUEMu1yfSpJLgou1SFBXbgjNDVxF+PxLqWGxMhVSNpkjBJ/GnSeJLuYJ5kVux5JzH9ayAqvHvLhcdj1pEG5guQPrSA1ZNaYMFFrasNozth5/nSJrgMYia1hdMnkg8eg/nVBo/KPllgSFHI9Dg1E27h42MeeSB0yO361Uh8xu2/iBkuVRreOBSoZ2DYDEe2P506TxHbsplmszI7EkHcOe3pXLR+aLsMFA4x+86cinPbyvIASoyCc4wo7nnpUtWEby69pW35bVoR/cQDA/SiubWOUrljKp9F6fzooGcVS0madu9qAGYoxUmaTNA0hmKkxRmjNAgxS4oxRigYmKTFSUmKVgY3FGKdijFABijFLijFJqwN2ExRilxRihsTYwihm8u2kbuTgfSnkVHKudoZm2AYwq5qqdkyWQW8Mty+zOV71dkWKNc7lVP4QeSfpTBKyqFhTy09ScsajEaL/Dn371o5roJK46TVGtrRpEgLL/AHmOKyr3XbqVAokxu644qzqR/wBDI9WFYjRfvduNtCZLI2mlkbLyOT7mgLmrCWhz81WRCg7U2wKqQbutWViVelTCkY4oALeV4r63KKXLPsKj+LPGK1rgzWl1NHIpWRXIdDwVI6g1n6Xcw2usafdXAJgguopZAOpVXBP6CvV/il4SivT/AMJfoRW4srpfNnMTbh/10XHr3Hr+NA2rHlck7ySDtmk2A9eaaOKlVgM5OKYitKoABHFMVf3efSrJHp93tUSQOUSQxsyuSBxwfagCAKXwGbI4OMVPcNCPlgZ33Dkuu3nuOpp0spEQj2xx7cgPg7j7H6Vnztv+VRnHWgDUiKwD5OW7mrfnJtAz0rJsZyX2uMEdKuMOlXF3ETSSRqMlqot88g7ZqbHvT8ZZT/dGKGAwRmNSSaiZ93bFTzHCdKp45JqRhJyMVWk6CpZGxlcVAzfKTjpSA92+FVuYPAKP3nuJH/AHaP5V1En+sNUPB9p9h8I6XalcFbdWYe7fMf51qOhDE+tcstzRGReRK+c1zN5qHmyGGXCtHwPeusuD85IrzzV5Cbx2HHNIaKniBk/dhOy8/WuRv/vL9K6d8XMH2dmG9B8mepFc1qHEyj0XFWhlIruA5ro/CkDG5Yk8RkMDjtn+n9awSuGIz0ro/DolScSKACRhuOCPeglM37gB9UuMHOZCd3Yj1q1axf6YrFsj0xV3+xPNAmtFKufvxMfb+H/CqeTbTyRsuJoxypIBFS0MfN5kblGTcoOAARxz2qIqf4eFLglfT3xQ00vWQHHc4zip4tky5SQe+auMgIs7VJcbSO1PMjCNUj3lQd3TGPrUpjRVLEcDrSmaPy/vdqpsAWDMe8qG9jUahWwBwQCCGXp1p8bcj5uD1ah53BAV/lxkcdqExJkKEqu8Hr/D/eFLvVsOy8MfVsr83BoZiFyBnFMEjMQSw49DTGkSSGOOTcwG4dADnAqNp1faSeeASD1GOpokGGx6UwjKlR1PSk0K4yV4fMPzt/3z/wDXopG+U4zRRcDh80uaTFLikFxc0ZpuKKaQOVx1FFFA07ElFMp9IaYbvajNNxTsU73BDt3tRmmYoxSTsA7NLmm4p233oBIM0Zpu33o2+9DVgEzS5pMUYpAGKXFJt96Xb70CIriSOGBnkXdjovqayjmWVpnADMc4HarF2xklAP3V6CoatENi5pc03NO3e1WkJIKbTt3tTd3tQBGVre8MeM9V8NO8EMhnsJcmWzkPyH3H90+4/GsLFMEeGBz09qaVwO3v9ItNSik1TQgfLI3z2rYDxdyQO4+lc4Rms13kXGJXH0NFtdSI21juHvQBakymMHrUclzKUCK7KgO7aGOM+v1pryGRsmoDzSbAc7bsUoO72xUZFBFADyN1TJdKMKwwT3z1qtTGTcMZoTEaJkDKpXkntUgrJjkkjXBq7Fc5GTz/AEq0wLDY4ycVBnaCetOkcEYFMY5pPUCs3Jzmp9Ksm1TWLLT1H/HxMqZ9Bnk/lmmSdq7H4XaU134hfUHTMdmnB9Hbgfpmom7IaR7Akro/lrwo4UegqeaVBlA2SelQtGRK4z/DWPLO6T7s5xXK2ap3Lkx+Vj7V5tqr/wClNx3NeitK11FuiPz15zrdu0V02/g+lMEjJvJGQCZDtdehrDmnM84VhmRv4vWte4+5WBNkSlh1VsirSE3Ym3cjjmut8PDEkf1H881yMEnmhjIvzMRjnvXZ6Dw6+xFKWxK1O/s5nkhIGAd4IJGcVeP2InfdadaXBZtu54gWP+frWXpbcr/vVsZQwkkg7WOcHpUjaHtB4T+VZLWDcTtUIGP4ZHFTrY6RDta30siILvWQLkH365rNtbKK7giuGiDOjMSofGO4HSujtpCIPLZdrgAEZ5FaJgY09pon2gL9kbzzgkxsy8HvgHFSDRNCMSt9jRsgLkytzVW8h+w6j5andEx+QnqvqCe+K1I2+0rtACxnpt6/hSbAzv8AhEdF/wCWX2pfXbP1/SqM/gm2gDNHNdLnpl1OD+VbcUHk4mjBYbc4Zjg1LNqcUeyO4SWEydPTFMDjX8LyxbRHeyAE4wcHH601vDVzGh23Wc/9Mx/Q10mozGWISxOFIIyx4z7Cs+S6lLxbZcMflwTRcZhvoupyfuDcQggEj5GGR+VVJND1W32uHt35xjcc/qK6HzLz7LNMjNuJO1MA5X+I/X0rIGo3B+85bjIJJzRcCAaDfSDc19aRk/w/Nx+lFWftczc+ZJ/32aKoDzWlpMUuKErk7BRRRQncLBSgZpKUUA2O2+9Lt96bmnZpDTAilFIGzTwnvTvYYlFKFz3oxQmMSijFGKXMAUtJilxQABfegr704CgikmAgGKincKpAPNSO4jXJrNkfc2aIq4pEB++aKKbWqRluLmkzTc0ZobGLmkzTN3tSZpgO3e1G72pmaM0AJRS0UkwHKaFb2pooJxTAM0ZpM0ZoAM0ZpM0ZoAQrnvTCB24NS00KWdUUMzMcAKM5NJsCS1E9xPHbwxtLLIwVEUck1s6r4d1bQ3A1GzkiUjIkHzIf+BDiu2+HnhxNNvxd3CBr1h8oIyI/Ye9eqX1gs8Pl7FdSMMjDII+lQ6jWxaifLZJY5NeyfDW0XTfDaTSDDTyNKfp0X9B+tZHiT4aI90J9KnSBGb57eQHCjuVP9DXb2ES21gsCKFVAFAHtxSlNPYEn1NDz1e6Zh0I4rIIyJT6tW3bvG8YwvQY61k3KPEX3D73IrBmhRmuDBEXU7W7Guc1iJtQhSeMfMh+eti94zXNyTSLM4VsDNUmJowrtDzXPzjMhrrbyJZYvOjUqCSCp7Vyt1/r2q0TIqsnQg/MORXY+Gpzu+ZirZG5cdK5SMfvBXV6FZvPdRLEMddx9qGxI9A01tpX65rQkAeAFch+CpB6j3rNtY5LSXM3EXKKx7nFbeiTQtKCdmY2KMOg3Dgn3qASJ9JVpHSNlkjCx7mzkBuT+dbyxY4LHy8gHPUfjWfcBo5US0iCMTubeeMemDUrs6yAbiwXkgA4YelWwMLXp3kvoYz5aorOOfvEkjB9MU62vFQ+WxJJGBkY59fpU+rww308I5ZEUhcj1P/1qqrBFZlcAq3YA8flUt2A0LaYMpZIwf4AQCOKsyQxkfvokZn6qwyOPSqMNyGk25wPWn3955PzNygAwc9aEitjmNTw+ouijy414GzI20xLjbtyN0iHO/PUUlzdm6uibghsjBIGM1VCiF2UfNkYUHsKoDVim8t5ZmOIppTk+gPH9Kwj1rYurYHw/bTKP3uclvrWPjPI6djVRAbHI8SCPdu28Zopu72opiOI2+9GPepdvvRt96GiSKipcUbaErgRbfelC+9S4pQtAEGPejFT7fejZ70hpkFToOCaaU96lUUmymxMUYqTFNxSSJTGYoxT8UymMMUuKKdQNIaFz3oIpwply4iiyepOBQJuxTuWDkKPzqg5yakds44qFuK0SsZsM03NGaSqDYSim0UgG4puaM0YpgJmn02ik0A6im0UwFooooAKKKKACiirNjYzX9wIohgfxOei/WgCGGCa5mWGCJpJGOAq13GiaBHpsazS4e6Ixv7L7D/GrelabZ6Xb+XDy5H7yQjlv8B7Vqhvas5SLSsa3hg/8TP8ACvSTHuHXtXl+jy+VfrzjIr0u3nV7flugrJlHPatCRK+Dnms+B8W3StrUVDMSe9UEjTyNq80hjEmKLgCi/l+1KCSBIOoA60jQkRhzwe1U4JEF+3mHapXmgDIvZBtY+lY1yN9v5qc/vMCt/VIM7ni+aM96ydS2DTrPHHzH+lAzJ1K4a08tNgYSfeB6e9cfqMYjuGZeh5rrdVdZShU8EVyd0ojdg+Ah5A96tGbdyvD/AKwV3PhFPMvNu3JKED65FcPBhpMqcj1rvfDztZ24uD2OF9+RSYI9Ohs43iEIBJaLcFwDubPeqkOi6pu32VrHaxdo/vf/AKq0tNdbkRSxocuRtyufrW/HJsUrtBwSOfT0oSuCZgx6bqwjAZkJyTjB4qA6dqxkDhgOMYViorrEZc5bggYFDkhchh+FXyk3OJ+x6qFLPbsz5G1lkBGKa/2os4uNOkKHGNrL1/PpXXSq8rIqnAx8wXAJNRvaSyYDShwD0ccY9KTgM40m5hZSYHdO+Fz/ACNWJLmKeIp5czbBlgIz0rUnsUG9BtIHzDaSpAP/AOqkls5IWhVZX2H5dwOQT6Ghqw7nIXCWrMzl2jb+BSCMD3qo4G776YHVs13EkN0qyZWEohx845A21mESXIYrMluSQuxEAz+NIEyr5Tz6CI5UJfZgDueOMVzNxHcWcYeaB0UnHOOPr6V3EVvNDG7Zlwmc7zyx9c06CUyx4kiDDuD0x71SVwTPPxICM0V30oWKQpHACo6FFGP5UUxni2KNq/3an2+9G33pkkOPejbU2xvSjY3pQBFigCpthHXineXntmgCvRVj7P8A7NHk49qQ0yqV96kVevNSFfepFXrzUbgkR7Pem7Permz3pmz3obG0VNhpPKNXNnvTdme9A2iqUI60mKt7Md6Xy/ehsClisy5m3yf7I4FX9QlMUflg4J61jE7quKIYxjmmk0MaaTVskDTCaQmg0wEzRmkzRmjYBcUmaN3tSUAFFFFABRRRQAtFFFABRRUMkvOF7UAPMmO1djpaG302FFXaSu5vcmuNt4jcXcMI/jcD9a9K+xoiqoPAGBWcmNMjiOc8VbXI6nNCQYGOlWFjLHrS2KLmjn/SSfTFdvpt0SNue1cbpMB85iDmukhkKSA1myjQ1FiQMcVkxSbJvY8Vau5mkUEHFZsh5ouM0buVSFVeec5rHuPldm61oowljGetUNThMQPOX7CkBTS9ESeVL/qW4PtVDV7ULpcIV1kVW4xSXUZa23jt2rOe5lS2MG87G7elNITdjHvZAJAg521z+oruXdnrXRzWpVX556k47VgakpCopGO1UJMraVbu9yUGASMjPqK9B0m23aQC45LNtHvmuHsEkBLqSB7GvQtGuRKI8MUmwM56Z55/HpSY0rHd6ZP9nsFDLnCqRz34robGYzLtYHzCc81z0ShHiKdHZTj+90OP1roY3aHOV6+9EWS1YtZwwBAAPUgdKa3yqAH5JO447Ecf1quk5DszcgHK++apXkyruKjJHp29cCtCS8s8ERWOSUO3AGOv1qveXYlsnEHOzr7VR5lKPIRLI4O0Yz+FIZoSWgZQMjDqD0PXHtVNhsQrq62+1RI7ll+6eS2emT6dasiVG/ezzwofugp2A9qzktxG/lKxJP3QeR/ex+VQi0uxKpkWEpg5GcYx2pJXA1f7QNxc3UZjxCi43ZzmqNtLBJAPLQCQOT5kvPmDHaqBHmXG1QdzAnPfj+dNltbpZlKk7MY2DpSGTi48vz0bJcfMpx8pP9aZZXUTmWOTHmPkNsfANUmjmjULjzPmYHPQeoFOW1KBXWLY+MkCgC3ca7HHMVUqmOqsWzn8qK56SMCRgzupBxjAooA5fy/ejy/erWz3o2e9HMBV8laPK9/0q35belHlt6UDaKoj96eqY71N5belOCH0pjsQ+X704xKRUyp708DNBJSeFcUixrzxVt48rUKr15rPctC+WtJ5a+lTxr15p+33ppXAq+WtJ5a1b2+9Lt96AKflrUc7R28LSt91Rk1oiPNczr92Gl+yRnCoctjuaEhNmRcTtPKzk9arE5oY9KYea0SIGselMJoammmIM0ZoopoAzRmm0lGwC5ozSUUAPooooAKKWigApCcUE4GahZt1ACM/tUdOIzTWFAGr4djMmuQY/gy/5V3/ANqPc4rivCsZa9mkHO1MY+prqiKyk7OxUVcvLc7s96vQHMdYqHGa17aVPL60loUbemD52rUY7VJo8P2qTWpkPU1NdxGJSDWYJlESlutRtHk9f0pobFWoofNjLYzjtS2LSGISrDBqa+i+02ZkH3kGT9KqKfmFPlufs8wLfcK4b6UkwMK4kQWTDPLGsKckSEEdOldLryQL5bW+ArDJUdq5W4YmTmruS2VfPxJtk+76/wAqxNVQh1B4rUkJ3IAcZOKydRlE0m0fwnBPrTEWtMT5Bz3rqIEKyB1cq6HKketc3phyo9jiumiJXFJrUZ22gaqBA/2plMmQQMdOg49K6b7XD1E6AdizjmuA0q8a2uQVOBj5vcVu2+pwyKcKgIOMbev4U0riaudGs0JyYRGXBwShyfyqaRY1yzoTIgGQB+pFc3JPaS4LRRJJ/CVbGT+FQNepbzOEzuON5Z2G4f1FUSb8SxLMSJHjc8he2KTZu8zygcv1dh39DWIt9GfnjJBP/TTn+XNSfbwWA3TMO5837p/KqTsI2oYPJZFKYXhgueff+lVdQjFzI8cSMT1VVJAB7VmjVMR4W5kMY6hZAe/uKcL89RPOx7MQp/wobAvpprRbCqCJwMksc8nrzUxtv3n38sBnp1/+tWd9tvHUr5xweoMIx+hphn1EKrAQOFORwUP4ihu40jWWzjkYA5P15qK7sTNbLDG2Md16EegNZ5124t/me0TOMY3mmtr7upCwSDHTaQf6c0XuBWl0ceYfk/X/AOvRVqLXTDGEWOTA9qKAOBo2e9MDjuKkSQBs0tyuUTb70qrjvUquOakwPX9KYkyDbTwvvT8UUk7jEVPel2e9Kppc0JgNMfHrUaxYzVrOabtFA0rjRFUghpQR6U4EelADfK9qPJ9qlBprSBF3MQFAyST0oAzNZvF03T3kX/XPxGP615/JISxJJJPUmtLW9UbUb9pA37pPlRfb1/GsZzk1SIbAmmk0E00mmmS0BpppG7UtMBDTWpxprU0wCikooAKfRS0AFFFFAC0hOKWo2bOOKAGFvamkUA0A0ANop9FAHReFyyQTsvXcK3w1Znhu3K6XuAxucmtkJjvWL3NE9LEG4jpxVi3aQMBikWNfSrKIq9qnYZ3/AITbNijEcsMmr2qLvbGcYqr4ZbbpyjGflFWrpt6k4xUtAmYmzHen+e8CsU7jBqWRenNVLriOkULIdqK2M5qvcnMg+lWIHE6eWetRXcRj5JzxSSsJsy5U+2syq3zpwvFczdq0Urq3Vev1rfLSLxH+NUtTWO4w+MTdGHrVoRgNz+AJrHmbdIeK1yM5/wB01kNxcVSQmza06EJbwMD99m/DGK3c/Oq+tZWlASW+CwT58hj71rupjkZH4KnH6VLGmXbUDzkYsRnt/jV8FoZOWDfSszcIxGT36/StGOLz5AQ/3gTuY8YAz/KnABZGJmVgwO05wDzSi6LxbGU8dh/hVKTck2SoH0qGR9+3jG2rRLVzVjvN7Hy0GVXDA+lSGTtjGO3pWXbTPFISvG5SCO1T7xtAHJHU1SQi8ZI9pJjUYXFBlJUqqso+lVd2e1P3ZoSA0LWVyfJjWQ56L68GtGzk35AicoVLcDqBWVpTpJqSjdjeCg+pGP8AGtq33LcSF0ChWki2AdIzyTgDPGR09aQkjO1OG1u7d2kjkkKnbGVXv6Z9Kw5NPuLeDE8csDdUJJ5FdjaRrLBBH91PtG5t3/LTjHA9BWNfQhYIjs3JICQ+/IPPT2NAznfLQcNcuD6YNFXZNF89zJb3DBD2YrnNFAGAFoC080hoKTuOQ4NTiTAqiTmpVPzY9aALXmChXFQqc0/NAEyuKXzBUSmlzSAm3imZPpSUUALlv71S1FUtVuMdXO+J9VMEZsojhnH7w56D0rburgWlpLOVLbFzgd685uJnuJ5JpDl3ckmhK5MmVycVGRmnEZphOKshsQ000GmmkA6imr3obtQA6kamsaCc09gEp233o2+9OoAWkxS0UAJRRRQA0t7VEacWppoAjFOaminNQAtFFHcD1oA9Y8O2MX9gWXqYgxP1rTNhH/kUliBDZQQqPlSNQPyq2j9eKxNEyt9gj9f0pf7PX0qxmneZ7UDNfRiIlCE8AcVfn+4a5+CQpMpFdLIFksw2MZFQ0BieYPMbPFVrlsg0hl8uZuM496W5cFOBikMz/NaG7Rl61pTSG4tT0zWBeuROSKsWNzJJmJjnA61VhJ3Kk74ZmxWJdTl7iRlblSK6O5iUTOBwp7VzF0oS5lx3akGwxHWaaR1G07DuHrx/9esGUYnrReYwI8gGfaqlwgMiuOM84qmyWzTtZRE0eThQoyfwFdLFD5sduWI+0FFfnuMcA++K5i3Xe6R5xnAzW5qN08etlR0jWNR9NgpDTsacgKQKCuPnxk9Men1q3bsvnAqGAAICsuFBPA6Vb07y9Utvs0kYBh/eg44LYPJHrVFdPunm3rLEcEEDBGMH8aaVxlO5mEjELn6k9P8ADioA5A5yfqa110K5nmk3Swg56gGojo8xl2K0Y55OTz+lVe4rGaDUyyPuAz1qeXSpo1yXjJC5xyRVSFt+7tim2ItrLuz86hVOOQeDStM2SGIAAznBpF5GajffxkjrjimNokW5G0tyMjHyr/8AXrT066uTfecsxHljHmYIKg9uvHSsuCF5iyR7Ys9SpPNbemWuHbzHLjA4NIk0LdnhV5YnijPKq25skfnWdKTFctDLMoKnH3T/AI1otCkF4IzHG8ZKsVK96zb9t97JIAMltoyM4FADJAVcjzVT/ZzRUX2ff8zNyeaKAP/Z" + } + ] } diff --git a/电子展板/App.xaml.cs b/电子展板/App.xaml.cs index 25f5da0..fab1b46 100644 --- a/电子展板/App.xaml.cs +++ b/电子展板/App.xaml.cs @@ -1,8 +1,11 @@ using HandyControl.Collections; +using System; using System.Configuration; using System.Data; using System.Diagnostics; +using System.IO; using System.Windows; +using 电子展板.Utility.Extension; namespace 电子展板 { @@ -13,7 +16,8 @@ namespace 电子展板 { public App() { - } + + } } } diff --git a/电子展板/Assets/InitConfig.json b/电子展板/Assets/InitConfig.json new file mode 100644 index 0000000..21ec831 --- /dev/null +++ b/电子展板/Assets/InitConfig.json @@ -0,0 +1,30 @@ +{ + "Time": "10:00:00", /* 时间 */ + "TimeSize": 44, /* 时间字体大小 */ + "Charger": "刘华强", /* 负责人 */ + "ChargerSize": 44, /* 负责人字体大小 */ + "RiskLevel": "高", /* 风险等级 */ + "RiskLevelSize": 44, /* 风险等级字体大小 */ + "Content": "1、 负责组织项目开工前的准备工作,按照施工图总平面布置确定所建建筑物位置,复合定位、标高。安排临时道路铺设工作。参与工程技术管理,配合总工程师编制项目部施工生产计划;\r\n2、认真会审施工图纸,掌握设计意图,严格按图施工。在实际施工中,发现设计图纸不能满足实用要求时,要及时向领导报告,按规定办理设计变更手续", /* 工作内容 */ + "ContentSize": 35, /* 工作内容字体大小 */ + "DangerPoint": "高空作业的安全风险,化学品使用风险", /* 危险点 */ + "DangerPointSize": 35, /* 危险点字体大小 */ + "Measures": "1.佩戴个人防护装备:所有高空作业人员必须佩戴符合国家标准的安全帽、安全带、防滑鞋等个人防护装备,并定期检查这些设备的完好性;\r\n2.设置安全设施:在可能坠落的高度处安装安全网、护栏和踢脚板,以防止施工人员意外跌落,并避免小物件掉落伤人。\r\n3.进行安全技术交底:在施工前,必须进行针对性的书面安全交底,确保所有参与人员了解安全技术措施和个人防护要求。", /* 重点措施 */ + "MeasuresSize": 35, /* 重点措施字体大小 */ + "CPCMember1Path": "/upload/0.jpg", /* 党员1图片路径 */ + "CPCMember1Name": "张三", /* 党员1姓名 */ + "CPCMember2Path": "/upload/0.jpg", /* 党员2图片路径 */ + "CPCMember2Name": "李四", /* 党员2姓名 */ + "CPCMember3Path": "/upload/0.jpg", /* 党员3图片路径 */ + "CPCMember3Name": "王五", /* 党员3姓名 */ + "CPCMember4Path": "/upload/0.jpg", /* 党员4图片路径 */ + "CPCMember4Name": "赵六", /* 党员4姓名 */ + "CPCMemberSize": 35, /* 党员字体大小 */ + + "FileUploadList": [ + { + "Name": "0.jpg", + "Bin": "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" + } + ] +} diff --git a/电子展板/Base/GlobalVariable.cs b/电子展板/Base/GlobalVariable.cs index 275a9be..0605ff1 100644 --- a/电子展板/Base/GlobalVariable.cs +++ b/电子展板/Base/GlobalVariable.cs @@ -1,4 +1,5 @@ -using Nancy.Hosting.Self; +//using Nancy; +//using Nancy.Hosting.Self; using System; using System.Collections.Generic; using System.IO; @@ -13,7 +14,7 @@ namespace 电子展板.Base { public class GlobalVariable { - public static NancyHost WebServer; + //public static NancyHost WebServer; private static MyConfig _config; /// @@ -24,7 +25,38 @@ namespace 电子展板.Base get { if (_config == null) - _config = File.ReadAllText(MyEnvironment.Root("/Configs/Config.json")).ToObject(); + { + try + { + _config = File.ReadAllText(MyEnvironment.Root("/Config.json"), Encoding.UTF8).ToObject(); + //删除缓存没用到的图片 + List list = new List + { + _config.CPCMember1Path, + _config.CPCMember2Path, + _config.CPCMember3Path, + _config.CPCMember4Path + }; + list = list.Where(it => !it.IsNullOrEmpty()).Select(it => it.Replace("/upload/", "")).ToList(); + if (_config.FileUploadList == null) + _config.FileUploadList = new List(); + _config.FileUploadList = _config.FileUploadList.Where(it => list.Contains(it.Name)).ToList(); + File.WriteAllText(MyEnvironment.Root("/Config.json"), _config.ToJson(), Encoding.UTF8); + } + catch (Exception ex) + { + string packUri = $"pack://application:,,,/Assets/InitConfig.json"; + string json = ""; + using (Stream stream = System.Windows.Application.GetResourceStream(new Uri(packUri, UriKind.RelativeOrAbsolute)).Stream) + { + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + json = new StreamReader(stream, Encoding.UTF8).ReadToEnd(); + } + } + _config = json.ToObject(); + } + } return _config; } set @@ -35,7 +67,7 @@ namespace 电子展板.Base public static void SaveConfig() { - File.WriteAllText(MyEnvironment.Root("/Configs/Config.json"), Config.ToJson()); + File.WriteAllText(MyEnvironment.Root("/Config.json"), Config.ToJson(), Encoding.UTF8); } } } diff --git a/电子展板/FodyWeavers.xml b/电子展板/FodyWeavers.xml index b50d982..1a07c56 100644 --- a/电子展板/FodyWeavers.xml +++ b/电子展板/FodyWeavers.xml @@ -1,4 +1,4 @@  - - + + \ No newline at end of file diff --git a/电子展板/FodyWeavers.xsd b/电子展板/FodyWeavers.xsd index 69dbe48..408a212 100644 --- a/电子展板/FodyWeavers.xsd +++ b/电子展板/FodyWeavers.xsd @@ -53,6 +53,157 @@ + + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + Obsolete, use UnmanagedWinX86Assemblies instead + + + + + A list of unmanaged X86 (32 bit) assembly names to include, delimited with line breaks. + + + + + Obsolete, use UnmanagedWinX64Assemblies instead. + + + + + A list of unmanaged X64 (64 bit) assembly names to include, delimited with line breaks. + + + + + A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with line breaks. + + + + + The order of preloaded assemblies, delimited with line breaks. + + + + + + This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. + + + + + Controls if .pdbs for reference assemblies are also embedded. + + + + + Controls if runtime assemblies are also embedded. + + + + + Controls whether the runtime assemblies are embedded with their full path or only with their assembly name. + + + + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. + + + + + As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. + + + + + The attach method no longer subscribes to the `AppDomain.AssemblyResolve` (.NET 4.x) and `AssemblyLoadContext.Resolving` (.NET 6.0+) events. + + + + + Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. + + + + + Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + Obsolete, use UnmanagedWinX86Assemblies instead + + + + + A list of unmanaged X86 (32 bit) assembly names to include, delimited with |. + + + + + Obsolete, use UnmanagedWinX64Assemblies instead + + + + + A list of unmanaged X64 (64 bit) assembly names to include, delimited with |. + + + + + A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with |. + + + + + The order of preloaded assemblies, delimited with |. + + + + diff --git a/电子展板/Models/MyConfig.cs b/电子展板/Models/MyConfig.cs index 37d4dd7..8a397ee 100644 --- a/电子展板/Models/MyConfig.cs +++ b/电子展板/Models/MyConfig.cs @@ -1,7 +1,9 @@ using Nancy.Swagger.Annotations.Attributes; using System; +using System.Collections.Generic; using System.Linq; using System.Text; +using System.Windows.Documents; using 电子展板.Base; namespace 电子展板.Models @@ -118,51 +120,8 @@ namespace 电子展板.Models [Comment("党员字体大小")] [ModelProperty(Description = "党员字体大小", Required = true, Minimum = 15, Maximum = 60)] public int CPCMemberSize { get; set; } - /// - /// 转换成JSON字符串 - /// - /// - //public string ToJson() - //{ - // StringBuilder sb = new StringBuilder(); - // sb.AppendLine("{"); - // //得到所有的Property - // var properties = GetType().GetProperties(); - // for (int i = 0; i < properties.Length; i++) - // { - // var property = properties[i]; - // string endChar = ","; - // if (i == properties.Length - 1) - // { - // endChar = ""; - // } - // var comment = property.GetCustomAttributes(typeof(CommentAttribute), false).FirstOrDefault() as CommentAttribute; - // string commentText = ""; - // if (comment != null) - // { - // commentText = $" /* {comment.Comment} */"; - // } - // string propertyName = property.Name; - // var value = property.GetValue(this, null); - // if (value != null) - // { - // var valueType = value.GetType(); - // if (valueType == typeof(string)) - // { - // string value1 = (string)value; - // value1 = value1.Replace("\"", "\\\""); - // value1 = value1.Replace("\r\n", "\\r\\n"); - // sb.AppendLine($" \"{propertyName}\":\"{value1}\"{endChar}{commentText}"); - // } - // else - // { - // sb.AppendLine($" \"{propertyName}\":{value}{endChar}{commentText}"); - // } - // } - // } - // sb.AppendLine("}"); - // return sb.ToString(); - //} + + public List FileUploadList { get; set; } } diff --git a/电子展板/Models/UploadFiles.cs b/电子展板/Models/UploadFiles.cs new file mode 100644 index 0000000..7340fbb --- /dev/null +++ b/电子展板/Models/UploadFiles.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace 电子展板.Models +{ + public class UploadFiles + { + public string Name { get; set; } + public byte[] Bin { get; set; } + } +} diff --git a/电子展板/Upload/0.jpg b/电子展板/Upload/0.jpg deleted file mode 100644 index f0d33da235fe44f2deaa678e19ebdbd64e97f5d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37146 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 diff --git a/电子展板/Utility/ByteArrayStream.cs b/电子展板/Utility/ByteArrayStream.cs new file mode 100644 index 0000000..2fc2276 --- /dev/null +++ b/电子展板/Utility/ByteArrayStream.cs @@ -0,0 +1,928 @@ +using System; +using System.IO; +using System.Text; + +namespace 电子展板.Utility +{ + public class ByteArrayStream : Stream + { + private byte[] _buffer; + private int _position; + private int _length; + private int _capacity; + private Encoding _defaultEncoding = Encoding.UTF8; + + // 默认编码方式(用于字符串读写) + public Encoding DefaultEncoding + { + get => _defaultEncoding; + set => _defaultEncoding = value ?? throw new ArgumentNullException(nameof(value)); + } + + // 构造函数:创建指定初始容量的流 + public ByteArrayStream(int initialCapacity = 4096) + { + if (initialCapacity < 0) + throw new ArgumentOutOfRangeException(nameof(initialCapacity)); + + _capacity = initialCapacity; + _buffer = new byte[initialCapacity]; + _position = 0; + _length = 0; + } + + // 构造函数:从现有字节数组创建流 + public ByteArrayStream(byte[] buffer) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + _buffer = buffer; + _capacity = buffer.Length; + _length = buffer.Length; + _position = 0; + } + + // 指示当前流是否支持读取 + public override bool CanRead => true; + + // 指示当前流是否支持查找 + public override bool CanSeek => true; + + // 指示当前流是否支持写入 + public override bool CanWrite => true; + + // 获取流的长度 + public override long Length => _length; + + // 获取或设置当前流中的位置 + public override long Position + { + get => _position; + set + { + if (value < 0 || value > _length) + throw new ArgumentOutOfRangeException(nameof(value)); + _position = (int)value; + } + } + + // 确保有足够的容量 + private void EnsureCapacity(int required) + { + if (required <= _capacity) return; + + // 每次扩容为当前容量的2倍或所需容量(取较大值) + int newCapacity = Math.Max(_capacity * 2, required); + byte[] newBuffer = new byte[newCapacity]; + Array.Copy(_buffer, newBuffer, _length); + _buffer = newBuffer; + _capacity = newCapacity; + } + + public override void Flush() + { + // 内存流无需实际刷新 + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + if (offset < 0) + throw new ArgumentOutOfRangeException(nameof(offset)); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof(count)); + if (offset + count > buffer.Length) + throw new ArgumentException("偏移量和计数的总和超过缓冲区长度"); + + int bytesToRead = Math.Min(count, _length - _position); + if (bytesToRead > 0) + { + Array.Copy(_buffer, _position, buffer, offset, bytesToRead); + _position += bytesToRead; + } + return bytesToRead; + } + + public override long Seek(long offset, SeekOrigin origin) + { + long newPosition; + switch (origin) + { + case SeekOrigin.Begin: + newPosition = offset; + break; + case SeekOrigin.Current: + newPosition = _position + offset; + break; + case SeekOrigin.End: + newPosition = _length + offset; + break; + default: + throw new ArgumentOutOfRangeException(nameof(origin)); + } + + if (newPosition < 0 || newPosition > _length) + throw new IOException("seek 位置无效"); + + _position = (int)newPosition; + return _position; + } + + public override void SetLength(long value) + { + if (value < 0 || value > int.MaxValue) + throw new ArgumentOutOfRangeException(nameof(value)); + + int newLength = (int)value; + EnsureCapacity(newLength); + _length = newLength; + + if (_position > newLength) + _position = newLength; + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + if (offset < 0) + throw new ArgumentOutOfRangeException(nameof(offset)); + if (count < 0) + throw new ArgumentOutOfRangeException(nameof(count)); + if (offset + count > buffer.Length) + throw new ArgumentException("偏移量和计数的总和超过缓冲区长度"); + + if (count == 0) return; + + int newPosition = _position + count; + if (newPosition > _length) + { + EnsureCapacity(newPosition); + _length = newPosition; + } + + Array.Copy(buffer, offset, _buffer, _position, count); + _position = newPosition; + } + + #region 基础数据类型读写方法 - 完整实现 + + /// + /// 读取一个字节 + /// + public new byte ReadByte() + { + if (_position >= _length) + throw new EndOfStreamException("已到达流的末尾"); + + return _buffer[_position++]; + } + + /// + /// 写入一个字节 + /// + public new void WriteByte(byte value) + { + EnsureCapacity(_position + 1); + + if (_position == _length) + _length++; + + _buffer[_position++] = value; + } + + /// + /// 读取16位有符号整数(小端字节序) + /// + public short ReadInt16() + { + return ReadInt16(Endianness.LittleEndian); + } + + /// + /// 读取16位有符号整数 + /// + public short ReadInt16(Endianness endianness) + { + byte[] bytes = ReadBytes(2); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToInt16(bytes, 0); + } + + /// + /// 写入16位有符号整数(小端字节序) + /// + public void WriteInt16(short value) + { + WriteInt16(value, Endianness.LittleEndian); + } + + /// + /// 写入16位有符号整数 + /// + public void WriteInt16(short value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取16位无符号整数(小端字节序) + /// + public ushort ReadUInt16() + { + return ReadUInt16(Endianness.LittleEndian); + } + + /// + /// 读取16位无符号整数 + /// + public ushort ReadUInt16(Endianness endianness) + { + byte[] bytes = ReadBytes(2); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToUInt16(bytes, 0); + } + + /// + /// 写入16位无符号整数(小端字节序) + /// + public void WriteUInt16(ushort value) + { + WriteUInt16(value, Endianness.LittleEndian); + } + + /// + /// 写入16位无符号整数 + /// + public void WriteUInt16(ushort value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取32位有符号整数(小端字节序) + /// + public int ReadInt32() + { + return ReadInt32(Endianness.LittleEndian); + } + + /// + /// 读取32位有符号整数 + /// + public int ReadInt32(Endianness endianness) + { + byte[] bytes = ReadBytes(4); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToInt32(bytes, 0); + } + + /// + /// 写入32位有符号整数(小端字节序) + /// + public void WriteInt32(int value) + { + WriteInt32(value, Endianness.LittleEndian); + } + + /// + /// 写入32位有符号整数 + /// + public void WriteInt32(int value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取32位无符号整数(小端字节序) + /// + public uint ReadUInt32() + { + return ReadUInt32(Endianness.LittleEndian); + } + + /// + /// 读取32位无符号整数 + /// + public uint ReadUInt32(Endianness endianness) + { + byte[] bytes = ReadBytes(4); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToUInt32(bytes, 0); + } + + /// + /// 写入32位无符号整数(小端字节序) + /// + public void WriteUInt32(uint value) + { + WriteUInt32(value, Endianness.LittleEndian); + } + + /// + /// 写入32位无符号整数 + /// + public void WriteUInt32(uint value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取64位有符号整数(小端字节序) + /// + public long ReadInt64() + { + return ReadInt64(Endianness.LittleEndian); + } + + /// + /// 读取64位有符号整数 + /// + public long ReadInt64(Endianness endianness) + { + byte[] bytes = ReadBytes(8); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToInt64(bytes, 0); + } + + /// + /// 写入64位有符号整数(小端字节序) + /// + public void WriteInt64(long value) + { + WriteInt64(value, Endianness.LittleEndian); + } + + /// + /// 写入64位有符号整数 + /// + public void WriteInt64(long value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取64位无符号整数(小端字节序) + /// + public ulong ReadUInt64() + { + return ReadUInt64(Endianness.LittleEndian); + } + + /// + /// 读取64位无符号整数 + /// + public ulong ReadUInt64(Endianness endianness) + { + byte[] bytes = ReadBytes(8); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToUInt64(bytes, 0); + } + + /// + /// 写入64位无符号整数(小端字节序) + /// + public void WriteUInt64(ulong value) + { + WriteUInt64(value, Endianness.LittleEndian); + } + + /// + /// 写入64位无符号整数 + /// + public void WriteUInt64(ulong value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取单精度浮点数(小端字节序) + /// + public float ReadFloat() + { + return ReadFloat(Endianness.LittleEndian); + } + + /// + /// 读取单精度浮点数 + /// + public float ReadFloat(Endianness endianness) + { + byte[] bytes = ReadBytes(4); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToSingle(bytes, 0); + } + + /// + /// 写入单精度浮点数(小端字节序) + /// + public void WriteFloat(float value) + { + WriteFloat(value, Endianness.LittleEndian); + } + + /// + /// 写入单精度浮点数 + /// + public void WriteFloat(float value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取双精度浮点数(小端字节序) + /// + public double ReadDouble() + { + return ReadDouble(Endianness.LittleEndian); + } + + /// + /// 读取双精度浮点数 + /// + public double ReadDouble(Endianness endianness) + { + byte[] bytes = ReadBytes(8); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToDouble(bytes, 0); + } + + /// + /// 写入双精度浮点数(小端字节序) + /// + public void WriteDouble(double value) + { + WriteDouble(value, Endianness.LittleEndian); + } + + /// + /// 写入双精度浮点数 + /// + public void WriteDouble(double value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取布尔值(1字节,0表示false,非0表示true) + /// + public bool ReadBoolean() + { + return ReadByte() != 0; + } + + /// + /// 写入布尔值(1字节,0表示false,1表示true) + /// + public void WriteBoolean(bool value) + { + WriteByte(value ? (byte)1 : (byte)0); + } + + /// + /// 读取字符(小端字节序) + /// + public char ReadChar() + { + return ReadChar(Endianness.LittleEndian); + } + + /// + /// 读取字符 + /// + public char ReadChar(Endianness endianness) + { + byte[] bytes = ReadBytes(2); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + return BitConverter.ToChar(bytes, 0); + } + + /// + /// 写入字符(小端字节序) + /// + public void WriteChar(char value) + { + WriteChar(value, Endianness.LittleEndian); + } + + /// + /// 写入字符 + /// + public void WriteChar(char value, Endianness endianness) + { + byte[] bytes = BitConverter.GetBytes(value); + if (NeedReverse(endianness)) + Array.Reverse(bytes); + + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取十进制数(小端字节序) + /// + public decimal ReadDecimal() + { + return ReadDecimal(Endianness.LittleEndian); + } + + /// + /// 读取十进制数 + /// + public decimal ReadDecimal(Endianness endianness) + { + int[] bits = new int[4]; + for (int i = 0; i < 4; i++) + { + bits[i] = ReadInt32(endianness); + } + return new decimal(bits); + } + + /// + /// 写入十进制数(小端字节序) + /// + public void WriteDecimal(decimal value) + { + WriteDecimal(value, Endianness.LittleEndian); + } + + /// + /// 写入十进制数 + /// + public void WriteDecimal(decimal value, Endianness endianness) + { + int[] bits = decimal.GetBits(value); + foreach (int bit in bits) + { + WriteInt32(bit, endianness); + } + } + + /// + /// 读取指定长度的字节数组 + /// + public byte[] ReadBytes(int count) + { + if (count < 0) + throw new ArgumentOutOfRangeException(nameof(count)); + if (_position + count > _length) + throw new EndOfStreamException("没有足够的字节可供读取"); + + byte[] result = new byte[count]; + Array.Copy(_buffer, _position, result, 0, count); + _position += count; + return result; + } + + #endregion + + #region 字符串读写方法 + + /// + /// 读取以null结尾的字符串(C风格字符串) + /// + public string ReadNullTerminatedString() + { + return ReadNullTerminatedString(DefaultEncoding); + } + + /// + /// 读取以null结尾的字符串(C风格字符串) + /// + public string ReadNullTerminatedString(Encoding encoding) + { + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + + int startPos = _position; + + // 查找null终止符 + while (_position < _length && _buffer[_position] != 0) + { + _position++; + } + + int byteCount = _position - startPos; + string result = encoding.GetString(_buffer, startPos, byteCount); + + // 跳过null终止符 + if (_position < _length) + { + _position++; + } + + return result; + } + + /// + /// 写入以null结尾的字符串(C风格字符串) + /// + public void WriteNullTerminatedString(string value) + { + WriteNullTerminatedString(value, DefaultEncoding); + } + + /// + /// 写入以null结尾的字符串(C风格字符串) + /// + public void WriteNullTerminatedString(string value, Encoding encoding) + { + if (value == null) + throw new ArgumentNullException(nameof(value)); + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + + byte[] bytes = encoding.GetBytes(value); + Write(bytes, 0, bytes.Length); + WriteByte(0); // 写入null终止符 + } + + /// + /// 读取前缀长度的字符串(先读取长度,再读取内容) + /// 使用Int32作为长度前缀 + /// + public string ReadLengthPrefixedString() + { + return ReadLengthPrefixedString(DefaultEncoding, Endianness.LittleEndian); + } + + /// + /// 读取前缀长度的字符串(先读取长度,再读取内容) + /// 使用Int32作为长度前缀 + /// + public string ReadLengthPrefixedString(Encoding encoding, Endianness endianness) + { + return ReadLengthPrefixedString(encoding, endianness); + } + + /// + /// 读取前缀长度的字符串(先读取长度,再读取内容) + /// 支持指定长度类型(Int16, Int32, Int64等) + /// + public string ReadLengthPrefixedString(Encoding encoding, Endianness endianness) + where TLength : struct, IConvertible + { + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + + // 读取长度前缀 + TLength lengthValue = Read(endianness); + int length = Convert.ToInt32(lengthValue); + + if (length < 0) + throw new IOException("字符串长度不能为负数"); + + byte[] bytes = ReadBytes(length); + return encoding.GetString(bytes); + } + + /// + /// 写入前缀长度的字符串(先写入长度,再写入内容) + /// 使用Int32作为长度前缀 + /// + public void WriteLengthPrefixedString(string value) + { + WriteLengthPrefixedString(value, DefaultEncoding, Endianness.LittleEndian); + } + + /// + /// 写入前缀长度的字符串(先写入长度,再写入内容) + /// 使用Int32作为长度前缀 + /// + public void WriteLengthPrefixedString(string value, Encoding encoding, Endianness endianness) + { + WriteLengthPrefixedString(value, encoding, endianness); + } + + /// + /// 写入前缀长度的字符串(先写入长度,再写入内容) + /// 支持指定长度类型(Int16, Int32, Int64等) + /// + public void WriteLengthPrefixedString(string value, Encoding encoding, Endianness endianness) + where TLength : struct, IConvertible + { + if (value == null) + throw new ArgumentNullException(nameof(value)); + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + + byte[] bytes = encoding.GetBytes(value); + + // 检查长度是否在指定类型范围内 + TLength lengthValue = (TLength)Convert.ChangeType(bytes.Length, typeof(TLength)); + + // 写入长度前缀和字符串内容 + Write(lengthValue, endianness); + Write(bytes, 0, bytes.Length); + } + + /// + /// 读取固定长度的字符串 + /// + public string ReadFixedLengthString(int byteCount) + { + return ReadFixedLengthString(byteCount, DefaultEncoding); + } + + /// + /// 读取固定长度的字符串 + /// + public string ReadFixedLengthString(int byteCount, Encoding encoding) + { + if (byteCount < 0) + throw new ArgumentOutOfRangeException(nameof(byteCount)); + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + + byte[] bytes = ReadBytes(byteCount); + return encoding.GetString(bytes); + } + + /// + /// 写入固定长度的字符串,不足则填充,超出则截断 + /// + public void WriteFixedLengthString(string value, int byteCount) + { + WriteFixedLengthString(value, byteCount, DefaultEncoding, (byte)0); + } + + /// + /// 写入固定长度的字符串,不足则填充,超出则截断 + /// + public void WriteFixedLengthString(string value, int byteCount, Encoding encoding, byte paddingByte) + { + if (byteCount < 0) + throw new ArgumentOutOfRangeException(nameof(byteCount)); + if (encoding == null) + throw new ArgumentNullException(nameof(encoding)); + if (value == null) + value = string.Empty; + + // 获取字符串的字节表示 + byte[] originalBytes = encoding.GetBytes(value); + + // 创建目标字节数组 + byte[] targetBytes = new byte[byteCount]; + + if (paddingByte != 0) + { + // // 填充默认值 + for (int i = 0; i < byteCount; i++) + targetBytes[i] = paddingByte; + } + // 复制字节,超出部分截断 + int copyLength = Math.Min(originalBytes.Length, byteCount); + Array.Copy(originalBytes, targetBytes, copyLength); + + Write(targetBytes, 0, targetBytes.Length); + } + + #endregion + + #region 泛型读写方法 + + /// + /// 泛型读取方法(小端字节序) + /// + public T Read() where T : struct + { + return Read(Endianness.LittleEndian); + } + + /// + /// 泛型读取方法 + /// + public T Read(Endianness endianness) where T : struct + { + Type type = typeof(T); + + if (type == typeof(byte)) return (T)(object)ReadByte(); + if (type == typeof(short)) return (T)(object)ReadInt16(endianness); + if (type == typeof(ushort)) return (T)(object)ReadUInt16(endianness); + if (type == typeof(int)) return (T)(object)ReadInt32(endianness); + if (type == typeof(uint)) return (T)(object)ReadUInt32(endianness); + if (type == typeof(long)) return (T)(object)ReadInt64(endianness); + if (type == typeof(ulong)) return (T)(object)ReadUInt64(endianness); + if (type == typeof(float)) return (T)(object)ReadFloat(endianness); + if (type == typeof(double)) return (T)(object)ReadDouble(endianness); + if (type == typeof(bool)) return (T)(object)ReadBoolean(); + if (type == typeof(char)) return (T)(object)ReadChar(endianness); + if (type == typeof(decimal)) return (T)(object)ReadDecimal(endianness); + + throw new NotSupportedException($"不支持的类型: {type.Name}"); + } + + /// + /// 泛型写入方法(小端字节序) + /// + public void Write(T value) where T : struct + { + Write(value, Endianness.LittleEndian); + } + + /// + /// 泛型写入方法 + /// + public void Write(T value, Endianness endianness) where T : struct + { + Type type = typeof(T); + + if (type == typeof(byte)) { WriteByte((byte)(object)value); return; } + if (type == typeof(short)) { WriteInt16((short)(object)value, endianness); return; } + if (type == typeof(ushort)) { WriteUInt16((ushort)(object)value, endianness); return; } + if (type == typeof(int)) { WriteInt32((int)(object)value, endianness); return; } + if (type == typeof(uint)) { WriteUInt32((uint)(object)value, endianness); return; } + if (type == typeof(long)) { WriteInt64((long)(object)value, endianness); return; } + if (type == typeof(ulong)) { WriteUInt64((ulong)(object)value, endianness); return; } + if (type == typeof(float)) { WriteFloat((float)(object)value, endianness); return; } + if (type == typeof(double)) { WriteDouble((double)(object)value, endianness); return; } + if (type == typeof(bool)) { WriteBoolean((bool)(object)value); return; } + if (type == typeof(char)) { WriteChar((char)(object)value, endianness); return; } + if (type == typeof(decimal)) { WriteDecimal((decimal)(object)value, endianness); return; } + + throw new NotSupportedException($"不支持的类型: {type.Name}"); + } + + #endregion + + /// + /// 将流内容转换为字节数组 + /// + public byte[] ToByteArray() + { + byte[] result = new byte[_length]; + Array.Copy(_buffer, result, _length); + return result; + } + + /// + /// 辅助方法:判断是否需要反转字节顺序 + /// + private bool NeedReverse(Endianness endianness) + { + return (endianness == Endianness.BigEndian && BitConverter.IsLittleEndian) || + (endianness == Endianness.LittleEndian && !BitConverter.IsLittleEndian); + } + } + + /// + /// 字节序枚举 + /// + public enum Endianness + { + LittleEndian, // 小端字节序 + BigEndian // 大端字节序 + } +} \ No newline at end of file diff --git a/电子展板/Utility/Logs/LogHelper.cs b/电子展板/Utility/Logs/LogHelper.cs index c7430ef..03fe8e8 100644 --- a/电子展板/Utility/Logs/LogHelper.cs +++ b/电子展板/Utility/Logs/LogHelper.cs @@ -1,94 +1,94 @@ -using NLog; -using NLog.Config; +//using NLog; +//using NLog.Config; using System; using 电子展板.Utility.Extension; namespace 电子展板.Utility.Logs { - public class LogHelper - { - private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + //public class LogHelper + //{ + // private readonly Logger _logger = LogManager.GetCurrentClassLogger(); - private static LogHelper _obj; + // private static LogHelper _obj; - private LogHelper() - { - LogManager.Configuration = new XmlLoggingConfiguration(MyEnvironment.Root("/Configs/NLog.config")); - } - public static LogHelper Instance => _obj ?? (new LogHelper()); + // private LogHelper() + // { + // LogManager.Configuration = new XmlLoggingConfiguration(MyEnvironment.Root("/Configs/NLog.config")); + // } + // public static LogHelper Instance => _obj ?? (new LogHelper()); - #region Debug,调试 - public void Debug(string msg) - { - _logger.Debug(msg); - } + // #region Debug,调试 + // public void Debug(string msg) + // { + // _logger.Debug(msg); + // } - public void Debug(string msg, Exception err) - { - _logger.Debug(err, msg); - } - #endregion + // public void Debug(string msg, Exception err) + // { + // _logger.Debug(err, msg); + // } + // #endregion - #region Info,信息 - public void Info(string msg) - { - _logger.Info(msg); - } + // #region Info,信息 + // public void Info(string msg) + // { + // _logger.Info(msg); + // } - public void Info(string msg, Exception err) - { - _logger.Info(err, msg); - } - #endregion + // public void Info(string msg, Exception err) + // { + // _logger.Info(err, msg); + // } + // #endregion - #region Warn,警告 - public void Warn(string msg) - { - _logger.Warn(msg); - } + // #region Warn,警告 + // public void Warn(string msg) + // { + // _logger.Warn(msg); + // } - public void Warn(string msg, Exception err) - { - _logger.Warn(err, msg); - } - #endregion + // public void Warn(string msg, Exception err) + // { + // _logger.Warn(err, msg); + // } + // #endregion - #region Trace,追踪 - public void Trace(string msg) - { - _logger.Trace(msg); - } + // #region Trace,追踪 + // public void Trace(string msg) + // { + // _logger.Trace(msg); + // } - public void Trace(string msg, Exception err) - { - _logger.Trace(err, msg); - } - #endregion + // public void Trace(string msg, Exception err) + // { + // _logger.Trace(err, msg); + // } + // #endregion - #region Error,错误 - public void Error(string msg) - { - _logger.Error(msg); - } + // #region Error,错误 + // public void Error(string msg) + // { + // _logger.Error(msg); + // } - public void Error(string msg, Exception err) - { - _logger.Error(err, msg); - } - #endregion + // public void Error(string msg, Exception err) + // { + // _logger.Error(err, msg); + // } + // #endregion - #region Fatal,致命错误 - public void Fatal(string msg) - { - _logger.Fatal(msg); - } + // #region Fatal,致命错误 + // public void Fatal(string msg) + // { + // _logger.Fatal(msg); + // } - public void Fatal(string msg, Exception err) - { - _logger.Fatal(err, msg); - } - #endregion - } + // public void Fatal(string msg, Exception err) + // { + // _logger.Fatal(err, msg); + // } + // #endregion + //} } \ No newline at end of file diff --git a/电子展板/Utility/Web/WithExtensionMultipartFormDataStreamProvider.cs b/电子展板/Utility/Web/WithExtensionMultipartFormDataStreamProvider.cs new file mode 100644 index 0000000..39d0da9 --- /dev/null +++ b/电子展板/Utility/Web/WithExtensionMultipartFormDataStreamProvider.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace 电子展板.Utility.Web +{ + public class WithExtensionMultipartFormDataStreamProvider : MultipartFormDataStreamProvider + { + public string guid { get; set; } + public string OriginalName { get; set; } + public string Ext { get; set; } + + public WithExtensionMultipartFormDataStreamProvider(string rootPath, string guidStr) : base(rootPath) + { + guid = guidStr; + } + + public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers) + { + OriginalName = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? GetValidFileName(headers.ContentDisposition.FileName) : ""; + Ext = !string.IsNullOrWhiteSpace(OriginalName) ? Path.GetExtension(GetValidFileName(OriginalName)) : ""; + return guid + Ext; + } + + private string GetValidFileName(string filePath) + { + char[] invalids = System.IO.Path.GetInvalidFileNameChars(); + return string.Join("_", filePath.Split(invalids, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'); + } + + } +} diff --git a/电子展板/ViewModels/MainWindowViewModel.cs b/电子展板/ViewModels/MainWindowViewModel.cs index 6d50fca..d827100 100644 --- a/电子展板/ViewModels/MainWindowViewModel.cs +++ b/电子展板/ViewModels/MainWindowViewModel.cs @@ -1,19 +1,20 @@ -using Nancy; -using Nancy.Hosting.Self; -using Nancy.Json; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using System.Windows.Media; using System.Windows.Media.Imaging; +using System.Windows.Shapes; using 电子展板.Base; +using 电子展板.Models; using 电子展板.Utility; +using 电子展板.Utility.Core; using 电子展板.Utility.Extension; namespace 电子展板.ViewModels @@ -28,7 +29,7 @@ namespace 电子展板.ViewModels public DelegateCommand LoadedCommand { get; set; } public DelegateCommand WindowClosingCommand { get; set; } public MainWindowViewModel() - { + { LoadedCommand = new DelegateCommand(Loaded); WindowClosingCommand = new DelegateCommand(WindowClosing); EventBus.Instance.Subscribe(this, "save", ReloadImage); @@ -43,15 +44,18 @@ namespace 电子展板.ViewModels this.window.Top = (int)(Screen.AllScreens[screenIndex].Bounds.Top / GetDpiScaleX()); this.window.Width = (int)(Screen.AllScreens[screenIndex].Bounds.Width / GetDpiScaleX()); this.window.Height = (int)(Screen.AllScreens[screenIndex].Bounds.Height / GetDpiScaleX()); - GlobalVariable.WebServer = new NancyHost(new Uri("http://localhost:80")); - GlobalVariable.WebServer.Start(); + + WebServer.Start(); + //GlobalVariable.WebServer = new NancyHost(new Uri("http://localhost:80")); + //GlobalVariable.WebServer.Start(); } private void WindowClosing(CancelEventArgs args) { - GlobalVariable.WebServer?.Stop(); - GlobalVariable.WebServer?.Dispose(); - GlobalVariable.WebServer = null; + WebServer.Stop(); + //GlobalVariable.WebServer?.Stop(); + //GlobalVariable.WebServer?.Dispose(); + //GlobalVariable.WebServer = null; Environment.Exit(0); } public double GetDpiScaleX() @@ -70,62 +74,32 @@ namespace 电子展板.ViewModels private void InitImage() { - try - { - BitmapImage image1 = new BitmapImage(); - image1.BeginInit(); - image1.CacheOption = BitmapCacheOption.OnLoad; - image1.StreamSource = new MemoryStream(File.ReadAllBytes(MyEnvironment.Root(Config.CPCMember1Path))); - image1.EndInit(); - image1.Freeze(); - Image1 = image1; - } - catch (Exception ex) - { - Image1 = null; - } - try - { - BitmapImage image2 = new BitmapImage(); - image2.BeginInit(); - image2.CacheOption = BitmapCacheOption.OnLoad; - image2.StreamSource = new MemoryStream(File.ReadAllBytes(MyEnvironment.Root(Config.CPCMember2Path))); - image2.EndInit(); - image2.Freeze(); - Image2 = image2; - } - catch (Exception ex) - { - Image2 = null; + Image1 = GetImage(Config.CPCMember1Path); + Image2 = GetImage(Config.CPCMember2Path); + Image3 = GetImage(Config.CPCMember3Path); + Image4 = GetImage(Config.CPCMember4Path); + } - } + private ImageSource GetImage(string path) + { try { - BitmapImage image3 = new BitmapImage(); - image3.BeginInit(); - image3.CacheOption = BitmapCacheOption.OnLoad; - image3.StreamSource = new MemoryStream(File.ReadAllBytes(MyEnvironment.Root(Config.CPCMember3Path))); - image3.EndInit(); - image3.Freeze(); - Image3 = image3; + if (path.IsNullOrEmpty()) + return null; + UploadFiles uploadFiles = GlobalVariable.Config.FileUploadList.FirstOrDefault(x => path.EndsWith(x.Name)); + if (uploadFiles == null) + return null; + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.CacheOption = BitmapCacheOption.OnLoad; + image.StreamSource = new ByteArrayStream(uploadFiles.Bin); + image.EndInit(); + image.Freeze(); + return image; } catch (Exception ex) { - Image3 = null; - } - try - { - BitmapImage image4 = new BitmapImage(); - image4.BeginInit(); - image4.CacheOption = BitmapCacheOption.OnLoad; - image4.StreamSource = new MemoryStream(File.ReadAllBytes(MyEnvironment.Root(Config.CPCMember4Path))); - image4.EndInit(); - image4.Freeze(); - Image4 = image4; - } - catch (Exception ex) - { - Image4 = null; + return null; } } } diff --git a/电子展板/WebModule/HomeModule.cs b/电子展板/WebModule/HomeModule.cs index 5850323..edd87e0 100644 --- a/电子展板/WebModule/HomeModule.cs +++ b/电子展板/WebModule/HomeModule.cs @@ -6,6 +6,7 @@ using Swagger.ObjectModel; using System; using System.Collections.Generic; using System.IO; +using System.IO.Pipes; using System.Linq; using System.Reflection; using 电子展板.Base; @@ -100,7 +101,11 @@ namespace 电子展板.WebModule private object GetUploadFiles(string id) { string contentType = MimeTypes.GetMimeType(id); - return Response.AsFile(MyEnvironment.Root("/Upload/" + id), contentType); + //return Response.AsFile(MyEnvironment.Root("/Upload/" + id), contentType); + UploadFiles uploadFiles = GlobalVariable.Config.FileUploadList.FirstOrDefault(x => x.Name == id); + if (uploadFiles == null) + return null; + return Response.FromStream(new MemoryStream(uploadFiles.Bin), contentType); } /// @@ -120,14 +125,21 @@ namespace 电子展板.WebModule { Directory.CreateDirectory(uploadPath); } - string ext = Path.GetExtension(file.Name); string fileName = UUID.StrSnowId + ext; - var filePath = uploadPath + fileName; - using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) - { - file.Value.CopyTo(fileStream); - } + + //var filePath = uploadPath + fileName; + //using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) + //{ + // file.Value.CopyTo(fileStream); + //} + + + ByteArrayStream stream = new ByteArrayStream(); + file.Value.CopyTo(stream); + byte[] data = stream.ToByteArray(); + GlobalVariable.Config.FileUploadList.Add(new UploadFiles { Name = fileName, Bin = data }); + GlobalVariable.SaveConfig(); RetValue result = new RetValue { state = 1, message = "上传成功", data = $"/upload/{fileName}" }; return Response.AsJson(result); } @@ -140,11 +152,14 @@ namespace 电子展板.WebModule [Route(Tags = new[] { "保存配置" })] private object SaveConfig([RouteParam(ParamIn = ParameterIn.Body, Name = "parms", Description = "保存参数", Required = true)] MyConfig config) { - LogHelper.Instance.Info($"用户保存了配置:{JsonHelper.ToJson(config)}"); //保存 PropertyInfo[] propertyInfos = typeof(MyConfig).GetProperties(); foreach (PropertyInfo propertyInfo in propertyInfos) { + if (propertyInfo.Name == "FileUploadList") + { + continue; + } object value = propertyInfo.GetValue(config); propertyInfo.SetValue(GlobalVariable.Config, value); } diff --git a/电子展板/WebModule/IndexController.cs b/电子展板/WebModule/IndexController.cs new file mode 100644 index 0000000..65cb7a2 --- /dev/null +++ b/电子展板/WebModule/IndexController.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Reflection; +using System.Text; +using System.Web; +using System.Web.Http; +using 电子展板.Base; +using 电子展板.Models; +using 电子展板.Utility; +using 电子展板.Utility.Core; +using 电子展板.Utility.Other; +using 电子展板.Utility.Web; +using static System.Net.Mime.MediaTypeNames; + +namespace 电子展板.WebModule +{ + public class IndexController : ApiController + { + /// 主界面 + /// + /// + [HttpGet, Route(""), Route("index.html")] + public ActionResult Index() + { + return Resouce("/Views/Index.html", "text/html"); + } + + /// + /// 获得配置信息 + /// + /// + [HttpGet, Route("getConfig")] + public ActionResult GetConfig() + { + return Json(GlobalVariable.Config); + } + /// + /// 上传图片。 + /// + /// + [HttpPost, Route("uploadImage")] + public ActionResult UploadImage() + { + if (!Request.Content.IsMimeMultipartContent()) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + string tempPath = Path.GetTempPath(); + var provider = new WithExtensionMultipartFormDataStreamProvider(tempPath, UUID.StrSnowId); + var fileData = Request.Content.ReadAsMultipartAsync(provider).Result; + if (fileData.FileData.Count == 0) + { + return Error(); + } + var file = fileData.FileData[0]; + byte[] data = null; + using (ByteArrayStream byteArrayStream = new ByteArrayStream()) + { + using (var stream = System.IO.File.OpenRead(file.LocalFileName)) + { + stream.CopyTo(byteArrayStream); + } + System.IO.File.Delete(file.LocalFileName); + data = byteArrayStream.ToByteArray(); + } + string filename = Path.GetFileName(file.LocalFileName); + GlobalVariable.Config.FileUploadList.Add(new UploadFiles { Name = filename, Bin = data }); + GlobalVariable.SaveConfig(); + + string virtualPath = "/upload/" + filename; + return Success("上传成功", virtualPath); + } + + /// + /// 图形显示 + /// + /// + /// + [HttpGet, Route("upload/{id}")] + public ActionResult GetUploadFile([FromUri] string id) + { + string contentType = System.Web.MimeMapping.GetMimeMapping(id); + UploadFiles uploadFiles = GlobalVariable.Config.FileUploadList.FirstOrDefault(x => x.Name == id); + if (uploadFiles == null) + return null; + return File(uploadFiles.Bin, id, contentType); + } + + /// + /// 保存配置文件 + /// + /// + /// + [HttpPost, Route("save")] + public ActionResult Save([FromBody] MyConfig config) + { + //保存 + PropertyInfo[] propertyInfos = typeof(MyConfig).GetProperties(); + foreach (PropertyInfo propertyInfo in propertyInfos) + { + if (propertyInfo.Name == "FileUploadList") + { + continue; + } + object value = propertyInfo.GetValue(config); + propertyInfo.SetValue(GlobalVariable.Config, value); + } + GlobalVariable.SaveConfig(); + //保存并修改界面 + EventBus.Instance.Publish("save", ""); + return Success(); + } + + + + private ActionResult File(byte[] bytes, string name, string contentType) + { + ActionResult response = new ActionResult(HttpStatusCode.OK); + response.Content = new StreamContent(new MemoryStream(bytes)); + response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + response.Content.Headers.ContentLength = bytes.Length; + response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") + { + FileName = HttpUtility.UrlEncode(name) + }; + response.Headers.Add("Access-Control-Expose-Headers", "FileName"); + response.Headers.Add("FileName", HttpUtility.UrlEncode(name)); + return response; + } + + + private ActionResult Json(object obj) + { + return new ActionResult { Content = new StringContent(obj.ToJson(), Encoding.UTF8, "application/json") }; + } + + public ActionResult Resouce(string viewName, string contentType) + { + string packUri = $"pack://application:,,,/Assets{viewName}"; + byte[] bytes = null; + using (Stream stream = System.Windows.Application.GetResourceStream(new Uri(packUri, UriKind.RelativeOrAbsolute)).Stream) + { + bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + } + ActionResult response = new ActionResult(HttpStatusCode.OK); + response.Content = new ByteArrayContent(bytes); + response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + response.Content.Headers.ContentLength = bytes.Length; + return response; + } + + protected ActionResult Success(string message = "恭喜您,操作成功。", object data = null) + { + return Json(new { state = 1, message, data }); + } + + protected ActionResult Error(string message = "对不起,操作失败。", object data = null) + { + return Json(new { state = 2, message, data }); + } + } + + + public class ActionResult : System.Net.Http.HttpResponseMessage + { + public ActionResult() : base(HttpStatusCode.OK) + { + + } + public ActionResult(HttpStatusCode statusCode) : base(statusCode) + { + } + } +} diff --git a/电子展板/WebServer.cs b/电子展板/WebServer.cs new file mode 100644 index 0000000..d16bbd4 --- /dev/null +++ b/电子展板/WebServer.cs @@ -0,0 +1,120 @@ +using Microsoft.Owin; +using Microsoft.Owin.Hosting; +using Nancy.Hosting.Self; +using Owin; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http.Formatting; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; +using static System.Net.Mime.MediaTypeNames; + +namespace 电子展板 +{ + public class WebServer + { + private static bool UseNancy = false; + private static NancyHost _host; + private static IDisposable host; + public static void Start() + { + if (UseNancy) + { + _host = new NancyHost(new Uri("http://localhost:80")); + _host.Start(); + } + else + { + StartOptions startOptions = new StartOptions(); + startOptions.Urls.Add($"http://*:80/"); + host = WebApp.Start(startOptions); + } + } + + public static void Stop() + { + if (_host != null) + { + _host.Stop(); + _host.Dispose(); + _host = null; + } + if (host != null) + { + host.Dispose(); + host = null; + } + } + } + + + /// + /// Web启动类 + /// + public class Startup + { + private HttpConfiguration _config; + /// + /// 配置 + /// + /// + /// + public void Configuration(IAppBuilder app) + { + _config = new HttpConfiguration(); + _config.MapHttpAttributeRoutes(); + _config.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); + _config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("datatype", "json", "application/json")); + //全局拦截 + app.Use("/static", "/Assets"); + app.UseWebApi(_config); + } + } + + public class ResouceStaticRoute : OwinMiddleware + { + private string route; + private string resources; + public ResouceStaticRoute(OwinMiddleware next, string route, string resources) : base(next) + { + this.route = route; + this.resources = resources; + } + + public override async Task Invoke(IOwinContext context) + { + try + { + string method = context.Request.Method;//GET POST + string path = context.Request.Path.ToString(); + if (method.ToUpper() == "GET" && path.StartsWith(route)) + { + string resourePath = path.Replace(route, ""); + string packUri = $"pack://application:,,,{resources}{resourePath}"; + byte[] bytes = null; + using (Stream stream = System.Windows.Application.GetResourceStream(new Uri(packUri, UriKind.RelativeOrAbsolute)).Stream) + { + bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + } + + context.Response.ContentType = System.Web.MimeMapping.GetMimeMapping(path); + context.Response.Write(bytes, 0, bytes.Length); + await Task.FromResult(0); + } + await Next.Invoke(context); + } + catch (InvalidCastException ex) + { + await Next.Invoke(context); + } + catch (Exception ex) + { + await Next.Invoke(context); + } + } + } +} diff --git a/电子展板/电子展板.csproj b/电子展板/电子展板.csproj index c334ad6..5e80763 100644 --- a/电子展板/电子展板.csproj +++ b/电子展板/电子展板.csproj @@ -11,30 +11,43 @@ - + + PreserveNewest - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + - - - - - PreserveNewest - + + + + + + + + + + + + +