DIRECTORY AdobeP75V2, AdobeP75V2Aux, Basics USING [ ], Commander USING [CommandProc, Handle, Register], CrRPC USING [BulkDataSink, CreateClientHandle, DestroyClientHandle, Handle], IO, Rope USING [ROPE], XNS USING [Address, unknownAddress], XNSAdobeClientOps, XNSCH USING [LookupAddressFromRope], XNSCHName USING [Name, RopeFromName]; XNSAdobeTestImpl: CEDAR MONITOR IMPORTS AdobeP75V2, AdobeP75V2Aux, Commander, CrRPC, IO, XNSCH, XNSCHName EXPORTS XNSAdobeClientOps ~ { OPEN Adobe2: AdobeP75V2; ROPE: TYPE ~ Rope.ROPE; crAtom: ATOM ~ IF ( BYTES[WORD] = 2 ) THEN $SPP ELSE $CMUX; UnknownAddress: PUBLIC ERROR ~ CODE; StubError: PUBLIC ERROR [whatsUp: ROPE] ~ CODE; RemoteOperation: TYPE ~ PROC [crH: CrRPC.Handle]; Guarded: PROC [server: ROPE, op: RemoteOperation] ~ { ENABLE { UNWIND => { NULL }; Adobe2.Error => { whatsUp: ROPE ~ IO.PutFR1["Adobe2.Error[code: (%g)]", IO.card[why.ORD] ]; ERROR StubError[whatsUp]; }; }; qualified: XNSCHName.Name; add: XNS.Address; [qualified, add] ¬ XNSCH.LookupAddressFromRope[server]; IF ( add = XNS.unknownAddress ) THEN ERROR UnknownAddress; { name: ROPE ~ XNSCHName.RopeFromName[qualified]; address: REF XNS.Address ~ NEW[XNS.Address ¬ add]; crH: CrRPC.Handle ~ CrRPC.CreateClientHandle[crAtom, address]; op[crH]; CrRPC.DestroyClientHandle[crH]; }; }; ListDatabases: PUBLIC PROC [server: ROPE] RETURNS [systems: Adobe2.DatabaseSequence] ~ { ListDatabasesOp: RemoteOperation ~ { systems ¬ Adobe2.GetResidentSystems[crH]; }; Guarded[server, ListDatabasesOp]; }; GetDatabaseDescription: PUBLIC PROC [server: ROPE, system: Adobe2.Database] RETURNS [description: Adobe2.Description] ~ { GetDatabaseDescriptionOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; description ¬ Adobe2.GetSystemDescription[crH, target]; }; Guarded[server, GetDatabaseDescriptionOp]; }; GetLocationOfARs: PUBLIC PROC [server: ROPE, system: Adobe2.Database] RETURNS [referenceToARs: Adobe2.NSName] ~ { GetLocationOfARsOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; referenceToARs ¬ Adobe2.GetLocationOfARs[crH, target]; }; Guarded[server, GetLocationOfARsOp]; }; GetVersion: PUBLIC PROC [server: ROPE, system: Adobe2.Database] RETURNS [version: Adobe2.ARVersion ¬ 0]~ { GetVersionOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; version ¬ Adobe2.GetVersion[crH, target]; }; Guarded[server, GetVersionOp]; }; LookupARs: PUBLIC PROC [server: ROPE, system: Adobe2.Database, version: Adobe2.ARVersion, fieldName: ROPE, value: Adobe2.FieldItemQueryValue, set: Adobe2.SetOfARs] RETURNS [s: Adobe2.SetOfARs] ~ { LookupARsOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; instance: Adobe2.StaticTarget ~ [target, version]; query: Adobe2.QueryItem ¬ [fieldName, value]; boundSet: Adobe2.SetOfARs ¬ set; s ¬ Adobe2.LookupARs[crH, instance, query, boundSet]; }; Guarded[server, LookupARsOp]; }; ReadLastARNumber: PUBLIC PROC [server: ROPE, system: Adobe2.Database] RETURNS [lastAR: Adobe2.ARNumber ¬ 0] ~ { ReadLastARNumberOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; lastAR ¬ Adobe2.ReadLastARNumber[crH, target]; }; Guarded[server, ReadLastARNumberOp]; }; GetAcceleratorInfo: PUBLIC PROC [server: ROPE, system: Adobe2.Database, version: CARD32, arSet: Adobe2.SetOfARs, fieldList: Adobe2.FieldList, to: CrRPC.BulkDataSink] ~ { GetAcceleratorInfoOp: RemoteOperation ~ { instance: Adobe2.StaticTarget ~ [[system], version]; Adobe2.GetAcceleratorInfo[crH, instance, arSet, fieldList, to]; }; Guarded[server, GetAcceleratorInfoOp]; }; GetSystemDefaultUserFile: PUBLIC PROC [server: ROPE, system: Adobe2.Database, to: CrRPC.BulkDataSink] ~ { GetSystemDefaultUserFileOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; Adobe2.GetSystemDefaultUserFile[crH, target, to]; }; Guarded[server, GetSystemDefaultUserFileOp]; }; AboutToStore: PUBLIC PROC [server: ROPE, system: Adobe2.Database, version: CARD32, arNumber: CARD32] ~ { AboutToStoreOp: RemoteOperation ~ { instance: Adobe2.StaticTarget ~ [[system], version]; Adobe2.AboutToStore[crH, instance, arNumber]; }; Guarded[server, AboutToStoreOp]; }; SubmitFailed: PUBLIC PROC [server: ROPE, system: Adobe2.Database, version: CARD32, arNumber: CARD32] ~ { SubmitFailedOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; Adobe2.SubmitFailed[crH, target, version, arNumber]; }; Guarded[server, SubmitFailedOp]; }; UpdateAcceleratorField: PUBLIC PROC [server: ROPE, system: Adobe2.Database, version: CARD32, arNumber: CARD32, field: Adobe2.FieldItemValue, fieldName: ROPE] ~ { UpdateAcceleratorFieldOp: RemoteOperation ~ { instance: Adobe2.StaticTarget ~ [[system], version]; Adobe2.UpdateAcceleratorField[crH, instance, arNumber, field, fieldName]; }; Guarded[server, UpdateAcceleratorFieldOp]; }; GetNextSubmitNumber: PUBLIC PROC [server: ROPE, system: Adobe2.Database] RETURNS [submitNumber: Adobe2.SubmitNumber ¬ 0] ~ { GetNextSubmitNumberOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; submitNumber ¬ Adobe2.GetNextSubmitNumber[crH, target]; }; Guarded[server, GetNextSubmitNumberOp]; }; PutSubmitNumber: PUBLIC PROC [server: ROPE, system: Adobe2.Database, submitNumber: Adobe2.SubmitNumber] ~ { PutSubmitNumberOp: RemoteOperation ~ { target: Adobe2.Target ~ [system]; Adobe2.PutSubmitNumber[crH, target, submitNumber]; }; Guarded[server, PutSubmitNumberOp]; }; server: PUBLIC ROPE ¬ "PCAService:OSBU North:Xerox"; system: PUBLIC Adobe2.Database ¬ "AdobePortTest"; version: PUBLIC Adobe2.ARVersion ¬ 1; ListDatabasesCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; systems: Adobe2.DatabaseSequence ¬ ListDatabases[server]; cmd.out.PutF1[" systems:\n", IO.rope[server] ]; FOR i: CARDINAL IN [0..systems.length] DO cmd.out.PutF1[" %g\n", IO.rope[systems.body[i]] ]; ENDLOOP; }; EXITS Failed => { result ¬ $Failure }; }; FieldTypeName: ARRAY Adobe2.FieldType OF ROPE ¬ ["ar(0)", "time(1)", "numeric(2)", "bounded(3)", "enumerated(4)", "string(5)"]; PrintFieldList: PROC [out: IO.STREAM, fieldList: Adobe2.FieldList] ~ { FOR i: CARDINAL IN [0..fieldList.length) DO item: Adobe2.FieldItemObject ~ fieldList.flSeq[i]; type: Adobe2.FieldType ~ item.type; rope: ROPE ~ AdobeP75V2Aux.ExposeFieldItem[item, 1]; out.PutF["(%g) [%g]\n", IO.card[i], IO.rope[rope] ]; ENDLOOP; }; GetDatabaseDescriptionCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; description: Adobe2.Description ¬ GetDatabaseDescription[server, system]; cmd.out.PutRope[" Description:\n"]; cmd.out.PutF1[" name:\t%g\n", IO.rope[description.name] ]; cmd.out.PutF1[" host:\t%g\n", IO.rope[description.host] ]; cmd.out.PutF1[" directory:\t%g\n", IO.rope[description.directory] ]; cmd.out.PutF1[" version:\t%g\n", IO.card[description.version] ]; cmd.out.PutF1[" fieldList:\t(%g) [\n", IO.card[description.fieldList.length] ]; PrintFieldList[cmd.out, description.fieldList]; cmd.out.PutRope["\t]\n"]; }; EXITS Failed => { result ¬ $Failure }; }; GetLocationOfARsCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; referenceToARs: Adobe2.NSName ¬ GetLocationOfARs[server, system]; cmd.out.PutF[" Location of ARs: %g:%g:%g\n", IO.rope[referenceToARs.local], IO.rope[referenceToARs.domain], IO.rope[referenceToARs.org]]; }; EXITS Failed => { result ¬ $Failure }; }; GetVersionCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; version: Adobe2.ARVersion ¬ GetVersion[server, system]; cmd.out.PutF1[" version: %g\n", IO.card[version] ]; }; EXITS Failed => { result ¬ $Failure }; }; ReadLastARNumberCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; lastAR: Adobe2.ARNumber ¬ ReadLastARNumber[server, system]; cmd.out.PutF1[" lastAR: %g\n", IO.card[lastAR] ]; }; EXITS Failed => { result ¬ $Failure }; }; currentAR: Adobe2.SubmitNumber ¬ 11; GetNextSubmitNumberCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; target: Adobe2.Target ~ [system]; submitNumber: Adobe2.SubmitNumber ¬ GetNextSubmitNumber[server, target]; cmd.out.PutF1[" NextSubmitNumber: %g\n", IO.card[submitNumber] ]; currentAR ¬ submitNumber; }; EXITS Failed => { result ¬ $Failure }; }; PutSubmitNumberCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; submitNumber: Adobe2.SubmitNumber ¬ currentAR; PutSubmitNumber[server, system, submitNumber]; cmd.out.PutF1[" PutSubmitNumber: %g\n", IO.card[submitNumber] ]; }; currentAR ¬ currentAR.PRED; -- why? EXITS Failed => { result ¬ $Failure }; }; NumQueryCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; value: Adobe2.FieldItemQueryValue ¬ [greaterThanOrEqual, NEW[Adobe2.FieldItemValueRec.numeric ¬ [numeric[35]]]]; arSet: Adobe2.SetOfARs ¬ NEW[Adobe2.SetOfARsObject[1]]; arSet[0] ¬ [1,5]; arSet ¬ LookupARs[server, system, version, "Age", value, arSet]; cmd.out.PutRope[" result: \n"]; FOR i: CARD IN [0..arSet.len) DO cmd.out.PutF[" %g-%g\n", IO.card[arSet[i].startValue], IO.card[arSet[i].startValue + arSet[i].runLength - 1] ]; ENDLOOP; }; EXITS Failed => { result ¬ $Failure }; }; ARQueryCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; value: Adobe2.FieldItemQueryValue ¬ [greaterThanOrEqual, NEW[Adobe2.FieldItemValueRec.arId ¬ [arId[3]]]]; arSet: Adobe2.SetOfARs ¬ NEW[Adobe2.SetOfARsObject[1]]; arSet[0] ¬ [1,5]; arSet ¬ LookupARs[server, system, version, "Number", value, arSet]; cmd.out.PutRope[" result: \n"]; FOR i: CARD IN [0..arSet.len) DO cmd.out.PutF[" %g-%g\n", IO.card[arSet[i].startValue], IO.card[arSet[i].startValue + arSet[i].runLength - 1] ]; ENDLOOP; }; EXITS Failed => { result ¬ $Failure }; }; EnumQueryCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; value: Adobe2.FieldItemQueryValue ¬ [equal, NEW[Adobe2.FieldItemValueRec.enumerated ¬ [enumerated[2]]]]; arSet: Adobe2.SetOfARs ¬ NEW[Adobe2.SetOfARsObject[1]]; arSet[0] ¬ [1,5]; arSet ¬ LookupARs[server, system, version, "System", value, arSet]; cmd.out.PutRope[" result: \n"]; FOR i: CARD IN [0..arSet.len) DO cmd.out.PutF[" %g-%g\n", IO.card[arSet[i].startValue], IO.card[arSet[i].startValue + arSet[i].runLength - 1] ]; ENDLOOP; }; EXITS Failed => { result ¬ $Failure }; }; FixQueryCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; value: Adobe2.FieldItemQueryValue ¬ [in, NEW[Adobe2.FieldItemValueRec.fixedLengthString ¬ [fixedLengthString["pj", 60]]]]; arSet: Adobe2.SetOfARs ¬ NEW[Adobe2.SetOfARsObject[1]]; arSet[0] ¬ [1,5]; arSet ¬ LookupARs[server, system, version, "Assigned To", value, arSet]; cmd.out.PutRope[" result: \n"]; FOR i: CARD IN [0..arSet.len) DO cmd.out.PutF[" %g-%g\n", IO.card[arSet[i].startValue], IO.card[arSet[i].startValue + arSet[i].runLength - 1] ]; ENDLOOP; }; EXITS Failed => { result ¬ $Failure }; }; PutC: PROCEDURE [c: CHAR] ~ { SELECT c FROM IN['A..'Z], IN['a..'z], IN['0..'9] => globalCmd.out.PutF1["%g ", IO.char[c]]; ENDCASE => globalCmd.out.PutF1["/%gD ", IO.card[ORD[c]]]; }; To: CrRPC.BulkDataSink ~ { len, line, field: CARD ¬ 0; b1, b2: CARD ¬ 0; IF checkAbort[h] THEN { globalCmd.out.PutRope["Instant Abort.\n"]; RETURN[FALSE]; }; IF IO.EndOf[s] THEN { globalCmd.out.PutRope["Empty stream.\n"]; RETURN[FALSE]; }; line ¬ 1; WHILE NOT IO.EndOf[s] DO IF field > 3 THEN { field ¬ 0; line ¬ line + 1; IO.PutF1[globalCmd.out, "line: %g\n", IO.card[line]]; }; IO.PutF1[globalCmd.out, "\tfield: %g ", IO.card[field]]; b1 ¬ ORD[IO.GetByte[s]]; b2 ¬ ORD[IO.GetByte[s]]; IO.PutF[globalCmd.out, "\b1: %g b2: %g", IO.card[b1], IO.card[b2]]; len ¬ (b1 * (ORD[LAST[CHAR]] + 1)) + b2; IO.PutF1[globalCmd.out, "(len = %g)\n", IO.card[len]]; FOR i: CARD IN [0..len) DO PutC[IO.GetChar[s]]; ENDLOOP; IO.PutRope[globalCmd.out, "\n"]; IF (len MOD 2) = 1 THEN [] ¬ IO.GetChar[s]; ENDLOOP; RETURN[FALSE]; }; globalCmd: Commander.Handle ¬ NIL; GetAccInfoCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; arSet: Adobe2.SetOfARs ¬ NEW[Adobe2.SetOfARsObject[1]]; fieldList: Adobe2.FieldList ¬ NEW[Adobe2.FieldListArray[4]]; globalCmd ¬ cmd; fieldList[0]¬ NEW[Adobe2.FieldItemObjectRec.arId]; fieldList[0].name ¬ "Number"; fieldList[1]¬ NEW[Adobe2.FieldItemObjectRec.arId]; fieldList[1].name ¬ "System"; fieldList[2]¬ NEW[Adobe2.FieldItemObjectRec.arId]; fieldList[2].name ¬ "Subsystem"; fieldList[3]¬ NEW[Adobe2.FieldItemObjectRec.arId]; fieldList[3].name ¬ "Subject"; arSet[0] ¬ [1,5]; GetAcceleratorInfo[server, system, version, arSet, fieldList, To]; }; EXITS Failed => { result ¬ $Failure }; }; GetDefaultUserFileCommand: Commander.CommandProc ~ { cmd.out.PutF1["server: %g\n", IO.rope[server] ]; cmd.out.PutF1[" system/database: %g\n", IO.rope[system] ]; { ENABLE { StubError=> { msg ¬ whatsUp; GOTO Failed }; UnknownAddress => { msg ¬ "UnknownAddress"; GOTO Failed }; }; GDUSink: CrRPC.BulkDataSink = { IF checkAbort[h] THEN { cmd.out.PutRope["Instant Abort.\n"]; RETURN[FALSE]; }; IF IO.EndOf[s] THEN { cmd.out.PutRope["Empty stream.\n"]; RETURN[FALSE]; }; WHILE NOT IO.EndOf[s] DO cmd.out.PutF1["%g ", IO.char[IO.GetChar[s]]]; ENDLOOP; RETURN[FALSE]; }; GetSystemDefaultUserFile[server, system, GDUSink]; }; EXITS Failed => { result ¬ $Failure }; }; Init: PROC ~ { Commander.Register["XNSAdobe.GetDatabaseDescription", GetDatabaseDescriptionCommand]; Commander.Register["XNSAdobe.GetDefaultUserFile", GetDefaultUserFileCommand]; Commander.Register["XNSAdobe.GetLocationOfARs", GetLocationOfARsCommand]; Commander.Register["XNSAdobe.GetNextSubmitNumber", GetNextSubmitNumberCommand]; Commander.Register["XNSAdobe.GetVersion", GetVersionCommand]; Commander.Register["XNSAdobe.ListDatabases", ListDatabasesCommand]; Commander.Register["XNSAdobe.PutSubmitNumber", PutSubmitNumberCommand]; Commander.Register["XNSAdobe.ReadLastARNumber", ReadLastARNumberCommand]; Commander.Register["XNSAdobe.NumQuery", NumQueryCommand]; Commander.Register["XNSAdobe.ARQuery", ARQueryCommand]; Commander.Register["XNSAdobe.EnumQuery", EnumQueryCommand]; Commander.Register["XNSAdobe.FixQuery", FixQueryCommand]; Commander.Register["XNSAdobe.GetAccInfo", GetAccInfoCommand]; }; Init[]; }. ξ XNSAdobeTestImpl.mesa Copyright Σ 1990, 1992 by Xerox Corporation. All rights reserved. Bill Jackson (bj), March 28, 1990 5:45 pm PST Philip James, March 20, 1991 9:25 am PST Christian Jacobi, April 7, 1992 4:57 pm PDT USING [ARVersion, Database, DatabaseSequence, GetResidentSystems, GetVersion, Target], Errors realId: XNSAuth.Identity ~ UserCredentials.GetIdentity[]; conversation: XNSAuth.Conversation ~ XNSAuth.Initiate[realId, qualified]; credentials: XNSAuth.Credentials ~ XNSAuth.GetCredentials[conversation]; verifier: XNSAuth.Verifier; XNSAuth.SetRecipientHostNumber[conversation, address.host]; verifier _ XNSAuth.GetNextVerifier[conversation]; Remote Operations (simple) Remote Operations (system) Remote Operations (more complex) Some manifest constants/values Commander Operations (simple ops) Commander Operations (system) Commander Operations (using state) cmd.out.PutF[" target/database: %g(%g)\n", IO.rope[system], IO.card[version] ]; instance: Adobe2.StaticTarget ~ [target, version]; accInfo: Adobe2.AcceleratorInfo _ NIL; FOR i: CARD IN [0..accInfo.len) DO IO.PutF[cmd.out, "AR #%g\n", IO.card[i]]; FOR j: CARD IN [0..accInfo[i].len) DO IO.PutF[cmd.out, "\tField #%g: %g\n", IO.card[j], IO.rope[accInfo[i][j]]]; ENDLOOP; ENDLOOP; Κί–(cedarcode) style•NewlineDelimiter ™šœ™Jšœ Οeœ7™BJ™-J™(J™+J™—codešΟk ˜ šœ ˜ KšœžœQ™W—Kšœ˜Kšœžœ˜Kšœ žœ!˜0KšœžœA˜LKšžœ˜Kšœžœžœ˜Kšžœžœ˜$Kšœ˜Kšžœžœ˜$Kšœ žœ˜%K˜—šΟnœžœž˜Kšžœ.žœžœ ˜IKšžœ˜KšžœŸœ ˜Kšžœžœžœ˜K˜Kš œžœžœžœžœžœžœ˜;headšΟz™KšŸœžœžœžœ˜$Kš Ÿ œžœžœ žœžœ˜/K˜Kšœžœžœ˜1šŸœžœ žœ˜5šžœ˜Kšžœžœ˜šœ˜Kš œ žœžœ$žœ žœ˜IKšžœ˜Kšœ˜—K˜—Kšœ žœ ˜,Kšœžœ˜7Kšžœ žœžœžœ˜:šœ˜Kšœžœ%˜/Kš œ žœžœ žœžœ˜2šœ>˜>Kšœ9™9KšœI™IKšœH™HKšœ™Kšœ;™;Kšœ1™1—Kšœ˜Kšœ˜K˜—Kšœ˜——š ™š Ÿ œžœžœ žœžœ'˜XšŸœ˜$K˜)Kšœ˜—Kšœ!˜!Kšœ˜——š ™š Ÿœžœžœ žœžœ&˜yšŸœ˜-Kšœ!˜!K˜7K˜—Kšœ*˜*K˜K˜—š Ÿœžœžœ žœžœ$˜qšŸœ˜'Kšœ!˜!K˜6K˜—Kšœ$˜$K˜K˜—š Ÿ œžœžœ žœžœ#˜jšŸ œ˜!Kšœ!˜!K˜)K˜—Kšœ˜K˜K˜—š Ÿ œžœžœ žœBžœ<žœ˜ΖšŸ œ˜ K˜!K˜2K˜-K˜ K˜5K˜—Kšœ˜K˜K˜—š Ÿœžœžœ žœžœ"˜ošŸœ˜'Kšœ!˜!K˜.K˜—Kšœ$˜$K˜K˜—š Ÿœžœžœ žœ$žœR˜©šŸœ˜)Kšœ4˜4Kšœ?˜?K˜—Kšœ&˜&K˜K˜—šŸœžœžœ žœ6˜išŸœ˜/Kšœ!˜!Kšœ1˜1K˜—Kšœ,˜,K˜——š  ™ š Ÿ œžœžœ žœ$žœ žœ˜hšŸœ˜#K˜4Kšœ-˜-K˜—Kšœ ˜ ˜K˜——š Ÿ œžœžœ žœ$žœ žœ˜hšŸœ˜#Kšœ!˜!Kšœ4˜4K˜—Kšœ ˜ ˜K˜——šŸœžœžœ žœ$žœ žœ+žœ˜‘šŸœ˜-K˜4KšœI˜IK˜—Kšœ*˜*˜K˜——š Ÿœžœžœ žœžœ,˜|šŸœ˜*Kšœ!˜!K˜7K˜—Kšœ'˜'K˜—šŸœžœžœ žœA˜kšŸœ˜&Kšœ!˜!Kšœ2˜2K˜—Kšœ#˜#K˜——š ™Kšœžœžœ!˜4Kšœžœ#˜1Kšœ žœ˜%—š !™!šŸœ˜/Kšœžœ˜0šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜9Kšœžœ˜/šžœžœžœž˜)Kšœžœ˜3Kšžœ˜—Kšœ˜—Kšžœ!˜&Kšœ˜——š ™KšŸ œžœžœžœR˜K˜šŸœžœžœžœ"˜Fšžœžœžœž˜+Kšœ2˜2Kšœ#˜#Kšœžœ*˜4Kšœžœ žœ˜4Kšžœ˜—K˜K˜—šŸœ˜8Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜IK˜#Kšœžœ˜;Kšœžœ˜;Kšœ$žœ˜EKšœ"žœ˜Ašœ(žœ&˜PKšœ/˜/K˜—Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜2Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜AKšœ.žœžœžœ˜ŠKšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜,Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜7Kšœ žœ˜3Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜2Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜;Kšœžœ˜1Kšœ˜—Kšžœ!˜&Kšœ˜——š "™"K˜$K˜Jšœ+žœžœ™OKšœ2™2šŸœ˜5Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—Kšœ!˜!K˜HKšœ)žœ˜AK˜Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜1Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—K˜.Kšœ.˜.Kšœ(žœ˜@Kšœ˜—KšœžœΟc˜#Kšžœ!˜&Kšœ˜K˜—šŸœ˜*Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—˜9Kšžœ4˜7—Kšœžœ˜7K˜K˜@K˜šžœžœžœž˜ Kšœžœžœ6˜qKšžœ˜—Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜)Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—˜9Kšžœ-˜0—Kšœžœ˜7K˜K˜CK˜šžœžœžœž˜ Kšœžœžœ6˜qKšžœ˜—Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜+Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—˜,Kšžœ9˜<—Kšœžœ˜7K˜K˜CK˜šžœžœžœž˜ Kšœžœžœ6˜qKšžœ˜—Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœ˜*Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—˜)KšžœN˜Q—Kšœžœ˜7K˜K˜HK˜šžœžœžœž˜ Kšœžœžœ6˜qKšžœ˜—Kšœ˜—Kšžœ!˜&Kšœ˜K˜—šŸœž œžœ˜šžœž˜ Kšžœ ˜ Kšžœ ˜ Kšžœ'žœ ˜5Kšžœ!žœžœ˜9—K˜K˜—šŸœ˜Kšœžœ˜Kšœžœ˜šžœžœž˜K˜*Kšžœžœ˜K˜—šžœžœ žœ˜K˜)Kšžœžœ˜K˜—K˜ šžœžœžœ ž˜šžœ žœ˜K˜ K˜Kšžœ$žœ ˜5K˜—Kšžœ&žœ˜8Kšœžœžœ ˜Kšœžœžœ ˜Kšžœ'žœ žœ ˜CKšœ žœžœžœ˜(Kšžœ&žœ ˜6šžœžœžœ ž˜Kšœžœ ˜Kšžœ˜—Kšžœ˜ šžœžœž˜Kšœžœ ˜—Kšžœ˜—Kšžœžœ˜Kšœ˜K˜—Kšœžœ˜"K˜šŸœ˜,Kšœžœ˜0Kšœ(žœ˜:šœ˜šžœ˜Kšœžœ ˜+Kšœ,žœ ˜:Kšœ˜—Jšœ"žœ™&Kšœžœ˜7Kšœžœ˜