From 0bbe6882c1e987a20ac707885a19b71223964ad2 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 17 Jun 2013 16:27:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=BF=90=E5=8A=A8=E6=9B=B2?= =?UTF-8?q?=E7=BA=BF=E5=9B=BE=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 25 ++++++ .../Tools/UsbUtility/UsbUtil/DrawGraph.cpp | 29 ++++--- .../UsbUtility/UsbUtil/SO7_Send_Parameter.cpp | 82 ++++++++++-------- .../UsbUtility/UsbUtil/SO7_Send_Parameter.h | 1 + .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 1202176 -> 1202176 bytes 5 files changed, 90 insertions(+), 47 deletions(-) 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 6678e01..2d697ae 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -1216,3 +1216,28 @@ 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. +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. +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/DrawGraph.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/DrawGraph.cpp index 01576ab..68a8010 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/DrawGraph.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/DrawGraph.cpp @@ -148,7 +148,7 @@ void CDrawGraph::LoadGraphyXAxisData(DataBuff& dataShow) m_dataGraphX.SetAt(i, dbData); } - Invalidate(); + //Invalidate(); } //======================================================== void CDrawGraph::LoadGraphyYAxisData(DataBuff& dataShow) @@ -178,6 +178,7 @@ void CDrawGraph::AddGraphyData(double _data) //======================================================= void CDrawGraph::RemoveGraphyData(BOOL bIsRedraw) { + m_dataGraphX.RemoveAll(); m_dataGraphY.RemoveAll(); if(bIsRedraw) Invalidate(); @@ -252,18 +253,19 @@ void CDrawGraph::DrawActualCurve(CDC *pDC, CRect rectCoord) CRect rectView; CRgn rgnTemp, rgnView; CPen penLine, *pOldPen; - INT_PTR nCount = m_dataGraphY.GetCount(); + INT_PTR nCountX = m_dataGraphX.GetCount(); + INT_PTR nCountY = m_dataGraphY.GetCount(); - if(nCount==0) + if(nCountX==0 || nCountY==0 || nCountX(m_dbResolutionX*(rectCoord.Width())); - nOffsetY = static_cast(m_dbResolutionY*(rectCoord.Height())*(dbData-m_dbStartY)); + nOffsetX = static_cast(m_dbResolutionX*(rectCoord.Width())*(dbDataX-m_dbStartX)); + nOffsetY = static_cast(m_dbResolutionY*(rectCoord.Height())*(dbDataY-m_dbStartY)); rgnTemp.CreateRectRgnIndirect(rectCoord); pDC->SelectObject(rgnTemp); @@ -271,14 +273,15 @@ void CDrawGraph::DrawActualCurve(CDC *pDC, CRect rectCoord) pOldPen = pDC->SelectObject(&penLine); - pDC->MoveTo(nOriginX, nOriginY-nOffsetY); + pDC->MoveTo(nOriginX+nOffsetX, nOriginY-nOffsetY); - for(int i=1; i(m_dbResolutionY*(rectCoord.Height())*(dbData-m_dbStartY)); - - pDC->LineTo(nOriginX+nOffsetX*i, nOriginY-nOffsetY); + dbDataX = m_dataGraphX.ElementAt(i); + dbDataY = m_dataGraphY.ElementAt(i); + nOffsetX = static_cast(m_dbResolutionX*(rectCoord.Width())*(dbDataX-m_dbStartX)); + nOffsetY = static_cast(m_dbResolutionY*(rectCoord.Height())*(dbDataY-m_dbStartY)); + pDC->LineTo(nOriginX+nOffsetX, nOriginY-nOffsetY); } pDC->SelectObject(pOldPen); GetClientRect(rectView); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp index 25a51e3..cf52fc6 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp @@ -41,6 +41,7 @@ IMPLEMENT_DYNAMIC(CSO7_Send_Parameter, CDialog) m_duration=0.0; m_TimerCnt=0; m_MotionDir=true; + m_DataXAxis=0.0; } //================================================================ CSO7_Send_Parameter::~CSO7_Send_Parameter() @@ -527,17 +528,15 @@ void CSO7_Send_Parameter::OnEnKillfocusEditSampleTimeScurve() m_SampleTime = atof(cTempValue); if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_POSTION_TIME))->GetCheck()) { - m_dbStartX=0; - m_dbEndX=m_SampleTime; - m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 + m_dbEndX=m_SampleTime*1000.0; + m_dbResolutionX=static_cast(1.0/(m_dbEndX-m_dbStartX)); m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY,TRUE); } else if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->GetCheck()) { - m_dbStartX=0; - m_dbEndX=m_SampleTime; - m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 + m_dbEndX=m_SampleTime*1000.0; + m_dbResolutionX=static_cast(1.0/(m_dbEndX-m_dbStartX)); m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY,TRUE); } @@ -570,35 +569,35 @@ void CSO7_Send_Parameter::OnBnClickedButtonStartSampleScurve() m_dPos=m_pSO7_Proto->g_machine.z._d_cur_pos_; } - m_dbStartX=0; - m_dbEndX=m_SampleTime; + m_nDivisionX=10; + m_nDivisionY=10; if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_POSTION_TIME))->GetCheck()) { - m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 - m_nDivisionX=10; - m_nDivisionY=10; - m_DrawGraph.SetCoordinateLabel(_T("时间(s)"),_T("位置(mm)")); + //m_dbStartX=0; + //m_dbEndX=m_SampleTime; + //m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 + m_DrawGraph.SetCoordinateLabel(_T("时间(ms)"),_T("位置(mm)")); } else if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->GetCheck()) { - m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 - m_nDivisionX=10; - m_nDivisionY=10; - m_DrawGraph.SetCoordinateLabel(_T("时间(s)"),_T("速度(mm/s)")); + //m_dbStartX=0; + //m_dbEndX=m_SampleTime; + //m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 + m_DrawGraph.SetCoordinateLabel(_T("时间(ms)"),_T("速度(mm/s)")); } else if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_POSTION))->GetCheck()) { - //m_dbStartY=0; - //m_dbEndY=50; - m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 - //m_dbResolutionY=static_cast(1/m_dbEndY); - m_nDivisionX=10; - m_nDivisionY=10; + //m_dbStartX=0; + //m_dbEndX=m_SampleTime; + //m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 m_DrawGraph.SetCoordinateLabel(_T("位置(mm)"),_T("速度(mm/s)")); } nCount=0; + m_DataXAxis=0.0; + m_dataGraphX.RemoveAll(); m_dataGraphY.RemoveAll(); + m_DrawGraph.RemoveGraphyData(FALSE); m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY); m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); m_TimerCnt=static_cast((m_SampleTime*1000)/m_TimerInterval); @@ -615,24 +614,23 @@ void CSO7_Send_Parameter::OnBnClickedButtonStopSampleScurve() //================================================================================================ void CSO7_Send_Parameter::Sample_Speed_Time_Curve() { + m_DataXAxis+=m_duration; + m_dataGraphX.Add(m_DataXAxis); if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_X))->GetCheck()) { m_pSO7_Proto->g_machine.x._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.x._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.x_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(((1000.0*(fabs(m_pSO7_Proto->g_machine.x._d_cur_pos_-m_dPos)))/m_duration))); m_dPos=m_pSO7_Proto->g_machine.x._d_cur_pos_; } else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Y))->GetCheck()) { m_pSO7_Proto->g_machine.y._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.y._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.y_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(1000.0*(fabs(m_pSO7_Proto->g_machine.y._d_cur_pos_-m_dPos)/m_duration))); m_dPos=m_pSO7_Proto->g_machine.y._d_cur_pos_; } else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Z))->GetCheck()) { m_pSO7_Proto->g_machine.z._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.z._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.z_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(1000.0*(fabs(m_pSO7_Proto->g_machine.z._d_cur_pos_-m_dPos)/m_duration))); m_dPos=m_pSO7_Proto->g_machine.z._d_cur_pos_; } @@ -641,10 +639,11 @@ void CSO7_Send_Parameter::Sample_Speed_Time_Curve() //================================================================================================ void CSO7_Send_Parameter::Sample_Position_Time_Curve() { + m_DataXAxis+=m_duration; + m_dataGraphX.Add(m_DataXAxis); if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_X))->GetCheck()) { m_pSO7_Proto->g_machine.x._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.x._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.x_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(m_pSO7_Proto->g_machine.x._d_cur_pos_); if (m_MotionDir) { @@ -677,7 +676,6 @@ void CSO7_Send_Parameter::Sample_Position_Time_Curve() else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Y))->GetCheck()) { m_pSO7_Proto->g_machine.y._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.y._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.y_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(m_pSO7_Proto->g_machine.y._d_cur_pos_); if (m_MotionDir) { @@ -711,7 +709,6 @@ void CSO7_Send_Parameter::Sample_Position_Time_Curve() else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Z))->GetCheck()) { m_pSO7_Proto->g_machine.z._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.z._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.z_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(m_pSO7_Proto->g_machine.z._d_cur_pos_); if (m_MotionDir) { @@ -749,24 +746,22 @@ void CSO7_Send_Parameter::Sample_Speed_Position_Curve() if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_X))->GetCheck()) { m_pSO7_Proto->g_machine.x._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.x._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.x_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(((1000.0*(fabs(m_pSO7_Proto->g_machine.x._d_cur_pos_-m_dPos)))/m_duration))); m_dPos=m_pSO7_Proto->g_machine.x._d_cur_pos_; } else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Y))->GetCheck()) { m_pSO7_Proto->g_machine.y._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.y._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.y_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(1000.0*(fabs(m_pSO7_Proto->g_machine.y._d_cur_pos_-m_dPos)/m_duration))); m_dPos=m_pSO7_Proto->g_machine.y._d_cur_pos_; } else if(((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Z))->GetCheck()) { m_pSO7_Proto->g_machine.z._d_cur_pos_ = m_pSO7_Proto->ScaleToMM(m_pSO7_Proto->g_machine.z._scale_pos._long_, m_pSO7_Proto->g_machine.s_machine_config.z_axis._scale_resolution); - m_duration=m_FinishTime-m_StartTime; m_dataGraphY.Add(static_cast(1000.0*(fabs(m_pSO7_Proto->g_machine.z._d_cur_pos_-m_dPos)/m_duration))); m_dPos=m_pSO7_Proto->g_machine.z._d_cur_pos_; } + m_dataGraphX.Add(m_dPos); }; //================================================================================================ void CSO7_Send_Parameter::OnTimer(UINT_PTR nIDEvent) @@ -782,6 +777,7 @@ void CSO7_Send_Parameter::OnTimer(UINT_PTR nIDEvent) { m_pSO7_Proto->_send_cmd_SO7_CMD_READ_AXIS_XYZ(); m_FinishTime=clock(); + m_duration=m_FinishTime-m_StartTime; if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->GetCheck()) { Sample_Speed_Time_Curve(); @@ -797,12 +793,26 @@ void CSO7_Send_Parameter::OnTimer(UINT_PTR nIDEvent) if (m_TimerCnt<=nCount) { KillTimer(1); - INT_PTR nTmpCount = m_dataGraphY.GetCount(); + INT_PTR nTmpCount = m_dataGraphX.GetCount(); double dbData(0.0); + dbData = m_dataGraphX.ElementAt(0); + m_dbEndX=dbData; + m_dbStartX=dbData; + for(INT_PTR i=1; i0.0 &&(dbData-m_dbEndX)0.0 &&(m_dbStartX-dbData)(1.0/(m_dbEndX-m_dbStartX)); + + nTmpCount = m_dataGraphY.GetCount(); dbData = m_dataGraphY.ElementAt(0); m_dbEndY=dbData; m_dbStartY=dbData; - for(INT_PTR i=10; i0.0 &&(dbData-m_dbEndY)(1.0/(m_dbEndY-m_dbStartY)); + m_dbResolutionY=static_cast(1.0/(m_dbEndY-m_dbStartY)); + + + m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY); m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); + m_DrawGraph.LoadGraphyXAxisData(m_dataGraphX); m_DrawGraph.LoadGraphyYAxisData(m_dataGraphY); } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h index 7f9d537..3d2505e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h @@ -30,6 +30,7 @@ public: double m_duration; CString m_csMSG; CEdit m_edMSG; + double m_DataXAxis; DataBuff m_dataGraphX; DataBuff m_dataGraphY; CDrawGraph m_DrawGraph; 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 98f93e1b2a9776dd24c8996fe704cd6ee9025be6..96dcace9ae1d114d1b11618e6be3e06692429916 100644 GIT binary patch delta 17404 zcmeI)3vdwYoWzb3I(*-)(RFe)LMo3Pnb~cSdDeYjx%Rxe#zP0 zv*(_>=j^wexs&VNnd9A=vvaPD=&Na3JUZe^eSLkRwNy@YwPr2V|DG%suJMP`W~TUy zjGj^?`?s2jA;DSfYymrvAiDbNB66j5(74I(i8h4Dx8}tZi&X!mm{w94*6Fs_`{QG) zgBmN;b;vbbVsGP-UeVq1BpnWpWvxR~TS3)A(>w=UR&l3n>)^1|-JLT{w}@i*bxl?L zp6*$#jfRd|`!Z5O`F(A%KF%m~HLm%KGFQpn*-~0r&#bk^ri<-O(>d2}SSX-CKyO2J_9*N+m?4oneg{r|^lpf77qW`^mC^yR8IB;FBZL2$R^dqBT+%BqC$=S~AjdGc=Dys{ef=XHGwlbch z@+Nsk_mxO#d#A}HCuy6U+B4$(fCb~ct$Nnnv3B|K89l1k$Jr5`M2z$75&2k;vSGTW z4aW%FgFM`ekr;*17=y7Ghw+$zd`!e7+=t1y9}i#(reYeVV+IN^6NM)sy!yIQz4M+V{iI&@FzXBP2o~W{EJit&U@4YiIaXjLDzFNx zu?Cf}uoml31sjiHJvQJ6*oYru6E){#;YmD&r|~1yU^||{4*VE9 zu?xH5$FtajS~z$PKf&|Zi+y+j`|% zM+71fg=oZ}HLgP}+Mq42M;zLrJvtb?emsSaNI)Wz&UCwk!~ z^v2Cd!7aEIx8Zi&f$yLX`XUu+=w~qg=@j}S1DVLe01U*P$VLtZ;k&pC-@{Iq5tDEqCgXlQfGL=YX_$@~D8NhovoQyAF%R=mj1nwBDS{e0;59T$Ouogw{S^`JWCiQ{+*uE^c_ALbB0P%4D8~{k z#WF0%3ams0R$(>Pz{*PRDy}#pQnw;%lXRIBRB*thxwNBpQHRKKdv&%x*nS~L&$PG1 zm}Bk04Q5~aRJK0AH%OQEnl|R>hD}lSm4wJ{&W5}6nxHVDiC}Hd8}Amrr5C23xYkOW z#$)AqmveZ8-Yd!pjL|oX+NpY`bZNIW-iEl#JD%zK3Sl3KHM=x6X;0~HR@>ejJ@v~= z$-Y^1sVLSg|C~b$YG>f+dw+S4n%nc{)=Ty+`|t0txs81FdKJDZ-TcBa>E_#{8+ONri7>UhxviN4R^apL zqB1++1fJB>jW0aup^n(0zbLKzi(c!^+9%>iv(udfQZjoe7%8C2`49ZtO zpI_&Qib_|4lkl>B>VLdQzRqi_W1AmF>RhRF_08WP)T~ppPR+XJJS?g!MO`WCN>Nuz z^Zv9{X`#|WrG-ihl@=-qRT8QsR7t3kP$i*CLY0In3BL_VC^J6wY3^rM)C^WL_}egp z)jU=6RLxWM%&DF^RT8QsR7t3kP$i*CLY0In2~`rRBveVLl29d~NQ1|rdZsqBp`fS!%uVw79 z`^THfcA&Ev?v%7OkI%P6951J delta 1585 zcma)6du&rx9KPqA+wR`2Y_#1<9fhr1$F@L6Un`q1*7de!BV^^V;j#_b0F4fUn~sS* zOsB$-EIM|gN73LOa!10$u`4_1j1(n8OjIyDW(Uf4vY4SZI`NOUQ5F4+F{Md*1NLl(0|5vzUu;l}OOGUoz{l*8rz|Tg;6&B9 zxhe!Q@o3dI_zT{yTEi3qE-@D4j!hf!!4GCDpOgjw_6)_7@L?z@y6Qi`z*>nHITKT+ z#{8Psw*&IsZs1WowP8TQ0pKQK2hb?qji0FoHlO8%bf!(5)T{GY$tIxOZ&b(iG(cQ; zOQUGEMZmyL9~3l9HG5L2G{1DIj31f`&j2H39f^3JuE zFErHTCXB85It(#bsh6{1rQ8MK;7$nDIMS6$O|QbAf&4Or@?NNx_psfz@rh*lIvAi8 zufwANclK_fTRLH9SeE|38<;4mVgP0&IuJ+NWE_EyQ^^WHy;kF^Ys zUS2zUh0#Q`Ss;aebP>L71!McWl{Z7ka?*mXBh0UyPD46$8_5ESC!N0lV>AqD_xC?N zXhG1THaHO%$B`4VaD@z&AwRi&NT?-sKR}+;Eklo!8>L8+mm)~aW#|AsunZlEBWG8k zV$!8ouP4tsb<^fZPPfN8<63BQ0meP=cz zC~rsVzWN#zFYjZzp9UFui_Nf=P(FzGzSbIMAtTm~k9XpZy@~l87d>HK&d)93%D8gI zqeI0Jju$u%PDKAx(9?aWgr7(_cpQacQvHN3_P|X`>@%Y--4D4iJC>!KV|NelcV-dK z^T>iVM>VAJ1X|u1@KEyrx~V5!Pa<=tDuZTxiEaRTMnT28w(teSz|-&rm9CKVWQf0O zTVu)Yoqm_`B+`{B{$;SC*gWTczdg@{2rDdj9-Gvm?U+rycCk8~_zCNXj#w|N#czT#mW@t!2+DzuokXX~(rbYzR~ z(CU2MuZUhdC7gSP9