DIRECTORY Menus USING [MouseButton, Menu, MenuEntry, MenuLine, MenuProc, AppendMenuEntry, ChangeNumberOfLines, CreateMenu, CreateEntry, GetNumberOfLines, GetLine, SetLine], PopUpSelection USING [Request], IO, Rope, TiogaMenuOps USING [AllLevels, FewerLevels, FirstLevelOnly, MoreLevels, Normalize, Position, PrevPlace], TiogaOps USING [SearchDir, FindDef, FindText, FindWord], ViewerBLT USING [ChangeNumberOfLines], ViewerClasses USING [Viewer], ViewerOps USING [BlinkIcon, FetchProp], WalnutDisplayerInternal USING [MsgGvId], WalnutMsgSetDisplayerPrivate USING [MsgSetInfo, MsgSetFieldHandle, MsgInfo, AddProc, AppendMsgProc, CategoriesProc, DeleteProc, DisplayProc, MoveToProc, NewMailProc, PrintSelectedProc], WalnutOps USING [SizeOfMsgSet], WalnutOpsExtras USING [GetMsgSize], WalnutPrintOps USING [MsgSetPrintProc, MsgSetTOCPrintProc], WalnutSendOps USING [WalnutSendProc], WalnutViewer USING [CreateMenuEntry], WalnutWindowInternal USING [MsgSetButton, Report, walnutQueue]; WalnutDisplayerMenusImpl: CEDAR PROGRAM IMPORTS IO, Rope, WalnutDisplayerInternal, WalnutMsgSetDisplayerPrivate, WalnutOps, WalnutOpsExtras, WalnutPrintOps, WalnutSendOps, WalnutViewer, WalnutWindowInternal, Menus, PopUpSelection, TiogaMenuOps, TiogaOps, ViewerBLT, ViewerOps EXPORTS WalnutMsgSetDisplayerPrivate SHARES Menus = BEGIN OPEN WalnutMsgSetDisplayerPrivate, WalnutPrintOps; Viewer: TYPE = ViewerClasses.Viewer; ROPE: TYPE = Rope.ROPE; displayerMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; activeMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; deletedMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; buildingMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; readOnlyMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; placesMenuEntry: Menus.MenuEntry; levelsMenuEntry: Menus.MenuEntry; FindProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; IF ~TiogaOps.FindText[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; WordProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; IF ~TiogaOps.FindWord[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; DefProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; IF ~TiogaOps.FindDef[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; PositionProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.Position[msI.tiogaViewer]; }; NormalizeProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.Normalize[msI.tiogaViewer]; }; PrevPlaceProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.PrevPlace[msI.tiogaViewer]; }; FirstOnlyProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.FirstLevelOnly[msI.tiogaViewer]; }; MoreLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.MoreLevels[msI.tiogaViewer]; }; FewerLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.FewerLevels[msI.tiogaViewer]; }; AllLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.AllLevels[msI.tiogaViewer]; }; GVIDProc: PROC[msViewer: Viewer, all: BOOL] = { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; selected: MsgSetFieldHandle; IF msI = NIL THEN RETURN; selected _ msI.selected; IF selected = NIL THEN RETURN; WalnutDisplayerInternal.MsgGvId[selected.msgInfo.msg, all]; }; NewMail: Menus.MenuProc = { viewer: Viewer = NARROW[parent]; WalnutMsgSetDisplayerPrivate.NewMailProc[viewer]; }; LevelsProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], levelsMenuEntry] }; PlacesProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], placesMenuEntry] }; GetDirection: PROC[mb: Menus.MouseButton] RETURNS[sd: TiogaOps.SearchDir] = { SELECT mb FROM red => RETURN[forwards]; yellow => RETURN[anywhere]; blue => RETURN[backwards]; ENDCASE; }; OpsProc: Menus.MenuProc = { viewer: Viewer = NARROW[parent]; which: INT = PopUpSelection.Request[ header: "MessageOps", choice: LIST["Sender", "Size Of MsgSet", "Categories", "Size Of Msg", "gvID of Msg", "Append Msg", "PressPrintMsgSet", "Interpress3.0PrintMsgSet", "PressPrintSelectedMsg", "Interpress3.0PrintSelectedMsg", "PressPrintTOC", "Interpress3.0PrintTOC" ] ]; SELECT which FROM 1 => WalnutSendOps.WalnutSendProc[fromExec: FALSE]; 2 => { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[viewer, $MsgSetInfo]]; msgSet: ROPE = msI.button.msgSet.name; num: INT = WalnutOps.SizeOfMsgSet[msgSet].messages; WalnutWindowInternal.Report[ IO.PutFR[" %g msgs in MsgSet %g", IO.int[num], IO.rope[msgSet]]]; }; 3 => WalnutMsgSetDisplayerPrivate.CategoriesProc[viewer]; 4 => { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[viewer, $MsgSetInfo]]; selected: MsgSetFieldHandle; textLen, formatLen: INT; msg: ROPE; IF msI = NIL THEN RETURN; selected _ msI.selected; IF selected = NIL THEN RETURN; [textLen, formatLen] _ WalnutOpsExtras.GetMsgSize[msg _ selected.msgInfo.msg]; IF formatLen # 0 THEN WalnutWindowInternal.Report[IO.PutFR["Formatted Msg \" %g\" has %g bytes of text", IO.rope[msg], IO.int[textLen] ]] ELSE WalnutWindowInternal.Report[IO.PutFR["Msg \"%g\" has %g bytes of text", IO.rope[msg], IO.int[textLen] ]]; }; 5 => GVIDProc[viewer, mouseButton#red]; 6 => WalnutMsgSetDisplayerPrivate.AppendMsgProc[viewer]; 7 => WalnutPrintOps.MsgSetPrintProc[viewer: viewer, usePress: TRUE]; 8 => WalnutPrintOps.MsgSetPrintProc[viewer: viewer, usePress: FALSE]; 9 => WalnutMsgSetDisplayerPrivate.PrintSelectedProc[viewer: viewer, usePress: TRUE]; 10 => WalnutMsgSetDisplayerPrivate.PrintSelectedProc[viewer: viewer, usePress: FALSE]; 11 => WalnutPrintOps.MsgSetTOCPrintProc[viewer: viewer, usePress: TRUE]; 12 => WalnutPrintOps.MsgSetTOCPrintProc[viewer: viewer, usePress: FALSE]; ENDCASE => NULL; }; ChangeMenu: PROC [viewer: ViewerClasses.Viewer, subMenu: Menus.MenuEntry] = { menu: Menus.Menu = viewer.menu; found: BOOL _ FALSE; numLines: Menus.MenuLine = Menus.GetNumberOfLines[menu]; newLines: Menus.MenuLine _ numLines; IF viewer.destroyed THEN RETURN; FOR i: Menus.MenuLine IN [1..numLines) DO -- see if already showing the submenu IF Rope.Equal[Menus.GetLine[menu,i].name, subMenu.name] THEN { -- yes, so remove it FOR j: Menus.MenuLine IN (i..numLines) DO Menus.SetLine[menu, j-1, Menus.GetLine[menu, j]]; ENDLOOP; newLines _ newLines-1; found _ TRUE; EXIT }; ENDLOOP; IF ~found THEN { -- add it. do insertion sort to get it in the right place GoesBefore: PROC [m1, m2: Menus.MenuEntry] RETURNS [BOOL] = { Priority: PROC [m: Menus.MenuEntry] RETURNS [INTEGER] = { RETURN [SELECT TRUE FROM Rope.Equal[m.name, "Find"] => 2, Rope.Equal[m.name, "FirstLevelOnly"] => 1, Rope.Equal[m.name, "Categories"] => 0, ENDCASE => -1 -- unknown menu goes at bottom -- ] }; RETURN [Priority[m1] > Priority[m2]] }; newLast: Menus.MenuLine = MIN[numLines, LAST[Menus.MenuLine]]; newLines _ newLines+1; FOR i: Menus.MenuLine IN [1..numLines) DO IF GoesBefore[subMenu, Menus.GetLine[menu, i]] THEN { -- put it here FOR j: Menus.MenuLine DECREASING IN (i..newLast] DO Menus.SetLine[menu, j, Menus.GetLine[menu, j-1]]; ENDLOOP; Menus.SetLine[menu, i, subMenu]; found _ TRUE; EXIT }; ENDLOOP; IF ~found THEN Menus.SetLine[menu, newLast, subMenu]; }; ViewerBLT.ChangeNumberOfLines[viewer, newLines]; }; BuildDisplayerMenus: PROC = BEGIN OPEN WalnutWindowInternal; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Delete", DeleteProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AddTo", AddProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Find", FindProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Word", WordProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Def", DefProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Position", PositionProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Normalize", NormalizeProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "PrevPlace", PrevPlaceProc], 1]; placesMenuEntry _ Menus.GetLine[displayerMenu, 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "FirstLevelOnly", FirstOnlyProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoreLevels", MoreLevelsProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "FewerLevels", FewerLevelsProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AllLevels", AllLevelsProc], 2]; levelsMenuEntry _ Menus.GetLine[displayerMenu, 2]; Menus.ChangeNumberOfLines[displayerMenu, 1]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Delete", DeleteProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AddTo", AddProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["NewMail", NewMail]]; -- "immediate" Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[activeMenu, 1, placesMenuEntry]; Menus.SetLine[activeMenu, 2, levelsMenuEntry]; Menus.ChangeNumberOfLines[activeMenu, 1]; Menus.AppendMenuEntry[deletedMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[deletedMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[deletedMenu, 1, placesMenuEntry]; Menus.SetLine[deletedMenu, 2, levelsMenuEntry]; Menus.ChangeNumberOfLines[deletedMenu, 1]; Menus.AppendMenuEntry[readOnlyMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[readOnlyMenu, 1, placesMenuEntry]; Menus.SetLine[readOnlyMenu, 2, levelsMenuEntry]; Menus.ChangeNumberOfLines[readOnlyMenu, 1]; END; BuildDisplayerMenus[]; END. "WalnutDisplayerMenusImpl.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reserved. Willie-Sue, October 6, 1986 2:54:51 pm PDT Contents: Implementation of the menus for WalnutMsgSet displayers. (Changed message set version number to be part of viewer information, rather than part of message set buttons) (Changed to use TiogaButtons - May 6, 1985) Types Menus used in message set displays Error message Getting the menu changed Menus.ChangeNumberOfLines[menu, newLast-1]; higher priority means goes above in series of submenus looks at rope for first item to identify the subMenu. Menus.ChangeNumberOfLines[menu, newLast+1]; ViewerOps.EstablishViewerPosition[viewer, viewer.wx, viewer.wy, viewer.ww, viewer.wh]; ViewerOps.PaintViewer[viewer, all]; * * * * * * * * * * * * * * * * * * * * * * Menu for generic Displayer second line third line Menu for Active second line third line Menu for Deleted second line third line Menu for ReadOnly database second line third line * * * * * * * * * * * * * * * * * * * * * * * * * start code Κ Υ˜šΟn™Icodešœ Οmœ7™BJ™*—J™JšœB™BJ˜J™nJ™+J˜šΟk ˜ šœŸœ3˜>Jšœc˜c—JšœŸœ ˜JšŸœ˜J˜šœ Ÿœ@˜RJšœ˜—Jšœ Ÿœ*˜8Jšœ Ÿœ˜&JšœŸœ ˜Jšœ Ÿœ˜'J˜JšœŸœ ˜(šœŸœ)˜KJšœL˜LJšœ ˜ —Jšœ Ÿœ˜JšœŸœ˜#JšœŸœ'˜;JšœŸœ˜%Jšœ Ÿœ˜%JšœŸœ%˜?J˜JšœŸœŸ˜'šŸ˜JšŸœ˜ J˜6Jšœ:˜:Jšœ#˜#Jšœ.˜.Jšœ˜—šŸ˜J˜—šŸ˜J˜——J˜JšŸœŸœ.˜8head™JšœŸœ˜$JšŸœŸœŸœ˜—™"JšœŸœ!˜6Jšœ Ÿœ!˜3Jšœ Ÿœ!˜4JšœŸœ!˜5JšœŸœ!˜5J˜Jšœ!˜!Jšœ!˜!—™ šœ˜JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜šŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜šœ˜JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜šŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜šœ˜JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜šŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜š œ˜ JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ'˜'J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ(˜(J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ(˜(J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ-˜-J˜—J˜šœ˜"JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ)˜)J˜—J˜šœ˜#JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ*˜*J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšŸœŸœŸœŸœ˜Jšœ(˜(J˜—J˜šœŸœŸœ˜/JšœŸœ-˜EJšœ˜J˜JšŸœŸœŸœŸœ˜Jšœ˜JšŸœ ŸœŸœŸœ˜Jšœ;˜;J˜—J˜šœ˜JšœŸœ ˜ Jšœ1˜1J˜—K˜Kš œ Ÿœ˜MJ˜Jš œ Ÿœ˜MJ˜š œŸœŸœ˜MšŸœŸ˜JšœŸœ ˜Jšœ Ÿœ ˜JšœŸœ ˜—JšŸœ˜J˜—J˜šœ˜JšœŸœ ˜ šœŸœ˜ šœ˜Jšœ˜šœŸœ˜(Jšœ9˜9Jšœ/˜/Jšœ9˜9Jšœ(˜(—Jšœ˜——J˜šŸœŸ˜Jšœ-Ÿœ˜4šœ˜JšœŸœ+˜CJšœŸœ˜&JšœŸœ*˜3šœ˜JšŸœ Ÿœ Ÿœ˜A—J˜—Jšœ:˜:šœ˜JšœŸœ+˜CJšœ˜JšœŸœ˜JšœŸœ˜ JšŸœŸœŸœŸœ˜Jšœ˜JšŸœ ŸœŸœŸœ˜JšœN˜NšŸœŸ˜šœŸœ4˜RJšœŸœ Ÿœ˜"—šŸœŸœ)˜LJšœŸœ Ÿœ˜"——J˜—Jšœ(˜(Jšœ9˜9Jšœ?Ÿœ˜EJšœ?Ÿœ˜FJšœOŸœ˜UJšœOŸœ˜VJšœBŸœ˜HJšœBŸœ˜IJ˜JšŸœŸœ˜—Jšœ˜—J˜K™KšΟl™K˜š œŸœ=˜MK˜KšœŸœŸœ˜K˜8K˜$KšŸœŸœŸœ˜ šŸœŸœŸœΟc%˜OšŸœ6Ÿœ‘˜SšŸœŸœŸ˜)K˜1KšŸœ˜—Kšœ+™+K˜KšœŸœŸœ˜K˜—KšŸœ˜—šŸœŸœ‘:˜Kš œŸœŸœŸœ˜=šœŸœŸœŸœ˜9Kšœ6™6Kšœ5™5šŸœŸœŸœŸ˜K˜ K˜*K˜&KšŸœ‘!œ˜2—K˜—KšŸœ˜%K˜—KšœŸœ Ÿœ˜>K˜Kšœ+™+šŸœŸœŸ˜)šŸœ-Ÿœ‘˜DšŸœŸ œŸœŸ˜3Kšœ2Ÿœ˜:—K˜ KšœŸœŸœ˜K˜—KšŸœ˜—KšŸœŸœ'˜5K˜—KšœV™VKšœ#™#K˜0K˜——J˜J™+˜šœŸœ˜šŸ œŸ˜ J˜—šΟb™˜$J˜A—˜%J˜C—˜%J˜A—˜%J˜=—JšœN˜NJšœN˜NJšœK˜K—J˜šœ ™ ˜%Jšœ@˜@—˜%Jšœ@˜@—˜%Jšœ>˜>—˜%JšœH˜H—˜%JšœJ˜J—˜%JšœJ˜J—J˜2J˜—šœ ™ ˜%J˜O—˜%J˜L—˜%J˜N—˜%J˜J—J˜2J˜,J˜J˜—š’™˜!J˜A—˜"J˜C—˜"J˜A—˜"J˜=—˜!Jšœ)‘˜7—JšœK˜KJšœK˜KJšœH˜H—J™šœ ™ J˜.J˜—šœ ™ J˜.J˜)—J˜J˜š™˜"J˜A—˜#J˜C—JšœL˜LJšœL˜LJšœI˜I—J™šœ ™ J˜/—J˜šœ ™ Jšœ/˜/Jšœ*˜*J˜—J˜š™˜$J˜C—JšœM˜MJšœM˜MJšœJ˜J—J™šœ ™ Jšœ0˜0J˜—šœ ™ Jšœ0˜0J˜+—J˜JšŸœ˜——J˜J˜Jšœ2™2Jšœ ™ ˜J˜—J˜JšŸœ˜J˜J˜—…—/θ?ί