DIRECTORY Commander USING [CommandProc, Handle, Register], Convert USING [Error, IntFromRope], FS USING [SetKeep], IO, Rope, Buttons USING [Button, ButtonProc, Create, ReLabel], Containers USING [ChildXBound, ChildYBound], Labels USING [Create], Menus USING [ClickProc], PopUpSelection USING [Request], Rules USING [Create], RuntimeError USING [BoundsFault], TypeScript USING [Create], ViewerClasses USING [Viewer, ViewerRec], ViewerIO USING [CreateViewerStreams], ViewerOps USING [CreateViewer], ViewerTools USING [GetContents, MakeNewTextViewer, SetContents, SetSelection], SoftcardOps; SoftcardTool: CEDAR MONITOR IMPORTS Commander, Convert, FS, IO, PopUpSelection, RuntimeError, Buttons, Containers, Labels, Rules, TypeScript, ViewerIO, ViewerOps, ViewerTools, SoftcardOps = BEGIN OPEN IO; STREAM: TYPE = IO.STREAM; ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; ClickProc: TYPE = Menus.ClickProc; entryHeight: INTEGER = 14; xFudge: INTEGER = 4; tsViewer, topViewer: Viewer; tsOut: STREAM; runOrStopButton: Viewer; runChoice: ROPE = " DragonRun "; stopChoice: ROPE = " DragonStop "; isRunning: BOOL _ FALSE; connectionText: Viewer; freqSelectText: Viewer; phaseAdjustText: Viewer; delayText: Viewer; MakeControlWindow: PROC[name, tsLogFile: ROPE] RETURNS [STREAM] = { IF topViewer = NIL OR topViewer.destroyed THEN { y: INTEGER; sib: Viewer; topViewer _ ViewerOps.CreateViewer[ flavor: $Container, info: [name: name, iconic: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [ name: " EstablishConnection ", parent: topViewer, wx: 3, wy: 4, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: OpenConnectionProc ]; sib _ Buttons.Create[ info: [ name: " CloseConnection ", parent: topViewer, wx: sib.wx+sib.ww+1, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: CloseConnectionProc ]; sib _ Buttons.Create[ info: [ name: "Host:", parent: topViewer, wx: sib.wx+sib.ww+10, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE], proc: ConnectionTextProc ]; sib _ connectionText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, ww: 1000, wh: entryHeight, border: FALSE, scrollable: TRUE]]; Containers.ChildXBound[topViewer, sib]; sib _ Labels.Create[ info: [ name: " ControlBits ", parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [ name: " Read ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ReadControlBits ]; sib _ Buttons.Create[ info: [name: " Set ", parent: topViewer, wx: sib.wx+sib.ww+1, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE ], proc: SetControlBits ]; sib _ Buttons.Create[ info: [name: " Reset ", parent: topViewer, wx: sib.wx+sib.ww+1, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE ], proc: ResetControlBits ]; sib _ Labels.Create[ info: [ name: " StatusBits ", parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [ name: " Read ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ReadStatusBits ]; sib _ Buttons.Create[ info: [name: " Reset ", parent: topViewer, wx: sib.wx+sib.ww+1, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE ], proc: ResetStatusBits ]; sib _ Labels.Create[ info: [ name: " ClockControl ", parent: topViewer, wx: 3, wy: sib.wy+sib.wh+2, wh: entryHeight, border: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [name: "Read", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], proc: ReadClockControl ]; sib _ Buttons.Create[ info: [name: "Write", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], proc: WriteClockControl ]; sib _ Buttons.Create[ info: [name: "FreqSelect [0..3]", parent: topViewer, wx: sib.wx+sib.ww+xFudge+1, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], proc: FreqSelectProc ]; sib _ freqSelectText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge+2, wy: sib.wy, ww: 20, wh: entryHeight, border: FALSE, scrollable: FALSE]]; sib _ Buttons.Create[ info: [name: "PhaseAdjust [0..7]", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], proc: PhaseAdjustProc ]; sib _ phaseAdjustText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge+2, wy: sib.wy, ww: 20, wh: entryHeight, border: FALSE, scrollable: FALSE]]; sib _ Buttons.Create[ info: [name: "Delay [0..7]", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], proc: DelayProc ]; sib _ delayText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge+2, wy: sib.wy, ww: 20, wh: entryHeight, border: FALSE, scrollable: FALSE]]; sib _ runOrStopButton _ Buttons.Create[ info: [ name: runChoice, parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: RunOrStopProc ]; sib _ Buttons.Create[ info: [ name: " ResetDragon ", parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ResetProc ]; sib _ Buttons.Create[ info: [ name: " ReadClock ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ReadClockProc ]; sib _ Buttons.Create[ info: [ name: " EUPBusData ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: EUPBusDataProc ]; sib _ Buttons.Create[ info: [ name: " IFUPBusData ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: IFUPBusDataProc ]; sib _ Buttons.Create[ info: [ name: " EUPBusCmd ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: EUPBusCmdProc ]; sib _ Buttons.Create[ info: [ name: " IFUPBusCmd ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: IFUPBusCmdProc ]; sib _ Buttons.Create[ info: [ name: " ResetEUCacheStateMachine ", parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ResetEUCacheStateProc ]; sib _ Buttons.Create[ info: [ name: " ResetIFUCacheStateMachine ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ResetIFUCacheStateProc ]; sib _ Buttons.Create[ info: [ name: " ResetCounter ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: ResetCounterProc ]; sib _ Buttons.Create[ info: [ name: " DisableEUCache ", parent: topViewer, wx: 3, wy: sib.wy + sib.wh + 2, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: DisableEUCacheProc ]; sib _ Buttons.Create[ info: [ name: " DisableIFUCache ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: DisableIFUCacheProc ]; sib _ Buttons.Create[ info: [ name: " FlushEUCache ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: FlushEUCacheProc ]; sib _ Buttons.Create[ info: [ name: " FlushIFUCache ", parent: topViewer, wx: sib.wx+sib.ww+5, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], proc: FlushIFUCacheProc ]; sib _ Rules.Create[ info: [parent: topViewer, wy: sib.wy+sib.wh+1, ww: topViewer.ww, wh: 2]]; Containers.ChildXBound[topViewer, sib]; y _ sib.wy+sib.wh+4; tsViewer _ TypeScript.Create[ info: [parent: topViewer, ww: sib.cw, wy: y, wh: topViewer.ch - y, border: FALSE] ]; Containers.ChildYBound[topViewer, tsViewer]; Containers.ChildXBound[topViewer, tsViewer]; tsOut _ ViewerIO.CreateViewerStreams[NIL, tsViewer, tsLogFile, FALSE].out; FS.SetKeep[tsLogFile, 6]; tsOut.PutF["\tTypescript on file: %g\n", IO.rope[tsLogFile]]; tsOut.Flush[]; }; topViewer.inhibitDestroy _ TRUE; RETURN[tsOut]; }; OpenConnectionProc: ClickProc = { name: ROPE = ViewerTools.GetContents[connectionText]; ok: BOOL = SoftcardOps.EstablishConnection[name]; IF ok THEN tsOut.PutF["Connection to %g has been established\n", IO.rope[name]] ELSE tsOut.PutF["Could not establish connection with %g has \n", IO.rope[name]]; }; CloseConnectionProc: ClickProc = { SoftcardOps.CloseConnection[]; tsOut.PutRope["Connection has been closed\n\n"]; }; ReadControlBits: ClickProc = { which: SoftcardOps.ControlBit; name: ROPE; val: BOOL; [which, name] _ SelectControlBit[]; IF name = NIL THEN RETURN; val _ SoftcardOps.ReadControlBit[which]; tsOut.PutF[" %g is %g\n", IO.rope[name], IO.bool[val] ]; }; SetControlBits: ClickProc = { which: SoftcardOps.ControlBit; name: ROPE; prev: BOOL; [which, name] _ SelectControlBit[]; IF name = NIL THEN RETURN; prev _ SoftcardOps.SetControlBit[which]; tsOut.PutF[" %g has been set: previous value was %g\n", IO.rope[name], IO.bool[prev] ]; }; ResetControlBits: ClickProc = { which: SoftcardOps.ControlBit; name: ROPE; prev: BOOL; [which, name] _ SelectControlBit[]; IF name = NIL THEN RETURN; prev _ SoftcardOps.ResetControlBit[which]; tsOut.PutF[" %g has been reset: previous value was %g\n", IO.rope[name], IO.bool[prev] ]; }; controlBitList: LIST OF ROPE = LIST[ "resetDragon", "notInterruptDragonToIOP", "interruptDragonToMesa", "dragonRun", "dragonStep", "writeParity", "virtualMemAccessIOP", "virtualMemAccessMesa", "virtualMemAccessIFU", "virtualMemAccessEU", "resetIFUCacheStateMachine", "notResetIFUCache", "ifuBreakpointEnabled", "resetEUCacheStateMachine", "notResetEUCache", "euBreakpointEnabled", "iopIntToDragon", "mesaIntToDragon", "notResetCounter"]; SelectControlBit: PROC RETURNS[SoftcardOps.ControlBit, ROPE] = { which: INT = PopUpSelection.Request[ header: "ControlBit", choice: controlBitList]; SELECT which FROM 1 => RETURN[resetDragon, "resetDragon"]; 2 => RETURN[notInterruptDragonToIOP, "notInterruptDragonToIOP"]; 3 => RETURN[interruptDragonToMesa, "interruptDragonToMesa"]; 4 => RETURN[dragonRun, "dragonRun"]; 5 => RETURN[dragonStep, "dragonStep"]; 6 => RETURN[writeParity, "writeParity"]; 7 => RETURN[virtualMemAccessIOP, "virtualMemAccessIOP"]; 8 => RETURN[virtualMemAccessMesa, "virtualMemAccessMesa"]; 9 => RETURN[virtualMemAccessIFU, "virtualMemAccessIFU"]; 10 => RETURN[virtualMemAccessEU, "virtualMemAccessEU"]; 11 => RETURN[resetIFUCacheStateMachine, "resetIFUCacheStateMachine"]; 12 => RETURN[notResetIFUCache, "notResetIFUCache"]; 13 => RETURN[ifuBreakpointEnabled, "ifuBreakpointEnabled"]; 14 => RETURN[resetEUCacheStateMachine, "resetEUCacheStateMachine"]; 15 => RETURN[notResetEUCache, "notResetEUCache"]; 16 => RETURN[euBreakpointEnabled, "euBreakpointEnabled"]; 17 => RETURN[iopIntToDragon, "iopIntToDragon"]; 18 => RETURN[mesaIntToDragon, "mesaIntToDragon"]; 19 => RETURN[notResetCounter, "notResetCounter"]; ENDCASE => RETURN[resetDragon, NIL]; }; ReadStatusBits: ClickProc = { which: SoftcardOps.StatusBit; name: ROPE; val: BOOL; [which, name] _ SelectStatusBit[]; IF name = NIL THEN RETURN; val _ SoftcardOps.ReadStatusBit[which]; tsOut.PutF[" %g is %g\n", IO.rope[name], IO.bool[val] ]; }; ResetStatusBits: ClickProc = { which: SoftcardOps.StatusBit; name: ROPE; prev: BOOL; [which, name] _ SelectStatusBit[]; IF name = NIL THEN RETURN; IF which = dOutIFU OR which = dOutEU OR which = phaseA THEN tsOut.PutF["Cannot reset %g\n", IO.rope[name] ] ELSE { prev _ SoftcardOps.ResetStatusBit[which]; tsOut.PutF[" %g has been reset: previous value was %g\n", IO.rope[name], IO.bool[prev] ]; }; }; statusBitList: LIST OF ROPE = LIST[ "dOutIFU", "dOutEU", "phaseA", "periodicIntToDragon", "notMemoryError", "euBkptReached", "ifuBkptReached", "mapError"]; SelectStatusBit: PROC RETURNS[SoftcardOps.StatusBit, ROPE] = { which: INT = PopUpSelection.Request[ header: "StatusBit", choice: statusBitList]; SELECT which FROM 1 => RETURN[dOutIFU, "dOutIFU"]; 2 => RETURN[dOutEU, "dOutEU"]; 3 => RETURN[phaseA, "phaseA"]; 4 => RETURN[periodicIntToDragon, "periodicIntToDragon"]; 5 => RETURN[notMemoryError, "notMemoryError"]; 6 => RETURN[euBkptReached, "euBkptReached"]; 7 => RETURN[ifuBkptReached, "ifuBkptReached"]; 8 => RETURN[mapError, "mapError"]; ENDCASE => RETURN[dOutIFU, NIL]; }; ReadClockControl: ClickProc = { current: SoftcardOps.ClockControl = SoftcardOps.ReadClockControl[]; tsOut.PutF[ " Current value of clock control is: [freqSelect: %g, phaseAdjust: %g, delay: %g]\n", IO.int[current.freqSelect], IO.int[current.phaseAdjust], IO.int[current.delay] ]; ViewerTools.SetContents[freqSelectText, IO.PutFR[NIL, IO.int[current.freqSelect]] ]; ViewerTools.SetContents[phaseAdjustText, IO.PutFR[NIL, IO.int[current.freqSelect]] ]; ViewerTools.SetContents[delayText, IO.PutFR[NIL, IO.int[current.delay]] ]; }; WriteClockControl: ClickProc = { ENABLE RuntimeError.BoundsFault => GOTO oops; new: SoftcardOps.ClockControl; new.freqSelect _ GetAsInt[freqSelectText]; new.freqSelect _ GetAsInt[phaseAdjustText]; new.delay _ GetAsInt[delayText]; SoftcardOps.WriteClockControl[new]; tsOut.PutRope[" New value of clockControl has been set\n"]; EXITS oops => tsOut.PutRope["Boundsfault doing clockcontrol - not done\n"]; }; GetAsInt: PROC[who: Viewer] RETURNS[val: INT] = { rope: ROPE = ViewerTools.GetContents[who]; val _ -1; val _ Convert.IntFromRope[rope ! Convert.Error => CONTINUE]; }; RunOrStopProc: ClickProc = { IF isRunning THEN { SoftcardOps.DragonStop[]; Buttons.ReLabel[runOrStopButton, runChoice]; } ELSE { SoftcardOps.DragonRun[]; Buttons.ReLabel[runOrStopButton, stopChoice]; }; isRunning _ ~isRunning; }; ResetProc: ClickProc = { tsOut.PutRope[" Not yet implemented - ResetDragon\n"] }; ReadClockProc: ClickProc = { val: LONG CARDINAL = SoftcardOps.ReadClock[]; tsOut.PutF[" Current clock reading is: %xH\n", IO.card[val] ]; }; EUPBusDataProc: ClickProc = { val: LONG CARDINAL = SoftcardOps.ReadEUPBusData[]; tsOut.PutF[" EUPBusData: %xH\n", IO.card[val] ]; }; IFUPBusDataProc: ClickProc = { val: LONG CARDINAL = SoftcardOps.ReadIFUPBusData[]; tsOut.PutF[" IFUPBusData: %xH\n", IO.card[val] ]; }; EUPBusCmdProc: ClickProc = { val: SoftcardOps.EUPBusCmd = SoftcardOps.ReadEUPBusCmd[]; tsOut.PutF[" EUPBusCmd: %xH\n", IO.card[val] ]; }; IFUPBusDataProc: ClickProc = { val: SoftcardOps.IFUPBusCmd = SoftcardOps.ReadIFUPCmdData[]; tsOut.PutF[" IFUPBusCmd: %xH\n", IO.card[val] ]; }; ResetEUCacheStateProc: ClickProc = { SoftcardOps.ResetEUCacheStateMachine[]; tsOut.PutRope[" ResetEUCacheStateMachine has been done\n"]; }; ResetIFUCacheStateProc: ClickProc = { SoftcardOps.ResetIFUCacheStateMachine[]; tsOut.PutRope[" ResetIFUCacheStateMachine has been done\n"]; }; ResetCounterProc: ClickProc = { SoftcardOps.ResetCounter[]; tsOut.PutRope[" ResetCounter has been done\n"]; }; DisableEUCacheProc: ClickProc = { SoftcardOps.DisableEUCache[]; tsOut.PutRope[" DisableEUCache has been done\n"]; }; DisableIFUCacheProc: ClickProc = { SoftcardOps.DisableIFUCache[]; tsOut.PutRope[" DisableIFUCache has been done\n"]; }; FlushEUCacheProc: ClickProc = { SoftcardOps.FlushEUCache[]; tsOut.PutRope[" FlushEUCache has been done\n"]; }; FlushIFUCacheProc: ClickProc = { SoftcardOps.FlushIFUCache[]; tsOut.PutRope[" FlushIFUCache has been done\n"]; }; ConnectionTextProc: ClickProc = { ViewerTools.SetSelection[connectionText, NIL] }; FreqSelectProc: ClickProc = { ViewerTools.SetSelection[freqSelectText, NIL] }; PhaseAdjustProc: ClickProc = { ViewerTools.SetSelection[phaseAdjustText, NIL] }; DelayProc: ClickProc = { ViewerTools.SetSelection[delayText, NIL] }; SoftcardTool: Commander.CommandProc = { [] _ MakeControlWindow["SoftcardTool","///temp/SoftcardTool.log"]; topViewer.inhibitDestroy _ FALSE; }; Commander.Register["SoftcardTool", SoftcardTool]; END. SoftcardTool.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Willie-Sue, February 10, 1987 1:33:32 pm PST variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * line 1 of Buttons line 2 of Buttons - ControlBits line 3 of Buttons - StatusBits line 4 of Buttons line 5 of Buttons line 6 of Buttons - miscellaneous line 7 of Buttons - miscellaneous line 8 of Buttons - miscellaneous the rest of the viewer - typescript * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Κ2˜codešœ™Kšœ<™—Jšœ'˜'J˜—™šœ˜šœ1˜1Jšœ1˜1Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ*˜*Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ(˜(Jšœ2˜2Jšœ œœ˜#—Jšœ˜J˜—šœ˜šœ*˜*Jšœ1˜1Jšœœœ˜"—Jšœ˜J™——™šœ˜šœ0˜0Jšœ1˜1Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ*˜*Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ*˜*Jšœ1˜1Jšœœœ˜"—Jšœ˜J™——™šœ˜šœ3˜3Jšœ6œœ˜O—J˜—J˜šœ˜šœ'˜'JšœCœ˜K—Jšœ˜—J˜šœ˜šœ(˜(JšœCœ˜K—Jšœ˜J˜—šœ˜šœ4˜4JšœEœ˜M—Jšœ˜J˜—šœ5˜5JšœA˜AJšœ"œœ˜=J˜—šœ˜šœ5˜5JšœCœ˜K—Jšœ˜J˜—šœ6˜6JšœA˜AJšœ"œœ˜=J˜—šœ˜šœ/˜/JšœCœ˜K—Jšœ˜J˜—šœ0˜0JšœA˜AJšœ"œœ˜=J˜——™šœ'˜'šœ+˜+Jšœ1˜1Jšœ œœ˜"Jšœ˜—J™——J™!˜šœ˜šœ1˜1Jšœ1˜1Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ/˜/Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ0˜0Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ1˜1Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ/˜/Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ0˜0Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜——™!šœ˜šœ>˜>Jšœ1˜1Jšœ œœ˜"Jšœ˜—J˜—šœ˜šœ?˜?Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ2˜2Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜——™!šœ˜šœΟtœ˜4Jšœ1˜1Jšœ œœ˜"JšœŸœ˜—J˜—šœ˜šœŸœ˜5Jšœ2˜2Jšœ œœ˜"—JšœŸœ˜J˜—šœ˜šœ2˜2Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜—šœ˜šœ3˜3Jšœ2˜2Jšœ œœ˜"—Jšœ˜J˜——™#˜JšœI˜I—Jšœ'˜'J˜Jšœœ˜˜JšœLœ˜U—Jšœ,˜,Jšœ,˜,Jšœ%œœ˜JJšœ˜Jšœ)œ˜=J˜J˜—J˜Jšœœ˜ Jšœ˜Jšœ˜J˜—šžœ˜!Jšœœ+˜5Jšœœ*˜2šœœ7œ ˜Oš˜Jšœ<œ ˜K——J˜J˜—šžœ˜"Jšœ˜Jšœ0˜0Jšœ˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœ#˜#Jšœœœœ˜Jšœ(˜(Jšœœ œ ˜8J˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœ#˜#Jšœœœœ˜Jšœ(˜(Jšœ8œ œ˜WJ˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœ#˜#Jšœœœœ˜Jšœ*˜*Jšœ:œ œ˜YJ˜J˜—š œœœœœ˜$Jšœ˜J˜—šžœœœœ˜@šœœ˜$Jšœ˜J˜—šœ˜Jšœœ˜)Jšœœ5˜AJšœœ1˜=Jšœœ˜%Jšœœ˜'Jšœœ˜)Jšœœ-˜9Jšœœ/˜;Jšœœ-˜9Jšœœ+˜7Jšœœ9˜EJšœœ'˜3Jšœœ/˜;Jšœœ7˜CJšœœ%˜1Jšœœ-˜9Jšœœ#˜/Jšœœ%˜1Jšœœ%˜1Jšœœœ˜$—J˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœ"˜"Jšœœœœ˜Jšœ'˜'Jšœœ œ ˜8J˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœ"˜"Jšœœœœ˜šœœœ˜;Jšœ œ ˜/šœ˜Jšœ)˜)šœ9˜9Jšœ œ˜—J˜——J˜J˜—š œœœœœ˜#Jšœw˜wJ˜—šžœœœœ˜>šœœ˜$Jšœ˜J˜—šœ˜Jšœœ˜!Jšœœ˜Jšœœ˜Jšœœ-˜9Jšœœ#˜/Jšœœ!˜-Jšœœ#˜/Jšœœ˜#Jšœœ œ˜ —J˜J˜—šžœ˜JšœC˜Cšœ ˜ JšœU˜UJšœœœ˜Q—Jšœ(œœœ˜TJšœ)œœœ˜UJšœ#œœœ˜JJ˜J˜—šžœ˜ Jšœœ˜-Jšœ˜Jšœ*˜*Jšœ+˜+Jšœ ˜ Jšœ#˜#Jšœ;˜;š˜J˜E—J˜J˜—šžœœœœ˜1Jšœœ ˜*Jšœ ˜ Jšœ2œ˜J˜J˜—šžœ˜Jšœœœ ˜2Jšœ!œ ˜0J˜J˜—šžœ˜Jšœœœ!˜3Jšœ"œ ˜1J˜J˜—šž œ˜Jšœœ(˜9Jšœ œ ˜/J˜J˜—šžœ˜Jšœœ+˜pQΐ