From f597f8c67871ebefc6e27bd38721ebe27f5a53a0 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Thu, 22 Jan 2015 19:58:53 +0800 Subject: [PATCH] TCPIP SERVER add DM200 controls. --- .../Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp | 8 ++- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 41 +++++++----- .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp | 62 +++++++++++++++++- .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.h | 1 + .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 10 ++- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 156160 -> 156160 bytes 6 files changed, 100 insertions(+), 22 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp index 2a6a3cb..ae0650f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp @@ -690,7 +690,13 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i]; bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+1]; DM200[iStartAddr++]=(bData[0]<<8)+bData[1]; - TRACE2("DM%d=%d\r\n",iAddr+199,DM200[iStartAddr-1]); + TRACE2("DM%d=%d\r\n",iStartAddr-1,DM200[iStartAddr-1]); + } + BOOL bStatus(false); + bStatus=DM200[35]&0x0002; + if (bStatus) + { + DM200[25]=DM200[25]&0xFFFB; } m_TCPIPMsg._UpdateData=2; RESPONSE_PLC_DM_UNKNOWN(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 9a53634..4d1646a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -16,7 +16,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Chinese (Simplified, PRC) resources +// 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED @@ -1067,16 +1067,16 @@ BEGIN LTEXT "Server IP",IDC_STATIC,27,31,31,8 END -IDD_SO7_UTIL_PLC_TCPIP_SERVER DIALOGEX 0, 0, 558, 326 +IDD_SO7_UTIL_PLC_TCPIP_SERVER DIALOGEX 0, 0, 580, 410 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PLC TCP/IP SERVER" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - PUSHBUTTON "Exit",IDCANCEL,512,305,39,14 + PUSHBUTTON "Exit",IDCANCEL,534,389,39,14 GROUPBOX "TCP/IP Server Control",IDC_STATIC,17,12,87,81 PUSHBUTTON "Start",IDC_BUTTON_PLC_TCPIP_SERVER_START,29,49,63,18 PUSHBUTTON "Stop",IDC_BUTTON_PLC_TCPIP_SERVER_STOP,29,73,63,18 - EDITTEXT IDC_EDIT_MSG,342,14,201,273,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + EDITTEXT IDC_EDIT_MSG,342,14,201,369,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE,277,70,40,14 GROUPBOX "DM DATA",IDC_STATIC,110,12,214,81 EDITTEXT IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE,230,39,40,14,ES_AUTOHSCROLL @@ -1089,16 +1089,23 @@ BEGIN LTEXT "LASER2-1 STATE",IDC_STATIC,168,59,55,8 EDITTEXT IDC_EDIT_PLC_TCPIP_SERVER_STATE_CCD2,118,71,40,14,ES_AUTOHSCROLL LTEXT "CCD1-2 STATE",IDC_STATIC,116,59,48,8 - PUSHBUTTON "Clear",IDC_BUTTON_CLEAR_MSG,453,305,39,14 - CONTROL "",IDC_LIST_PLC_TCPIP_SERVER_CCDDATA,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,24,125,294,166 - GROUPBOX "地址表",IDC_STATIC,17,97,307,214 - PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATEDATA,277,294,40,14 + PUSHBUTTON "Clear",IDC_BUTTON_CLEAR_MSG,453,389,39,14 + CONTROL "",IDC_LIST_PLC_TCPIP_SERVER_CCDDATA,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,25,189,294,166 + GROUPBOX "地址表",IDC_STATIC,18,164,307,214 + PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATEDATA,279,358,40,14 EDITTEXT IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER,51,30,40,14,ES_AUTOHSCROLL LTEXT "Port",IDC_STATIC,29,33,14,8 - CONTROL "CCD1 DM",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,32,110,46,10 - CONTROL "DM 5000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000,"Button",BS_AUTORADIOBUTTON,96,110,44,10 - CONTROL "DM 8000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000,"Button",BS_AUTORADIOBUTTON,158,110,44,10 - CONTROL "DM 200",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200,"Button",BS_AUTORADIOBUTTON,220,110,40,10 + CONTROL "CCD1 DM",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,33,174,46,10 + CONTROL "DM 5000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000,"Button",BS_AUTORADIOBUTTON,97,174,44,10 + CONTROL "DM 8000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000,"Button",BS_AUTORADIOBUTTON,159,174,44,10 + CONTROL "DM 200",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200,"Button",BS_AUTORADIOBUTTON,221,174,40,10 + GROUPBOX "Static",IDC_STATIC,17,97,307,63 + CONTROL "Trig Measure",IDC_CHECK_PLC_TCPIP_SERVER_MEASURE_TRIG, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,114,57,10 + CONTROL "E_STOP",IDC_CHECK_PLC_TCPIP_SERVER_E__STOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,138,41,10 + CONTROL "Fix1",IDC_CHECK_PLC_TCPIP_SERVER_FIX1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,151,114,29,10 + CONTROL "Fix2",IDC_CHECK_PLC_TCPIP_SERVER_FIX2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,151,138,29,10 + PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE_DM200,277,133,40,14 END IDD_SO7_UTIL_CAMERA DIALOGEX 0, 0, 417, 271 @@ -1378,9 +1385,9 @@ BEGIN IDD_SO7_UTIL_PLC_TCPIP_SERVER, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 551 + RIGHTMARGIN, 573 TOPMARGIN, 6 - BOTTOMMARGIN, 319 + BOTTOMMARGIN, 403 END IDD_SO7_UTIL_CAMERA, DIALOG @@ -1852,12 +1859,12 @@ BEGIN IDS_SO7_ABOUTBOX "&About Utility for SO7..." END -#endif // Chinese (Simplified, PRC) resources +#endif // 中文(简体,中国) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// English (United States) resources +// 英语(美国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US @@ -2816,7 +2823,7 @@ BEGIN END END -#endif // English (United States) resources +#endif // 英语(美国) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp index d5ce8df..54a4d0e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp @@ -59,6 +59,7 @@ BEGIN_MESSAGE_MAP(CSo7_Util_PLC_TCPIP_SERVER, CDialog) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm5000) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm8000) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm200) + ON_BN_CLICKED(IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE_DM200, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerUpdatestateDm200) END_MESSAGE_MAP() @@ -178,7 +179,8 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() g_pSo7_TCPIP_Server->DM5000[index]=0; index+=2; - + index=25; + g_pSo7_TCPIP_Server->DM200[index]=3; m_DMAddrList=DM_ADDR_CCD; ((CButton *)GetDlgItem(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM))->SetCheck(TRUE); @@ -237,11 +239,21 @@ void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerUpdatestate() void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerUpdatedata() { m_UpdateListControl(E_LISTCTRL_CONTROL2DATA); - if (m_DMAddrList==DM_ADDR_DM5000) + if (m_DMAddrList==DM_ADDR_DM5000 + ||m_DMAddrList==DM_ADDR_DM200) { m_UpdateControls(FALSE); } } + +//===================================================================== +void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerUpdatestateDm200() +{ + m_UpdateControls(TRUE); + m_UpdateListControl(E_LISTCTRL_TITLE); + m_UpdateListControl(E_LISTCTRL_DATA2CONTROL); +} + //===================================================================== void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateControls(int _type) { @@ -271,6 +283,17 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateControls(int _type) str.Format(_T("%d"),g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState); GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE)->SetWindowTextW(str); + + short iDm225=g_pSo7_TCPIP_Server->DM200[25]; + BOOL bStatus(FALSE); + bStatus=iDm225&0x0004; + ((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_MEASURE_TRIG)))->SetCheck(bStatus); + bStatus=iDm225&0x0020; + ((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_E__STOP)))->SetCheck(bStatus); + bStatus=iDm225&0x0008; + ((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_FIX1)))->SetCheck(bStatus); + bStatus=iDm225&0x0010; + ((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_FIX2)))->SetCheck(bStatus); } else { @@ -305,6 +328,40 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateControls(int _type) DM_Data[0]=0; g_pSo7_TCPIP_Server->DM5000[i]=(DM_Data[0]<<8)+DM_Data[1]; } + short iDm225=g_pSo7_TCPIP_Server->DM200[25]; + if (((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_MEASURE_TRIG)))->GetCheck()) + { + iDm225=iDm225|0x0004; + } + else + { + iDm225=iDm225&0xFFFB; + } + if (((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_E__STOP)))->GetCheck()) + { + iDm225=iDm225|0x0020; + } + else + { + iDm225=iDm225&0xFFDF; + } + if (((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_FIX1)))->GetCheck()) + { + iDm225=iDm225|0x0008; + } + else + { + iDm225=iDm225&0xFFF7; + } + if (((CButton*)(GetDlgItem(IDC_CHECK_PLC_TCPIP_SERVER_FIX2)))->GetCheck()) + { + iDm225=iDm225|0x0010; + } + else + { + iDm225=iDm225&0xFFEF; + } + g_pSo7_TCPIP_Server->DM200[25]=iDm225; } } //===================================================================== @@ -985,3 +1042,4 @@ CString CSo7_Util_PLC_TCPIP_SERVER::TCPIPMsg(s_tcpip_msg_data _MsgData) + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h index 5d5fe00..918f133 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h @@ -54,4 +54,5 @@ public: afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm5000(); afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm8000(); afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm200(); + afx_msg void OnBnClickedButtonPlcTcpipServerUpdatestateDm200(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 5073c7a..dc46e8d 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -501,6 +501,7 @@ #define IDC_CHECK_SO7_OUT_PORT 1394 #define IDC_CHECK_LKG5000_CONTINUE_READ2 1394 #define IDC_CHECK_SO7_CONTROL_MODE_X 1394 +#define IDC_CHECK_PLC_TCPIP_SERVER_E__STOP 1394 #define IDC_BUTTON_MANUAL_HOME 1395 #define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2 1395 #define IDC_CHECK_ 1396 @@ -970,6 +971,7 @@ #define IDC_CHECK_SO7_MOTION_AUTO_SET_ZERO 1819 #define IDC_CHECK_SO7_TOP_LIGHT_ON 1819 #define IDC_CHECK_SO7_CONTROL_MODE_Y 1819 +#define IDC_CHECK_PLC_TCPIP_SERVER_FIX1 1819 #define IDC_LIST_SO7_MOTION_CONFIG 1820 #define IDC_CHECK_SO7_BOTTOM_LIGHT_ON 1820 #define IDC_CHECK_SO7_TOP_LIGHT_ON2 1820 @@ -1096,6 +1098,7 @@ #define IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER 1901 #define IDC_LIST_PLC_TCPIP_SERVER_CCDDATA 1902 #define IDC_IPADDRESS_PLC_TCPIP 1903 +#define IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE_DM200 1903 #define IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM 1904 #define IDC_BUTTON_SO7_TEMPERATURE_SENSOR_START 1913 #define IDC_EDIT_SO7_TEMPERATURE_SENSOR_GRATINGRULER 1915 @@ -1139,7 +1142,10 @@ #define IDC_EDIT_SO7_UTIL_TEMPERATURE_DISPLAY_VALUE_B4 1955 #define IDC_EDIT5 1956 #define IDC_EDIT_SO7_UTIL_TEMPERATURE_DISPLAY_VALUE_C4 1956 -#define IDC_EDIT_SO7_UTIL_TEMPERATURE_DISPLAY_VALUE_A4 1957 +#define IDC_CHECK_PLC_TCPIP_SERVER_MEASURE_TRIG 1957 +#define IDC_CHECK4 1958 +#define IDC_CHECK_PLC_TCPIP_SERVER_FIX2 1958 +#define IDC_EDIT_SO7_UTIL_TEMPERATURE_DISPLAY_VALUE_A4 1959 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -1149,7 +1155,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 200 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1958 +#define _APS_NEXT_CONTROL_VALUE 1960 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 976f904d888704c783edd712dbad67580b4868dd..4ed34ba8aa79d343e9b62449b74ddf0cb3c219aa 100644 GIT binary patch delta 3116 zcmbtW4RBLc7QW}^B~55(LmN^op|rKs{*aP}&>tb~OPaFKKPqik8A_=jNZCrVC9r~` zuP)SGm+9Evnv2ZZt<*u+6{x(Lhx_A(fUZBw5{oz$J6c>;P!Q4SxURZ%&ugdt&d%)2 z-pt86_nv#tz2~0qe)mcz4bn-&z+Ng`A0HoQ59|C#HLWl`{Mo28vmgo@LP%KNAyk51 zK-Gl8qv?>v#C&)W>9bk$qPxalsskEw7_XlBjL*XIz>#0mQA=vXZrPC=%enf|#}*B9x;0dhvx6MD8xJ71T9=35_=zpy`)r1zHBm6ey( z)yjL91;8+k-0~P9S~A3sXVW}3+R?6{rwnB%;Ti{*lEOa^?yQ1H9A~!c{sBjbUyz-s)nX-PpWLCX8|0k~# z!F}^5OFOh+NrI^sb2tTc16IA?n;(NHX1<*k=D&N~l0>HlkZ=I?+3J9cQw#fRp$7wsObr%}RwJowopzG|NvU|o?F^4`$^@M|ub z&qWVi%3iqBAWLJCmhTi`iM-_cNnrkQGtOsWUxsEViv@TQSl{i1N}&l}0k*a+ga6S4 zH$aHFOZs`u5SZk_lU2Z;jm%-q=WkS&f5c*$L5Hb^?T6#Mn%Q5sd zKKbe^^}sHyv9jKNBOe$A3-i2|#}2=?61tgNpT_N1z?fJ~R+5FJk$6ZM%34xKhS7Nc z1|Qi*+Q@pc0c~FF<0iMFwTx7uR)@bv)Z5T{I|<-_6@J%|R@5A*mywoN)r0pAtvb5YTJdN$d;Dsmz6HlMl4`=lXu6@}xnsV;*V?aDswQ^dsgO~q zD|o2s$=!F^s+L=2@o!fwolk{JrVE;bT0_Sj# z{>%>OMSkEch%9{e)q=x^`ri0bzqo0*>FJ8!to(c0`fnv^=5j*Zn3T*~f?M)U@{rIv z`>njThGw!$Z{Egg&+UyN#E3n{Fuug#9?0Maw?i^38Q!BZ5*r(?7lLS>mrOelZMYmAKWChU=Qt#>eF=Uz#aT8-XG=8ctKN?`G)!i+<{G z7+6ijFbJY1Xa|u?8juv%18@Qt)Co=&HW?1;U>Y}_1~dQoU5HnjJE0G{cjofkeUK1L zfS!rdtn5pGO~AUg(}P&!z<<3?t;%nF_d3lQG*FG!2I6G^b1_}KB8 z+58R*%wj9EaqJ3eS0d-(x`wxQ&lk`ne(T53z21k6`xB&^05Z4A(RYw?vK_T8*ph|py#hJ965HxY zD%nc1Fh6HoI z(_LtD7Tdixcaf*SR#fh>d%CS=L489h$FD&aaOo}eY#1q?jZYy0NyYZ1*s-{LkvqTK zS>#>l*>&nz-_jGIG5A0e`Wz(P40Zkfi93XlM4bF3(<7Gt?L>BEv+qq9gVeZzJPCS zLnwiM0KEM?*c6+Yp3(5>m9#+x@b4g$OjALx-meuXJZm;xVqA@yipEB@#Xp;-&Qxm~ zv34iQCX~%600rKO1eX#&;Rg4T=K-O6ssPE@g( z&dm$x71nqfdCx(OT+|>5;5%00aSQ3E6VTD(zItAqdUM^tuP&yB?sFm+9aPkK31R1R zT$spsHIb7zP+!}xPQH4-gKa&JTST+cevju-E$Vk3e(?hQ8a^tFfTamZN%(dlcj1Yu z#pi+w*$oKBt)!0m-kgnFMmfx->$&7aeD~R*nVUX>6xhUXsiE`u9gAoq-=Bx3u1e}t JdC_dj1N|F{4E delta 2596 zcmY*b3s98T6~5>0zsoMHg1kjQKqQE~QA4c2&m%_O2#b$OELg$EI0|Mp@sYTu>Nv_! z@e+vFDOJ!`i?6W`tx7BO{3wmR|D65rz31HfpYwg^ zp1ZaVldZ$lSjnYe#+W$3gQbzt(NU$DH^GE{zi&#zW_N;)R5oRclnF-Cjk?efJA)up z4C#0AWjbZ6VGp=0_HRkDW;bWlpY2<`k?-%voy&Q&A{%vF&z!Xt{ck~lh?dOtR!0+b zDx2JL40>>VQ=<$`4&bKFFvi|XDM;Oh$x-|aMqU7aao;!0)VzQC>4fqtVEcYvx$ieo zG8%w3(e{DM5Tb+xJ=Ys{TyBeWE?0s>j~gW)O{KYOh@@W47s_z-J}+ZRYC)=*#!BS^ zD=2j{iY2w!!s|>*UFt&#JFkI1mdA0~VLsXPvQiP~dkUXKamnP!s=i=MV%?%-Wu?fm zyeIlH9*B~%ZlxmoJCH(H%B9yDGq$*cN$JnExho}Q_rP->r_Elq)+XxvQ$KBxtbdNC zE^rk!nQ>xHnWx7F4e+t{q@{}bA=FP371@Kz{52o@pF5oDEZU`*dh0I@2AQ^5G*N6l zvqwBwGGCPMm?8eMcamt{WL9$bT6G7TEIgZwMNR*b;>l9v{iabQ@7k&)RPLDoc9EP| zkG+1}Rk3$ufSB~j^zjXppvI%%wvMf0k?hB;oF2wBw0cEXeT0yIZ$noC2fMTRF)^{% zW!@{Bv%8Mo^jo;>SC6xQ==`Xv<;Heep(Tvg3X&L`BQd6?GUnmQ*zi)u(kV9Y)ym^b z7QkIuJQ3TXc%(S}hkUp$l8s69d*SIz{NxnK;*-mE^OEU`tvK`9+Kw-6J&OFNRzTSg z+{4pYCW~XyW6!v^H~G)R;rW-Uay)+*b-vefGWNA6LcSd27t4M?#`DLXR9gBm1-X)a z$O@R1mEh59kgZYgjg|MnTlr6?qytwBOo6Gjal9CM$+H#_8zSSeYvfn!weRM5pS+8g z_9_QT1{P%;*GF_lNn3aQ^@J`rf`3n%UJ1{9&>VdsNg+IFi3;)b~Y~;t-UU_ zyCE1)Yz7~Zczw4CH0T7`zdmo*EmF<@M%Ej-qCF1L~f4g&@(jW$Q%vDCe?tmtcbtp%XD>fY!i>?fC7q;dQr7IAH)s zQL*xEW%$A+sC9)JsfxBx54pl>5P>CA#Le~~5rBTed2~AFWpFQL>BY5R_XL|0%G*Fz zTLVF!h_Vi3xGUh-E%q2l1(B+caq1#}%o+_u#Aw$v^;j${H;MK6lSSXR!6NTl57FEf zp`_g03AITOgva-SubP+$T*CY;E~~Z_=+GOHR)0w{MmJg)K&KR>4aaLITGOFYX}^`g zMdXKc)VCKYyN43>_Iya?Ca5OU+V59epc6X^AzB|wl#k$+LdZ16llsWGi8@pWW?#|% zA_3n{fW^wtWa-n1Aha4ox&r;lTjDpb0{8fP39&XOy(sxF9)1) zRR)j3ehKcNZ9N35!MmW(Br3{t@XY7ns!nr(IyiWP<_|!hgQ&h0h5=Wo($!alt25o< z5D1&mrrHjJO^59skZ@uia3R;s6wU(%v5_z63d8|`+(zuQ5czJ^9w zq{|_BpCp$gkEDP^v$D{;6th)G9lH|M8Wq<0h~l0(T6Kt5-Mb+l)YhvY8?pT-kRa*` zr>aw{U;uF6F^E(n55Z?p+fNyIFpG|4UJehYQt1uNR6^Zq2f!1Yu=)iAI;>(p(oT_x z@l6)_GhDGTmq)8@12Cc!ZQ-&wax5NiJ_4h+Rtm=3?zg%Reb5l^q1}}@kikRs6NuF3 zxNs`pj|Z}N?D+Rwub086&&QU{6-Z8x-}HFHYZr_ctf*ANWqu;CZrWq%GfBFi@(8~+AI zwRHrFbuLbH5*$gKN!&;lw}Qr;H(yU^HU%KioEPTJOGRt zMzV@z^|-dWWSQNU%Ur9xWm=i{(RW(ZN0K=D*bT#dxg*~8=l*&VLE8TYq=|muh{k^K z#*C@l7q{OdM1I>3Mz~0ndSL54ihe-=Z+1|=|=5A?YFF$|0Dg`Sjc_*FPB@F-(z{_oy(BsZwGUzv$A)z^c*?$Q|Roo zgi|3pNAo)(pl7p&za!daaasGn^=1=Wyr$5dOZi+>Xi3jXw=6AMl$({Bo1IsLSxztu eeP(ep=2ME|%Gta~xb(