THEGRAPEVINEINTERFACE29Appendix:TheCedarGrapevineInterfacesThisappendixcontainsthoseinterfacesoftheCedarGrapevineclientinterfacewhichwerereferredtoearlierinthisdocument.GrapevineUser-publicDEFSforbasictypesGVBasics.mesaAndrewBirrellJune24,19835:25pmDIRECTORYRopeUSING[ROPE];GVBasics:CEDARDEFINITIONS=BEGINNotethatincompatiblechangestothesedefinitionsmayrequirethecooperationofallmailserversandtheirclients,andtheflushingofthemailserverfilestores.Thefollowingtypesarebasictothetransportmechanism."Connect","Password"and"Remark"don'treallyoccurinmessagebodies,butthisisthemoststabledefsfileforthem.Theyareusedbypublicclientsofthetransportmechanism.GVString:TYPE=Rope.ROPE;maxGVStringLength:CARDINAL=64;MoststringsoccurringinsideGrapevinearerestrictedinlength.RName:TYPE=GVString;AnR-Name(Recipient-name)isthebasicnamewithinthetransportmechanism.ItisoftheformSN.Reg(Simple-Name.Registry).TherepresentationisasaROPEofuptomaxRNameLengthcharacters.Inmessagebodies,R-Namesoccupyanintegralnumberofwords.maxRNameLength:CARDINAL=maxGVStringLength;pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgsî ìï^õîKî¶î…î"R pî ®ï[îÀî·îî« î$Îî&€î(Øî,éî3¥î7^î<ýîAîDMî ìïXäî šîÞîŒî-tî ýïRE î î îîRî zî#áî ýïP î ýïMÛîõî½îòî0îuî!„qî ýïIquîïG<qîÃïG<î©ïG<uîòïG<qîUïG<uîgïG<îÊïG<î ýïBÓqî¶ïBÓî�ïBÓî1 uî6ïBÓqî ýï>itî ýï9ÿîPî" î î&î Ëî$6 î*Àî-°î2Cî4� î;Ñî=tî?oîB€îFæî Ðï7Êîî�î3îî¥î Hî"”î%¥î)‡ î ýï3`îÀî”îþîQî¹î^î!ªî'k î/@ î6O î=¡î@Dî Ðï1,î<îüî§îMî†î"öî%Xî'ðî)\î+¨î.çî2¿î5‚î7Öî9þî=¸îA!îCtîF…î Ðï.÷îÓîîªîöî· uî ýï(Xqî¶ï(Xîpï(Xuîï(Xîóï(Xqî{ï(XîOï(XuîŒï(Xî ýï#îqîpï#îî:ï#îuî ï#îî!õï#îtîï!¹îŒîßîáîºî&î(g î.<î/âuî ýïqîïîÙïuîwïî\ïtîïåîOî¿î Cî!®î#úî'bî+î/#î1oî70 î?î@•îBîC¤îEñîáï±î÷îô îkîGî#–î%pî(3 î0çî2Rî4 î5@î9°î;Sî=Eîáï} î� î!Ûî#¹î(òî-bî3Vî7Óî9Æî>ÀîC¥îEHuî ýïqîTïîïuîõïî Úï TVm$"istherepresentationofaconnect-siteforanindividual(typicallyaserver).ItisastringwhichiseitheranNLSnameoraPUPaddress.maxConnectLength:CARDINAL=maxGVStringLength;Remark:TYPE=GVString;"Remark"istherepresentationofaremarkassociatedwithagroup,orofaTOCentryinamailbox.Itisahumanreadablestring.maxRemarkLength:CARDINAL=maxGVStringLength;Password:TYPE=ARRAY[0..3]OFCARDINAL;"Password"istherepresentationofanindividual'sencryptionkey.ItisintendedtobeusedwiththeDESencryptionalgorithm.NotetTHEGRAPEVINEINTERFACE30Connect:TYPE=GVString;"Connect"istherepresentationofaconnect-siteforanindividual(typicallyaserver).ItisastringwhichiseitheranNLSnameoraPUPaddress.maxConnectLength:CARDINAL=maxGVStringLength;Remark:TYPE=GVString;"Remark"istherepresentationofaremarkassociatedwithagroup,orofaTOCentryinamailbox.Itisahumanreadablestring.maxRemarkLength:CARDINAL=maxGVStringLength;Password:TYPE=ARRAY[0..3]OFCARDINAL;"Password"istherepresentationofanindividual'sencryptionkey.ItisintendedtobeusedwiththeDESencryptionalgorithm.NotethatthisisnotthesameasDESFace.Key(today),notevenifyouuseLOOPHOLE.MakeKey:PROC[Rope.ROPE]RETURNS[Password];Thefollowingdefinitionsareconcernedwiththelayoutof"messagebodies".Amessagebodyistheinternalrepresentationofamessagewithinandbetweenmailservers.Itisalsosenttotheclientwhenheretrieveshismail.Amessagebodycontainsanumberof"items".Itemsareusedtorepresentsuchthingsaspostmark,recipients,sender,aswellasthemessagetext(ifany),orothercontentofthemessagesuchasaudioorcapabilities.Someitemsaremandatoryandalwaysoccurpreciselyonce,othersmayoccuranynumberoftimes(includingzero).EachItemhasaheader,followedbythenumberofbytesofdataspecifiedbytheheader,followedbyanextrabyteifitslengthisodd.Thusitemsalwaysstartatawordboundary.Acompletemessagebodyconsistsofthemandatoryitemsfollowedbytheoptionalones.Timestamp:TYPE=MACHINEDEPENDENTRECORD[UsedasUID'sformessagesandfordatabaseupdatesnet:[0..256),--thePUPnetnumber--host:[0..256),--thePUPhostnumber--pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguî ýï_,qîðï_,î©ï_,uîGï_,î,ï_,tîï\÷îÄî0î| î!0î"Óî$ î+fî-Žî/� î5¹ î;—î<ËîBîC’îDþîáïZÃî°î“îÿîÎîÁî!(î$Ìî&…î'ºî+ uî ýïVYqî©ïVYîtïVYuîJïVYî!/ïVYî ýïO»qî<ïO»îõïO»uî“ïO»îyïO»tîïM†îžî îU î! î"¬î#áî(– î.íî1éî3î7Mî9î:©î;Þî?[îBÒîDxîáïKRîöî†îñî&î©î# uî ýïFèqîqïFèî<ïFèuîïFèî ÷ïFèî ýï@Jqîï@Jî8ï@JuîÖï@Jqî»ï@JîŽï@JuîÝï@Jî@ï@Jqî7ï@Jî ï@Jî!7uî'mï@Jtîï> î`îÌî î!Ìî#oî%b î,w î3 î6tî8î9oî>Úî@îBNîE_îáï;àî-î• î* î")î%|î(Nî*çî,Rî.¶î1î4lî6% î>ðîCæîFIîáï9¬î7îÎî.vî ýï5Buî¹ï5Bqî¶ï5Bî^ï5BuîÙï5Bî<ï5BqîÅï5Bî™ï5BuîÖï5Bqî½ï5Bî‘ï5Buî#Eï5Bî$,ï5Bî*4tî ýï*:îÀî” îîqî#Ãî&¿î) î-&î.Éî4³î:Xî;ÙîAîDNîE¹î Ðï(î× î‹î.îcî"œî&ºî)]î.yî1Šî6Ìî8[î9Çî<”î?fîA îCWî Ðï%ÑîRî.î~î¦î”îî$Oî'Šî,Þî.î2øî4œî:fî>*î@~îCŽî Ðï#�î‘î®îµînî!² î( î,–î.Oî1î2Õî5!î:[î=!î>ñîB[îDî Ðï!iî˜î;î‡îÁîÞî—î#Lî% î,Þî0 î4-î6�î=5î?ØîD2î Ðï4îJîËîÐîÀî kî#î'éî)�î- î3vî7ºî;:î>zî@ðîB$î Ðïîî÷îCî(îÌî 5î!Øî$Þî*Mî,'î.sî3'î8tî:NîîÁ îAtîï;ßîŽî–î„î(î î$ î)íî+Çî,ûî2î6/î: î@½îC îáï9«î…îîî]î7îƒî"~î%Aî(Jî)µî/î0Üî2Ðî6[î9@î:–îï0Øtîï.£îHîìîòî[îîMî"®î(Ñuî ýï*9qîÁï*9îzï*9uîï*9qîþï*9îï*9î uî%œï*9tîï(îuîï%Ð tî1ï#›î}î…îÚîî$‚î(‡î*Ó î1´î4šî7= î?îB îC°îï!fîPî‰î)î µî"Zî$¦î*h uîï2 tî1ïýî}î…îÚî"Sî$áî*ªî.Kî1î2Àî5 î9>î:áî=zuîïÈ tî1ï“î}î…îÚî"Sî$áî*ªî.Kî1î2Àî5 î8¼î:`î>O îEëîï_îPî‰îÏî Ÿuîï*tî1ïõî}î…îÚîî#®î%Rî+žî/@î1Œî6÷ î<úî>�îA6îFÇîïÁîgîAî�îï ŒîÓîãî£î}uîï W BTVm$^itemisinternalmailtoamailserver,containingpreciselyoneR-Name,indicatingthatthecorrespondingmailboxshouldbere-mailedMandatorylastitem:LastItem(LAST[CARDINAL])theitemcontainsnodata,andalwaysoccursasthelastiteminamessagebody};END.pî ìïg/sî1ï_,î}î…îTHEGRAPEVINEINTERFACE32theitemcontainsasequenceofcharactersformingatextualmessageCapability(1020B),theitemcontainsacapabilityAudio(1030B),theitemisanaudiomessageItemsusedinregistrationserverinternalmail:updateItem(2000B),theitemcontainsaregistrationserverentryreMail(2100B),theitemisinternalmailtoamailserver,containingpreciselyoneR-Name,indicatingthatthecorrespondingmailboxshouldbere-mailedMandatorylastitem:LastItem(LAST[CARDINAL])theitemcontainsnodata,andalwaysoccursasthelastiteminamessagebody};END.pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî1ï_,î}î…îÚîî#®î%R î+Áî0Ñî2î6œuîï\øtî1ïZÃî}î…îÚî uîïX� tî1ïVZî}î…îñîäî™îïT&îÓîãî‰ î¬î!�î&•uîïQñtî1ïO½î}î…îÚî î%1î)uîïMˆ tî1ïKTî}î…îñîøî! î"®î#ãî&ôî+. î1Ðî7Iî9×î?  îEçîïI îP îéî#!î'gî)7îïFëîî�uîïD·qîÛïD·î”ïD·uîÀïD·qî#ïD·uîZïD·î½ïD·tî1ïB‚î}î…îÚîÍî"+î$Îî)(î-Wî/î1]î3éî6ñî8—î9Ìî?uîï@Nqî ýï;åuî…ï;åøTVm$ comesforenquiries--RListHandle:TYPE=LISTOFGVBasics.RName;ExpandInfo:TYPE=RECORD[SELECTtype:NameType[noChange..allDown]FROMnoChange=>NULL,group=>[members:RListHandle,stamp:GVBasics.Timestamp,count:INT],individual=>[sites:RListHandle,stamp:GVBasics.Timestamp,count:INT],notFound=>NULL,protocolError=>NULL,wrongServer=>NULL,pîG~ïg/sî ýï_, î îî+îÐî"î'Íî ýï\÷ î ýïZÂîõî½îZî—î!Ýî%œtî ýïVYuîïT$tîMïT$î3ïT$uîïT$îúïT$îÌî%d î,Øî38î9çî?�îBïQðîiîïO»tîÃïOTHEGRAPEVINEINTERFACE33GrapevineUser:ClientaccesstotheR-ServerdatabaseGVNames.mesaAndrewBirrellSeptember22,198310:25amDIRECTORYGVBasicsUSING[Connect,GVString,oldestTime,Password,MakeKey,Remark,RName,Timestamp],RopeUSING[ROPE];GVNames:CEDARDEFINITIONSIMPORTSGVBasics=BEGINOutcome:TYPE={--possibleoutcomesofRSoperations--noChange,--updatesandtimestampedenquiries--group,individual,notFound,--any--protocolError,wrongServer,allDown,--any--badPwd,--authenticationandupdates--outOfDate,notAllowed--updates--};NameType:TYPE=Outcome[noChange..badPwd];--outcomesforenquiries--RListHandle:TYPE=LISTOFGVBasics.RName;ExpandInfo:TYPE=RECORD[SELECTtype:NameType[noChange..allDown]FROMnoChange=>NULL,group=>[members:RListHandle,stamp:GVBasics.Timestamp,count:INT],individual=>[sites:RListHandle,stamp:GVBasics.Timestamp,count:INT],notFound=>NULL,protocolError=>NULL,wrongServer=>NULL,pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî ýï_, î îî+îÐî"î'Íî ýï\÷ î ýïZÂîõî½îZî—î!Ýî%œqî ýïVYuîïT$qîMïT$î3ïT$uîïT$îúïT$îÌî%d î,Øî38î9çî?�îBïQðîiîïO»qîÃïO»î©ïO»uî‰ïO»qîpïO»îDïO»uîëïO»îNïO»î ýïKQqî>ïKQî ïKQî¹ îïIuî¤ïIîÎïIîãqî ýïD³uî ýï@Iqîiï@Iî#ï@IuîÁï@Iî¦ï@ItîÚï@IîTï@IîQîQî%3î&Öî)4 î/°uîï>tîóï>îmï>îjîLîï î%®î+cuîï;àîi îCtî ï;àî �ï;àî!î$uîï9« î î`tî%Gï9«î%Àï9«î&¾î)Wuîï7vtî´ï7vî.ï7vî+ îî §î%‰uîï5A îB tîªï5Aî$ï5Aî!î#uîï3 î ýï.£qî–ï.£îPï.£uîîï.£îÓï.£tî+†ï.£î+ÿï.£î,ýî2ßî5î:»uî ýï*9 qî�ï*9îVï*9uîôï*9qîÙï*9î’ï*9î¾uî¾ï*9îçï*9 î ýï!f qî ï!fîÅï!fuîcï!fqîHï!fîï!fuî7ï!fqîï!fî½ï!fuî#Öï!fî$Eï!fî'`qî;ï!fî;Áï!fuîï1î›qî1ï1îï1uîqï1îïýîî¦î�îù îïÈî¦îï“qîpï“îÚï“uîåï“îHï“îï^ î‘î&î î‹ îï)î¦îïõqîpïõîÚïõuîåïõîHïõîïÀî{qîïÀîùïÀuîPïÀîï ‹ î¬qîBï ‹î*ï ‹uî‚ï ‹îï V îqî§ï Vî�ï Vuîçï VfTVm$@ds:PROC[name:GVBasics.RNTHEGRAPEVINEINTERFACE34allDown=>NULL,ENDCASE];Expand:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp_GVBasics.oldestTime,reporter:ReporterProc_NIL]RETURNS[ExpandInfo];"Expand"returnsmailboxsitenamesforindividuals,membershiplistforgroups.Iftheoldstampisstillcurrent,returns"noChange".Willnotreturn"noChange"iftheoldstampisdefaulted.MemberInfo:TYPE=RECORD[SELECTtype:NameType[noChange..allDown]FROMnoChange=>NULL,group=>[members:RListHandle,stamp:GVBasics.Timestamp,count:INT],individual=>NULL,notFound=>NULL,protocolError=>NULL,wrongServer=>NULL,allDown=>NULL,ENDCASE];GetMembers:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp_GVBasics.oldestTime]RETURNS[MemberInfo]=INLINE{RETURN[GetList[name,oldStamp,members]]};"GetMembers"returnsthemembershiplistforagroup.Iftheoldstampisstillcurrent,returns"noChange".Willnotreturn"noChange"iftheoldstampisdefaulted.GetOwners:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp_GVBasics.oldestTime]RETURNS[MemberInfo]=INLINE{RETURN[GetList[name,oldStamp,owners]]};GetFriends:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp_GVBasics.oldestTime]RETURNS[MemberInfo]=INLINE{RETURN[GetList[name,oldStamp,friends]]};GetList:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp,list:ListType,reporter:ReporterProc_NIL]RETURNS[MemberInfo];pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguîï_,î�qî3ï_,îï_,uîsï_,qîï\÷uîöï\÷îYï\÷vî ýïX�uîlïX�qîiïX�îïX�uîŒïX�îïïX�î(î$·î+fî8 î:-î1ïVYî÷ î uqî"ïVYî"êïVYuî$ ïVYqî$õïVYî%ÉïVYuî*|ïVYî+dïVY î2ùtîïT$î}îîMî Äî$ìî' î.) î5˜î7×î9ÿî>²î@@îBŒîDÔîáïQðîMîïîõî� î%2î(@î*¤î.· î6î7Õî:!î î‘qî&ï>îï>uîfï>îï;ßî{qîï;ßîùï;ßuîPï;ßîï9ª î¬qîBï9ªî*ï9ªuî‚ï9ªîï7u îqî§ï7uî�ï7uuîçï7uîï5@î�qî3ï5@îï5@uîsï5@qîï3 uîöï3 îYï3 vî ýï.¢ uî³ï.¢qî°ï.¢îXï.¢uîÓï.¢î6ï.¢îoî'þî.­î;çî1ï,mqîÂï,mî –ï,muî%Iï,mî&1ï,m î.Kî/2qî1ï,mî1�ï,muîï*8qîCï*8îï*8uî+ï*8îï*8 î î$—î*ìî+Ôtîï( îUîíî9 î%¨î'çî*î+Cî/rî1î3Lî5”î9„î:ðî=’îB˜îáï%Ï î†î•îøî! î(Ôî**î,vî.¾î2®î4 vî ýï!euî«ï!eqî¨ï!eîPï!euîËï!eî.ï!eîgî&öî-¥î:ßî1ï1qîÂï1î –ï1uî%Iï1î&1ï1 î.Kî/2qî1ï1î1�ï1uîïüqîCïüîïüuî+ïüîïü î î$—î)¬î*“vî ýï’ uî“ï’qî‘ï’î9ï’uî´ï’îï’îPî&ßî-Žî:Èî1ï^qîÂï^î –ï^uî%Iï^î&1ï^ î.Kî/2qî1ï^î1�ï^uîï)qîCï)îï)uî+ï)îï) î î$—î)–î*~vî ýï¿uîƒï¿qî€ï¿î(ï¿uî£ï¿îï¿î?î$Îî+}î9î;ÆîAäî1ï ‹ î®qî;ï ‹î$ï ‹uîGï ‹qî.ï ‹î ï ‹uî$¶ï ‹î%ï ‹ ÿTVm$RECORD[name:GVBasics.RName,stamp:GVBasics.Timestamp,body:SELECTtype:*FROMgroup=>[remark:GVBasics.Remark,remarkStamp:GVBasics.Timestamp,members:GetEntryList,owners:GetEntryList,friends:GetEntryLiTHEGRAPEVINEINTERFACE35StampInfo:TYPE=NameType[noChange..allDown];CheckStamp:PROC[name:GVBasics.RName,oldStamp:GVBasics.Timestamp_GVBasics.oldestTime,reporter:ReporterProc_NIL]RETURNS[StampInfo];"CheckStamp"performsbasicnamevalidation,alsotellingthecallerthenametype.Iftheoldstampisstillcurrent,returns"noChange".Willnotreturn"noChange"iftheoldstampisdefaulted.ConnectInfo:TYPE=NameType[group..allDown];GetConnect:PROC[name:GVBasics.RName,reporter:ReporterProc_NIL]RETURNS[info:ConnectInfo,connect:GVBasics.Connect];"GetConnect"returnstheconnect-siteforanindividual.Theconnect-siteiseitheranNLSnameoranet-address.RemarkInfo:TYPE=NameType[group..allDown];GetRemark:PROC[name:GVBasics.RName,reporter:ReporterProc_NIL]RETURNS[info:RemarkInfo,remark:GVBasics.Remark];"GetRemark"returnstheremarkforagroup.Theremarkisahumanreadablestring..GetEntryInfo:TYPE=RECORD[name:GVBasics.RName,stamp:GVBasics.Timestamp,body:SELECTtype:*FROMgroup=>[remark:GVBasics.Remark,remarkStamp:GVBasics.Timestamp,members:GetEntryList,owners:GetEntryList,friends:GetEntryList],individual=>[pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguî ýï[Õ qîFï[Õîÿï[Õuî�ï[Õîƒï[Õvî ýïWl uî|ïWlqîzïWlî!ïWluîœïWlîïWlî9î'Èî.wî;°î1ïU8î·î%~ î-ûqî/ˆïU8î0qïU8uî1”ïU8qî2aïU8uî7èïU8î8ÐïU8î?ŸtîïS înîî gî$ î*œî-hî1�î3Üî7‘î9Ýî=�î@¿îBLîD™îáïPÏîÑî<îßîåî | î)!î,0î.“î2¦ î:oî;Åî>î@YîDIîáïNš uî ýïEÉ qîpïEÉî)ïEÉuîÇïEÉî¬ïEÉvî ýïA` uîïA`qîïA`î½ïA`uî9ïA`îœïA`îÕî'dî-* î5¨qî75ïA`î8ïA`uî9AïA`qî: ïA`uî?•ïA`î@|ïA`î1ï?+ î‚î î+žtîï<÷ îÍîeî± î%î'7î)* î0>î3 î:`î;Ìî?šwîA�ï<÷îBjï<÷tîDFï<÷îEï<÷îáï:ÂîšîÏ uî ýï1ð qî8ï1ðîñï1ðuî�ï1ðîtï1ðvî ýï-ˆuîÖï-ˆqîÔï-ˆî{ï-ˆuî÷ï-ˆîZï-ˆî“î'"î,è î5fqî6óï-ˆî7Üï-ˆuî8ÿï-ˆqî9Ìï-ˆuî?Sï-ˆî@:ï-ˆî1ï+S îJî€î*Ôtîï) î¦î>îŠî"?î$gî%›î*Nî-î1Çî32î4gî8êî>Muî ýï M qî ï MîÃï Muîaï MqîFï Mîï Muî4ï MîïîGîïäî•îï¯qîï¯î¥ï¯uî¾ï¯î-ï¯îGqî|ï¯î5ï¯uîï{î"î·î1ïGîgî1ï î3î1ïÞîœ î1ï©î\ î1ï uîF îï @ î¢î7ÿ&TVm$$henticate:PROC[name:GVBasics.RName,password:Rope.ROPE]RETURNS[AuthenticateInfo]=INLINE{RETURN[AuthenticateKey[name,GVBasics.MakeKey[password]]]};"Authenticate"checksausernameandpassword.AuthenticateKey:PROC[name:GVBasics.RName,key:GVBasics.Password,reporter:ReporterProc_NIL]RETURNS[AuthenticateInfo];AccesscontrolprimitivesMembership:TYPE={yes,no,notGroup,allDown};pî ìïg/uî1ï_,î¨î1ï\÷ îsîTHEGRAPEVINEINTERFACE36password:GVBasics.Password,passwordStamp:GVBasics.Timestamp,connect:GVBasics.Connect,connectStamp:GVBasics.Timestamp,forward:GetEntryList,sites:GetEntryList],notFound=>NULL,dead=>NULL,ENDCASE];GetEntryList:TYPE=RECORD[current:RListHandle,currentStamps:LISTOFGVBasics.Timestamp,deleted:RListHandle,deletedStamps:LISTOFGVBasics.Timestamp];GetEntry:PRIVATEPROC[name:GVBasics.RName,reporter:ReporterProc_NIL]RETURNS[rc:NameType[group..allDown],info:REFGetEntryInfo];"GetEntry"ismainlyforusebyMaintain.Itreturnstheentirecontentsofadatabaseentry.ConsultawizardbeforeusingGetEntryAuthenticateInfo:TYPE=NameType[group..badPwd];Authenticate:PROC[name:GVBasics.RName,password:Rope.ROPE]RETURNS[AuthenticateInfo]=INLINE{RETURN[AuthenticateKey[name,GVBasics.MakeKey[password]]]};"Authenticate"checksausernameandpassword.AuthenticateKey:PROC[name:GVBasics.RName,key:GVBasics.Password,reporter:ReporterProc_NIL]RETURNS[AuthenticateInfo];AccesscontrolprimitivesMembership:TYPE={yes,no,notGroup,allDown};pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguî1ï_,î¨î1ï\÷ îsî1ïZÂîÁî1ïXŽ î�î1ïVYîÖ î1ïT$î® îïQïîŒqî!ïQïî ïQïuîbïQïîïOºî}qîïOºîûïOºuîRïOºqîïM†uîöïM†îYïM†î ýïI qîÈïIî�ïIuîïIqîïIîØïIuîòïIîïFçîQ îïD³ qî¡ïD³î[ïD³î‡uî†ïD³î°ïD³îïB~î\ îï@I qî¬ï@Iîfï@Iî‘uî‘ï@Iî»ï@Ivî ýï;ßuîuï;ßqîsï;ßîï;ßîÒuîõï;ßîYï;ßî‘î+!î0ç î9eqî:òï;ßî;Úï;ßuî<ýï;ßqî=åï;ßî>¹ï;ßuîClï;ßîCÏï;ßî1ï9«î#¦qî'ï9«î'Öï9«uî)²ï9«î*Üï9« tî ýï7v î6î¢îî?îŸîyî&Cî'Òî,iî.µî2†î7Òî9uî:ªî@/îDƒî Ðï5BîîTîaîùuî ýï,oqîï,oîËï,ouîiï,oîNï,ovî ýï( uî’ï(qî�ï(î7ï(uî²ï(îï(îNî'Þî.Tqî1Ýï(î2±ï(uî4îï(qîï%Ðuî–ï%Ðî}ï%Ðîî qî!åï%Ðî"Oï%Ðuîï#›qîCï#›îï#›uî+ï#›îï#›î#›î6§î7�tîï!g î^î»îïîÔî#xî&vî ýïýuîÛïýqîÙïýî�ïýuîüïýî_ïýî˜î*'î-6î9©î?o îGíqî1ïÈuî<ïÈqîï”uî–ï”î}ï”îtî ýïÁîXîî uî ýï W qî†ï Wî?ï WuîÝï WîÂï Wî÷î­î î&Ðî,_ÿóTVm$"ist[name,owner,upArrow,self,owners]]};IsFriendUpArrow:PROC[name:GVBasics.RName,friend:GVBasics.RName]RETURNS[Membership]=INLINE{RETURN[IsInList[name,friend,upArrow,self,friends]]};MembershipLevel:TYPE=MACHINEDEPENDENT{direct(0),closure(1),upArrow(2)};MembershipGrade:TYPE=MACHINEDEPENDENT{self(0),registry(1)};ListType:TYPE=MACHINEDEPENDENT{members(0),owners(1),friends(2)};pîG~ïg/vî ýï^ uîÄï^ tîÁï^ îiï^ uîäï^ îGï^ î€î*î/÷tî;‘ï^ îÐïU8î?·ïU8 îGÇî1ïSqîïSî€ïSuîïPÏqîCïPÏîïPÏuî+ïPÏîŽïPÏ îšî" î&Zî)=î.µvî ýïLf uî¥ïLfqî¢ïLfîJïLfuîÅïLfî(ïLfîaî(ðî-‚qî9ïLfî9ðïLfuî>£ïLfî?‹ïLf îGšî1ïJ1qîïJ1î€ïJ1uîïGýqîCïGýîïGýuî+ïGýîŽïGý îšî" î&Eî)'î.Švî ýïC”uîŠïC”qîˆïC”î0ïC”uî«ïC”îïC”îGî*Öî0½qîåï1ðî?Íï1ð îGÜî1ï/¼qîï/¼î€ï/¼uîï-ˆqîCï-ˆîï-ˆuî+ï-ˆîŽï-ˆ îšî" î'î)øî/[vî ýï)uîgï)qîàï)uîï)îfï)îŸî+.î1qî<°ï)î=„ï)uîB7ï)î1ï&ê î@î'qî ï&êîvï&êuîï$¶qîCï$¶îï$¶uî+ï$¶îŽï$¶ îšî#`î)•î,wî30vî ýï M uî_ï Mqî]ï Mîï Muî€ï Mîãï Mîî*«î/Rqî:ìï Mî;Àï Muî@sï MîAZï M î1ïîqîýïîgïuîïäqîCïäîïäuî+ïäîŽïä îšî" î(Tî+7î0¯vî ýï{uîHï{qîÁï{uîäï{îGï{î€î*î.¡qî:;ï{î;ï{uî?Âï{î@©ï{ îH¹î1ïGqîïGî€ïGuîïqîCïîïuî+ïîŽï îšî" î(?î+"î0„î ýï©qîÌï©î…ï©uî#ï©qîï©îï©î#uî*¦ï©î+Ûï© î1¸ î8f î?åî ýï uqîFï uîÿï uuî�ï uqî‚ï uî”ï uî#�uî+ ï uî,Uï uî0Û î7gî ýï @qî=ï @îöï @uî”ï @qîyï @îŠï @î„uî%ï @î&Lï @ î.9 î4æ î;&ÿÅTVm$“e]=INLINEpî ìïg/vî ýï^ uî£ï^ tî¡ï^ îHï^ uîÄï^ î'ï^ î`î$ïî*Öî6eî:$î1ï[Õîuî"œî%=î+\î1" î9 tî;-ï[Õî<ï[Õuî=9ï[ÕtîïY¡uî–ïY¡îùïY¡ sî ýïNšî ýïGýî‘î4vî ýïC”uî¹ïC”tî¶ïC”î^ïC”uîÙïC”î=ïC”î¯î)>î/µî<( î1ïA`îÀî#½î/Øtî0¿ïA`THEGRAPEVINEINTERFACE38IsInList:PROC[name:GVBasics.RName,member:GVBasics.RName,level:MembershipLevel,grade:MembershipGrade,acl:ListType,reporter:ReporterProc_NIL]RETURNS[Membership];UpdatesCreationandDeletionCreateIndividual:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,newPwd:GVBasics.Password]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,CreateIndividual,individual,NIL,newPwd]]};DeleteIndividual:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteIndividual,individual]]};CreateGroup:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,CreateGroup,group]]};DeleteGroup:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteGroup,group]]};Updatestosingle-valuedcomponentsSetPassword:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,newPwd:GVBasics.Password]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,ChangePassword,individual,NIL,newPwd]]};SetConnect:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,connect:GVBasics.Connect]RETURNS[Outcome]=INLINEpî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgvî ýï^ uî£ï^ qî¡ï^ îHï^ uîÄï^ î'ï^ î`î$ïî*Öî6eî:$î1ï[Õîuî"œî%=î+\î1" î9 qî;-ï[Õî<ï[Õuî=9ï[ÕqîïY¡uî–ïY¡îùïY¡ tî ýïNšî ýïGýî‘î4vî ýïC”uî¹ïC”qî¶ïC”î^ïC”uîÙïC”î=ïC”î¯î)>î/µî<( î1ïA`îÀî#½î/Øqî0¿ïA`î1“ïA`uî6GïA`î6ªïA`î=qî>åïA`î?OïA`uîï?+qîCï?+îï?+uî+ï?+îï?+ î.î#ƒî.` qî5:ï?+î6#ï?+uî7Fï?+î8"ï?+î> î>ñvî ýï:Âuî­ï:Âqî«ï:ÂîRï:ÂuîÎï:Âî1ï:Âî¤î)3î/ªî< î1ï8ŽqîËï8ŽîŸï8Žuî#Rï8Žî#µï8Žî* qî+ðï8Žî,Zï8Žuîï6YqîCï6Yîï6Yuî+ï6Yîï6Y î.î#ƒî.` î5Fî6-vî ýï1ð uî¨ï1ðqî¦ï1ðîMï1ðuîÉï1ðî,ï1ðîžî'-î-¤î:î1ï/¼qîËï/¼îŸï/¼uî#Rï/¼î#µï/¼î* qî+ðï/¼î,Zï/¼uîï-ˆqîCï-ˆîï-ˆuî+ï-ˆîï-ˆ î.î#ƒ î,8î0žî1…vî ýï) uîœï)qîšï)îBï)uî½ï)î ï)î“î'"î-™î: î1ï&êqîËï&êîŸï&êuî#Rï&êî#µï&êî* qî+ðï&êî,Zï&êuîï$¶qîCï$¶îï$¶uî+ï$¶îï$¶ î.î#ƒ î,9î0žî1…tî ýï¯î5îÚ îã vî ýïG uî†ïGqî„ïGî+ïGuî§ïGî ïGî}î' î-‚î9õ î1ïîÀî#½qî0;ïî1ïuî5Âïî6%ïî<{qî>`ïî>ÊïuîïÞqîCïÞîïÞuî+ïÞîïÞ î.î#ƒî.j qî5EïÞî6-ïÞuî7PïÞî8-ïÞî>î>ûvî ýï u uîáï uqîßï uî†ï uuîï uîeï uî×î&gî,Ýî9P î1ï @îÀî#Pqî/?ï @î0ï @uî4Æï @î5)ï @î;€qî=eï @î=Îï @ÿ TVm$¨VBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddFriend,group,friend]]};Removingfromlist-valuedcomponentsRemoveMailbox:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,site:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteMailBox,individual,site]]};pîG~ïg/uîï_,tîCï_,îï_,uî+ï_,îï_, î.î#ƒ î-Ü î4¶î:0î;vî ýïZÂuîŸïZÂtî�ïZÂTHEGRAPEVINEINTERFACE39{RETURN[Update[user,password,ChangeConnect,individual,connect]]};SetRemark:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,remark:GVBasics.Remark]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,ChangeRemark,group,remark]]};Addingtolist-valuedcomponentsAddMailbox:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,site:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddMailBox,individual,site]]};AddForward:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,dest:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddForward,individual,dest]]};AddMember:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,member:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddMember,group,member]]};AddOwner:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,owner:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddOwner,group,owner]]};AddFriend:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,friend:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,AddFriend,group,friend]]};Removingfromlist-valuedcomponentsRemoveMailbox:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,site:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteMailBox,individual,site]]};pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguîï_,qîCï_,îï_,uî+ï_,îï_, î.î#ƒ î-Ü î4¶î:0î;vî ýïZÂuîŸïZÂqî�ïZÂîDïZÂuîÀïZÂî#ïZÂî•î&%î,›î9î=Šî1ïXŽîgqî#ïXŽî#òïXŽuî(¥ïXŽî)ïXŽî/^qî1CïXŽî1­ïXŽuîïVYqîCïVYîïVYuî+ïVYîïVY î.î#ƒ î-¤î1þî7î8tî ýïKQî²îW îÆ vî ýïFè uîOïFèqîMïFèîôïFèuîpïFèîÓïFèîEî&Õî-Kî9¾ î1ïD³îÀî ¹qî,SïD³î-'ïD³uî1ÚïD³î2>ïD³î8”qî:yïD³î:ãïD³uîïB~qîCïB~îïB~uî+ïB~îïB~ î.î#ƒ î, î2åî5Èî6°vî ýï> uî:ï>qî7ï>îßï>uîZï>î½ï>î0î&¿î-6î9© î1ï;àîÀî!qî,·ï;àî-‹ï;àuî2>ï;àî2¡ï;àî8÷qî:Ýï;àî;Fï;àuîï9¬qîCï9¬îï9¬uî+ï9¬îï9¬ î.î#ƒ î, î2æî6-î7vî ýï5BuîEï5BqîCï5Bîêï5Buîeï5BîÉï5Bî;î&Êî-Aî9´î1ï3îÀî#§qî/Aï3î0ï3uî4Èï3î5,ï3î;‚qî=gï3î=Ñï3uîï0ÙqîCï0Ùîï0Ùuî+ï0Ùîï0Ù î.î#ƒ î, î0fî67î7vî ýï,ouî=ï,oqî;ï,oîâï,ouî^ï,oîÁï,oî3î%Âî,9î8¬î=(î1ï*;îØqî"rï*;î#Fï*;uî'ùï*;î(\ï*;î.²qî0—ï*;î1ï*;uîï(qîCï(îï(uî+ï(îï( î.î#ƒî*øî/Rî3ãî4Êvî ýï#œuî&ï#œqî#ï#œîËï#œuîFï#œî©ï#œîî%«î,"î8•î=î1ï!hîÂqî"\ï!hî#0ï!huî'äï!hî(Gï!hî.�qî0‚ï!hî0ìï!huîï3qîCï3îï3uî+ï3îï3 î.î#ƒ î*øî/Rî3Îî4µtî ýï+îMî‹ îú vî ýïÁ uî­ïÁqî«ïÁîRïÁuîÎïÁî1ïÁî¤î)3î/ªî< î1ï �îÀî ¹qî,Sï �î-'ï �uî1Úï �î2>ï �î8”qî:yï �î:ãï �uîï XqîCï Xîï Xuî+ï Xîï X î.î#ƒ î-V î40î7î7ûÿµTVm$ñSî0ïSuî4ÈïSî5,ïSî;‚tî=gïSî=ÑïSuîïPÏtîCïPÏîïPÏuî+ïPÏîïPÏ î.î#ƒ î-Wî1±î7ƒTHEGRAPEVINEINTERFACE40RemoveForward:PROC[user:GVBasics.RName,password:GVBasics.Password,individual:GVBasics.RName,dest:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteForward,individual,dest]]};RemoveMember:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,member:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteMember,group,member]]};RemoveOwner:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,owner:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteOwner,group,owner]]};RemoveFriend:PROC[user:GVBasics.RName,password:GVBasics.Password,group:GVBasics.RName,friend:GVBasics.RName]RETURNS[Outcome]=INLINE{RETURN[Update[user,password,DeleteFriend,group,friend]]};Update:PROC[user:GVBasics.RName,password:GVBasics.Password,op:RSOperation,target:GVBasics.RName,value:GVBasics.GVString_NIL,newPwd:GVBasics.Password_NULL,list:RListHandle_NIL,reporter:ReporterProc_NIL]RETURNS[Outcome];RSOperation:TYPE=MACHINEDEPENDENT{NoOp(0),Enquiries(also60..69)Expand(1),ReadMembers(2),ReadOwners(3),ReadFriends(4),ReadEntry(5),CheckStamp(6),ReadConnect(7),ReadRemark(8),pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgvî ýï^ uî˜ï^ qî•ï^ î=ï^ uî¸ï^ îï^ îŽî)î/”î< î1ï[ÕîÀî!qî,·ï[Õî-‹ï[Õuî2>ï[Õî2¡ï[Õî8÷qî:Ýï[Õî;Fï[ÕuîïY¡qîCïY¡îïY¡uî+ïY¡îïY¡ î.î#ƒ î-W î41î7xî8_vî ýïU8 uî£ïU8qî¡ïU8îHïU8uîÄïU8î'ïU8î™î)(î/Ÿî<î1ïSîÀî#§qî/AïSî0ïSuî4ÈïSî5,ïSî;‚qî=gïSî=ÑïSuîïPÏqîCïPÏîïPÏuî+ïPÏîïPÏ î.î#ƒ î-Wî1±î7ƒî8jvî ýïLf uî›ïLfqî™ïLfî@ïLfuî¼ïLfîïLfî‘î(!î.—î; î1ïJ1îÀî"gqî.ïJ1î.ÕïJ1uî3ˆïJ1î3ëïJ1î:Aqî<&ïJ1î<�ïJ1uîïGýqîCïGýîïGýuî+ïGýîïGý î.î#ƒ î,Cî0�î5.î6vî ýïC” uî„ïC”qî�ïC”î)ïC”uî¤ïC”îïC”îzî( î.€î:óî1ïA`îÀî"Qqî-ëïA`î.¿ïA`uî3sïA`î3ÖïA`î:,qî<ïA`î<{ïA`uîï?+qîCï?+îï?+uî+ï?+îï?+ î.î#ƒ î,Cî0žî5î6vî ýï8ŽuîAï8Žqî>ï8Žîæï8Žuîaï8Žîï6Yî�îï4%î îï1ðîŽ îï/¼îiîï-ˆî1î„qî ï-ˆî ùï-ˆuî"ï-ˆîï+Sî î &qî!³ï+Sî"œï+Suî$óï+Sîï)îÅ îìqîyï)îaï)uî„ï)îï&êîÕ îSqîàï&êîÈï&êuîëï&êqîï$¶uî–ï$¶îùï$¶î ýï M qîÈï Mî�ï Muîï Mqîï Mîï Mî uî'¢ï Mîïtîïäîîauîï¯ îï{îïG îïîïÞ îï© îï uîï @ –TVm$iTHEGRAPEVINEINTERFACE41Authenticate(9),UpdatesCreateRegistry(10),--notimplementedDeleteRegistry(11),--notimplementedCreateIndividual(12),DeleteIndividual(13),CreateGroup(14),DeleteGroup(15),ChangePassword(16),ChangeConnect(17),ChangeRemark(18),AddMember(19),AddMailBox(20),AddForward(21),AddOwner(22),AddFriend(23),DeleteMember(24),DeleteMailBox(25),DeleteForward(26),DeleteOwner(27),DeleteFriend(28),AddSelf(29),DeleteSelf(30),AddListOfMembers(31),NewName(32),IdentifyCaller(33),--internaltoGVNamesImplIsMemberDirect(40),--archaicIsOwnerDirect(41),--archaicIsFriendDirect(42),--archaicIsMemberClosure(43),--archaicIsOwnerClosure(44),--archaicIsFriendClosure(45),--archaicIsInList(46),60..69reservedformoreenquiriesReadMailboxes(60),--notimplemented(255)};pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïguîï_,tîï\÷uîïZÂtîïZÂî”ïZÂî‘îõ uîïX�tîïX�î”ïX�î’îõ uîïVYîïT$îïQïîïOºîïM…îïKPîïIîïFæ îïD²îïB}îï@H îï> îï;Þîï9©îï7tîï5?îï3 îï0Ö îï.¡îï,lîï*7 îï(tîï(î‹ï(î! î"° uîï%Ítî#ï%Íî�ï%Íîšuîï#˜tîï#˜î‰ï#˜î†uîï!dtîï!dî‰ï!dî‡uîï/tîÿï/îxï/îvuîïútîëïúîdïúîbuîïÅtîëïÅîdïÅîbuîï� tîï[îî2îYîÃuîï&tîˆï&îï&îÿî c uîïñîï¼ÿôTVm$$ss],ENDCASE];FindNearestServer:PROC[list:GVBasics.RName,accept:PROC[PupDefs.PupAddress]RETURNS[BOOLEAN]]RETURNS[FoundServerInfo];FindLocalServer:PROC[listl:GVBasics.RName]RETURNS[FoundState,GVBaTHEGRAPEVINEINTERFACE42ReporterProc:TYPE=PROC[Rope.ROPE];"ReporterProc"isprimarilytoallowMaintaintoreportprogresstoitsuser.Consultawizardbeforeusingthisfacility.SetServerInfo:TYPE={badName,allDown,noRoute,ok};SetServer:PROC[Rope.ROPE]RETURNS[SetServerInfo];"SetServer"providesaserverhint,primarilyusedbyMaintain.Consultawizardbeforeusingthisfacility.END.pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgvî ýï^ uîï^ qîþï^ î·ï^ uîUï^ qî:ï^ îáï^ uî]ï^ îÀï^ qî!Hï^ î"ï^ uî$Yï^ î$¼ï^ tîï[Õ î·î#îöî šî$-î*î+¿î/¸î4ùî6žî8zî<;îA@îBuîáïY¡îïî†îuî ýïPÏ qî ïPÏîÚïPÏuîxïPÏî]ïPÏî‘î"9î(î.î0vî ýïLfuîÃïLfqîÁïLfîhïLfuîäïLfîGïLfqîÏïLfî£ïLfuîàïLfqîÇïLfî›ïLfuî#OïLfî$6ïLf î,àtîïJ2 î‘îÈîüîÞî# î(Üî+ìî-Æî4�î9•î:Éî?îC&îF½îáïGýqî ýïC”uî…ïC”ÿbTVm$)Šï*Aî*^ï*Auî/ï*Aî/ùï*A î7¼ îBóvî ýï%Ø uîÆï%ØtîÄï%Øîkï%Øuîçï%ØîÎï%ØîLî(Ûtî1ï#¤uîTï#¤î·ï#¤tî"»ï#¤î#�ï#¤uî(Bï#¤tî(¦ï#¤uî.Fï#THEGRAPEVINEINTERFACE43GrapevineUser(Cedar)-LocationofserversGVLocate.mesaAndrewBirrellMay13,19831:29pmDIRECTORYGVBasicsUSING[RName],PupDefsUSING[PupAddress];GVLocate:CEDARDEFINITIONS=BEGINFoundState:TYPE={allDown,notFound,found};FoundServerInfo:TYPE=RECORD[SELECTt:FoundStateFROMallDown=>NULL,notFound=>NULL,found=>[where:PupDefs.PupAddress],ENDCASE];FindNearestServer:PROC[list:GVBasics.RName,accept:PROC[PupDefs.PupAddress]RETURNS[BOOLEAN]]RETURNS[FoundServerInfo];FindLocalServer:PROC[listl:GVBasics.RName]RETURNS[FoundState,GVBasics.RName];FindRegServer:PROC[who:GVBasics.RName,accept:PROC[PupDefs.PupAddress]RETURNS[BOOLEAN]]RETURNS[FoundServerInfo];AcceptFirst:PROC[PupDefs.PupAddress]RETURNS[BOOLEAN];returnsTRUEEND.pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî ýï_, î îîî µî"Xî ýï\ø î ýïZÃîõî½îìî)îoî!~qî ýïVZuîïT&qîMïT&î3ïT&uîïT&îúïT&îîïQñqî´ïQñîšïQñuîzïQñîaïQñ î î ýïMˆqîïMˆîäïMˆî” uîšïMˆqî ýïI uî ýïD· qîâïD·î›ïD·uî9ïD·îïD·îRî 9î&þî+ î ýï@Nqî=ï@Nîöï@Nuî”ï@Nqîyï@NîMï@Nuî!gï@Nqîï>uîÇï>î6ï>î3 qîžï>îWï>uîï;åî®qîDï;åî,ï;åuî„ï;åîï9°îŒqî!ï9°î ï9°uîbï9°îï7|î-îÂî·qîï5Huîöï5HîYï5Hvî ýï0ßuîï0ßqî ï0ßî´ï0ßuî/ï0ßî’ï0ßîIî)Øqî1ï.ªuîTï.ªî·ï.ªqî"»ï.ªî#�ï.ªuî(Bï.ªqî(¦ï.ªuî.Fï.ªî/-ï.ªqî0ï.ªî0éï.ªuî5œï.ªî6ƒï.ªîAIvî ýï*AuîÎï*AqîÌï*Aîtï*Auîïï*AîRï*Aîl î(£qî)Šï*Aî*^ï*Auî/ï*Aî/ùï*A î7¼ îBóvî ýï%Ø uîÆï%ØqîÄï%Øîkï%Øuîçï%ØîÎï%ØîLî(Ûqî1ï#¤uîTï#¤î·ï#¤qî"»ï#¤î#�ï#¤uî(Bï#¤qî(¦ï#¤uî.Fï#¤î/-ï#¤qî0ï#¤î0éï#¤uî5œï#¤î6ƒï#¤îAIvî ýï; uî×ï;qîÔï;î|ï;uî÷ï;î[ï;qî$_ï;î%3ï;uî)æï;qî*Iï;uî/êï;î0Mï;tîïî¦qî ýïžuî…ïžÔTVm$QïuîŸïQïîïQïîïOºtîÃïOºî©ïOºuî‰ïOºtîpïOºîDïOºuîëïOºîNïOºî ýïKQ tî"ïKQîíïKQî� uî ¢ïKQtî ýïFçî ýïB~uîïB~tî ïB~îÅïB~uîcïB~îHïB~tîÐïB~î¤ïB~uîáïB~sî ýï>îE îõî›î4î¾î"?î%_î'«î,äî2Äî6Mî9&îîE îõî›î4î¾î"?î%_î'«î,äî2Äî6Mî9&î îDHîF#îáï0Øîøî£î}î!:î#Þî)Çî+¡î-íî3 î9Pî>eîB«îDzîáï.¤îcîqîuîqî ½î%î&Ôî( î*Üî,�î0òî6Å î>sîA îáï,o îwuî ýï( qîCï(îüï(uî0ï(vî ýï!guîéï!gqîçï!gîŽï!guî ï!gîmï!gqî*ï!gîõï!guî$`ï!gî%=ï!g qî.åï!gî/Œï!guî6ï!gî6|ï!gî=™qî?&ï!gî@ï!guîA1ï!gqî1ï3uî¸ï3îï3tîïþî˜îhîIîWîïî!pî%Åî'kî* î0jî3[î5*î9 î<ºîáïÉîVîÂîî!òî#˜î(zî*î-î2) î8aî<.î@‹îáï•î4îî ßî"Kî&±î,‡î.Óî2î3«î5÷î9¸ îB�îáïaî9îQî%£î(8î*œî,kî0Lî1£î3ïî7#î<=î=âîEîáï,vî ýï ŽuîCï ŽqîAï Žîéï Žuîdï ŽîÇï Žtîï Yî}îPîaî;î Ôî&î*üî-\î/î1˜î5÷î7bÿhTVm$“EÉîpîÜsîïC”î/îÝîîµîî" î)rî.¢ î6»î9'î:Ì îB�îáïA` î(îàîBî!ù î*Ñî/‡î1òî3— î:µ îTHEGRAPEVINEINTERFACE45AUTHENTICATIONANDMAILBOXPOLLINGNewUser:PROC[handle:Handle,user:GVBasics.RName,password:ROPE];Providesnewusernameandpassword,andstartsauthenticationandmailboxchecking.MBXState:TYPE={unknown,badName,badPwd,cantAuth,userOK,allDown,someEmpty,allEmpty,notEmpty};Recordscurrentstateoftheuser'smailboxes.Initially"unknown".Setto"badName","badPwd","cantAuth"or"userOK"afterauthenticationcheck.Setto"allDown","someEmpty","allEmpty",or"notEmpty"aftermailpollingiscomplete."someEmpty"meansnotallserversrepliedandnonehadmail;"allEmpty"meansallrepliedandnonehadmail;"notEmpty"meansatleastonehasmail;"allDown"meansnonereplied.MailboxState:PROC[handle:Handle]RETURNS[state:MBXState];Returnsthecurrentmailboxstate.Willnotreturn"unknown"or"userOK"(Thesechangeto"cantAuth"or"allDown"aftersuitabletimeoutsifnecessary.)WaitForMail:PROC[handle:Handle];returnsonlywhenthereislikelytobemailfortheuserPossibleERRORS:noneACCESSTOMAILBOXESTheintendeduseisasfollows.Theuserhasanumberofmailboxes,eachofwhichisonanMTPserverorxonaGrapevineserver.Toaccessallofaclient'smail,call"NextServer"repeatedlyuntilitreturnsnoMore=TRUE.Foreachsuccessfulcallof"NextServer",iftheServerStateis"notEmpty"usethemailboxaccesspî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî ýïWl îÑîzî$ãvî ýïPÏuîjïPÏqîhïPÏîïPÏuî‹ïPÏîrïPÏîrî ªî$î/¬qî6#ïPÏî6÷ïPÏuî94ïPÏî9—ïPÏtîïNšî|îAî&îÊîmî%€î(#î+Å î4žî7Aî î1ïEÉîpîÜtîïC”î/îÝîîµîî" î)rî.¢ î6»î9'î:Ì îB�îáïA` î(îàîBî!ù î*Ñî/‡î1òî3— î:µ îáï?+ îdî¡ î 5î#gî&xî*öî,aî2Ý î;wî?ŸîBîD‚îáï<÷îGîêî7îØîc î&Žî*¶î,±î1î4>î7‹î:,î=· îEJîáï:Âî†î­î;î±î;î#…î'­î*úvî ýï6Y uî ï6Yqîï6YîÆï6YuîAï6Yî(ï6Yî)qî#kï6Yî$?ï6Yuî(óï6Yî)Úï6Yî-… tîï4%îîkîîRî#cî&qî(Ôî,èî4$î5Ýî<>î@šîE0îáï1ð î(îàî¦î!Ùî&Ðî,:î-‘ vî ýï+S uîÞï+SqîÜï+Sî„ï+Suîÿï+Sîæï+Sîçî"Ætîï)î¦î¢î#î�îúî!¯î#Tî%$î(5î*\î,¨îï&êîEîî ýï¯î&î¦î ýïîÀî,îŒîøî°î ýï©îÀî¥îîOî4îØ î"ˆî%¯î'Sî+6î,¡î.•î0ˆî4/î8î9Êî<„î=¹îDî Ðï uîìîúîõî˜îÍîYîÂî"W î*Ø î1;î4qî5Èî:` îE î Ðï @î÷ î$îºî^ î#6î$Œî&Ø î.î/† î7î9zî;Æî@þÿ±TVm$8dercontainstheitemtypeandlengthinbytes.Thefirstitemwillbetheguaranteedrecipientlist.Themessagebodyisfollowedbyanitemoftype"LastItem".Withinanitem,useanIO.STREAMmaybeusedtoaccessthedataoftheitem.EndOf[]willbetrueattheendoTHEGRAPEVINEINTERFACE46procedurestoreadthemailinthemailbox(otherwisethereisnopointinusingthemailboxaccessprocedures,sincethemailboxiseitheremptyorinaccessible).Toreadthemailinthemailbox,call"NextMessage"untilitreturnsmsgExists=FALSE.Thefirstcallof"NextMessage"foreachserverwillattempttocreateastreamtotheserver(signallingifitfails).Whileaccessingamailbox,"Failed"maybesignalledatanytimeifthecommunicationsystemfails(becauseofnetworkorservererror).If"Failed"issignalled,nofurtheroperationsonthismailboxareallowedNOTE:IftheuserhasamailboxonanMTPserver,calling"NextMessage"forthatmailboxwillraise"Failed[communicationFailure]".If"NextMessage"returnsdeleted=TRUEitindicatesthatthemessageisreallyjustaplaceholderandhasbeenremovedfromthemailbox;youshouldnotattempttoaccessthemessage.Returningarchived=TRUEindicatesthatthemessagehasbeenspilledtosomefileserver,andaccessingitislikelytobemuchslower.Foreachmessagethatexistsandisnotdeleted,themessagemaybemanipulatedbytheotherproceduresprovided."ReadTOC"maybeusedtoreadanyTOCentryforthemessage(givinglength=0ifthereisnoTOCentry),then"StartMessage"maybecalledtoreadtheguaranteedpropertiesofthemessage;thesearenotavailableforMTPservers;thesemaynotbecalledafteryouhavecalled"NextItem"forthismessage."NextItem"maybecalledtoaccessinsequencetheitemswhicharethecontentsofthemessagebody.NotethattheItemHeadercontainstheitemtypeandlengthinbytes.Thefirstitemwillbetheguaranteedrecipientlist.Themessagebodyisfollowedbyanitemoftype"LastItem".Withinanitem,useanIO.STREAMmaybeusedtoaccessthedataoftheitem.EndOf[]willbetrueattheendoftheitem.CallingNextItemclosesanyIO.STREAMonacurrentitem(eveniftheentrieitemhasnotbeenreadyet)andmovesontothenextitem.Youmaycall"WriteTOC"tochangeorcreateaTOCentryforthemessage,oryoumaycall"DeleteMessage"toremovethissinglemessagefromthemailbox;"ReadTOC","StartMessage","NextItem"or"NextBlock"maynotbecalledaftercalling"WriteTOC"or"DeleteMessage"forthismessage.Atanytimewithinamessage,youmaycall"NextMessage"toskiptheremainderofthismessage.Atanytimewithinamailbox,youmaycall"Accept".Thisterminatesreadingthemailboxanddeletesallmessagesfromthemailbox.Calling"accept"willnotdeleteanymessageswhichyoupî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî Ðï_, î€î%î)îuî†î,î!xî&± î-î0€î1ëî3Þî7Uî8ûî<“î>ßîDî Ðï\ø îØî8î„î½î (î#÷î'òî)« î ýïXŽîîîjî{î îmîýî"“ î,Qî/‡î0ßî5vîBµîEyî ÐïVZîfî îÇîïî î#øî&�î+tî-î1î2Gî6¥î8Jî:–î>x îEîFkî ÐïT%îîî÷î+î!¼î'@î*0î+ÿî1œî3Aî5Ùî8âî:8î<„ î ÐïQñî#îî�î%î Vî"î%ñî*£î,1î1´î3 î9î;î?ˆ îFî ÐïO¼îiî¡îõî ýïKSîüîŠîÖî»î1îeî žî"‘î$„î(,î,fî0Î î:Œî<´î?…îD¾î ÐïIî î ýïDµî ‹ îIîá î%¶î'î,¢î/tî1Àî6ùî8eî<$î>½î?ò î ÐïB€îtîéîîbî îìî%žî(5î,{î.Þî3Åî5jî9wî;ÄîAÙî Ðï@L îvî îÜî"(î'bî)×î-î1.î2Óî6=î8‘î<Ëî?nîENîF¦î Ðï>î…î*îùî¨î§î=î"dî'�î*oî.1î0Õî2@î4¤î9…î;ÑîA îCúî Ðï;ã îxîSîŸî î"Ïî ýï7yîÔîÄî”î¤îIî Mî"æî&cî)Ûî,î.Nî3ˆî8î>5î?‹îB÷îDbî Ðï5EîMî–î¡ î!kî$[î&*î* î+°î.µî1 î7ì î>î?»îBî Ðï3î;î�îòî—î¿î gî%Fî(±î+¢î.î/Ôî3¶î6èî9î<¦î@‡ î Ðï0Üîøî�î ýï,r î„îtîCî$îÉî!×î#}î)î+iî.öî2Ùî5-î7yî<Åî>hî@´îEîî Ðï*>î#îõîA îÆî"î$gî'oî*Tî,øî1î2¼î7î9Åî<”î?œîB2îDî Ðï( î»î:îUîî$Rî'�î(ùî.Eî0 î2î5î6¿î9¤ îA¹îFPî Ðï%Õî1î‘î„îî î!Õî$æî&‹î*™î,åî/êî1Žî3Úî7¿î=î?™îAhîD9îEÝî Ðï# î^îîNî3îýî"#î%ùî(’î1#î3î4Kî8ùî<î?Žî@åîC1î Ðï!lîÙîNî²îÛîßî�î 0î$5î&(î'Íî*î-.î ýïîìîÜîr î£îHî"Þî$—î(‘î)Åî-Bî0ºî2âî5.î:¿îî Ðïš îWî îCî!3î#–î%fî)Gî,yî0á î9î:ËîE[î Ðïeîiî ýïûî ïîˆî�î®îâîtî! î#ûî&‘ î0Oî1ôî4×î7#î=~î?!îAºî ýï ’î ïîˆî�î®îâîsî! î#úî&�î-Aî0P î6Ûî;²î=þîC6î Ðï ]î-î(îæî#îoî$…î)Oî.Öî1kî3Îî7§î:?î?ýîCàÿiTVm$¹Exists,archived,deleted:BOOLEAN];THEGRAPEVINEINTERFACE47haven'tbeengivenachancetoread.Nootheroperationsonthemailboxareallowedaftercalling"accept".Ifyoucall"NextServer"withouthavingcalled"accept",themailboxisclosed(ifnecessary)withoutdeletingthemessages(exceptthosewhichweredeletedbycalling"deleteMessage").ServerType:TYPE={MTP,GV};ServerState:TYPE={unknown,empty,notEmpty};"unknown"meanstheserverdidn'treplytomailcheckpackets;inthiscase,forefficiency,youshouldNOTcall"NextMessage".ThereisnopointincallingNextMessageiftheServerStateis"empty".NextServer:PROC[handle:Handle]RETURNS[noMore:BOOLEAN,state:ServerState,type:ServerType];Returnsinformationaboutthenextserverinthemailboxsitelistoftheuser,andthatserverbecomesthe"currentserver".Ifthereisnosuchserver,noMore=TRUE,inwhichcasethenextcallto"NextServer"willstartanewsequenceofmailretrieval.Ifthestateis"unknown",attemptingtoaccessthemailboxisinadvisable,astheserverisprobablydown.Ifthestateis"empty",theremayinfactbemail,asthestateisonlyahintobtainedbypolling.ServerName:PROC[handle:Handle]RETURNS[serverName:GVBasics.RName];Providesthenameofthecurrentserver.ForMTPregistries,thiswillbeequivalenttotheregistryname.FailureReason:TYPE={communicationFailure,--serverornetworkdown--noSuchServer,--servernameincorrect--connectionRejected,--serverfull,mbxbusy,etc--badCredentials,--name/pwdrejected--unknownFailure--protocolviolationorunknownMTPerror:likelytobepermanent--};Failed:ERROR[why:FailureReason,text:ROPE];Maybesignalledbyanyoftheproceduresthathandlemessages.NextMessage:PROC[handle:Handle]RETURNS[msgExists,archived,deleted:BOOLEAN];pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî Ðï_,î~î§î3îhîèî�î#nî%¶î)7 î/²î1¥î3ñî9*î;~î@\îCŽî Ðï\øî3îÁîXîî î"nî'Gî+¥î/‡î5eî7±î<êî>VîBXî ÐïZà î@îî(îtî%2î)èî-iî1Lî4rî8ûî:Õî ÐïX�uî ýïT% qîÊïT%îƒïT%uî!ïT%îïT%qî;ïT%îLïT%uî­ïT%qîŠïT%îxïT%uî¬ïT%î ]ïT%î ýïO» qîµïO»înïO»uî ïO»îñïO»î&î ’î%#î+�tîïM‡îJîsî¿î¡î#pî&Ìî(qî+‚î/[î4ªî6Pî8éî<0î>W îD§îáïKRî'îºîP î#êî'Íî)9î+,î.£î0Iî4° î=î>dî@° îGòîáïIvî ýïD´ uîµïD´qî³ïD´îZïD´uîÖïD´î½ïD´î½î!�qî"„ïD´î#XïD´uî( ïD´î(óïD´qî.®ïD´î/gïD´uî4NïD´î5*ïD´î8Õ î@kî1ïB€ î„tîï@Kî îqî3î €î#”î'vî)î+hî0¡î3î5Wî6úî9Fî<ƒî?&îAøîáï>î1î}îÜî!Jî"Øî&Cî'¯î)¢î,¿î0ù î;µî=[îA>îD-îFyîáï;âîwî îœî1î!Oî"„î%Iî*èî,Œî/� î5¾î7Kî9˜î<Ìî>7 îáï9® îšî?îLî™î"Ñî$= î+}î-6î/‚î3dî4Ïî:Sî>ºî@HîB”îEÈîáï7yî•îîñî—îEî!î$~î&7î(ƒî+·î-#î0î1Sî4&î9™î;svî ýï0Û uîEï0ÛqîBï0Ûîêï0Ûuîeï0ÛîMï0ÛîMqî"�ï0Ûî#dï0Ûuî(�ï0Ûî(äï0Û î1tîï.¦î|îÈîlîî\î" î&Èî)^î- î3î5¨î8=î: î@tîBîDeîáï,ruî ýï%Ó qî™ï%ÓîRï%Óuîðï%ÓîÕï%Óîï#žtî]ï#žî×ï#žîÔî!¶î#oî( î,+uîï!j tî'ï!jî¡ï!jîžî€î $î%Äuîï5tî�ï5î ï5îîèî"¶î%Èî);î+fuîïtî×ïîQïîNîëî$ãuîïË tîfïËîßïËîÝîî$�î&Vî,2î/Ùî3¯î7dî9 î:ØîA{uîï–î ýï-qîºï-îtï-uîÌï-î/ï-î¢ î"qî%Mï-î&!ï-uî(^ï-î(Áï-tîïøî=î î©îƒîî¿î! î'»î*�î.ëvî ýï Z uîï Zqîï Zî»ï Zuî6ï Zî™ï Zî™qî"Üï Zî#°ï Zuî(dï Zî(Çï Z î/tî5\qî:ªï Zî;cï Zuî@Jï Zî@­ï ZÿTVm$\î+ï:Âvî ýï6Zuîkï6Ztîiï6Zîï6Zuî‹ï6Zîïï6Zîïî!'tî$°ï6Zî%„ï6Zuî(+ï6Zî(Žï6Zvî ýï1ñ uîï1ñtîï1ñî®ï1ñuî)ï1ñîŒï1ñîŒî#Ïtî ýï&êuî…ï&êÿFTVm$ THEGRAPEVINEINTERFACE48StartMessage:PROC[handle:Handle]RETURNS[postmark:GVBasics.Timestamp,sender:GVBasics.RName,returnTo:GVBasics.RName];NextItem:PROC[handle:Handle]RETURNS[GVBasics.ItemHeader];Skipstheremainderofanypreviousitem,thendeliverstheheaderofthenextitem.GetItem:PROC[handle:Handle]RETURNS[IO.STREAM];ProvidesanIOstreamforreadingthecurrentitem.Accept:PROC[handle:Handle];Flushthemailboxentirely(andirrecoverably)."ReadTOC","WriteTOC"and"DeleteMessage"areusefulmainlyforLily.ReadTOC:PROC[handle:Handle]RETURNS[ROPE];WriteTOC:PROC[handle:Handle,entry:ROPE];DeleteMessage:PROC[handle:Handle];END.pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgvî ýï^ uî,ï^ qî*ï^ îÑï^ uîMï^ î°ï^ î°î"�qî#ûï^ î$Ïï^ uî)ƒï^ î)æï^ î0hî=ùî1ï[ÕîÀî$ vî ýïWluî¡ïWlqîŸïWlîFïWluîÂïWlî%ïWlî%qî hïWlî!<ïWluî%ïïWlî&RïWltîïU8îÎîîuîî±î#ôî'Uî*`î/4î1€î5Üî7î9Ëî<àvî ýïPÏuîæïPÏqîäïPÏî‹ïPÏuîïPÏîjïPÏîjqî­ïPÏî �ïPÏuî%4ïPÏqî%—ïPÏuî&ÞïPÏqî'5ïPÏuî+ÿïPÏî,cïPÏtîïNšî|wîoïNšîëïNštî2ïNšî¶ïNšî�î¸î"Žî$Úî)ˆvî ýïJ2uî ïJ2qîïJ2î°ïJ2uî+ïJ2îŽïJ2îŽtîïGýîÐîîUî-î!Jî ýï?+ î, î]îî)‘î+åî/Ôî4Hî6pvî ýï:Âuîï:Âqîï:Âî­ï:Âuî(ï:Âî‹ï:ÂîŒqî Ïï:Âî!£ï:Âuî&Vï:Âqî'=ï:Âî(ï:Âuî*¸ï:Âî+ï:Âvî ýï6Zuîkï6Zqîiï6Zîï6Zuî‹ï6Zîïï6Zîïî!'qî$°ï6Zî%„ï6Zuî(+ï6Zî(Žï6Zvî ýï1ñ uîï1ñqîï1ñî®ï1ñuî)ï1ñîŒï1ñîŒî#Ïqî ýï&êuî…ï&ê[TVm$»NïT$îïQïtîMïQïî3ïQïuîïQïîúïQïîTHEGRAPEVINEINTERFACE49GrapevineUser(Cedar)-publicDEFSforclientsendingmailGVSend.mesaAndrewBirrellMay12,19831:34pmDIRECTORYRopeUSING[ROPE],GVBasicsUSING[ItemType,Password,RName];GVSend:CEDARDEFINITIONS=BEGINROPE:TYPE=Rope.ROPE;Thesedefsallowclientstoinjectmessagesintothemailsystem.Theyaredesignedsothattheycanbeusedbymultipleprocessescreatingdifferentmessages;thestateofcreationofasinglemessageisrepresentedbya"Handle".Theinterfaceisalsodesignedsothatitmaybeimplementedeitherbytransmissionoverthenetworktoaremotemailserver,orbycallsonalocalmailserver.Handle:TYPE=REFObject;Object:TYPE;Create:PROCEDURERETURNS[handle:Handle];ForanyoneHandle,thefollowingcallsmustbemadeintheorder:StartSend,AddRecipient,AddRecipient,AddRecipient,...CheckValidity{iff"validate=TRUE"when"StartSend"wascalled},StartItem,(AddToItem,AddToItem,...),StartItem,(...),...SendAbortmaybecalledatanypointtoabandonthesequence.AHandlemaybere-used."Abort"happensimplicitlyifneededsometimeafterthelastreferencetotheHandlegoesaway.SendFailed:ERROR[why:Rope.ROPE,notDelivered:BOOLEAN];"StartSend"raisesnosignalsthatmaybecaughtbytheclient.TheERROR"SendFailed"mayberaisedbyanyofAddRecipient,CheckValidity,StartItem,AddToItem,orSendifsomecommunicationfailureoccurs.Ifitisraised,theclientshouldgenerallycatchit,gobacktothestartofthemessage,andre-call"StartSend"."StartSend"willthenattempttofindabetterpî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgtî ýï_, î îîîî#Fî%nî)î.î ýï\÷ î ýïZÂîõî½îìî)îoî!~qî ýïVYuîïT$qîÃïT$î©ïT$uî‰ïT$qîpïT$îDïT$uîëïT$îNïT$îïQïqîMïQïî3ïQïuîïQïîúïQïî�î%ýî+"î ýïM†qîïM†îçïM†î— uîœïM†qî ýïIî ýïD²uîïD²qî ïD²îÅïD²uîcïD²îHïD²qîÐïD²î¤ïD²uîáïD²tî ýï@Iîàî¢î5îhî î¼î%zî(@î*Œî-�î2Íî66î8Šî=ûî?´îB†îEwî Ðï>î î°îŠîÆî�î#¾î)î/×î2#î5Xî6ûî<,î=Ïî?îBÝîHî Ðï;à îÜî¶îëîôî ·î&Aî'­î*yî/êî1£î4uî5Íî8½î:Œ îBcîF1î Ðï9¬ î�î~îËîûî  î!Õî&Jî)[î-•î/Nî1(î4Bî65î7jî:°î=Áuî ýï5BqîÛï5Bî”ï5Buî2ï5Bqîï5Bîëï5BuîÇï5BîÚï5Bî ýï0Øqîlï0Øî%ï0ØuîYï0Øvî ýï,ouîéï,oqîkï,oîï,oî uî‘ï,oîôï,oî#ôtî ýï(î“î+î¹îÝî)î üî$î'bî)2î,Èî.mî0ºîï%Ð îï#œ î½ îk î(î(öî)Óîï!g îçî]î% î(� î0Jî2êîï2 î˜ î  î$/î% î%èî'– î. î0øî1Ôî2±îïýî ýïÈîÔîÄî”îuîî³î )î!Îî'Bî)Žî0 î1Œî6Wî9Gî;î@œî Ðï”î îëîAîµî#£î&Öî)"î+®î1oî3î5`î:+î=/uî ýï* qî´ï*înï*uî0ï*îï*îŠqî ï*î æï*uî##ï*î#ÿï* qî,¿ï*î-xï*uî2Éï*î3±ï*tîïö îËî‹î~îðî"Âî%²î'‚î+ëî-Æî0î4�î7`î<ä îENîáïÁî±îœîwîî³ î#a î,’ î3 î:«îpî?ýîA‰ î1ïD³î£î#‚î/î5\î@ëqî1ïBuî;ïBqîïBuî�ïBîvïB î(Ctîï@JîÛîtîŸî î!vî#žî%þî(ùî*Ôî- î1•î6Sî:Mî;‚îA˜îáï>î… îòîFî î!rî#¾î&Ïî*±î,î1n î7Ðî:³î?ÃîEAîáï;áî'î÷î©îðî!= î*¤î- î/ìî2ývî ýï5B uîêï5Bqîèï5Bî�ï5Buî ï5Bîòï5Bîòî#* î)U î4‹tîï3 îuîîfîåvî ýï,o uîNï,oqîKï,oîóï,ouînï,oîVï,oîVî#Žqî( ï,oî(±ï,ouî/>ï,oqî/¡ï,ouî1¬ï,oî2ï,oî=žqî>†ï,oî?Zï,ouîD ï,oîDõï,oqî1ï*:uî¦ï*:î ï*:tîï(î˜îhîIî|îwîà î$Æî'íî+î.úî0¿î3 î9mî?sîA îáï%Ñî‚îÎîKî†î!®î$Õî'k î-Æî0‰î7î8¸î=óî@GîB“îáï#�îÆîÍî î¸î!\î%î&£î(—î,£ î2þî8î:[î?@î@äîáï!h îÁîNîç îêî#î'Ðî,Åî.hî0´î5îî7Zî9üvî ýïÉuî¸ïÉqîµïÉî]ïÉuîØïÉîÀïÉîÀî øî$�î0Þtîï•î„î¹îòî-îî!Õî$»î(î*iî,9 î4î:W îB4îáï` vî ýïÂuîÏïÂqîÌïÂîtïÂuîïïÂî×ïÂî×î ·î!žqî#ƒïÂî#íïÂuî'šïÂî(ÏïÂî6±YTVm$Iî*}ï_,sîï\øîñî=îCîèî4îâî$î'Vvî ýïVZuîêïVZtîèïVZî�ïVZuî ïVZîòïVZîóîÒsîïT&î@îåîÉîî!Èî&_î)[î,Ýî/)î2:î6î8’î>¬î@P îFrîáïQñvî ýïKTuîZïKTtîWïKTîÿïKTuîzïKTîbïKTîbîBsîïI îÏîî1î_î!/î%î&µî)Muî THEGRAPEVINEINTERFACE51AddToItem:PROC[handle:Handle,buffer:ROPE];Addthedatatothecurrentmessagebodyitem.Send:PROC[handle:Handle];Committosendingthemessage;returnsonlywhenthemailserverhascommitedtodeliveringthemessage.Abort:PROC[handle:Handle];Abandonthemessage.Maybecalledatanytime.ExpandInfo:TYPE=MACHINEDEPENDENT{ok,notFound,individual,allDown};ExpandFailed:ERROR[why:Rope.ROPE];Expand:PROC[name:GVBasics.RName,work:PROC[GVBasics.RName]]RETURNS[ExpandInfo];Ifthenamewillbeinterpretedbythemailserverasadistributionlist,enumeratesthenameswhicharedirectmembersofthatlist.Thisisintendedforuseonlyiftheuserwantstoinspectthecontents.Notethatthecontentsmaychange,orthenamemaybecomeinvalid,beforedeliveryofanymessage."Expand"worksevenifthelisthastobereadfromanMTPserver.Mayraise"ExpandFailed".IfExpandFailedisraised,somecommunicationerrorhasoccurred;youshouldre-callExpand,whichwilltryanotherserver.NotethatfailureofExpandmaybecausedbyfailureofsomeremoteserver;youmaystillbeabletosendamessagesuccessfully."notFound"meansthenameisinvalid;"individual"meansthenamespecifiesanindividual;"allDown"meanseitherallmailserversareinaccessible,orsomeotherserver(possiblyMTP)neededfortheexpansionisinaccessible.END.pî "ïgqî! ïgî!ïïgpî#ïgqî$<ïgpî*…ïgqî+ ïgrîG~ïgvî ýï_,uî·ï_,qî´ï_,î\ï_,uî×ï_,î¿ï_,î¿î!÷qî&Ÿï_,î'sï_,uî*ï_,î*}ï_,tîï\øîñî=îCîèî4îâî$î'Vvî ýïVZuîêïVZqîèïVZî�ïVZuî ïVZîòïVZîóîÒtîïT&î@îåîÉîî!Èî&_î)[î,Ýî/)î2:î6î8’î>¬î@P îFrîáïQñvî ýïKTuîZïKTqîWïKTîÿïKTuîzïKTîbïKTîbîBtîïI îÏîî1î_î!/î%î&µî)Muî ýïD· qî ïD·îÅïD·uîcïD·qîHïD·îZïD·îTuî&æïD·î(ïD·î*nî13 î8 î>Lî ýï@N qîLï@Nîï@Nuî^ï@NîÁï@Nî3qî ¼ï@Nî!�ï@Nuî#Íï@Nî$0ï@Nvî ýï;åuîlï;åqîiï;åîï;åuîŒï;åîïï;åî(î$·qî(®ï;åî)Uï;åuî+Ñï;åî,4ï;åqî81ï;åî9ï;åuî=¸ï;åî> ï;å îF5tîï9°îœîèîŒî!îñ î ±î"‹î$Øî'èî+Êî-ƒî.¸ î5Ûî8r î?�îAÍîáï7|îÄîîÚîyî î"îî%†î(–î*î/lî1”î3ôî6ðî8Fî:’î=wîAFîBëîáï5Hî-îVî©î{îÇî%î(î,ñî.ªî0öî4›î7‹î