From bc65eb272639502e1ac811ddebbc66997620103e Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 13 Jan 2014 19:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=BB=E5=86=99IO=E5=8F=A3?= =?UTF-8?q?=E6=A0=87=E5=BF=97=E4=BF=A1=E6=81=AF=EF=BC=8C=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=82=B9=E5=88=B0=E9=9D=A2=E8=B7=9D=E7=A6=BB=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Msi/Hsi/SevenOcean/So7_Interface.cpp | 13 ++++ .../Msi/Hsi/SevenOcean/So7_Interface.h | 2 + .../Tools/UsbUtility/Debug/UtilityDebug.Log | 10 +++ .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 18 +++--- .../UsbUtility/UsbUtil/SO7_Move_Location.cpp | 60 ++++++++++++------ .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 17 ++++- .../UsbUtility/UsbUtil/So7_Util_ImageDll.cpp | 13 ++++ .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 8 files changed, 103 insertions(+), 30 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp index 3273a2c..5f15212 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp @@ -113,4 +113,17 @@ int CSo7_Interface::Pro_Face_Du(MY3DPoint* pArr, int n, double* Coe, double* Err dis=dis2; return 1; +} +//======================================== +double CSo7_Interface::PointToFace_1(double* _dCoe, MY3DPoint _PointXYZ) +{ + double a,b,c,d; + double r1(0.0); + a = _dCoe[0]; + b = _dCoe[1]; + c = _dCoe[2]; + d = _dCoe[3]; + r1=((a*_PointXYZ.x + b*_PointXYZ.y + c*_PointXYZ.z + d)/sqrt(a*a + b*b + c*c)); + return r1; + } \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.h index 7faf2e2..713e0a9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.h @@ -43,6 +43,8 @@ public: void PauseScanAndGetData(); int Pro_Face_Du(MY3DPoint* pArr, int n, double* Coe, double* Error, double& dis); + double PointToFace_1(double* _dCoe, MY3DPoint _PointXYZ); + }; #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index 1abd3d9..8c07685 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -2940,3 +2940,13 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. 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 8544b9f..26a9a3b 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 @@ -52,7 +52,7 @@ BEGIN EDITTEXT IDC_EDIT_COAXIAL_LIGHT4,261,83,41,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_COAXIAL_LIGHT,261,97,41,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_COAXIAL_LIGHT2,261,111,41,12,ES_AUTOHSCROLL - PUSHBUTTON "Motion",IDC_BUTTON_LOAD_SO7CONFIG,20,143,44,23,BS_MULTILINE + PUSHBUTTON "Motion Parameter",IDC_BUTTON_LOAD_SO7CONFIG,20,143,44,23,BS_MULTILINE PUSHBUTTON "V+",IDC_BUTTON_SO7_MOVE_ZOOM_IN,77,159,25,12 PUSHBUTTON "V-",IDC_BUTTON_SO7_MOVE_ZOOM_OUT,77,180,25,12 PUSHBUTTON "Z+",IDC_BUTTON_SO7_MOVE_Z_UP,101,140,25,12 @@ -62,7 +62,7 @@ BEGIN PUSHBUTTON "Y-",IDC_BUTTON_SO7_MOVE_Y_BACK,154,182,25,12 PUSHBUTTON "X+",IDC_BUTTON_SO7_MOVE_X_RIGHT,179,169,25,12 PUSHBUTTON "Home XYZ",IDC_BUTTON_SO7_RESET_XYZ,277,154,76,14,BS_MULTILINE - PUSHBUTTON "Hoom Manual",IDC_BUTTON_MANUAL_HOME,277,135,76,14 + PUSHBUTTON "Home Manual",IDC_BUTTON_MANUAL_HOME,277,135,76,14 PUSHBUTTON "Home DCC",IDC_BUTTON_RESET_WORKTABLE,277,192,40,14 PUSHBUTTON "Home Worktable Right",IDC_BUTTON_RESET_WORKTABLE_RIGHT,277,173,76,14 PUSHBUTTON "Move\n To",IDC_BUTTON_MOVE_TO,359,142,32,27,BS_MULTILINE @@ -70,9 +70,9 @@ BEGIN PUSHBUTTON "Set Reset Flag",IDC_BUTTON_SET_RESET_FLAG,133,108,61,14 PUSHBUTTON "Set outport",IDC_BUTTON_GET_LASER,181,240,61,14 PUSHBUTTON "Home V",IDC_BUTTON_RESET_V,100,240,61,14 - EDITTEXT IDC_EDIT_X_SCALE_COEFFICIENT,46,284,54,12,ES_CENTER | ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_Y_SCALE_COEFFICIENT,109,284,54,12,ES_CENTER | ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_Z_SCALE_COEFFICIENT,172,284,54,12,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_X_SCALE_COEFFICIENT,62,284,39,12,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_Y_SCALE_COEFFICIENT,121,284,39,12,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_Z_SCALE_COEFFICIENT,180,284,39,12,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_SET_VER_NO,325,313,45,14,ES_AUTOHSCROLL GROUPBOX "USB Control",IDC_STATIC,15,12,89,115 GROUPBOX "Config",IDC_STATIC,13,129,55,83 @@ -123,10 +123,10 @@ BEGIN LTEXT "Z Signal",IDC_STATIC,189,310,26,8 LTEXT "Pos Update Frequency",IDC_STATIC,104,384,74,8 LTEXT "Spare1",IDC_STATIC,232,112,24,8 - CTEXT "X",IDC_STATIC,70,273,8,8 - CTEXT "Y",IDC_STATIC,133,273,8,8 + CTEXT "X",IDC_STATIC,79,273,8,8 + CTEXT "Y",IDC_STATIC,137,273,8,8 CTEXT "Z",IDC_STATIC,195,273,8,8 - LTEXT "比例 系数",IDC_STATIC,23,281,18,18 + CTEXT "Scale Resolution",IDC_STATIC,20,280,35,20 GROUPBOX "Set Gear",IDC_STATIC,208,132,56,81 PUSHBUTTON "so7_config",IDC_BUTTON_SETUP_SO7CONFIG,20,184,44,23 LTEXT "1",IDC_STATIC,337,27,8,8 @@ -398,7 +398,7 @@ BEGIN CONTROL "LJ_G激光",IDC_RADIO_KEYENCE_LASER3,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,175,111,76,10 CONTROL "Verifcation algorithm",IDC_RADIO_SO7_VERIFICATION_ALGORITHM, "Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,48,138,81,10 - CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,48,149,45,10 + CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON,175,124,45,10 DEFPUSHBUTTON "OK",IDOK,181,145,50,14 PUSHBUTTON "Cancel",IDCANCEL,241,145,50,14 GROUPBOX "测试选项",IDC_STATIC,29,15,243,120 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Move_Location.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Move_Location.cpp index b81015b..7cf53e9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Move_Location.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Move_Location.cpp @@ -2373,7 +2373,6 @@ void CSO7_Move_Location::OnTimer(UINT_PTR nIDEvent) } break; } - case 2: { if (m_pSO7_Proto) @@ -2490,27 +2489,48 @@ void CSO7_Move_Location::OnTimer(UINT_PTR nIDEvent) } case 5: { - BYTE cdata[4]={0}; - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,12); - cdata[0]=static_cast(m_pSO7_Proto->g_machine.FPGAData); - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,13); - cdata[1]=static_cast(m_pSO7_Proto->g_machine.FPGAData); - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,14); - cdata[2]=static_cast(m_pSO7_Proto->g_machine.FPGAData); - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,15); - cdata[3]=static_cast(m_pSO7_Proto->g_machine.FPGAData); - if (true) - { - m_OutMessage.Format(_T("[Err Pos]%02X %02X %02X %02X.\r\n"),cdata[0],cdata[1],cdata[2],cdata[3]); - } - else - { - m_OutMessage.Format(_T("[Err Pos]%d %d %d.\r\n"),cdata[0]*256+cdata[1],cdata[2]*256+cdata[3],((cdata[0]*256+cdata[1])-(cdata[2]*256+cdata[3]))); - } - CString strOutput; m_edit_RepeTest.GetWindowText(strOutput); - strOutput += m_OutMessage; + BYTE cdata[4]={0}; + if (abs(m_pSO7_Proto->g_machine.x._pos_fixed._long_)>5)//X + { + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(2,12); + cdata[0]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(2,13); + cdata[1]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(2,14); + cdata[2]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(2,15); + cdata[3]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_OutMessage.Format(_T("[Err X](%02X) %02X %02X %02X.\r\n"),cdata[0],cdata[1],cdata[2],cdata[3]); + strOutput += m_OutMessage; + } + if (abs(m_pSO7_Proto->g_machine.y._pos_fixed._long_)>5)//Y + { + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,12); + cdata[0]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,13); + cdata[1]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,14); + cdata[2]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(1,15); + cdata[3]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_OutMessage.Format(_T("[Err Y](%02X) %02X %02X %02X.\r\n"),cdata[0],cdata[1],cdata[2],cdata[3]); + strOutput += m_OutMessage; + } + if (abs(m_pSO7_Proto->g_machine.z._pos_fixed._long_)>5)//Z + { + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(3,12); + cdata[0]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(3,13); + cdata[1]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(3,14); + cdata[2]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(3,15); + cdata[3]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_OutMessage.Format(_T("[Err Z](%02X) %02X %02X %02X.\r\n"),cdata[0],cdata[1],cdata[2],cdata[3]); + strOutput += m_OutMessage; + } OutputWithScroll(strOutput,m_edit_RepeTest); break; } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp index a02ddf0..ce69cbf 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp @@ -255,7 +255,22 @@ BOOL CSO7_UtilDlg::OnInitDialog() ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->ResetContent(); for(int i=0;i<16;i++) { - csTmp.Format(_T("%d"),i); + if (i==9) + { + csTmp=_T("9-Flag"); + } + else if (i==10) + { + csTmp=_T("10-Trigger"); + } + else if (i==11) + { + csTmp=_T("11-AccErr"); + } + else + { + csTmp.Format(_T("%d"),i); + } ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->InsertString(i,csTmp); } ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->SetCurSel(10); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp index 5b3d2af..03ace09 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp @@ -104,6 +104,12 @@ void CSo7_Util_ImageDll::OnBnClickedButtonImagedll2laserCalculate() MY3DPoint Top_Pos[4]; MY3DPoint Bottom_Pos[4]; + for (int i=0;i<4;i++) + { + Bottom_Pos[i].x=0.0; + Bottom_Pos[i].y=0.0; + Bottom_Pos[i].z=0.0; + } double error[MAX_POINT]={0.0}; double dis=0.0; int m_nStep=4; @@ -173,6 +179,13 @@ void CSo7_Util_ImageDll::OnBnClickedButtonImagedll2laserCalculate() cTempValue=T2A(str); m_pSo7_Interface->Pro_Face_Du(Top_Pos,m_nStep,coe,error,dis); + MY3DPoint PntPos; + PntPos.x=Bottom_Pos[0].z; + PntPos.y=Bottom_Pos[1].z; + PntPos.z=Bottom_Pos[2].z; + double dResult=m_pSo7_Interface->PointToFace_1(coe,Bottom_Pos[0]); + str.Format(_T("%.4f"),dResult); + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_MEASURED_VALUE)->SetWindowTextW(str); m_pSo7_Interface->Pro_Face_Du(Bottom_Pos,m_nStep,coe,error,dis); } 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 b99ec87c8db0d7d1e287065d8ec4807bbf297ede..a554108aff9b4255203b75a1e59fd2919949e9e7 100644 GIT binary patch delta 5398 zcmb`L3sh5Ax`5B#IVU9HVR)mYyruX^3;}_lVt|0)pz`oREfokm*PfG72d}rU}9t zVFo5&$9^)RSp5N!VS(u)TPYT@KS{|< zFN*A2@jWFuLj>U+1l(~XNfNQvXY4yET3q0R0yOdn|AD)A?~cG?HKKB6%Vi`;!e_jg zzbL=g3T&>=e32)efAlFLN^|UHZtBf5FegI@Pd*oGJ)y*O37)+-XtD{zNI7t)aQtXouUe6 z^*=>ASerjUxr*vo$AF5dN9e(=qVD!9GyxK=gR-Sily#A{s^3%iVv6U6MiyACIEuN^ z-V#5qd3;j%1vXzg3MD2wO+imnr4WNO*N()v^n|4Y;AtNJ|j0JH#uLQH*xhz zc60uE*c?Yq?2QTgQu6XrQql~@bZw3yBSo7!F)u@#k#A1Xrle#W)6&!Ob8?dntBF7q z!gponz?Z&hHVqquXb^H-EO}=p(`WdyX?2OQmD6U=s4$mi&#TNW$}TIb$eo#6Syo-u zST?h`(OO*9QpJ*)mK+@3CWg1EH0YD{6>}PEt+`e8wToJ+td^pxM=dRLtLj&mbxTlM)SU;>YjY4)MO^d#N8$P(=?9%KR zjI@p;?cN^#ZEgMv%v)P?f7yAB)>>;T1O`ZH%(&Bl6BHDG|C&Q1pVd-ZQ`_hn`%7Ng zy8E}_a14*?vn_*v!m|f||;i zwU&y!{PZNekKqZne`yFUwH%n7MCf-C8$0EEbaPXSl|QO1weX}zuElC;DYICuwT(3p zyPuASz6wbR#_OUn5+&7P@y`j59F*b_SZ1xV);?;jtuAV+nOlp?#3!9Wn}tpuH+*;* zdcD5V+|*c8Z%JyjJU*skZkczz3md9xU^$U=px!E}5)D;phBSSZR-bH0)~05pXK0NR zEfcjF`o)GN`V31|YW1SkInVGOGW@tL;sm4Var&9M6&~xv+yy%V{junR91Q@n6w_a^ zhQevuuQ7KWxsBXJZXsMiKi>Zbxr2Oze2WO|a$zM4>eoSEDyf4TpHnrwrJ*WrCWQxs z1ObhkK(S-;t6+)9S!i*kn1(&ECyINB4=XHLFCIdB>^xVpM@EWR>zwIIfxEmAWYBc< z&zVJ)gp1)GZpb*5+vG1{t})p8eYu>BZfUApHOI5g`73b7`8*DryIIYa#_GqCVgIwJ zkq=Kwgcv_*AE>QV#hNE>W|Ma6o%#$PdSHQBVrI2o;-2F)v_?qdAaN6#$+xO=n9UgG zoRKLJ);4Jke0ftG=~`V)Wz?ye|CtQ_F(3xRs=H#@mU=hXc8ITpjXVZBRQa3kOta}v z_pXzlu;KX8BiI_uGLL19^S+Aw2tLse=l9KjlPL*K^4$RMBi3*2QTStyd-0*USm8$* zxiZqZX7QI&=Tnp|sk=kX=RLNOJz^`2JmxjfLf_k`G0k0_`6MxC>N7jnitMs(?V$bJ zYzqt9t;C0(E6TlhC~Y2Q;uuznzVuTiLHHcgvDmjmU0JDBN*4IWgYe%wX)es%Lq|LJ9bHa3PZ83Mfx}d%>HT#93LbVQ{WQq_OMY@^ z^s&nnYlZ)-x~;U+1vy_^`}WC;0+^g!Dc z;skv@i6Y@FdwR)%uiOeSjiE0D8vlNfojvknj`(BT(XtyAX(QP3{!o}cnyA>DNrp&4 zkT8A}F-$^Rf)|gM@-Rd-<88h^g@b{PZ#r6? z&peF4dn^iVA}cDf!1L14%~cdrA{1mch;=)In zi5|M=Ng{E>2V1GVD}sou;8v;b>RcjhK$p?Bga{XKg_qV6VLGnypOzD$2A9S=Agj=d zM+J7VFA;9ME*7zY>7xckrTA`~{zb~KbyF5RwL(gGb-M8N|34cw*9W}6S{Sx3AY4-&*qr?NAt zajv~4*)hTfuEs*Kkt~6VcZmjU8Y1%THGhN_63+o_K%#%KnJ|{8*m3!Cm+1 zw%BQc2(ckjDC;;lirn$M@*xv3qfK(#aEgx7F)Cwg{hv|KS3hj!Mx zOXZcgvKj*4cagD>=-KAcY0_dWyb7(eDZ2HhL8BmFi|bDbD+!*!76wOx`*q^SdhY1q zz`Nuy=-OooBomHjk$7@q@EF(JPh$fA@ym_%7lg#nG!k@$t+l&ND^IrIWilCzdT4V78^@+Y|E7$UDIR)^aDf<>e=G2iQu|y zA<-(Jx2P2wu9E+6v#@$;|%RV9QSY9Xd%IR6}pxEDzW?0tLb*vHy8cH1iEuO6N2 zvh5}XsbVy5!oO3v`adE)`HH`x?vM29zpFor7U{sYj)pLQGd7i;(J}atq#PCyQ)6)6t&4oFAqdq?sc?(uIJDKhcD3r z2zp;EN=3JXpQ-Zj(^H}6Qx%^>2|pj)ixK{{1`Dj1%}nb>*T=o|s)DVJHvugtdYAqS zS{%>Z{w9}ODHE+C{|4jv;Nt3EEh`!TTR1VfY^y}uSuib=GX1v?1;zY62hLm&$HDKz zNWjasV#x>GSedJk_k!3gGVxHkthn|jgp@$xU^)C@qJiHkH#DCFqkY0pXg0LafZJj_ubS%fZ zf>#EHa{WUVu@t#qAsP^y5ln;)BZ8cHS`7&i6AOq9i~6>f zm-x(QCy69E-}WgYq=Dy^%!9u3EHU_*k83aXJQvjvJn2S2ZrkvI2yq7Z@GOnsZr?^7 zj(#X~EVdEPZGOeNb2y96E7AHPr6cg|1d;#;lE?_2EBmpD-ezv|pTj=#a{j?c^&zl8 zM-+LKCkH%1x;bfnnMWTtnKch?H~wk5JmZVq!v^j=VLUMo`-$~M(HkYHIS6f?BuP84 zehSxk5$la;zyO0J?Q4-FZVS9f-o&GAgX;Cn6nydAtT#G0JT~w5hfn$+oZo)W2acIY zKIsw*LVqlY4yw(}ey??J+rK(0lismcwf>#PLYz$;Vo{bHhO1xU&*?Ad#vmm)j}C&1 zRjr7VtCC^DZG~Y(IoMCdDwCY%kj>PWm{6387#ccgDAolc7wMHaZDE&!e5Fyy`+H^k zY_UX}=p&5E*N?f+`~3~PDo*cgj@!Xt)c`d)&EtBhHWocvCvkhqk=XRitnq1&r>7@b z3#^$*87V22r0jfadQx6NWtK9v|sd&8=q#)%(Pl9NtR4YHukpWBxR@N zF+LFO7l(0BQYX;YE}bq^)~M0|y~?`a*x z`hO7;D)9fX{suw#&1vN%5bl)_2UOgranK({5}gs#|Ha5K9#&jF6il_neMHZv&EBH2 z&dam+Ysf_Y+}uK$oK}rv$3cU0XHgM}+*WGWE<>@Ouk+hdE#WV(k8<|>>T^x^0;{a+ z!x+I044GZtjnqE=fQ^ONCKAQZEVA&nAaXfN-fvn0~6iP+tYK1RXAME&zcN(^pj%!i4Q`aNw$O)iu0)@ z-aQ}d(FhClndpt7)lz?!dk@Vp^dEM_$g?^(Qs`)=Pw^Qk>HJcCczE>>>qt^9(n4+4 zADv(Ab4b`hEqeD!q(u&}ih!8iS}S8FIZQ@4a~pa!Ko-y}XvP>(hoyT4iAr2qA}d;d z)SBoMQq zI%lq|<<`Bw;i-qCT@U|<_G`NLqf?2K{RW|?F{ka|iwti3n#Q;aOXV8`>d&!sXZn#p z5FV3O;95CfW&}Q4Onv#b>@=>NtmF1;CfI*~L^*T2do}#47t>wUN2!@Hjbyos2Wf|Y zyhih3=6;OKffr<7Uh&&8&Zgh5B5=1-);slo{(yG6{hT*HA4TBHG|f$@UL$Yh8!tAf zc^DJHLnz)$vYqBXGzRJLevsmS*y`Y?0b1A1I5J9x>IQ0Zy=B(CL*T}E5(9msX%IA* zlL+XyXij(EcI&|1C?}FOsK3rSAZU$T19vir8Cp^`BY58}t+Qe*@OFj74dHrT*g`?Id9pAyq9iA zx(c1r%lD{vc0~$_cb@ycHWUIDvJBonIsm$JXq0PD2w6-p8|_9vnhPI%!p6a^XXGGA zyU7%O|8KY9ehDcCORA;_^nWI?frTF56Sd)o{u9VFp_tdeT*u6O|2;i4&y!OQL=Xlv zn>3OSA z+)o5wj)(3xVh4K+iFL(Blk2kUW(CLTuHPu)6Hx4&ps zvx8@jL~@2mcG97s7mh6uT3;O*C$}Si8!qjn??B20qT~H* zW3ksUTzwZLZ6m{59}{|-AkJ7*%BpzZ3bMd$!Q2 zU@D;y@(Q)X%yJeb=cD`#)c=LlL%*H9PeH1A%TmeYW$O=7M%R5hz2L< zcd{VRGuaP{WH|u)?}S;8Y8*JbNtoS8#zN{B^c9aG-^al{L%V7|%VOo%kv|N_&Qsu} z-x~5HsT2j-_^BiA{osX-Yqu;}w6si`r|M-n%8F4x&r0Q}s}<5>tn;NxX*KF@=+!{r zPzwXE1w`Df#QFBXrtz9e2&!Zm(AR>h+=xOn|6hocH-D*v1xHzgYOKw8tj~v>Pd%3V zD>{O95Ev*SJ{r7uTBeN{ zgW{Sm!|p5TWH2|W zl}yIK%zx5o{~~Fwr{#!nvbW%wk+R4%O}JvC8vd?3ONhY_Rdr3M;y8TP#p1~0aBMqS z7rFvn#fFc|Ay@ea&OPLLJvGFf%H08Gmwg|Zn!$!+i~0(14Sr1e9@ixxABih?WJX$) z3{ULEOI6s^RWpO`NZu5RyPyaSf+1vtFr*Jchww%CA^Z^mh(Lr1A+A4xV5CDlyqbxS z7AG5yh(JUlg#QS`L?IqQ#2`i?qJ5+Ubs}M((Fl<-z4z)bkQNa>7LkA$2QhUt6#D9D zKuf!GVgpkCavxZoxJa>#Q0 znhx)&k_UbKd(hffP>Kb}E;<_SevgUP*h}@0ZIh>Rb7AkK6wDMeq%~3%I>0iiNd1;r zjj|He-IifSS&7^fX%6-(Lnm8_avOftsuDQ5g$#$o$@r#RnvBl$VK`os{alWQ#cSm< zvXj@Z-UQ}#asyaSF+=dY+0JVR2fjXk`j?CNvhAxrDuoaHNf>(?Q&vx{obTtW{swa1 z>rnDX`1y7U9wbuyc3LT(r~X+1S5fxn(3vFlp&h$fzD^pUejQm2_BS!{Tp2?RVPzOA zH8^h>rox5zW6V-KSS8Fhkm2gDC=1olQ5>@3&?*ie#i3IizKX+7ari5a0L2lgID!<% zFvX!)9KnhsL~(>F4uj$dQyk%nW4PjoP#lqpV}#-usW_q($0Lfvs5nL`j%dXZqc}_l I9HUqK2g-v6G5`Po