Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

v40i089: netramet - Network Traffic Accounting Meter, Part01/25

72 views
Skip to first unread message

J Nevil Brownlee

unread,
Nov 6, 1993, 12:35:21 PM11/6/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 89
Archive-name: netramet/part01
Environment: INET, UNIX, DOS

NeTraMet, the first implementation of the Internet Accounting
Architecture (outlined in RFC 1272, "Internet Accounting Background")
is now complete.

NeTraMet is an accounting meter which runs on a PC under DOS or a
SunOS Unix system. It builds up packet and byte counts for traffic
flows, which are defined by their end-point addresses. Addresses can be
ethernet addresses, protocol addresses (IP, DECnet, EtherTalk or IPX)
or 'detail' addresses (IP port numbers, etc), or any combination of
these. The traffic flows to be observed are specified by a set of
rules, which are downloaded to NeTraMet by a 'manager' program. Traffic
flow data is collected via SNMP from NeTraMet by a 'collector' program.

NeMaC, a combined manager and collector program, is supplied with
NeTraMet. It downloads rules to meters, and collects data from them.
Although a meter may only have one manager, its data can be collected
by several collectors, which do not have to be synchronised. NeMac
can manage and collect data from an arbitrary number of meters.

The format of NeMaC's collected flow data files is very general; the
contents of data lines in the file is completely specified by the
user. ASN.1 opaque objects are used to retrieve flow data so as to
minimise the overheads in using SNMP for this purpose.

NeTraMet provides a valuable tool for analysing network traffic flows,
and should prove to be of interest to anyone interested in network monitoring,
capacity planning, performance measurement, etc. You are invited to
try it on your network!

User comments and suggestions will be very welcome: please post these to the
Internet Accounting mailing list, accoun...@wugate.wustl.edu. To
join the mailing list, send a request to accounting-ml-request@
wugate.wustl.edu.

PC Users Please Note:
In the pc directory there is a file NeTraMet.zip. One should move the
NeTraMet.zip file to a PC, where it can be unpacked and NeTraMet.exe built
using Turbo Make and Turbo C.

+----------------------------------------------------------------------------+
| Nevil Brownlee: n.bro...@auckland.ac.nz Deputy Director |
| Phone: 64 9 373 7599 x8941 Computer Centre, University of Auckland |
| FAX: 64 9 373 7425 Private Bag 92019, Auckland, New Zealand |
+----------------------------------------------------------------------------+

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# Contents: netramet netramet/doc netramet/doc/NeTraMet
# netramet/doc/snmp netramet/doc/snmp/HISTORY netramet/examples
# netramet/mib netramet/pc netramet/pc/NTM.Zip.UU.B netramet/sg
# netramet/sg/apps netramet/sg/apps/snmpnetstat netramet/sg/manager
# netramet/sg/snmplib netramet/src netramet/src/apps
# netramet/src/apps/snmpnetstat netramet/src/manager
# netramet/src/manager/include netramet/src/meter
# netramet/src/meter/include netramet/src/snmplib
# netramet/src/snmplib/include netramet/sun netramet/sun/apps
# netramet/sun/apps/snmpnetstat netramet/sun/manager
# netramet/sun/meter netramet/sun/snmplib
# Wrapped by kent@sparky on Tue Nov 2 18:17:04 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 1 (of 25)."'
if test ! -d 'netramet' ; then
echo shar: Creating directory \"'netramet'\"
mkdir 'netramet'
fi
if test ! -d 'netramet/doc' ; then
echo shar: Creating directory \"'netramet/doc'\"
mkdir 'netramet/doc'
fi
if test ! -d 'netramet/doc/NeTraMet' ; then
echo shar: Creating directory \"'netramet/doc/NeTraMet'\"
mkdir 'netramet/doc/NeTraMet'
fi
if test ! -d 'netramet/doc/snmp' ; then
echo shar: Creating directory \"'netramet/doc/snmp'\"
mkdir 'netramet/doc/snmp'
fi
if test -f 'netramet/doc/snmp/HISTORY' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/HISTORY'\"
else
echo shar: Extracting \"'netramet/doc/snmp/HISTORY'\" \(499 characters\)
sed "s/^X//" >'netramet/doc/snmp/HISTORY' <<'END_OF_FILE'
XVersion .91: Changed the ASN type for the types: Counter, Ipaddress, gauge,
Xtimeticks, and opaque. The SMI defines them as application specific types,
Xnot ASN_INTEGER and ASN_OCTET_STRING.
XVersion 1.0 Added snmpnetstat, snmptrap, snmptrapd. Everything runs on a new
XAPI that has an asynchronous interface. Most old hard-coded limits are either
Xnon-existent or much larger than necessary. The mib module now gets it's data
Xby parsing a text file in the same ASN.1 format as is given in RFC1066.
END_OF_FILE
if test 499 -ne `wc -c <'netramet/doc/snmp/HISTORY'`; then
echo shar: \"'netramet/doc/snmp/HISTORY'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/HISTORY'
fi
if test ! -d 'netramet/examples' ; then
echo shar: Creating directory \"'netramet/examples'\"
mkdir 'netramet/examples'
fi
if test ! -d 'netramet/mib' ; then
echo shar: Creating directory \"'netramet/mib'\"
mkdir 'netramet/mib'
fi
if test ! -d 'netramet/pc' ; then
echo shar: Creating directory \"'netramet/pc'\"
mkdir 'netramet/pc'
fi
if test -f 'netramet/pc/NTM.Zip.UU.B' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NTM.Zip.UU.B'\"
else
echo shar: Extracting \"'netramet/pc/NTM.Zip.UU.B'\" \(55800 characters\)
sed "s/^X//" >'netramet/pc/NTM.Zip.UU.B' <<'END_OF_FILE'
XMG25.VTW0%<V2#!LG'0-6LYPC'1:.]");7;X34*E9".\$0M\(T&6M0:1^3"JG
XM2D@-8G'BR-->W)/H4Z<GJ10?7^TT2]T.DLKR'HJD>1^Y?1ME&O3H%/2\JE,J
XMBB_NC<1Z*W6JQ:HN.O2)Y#]$B,U$KA9:E.G3*_;,?!_1ZF%!''Z=L\79\MWE
XM;[J:]$93=-<QNF ?2_\,J8=:9O]-GUHI[-DOPNZQ=$I]56XRQ/M$LJW*H)>=
XM;5.JELLMIM6)'I7ZM"J4YT+)DUY:))PX[\ADO",2\0Y7YS\U:B2J,O*L&^&K
XMM8FJY-0PB_^<PG>93PXB0'Q#_7*" ,?K77<N6C-\=BC9"ZZ6,VR 79F[L++%
XM4Q%FXXTQMT;5;,G MTXR>&U&7 \%$4L+JNH]S2F<E0M987E49*[><MMTF:#2
XM"L%*5[EA@+?T/*R8M+J,.%?K5H]<C?;-:>SQ:E,L_(?4KSD.[1V"F17!$, /
XM"6%,:&5LE^>:;@PZ%XN':C4HP51DLTQ"<ARJ>; [G<<7&QYFXSK<-X=L<3/F
XMU5;C,91"O5BX;<+I.2^L:]).)U)&^"9+1H])8WU*+8.$E\FBE!L&?A$Q;D--
XM#\>Q-L@RB3FS#9M0*_HYG3_&TUEFD7=[G28P!3V5'AS=S"_.KX/(D7/K#>KI
XMDE=_[C(6R_AM?<]1@_6!!@$'U3F,U"E/A3#:!*Y3JHUD'AZ.>2K1G@#KFZD5
XM.-)6M&*&Q1"/U[$$]HC#[2"SA',)XJ_U=#6>0<P:GT^ZK,2#,WJ *</[G3SF
XM2'I $><&B<,-@*Z&HU5J"S*R73""=S@>6=1D47)!._EPD<Y00^SE;M_P+.)6
XM#'K? 80\B"9-Y$9L6K#ZR%T&_L6XW6X.:>[FF(7;&0/SWK:.9$V\92H[QG<\
XM22AY":_+'(+8PL.L"^Z&B1]S&X:)H1%$MBK6=]-XYG MH*S$/$[N*;*=+$C-
XMTX 3/(-=%<=S*!8S<B*X8-T9FW;<B2;IWT-J7Q93>8<\E87XU2VJ5JJ$$_S/
XM.*\\1Q5WKM072V\=.$.%.4I&/=U?S;KAY>EO.&A<&1?VW2#U,H8YD])U0)H2
XM;3,:%UTXB^BK:(*Z\%/"@'*CN9]S.+=D[.'JI!.D4'O;XZ?$HMMD91*BHXR%
XM3K"NF1-C4].907@"9IF FO@6?"N<WWCLL/$QO)"*CIAWT;SHC?R#&/V<-XLH
XMSWC?8>@$:U%8^93\C!!,MQ5A)4P8P5L'\3 _3MABB&;!JVW7 42BJL>P(I2S
XM$%D&D7!BM*=5Q:B9XM[094XT$N I2,Z$19 '7QCJT9V*O;KEL2IVQV(C08_A
XM%=UU7%9..?8I<!)X'O;"[%),E=/33J"5"CN%+TB_SJKKP=\TA^TW).<4J/4.
XM-] Q+H'%>@6<$M9B_)6RHFDGFT<-&^$:I!K1#+86K=JR,H/H6N"&@17MHFRI
XMXRRD1 5/UNKJ JK']%#8!(.NMIW%"T6L4"IUF.]\)="@0H@7"/>M0J%VB4^!
XMET+ DS+ (Q0<AE@X])(&>E99B$3"DS:4X9@F,E,$^5BB(^Q:"IF.6XH>0AU!
XMV0Q[TS]&L-62,08")"<%8=L.+\#(-#@'4$L#! H ! $1JJA:]$ZVO=
XM ), . 4U)#+T-/3E-404Y4+D,C...@9PZ8.F3(@>-P)0X?.&#@NT/AH
XMH(!BFS "4:2@N(<BB(\@X,@12,<,"A$.X7R9\F;,FC)T0)2HP\4-%SDB6("8
XMDT9/F3<F0:1<V?(EG10I=G@$*9*D21$&5;)T"5,F39LX=?+T"10%B*A$J1Y-
XM2K$/15!+ P0* !@!SB4L8R!(QIIP! "K P #0 %-20R].151"04-+
XM+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>F=3N6;5VR94'RG$N7;-JW+M'Z
XM;*A@.DGV[9SH\'3'PHD.7Y9M6C'2+7@)Z[!TTXX%.19M6+D@Z99M"^?YQZ[=
XM"I(FS)PV07;=\9W2WW1!OF5+=NY<%L8=3G;2[MNT9+QG6;ERZ\(AWRA5?)]S
XM.B7*%.GAOG?=.=O_MD[T=EO&^T'V!.FT*E,FZ1"&]]PT9T][P]PQ-BX=G/^^
XMPYPZ5N5[C_ &"1($T.!=C^D]-ZQ8MF6>TVG-J.\02G?;+^4;)4@3\62*I\N8
XM"!YP6='_.G7JCNJ(<*H[E.JXYIM^HU"_/C5JY-F4A,/6>LN^-8NB2T2Y!MD"
XM3-6E!J$T^Z^G_-=3BQY9CS0>7]9-4$A%,2AAO@1M/>[P_W*DKT41)\N&Q&68
XMJ(@VL+,1LFQ&8^"(@9Y]C*NX\7V2$$)P,5?]3-AWHSKM%D7TX".A1TRSGRU+
XMUV[9,5TH:XT7)@ZXZ3G5L2P.CPPBG3@':]8,.KAA</>0V@;33-LUV$QYZ4XX
XM(^:$LWO=ZRT.4$L#! H !@ & !JK0QC3ZR4Q(PL +LC + 4U)#+U!#
XM05)0+D-A"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085
XM! 87!0H(!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\
XM^_O[# LL"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W,6,5%?]8?URO
XM;_>Z_LZ][N>\7/OQD[9]V1O[Z?,:/?\-O]S;\9QK-(\[XK.5(E:>HW[>6^$O
XM-7_!G_[M7N;M6/_D&WZ<N_X;^[;=C>4,E_]S7=[2MC?/N[PZGFSR;X1;\.:[
XMKG.CH;+1KK7G.L%N@6/37]_O]1_[8G]5_UL]_MGN_ZA.K]HO/>L*L7N)_?ZO
XM[=MOSK7:O=E.8A85!Y/K:)QS_?XAT=A+X;:K6EGR*F&Y'(]_EJ510CEB7;;K
XMJ*(\++]^UZ[C_LGCT"...TD1A^/6^&?EPAQZW!^$\?Z?G9O[8\;ZM<M]EZ]C
XM7ARWQ<)U1-3.>,3U)URWZKZ$JL_YJ]O3N/]<TNGO\*5K>^0JA&]1\:U5^?'[
XM5O]TNR)1-YI;0C"2.4SE[PFWRQ'E^5RNREZ^UV"$^2[A2C?*_MQ[;BP_!-%Z
XM^O[<CZK6&S?N50I&)/>]5"*RM\:-"U%B<VV&6^ZX<6OG4UU%CC6O90U&<>/2
XM;HGW7\<_[L7U)T@NT$<R+^'X?M#[:MGE<<R)!L3JL]P1G<8NI^O<Y/XLAY6?
XM-8'Y<7N<3W!*8*HI_7'4B+WW'<9%+@)S3NDF]H9L-<TA!Z&_-#\G,Y-];3P'
XM7VSS%HR7]PA.<<)R43&/K]3[ X70^&X\C8I4:/S]0WIO.V!^GO]:_K+_];',
XMGP.Q-\J?\PHI27K;Y?YQ6T==%Y7? &Q"\=2?Y8ED%Y&A_C2R'X(_!'/S";[
XM#WKY#%>2 YASQ_.HOT>A_IY'$8*>B1<CCVB:!GE XTZ;KVB0;T^L!.FYWS6
XMQ>J)?\)!/MZ^XCR,SC87:W]#<\_W7RNBF7QU\R/V\N?U_@:F;7V-L%]UO\,*
XM?\/"_L<2?/*57?Y7Z1<4%5,Y>AW+OQP<Y;II')?R?RP-IW0._//<^9_*49T;
XMY?YI*@_#SU6[^NU"P;G QJZODY+/QUR)?ER?!_S*\DUWH[*)W?D_=GYLM@]W
XM8[XRD[##%K[&)3Z[7@ OAF/#A_".ZSGKG<;%FC[+?A!>"F >SC'-#30I,+\$
XMO7^?!'4(6AVXN&O\M30JQN,?5EC\^J13R:?Q./[<'\WCV.1'@VP.7ZOEY@J\
XM_6#TF]O])+@^5.<<JB,%_DUUPFR56/LJJVDWV//U-[DR@"?9@(?5K(\(>N@3
XMAQ_T6,ONG9+Y&+A,7AKT3%)@*N 1]D/")B *T'01>)'D%OX+8_W!R.&'!."A
XM@M$/.^R+[4CN(QE\>H6:9[N$!/%L=IC 2V]<OLN%/^1VA^6;'#KL2:CYA(<6
XM> NA!LWG7\#JOUXAO?=:(:F&D\2#$>.AR5M,CH,WH3AA'K2SJG ]MLI0!\\5
XM64#!K [>)57:5Z=+V&$KNM NKW4^:PL[ERC4]Z5R;WZ";TV9^39-AD%5,9=N
XM=\CF>UT*@5QP1&^4^ZES_EA[2=SCW7HMQ#E>$)%!K&!>?I;2TTBXE\*0DSS-
XMK4X=7R+EBM:YX6/DIN.W[*5I6)7X%J$T92SEIWA?N17H1(WW0G3-#9^;FVXF
XM>I $.U:\X;CUY+9_'[A=\[*+D!3\L'\ARQ5Z4A 2(6$Q;"\U]CKT2R&W\X9H
XMXMMN\9RL6V.09/PJ5X_E/M'<PZ'7Q(]_8,^H$>TO^787V#WV>' &I3"\OB[,
XMAU^>KHUN_9V7EV?,^:\WPN?J/W=;I-G^P7D+K2].10LD'XG$R2M [W74[_ X
XM=H@[H/UCPZVB^%&?VK&_D'EB*4+&LLRL]P-@39E8/K&9AFUXN=U-<(S'+=[2
XMLFF/15P"XII*B%.XA-*T@-\T5R$U#%M& SJ!8EG:V^>$S8&6W_6KKJP7CS],
XM?X1S;29^)"?H#]8O78T$>T'WL_ZM]ETN+>'@ \?E&XB4#AX7H@5_:WVCX=(&
XM%DJDRS0LVAT"(8"FG1!QN<JW-?]"FC,8QV%3LK "AVY<A!;JBY,1_ 5SC+<^
XMRR^M]US?IYMTOI<U9\&&ADNL4.,D;$7C@A^,97EP[B8DA0O1 Q/9QL6KU[I
XMTRJ:;.QNJ> 'SW_J$?>:;1*9&S>!%NV@-R6,F.RI!+4%WL7''F_SWMM"'Z)-
XM$X#-\1YW_*_.9.FX',7ZS+AZJL=B^"X"!2^DG4.N6%22(3Q>-$]QR\IN[X6^
XM6)F&$'MTV\ 1[CUPIF+ST:IJ:I2C/J +HX6;#EBD8R*&)9MYKNH#C.8Q^ &>
XM>D%^D-P38$V0, E0):<^5S-$9@"-S<<9"2JE+G%3]8V]+"9=9>VRVKH:\Q6>
XM@)0W\.O@TD'A\;'*M6I0*$ #>QT^.H<22$?(>_U<CE;T:;U57EFU?"7Y!L&&
XM+Z'.BC]=Q=OMC:MW@33+;!;O6??:@G?"XTDNOXEL[(<K]7F?US/<?[1PEQ8#
XMH:?"^!>N.,N'=UJZ]Q)J#T9Y><X$*$H5HSBT@0UR\.HX]JE#@C2\*3(V7GQ\
XM@*471?\*I#%%@)EI+$W /XN' /%A$L3PFI!RF*[*^%W]0G(3_VCH[_/V7\42
XMXTN(XYM(J55)$28%^R$/N8\HIJ5-/:]\1,(LG8=Y)A,80J:%#F7>EU]E5U1]
XM%?R'1!H0ED#Z=;R"YOY=$1%(ZH:32H.(&E=#!#$NA0C.RJG= IXAS=UB2$0
XM^2$1$D:AY!<2$9'4#\TF)BZ4! T8"=X%3$2"G> G<1(!5NY"V7"2*=^!U1$I
XMC@C-9A+M?,*EX4'/!H/IP<$D;A;^<E&T_4G@X) .SF\QI4;,:?L&/!;&?TJT
XM#D47H=@<:BIROH14=P3Q=S -3_/!5H'>[<0GFA-9? \9L92PU.\(>G2;AY.&
XM$=M]YNVALJX[\;K-Q^%F=3T1XA1Q7_^E O+&5RX!ZEHPS*P7>.H.I\H.<S=&
XM,,+D8X^*CQ70,FKB,X2 RK7$%6;@U$E\'E47I,E ^7I=%F=AZ9%QKS!3KI 9
XM04*8V1-FF#X)MT'7P?K<=Q_?1E)('GT9U"-K4P4+=W8DE/(J0E% 2(Q04[YO
XM=;= 2UT;2FM6L.V]D2.^H2<-.J'!"G!' 8Y]*G(E(PD!7ZT.0MB$4 AN$O%*
XMQU]KQ:Z[W36?74&$Z[.&.^0([P>J8202):(C_:NR1+M9-;I@D\B\4NC;P#[;
XMP%Y# +MZV[+#/XO'+_Z! TM&,1C!@%)+)*P' ^7C$U@>ZU(@+1,O V6=18JQ
XMC]L?K,\&ST'"<_G+RX0M(29:*A*\9^GPYPG<1N))K6\K56'17V)J]8V0D!WB
XM(8YN(-7;P<#"0(9<H3\BJA*I#,\+ \^HWQ("1V!!HQ( IVMVA>4%ZD(US%-'
XM>GE<Z$,$S3B0NNZY1'@(<CGE$K-;BC7"LUU,<8,)'U@@!L<8926""[EE-/J+
XM1 "#,0AK')+18O*!=HOZQ?C%/"1;A-8Y7 -3D>(=(UP14,]8R6,]Q7=FB&W
XM^)(EN!&IT2$7@E;(Y0O+9XU,;PCG1<$5?A&1"<MN7'= 66]#P?65]<6UBJ>$
XMSZXI@0D-"ODA 9%Z=D1.??Y$Y905T *PQ-F64)HY&*O#>('1W&VSTJZZ!=N[
XM2%06_$%F"@,AW$/@TSK]DZP^BY.<S-Q?UC849.HQ).*U0!4)P3HN^-6=S;[V
XM7*>W*TL#F26$5":U*)F))+2(MD-]=%S< 5AS'L#21CA90?H< 5U$5D%BDD1*
XM8J0 9_A6W6@Z"8KWH(@#_1Q!*& .4$L#! H !@ & #QQ0QA0^B"CG0@ '47
XM - 4U)#+U!#0D]/5% N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%!@<&
XM!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$"@8$
XM!10%"30'!A<)&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%!A(C
XM%.7VEO<Q8Q45?X/G_Y_:[;:2_O2G[OORD[9]V1O[^0L[*:.?GIE5('72JMSK
XM_>_PRWVLUWZLOWHOO_&<YUW_5^U'; K^4F5?EW^M?[7YR_Z?XP^2_E.O;_>Z
XM_GVCO,K\W/"UFL"=9WP2QKW9OB(GN7G9/]I/N9O_3_+_)'KT'(X?8GE_>!\+
XMVRX]2Z,"L.?2C_!LUSZO?ZE<1W7E.WN]R4^XGY/#]TPX_IL'^-OSTCBO6NU6
XM_$#;\)OOB)/<K/0?X3[J^_9KUWW6(4\GD-<?'?+DOT?U/A,0W_)3OSWVMOR]
XMAK#O?U[-[=G" 9YS 2_9@ >_;U?U.I[SE[:]NCWE_ZR W:=4.J_&L[@TB5E4
XM7%0<3*ZC<<[F/R0:>RF<W:\L>96P7(ZO2_W:38Z(?Y:E44(Y@JYB\A05QXSU
XMJ^?>9-B@W:=YWBOX<^Y'-7[?ZM"%IS$6Z0>CHF*?D^4JW_M,]&;GRARY'VYO
XM,+)^,;/;\6G/:GE$N&MA@= 33.IW[3KN'T9R1)Y:IY(;/D9V>DYF=HSL?MRX
XM6GL@7DE0>%?Z;&/?MKNQ*+5B1_^(]1W_:3CWH\K=2%B5!PTW+-]Y1+!4X)0[
XM?NR?H+.6[L8EE=?SS2O-;7_JC0?FHT>U.VR[EWG3"^=^B'Z=&PV9T.? 7_QV
XM">ZXX+Z8XWB30@[_$'3YBG^NER*V]T8"<[BY.OQ@Q')+-CGJDF/7X5!7I*?\
XM5*^&RZ'.^]#<=[D$\5VNZ[+-IKWD@_M(/,%(=#&H 7]U9P__^K,\;@O:81'%
XM3M!N_GPOHQT&OJ[+L\RKZ>#AKSK)=19PKQYD_HW*L_U8I?Q8BU;&IK3P1RPE
XM+/4[0N-\</NTM)\TC-CN2[@7\+<6_NGD"Z?5;HX=^?[E&:YF=1OY@8F?^_Y;
XMHR0MM[.\.Z1+<G_-QYNAR[?*37RV;+P<+N)5BBCU!B/7^^':5\CF6SH_%;[Y
XMM+;M9;',C?"W@]*)\;:\*)YB!<:=A-*^NI=NQ!UR^TH^S4[J=EH1+>V,Y").
XM<V0[__<2^_U?4/ 94P5>NWHMC!/"1PAOB0=$J/>JO/<SPNU=O$6X-Z$W3H%
XMJ62DE,TD;]"#FAAX"%@?!_(0=!>,B(O]0LUNR']&P0_[9P0CR$[S7N+O^_@9
XM7"&3+-7?V(_Z*NTKXG.7J3],3Q0Y_^?F__4*Z;W7"D$BLD#^8G7.:\)V\;]6
XMM_.&:.+;;AD=LK*$*]U,7SGQ8.28/-*P5XS=?VE?+S:[SI5DW_7WYG+SWCRS
XM]=\,IVZDA%Z,E8VPNV__6*R_+OOV5&_NI32OE5I,;J,LUNM=AJHWY2\Z<^A1
XMO,0J% L<JZ!0HJG<*FNV0&[S[/LL1'5H@7!B>@'J;45Y.P4,C>#QMOPQ[,XZ
XMQS2"S7R*<TRN7ADFDQB%'\,7P\H>@;%FRF7" B'YG$7P7G1_E4>UE.D"XU^@
XM>!I?N2CCL@]V;%RHT(@U&/OX[5INND"E$F=*$! '+,19Z="*L< 1*PA&# Y3
XM>CTDC+_-JUBL?3$,X#"/A<T5-*RP?F8!6JAF$XO&0]FH)!">ZAX7\2QV*I$"
XM=HS-QPL*L(X4>*MXTK]Z1;@CSB6S)@)O0K-RD>I6.6Y2@8XG<!1.;T?%8XSA
XMW&FT1\SJ=C_U<'(7P$'ZMK)L WN>7%Y[O?-US1<DK836=<+0A;PQ@8N^J=X7
XMN*SW"S42$2T!9S@<]AP2< =+8^.20RP@YFN9P#N?7QMU-;M+CX,6QC5N7 4'
XM,YH0., *',[3+]<QWSR'(K899XAX/D/7^Y9>-631C9UQ7,>-B^M%R,-"F:;F
XMP;Q\0PX%JCP QK5]QG>^=%M8= S1\0<=#7?)/*Z:>,],%Q:;JMA%.R6Q4\#L
XMU%@D!DUBQD*YR&E+\'?G%8UC)AZN7X1PISZ^5BOW$^$ZPSE+[8W:X]^Z3V>M
XM>+>98;&;W*S($)&R0@U&DF_2[B$WA#RZ3\U$&?W0[@V>W-/"6*50IN5DJK@-
XM^2\L_9" /G2,[% +N*=QU_B+DS/:5PA@5$M]]\^-!K3VP/23'@G)3T-HY?0A
XM!0XKA1VV6((3.-9$][<5"L5 32B6]MST[28_:P)'*6^_7D?$LLCKE>RC(W_(
XM2Y%R0@6,!GL0M)+G-6F]2V7;YVI%\Z)]S=%^6EI6]UIMI?<9Z)<LK,8J+(4]
XM$;>:8WIAG!B>9AL^56;Q^"<<CR\Z+Z:@!UHN&4>NMQ7WY$=\-OR8B&[70DXI
XM^3P7/(&M(S3P6@ \*CR@LW16#B/TDH&&D#N,IX#/Q%X&;R]M,HGQC\?U;)5
XM0.U-VV'GH"6@/4=C "S#O?Q<%O[^;]MU6I@ZZ T+>,=:3@L_O.7<8/2A+'N6
XM<MR^==8O(&_J4=&<G9R2R2\1A5>2VZ8T;O(X](B]<?+;?CMAO!T'_JS,F4Y6
XMIXMA@0R;_SL642Q@,M27<Z]J-\X4X6$C15#I@$]CWQ,NL<*X'JH&6*N&T+WS
XMOU!WU.V&.7C;&"TV9Y$& FP$PQ.!C^[4+FTJ$8CBGO5=7^42""MP!XR5Z^UD
XMY0AM(-(1X*PCY(3']4C*=!0$UN ARJ>^ H%WK<6Z8G1%*+=;G4$OZN?RJ,\Y
XMDL_QJ:S@4&V8ZG2C)AQO@"5KX/W,HV$TH(0.FCW\S.?">2!J%(#Z'&S0DZFB
XM&POA:FV8+$%;'=?4377(H(=TRH=E=76J0_+P004]CM.@!TEGJFLT739#"-HX
XM]U6/P\P\8D'S+P22<9S<F1ON6)[;G(CAJ59][FV+1L#@\A-"(IPLTOX)G^9K
XM?-*=.$R2];].:"8%&3@:*A0+]5!+ P0* !@"'=D,:6)<_U/ $ #_#@
XM"P %-20R]00T)31"Y##0(!$B,4%38W:(F:VSP%!A(31,7VEO='IG4[EFU=
XMLF5!\AS[%FY>N6G/HJ7K$JW/A@JNDW/IDDW[9CK\W;!TZ8Z%@QXJV[1BJ!\D
XMB.#]4B7(M'3?A@6I\H5XA'#M]LQ]^#+UE?0*7O5K>,EOD%"'"IU*%&1+D'#E
XMOK6;1OSGOFU#O.GFA9MV;%BV(+1G5:=)L8(T6R=8T]&ZW4RO=)WGOA?IUF/7
XM%*]P):W7EF4)TFA9L2!ERCC>,7/FC/$]7XC#CT6[]HNU:M]EZ9R;N*9;5FX;
XMJ(M<WT6CO(2W7!!XM]PRZQ9>OH'>;M_2N1_&Y!?_)$H02?[7*>BURKD@4W3O
XM/>4GY*<U"X)[SVWI,XWWVGO;NF=/D%2'0OT*5>I3JD_,-XCR3R">7;F@5$E^
XMCV6*>0YE^G1J4:(I$QSI<]<$JVO5==M!ZV36+NY5)9U@7)3==.O*=3.L94#K
XM'?5T'WZ@5R7"C[C/8]RGHG,8T;V/FH.L#H-7J[#RZ7YULX2CH/.@YYPH-9LZ
XM]=D[5:ZF&\];@IXH;]/;A^!;)HWRA?XQ88"C]C _EIM7_2)=BJC.Y&L4\SVF
XM#:S;!-"-UZQ9%NT=K9SV#C/%L3 &F#B*H0" <7-?(Z;V98U',H#R[R+K;.M
XM2+>WRJQ9L^N./?.W=>0WFOM]<NN).%/2/Q<%'O8GZKYF<85$FW9N6+)DY:9@
XMC_GO.OX33BGV&DX;FRX+8)05<>04=L4,>M<3C2?F0$%M_ +R%&W#;*VX["FL
XM*SEC[M1O\*S:L=;HN67,0T$<:%IRN7)@$UAQ;+9EW=AE[/^U[=PSKGT>E&\8
XMZ&,<#'D,.[888:BE%3/W+YWA<[=V(<P&D4Z*9")626^W(EF*G)K7[13D32>Y
XMEEIV#/(7>7\QJM%S#K7)-+\1-_=5NC&0<QG(/R1)/?=*_&0:)GT'^=8BIDFJ
XM;:J;]\C_OCOR0B#:]@)U[MTT<MQ?TQ0D,L7<C'<#7B5:S?IU )D606D'\4R+
XMZ .5GI:1'I=DC*R07>AC#+'-AJW+EHXWK!-;JC>T&^&%"F^WC",*UZ3[Q$FX
XMPJ83*G7$0@3=!BR8U&F[;V;Y*K+UG-X9D&KZN#"[,&WH.ML*F\EN].^R;>'T
XM-FM_-L]%=.6MT%!53A/5 ]*'F$^KM^Q;LRB,0=,<*GVZG/NE$&L/JTV".X)F
XMAG>*><"C("=#V"=!\N4+,H1YPKF]$1R,;VD]Q5N*6\.8]@15XBUJ(=E''3OY
XM1_OVCEA=A_ G^^;@%)NZ[9LX#>6']T"R'1LU_<.:UO$7*$-B1H=^][$>#+C'
XMC34#=ARIPT_4%-1^G4+.2'AA@L R#2S=SUSH7NT>[=HVC^Y!U+URC_[+/<!S
XM.)3@[J^"5JIO%)HGWK,JEA__16D*/^(<_-1#)MBP8B#L$=XN#@+0NU.W#3.[
XM5=B*NEH>M:.:^AET97)@JC,#1T27/ (VY0C_!9LRF/;B[9I5GMTLG> A,Q]1
XM\\N>RH_Q/8:_H3BX[>P=LDD3MQG$B-O/.:[W[;0J4R8> YJ1(<#P:DJ0G.%[
XM]!WE[4K0OAA5 DU*D)Z$:QY+(K\D8TH"./AQ20(,^@220ACN2...0Q*<D:BZ
XM( @)$C*RQ]/$L2&VP;BCN?!;[F'X0QK2YBH8V2C#IK"/C&8CS#X@Z!85+]DH
XM)DZ#8_ZAA7"9HC\,ON@/L$R0!E!+ P0* !@ 8O$H8X49B6(H! @!0
XM"P %-20R]00T)51BY##0(!$B,4%38W:(F:VSP%!A(31,7VEO='IG4[EFU=
XMLF5!\AS[%FY>N6G/HJ7K$JW/A@JNDW?#TJ4[%@YU"U[5FR[(N6_'KOTJ5^S<
XMM'K+H@2A_5^G0'^9ZZUR+L@4X7N/\ 8)(GC/O9M&>Z/YWE^(%_N> ]Z8%_BG
XM! '^"<>&G9.M88+4"5*.]:XKURV*Y4^YXSJ/<1WG+9N&Q2NTKMDI[D8>+X,\
XM\(3./L:[3]S(=>XWF;A1D'-;^I1+1LX=EFU9-VZ#%1YF;?"XMUDZ74)?MN ;
XM*/*!T13Q%)Y.Z]$ < !N M5ILV'KLJ5#%PR7(--!/ !'U& 4&>DI0$%#0!L
XM:?# "(%K0 A>6CN<[Q6\PYQY:.N\<,MH?98@Q>:E@_QDX20OHJ*:M4U%#T/M
XM.L5[1[&([F9! &L4TQUD#Z5#4DM1Z_6,J.;A.)W"?+Y4\3KN]BT([:&M6Y1.
XM^&NY;^6HZQ=S3VV&3*?PAD!=^UA:@UC'FJ\JV?:MW;9EVZ+HAR2N@@IGQ/D@
XM!R50#U!+ P0* 8 !@#<9$\::Q@ITM,) #E&0 #@ %-20R]00T-/3D9)
XM1RY#80I[!P8;!KL,2P,)!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&%00&
XM%P4*" 4&%08*)08(!Q@*!PH("P<+!"4$)00*!@0%% 4)- <&%PD:*_S\_/O[
XM^PP++ LL"SP++"NL# $B(Q05-C=HB9K;/ 4&$B,4Y?:6]\'D.AKG7+]_2#3V
XM4KCMJE:6O$I81<4NI_'/LC1** _+\?J^FORX,6/]VK[]B,]6C?!CQ10Z7FL<
XMRVETW4OW\<M[_5Z1CEB7[3JJY$>L2_V\FBC_?[O?NR-<9S3FIWHO]Q&AL #Q
XM$?OUNW8=]T\.+>(@*6[<. Y/')?3WMM*'K?#_''C2%QM3D;=;IB#%^U#W&K'
XMQ\EO^^V$\7;<OL49Z"3JN/5&'H?&^B6N-B?#;O)XT&N[?HEK?]!N^9Q$Z;9;
XMJ&_<.!(7G)-V=Q3F\.W3_B_PQ $Y(YV\K2C8B\/C<I+<;K-=\:X@G^<DM=MM
XML;T.C\OAK:[,I=7%'++5)3UN.AL=2^J ?+WO\+B<#'KC46L0QFMW!KD8'1OU
XM$X=$9Z,7Y%$=GMAO#:)T%6K5"<@Y#D%6ZO1:(UY+X0__"_Y5^X6AE,T;Y5+A
XM\93O_/ %!51OS%A%Q3_6C\CUEXC/LM]+Y4__=C_UOVZ-_%^?RZ6_[-_EWYO1
XM_\VY5KLWM#=NW/^?HX[UEWD[?FF_CN7>L!Z5O]?^<H=?OF:TU^L3;U2>[<?"
XM/E[X36[LIQENN7\L@M5FAZ#9U]WQ^U;_C7T^EOP?X3F#D<HM]30J^?^B>8(1
XMY>KR"OV?QG4[_ OBDLMVC:]<Y_T+&Q63O^QSJ71OA?1OV&$7%'SPJ\"KU45Z
XMTW[L:+'U^L9^+-<QW\&(Z!#Y1&_3K$]P& M=B-XIT<^-7?##^M$EO\>3 7E"
XM-A<RO"$1$C^KX(>-]"$/LYPP#1-XM?I(X'/88?]0)3]24ZIA>D]8/U-JE.@X
XMPNS5,($WZ/W[7&_1(Z N$ZAKT&.XI1;0KDO3L,/F^$I7J72A;/87F/R@I[RN
XMR[-<#<?U*FDD R2!^1&?>GV[UU4T+Y<B@GS/*]:-\GHU"RPB+\YV3N2:_T/N
XM=_G<Y;@J(>6[K!*J<PKU(ZI?\O]ZA?3>:X4.PPJX$BGPEL-%O$I #V07_K'X
XM%M,"S\;%FOF7"/M5_U9OQ/7>(GC$\?[R8P%W;OZO\9:?\/G_W(\J1DBL9]N>
XM<" G>/5\BS4QZ*#<(0\Y2!7S^D-"\OWP?N,:/I%^H<VE0"\I<XS-HONL>R,A
XM8OT^GW \/ULFRW)Z'4]CN2+<9!D9,_+>SWPN*X-7'O-;=,O[,7O*,O^J[&5R
XM<^,T8(7L6M_+SW5$^NFY/U2:KSN.V-CWA.N.])/'H4>4,=T6>F2Z$<]G782N
XM)!_<6\G]1[2\EZM\[S..5^1.8:QYW<CVM11P&:?]7F*_'XP$(EG-:OYE+81-
XM.SE!3C5NN,I=<BW%&EM$A7/Y@HGLX#R7-GLG&BD\MA+I^2"1RKBL?M8,227T
XMCMC<]Z6T'_)!X\KXE4\D3WP_(]S^)=07]%2OA_WJKVL!</R(6'[6!+V#9CON
XMJZMAEKM^&HV[M/SJL]Q7*5+^.C?EXY'R.=]00_WRE;@0RCQ+1*4W_@FG>\G_
XMN7WB0PAKE'[;!&3(P<N*79(['_C'E<FBG;;S2;-&)_+^L!/YIP#]D+)I\.]]
XM2.!T/D'$X1^8,US#A0^IKRJAC4&M6-'Z/8_>$D\/$K!\BT)@%G@Y17"_XC\8
XMWXB5?5T(HP4?O;G=0E&/RMX0U HM0/>1@LX728)D5T)5-;15ZJ!!Y KWY17
XM*^N!PU?RT:-HKD(1B&BRPET4/ 4_T+:R"_@\!-R!AI6Y@,6!T1TX3)D4^#A(
XMN0.G*X7-4Z:]6AT'N<8)X2.$MS@('DAN2?15V(]56.*PQ-]SB/M[E\(.FT!!
XM%%[01BUY+?RE_-^-V!EV>_W0?@A0_-8;>DO::"C3_G0BIT)';)S[*EE?/ 8F
XM\.)REPT?M:N*^O$,I-Y4:/&>0VFS\!Z:H"/023R>)KN\B+DY-['C>!^NU98^
XMDO TMF*'4 ?OV8QGL[$E5E;C\KSL%L[A$Y0B# KN:AF8/=5+V\>)/&ZU1DEY
XMHY2H<2RM "FZ;.4]0N&RY]>VO5S ,L.PZ0B.->6S_MA ;VS\-?:RQ\YG$!"\
XM'POG#4;DPPT_E,Q_+M7)[.MR#]Q#W%84:J'@5]-.^XH/H7"**JK1@F\[*UZ7
XM?<HD*?3"IK<DEN;H[+7SJ:X%?,.[3-4:\O,<X>+E^=\?W3QIW(I2 #C"]P8C
XM("6&=S "FN#H^E#*QT*)2[Y6;Z3TW%#)]X$QN[TU+%TE8VHERL@PP_VB LTI
XM*"N6?6/>MAOPUZ_M;BS[%HYE(6RS3VTO#"OL=V*H;&F!EN(6W-_G#8Q[A&O;
XMCS+I&^'9+J\8T:O-:KGP-I6.7&.SU"*K/,FW>K4BY7L*:X?@2A4:PB'LZ(_0
XMRU4T7JFSX^7(1U)QG(:&/@,U''X(H< "C8S#6(T#T!I5E/VPVR:ZSXO87GW$
XM[4:?Z%[5Y&"E=Y&,V 5H%7N#$5#D6"6JAM--@,929YM.,(H-)BS;"]022]S%
XM*1O=84A[<EOBG]L)EPSCROV#D7V2H <?</:PU#/:Y[-^Q.:.7S",74/$+B)^
XMN!V<+E!L$2X86)S+-&=0-S9WHQ(I)U1?433C/V3SSO692:.<U/*_R)68U)JW
XM^N_VAZK2?CP:2L485H<UWC3 U*_C"")'/W%2046<'2O.P8CH:O,^B\TE3@B'
XM,*F=N$'/SZ9*%\%30T(BY8:J> I]+=3W[,L-3&<2JA9=47:(_Y";/#FA_FB?
XM.S4N[+A0AZ72?VM4C*6=W/AE7-GAN5+&N%UC%88=-LM;P,;5N$$/CJ*?.YE]
XMD#S'Y0>-EE3H<-]F(E,$Z CN@\-GD\)?8]$HTRVC0:3):%23WX7#^=P;%K0A
XM^=,Z2(4,ZS&EJ>Q!,-$(LF[;P9EU^H]=)J[!O.ZM<UPT&L[YVK?*!0TFSJ2O
XM&OP4S(6F2A6_!B-@$\_^*7?S1\_6=O%"VQ7&4)(T[&"N$U:7V"VH%K$<&!L3
XM ]%%P!/DC+BFK(JF$?G!)+:"&P/I4T\B](\(AF^AJ]^0HQ Z(6/9:8Z[QE]+
XMH\) :X6Z%,[+HQY6C\>)'8WV)!C LC1N7"628!T7^-'XCECXOEZ7\%SPJSNV
XM.B+G:Y$\4N[(-,LO=^!XR*9YX*<X Q5,< 8+1L0'VO6:XWK0(7S$1A]\0Y\:
XMN&Q6+C!\A/Q0TBBYA #ZT 63+1RXB,?@+"R5^!Z;<(F&F$+UE<N_$/!A+L>-
XM"[;D*O3 GHI216(:UP+'5I>)U2D:2[$./NCQ# DB0,+RM8;L,Z$ON>IX&E!+
XM P0* 8 !@!=8VP8L)$HX#,( S& # %-20R]00T1"54<N0V$*>P<&
XM&P:[#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&
XM"B4&" <8"@<*" L'"P0E!"4$"@8$!10%"30'!A<)&BO\_/S[^_L,"RP++ L\
XM"RPKK P!(B,4%38W:(F:VSP%!A(C%.7VEO?!Y#H:YUR_?TBL2_W:\RIA%16;
XMG,8_R](HH1Q1:QS+:7+$&FZ-N2[/PG)$8PE7NJD.7^KGU41YBHKO\,N]'3_"
XM?M5_8:R(]>9<#5^^EH+"@F"$<XCM;D3 N8-)_:Y=Q_V';VIBU-XX^?UQ(H];
XMK5%2WC U:AS;MU%YME^_U?[QE.](?Y*3_D.5^]>QL-R5^ZG?VYJO<=?G<HGB
XM.M<E+OH[&%F^MNO5^*3/N3>>LSG71$]UKK OSE-YCOIY_[2?B_?4FQ'CMVNY
XM"_WN6.6U^@N*BD.PJ/C__VFN<"?Y7^CG_W79SOLHM/@%X&O04Q@R%LVNG4\U
XM4J@_#?*.&>O_C/_S*7X,A3?3XLY2>+(5GAR%9Z+PY/Y8,>'N_T,P3HB'>$:<
XM?(4?0^$G=J(J_/$H3(6?U(ZB\#OMEL)OA]93^"F#7IP?]-1'-<;EO7YKK!]V
XM&J<_:+?>'MS=?GN$U\X[@OAONS5.=;A'_6[[A;TCMR80EYPX^47%<>/@O)'E
XM7HAWT(-9^V.[C[.T!LDOSOE-;O<I+D.AV6@L4#/V_DWR/]B.V-X;"??R8ZT.
XM/Y^OCAA%)/-C726@V^.RE'A>W5H\2U>4Y+WR0RB__BP/59W_2]N^[(W]#$8^
XM=S/<<IO__!]+Z$6YXN:NYUDWS?*N\=?2J/Q"PS-D?Y6F87$\OP"U&[?QK/=/
XM'"9%3.IT6]T?[:K]PE"*12GXV[W,VR'ZX\:-.Y?\?J'U::R"PJ548'-S38'?
XM8[G/28S"&?J+_.I2(3H!?,':!4"_X(?]URND]UXK)!SN=6UN]Y,0C(@F"OY$
XM@_;LB8:\@%_E;M1[&7K_;JVVW@O3^D,B)'Y.03 2C0U9_+[5UT_08W97LQB[
XM'T)XB]P;I:X4FHKS%E["P_DF\K/>OO0']M(?_=,?0@;_4AW"VON9SR6N5O"/
XMYCC*\08]C53JE=$G!1!!3#QDQ(;J7PIE7)I/X>^V +Y6QT,"YH6O*+[[O*R%
XM<=Y.I]N)-A]/$^BK]'N)<E,^OW:==RA#^(AC^8B]=_AK*<SF>(*>U##7?DVX
XM2K_T^,>X_V/_9AWX_Y?*L_SX9_W/>?[XF^!OM^'>$ZX#^>^;F\>V124=_2$/
XM^0^E;ZMU$:O7P*'Z;H*1X(E^J%6SU9%Q>MW?[H["?%OF?1RUB]&1)/Y+Q&/9
XMGT(9F_-IRX6 (>L^;PV,NH#OX.-$B\,QACW"]$%*62C?K9&T;TM!OO3))!?V
XM8(V=Y@D\T>@&$/5[7:Y#T'T_/N# , VZOBY,4Z=!QXQE> I4#%H2]/Y]\OE3
XM%(35(.BJT[ JU_K4ZYMP SCBN82V:1L]H#TIAY.]:0\^Z %%1!S"H#Y1@".N
XMX9O*%BE;C'P*9,-53U3^3QI3QL9!<E5L(?:8[XSG$*93QU.-E^A[! $Z[$OH
XM@C\5,'K_4*%LT3RLL-]^0S3:SPW/>?"G8U?R>H?LF,OYB,V3& 6H!]N'WJ8'
XM$L#=])">)0*'@#XM^+UN9!@/0780_NF2MHPO5_DV=2[,Y?1Q\D3X'_@0/C1*
XM4OKCJ&V3@ELYE8@[2&'X(?'3?S#Z88=]H=K*] )G[7R,5"YS'G*6GQL^/?>'
XM%9;<+P [M2Z8@93+M]BB8"*3N-"Q/I>@IZX5KB M\@]7P/NXYG "DBD022!!
XM<M@#5B4->R!&'O2&W<@< <PE>P9NC;^.^AYO>YR\P#$7%F;$D8 )ASKTY1II
XMPK,=$1O[?"S0QX4<I/2A_@\CQ"*VQ]0'5(00BK@^G_E(;P=S/IBA\P&NSGR
XM[R@X03Y@-U)UL09DIV6CP9@.+>Z1;:'WS7R '0Y24J@/D%-PS^(>L3^@$GM1
XMQDE)H4$VH.:C\I1*X: /M+H477T"&9,8N/Z@]S(,C,1@JJ^GCB08^*!'<F@6
XM@W5TD.Y"(LA@*<?R3N =8BX0C1]VVI_$8!62M;3Q>-<*F<9Q@G%N5GCD-5_>
XM*8TN@A:!NMJ<:C\BO.8"?X@?$L*_P$)8BQ\V_TD!OYT0^M(-X3#Q:B*Q<\('
XMXP;$+IR/]:H>=[W \HD40F%?H:K\$$I+RR@(\=C3V-%B_]C\KIT&,NAY#;?8
XM4C/*1.\8LU;G#MFU?)=M.,49R?6L,PP:\1$Z!MV0$&@.^PH)_D'&C2NHG*8Y
XMRI)0-D9"><&T*3ES>W^T)W9>;*Y#L5 XA QH;52(CD!.A%-#RT0X>4)(GKA)
XMP %$U^>2+06SU!O*M#^=@'=%+XUS7\W"RA2D-VD*8@O]23:BJ<7-0ZO$32"6
XMA@8A3M,XK>TY5L:_W/5H<?(1'[W/]J#[(3\<F%CR Z#.W;BO"-Z'_N G-A3"
XM2]!]J=S0M3U!<(X#<H9Y,6A*QK3%'>$Y9Q *YLG.LC7*I4*G)PX//GDI@_X;
XMI\ ]8$K_:)3"%3(PB.:3KTP3F'/!-,>8CXGB&>HPUCI4=8)R<@G*P"9WARB#
XM4UTNJ]=C$F>8F)P4!RZK[#+RGXC1Q>O04=[Q\.VTXXA==!B2-F$<H3OX<;_/
XM=FCWPW 'M" ON@.23SCYV5.<=B H<L<Z*Y F'<"3/=2':PX!$:G"=HF8[\+Z
XM*$8F0B'G=8M(&"D\IG-5+D8H4JJN>F)^*(J<(G[VV:(7.[QP7&4^2E"8JQR2
XM@<F%\RQS7-6OS"WQDE $N4!C-?A<!90#4$L#! H !@ & %E1C1A&".'R[P@
XM *(: , 4U)#+U!#24--4"Y#80I[!P8;!KL,2P,)!PL)"PD'%@<(!@4&
XM!P8%-@<6%PL*!@@*"P4&%00&%P4*" 4&%08*)08(!Q@*!PH("P<+!"4$)00*
XM!@0%% 4)- <&%PD:*_S\_/O[^PP++ LL"SP++"NL# $B(Q05-C=HB9K;/ 4&
XM$B,4Y?:6]\'D.AKG7+]_2#3V4KCMJE:6O$I81<4NI_'/LC1**$]1<<Q81<4_
XMUA^,DI/^]'=21C\C>@[)&U/G79=GN1J_47FV'VL^MOMI5"*%^M-^"!85QXW3
XMNY?X?4OXB3#WTSSO./DP;Y1]750.G;3MR][83YE#[9O7H5*VIUJ^#X)U/_YQ
XMW_6[_I^C_H<I?[T7I+N]SUOC_IU]7NZ?\ESG78_S@UXPHAOB#M_@^W*CK5;_
XMF]RD_SK^LCW'>BWNI[]SC]?R7Z[R#75VO66/V.[ZM=V-Q?:T(W+]M7W[1*VP
XMM\PQHR[+H5K=MO$"=]!"%\"'9!HSUF_L!\P^EI6NM*AX"5=BV[6_+MML]Z]&
XMN11Q/N:5?$/M__]OAD/KXSJ]P0CD-&YCKWM<"'8];J-R-Q+6N6QR/?>CZO)8
XMWBK7ZX@8Y7[J]Q;W*F$>7TO/=J^1?OH/E>5KS3"#+.W7L=R;S'"8 ;S1XW@E
XM.>XT1_K9! O6H%16DT%>)8X!L%/S57KJ=9$)_8%P-RH[_@$8_J[KA:_:Q=&L
XM\JQWR.;[:-P<!2)\+&=>%F@ 0A@0K1K;P=ROXSF#45S2.,;E:XS:QH(=8PG?
XM5X3;Z[&X<ATDM)_RM7@]&!>P(U0:]'745 I]F0]]M[1>('UH Y_B'$,(BA$(
XMS[&K%%<_K7*,/!L7X84Y7*<YKL19]#"8/B["R[<:3!,6QX9T>0E;+ )_N^\3
XMQ.Y*\AO.#UI UI_E(6J&L-6ORS"M(]CGVAR'+_FEZZA&K#2 K6^CQ[]:83(K
XM7L4ZQ()U)(45K(,YYG+3<>M?<,X1&Y6$B$)O(=@I^YO/<1JKM&R_H*@8I:7V
XM"[6&3(.:"PPRCD.$K]4$[CY)E?))$QFN\F[W,F]'H>JP MG6H,=P$UT\3XB>
XMH"=I&:6\8>:%0$5C2;SY#(:6URKAJ(7^6A@GA(\0WEBU1OMQM"\PS[?Z_F>J
XMTSC>9Q+5!JJR)2[^1$S9M_*S>#:IF\2I[/U/[Z42D=SIO:XXC_55:EYNU@S)
XM[5K'WY\P_)^M]+=GJ2#62^4Y_CJ72N=%98SVZ_&&YE_T8NJ)W7]J9&9KU\93
XMZW;I_K7^^.L\N>,*;_/6U4K>9M%-7!S*B.0_HNC?SPAW(>(D_X=<XOT%!7!%
XM>HE]CFK<N'$A8N>#2.E?=OC/H,TR.-JE4*Y)K(*()MV:7*?T-!)NOQ[ZR8?1
XM+Y!OI9 4N=.Y2V<X$&FR^S^L'^2UNYF>'U?[_4;_V!6UT?KEKUN#1@WA8M;M
XMO:W(W4Z8DO;*?J$^94PH0QG*4/(6&/FGD,O#8I6X C'^&B>&,TR<;3[OH[I4
XM- -.['$L%Y4%(](B6;]/^R$O3<.R<#&3B]1QA)J^O]:*^KZ5;FA;?HE2',PN
XM1XG..PV+R7:>TMG)L\]!!EV+BWAPON^0%,/5K)_2.I_/@IUER9]_7"3"/3=7
XMV6)4^D=0<I.E?Q'YE?K&^E%^)LH)]#5-]+W/20R0^@KIO=<*19L4_+!5AI/Z
XMPO<N^VH\'+"K;FI#4V#8$SE;P@Z[ -J)4G9>-4,%M\O7&UZC$13VR&4Y17Y.
XMILGQDC2_*I_?:\2D3K?5Q3E!*$B6OT+RG0:<93EQ\7.@330]0GE$T"5(%MU<
XM-5=#J175\+/>1[V0H8EZ4Q!?X!WE<*^?]V9Y/):WBY'8\%C'':]G$,J 3 <
XMHX7!OZ ]FDJ%3QR]O<8^:9P?]5ZB<&52M=57M%729JR@A1B36 6%A;[\Q"I0
XM^F$;OE07SHO\H#B]*3[IQ<FI0X#CO04_E/:FL!CJ:%F1%05)ZP[VHK_YU G/
XMS!;+.FI@4"!+(7J8E<3'<)JB?0VOQ+-HO)1WE4R+KMR_4?E,,]]97ZW0W'B4
XMK7-_-#*_5AUB05@=DXVM8Y'MB!OP_!\'Z:QWG.27%M.M:ZG=P[W@=6G-XV\%
XM^_CG6CQ#]=B].#S'A=00&)5"B( [=>)**$AUYAI2M/O"/]&JQ"J$5&E!8<CQ
XM9YPUSUFDEE?.JN?QL+@UW-NLJ!6AXV$K5R?IN;G-W#['J+7"]J?T_W.G$0:F
XM@,MM%L54J:_OO[QO++KCQFW:TT^PK$"5LZ'*^CX^^]#H9Q"^/E6\"^QJEPF)
XM'P.[')?%IX:%"U)%.ATJ7AKKYA#K[.?/]9*7\2>B_-?=SV;2J_1GB N[G/9;
XM(V%7"QBB!0[)V9<B-AY=_L0UW\__$XO!\FWB-FWG@T\<.I\ZJ$=4VJ3'[:Y!
XMS[(ALSYF&S;5F9<*J\T"Q]G?^MV<JQ&]^[!$5H@ 24[1$'5\;"5V/)RI 4G4
XMT#GY[DI<FK(.GLDZ%2 +1D)G%4CS!&@H@%&J6MR+U1VSY^#MDUJ=PW$V!.Y
XM9^).*%T"*556(S8%4!I$%HY$)<&E?PL'FB9?'5L0'/!)@UY4J N%\^[#?.5W
XM$40]IJ .8AOF7\"<02'!Y*IAL-KM#ZU*0EGH8E3=MBV?.1RH@@(BERDGP>0^
XMUUNK*8M4+J%9I*)?$<QXO&C3V*LH'S2_&XP%3X LU!- D3R2ET((<TG!;EJ"
XM":OV)3R6T%113,+B*!)HI39G-!V2I4OF%%)5&8T+M)N4]PCE6T9GSRN1KL&(
XM_P3#5@RCZHK2'$YOJ+:ADJ4NG#IP&%$[PG,2]J)<K[9F_\TIMCR?RS6M[#X,
XMC8LHJ0E/W4[)NRP<7YSHVJ$LPS.=K_Y\HK_S_65$OD<2Y%&K" 71S!7%6"^W
XM/)2.>03X9.(13([&H"W0.5_: A$<I0P^87!1!$X+PLK!P0[W]R$F.=ZS#_JG
XM?#LRB[!MC<OF@R-XT(.DGZ1V>!PD&_PD6[6I,,&Z![9%=7@<,XW)!.4L9=/
XM3[*X#]<ZCGT0H1[JD\H^G]JL%R,5]"13T%$57/$<I/1A<09()Y1PDPXP,92/
XM:0Z4\<5QU/*4(=63G%!+ P0* !@!G06P7IQ+J1I<" #J!0 # %-2
XM0R]00TE.5%(N0PT" 1(C%!4V-VB)FML\!082$T3%]I;W1Z9U.Y9M7;)E0?*<
XM2Y=LVK<NT?ILJ& Z2?;MG.CP=\/2I3L6#G4+WB]5#&^0*D'"'>.]Z<H%V1)D
XM6+)D02A_6;ERZ\*E"U)LV+EEGC=<N6_'EIT[QWJ?9;&]VS2_G6(-)WR;?2NW
XM;1AJ70:8@PC.R=:5@W[&.^W<M2#GLGU[YU_?=3M'?)CW.^;R"_%.2Q=E"O<6
XMK\>&9<L6Y)MC#+R>B[8N'?Q!?N!5T0\CO=^\:[IIG&>>]?BR;L.*^5[.;'TQ
XM5T%!FY]SYN.Z'GW>0NW-!Q4DBCBWF7S-EFZ*_HY2Q7\]%FV8XYVB:P^CY&8;
XMAN\&P76#J&['#C+O&R(W"+\W3-&YV];)8H-DF]:.FN&"$]6:+IK[GP-6ET&>
XM9]A_C;2.N21ZT]G6:_K,7\ QDC"I-[Z\-]6D38M*!0D3+TP<T]ONV[1DNH;:
XM$Z33JDR9[J ?R*;G:=5YR"INY82ZYEM!RH1)$R?(KCN\TW>DT&26./R'01T.
XM6OVA>#_L4-^R)3M'K!E/.-J)IRU*1-;U?<Y']<:#%E7UG2BJ!YN^!ZYA>?@1
XMHF=:,]0;9 @P=MLO] MYF[A:IF"KXHOQE%&CCL0Y=@>^XSH"4<;5OTZ=DATR
XMG.P.)3O<^EU/(O%ATN_ZC4+]^M2H$;#')@+MUEOVK5D4?J)!^#YI^*F8AH%L
XM=D?#CK'*Q( '03F1N'"#A]D&A^O_LJ>O19%Y!S$.2IC!:$N=V=X"[P\,*;"D
XM\SYDQ$4N9KOLXW1<WC8=:?((G^,Q=[2'LC=S#QF&>TBD2KU'T-RF@QH]!G'J
XM,U5FF_NIV?O\1RIDVX]PV5T6#_6!@P<19*9,.-UGQB%]I_3!2);2QRI! U!+
XM P0* !@!-.0T7<OC!6#L# #P!@ # %-20R]00U!)3D<N0PT" 1(C
XM%!4V-VB)FML\!082$T3%]I;W1Z9U.Y9M7;)E0?(<^Q9N7KEISZ*EZQ*MSX8*
XMKI-WP]*E.Q8.=0O>=//"+4.]S8*<2U=NW;%T0:8=VQ;NU[)CT;X%N6=[@P01
XMO,7FI5LV ?G<\1R7K<D\YW??RB7SO-'([[5SZ[:9CDTCOMW236LV;5DYU;%S
XMR\:M<[W'].=LW[H]TUZ[<=]XJ+_O#JHA?X6[EL[3#'U_15HV#/>6"V+^BHF]
XMH27/'>_A$Y*QJ\.$HX*']M(6Q?LLBJ-I$/R+6;-P3J#5=<BW&ZP:9 KW!;0L
XM2Q?MEV=-5F[9N7-!6*OV-32"VJZ"'S3IG68Z8QNZBK9QW(OL<EYJMO"J2 VR
XM)T@8<ALTFW*C1#%V@C11O?&:-9NB>_= ;F 7F#.!VTUW3E,M<FA8MV[?C*^M
XM$F18D&[D+FA?&Y*K6ZYR1:98]@1\-]VZ<MV@[Y8Q03R/;-D'' DRA%$=5LZ^
XM$NMOV=HMBX+*TD1;\;[004@OT/L)*S>:_DV&=(MZ@SBSP <L?82X%EOW[)<^
XM%3F\B/Y)M*C0JD=UO,FF*C$O?)$C=6A3[%<XC;=,U4/;WFZ;(*XS8E+$6O!P
XMM'04=\2K3/F%"VEFS=U&7,,-$]G5O)C1.)@9V@)_FH3;T@?@4&J,Z8P)ZCHA
XMO1H[NA\'>QSU$LS0@J!.%)95G^TR[E(E"LBAQFZ4)M:+SZ0(/]S7VOVE>;<M
XMT];F+B[IERJT(;FGVG_E"LX5_9 V@X&?=U+E"_&J68/@WV[3SD4+PDR#2]4Z
XM0U)E75*T]2PLX9V5!8,=[V<Y1['=SM1ST^H9JLVB*"WH*?Q$)+VR'Q9._69C
XMQE)Z5O4;TLXT>"^+NZ-2FGAW.W,YC:%9]*.QG&8SK*B_!G5<])_9JOB*:%V6
XM;4R;*)BF#)U04Z\0&WC,V-0]YRX,$/%C?$>9PZ$ZJV(%ZP1=+3*S[IS=B*=V
XM?4MAS<H->P8;'"-H-M$OL\9T+%RY;ZJ\ZIUT:%.H7Z%*?4KU"7<<%B'X(7;?
XM<OB@L ZKNVT>JAN.*MMJ4.9C,##K*4FQ\I@Q8%!/J34QX*J$XP(!:BPQ#'+J
XML1K%F7%D)%/(-UUS4$L#! H !@ & .-T0QI1B#1UH@L %TB + 4U)#
XM+U!#4$M4+D-A"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+
XM!085! 87!0H(!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK
XM_/S\^_O[# LL"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W/YA<1^.<
XMZ_</B<9>"K==U<J25PFKJ-CE-/Y9ED8)Y8C[O)HD1]3W5>0Q^?6[=AWW/_;>
XM&\:@/WQ3$Z.Z'$\>AYZ:F-+^7^#._#]FK%]^PE_EN?R/N=R\M[_7_KM4[NVX
XME]^<:[5[6W^LF(:G@.\@1%[ 9Y(YR3)\QHG1?ORS@OS<7*VGJ+A1>;;_S!'+
XM^W$M^_;3?FXPLCI/_K+_^WB:Y_V!KM=1E;M*7P:]5L240:?=^KGA8^2Z'-D?
XMLWR7G^YRDA2FRQ_TWA]'XO]A)XQ.')R38<1A9Q#&VXDXZ*5TX^:&SYVDI/ <
XM&X]&;[O]:=Z<7-;CPXB=M_^.VR_-FTUS1/OM#>/"O%DP1T1]6Q''PV'']/.\
XM,4@/'X41,;D[-'TG=%^F]2=KM8HWGI0<,;$W&(DO F\.S;&D3C=YT!XE=A-=
XMZQ@TIW\T[G1"^W'C3N*J/;Z_\6Q;N-^\EG\=OW8^U?5O=_5:EQO\+BJ.W[?Z
XMCUA*6*[27EO-*G'CQJ7[>ZVV@N2U;2__ROW4Q;Y@O2[/MHAEQ;[@X_=@_(C7
XM@?JWN;0$(Y3CI8A+N-+-^H;/S<U-#T:T#W:^WO_9[H_VGN==_Q&><[Y7T2.?
XM3>]X#+T/MC;#+3?/*Q6/I!LUU$A&D</^.3_48(3\UJYM]8QKO=?J&E_# 73R
XM?\Y1_VM)_]4^6TTJSU$_;\ )PICEK/G<2R7B4Z]OD7Z,'^I7^>=^5,&>FG\\
XMED,S9J=OMA05W^%5_O$C[)=V^SZ6+5QA03"2.?2SEB^1O%#D)GWRG;H(SQ<[
XMX7A#UBB7I(Y4.P+L$7A='M!U:T00\J_?A?.Q7M7#OF=ZB6>R6^<MX(F0(5A4
XMS)JORS8WEM]YHR:-1V%Z9E?CA^9;O'E;Q"<\_1:/)!CA'&_BO*+-+J<-EY?^
XM5;DA]E8(F\C\'W*KEW01>FN_T.XJ&QUR@.""[S0+_'U>UL(X;Z?3[1#F<>"N
XM,'?E#E]H?ZF'_V&%]=-E+W+G+Q!>F-QN=^.^(MP^2P@?(;S%H3JYPVO5$X_3
XMH ?Q!#V2+M_,\POP6O0:,E_AR0&\*CH!K"QWN81R9:F6ZAHAN#&EIY& XU_?
XM4+:+/U(H4)7JTCB?=:6[RL2$]-YV#QO']]7B"WWUQ&2#\^$LR9<-4D#W'>T>
XM^_*/^ZZ[Y<<>KWZN$>6%6H5Q?TZ;@Q%D(7](I)':'(Q^V&'C'.E7B1DK+O^*
XM^*OW$N%N+!:)^!Z3[:[/1_U!7VWJ4((L=)="RZ8%A2X^C41Y1*AVU;B<V1]*
XMT."0%PJ^D;)#+<@WMCC_KU=([[U6J&[1@@*K1=M)<[N?!,>7OZR0BA3#?418
XMG";ENZW3O>X7R;Z.9M7,_I1N8F]H%A-WNY=Y.PH1C9E3@IYX4,[J>5M["UC7
XMU6+_TU1X>>,Z*40E.#["QB#(2<D#2.\SGN^_GVSV5MK7?A#&P?.YC&IOG_Y$
XM_X?0#&"?<-^E;^V.K0M*BYP/Z=%JF7&\FL50W"'Q<["R&#=\4[W8^AV!ZU((
XM\13\$*?2TQ\D_6@2[]N*\G80E[A<D=9Y+9D$(]T@RG^2DXX2 W*5ON/J-8).
XMTQ#@/Z8;3/WSO_QC$2-W<7=CZ#.#$39?C,YUHQ= %Z4>2%:C8TY.**(8&[A4
XM1O)LT4U)PE*/RAEG.ICU8KJ[*2E,AU*3!.MZFQY'-)G]2,_C1$?P)O!Q!7Q%
XMM<$6$ <*$#BN9@IE<1I?U:R$W\9UW5[/>844(I;/P3SM*$Z< ^Y\B>L>-?ZF
XMCR-8UW9Q;^FXK'."YBO_ZGCO/^$ZSW^Y*(X+UX2^ I@,:,<PJ-3A<@;S2T:8
XMT#5PYI[\^X15ME]M(Z5-AGK7^&MI5+Y-62W@N$DAC+JZI/&L>F( 0RS#5!(^
XMR1(-U.D"'^/TL0H#$G_F<_EQ95Z5PO?C# >J%)]OEL(,O<]SC[_K/D6H6I$*
XM\W:03#Z05,=P*KGA:[5:S<_W<X2C\3T%YD6R1=E @OG R$3UX%(7E5#Z>"YT
XM8#H?0DZOA4_9? BB(R':$"G>AZ;SP!H,%-5!)/2 PBFDHP=:8+BD!P;I+=_E
XM1BE<H4%PCD50(9W*!(L>SY$:A#"?J0[W'S35,2\#2'Z=J4U00")47!L1E-?U
XM/XW&O:Z2+HS5S" )2*1P&GB&%YR'Z;@8M$[HE7%\2LXK^N?4P.*SB&^ \N7"
XM-1*L+5= "M-(.-+!\D8,Z3"M0AMXW>L 59^&XS=PTJ<R'L;-A=0W5(&%%/,P
XM4 X2N;%\*3K"4R<$J41>(%8+"PMEFJ(MYC-;@\[Y;D+J%D2M(7E-8*02I+\)
XME-(5,T!B<^ YH@&.S2&J >2XPQIP!A-\7*F"B5]80R <S.[.M7NHV+S=Y\UH
XMK,4&081-)/I] _-9X^%)]8Q$M\#]D(=<-N$,$1R]",<K E=P+"H&+@/+P >>
XMM. Z;9X"O$;+Q$A#NN@0B@%X"H(6X#$9R8<#-1@&!R@7%PA0C1;H6)A1XSPN
XMYA,%Z#:*K$ +U%[OHUX(17,L,+3AR#[OH[I4/E\$O/+?KAN/S!X7D)UI1Y/*
XMY1(OA+E.IX0*46\8"Z9F/&A(';.::7F0-!K&=-#"5I1GG!/! EK7 A[IE%*8
XM_4 G/P.E@'G0DA[41*FH45SE)N)-.87##$)O:=]/M!BKE>9'C+]*VAZNJ@Q.
XMVH!,<T45*H]+P8\%"L^Q?J$,6<FQ%^"?@\E5PQ;\,>!P>;RU$2\4;B-6ZIL+
XMQ;'*JP9F!1R;W!5XO$,9RE"*XPE6-H3<9\>G5A@G&*_1_@_&N5GA%=Z<\/D(
XM[_]Q\C_J4R'XD7)#S:]$FH0*UBK.2 CQU8CT0\C!:08RHR%4('HJ^*=QR'X(
XMD5UDCMN^E4@9FH>E:UXGV9P'A,)K\(;P@?1.LD,E6R=99DLFV86T#R;6X:LF
XM9 E:5<D2L=;2LHD'M6\H]D;&25& 7X!])4Y^R-E^I.DDAO1C?#'(QBH$?:>_
XM,,<2^21+@KVHY: '61I+R[$'UG6\),[X7/DLY,KC<8Y_'?ED^..O0YZ5JZ2*
XM/63S?31N+JZN&C@U@Y/*W4C0"I55R@1O$DZQ'6$G-XWUAN-0O@L=V9A^<W\P
XM<O@AX15%IWIY.0KA)Q8AO%ZA\E5H/GL@F+?90OEC%4JNA/A#;G:.Y, D8?\L
XM=O@JX@G<'1)*$R6;J$TUVBBG)/]R,I&6!67HB==+MJ>3 M6 B--1*>6M2LU6
XM/U2(,'+!U3RQ?-(L[Q#_O<1^WX>QW;&<4&&]<$R[_:%SDRLMU[BAB1M\&G';
XMH47F^(='553!F)OP7Y$9, T'AYUMYJ!'#<>QA"H1&?@50"!(,,3EM15@2=M>
XMW1YPJ)]S<>R5#/LB*LB%-C(8FH\'/6Q8BT#W'_J&#7$!" LZM;C]GN93]SE^
XM[.(;Y 0A!AORY6H0.?!2LT2I6>P'(Z2SS7.1?)OO46+XXAUI@0RW*@U@ZI-"
XM:%58S0NX3E"@<9H?C"QL?+WH;\Q6GH^*6@!"0B $O%[Q:BZ73L(.&WQ4D$Z8
XMS# A<(08-SK"^ VE^H:,)1)U-&\;"'U?4X AKFVW#H5B.W,]W+;!WLC/!0D3
XMN%@ \'(@J-DIQX2LH0I"#OKFA"HSQ K>ZM%Q?MKWLP$39WX?DYEHRGR%"PE&
XMP4BFB>XZG4(^H33K^%;#3N,U: XU-%&E8,RS1=+O7]!0YZ#'?1RS*>618@UP
XM: T(A\&YYC3&MB^&2ITIGK##M@FXS=S;;1LWH3'59SH%#QHVF!RV>[@?L97$
XM]UVQ]U#:@,2\Z)TE!Y(E$F*/.@8\QS'@^3"+9@!!^5!HKW-@C#?2- >D.M&;
XM.^+TPW%4ED8I)J.QVU0:/%!+ P0* !@ [?5L88,B/PD8% #L$0 #
XM %-20R]00U)%0U8N0PT" 1(C%!4V-VB)FML\!082$T3%]I;W1Z9U.Y9M7;)E
XM0?*\&Y8NW;%P7:+UV5!!\!X1O<UDK^HMM>A0JU^K3BU*%"2(X T3K]F;96>2
XME2DV)I/PL$[&J_!=UL;W'ALSK%DFQ9)N7KAES!_D7+IRZXZE"W)/]#*6;-^Z
XM/7OWK5RR(!."E%MVK-VO<].>W9%=B\U+MVQ"%=1=;%VS<ZJ+]:%>5+_;NFUW
XM)GRI$J29Z@WB[H8+4N6+\M#9EG4CGI)JXKV/=DV&K Z[0VN@(:MTPQIW'1%M
XMFNP-AVO<\0ANW"6<Z4W'NPASTTU 7U$=9>&F6].Y%63,FC!A@NRZ8VPJ^\2V
XMX#54Q=]19=W*=4N09\O2G4-7PQT;EDVS>MYWT4AK$,(29%BY<M/:+3N'?:CU
XM+^X];-DV=#<*,>?7J6_'KLE?VWLNBWV&O.@GBZT31-5G,>;\"G5N&?7]%FG9
XM,%0N.K=*N&BJM]VW:<:U2K0IH!67!9"HZBUWAW3<VXN_Z&)9O&-$Q@VOY>+I
XM*,?KHCG+K$<;/\:ILE]S-*I_EBY:D'#EOA6CO-N$@4YCKI[J$-P/DB^?Y'4\
XM??;@LTZ9(NG3K2OGK3$?-7KNW31.-QKZG]O2!QS[BQRB>ZDA$P2IW&J058E"
XML:NE/J7Z%*2.>96L47Q%JTR)(O[E*,\4=HO@$/RN^@$5AEM%%7#H!&JG'&'S
XM;%%W]TA,G-#*\AOVMW6BT"A%%I5B=$O5X=@F/ZB@Q_BQS;)-LSDM,L4T]295
XM%H;Z^ZP5QP\'**J)GJ(?=9@1955^DQ5,K"ITF-Y-,W'GB^M&IZ#6:88=Y@[C
XMYPFB/^XU#X)ZKUQAO5D4/QR^,5^BX;BOUQ)<46)2OH;YJL5,Z[!K=WB'MFM:
XMQW4U=O!5OB_BA9CS<H'JQA9CK1SA)/R.[@B6SQZ!&]?A9L.R+[/K><^5.\8*
XM( 6' 49<>@A['6$:2JDK<J::;;=-ZC0*/#J+^(RY@CI3G&=_A)Y@4!ZV+ELZ
XM3XH@L\DCSUG,0;I_P6.UJ3*O\-AR*,^D09H[^W">@8?6/?;D5(?T-K5D1+H]
XM<)$%9YT%G4YGX5H;G3'ZW<).TVJ+\NZ7ZN=4E['L'?T\XLJKNYDU*CC;[*C[
XM;</BP=NHF"V@1W.&%*'^/BJU[$9R][MEK'G8L6/+PJ5#Q;6A\+69T5&?(T*%
XMPA0K]A3)O4<NVW=A>D03HX'=$JN,_KO4'BDUC3M!&.79N#)CY./P $7.2>81
XMM-N3=#I3N\E,UGK9!^:IX/6Z"#\?&L57B55([K(L=HZR9R.?\@402#Z4A =I
XMY#.'3V KBU,>AY=)/[8%D-8[A?48/8Z6,-Y,X +AYL*?2.+89-F4\M"7Q,;O
XM" =GODC>ND&C'W0R-6H8)%LW\7T+.:JGIM5;AATNMS&7@M =,X;PU; .!11#
XM"C9UR2MMN]Q&(6="-MA[YLF8V&4=!]^S1\7!57&9 M"$X"2">R]P3+N*:R3
XMJ#"5@81[XV/@GC1S,[L-[J$%I&AH*X2!>ZDB$B6+G+$C7H7$51855]XHK<.>
XMG0.Z0,*HP )=A"]0#UXIB14R*%L>7KQEC)$&D+K$\HWRF(VI)$=T3$C9XV,"
XM#(T)4L"GM(#3>>IC$N/A (:-5P031+Z,:YBX0V+2B?:*D5C+1B(\>W1&,<%0
XM%XSK*2A7@",Z)$8_2+J;*0B'\H\,)V-0B@42*.)RD?@6$8.(LW(8@!)S8/L
XM7AQGW^$0!I3RUE1<;DQ<F)>#JR(UL.'B(]%VF)&:'<P9H21<\#8> 6I(FP;M
XMU]%_OXYJ&@STWT= !E!+ P0* !@#A6# 7_&F DG4% !U"P "P %-2
XM0R]00U-%1"Y##0(!$B,4%38W:(F:VSP%!A(31,7VEO=?JFRH$*1*D$7IHBTK
XMUVU9NB")RDUK)WF#E/JV+MTTSWL.]P#O(*F K^$]%"K(L6_)(.^Z<[37?$)Z
XMNYU+-ZQ;.M+;[!O]#5?N6[IOI#=;D&[KMA4#OJA7]B8+DB9.D&+3TG'F(,I[
XM6+)DY0SKN2Z:=U"V<]^R! D3KUDSP4F0:>RO>P'K,OJ+6>FO>!V&>%TK^CVF
XM>M-U0369)'WG2;O2=9GS^@[?34=]/.^[(,D@9=@Z;5NX;,L<JZXK>0GO,,*+
XM[MJVZ+6]V6!M24V98FK06^R;ZPV"?::1JJ0-*\)>X5=<_:S<L&U/SME.B&LW
XM<)6[BM9IQR@3RQN.L":S?>2)N7%(2KAAQZ[!\\964M)LTTAI:#7;MW?2*:XC
XMS!V6+=N\(,+JLVCI'%E(+[*BK';#3(VQSAQ?M1CS9R._S]8->[;,.OP7<HWV
XMBYH29$*0+>!(\$E@:S/K--HW51+QA9H*328?TR<JC]3[?$&\@O<(HGLLVSI"
XMG0=2#3=/U\7V7:+U<1U[YTY-=RP<ZG#H1N=1M^!U-JLZZ*9W)DS@.655,6X5
XMN4&6V1MF7]2'AK?<<3_T!F6_WR&< E-_A;N6#M&+NHATD#U!QHBG\E/1UX6>
XMRC0IE.2WT99\H;O<C1$[#=:=5F\9W=M\ZGIQL>6:^4*792$$J[URP[ 8];NH
XMF]$MWBT['LYGEI^*"((,BSP76X>W:[;&)6[W;5HR6>DT[HXR1?3>DWWQ:W0*
XM=<ITNBT*H.P['B2+/I,LY'[*'>[%^B)]?6^0)LJ,H4U5O.<,M<0W"CT@IM"?
XM?>#"=7<C=.XV2V@H:ZO+K+(^IR_#J_'2$8HE7:DSZK&4*DV&WI(YW3R>58-6
XMKMULR;P: A(KSV_CO\/T9JSY3JX7D9[$S./LV:MK#^/:\?9.N]DH4Z4R)$4Z
XM!2=5ZDM3Q<;DC7G'K4,9O:;_]-V-;JU^AZE^%X.A&+/J;C.3LL+:,BOT=MM2
XM#.M^C;>-ZSQ#KCDO6LMAX]M$VN=8IA*\2?K$[C'CFZ[<NF/I9(Y*.HK^#N\I
XM-@^A7,6;W<R;#<L*3-4$5W$]U"H_A>"8\XBR<0'71D9-G7%DI.9A4W2!S[UC
XM5(]%"Q*%8R,POIP] 1.FK:$2_5J4*M*B4D'JB/X$NV=($^>T"^:J]LH\ ;FX
XM\W*NW#'FB>E"*._1%*7=]MQTZTQ6'45]*R5WF/JJ:K:9KF,])/-+C)AB;4K-
XML<E\:7F*M;)/Y4">TXKK?;]9',&F2E:P-C17XWM.XQ:2BW$GN$N=<E.7<8*I
XM;D7\$./J?#240PFNTOR)OC'<,6(0UACG==#OC^6E==N<!CF3]5[C.XF'G5DQ
XM,,] 9T^3*+J@T+6;*ZB^=1JL&H49X7OV\"(AQS9I OSH'^2*73V-Y\T31/9_
XM;9K4"63,S,N>/:3S'=78GMFBQ3Z5>PI^G'[DUZ2=V3AC/0]![Y 2=#/3NHPO
XMF'%S<KV*@'3!)#/-8?*^N-@JURKJ$Y@1O( 9Q3S<-TQ>];&[TZI,F;+83:;*
XM-LI"E*&Q"])BX_=81)T3!.5-R",KEO]+-(%=)):87@XCQE-AJ,1I%(@,'N*+
XMKR0CUK@-IJLJ2[1A:CVZF]T9)E(-4T,.90H#*X7,?J]N.P[6^BM1HP8-QTQ
XM7JJ 'X"OSBFOB$-%\J319L/1 J570(\ZC*IXNO14S#Q%IZM<!Y'_Z'6X?L2S
XM6<N6/EB#3I"XF.WJ-8AEF-FP97 (KV'"Q&$,'&"Z3V]0WS&;3Q!?!._UO$7N
XMJ=:,+5:0^LZ@3_?0&,^H1+1951?A("QCXLSIH!T,=RHEX\., >%TE#*DQ9D=
XM',XBP&T&=>XXUN)02P,$"@ 8 2[EZ%R 04<L1 0 DP$ P !34D,O
XM4$-35$%4+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>F=3N6;5VR94'RO!N6
XM+MVQ<%VB]=E00?"<^W;LVJ]SZ5#ON2A!7/_7*<]?EBY(E7-9@KS[5BX9Y$TV
XM;)[E%+$..Y9N6KMEGO.Q=Z(WV;=WG/.P=L\HYW.&=PINO4=X@P01O-.:!8ER
XM;DN?:;HUW;QPA.Z>/4%6)0KU*U2I3ZD^*1_B(WC*N==UY;HQNF%0[QU:AWX6
XM=*9 6NTOYP4N4SPK]M6LT[8M^[8N790P4[Z$B3<F3I@PQ<)DHC_P,[=YBKP)
XM8(O+GK/V.*9D"JNH]5%W,1?H<68]A?*Y%>*U735!ZK @??H$.:,\+LA%/I)L
XMY4DRY5-&^??I4P-02P,$"@ & 8 ?%.7&L68DM*-00 1O( L !34D,O
XM4$-40U N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+"@8("@L%
XM!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$"@8$!10%"30'!A<)&BO\
XM_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%!A(C%.7VEO<Q8_WAFYH8
XM]=?.I_K+3[C?O/]Z+[^V;[\<[E_'<F_'<_[2^82[CNJ/%;.HN*@X9JRBXF!2
XMOVO7<?]C%WR*BFENEM->1-K[(__>'>$Z8Z^_?C?G:LQE>QJ8[[K,M1KIR8_U
XM?]*H-4KZT[]4[K]L\_WC]RWAWOY>^Y$?C'WN^Q?Z6/>/^ZE^8S^6YSK6_YSG
XMWTOWL>;_QKFOM\,O/R$DN;?[J<>,WZ[E_ML^+SX;ZQ]UQ%?P_]]\UJOQ!TF_
XMHO)/[<^_7D=C+Y>=UM+32+B7E>LZ_;UNZXWVRW.CPK)*K2([9N(P*2;AA^KO
XM3>V]N/<NT3\+T5-_ED=\;W-CF;>;_GS>$>XSGZM?P#]]7WJVAVDXQ%Z>-0'_
XM,7B1VS;[G.OW#XG&7@JW7=7*DE<)R^7X<I5ODB/6I7[M)H=^MBK*H<^KB7(8
XMZHIR1/DNBQQ1WU>1(R(\YWRCW"PG<>*?96F4\BIQ4([?[D\<Q\1E^XC][FC<
XM_[GALW)S<ZW2D/VS7(W5HV-Q?\X?,6G;&_>Z#JW[0H^WO<M5?RR)G..-XI#K
XMUK&64CYM+'Y_% 0CT9?PVJ@\]K7!CU7>C_VGF?^F^1=X^\%(Z5"-_=SGS>E.
XM=SJ5.E_'M5S/>87TKB.]A*<1]JO^"V.MX=;E+D<,=]UGO:"PP.CW$ON"[QW>
XM/=1H*<_G<E7V\KVZ?+=KQ#IC.'SY6M".X1S?[D8$G&-%Q6Q+K(B5?5V.IWS3
XM_#BYDYSLK,P8&>G1)0ZX.)8/BG_]1RROJ^)_6U$B)K?;QL=QRS8_\K@%6!T%
XM(V*?K"8U^4P9OH^G>=Y_7EEJ\7+]V]RU^6@LUWZ@1U4[+?RRA7"?U@[P75!4
XM'()B'S9\U7[A7S_(C[M.PYK7S?R:]FM',"*Z[W.]>5Z%(CR7H <V>'D'BD]M
XMG#2OX]G"R?A]UL9UJ?RG5KL;RRIU5ZF\\REN<[_V7L-Q^TQXG>LEQOQN)*QS
XM>14>SOP6XMU+N-+MNV!W_!_=T6^Z_4)M1M-^H<EA(8>)UVJU1L$/ < '=HBK
XM!-\V<//)O&XFMG4=A>U<I8@R3T3,V$*36V6UB:W?VN[K#6!?E^ZH/3"OVND=
XMOG1M=QWNS'3'G?Y<H2J[6Z&K0@M0\'RL5Q4C>^Z4SM@AD/W):M](\ ZQ#LV*
XMT:"-I?(D>1QZ:S *LZWS)QK^S=R^]8HXR/7GVPU&4J,F5?V^@P<CV<1DCA,G
XMWYMA.\VX"OXHVA=*'V&?"+<C<X5*]%_#AH8:A,I(*+_G\8*X4,Z-YT!N*MR)
XMN]T"YD>A0(TQ$;DT*@ELHY3'"F!FC2I'3++G'F%4"TTB5;P44A4M$,ES,S/[
XM?%?<4M-*^4FXL4]1'XTK<R2(?EC.PF?>QGC.FH/[SD&/.S)XB-N%6.N]+O^I
XMTFE1N0"G1?T;C7T^'!3O$>ZM=N[Q0A$I5!4]5H@6$9H#KW*U'#5OS'+ :([[
XM>\-%'ES[J=<W<W.=J5!Q.5Q$P!SG=<WV@Q%&5G.EM4SWM[MV;_?A90QWY'H=
XM$<ODVLPA>MZV[JRFA8Y5E=1"^+&UPS(&V5?]/I:K=C4>/[O_F,O->_.9^#4&
XMM"\9PW'C^JS0BL6NV T_Y'9$>KNE?5O0_B0W)TMU>>9EUY*[W67XS]_#'5(M
XM%.XXFX9Q!K%X$:4!G5<Y@XJXPAZ(Q>MTF(N:%J0?$#>7_FK;%G*E\[8ZXU[$
XMML)O16P-DM__)YIVY+Z^//-/6/'SRAX/*[W<!Z#TC[^9TQ39[3E6=7W &D7:
XMS7C%/8ZW M_MY$%+]\G&/37[$O(88N,K%YRXYI%6XIKY:=<J>KS?[46U?+N)
XMK9^--8L^4E& 0LR%E3M,[3+)5KO*'5&?F81Y_ 0];FL]0JG(&2I^(II\%<?
XMR0#\$]0?GH^:POTB=5P^CX;D#[C+\1+IH_)2OH4?2ZU^X<%(Y <CE:<T#0LP
XMZV8&<:KBQN:3?1273#@=&)H/W:[ KWO\0<)/XW'>XOSA>*%VCG!A^)..K%H?
XMZS5V"%[-I5Q(-:)OE>-IZL8+$8=Y3"+>2R7B=I_WL]Z%*!<;$1IJ..,[$/H:
XM\0'4&85C6/FK7#JQ0QXA6>+:JA9DJV5J>=_,WN?X.[/WC[^6"GRU,J-:'U7H
XM$14]R*/Z(HGX;*6(Y[,NX%[BGW!\AA"=\#RD8@F[]R9;+&*$>:3@^_ZX&B&B
XM8YG>\=_XW(+^VM,P,E2GD1/3'U>Q(S43/Y(OO//-RW&$9[OV>77Q%?'&&XS:
XMM=LQF8O;PW8%'4+M4#@G<(<U@,+7C7:^R?U]LSK.TN;BH8W-UYEHZL''&.PR
XM'[-YU1CS/#2^XZ)V;"UJVI;U=5YY7Q%N3QPSFZOTMB(WH3+5]D/]QX;Q)4HW
XMX%/>(WBR+_PAA^Y0O9%R0LW_(<<^S?]9IC%Q@QY'26V[;^<@<9UM.)@%^</^
XMA3XJ^6&%]3-^@9.PDUJ-)DC0LPC($90@YAY+V3W5F-^DPIQ_!.A>+K'X;T :
XMTNA1<:,F1*SP66,546CNMJ P)2EB-R6E<"TH^&&97*9>;P%T!\ 5Q?!:&.?M
XM=+J=:/XG;OSPWO>V[5L('W%()V;!]F*S63QF'H5[[B7?K<S5]1'6<7N5JJYR
XM*VX7VVZAY&:Z6G#/_V)7;=Z 5&42H?0T%OO!R-A6PZO"2_)+>(Q1U!V/\XJ4
XM\T6E1$$8P2EQX^;<RN^]5DBEXY *T^:J<:8G5^H@N(MO6)2D4=P6+\UI^0FO
XM\]#1)[,T^0F?.M?:HE_IE$Y0/D[3O@KYB$F=;JO+[HAV]12)3I.+Q;C\L,,&
XMC%@P(@VIJH4R<3]">F\[5.<SZ@6I@DS"^5U/QE:7L[VL?H'*.!P30ZBFT=O^
XMU!MRWJIGD6BP:D&A5ET@M4XG/P1"X',Z/Z3,<#9/PZI<$K_BXQM,JFY31U\(
XML[S-\+P*WZ'4M<WS]S/"72B9"3GHL4BYH19P/Z(&TG@L]9&GJ&F64Y-6DD:Z
XM5:,($S2-.1%$5R<Z[D+'A4[7IW8OX: %"_WV..5MA49<\YQ::4G[0A()1H"1
XMFDE4Y8*G(=4]?"RBS,(XG*X2@YP%6RF%D(L_7L(EC1LS0YC+#T)O\^8),]GI
XM0WB!<970KU@LH1]$*L+#QZE\7.8*Y:N0#^WH4@P?G/.)08Z?EO6&<EOB-AK_
XM;"IF5_UDL)>>>P6.6@GG8*0G$8%CCC^$YI4-&[WX;4G/LLOXF_527NIFIO+[
XMH&U&]7VT I]4?1\G?-&(L2/6-,FBR;7'8O&V0^NUWUY+Z!1-*+1TA) KCC2
XMB+\./&D]55&N\2CGW&"$V++2LA:I@H7#"#$J[>H.A;Q2-O;P""$4<17I9@4C
XM^F9N:8Z=DYG[RW1%<5U@-73!=0&+Z$+*NR!E/91FO4.&QEKK6>X3B(:P]2^@
XM($C-C501%VF91CFQ@.FJD9IB\3%R()<<E:=4DI2J UM;%S70=4$1Q@E\H1.&
XMA%SF=7= ]B+CV-Y%$O!(,"+UJ;V+Q YT62("$0,>E..OY7U?*G"QZ8)B$&'+
XM1S13]%RR\K#U/NH@:B-&[ ]Z;\2(#!R8K0.=]*PKKC.MDVC_O%9K9BV,8K"P
XMG=TIL4/(JV@\PG8[.JA!/@$14W4 >>@$VP."D;LHA+9,8Q=4& VZ/Z@W7J9
XM?#%PS8:C?C:FLB4(QN$V+R\/80RCA-H&Q7D!<(!7<D&ANN#P7+@[7U?<PJ%<
XM$$E.>%Q:>SRWCXOV"7I0'G@,A&<!^'#S<"QXG(&+Y?]8L59Z,EU]R0TYE01-
XM0DHP"D;D' QFM;L52-@*;905OE;'!=Y8N _Z5.V$&RA"W@DF)T'/E:$_E)"O
XMSH7D:O@B2LN'JY31&!<_\.7%_\B@*TY1'/#&59WECQ1E(MHW.JD_9=!#=B#^
XM=.KR-=SM ;I"KQ"DB7!SV46&UF1 M^+BL+3EOZX_.-@WJ3TF).-B*%*9R<:4
XMP.'V'@TEOD=\- +KX_P^]??)VVZ-4X6X0S=Q.MA1W^E F^MWWA%KF;S@&C[E
XM^?!1RB#=VK4IO.>\5LPI$;$#$,3[!,YW"!!K-"FQ'<4(?([+>!0F62+DAPP)
XMT,'Y$^;D@.5Z;(^ U/%UWP]A!DX4"<59RG$(?BI2U$RF)]>2S(H*E.D6'J'/
XM@Y'55904UTB=,01R!#V2D9!&M0P]]JWLL,9!&P*@(>%_Y!:7*5 GZC8X<%(%
XMS<AAAW&VQ:X5-HDOX=1 /JI+)1R,%>2"P2C\911(T4:P2F"#'A:#(D6(4;_;
XMCMS"+Z35/FZ3WH=58\Z*^(K KXP*MZ!H/0.ZH'[)AI,:$&/3,$3$Y"(D9)E]
XM@+4>&'TF0A-9ZUX;51*)XGK0ZDCC>J!D$X=,!+37<6JWTW)+00[(4/)JL!_R
XMD/,</$3U'4(4DB! ==JMK^PCOTP#[2P$RX@G^#I0>AJ,6Z8H)PH)HYV#D1(N
XM1*V:&K) 5T,46HF>3N#"I'2PUJ4JF-#CREB00ABXV' D"^X/2X0!8' X& @0
XM17=Q/-A79L'U^23V:P.A2KQEOK>O2J\L);24 9&O+MQ4GM4V# )3/;A57 5'
XM7+[JQU6M4/-OFGI?B]O]$8UJ"\H$5""0@)"[6T!9U:64KZA;,Y@QH' =6Y0:
XMK#:/X>2=5.$JA6OP=/#!>M%=$6/BT"K<Z39B,[H;CN!-<(?$S]&X.&@?_'16
XM,1$^/X&;?$1; ,,GY?, :\T3Y2L\GP4N7!K&[" <UT*F0#RQVP02%M@6N8F&
XM"W\0$T/>A02-AP1,NT#-1#",>7U,[>S=T&&S7G<1V&85@,*:J^'8$RL'T:$$
XMQJ;Z$,*87WO]TGC#*6=94TF=Z .S< R:C(!,5KHCK@I?J](/1G[ N,[]=9Z[
XM&D[&AJL,PP4G?!$30>+B4NH:H;8A-+C%-AD 5!E=^O*@69Z$"&6CDD"G4[UA
XM!982#'<(D$*J'UJ'1,& [&J+'%\^P2LNH/81Z2;!K9-:1*1\(KXN!&962/=&
XM0BK\"1HS3U) *6HPN6IU>=K#-S4Q*EU+H34 AS4IX';7XUPKC+/=51%^G$O%
XMO%G .A^LVKIY4U?+#KEKVU[^P7C&ACI?= 9ZO+K!A-+_LC[&0$48CBU87D%E
XM(:1[1?HAEC?,PPF_>2\4@[(($>;TDM,5W2N#:\E&YJ!*4%@T ](PI$/#E7 >
XM*>M"H8Z8?1:AUB]0,O/11.W@H7UXCIR'21TA4,+G0".,S*L\0&^FBM7?:RA;
XMJYY*F3VONY[O8&YN7=<G3^F\KL\6SK<A.2\;C'%#]%;U!:E4[6!\R!B\8X]+
XMV*C.;N[9!=AN<Q 'CI*,0#JTK$V8%.#B*C/%[$1UJZ<Q*+6&B8P3KU)9CS(D
XMA5)K=69.<UPBVO8F"?/P(<1.3(&1+B,"3II/,QRO%KVW3@Y<ZH:PX8)A.YU:
XM5]6?:S'BP@P?V147!$;/@21UH7VC>/34@UMB1=&E?@S0QDXI>1(W+H0(8MRX
XMG!*TZ.#"5+@F%RRB ">DFU@ UIE)?!9'/NX\YW\",0[,XRB-4403#42;",?5
XM$8G.4Q3Q5<VPMQ,)/UQQDZL%LOE0%,=><=Z-3A(1G9 U$^AXW8M+*)$(*R)F
XMR4V=&2V(9LG,"T%>JW985(T04?"Z-A]!'J%JSW7^:R>.#'M*D-!(056^[$[@
XM9F4U"[;&,P$QSGAH6 (>5Y1 XU(2H.,:$H#CUZ:ND3B[.PBNDO)\+E?IA!6T
XM=-V(Q$@[R+CJ!'!\!*#IQ]8R>#=O?GM,V$O4]HT'CBFDRY1&U!71/+ZB6)L;
XMNOY"&;Y\I!X6OQ)?XRO7"07C GJ""AP6#/[Z2)M/0OE_[XYPG?D_>_*3Y;2C
XM9[N?2$WUZ5&+RH[_*=]H8LE_+['?=P)$&*]6? SE@F$K:$:*C3PB1M'O17^L
XMRX KJB*< AX7.G@I./O<KI?EAS?ERB&W J[^KZ"(0U._Y EC&ZT;9)EG)!%A
XMA4:@\*+EI%'*<^* "WG([1/I=28A@Y>@Q>Q@(* II!H#$P+8@39W0S3,1,?L
XM7,K1I'2R2>_S]D&$X1/90F$I&&@/5G6*RT_"+0V(5!&XG3QHD0@02-&%_[(+
XMC4@,/#_P&[(Q)/N04Q55Z>5]]2V-Y227/]Y(D'SBKCCQ1L7QFQT3>YT@$C-6
XM;OCTW-Q8,2F!S\U-_]%L!)2-]R!)0@!# W^=RX57*1\F-NJ]1*EO\GUJN.5>
XM5;Y];U!E 8HT6N(BC%ZE:5A08,MJ$E?V@5ALDA*LTI8U893UY:K$!?78[535
XMIVXW#;5N!VHP2H8[\FJ4Y0YBT&,UA=PPWXS2A>9+@>^%6FEA'+N^XP?O^D\=
XM#_^(KO6'\!'"6QQ!&:,S,)8B,5@J,5C*N!9"IWZV$D]1G9QO,-=C-+;8?,YT
XM;;MOJ2O[:V\+ &#_N0592OLL;;KHOQED!5-4WB.R\.$"D:\MM&A<&I!Z^"!
XM>@(7TE.A6]([Q)$.CZ9KQ/%#V'"ZA\>/D=#H *6H"GHI_.'M0Y%= ?$4A<UI
XM*@^ J7X63Y1CU4B$W_C6_$T*]8H@D#K:XG)"A0&+/H(+ YH4!I1Y4::#Q4(*
XM)#A$9 ^@;S5^<9QR^9_<9NS ,;??A/,74R9Z@Y'N[/3!FE*_2>L]UW<#4TL5
XM8(NWN;'\B*6$Q2*$R:0PWL$(":<B5XI/HN983&(= 31FK+@Z)F,"O-[5O;3X
XM8FG0^[%H/_95:4J 9Q*#'"@7[Y-8%I]9ID)K&I!PL)%8!03!)+@NCM&%(=<$
XMLLL'!6JDW%#S=1R2SBU*G5*-X9>G&63,<GII4 1A53D3M+7.T["H82T$*),8
XM3OD5TGNO%>*."U#9\[KMO[VHK2@8GP<B.#J.^G^%?!H3_90JWQI)6@#6/;4%
XM8,H)U5U?%ZI#<0.(U9'\MD@9!.;&'#3<(,#>\AZA?)<+4:+68:)9AT1\MT,H
XM;CN$6R<"-D"RX)MB;0(S*C]3Y?BRKTY3TH?NK0@H"9^5F9L;C%!K[,?SVY.3
XME?\=KYGYW^[-=3_RJNM@!D:%Q@OU2-AA4[EC21<H"C0>F'5I1P/].AJ&1]:V
XMIVK7A&E>3AUJ,T6'&1E.TS5I,(K+7>KY>D[H?A+4V]@)W\*<S-R0"(ETM6P,
XMQD"A'K>"<GE64ON&NUK+Q2A5/U:KF.FI8[L;,W8?CI2"=6CKDZ#+I3'-FP\<
XMH0LDMVZ8 )/(CZS5#5)1?HONY=*,[V^_TIXO#+'KM9G8RL# $(4M(Y ;<KU.
XM<G?X1NQU1U'"I)#C&,'X@UCHERIY>F'G1:A9O_.<=%+#_4&O]?9/^BO7*QCF
XMND@U"48X=[D94N6KQEOB*DI;X)%>S,"V 2<8:+2;=$2]6=[C?*S(O.>" B-;
XM.1II5B3DI0I9<<GK]A"R>$O$NJ=Q>'#]@E\8"^-4W1J\JOOFY\)=Q)U(P)HN
XML(2#%QAX%$/30AJ/I=BXLUT.5MPY9?B27@'I;LZUVKVA>N_VG)DQ5V^2JY8Z
XM'1WI;-;Q0F00!G,E _!4-Y1!H36Q:2IT:\*>6Z!U]>V3QZ'CU9)0Q$FM )0-
XM>5) B2R/T*@QX3V^W[4 ZZ$_^YSF"C,(L*.F9]UQ> $8:P4<_3Q-\U*LQH5C
XM'H[K'3Z?]L3PI$!94CZ)""@2'K%H1#NP.(#WY*_2L@@Y"V-0!5:':>LX.2P$
XMJ#XU?SWG!S6$A:%,GBB4Y7@0L!<SO87FQPL*"_W+!4@;TTR!F<\U;4:U[<G,
XM(+")D*!W>0X/L>AB+<>$F\-2[-<<%@P/#MI&EU#2P!NM$+:!9UR=%#"#*=U%
XM[2#H::)V<=,4[>!1.2:R<.P3'LMT.(R'3,%BG1HO/0K00S4BKE(#SC5BSA,]
XM6$%I$%D481H6]+"!B2<=4PLXK*T4>(0O"1F14%CPJ-X10['C!9=\,GMYL_;8
XM\\4HM#Z7R^%8 BAT<+C)1?BR@$M4/8*,:\QA]9] &,D"$2)Z'"* 1<,4(J #
XM^." 1"U>S"(EBT":770"(*$C4.YD*'N:0%>)(4%6GE-,&@06O!J-A5A'XX%%
XM%C+\@A_B9@<O:6-</]J/XTXK"9A(LZ@@+*0)#(P]$G<00@8!6A@"@0+L-!;D
XMU,ID!U8:GO+!0)&U<H'B'&L4?IH+>"8>5V"]N?E_.BE@$5*!@V:&A>0%P4\\
XMB)EJ0X@/JP(^QZHL!DXG4 T4$#CE.I "H V)D$@C!P>#=2Q""$5<'ZX#LLYU
XM(+ U\+K$BH/63+ !8W&_%2%N 1N$3,">O/N@>5/ MO=&=L>^.+D!#Y6''[2
XMEB'&ZN]GA+L0U='\K\V &2<D\8 H(F0U-#+H>5"(&EFHH& T<5N)D%A6$)E6
XM OK;2H"BE0 +[6#"$K&10$)+"#9@.+@$"7OP\!(@M)]@<M7J=^V''GIHH85(
XMB"@"@E[W_1#U+$C54AV56'KPV@. \\88'TS\>*8 ()(WYC'(ZWU.N3D?"P"X
XMG8PF^KQRV'*?*)T26Y_.8)&'FM XGAER:_@7,?AQ59?W[<;F>;NJDK2//1XO
XMG]&LT"Z?R7A[6#!,^I'0&X(W#_ >G_%/N-41<H(5H[G D7OS5G7KR6U];L!8
XM(ZS'7&XJ0K6&=ZM>W#XLK;K"6_=I1*DSY'[4"$'L9<^QLW*#<3X)I(_=[MZ;
XM=!!'X,)^_YN#,X"WU^>%F)\8&.6\KPS).;E_7-K<0.?%:#!AVE?-"HG +$":
XM\-@*D&IB0? O2B?'RBB"B:/RH&18*HX-4=F?'U^#YOD\'6:TTC;;^UE__":&
XM[)'/)9H0+ @HY+&;=PT?#Q1.N.2A $++8\SL@3?V%-B#D/+%UJ.P'I1S?^Q*
XM8F Q508M])O\A!^ZKQP4F'(GE/ H&.V%@\0U;8:&]0O17+5PU_*HN$8*\,YF
XMP_&NFAY"T1/V5? *Z6UYBH_'XZ*J).PT:*'&I5,Q0?069$.%'O7'K6_>C4>A
XMY_);<3(+!(O715H,.=!,))P>JOWN:-P'8,"=CO0D+G7F=0@<2;@=N/(A,8C:
XM&T?MOP(0HNJ")H>5:.!5IG/!#^4/,1AW(%]-(''/QX-?%%!QV+5K<]:7Z*#K
XM^YLWY&*36XEZ=US.S"+;47E%73=O0>A"^CM_G5_!['+=D!:+@Q ^TT:PPQP+
XMBT5*>5T+8N;8DL>!$.Z!]7FA;6N(8,4]))*%H*=AB"2@VYB?P-DIJ:(/G7+.
XM:\46&JQPB?:H?$38_-KY5-<? FF:UZ>:E-B. C="T2S11)E N(9+"A5.CBKJ
XMO>P/00!<! (YLW"\49!*1#2T* UF&%1J04TPHO)RUW&(8, ]/JA*"8')JQ@
XM/^AJ/2'_05?+.&+Y61-P;"OG+J'-;7_J2.*"(K*0)L[V3'\Y7$02^K12C=66
XMYW.Y*GOY9J>5@[;.";F/D:79&$!BD0":&/(RGUXE!NY\W(A*3# B2\1!26B!
XM(P,&Y?:IW4NX]:I266V/4]Y6:#[(921H;T ,&E#MJ'NHBS"WB;%_0W@+X2,.
XMD8\'/40BT''UB,"@THG6H=2(<$TZP'[G,R<]5J_U$6HW&XPZ$T$ )!$81."Y
XM1U!",,:CA"@28B*$ZA"@_#@$B8!6N"U(!$"&(-6J+<" EBZ*<,G^!"4F&CH'
XM$Z=_R0J7TA%'[,7:!E^[#E[%AF+\A$7OL5W%4UYB(PA?KO/\ST(M!0FLD@</
XM+ _TAFR^9V.QX]5$VF1C>".L(33S>9_[7K(0A C.B(<JM'16^XW[BF#T"_ZX
XMDR3O,)N0?ZLR>],/L1E.>(X*M& 9T6=AAFG"I 4.3$@731$M12H&B)#!".K(
XMDB,P0B5@5D_0$Q50< ZXPD(FZ&JZ?&$ZG1207_*-&H)PF!D4.[Y*=,6&<ES.
XM 4DY("* A&'0<KXB6R!2O<.=/^?AB& NRWGJR"D=<"$W)K>2H;N0-G)1XX(@
XM]P6(*_0^0AH)GL^DC#[:$+Y6$[C1D0!&-TAU&[)^K8UG8PO-R\O#MA-7SV#*
XM0\_*8'B!,PB"&020RB ;@L"EP6A@" P01"*8_]I(05RQ0&!H%-@A/ZAQ"C1
XM*L%I\-X;:S<@B:5QWL1X5*ZY$(NBD&O_[45M10$"P^O^6L U9>[*"#$:#- *
XM@H:\7HKD>SQ4%8YA/O(Z8ZN)R\P#BR^:BXT 8@O+D4I!4-CB?BA?,D43"*\K
XM^"A">8L+,&L"KE$%$ +/! ,#$(+@#H/T%Q$X+ZAS304:%(\P&OR8"0G:X[43
XM!.H3\-&/+:.8;?+J7]7#/BK8>:7C=#[O9>=?D!)#$&A!(:X*QD0(DK6H@)
XM.S80@OP_E*$,I2IU"X;0ZPVEEB.,Y(U8(GDDBJN7LDAPMF_7(X3IA=-K"K4?
XM \$A (8,$@ R#8AHS# -4D\-.B> )]!01;F5922H(Q3UA!8#=>R1)C%R0PT[
XM;&D6@M7=RMGFX-6N.:'Z?Z>SQE,H,(><@L7MT'IJ4/_8[=C&B&/_V)('GR5Y
XM+$OR$.-1F)+/6/(@QI \%D/R$"D#DSE%\B"F2QY+ESQ$I]V2?#J2APYZ=('2
XM@*(9I%SP!.1)N0!E_TFYD'$MN8"W!H6TY(+6!"&67#1*1:VM.FB$@%:@M;B(
XM?%^''TBHX^V0K*\@K M$6%@H,A%/H]$+M.HW4 5B0. =12#:2U2"B&"." $6
XML(L 2_W98%#>4"('B )52*\+T9KO[U1" B4N PKLBBZ#Y;FZRQ3D2B\3<&SI
XM9=&YZLN,4\RL"= 508)8$"1*U PA090J\C+N+"JP#]%\ZG16O,\A?(3P%@?(
XMHNP,X36W,?'/-,!H668:6.DC>;&0<<E$*'ED?+B5UNLD(G422H\/*H0S!(YC
XMPQ+>A]I%Z,M(>S0N7\QT%7..6%ZK,#].YR[O[OI<$^!+'%-XU8=6?&CD.PQ&
XMQFM<-R'0E-ZY^7\Z05#&\^+XSL=2 0;.RL$%S@4^F'%TRZ0>4?XLEXA\[FD8
XMK$9<KO+-UK,=IB 1?$C*&H:K"L!;U_6ZS!IQK1)P1.G=G[.Z,T%=*6.;E'V:
XM\&Q'Q,:NN;'<YJBBX#S'_3L69!V^J8E1S3PDL8ICY*[@'TNM,$[-B=PSW*_N
XM=J"&,M;X(36&V=Z_MNWE'XQG/+LA'N(A'N(N(?D(T#&GMDX-'$%:(%?SQV^L
XM $LM='B$$(IX:C/+[<#<NC19!^MG"X?^"I$*#BW8Z+63%- P?#M, I8JX2K
XM.%=,"O^INO T;D"P$)N$-+I@9."BD;I'N+?#&3A.]*T#%3@N?^K#GH!/R*_K
XM\\,*ZV=;P<(<2X5N:,BES!98GK$.15FQ/L. ;6 @/ :=YKY%#U)N2(QIG6O-
XMT1JHNM8 !]#4#K1AA%A[7$ ^FF9RP3L(=;SS$.]<QSL/V0WPG$7V S6N;+R7
XM2S.$VV5Q)H\-N,3GEJZQVEWG!CTCN 4'=ZOO9T+&NU!SQ*=+\G),N*W#L@U5
XM\,%(^, KO]BA!OX.U[K#_1N (KQQEN<,/AJ\9'L-?!0='.^=K/$N2[QL%XM
XMGGB+$]8+KP^6FB$&+EAP'VY[#3ML\E#W4_L ;7.JR84QGB(?H4Q JHY39TX
XMED QJ(D'HRT-&Q*_IX:Y/-2VA<. )P4TQ](0Z.!7*N2-BC@ [H30N'A>D$WN
XM#]JMMQ<-70E]7EH8P2LGG"!""_V5$[ \V$)BMG!G--;$*-9AH!0->:$>&KJ
XM#XWQHDJ.@B)#@S$%A*D+H*@GE#XDG)1E7X5(AGCI7' ZUS2P"XT'96L%]5A(
XMH)Y%;4C%UD[*Z&<X4%^?<"NQW;6RSV?]-\Z=\\.K!-B&A+%HTT':"2!DJ,##
XM'5^YSONWYZ/;5K-T_2V+SWA(>XW%AR /'X92D/D*S\D=LH,(D[#_A ,!RHB-
XMV2( Y4,5P<)# )..^]O@O628V^^\(]6+F"Y ?YMOPD-9 X(';NK"#F)?VK5A
XMOLKENWXA?T%[9X105Q%]J\APVK<U2'Z[B2TQ'+50#?<"<<D7XBIOL,;V@/*M
XM"&0H-%;H9!?SXLRQF$H\/A']YNFB67N6]I$\??OMM:+YN*[7;9UM^]_63H((
XM3U4#ZB\^##C"2:,!$]!:+]#&N_[R;2D8=;C:MJ^-0),/V,8(5BW')2T()4)<
XMP5GW-QVV+&@78U+$I3;VC4M]0:%RB+,/0O?5]XOG";8OJYW'<MZN-#",/NQM
XMM\:IY#XXSH=%7VQ:W7<:_Z.QW>7[( M&=0&IZJKFG9WSFY<T@6!Y\"06& _Q
XM!9MYQ64RCB%PR/?#S?M1XR_'_P(9&!H7P1#A&[)7[5Z@OC92H)>[7&(9*$,W
XM']$EO *8 A<:/>(;)'R-^GSV:L.!6"A&B8$LXL;>+P.]F@.G&^%Z7Z_ B]B
XMU1R([ >GM$D/J+@\($( N$\S'2";I0&DF)S!+9!,-A20B/O;.-$@N8@P8YN:
XMR5#NMYD<'G]76_/YK"ZH_OED0%^,<CYEV-4&O(0..%P#@-4,0,2%-Z&"GN9P
XM>7CPU%BF]LWOJS,V)BX<Q06++&!>%1/C"YP*EDH%K+$+E,XAZ)KF!B-!7XX;
XMAOZ7N9A[P-8>ACAO@])/A'TBY)9HQ*<ZAXWZ.@<#2FSD5C0E TZX<4!L"K:^
XM,7J6E0H!!@4!CX!4R,H6!+ '6"D"YJMC^DG]4=#PM]T5=D&4(A#7L;I44/S2
XM#I+%!XWE@:*3!&^ A70%,<G)C0R\NK<ZNUJ:B[SZ LTI!6@L1%SKEQP,LRX1
XMGG.^0:!:>H"!,E74 DT+[*;4J@9;9!B1_I="]S=F6&W8+QK4]\0=*%8Z$M#G
XMJ4^@7E&TK@3DF $JY4M/TUY$?)KJTK@1X0M&RU[2@O$Y:P,JQ==3EKAM:'8F
XM*,?C<*&JI 7C\-@TEIJA1@LXK_D(#^-)OL'K=Z/2*$9"$;3#DH.P\!P2R"@,
XMS*8B%S/B]E-Z'T*2:J2#UD41S=>34%0D'$8U(#*@L*$ 4P\)+-\;LOF>;Z^Q
XM!A\<TJ-(*,W ,1V7'@B^!E@.&C&=VMO;%(94N*Y-G2Q)<TTV5< S$Z&OFBZ1
XM3&R)%,\?VO5F)VC-%7W=Q1O!*"*1FZBANGVN.DJ8L]8H"%8"E'<AB$A($AP4
XM>ZG7A;W$[T@VCS+RP/$(@>.VX99VQ%V8-,!?T[:7P:&T@$%$;JFR(<E>90%N
XM1X. UL&H7;D-"&3;B-!X@2@T8B3 H<[LU./XZT#@G F$ )#UL/[8UAU!!2O>
XM#@&_HN0]E !@D%DPI@Z9:[8X$.R*H6&IPH$Z;MS<%;8\4#;'")S5"H;UO%5I
XMK$K#K.N!YCY>Z'V[9<LJYOJH>A<XX :DIP=2!Q22.@!+5H1"0H[ZL!%2Z%7-
XM %]03;#G_420U0IKJGD<U;2NR62F.+N+OXSF>"8[NYR/$3C?*B4?;,QEXB(D
XM$#2UUN=R.9PA/=)PO;C= NO*(2']\\BM2318C;8J=S@*:6/T%&H-(.1"@XT.
XMX*;(JM!*:"?<O>0K$817$\Z]7$A_G4NE$X"19Z7[=M9D@->5-=3!6 -).X4]
XM<=90(#B1 FOHE*.&UD)/1**FF;I6T0$OPJ-\X84O5)]<A> F==@<P(L&/4(S
XM+(J*AB]: 8:H ^=\X88>21UM[PK097O1_#GXN9%\0]"JY%N1W,O [U,/I^13
XM>WLKU$?U]G"](DQIOPL7;*&924( FX&E>9J8S9$A^'\H0QG*W[LC7.?/R?GC
XMTO:%T(M0,4,.$Q\,'-TZ!QV".!@U)\S<Q=V6W->K/)_+<V!R7PU0ROZ:>6"]
XM/&$[-+\_HH_%Y5,,YT*Z@IF71CV5X)"$[)C1#;L8*)1R8HV%QMU1[MC")7HP
XM_]H%!J]>1)C6$_F.C6A?1;0W9!?K, \D6!\=I.O3YL"5\S\G/CN4"+#<-'"^
XM60P9[#L,1EAIJ&%0)' YL:A(T"0R6*576IXN*$5,_L^>_.3'(M*X-@P)>OAP
XMQ)8.!>#8,(&3Z1UBF4K]$J:PW7RO5_W&\7O>52[\95LHXQW)!T_($WP:>0*"
XM["QXYCI.8F$23AEET%A$:#T/B2R PHD9[NAN9;=6)R?ODY3P>$CR@Q0NN.1-
XM;H&#3!"RX24(Q@CJ8U'DB+UP@>L1SI5,)9,8HH%3FZ,QJD#G1"-2 6>@ I;=
XM@?:-M493^0_OQ+7*DU4Z:&4;1+D/?!!#D#<"AC8"/*>#!'*0/6?>CK6U&"('
XM,* \0&*>%1-.3F#%!,OO D_N N_I* LL**((1,=WT(MJ%(%7NB!%-,?(AD9-
XM80$%L8 T$99)L(YK"Y1'AT-;X/@*&#L3C)D!B56 HZ<K5@&O=,$J-$*4#$Y'
XM9AQA?>%C:W:)W\50BA8V)V8NV4?%#^#5"PE' 8#235N=Q)?$<\JXWZ;X"+,,
XM#"02&!%S032&0CJX=7,!*BZ5 J(D1?>?4UY/*@:'XYL2@2/I3'4'AM^Q-P,W
XM-]H%RH.[)^Z?P/)'\R?P2%?]1!'(>$"1F5!D'@+4A*GQ $;&!:=O L=#@!*F
XM+D0HM^!#6<C<8("!" !![E'W!!J8TGU;),SULW;&))!CDZ]3IAD(H%#!..AQ
XM$H$!RS&)Z(<" J/H%-CBD=J9H*?#-->/]8$8"D&D^ANJO@YKXFJKJNL\JV>$
XMP1B,LR1\7!C19CI>7_ M=JKX- P_&/T-TO^*<->C?3+B3_.\ULI=S\=\B-2G
XM\<^U3"?Y%J<Y-"]Y+_M>#4$ZS*^RPX GEB:]'#\*!7T0?&7II06O+KU%Q1)1
XMS]UC*U%QH9>8ZO BU_A]JQN40:[-<%1YK'I) ,-"3ZR]Q((H^D>H+<X0/^)R
XMEZU.J0& DKKQHR@=0[EMHZ#BQ=*A4VX'DO0L#P**\IE.92S[F,("'> H\&"
XM4"D236-"@D,51%7-EP<#N)BRF;IGI+!^06$+/0GOX&G4>]%;N[6:IKKY+_@A
XM$1(_QU),R.:GKEX1ZCDR]N@]65LU+4EUH=(%9H"'K9GQ/WL"R5)AHA0K%>^L
XM5$%,*OG#$Z%[A?3>:X6D$0=UD%RG\!>S)6RY0VF;B:] (9<^-ITJPE(BV7B
XM-RI&'S=*V&$#JV)A!.M'DQHREZ<#+.A>@QT65]<HAL-\UPG?5T1H7%P])1V\
XM:+UF?#]RWA%N:/WS:MZ; V6I.KG=IO6>/>*TM^:=H_GMNE@3#;,YMIH8-7/X
XM80UXK$+)JE8?<K=KI$FH!1Z:XRH;5.X<$I\=1@N$GKBD?CS>-&P?AWF"GL-5
XMJ D"^AR2FF@B=>&YD&&F.=RL&4458$N#GF:RJ!JU6S8%EBM,GNJC'5ZY;0I8
XM!/;\L17'M,^O+A7_1(HA"#@K!D83KI*J/2TV;C;SQQ"7JL<YD#2N.0H)\DD0
XM) H*D*63P(!2%WA&NJJ@6U=!T[@L(D&1J#*0YO\0HD;7 WH\-TVB'.5=*_M\
XMUKFMPOO?X8&MP:XK&?Z]ME*K5/.?EQ]JWPE>".5K*"B1K2X*AK5NA&3A:I&%
XM!\<&KL!>T+)/>+GSU/&8/!?7@C.&*=(: D9@?S D !W! )_[</&#N!YW/+*2
XM)@)A\1S-7<M7"R<4)+ ,<.I0A9K(>C4;]:GH<I"<8X&IJ*;N9/ )SW9$;.SS
XMH<=NMM77)<. %2A/&>.&(04_Q"&! ^*M+(L\'#@-J*7AB,9O5!+@6!1Q79:(
XMY[,NL'!U*14WU=M4Y4(6UN_F7(THX1_6I.!;&,)L&=T6)*:NNQ*SW_YB;@3<
XMB)Z28#R;F[49530I_"&U8&!8C3 +E$L'$D-J1 VIH<3$(#2 0%(!8!ATP()1
XMJ+N$2"$U# I3,;+ZQ9?J;NMVO:ME<I@M)&@'?A D!+J<Z[C59:HF9;WG^BYI
XM:*DB,5W9\L;R(Y82%LN0Z\ VY/)9X^H;A.(S&F'02NE/L@WL(^6$2M'R8R%^
XM,@D:6;**R->!<K$2L4;)ZE2,:.? &.^R+Q9GY6]Q+\^VH( KT8WQVLO4\5\E
XMDO4S6)GDY2'5#5.7R!7;NW7P(YFBT04.Q6D2JR#BO50BNJLFX+LPY';?%K_+
XM?^KU+5)NJ/F>SKGATW-S8\7\Z=@E-DI";O@%G+"UV27+_(:\N0;4"R9 9*!Z
XM37%OT\5((8?BJ4Q%L%7EE*>,9/""CBO!MZ!DI^S9Y9V,FP3*NAEG.P(&AN(B
XM0PFGE];&4+]@6 QUZ,S>(?2LYO[U6VZ9=:5<6C,80TR*&&T'[H7X\/B4T"?Y
XM2'S" %4))WQ'/.$+"=_"^5BOZL'C32\2O7/!U.<8[R6W _.P.'&_84N]'VY
XMA*ULI YM"A%'(?@:/B4E)264?' <8C@?B2[TR;"FH:\0@;UT1AQ2;Q"FX HX
XM#7&*)M&^UR$IAVKP1PEZ<B8U5*,X8@5HUF&Y>*:B%S'4;2/T-A\'H5O6M+MQ
XM?$79/=X/+(Q H?"IN=+E)MN5;9^K%;L80[Q2178*+83U3?PGP8CB&A**'5U?
XM@]$/.VR6&S#"G[J7$OP8R?=^N 6#!V5/!H)DM1CLD7P*(4L'HJ,3')<-K$">
XMDO @OQ0/]W&H(@4W]Y^&926JGX PGVA=%%7<WF^C1"V*S'$NKX[LMT:2+*6B
XMQU5W.&Y*^(]SW?5UX3H4MK_7P?$BQ84A5%C<.FF!,V0(=9F*BI6AU0RT@DGM
XM!@V-$-P34ZQ@F0I+I[Y#V$N@"0>#H,%D"!P"E.',W-Q<M$,U*G<C8<59/%0<
XMYYZWJG0\:1=]-Z$KC0K:51<;(B3NG!:,F8C$B@YG*%*0;W*<&4[S72=<C:L<
XM+DDWA0()P D@AWV\I2V\=CGA"QH(@X@7.C:K8HD&I6I8"H[;&P;)\WWY,.>
XME V 4_E9JGR$=X$3(%&+)GP_-_P$O^!:FM+JA$%;N!H^-RN7# @.=<0D5*0(
XM7V4E*G Q9AMNN*]%6=%P8D[$'+:D74'F@4>UA<!D5+N('"A0%S5 0$)4A7*=
XM!0_K$A=_@+ *JJ7S:3BCH2$Q)&3S/=_LO#!QU.1B[.&(3*L-%T)"4G843YTY
XM@G@PE)HJ'E$O19(^)I )1E1(:+D"_MBGZ/>Q+U/*D"E/*($!MPAH@$0CM-E(
XM:Q\C<W-8U: 6%)"9"*)N@"+.\E3J&\J<*7/XLJ]LBB&^S>&7J-2K=C4>74IX
XM A'5&_&J TF1(N991<4NRLBB#+JV/54)&V%_+R?+S\GD&DP_AU+6 G^4%#&I
XMTVUU@0[WM<'9/"N]>T,3MBPF+8<CX9=3AZZK([X.W6&@AH =O+\.K-- !UV+
XM"WV5,=8AS9!<P'<D:N\H=5[,(?(AS[B-ERIY?MH:B_L8I!2**(->Z^VCP-;M
XM"$AMMPM"$^X1HU]NAM2W$2B?IM+8X:HQ9(ZT:1 %T>P]))B,$WZN)EK-GES.
XM9W(,>M _;'3:(<>VK[D3+W 0$MT#46O *&N@=(N&O%3!+2Y5W(X@<QJQ;D0Y
XMO#+A BST&*?0^%VRLF\^&-UN9(0MA?X)D 4K[\=N;1YVV)8>0JIFR64.*?;D
XMV#@UNEH\*AJNKF,A_F.W8RMPC_UC0QXR"_(D"_)@/;5"OF/(@XH!>1(#\F#9
XM@ /Y4R /*AWR)!WR8#OM%N33@3RT@DU & &G!QK$-"HQ\6@!#Z&?'SZXW-S;
XMQAY6^#N3C00D@12XB)#8P0)K+G_<X4FIU:'&]SB9@(3MI&&<)_0"2G30JFPR
XM13I8#Q9, &4T>&%L0H3'^,_!B!,'=XXX(([^M@RKP7B.&8QG<(0B ,]Q:^CB
XMJ[@P&,\%CCS^6GJ9!'_-$%*<.C6D.(WD [*<S\<B^394.#F0&OGL@H5&^A%"
XMR T3/X>H4J#25"DP4D6W92_@QWB'BRKQQOK9!3_F=Q1Q03509T=#9%5HLEQD
XM<NQ'2.]MIWY]H;[#E^X&,Z[_*I?ONK@<.MHE3?[H,E(- /E#( 3\R*2 PWC
XM']7'AA_+7 +'%4?"J6D$ 2\+&L:"AV%/PY;KRC91CX0"SGA(>!KKD6%#7M4Q
XM-L> I>AB*P/HA4Z38]3/KX<THHS',M..>)70 9#[6?>T2X\!&$6-"J Q0 ^'
XM0 ,ZWV<F01O\PH8*-*-VCZ?732RZ[X8&S_20;D0GEFB 73*<K'XPFB$7AF)
XM%%%'=4C;L1!88V>P8KS&6'R][]])&?T,3.*EIWK_&)FJY-3OY;G.599$*/R$
XMTAH6TY\@VN,[F$I3AHB<:,N$I(5>Q>5+Q2VABCC7F<'$/OP%*0C4&.PX%(,I
XMC:$8Q,,H%",^!_4+6)/XM; !5VKBZAHYB<P15L?Q:+8Z) J9B8H@G4"U.(V@
XMN4@:6L0'24,#IZ3BE@Z29-# F6X\@Z.P^F$0L< &AI#B&L.O-&(:FT[:+93
XM%P6C&SCY!BA-AQDL&$D#SWX$2,>C@1CT'!A"/'BA0<1MFFB5T[PT_U"&,I0:
XM2/]Q:<- "A2).0]XSPM1004#HP)![!9R]&-#(V(5%'Y<V])H# NZ$?83B+.[
XM\]U HW^M93G^[MRN8*^W6RR&+=FU!RV&>_79FC9N@2>W&#>V4BK/5H]W@U_[
XM4 *00-!\\ZFA@ >$ FA'>(R5!G!P3%"H5];&N)!05$BX0V0.I/J-$"%QKDCE
XM;J9CL@':W\68 H(_@!=&(7(U2"R) \<1N4"#1!TA@ 8%^TA8Z:#;'G51&F%\
XMF%; V7%3,.>II9 P)208(21( Q+P_F0H>S)X=S*1CL8GX_!DP'&=^)(1MF0(
XM5S*(IF2PGF0DU@2,"HU)AL*ZJ%#4 9"JD %>O <$6@@FD9^%CELC"*02&40A
XM,D1<'S)(&S)P+F28"1F\!QD,N:_"5! ER$"@/&@),BRN6U2&E68L_F/%).SB
XMH*.(BV]3I0#!3 &*F *RE]CO*U-HQ(C]0>^-&-$RBC =&"V>!2XQ8\42."I
XMS\NZ0PM3FX\&)7107MVC S&E9N!+\UFQ\W697=QM+@#CB":QA(;B<R>[RC("
XM:'Z5#>H#@&ZR-RZQGNEOSFNX^.="H(_)GE"[:?N]N%TU]\GQ+OZ GP#\^5A=
XMMXCAKONL QYW%WHU =3G7'<5P&%S8/WCYNCPP-;GGSO>)F"KU[A0XEG"E5#U
XMUWPS+N?#\J)K1I_#(B^+,.;T:C_RI0Y,."]ELA^7C"YSO93'[F[\$*LG#O5<
XMI59Q50%3.Q'[./-?T6#-;$A<$JD,G^M(3U:XCN#'PU?ZD#S!Y@*20Q6B'4Y\
XM"0E98<UP<* WE/2O ^L$!F(,N%2DS7F<"P:\TQTV-U]Q2)@7!+4Y>#LO.(<,
XM>GQ"B:]<#M 7XC73$"C0<#\ZE<C4#"- UW=4TL[08T:VC!#TB==@:?,GP',F
XMT'']$GATLDB=Z1*D50O>)>BYN:+5-'Z[P/;T.SPK 9C]J37QA=Y5GG>Y#[*F
XM9HV7[HU!6 * Y[5"=&R[2[<HZ?H9CL #)^ &8A2S@:/TD7NMAD(_GU6NJ!^'
XM7][K=_[W,,)#QZG:RDGE;E@%HU&E$*B@M51FH6-@=X'Z!1%".?QUV?"DQ'84
XM08J 1N(,#%-]41]B &C8XR&01G[Q# C4:=@FZ<B>'91LR#U BG,-E=:#!3W.
XM%,(C 6()#Q+3M6L;N'4J= U&<HY"MNJX1.30!5@7!Y>N"BX!$]*@)QJ1Y%<0
XM'6/QF3(!87JQ\8'_(4ZU61H)X_./9O/5&TGAB]$H-#$HJU'OZEV(<<MY@'6T
XMG0M% H-1 6#4!CT]NVF?6RV[C91,W9S]B$7>ZACPRG0$F/.&"""JZ>0G?.I<
XM:[,K&]/ $!^AAV/7@V'Q*7(AM YMV=#W$;+YGK4+6 0-P>FJF83Y-K \"3Q!
XM$S[--CX.?OVP 4YKP]T,)-.HED\)/<4SU/5BZ56D@(/JB!0XFX>CX#XG6@4)
XM"8EC+IY"X646!!UFZ*+S<TGCOAC1U+D0DC["T;>E5:* E#2@:%8H&U+2B+]C
XMQMOWE$K#=%Y'B$Q]S&>U'N/Q@NM:OM957JJQ?>6)<%-J\YI,H#'?Q6E(IB&5
XM!IRM#5>S$+@J0II] VLS?)!M3GI[&ACT)57\V$VA"[CQ5GMAE18I?8X?.X2/
XMV/!"",CCNILOQ/L,Y4(T- H!(F^["K\% &X]SEOL N8%K.'DD?5U0FVED:^
XM)MHR Q;UAP_:@\(?9PB4$=,5X2,?9U(XY(T*\B$J3 D>H5^]51P 8AVH-IYM
XMNRSQ];M-0-NT8KR%^SAZG1L24S%AXK0OA 76S$40JSB<RR1X780I+53SZL!$
XMXJ;Z/DAJ0JZ?2>X.WXCC]F@PT >#\(H@650HW=,0P+K[W=&8$$IP3%) 77!\
XM%](I05LE5)P0WDR!2P%&\%THT -:9' H%Z10XG.I#@?2Z8>XPJ.7YU,=7*1H
XMM?0J\^XNJ/[J'$XB10+<DB>Z&+<%;WD7YM[KB!"4!?^A- 8MG2U6++B<#4;@
XMN*(]Z8CEU&QU9&&4UW7?#^#&@QZ?"V-DQ(9#EPW&:FW;R^;\PXFUP@5H#S "
XM<@O28O?*/EJC8&]YC\#D[^.7ZY_7(;?OK6Q([+X5VMCE6Q ]3, 'PZ<93X-#
XM^%%C(;&]Q)(F'-'LQ[)Y&:XY0,=4-MUG>+=@%)>$V!F#DNO@Q1U_LVGE]7I>
XM_H1]=ZFY)>!B"$0.#,+J1YA^*'S-KV[P5$T%8ERW14.RU+MA2!K7",XJQZED
XM AV8[SB\S'S'5,[2,DPIVG6C*S!>+/NQ!]%[G539$#X,81K"N6;ITD8&]3ZO
XMS&4R*-RBE$/('*= 9M%=)%A>OODQ$]WBD.=3W/G>76.E)F!(LH%VG2J,3*<R
XM<JUN)[N 93! ROQ&\GE"M6"%*O)M$P1UPO&/1BE<H9 ;GJF%V[@ J)3"_1L>
XM<3@MN,U.S#@]9"^L/M(9)M9G3A3ERWI:;E0V[%M4#PZ<B,;R'+[Q/.JC2"\I
XM^+$LKY0(IKGF%,@$Q6?BC"8HIVX"!L1^G\TI5"C"5U9O;*MY(4/)^N 6,I8!
XM1*!/-6U<K;!@<M7J=^UW^T/V(W=0V++G)M2&\ :J9%WVDJ928Z\ P\27 E8"
XM24F*V$U)@3E/0<["4TR*\)WF^!U,#N!!-#M5>!'C) 5C" 5JJ+##]B="BP0)
XM.5!4W$NH,@$.<\4WD/A-_J'?$DQD3DW]AB^Y8OYZ>CW];*+^.W-'X[&!P"W0
XM5UV0O;85G%(&,TO\;A8)?5-Q%F&.U YB*OHKZ[L?#J1M+]R10-DX<^2/>7.[
XM2.M'M1!A,14<VB# Q_@#TF5BZT+3CGH6+NA#/0T$K/&) [7:M6)&.&^2D(<<
XMXHDT"14?0(ZPPPY&GH<.X=Q\D9TO"G2#] 8L#,L< B9>7#N8,?["G._P>.:"
XMQERA;+X7F1?SW?*-2\T"7BB9#>O;2,/L4'JGCU!5INJO'?N:^&NYX<X^$2X3
XMH0AEJORBO"&A36PLD$AD#X?B$P195@_%2/^XX_55'!<+!'.SS! VX%,]H)ND
XMWI1Q!%0^-KK\51OIYBVCA$5*W+B<:E&[QY<2F!9G$45S?5#ZV)OV08UA;""_
XMV%T^=A<K5! %P:]2HK$U$S2Y:D@5(]:0H2STLY5:1SH28'8,:!@>X'DU* \=
XMBV6K@]-*W%97/Z-.0]K^Z50%BT"U*#!!T2QH1I5( M)B%ZHK2&N?CQ=JGH&
XMV8)& V5PAM(@/!-.)\)RMU!R$0(+:*I^3=]I2MWW;O K%:P2S#WI<*L)#?\
XMP >4B#NN<;TO4(J);C0VC<8Z)# !RI]7&#'HO&"\;[LU3A4SISNT/1M.=\A1
XMG^X .>IWVY%;B+.?\S.?"_"08AJFVM0%+%I>0*ZHK<'(M&$6 J1H@T;"5_74
XM8XW;5/)/X&WP<:E)\3K"%0(3/.8WW,OEB":[?I]/N%PIF+#P;CK2?AK;;L14
XM)G>^Q K8CIRP'92@MS-ML<-SQ Y*&L2:8([E!,U&HVBL+%?YWOVHWT[ USU^
XMC<L<M3JOI66S*"A]D)@=0_G@L#<V*^/:(72-17CF*ZJ-#LN#:HEMMWQOM/LR
XMI4=C<*AD26 $+14TTX.E4[T:RT?B@)3HC0LQ,YKJDH2U-*[!F]"LN&P>ODL6
XM;I<?#!QUQZ42JCH(DLQ!J-KFFM[;%K&\5@OX)AY7@!TGRFZNK=<SLJ(%0.-P
XM3+[5>#JQ6"CE/G+"GTU"'LRL"=I8M^0XZ#%-F)O!I*^-H7%/'\IEI.M#&*2"
XM0']>XKC:"#,?@36Q&DYR%1ETS<*J 25:E]HA!A6JLW3AT%",]@MC:0& ITFP
XM2 PXT;!<H4&: 2+56)1K%#5> !P).3>JD;#8S'S368SL4_< #'M @R!EH@@O
XM4DQ5E'L?\L(;=_E&?]EE9O(Q%P5.'X2@@($/H.@#*-@C]1.41P#P$8W/*@&=
XMJ!UZ+M(F()1<S'),% #&U&0'-B(IB$AH$(I:2$]9"1PQ+%$XLJ?B_RJCW^9
XM'YH,*N<P>]W(*+AN$+B4SN<X;'A*AHDIB#5%G%(([1+B;P$,0D!OXNI'?IK[
XM)@3/^A$]\H]H1E$Q)\?;52K41 LA)!R+$$TRM *>KD9X+2 G@,$Z?,,ZI-&8
XM I@&4$L#! H & $!@;1=V$F4/% ( -D# - 4U)#+U!#7T-"4DLN
XM0PT" 1(C%!4V-VB)FML\!082$T3%]I;W1Z9U.Y9M7;)E0?(<^Q9N7KEISZ*E
XMZQ*MSX8*KI-WP]*E.Q8.=7BR;^=$M^!Y]ZU<LB#*'ZU;LFS'BI6[%F1/D#!W
XM@@01O%^J!#D6;5BW9\O.!;&MR\H)WVG?NDG>9D&D[S+U"WP$!X]^#>NR88KU
XM7+IUS:SO-,)'OZ#WW+=L[=0'7M$EO]^V+<.MWO<9]"!^$3?1]M^N+?,V%;?/
END_OF_FILE
if test 55800 -ne `wc -c <'netramet/pc/NTM.Zip.UU.B'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU.B'\" unpacked with wrong size!
else
PARTS=""
for I in A B C D E ; do
if test -f netramet/pc/NTM.Zip.UU.$I ; then
PARTS="${PARTS}${I}"
fi
if test "${PARTS}" = "ABCDE" ; then
echo shar: Combining \"'netramet/pc/NTM.Zip.UU'\" \(264641 characters\)
cat netramet/pc/NTM.Zip.UU.[A-E] > 'netramet/pc/NTM.Zip.UU'
if test 264641 -ne `wc -c <'netramet/pc/NTM.Zip.UU'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU'\" combined with wrong size!
else
rm netramet/pc/NTM.Zip.UU.[A-E]
echo shar: Uudecoding \"'netramet/pc/NTM.Zip'\" \(192048 characters\)
cat netramet/pc/NTM.Zip.UU | uudecode
if test 192048 -ne `wc -c <'netramet/pc/NeTraMet.zip'`; then
echo shar: \"'netramet/pc/NTM.Zip'\" uudecoded with wrong size!
else
rm netramet/pc/NTM.Zip.UU
fi
fi
fi
done
fi
# end of 'netramet/pc/NTM.Zip.UU.B'
fi
if test ! -d 'netramet/sg' ; then
echo shar: Creating directory \"'netramet/sg'\"
mkdir 'netramet/sg'
fi
if test ! -d 'netramet/sg/apps' ; then
echo shar: Creating directory \"'netramet/sg/apps'\"
mkdir 'netramet/sg/apps'
fi
if test ! -d 'netramet/sg/apps/snmpnetstat' ; then
echo shar: Creating directory \"'netramet/sg/apps/snmpnetstat'\"
mkdir 'netramet/sg/apps/snmpnetstat'
fi
if test ! -d 'netramet/sg/manager' ; then
echo shar: Creating directory \"'netramet/sg/manager'\"
mkdir 'netramet/sg/manager'
fi
if test ! -d 'netramet/sg/snmplib' ; then
echo shar: Creating directory \"'netramet/sg/snmplib'\"
mkdir 'netramet/sg/snmplib'
fi
if test ! -d 'netramet/src' ; then
echo shar: Creating directory \"'netramet/src'\"
mkdir 'netramet/src'
fi
if test ! -d 'netramet/src/apps' ; then
echo shar: Creating directory \"'netramet/src/apps'\"
mkdir 'netramet/src/apps'
fi
if test ! -d 'netramet/src/apps/snmpnetstat' ; then
echo shar: Creating directory \"'netramet/src/apps/snmpnetstat'\"
mkdir 'netramet/src/apps/snmpnetstat'
fi
if test ! -d 'netramet/src/manager' ; then
echo shar: Creating directory \"'netramet/src/manager'\"
mkdir 'netramet/src/manager'
fi
if test ! -d 'netramet/src/manager/include' ; then
echo shar: Creating directory \"'netramet/src/manager/include'\"
mkdir 'netramet/src/manager/include'
fi
if test ! -d 'netramet/src/meter' ; then
echo shar: Creating directory \"'netramet/src/meter'\"
mkdir 'netramet/src/meter'
fi
if test ! -d 'netramet/src/meter/include' ; then
echo shar: Creating directory \"'netramet/src/meter/include'\"
mkdir 'netramet/src/meter/include'
fi
if test ! -d 'netramet/src/snmplib' ; then
echo shar: Creating directory \"'netramet/src/snmplib'\"
mkdir 'netramet/src/snmplib'
fi
if test ! -d 'netramet/src/snmplib/include' ; then
echo shar: Creating directory \"'netramet/src/snmplib/include'\"
mkdir 'netramet/src/snmplib/include'
fi
if test ! -d 'netramet/sun' ; then
echo shar: Creating directory \"'netramet/sun'\"
mkdir 'netramet/sun'
fi
if test ! -d 'netramet/sun/apps' ; then
echo shar: Creating directory \"'netramet/sun/apps'\"
mkdir 'netramet/sun/apps'
fi
if test ! -d 'netramet/sun/apps/snmpnetstat' ; then
echo shar: Creating directory \"'netramet/sun/apps/snmpnetstat'\"
mkdir 'netramet/sun/apps/snmpnetstat'
fi
if test ! -d 'netramet/sun/manager' ; then
echo shar: Creating directory \"'netramet/sun/manager'\"
mkdir 'netramet/sun/manager'
fi
if test ! -d 'netramet/sun/meter' ; then
echo shar: Creating directory \"'netramet/sun/meter'\"
mkdir 'netramet/sun/meter'
fi
if test ! -d 'netramet/sun/snmplib' ; then
echo shar: Creating directory \"'netramet/sun/snmplib'\"
mkdir 'netramet/sun/snmplib'
fi
echo shar: End of archive 1 \(of 25\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 25 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...

J Nevil Brownlee

unread,
Nov 6, 1993, 12:37:17 PM11/6/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 91
Archive-name: netramet/part03
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/pc/NTM.Zip.UU.D
# netramet/src/apps/snmpnetstat/main.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:05 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 3 (of 25)."'
if test -f 'netramet/pc/NTM.Zip.UU.D' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NTM.Zip.UU.D'\"
else
echo shar: Extracting \"'netramet/pc/NTM.Zip.UU.D'\" \(55800 characters\)
sed "s/^X//" >'netramet/pc/NTM.Zip.UU.D' <<'END_OF_FILE'
XML(S'?$W0]\5I7UCF7I5&,%):QHG1?A1@[N?])U-I;G*F[@^#*^Q7/U&[_6'D
XM<6A8%M!T+H3U) U 5U&)>AZ>YGFXW:',WON$9@UW"! G!3\$:1A\T;V%+"]V
XMN8#Q+0A&*L.M[RL8F9V#GO*!M>PR'VLPW\8=YV/,AS>8#UZMD>RMOGQ6^FM#
XMEW%A;GY.EJJM+*R/I49A#.-S033KF+1@3,S8:85X_*]IP?B<0_B(DX]_80IQ
XMG2*="V@*R3Y6GP N?E/-&$$_O[7-1^/!R^/,QW$WM(QNX>*(^;K7:@BNE'<]
XM]_6J'K[,4M#V<+"<V"NLO1:956V"?$6D]:]&C$\,;WUN_WJ';+Z/AG1(=!6K
XMZ]V8Y<Q,,+\9XUR&[T=7^X.^B<_FASO[2AG*I33\)"6E[VRVL#!=ZQ>B-&[N
XM/RE0N($#[9LLB_9K>9'YG _XS@V?DI*>FROP]9W\YE6=VG=)S>5) J C"Q5C
XM,#,A5WP*0&)ST8U#X-,< N)!9$>R)"R?S:'6XSJ=!B.,6^X)B9!(^^G:&A*%
XMD#05G53NIWYOHGR0%D[<-4)X"\K*XX'74:NEDY @X1&N0PDH" R!6!6"JD2J
XMP"$5H'.1"M"RS<X=JR7LL/']$IDN@"KHL,)2&I@"G@(>I]6!KY(*M+/0ZJ2*
XM6*,P&)]T8[DML;ET&#":8TP,U*R);WYX2.%6H845$H=UCH/]UJ[SO*&P%GO<
XMAQLS4#>U&<4'PW,[/,X\15-@P@PE5'%E!B"0&7#*,Z<,@)P9RGFU9@ K=]Q]
XM5ATA9P <\&"$S;Z+ZC$ .F") ^8O5U*_S'$-@=\HE^H8-]EC<T(E:1:5!$KO
XMA.N:PW5<YAJ"#C?951XF]?U>85@-=^.P*%&LB-Y]IC*6"42%A@(PT5$.9 N,
XM QVM44M*00>&3E#J-@0=N"8X;,$E3*@M<ES>%R4Z0JX%9O1+TF'8!GAN.A"!
XM&43HFQ[39H U,CD5G(&$,C%]!DPH%L T3R16)DJH04?'X"WEM,#G<UH +T*'
XM5+30 A2Z/8;K9@TM\4UU.Y(PU-'".0<,;YJ9!I[ HXS'T"RA.\S,0L4 0JH
XMS +\<2LY<W!VLG[(+)"<?(!7:PK*!T#T*@YV*$L'6LYADQ.EV60P(@=!I%$C
XM 0S#6>>XEP L2ELG)\Z4 +^QY\$0BA+J*Z6OC7G;O)@%] B @S[1^*.XN(>#
XMM/JJHP .( Q:1*R]]VJ+A205 @1,!-%/" ;;!61<&4CT 082$MK%#49"$%$&
XM'-%%]W%I>^HEEH%4V"#EXPSWX_<M@>*U"$8#"HU_=BYIKF06E#*+^7VLUR[$
XMTE6KJ:C_H!WQ#;WU]MKT $<<#$'AS .%N5(&52YM.P&I7*%AI?%^+"A &XA
XM(_I/'$0 6P*_.T4@GA"=**GX$8B: ]NC:[+O@M! .GB$7H9+!,,%)L,HW+9
XM"0;)<JT1$-:F5SU-S61'UY*/L26EN^%"^*[[N6ABRST"2![AQ0WW$_XJSV6I
XM%A*2IJ0$(RD'!2+4,11H@+.7H>%EI(4#@"2@80X.. M;0* +)*O8!=J@;@XT
XML08]T<*!$L#'Q0[*37>\ $3\$!HFZI[BF!"PWM('!\:S<4=-6A #0A8(597
XM<Z[ZW=X@%DP1NNKYGW4^'1!/S>51/*6[*1]#Y@E/-#H>M&&(T$-&!"#:QE2(
XM4*0ZD/3#^9,@,O)C83HJH5.W9K?#,'1P3C=5)\UC2@/-X\2(R>UAMRWW>%T3
XM\I5^*1C1@FD$3!B"%JGI2<A-0B/VN[VH$?MO#]2*SO&T'W1]CD,N0#')[:8J
XM3.36N*9'@,!%\O5^>4R-?%/3$-<AN 49+Q91K&F*$(A@T+A!C_C086E 8=B'
XMQXO&'^SC8!GFJV#. ;V/0<$/7KAA<2.0PM>UK],H$O;$ZO4U6\@-7YW18/03
XM4$"+]:=36\1P;P0'N*8K<;:IE4F)&TO>8*.R/\0J'X$';<;7"0,/B>")FA[Y
XMTP+9(X]EKYR%L:0\:G,.2T49'-[B\$H5I<#<9<\' QR'=45DJE&$9]-J @GF
XM$)2SRP3Q!J47D2U4&9Q1NK):$^'#4,^XKLI;D(:^REMH #H=;F\!&.;C: $:
XMRV1F>H%V1"*F8ONJ*&0D;;4 +<XLY A38 WSW/#IN0)0X)!E+.@A U&[BQZD
XM^:# 8M*?6,;E/"P8.1]P.!G>EVA['TGRD=+DA\@A/Q +$2>FD*?#@RTY6QT<
XMU17IU!"#X-61['1/&=-*%7H^)A)Q>R%@2+&%/;0<'9HBHZR#-\U5XK@0.'*:
XM*WLLJL)NQ!!PH*O/J3,$ZFC2888 ;S^X-03J1KN $<'H/ Q7:PB4P8L&@0R!
XM:G@)0.U7W6(*O0A# ##KJ%D37 AHV-%U;DZO>FR04.8V%P:\S(./U1B:6'QN
XMN@<2@AS';+%*=*3A&X*G,7?UN!G&_S2(4[R"3*4Y6SV3G]&\%FHI/C?6%6/&
XM.1(2 K!$YQU\1?@^+_)LI5/'$T<H0PXW.AQ)Z(]D85S@Z*PP),"QW98*NU%@
XMA901UV470NW3:)@@7D@HN<.7'FVZUFQ=W",EOG*=MX?&8:GE(0^YZF$N+_S"
XM%9'T8E%^??\A&-=!RF7O[T/M4Z^3A=)T-AQR,SY%7)A@\8KCX84@1QH*SRC0
XMZ,8J9(H"#A8_?29>4@>M=%,!*\VPS,0->IX3N",PM &XEKNU5JM0BG:%QKQR
XM52M&ZV\8AS=M'G49,BQ0K9QBDL>A1VPGI@Z&)#PXV)%"!"0Y#QQQ")=JB5\@
XM&2"#GHY$'6X6F&"9LL3OHHUD-=_4S*+!5*)*:V)D,#FHON09S& TE@M#-_E9
XMN0#5T/)!^WN[HUE=XH8.;12&CI"]& S+XSW_T,P.L=[0].MH!Z<3U2EA_*T\
XM,9$FH?*T<ES$99SNR& ,NFH=R]4ZQG7$E/1<\&/2705]E0E$$RN%1D[,KBZ
XM4*)8,)RR. BR&08!B#JCP&(0LC(UF!!.@ "M (@VO 5 (%!5J!J$,2@2N8'
XM K"XO$&1Z<)XPJJ@F_"M('TD&JO=P5".51]7K!4N.4 ;PA7U7GFC'9R^8GM%
XMT4Y1%;:DV:4IC PRGQ;^50P_7;Y(O):'%-(K=$N\X"Y+D:#=^4IRA-"VX&$*
XM53J"4<VJ.,**[P:B3J->]GD08TAC>+,@5[,EM@@X5?N8IAT\@FZ6TN05V80#
XM))(Y<@G)LL/MJPWQ':QCX5BXMD0Q1W2U@"FDT.88CX)4$ZMXC6O=95(:/B,E
XM&"FN%1UE'G6G*V:V\:P8LN,**2%5E*E+5?IC)2>V6[%^*$,9RE 2.M,R=#:5
XMKRK8!?7C]Y#VA6AG\YNSJ"G./.=0<AP9$BZ4,[!.PN;XL"HS*$RH+'8I )=S
XM4:SA:&6OMZ;GN.83ZB1Q;2>X2>*RJBJ@Q/*K/9@8(^^0WMO^X;72C@8CN#%F
XM1^/1Q=5MZSY3L\$=9J]W\N;F"OP"R$SM"D]KC?, H5/=+?-M/AK/@FJVB2H8
XM<D@Q\GZWVH31'X*$\&FVZ8"02K(6.))42V1L.7B'TQW3XB/)7:KF78('C8(G
XM<GB5@8!9T<%2GF6X..(MPP6.AHB$/ 4[A)8'[>(%&@4'&10-%\'J0HNA<9WC
XM4D3PAQ!QL7Z@ 4EU%85Y#(AH(R8)'8/O^D1P;B34D5*%FV<D5<U$>'-%**"^
XM"052BXIBA1(!7 "8FOR<N'JUXV:O!Q40^C2$(Q<![QM_5-X/*Q?*WE=5+A+E
XM<0>"87%1?RPND/)^P &AL+BH$8$;*BY0KCX@X&*(=, 1B/$'2U!+ P0* 8
XM!@#8B$T;TV<Y:F4, #2*@ "P %-.35 O4TY-4"Y#80I[!P8;!KL,2P,)
XM!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&%00&%P4*" 4&%08*)08(!Q@*
XM!PH("P<+!"4$)00*!@0%% 4)- <&%PD:*_S\_/O[^PP++ LL"SP++"NL# $B
XM(Q05-C=HB9K;/ 4&$B,4Y?:6]S%C%17_6+]]E4OG_7OW$K]O"3_Y.9[J7;Z/
XMY2=M^[(W]O,7=E)&?Y(;(Z,@C^PU>&,6%<>,%4O@ %94''>TE\)M5[6R_$GT
XM]/1\A3?Z;X;[HV<[[NIU_^3[//?C)QY7A'M;KR5<4;'\_P*'')_G[UB^Z^_<
XMZ[U%N.M8;]*]E:]UO13_LO]YO?-_0_WG__)>OVH._SGJOWZMRW8UY^7^2^5:
XM_[K7EOAGNW&>2_07%=?WQBS2?1;*M[9O-C_<+\U;:5^=[OAKJ>SS\FOW_0U_
XMY=YNREW=GF.YZ_F$O[3M$:[Z73?^SX+PV7YSCW![+ KM8U^N!LLOE>YG^]?Q
XM']3-\Z][)7[@WJ+BYKY4#&^Y0R,]^K_$/HIZ6%'Q.I=*^[9<1_6[#LM7/O,L
XMQU.^_U[[H^1$Q?<W[Z)BP;XNL]1%ZN5:#5^,OC0WSZL!5,N_RW,=+B]X+]LL
XML5)^UL__>5O(6M;2W;AJ5R/_QV_7LMS'+VV7ZJLXSOM?LRJQ#@?M47\\2&[_
XM<;__(X\[G7&O-7C;/_*@%>5WWJCCSO"WNK\59=#^[6Y*B^B_^7_0&_43AX->
XMU*)BMW>0G-0?O$._X]V4G_QV1E$X_CAUT!^T0OOCWO"G#%J]M]T6?'^O^]\P
XMWE[KMZ,@?H\Y]?W]P3BU__Z4;D?LA_;;2>]H,.Z+O<-!YQVU/LP?=7OM-T03
XM\3[-_\-Q\CBJ^=OAV&3?XQ(YRKC5[AK_CN1N)_9;8/NG=+K)O]]M$RV);<P]
XM'+?&J&]2I\NSV_E%Q9&CO*TH:A]ICPG^J#7H]KA>]M_J</S\WWNC]@=1W][H
XME7N[6D^KVX'ZB6VPJ^,?=P9M\[>;V.)[NZ(/XN^]I#=RQ^X[K ++VV'?R6/6
XM)P6]4U2LWD+E#>0!B, U)GPUF-3OVG60Q/?6VVXI5E#^=33.N7[_.,^\'N52
XM7B4.RUW3^C_,0>]M#49MI^/5>*,'[J0)<@3R7TB.J)6R8C;*]?+3V'::0Y6:
XM<XWEB.JYNU[O0]D;9?H+$>=ZX7Q<X0M^R$/^0RERP9H4%#B>A,0:;HVYA"O=
XM:UXE+)?C1MMIC7D=,-?:(;[V$DUBJ5HTWI]K,&HQG'^\'A.[(2";28X4LNK;
XM#',I7TV3*XQWQ$;%UYO5GNN-6'JV]8X8X=DB[J7"^K,\^1_C)?4J<1KQO ^-
XM.\)S1I1>-4YICN?_T]%;Y%>72@& Y<W'>EWN[;M?C-]@]'_,6&"QTU_:KX/G
XM-7"G=+LNS[8 N-V;(70W%CPSC.]^U>,ZO+%()L&(XU'\ *%3KLM5MWN-_O4T
XMH8SU+L1?[TBU%6$24_!6F_F.N3HQO/A-#6^&EF!$,.+Q\ATK9/_F3O?&<MLY
XM^SH?U8)?N)O7S7#+7< S\*:MP4AWN,V@6 ;#N\ TPK?)N-V;_/MH[+9FI?[,
XM-:3&8)9%@Q'I%:OYF,M-U,_WG.B]Y[HR[=IB;E4S'='O57U"D&JX[2-T)>RH
XMG](<A_\_S6 8XF&QJ*YFZ;0OFX'7!.,U^7!AXJB5^ZG?&W'4D"N?8IQJK 4<
XM$P6OA$\:D)\"PQWW[72ZG<(X<9#>N-N]S-N!\YA=@Q[=J>C)#V7:+U2;"PH)
XMZHBZEAGL0T"D&M';:JN3."*V1_7J>BC*P;#C5UURP#GZ8(6'AB3V!C#&;3YC
XMXCFI,T@>M$R^Q[6;&F)*YA$'0_"!HXQB6A*7/E\? 7DL#]-31O(03%_4F<";
XM2CT>1PF)KTY7LX?@>UV,$C#H/B[8:("TCPMLZ5/RPL.&.11(('^:1NRE &&>
XM8ETX0HPF E.:H$%/)W2M7+4EXK-M3[C"IHZ][@:]\S_-M;S/K-\[0&L]L&=7
XM6Y'=>GPD'\/T&?1X,(+PV,1"Q(VUG_#"8QUW/)_/MEV\XS^LM)\+W+'Z8CW%
XM\L.6<63Z)]Y=P6_SA=ZPZ0_7^?&5Z[P+Q>[IE#ZKNJ#]Z=3:J]N?3IU*_GUZ
XM\0<_POC4_Z)\0(<=MO(U[+ UD@8]$QVJ.5]GW41'7^*2Z."H%R=^7/CF#2T)
XMASF5:TI?2,?C\NA$\R*C Z-V"ATC=U8WJ>$INXF,:Z%C<&<)':9]#-G K0\E
XM;("M076-#7:[,!J@@0)F:0 H=D.'H'% U.=R.5Q?O,KGFN(D(D^,G $%7DU:
XM-BV#&E[)#0BLJ[!!X00J+&!HOPU?YH6Y^3E9\I["L#^66F$<RX@51+.II 7C
XMNKDG%#^$#W4]CKW+8_RF!>-2"!]Q\@GI@APQXXA[E.2CO?"OG5!T;03"K&LC
XMV9KJZ(#/%W"GMU$ I&+/5H%<HRBQ#>5UUM"@66<-#:<[S8?W%$8'"+Z+NT>1
XM?,RA 1!@0GFE"#7_D)-Z_=TP21*#+LB5AW:C4DBD8PYKXQ&T9UT'O=8;]>U$
XM,[E$'2=&?37.HVZBS]<Y;0V2B3D-LQW-H%6\85+;NZ&5(I+N\[=9B%?M/!>
XMV$P820%G *_1A/QLJ:N=8(KVMV@X^-/<[B<A&.D/[XY:;RNB8EQX/$@:#X=L
XMM-LBYV[2F#T./C!V/)L/\,X#ZS.PZ"G\!R,<P8DW.+4L>(/^,?]ZA?3>:TYO
XM <M B<6*#,PQGR?(@*<]-'+]S.>">F$*&K\)9<7>.&1G>2&([AY $-L$3!)W
XM3PLHOK('][-PL9_K[>.0%Q*YX=-59'L=YU43E^I(J9^2@J$(UF'"0_@<UWW\
XM!07 #2'?J-R-A/]$>*Y3VXB3HXB8XAB)JROB<*:$+6/@7 :<^0I441<JGH&(
XM2V93G$/332%NPE%U"\)BPUL 878I@"^ (>!#";RBWMP2MFQ/J5!;.R)K5!*^
XMA%N[5]WAPK:4PXWK=<DM]K;<I;B@1>->+B=1>V"B0+Q]$U%;4J* 7,)X3A<1
XM')9PCZDKGQ 9]E%Q&S(;S59'P(T9%":QHSC%.H)T8GBX[PCC$=BKP^#B4\0C
XM')J"R-A':>$Z--6A8WFU*;D48=;Z[+#=<?VV>\E)$97U*J"/.($<7**C]$7M
XM#?O".![PCN.IL]/5.X7_<(_J,[MD*1[;:(QKJ3Y+7)%V%)GC'E_)J<95RUS[
XM"-$7-#C_*WZ*B]GK'#"X:.J.PU2;4Z)$LHPJK[RQNH]Q#&^$*B3@2@%%BY#_
XM"ATUY*JM^3^ZO(P9'^?PH5T6[X?!W()]W<?')!T)>ERCY-M)A 1NG&N(@E8G
XM*6+G#=&(R>VH.(,4?60&;3:U&: M='#>Q=@2C2LM 4A<-#VQ"K ]&.S@]B98
XMTOEF8Y5.65!?=P !K:I3PGP'L.B*%-@=)]XAUW-$056.NP!Z@%0'^0 (PWWH
XM 3BA6.6A +!"-9Y:N!'>+A8QGD$NR@,$VPN,-_+0*'(3"3U%.8X]0- =]QX0
XMF!U&'R" >>Q6<#<]9B48GW P\1.T N/V!7"72X8#'!-\_%UPDA8Q<&!J"C P
XM#G6WE,02%!HF9&)J*H><306:MX6IX=(/4(.E^WM)N(#G1 D 56/]U+M!!_HM
XM0)!G7>=RR0H@3W.'0;YHH\IKJ\F\_...@P89HW.8Q@GE7)-8#2?!-DC^KZC]N5
XM/3AAKE^[PM\&]L<>SWJ#/XUE]D!,>WFTA2< _2,/]8).4C*=HO&)EJQ6NN)T
XMI_:%XS61NLCR<=)35SYU.K/R,:DCI).@:JPR"+/B*8<N!;+HZFMPH('%/?L,
XM.*@C>4;\5>HS8L[[YWC4IT-M!C<.:&C\"1(SJ]G"\"6NM<PS@W!#\KB48 \,
XMUNO/:8[X5FJJ/\#8C?(/.*DCS#D(@R82 TO!5LXWUF_S/*6GD6 +>F%MV\MV
XMP!35$\^X]"KRG>X"\SAD>RX[MF+>Q]VXU_79PGDB_!N<B*YY. \J&\[E8: 1
XM(A^T<,R!"4:N+/=XZZ<>0C/7=D?JZB(L/=*\4X.%^D+ FO= !R.Q*T6+V@'.
XMV5:W@Q$L).1TNXU=ZZ>Z$*[P>9#^D$Q"HS(><#H6<*I, !1*@=G]J@)&<D6@
XM,(H&[Q)1)!)! MIZK)*! L1 0J87YH$&9>(2YR.L26Z(;#)$CA0KG@EE"D7
XMHTF8BE66A(27B*<C[";P1"=X)U0L] #[2.^90H2 G0I=G52"7SG@^WO;]DU0
XM!DD\H.&N8A0*0-)02P,$"@ & 8 V8A-&US[;'4O%@ $4D \ !33DU0
XM+U-.35!!1TY4+D-A"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&
XM" H+!085! 87!0H(!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87
XM"1HK_/S\^_O[# LL"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W,6,5
XM%?]8OWV52^?]>_<2OV\)/_DYGNI=OH_E)VW[LC?V\Q=V4D9_DALCHR"/[#5X
XM8Q85QXP52^ 5E0<=[27PFU7M;+\2?3T]'R%-_IOAONC9SONZG7_Y/L\]^,G
XM'E>$>UNO)5Q1L?S_ H<<G^?O6+[K[]SKO46XZUAOTKV5KW6]%/^R_WF]\W]#
XM_>?_\EZ_:@[_.>J_?JW+=C7GY?Y+Y5K_NM>6^&>[<9Y+]!<5U_?&+-)]%LJW
XMMF\V/]POS5MI7YWN^&NI[//R:_?]#7_EWF[*7=V>8[GK^82_M.T1KOI=-_[/
XM@O#9?G./<'LL"NUC7ZX&RR^5[F?[U_$?U,WSKWLE?N#>HN+FOE0,;[E#(SWZ
XMO\0^BGI84?$ZETK[MEQ'];L.RU<^\RS'4[[_7ONCY$3%]S?OHF+!OBZSU$7J
XMY5H-7XR^-#?/JP%4R[_+<QTN+W@OVRRQ4G[6S_]Y6\A:UM+=N&I7(__';]>R
XMW,<O;9?JJSC.^U^S*K$.!^U1?SQ(;O]QO_\CCSN=<:\U>-L_\J 5Y7?>J./.
XM\+>ZOQ5ET/[M;DJ+Z+_Y?] ;]1.'@U[4HF*W=Y"<U!^\0[_CW92?_'9&43C^
XM.'70'[1"^^/>\*<,6KVWW19\?Z_[WS#>7NNWHR!^CSGU_?W!.+7__I1N1^R'
XM]MM)[V@P[HN]PT'G';4^S!]U>^TW1!/Q/LW_PW'R.*KYV^'89-_C$CG*N-7N
XM&O^.Y&XG]EM@^Z=TNLF_WVT3+8EMS#T<M\:H;U*GR[/;^47%D:.\K2AJ'VF/
XM"?ZH->CVN%[VW^IP_/S?>Z/V!U'?WNB5>[M:3ZO;@?J);;"KXQ]W!FWSMYO8
XMXGN[H@_B[[VD-W+'[CNL LO;8=_)8]8G!;U35*S>0N4-Y &(P#4F?#687$?C
XMG.OWC_/,ZU$NY57BL-RU^EW[80YZ;VLP:CL=K\8;/7 G39 CKN->2(ZHE;)B
XM-LKU\M/8=II#E9ISC>6(ZKF[7N\#U!ME^@M9MN^O%\['%;[@ASSD/Y0B%ZQ)
XM08'C24BLX=:82[C2O>95PG(Y;K2=UIC7 7.M'>)K+Y$_&TQ,;XWGYQJ,6@R'
XMFJ@UDQPI;Y?E_Q\SUA\GHMHA:[(>$^EFE$OY:II<(^Q7/2[B&_$Z2O-26!",
XM3(XOVU,B>:YCB=O8[F>Y(_*['QKNSPES+CW;>D>,\&P1]U+$4\M;YHSX/(W&
XMO:XF#VP[0:-[-=:BXD;EV>*R6-F/B/5[;6R10F7Z_J_*Y:J3/)HOR6G$\SZ"
XMD5'C0NYS8_FXU1]+M',M]QDNZKVDSC7ZBW1S<L11-SDYL3<P\QHWTV$:J[&7
XMR];U0F4?">F(4'_:#T$VTW&<',?AL.IQ;WOX<''R-<Y7!*;>X[PA&._'<X*<
XM&_MVT_=!SV01JSF=]:T;SQ%;Q^['B'U.'CN_/)_+-?7]@-V_,3O?&V\%\ITC
XMJBTK4-\>#",FCT./V'][/^P_\>H*O69=GQ>K;782J_0T$NXE(E]/==Q_$HYF
XMD?&A8++6O5;24@'?S=]8B>^'H,NQJQ17XXUUE1C[0I3SCU50FH95BKC7:@S#
XM(=Z*V;9Z07[!A?2O4L3*^4,B)'Z.U)6UNW)T-:]SW?@*\8D.5Y]=\F=Y@I%2
XM2&F'_3)?UQS)Z':OBZRI?SZ8XYS:5I^ZF66LLJM+)1@1OLUPBZ@^VI=ZSKNV
XMF%7+:_4_-=K'\L>Q>>-HGSDO6DW,9M@Z(DF9;F"%7KX%9 B7%V4J7+)66+1Q
XM'HH^XKHU9*YW>-!_X%\$O"/Z?)<O<0U&++(X7NM6A6N\L0H*M4J0<Z!J@<;$
XMROE8]LI:2%5J\_XI8CDD_GJ%]-YKE"<%/P1"P.U5[ =)IJU.OXSF7Y[+/W&8
XM]#7:8AW*A?>V^].PO.Z"']8W/]B"$*1]&5_;:UC.KVAQW+?3Z78*X]2WW5.Y
XM;GV!5/N;]#7:':<@&!E-Z_=YJTH[*NL]V[W,VV&0$7RIAH.]08_AUGX >\"2
XM L)NV!8-9=@J-4V3'N24[>#A;KND>%_>A7(:@BRV]O7\_)#-]WSK58\;V.NS
XMA5,<>Z<0#BNT/H5(2C.K^J0 Y=!@*_1$+%+;C^;.H$1X<,77Y*)XC'T)$]I]
XMV.T5^B<>2FK+51OSB!YF"OG6?-?6?-!Q_@^YP&@^[HK#NVKLB5:XH,#./6Z8
XM$9-2.N\K/H+]PM\I*?(/1 I[L<XQFD)R=45=RSL4>-,VE6T8X76%,BY5ZAO$
XM2/['&@E&<7GKIU[?@*QJNJ_[O#7 !=ENWIK5W285R,_Y0SS$0_P7$%H4R+-Z
XM(ED?! \40@*1\(3T<?R593_6PG8O.2EBDIFXT+'ZRA<K=*M,?8Z))9LVM%U"
XMR1UO5.Y&PLKJG?9SM3HZ;)OQ/NO>1M'-+<(,WDBBOXA#\PQ^=UZ&:KD ^_(:
XM=M@ZMD#HO4HFA>42?/<WZ-$9EC*(H1);]67,5.=_CK>%))TOQF6-MT#/%HU8
XM/6^N*[=-'%Z["\L1D,?M#9BR!2#&!M 0)NB5@]7&IY3+\81;A[YRNYYR,95.
XM\G]V_H\!1C__YR@\!'=NT .\\KKH,:,'*9MISM=9]TWSNE37Q<&$U.(XSXLA
XMSBU_U/*NTL,20>5_>/DPVSG)[4+,.J%Q[HV$@I@3[+AGD7S=L<EI04R3JW]=
XM@/V.V[V(W5'K;45LMSKYHEF%74@OP KR,8K(' EM$XV&DO5'LU&-L-/X"HI2
XM!V5F0XCZ(F:C "(V&B/T$-!F.A2,C:IQL2F;NXZM8AI0I 'G*E_P/"%T$'%C
XM(0G@<5$<C.LP5P&DRJTJ0+A8Q>2L?_7JJ.%>K^893A+G&9R_"R-,A)AU0]"<
XM@_EUUFK$A=7/HFA1V0?B#>F][1@5ER-<XLA^[VTSM0OQ7("TPRM:(#G6?(J[
XMPLG]WC"NE@\&"REJ1?9OH!5EN\X\*)^G;YUBTYC3F,Q32C;,_V'A?M7P-LQJ
XM<0L*68AIUL_(),%(48!)I>5>J,1#;I+,TPTYXPWQ':8VIEV*<+$O.YBM&F,L
XMX7J5%XBM>X3GO.KH;"I JO^3AD,.L1LZGC+Q*E[(.+INP/]**]7F_;7G.EWM
XMN/%PWN*@IWP*-OVA).BE_<KA;COACS@A/QZ_R:BENL:Q= C.@GHD))WM^JJV
XMN,>Y$*G'M'&HD[0_G12@'@*A%)(T?ULT5:'@(=>- GP<L$$RWI3#<!I*]:+3
XMC<IGWGE#-&)R.RH'OC1']-[0>0ZF+7?*L'@?O/1@B''FP0!]AUS%5V)'-1YB
XMF^4''.Y#;NE5%VBP)@-8(H]5IAY7EP$LW-6F0-H,8-3<X P'>70&4'(/ST"J
XM0(36S>_M\7ZN7<)-.ORJL&$)ZT+_XYU@RFZ><.SQAR5T9S88.WQ"L8BF\RC/
XM+9I/(-P'/^],"CT!S*XP!;P1/I%9PC<<*&UYZ"N/#M3,VDUE4DD-\3R?*NX;
XM[QE'2 "]I!D8;*,0M6 4!W,04\AN4R\#LW&0QE9!= 65<=0+?$,K'X'JYB:+
XM8) FKC$RJ4I"FWD*8N(.= 2&V0)A/^TD)[],@V*]*@V:,(" X$6:SP6%%L*Z
XMHF=VR@A]"'R/-ZDS2)9&'\;K<1WT6F_4MR,P@;77O?(CV4MB,XNX\@C]*$JH
XMWIA]2$L/"*RG,@&*I2+3QBD0),?/RBY_&X'9,KP#L_LL\RH6+1674&,Z((%D
XM:-(I=%ITBO&"#A "KI(.0(6\B YM,ID) S#XDS1SU[0P&)(0+)I(\J$EXNX0
XMSH#A&)R&8V!N1O7/'*HJ[HB]KN6BNM ZC8OGSO;;""&7@7,.U5Y78N6EHL"_
XM6E%TXC:"#SR>XTV8&WONE.K,K,4>$8"*OE0 !80(\&35!#2,_,P'T(WT/:E"
XMC0%]:RLK,M>"?W=\/%[IZR%ZF[QB/M7U)@%N$B-PF3F";X]0ONMY9H^57(!"
XM*2;D%7<EE!!P?R'G\]N<CR[$]>J^P5M0P !93S+EY[ K#B.\!",2,(WVHS"8
XMZM,[<Q)*6@0EB#JQ68,>202S\B!N5 H+=>%2 *N)Q=IX5/2A$AX-]VJ5QC:=
XM>C?@@;^A883,3TF+&W?C"'B^2IC*:TB\!DONH['7Y8QJ7K!AWC'!9X!N/NEZ
XM5%=H\ERLL0W7KO"W4PZB[WJ+/XUEIM,1;'KR5,\F+68\G(2CY@V4+E?B*@?Q
XM.AZ6XP^?+D5U7.#C?,S$C>MU&-=/22$1E&0PL5NGU.%AY5*N@2XT2@@)8G-
XMH>M[0C@@R4\!!T2OP_F&T[V$(QI#<M^2&78O1 \216K;7I;0<?W:=S7.!4@J
XME,MXEJ8MGW:\JN H^MW8YV-9\W1NB&Q<ER?BLVU/.$ =9R_PM"P<</!@!#A+
XMB'GJ(303.#4!\^K$+ *HR2'QN,8G_*1E#P;VD5$HU8$4#FIUS*/@>C[3]E/Z
XM8*/%[EZM("P'8M! ^ (#&T3\U# M)0.02D1+!T:4,*H3PI,(\YZ#B70+*Z8
XM.4.F*T[%65!,+=&L6)B0@ZNUP ^\@1TN&S"*AT860*(0H9 %D,2'&<X0#2+1
XM5:)!"S1HAZ?ID2<$(Q0+JITXBM(;)[_1; YK=;NI@Z@NATX=#\,8]Q/%#M5Y
XMQSR(^Z')'#KJVV/X]I9 &P#A3(05$+JA'9L9Q']!@?V9ST7]PF> UR\@<N@(
XMUPPD*[%^DH,*_]5=6T&H/#LCJ=OU-$\PI<PD;]<=0>/?3Z-B9C0?]"F=3X."
XMV6N)O0(K)C5JSX+^?U#S56Y3*3[V8\J;]I55^I%Y9;5='QJ/38]A'G^.<$8"
XMW1N->3.6 W*%]B(B(U6]>*%#(0-60D9 R$:0E7+10Z,:>&@HK2>NQ!3S<#]L
XM8HEB<,<;:N$$I[H8E4/CMA!"TCV>\AT)#UOE4$%L0T4"0R!=]*&C\0#5&*_2
XML"]S1FO'XK@:A2SV8(3K6@-'E^9-,@&%F_P^[HF;% 'YT^F(#8SZ'5Y&WN6(
XMPECQFS3X$<M.E/=Z 0\T,TUB4;E.(IIR9",R^G$\HCZ7R^$@1EDN,@9"=' =
XM\FW4==D*3<#-QB5J7"@W;.)A_2-W!JW7\WJ?Z^UR(7.+ST4J7MQP",F7HX/V
XM4\;]-N81-)=6)U'FHH,!O P&\)BDW@>JEU7-_]:%"W$OW#5C84GC3ON-J/:H
XM8:#=L6).Q=IOB":^O1$Q548,G"'WJ.7*7AH%+?AZ'X@2J5Q$\'H:,"%W($%Z
XM#3@<$A1HPVU>U :CQRNS@TL/2TT<](?2@Y2.2/ AG2TEICO-SPK(&U_!IE]8
XMZ!XO8!%01H:*8M7'KHS7?#);2\^U6<HV\W!.0/-Z+&_&2"4X-FZ?JG<A@2F^
XMAX7<V$-RG'&.6=1HFQ?TD /*!"["T TD42*%5W].GV6YH=G3\(MAB)Z)W(U,
XMXP+.K!9*VP-V_P76C2&L.3Q!'6@@1RBN?90'W-W758POZF*<$^.KYR %2C7
XMZ0@/I/19-)"H,M^DT8/K-TQY_=M5K2RZ0.%YH,>H"_H;2E?)6D^AT2(!S?DD
XM]@4. UIA;>[5F5V@. XH,)H0O02-.[VYN!SQT[X]Y]L+8W<*>VA%IKQJ&07)
XM?35%^5(50')]AP2>J_M>#X/O+<1.I'5B9$7%2AU<TP_"0Q1_,4$/;2I*-P'P
XM]9V?+(@K+9N*C+IKX@FJ]Q*&VA1H8C,J-7!)3*/N0H:Q0D(.^\QFP-4?RS/Q
XM@2D0&OL/)+E @AY&M&I F%6-*2I3K%D5EZI9+^0LRN=>W1'$VK-P?1Z<S;:L
XMIVPVA?#!H!9,KUG:)OR!W3 0_H-TXAF)J J_D-IQ 28M1C:Q%1 ?FU@RLR(0
XM^M SY".T<M&4@(Y0A(+I$5$"/"(ZH0>%T1&A+'3QYX'GD\'3E,*3H2"(T%B'
XMNY/9C0@AI2*DR3!U"FXSI"D3@7,X.06&2$%B4."8.D+HT,9P<#URMQL3WM"E
XMV%S6*01&B;XHY@TX)P7&+.206UZ0%$";70IX T8;P(E:%(/M$ _Q$ ]QR;$C
XM4WQ5<4T1,J'Y==%CX@QTVX>B(Y0$GA%\O0X+F8+I;=Q@VO)BA?P801+.1Q]>
XMI*&QRL7+G"44P2JM\;[5J8$-?$+#8%A6?@=O6?_DSR5(_W7FT\W[YI+<5M"=
XMM]N!B9G2H)F<7LYN(5Z)L,055111&C0,"W/M&%[)6$B94]2/P\()S1"?TEPE
XM6?&#(N"GC"QJR$1\<B:N?J+,(G-$US-GQF%PY8E4=!^, 0J-S8L^\+'0":&X
XMO:889[-%XQ:K^X8?XQL+N=G82^$*"[78M "@&.4PC(*C\87"8<6&-AKS$S!?
XM80I-3V$Y;$] %EIUT82EZA#Q<-83:XEBD1 D+9YL2+HF]N="UQ;O0UF><A^,
XM6.'D7Z$QDJ(8PY1 "E=4EX74'QP+1+[-E$JU&0 ,:]4^SC4P,$E,!A-,7&4
XMBP" N0Q!?@HS,$:1N@P2,U*8 3BP:Y?AXL=9!F%#@Z%:D"8+0N)\" 3-<3H:
XM#)<^1 I)0_D&4$0\(YK(Q-X@C+?3'O<534WJ#)('+9/O<1WT6F_4MX,P<1V,
XM(,$8 %,0Q\2M?J"".BBQ(JZ#DC]8Y(+B!X;9GR)8QC^4:U'[0\F*F(0KRM 3
XM-[0A"AY,KIH2\A_FH/>V!J-V4?&Z;#,DZ5)SKGTA?9Q_V;._SW!1[R5UKA7Z
XM40709K!C)>#D,",FB>6%2:V(PW%K["./.F&GN43,9H&I V6&3R9I*633L$HA
XM,XFQ7_4%&.P?OB%:V$[J#Y+QU4LAL[U"LKA48/2F=-ZW$.:FX"@I(T2][0&K
XM]? >&,,-]2^\57U@@AY_8R7^-MM%3U-Y!O!>&&1<, PRKM49Y?@6SZM3,!YY
XMN>%;Y8&[1$-+SF]>R^H&[_+.I/2J'E<-4!V5,0:OHHS!E6YD79\YW_+,0PF-
XM4K2#0V=%[0K"PRENM?$/B9"0(5;6;9D,YJLDQY@'N/&[P6/&L\1+M;J1!Y->
XMKO)-[V*>F()B;"GBE-T?\E^80_R]3PL*@A$C*#,]CBN,]'9;QHV_KD@=&13T
XMB GHX=+%08^TF(=T1**S?KZN+.Q!P595L%@N9ZVB?%5VH( &QNP+11YB84P
XM_4/"+YXL*S@YV<FY-7C;,->PPR;H@)*];(URJ9!APD(YDM$3*HHB(,HP8QN.
XMF$(*"0<!,$UC/]S$)5-?G'A<%2<H30#(?!TM &C5XX6*:Y+;X@;BU:HQL0O5
XMJ7?$'8_1PMNSI8:&JS>W8=$>4YN((G#G$NM;>]4^+9"<,)$!$!DL@NH*#@/*
XM#!I*"1J"'09HXB34E;E6NS<"LSBHYN8B:71%9-VH,!$PU@PM2/ -P@W"HVZB
XMR/<XC3I.C,H$3%N#9&2K8;9!0 1$02HVAUQD5 0%@U%$G0A.&0A)M'9'+3AU
XM>-8,XT'2>#CLO.VVR+F;- Y13B"K#"D7=F(/,R!"DD1D0*>&V#MJ11P,P0^]
XM-T/HJD,T$'8H81U:V ]&Q,6+B@-02P,$"@ 8 VXA-&S4(W*5:!0 8 P
XM \ !33DU0+U-.35!!551(+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]U^J
XM;*@0I$J0<]VVA?LU;%VZ:%V.!=DBNH,$&<3YR[JEFW9LF.']UBU(LV_E@ISJ
XMM"E4D"BE&AT*,B9,FS=3NB#?5-&FG0LR#?]F6[;-^BGOL"#=UF7+)IB'^8_(
XM-FS>LG)=9(_A_ 7Q\M<J@@.H_IUPZ%NX>>6F/8N6SM.=$R=.%L4S)TBQ>4$.
XM#2O7;=FS:<N";%J&Z=KWJF[3VN'7<]/2S4._\AU$<(A!TC=(*<N"J)9:=D[[
XM@M]DV">4Y-U&K)X35-)]"[(.]BK78^JM>+=]2S:MF>,/ZY8LB.0]E\[1+0:N
XMBM=TH)QSWYJE>V?H+L/=TT3;L2;[=FP=,0>3B.V%=L.M*Q?NVSGG]1WTC?:-
XML-K>99[7L.VY_I=2/RMG>UEKLBR$':[<MW;3DEE>XU:LB,_^Q43O,D];D;7;
XM-VZ:]<.%6Z9?$:MS'8:J>5^2>XXXPQ_'BGX=KV$J/Q3RUN]P["*H00O6<^LP
XMKZ#*>KL]"^(J9!;E**_=;9CL#4+)Y<1N6J589+'+Z*\@G4S63B:*F]]SA@63
XMA^06RZ9<@7'Y@EE5K^L!IV6)2CJ4S=K\S4M,SGP._=K?9O[7O[[#ONFXN=37
XMFCM-M2B*4ITU(9).HDFG#F4:-&G3*7)HIDQ!7@TJ56I0IU23%G'>5Y-21;*'
XM+GHD>A.Y['XBO)&@K]CNIT:IB'^1;)W42?VNLK^='BE6]^-_0V5"OXG\QZBO
XMU^VB4H<B<?Z@0I-T;ZI9PK63\&T$>3OIWE.")4@GUKJHU2+?ZUHC(;:GM="B
XM(-87_&9BO(T^E1)_]7LJU*)#HC>3^ &O]O40]X7]0Y\ZG5HT:A7^TSZB.FC3
XMH$?FI12G)W_/^95K367N&G<I27UJ5:94X-ZUEOJTR;A^.D5LKSJ%J;DOL8M:
XM0LE>7F_K(E;XNPA<57]D/XCPS>LD[\I]V#M5*<XWOXCJ(V?7N#)R%\F?3]J;
XMF5L*^E=1TN#;L3FYZESS@GI3\9]/HAFQ.S%JTH),MG]'1]!6K.P:WV7-C=#)
XMB%6=F*L-U !8</D"#SGB<7LLVSJ\U2!%6$JQ<KI$*\*Z-C.]*K>7C%U]==*A
XM4\YCS]X9;]!)LW!IOAS;EFS;L&,.H[2KTRU!FS%A285LZXNS&V6=W6F\*4&:
XM- DR1'3FC:=,\0S/<V[>N2]>NT2GYS!K']<Q\0LS-[Q?$"_LTJR;L=-I%=CG
XMB&FJN8.$,32Q-"8M"JV.,12<7I1T!$ 0499UOXY%8^KKQ$U\^BL<Z%4;]555
XM>H<I?*&"PHR27L>+,FM2/J?YBI<FFFAVBDQ4P'0"Y:E"?NZPKMXUW03453"]
XMHST4:6,/+5Q0%XC@9Z@K>.+Z]Q3#) \HY0Y2P/PER)X@CCRA]!=>*UNM_944
XMO(GYF2(?0T+8]QYC\A3AGD!TRK1:*DJ18O@WB&!:A/M, "A-QQ>V&_/67_8A
XM1E"+P!>Q1AF$9O<7W%"A?;X@G(>B!V5VU2&]]13@,+Q28NUFVSGAE+$##EG0
XM^+RP()R1VF/J+2.(C>)(/ 5?@//-"F'@%UD#'$4041?7X#PNQ33 (CC=MLUL
XMSE@Y#9QPW_*XWH7JG^0*\X1W 5^BR&V>HG9D'\<"H^%V6K9D' L8(7V:WG/#
XMGBTS56@6*H,]DM($;1%>Q$5EG06.E66*PP:66UB0*[I6QU_#"4#D+S(3B.:&
XMQMK0^@]]V(U<U6D2B/TI-GMWJYI3/;,,;DW?<^$)F\K&Z2)#C3][4B!^L 6
XM?!U>+RJ 0UH0J *H3ZQ8-*^_?/$I=GPF""S)(HL**,!J6@T%G, $&5!+ P0*
XM !@"X@*T:<2;ROVD# " !@ #0 %-.35 O34%+149)3$4- @$2(Q05
XM-C=HB9K;/ 4&$A-$Q?:6]T>"!!G39LR:+$%>+4LF><L$V31L7I Y9S94.$+X
XM033_VK)FT[(M"]+L6[D@ISIM"E4GR+ @Y]85.[<L79!OS8(<VK1*\W;;%HYW
XMASIDN0Y[MJQ;NG."\:%OX>:5F_8LFO>-<F@*<)UC6X,4$ZZ=EK53K4$*E?OV
XMKAMN799%>L&_Z](M@ZR'_+\<Z@VRJMNT=ISWW+1T\ZS+H'7'KF4;UBT9;!:\
XMJ0XEVI,KW3'(FVA1H56/]@1)!%@%5\F*ZZ3[)OJJ3K)IYX85RZ;9BS@W;=4\
XMZG?3)_>;2?V>4A\Z$_.&KN6>F?\IS'UNV[!LV<S+$53)L'70?^Q;-UGNLW70
XMKOP?2S=-\_K.@G?(-&[W29(HLO:4)WOV/%GT!/5.@K9N:6?O%\5*I;ER6DUU
XMIDZ70C%Z43==MFG=K@7YLDVQEV5S#);(,6P+9!BS1#*(+Y88S#['KAV_7#E2
XM'41]!]FV[ARZ6FR9O7@9-36:/RW-%?Y$@(XV5= %%8[.AK0S0?I#AJ1;MMGR
XM-)],DPKMZ=(EEWHMELOAD^U9%\J'QLB.O1N6#AUK.STD^T&P;=P*"D\AWL>B
XM:8[94TU=T)'+T%UX*7\JC<9FW-CDE+&Q<\8&+PLU-BC;*774X8621)+8=DL2
XMV%.2E$R2A.%]!YTSOMNH<=C;S-Y]YNH'G=JT)]VP<^(P+MR)E+O*LWIRZ;''
XMLJU+QMR'&F4:].@4,,=2:C"[Q1V[I9SG0[QZ?J)!JWYM.I7HDW;=,NE8'91U
XM+OW%\YF?-)UBWY:!W8(90!TZ)'0_=DSU'N,LL)DXL\ZG6$<& 3T2K4PK07C:
XM^"HQ==FY(%W4=1">ZBC(U9^[;%@RJ)XNWXI54]U31#F;!H42>JE",#"AT6G@
XMM/8OBZ<WRS%JMW,.8) NQ[KPPG4@[P1W-YO\:Q[,:]49UE.45?^8Z01K70SV
XMC5X<^2O>94(YH/&V9=8'U8&,@3/H Q?,,-<7U;(369AVH_X=W:-;!"FGP+8M
XMB7-QU%J<=(EF.I+TCA$=L0W8!?U<L!EU"C^4Z)FF-U>]XO&G0I7 BVC6?:30
XMD%.!4ZM8S DD-9JPF&I?!W7#\A!+!2_G>!UL%DYY"N8B7=#1@I?LJPGM5L>7
XM3(@11 **=B;JY#502P,$"@ 8 NHA-&^3"%#]^!0 JPT !, !33DU0
XM+TE.0TQ51$4O05-.,2Y(#0(!$B,4%38W:(F:VSP%!A(31,7VEO=?JFRH$*1*
XMD$3+FDWK-BW=M&_=S@5I]JU<D$'%SJ4K-^Q8NB"GYG5+-RQ>D$[?%*_N"?*I
XMV[(LNO=4IRYCW/<@[IN,_BQ+%@3Q!IETZM,7PQLD3IPR:8(,ZY;,<WR-]C&<
XMOR!>]EI%< #5OQ,.?0LWK]RT9]%\W3%S=&L6Q3,G2+%Y00X-*T?I/INV+,BF
XM9=FR:?M5IFJ[9>7.P:KST*]\!Q$<8I#T#5+*LE"JI9:=T[[@-QGV"25YMTT[
XM=\Y<2?<MR+IS[/J8>BO>;=^236OF^,"*Y&7FIQ5;ETZ\IHMF>8.<^]8LW3M#
XM=QGNGB;:CC79MV/KMBWKQL]B2[&]T&ZX=>7"?3OGO+Z#OM&^$5;;N\SS&G8T
XM^+J,4C_CIZ)?2C<+88<K]ZW=M&3$M/-5K(C/_L5$[S)/6Y&U&R]VVC'6#Q=N
XMF7Z5Q Q#U;POR3U'G.&/8T6_CM<PE1\*>>MW.'81U* %Z[EUF%=09;W=G@5Q
XM%3*+<I37[C9,]@:AY')B-ZU2+++89?17D#9Z#TLFBIO?<X8%DX?D%LNF7(%Q
XM^8)9$<ZN#T[+$I5T*)NU^9N7F)SY'/JUOWRWQ_SK.^R;CIM+?:VYTU2+HFB7
XM(.Q>\$HZB2A.#V4:-&D3R.F@3)F"O!I4JM2@3JDF+>*\KR:EBF0/7?1(]"8*
XMDNH3X8UD=I8[;92*^!?)UDF=U.\J^]OID6)U/_XW5";TF\A_C/IZW2XJ=2@2
XMYP\J-$GWIIHE7#L)WT:0MY/N/258_%99ZZ)6BWRO:XV$V)[60HN"6%_PFXGQ
XM-OI42OS5[ZE0BPZ)WDSB![S:UT/<%_8/?>IT:M&H5?A/^XCJH$V#'IF74IR>
XM_#WG5ZXUE;EKW*4D]:E5F5*!>]=:ZM,FX_KI%+&]ZA2FYK[$+FH))7MYO:V+
XM6.'O(G!5_9'](,(WKY.\*_=A[U2E.-_\(JJ/G%WCRLA=)'\^:6]F;BGH7T5)
XM@V_'YN2J<\T+ZDW%?SZ)9L3NQ*A)"S+9_AT=05NQLFM\ES4W0B<C5G7B+I07
XMJ &PX/(%'G*$YPM4QJ<"JI%2V6)3_:+E*MY$T@UV:_2%/>M^'5,[+3?AF\_L
XM'>RWR*H)'10+>N5IAXG7J)'L>]1"5E_LI%BI%D%R'0-W+IK,&C+@*)-S%GOX
XM"53YF?O V,_=\.JNLO3X)^?[2^&VTP2-G#9I)MC$&I62A5N-%C.M3\Z931/,
XM+6\041;Y!2'X5Z%/G^#O(/DU"G0-,V:*[PA"J+<J#RWE.RWC.UR2G<IW<L9W
XM^"=[Z"+A$6F$AW>B.LV$.UW#/ZQ0);U?T4TD/&TC/%QF*<$M\#PF#/#0J2;@
XM3GD5WA&K.DTB6Y\:9&@"&&Q0**_^H4$&V\9+&N-A5BN+:+Z&<1S?85JSRE6P
XM(IL>"N-H:.'?9$FU](X&S=#B2%UU2&YN/)=Q# JKEV#4XBFE(9B][CV%J7_A
XM7+.R&ZD"5!S D+P3I%%(8U&<W)K%3ID0Q7$-T@3:,-=P^*</DY_2CQ0>,[U[
XM]J .9>F0#:DR[%RW7^$@+\;L+^":+HKJ:K2;S,#ML"QH^W24:S:QU6=6?K,X
XM=3&];#-9*'2SS7A>Z _'O1H^F-]ZENX=X9CX$F<#M].R)2,.R9N@QISAS7BG
XMC 5B+!EPV ;>VG#<[&U(EVY4AO*SHW[1#4;R93/O<'V!M0QXR9Y &3%D(#V#
XM,S(0B8,9INRKY:.OF@R:3R^<5A2]2@\H2@8+&2#IC1,?8S.P(6Q7U^ XOFI>
XM^&&B1LH/7M0P1 /A6[%J3G[)'E@*SUZ/$P.5#!3* *QMMM_<B^6V!4A!1F('
XM*%+$L0O%-7BX=TABANBVCH8JPT4%& ,TQN%02P,$"@ 8 NXA-&ZD(6*9N
XM 0 +0( !4 !33DU0+TE.0TQ51$4O05533DU0+D@- @$2(Q05-C=HB9K;
XM/ 4&$A-$Q?:6]U^J!!D3)DR8+$$:E9L6)$V02NNZ!9ES9D,%P1LD2)!(RX8E
XM6U8N2+-IV98AWF^0=]"J7YM.)?IT*LBT;>%([[9EW=(-2S?M&_C]UBS(H4VK
XM@ISJM"F4_-)I63OT&Z10N6_OND'?9;C5]WXCO^O28?8A]2\G^JNZ36O'><]-
XM2S>/_PQ:=^Q:MF'=D@6I\D6P"-XCTYK1UV;B4=#K?,,M$SV^KOE]UHWR!CD6
XM;9AF7?>+\=SA'3*;J_N,]QD/[Q#3%%W=/Q=-54UWQSOM=BS;.N(;) ^KNJU+
XMM#ZBM]VW:<QWW+9ORFX4\Q#-#+_*N2R2AJON9*KCPJ7;%-P^ M^85[86._8M
XMW+PH\!?YLE[8!'/US\NRG2.^033Q3M_201/A9!6,C1MS9#-(JN,CONK(;<.R
XMJ:O'@C"NLL+.S3OW!9)SSE<6%RZ]48<Q<FVY\U"WKD.+!<6J? -02P,$"@ &
XM 8 O(A-&U5:Y9O/#0 *BL !( !33DU0+TE.0TQ51$4O34E"+DAA"GL'
XM!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085! 87!0H(!085
XM!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\^_O[# LL"RP+
XM/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W,6,5%?]8?WC7KN-:KOU8?VW?
XM_E*Y?X1GNY[F>:__67\=Z+WK_SILGN1!JML;LZ@X9JQ8 @>PHN*XH[T4;KNJ
XME>5/HJ>GYRN\T7\SW!\]VW%7+^E_G^=^_,3CBG!OZ[6$*RJ6_U_@D./S_!W+
XM=_V=>[VW"'<=ZTVZM_*UKK;[+_N?USO_-]1__B_O]:OF\)^C_NO7NFQ7<UYN
XMWWVM?]UK2_RSW3C/)?J+BNM[8R[?Q_(P=94ZSQ'NE^:MM*].=_RU5/9Y^;7[
XM_H:_<F\WY:YNS['<]7S"7]KV"%>=L5\JSP+9>9I[A-MC46@?^W(U6'ZI=#^;
XM=O=!W3S_8J@><'=1<7-?*H:WW*&1'OU?8A]%/:RH>)U+I7U;KJ/Z78?E*Y]Y
XMEN,IWW^O_5%RHN+[FW=1L6#OD'GJ(O5RK88O1E^:F^?5 *KEW^7AS%T^>"_;
XM++%2?M;/_WE;R%K6TMVX:E<C_\=OU[+<QR]ME^JK.,[[7[,JL0X'[5%_/$AN
XM_W&__R./.YUQKS5XVS_RH!7E=]ZHX\[PM[J_%670_NUN2HOHO_E_T!OU$X>#
XM7M2B8K=WD)S4'[Q#O^/=E)_\=D91./XX== ?M$+[X][PIPQ:O;?=%GQ_K_O?
XM,-Y>Z[>C('Z/.?7]_<$XM?_^E&Y'[(?VVTGO:##NB[W#0><=M3[,'W5[[3=$
XM$_$^S?_#<?(XJOG;X=ADW^,2.<JXU>X:_X[D;B?V6V#[IW2ZR;_?;1,MB6W,
XM/1RWQJAO4J?+L]OY1<61H[RM*&H?:8\)_J@UZ/:X7O;?ZG#\_-][H_8'4=_>
XMZ)5[NUI/J]N!^HEML*OC'W<&;?.WF]CB>[NB#^+OO:0W<L?N.ZP"R]MAW\EC
XMUB<%O5-4K-Z25U0,Y &(P#4F?%4QGQM+W/+5C+B&6Y>[_$,0PG.C@AIW^"I_
XM>*^-+5)V3JC!R./'C/67._PR/Z>>N\N_2@0QFB_7.T>$N]E^MQE"=V,9#"--
XM8H0:C-A^-S7$R*J#(54U9:#4N\71KWR'V_W!L'\?P2CN-[_/^ZCJ^(O=LA>V
XM$TWWJOJ36&I=Y=OMG,BSL<.PX4EN;LP5\'W^>C=V#_]8,9'>HN*@%XPDFGZ)
XM[B7KO=4>7'^,5MW[_ZO6F\O->^,]'QR/ZFMV7E46TT/7WF/9PHD>>G#4[_"@
XMYTOC!?6M[8UZCBL]82FY:BJ%T;U"_7FM%9;"8(8;GNU/6^%*5$V/>XG?MX2_
XMH'RXMWY'N-0.D;S,:.?U"BG6<SY;]5Z77WH:"??BW6V&6^Y5[RQ4<M7:I?NN
XM^YV;,,[Q5YVV)GM)K&/BU&HGWO-52ZJ$6\?U^G:O:Z3))-1@%->J(SN-K6AO
XM<T,FS.UBF:5,6 GGJG8V'AW7R]?1UK.?UV"D]JCVUT9DOYK\V[4QO4-U@9WQ
XMSGIO8]XV#.N_PWP1*WSA%>@QC+"KUG_6951YCNJM=XWPG/-M']4W^L=7,.U5
XM+R;S#;+>K+&@AP^.;F.YEY4M0NTPS]_NQDVA7?]F.>R@)8\G-G1V4L+"TBIY
XM.A\7S2N0:JOVQ-4*,G ]QQ/&8\UM?^HV[\IOMCR?"^OCU)"#8WBMC6>K*[<H
XMGB*,@>Y;43.V\;^W;0<OBGG\E7F-&A+S@N8MH(OB8S+PB4?"L<<?2=N^[*M3
XMC.2A,989ZB;1E_J-_=0\5'=>Y$KA"NS"H+R6;?4Z-Z3?=VZP7 5?(;."AZ J
XM(E7@H0K[I02L@H#\6D6P"@!A?JU2K().D#ST<T@>9(@Z6[C*H%W<*95+FLHA
XMF^\9)5C7ACV+K@WQ+ -?&X8;1#H<7[D:%6G;-]]3?DJ$+O2SX+MPR-?.+7A_
XMRKLL9F>UEWY = C#$PLG$ Y&?$RI8<_2NQ><JW3009+[<8O!! SP)7P35DK9
XM-S#Q.FD8]CHQJ7^5TSW^,>2?H_%6]E4F4KI37.X/>MYJ]>FN=9#[BWQ'?B0R
XM.Z-@D@[;E^.7(*%+@Z.C[YK1XSU/=37>!BD\#M>VO4RMPS4/CU+?<"+31)!U
XMS%Q2<.5^ZCY?U ,+^NF[HA>>4<V#;SYU"P/*\L+='3[+@\>]K.GC)<YKC:-,
XMR<VVSU6<2 5XM1FDMHO4&3UWCWPJ,?7\O$]\3',7 ST$J0T&J#.M;0KLP3QH
XMR4, F)8\=%V@Q<@DAJQ"<MY0PA%N"ANJ!.7=N06\5WD3&BHG/05/'*%SPC6D
XMA@/*><3=4XA8[$*"'J*W=\#^S3-(JP0/[+R)O;@!JG,_:QE:J\]'SY )+91O
XM3Y6550F&3^P\_KFPEXWLKW>YZ3T(S\>O=RW*E.:\K/K2=YWQB$(POP6:!]L-
XMTTJ'!#V%/'LU!.&3\EPG3T+75/[,%I>W:]>[#L04[@\Q\"))228.6\ %I_A:
XMC'5:S"KS844NK)\;\D 8@6V%!&_3M&'T,)Y@V5#J7E!-G/ET7(?Y/J_7A,-"
XM@II$-J'M'A5#[)X4&Z*B'09^!()Y\K,F<$3/32[>7L9K@OB!F&JCEFS1^_J[
XM#DX4_-/]L&@PL"$8#<[FP>"\8+0HZ#A,*_(I> #C\K(T#L%F1"]*C1D>Q.3;
XMA7QC8O@D;5?Y,=M@KVUHV>:1.P@Y<L_X)#8_5/FU.Z"S[0X@678'HGLC>A2T
XMH^RE8(00B5GW8/ENVB7R@W5GA:NTQ<U2V@8&V0R7IU'V>+'C\9B8SUL76VR/
XMZATQKE(S:4_?-:HCV(1!I.=2G<VRQ! >$;I1IE38H]GD#X[DM6KATM:^P.7T
XM?D?)2;],\QU5RMDPOL=42/D.O*HP8BI8R@<D-/& #C<J:S ".B2NU3=\HZYS
XM\$G/5N;NFSH'W]X:(3K?!^W!=B2MJ?:B<_!O U1:YF Z=\EKH)V9EWD.'.#!
XMX'OU<ZMS$/@.CE??MB)S"+92FT,X%/!"'Z) \GR) LGS*0I$,R46!9INQ2AP
XM-%>-!LU1(/H<)SQHD +)<P)X5?!Q+FR6AB</1O([RSX^JPC22Z6,S\AV$S'4
XM"E9-%0/ C73E\F"(=_)EPMKO92!]E>>RX\$6EMM""B4\X@E/>'W"$Q[H;W@8
XMX!_MA\,$\<J^JKD?IK4K5)A@7B\CM0X>'.J/C7Z$&X/X 4&%MT/K3=O>B$[#
XM^B,!Q&#PVRQ8D&IYJ"0%><R#ZHS"&&*^_4&[]?8P#]S8BWJYM)@KCAFKD&.2
XM3WDIF(;%,D4W1KE,P]*]00_U6N=-'L@N.'/AV[:&F^M'>8?YDL\T\GC0*O >
XM43S4R).PY ,\7$$<\\1C]3R5)RCEH9"<;PNK4HU<;QPA0UC@Z+ZJ7[N#E")#
XMD&=YTW8WW3'X9"92(,^X)@1#ES?GI$+87&6QO8F?-@9&R(RP1(K;$#J_;ZE4
XMDB8"U-HJUA.IL<*6AU(8PO))TH988I&\\2%J>! ]ANC<98V)E>?R[KD]!I"6
XM7V,,>>48B/(-F^NJ&HSD4^J#T9E.)8E#=!;NR$0B :\>H"E_;P=:@51*>0C
XMS[80X(44;C>P;SL"M,VB@$>"'H*0BZ&@0'-^+J,X5)SS$/HQ#.304.%"%NRN
XM@C:,Y"O) GSZ1O55(&GLJN' (S[R4\4#1WC0I)I #)+8AS"[W0\KA-K5W4V\
XMP.^TONV8U*'I;#!JU)"]6QIP;Q\"YP+N&P_&SB'0+[UKXX6?0V-#TBOVF^8#
XMK_G L<2-!8KQ<+8YF CCOPXUMB?Y/SO_Q\B'>',4OL\1$0<IK="2WH@:P(D+
XM'C,!.@0KX(G]<6>2GI/#=.<P'2+*, K1:3;1(8;#7N@YF4)WEO7!IXS2,S*0
XMSIE(A] &2N]MC=K)X]$0ZHD!=8A!NYN>GIN3#762 7606:UNF&\O-;%-]:13
XM'60FU=/A MSJB6YUD#&( =NS74ZA)UQIV]T5BCPW "WWFYODIN<.FA!W0X%
XM'NJ:#G6B4>"C(/S.*,K8%^ ^_16EP*<,AX.X0E>1 M\?)Z4*72@*?'O8'PE=
XM# I\:S(:=SH#B\C\#7[T)K4<+^@-/G7<'HP&[2%G:PYY@T_J#)+'G="<3M@;
XM3%)2=]!KM;H,3_OM#,9]KS?',T [UJW$=L3$I+AQ-0^SN0Z[D7MQX0J&<VTI
XM*HMFLVD/3^EV(H\[PXA1QZTW\C@TW<-Y+E&Z[59<ET$;[L36B^T3G,&!3@:]
XM,,;]P9!H,**3X:#SCEIQ41,N=-)YDPWB<;,D!DXHMDLQ9?<@E8[WNZ-Q7]V#
XM4#J.X9T<-;DE[T$R'6>B%]^#0#H.9V_O01@=CVITM8YPH^-1WGZ_:^Y!*!WO
XM#)*P/0BV8>U!6]F#8!N&=#'V8$K'8<*C[B!J)\G9@W(ZGIK::R>E#*(ZO? -
XMTO(G&7OL=&1KE-1I=<?]J.@)GN=TU.WYQWLM\X0+G7;:G=<[X3JG88Q[(6:=
XMT#X?]LN^+35O3UY4?)C1,3BNXRH,RNB4F;L!IQ:#,CKF$WX'88!_YT0X'1/C
XMDKC6B7 ZEC+H.7([B8N="*1#YL2U3H1"0S.]<;43X=#(L<,?A1D7.Q&2AT&Y
XMM4XXTK'6(%G[GM!K,.-P[QU$C0)U#X;]UZ9@1$>.0S11(=P:=/$<F-.1O$YX
XM"DYTI(Y=ET( '3EZQVV/G8FV&@(V4$L#! H & ,*(31O@9B052@0 %D(
XM 3 4TY-4"])3D-,541%+U-.35 N2 T" 1(C%!4V-VB)FML\!082$T3%
XM]I;W7ZILJ!"D2I!$RYI-ZS8MW;1OW<X%:?:M7)!TT98%.35M6[ALC+?3LG3O
XM1.^U()N&=1OV;-FV9=W2!0E5[ENZ;\>^90L2I52C0T'&A&GS9DH7QF(X?T&\
XMKK6*X "J?R<<^A9N7KEISZ)9US%SXL3)HGCF!"DV+\BA8>6Z+7LV3=7=M"Q;
XM-FPWR"ITM]VR<N?DW7GH5[Z#" XQ2/H&*659:-52R\YI7_";#/N$DKS;IIT[
XM1ZZUU6]!UL%>Y7I,O17OMF_)IC5S?&\U61#)>RZ=HUML7;IEI+SE#7+N6S--
XMKJ&[#'=/$VW'FDR2NTZ5,TR?@\^VO=!NN'7EPGT[Y[R^@[[1OA%6V[O,\QHV
XM+=7_4NIGY6PO:TV6A;##>5+;34MF>8U;L=J3AQ43O<L\;476;N#4:<=8/URX
XM9?H5L3K78:B:]R6YYX@S_'&LZ-?Q&J;R0R%O_0['+H(:M& ]MP[S"JJLM]NS
XM(*Y"9E&.\MH27]D;A)++B=VT2K'(8I?17T$ZF:R=3!0WO^<,"R8/R2V63;D"
XMX_(%LRK=71^<EB4JZ5 V:_,W+S$Y\SGT:W]I3H_YUW?8-QTWE_I:<Z>I%D71
XM+D'8O>"5=!)-.G4HTZ!)FTZ10S-E"O)J4*E2@SJEFK2(\[Z:E"J2/731(]&;
XM*$BJ3X0W$O35V?W4*!7Q+Y*MDSJIWU7VM],CQ>I^_&^H3.@WD?\8]?6Z753J
XM4"3.'U1HDNY--4NX=A*^C2!O)]U[2K HK;+61:T6^5[7&@FQ/:V%%@6QON W
XM$^-M]*F4^*O?4Z$6'1*]F<0/>+6OA[@O[!_ZU.G4HE&K\)_V$=5!FP8],B^E
XM.#WY>\ZO7&LJ<]>X2TGJ4ZLRI0+WKK74ITW&]=,I8GO5*4S-?8E=U!)*]O)Z
XM6Q>QPM]%X*KZ(_M!A&]>)WE7[L/>J4IQOOE%5!\YN\:5D;M(_GS2WLS<4M"_
XMBI(&WX[-R57GFA?4FXK_?!+-B-V)49,69++].SJ"MF)EU_@N:VZ$3D:LZL1<
XM;: &P(++%WC(D61T)5KE3N[87Z'4_02SGC%MQM .M]:^(\O@#TWMQOIEC>WD
XMN]/$2>,[-#U]"EK_&B.\P_B.X7-3_4)51Q'64X]P=Y1!XO<7,&51+&QNOB":
XMRRE#=]4A6%KTP\0+,X5_9"?I)PS@QA"&X+^G$#7_@"G#/WX*4 !SAG_<]8;B
XM'^#23 $F:%]JJ5\.LXI/_(@%F1'$4\'Z"6'4.4%DA&*XT"K7:">ZU47$!UI(
XMXKG0H$2MN&;59A533&'$4U'5^*J[F681KVF(AU!;,[ZE>8VIH-BN[=5,B?#5
XM07;W":B",-XJZTW&$U5!&V^ET4Z71-U7G8BWJJ")IZM" 6]300/O07RCD1HA
XMI68BWJ:")MX<K:%456%JI$*.6)N:";(2Z"&!87FH2WL13#98[2'KTT86'%!+
XM P0* !@#%B$T;P@ BA/4% "5"@ %P %-.35 O24Y#3%5$12]33DU0
XM24U03"Y(#0(!$B,4%38W:(F:VSP%!A(31,7VEO=?JFRH$*1*D$3+FDWK-BW=
XMM&_=S@5I]JU<D%.=-H4*$J54HT-!QH1I\V9*D&G;PF5;MFU9MW3#C$\7\V,X
XM?T&\B+6*X "J?R<<^A9N7KEISZ*EPZYSXL3)HGCF!"DV+\BA8>6Z+7LV;5F0
XM3<NR95.O058)N^V6E3O'[,Y#O_(=1'"(0=(W2"G+XJB66G9.^X+?9-@GE.3=
XM-NW<.7L?)-VW(.M@KW(]IMZ*=]NW9-.:.?ZP;LF"2-YSZ1S=8NO2B==TT2QO
XMD'/?FJ5[9^@NP]W31-NQ)OMV;!TC4VFV[85VPZTK%^[;.>?U'?2-]HVPVMYE
XMGM>PH\'7993Z63G;RUJ392'L<.6^M9N6S/(:MV)%?/8O)GJ7>=J*K-V^Z=9C
XMK!\NW#+]BEB=ZS!4S?N2W'/$&?XX5O3K> U3^:&0MWZ'8Q=!#5JPGEN'>055
XMUMOM61!7(;,H1WGM;L-D;Q!*+B=VTRK%(HM=1G\%Z62R=C)1W/R>,RR8/"2W
XM6#;E"HS+%\Q*<G=]<%J6J*1#V:S-W[S$Y,SGT*_]=3@]YE_?8=]TW%SJ:\V=
XMIEH41;L$8?>"5]))-.G4H4R#)FTZ10[-E"G(JT&E2@WJE&K2(L[[:E*J2/;0
XM18]$;Z(@J3X1WDC0EV/W4Z-4Q+](MD[JI'Y7V=].CQ2K^_&_H3*AWT3^8]37
XMZW91J4.1.']0H4FZ-]4LX=I)^#:"O)UT[RG!$J03:UW4:I'O=:V1$-O36FA1
XM$.L+?C,QWD:?2HF_^CT5:M$AT9M)_(!7^WJ(^\+^H4^=3BT:M0K_:1]1';1I
XMT"/S4HK3D[_G_,JUIC)WC;N4I#ZU*E,J<.]:2WW:9%P_G2*V5YW"U-R7V$4M
XMH60OK[=U$2O\702NJC^R'T3XYG62=^4^[)VJ%.>;7T3UD;-K7!FYB^3/)^W-
XMS"T%_:LH:?#MV)Q<=:YY0;VI^,\GT8S8G1@U:4$FV[^C(V@K5G:-[[+F1NAD
XMQ*I.S-4&:@ LN'R!AQSA^<JM-O.G4_VBKL#NKT.D&ZHT&5^)R+G=L'A6I?GR
XM@4ZBP'W#G9LRA:C$*3N5R@KA#_,9U3DME\WI5&'VF<4NU@K4D6_"7*8ST G,
XM&6G7+/<<ZRFFL%8\*&>.4[/3>7(]GIEN%B9U6C:4,M=2_MOMB>)=I[<J^ND0
XM9MI]H^KU.T6\>'W1VX4KR1%=*^YZS/U2]A&L78>RXP3<=%&Y<@)KYDI^S]71
XMBI12XI/W*]5WV;J);[9AYZ)13..%N@Q^HL@%J!$J P5SC4YA-"P4,181^@L0
XMBG!;:L*6,:Z30JOT=A.YSF7XR;*+/-7U6D-C_<+:[32A31K7B>GI1+"["';!
XM&J5V;5V7VF+H/%J?J[:8M_KD'%NSYRU6#5^K NW&"EZ%,8,9:YX@84@9<YXE
XM=OU6G2>:9\(80L*5ET8^LZ>8QSGW!,\0M(O0Z:!$$_#\X M_!;"::A'J#D,]
XMTFXWTRS%&F_0(,$[05<C?052-=5C,+'GW&Q=QI&>]PWZ@0DKA9FJGT+JV_PF
XM(\I>1C]&<<>$=K-+IKT0N^D,0Y#MVHP>\JMSNO'"A!&\BD7DS#_NX&ZQFVP>
XM*3'[HC8*7[%Z2T'*@UR^OSP72L#YN4Y]W^DGGEZ VE^H+SSY5*C2)%Y6X*UY
XM"=J.-1$T(EB?>,H(ZG02A&$PJAJ.X:09R>DV$L^G-DURFM719,T4:"$G<9PF
XM2E1*6M&L43C+H%!$X8<&L57+](:90CWQ*%W%J7&EU$..H1[7\+OJ$2<H])!E
XMH,=)+]^IX3UTB3^P9ZC'/TF[$,&H@4DS!:S@B19AS#Z2GYA,1R&QHU8[90(W
XMS-/:+$J1)>>B+$DVI4X0QULDRZ]?($$19A6O,M?PHM9.DMM[N4.PD^T<@#5G
XMX TJ(@@Y^5PWI=(NQY0IR^)!E/UFU_UBJYD TIKLUJX[%C>2MQY+1S)<<5ZJ
XM )9?X22O>OTE<UKNEY?6*(R.[JJO\JYLJ1"IR7C'^(</8XF-9ICBC]N. 6;8
XM'%!+ P0* !@ GBDT;5$ >8)\' !!$0 # $%#0U0O0TA!4E0N0PT"
XM 1(C%!4V-VB)FML\!082$T3%]I;W7ZH$"3.G3)@L039]ZQ:DS)@@E=8QWCEG
XM-E00O$&"!#D4:5"I5%T.U9&\I]*5FQ8NR+%HP\JE"S)-^)X[5F[9,L;[CO(F
XM^_8N2+-OY8(,6A5DFV"=EH[RVL_?PLTSO\^B>=\HAZ8$&3,'N69!_#-!BLT+
XMTFE9NVG9@A0J1W^[96.L6;B7;>'6I5L&60^Y5NN*>D7O*LW:SO.>(ZW@]ULS
XMW[KNV+5LP[AKD"I?@,L1^7HLV[IDRX(4"7<MW;ENP\)UB5;$=62>;<NVF=X^
XMIB.*3?MV#G633I*)+J:G&>B%KK%BS9I5JQ;G%;[R[K5BY](-2[?N7!1 -0@T
XM?PK;Q5>%;[IHK.ZR)^>"#/-]4O:P8_ .K'./,3JI4R;"NXA6_C4H4I ]RM1X
XM8<;<P;S/>%79YK[EUH5+%\7TCFDSY0[R'G9N&R#=SO'&RQ(&=%JM7A!#1[NF
XM,QZ1C9(*>F'7.K(;\M>5ZR;=L33[R+)LYY:QCK$KUY;-BS)FBNY&I!*[SJ;^
XMJCF.?,%O-FSJ.?0-\)U&\9=:].@4KBI=L_U"K,_.9:$LDEO;"CNUYW89%DU7
XM!)E/Q5CA.6;?6LCJ-YJO.?99$,[>TR=(MV_8;&<V82OR<=H(LK,T<8XT<8Y9
XM68*8YD7' %6#+VL]%">.^RHK.>>;)?%SH']N73:;$_VZ;%@RL<\T1(EW(IFF
XM4K_%'-U#BHG8G3#6GHEN<&--JFSX$,@8E61(%&ISEWA=#-,FC'R:,%,<6?E%
XMW(\ZL?_OP[I!IL+L/NNV+!DI*S<76,7$*ETIY>^P[F:"=9O631!\7-T%O7A;
XM[XE</(S(!0?R>";,W^>:S3?<*+ :!+NH&LFWK?$[5M>[*I0U&[?;L.]"DSZ=
XM\NKY1HSUYEKM76:M^QS_2KXD^O2J$_GZ!G5BUTY5"G7%6TK6E&-6HEY,JJ_6
XM#%*5I&L[B=-D5,>_M-,H[X;-<[M-Y[&:CO&+,=YBC-_-K(UQ1BQ3B(8B#_P=
XMDF&#04D+X]UCK*FI?Z25.O;V'6"SL0+*=78]>@E6O$$,:?I'S=!K*<DGK]]0
XMF9GG0L(%/7L+5#&"_#7).XU]_!#[T7?O2+YSH509IO"E!L%);8;+ZGP2.9]B
XMSB>1\RGFO!3Z!ER5?JFHUHO(P\)@3-G'3)3>#>=,C<+-G0>3V6:.T!;VH;Z)
XMQ?7%2@?!_9X$+W/'70QQ0FR=)[F)G7CJJ::!<A@?BW+,TOJ*4L7FP;,QJ2*=
XMA:G<[4DZO!S:A[;Z&NJ8KHFIR:%8DD]3(FX=@[I%P<=X#=AWI(ZO0<0T\/!I
XM&O@ J3!Y4ZI)ARZ=$AD>XV2>B= >$Z>+F%F[WC >HVS><F$Y>EEL09\CH4_;
XMK%F3Y@SZ>)LS<^0&0GH9L^;-F3!TI=)C:>)066P]'SJUZ)!INZ6FP2_6ZS$M
XM\VF$UG.<=C*AN?N:S?0^\^@&OG1F":P]F5TWVJG!#NX&J=57S9QF8DMRB/=J
XMWR#D6\JG%D&C>'\>^?M+G)I,$7OERC95;#>PG5\"XW/JU&XL+JME<=X6,^DH
XM 3J=5_T7.*W>^)>Z1'$]MJ:P03E<VVZ!L%2SO^"/O*&#;!&Z(WGX(.H+LAMD
XM#2Y7_UH$+9<-J.0;FGDV*CDZM3SVS2B/W#],XLY8.*J+65XDNV/0C[L$RD>P
XML^6M'"HC*"\CE;K>+ ).-!'IH0HKDRA1-!'?PBDZI8K1=TZF*V7>K)%4OXR!
XM!<H)>HP3J8.%7Z&LFLX4;8:J@O16)V@H>U&<X$&)VNJK\_^*9H_^PK"5Y9?^
XM+7O,$]]=A781GVX37S>)#V9;E4WBPV$A*O<JX.J5.6.RP>LX9;+=X;I$>"6^
XM;51&@]QS%[UBF>\(1L*P ]UG/W*;_6"CW?$VL1],-/M3)LT42J9A]$*H;"YW
XM3B)H-H;B5.*+<O:C?S,GBV+%/!2F^DPI).":K>"R(=_]HDU!+ S*$M(QFTSE
XM@R$O$B;;!QX-+_9!,F8+ ZX?I.H#&G#= (THY67&/R%;#2+5ALE[38IB:SIS
XMV7O-9,D%\PC6J-54&R[%U"RE3!2+IY P,DDE(*?1(*^AVX;Y:/DF@/(Q)HPM
XM"Y=O,RVXW&?9'%-1%AW9H QW\ILEG@2J\<ZX,GC<F9=U@A*ERFZ6:W=,31Q6
XM-RUZ-0DN:"2)8 M"_8N0VF:W9*=74%;+[-*L58H- Y"B3$"/42:JO=_QJ$:L
XM6YBO3%HU2DH:*IN_)B_G>!@U[EMA=OEE2_Z[+6/@.\P6;NHS4&+6]^PFP$;N
XMDAKP)7ANT5:\)F:BM9R];A;%_4%KD26@:C+#4P?Q6(P6R8(S-8O%L.(&P^%R
XM\,7*4>#;4,U""&=1];H3K*%$J&!'Q&?K\D3P9I$D\@Y^(BUA=I_D>Z(9G(9/
XME&L\JER3<G['>*YXGBGN^YK[KO/$780:JN67]/)6<YCVW\&.EX&=R\ ./P,[
XMGX&=R$<9ZQ4E>?O"]VN5K\&';7FB/=S9D*)BZB(_TV_(L"N0B>@1KZ0[#^G8
XM&=+=AW2L#.FN0KK@%ZCG.\(KY2$^N<(8+PX=Z6X"<=48OR.S-<@4&8$YC[AJ
XMO6"P>DV@@8U"DI3(Q -02P,$"@ & 8 *(I-&],728\ *0 X)L \ !!
XM0T-4+T9,3U=(05-(+D-A"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87
XM"PH&" H+!085! 87!0H(!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT
XM!P87"1HK_/S\^_O[# LL"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W
XM,6/]27IN1OY/WH^?];N-Y4?/+BHN*O[_I_2[D:.,VU'R1M'^'R?^Y'NYM_P_
XMK]=1_95GK?SE:9[W^FO[1O'/\[I7NNMH+X7;KFIE^86C@C^)'CTG'^%G_V:X
XMW[LC7.=/W?;XX[SO?*YKN33C_C^ZCV6[\_]//*X(][9>2[B_U_YX;B2<SU'_
XML6("O\&D?M>NX_[#-S4QZO^&NW.';+ZVN_ZOVG\.LV>IW##[//=XKO79[K_>
XM"^ 1[=9X%&;$491W%";*Z;%''46D?4R.M]YV:] C.<;T5=Z)R:%(CD<1N9H<
XM'[ZCWFMR7T?CG.OW#XEUJ5][7B4LE;MF]='[B,GM8;?-=-RYWQM,C\EI^2Z+
XM7-D>O(G/N;ZO/O=]U*^:PZG129QG7H]R*:\2Q_^DG=C#/W(-M\9<PI7N%6!P
XME4&NRT;?PQ\#/UY*6-;C$3_;M+ZAM]RS4,=KAC5W5NIA.:W?C>->P(:4GT;8
XMK_HO/?7Z5C@?ZU4]9/)&Y=E^S>#'>@J"$=&U3G1@2@EWN$*8)U9YK>:;[MDH
XM3+)*W8?4RSN:,NB_/]:Y5X,1ZO"4U'Z8[1#Y63F9*J_A8;7S#WJ#5F$OL=_G
XM?($._02C_Z]C^4<MHLJ[>MVY!<H/UV'5>V%Z"@77 J"0J/;QY_CS,:_0F^JA
XM" U!_A# PT(6C%P>S'"AS0YEVI=9OM8M\$/VT[2^R=;Y$N\TK/,Z$O*.._P2
XMC(PN00_BN<_U=CL%?0G':6D_U_2)B_X9?R'#8 4*7S9=N%XAO?<:T?&"6*IM
XM@VY<JODQ?:G&<<7?M5':U\+<_)RL JY= HDOM<(XO?V3A?<M')V;XXX7?=90
XMQL&\W?YV+_-V8#XDEZ#G\.J-HI9.)SY/T".>@$_B_K##9JM,IV87J(M55&6/
XM(@U\"!^U)RT8IY3RT7\M+1C7\_]=+BWA(E[ATX+Q',)'G/S:DT][R:>Y:$3<
XMJLC#4@C>J7-IT%/,:L?4MONF2YLD=(&THW+/(W,O.]GSSVM=0%-X!UCLL_(N
XMX!WLATQU8$/FG40BFN7!B"$=CN(A_4)A_",>S<WI3^A"T)>]=!\197YA 4@0
XM",]'I.S<4#GO56U:._(YW*QYP3@WNQXGW_,:=M@%3K?'!UE%7ZOWQXF/(W,U
XM;NKB^L'^\!YD,#*8U,BOI#\_3C">\P@N,/T3*3?4_"?2!.'-07BS0U4^K*Y\
XMH#EKCZ+$!_K_8!@,@R%SQ>UX;D[X*<+!2AX\PL]">#/9!LWM!-II36ZS.VSB
XM0$@UV_L-)5-?(%DD&!DVU!KM0^?_!^/Y"V=]?@CZ;.PG_]>F8:78_A:N>;[%
XM3[KO;2S8>[R85[>RS>_O\7D^EWM=77KG8S_D'[V$[+#D9TWP.CSH_6E8$IOL
XM\"A\RLP'>+.S\R%0P]Y-172BJ4BG%;$]")'W_TSNYFT^[^_SG_E<(F*\$<GE
XM1+*ZA*H=ATRW[_-N++N/M+/G3[!BG/\/XSGGV^-$X!XWEFMW"H?87"X-COH=
XM7C<E!%-:"MI)[]MIA9;TYO^<S,S\7('S'[<B#I) CGM>.^.(XZA1.V_4<0OM
XM3X)>OIF;B>H!V^N&\?;[LD>H'IFC>LU1/6"Y9:L>Q&S5:[;J ?NVHN#\<3],
XME^.J1V:I7K-4#ST>#CMONYW_\4Y=%HXC7)O;B:/1^PZ)GJ#W@YZOB@W'="E9
XM4CZ2+N5QKN"EC/$24UF=C4IL^)[@@G']D_R4ENAP^E*-[B<:SERXZ,LX#./8
XM9)(_R:&X%5_7EH]P"7KYB <J.W^2A7B0G_%*.T#XI_(.LTY<92#D3/)S: <
XM<K*E]&F'1B $I1T</++*0,B>Y&?3#@!D9^=GTPZ5D/"I[JAZP%4&0M8D/XMV
XM ""+=L"@^>ILY#JN!5H&AV%,IB'!.:516-DZL<1$_UX,A-5XDH:)%M<A*F.;
XMXQZOSFG_69?65;XU?FX?2%=UXVMC.:\1Y])"\8.13&9@M*^'5OH&XU&SJY2N
XM9!]G#48HYPZ1>?M&D3J:MPV3/LA5^^PFX;@"]=>PW?\5_]@F89$H2S.EU!#*
XM_[[FU?Q?R?_A\_^)5'Q4%G3'/6AI"-J2CQ^K$9?FN9(D62HKU-V>RU"'?7%>
XMM8YOE75U:;=V;.I:IZZT0S;?1^,F>\0N@#K.6MD@^4,\E5(P$CI<_53H:43<
XM*L%(?$B(C-(;C(0I6BD)]B&7^HNO?##R>*=A*5XB7I1ZD(5V[R)S+PPAC^?_
XM$/)DU^VO(<7X88<=0E:<59?D9TOXY6=I5'YSNY^$7]J9>X'&R$]#*%10'F_P
XMAT1YZ<LJJLW?BLGA(1 "LAP-6:-<*B2[N*FQNF \G<3^&Y'+:,3^VRN@?'/U
XMSPR=K<3+18"/<\$'7'4GY.X](*5'$&._PO $\A%2Q31G'&$37)@EU$]*;$=I
XM==WW%SEWDT".C-IM=?68*ES$]L(D\W02JB8KZ@61(\)$BK.H!%%<&&"T8K[C
XM_967GSSNA/D.Z41*V\!A)0AH/,ZN_V"<:?!0LX/I[YC0^>"-%1@7CL$BW/X,
XM;BNK2%&; $^@"(!(X?^_88)=#=?JML\EA@",<[6PZI#J.&0!-57##CL!T'/[
XM*;M>64\ WRINC$<VA,Q>FF4Z89F\*IO)_:$[B>N;&E;:3^Z-HG:2E$F'/.34
XM 9KU=]H1:2A(BD[%*_,K/R32?H+# _'%/]2L\V+9*>WQ-Z:3'/8KV+3RP^(V
XMCU$@]4!\*XJX1 C]:>>VI]SD_(PS*UK<CB0.6@E&O!+]YBBB8Q.W)^RP&?)@
XM1&KGA\WVFI%Q$G)$!I&+&-30,U12O4!X78A<R1G4Z(=$_AO/$7L!M7^VA:<P
XM<@KF9\W[_K#)8F/E.'RM#7E;6OC":+D0PVV!XL6ZNU4BRCPA0?D4H)VD25_0
XM7CH"6)I?$ OQG(9XPU*"X\$X/%!1.]W$) \/W6)IMO=GF29X^VHPG.8-E7!$
XM/"[I%=>*&;Z(6A,LLSEA5QA':/1:80F>#E40<H'1!.G1^,J%V1=R)J0#AH8=
XM-D,L7&\0D:P>>+IT5.R,O(9#A8(=Q^I:W5'\ M+4Q;Q\T"YTV_L[CZ\#/PGB
XMH7P,F%IW&I9+2,03+33MAU#859XCZ)XRN+Z[WZF7K3PEZD'#0VHAZJHZLYU(
XM2T<*'ZKY,=62JFEQ51LE\&[@0K[K<6<-,[Y97,%ZPS;6:3*3TKMN2HW[&W*9
XMDS5!Y+MZ5GM#CCFALEUHA"W<$!!OJ$B6@E^%#HG6F9B4T03!E1Q_+:AUY5H_
XM1W%<!23!_/6=XHQC($]&K;+^'T>V5E*MTZ '%X4!+KD^"(:RX3)C+>(JJ-Y6
XMIDD6.W&QW,KFH"<=05FI$!PN*![0:K@HE-D03L%Y J_40 +S%6J1&-=_G'Q/
XMCX80&$80$32.#0)!R0V#50M,Z!Y3:V-(1'TWX<S,AA_.7'!:/)@G3Y"@Z+:H
XM6HET@.:>K@K#::ZA)YQ*3T"@S8 $UB0:B[&#%/+*C2,'5+1E1>;E/O'VD:"M
XM\H7#E\1%+YB(;S<!DD&@HVYBKU6@ZC,/EIII(A:Y$?'!6H&)&-?XX5H>KD'Z
XM,)'.2B4'\I$<P]%IR.E?R>U!+9U;@D@1F1! $3> PB<$#'CCW.DN<EE#L @P
XMP"78)/"V-&@$ICP0E[-F=22F@:S(T17R,(5[K6$&:/N"1/=!KH#.YJP=$L$1
XM\<?2V20E&EO":9*&TE&G]'!!IU;*&ZO,=9BDP[62"E4;^WRP4(F50Q4B:#A6
XM& T*-84@W@\-:GG$IP\A&Y2*&4-N'HF)0;6 '1@#XU-8W33*/%_?:7)WZ-Q-
XM8#HU[=;<W\I":)($D5 ?RYJPQ;&80[70QP">R&)/KB!VUIJD/,<0<55-]KI/
XM[K:AH!+/J=IL JA.IP8D")ZKMLF(/Y0B@!!KK8#K:B0=47>RFER#'IQ!T%J>
XMS1FTPKUXL=R9PC$;KQXWBIRI:U.OJTMA0 G)D."-L$R1@/3KD)\?C: 8"2UT
XM),L0?D>@#:2^CJ0#1B "47"O=3YI,RP8+##&<IGL#0_D$1MJ,K.UY2*S+H>'
XM!$YI(BV+>U*85QWH2#!=^2'<J+C'"Z$+/U#4[F!<#S7-&:RA#"6>EO#YG,<+
XMQ$=01DD&""/SFL> Q\!4&S0NTC CW*!)"\:KS%++#^_QR-UW^&LIS/493JBS
XM&1BT@X4=,R>C,@6V5.#NVX+5QU__\9C5 /;VXVI!.3(#MF7ZNUQ:PE%\@IG<
XM-TK3L,/VN3#0QFOVOF7.U5U;N[;M93O:,.+)H:< 0-P.>R(E%*<+0\56&+MU
XM M=]Q/-R.1Q493W*6A2X:POAA:94*PD+;90E&'F@<)+0" Y] ]S.=51!.I@T
XM03W$1S)B$F#<135[_S9Y7> )5&# $E=+^9 7)PF/:UOBVPP(X>F^51VF*#XU
XM<42J621,5**JJ28>?&O?0=$?X7QG>%&:"=7+@Z'D/\RKD?";3R,!AUTS_J5M
XM;_!81_M5%.7FO(;[>M[59VL^U9N$\.E)*ED?2HH2QRDE/$(A0D/HC.*E@)E
XMC1Y#;E@BAX>)Q+FJFQ@.H5C^/T=((_5K+9U/N(B6X<))?IS!$4$-=MHK3G H
XM]2=D@R0B4YG;VL=Q9#A%:T2*5AM8* <GP)16&Q'! :Y)W#5(8K%D #\@+HN:
XMS M(A$!W-($ZB=&I)Z<3KH1Q\K"H(_BZ(0#5M&!\SKHP-VH0?5HPIO@BOX[_
XM%3YLK%M+5([V2*.M"-5\LSO_SJ_)<!'<3H)1,'(K8N@9[!;TH%VN?A[P2E<]
XM#V"A#5N7,-Y 5@D] OHD'O-Z8Z;:L^QX2GF=3F]U+L::K*%U-_8ZWR;';7U6
XM=%.2 2<(YJ0-+3'IANG _&[L$>PP7PO#HEN0GD74NVX5R!**;WT1KE*6T=W5
XM2C"&@[E(J@F>3&%TJNMXM\=^_'TK59X#K,5H2#:'#2(LKMIPA5A6L-DS MP=
XM'H6HM1*MWOQ_.#Q\$S:.EF! :3[&Q9>COA,0NXK#\,]@1!$?M>%QH>QQ 9DZ
XMR['G[,*CS#RBRD>"4@@F'[3/S2)3XA-1/B4&5>)CQ$+!N2X4 B82T!/E0?/
XM8R5)$,I@?>7VHMPLS"_,DV_P^1HADT4Y)AC$%=)A_0E,6%<5#9K6&)F]_[GO
XMI3^5=]]U?.,WQW4W2:'=E/TX?E9677W$94@"7MG>-*INB&O,T2P^= -G)D!Z
XM-@8JQ+@;HQ:"A#[A]QF(APQZZAK.X#+C*;(-*4#"2$S$SU,F"66D MSR&T9K
XM,> NHYA)L6[LVK'U?-?5CS'@&<Z"A!@1%UVWR)7"$+_ RI4;D6!ACU@&1AJF
XMXF#3:8W4 6_$(V &K/XLCW Z\FX+_%IZ&C>_G>9\G75IN6S*L&K!96IXV((&
XM<[A@9"R$E2*2*S<2(G7:K3#;@Q#!9&K2LRRWF+;-X_E872/6[])287S\"N:H
XM1:T34083,X'(4Y$\>!C/J\R%I*$ 3\6!A*<HT-6*'BHZKHV*%AV(]A*8D>S*
XM: _IV>[EM%T#N16XU+5DR0=>UAH)E[GHH0\UH D"#]K91%*Y6K.)5!QAQ,=5
XM)Z()A_:X)D>+LP=7H(%!X<"=#EOO9VM4K.FD4)H(VKL&[[: .\[J=C=R,]F=
XM<(?3NOM[O-<%- ;FDV+8ZO H5[62;Y'@2_59YN!\\ 7(H+I&AK/-&GO]1M#5
XM/B-%9#?,B,L>\3& VY,725HM_G''^RE:^P>3=HV:'\ K9$018(5@'0.DIOD2
XM,>F^-RTM%G]X+\]U:CPDD2,R]^-Z".4O$0V[$J_)[?:B7"D>E5OP=KEBW/XW
XM]*FC6>D3CL?XIGB4KQ:?8)C>ZW/&.(N?:<X<9R>2PM$5@3DO24DSM[E=%K.-
XMO12N$ 8.P1L=YAVN\"D5"*1'3)\7J?"^FH?W[^2$0D@@#P;JL?P,@,I8)")1
XMO RJ)3?D#7*):X;07R/SZ->/2&:?\SGR6?&Y8BD]^V @7,! )K:-;0V2UMH
XM"Q9$:M=]&D3&Q4+B'B/&&A6<*<"&&ES*46?L/TU6US[8:G-$R#_PH&"^'Q3<
XMH^&^59"&@#E2I($33$+2* ;)V*2A;%Z4!HTY3*7!45T5 [5ZI0>M'##K 6,X
XM.-]MM!+>V)349YC#Z,8>0W(6</I5L1LX0LJ<#-_6>-!'CL##^VQ: -\!'0$
XM 7^4.D+J'(8=,=11[@AXH 9/<[A0 V/C8$2-:M",T$<P2 T:=@BE!IJUZV5-
XMF) LE^3Q""^!![?,T@!#>YPM02#^9@F6YDBPQ BG6@EXB(9R.2;1P-L;E*+1
XM"XZ)38+!:'",PU$<$)PU(7' *Z@$Q %8,ELX' 3+,;&QPW!X(&AQ/@!Q<E6%
XMU4$OJC[=H3SW:H$ZX/<14>)3 Z9&PU>/GQ^G[2"@A0712,0ZT[PS/)6+X3;B
XMQ8HU333AFL;#4U61_66P8"!1_R6CO\EHX'2XHPS+_WZ7M#AVAQ$:<-+!F!9-
XMKNAPX\]C0NYD(.;'(LUQ]@2A4K X(55KZG21J+S>\$4H.[&"DX14XL9>+CV;
XM(6C$?O*3</]UWJ3@ZW+_L-(D>7JO9O L%_D^U:DK(B@L)UIX*'I\9&$0^!PA
XM9*H>6^,PDU]]X!J'ALRLD#@8!QF7<5!8U#BA2%Q%MF!*-.0A_U B)%2I!P['
XM.32/# %!PJQO)IFQCV!)N/:1.H=Q'_!6"@'_M"1BH4#0$XMR..LA9%1JUE .
XM!J;6T#Q'&NO@Y!H<^L'CZ-!Z#<5^0'WK(?6L0@\*U:;*@[8YX3$A?0<.^E"T
XM%D)V4-0'6"Z+31+2W<9$TB3'08^ A10F3U"1W]B6";"4B6)^((M0 (1\972Q
XMOC&ZPNBNBC0[?Q^03V2X36&$UX4%/68+&M_!B/Y3@R=,ZVJT[V#KZ6&SBPUE
XM &FDE\C.-[+!8EL,!8FPZ%A3=L2X - FRFNJ,*[0U, PK _+U, LTK0[+[Q&
XMRW=Y9R10$3HPD PA?*D>ASJ_GG\4.%_A#J:FSP#6#2P7[;26+PXGD 2D)(B-
XMKDP0L-[^MQT)_,L/1*@@F!^%&>$* (R$1Q/HQ#]S@A-!@&8RPP +!6DIEPFI
XM7*N@ZD,4-5/)3-S+),JGIX:!6^F@XQJG64/,=&*IO+H/Z:"'.6 4OBH$X&KF
XM"'7<-XZRH%H&E6^251P1Y(C@!H09 Q+"1$+C>]<C:@(\WY$ZB?V7S>50A1!(
XMK3M!6+8Y 0JO$J%$BH2S/&66PPY4 '!FE1 *1IA U)FH(23!M\.W<3^H.R%4
XMX"B$80X+(95JA)+#&_)?=GBMHYJTJKTL353AD[!$+,LY+12OY!)5K<QQM@9A
XMF"<?')NRKN-\@G1<JJ_X<V!.,6 GC4J!:3@\]%RY)@%#:L2^Q3];W=VW^@\+
XM \ A9W\K3X3[-^]; /;XIU2Z ?FL@@:'X%AS/>]#].XVEGM9#=:D82(A"@&%
XM0L*B8 ZKRJ&7G:^@Q=]-'V1 S%AH0+JV<A150$&7&%#ZE&0/BTB,0#8B;HI'
XM\AQ965!C9,4"0@LBAGIGMO!T'#O\D$C[G'\-:3#Z!)X@\XS)^5:=X;C6M2D+
XM4$*.]I=(FS!X;1V&\6J37KT=3 JH0A-.1T4@['V]RJ536L#@GH !QNZF!S0)
XM6/?-P%%F4.UW(].(Q?3[MMO4H$*\6 ;,&X]P#5$1,(O!"KDH'HD:(C!!8X8W
XM[/E=@0USRA$2AH>O8BH""(38=)A]DPPN=)4[!9Y&&?@.15AVW:%.?*6MT)*8
XM (T^3.5L>R)%A[;^4H- AHCZP7@(S-K >A%@< G2@X#$;52#97"\!.T\E $P
XMJSP4BK.8,:%=CH!,. T"3ID -1Z&V'CT]EK(#2PM 2F9(/4(!+A1#9!AA@D:
XM>.@"899W*%*G'=%>+$["37$ZW(_8RU]N7\[/$<X6-[!P:39+GKJ*/_.Y(!Z>
XM"T4F0D*XN^DH),8\6MU-]$!14CY1/$U8OG3C^0Q"C)7$ B80I8^0M1#.!R@+
XM"W#V1X3<Q(+Q'\"Q' C3AL"E(%4;(+4/%+@#HQT !G* TFT(* >), "'], )
XM-P0RF? V0&(?B!PNDOJ I/4%0U!C!N$20!6$'.4<R4((K6L99@FYA2 5H:LS
XMI\$(U(,K.N$31.I$'HXYH$A<"21E<@1. (5CXPSXV%,AQ-EXOHWMSV.#S_]L
XMC806"-H-[."0;48"=%Q.FPIW 0ELON@U^]*+/<4HS'%5OL(_4DVJVSZ7(G(1
XM&HR<*0K&"LN#[ZB2S8QGRE85&SYN+-=^F-AX9QQQU$WLM:!3Y+DO3R,AD@"'
XMPPY;BM$M//[=N=&((Y#FPQN4*=S<$%M,70DA]:GZ&V)SN30@R[(VSJ=A)5D"
XM.$]#2>B>X!&@HE'EVF8<"?NUGZH^A:H2@.0"95D":,EO2P!=PB6 P(!B=XVP
XM:Q%N#D;D&HV+'3&+DA *%3TJSW<V0 #ZT@88B%F(U$:);96#@8@;5R> AX1%
XM!B/.@ZC@1D?!_ Z:Q66Y43@=)GUH!6A(N0&PYYEN ,A"0Y@.[G("DBV1L.&,
XM I!F1Q(#L=EQ!7&KXSX#SZ?#' L\$S2,M\$*0<-I$C3I+=R0A@?-DQ"$ YH:
XM"KSA +#I">( *T*\QTT5D*S<^!<"41:, J6 FB0OD6>'Q(I'6#I8?$L!(T
XMYD=N2+V#8TH(N ')!@XE-P#1O- -(%S@6> (5XT@09.2$G3M]!20P$"*7>IX
XMVF"7[PTKC7T^EC@L<+B'CF3*L:&QDC8D'H( T&!P8#5."!\'!I2JF\5^?EX>
XM"NSBQ\B_"Q0I%?"JP@@%AD*#M>=&X[[K"!I. 2\.&DXC(Z&JS#!QF4%"F71B
XMIL),0-BBD![,N*FI"6W#.80@BL!4(K8Z!/&BXK51VM?"W/R<+*%7J<7_CN.^
XMUA6S\"QHK>-F(+4ZH6,AI(X[-YPY*5IGQ/ZPT%_!X=E"HNK@L9#DH5#U6?@%
XM86F,04#(,A7)[D/;8BT6" Q2BQ\7A-UAJR3C%7!PW(&'4/AE'YCW1B&T@F2Z
XM0"L@1!FWHR1WA\R*5A9\/E& "@,H^]V(PWB^"EQP+H;@C+BLHOWB<<.LRE#%
XMOH@EM+1(T0#M>*+7YZ-")W_9\Z5ABA;]B/EC %(5(:85A2,X1X9/NV$2A'I]
XM<@K<OH 91XW:>:..6Z9,]B] PRYTS8\S7P& D>("U.@I40M0"C8;867#?9N]
XM;(!]JM7MKC[+;6:#X;(16C: 4I_%;#2*-0V= ?,A><XUGN.0%X8 ^';B:/2^
XM0X0@?F.CXRE \D!'Y (=2TIL1VEU49D ;T;?H==D=K5ELFMD2#H[^!AETG9K
XM/ HSXBC*.PH3QB>2H#2L-#?TK3#;@Q#A\#$;$ZERL4F1*>^N-5G-^*8%X[HX
XM<!/2XN0+LJ@S"U"T%\AO>!NSE/^0(7Q@? ]I:;-I4@9P>(?G?P^Y=(?#&5#J
XMAX[#<ARX,--D!!]K[,=R'?-MD,AN$D'2Z=2A"7HU9=_\W1VI(,$+ (8$-14A
XM74#-TA7?"FJ!*)E*6FC" JP?SH0&<RW ^-TT=+AOH1E1N[Q%K0JXUMMN#7I1
XM*22P@E_S_<&X;K/E^(=GMF$"P]3P.$T=_VQUZ:):3A-+W<9R+ZN(VO,^@I'*
XM1=O=Y)DP'K.%,=_)<(\_ _I\A(>O!LGE/'6599A=8TXEQ:*;_0(.A@H-#+L
XML#>D+GJS1N&D*DLX.-,M\ 83UOXZ;E?NH2>%V4+E_O\D,R<&S6/>'KZCWMLJ
XM*B;N?_V(>.SUN]#A:V69M9%U*)PKR Y!BN$LUTB34$,B)-)_"'B<[9@!F7!,
XM<%YHZT+MM^ S/#^LL/XDM\#H6&5?%Z-C(?^YX;-34@K8BQ851]BO^I^/$F8X
XM(N#$1"KB0*0Q@CN@B8ZLGVHU]"CL_)2,M\M[$J[(4GW!_8X..7?FU:1$ZD^D
XMKI!K;G8P,GER0E4]X>KYC@MT^4ZR0Z6"5] 6_.'/@C]J\=Y+/LG5H %I=]L<
XM9GFE:7:?<-UPL_#$Y$K4)(?E0GAS#F0I88E8WEFD]PU9@BSQ;JQ8\'"^3R$6
XM/\H%= 4^A$!RGI?A6P:=#P:E];OAW,4OEV1N:Q@"<V]$+N4* GR<+H1C67E7
XM^BS#8U_-)ZPXN<1^YJ!J_5D>%S(LY*52I!C3=F^<E-+I)H>:;T)%ZF3>I7)O
XM;NNZSUOC%DIF/:9&@;N^N:X'0OUV3W5]!)TNFL2D_7$KXB#)T8F$0*T?(@P"
XMZ2%S67O0*BB<9<WQ'DZ)1L L@R3J(;0'WO7P;._AK@='/5:]_?2*WI)X&-2:
XM#7HJ>$[:]F5O[.=W>BA/Z]QF)UD_;$K.=G^297<*X#FEX(=$2/R<@C_],A?4
XM.XJ476+5%EXYMJYT;;V7O&]SI[F_E?NI(T/W/JJ0ZBK\LW.FS6N1C34Q=QCE
XMJX:0736)I1XE)RD8RE'4 (UINHK:5.=0"IH!#Y; "_BNAS=J=>G4KON$$HCN
XMP="=ACW!NX[@[>(=QS&0E -&8G@;,5W:-U>J( Z8L!$92M(@4-TY?+:@9I4/
XM Q\(V:':ZTB(&WD!\!&];ABO&DL1?!"@;@@?T& !F- E_-S_H"$IA@_8'-L#
XMK>&']D@-'_0DNH8/#[W7_AA& ?^"X2.($O@LG1&P9IP$+HO#@PI=RI5U=U@(
XM!@=,4%PN;C $78+*GB ,$K)#,)AI@GY;4>PA'_?#9$V@K<Y(8P(5 9S@OW F
XM72&)WA .J>,6M@T-? CFA'U,"Z;:".&#8D[0V7 V\3L/ATE4W.%MM4Y RSK
XMV"<0L^T3ICI*GX#5//-'7/-BF "/HQ@P@8:Z75QPJ@4[YO/4),;F4.[ ,/CK
XM@N11CB2V0LS) T^ZZMV C'/#IT\*?IT!TT(O";I .SO),/.A9$P",2)U9%S7
XM ^\4B(N%U$T ]3:!94H0;")=XR\':@O- CCTF5@5C602>DQ^C&B?567XICJ7
XM5^<D[%^_U@8<8S/L3]724&L.PMH#5[=F7L];MT9$"+8$([R#<?2@]6[_6+[C
XM!GQ$7&B!]3CFO-D.$=>%;Z?#< :K2=/TW*OY<0 Z[)B#<3TO&-?=X4)QV].*
XM2E=&IC L!?EB3.&X(AVQ(AW)<7]"*M(95$0*F2%2[M\1[O-/&%'/"S>R&@7P
XMYV0C'QRT85 -Z78HJD;(#([5(#HT!$,#%9VA\1R&!M <A@8(MT,S-(3,*$.C
XM%*D,[0[RQ^=?N<7!-VB VRH$#5!LAR;PP3O];=FD&A3>,*:F^7\'8!:PP_#I
XM&E F/I#< <@A</L]:&?A!LA;N &2[=#"#?X6;N#TAB1N7,>9C3H=Y'7G1FL4
XM^F<^%^5VXI%P>&$VT01#X[@0\# 7)!WVC$BUNH-Q;D[X:#^.+EDA6AW@DZ8
XM+Y,8 / (M"<.C=@0DA%QY"/C6!XS?#&?["S, Q@R$BZ#="BYZH*_E^XCHL0O
XMI"SH+S[ 3C*4!C=)C&J@P \7!$$8HXW+T^JQ\[._:)GBQ01ZF)B<'!J$2GC>
XML,.NS^5R. 3)*]0[R<VE@):PPTZXSAWHN"!LO8X94%7_['ELXXU[)^,-'X*"
XM0(M[T]X@HJZAM!8BX0I:B:1.V!"^A9/\W'P/K$6\*G"'\=CB3*S6M M2F."Q
XM JBIBS\PK(80V$LM2P@A 9JWBX2URU5A MYM2V[N\SA.P52&A&.:D"5]YR;
XM/^$]).EK?=R 3]U;C4\GQG>R%"Q2ZI Y4D<V9Q/:QK"'$_)F)HX(F6_&1T -
XM8,TS!;P1KC-HX<9E#^%<D+"#%@ILFO@X,6)R>]AMTR-U?2+<$4F@6LB(Y#7B
XMLM<C5KQSAR<8B5S*(M>RR'D5N:[!",+7I[3>'/]N*",P""05,3DU,2K -'Z[
XMEMN:DY5@U!=9-(1:(E)>JY&R7*$%"Z%DKQ[7B\MMZX)C A$:3(+1#_]#(NT?
XMWH^8V_!('J)P8?H:4-=)EL+P!6B57B(^L=;@!(6KM$%Y=GX<CR48UQWS./GA
XMU>DM)=SA:)Z%IZB.@_P_L13M!^/T<_[!. ;"=P2OQW$U\'I<$#Z8(0LD&,U?
XM^, DG^4% J/Y&E>:!^V:<FT28+9Z6, $9Q0K76N<^WH+K8@KP__^,V=! 59"
XM>F^[+%"7M=#C-2Q.(>YV[L8>X=YTX^B]:?2]6CR59ZU$;.SEDJF^R,EZ/YO1
XM-9?\VCA-?D234.7G&X.:5>^UELXG7$3C'BH<IZWSKW6Y&NL/$9-]U^/03J&A
XMZ5K9XZT&"0N#7?DAY 4M*M=SMQ5N&\]_2LW\GZ &+3218]#$ <8::KW8QQ"
XMF<W](1 "_T P"<@+5/6WX%CGLD;<Y26VBO(4J-BX\('2 R5 )O18IE._(EQ.
XM\K\9#K0B 4V1&Y%\^\FE;I*7Q]P"U.O2*G^)-<D-.[-?$%-GA.3W750BU1AM
XMK_<N$9M\7SWG.RCY !]'$',:<_W!^)P-(-9X/N/5Y(4UQRLM@$OHW'R%KWK(
XMY"<\ZT7UES5NUM/9PJ]FV^;SQ !5\S$N4%?Q@Z0U".= EQE&(*?>QWT/@GFQ
XM4A8X8=RD\KL(GV-AI?U,(*4V"I39V:S&.3P6J])^3._#PI9)B0GTN'N45FVA
XM<L0%G]R^?UGF6-CENK=""T"2(#9\P /R%PGQR(/QG&=8D=2G>'XPENPOAIU_
XM!6.$_T.(X@TABL^))T0)CLEA[6.D7]2*E=994[M0K1J,YX(X^=*6\\OA'9[2
XM9#HQB( 6R&&O&Z3#A5%')M;S-WB)'Y<)N(/,_]5&1,E_;Q&>,]_BUQ!>KP31
XML[00RF:'JD*IJD_(6T+(ZF:S,;&#8-8(B2HY8->8FO%\FE)JI1?)33MJ5: D
XM!Z:&,QAXA &.2)@".)QV,.P$*S<37F)J21%.G#6!!$TX_OO7<[?4IZ[*IO,9
XM.%U@IE=([WRDZ7TLJU"$LYOTX@$^8GE7^/N&K""E33BI&50EM1+-(6,=)3\;
XM'!70)E+)%7&5"+/E% /YM;'=]X'0 BX*L/VV1)Q+6F]$?.U&@MFE+?.NS(2E
XMK1.^0WV&"T8>02N^_X^4&2\WHMH?EM+W?$T=VMSWQ<10"S$:#H$35N57R;:R
XM'.Z7')YA#K<7&.68DV)+A,HUK(#RK"^1$%)8K)B&J^ZU0D>1%. Q5;T/.VP[
XM(<4)]:U(OUQ5WUOAEU'VWBB4O-+\@EB%&TG:Z@]Z@U:4=H@42$V$?\3+7ZSY
XM<<P[5@'ED4"'P7X\ET'/HH,+G1'H(GY'"J%0\20,P[';[5OM[?]I-/;YP,-9
XMT,'# 4#1:J.F-]_ETA*.X@8_P<UPK3D__CK/W[R!F:EAB_VVBSPYF-=#K:!B
XM%8Q:EU6! /2-B@^CP@XZ[_.\&[1A([H8<N,9+?(A;K4,S>,:16LO%1J24%?^
XM<]1!^D4'NLO3A'%FD"E%!N51AS%4B=L#5::\1J0Z54Q=7#)N][#3BM@>A,A+
XM)BOVXWI(@"2N%ZSC?%?98V/9XY#-$\C6Y-![G59JOZW8BF S[(A64IDA&!-A
XM.B+S,$Q"B P*J>#8@AWD1\A=4!R <3 RJ'9=/II;-T^9^-".N$M8#H6SD7%&
XM>RG<!L]\^86C@C^)'CTG'^%G\PG;NR-<YT_=\+F?]XTC%+_#RB4);$9R]ANK
XM?>)QL>FOUQ+N[[+.,YZT1JYW<"P'%^8=KKG305;"O*SW<02XX"$9;4BG(QB=
XMHW%T?NI3]P,5,3^K[,%Q"!>[)M_EG9WTO#[56Y> H1UR1;O*\JGOP42@NI8I
XM> E#K;L?6@<3TF@:["A;A3W"1)@FG;%QMFX(A&LW>)E#OVO#8B][R6)&=,__
XM=W@GW+V[M3U4W.E.3'1X!:A&B2<T"QL5Y5S7;J,2C PH;$W497?POS>C%VC"
XM14KL-78T.(U1693[% !)P.X%[ BQ14@7M<.=*$C#<WC#4[R&,U(PST/;$Q"Q
XM0RIYZD<G? ,5XGQ#Z/CV.B0V0F@.!4+$ U!+ P0* 8 !@ HBDT;@\@_1C(H
XM !HU0 #P $%#0U0O34547U9!4E,N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'
XM" 8%!@<&!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E
XM!"4$"@8$!10%"30'!A<)&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:
XMVSP%!A(C%.7VEO<Q8_W))"<S_[?F^V?^;F/YT;.+BHN*___);RMB&.-..V\4
XM[?]QXA\<R[T=]_+'C<8^'\MU5'_R;?+_>I1+_ZG>QU)4'#=NZK/>];\??ZG<
XM?Y2<R//4?X1[6Z_]R.>X\QK*U]%>"K==U<KR"T<%?Q(]>DX^PL_^S7"_=T>X
XMSI^Z[?''>=_Y7-=R:39_1]I_N_/_3SPNVF<)]_?:'\^-A/,YZC]63. WF-3O
XMVG7<_]A;;[LUZ$4E.1YU%%'E=7JNHW'.]?O'>6:?-:\2A^582#26<*4[KQ*6
XMR?$UW!J3Y5U='IFW9ONI^HC)[6&W377\.<^]P7??1_VJ<9VT$WM61Y:Q3HAN
XMNU&F\;K4KUUI ;W 'E>ZE!*6]7@T9Y73VKG'5YZU@CQF&]@X2T.B^3[7FZ21
XMQWFM"]/^7S%/;0^_S*5VG?>:_V>&['40)$=XMC6O 5,Q;.S<J[ ->96]&W+=
XM&PGW G,$2ERT7F)>A]BA2L_VE%T.5;\VQD/'O&HHA]IV\MS\8"*6&DV<@ZU%
XMO!7"T(>RNTCL16=PGA.S'N=@2S 'HW90H!69@XUHWI4[*->#$+&V0@[L7%<_
XM6)EO/! C7HTR],#0?+PS8V2(>,3$WB!TE9C>OOS2MD>XZA1Q4>]VU#_8KO!_
XMWW[UB@#H]MZV?5M__+54?GL^NNT/%!'EIU'A_C%+ @E#S%Y[8SG1$W(3])GE
XMB&5?XV4.A156:#C+&Z&,YL$E'MSE578/I9HOWJY<M4.AVTOL]ZE=JO'^7"(/
XM_+,>$V-_T4?*%TD?"=+(.#P.DQQYE4LGRQ'EJ^GHP..4[R4BA!?RRWZLRW,L
XMZZ_MD);N5WWEG)X[48WP1MSN9=Z.8(3R1@#Z0OM:(G*]A05%Q2'X?]#3MO%!
XMKQ5Q/!JUO*S_)/]GY_\8^1#7Z-&93A,CCA-'8?;'O2'3D5D*]V1B^C8JSV9G
XM2L3ZO3:V2*'^M!^G=[>VA]\\&I/Y$K]O"=_CUVI7P\30,'+R<N-X;:R5[W+5
XM[9X0E#1C_J"_ZN\'.0N\62 7DXO%SM>XY.3G!#W7;]=?ZYZW;]6\^E[/NW!T
XMS2MM5X3'*GZ#O!A_Y3&'WBR&YI5WN'[?\G+R<HQ;UV6;V?51ZNMIGC?S@W%9
XMO8:+?TOW]?[E>5U^\_[G'?YJ[-7M*55.?..M?F_,P?!ZCZ?LE[U/"MV ;PB&
XM8/(@U;9#\'.#7G[<N-'S?[O5H377W6&\G?:@VXLX?-NC3O[O='O]T/(E5B,G
XM=SGHY2L>GJ-XVDT-L<&0J*MXT7@)#W0VX6EK *X^&(79SO^)21@OX(')D1RF
XMGK]17[H]2.DE)J>^B -+^(1@"")% 6E"7FIY/,H@:I3(X];;21YWP@3]D3N#
XMUDLR*,\C<CP/-J7?[0XM#\ALRX,=],:C5D2J;C>QY7G 9HI/DL>A1VPGI@Z&
XMNA\X%O8\&@QZPS=TO\:VZZCMH >9 WIHVY31(.E].^/AD*20I <VF_302DE&
XM@_ZXW9)*F.J!S5(]\$F=-PS5 SJ&3R$P3X#6B*-NO_]"E2H58#.4"MB.4@$R
XM0ZG @IYT$OMO>Q B3$.@'EBG@D(]08J+>+,>4.GD$>PHL=-YI3[4&K']JD?
XM1"<]V#?Y[41]>Z/04 \LZV$Y1B5.!6)*"]T_LE5!UQ:I09&>2A5(TKO=&K<2
XMVZ8'-%2!3&DI+=3N*>,1?D2J'GC0 *5ZY'@88J2_UVJ%E@1[0&62>J!ACZ3U
XM^K8I&E Q; _XY'$[3-@#.D.C@;-P*M$ GXYZP&L-X*,S-'!RMO V(">YK@<*
XM:X"8* <04/_P;8T'?=P&Q$0Z@,!Z3&P #QZ@&!I)>P,WP* '*-E#@@W@]2((
XM409 'D!/]"((408^'D!,\"((KJ>\#; Y?A$$VE/?!D0.800AR@#' Y@<OPB"
XMZ:G5 !XO@A %56;:!H1<!('UIAK 2UE0!(W!> "58V1!J1Z<UP">.4 9-,;B
XM 7@.=8""/137 )'MIH&0-$QLC\9]V@9TMID&0G?4>ENF!SB$!,%6#*X<T /.
XMOT @D"N:@,AV+ZA1-]'4J>B;F 0_BQ[0X 4E>@RGZGE FSI0GB?#;N2>T0 N
XM"].!,CU":8#(8G2@V+G$IAYT:-A0J ?>T8%"/<;-AC"]50\)>T8]^QZ1XWO$
XMJ,,V<%[P1[Q<\8?G&_@<60X,^M!ND3!_#QYXYF/0A\P6'<"/1Z(#R&S1 9+Y
XMBPX@LD0'TOR(;,5&=OOCEJQSJOBQQGY&7)JGZL!GJ0XD]J%M$MGM*S8,^T##
XMV;CL $/9T-8'FM3&K0]B-VD<HHDO]36UWR5L,-:' 40VB"#@TZFZ#;$Q>)"T
XM9_4$ NTM0('"/8@>!0[WT.W7C-QNAXR*P#V( 4.]\J@"=PLH*GM 6=KX+8'
XMF3QNC:*$,>XG8E/@N@<1VL#-&UA/LGD/:'4#YSV((9:8G$1:HGN8[V%X'G-$
XMP(];=K-: L'WE"V!,":D@ 8^\'0) O"16AR$0@&'?&J80$0^DD!(G0]8S03!
XM^> ] A"03TT3"&-Q"@+X@(65<> #7G$ IRWC5 T<-P=I?,!1D#'C X4X@&<A
XM8U(-' 0;(SY@42P@$!\A.8!S]D&@:B01&ZY\P#I90%0^#CF TPF $R4C@0]8
XMG0 X73+,^(#%"8"3)D,R'W#49(SY0/ H@&<G8UP-/)8+T 0DS/= ,!S X03
XMR9#@Q >L3 "<$@GS/6 %#!"8&H-R 9*,A D?<(X#.%X?!*?&F%P HR1AR >2
XM<0#/2L*P&D1A$M$]8$T5P&F3,-\#%C,!!P"BL&!P51%+C#A.'(79'_>&HB)S
XM@49/+^4YN4T.WG9'E*ORH* U#\_1/"A6%LSRP&=;'GPO:3P*TX4$ISSP690'
XMWTJE_/UN5,H#.I/RX)-#3PJSU1FWA >H&)8'ZS* R=!J<'[ @3R@20 $\@C'
XMIS,*@_* I@ 0D\'MV'E5!FC!E_*04<;M*"H[BN4!11[!6;ZCY"3* \H[@FNY
XM+"$B>4!K1["2+X2VR@#%'<%%'1'(06-LZ@-Z(A[!T"; 3[PCN'$8@V'_37H[
XMD]S<7,\#VCR"2Q[T0 \,Z:%XL19]2(],&O7><2?Y3<89X*TPECQ$"N0!'B8%
XM\O#4\9#<V[\!IT<P[L!W4Q-3+ \(E!3+P_O==HOR( 2]8(3?O8ZEJ+BQETO/
XM=A<>3_F6[\_[4/@8;P[&DU, ]OSMKEZ ?_O[58\+\L8"NSH\.<%(Z0C:K_1P
XMWHZOT ]!I$,;7?FN,6-AO#_MEZ_C*L_EO]<$G_\<=<3GQXHI=5^U7RCSA 32
XM)*[<C?)J7N]SO5V.(TV4?\T)-<+?UN4?^S$M/TNC<AW5WPRWW,;G^,IUWLKO
XM=/K#^KD%?#NN^RL_RW_ZV?YEG9=Y._Z4_W4ZS0D[;*G+).RPK8Z0F@0]F#'
XMNGZ/Y<^EO^QP:W6I2'37RKZQ===ELUHI&A3%*.KC-?-=\_^Z_VOYU_KCG/>Z
XMQH$\/ ?RGD">.$TXKKG!*"[5NK-LBWG]@OF_0S8_I^83]'2S,6.A_5B_>B_M
XMY5F2ENU/ 2_/+^WXM>4&WDOE%EKJ3+'7TSSO_/^L/_X^3X?W6F*OD,\2KG13
XM9CCZ?)',TV@ [M_8CV7;SW^JYGE4+]<SJ!G]?X=_&HMG:VW?L!_FB_HC]-G^
XMFD_2"C3?];P/^![[DH_Y:+^4M]&O/;!YOMM\AU\\3T_+W]BKVU.J7(WG/,/]
XMIX:\5&[%9Q/J;_EX_>_'K7U,;?BQ_Z=4VO:2ZE^T1AJ<NWDK[OFHY_]>8K]/
XM>!A]/T=L5)[-:&^B+WY37S^PO@G[?,VFE'WCS->=\TE;(Y;OI;+7Z7T5]QM7
XM,"88Q66*.NAAUGP=E[C09H8_L45RT>X@;]=D"V^_6]HOX.DQEYN@7F7C<W-Z
XMU:WKXS/-FC?+O^K3R^5!O0@_LA?L.6XLS-5F;'>3O+2OVX6Q665(D17N2.]
XMZ0YFCF@9$C>67*]W!$F$$C_2N>/82&?D+WZH5<3CG\,IBS4D3F'!"/UTHO?6
XMYJ.Q7+MGG<OQ*F1B 3[L#MS,?VZP11HW5H02GPT9/A@A-RZ:)1@'(Y41(^]U
XM/A?!0RK:V]H4T,+P+$@-J\W\1<8,QV^BV>=JY8O#7Z^0WGNM4&RR%L04N5(.
XM48#1U;SK^P]!XD[J=3Q;N+_>S^;:/Q'N[:D2.S_-?5Y^C,]OJG%69S]U^&J.
XMLT7_#^__"YL_[+\4Q!2TY/\()98?<I!QI/"ATIP]VCQ?UL"II]XA$4K3L$SN
XM0O-=P'&Q^06(9PN[D->0H+=6Z(3WM"5YCW#+.9>0=_Q!-0)NUJT3/NP)3P;J
XM<;)?]K*F5:G3H(=K&G8-B339C=Y"Y+10?%V85N)!Q?7H0\*C .NUPPX[0BE?
XMX8<O^!#1+CN%WZ#*_[8*A_MAI?DX"*U1T48/2!L+@1#XA>3!(0\Y=G,:>EY0
XM0+7$Q?3%OXY5:/JJ:0WCV0H*"DE74 <!Z*BHHXH.SM;A?SVOH4S3LX-\I52*
XMY2:-<:%TXW+Q]6:Y2GNUTY 2/L<5U#0NHR8:#\5#==5^'=HPCYGYK?+G8[VJ
XM<M;_W#6UUZ-<BEBZ[RWB4Z]OSNGAW3BY^[J_DQOM1RPU\AHPE:+B"([^OWZM
XMI?,)%[&\5@L]SUQ>EJM,63]EJ)["-=$OL' 33*Y:_:[]<6+$Y/:PV[;WK=-;
XM7NZ#+EOG2A'X:Z.TKX6Y^3E9G(4T/A=\+.-CJ17&"<:Y.76#-QK"^W\<:/.]
XM'K&2K_"6%9[5\-0K1.[B\>/0G*I<T5:3<WQ$4OO389/SSM)8J7CKG-+VP41<
XM,L:762,N?PE&^-.%S%'G@6 ZA,L9]%H8\@4T=!&);8"<D4X0FAL"=S2$%Z&#
XM=(+YKI$FDU#S&=X<ACN+X<X,-1_GR>"XTT/E/<:;[-; Q G&:P@?<?+Y&@/J
XM'/6K)A$IN=WX[5INI2Z=7U'W]JT8-K<T%ARO$9X3C6>4J\DUHJ!JM%?D8A\"
XMH."KO5J!%?H,\9V/CIB&0A\=&6OY.WA;']70/NG,YVW\98>.6#^LUHR-DM@I
XMX3YZTG_6983I?3>6%J1?\Z,B$/RNG7OE*Y1#@ >GIU,T@R!RQ,Q0HU?T<5KP
XM^4@U$>Q7$XLH)*!L0G2&U;Q4GH7G7G_EWF U*B)"NPA(3%JAKZ/$)(W.CX[*
XM^9].FN7LP8GIH?W%QG*>@Q'JX<1\RGOKLDMZI=BQ5W8!DHP/4IB%B'] V&6:
XMYC$>$8NY-1AI\\"K-1-(YX+R<1,F 3VR,%8LL,(*"TQX0$&5YM'PA$/[\-!@
XMVB7*9KUS$^;Q^9#BDN(@/QA!6ABCBJS/Y7(X35% C1#+5$]"($3!DT!1R>60
XMAJ!2287^9F,OA2LLM(Y4[@SY54YH#YZ&,YE0Q>L")$-,IN:RBC'%YFK=N TW
XM+E?64B8NA>@6$%'BVC^J8EFO?*5K_(65)153?JI7HT!:<^-AU0_C[;3]H(XX
XM?-NC3C0[79"/+QO$+W3DOLK6$>OWVMB0=>K46HC@X056QX*1]:$'0^A#(/,5
XM[WI!"J-\H*\Z\4EBDCA4><\TW8AZUS02[HI*7 ]\R-%.9$\&*;W$Y-37J*GM
XMD50<G7RO6EOXO:C]K<[CELIY([&_0(K*'PCVIU$&4:-$=H;:!/!.F'9-A1+!
XM;*<PEHM_ ;+"U&/HAO838"8-7)2K6HG,0WI+?K8$E28<<'>'*D-O4LY]KXL,
XM,>B)@!Q1(0OCKC+ R7>Q#_S@@/6^(EQ+.$*]?O;H)_UQNQ5QU.WW7_LK_ $G
XMHR$,!KS6(02646*G0P9UQ$YB_XTH"#S $<L*TFA!J-YVQST58\!+6_RVXGZ
XM]D:A$0W]><OW5KV/1CC74Z91!0 <:("C5BC]6<=#XME"[@'2$(!0C/T.GD/N
XM&G$A220; -4[\$?I:23<9BRQNSH!B-V!7R(V\?ZY5_&.R0 PM W*K)C*J$\#
XM7W["1RPE+!$W G?H(Y@&ASY*@#I(5@!#'RTX:N<>+]Y(;0 1;^!3X-[.W; F
XM;$59:$AD /4NX")2H\Q_)"L ZQW8RK-6(@)C;7@H3H 2'H@6&'%/)". F1LM
XM6+"F<E^JD<0 PEFH@?,M[ZXY)#\ !3+0F6HCHKXPIL+9 L(R(K5<9#D\3DQI
XM H 2).>/RMT$'T_5NFC,U 7D.(S!L/\FO9U);FYN-!\\>)+!$JYSMQ:$RL6$
XMB0)SXHIN9BXWYK##!AA,]3"-DU@::S]F(<E)V"Z.Q+1Y"AQX$2<(L0W!Q",L
XM#7#)@YY+ TRA.>S\BXQ3PR6W'W9FOR!FH<RQL,MURQGC+7#ZFD,IT 8>>$D:
XM]=YQ)_E--D]PBCPW]HV >VTQ$@!$TBC%^, (?N8#@-3Q$-B<V06N^=1E#6B(
XMOIN:F,)WH(^].=< #]GOMEM^!_K<UX7O%+NHXL&2J0!LE6(!80:68<]OI]/M
XM%,9A0Y.@QP4'BL,I.ON+]W?#+%P*1&Y9I2%HBN1%BM%VJS/H175#$ATX?)(?
XMI[=#7N(X(JM]31GWVR_$P"M3"S&$P5<8\+YVH[Z= H6!-+!;O3>& :@Q&@5Q
XM':N ]*IB6U5EU=.;8M:F!N?K4(J3C- -)5&K^'%0R)D'_:Q'1&[]]28QRW7)
XM_R'7ON;;@P=M).3:=SZ\*1RW'57H7XZI+D3X&VSJ(T6V?0/G:,6U6_!C%4)Y
XM@8[*TS;?VG<PDBH(J$*BPZ,:3@50DBK^+[M"FV! JG$-Z^>&3TE)2>$L$+"^
XM9@%&&Y):*UH 63BQTD*LBG;!;7S@/:'0%/("P)I/P[Q0+_$"P7 E+X!ND%>=
XMA#$O:$N3H!<WT M0%!"HAWOAXFW]@G2[4FE'@J5F/!QV(O;?'BW(L1HE6YK(
XM5U0-BE_ >KT\(V;UQ*Q*<CRL[WU,L$"P:D4LX'2G@JFFN\ BP@UGC@@TWC?Y
XM-*] )$ )?UAV@Q4Q>,?L:CP"IH(#TL%J@:(>$!Y (3X2=:3LW% 5/)1IHN!A
XMR:'W.JW4?MLQ02!NQ?" @FA)^R8XI/*8L>++2F]GZA[5^Q_W7;]Y(9C1@C#Y
XM'!795X.!-,""MWOBJK?WTGU$W%Q^1!:0YN;S3PN,KN:#'AQ(U)[PS.D',J[\
XM-.Y'%M3RW!#@?W.?%DA=%(:<Y"-,>2YKB3B\U H)=GX<]?<S_1^,ZV[/78^C
XM-@:[F VI\&7.)DO0HVO!&24^YH'AOV&?*G\G#-Q 9MY;_>"TSV0^2+9"7D=M
XMC[A@@!8Y7K_#H]-H,YR)GTWH+2Q@R7C[<.8XN(]ZX8*J;D?WV<Q1;.&A/_*-
XMU/(A.3RPH^>(;4)Z=V<?[C?0;N-%V0)6_A A\7.L#P1E4+$^X @]2'>7MT4'
XMET@@@T\GH9)]'M<H[BLE>)LW0U:2O42,J6>_@^($,H6O\'5MN^]"=S].#_DA
END_OF_FILE
if test 55800 -ne `wc -c <'netramet/pc/NTM.Zip.UU.D'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU.D'\" unpacked with wrong size!


else
PARTS=""
for I in A B C D E ; do
if test -f netramet/pc/NTM.Zip.UU.$I ; then
PARTS="${PARTS}${I}"
fi
if test "${PARTS}" = "ABCDE" ; then
echo shar: Combining \"'netramet/pc/NTM.Zip.UU'\" \(264641 characters\)
cat netramet/pc/NTM.Zip.UU.[A-E] > 'netramet/pc/NTM.Zip.UU'
if test 264641 -ne `wc -c <'netramet/pc/NTM.Zip.UU'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU'\" combined with wrong size!
else
rm netramet/pc/NTM.Zip.UU.[A-E]
echo shar: Uudecoding \"'netramet/pc/NTM.Zip'\" \(192048 characters\)
cat netramet/pc/NTM.Zip.UU | uudecode
if test 192048 -ne `wc -c <'netramet/pc/NeTraMet.zip'`; then
echo shar: \"'netramet/pc/NTM.Zip'\" uudecoded with wrong size!
else
rm netramet/pc/NTM.Zip.UU
fi
fi
fi
done
fi

# end of 'netramet/pc/NTM.Zip.UU.D'
fi
if test -f 'netramet/src/apps/snmpnetstat/main.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/main.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpnetstat/main.c'\" \(6388 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/main.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X/*
X * Copyright (c) 1983,1988 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xchar copyright[] =
X"@(#) Copyright (c) 1983 Regents of the University of California.\n\
X All rights reserved.\n";
X#endif not lint
X
X#include <sys/types.h>
X#include <sys/param.h>
X
X#include <sys/socket.h>
X#include <sys/time.h>
X
X#include <ctype.h>
X#include <errno.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <netinet/in.h>
X
X#include "ausnmp.h"
X#include "asn1.h"
X#include "snmp.h"
X#include "snmpapi.h"
X
X/* internet protocols */
Xextern int protopr();
Xextern int tcp_stats(), udp_stats(), ip_stats(), icmp_stats();
X
X#define NULLPROTOX ((struct protox *) 0)
Xstruct protox {
X u_char pr_wanted; /* 1 if wanted, 0 otherwise */
X int (*pr_cblocks)(); /* control blocks printing routine */
X int (*pr_stats)(); /* statistics printing routine */
X char *pr_name; /* well-known name */
X} protox[] = {
X { 1, protopr, tcp_stats, "tcp" },
X { 1, 0, udp_stats, "udp" },
X { 1, 0, ip_stats, "ip" },
X { 1, 0, icmp_stats, "icmp" },
X { 0, 0, 0, 0 }
X};
X
Xint aflag;
Xint iflag;
Xint nflag;
Xint pflag;
Xint rflag;
Xint sflag;
Xint interval;
Xchar *interface;
Xchar usage[] = "host community [ -ainrs ] [-p proto] [-I interface] [ interval ]";
X
Xint debug = 0;
X
X
X/* extern char *malloc(); /* in ausnmp.h */
X
Xstruct snmp_session *Session;
Xint snmp_dump_packet = 0;
Xint print_errors = 0;
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X char *cp, *name;
X char *host;
X register struct protoent *p;
X register struct protox *tp; /* for printing cblocks & stats */
X struct protox *name2protox(); /* for -p */
X char *community;
X struct snmp_session session;
X
X name = argv[0];
X argc--, argv++;
X if (argc--)
X host = *argv++;
X if (argc--)
X community = *argv++;
X else
X goto use;
X while (argc > 0 && **argv == '-') {
X for (cp = &argv[0][1]; *cp; cp++)
X switch(*cp) {
X
X case 'a':
X aflag++;
X break;
X
X case 'i':
X iflag++;
X break;
X
X case 'n':
X nflag++;
X break;
X
X case 'r':
X rflag++;
X break;
X
X case 's':
X sflag++;
X break;
X
X case 'p':
X argv++;
X argc--;
X if (argc == 0)
X goto use;
X if ((tp = name2protox(*argv)) == NULLPROTOX) {
X fprintf(stderr, "%s: unknown or uninstrumented protocol\n",
X *argv);
X exit(10);
X }
X pflag++;
X break;
X
X case 'I':
X iflag++;
X if (*(interface = cp + 1) == 0) {
X if ((interface = argv[1]) == 0)
X break;
X argv++;
X argc--;
X }
X for (cp = interface; *cp; cp++)
X ;
X cp--;
X break;
X
X default:
Xuse:
X printf("usage: %s %s\n", name, usage);
X exit(1);
X }
X argv++, argc--;
X }
X if (argc > 0 && isdigit(argv[0][0])) {
X interval = atoi(argv[0]);
X if (interval <= 0)
X goto use;
X argv++, argc--;
X iflag++;
X }
X
X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = host;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X Session = snmp_open(&session);
X if (Session == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X if (pflag) {
X if (tp->pr_stats)
X (*tp->pr_stats)();
X else
X printf("%s: no stats routine\n", tp->pr_name);
X exit(0);
X }
X /*
X * Keep file descriptors open to avoid overhead
X * of open/close on each call to get* routines.
X */
X sethostent(1);
X setnetent(1);
X if (iflag) {
X intpr(interval);
X exit(0);
X }
X if (rflag) {
X if (sflag)
X rt_stats();
X else
X routepr();
X exit(0);
X }
X
X setprotoent(1);
X setservent(1);
X while (p = getprotoent()) {
X
X for (tp = protox; tp->pr_name; tp++)
X if (strcmp(tp->pr_name, p->p_name) == 0)
X break;
X if (tp->pr_name == 0 || tp->pr_wanted == 0)
X continue;
X if (sflag) {
X if (tp->pr_stats)
X (*tp->pr_stats)();
X } else
X if (tp->pr_cblocks)
X (*tp->pr_cblocks)();
X }
X endprotoent();
X exit(0);
X}
X
Xchar *
Xplural(n)
X int n;
X{
X
X return (n != 1 ? "s" : "");
X}
X
X/*
X * Find the protox for the given "well-known" name.
X */
Xstruct protox *
Xknownname(name)
X char *name;
X{
X struct protox *tp;
X
X for (tp = protox; tp->pr_name; tp++)
X if (strcmp(tp->pr_name, name) == 0)
X return(tp);
X return(NULLPROTOX);
X}
X
X/*
X * Find the protox corresponding to name.
X */
Xstruct protox *
Xname2protox(name)
X char *name;
X{
X struct protox *tp;
X char **alias; /* alias from p->aliases */
X struct protoent *p;
X
X /*
X * Try to find the name in the list of "well-known" names. If that
X * fails, check if name is an alias for an Internet protocol.
X */
X if (tp = knownname(name))
X return(tp);
X
X setprotoent(1); /* make protocol lookup cheaper */
X while (p = getprotoent()) {
X /* assert: name not same as p->name */
X for (alias = p->p_aliases; *alias; alias++)
X if (strcmp(name, *alias) == 0) {
X endprotoent();
X return(knownname(p->p_name));
X }
X }
X endprotoent();
X return(NULLPROTOX);
X}
END_OF_FILE
if test 6388 -ne `wc -c <'netramet/src/apps/snmpnetstat/main.c'`; then
echo shar: \"'netramet/src/apps/snmpnetstat/main.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/main.c'
fi
echo shar: End of archive 3 \(of 25\).
cp /dev/null ark3isdone

J Nevil Brownlee

unread,
Nov 6, 1993, 12:36:06 PM11/6/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 90
Archive-name: netramet/part02
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/pc/NeTraMet.exe.UU.A
# netramet/src/apps/snmpnetstat/main.h


# Wrapped by kent@sparky on Tue Nov 2 18:17:04 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 2 (of 25)."'
if test -f 'netramet/pc/NeTraMet.exe.UU.A' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NeTraMet.exe.UU.A'\"
else
echo shar: Extracting \"'netramet/pc/NeTraMet.exe.UU.A'\" \(61973 characters\)
sed "s/^X//" >'netramet/pc/NeTraMet.exe.UU.A' <<'END_OF_FILE'
Xbegin 640 netramet/pc/NeTraMet.exe
XM35JP *$ !0 @ "(#__\%%X /@ $ ^S!J<@
XM ! W@ ! ! #VB D,0
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM "Z\0XNB18U K0PS2&++@( BQXL ([:HY C :.
XM (D>B@")+J8 Z#T!Q#Z( (O'B]BY_W_\\J[C84,F. 5U]H#-@/?9B0Z( +D!
XM -/C@\,(@^/XB1Z, (S:*^J+/IY.@?\ G,'OP "B3Z>3H''/H%R* ,^EDYR
XM(K$$T^]'.^]R&8,^GDX = >#/I9. '4.OP 0.^]W!XO]ZP/IA &+WP/:B1Z>
XM (D>H@"AC@ KV([ M$I7S2%?T^?ZCM*+Y_LSP"Z.!C4"OZ!/N3Z!*\_\\ZJT
XM ,T:B1:4 (D.E@ S[;CO#H[8O@ OQ@ Z.H +HX>-0(NQ@;G 7(NQ@;6 0#_
XM-H8 _S:$ /\V@@#HQP)0Z+G#N/ .CMB^" "_" #HN NCAXU O\6(DW_%B1-
XM_Q8F32Z.'C4"Z'( ,\"+\+DM ($@-0 1N+X+:4,= FY&0"Z+0#HQ0"+[+1,
XMBD8"S2&Y#@"Z1@#IP0 >N US2&)'G( C 9T +@$-<TAB1YV (P&> "X!37-
XM(8D>>@",!GP N 8US2&)'GX C : +@ )8S*CMJZ7 '-(1_#'K@ )<46<@#-
XM(1\>N 0EQ19V ,TA'QZX!27%%GH S2$?'K@&)<46?@#-(1_#M/^+UXO>.]]T
XM%( __W0*.&<!=P6*9P&+TX/#!NOH.]=T((O:'@<&@#\ Q@?_+HX>-0)T!R;_
XM7P(?Z\4F_U<"'^N^P[1 NP( S2'#N1X NE0 +HX>-0+HZO^X P!0Z/G^ !
XM %6+[(/L!%:+=@B //]U/(!\ ?]U-H!\ O]U,(!\ _]U*H!\!/]U)(!\!?]U
XM'H!\# AU$H!\#0!T!H!\#09U!L9$_@'K!,9$_@#K5XI$!3H&:8!U2HI$!#H&
XM:(!U08I$ SH&9X!U.(I$ CH&9H!U+XI$ 3H&98!U)HH$.@9D@'4>@'P,"'42
XM@'P- '0&@'P-!G4&QD3^ >L$QD3^ .L$QD3^ (,&"T<!@Q8-1P"+1@8!!@]'
XM@Q811P"AS$\K!H18(P:\3ST! '4-@P9N6 &#%G!8 .F_ *&$6+HO /?JBQ:J
XM3XL>J$\#V(E>_(E6_H!\# AU$(!\#0!U"L1>_";&1P("ZV.*1 RT #L&AEA_
XM0(!\#O]U$(!\#_]U"L1>_";&1P(&ZRB ? ZJ=2" ? ^J=1J ?!2 =1" ?!6;
XM=0K$7OPFQD<"!^L"ZTSK NM(ZQB ? Q@=1" ? T#=0K$7OPFQD<"!>L"ZR[$
XM7OR+1@8FB0>X+ !0BT;\!0, _W;^4/]V"O]V".C&;8/$"J&$6$ C!KQ/HX18
XM7HOE7<-5B^R#[!965^@553/ 4#/ 4.A?4X/$!+BJ"E#HS\=$1+@! % SP%#H
XM25.#Q 3'!GI8 2P :*86*+.6,<& ENA#[BL */2/Z/0/Z/,/S/_O@$ Z3L!
XMB\;1X(M>!@/8BQ^ /RUT ^DG 8O&T>"+7@8#V(L?BD<!F"UD (O8@_L3=@/I
XMZ0#1XR[_IP8&_P:H .G] (O&T>"+7@8#V(L'0$")1OZ+7OZ /P!U#T:+QM'@
XMBUX& ]B+!XE&_O]V_NAFT41$0*,"6^G' ,8&F%@ Z;\ B\;1X(M>!@/8BP=
XM0(E&_HM>_H _ '4/1HO&T>"+7@8#V(L'B4;^_W;^Z"C11$2C>ECIB@"#_P5U
XM$;BM %#HW,9$1#/ 4.C=OT1$1HO&T>"+7@8#V(L'B]_1XXF'RC]'@_\"=0%'
XMBT8$2#O&=!&+QD#1X(M>!@/8BQ^ /RUU NL"Z[+K.L8&SE@ ZS-&B\;1X(M>
XM!@/8BP>CSC_K(HO&T>"+7@8#V(L?BD<!F%"XT !0Z&G&@\0$,\!0Z&F_1$1&
XM.W8$?0/IO?ZA>EA(H[Q/H7I8NP !F??[HX98H7I80+HO /?J,])24.@'XH/$
XM!*.H3XD6JD\SP*.$6*/,3\8& $<!Z+*#Z!&,4E"-1NI0Z'^)@\0&4+CE %#H
XM <:#Q 3'!K1/TD\SP% SP% SP#/24%*XH0!0_S:T3^A-E(/$# O =1*X\P!0
XMZ%K(1$2X 0!0Z-.^1$3HY"[HL"SHX@!?7HOE7<-=!#\%9 0_!3\%/P4_!9H$
XM/P4_!3\%/P6B!#\%UP0G!3\%/P4_!2X%58OL@^P\H+)/F%"@L4^84*"P3YA0
XM_S9^6/\V?%BX!0%0C4;$4.BNS(/$#HU&Q% SP%#HZB^#Q 2+Y5W#58OL,\ S
XMTHD6N$^CND^)%L)/H\1/B1:*6*.,6(D6=EBC>%B)%LY/H]!/B1: 6*."6(D6
XM;EBC<%B)%G)8HW18B1:.6*.06(D6#T>C$4>)%@M'HPU'QP:D3P#AQP:F3_4%
XM,\"CB%BCH$^CHD^CMD^C;%C&!I=8 %W#58OL@^PD5E>X 0!0Z =K1$2)1N*)
XM5N3&1MT QD;_ :&$6*/,3_\VM$_H09E$1 O =1"X:E@+P'0&QP9J6 $ Z2$%
XM_S:T3^CVN$1$B4;Z"\!T0?]V^NA,!41$_S:T3^B-N41$,\!0,\!0,\ STE!2
XMN*$ 4/\VM$_HSY*#Q P+P'42N"4!4.C<QD1$N $ 4.A5O41$H818*P;,3R,&
XMO$^+\ OV=4*A>EBZ+P#WZHL6JD^+'JA/ ]B)7MZ)5N S]NL)Q%[>)L9 P!&
XM@_XL=?*P 5 SP%"+1MX% P#_=N!0Z @A@\0(ZU\[-FQ8=@2)-FQ8BS:J .M"
XMH<Q/NB\ ]^J+%JI/BQZH3P/8B5[>B5;@Q%[>)HI' E#$7MXF_S>+1MX% P#_
XM=N!0Z, @@\0(H<Q/0",&O$^CS$].H<Q/.P:$6'0$"_9UL?]VY/]VXNC_:8/$
XM! O =0/I" 2X 0!0Z+=I1$2)1N*)5N2#!GQ8 8,6?E@ Z-Q/Z(Q/H]!8B1;2
XM6(!^_P!T*\8&EU@!QT;T9 SP(E&\HOXB4;VQD;O_Z H HA&_<<&DE@> ,9&
XM_P#I%@**1OT$_XA&_0K =0GH2 Z@* *(1OW_#I)8H9)8"\!U<:$"6T@STE)0
XMBQZT6S/),]*X9 #H@.124.B1X(A&_(I&_#H&\0)V1*'26(L6T%@K%NT"&P;O
XM HE6ZHE&[*'O HL6[0(!%MA8$0;:6*':6(L6V%@[1NQR%'<%.U;J=@V+1NR+
XM5NJ)%MA8H]I8QP:26!X H0U'BQ8+1RL6=E@;!GA8B5;JB4;LH1%'BQ8/1RL6
XMBE@;!HQ8B5;FB4;H@#[.6 !U ^E1 ;@# % SP%#HY4V#Q 3_-FQ8N#<!4.A1
XMPH/$!+@# %"X%P!0Z,E-@\0$H)98F%"@E5B84*"46)A0N#T!4.@JPH/$"+@%
XM % SP%#HHTV#Q 0SP+H* %!2,\"ZX@104HM.[(M>ZC/2N!@ Z(;C T;F$U;H
XM4E#HD=\%!0"#T@!24.B&WXE&^/]V^/]VZ/]VYO]V[/]VZKA+ 5#HS\&#Q R+
XM1O@!1O9'BT;X.T;T<P:+1OB)1O2+1O@[1O)V!HM&^(E&\J"66#I&[W4#Z88
XMH)98F+L* )GW^PO2=7@+_W1EB\?1Z%"+1O9: \(STO?WB4;P@'[= '0IBT;R
XMT>A0BT;PT>A0BT;TT>A0N!@ 4+A/ % SP%"X*0!0Z/=.@\0.ZQ[_=O+_=O#_
XM=O2X& !0N$\ 4#/ 4+@I %#HUTZ#Q Z@EEB(1N_'1O1D #/ B4;RB_B)1O:
XM/I=8 '0%Z+G[ZV6#!H!8 8,6@E@ H:)/,]([5NQW#7(%.T;J<P:+1NJCHD^A
XM;%@!!LY/@Q;03P"A;%@[!K9/=@:A;%BCMD^AND^+%KA/.P:F3W<<<@8[%J1/
XM<Q2AND^+%KA/B1:D3Z.F3XM&ZJ.(6,<&;%@ ,<&N$\ ,<&ND\ *$-1XL6
XM"T>)%G98HWA8H1%'BQ8/1XD6BEBCC%B /IA8 '4#Z?( Z"#/"\!U ^GH .@M
XMS8A&_CP;=1ZX& !0,\!0Z-=+@\0$N&(!4.A'P$1$,\!0Z$BY1$2X& !0N"@
XM4+@8 % SP%#H@DV#Q BX& !0,\!0Z*1+@\0$BD;^M !0Z"'(1$0];0!T87\,
XM/6( = X]: !T+>MS/78 =&/K;/\V<%C_-FY8_S9T6/\V<EC_-I!8_S:.6+AR
XM 5#HU[^#Q [K58I&W;0 ]]@;P$"(1MV ?MT = 6X/ #K [@> %"XCP%0Z*^_
XM@\0$ZRWH=;I24.BGRE"XHP%0Z)J_@\0(ZQBXJ@I0Z(Z_1$3K#8I&_K0 4.A2
XM*$1$ZP#IPOJA:E@]__]T#ST! '0"ZQHSP%#H;KA$1+B_ 5#H7+]$1+@! %#H
XM7+A$1+C6 5#H2K]$1+@! %#H2KA$1%]>B^5=PU6+[('LZ M65XM^!,=&_ X
XMC4;\4(V&-O10_S:T3^CN@X/$!HN&//2+ECKTB1;&3Z/(3U>-AB#Z4/\VM$_H
XM"*^#Q :#/J@ '1<_[8\]/^V.O2-AACT4.A2@H/$!HV&&/105[C? 5#HS[Z#
XMQ 8S]NLHBH(@^K0 4+C[ 5#HNKZ#Q 2+QKL0 )GW^X/Z#W4)N $"4.BCOD1$
XM1COW?-2X P)0Z)6^1$3'1O[<!?^V//3_MCKTC4;^4(V&1/105XV&(/I0Z$A:
XM@\0,"\!T98,^J =$R-AACT4/]V_K@& E#H5[Z#Q 8S]NLHBH)$]+0 4+@<
XM E#H0KZ#Q 2+QKL0 )GW^X/Z#W4)N"("4.@KOD1$1CMV_GS3N"0"4.@<OD1$
XM_W;^C89$]%#_-K1/Z+RN@\0&7UZ+Y5W#58OL@^P$H?H""P;\ G0AH?P"BQ;Z
XM HE6_(E&_L0>^@(FBT<")HL7B1;Z J/\ NM>@S[^ @!U03/ NB*(4%+HEMF#
XMQ 2CU%B)%M98H=18"P;66'4<N!@ 4#/ 4.@J28/$!+@L!U#HFKU$1#/2,\#K
XM)L<&_@*H >L)@P;46%+_#OX"H=98BQ;46(E6_(E&_HM6_HM&_.L B^5=PU6+
XM[,1>!*'\ HL6^@(FB1<FB4<"BT8&BU8$B1;Z J/\ EW#58OL@^P>H0 #_P8
XM U"X10=0C4;B4.AQQ(/$!KA0!U"-1N)0Z&BZ@\0$H[);B^5=PU6+[,1>!":*
XM1P.T %#$7@0FBD<"M !0Q%X$)HI' ;0 4,1>!":*![0 4+A2!U#_-K);Z).Z
XM@\0,7<-5B^S$7@0FBD<%M !0Q%X$)HI'!+0 4,1>!":*1P.T %#$7@0FBD<"
XMM !0Q%X$)HI' ;0 4,1>!":*![0 4+A>!U#HE;R#Q Y=PU6+[(,^LEL =0/H
XM/O_$7@8FBD<>M !0Q%X&)HI'';0 4/]V"/]V!O]V!+A\!U#_-K);Z ^Z@\0.
XMBT8&!2X _W8(4.@W_X/$!+B0!U#_-K);Z/&Y@\0$BT8&!3( _W8(4.@9_X/$
XM!+B4!U#_-K);Z-.Y@\0$BT8&!48 _W8(4.C[_H/$!+B;!U#_-K);Z+6Y@\0$
XMBT8&!4H _W8(4.C=_H/$!+B?!U#_-K);Z)>Y@\0$7<-5B^S$7@0SP#/2)HE7
XM&":)1QK$7@0FB5<0)HE'$L1>!":)5PPFB4<.Q%X$)HE7"":)1PK$7@0FB5<$
XM)HE'!L1>!*'26(L6T%@FB5<4)HE'%L1>!(I&"":(1QW$7@2@^ (FB$<<Q%X$
XM)L<' FQT<" !=PU6+[(/L'%97H;A;BQ:V6XE6ZHE&[,1>ZB;'1Q ! +\!
XM .M>B\>Z% #WZHL6N%N+'K9; ]B)7NZ)5O#$7NXFB@?$7NHF.@=U'K@& %"+
XM1NI _W;L4(M&[D#_=O!0Z/5@@\0*"\!T!;@! .L",\#$7NXFB4<0BT;PBU;N
XMB5;JB4;L1SL^HEAUG#/_ZV6+Q[H4 /?JBQ:X6XL>MEL#V(E>[HE6\,1>[B;'
XM1Q( ,1>[B:*1PVT (E&_H-^_@9T#(-^_@=T!H-^_@AU)L1>[B:+1PY(NA0
XM]^J+%KA;BQZV6P/8B5[JB5;LQ%[J)L='$ ( 1SL^HEAUE3/ B4;TB4;VH;A;
XMBQ:V6XE6ZHE&[,=&_@$ OP$ Z:8 B\>Z% #WZHL6N%N+'K9; ]B)7NZ)5O#$
XM7NXFBT<0B4;\"\!U _]&_H-^_ !U"*&B6$@[QW5F@W[^!7)&Q%[J)H _ '0]
XMQT;Z @#K ]%F^HM&^CM&_G;U@7[Z %V!<=&^@ !Q%[JBT;^)HE'$,1>ZHM&
XM^B:)1Q+_1O:+1OH!1O3K"<1>ZB;'1Q (M&\(M6[HE6ZHE&[,=&_@$ Q%[N
XM)L='$ 1SL^HEAT ^E1_XM&]M'@ T;T0(E&\J'X6CM&\G,9BT;RH_A:T> S
XMTE)0Z%?5@\0$HPI;B18,6\0>"ELFQP< ,=&_@$ ,\"+^+H4 /?JBQ:X6XL>
XMMEL#V(E>[HE6\.DG 8M&_M'@BQ8,6XL>"EL#V(E>YHE6Z.L%@T;N%$?$7NXF
XM@W\0 '3QQ%[N)HM'$(E&_,1>[B:+1Q*)1OK$7NZ+1OXFB4<0Q%[N)L='$@
XMB\<#1OS$7N8FB0?$7N:+1OI()HE' C/VZQ"+QM'@Q%[F ]@FQT<$ !&.W;Z
XM=>OIE SP(OPB$;EZQ+$7NXFBD 'Q%[N)B) 0!&Y4:#_@9UZ8I&^O[(BE;E
XM(M"(5N6*1N6T -'@Q%[F ]@FBT<$B4;X"\!U%8I&Y;0 T>#$7N8#V(O'0":)
XM1P3K,XM&^$BZ% #WZHL6N%N+'K9; ]B)7NJ)5NS$7NHFBT<2B4;X@W[X '77
XMQ%[JB\= )HE'$H-&[A1'_T[\@W[\ '0#Z6/__T[VBT;Z0$ !1OZ#?O8 = /I
XMT/Y?7HOE7<-5B^R#[ 16BD8&M #1X(O8@[_B6@!U!3/ Z<8 @'X$ '4#Z;@
XMBD8&M #1X-'@B]B+APQ;BY<*6XD6MENCN%N*1@:T -'@B]B+A^):HZ)8,_;K
XM*XO&NA0 ]^J+%KA;BQZV6P/8B5[\B5;^Q%[\)H!_#0%U"<1>_";'1PX $8[
XM-J)8=<^*1@:T -'@T>"+V(N'IEJ+EZ1:B18V6Z,X6XI&!K0 T>"+V(N'SEJC
XMI%B*1@:B^ (S]NL<L !0B\:Z4@#WZHL6-EL#T/\V.%M2Z&K[@\0&1CLVI%AU
XMWNC1^[@! .L 7HOE7<-5B^R#[!A65S/_Z88!B\>Z% #WZHL6N%N+'K9; ]B)
XM7OR)5O[$7OPFBD<-M ] 0!T$#T" '1!/0, =0/I! 'I4 '$7OPF@W\. '0@
XMQ%[\)O]W#NC' 41$B4;XB5;ZQ%[X)L<' FQT<" #$7OPFQT<. #I&@'$
XM7OPFBT<.2+I2 /?JBQ8X6XL>-EL#V(E>](E6]L1>]":+1P(FBQ>)5NR)1NX+
XMT'4#Z94 ,_;K9XO&T>#1X(M6[HM>[ /8B5[HB5;JQ%[H)HM' B:+%XE6^(E&
XM^@O0=#Z+1OJ+5OB)5O")1O+$7O FBT<")HL7B5;XB4;ZQ%[P)L<' FQT<"
XM "+1OJ+5O@[1NIURSM6Z'7&_P[= D:!_@ !=9/_=N[_=NSH^M"#Q 3_#ML"
XM@2[? @ !Q%[T)L<' FQT<" #K3\1>_":+1PY(NE( ]^J+%CA;BQXV6P/8
XMB5[TB5;VQ%[T)HM' B:+%XE6^(E&^@O0=!S$7O@FQP< ";'1P( ,1>]";'
XM!P )L=' @ ZP!'.SZB6'0#Z7'^7UZ+Y5W#58OL5HLV!%O_!@1;H01;.P8"
XM6W8&QP8$6P( H01;2-'@T>"+'MY8 ]B+!PM' G4B_P:T6Z$$6TC1X-'@BQ[>
XM6 /8BT8&BU8$B1>)1P*A!%OK)CDV!%MUL+@8 % SP%#HLT"#Q 2XH@=0Z".U
XM1$3'!I)8 0 SP.L 7EW#58OL5HMV!#LV EMW!8/^ GT4N+$'4+@! %#HA1^#
XMQ 0STC/ ZQ2+QDC1X-'@BQ[>6 /8BU<"BP?K %Y=PU6+[(/L%J J HA&_Z I
XM HA&_O\&H%BAH%@[!@);=@;'!J!8 @"AH%A(T>#1X(L>WE@#V(M' HL7B5;V
XMB4;X"]!U$HI&_P3_B$;_"L!U ^DW >DQ <1>]B:+1QHFBU<8.P;:6'8#Z0\!
XM=0D[%MA8=@/I! '$7O8FBP<F"T<"=0/IQ #$7O8FBD<=M ] 0!T$#T" '0G
XM/0, =0/IB0#II@#$7O8FBT<")HL7B5;ZB4;\Q%[Z)L='#@ Z8H Q%[V)HM'
XM B:+%XE6\HE&](M&^(M6]HE6[HE&\(M&\(M6[HE6ZHE&[,1>[B:+1P(FBQ>)
XM5NZ)1O [1OAUWSM6]G7:BT;LBU;J.T;T=0L[5O)U!C/2,\#K!HM6](M&\L1>
XMZB:)!R:)5P+K(,1>]B:+1P(FBQ>)5NZ)1O#$7NXFQP< ";'1P( .L H:!8
XM2-'@T>"+'MY8 ]C'!P QT<" #_=OC_=O;H"?:#Q 3_#K1;@P8K @&#%BT"
XM (I&_@3_B$;^"L!U NL#Z8K^B^5=PU6+[(/L%K B$;SB$;JB$;KB$;LB$;M
XMB$;NB$;OB$;PB$;Q@P;I @&#%NL" +@T %"A_EH%'@#_-@!;4(M&% 4> /]V
XM%E#HR%B#Q JX! !0H09;!3( _S8(6U"A_EH%,@#_-@!;4.C,6(/$"@O =$?&
XM1NT!QD;R .LWBD;RM #$7@@#V":*1PR*5O*V ,0>_EH#VB8B1S**5O*V ,0>
XM_EH#VB:(1RX 1O.*1O+^P(A&\H!^\@1UP[@$ %"A!EL%2@#_-@A;4*'^6@5*
XM /\V %M0Z&%8@\0*"\!T1\9&[ '&1O( ZS>*1O*T ,1># /8)HI'#(I6\K8
XMQ![^6@/:)B)'2HI6\K8 Q![^6@/:)HA'1@!&\XI&\O[ B$;R@'[R!'7#Q![^
XM6B: ?R$ =![&1O !Q%X0)HI'(,0>_EHF(D<AQ![^6B:(1R 1O.X @!0H09;
XM!3@ _S8(6U"A_EH%. #_-@!;4.C-5X/$"@O =$?&1NL!QD;R .LWBD;RM #$
XM7@@#V":*1Q2*5O*V ,0>_EH#VB8B1SB*5O*V ,0>_EH#VB:(1S8 1O.*1O+^
XMP(A&\H!^\@)UP[@" %"A!EL%4 #_-@A;4*'^6@50 /\V %M0Z&)7@\0*"\!T
XM1\9&Z@'&1O( ZS>*1O*T ,1># /8)HI'%(I6\K8 Q![^6@/:)B)'4(I6\K8
XMQ![^6@/:)HA'3@!&\XI&\O[ B$;R@'[R G7#N 8 4*$&6P4H /\V"%M0H?Y:
XM!2@ _S8 6U#H]U:#Q H+P'1&QD;O <9&\@#K-HI&\K0 Q%X( ]@FB@>*5O*V
XM ,0>_EH#VB8B1RB*5O*V ,0>_EH#VB:(1R( 1O.*1O+^P(A&\H!^\@9UQ+@&
XM %"A!EL%0 #_-@A;4*'^6@5 /\V %M0Z(U6@\0*"\!T1L9&[@'&1O( ZS:*
XM1O*T ,1># /8)HH'BE;RM@#$'OY: ]HF(D= BE;RM@#$'OY: ]HFB$<Z $;S
XMBD;R_L"(1O* ?O(&=<3$'OY:)H!_'P!T'L9&\0'$7A FBD<>Q![^6B8B1Q_$
XM'OY:)HA''@!&\XI&\[0 T>#1X(M6!HM>! /8B5[\B5;^Q%[\)HM' B:+%XE6
XM^(E&^@O0=1?'1O0 ,=&]@ @P;E @&#%N<" .F$ 8,&Y0(!@Q;G @" ?NT
XM=":X! !0BT;X!2X _W;Z4*'^6@4N /\V %M0Z*E5@\0*"\!T ^D8 8!^[ !T
XM)K@$ %"+1O@%1@#_=OI0H?Y:!48 _S8 6U#H?56#Q H+P'0#Z>P @'[P '04
XMQ![^6B:*1R#$7O@F.D<@= /IT@" ?NL =":X @!0BT;X!38 _W;Z4*'^6@4V
XM /\V %M0Z#=5@\0*"\!T ^FF (!^Z@!T);@" %"+1O@%3@#_=OI0H?Y:!4X
XM_S8 6U#H"U6#Q H+P'0"ZWN ?N\ ="6X!@!0BT;X!2( _W;Z4*'^6@4B /\V
XM %M0Z.!4@\0*"\!T NM0@'[N '0EN 8 4(M&^ 4Z /]V^E"A_EH%.@#_-@!;
XM4.BU5(/$"@O = +K)8!^\0!T$\0>_EHFBD<>Q%[X)CI''G0"ZPR+5OJ+1OCI
XM[ #IO/Z+1OJ+5OB)5O2)1O;$7O0FBT<")HL7B5;XB4;Z.T;^= /ICOX[5OQT
XM ^F&_L=&^ QT;Z " ?A@ =0/IH@#H6?")1OB)5OH+PG4',](SP.F6 +@T
XM %"+1O@%'@#_=OI0H?Y:!1X _S8 6U#H]%.#Q JP E#_=OK_=OCH0?*#Q ;_
XM=OK_=OCHA/B#Q 0+P'42_W;Z_W;XZ)OP@\0$,](SP.M&Q%[XBT;^BU;\)HD7
XM)HE' HM&] M&]G46Q%[\BT;ZBU;X)HD7)HE' O\&W0+K$,1>](M&^HM6^":)
XM%R:)1P*+5OJ+1OCK (OE7<-5B^Q,3+ BLB(1O_K*XK!M #$7@0#V":*!XK1
XMM@#$7@@#VB8B!XK1M@"+VHB'F5@ 1O^*P?[ BLB*P3I&#'7.BD;_ZP"+Y5W#
XM58OL@^P85E?'!MQ8 "_ 0#I-PF+QTBZ% #WZHL6N%N+'K9; ]B)7OJ)5OR#
XM!N$" 8,6XP( Q%[Z)H-_$ !T ^F9 <1>^B:*![0 B]B#^QMV ^F ='C+O^G
XM(B@S]NL:Q%X.)HI #,1>^B8B0 '$7OHF.D '= +K!D:#_@1UX8/^!'4%N $
XMZP(SP(A&^>E( 3/VZQK$7A(FBD ,Q%[Z)B) <1>^B8Z0 =T NL&1H/^!'7A
XM@_X$=06X 0#K C/ B$;YZ1,!Q%X*)HI''L1>^B8Z1P=U!;@! .L",\"(1OGI
XM]@ S]NL:Q%X.)HI %,1>^B8B0 '$7OHF.D '= +K!D:#_@)UX8/^ G4%N $
XMZP(SP(A&^>G! #/VZQK$7A(FBD 4Q%[Z)B) <1>^B8Z0 =T NL&1H/^ G7A
XM@_X"=06X 0#K C/ B$;YZ8P Q%X*)HI'(,1>^B8Z1P=U!;@! .L",\"(1OGK
XM<#/VZQG$7@XFB@#$7OHF(D !Q%[Z)CI !W0"ZP9&@_X&=>*#_@9U!;@! .L"
XM,\"(1OGK/3/VZQG$7A(FB@#$7OHF(D !Q%[Z)CI !W0"ZP9&@_X&=>*#_@9U
XM!;@! .L",\"(1OGK"L9&^0'K!,9&^0#IJP'$7OHFB@>T "T% (O8@_L6=@/I
XM @'1XR[_I_0GL 90BT;Z0/]V_%"+1@X%# #_=A!0Z*?]@\0*B$;XZ=H L 90
XMBT;Z0/]V_%"+1A(%# #_=A10Z(;]@\0*B$;XZ;D L 90BT;Z0/]V_%"+1@H%
XM'@#_=@Q0Z&7]@\0*B$;XZ9@ L 90BT;Z0/]V_%"+1@X%% #_=A!0Z$3]@\0*
XMB$;XZWBP!E"+1OI _W;\4(M&$@44 /]V%%#H)/V#Q J(1OCK6+ &4(M&^D#_
XM=OQ0BT8*!2 _W8,4.@$_8/$"HA&^.LXL 90BT;Z0/]V_%#_=A#_=@[HZ/R#
XMQ J(1OCK'+ &4(M&^D#_=OQ0_W84_W82Z,S\@\0*B$;XZP#$7OHFBT<0T>"+
XM%@Q;BQX*6P/8B5[LB5;NQ%[LBD;X)B)' HA&^,9&^0"*1OBT -'@Q%[L ]@F
XMBT<$B_@+P'1(B\=(NA0 ]^J+%KA;BQZV6P/8B5[ZB5;\N 8 4(M&^@4' /]V
XM_% >N)E84.CP3X/$"@O =0;&1OD!ZPW$7OHFBT<2B_@+P'6X@'[Y '4&Q%[L
XM)HL_@'[Y '4#Z;H%Q%[Z)HI'#;0 2(O8@_L'=@/I3071XR[_I^0GBQ[<6-'C
XMB;^F6/\&W%C$7OHFBT<.B_ +P'0#Z70"Z)GKB4;TB5;V"\)U!K@! .E\!;@T
XM %"+1O0%'@#_=O90H09;!1X _S8(6U#H-4^#Q HS]NGD 8O>T>.+AZ982+H4
XM /?JBQ:X6XL>MEL#V(E>^HE6_,1>^B:*![0 +04 B]B#^Q9V ^FP ='C+O^G
XMMB>X! !0BT;T!2X _W;V4(M&^@4' /]V_%#HV$Z#Q JX! !0BT;T!3( _W;V
XM4(M&^D#_=OQ0Z+Q.@\0*Z6P!N 0 4(M&] 5& /]V]E"+1OH%!P#_=OQ0Z)M.
XM@\0*N 0 4(M&] 5* /]V]E"+1OI _W;\4.A_3H/$"NDO <1>^B:*1P?$7O0F
XMB$<>Q%[Z)HI' <1>]":(1Q_I$ &X @!0BT;T!38 _W;V4(M&^@4' /]V_%#H
XM/TZ#Q JX @!0BT;T!3@ _W;V4(M&^D#_=OQ0Z"-.@\0*Z=, N ( 4(M&] 5.
XM /]V]E"+1OH%!P#_=OQ0Z ).@\0*N ( 4(M&] 50 /]V]E"+1OI _W;\4.CF
XM38/$"NF6 ,1>^B:*1P?$7O0FB$<@Q%[Z)HI' <1>]":(1R'K>+@& %"+1O0%
XM(@#_=O90BT;Z!0< _W;\4.BG38/$"K@& %"+1O0%* #_=O90BT;Z0/]V_%#H
XMBTV#Q KK/+@& %"+1O0%.@#_=O90BT;Z!0< _W;\4.AK38/$"K@& %"+1O0%
XM0 #_=O90BT;Z0/]V_%#H3TV#Q KK $8[-MQ8= /I$_ZP 5#_=O;_=O3HD.N#
XMQ ;_=O;_=O3HT_&#Q 2)1OX+P'42_W;V_W;TZ.?I@\0$N $ Z3<#Q%[TBT;\
XMBU;Z)HD7)HE' L1>^HM&_B:)1P[K#%;H$O)$1(E&](E6]NFE L1>^B:+1PY(
XMNE( ]^J+%CA;BQXV6P/8B5[PB5;RQ%[P)HM' B:+%XE6Z(E&Z@O0=4XSP+H
XM!%!2Z+7"@\0$B4;HB5;J,_;K%XO&T>#1X,1>Z /8)L<' FQT<" !&@?X
XM 77CQ%[PBT;JBU;H)HD7)HE' O\&VP*!!M\" &*1@90_W;R_W;P_W8,_W8*
XM_W84_W82_W80_W8._W;J_W;HZ"SS@\06B4;TB5;V"\)U!K@" .E5 NGK <1>
XM^B:+1PY(NE( ]^J+%CA;BQXV6P/8B5[PB5;RQ%[P)HM' B:+%XE6](E&]@O0
XM= /I@@#H*.B)1O2)5O8+PG4&N $ Z0L"N#0 4(M&] 4> /]V]E"+1O %'@#_
XM=O)0Z,5+@\0*L -0_W;V_W;TZ!+J@\0&_W;V_W;TZ%7P@\0$"\!U$O]V]O]V
XM].ALZ(/$!+@! .F\ <1>](M&\HM6\":)%R:)1P+$7O"+1O:+5O0FB1<FB4<"
XMZ3(!N $ Z9,!,\#IC@&+'MQ8T>.)OZ98_P;<6,1>^B:+?PZ#/MQ8%'QXN!@
XM4#/ 4.C],(/$!/\VW%BXQ@=0Z&FE@\0$,_;K$XO>T>/_MZ98N.$'4.A3I8/$
XM!$8[-MQ8=>>XY0=0Z$*E1$2+1@X%# #_=A!0Z%GH@\0$N/('4.@II41$BT82
XM!0P _W844.A Z(/$!+C^!U#H$*5$1#/ Z?H Z>H _P[<6,1>^B:+?PZ#/MQ8
XM 'USN!@ 4#/ 4.AP,(/$!+@ "%#HX*1$1#/VZQ.+WM'C_[>F6+@1"%#HRZ2#
XMQ 1&@_X4=>BX%0A0Z+ND1$2A_EH%+@#_-@!;4.C1YX/$!+@B"%#HH:1$1*'^
XM6@5& /\V %M0Z+?G@\0$N"X(4.B'I$1$,\#K<NMCQ%[Z)HM_#NM:@'X$ '0>
XMBT8(F<1>]"8!1P0F$5<&Q%[T)H-'" $F@U<* .L<BT8(F<1>]"8!1PPF$5<.
XMQ%[T)H-'$ $F@U<2 ,1>]*'26(L6T%@FB5<8)HE'&K@! .L0ZP%'.SZB6'<#
XMZ<#V,\#K %]>B^5=P\,C.R0,(SLDDB([)*4C.R0K(SLD.R0[)#LD.R3_(SLD
XM#",[),\B.R2E(SLD:",#(J0D7B47)ATF(B:Y)D G$R%+(9(@2R%0($LA\R!+
XM(;,@2R%+(4LA2R%+(2\A2R&2($LA<2!+(?,@2R'3("<@+2 M("T@+2#!'RT@
XM'A\M(+0>+2"E'RT@.Q\M("T@+2 M("T@]!\M(!X?+2#I'BT@I1\M(' ?58OL
XM5L1>"":*1P&*T(K"M #1^-'XQ%X$)H@'Q%X$BL(D R:(1P'$7@0&Q'8()HH$
XM!R:(1P+$7@0FQD<# %Y=PU6+[,1>"":*!\1>!":(!\1>"":*1P'$7@0FB$<!
XMQ%X$BD8,)HA' L1>!";&1P, 7<-5B^R#[ A6BW8(N 8 4*'Z6@4B /\V_%I0
XMBT8$!08 _W8&4.B42(/$"K@& %"A^EH%.@#_-OQ:4/]V!O]V!.AY2(/$"H!^
XM"@)T ^D6 <0>^EHFQD<> K@$ %"A^EH%+@#_-OQ:4(M&! 4: /]V!E#H2$B#
XMQ JX! !0H?I:!48 _S;\6E"+1@0%'@#_=@90Z"E(@\0*Q%X$)HI'%\0>^EHF
XMB$<@B$;_Q%X$)HI'#B0/T.#0X 0.B$;]@'[_ 75"Q![Z6K )HA'3L0>^EHF
XMB$<VBD;]M #$7@0#V":*!\0>^EHFB$<WBD;]M ".1@8#1@2+V":*1P'$'OI:
XM)HA'3^M@BD;]M #$7@0#V":*!\0>^EHFB$<VBD;]M ".1@8#1@2+V":*1P'$
XM'OI:)HA'-XI&_;0 CD8& T8$B]@FBD<"Q![Z6B:(1TZ*1OVT (Y&!@-&!(O8
XM)HI' \0>^EHFB$=/Z54#@'X*!G0#Z94 Q![Z6B;&1QX&N 0 4*'Z6@4N /\V
XM_%I0BT8$!10 _W8&4.@I1X/$"K@$ %"A^EH%1@#_-OQ:4(M&! 4@ /]V!E#H
XM"D>#Q K$7@0FBD<3Q![Z6B:(1R#$7@0FBD<JQ![Z6B:(1S;$7@0FBD<KQ![Z
XM6B:(1S?$7@0FBD<>Q![Z6B:(1T[$7@0FBD<?Q![Z6B:(1T_IMP* ?@H'= /I
XME0#$'OI:)L9''@?$7@0FBD<?M !0BT8$!1P _W8&4*'Z6@4N /\V_%I0Z)K]
XM@\0*Q%X$)HI''K0 4(M&! 4: /]V!E"A^EH%1@#_-OQ:4.AU_8/$"L1>!":*
XM1R+$'OI:)HA'(,0>^EJP ":(1T[$'OI:)HA'-L1>!":*1R'$'OI:)HA'-\1>
XM!":*1R#$'OI:)HA'3^D9 H!^"@5T ^GA <0>^EHFQD<>!;@$ %"A^EH%1@#_
XM-OQ:4*$&6P5& /\V"%M0Z.Q%@\0*Q%X$)HI'$(A&_H!^_H%T$8M&!HM6!(/"
XM$8E6^(E&^NL9Q%X$)HI'$8A&_HM&!HM6!(/"$HE6^(E&^L0>^EJP ":(1T_$
XM'OI:)HA'-\0>^EHFB$=.Q![Z6B:(1S;$'OI:BD;^) \FB$<@M M!@"+V(/[
XM"'8#Z; T>,N_Z=2+HM&^ 4. /]V^E"A^EH%+@#_-OQ:4.@G_(/$"(M&^ 4&
XM /]V^E"A^EH%1@#_-OQ:4.@,_(/$".G^ /]V^O]V^*'Z6@4N /\V_%I0Z/+[
XM@\0(Z>0 _W;Z_W;XH?I:!2X _S;\6E#HV/N#Q CIR@"+1O@%!P#_=OI0H?I:
XM!2X _S;\6E#HNON#Q CIK "+1O@%!P#_=OI0H?I:!2X _S;\6E#HG/N#Q CI
XMC@"X& !0,\!0Z'<J@\0$BD;^M !0N# (4.CAGH/$!,9&_P#K(HI&_[0 Q%X$
XM ]@FB@>T %"X1 A0Z,&>@\0$BD;__L"(1O^ ?O\0==BX2@A0Z*F>1$3&1O\0
XMZR**1O^T ,1>! /8)HH'M !0N$P(4.B*GH/$!(I&__[ B$;_@'[_(G78N%((
XM4.ARGD1$Z?L ZR^ ?@H!=2G_!J!/H:!//>@#=1"#!L)/ 8,6Q$\ QP:@3P
XM@P:X3P&#%KI/ .G* *'Z6@4Z /\V_%I0H?I:!2( _S;\6E#_-OQ:_S;Z6E:P
XM %"P 5#HK?"#Q!(+P'0-/0$ =#4] @!T,NF. *'Z6@4B /\V_%I0H?I:!3H
XM_S;\6E#_-OQ:_S;Z6E:P 5"P %#H<?"#Q!+K8>M?H?I:!2( _S;\6E"A^EH%
XM.@#_-OQ:4/\V_%K_-OI:5K !4+ 4.A"\(/$$CT! '4"ZRVA^EH%.@#_-OQ:
XM4*'Z6@4B /\V_%I0_S;\6O\V^EI6L %0L %0Z!#P@\02ZP!>B^5=PQLL5"S$
XM+&XLQ"R(+,0LIBP;+%6+[*"46**P3Z"56**Q3Z"66**R3\<&?%@ ,<&?E@
XM %W#58OL@^PL5H,^LEL =0/HXM^^ 0#I@@!6Z GH1$2)1OR)5OX+PG4"ZV]6
XMN%0(4(U&U%#H2*2#Q ;_=O[_=OR-1M10Z&/@@\0&Q%[\)O]W&B;_=QC$7OPF
XM_W<6)O]W%,1>_";_=Q(F_W<0Q%[\)O]W#B;_=PS$7OPF_W<*)O]W",1>_";_
XM=P8F_W<$N%\(4/\VLEOH5YJ#Q!Q&.S:T6W<#Z77__S:R6^CEED1$QP:R6P
XM7HOE7<-5B^PSP#/2B1;I J/K HD6Y0*CYP*)%N$"H^,"B18K J,M L8&EU@!
XMN)$(4+@! %#HW0:#Q 1=PU6+[(/L1%97H8!8"P:"6'0;H0M'"P8-1W02H<)/
XM"P;$3W0)H:1/"P:F3W4#Z0,#N*,(4+@! %#HG@:#Q 2+#H)8BQZ 6#/2N H
XMZ(6]4E"+#@U'BQX+1S/2N H Z'.]!04 @]( 4E#H?KF)1OR)5OZ+#H)8BQZ
XM6#/2N H Z%*]4E"+#M!/BQ[.3S/2N H Z$"]!04 @]( 4E#H2[F)1OB)5OK_
XM=OK_=OC_=O[_=ORXMPA0C4:\4.C5HH/$#(U&O% SP%#H$0:#Q 3_-K9/_S:B
XM3[C8"%"-1KQ0Z+*B@\0(C4:\4#/ 4.CN!8/$!*'"3PL&Q$]U ^G" ($^H$_T
XM 7(*@P;"3P&#%L1/ #/ NN@#4%+_-@U'_S8+1^C+N(L>Q$^+#L)/ \@3VE-1
XMBP[$3XL>PD\STKCH ^B7O%)0Z*BXB_"+#J9/BQZD3P,>B%B#T0 STK@* .AY
XMO%)0BPZF3XL>I$\STK@0)^AGO 4% (/2 %)0Z'*XB_B+Q[L* #/2]_-2B\>[
XM"@ STO?S4(O&NPH ,]+W\U*+QKL* #/2]_-0N/D(4(U&O%#HY*&#Q R-1KQ0
XM,\!0Z" %@\0$H0);2%#_-K1;N!D)4(U&O%#HP*&#Q B-1KQ0,\!0Z/P$@\0$
XMH"H"M !0H"D"M !0H"@"M !0_S8M O\V*P*X,@E0C4:\4.B+H8/$#HU&O% S
XMP%#HQP2#Q 2+#@U'BQX+1S/2N H Z*Z[4E"+#N,"BQ[A C/2N&0 Z)R[!04
XM@]( 4E#HI[>+\(L.#4>+'@M',]*X"@#H?[M24(L.ZP*+'ND",]*X9 #H;;L%
XM!0"#T@!24.AXMXOXB\>["@ STO?S4HO'NPH ,]+W\U"+QKL* #/2]_-2B\:[
XM"@ STO?S4+A6"5"-1KQ0Z.J@@\0,C4:\4#/ 4.@F!(/$!*'I @L&ZP)T=(L.
XMZP*+'ND",]*X"@#H!+M24(L.YP*+'N4",]*X9 #H\KH%!0"#T@!24.C]MHOP
XMB\:["@ STO?S4HO&NPH ,]+W\U"X>0E0C4:\4.B#H(/$"(U&O% SP%#HOP.#
XMQ 3_-MT"_S;? KB."5"-1KQ0Z&"@@\0(7UZ+Y5W#58OL@^P$5E?H>B7HJ?OH
XM "7H_-JC^EJ)%OQ:Z/+:HP9;B18(6^CHVJ/^6HD6 %NA"%N+%@9;B5;\B4;^
XM,_;K"\1>_";&!P#_1OQ&@_Y2=?"XW 6C^%K1X#/24E#HB+2#Q 2C"EN)%@Q;
XMH0);T>#1X%#H?KA$1*/>6#/VZQ:+QM'@T>"+'MY8 ]C'!P QT<" !&.S8"
XM6W7DQP:T6P H0);HP1;HZ!8OSI;,_;K!<8% $=&@_YX=?;&!O," .AW)*/0
XM6(D6TEC'!@Y; @.,'A!;QP;D6@4 QP:H6F8#C!ZJ6L<&T%H$ +X! .LWB][1
XMX]'CQX<.6P QX<06P B][1X]'CQX>H6@ QX>J6@ B][1XS/ B8?06HO>
XMT>.)A^1:1H/^"G7$L %0L %0Z,C?@\0$7UZ+Y5W#58OLN*D)4#/ 4.A8 H/$
XM!+C3"5 SP%#H2P*#Q 2X^PE0,\!0Z#X"@\0$N/P)4#/ 4.@Q H/$!+@1"E S
XMP%#H) *#Q 2X$@I0,\!0Z!<"@\0$N"X*4#/ 4.@* H/$!+A%"E SP%#H_0&#
XMQ 2X6@I0,\!0Z/ !@\0$N'(*4#/ 4.CC 8/$!( ^F%@ =!JXAPI0,\!0Z,\!
XM@\0$N(@*4#/ 4.C" 8/$!%W#58OL_W8$Z#6?1$0]= !T'W\,/3\ ="X]<P!T
XM#NLL/7@ =!$]>@!T&.L@Z+CZZQWH;-'K&( ^F%@ = /HN?GK#.AJ^NL'Z!#_
XMZP+K %W#58OL7<-5B^Q65XM^!(MV"(M&!CM&"GT'BT8&B\CK!8M&"HO(ZS2+
XM10*+%3M$ G<+<@0[%',%N/__ZT2+WH/&!(M' HL7B]^#QP0[1P)W"W($.Q=S
XM!;@! .LEB\%)"\!_Q8M&!CM&"GT%N/__ZQ&+1@H[1@9]!;@! .L$,\#K %]>
XM7<-5B^R#[ I65\=&^ QT;V=0"+1O@#1O:[ @"9]_N+^(O'NF\ ]^H%]PJ+
XM\(I$:+0 4%:+7@;_-_]V!.A$_X/$"(E&^H-^^@!]"(O'2(E&]NL&B\= B4;X
XMBT;X.T;V?K*+?O:+Q[IO /?J!?<*B_#K:HI$:+0 4%:+7@;_-_]V!.C__H/$
XM"(E&^H-^^@!\#(-^#@!T0H-^^@!U//]V$/]V"O]V#O]V!O]V!%;_5&V#Q R)
XM1OR)5OZ+1OP+1OYT&(I$:8M>"(@'BT1KBUX,B0>+5OZ+1OSK#X/&;T>#_W9\
XMD3/2,\#K %]>B^5=PU6+[( ^SE@ =%BX& !0,\!0Z.0@@\0$@'X$ '0;H)98
XMF%"@E5B84*"46)A0N"$^4.@_E8/$".L)N#$^4.@SE41$_W8&Z"N51$2X 0!0
XMN!@ 4+@H %"X!P!0,\!0Z(PB@\0*7<-5B^Q65XMV!(M^"(-^"@!T'8I$:+0
XM4%;_-?]V!N@2_H/$" O = <STC/ Z; "BD1HM #1X-'@4![_=@8>5NB3.H/$
XM"HI$:+0 B06+7@['!P BUX,QP<$ (I$:K0 B]B#^T%V ^EP M'C+O^GDSFX
XMJ@I0Z >H1$2+7@R)!XS:N*H*Z5D"BUX,QP<H (S:N,\*Z4H"Z)T@H[Q;B1:^
XM6XS:N+Q;Z3@"QP:\6P$ QP:^6P C-JXO%OI) *+7@['!V [BUX,QP<! (S:
XMN/$"Z0X"BUX.QP=@.XM>#,<' 0",VKCR NGX 8M>#L<'63J,VKCM NGI 8M>
XM#L<'C4",VKCT NG: 8M>#L<':CR+7@S'!P$ C-JX^ +IQ &+7@['!VH\BUX,
XMQP<! (S:N/D"Z:X!BUX.QP=,0L<&O%L ,<&OEL (S:N+Q;Z9,!C-JX@%CI
XMBP&,VK@+1^F# 8S:N,Y/Z7L!BUX,QP<" (S:N*)/Z6P!BUX,QP<" (S:N+9/
XMZ5T!BUX,QP<" (S:N+1;Z4X!C-JX*P+I1@&,VKCA ND^ 8S:N.D"Z38!C-JX
XMY0+I+@&+7@S'!P( C-JXWP+I'P&+7@S'!P( C-JXW0+I$ &+7@['!V [BUX,
XMQP<! (S:N"@"Z?H H0);2*.\6\<&OEL (S:N+Q;Z>4 H<1/BQ;"3XD6O%NC
XMOEN!/J!/] %R"H,&O%L!@Q:^6P SP+KH U!2_S8-1_\V"T?H@;"+'KY;BPZ\
XM6P/($]I348L.OEN+'KQ;,]*XZ /H3;124.A>L*.\6XD6OEN,VKB\6^F! (L.
XMID^+'J1/ QZ(6(/1 #/2N H Z"*T4E"+#J9/BQZD3S/2N! GZ!"T!04 @](
XM4E#H&["CO%N)%KY;C-JXO%OK/^AQG:.\6\<&OEL (S:N+Q;ZRSH)XVCO%N)
XM%KY;C-JXO%OK&XS:N(Y8ZQ2,VKAR6.L-C-JX;ECK!C/2,\#K %]>7<,@-S8W
XM5S=%-XDYB3F).8DYB3F).8DY:S>!-Y<WB3F).:8WB3FU-\LWB3F).8DYB3F)
XM.8DYB3F).8DYB3F).>$W_#<$. PX%#@C.#(X03A).%$X63AA.' X?SB5.*HX
XM#CF).8DYB3F).8DYB3F).8DYB3F).8DYB3F).5 Y8SET.7LY@CE5B^R#?@0$
XM=!&X-3Y0L %0Z"/\@\0$,\#K!;@! .L 7<-5B^R#?@0"=!&X0#Y0L %0Z +\
XM@\0$,\#K!;@! .L 7<-5B^R#[ ;'1O[H \=&^@ QT;\ "*1@BT %#HP?]$
XM1 O =00SP.M3N 0 4(U&^E"-1@A0C4;^4/]V!N@9((/$"H-^_ !_&7P&@W[Z
XM ',1N$P^4+ !4.B;^X/$!#/ ZQN#?@0 =!#$7@R+1OR+5OHFB1<FB4<"N $
XMZP"+Y5W#58OL@^P&5L=&_N@#QT;Z #'1OP (I&"+0 4.A!_T1$"\!U!#/
XMZUJX! !0C4;Z4(U&"%"-1OY0_W8&Z)D?@\0*@W[\ 'P6=0:#?OH <@Z#?OP
XM?!E_!H-^^O]V$;A5/E"P 5#H#?N#Q 0SP.L4@WX$ '0)BW;ZQ%X,)HDWN $
XMZP!>B^5=PU6+[(/L",=&_N@#QT;Z #'1OP (I&"+0 4.BZ_D1$"\!U!#/
XMZV&X! !0C4;Z4(U&"%"-1OY0_W8&Z!(?@\0*@W[\ 'P7=0:#?OH <@^#?OP
XM?!I_!X%^^O\ =A&X73Y0L %0Z(7Z@\0$,\#K&H-^! !T#XI&^HA&^<1>#(I&
XM^2:(![@! .L B^5=PU6+[(/L"E:+=@K'1OSH XI&"+0 4.@2_D1$"\!U!#/
XMZU:#_@%\!8/^!GX1N&8^4+ !4.@J^H/$!#/ ZSO'1OX& (U&_E"-1O90C48(
XM4(U&_%#_=@;H6B"#Q J#?@0 =!)6_W8._W8,%HU&]E#H*#6#Q JX 0#K %Z+
XMY5W#58OL@^PDQT;^Z /'1OH ,=&_ BD8(M !0Z+#]1$0+P'4%,\#I]0"X
XM! !0C4;Z4(U&"%"-1OY0_W8&Z <>@\0*@W[\ 'P6=0:#?OH!<@Z#?OP ?!I_
XM!H-^^@IV$KAR/E"P 5#H>_F#Q 0SP.FN *#X K0 ,]([5OQU"SM&^G4&N $
XMZ9< @WX$ '4#Z8D C-@Y1@YU7H%^#/@"=5>*1OI0L !0Z)76@\0$"\!U$[A^
XM/E"P 5#H*OF#Q 0SP.M>ZS'H7]>*1OI0L %0Z&[6@\0$_W;\_W;ZN)$^4(U&
XMW%#HMY6#Q B-1MQ0L %0Z//X@\0$ZR2*1OJB^0*T %"XI#Y0C4;<4.B1E8/$
XM!HU&W%"P 5#HS?B#Q 2X 0#K (OE7<-5B^R#["C'1O[H \=&^@ QT;\ "*
XM1@BT %#HCOQ$1 O =04SP.DJ ;@$ %"-1OI0C48(4(U&_E#_=@;HY1R#Q J@
XMNELZ!O@"=1*XNCY0L %0Z&SX@\0$,\#I]@" /KI; G,2N-4^4+ !4.A3^(/$
XM!#/ Z=T @WX$ '4#Z<\ H+I;M #1X(O8BX?B6C/2.U;\?@/ID0!\"#M&^G(#
XMZ8< H+I;M #1X(O8@[_B6@!T&:"Z6[0 T>#1X(O8_[<,6_^W"EOH7*B#Q 2+
XM3OR+7OHSTK@4 .CDKE)0Z"RI@\0$B4;VB5;XBT;V"T;X=1&X\#Y0L %0Z,KW
XM@\0$,\#K5:"Z6[0 T>#1X(M6^(M>]H?8B8<*6XF7#%N@NENT -'@BU;ZB]B)
XME^):_W;\_W;ZH+I;M !0N 8_4(U&V%#H.I2#Q J-1MA0L %0Z';W@\0$N $
XMZP"+Y5W#58OL@^PH5L=&_N@#QT;Z #'1OP (I&"+0 4.@V^T1$"\!U!3/
XMZ7L!N 0 4(U&^E"-1@A0C4;^4/]V!NB-&X/$"J"Z6SH&^ )U$K@7/U"P 5#H
XM%/>#Q 0SP.E' 8 ^NEL"<Q*X-#]0L %0Z/OV@\0$,\#I+@&#?@0 =0/I( &@
XMNENT -'@B]B+A\Y:,]([5OQ^ ^F4 'P(.T;Z<@/IB@"@NENT -'@B]B#O\Y:
XM '09H+I;M #1X-'@B]C_MZ9:_[>D6N@$IX/$!(M._(M>^C/2N%( Z(RM4E#H
XMU*>#Q 2)1O:)5OB+1O8+1OAU$KA1/U"P 5#H<O:#Q 0SP.FE *"Z6[0 T>#1
XMX(M6^(M>]H?8B8>D6HF7IEJ@NENT -'@BU;ZB]B)E\Y:ZQF@NENT -'@T>"+
XMV(N'IEJ+EZ1:B5;VB4;X,_;K)+@T %"+1O8%'@#_=OA0H09;!1X _S8(6U#H
XM/C&#Q I&@T;V4HO&F3M6_'74.T;Z=<__=OS_=OJ@NENT %"X:3]0C4;84.B1
XMDH/$"HU&V%"P 5#HS?6#Q 2X 0#K %Z+Y5W#58OL@^PJ5L=&_N@#QT;X #'
XM1OH (!^"$-T$KA\/U"P 5#HFO6#Q 0SP.F, ;@$ %"-1OA0C48(4(U&_E#_
XM=@;HWQF#Q J#?@0 =0/I90&+%LA/H<9/L1CH/*F(1O2AR$\D_XA&]8L6R$^A
XMQD^Q".@EJ23_B$;VH,9/)/^(1O?&1OT ZRZ*1OVT +H, /?J!3I;B_"X! !0
XM%HU&]% >5NAY,(/$"@O =0#K$8I&_?[ B$;]BD;].@;S G7)BD;].@;S G4D
XMH/,"M "Z# #WZ@4Z6XOP_@;S K@$ % >5A:-1O10Z!$P@\0*BT0&BU0$B50(
XMB40*H=)8BQ;06(D6] *C]@*)5 2)1 :A]@*+%O0".P;O G<.<@8[%NT"<P8S
XMTC/ ZP^+%O8"H?0"*P;M AL6[P*CV%B)%MI8QD;] .LXBD;]M "Z# #WZ@4Z
XM6XOPBT0*BU0(.P;:6'<5<@8[%MA8<PV+1 J+5 B)%MA8H]I8BD;]_L"(1OV*
XM1OTZ!O,"=;^*1O>T %"*1O:T %"*1O6T %"*1O2T %"XBC]0C4;64.C2D(/$
XM#(U&UE"P 5#H#O2#Q 2X 0#K %Z+Y5W#58OL@^P&QT;^Z /'1OH ,=&_
XMBD8(M !0Z,[W1$0+P'4$,\#K)[@$ %"-1OI0C48(4(U&_E#_=@;H)AB#Q J#
XM?@0 = /HI^RX 0#K (OE7<-5B^R![ 0!5E>+=@2+?@B+7@:#?QP%=06X 0#K
XM C/ B$;_BUX&BT<HB4;\@'[_ '0%H/,"ZP*P"HA&_K@H % 6C8;\_E >5NB<
XM+H/$"H-^"@!T08I&_K0 .T;\<P<STC/ Z78!BT;\B88D_\>&)O\ (I$:+0
XM4(V&_/Y0_S7_=@;HP/&#Q @+P'0',](SP.E( >MKN H 4(V&_/Y0N H 4/]V
XM!NB=\8/$" O = 7'1OP /]&_.LLBT;\B88D_\>&)O\ (I$:+0 4(V&_/Y0
XM_S7_=@;H;/&#Q @+P'T"ZPW_1OR*1OZT #M&_'/*BD;^M [1OQS!S/2,\#I
XMVP"*1&BT -'@T>!0'O]V!A:-AOS^4.C0+8/$"HI$:+0 B06*1O^T O =0:*
XM1ORBNEN+7@S'!P0 BUX.QP< (I$:K0 2(O8@_L-=@/IAP#1XR[_IW]$BT;\
XMH[Q;QP:^6P C-JXO%OK<XM>#L<'C#V+7@S'!P( BT;\2-'@!>1:C-KK6(M>
XM#L<'XSZ+7@S'!P( BT;\2-'@!=!:C-KK/8M>#,<'! "+1OQ(N@P ]^H%.EN,
XMVNLFBT;\2+H, /?J!3Y;C-KK%HM&_$BZ# #WZ@5"6XS:ZP8STC/ ZP!?7HOE
XM7</S0P9$(41S1'-$<T1S1'-$<T1S1/-#/$131&-$58OL5HMV!(M&!K$(T^@D
XM_X@$1HI&!B3_B 1&B\;K %Y=PU6+[%:+=@2+5@B+1@:Q&.A6I23_B 1&BT8(
XM)/^(!$:+5@B+1@:Q".@^I23_B 1&BD8&)/^(!$:+QNL 7EW#58OL@>P& 597
XMBW8$BWX(BD1HM #1X-'@4!:-AOK^4!Y6Z&8L@\0*@WX* '1.BUX&BT<JBU<H
XMB98B_XF&)/^+AB+_B4;^BD1HM !0C8;Z_E#_-?]V!NB0[X/$" O =1+_=O[H
XM2]%$1(E&^HE6_ O"=0<STC/ Z;,"Z84 N H 4(V&^OY0N H 4/]V!NA:[X/$
XM" O = 0SP.L&BUX&BT<HB4;^_T;^ZT#_=O[H ]%$1(E&^HE6_ O"=0+K*8M&
XM_HF&(O_'AB3_ "*1&BT %"-AOK^4/\U_W8&Z WO@\0("\!] NL,_T;^BT;^
XM.P8"6W:WBT;^.P8"6W8',](SP.DK HI$:+0 T>#1X% >_W8&%HV&^OY0Z',K
XM@\0*BD1HM ")!8M>#L<' "+7@S'!P0 BD1JM !(B]B#^REV ^GF ='C+O^G
XM+$B+1OZCO%O'!KY; ",VKB\6^G1 ?]V_NA0T$1$"\)T!;@! .L",\"9H[Q;
XMB1:^6XS:N+Q;Z:X!QP:\6P$ QP:^6P C-JXO%OIF@&+7@S'!P8 BU;\BT;Z
XM!2( Z8<!BUX,QP<& (M6_(M&^@4H .ET 8M>#,<' 0"+5OR+1OH%'@#I80&+
XM7@S'!P$ BU;\BT;Z!1\ Z4X!BUX,QP<$ (M6_(M&^@4N .D[ 8M>#,<'! "+
XM5OR+1OH%,@#I* &+7@S'!P$ BU;\BT;Z!2 Z14!BUX,QP<! (M6_(M&^@4A
XM .D" 8M>#,<' @"+5OR+1OH%-@#I[P"+7@S'!P( BU;\BT;Z!3@ Z=P BUX,
XMQP<& (M6_(M&^@4Z .G) (M>#,<'!@"+5OR+1OH%0 #IM@"+7@S'!P0 BU;\
XMBT;Z!48 Z:, BUX,QP<$ (M6_(M&^@5* .F0 (M>#,<' @"+5OR+1OH%3@#K
XM?HM>#,<' @"+5OR+1OH%4 #K;(M>#,<' 0"+5OR+1OH%' #K6HM>#,<' 0"+
XM5OR+1OH%'0#K2(M6_(M&^@4$ .L]BU;\BT;Z!0@ ZS*+5OR+1OH%# #K)XM6
XM_(M&^@40 .L<BU;\BT;Z!10 ZQ&+5OR+1OH%& #K!C/2,\#K %]>B^5=PT%&
XM549X1GA&C$:?1K)&Q4;81NM&_D811R1'-T<@2"!(>$9X1DI'74>R1L5&<$>#
XM1_Y&$4>61ZA'($@@2"!(($@@2"!(ND?,1]Y'Z4?T1_]'"D@52%6+[('L# %6
XM5XMV!(M^!H-]'@!U"X-]' )U!;@! .L",\"(1O^+12J+52B)5OJ)1OR+12R)
XM1OB*1&BT -'@T>!0%HV&]/Y0'E;HN2B#Q J#?@H =0/IHP"*1&BT 7^_U"-
XMAO3^4(M>"(L'!?[_4%?H\.N#Q @+P'0',](SP.G1 >M1_W;XZ*+-1$2)1O2)
XM5O8+PG4"ZSJ ?O\ =!O$7O0FBT<6)HM7%#M&_'()=P4[5OIV NLGZQG$7O0F
XMBT<:)HM7&#M&_'()=P4[5OIV NL,_T;XBT;X.P8"6W:FBT;\BU;ZB98<_XF&
XM'O^+1OB)AB#_QX8B_P Z<( N H 4(V&]/Y0N H 4%?H5^N#Q @+P'0/QT;Z
XM 0#'1OP ,=&^ $ _T;XZ8D _W;XZ/W,1$2)1O2)5O8+PG4"ZW* ?O\ =!O$
XM7O0FBT<6)HM7%#M&_'<)=04[5OIW NM3ZQG$7O0FBT<:)HM7&#M&_'<)=04[
XM5OIW NLXBT;\BU;ZB98<_XF&'O^+1OB)AB#_QX8B_P BD1HM !0C8;T_E"+
XM7@C_-U?HONJ#Q @+P'T"ZP__1OB+1O@[!@);=P/I:_^+1O@[!@);=@<STC/
XMZ84 BD1HM #1X-'@4!Y7%HV&]/Y0Z",G@\0*BD1HM "+7@B)!XM>#L<' "+
XM7@S'!P0 BD1JM "+V(/[ W=#T>,N_Z?82HM6]HM&] 44 .LWBT;XH[Q;QP:^
XM6P C-JXO%OK)(M6]HM&] 48 .L9BT;XH[Q;QP:^6P C-JXO%OK!C/2,\#K
XM %]>B^5=PY!*FTJN2KE*58OL@>P0 597BWX$BW8&BD0HB$;WBT0NBU0LB5;\
XMB4;^BT0PB4;ZN"@ 4!:-AO#^4!Y7Z&\F@\0*@WX* '4#Z9H N H 4(V&\/Y0
XMN H 4%;HL.F#Q @+P'0',](SP.EE!8!^]P%R!H!^]RIV!S/2,\#I4@6*1O>T
XM (F&&/_'AAK_ #K,/]V^NA RT1$B4;PB5;R"\)U NL9Q%[P)HM'&B:+5Q@[
XM1OYR"7<%.U;\=@+K#/]&^HM&^CL& EMVQXM&_HM6_(F6'/^)AA[_BT;ZB88@
XM_\>&(O\ .F_ +@* %"-AO#^4+@* %!6Z!;I@\0("\!T%<9&]P?'1OP! ,=&
XM_@ QT;Z 0#K#8!^]RIV!S/2,\#IL 2*1O>T (F&&/_'AAK_ #_1OKK:/]V
XM^NB;RD1$B4;PB5;R"\)U NM1Q%[P)HM'&B:+5Q@[1OYW"74%.U;\=P+K.(M&
XM_HM6_(F6'/^)AA[_BT;ZB88@_\>&(O\ (I%:+0 4(V&\/Y0BUX(_S=6Z'WH
XM@\0("\!] NL,_T;ZBT;Z.P8"6W:/BT;Z.P8"6W8',](SP.D;!(I%:+0 T>#1
XMX% >5A:-AO#^4.CE)(/$"HI%:+0 BUX(B0>+7@['!P BUX,QP<$ (I%:K0
XM+0L B]B#^P-V ^G3 ]'C+O^G %&*1O>T *.\6\<&OEL (S:N+Q;Z;P#BU;R
XMBT;P!1@ Z; #BT;ZH[Q;QP:^6P C-JXO%OIG /'1O@ ,=&].!8Z5 #Z0<#
XM_W;ZZ(O)1$2)1O")5O(+PG4#Z>\"Q%[P)HM'&B:+5Q@[1OYS ^G< G<(.U;\
XM=P/IT@+_=OK_=O3H1O>#Q 2)1O2*1O>T $B+V(/[*78#Z9L"T>,N_Z>L4/]V
XM^O]V].@@]X/$!(E&].F" HM>],8' ?]&].EV K@& % >_W;TBT;P!2( _W;R
XM4.C@(X/$"H-&] ;I5P*X!@!0'O]V](M&\ 4H /]V\E#HP2.#Q J#1O0&Z3@"
XMQ%[P)HI''HM>](@'_T;TZ28"Q%[P)HI''XM>](@'_T;TZ10"N 0 4![_=O2+
XM1O %+@#_=O)0Z'XC@\0*@T;T!.GU ;@$ % >_W;TBT;P!3( _W;R4.A?(X/$
XM"H-&] 3IU@'$7O FBD<@BU[TB ?_1O3IQ '$7O FBD<ABU[TB ?_1O3IL@&X
XM @!0'O]V](M&\ 4V /]V\E#H'".#Q J#1O0"Z9,!N ( 4![_=O2+1O %. #_
XM=O)0Z/TB@\0*@T;T NET ;@& % >_W;TBT;P!3H _W;R4.C>(H/$"H-&] ;I
XM50&X!@!0'O]V](M&\ 5 /]V\E#HOR*#Q J#1O0&Z38!N 0 4![_=O2+1O %
XM1@#_=O)0Z* B@\0*@T;T!.D7 ;@$ % >_W;TBT;P!4H _W;R4.B!(H/$"H-&
XM] 3I^ "X @!0'O]V](M&\ 5. /]V\E#H8B*#Q J#1O0"Z=D N ( 4![_=O2+
XM1O %4 #_=O)0Z$,B@\0*@T;T NFZ ,1>\":*1QR+7O2(!_]&].FH ,1>\":*
XM1QV+7O2(!_]&].F6 ,1>\";_=P8F_W<$_W;TZ#SU@\0&B4;TZWW$7O F_W<*
XM)O]W"/]V].@C]8/$!HE&].MDQ%[P)O]W#B;_=PS_=O3H"O6#Q :)1O3K2\1>
XM\";_=Q(F_W<0_W;TZ/'T@\0&B4;TZS+$7O F_W<6)O]W%/]V].C8](/$!HE&
XM].L9Q%[P)O]W&B;_=QC_=O3HO_2#Q :)1O3K (I&][0 T>#1X(O8BH<R K0
XM0$ !1OCK#_]&^HM&^CL& EMW ^GM_(M&^CL& EMV+H-^"@!U"Z$"6XE$,,=$
XM,@ ,\!0_W;TZ$OT@\0$BT;X0$"+7@R)!XS:N.!8ZT+_1OJ!?OBX 7<#Z:;\
XM@WX* '4+BT;ZB40PQT0R "X 0!0_W;TZ _T@\0$BT;X0$"+7@R)!XS:N.!8
XMZP8STC/ ZP!?7HOE7<-R381-A$V$39!-KTW.3>!-\DT13C!.0DY43G-.!E &
XM4(1-A$V23K%.SDW@3=!.[TXP3D).#D\M3P90!E &4 90!E &4$Q/7D]P3XE/
XMHD^[3]1/[4_43.I,]DP*356+[('L%@%65XMV!(M^"(M>!H-_& -U!;@! .L"
XM,\"(1O^X* !0%HV&ZOY0'E;H3""#Q J#?@H =0/I-0&+7@:*1RB(1OX\"G8'
XM,](SP.EY!8M>!HM'+(E&_(!^_P!T0HI&_K0 T>#1X(O8BX<,6XN7"EN)5O*)
XM1O0+T'4',](SP.E&!8I&_K0 T>"+V(N'XEJ)1OH[1OQS!S/2,\#I*@7K0(I&
XM_K0 T>#1X(O8BX>F6HN7I%J)5NJ)1NP+T'4',](SP.D$!8I&_K0 T>"+V(N'
XMSEJ)1OH[1OQS!S/2,\#IZ 2*1OZT (F&$O_'AA3_ "+1OR)AA;_QX88_P
XMBD1HM !0C8;J_E#_-?]V!NC*XH/$" O = <STC/ Z:L$@'[_ '0FBT;\2+H4
XM /?JBU;TBU[R ]B)7O:+PXE6^ O"=0<STC/ Z8$$ZR2+1OQ(NE( ]^J+5NR+
XM7NH#V(E>[HO#B5;P"\)U!S/2,\#I6P3I9 &X"@!0C8;J_E"X"@!0_W8&Z%;B
XM@\0("\!T"\9&_@''1OP .L2BUX&BD<HB$;^BUX&BT<LB4;\@'[^"G8',](S
XMP.D4!(!^_P!T.HI&_K0 T>#1X(O8BX<,6XN7"EN)5O*)1O0+T'4#Z>H BD;^
XMM #1X(O8BX?B6HE&^CM&_'<#Z=( ZSB*1OZT -'@T>"+V(N'IEJ+EZ1:B5;J
XMB4;L"]!U ^FP (I&_K0 T>"+V(N'SEJ)1OH[1OQW ^F8 (I&_K0 B882_\>&
XM%/\ /]&_.MR@'[_ '0ABT;\2+H4 /?JBU;TBU[R ]B)7O:+PXE6^ O"=0+K
XM2NL?BT;\2+I2 /?JBU;LBU[J ]B)7NZ+PXE6\ O"=0+K*8M&_(F&%O_'AAC_
XM "*1&BT %"-ANK^4/\U_W8&Z#/A@\0("\!] NL+_T;\BT;\.T;Z=H:+1OP[
XM1OIW NL0BD;^_L"(1O['1OP .G3_HI$:+0 T>#1X% >_W8&%HV&ZOY0Z) =
XM@\0*BD1HM ")!8M>#L<' "+7@S'!P0 BD1JM ]< !U ^G+ 7]2/6< =0/I
XM!0%_-#T% '4#Z:T ?Q*+V$N#^P-V ^F1 M'C+O^G%E<]!@!U ^FK #T' '4#
XMZ;T /64 =$'I<@*+V(/K:(/[!W8#Z64"T>,N_Z<&5XO8@^MQ@_L6=@/I40+1
XMXR[_I]A6BD;^M "CO%O'!KY; ",VKB\6^DZ HM&_*.\6\<&OEL (S:N+Q;
XMZ28"BUX.QP=@.XM>#,<' 0"+5OB+1O;I#P*+7@['!^T[BUX,QP<& (M6^(M&
XM]D#I]P&+7@['!^T[BUX,QP<& (M6^(M&]@4' .G= 8M>#L<'8#N+7@S'!P$
XMBU;XBT;V!0T Z<,!BUX.QP?8.HM>#,<' @"+5OB+1O8%#@#IJ0'IH 'IG0&+
XM7@['!^T[BUX,QP<& (M6\(M&[@4B .F) 8M>#L<'[3N+7@S'!P8 BU;PBT;N
XM!2@ Z6\!BUX.QP=@.XM>#,<' 0"+5O"+1NX%'@#I50&+7@['!V [BUX,QP<!
XM (M6\(M&[@4? .D[ 8M>#L<'[3N+7@S'!P0 BU;PBT;N!2X Z2$!BUX.QP?M
XM.XM>#,<'! "+5O"+1NX%,@#I!P&+7@['!V [BUX,QP<! (M6\(M&[@4@ .GM
XM (M>#L<'8#N+7@S'!P$ BU;PBT;N!2$ Z=, BUX.QP?M.XM>#,<' @"+5O"+
XM1NX%-@#IN0"+7@['!^T[BUX,QP<" (M6\(M&[@4X .F? (M>#L<'[3N+7@S'
XM!P8 BU;PBT;N!3H Z84 BUX.QP?M.XM>#,<'!@"+5O"+1NX%0 #K;(M>#L<'
XM[3N+7@S'!P0 BU;PBT;N!48 ZU.+7@['!^T[BUX,QP<$ (M6\(M&[@5* .LZ
XMBUX.QP?M.XM>#,<' @"+5O"+1NX%3@#K(8M>#L<'[3N+7@S'!P( BU;PBT;N
XM!5 ZPCK #/2,\#K %]>B^5=P_]5&5;,5LQ6*54L53-6359C57U59E9_5LM5
XMY5685K%6S%;,5LQ6S%;*5LI6@E0L52]5255C57U5EU6Q5<M5@E285*Q4PU15
XMB^R#?@0&=02P!NL"L >*X(I&#HI^$(IN"(I.!HIV#(I6"LT07<-5B^RT K<
XMBG8&BE8$S1!=PU6+[+< N0$ M J*1@3-$%W#58OLM Z*1@3-$%W#58OL@^P$
XM,\ STE!2,\!0Z(1^@\0&B4;\B5;^BT;^BU;\.P:N3W\,? 8[%JQ/<P3_!LI/
XMBT;^BU;\4(D6K$^+PEJ)%JY/ZP"+Y5W#58OLQP;*3P ,\ STE!2,\!0Z#9^
XM@\0&!?__@]+_H[Y/B1; 3UW#58OL,\"Z9 !04NB!_RL&OD\;%L!/4%(STK@E
XM EE;Z$&5!1,!@]( 4E#H19%0H<I/4IE04KJ# +@ UEE;Z".5B]I:B\A8 \$3
XMT^L 7<-5B^R#[ 3H./^)1OR)5OZX 0"Z!P!04O]V_O]V_.@$D:*46*"46)B9
XM4%*Z 0"X!P!96^C@E"E&_!E6_C/ ND0$4%+_=O[_=OSHV9"BE5B@E5B8F5!2
XM,]*X1 196^BVE"E&_!E6_C/ NK8 4%*+3OZ+7OPSTK@* .B;E 5; (/2 %)0
XMZ)^0HI98@#Z66#QU#:"56/[ HI58Q@:66 " /I58/'4-H)18_L"BE%C&!I58
XM ( ^E%@8=07&!I18 (OE7<-5B^RX!P!0,\!0N!@ 4+A/ % SP% SP%"X!@!0
XMZ W^@\0.7<-5B^RX!P!0,\!0_W8*_W8(_W8&_W8$N 8 4.CK_8/$#EW#58OL
XMN < 4/]V#/]V"O]V"/]V!O]V!+@& %#HR?V#Q [_=@K_=@3HY/V#Q 1=PU6+
XM[(/L<%97N < 4+@! %#_=@K_=@C_=@;_=@2X!@!0Z)7]@\0.BT8(0"M&! 7X
XM_XE&_HU&F(OXH)98F+L> )GW^PO2=3*@EEB84*"56)A0H)18F%"XI#]0C4:0
XM4.@^>8/$"HM&_DA0N/H 4(O'0%#H/X*#Q ;K&(M&_@4( %"X( !0C4:04.@H
XM@H/$!L8%?+X* .L(B][& 3J#Q@H[=OY\\XM&##M&_GP&BT;^B48,BT8..T;^
XM? :+1OZ)1@Z+1A [1OY\!HM&_HE&$(M&#$"+\.L&B][& 2U&.W80?/6^"@#K
XM#XO>@#DM=06+WL8!*X/&"CMV_GSLBUX,Q@$\BUX0Q@$^BUX.Q@$JBU[^BD'_
XMF(OPBU[^QD'_ /]V"O]V!.B\_(/$!(U&D(OXZPR+WT>*!YA0Z,K\1$2 /0!U
XM[U;HKOQ$1%]>B^5=PU6+[(/L"%97BWX&BW8$QT;X #'1OH (-^# 1T!3/
XMZ; B@2+7@B(!T:-1OQ05NA X/$!(OP"_9U!3/ Z9( B\8K1@29BU[^BT[\
XM \@3VHL%F3O:<@IW!#O(=@0SP.MQBT8,F3M6_G<+<@4[1OQS!#/ ZUV+QBM&
XM!(M6_ /0*17V!(!T"L=&^/__QT;Z___K'(M6^HM&^+$(Z+:.BARW O#@<H
XM (E&^(E6^D:+1OR+5OZ#;OP!@U[^ O"==*+7@J+1OJ+5OB)%XE' HO&ZP!?
XM7HOE7<-5B^R#[ Q65XM^!(MV#H/^!'42Q%X*)HM' B:+%XE6_(E&_NLZ@_X"
XM=17$7@HFBP>)1O:+1O:9B4;\B5;^ZR"#_@%U%L1>"B:*!XA&]8I&]9B9B4;\
XMB5;^ZP4SP.FQ +X$ ,=&^ QT;Z@/_K$DZQ"(M6_HM&_.@!CHE&_(E6_HM&
XM_HM6_"-6^"-&^@O0=!:+1OZ+5OPC5O@C1OH[1OIU"CM6^'4%@_X!?\-6BD8(
XM4/]V!E?HM@&#Q B+^ O_=00SP.M,BUX&.3=]!#/ ZT&+7@8I-\=&^ QT;Z
XM /_K)8M6_HM&_"-&^"-6^K$8Z*N-B 5'L0B+5OZ+1OSH?(V)1OR)5OZ+QDX+
XMP'74B\?K %]>B^5=PU6+[(/L!%97BWX,BW8$B@2+7@B(!T:-1OQ05NAF 8/$
XM!(OP"_9U!#/ ZV6+QBM&!)F+7OZ+3OP#R!/:45.+7@:+!YE;.]I:<@IW!#O0
XM=@0SP.L]BP69.U;^=PMR!3M&_',$,\#K*O]V_![_=@H>5NAT%(/$"HM&_(D%
XMB\8K1@2+5OP#T(M>!BD7B\8#1OSK %]>B^5=PU6+[%97BWX&BW8.5HI&"%!7
XM_W8$Z*H @\0(B48$@WX$ '4$,\#K(CDU?00SP.L:5A[_=@3_=@S_=@KH$Q2#
XMQ HI-8M&! /&ZP!?7EW#58OL@^P$5E>+=@2*!+0 )1\ /1\ =00SP.M3B@2+
XM7@B(!XU&_%"+QD!0Z'0 @\0$B_ +]G4$,\#K-(O&*T8$B_B+QYD#1OP35OZ+
XM7@90BP=2F5L[VEIR"G<$.]!V!#/ ZPR+7@:+1OR)!XO&ZP!?7HOE7<-5B^Q6
XM5XM^!(MV!H,\ 7T$,\#K%8I&"(@%1_\,_W8*5E?HM "#Q ;K %]>7<-5B^R#
XM[ 965XM^!(H%B$;_]D;_@'1[BD;_)'^(1O^ ?O\ =00SP.M]@'[_!'8$,\#K
XM<\=&^@ QT;\ "+QT"+\(I&_XA&_NLDBU;\BT;ZL0CHC8N*'+< "\.!R@
XMB4;ZB5;\1HI&_@3_B$;^@'[^ '76BUX&BT;\BU;ZB1>)1P**1O^T %"+QUH#
XMPD#K%NL4BD;_M "+7@:)!\=' @ B\= ZP!?7HOE7<-5B^Q65XMV!(M6"(O^
XM@?J 'T'BL*(!$;K)X'Z_P!_"\8$@4:*PH@$1NL6Q@2"1HO"L0C3^"3_B 1&
XMBL(D_X@$1HM>!HO&*\<Y!WT$,\#K#8O&*\>+7@8I!XO&ZP!?7EW#58OL@^P,
XM5E>+=@2+1@H%! "+^(H$BUX(B =&C4;T4%;HT?Z#Q 2+\ OV=04SP.DJ 8O&
XM*T8$F8M>]HM.] /($]I14XM>!HL'F5L[VEIR"W<$.]!V!3/ Z0$!B\8K1@2+
XM5O0#T(M>!BD7BT;VBU;TB5;XB4;ZBUX,_P_K7\=&_ QT;^ "+5OZ+1ORQ
XM!^A$BHH<MP"!XW__4(O#4IE;60/($]J)3OR)7OZ#;O@!@U[Z (O>1O8'@'7,
XM@W[^_W(-=P:#?OS_=@4SP.F. (M&_HM6_(D5B44"@\<$@W[Z 'P3?P:#?O@
XM=@N+7@R+!_\/"\!_B(M>"HM'!HM7!(E6_(E&_C/ NB@ 4%+_=O[_=OSH*XFT
XM (M>"HE'!,='!@ ,\"Z* !04HM>"HM&_HM6_"M7!!M'!E!2Z/.(M "+7@J)
XM!\=' @ B\<K1@J[! "9]_N+7@R)!XO&ZP!?7HOE7<-5B^R![%(!5E>-1JZ)
XM1OZ-AJ[^B4;\BT8.T>#1X% 6C8:N_E#_=@S_=@KHR!"#Q J+7OR+3P*+'S/2
XMN"@ Z'>,BU[\BT\&BU\$ ]@3RE.+7OQ8B4<$B4\&@T;\!/].#NG. (M>_(M'
XM HL7B5;XB4;Z@T;\!,=&]'\ QT;V #'1NX ,=&\'\ QT;R S]NLSBT;Z
XMBU;X(U;P(T;R"]!T#XM&\HM6\(E6](E&]HEV[K$'BU;RBT;PZ+F(B4;PB5;R
XM@\8'BT;P"T;R=<7K2(%^]N !=1"#?O0 =0K'1O0 ,=&]N /BU;ZBT;X(T;T
XM(U;VBD[NZ)Z(#("+7OZ(!_]&_K$'BU;VBT;TZ(F(B4;TB5;V@V[N!X-^]@!U
XMLH-^]']UK(I&^")&](M>_H@'_T;^BT8._TX."\!^ ^DE_XU&KHM6_BO0B_I7
XMBD8(4/]V!O]V!.@1_(/$"(E&!(-^! !U!#/ ZR>+7@8Y/WT$,\#K'%<>_W8$
XM%HU&KE#H> ^#Q J+7@8I/XM&! /'ZP!?7HOE7<-5B^R#[ 16BW8$B@2+7@B(
XM!T:-1OQ05NCG^X/$!(OP"_9U!#/ ZQV+1OP+1OYT!#/ ZQ&+QBM&!(M>!BD'
XMB\8#1OSK %Z+Y5W#58OL,\!0BD8(4/]V!O]V!.AX^X/$".L 7<-5B^R#[ 96
XM5XMV!(M^$(L%B4;\B7;ZC4;_4(U&_%!6Z-OZ@\0&B_ +]G4$,\#K9H!^_S!T
XM!#/ ZUS_=@C_=@:-1O]0C4;\4%;H7_R#Q J+\ OV=00SP.L]@'[_!G0$,\#K
XM,XM>#HDW_W8*C4;\4%;HB_J#Q :+\ OV=00SP.L6BUX,BT;\B0<#=OR+QBM&
XM^BD%B\;K %]>B^5=PU6+[%97BTX$BU8&BUX("]M\'HO! \)(B_"+Q@/#B_CK
XM!HH$B 5.3XO"2@O =?/K%XOQB\$#PXOXZP:*!(@%1D>+PDH+P'7S7UY=PU6+
XM[(/L"%97BW8$BWX2BP6)1OZ)=O@SP%"P,%"-1OY05NAG^H/$"(OP"_9U!3/
XMZ2H!B\8K1OB)1OR+1OPI!8M>"/\W'O]V!K &4%=6Z-7\@\0,B_ +]G4%,\#I
XM_@"*1@JT #U '0\?Q"+V$M+@_L$=WC1XR[_I]5DB]B#ZT&#^P-W9]'C+O^G
XMS63_=@S_=A#_=@Z*1@I05U;H@?>#Q R+\.M+_W8,_W80_W8.BD8*4%=6Z!3Y
XM@\0,B_#K,HM&#-'HT>A0_W80_W8.BD8*4%=6Z%'\@\0,B_#K%(I&"E!75N@<
XM_H/$!HOPZP0SP.MM"_9U!#/ ZV6+QBM&^"M&_(E&_L=&^@ @7[^@ !\#?]&
XM^H%^_O\ ?@/_1OJ#?OH =!S_=OK_=OZ+1O@#1OQ0Z(3^@\0& W;ZBT;Z 4;\
XM_W;^L#!0C4;^4/]V^.@^^8/$" O =00SP.L$B\;K %]>B^5=P_9C]F/V8P]D
XM]F-69 ]D1F0H9%6+[(/L&E97BW8$BWX&QT;\ #'1OX +BT/U#H,'I$1(E&
XM^HEV]KA: %"-1OQ0C4;Z4+B[/U!75NA4"X/$#(E&](-^] !U!3/ Z6$"N%H
XM4+"D4%?_=O3HO/B#Q B)1O*#?O( =04SP.E" O]V"A[_=@BP!E!7_W;RZ#3[
XM@\0,B_ +]G4%,\#I(P*X! !0%HU&#%"P!%!75NBZ]X/$#(OP"_9U!3/ Z00"
XMN ( 4!:-1A!0L )05U;H[_6#Q R+\ OV=04SP.GE ;@" % 6C4824+ "4%=6
XMZ-#U@\0,B_ +]G4%,\#IQ@&X! !0%HU&%%"P0U!75NBQ]8/$#(E&\(-^\ !U
XM!3/ Z:0!N%H 4+ P4%?_=O#H__>#Q B)1NY7_W8@_W8>BD8<M !0C48:4/]V
XM&/]V[NA4_8/$#HE&[(-^[ !U!3/ Z64!QT;F "+1NPK1NZ)!8$]@ !\#/]&
XMYH$]_P!^ _]&YL=&Z BT;L*T;R T;FB06!/8 ? S_1NB!/?\ ?@/_1NC'
XM1NH (M&["M&]@-&Z -&Y@7^_XD%@3V 'P,_T;J@3W_ 'X#_T;JBT;J T;H
XM T;F=#N+1NH#1N@#1N90BT;L*T;N4/]V[NAM_(/$!HM&Z@-&Z -&Y@%&[(M&
XMZ@-&Z -&Y@%&[HM&Z@-&Z %&\(M&["M&[HE&^/]V^+ P4(U&^%#_=O#H!O>#
XMQ @[1NYT!3/ Z9 BT;J T;H=":+1NH#1NA0BT;P*T;R4/]V\N@'_(/$!HM&
XMZ@-&Z %&\HM&Z@%&](M&["M&\HE&^/]V^+"D4(U&^%#_=O3HLO:#Q @[1O)T
XM!#/ ZSV+=O:+1NPK1O:)!8M&["M&]%"-1OQ0C4;Z4+C"/U!75NC\"(/$#(OP
XM.W;T= 0SP.L,BT;L*T;VB06+!>L 7UZ+Y5W#58OL@^PD5E>+?@2+=@C'1OH
XM ,=&_ B7[FBT8&B4;DQP8$7$ C4;@4+@$7%"XPEM0C48&4%?H(PB#Q J+
XM^ O_=04SP.D\ XM&X M&XG0%,\#I+P.XPEM0Z!4'1$2CP%N#/L!;_W4%,\#I
XM%P.-1O]0C48&4%?H=?6#Q :+^ O_=04SP.G] H!^_Z!T$8!^_Z%T"X!^_Z-T
XM!3/ Z>8"N 0 4(U&]E"-1OY0C48&4%?H:O*#Q J+^ O_=04SP.G$ K@$ %"-
XM1O)0C4;^4(U&!E!7Z$CR@\0*B_@+_W4%,\#IH@*X! !0C4;N4(U&_E"-1@90
XM5^@F\H/$"HOX"_]U!3/ Z8 "B7;L,\!0C4;Z4+@$7%"XPEM0_W8*_W;LZ+P'
XM@\0,B4;J@W[J '4%,\#I5 (SP%"PHE#_=@K_=NKH(_6#Q B)1NB#?N@ =04S
XMP.DT L9&_@*X! !0%HU&]E"*1OY0_W8*_W;HZ(OR@\0,B_ +]G4%,\#I# *X
XM! !0%HU&^E"*1OY0_W8*5NAI\H/$#(OP"_9U!3/ Z>H!N 0 4!:-1OI0BD;^
XM4/]V"E;H1_*#Q R+\ OV=04SP.G( 3/ 4(U&[E"*1O^T %"+7@K_-U;_=@97
XMZ, !@\0.F8E&\HE6](!^_Z-U8HM&\@M&]'5:N $ 4(U&[E"*1O^T %"+7@K_
XM-U;_=@97Z(T!@\0.F8E&\HE6]#/ ,])04C/ ,])04O]VY/]V[/]VYNBW X/$
XM#@O =!&A!EPK1NR+7@J)![@! .E! 3/ Z3P!BU[R@_L%=@/I'0'1XR[_IQYK
XMQT;> "A!EPK1NB+7@J)!XM>"H$_@ !\#_]&WHM>"H$__P!^ _]&WL=&W
XMH09<*T;L T;>!?[_BUX*B0>+7@J!/X ? __1MR+7@J!/_\ ?@/_1MR+1MP#
XM1MYT,(M&W -&WE"A!EPK1NA0_W;HZ,#X@\0&BT;< T;> 08&7(M&W -&W@%&
XMZ(M&W %&ZHMVZJ$&7"M&Z(M>"HD'BUX*_S>PHE#_=@I6Z%WS@\0(B_ [=NAT
XM!#/ ZW&+=NRA!EPK1NR+7@J)!Z$&7"M&ZE"-1OI0N 1<4+C"6U#_=@I6Z* %
XM@\0,B_ [=NIT!#/ ZSOK*?]V\/]V[O]V]/]V\O]VY/]V[/]VYNA_ H/$#@O
XM= +K"#/ ZQ0SP.L0H09<*T;LBUX*B0>X 0#K %]>B^5=P^YIWVK?:M]JWVK?
XM:E6+[('L(@%65XM^!(MV"(!^#*-U!\=&Z@ ZP7'1NH! (!^#*%U!\=&Z
XMZP7'1N@! (U&_U"-1@905^@9\H/$!HOX"_]U!KC__^GX 8!^_S!T!KC__^GL
XM 8EVY#/ 4+ P4(U&"E!6Z&'R@\0(B_ +]G4&N/[_Z<P!B7;BBUX.QP<! ,='
XM @ Z3 !QT;\0 "-1@90C4;V4(U&^E"-1OE0C4;\4(V&WOY05^BM]H/$#HOX
XM"_]U!KC__^F) 8U&YE#_=NB-1NQ0C4;N4(U&]5"-1OQ0C8;>_E#H6\F#Q Z)
XM1O")5O*+1O +1O)U!K@" .E3 ?]VZO\VP%O_=NSHJ0*#Q 8+P'4&N ( Z3D!
XM@'X,HW5P@W[F '5%_W;NBD;UM !0_W;ZBD;YM !0Z.8"@\0("\!U!K@# .D+
XM 8-^$ !T&_]V[O]V\O]V\/]V^HI&^;0 4/]V]NC= H/$#.LE_W;R_W;P_W;Z
XMBD;YM !0_W;V_W80_U;F@\0,"\!U!K@# .G# (U&"E#_=O+_=O#_=NZ*1O6T
XM %"-1OQ0C8;>_E!6Z)[V@\00B_ +]G4&N $ Z90 BUX.@P<!@U<" (-^!@!^
XM ^G'_HDV!ES'1MX *$&7"M&XHE&"H%^"H ? W_1MZ!?@K_ 'X#_T;>@W[>
XM '0@_W;>H09<*T;B4/]VXNCU]8/$!HM&W@$&!ER+1MX!1N*A!EPK1N*)1N#_
XM=N"P,%"-1N!0_W;DZ*+P@\0("\!U!;@! .L0BUX.QP< ,=' @ ,\#K %]>
XMB^5=PU6+[(/L$E97_W8('O]V!A[_=@3H^0.#Q J+1@B)1OB-1OI0N 1<4+C"
XM6U"-1OA0_W8&Z$8"@\0*B4;T@W[T '4%,\#I$0&-1OI0C4;X4/]V].BX[X/$
XM!HE&\H-^\@!U!3/ Z?( BT;XB4;VN 0 4(U&^E"-1O]0C4;X4/]V\NBY[(/$
XM"HE&\(-^\ !U!3/ Z<4 N 0 4(U&^E"-1O]0C4;X4/]V\.B2[(/$"HOX"_]U
XM!3/ Z:$ N 0 4(U&^E"-1O]0C4;X4%?H<.R#Q J)1NZ#?NX =00SP.M]_W;V
XML*)0C4;V4/]V].B6[X/$"(OP.W;R= 0SP.M?BT8(B4;XQD;_ K@$ % 6C48*
XM4(I&_U"-1OA0_W;PZ/KL@\0,B_ []W0$,\#K,;@$ % 6C48.4(I&_U"-1OA0
XM5^C8[(/$#(OP.W;N= 0SP.L.BT8& T8(HP9<N $ ZP!?7HOE7<-5B^R+7@;1
XMXX-^" %U$K@" (K+T^!0BT8$6B/"ZQ+K$+@! (K+T^!0BT8$6B/"ZP!=PU6+
XM[%97BWX$,_;K%E>+WM'C_[?*/^B^;X/$! O =0+K!D:#_@5\Y8/^!74%N/__
XMZP2+QNL 7UY=PU6+[(M&!CM&"GX$,\#K$8I&!#I&"'4%N $ ZP(SP.L 7<-5
XMB^Q,3%:+=@3'1O[H XI&!K0 /4$ ="U_&CT& '15?PP] @!T'ST$ '0QZU\]
XM0 !T*NM8/4( = P]0P!T!SU$ '09ZT?_=@[_=@J-1@90C4;^4%;H^>J#Q KK
XM,(U&#E#_=@J-1@90C4;^4%;HT.R#Q KK&(U&#E#_=@J-1@90C4;^4%;H2.^#
XMQ KK %Z+Y5W#58OL3$Q65XMV!(M^"HU&_U#_=@96Z'GM@\0&B_ +]G4$,\#K
XM4X!^_S!T!#/ ZTFX! !0_W8,C4;_4/]V!E;H?NJ#Q J+\ OV=00SP.LJ5_]V
XM"(U&_U#_=@96Z%'L@\0*B_ +]G4$,\#K#HM&" ,%B]C&!P"+QNL 7UZ+Y5W#
XM58OL5E>+=@2+?@J+1@X#!04% %"P,%#_=@96Z&GM@\0(B_ +]G4$,\#K0+@$
XM % >_W8,L )0_W8&5NC=ZH/$#(OP"_9U!#/ ZR'_-1[_=@BP!%#_=@96Z&SL
XM@\0,B_ +]G4$,\#K!(O&ZP!?7EW#58OL5E=5LP&*1@2T#LT075]>B^5=PXI&
XM!"0// E^ @0'!#!0Z-G_6,-5B^Q65XI&!+$$TNB*T.C<_XI&!.C6_U]>B^5=
XMPU6+[%97'L5V!*P*P'00/ UU!5#HI/]84.B?_UCKZQ]?7HOE7<-5B^Q65Q[%
XM=@2+3@B*V='I,]+\XPSXK1/0XON#T@"#T@" XP%T"S+DK /0@]( @]( B\(+
XMP!]?7HOE7<-5B^Q65XS:C,/%=@3$?@B+3@S1Z?SSI7,!I([:CL-?7HOE7<-5
XMB^Q65XS:C,/%=@3$?@B+3@S\\Z:+P8[#CMI?7HOE7<, %6+[%97,]*.
XMPHM&!)SZ)@,&; 0F$Q9N!"X#!LIQ+A,6S'&=7UZ+Y5W#58OL5E<SP([ BT8$
XMNHT$]^*Y!@#1ZM'8XOJ<^B8#!FP$)A,6;@0N P;*<2X3%LQQG5]>B^5=PU6+
XM[%97,\".P)SZ)HL.; 0FBQYN!)TN.A[.<704?0TN@0;*<; +H,6S'$8+H@>
XMSG$N P[*<2X3'LQQBT8$BU8&.]-R"W<$.\%R!3/ ZP20N $ 7UZ+Y5W#58OL
XM@^P.5E<SP#/2B5;VB4;XB5;ZB4;\@WX$ '4#Z< QT;^ "X+ !0_W8$Z.UK
XM65F+^ O =0/IF0#&!0!'N"P 4%?HUFM968E&_@O =".+7O[&!P#_1O[_=O[H
XMS I9B4;VB5;X5^C!"EF)1OJ)5OSK85?HM I9B4;ZB5;\BU;\BT;ZL1[H%'>)
XM1O*)5O2Y! "[%G0NBP<[1O)U"2Z+1P@[1O1T!D-#XNOK*"[_9Q#'1O8 ,=&
XM^ #_ZQC'1O8 _L=&^/__ZPS'1O8 _\=&^/__ZP#_=@3H40I9B48&B58(@SZ:
XM7 QR ^F= #/VZT>+QKH, /?JB]B+AQ1<BY<27#M&^'<P<@4[5O9S*:&:7"O&
XMN@P ]^I0B\:Z# #WZ@467%"+QKH, /?J!0I<4.AX:(/$!NL'1CLVFEQ\LXO&
XMN@P ]^J+5@B+7@:'V(F'"ER)EPQ<B\:Z# #WZHM6_(M>^H?8B8<.7(F7$%R+
XMQKH, /?JBU;XBU[VA]B)AQ)<B9<47*&:7$"CFEQ?7HOE7<, $ @ #
XM .',X<T1S4'-5B^Q6N @&4+B,8E#H! 5968OPQP0 <=$ @@ QT0$
XM!@3'1 8 ?\V\$G_-NY)Z,T465F)1 Z)5!"X!@!0B\8%" !0N(9B4.BX9X/$
XM!O]V!O]V!.BH%%E9B408B50:N!P 4.@&!5E>7<-5B^Q65S/VZR2+WK$$T^.+
XMA_H_BY?X/SM&!G40.U8$=0N+QK$$T^ %^#_K84:#_BA\UX-^" !T43/VZRZ+
XMQK$$T^ %^#^+^(L%"T4"=!>+10Z+50R#PF05 !04N@Y_5E9"\!T!(O'ZR1&
XM@_XH?,VA>$) NR@ ,]+W\XD6>$*+PK$$T^ %^#_K!#/ ZP!?7EW#58OL5C/
XM4/]V"O]V".A?_X/$!HOP"\!T)L9$"@"+Q@4$ %#_=@;_=@3HE0&#Q :X+ %0
XMZ)K\68E$#(E4#NM!N $ 4/]V!O]V!.@C_X/$!HOPQD0* (M&"HM6"(D4B40"
XMB\8%! !0_W8&_W8$Z%(!@\0&N"P!4.A7_%F)1 R)5 Y>7<-5B^Q6,\!0_W8&
XM_W8$Z-S^@\0&B_ +P'0.N"P!4.@M_%F)1 R)5 Y>7<-5B^R#[ 965XMV!($\
XM %U!H-\ @AT!3/ Z?( _W00_W0.Z#(365F)1OR)5OXSP%#_=O[_=OSHB?Z#
XMQ :)1OH+P'0ON"P!4.C9^UF+7OJ)1PR)5PZX!@!0BT;Z!00 4(O&!0@ 4.CS
XM98/$!HM>^L9'"@&!? 8 70#Z9( _W0:_W08Z-(265DK!NY)&Q;P20O2=WMU
XM!CL&#$EW<[@(!E"+Q@4( %#HQ )968OXQP4 <=% @@ QT4$!@3'108 HM$
XM$(M4#HE5&(E%&HM$&HM4&(E5#HE%$+@& %"+QP4( %"XAF)0Z'-E@\0&N 8
XM4(O'!1( 4(O&!0@ 4.A=98/$!K@< %#HO )9N $ ZP!?7HOE7<-5B^R#[ I6
XM5XM^"(,^>D(&=0:X 0#I$0*+1@:+5@0K%NY)&P;P20O =R%R!CL6#$ES&0O_
XM= ^X!@!05[B&8E#H!66#Q :X 0#IW@'K*(L>"%R ?PH =!P+_W02N 8 4%>A
XM"%P%! !0Z-UD@\0&N $ Z;8!ZQ8SP%#_=@;_=@3H+?V#Q :C"%P+P'7"@SX(
XM7 !U$[@! %#_=@;_=@3H#_V#Q :C"%R+1@:+5@0S%NY),P;P22,6\DDC!O1)
XM"]!U ^F' #/VZWB+QKH, /?JB]B+APQ<BY<*7#,6[DDS!O!)(Q;R22,&]$D+
XMT'52B\:Z# #WZHO8BX<47(N7$EPC5@0C1@924(O&N@P ]^J+V%@[AQ!<6'4H
XM.X<.7'4B5XO&N@P ]^J+V/^W#%S_MPI<Z-#^@\0&"\!T!K@! .GL $8[-II<
XM?((SP.G@ (M&! M&!G4%,\#ITP"X!0!0Z++Y68E&^HE6_*%<1(E&_L<&7$0!
XM ,<&7D0 .F. (L>"%R+1@:+5@2)%XE' E!2Z+C[65FX 0!0Z'GY62T. (/:
XM (E&]HE6^.M3@SY>1 !T NMK,\!0Z+(G68L>"%R ?PH =#D+_W02N 8 4%>A
XM"%P%! !0Z'5C@\0&N"P!4.@S^5F+'@A<B4<,B5<.QP9>1 BT;^HUQ$N $
XMZS'_=OC_=O;H1?E960O =)[_=OS_=OKH-OE960O =0/I8/_'!EY$ "+1OZC
XM7$0SP.L 7UZ+Y5W#58OLN 8 4+B&8E#H_A10Z 9C@\0&N 8 4+C_ %"XC&)0
XMZ-QB@\0&7<-5B^RXZ@50,\!0N)Q<4.C&8H/$!J%Z0CT! '0'/08 =##K,[@&
XM %"XG%Q0_W8$Z+YB@\0&N 8 4+BB7%"XAF)0Z*QB@\0&BT8&HZA<N*I<ZP6X
XMG%SK %W#58OL5HMV!(,^>D(!=0^+Q@4. (OP/3P <P.^/ !6N)Q<4.B)$UE9
XMZP!>7<-5B^R#?@0 = G_=@3HU!-9ZP/HN!-=PU6+[%97BWX$Z,T3B_ +P'0C
XMH7I"/0$ = <]!@!T#NL4BT0,B06+Q@4. .L,QP4( (O&ZP0SP.L 7UY=PU6+
XM[.B=$EW#58OLBT8$!?C_ZP!=PU6+[*&80HL6ED([1@9U*3M6!'4DQP:60O__
XMQP:80O__BUX(H:!"BQ:>0HD7B4<"BQ:<0J&:0NL(NO__N/__ZP!=PU6+[!ZX
XML$-0Z*KV65D>_W8&Z*'V65D>N+E#4.B7]EE97<-5B^R#[ :-1OI0_W8&_W8$
XMZ$7\@\0&"\!U!#/ ZP^X" !0C4;Z4.B'_EE9ZP"+Y5W#58OL5E>+=@2+1@0%
XM% "+^,=% @ _W8.'E?H:O:#Q ;WT(E% H D#X ,0( D\( ,!8M&#@44 %#H
XM1 Y9B40"QD0! *&40O\&E$)0Z#$.68E$!,=$!@ QD0(^L9$"0''1 H (M&
XM"(M6!HE4#(E$#HM&#(M6"HE4$(E$$K@4 % >5N@"]H/$!O?0B40*_W0"Z.P-
XM65#H/_Y97UY=PU6+[(/L"%97BUX$B@<E#P#1X-'@B4;ZBT8$ T;ZB_"+7@3_
XM=P+HN@U9*T;ZB4;Z_W;Z'E;HL_6#Q 8]__]T#1ZXO$-0Z'[U65GIX &*1 &T
XM (E&^(O&!0@ B_B*!+0 B]B#^Q!V ^G# ='C+O^GD7V+7@3_=P[_=PSH40U9
XM6:.60HD6F$*X 0!0Z WV62M$!!M4!J.:0HD6G$*#/IQ"_W(4=P>#/II"_W8+
XM@0::0K @Q:<0AB+1 J+5 B)%IY"HZ!"Z6<!@W[X!GTWBU[XT>/_MWQ"5N@X
XM_EE9@'T)!G47,\!0BU[XT>/_MWQ"N $ 4%?HAB>#Q B ?0D1=057Z. F6>DG
XM 8,^!$H =@JXWD-05NC\_5E9@'T)!G41,\!0,\!0N ( 4%?H4">#Q CI_ "#
XM?O@$?3" ?0D&=13_= ;_= 0SP%"X!0!05^@M)X/$"H,^!$H =@^+7OC1X_^W
XMC$)6Z*S]65GIPP"X" !0_W8$Z$[]65#H:OQ968E&_(M&_ 44 (E&_O]V^O]V
XM_E;H05^#Q :+7O[&!P"+7OZ*1OB(1P'_=OJ+7@3_=P[_=PR+7@3_=Q+_=Q#_
XM=OSHIOV#Q SK:H-^^ )])HM>^-'C_[>(0E;H._U968!]"09U$3/ 4#/ 4+@!
XM %!7Z(\F@\0(ZSRX[$-05N@8_5E9ZS"X 4105N@,_5E9ZR2X$T105N@ _5E9
XMZQBX(T105NCT_%E9ZPRX,D105NCH_%E9ZP!?7HOE7<//>XM]BWTD?&1\CWR+
XM?8M]R'R+?8M](7U/?5M]9WUS?7]]58OL@^P&5E>+=@3'1OH ,=&_ @#Q;
XM=0%&QT;^& #K0E;H'EA9B_B+QR7_ )F*3O[H'&P)1OH)5OR#?OX =0B+5OR+
XM1OKK(;@N %!6Z*%@65F+\ O =08STC/ ZPM&@V[^"(-^_@!]N%]>B^5=PU6+
XM[.LHBL*8B]CVAR%, G0"ZQJ ^BYT#X#Z('0*@/I;= 6 ^EUU NL$,\#K$XM>
XM!/]&!(H'BM *P'7*N $ ZP!=PU6+[+@ 5#HT@I9BQZ^8HE' K@! %#HPPI9
XMBQZ^8HE'!(L>OF+'1P8 (L>OF+'1P@ (L>OF+'1PH %W#58OL@^P&5E>+
XM5@2+=@8SP(O(B4;ZB\*)1OZ+VL8' (O"0(OXZP:*!(@%1D> / !T!8 \+G7P
XMB\8K1@:)1OR#?OP_?@6X___K1HO:BD;\B ?&!0" / !T#<=&^@$ 1HEV!HO7
XMZQV#?OH =1<+R743@SZ\8@!T#(LVO&*Y 0")=@:+UX \ '631XO'*T;^ZP!?
XM7HOE7<-5B^R#[ 965XM^!(MV!HEV^C/;ZUV*!)B)1OSK*@O;=0F+QBM&^D!
XMB]A&BT;\)3\ L0C3X%"*!)A: ] #5@B+\HH$F(E&_(M&_"7 #W '3+1L=&
XM_@ ZPF*!(@%1D?_1OZ+1OPE/P [1OY_[,8%+D> / !UGD_&!0!&"]MU!XO&
XM*T;ZB]B+P^L 7UZ+Y5W#58OL@^P$5E>AOF(%# ")1OS_=@2AOF(%# !0Z+S^
XM65F)1OZAOF(#1OX%# "+\,8$ $;&! %&Q@0 1L8$ 4;_=@KH- E9BQZ^8HD'
XMB\8K1OP%# "+^#/ 4+@U %#_=@C_=@:XY0-0_S:28NCU&8/$#%?_-KYB_S:2
XM8N@K/(/$!HO'ZP!?7HOE7<-5B^Q65S/_BW8$ZP> / !U 4=&@#P =?2 ? $
XM=>Y'B\?K %]>7<-5B^Q65XM^!O]V!.C+_UD[QWT$,\#K%4^+=@3K!X \ '4!
XM3T8+_W7UB\;K %]>7<-5B^R![ X!5E>+?@3_=0;HA@A9B4;Z_W4"Z'P(6;H/
XM "/0B5;X@W[X '8(BT;X,]+IN0"#?OH =P/IJ #_=0+H5@A9J0" =0/IF0"+
XMQP4, (OP5U:-AO+^4.@S_H/$!HE&_HM&_@4$ /PZVY75HV&\OY0Z!G^@\0&
XMB4;^ W;^B7;VB@2T O =2^ ? $!=2F*1 *T O =2" ? ,!=1JX! !0_W8&
XMBT;V!0H 4.C76H/$!C/2,\#K,[@" %"-1OQ0BT;V!0@ 4.B\6H/$!O]V_.C$
XM!UD%"@ #\(M&^O].^@O =XBZ__^X___K %]>B^5=PU6+[(/L!%97N P"4/\V
XMOF+_-I)BZ(DZ@\0&B_ +]GT(NO__N/__ZT"-1OQ0_S:^8NC;_EE9B_B+QSW_
XM_W0>"\!T#3T# '0"ZQDSTC/ ZQG_=O[_=OSH.0=96>L,,](SP.L&,](SP.L
XM7UZ+Y5W#58OL@>P( E97BWX$BW8,QT;X #'1OH ,<$ 0"+1@@+1@IU$1ZX
XM0$10Z.[N65DSTC/ Z4 !ZP%'@#T = 6 /2%\]8H%F O =0<STC/ Z24!Z C\
XM5XV&^/U0Z*1<65F#?@8 =&:-AOC]4.BX7%E(C9;X_0/"B]B /RYT.H,^O&(
XM=#'_-KQBZ+_]68E&_KA91%"-AOC]4.C)6UE9N $ 4/\VO&+HR?U965"-AOC]
XM4.BQ6UE9ZQ6-AOC]4.AG7%E(C9;X_0/"B]C&!P#'1OP" .M]N 'P4/]V"O]V
XM"(V&^/U0Z-S\@\0(_W;\_S:28NC&%5E9Z'17_S:28NA)'5G_-I)BZ-L560O
XM= +K,8,^7D0 = +K*/\VQ&+_-L)BZ ;O65D+P'0"ZQ7_-I)BZ.D\60O = 3'
XM! @SP =;:#/ !U NL4N@( BT;\]^J)1OR#?OP1?0/I>O^#/ !U">@R_HE&
XM^(E6^O\VDF+H6CU9BU;ZBT;XZP!?7HOE7<-5B^Q65XMV!#/_ZQ:X+@!05N@,
XM6UE9B_ +]G4$,\#K"T9'.WX&?.6+QNL 7UY=PU6+[('LM I65XV&Y/VCOF*-
XMADSUHY)B@WX$ '4',](SP.GE /]V!.BI/EG_=@3H/OI9"\!T"O]V!.C#^5GI
XMR0"#/CY$ '4*H0A)T>#1X*,^1/\V/D3H[.U9H\)BB1;$8C/_N H 4#/ 4(U&
XM\E#H]%>#Q :A7$2)1O#'!EQ$ 0#'!EY$ !7_S; 8NA$_UE9H[QB"\!U [__
XM_S/VZT**0O*T O =3B-1O*+U@/04HO>T>/1X_^WEF+_MY1B@___= 6X 0#K
XM C/ 4/]V!.B&_8/$"HE&_(E6_@O"= +K!T8[-L9B?+B#__]U NL)1XM&_ M&
XM_G20QP9>1 BT;PHUQ$BU;^BT;\ZP!?7HOE7<-5B^R#/EQ$ '0=QP9>1 $
XM]P9D1! = H>N)9$4.A![%E9N $ ZS#W!F1$$ !T%!Z+'F1$@>,! -'C_[=@
XM1.@@[%E9]P9D1 $ = 6X 0#K!^AI%#/ ZP!=PU6+[(M&!*-D1+C#A%#H@3]9
XM7<-5B^R![)X*5E>#/GI"!G4&N/__Z5L#H?!)BQ;N28E6[HE&\,<&[DD ,<&
XM\$D #/ 4+A# %#_-JI$_S:H1+A$ %"-AKKW4.BR%(/$# O =1 >N+!$4.B<
XMZUE9N/__Z1 #_S:L1.AA[%F)1OB)5OJ+1NXE!P %!P")1O:X+ %0,\!0C8:.
XM]E#H7U:#Q ;&AH[V :!Z0HB&C_:X...@F.Z8U-04NA9 UE9B89Z]XF6?/>#/GI"
XM 74%QH:0]@:+1O"+5NZ)EI+VB8:4]K@! %#H0P-9B8:6]K@& %"-AJKV4+B&
XM8E#H'5:#Q :X+ %0C8:.]E"-AKKW4.CD-H/$!O^VEO;H$ -9 T;V4.@( UF)
XMAI;VBU;PBT;NL07HW&,E!P"+5O8#T(E6]HO"4.B>ZUF)1OR)5O[I_@'_=OK_
XM=OCHPNM960O = /I 0+H^E.-AKKW4.C.&5D+P'4(QT;R 0#I! *-AKKW4.B+
XM.5F+^ O =0/IP@&X+ %0C89B]5"-AKKW4.B*-8/$!HE&](%^]"P!<Q6X+ %0
XM,\!0C89B]5#H2U6#Q ;ICP&+AFCUBY9F]3N&E/9U!CN6DO9T%;@L 5 SP%"-
XMAF+U4.@B58/$!NEF ?^V=/7_MG+UZ"4"65FC[DF)%O!)_[90]O^V3O;H$0)9
XM68'Z@F-T ^DZ 3UC4W0#Z3(!C892]HOPZ1D!B@2T (E&[+D. +NFB"Z+!SM&
XM['0'0T/B].GR "[_9QQ&Z?4 _W0$_W0"Z,@!65FC\DF)%O1)BD0!M ! 0 /P
XMZ=< _W0$_W0"Z*H!65E24#/ 4.C\ZH/$!HI$ ;0 0$ #\.FU #/_ZRF+WT-#
XM_W "_S#H@0%965)0N)1B4+@* %"XQF)0Z.8+@\0*B\<%! "+^(I$ ;0 .\=W
XMSHI$ ;0 0$ #\.MT,__K*8O?0T/_< +_,.A 5E94E"X<(!0N H 4+B8@%#H
XMI0N#Q J+QP4$ (OXBD0!M [QW?.BD0!M ! 0 /PZS.X,@!0_S;D28O&0$!0
XMZ -4@\0&BQ[D2<9',0"*1 &T $! _#K#>L+BD0!M ! 0 /PZP" //]T"XV&
XMC?8[QG(#Z=?^ZQ7_=O[_=OSHQ.E960O =0/I\/WIG_V-AKKW4.A1.%FA[DD+
XM!O!)=06X 0#K C/ ZPZ-AKKW4.@V.%FX___K %]>B^5=PP 0 " , ! %
XM 8 !P ( D "@ + P _P!7AUN';8=YAX^'CX>;A]&'W(<2B!*($H@=B$.(
XM +HP>WH@NC!;@B"Z))N*("\"X\0Z.T([8O-1&G/QU'5%3Z#\%@\0$
XMCL*+^)TNCA[>B"Z.%N"(+HLFXHC+'E914^@2>8/$".OC58OL5E>+1@:+5@2&
XMQ(;67UZ+Y5W#58OL5E>+1@2&Q%]>B^5=PU6+[.@H$%W#58OLZ#\0N%&)4.B,
XM.5FX$ !0Z*[[63/ 4.C9#5D+P'00QP:N1 $ 'KC61E#HG.=968,^KD0 ="#H
XMF_L+P'09'KCP1E#HA.=968,^U$8 =0BX P!0Z!@[65W#58OL@^P4QT;L !2+
XM1@2)1NZ+1@:)1O"-1NQ0_S9L@.B%3UE9]T;^ 0!T*!ZX'D=0Z#[G65F+1O*Q
XM"-/H4.@4YUD>N"='4.@HYUE9N $ 4.C#.EF+Y5W#58OL@^PN5E?'1OH ,<&
XM;(!@ .M H6R T>#1X,0>!T<#V":+1P(FBQ>)5OR)1OZX"0!0'K@_1U"+1OP%
XM P#_=OY0Z%KG@\0*"\!U NL/H6R 0*-L@($^;(" ':X@3YL@( =A >N$A'
XM4.BMYEE9N $ Z38"QT;F_P&-1N90_S9L@.C+3EE9]T;X 0!U ^F6 #/_Z8<
XM"_]T!;@& .L#N $ HWI"O@$ ZSZX (+!GI"B4;FB7;HQT;L #'1NH" (Q>
XM],=&\ -'C$[VQT;RY(B-1N90_S9L@.AT3EE9]T;X 0!U NL'1H'^@ !\O('^
XM@ !U$!ZX7T=0Z![F65FX 0#IIP&+1N:)1NC'1N8 XU&YE#_-FR Z#9.65E'
XM@_\"?0/I<?_K,8MV[(M&ZK$(T^BC>D(] 0!T!ST& '0(ZPC'!@%'#@#K$!ZX
XM@D=0Z,KE65FX 0#I4P&X (+!GI"B4;FQT;H___'1NP ( ^ $< =!#'1NH
XM (Q6](U&^HE&\.L-QT;J @",7O3'1O #1XQ.]L=&\N2(N!0 4(U&YE"-1M)0
XMZ!Y0@\0&QT;<!4>,7N"-1N90_S9L@.B335E9]T;X 0!T)AZXKT=0Z$SE65F+
XM1NRQ"-/H4.@BY5D>N+A'4.@VY5E9N $ Z;\ BT;FHVJ QT;F :A:H")1NB,
XM7O;'1O)D@,=&Z@8 C4;F4/\V;(#H.TU96?=&^ $ = \>N-I'4.CTY%E9N $
XMZWZ /@!' '05QP9N@ N 8 4/\V:H#H9/U96>M>@SYZ0@9T5XU&TE#_-FR
XMZ/5,65GW1N0! '0]QT;F .A:H")1NB-1N90_S9L@.C63%E9'KC[1U#HEN19
XM68M&V+$(T^A0Z&SD61ZX!$A0Z(#D65FX 0#K"HM&TJ-N@#/ ZP!?7HOE7<-5
XMB^R#[!16,_:#/GI"!G0S@SYN@ !T+,=&[ #H6Z B4;NC4;L4/\V;(#H<DQ9
XM6?=&_@$ = T>N"=(4.@KY%E9O@$ @#X 1P!T#;@" %#_-FJ Z*/\65G'1NP
XM Z%J@(E&[HU&[%#_-FR Z#),65GW1OX! '0-'KA/2%#HZ^-96;X! (O&ZP!>
XMB^5=PU6+[(/L%%:^!0#K+L=&[ $C%[ZBT8$B4;VBT8&B4;PC4;L4/\V;(#H
XMZ$M96?=&_@$ = +K!#/ ZPR+QDX+P'7+N $ ZP!>B^5=PU6+[+B<'5 SP%"X
XMR&)0Z'5.@\0&7<-5B^R+7@3&1_ 7<-5B^Q,3%97N/__B4;^B_@S]NL]B\:Z
XM[ 7WZHO8@+_(8@%T NLFB\:Z[ 7WZHL6 4>#P@8#PHO8BX?(8HO(B\$[1OYW
XM!XO!B4;^B_Z+QD"+\(/^!7*^@___=00SP.L*B\>Z[ 7WZ@7*8NL 7UZ+Y5W#
XM58OLZ.#["\!T$AZX=DA0Z.[B65FX 0!0Z(DV6;AD@.L 7<-5B^Q65XM^!H'_
XMZ@5W! O_=1&#!A-' 8,6%4< ,](SP.F, (L>&T>*![0 "\!U$(L>&T?&!P*A
XM&T= 0(S:ZW"@'4>8B_"@'4?^R*(=1PK = B!!AM'[ 7K"\<&&T?(8L8&'4<%
XMBQX;1XH'M +P'40BQX;1\8' J$;1T! C-KK+Z =1Y@[QG4"ZP+KN8,&%T<!
XM@Q891P"#!@M' 8,6#4< 3X/1X,6$4< ,](SP.L 7UY=PU6+[,1>"";&1_X!
XM7<-5B^Q6BW8$@WP"!G4,@[PQ" QW!;@" .L/@WP"$74%N $ ZP0SP.L 7EW#
XM58OL5HMV!+@* %!6BU8(BT8&L1CHW%I0Z-)+@\0&N)A(4%;H%$]96;@* % S
XMP%!6Z$!/65E0BT8()?\ 4.BM2X/$!KB:2%!6Z.].65FX"@!0,\!05N@;3UE9
XM4(M6"(M&!K$(Z(U:)?\ 4.B 2X/$!KB<2%!6Z,).65FX"@!0,\!05NCN3EE9
XM4(M&!B7_ %#H6TN#Q :+QNL 7EW#58OL@>P 5:+=@2P6U#H_^!9'O]T&/]T
XM%HV& /]0Z$/_@\0&4.@NX5E9L#I0Z.#@6;@* %"-A@#_4/]T&N@12X/$!A:-
XMA@#_4.@*X5E9L%U0Z+S@65Z+Y5W#58OL_W8$Z/+M60O = O_=@3H=^U9ZPCK
XM!C/2,\#K %W#58OL5HMV!/]T!.C83ED]4 !S!8M$!.L 7EW#58OL5HMV!%;H
XMF/Y9/0$ = <] @!T!^L1N.A(ZQ&+G#$(T>.+AX9(ZP6X\TCK %Y=PU6+[(/L
XM$%97BWX$BW8(N X 4#/ 4(U&\%#H9TN#Q :+11B+51:)5O2)1O:+11J)1O*+
XM118+11AT#X-]&@!T"5?H+_Y9"\!U#0OV= 3'! N/__ZS@+]G0$BP3K [@.
XM (E&_H-^_@Y^!<=&_@X _W;^'O]V!A:-1O!0Z'/@@\0*"_9T!8M&_HD$,\#K
XM %]>B^5=PU6+[(/L$%97BWX$BW8(N X 4#/ 4(U&\%#HU$J#Q :+11Z+51R)
XM5O2)1O:+12")1O*+118+11AT#X-]&@!T"5?HG/U9"\!U#0OV= 3'! N/__
XMZS@+]G0$BP3K [@. (E&_H-^_@Y^!<=&_@X _W;^'O]V!A:-1O!0Z.#?@\0*
XM"_9T!8M&_HD$,\#K %]>B^5=PU6+[(L6\$FA[DGK %W#58OLBT8&BU8$4(D6
XM[DF+PEJ)%O!)ZP!=PU6+[%:+=@2#?@8 ="#_-L!BZ#A-63M&!G8%Q@0 ZPK_
XM-L!B5N@!35E9B\;K&8,^P&( = Z+'L!B@#\ = 6AP&+K C/ ZP!>7<-5B^R+
XM1@2CP&+K %W#58OL5HMV!(-^!@!T(/\VY$GHXDQ9.T8&=@7&! #K"O\VY$E6
XMZ*M,65F+QNL9@S[D20!T#HL>Y$F /P!T!:'D2>L",\#K %Y=PU6+[(M&!*/D
XM2>L 7<-5B^S_=@3HJO99ZP!=PU6+[/]V!.B<]EGK %W#58OL_W8&_W8$Z';V
XM65GK %W#58OL_W8&_W8$Z&3V65GK %W#58OL@^P$5E>+=@2P (A&_+0 B_B)
XM1O[K6X!^_3IU NM3@'[]+'4"ZUV*1OT$T(A&_3P)=@B*1OT$^8A&_8M&_K$$
XMT^"*5OVV /"B4;^@'[\ '0<BUX&BD;^B %'@_\%=@+K(K B$;\M ")1O[K
XM!,9&_ &+WD:*!YA0Z*Y 68A&_0K =9. /"QU 4:+QNL 7UZ+Y5W#58OL@^P&
XM5HU&^E#_=@3H6?]968OP"\!T(K@& %"XAF)0C4;Z4.@:2(/$!@O =0Q6Z)'\
XM6:/N28D6\$E>B^5=PU6+[%:+=@2+1@H+1@QT'XL$.T8&?1B+!/\$T>#1X(M>
XM" /8BT8,BU8*B1>)1P)>7<-5B^R#[ 165XM^!(MV!E?HC4M9N!))4%?HZTI9
XM60O =22*!)A0Z/T_63U" '4(QP:N1 $ ZPQ6Z*7O6:/N28D6\$GI*P*X&$E0
XM5^BY2EE9"\!U#U;HB.]9H_))B1;T2>D. K@@25!7Z)Q*65D+P'40,\ STE!2
XM5N@YWH/$!NGP ;@H25!7Z'Y*65D+P'4<5NA-[UE24+B48E"X"@!0N,9B4.@K
XM_X/$"NG& ;@S25!7Z%1*65D+P'4<5N@C[UE24+AP@%"X"@!0N)B 4.@!_X/$
XM"NF< ;@Z25!7Z"I*65D+P'405KB:@%#H2TI96:/ 8NE^ ;A&25!7Z Q*65D+
XMP'42N#( 4%;_-N1)Z&=*@\0&Z5X!N$])4%?H[$E960O =0M6Z(Y 6:,(2>E%
XM ;A925!7Z--)65D+P'4(5NA2_EGI+P&X7TE05^B]25E9"\!U"U;H7T!9H^9)
XMZ18!N&-)4%?HI$E960O =0]6Z'/N6:.H1(D6JD3I^0"X:4E05^B'25E9"\!U
XM"U;H*4!9HZQ$Z> N'%)4%?H;DE960O =0M6Z!! 6:,^1.G' +AZ25!7Z%5)
XM65D+P'4+5NCW/UFC"DGIK@"X@TE05^@\25E9"\!U"U;HWC]9HPQ)Z94 N(Y)
XM4%?H(TE960O =1,>5NAAVUE9'KB425#H5]M96>MTN)=)4%?H DE960O =5>+
XMQHE&_HO8@#\_=0/_1OZX 4!0_W;^Z/)'65F)1OP]__]T$/]V_.B>0%G_=O[H
XM/P%9ZR* /#]T'1ZXGTE0Z 7;65D>_W;^Z/S:65D>N+))4.CRVEE9ZP^#/@Y)
XM '0(5E?_%@Y)65E?7HOE7<-5B^Q6BW8$ZP"+7@;_1@:*!XO>1H@'"L!U[XO&
XM2.L 7EW#58OL@^Q45E?_=@;_=@3H;$=968E&_#W__W0&BT;\Z;H _S802>A'
XM0EF)1OZ+7OZ /P!T.O]V_HU&K%#HH/]968OP@'S_7'0$Q@1<1O]V!%;HB_]9
XM6?]V!HU&K%#H'D=968E&_#W__W0%BT;\ZVVXP4E0Z/I!68E&_H-^_@!U!#/
XMZUB+?O[K28U&K(OPZP:*!8@$1T: /3MT!8 ] '7P@'S_7'0$Q@1<1O]V!%;H
XM+O]96?]V!HU&K%#HP49968E&_#W__W0%BT;\ZQ" /0!T 4> /0!ULKC__^L
XM7UZ+Y5W#58OL@>RF %97@WX$ '4&H1!)B48$N % 4/]V!.@ _UE9B4;\/?__
XM=1H>_S802>BEV5E9'KC&25#HF]E96;C__^G7 #/ B_"(1O^8B_B(AEK_B$:J
XMZ9\ BD;^F(E&^KD( +MNF"Z+!SM&^G0&0T/B].M6+O]G$('V 0#K>@OV= +K
XM1NMR"_9T NL^"_]U [\! .MC"_9T NLOOP( ZUB ?JH =!6 OEK_ '0.C89:
XM_U"-1JI0Z-#[65DSP(OXB_"(AEK_B$:JZRZ+QPO = <] 0!T$>L?C4;^4(U&
XMJE#H/D996>L0C4;^4(V&6O]0Z"Y&65GK .L N $ 4(U&_E#_=OSHY$6#Q 8]
XM 0!U ^E(__]V_.A#/EDSP.L 7UZ+Y5W#"0 * T ( B ", .P ] ,J7[)?L
XME\J7Q)?AE^&7TI=5B^Q6BW8$"_9T"(M&!HE$!NL&BT8&H]Y)7EW#58OL5HMV
XM!(M$""7\_PM&!HE$"%Y=PU6+[%:+=@2#?@8 = __=@;H)=E9B40*B50,ZPK'
XM1 H ,=$# 7EW#58OL5HMV!(M$"@M$#'4$,\#K#?]T#/]T"N@JV5E9ZP!>
XM7<-5B^S$'NI))HM/ B:+'S/2N"T Z"54ZP!=PU6+[(-^! !T"?]V!.C#V%GK
XM!C/2,\#K %W#58OLBT8$"T8&= W_=@;_=@3HV]A96>L$,\#K %W#58OL5HLV
XM $KK##MV!'4%N $ ZPJ+- OV=? SP.L 7EW#58OLZPC_-@!*Z%($68,^ $H
XM=?'H@N#'!MQ) !=PU6+[(,^W$D =6#'!MQ) 0#H9]_'!II< #'!L9B #'
XM!IB "+'N1)Q@< H>Y)"P;P2742N 0 4+CN25"XB&)0Z$Y"@\0&,\!0Z-K?
XM6<0>ZDDFBU<")HL'L0?H*5 E_P$% 2C_$FC_DE=PU6+[(M&!O?8.T8$<Q(>
XMN'I*4.@%UUE9N , 4.B@*EE=PU6+[%97BW8$BWX&5NC( EFX,0A05NC'_UE9
XMN#$(4#/ 4%;HR$&#Q :+Q@4L (E$*L=$* (QT0"$0 +_W4(_P;^28L^_DF)
XM?""A\$F+%NY)B50<B40>@WX*_W4&@WX(_W0(BT8("T8*=1:X!@!0N/\ 4(O&
XM!1 4.AR08/$!NL:B\8%$ !0_W8*_W8(Z"_<@\0&"\!U!#/ ZSB+1@J+5@B)
XM5!:)1!B+1@R)1!J+1@Z)1 ZAWDF)1 ;'A"T(5.''A"\(13ZA DJ)!(DV DJX
XM 0#K %]>7<-5B^Q65XMV!(M^!KAN$%!6Z/;^65E6Z/0$6;AN$% SP%!6Z/)
XM@\0&B\8%+ ")1"K'1"@ ",=$ @8 H>9)B81G",>$,0@! +@? %#HJ=99B80[
XM"(F4/0C&A$D( <:$2@@ QX1+" 0 "_]U"/\&_$F+/OQ)H?!)BQ;N28E4'(E$
XM'HE\((O&!1 4/]V"O]V".A6VX/$!@O =04SP.F& (M&"HM6"(E4%HE$&(M&
XM#(E$&K@! %#H0-994E#H;NU9624 ('B__^)A#<(B90Y",>$10@ ,>$00@"
XM ,:$/P@!BT8.B40.H=Y)B40&QX0M"*,EQX0O"(]3H0!*B02)-@!*,\"Z$@")
XME%L(B81="(F47PB)A&$(N!0!4%;H_!A96;@! .L 7UY=PU6+[%:+=@2X;A!0
XM5NC2_5E95NC0 UFX;A!0,\!05NC./X/$!HO&!2P B40JQT0H C'1 (& *'F
XM28F$9PC&A$D( <:$2@@ QX1+""0 QX0Q" @WX0 '4.QX0[" QX0]"
XMZP__=A#H8M59B80["(F4/0B+1@:)1""+1@R)1!J+1@J+5@B)5!:)1!@SP%!6
XMZ&[L65F)A#<(B90Y",>$10@ ,>$00@ ,:$/P@ BT8.B40.H=Y)B40&QX0M
XM"*,EQX0O"(]3H0!*B02)-@!*N $ ZP!>7<-5B^Q65[\"2HLU.W8$=0:+!(D%
XMZQ4+]G4"ZP^#? 0 =07'1 2=2HO^Z]Y?7EW#58OL5HMV!(-\ @9T ^F: (.\
XM,0@#= Z#O#$(!'0'@[PQ" )U7H.\10@ =!^+A$$(#1@ B81!"(.\,0@$<PO'
XMA#$(! !6Z-0 6>LQQX1!"!$ @WP$ '4%QT0$KDK'A#$(!0"X! !0Z%_468F$
XM.PB)E#T(N&<!4%;H<!=96<:$/P@!ZR>#O#$(!W4@QX0Q" D BX1!" T! (F$
XM00BX;@%05NA'%UE9QH0_" %>7<-5B^Q6BW8$@WP$ '4%QT0$R4J#O#$( '0<
XM@[PQ" QT%<>$00@4 ,:$/P@!N'P!4%;H"A=96<:$/P@ QX1%" QT0" #'
XMA#$(# !6Z.(!65Y=PU6+[%:+=@2#? (&=0=6Z)S_6>L%5NBZ_EE>7<-5B^R#
XM[ 16BW8$@WP"!G0#Z8H N $ 4.AITUF)1OR)5OZ+A&4(BY1C"#M&_G4I.U;\
XM=22#O%,( G,=@+Q " !U%L:$50@ N)D!4%;H@!996<:$0 @!ZT: O#\( '4.
XM@[Q%" !_!X"\50@!=1:+A&4(BY1C"#M&_G<)<@4[5OQS NL;BX13"+$$T^A
XM4.CTTEF)A&,(B91E",:$50@!7HOE7<-5B^Q6_S8(2O\V!DKH,M-960O =0/I
XM!0&X 0!0Z,+26:,&2HD6"$J+-@!*Z>@ @[Q%" !_#H"\/P@ =0> O%4( 75:
XM_[1E"/^T8PCH\])960O =$F#O$,( '4-@+Q5" )U!L>$0P@! ("\50@ =23&
XMA%4( L>$1P@ (J$20BT $"Z P#WZM'XT?B(A$D(QH1*" "XRP%05NB1%5E9
XM@SX*20!T)8N$:0@+A&L(=!O_M&L(_[1I".B(TEE9"\!T"L=$!--*5N@:(5F+
XMA#L("X0]"'1!_[0]"/^T.PCH8])960O =#"#O#$("G4/QX0Q" P 5N@K %GK
XM)>L:@[PQ" -T$X.\,0@$= S'1 3V2E;HWOU9ZPF+- OV= /I$?]>7<-5B^Q6
XM5XMV!(-\)@!T!X.\,0@$=@7'1 ( ,>$,0@, +\ 2HL%B] [UG4(B]J+!XD%
XMZP@+TG4"ZP2+^NOF7UY=PU6+[$Q,5E>+?@0+_W0=@WT"!G47@[TQ" QU$(-]
XM)@!U"E?HFO]9QT4" "A#$H+!@Y*=0^X P!0Z)SX6:,,2HD6#DKIB@#$'NI)
XM)HM' B:+%XD6$$JC$DJ+1OX]" !T!ST(!G19ZUZ*!"4/ -'@T>!0'E;HA-"#
XMQ 8]__]U+8I$";0 /0$ =!H]!@!T!ST1 '0)ZQ56Z' '6>L.5NCT!%GK!U;H
XM:MI9ZP#K$8,^!$H = H>N A+4.@;T%E9ZP=6Z,346>L "_9T!5;HJ=A9ZP"-
XM1OY0Z+;868OP"\!T ^EE_^B[_0O_= 6+10+K C/ ZP!?7HOE7<-5B^R+1@2C
XM!$I=PU6+[%:+=@2#O#$( W0.@[PQ" 1T!X.\,0@'=06X 0#K C/ ZP!>7<-5
XMB^R#[!)65[@( %"+1@0%$ !0Z++765F)1OZ+1OX%' ")1OR+=OZ+1OX%% "+
XM^(M&" 4< %#HC^=9B40"BUX$_W<@Z(+G68D%BUX$_W<:Z';G68E% L=%!@
XMBT8(!0@ 4.ACYUF)103_=@C_=OS_=@;H0CJ#Q : ) ^ #$" )/" # 7&1 $
XM_P;Z2:'Z25#H->=9B40$QT0& #&1 C^QD0)$<=$"@ BUX$_W<>_W<<Z/[F
XM65F)1 R)5 Z+7@3_=QC_=Q;HZN9968E$$(E4$K@4 % >5NCVSH/$!O?0B40*
XMBUX$]T<( @!T!\=%!@ ZU.+1 Z+5 R)5NZ)1O"+1!*+5!")5O*)1O3&1O8
XMQD;W$8M%!(E&^/]V^.BIYEE0'HM&_@44 %#HI,Z#Q :)1OJX#@!0%HU&[E#H
XMDLZ#Q ;WT(E%!H,^X$D = \SP%!75O]V!/\6X$F#Q C_= +H9N994.BYUEF+
XM1@CK %]>B^5=PU6+[%97BW8$@WX( 'T%QT8(_W^+1":+^ O ?C [?@A^ XM^
XM" O_?B17_W8&_W0JZ!(Y@\0&*7PF=!+_=";_="J+1"H#QU#H^SB#Q :+Q^L
XM7UY=PU6+[$Q,5E>+7@2*!R4/ -'@T>")1OZ+1@0#1OZ+^(LV DKK.8-\&@!T
XM,?]U NC1Y5D[1!IU)?\UZ,;E63M$('4:BUX$_W<2_W<0Z)_E65D[5!AU!SM$
XM%G4"ZP:+- OV=<,+]G4@BS8"2NL6@WP: '4._W4"Z(KE63M$('4"ZP:+- OV
XM=>8+]G0*QT0F #'1 ( %]>B^5=PU6+[$Q,5E>+7@2*!R4/ -'@T>")1OZ+
XM1@0#1OZ+^(LV $KIJ0#_->@^Y5D[1"!T ^F9 /]U N@OY5D[1!IT ^F* (M>
XM!/]W$O]W$.@%Y5E9.U08=7<[1!9U<HM&!CT! '0,/0( ="T]!0!T3.M>@WX(
XM '0%BT8(ZP.X)$N)1 0SP(F$10B)1";&A#\( %;H<_E9ZSC&A$D( <:$2@@!
XMT:13"-&D4PC1I$L(T:1+"-&D30C1I$T(ZQ2+Q@40 %#_=@S_=@KH2=*#Q ;K
XM (LT"_9T ^E0_U]>B^5=PU6+[%97BW8$@WX( 'T%QT8(_W^+1":+^ O ?C<[
XM?@A^ XM^" O_?BE7_W8&_W0JZ$HW@\0&*7PF?A+_=";_="J+1"H#QU#H,S>#
XMQ 96Z$CY6>L,@[PQ" =U!5;H'OA9B\?K %]>7<-5B^Q,3%97BW8$BWX("_]]
XM [__?X.\,0@#= (S_XM$*"N$10B)1OX[QWT#BW[^"_]^95>+Q@.$10@%;0A0
XM_W8&Z-(V@\0& ;Q%",:$/P@!]T0( $!T"XM$""7_OXE$".LV]T0(! !T#+@?
XM U!6Z(\/65GK(SF\10AT#(N$9PC1Z#N$10AS#+@D U!6Z'$/65GK!5;HF_A9
XMB\?K %]>B^5=PU6+[%:+=@2#O$4( 'X5BX1!" T( (F$00BX-0-05N@]#UE9
XM7EW#58OL@^P65E>+7@3_=Q+_=Q#H-N-968E&^(E6^HM&^HM6^/?2]]!24*'T
XM28L6\DGWTO?0"]!U!;@! .L",\"96UDCR"/:"\MU*8M&^HM6^"L6[DD;!O!)
XM4E"A#$F96SO:6G(2=P0[T'8,H>Y)"P;P270#Z?H!BUX$B@<E#P#1X-'@B4;^
XMBT8$ T;^B_C_=03HS>)9B4;^BS8"2NMR@;PO"$4^=0B!O"T(5.%T$8,^!$H
XM= H>N#M+4.B'REE9@WP: '1)_W4"Z);B63M$('4]_S7HB^)9.T0:=3*+7@3_
XM=Q+_=Q#H9.)963M4'G4?.T0<=1J+7@3_=P[_=PSH3.)963M4&'4'.T06=0+K
XM!HLT"_9UBH,^XDD = \SP%!7_W8$5O\6XDF#Q @+]G56BS8"2NM,BT06"T08
XM=4+_=0+H'^)9.T0@=3:X!@!0B\8%$ !0BT8$!?C_4.CT-(/$!HM>!/]W#O]W
XM#.CAX5E9B406B508_S7HZ>%9B40:ZP:+- OV=; +]G4FBS8"2NL<@WP8_W44
XM@WP6_W4._W4"Z,'A63M$('4"ZP:+- OV=> +]G44@SX$2@!T"AZX4$M0Z(/)
XM65GIJP"#?08 =%"+7@2+1PZ+5PR)5NJ)1NR+7@2+1Q*+5Q")5NZ)1O#&1O(
XMQD;S$8M%!(E&]/]V_AY7Z&G)@\0&B4;VN X 4!:-1NI0Z%?)@\0&/?__= +K
XM58M&_BT( (E&_@O =DB)?OR#? X =!A7C4;J4/]V_HM&_ 4( %!6_U0.@\0*
XMZR>+1"@[1OYS!HM$*(E&_O]V_O]T*HM&_ 4( %#HZ#.#Q :+1OZ)1"9?7HOE
XM7<-5B^R#["!65XM>!/]W$O]W$.C!X%E9*P;N21L6\$E0H0Q)4IE;.]I:<@EW
XM!#O0=@/IJ0J+7@2*!R4/ -'@T>")1OZ+1@0#1OZ+^(M>!/]W NB7X%DK1OZ)
XM1O[_=0SHBN!9B4;Z@SX$2@%W ^F. ,0>U$DF_H>@ ,0>V$DF_H>@ /=&^@(
XM= 2P4^L"L"#$'MA))HB'H@#$'M1))HB'H@#W1OH0 '0$L$'K K @Q![822:(
XMAZ0 Q![422:(AZ0 ]T;Z 0!T!+!&ZP*P(,0>V$DFB(>F ,0>U$DFB(>F /=&
XM^@0 = 2P4NL"L"#$'MA))HB'J #$'M1))HB'J "+-@!*ZW*!O"\(CU-U"(&\
XM+0BC)701@SX$2@!T"AZX7DM0Z*S'65F#?!H =$G_=0+HN]]9.T0@=3W_->BP
XMWUD[1!IU,HM>!/]W$O]W$.B)WUE9.U0>=1\[1!QU&HM>!/]W#O]W#.AQWUE9
XM.U08=0<[1!9U NL&BS0+]G6*"_9U._=&^@( =#2+-@!*ZRJ#?!H =2+_=0+H
XM5=]9.T0@=1:+7@3_=Q+_=Q#H+M]968E$'(E4'NL&BS0+]G72@S[B20!T#S/
XM4%?_=@16_Q;B28/$" OV=1/W1OH$ '4)5_]V!.C^#EE9Z?@(BUX$BT<.BU<,
XMB5;@B4;BBUX$BT<2BU<0B5;DB4;FQD;H ,9&Z0;_=O[HVMY9B4;J_W;^'E?H
XMUL:#Q :)1NRX#@!0%HU&X%#HQ,:#Q 8]__]T-H,^!$H = H>N'-+4.B(QEE9
XM_W;^'E?HH\:#Q :)1NRX#@!0%HU&X%#HD<:#Q 96Z(WS6>EP"/=&^@0 ="V#
XM/@1* '0*'KB'2U#H2\9963/ B81%"(E$)L=$!*!+QX0Q" P 5N@;]5GI/ B#
XM/@I) '00_S8*2>CSQEF)A&D(B91K"("\50@"=0C&A%4( .G; (N$3P@+A%$(
XM=0/IL@ SP%#HG\99*X1/"!N440B)1O:)5O@+TGT#Z8, =00+P')]BX1+"-'H
XMT>C1Z(M6^(M>]BO8@]H B5[VB5;XBX1+" -&]HF$2PB#?O@ ?QM\!H-^]@!S
XM$XM&^(M6]O?8]]H= ")5O:)1OB+A$T(T>C1Z"E&]H->^ "+A$T( T;VB81-
XM"(&\2PB@!78&QX1+"* %@;Q-"&@!=@;'A$T(: &+A$L(T>C1Z .$30A T>B)
XMA%,(QH15" "*A$H(_H1*"#J$20AR"?Z$20C&A$H( (N$4PA 0%#HS<59B4;N
XMB5;PBX1E"(N48P@[1O!W%7(%.U;N<PZ+1O"+5NZ)E&,(B81E"(N<,0B#^PIV
XM ^GP!M'C+O^G.;.X!@!0B\8%$ !0BT8$!?C_4.C>+X/$!O=&^@( =0/IAP"+
XM7@2*1P$ZA%8(=@R+7@2*1P&(A%8(ZPR+7@2*1P$ZA%8(<P#_=0;_=03HH-Q9
XM604! (/2 (F$,PB)E#4(_S7HH-Q9B40:BUX$_W<._W<,Z'O<65F)1!:)5!C'
XMA$$($@#'A#$( @#&A#\( ;@Q!%!6Z$@(65FX#0!0Z!W%68F$.PB)E#T(ZPE7
XM_W8$Z$<,65FX 0#I/@;I+P;W1OH" '4#Z>< BUX$BD<!.H16"'8,BUX$BD<!
XMB(16".L,BUX$BD<!.H16"', QX1!"! N T 4.C%Q%F)A#L(B90]"/=&^A
XM=0/IBP"+A#D(BY0W"(/" 14 %!2Z-/;65D[50IU2CM%"'5%QX0Q" , @X0W
XM" &#E#D( /]U!O]U!.BNVUE9!0$ @]( B80S"(F4-0C_=OY75NBY!8/$!L:$
END_OF_FILE
if test 61973 -ne `wc -c <'netramet/pc/NeTraMet.exe.UU.A'`; then
echo shar: \"'netramet/pc/NeTraMet.exe.UU.A'\" unpacked with wrong size!
elif test -f 'netramet/pc/NeTraMet.exe.UU.B'; then
echo shar: Combining \"'netramet/pc/NeTraMet.exe.UU'\" \(113155 characters\)
cat 'netramet/pc/NeTraMet.exe.UU.A' 'netramet/pc/NeTraMet.exe.UU.B' > 'netramet/pc/NeTraMet.exe.UU'
if test 113155 -ne `wc -c <'netramet/pc/NeTraMet.exe.UU'`; then
echo shar: \"'netramet/pc/NeTraMet.exe.UU'\" combined with wrong size!
else
rm netramet/pc/NeTraMet.exe.UU.A netramet/pc/NeTraMet.exe.UU.B
echo shar: Uudecoding \"'netramet/pc/NeTraMet.exe'\" \(82096 characters\)
cat netramet/pc/NeTraMet.exe.UU | uudecode
if test 82096 -ne `wc -c <'netramet/pc/NeTraMet.exe'`; then
echo shar: \"'netramet/pc/NeTraMet.exe'\" uudecoded with wrong size!
else
rm netramet/pc/NeTraMet.exe.UU
fi
# end of 'netramet/pc/NeTraMet.exe.UU'
fi
fi
# end of 'netramet/pc/NeTraMet.exe.UU.A'
fi
if test -f 'netramet/src/apps/snmpnetstat/main.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/main.h'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpnetstat/main.h'\" \(151 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/main.h' <<'END_OF_FILE'
X
X#ifndef MAXHOSTNAMELEN
X#define MAXHOSTNAMELEN 64
X#endif
X
X
Xextern char *community;
Xextern struct sockaddr_in address;
Xextern int reqid;
Xextern int sd;
END_OF_FILE
if test 151 -ne `wc -c <'netramet/src/apps/snmpnetstat/main.h'`; then
echo shar: \"'netramet/src/apps/snmpnetstat/main.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/main.h'
fi
echo shar: End of archive 2 \(of 25\).
cp /dev/null ark2isdone

J Nevil Brownlee

unread,
Nov 6, 1993, 12:37:37 PM11/6/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 92
Archive-name: netramet/part04
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/pc/NTM.Zip.UU.C netramet/src/apps/snmpwalk_asy.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:05 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 4 (of 25)."'
if test -f 'netramet/pc/NTM.Zip.UU.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NTM.Zip.UU.C'\"
else
echo shar: Extracting \"'netramet/pc/NTM.Zip.UU.C'\" \(55800 characters\)
sed "s/^X//" >'netramet/pc/NTM.Zip.UU.C' <<'END_OF_FILE'
XM"59@]UN0;M3NEGKF[C= QU:8IQJ.4NW6;5DRR"QXQ:]UJU]A_M<Q=SM*D&W?
XMA/DIK'O"%LUUFB"7E[HM'#K7_0%9@S0#5;-]>V?M)6^V8<_.<9\)@CY,O#!C
XM@JC?9.)WF.^Q9/VV+AWP^)@PP&LX]SLOR##@:LNUOL;4(.O"Z=*'O+?U,3S"
XMMB,5GCXFB0'F5MEVCKK>VB6N[Q&S%LG5+5>Y5,[J-DA7^3%].'+UF31V&^LI
XMDL5X_%"Z<MFV%,(ME"K25Y<K>9,9[R#[[B"'$?/@,BE%=>I:T[GS@K1SC>+*
XMTR>P=!1:0DY!-0L>7<3&W'&=J!_E:!--5O@+S(GB;$^RKLJUG"474P&VI^"/
XMH[LFM^6ZJ5=AJNJ\S])$-6C:.\$U!T%GVXHT\?]=@+'\\#'JASDHGL^Y:)B5
XM;?6=ZT6=F><PS'L?QE2(*PQW=0[%95@67L(9CV-RC!87/\0DF$E02P,$"@
XM 8 K*YE&" 3_\ZF 0 <P, P !34D,O4T5,14-4+D,- @$2(Q05-C=H
XMB9K;/ 4&$A-$Q?:6]T>F=3N6;5VR94'R'/L6;EZY:<^BI>L2K<^&"JZ3=\/2
XMI3L6#G4+WB]5#&^0*D'.?3MV[=>Y<\NR+3N6+LB6(.66I5M7KMNY(-^Z>=]O
XMS73OLG;+R@W+%D2TFMYTP[JE@[V8-=FT8XZ5\3[CWT$$1YSZ=.C2HE.I!A7*
XM-.E4I$6)0!N\]4\WWI[&>(-$&T98BRU;!GF7>7:Q;-/.15N6##(PB09!UE*+
XM!LWR/)#YBZ**69/AUV',?EBR>4&:?2LGN3$-\E"F3Z<<?1##%%L!5A%-7+G?
XMSOFG7T@Y@E>3L2BVK.GFA:/D5CF715[+7T'JM'3P/IWHG8)][\$_:T-2@PQ3
XM=&GO,F>Q: WR1S3KGFF(U"CLXWOVT I+-,NQ>)NI][DM?8PQY9B5;,1^"BE*
XM%/=A=WS#T9=IX;2MR!T&?K@CB_I(54/+(\9_[\D:''+XJD2A?H4J]2G5)^S@
XMCB'O, 8./HKYOTYA'O4=)%\^[XG@]AY$5=5[0!-R7J4")TQPPQM$ZG4?XPH]
XMAZ'=^PQF E!+ P0* !@!8:JH66ZZM.D<! N @ #@ %-20R]33T-+
XM7T1"52Y##0(!$B,4%38W:(F:VSP%!A(31,7VEO='IG4[EFU=LF5!\AS[%FY>
XMN6G/HJ7K$JW/A@JNDW?#TJ4[%@YU"]YSWXY=^Z5ZBZU[EFS=MG!1@@C?<+].
XMF?ZR=$&JK LR!?C>([Q!@@A>\7>=IKLC?U1WD#U!HM".35EG.PUG7[NE:Q:E
XM2+=E\=)-6)(F7JYNN<H5R0)<M_01/5/N*(](-R_<,L\#/7(:;'4]UL.6E2OW
XMK9ST/0<]$?U?V\X]"_('<ZQ.D")1.GWJM&A*$>R@IVU#ONV&<7+)ZY(XV>(%
XM*4?OKBO7[1QIR[KAIFG>9+(I^IW V>M0;SGP+5V/1;/F4IYOZ])%D1V;\J=(
XMD3I%K&NJ(-1!>]*\-9DX=1ANY:1& :Y3T$U8=[9EW3 G0: -?4Q_<.GTQS!G
XM_<&?<[WIE/4Z^(GH:GWVJ7P#4$L#! H & ,@6NQ9!02QF/@( 'D# .
XM 4U)#+U-/0TM?24Y)+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]U^J;*@0
XMI$J0<]^.7?LUK=NT=$&V!%DV[-R\(.^&&=YTWX(\6S>LW+)NZ98MJ\-\)N#>
XM8YXW69!IYX*HWF')YIDNYZ*M2Y?LV[MNKB?:L&[)LBU+ICT7<_YKJA>Q9<>"
XM!!$\O/^M6[-ISX(87M=K&L,OQ;Y]2Q?.=*_K1GK4=Y@N8X+4";))UI?)$F3,
XMG#F:-\BB<M/@7<FFO]_*/0.NT^H!UR#?PBTK-RS=--MZ3OU\0;R"]PBM>BS;
XMNF3*-0]Y#3?/_#Z+EJY+M#ZN8]YJNG3'PJ$./\>J9IM6#'4+WG??Y/6O<^O*
XMM9O6;IFO=0^I>X?VM/LV+1DAZ;)XA-0H4T3O/?HFUJ3]2Y>9]5K_/NZ#351Z
XM..EZ9\($5&R0;>OP:Y!PK.JQ99 >]UBS%!.]PV@OZ7U'>+LMP];+TD73I29+
XM5@Y:ABR.JJ&M:>K9G'&W;Z0AO-,@W'J8:.O>(*$2,4;)LS[V6A1B-=Z8,$$4
XMTV'9LD&JZIATY;YE"V(+*HE]YLD#UV7GS@U[MLR;1+!,:Q8D"KR)8^VT*E,F
XMQ\I=[TD6W/=N?\!0E4*?/J4*1:M^D:W?3%54GXXS3_BE3;:^WO080WK"-U#J
XMN2A%#N%O3BR_*U@1N>)W'2H4,"T"31%T]E$:0XRG\!?[VFT+U=?\RIYW]JDH
XMJ'?FWN18T1U%W#%]QN*>(EN;#4/WR7)URU6..T]@CH,,(7J$,.P)%44'.1-$
XM>N]3>-<(4$L#! H & ')7TQ:&:6ES[ $ "H$ . 4U)#+U-/0TM?
XM4%).+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>F=3N6;5VR94'R'/L6;EZY
XM:<^BI>L2K<^&"JZ3=\/2I3L6#G6SCIU+EVS:-^KAIC^LW#/4H55KMV?^RY<J
XM0<Y].W9M6;H@Q8:=6Y8,\Z9;UZQ9D"I?;(_@I3V_PG%_NF91G/>O=//"$=8J
XMY[($.19-MD+>9M_*;>-T-6^7+EV"3/&^]PAOD"""M]VP7]FF2=8@]AT.N]Y!
XM7<%W,=U>5NY6$$#]:].P>(4X[ZEI]4#K+N,%NH-D6X;KIHMVA[]8)I)5_J:+
XMHIE85_.4NYHO[<X!FW%3X#D+^ (]D:RT-9ECS+K5$W!5]49Q3X/L(>3+63YG
XM['RG!.GC;1CIE=83OJU+=RY*D46E2GTJ54?X"+.&TK2#?&MG?\NMZY9+\)8K
XM0ETFE#.FKBO'VF% 3?<QKLBDEB6(*XTHYK18S_HSZ_@^?U3?-P1UYAX;U@V^
XM;K%>@G1;MZV8O_]&>IM-6Y8MV3G7!1DJ?K[@@IAO6T!1(*V@X[2PJ7M.$BFT
XMQ1 ;QGAY%VV:N&J+'1)%>N'%4#LLNR;_LF')YL&^,.Z)Z@AAGIWOEC%3U)E:
XM7DBBV&#G*&9^MLR>X-H XTTU#@+I0DX@%-+EU):$Y8 TC5T.;,(^H4<RBFT3
XM?)!02P,$"@ $ EQG5%O!!I]Z+ K@ H !34D,O5$535"Y#(]*X
XM&<.F#IDR('C<"4.'SA@X+M#X:*" XD$Q=<[ F?-FS)HR=-B4<8,B!<4]%$&H
XM! %'CD Z9E"(< CGRY2.'^F T &B1!T08O+0*3,'!!<W(EB F)-&3YDW,4'0
XMM(D3)(@4*7:D7-GR94P1!FO>]&B5IT^@0HD:1:J4J5.H*$"$I4I6)U:M"OI0
XM!%!+ P0* 8 !@!R@'H7R;M&JIP4 "C- #0 %-20R]51%!?1$]-+D-A
XM"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085! 87!0H(
XM!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\^_O[# LL
XM"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W,6/]^EY^KN,?3_G^Z[U%
XMN+=?VO9E;^QG4?&/9?#^5N5:?VG?EFL__E[[2^7^C;U^_^.^Z^M?=[M??D)H
XMWW[\OB7D_3_0>N[ZOY9?N-U/_;=;W?[[!ZT"T*>V[>7?&[7'_SGJ_]S7Y3_-
XM?5Y^Y3EY3V#?^,J]W5]HJ[PRNW&O:Y[,N+<O=S[-]]D$__DSX?[G'>$^K<[_
XM1_9[&^<L^D-B:93R*F']8U]^2,0_"\?->?ZY>3D_VA^7MI^3E?\GT:-/_A3U
XM_>O<7)?M.JH.+2M$%Z]-=YG0_>1G^Y-TNO-59M@1('J]==F>ZR1\S5O/:UWL
XM+KEV/^5NNGV[<^G:'L-N,]Q_MZN1\-^C>I\)-]DSG9 ]7^#XE+1-US5Z8Q85
XM%Q4'$_EQ8R^%VZYJ90%?7$[7I7[M)H=1KRA'6+44%<?4:M.<WN?5=&R-"72;
XMY?<*E V__-@-KGYYCF6-_1_,^MR?NNM&R$0>MUJCI+Q12M1?N\[;[]JH,/:Q
XMZG<M(E4[&)%<SKU!<HF+_!OSMMW'HE,%C%GVW[R]JFH=\RYUZQIN7>ZR[O7<
XMCRI4O/Z!7[?7/7J-])/'H4?LC9/?]ML)X^VT?ZCP__+]$<]G7:A.6#[@8S%=
XMKO*M%YOV<X,1\(N]EZOQG<\^5\KXX?/X=1$&+AC)')E#<Z3?BGN=ZZ6([;V1
XM<"]0_5Z.N%I\W">8L/WKN/^PF]P>A,C[,R<Y<>/&U>J6G_!7>2Z;M+C^]:G2
XMQJ^0RG4\WA]_+17$8ISH*'[^JN$:K[]HU_6/![T?LOG>KGLENL?]_N^F_%84
XMN?Z/.^]/#:WU_G;D<5+2._PAFCCNM0:MP=L.)=<-XN^0%?6SL_[UW)OTO[*S
XM/*KY7BXA[Z9'[K% O2+]68^]NM;+_77Z>]-.M8K/C>77*\Q>0Q#E2X3YNG&O
XM.DV>+[_,Q^6UO\ASU2[-+??&C5L[G^J:+_&&K-[89ZY7ZU/]E=K->C<<WOP?
XM3+#]VGWQE>[Z'&"GS['&^^7YO[+'*_='.*/KL1J=2CR,K[2#=SJ<YPWH48TY
XMYG(3YUO].$^]?A&LSQGG;W>#=8/=0<\QV;/+N+K_-6%5*I9=2,/W61>S!:ZT
XMPEG!:\5*#M%.W+BYX=-S<W,%6K=PG+'YZG\M\?G?&G]"=F0W:=0=OFQOQH3M
XMWDOV7O-U]^W@?V+T8,?&8ZPW-POK'L]+9=\NS=@(-V&KUY&MD=>3XW6WMOEH
XM/!YEE''\LR)XNW9K_UFL8PF/[ P)'Y]IYP;S7F6K]7N]-B5OK"-]YMQTK".>
XM"&[V3U/'5:Y3_@E:GR+VJHP5&A+%"5 ;/;ZNNC$1GM,ZC^;:\!!-?#NAQ558
XMGB_GM/YP>*.4J8X8A&C<N!.#:+BPHML;ZN!'(9H<-VX.Z>T;>M[$,59/_B_/
XMYW*9?,-=.NT.E1@W;K:Q%<"#7;VL^8XY??2L2;\@O-ZQ=9V8VKS,&[0M2O^\
XMJ\]IUTB1AG>Z86KTPIF$)YS5*=*1*=U.LD7/]#K_,D=^;]MNFHA.RGC0=^CC
XM^LR7MAJ*NIQOXDL-NY9)&(K5N-EJCY\?V2?_Q]\_X0"N39[Z?J]';/4?WE7?
XM[_!NTALWR^_>?P.KKN^.6]H+U6&1QZ'%S;0^=9EN=VU6[E+9Q3O"+."A);UC
XMDM2*JY)Z?8.UB_#W>6O<C)[^PDZG@#L@Z'Y2JQ-WHI0J(^&E99,^?-!COHX[
XM26/[?+FW \.\066\PAX9>=!G\,_)S-1ZXZ^SWN",M<BN4O*;?FTJB=WK8\_L
XM>W4P$8_A8.3R94SW/Y<$7Y9H[)6OQAM>VT\%?Q,MDK>7%#?+%'$AZ?%I,%G]
XMK2ZKK!A.3<6MKO%/J23XWFQ;6$L>OX7<MM*S+?X6CA6Z+>%*-X%IN\%E7E-G
XML#*"I1M )QAY/9T.96L:=1?HD7UQ-(F[+"?4C:MUNNS3D]$Y_S,I*TG3+=DY
XMOWDMBFT4@[?Z>1_5I0)MA>)&,>,D5\LRUP7:B-=_EB>2I::AJCTBK]4)A8G$
XMN6EK@,+/?4^82V#-?FK<6B7[.X&MA5+'*L'(8818E/ 4H_+_QZ+2A5W!0W8=
XMUU((S5_U:G29AE7)8S&<QA5S3F(4 ED7!".F0VMH"G4R83JD@:;NLNH<KJ^K
XMSL&!ZZIS#7J&[5@"1P/L'?_2TT@PJ,VD/\;M%U*=3T;ABW:5DZ? FUU9Z&$+
XM2!#G64??QMGPEM7$Q"4&X5@X]W9+AL7\1=-0(@8Q+:RO2_ZZ-0HH!6+Q\V.A
XM_& $5>QRE_)CA2P_UOIX6>,\,J^!H%=^?5_\JOFNW@ZO>47G+2'VFM_JJG0U
XM^4Y7@"*J5YO7]A&[_! 4$MJ(6P>QDN8\K3!^8IG=BF_<D.'=/^P_X7CC*VJ\
XM%L8J_9"'G.$)9=J/G1>[@'G'M7UCA2SLL,5^K%+887L_<2^-7Z+B##;'O6J_
XM\/IA_=SPV36S"V:[<&J>P;]<%D_(C/DL]\0J%= MR*)+^&%<K19V8"45:239
XM M'9&AP_[+!+(!?D.V0<KT4\[GU".!7^H<2[\.Y0@K98? @.+=#S&]>A!(B#
XMB[;%A1_VPAFRH%U002#_(ZY--$)53#0$T,")O Q7@6(AGZD[D$U"-G4O+0A&
XM4FUWE[)'Q2XBX:,0\V'AXXD'AJ]8)KBE J?NJETAVU96[PM.B16SCQKM"IV@
XMC-]6+YQY%!OI\\:A%+T4TY^\U= ([?'U3Z>_.=?8C!(QZ_CX"4?UVWQ6)Z/"
XMOC&%K[<5+Y2\TEZ=NXV*W:NV6G#/\WO@?9'QXL9C,B,@@B)6X>ZULL\GH-&_
XM)ER61G9!3[G(.]*M>/<2,=F#__)U/(O(UMN*9LU*T9SD23"1OBW$GN0C;V8/
XMAO)&"A7;HZ2>0R@?<"L(#D8"+JZ5Y?&MYE&-:&6/LMT:/D-$'-FM24@(P?N%
XMO$AY4AA"/^3:_J/<@I^6!G$%# (>(GL7>&A!OB#^J<(T[!R@0*1CM ().?(J
XM?/7TCI63&2-L@354#-^4)?Z<[YK!/QJ&0@L^6B-Q$4+B I]ALH576FXP^M</
XMB>][^D%^V&%3NZS<8[N&N^BYBO*@. <C-Y\A[EB%TZF*7\6.C&\M<?O"+50!
XMO:%=>1ITAKUBL$[!&%7HT21S-I1F0^(54WFJ=171T0FT,(A.S5@O>_7V]$LM
XMI$Z*45PO--B8O?QQM!O-GP'CGYDM\N-ZARU]<?2K2Z,\ 6._"]?\99<UST?[
XM-H%JDW&>!Y8D2I\J4)'GRI]//E),9(Y50NSFQRI!Z!3D!>X+?=Y8!2$O!%=I
XM>!U;_,UX^0IT9/Y:0*IC.L<B7:$*7BR-DJ4P\X**FX6LM1\R5V'<4JBNR$(3
XMIRJY"M>'Q/<),ZOOCARF/*?E&A[.?7#</.I]?-#3NGC,V!><2"PD7*Z"+1&C
XM*O84O4L6:T1XKQ4""?&"L M+4_$.6U,4?/?2?11^$KSD_^C1,_)QR_EN>;ZO
XMXX)@Q/5B"GI%T/^>K-J,P+T1XVTHWY#'Q2;Y*+/01"XHR@,76-<IDA]'PI6U
XM4.$Q-F*?3')J8B,9[+@)$6(/;T=Z;.]?6$I#/,%7A-,Y!$( XQ>6PIX4@-S!
XMZ+/4RHZO&M,+[U3-%>M'3..@9SHL[+!U'M6Q:%# &<^?_[4=R9<VLQ\W\B"A
XM$+@-575>!/BHZ5UO$?X5GUNB:M$6O? =$[Q9#1L^?%]CYU.1NRWN1J@(=A7B
XMK*^UR3Z.%/I>!,2Y"CR<HQI=N"QZB=ME.@U&'D6!'68? 3X'(S)#@<(41<4N
XM'D5D#R,I))"-:M3K+MRWI\'M*,:5JG*5W#R1D&U HHI(S7/@(LU>,?K;7MHN
XM%$'ELO.J"F57NQ<XS:RG>E!EQDN^Y8W!FQM=0LB-."E?)5<;8X*G;)/"D)7R
XME7X!"HUQF8X5,K;0^5BOZB%E+1/M](%M6 CE'PR8\S>E%8PKNC0LEL,7L)#Y
XMJZ7]'2DG1FZHK,F(+Z9+0E:B8I(""-52$J5#JJ##^ ^A4UULH+49C_1CI("!
XM%NHV:5M.- >Y&F7-BX!6T3LLX;1BBLG+YE"F5VU1^KB\G;50:[K 2]O#_ EC
XMC5!$[2VD&:38MD1>4"#*%J=D7E[8R;W9>58VI5"R71!RQ3>\LP^7]I4 M"IP
XM5-DWG!Q-H_XBQ:CDE_)#5I+F11[.W/S@G8WYH7M(U)3NQF<B>.7G"ZW]#U$P
XMH\2L0W34'[?;QC^+5*!R3^F'S5N'G16,; AD\6\+2P$!J=A:ML+L+2@R0:E+
XM04#,@/_\RY.@ .W:M5& "G27UG7%5!T*^R")*Q7NMUR/8W#C2,PJF3@@MY1W
XMO ]\#UW'<PE.R8GAO]$1A$0@]%4:[D1932:UD,NZW@_%EB\2%U$5]@8# LW?
XM!$P02OG.,6,Q_2,B@O2*=Q<$(YLS;CL8&42<6R0J-)PK9#/,,/F(@E(PTD]&
XMQV-\'?T,7 6IVZC<-!NO/JH$$(7OEI6 2P28YS3SAA4VA@QTK3Z8.U#5+ :G
XM?_3QD7QHFM&%Y:#:0-<T91R;?!2ZLH$LZ]1&*8=3184:/J&4>W,*#"_9AO>@
XM!V<Y;GF/4+[+A=I[&I8/+NIN\[-8/!.(,<N#"?57Q:JY[UR38(!EG1L-*>_:
XM?#)Z8G\.>@Y7Y&O(E:_\;.>'/(3R<YQOD390IZPG%["0D]RP=3P)(0N?V>E4
XM!38.'QFSVR-*H]@F)D"NV;AZ'^*@-WS@A#7'KA%@U<) (3RU47BV,-W7"$H*
XMHW:45S352N08Y[K@P@(GESA\GWHX%T,'BYHOCP:@Y&NGBKT6$*^\-!&%-C%#
XMM4UH8G'S4%X,A638$3$67OP "3)$=(34Z%L*JRNVAFH/M!;ZBI#:0J2BX0)Z
XM5?#D\&YNF"*%5&C@>Z#:#! J_83$IV4HMU\:V+G])9R/I3"Q_79@G>2C]1Y0
XMS8>N&@;%)V H2=$,LQJX'Q\N^&/%)+.$KP;OO?P/%@K+EF4<H_L*6*Q'R4T2
XM^LB!?QU^D/:R"@Q:&=9 ;^(PB=-D04=).11!)8S-(0<HE9RL]H3!Z\*K !PA
XM.F+HR<V.QN1C]%!BW&P*2=F.Y4:C"L+2*02_6/1N1F&TSKS>>BNCQ8J'GDZB
XM(?(D]_-?[6M(V"IK2'JYT&/'8Z X=3RFJ"/J\T$/,=HEZ*'YRN:C!G8^WI;S
XM<1=?@0FM:\ @8RFP#%Y;0R"]P165;P$=0Z>W(RP2X40H0JC*Q=Q2<Q"B3F85
XM3U^.T%76-8Q^746S/"[$(:[7Y:E6<1YJ7BMW6>\J,8GP;-<^DT&T:A:/P#%9
XMW<P* %L$>_TB!8\8'%6/8Y-WWU1NC_T(Z;T!,?<G%P<EBLWF0BCBUL*R%*PE
XM[WQFK/DZ^<QNZL[N7X/-6$\PHN58[/:GXG:G1-=8@A=7TS>DFHGJ*NBH,0=&
XM^ K@KT7*G.2$2@=+L.9UNQE><:9I+C \Y_/"!\_!I'T1(A))45T85&CLAE!V
XM(M$<-57*#F2=QJM056O2ZM2ZN]DQE,;I*1V7$;4>RA ^0GB+@P$;)(^*&0A\
XMK!AWX+1(W"'QL_FT+6YEQA2^$YBSKH+KEDH!Y%@#B]]8\NK/PG/[8GQJ#*ZR
XMNFB\EX5V2/7">QE;H$2@@3UNZMTHA2MD*LYWF4+PD"Q1E)BL6NSW";4]S@73
XM2:C<T/)#$-JCB!^[-W*_3M\5$&8=&2^4@\&H^7 X@3%8!:')">](W+B,"5>O
XMT>B$'H:(3N/&%5^?16R<'R>/L0QS&"95#$_S)^)&3&0.>M\$JB!7DN9OTI!8
XMA#"7.#3,E$X0A(:,E>6/OB]LRT3\MZMYAOO5?:_GD\&^(##Z+,M=+KFK)M$6
XMZIOPZ+=PA.<[O$^8 -/G/!&--GRU5_GG/I]P]%YQ*4QQ=46&ST@.+=*3#(<W
XMEL?7+]MAE*E9,."YX6NYN1,,T0NB/8]>VQ/L:BDBD-\M(E:,)(%<> 3F!Q.-
XM4X$WH5G1C5$Y<FEXOHT$R5/&8WY1U,\>/89>KN,%OXG2)Z@="EI[:32W'82]
XMCH8)7-P.&?08#]VH)$34<;20R9%X4E8A_9H>*(M%2 HLOX1B (<T=W$'1S 6
XM E>$3@JD0*@I;Y93^:NJ(#NQ$5HZ@M5ENL,XW$#8C"$4RD>;O*!<(X'"@:OB
XM*HN!-\Y]E<4020P,^,Q,)&Y2#GIU85^G@G9\P1F1$S6,Y$_R<_+S\O+R]11Q
XM>^F9;U5"K3^6I">?/ZZ!BE#%S+V\XWL_!B\%49PEA<=B"J.%(E<Q3[\ZFC\/
XMGT)@E-PDES(\A@6DKF@" E#;JH@?SB<8T5FCB8Y+]N*YK6R%OY1O[U2I8UP)
XMI0; ABW*2)7YR("6Q$'K?]]FX68P1L\(-R^O&C\NG+JU/Z N/+*G80E9E0.N
XMUCW#JLWSNOGQDHM@1>OU@>ZA>GMV_V;+T'C95F\=EW_4S8BI J9J"-IH"&)_
X...@BFS.HHS;A.O#J=&H>AQ\#723QZ''K$W3G[]>8?Q=MK?2!5H+J:%&\3$>3\:
XM4&LZ@2C#M;T;0::^,@L)U\&1+?M9KU !3NR=8%U!@$%J0S=DC!.7P"B_3@19
XM5!4C+IH+%^A54M5-J<.OU:EK<['4B*;U?KB<Z10D@*%JK07?XTA EJ!:^2'!
XM"CW"5-O%T[BD0CA4\ CO4VA8N#AMN%_X0V[$X%P-)JM+[#6BVD3Q$]H;-Z'O
XMB)P229$J<A\>,0*X@AFSLK)M<XF--36W=L4J%B.->ID6#P;3B-"7\7 [:4E-
XM3#P!J,0UGTPG:DXH]8H+! ?+YD#R)3P2T8CT$E%')"I>OAX PCH*%]C8+XBA
XM8+ZDP?'9^J:9A))C_?EB;URX5?ETE?SY'L48GS$=U\^DBI9(\-R$<_Y*50S.
XMT)Q+OF06:]6?>K\8.HV+ (F@-"64=*/P, Q2F'W GC.>6=V2\ UJ/LO?" D-
XMX<-%'%RJ"0$ !U!+ P0* !@ ' "47 H\)[24" "V P #0 %-20R]5
XM1%!?3D13+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>F=3N6;5VR94'R'/L6
XM;EZY:<^BI>L2K<^&"JZ3=\/2I3L6#G7XN734M]LSU.''TLT+M\QT"]XO50QO
XMD"I!.@W;!GL3?=LV#/D&.;6L7+MIQY:Y'MO=2G$'"=,E3) Z02H- [YCQF0Q
XMO'/FC.'\15T(KV]=ENT:]_XB&J[I?NL690KEF; EB+G;K9UJ37<NR*UA78IU
XM.=8EV:X@W\H%L5R"2-\@9\H$*38M79!LSO<9^5)N6;IUY;J)7_1J>H/8WW+>
XM'^7<L&:2E_M&,_1;QDP1CZJ?=[XWF7GJ>Y?%DZRZ?\SY8M\JFN<.YKVG_89J
XM$-,UW!W-%5N%OM,LU6/0%721C$XC/LA+N"![%%W.23-'5S5EO:[WR:TGU&7"
XME2O."?%I9NU 7_8OD^:.X_?Q/XZ_Q?'&T;Y!*/T$\N9];S_-VVS_$Z@[G^J-
XMHFB>$H7Y-,&_\9HU8[]Y\A!6Y WHATR; LP2Q=>9HFO+KE%HK4'D86RUG&Y*
XMK#[I\F3*%&C'UY&?P\#_!&ZLYR)-F"O%5(A]C'>?+N#3*+')DI6C1G@W_UO/
XM_WXCYB#:R%?1G;8M7+9YQH[W67;N'#H*,BEB!D>@$*^BY5VT:=F6V=*@5UA+
XM;V17E,05+5J3R:PZW+ISHTUA?;5[.F+HNF7JS.Q[CR6'F9H/<PZ".78+<VP7
XM+:BB+1FNSY@M4U;"QL!N;7902P,$"@ 8 +$DV&D'(%93' P B D P
XM !34D,O34%+149)3$4- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>"C!ES)DR6
XM(*^6)9.\02JMRQ9D3ID-%8X0?I!.R]I-R_;D7)!VR\J=F_:M6Y!OS8*<*G4H
XM2*-<FP9=6M1H4J9%=8($62=[NST+DFI=N6+?@M!>RWLNW;)AR:1/H6_EL@WK
XM1GD/82:;AEU;1EF5;[IH0<YM&Y:-N>(>X5ONV;(MV[XE6^9YLTTK5H[S3D.^
XMX)O\!!'<\*>9H[LL2#/1JNP.2R=<E2]X/13JRZ10061ON6Z653@Y]VY:NF/1
XM_&\=S)^0S/R[F5_M:GCE7?B>]VU=D'?D-1VQ1]V'&F4:].A4$.;-?G5UERY=
XM'-,)J4H-.K1HPH0MSE=51=?>[^H>4]9?L&^Q=<^>>2O'Q+WV2G@3+2JT2K+N
XM";*EG;ISZ- >1/>8X_MFU3\6)$D4XG4*YDVTZ52B3^IURZ1C=7(QWUR4]5BV
XM=9+5\_$KYHAN]!32F;DYHZ<X0P<V?2*LF30K//6<Y9+)\K.ADPXZ=V[9MF+<
XM5&-J,UWL,^ ?=&H3J3K,'"OYB%;J&T^U0E*W3(/M9>JX^LN.9<,=/D@[3M9H
XM5:=#OZAK&-,YD^ED#'Z:2!TUU*$MY\(M,Z=BWF/>N*.4X(-\NASK\JU8-6-X
XM B07FSJ%D_=-)8\RJ^17Z4*(3TCGWT$</>/GLH>F$^:&4U1EW2NZ%W]8)OPA
XM@^@/E>V9_J+H07E'"],1P9;F(<L@R#@*O<2TW(&>L!IXQ,!F0DQ0!<EJ7/":
XM>JS=/>%4[[5TODX0R2O\DHO;JN1,#$TFN0A3MZ'.X63VE-M6\\^YV$W.?3MV
XM[5<XD577C;GEUO1+L7.><3EV;#OY8?S8<+^P>L^Q;LN3[-LV[<5AMILK]!GF
XM\HNQEKL&&J]KIA@,];_IM8;CCR1#OMJ+Y".F>+7GV,6X+MNHMICO5%/02K?I
XMBJGT<J>:7)K;8\*;%BR+B"Z87X<1AZ5,\9^ WVA@N<EHZNRDA)$ZG/$Q98S>
XM$<VD2S3I2TZD#C^Q]* 54: /Y7$>-#%('6T0YT$#O-2Q>'$/E,1+'95GZ4%#
XM7*EC<L5Y\*9CZM1HBK>=_>&X6!V<2Z0#ZW6Q.GJ7: \6[.)U]"ZU'B3(D3HZ
XMAWH+--@A=?@.T1ZTR*9U>#;U%8@@6^KP;"(;:+ I=>RF.(]$)VCXD3!3ZQA-
XM 0Z4U>0Z<)/B C#,*_]F:%R'I#%T8*DJJ<-6F<JS22=U?#H+!I:LTSIZ7=DF
XM*) F=7 :8QV@Z?I,6P2JU-&HK!Q8E8K7(:K4>J1IRHW08E(#4$L#! H &
XM %9P\18:W8@%; 0 .L( - 05!04R]#3T]+244N0PT" 1(C%!4V-VB)
XMFML\!082$T3%]I;W7ZI4$1Q=V% A2!#!>^C3ITN3%@79$J3<LF')@@SK9GC#
XME9O6+9WD#?)N6KIT\X*<&S:/\SX+TJS<MVU!7']9N6[+TLE?^[70O#I!*DUS
XMO9N&E4MG>T6/X%"3S!?I6TWZ!DKVK=RV+N76I7MF>L]U699LG6,J>!+)/GA%
XMO.*U$_9]YWBOJ9=0ZK7:LF/I?,^J58="&=9[Q88=NU;LFV?=-T0Q&<+:BI%2
XMJ*OV[3:MG>-/ ]2:1H:*9O^,-<J<,'&F!)ESILR6,V_&S.$4KSJW3/ZFB[8L
XMR*MAYC[;MV]!4IG7(-?X_;!L78BO/J$-7]3+$63U6+9UR<1KGG/IDDW[UB5:
XM'].Q=,?"B6[I#7J;P=YEW"B_0GTJE2K(F#>RYYBS:\U=%@56):Q3-*^ZR\[5
XMYQ6AGN>.Y[U'>"<X]J]3W]RYKE1==5FV<Y)_!UPZ@?A*J]..!0$>KW+.=CX6
XM314:I-BZ9LW\U5M!RH1),R?(+MK9YT-_UF%/14^V9=TXGW)/@YR;4;K*E]VE
XM7='C('N"-($TY#K8$\9YV]]FQEA".<@0TP\"JR=(*L[+'EXNN/LM'&HUON>R
XM\-XLTCN++6.8M].J3)G<KZ.SS_"U>YEA;%M^91LF?G_1LZI7XA8NO.N$< :W
XMYZ(4\>26LSAEK)."'#-9?<*MERUSVN4Y55IO$[S%2+DZJTY?RQMDF\\M8E)M
XM&-O=\"[K$J2(>G:,#WU;ETT3.T_QVE.R@=]E\HO#F9E[[@^E&\F9KV,M-;U\
XMUZ)UF\-(-F]X"F:\+)[%;I0SF"NH,D&6MK_3]GAS%:O4-XBG,-&_<L53N+?B
XMSF#%EUO3=NDS>,2LF$PH!M2^AFG=IVC>AXU$$)@;D82LG:R5;\UL)=J,#*+I
XM#$&6<%[!6L[6CW%'JOA*GU_O2$KUN>AVD5S=BF017D0N%:5.$[H- K^AGK(?
XMF_TU]=U$UZ*^DK((GV2L=QA<SCSFU[U!U!F7.V2/]&X&3$L?S\RRU/$"U=9;
XM!JM&\5S >5]6M26$D5U[GN0*\X3EA2?&_!99<HY2ME[A%^FLUVOQQ5;/D2ZH
XM+&'H@8K+MFSM;7_+U4%=SX&%HXU: TLR]3O5K+(\T2V?7XZ19=.>==.ZZIR9
XM;B5*G#L(= CUO66,^F:DJIWZG::3G@J*_5V<W6[=?,*GP9T@/V9E?DU0M8@$
XMGQ>5*J5S2UKEE5SE[#6@XN_MR=P21O,8Q)A:ND\;U&45LD;1<5WNV3'_2U1,
XM$8OY[>@Q]]"JT!0Z02/!L([HGR!]4'*=#GS4NF_IH Y-Y.84^A[2.IZB8UL?
XM*GG; ?G#V,RMGK.QB^75[HA@NDKTU#&Q^!8AM9R"^R[BA: [R!F<#4WNNOX4
XMMXSSVA#S,6P9SI/F6Q(EBJQX"M6P4P8M#;J'WU/7;.T(YM:<6V-V39':.&YP
XM\X6JXJ@)3V),$)BLW<BYN+'[^D07^@1F6SJ^@QSBC&N4D%65U6?@)M502P,$
XM"@ 8 NQ&]%FVT%V*4! :0D X !!4%!3+T1!651)344N0PT" 1(C
XM%!4V-VB)FML\!082$T3%]I;W&RI\J5)%<'0!M 8)(G@3#9J5:M*F14&V!"FW
XM;%BR(,.Z&=YPY:9U2Q<DW;1MRX)\:Q8DV;!Y0<ZE(_UG09J5^[8MB.TO*]=M
XM63K^"Y@>^A9NGNY]%DW\1CDT)<B8.7/&9 FRJMNT=LCWW+1T\P3+JV'BG^W;
XM-^\UU+=RM/5;MW/P0X6!OYV&V9YAV7#O,N8B7K%OD%/KPDG>8_(UW#K1,RA<
XMN&S3CC'O<X3F5-&FG5/WWYZ5&^;KSSG[9?3N.?F:[MTPR7LGR+QOZX*(WV[
XM.MDT2:489#/?=-;*%]_>]HWU-ILGF:I>0Y?WR?<V>-WMF^4]MRQ;-MCOHAT8
XMU$@R7-Z=&PVW1J-5ET&^LLM<WDWS_V*>=QUD;;8N6Q;$%+G 7N+[S?$=7>@J
XM[3DKN3KOCNITF2 5,W7$BFO;)IY):<-T&RL?3?2'%1.NU&1OWO'28L^=<V</
XM0W:'4=/'S"OCI;SKRH7[!N@BB@J>1>KNL6N*%Q8*K%Y;ACH+CAMVNVF*==&6
XM3<. *_NDT3#2E@6U?W'5FHKS\9W@ SC6"'L.E,Q7L]YPVYSA+K)J.D(JLMME
XMW3OLI0LWUC-2)DP8T[!!D+=+%MV);^R._239BO<0*)=A5W^\4YE,0<X\&N.N
XM\"VTX0MI.2*O'LNVSE(-D@=0=?BZN]'ZF(ZE.Q9.=$MOT-O,FO>:_"O4IU*I
XMT';/T!ZA.=9,%'8H8IW">3%53>H[>VHRA;OGO>-Y[V%*,?O7J6_RW&4T8WGN
XM.<F_ [O2\\JP[UB5<[0+SU^.ZMZL&3'W5I UVC7(+M@%J,?]K).>04\V2^P=
XMGV>"VSU!FC@'M<[UA+F#K#0#U1:KAT+]$I4X)J8WRA!*1V#=+8KY!<6J]"&5
XM+/)"2O5798+%3G'KU=439/KGHA3!=WUVY\'>=?[88MGTUF)?L]YNX-QCZ2B/
XMQ33(J*=*2$%K2C/Z;DB1*91^@DNOJUL.N\<$X3R*SC[&%2*[F6QEN87[$IV[
XM=.F2JUP1XUE6^25[?BV3U>15H==J-ED4< ^[<=5L?'UFJ^)M8B^EGUUC8(O-
XM.%<WUWP$G%\&R;C"%Y+1(FLI]Z5V)>TBW#Z+\D+N=N/+0P("?7UG7/E;,^/:
XMB%GJ?LTPD[(89L$S 5RA9QUFT;?PGN?\](^_*IIBU1)KP,)RE)N>5F^94VL4
XMST62O\.]8+)9IZHS8O:9M<CS9M:YF'A#G4S8!R\J>*TW_BU71Y&%)@[/5?:8
XMH*XV5"UD%=9U@N!814M9)DKMIHP.0IQAH4P]$R;0^<N2PWAG\[UEC/F&&]$*
XMX[S(/ -3#YFC,KD;;\FJ_,PHG-$QG-MA/@PD7@=_.J@8D1VO4^TA;"7[T$DA
XMOLPW"MT(./79L2Q<765*,;]=$(CZ/:L.%JC"P YA+$&&"/66X3@8DHZ[J^48
XMPEVMR^)I4@FQ9Z@NAG5Q]*K[4W!#NI+NX=3"-UL[?MS9N35FUQ1J/P&G4HS$
XMVBMN[#)#:C5FX:62<Y/QF.9,O-<G2\X]P=FVC>_8AIVA-LQ0*K%QV:\14$L#
XM! H & &5E+1BUSE39U 0 )T) - 05!04R]&24Y'15(N0PT" 1(C
XM%!4V-VB)FML\!082$T3%]I;W&RI\J5)%<'0!M K>($$$;Z-)G1XM*A5D2Y!D
XMT\Z%RS9L7I!UYY:5^W)NWKETR[8%F=:MV;=RVX:EF_:MF_=\Z%NX>>6F/8N6
XM+DB40U."C)DS9TR6(*NZ36N'?L]-2Z=_OS4+\LK[8MYLW[Z)SZFBR=8@X<I]
XM>U9NF&A3WF;EEBT+<@[ZIGLW3/+>"3+OV[H@QX9U"V)Y!7TZVEIL'?]EOKR5
XM]";[@E^#;/O&>IO-DTQ5KW7E??*]C=IW^V9YM=ULV6"_BW9@4"/).'60=-%P
XM:S1"=1GD,[O,Y=TT_R^VC%UIMBY;%L04N<!>XOO-\1U=Z"KM.6LW7O6.ZG09
XMN(J93MNFSIUFV\2S(&^8;D/D'HLF^L.*"5=9MJ7:S/%V6W9.D+?\8<BN^(6E
XM'C.OC)?RKBL7[AN@BR@J>!:IN\>N*=YNSX#5:\M09\%QPVXW3;$NVK)I&'!E
XMGS0:1MJ0J/8OKEI3':OC]9U8(SC6"'L.E,Q7L]YPAJJ_VT5634=(17:[K'N'
XMO73AQGI&RH0)8QHV"/)VR:([\8W=L9\D6_$> N4.2Z8_WJE,IB!G'HUQ5W@V
XMVO"%M!R15X]E6V>I!LD#J#I\W=UH?4Q'R')0AZ<[%DYTFS[G;<;/ RWY%>I3
XMJ51!WLR1/<;_Z]0W9>ZR=**P+RZO8OX=U\L-EZ/[FS43O;>"K!ES)LBN.]S'
XM>(WB,C,M61:]^SF&O>(!M$Z!7ZH SU5L)_Z/SV6\[ZRAR<2WY]_#9S4T7N7<
XM'9XEW3C6TMATZT#'LA%"%6W1U>YV3Y FZ$8Z;XAOE"&B!6;=+0KR-73#.)OU
XMA6/>3JLR<6.GJ/4:^@EDI\9NE"*$KMKN/-B[3A5:+)O)W.'V&+=KSCV6CO((
XM33.-XJJ*%+*F8*/OAA29HMX3M'J9W7+=_)-]O.9PZ#I=,]8J=6MQ:XOITB57
XM.>]M;X/[7[+GUS)E[5UA>OEFDT7!]K!;&XM7)K8JWB:,K%/D96$Q,,D4?,<Y
XM>;+DW!.D%J'S->^&&38]\*6;X"DBC5@6FV3!9HVZOCIW7A1T$-\YB+C9\H:S
XMG4U_PH0)!D&#7/.J&6;XN)4HA_&6>^)?N4X\8WC7? I:B_!>1 \>3JW0DY4Q
XMM%'>^9TUE1&WO6."(*.2,^%WU1]]GPFCS'#_/<'IM_G!=[-ACGZ9TZAQ>!:/
XM?1GH%6@S^-E%_F'N@!+Q=O&Y15R-Y 4JFU%ON3J0$HBXS)?:A4;1MNE5?BZ]
XMKQ.$F9?$EY%]N^F346ZSX:23*;,-J;K5ULN=>*];QGAOKJ]5J4L826+!D=S
XM$+NE'':YK[$+"Q9U0#VA.\55AHV86^3'$%'V24Q%V56]47!FV$:?'8.L?$.K
XM8'Z[(#IWH2$HG62I@OA :=I$I,/H!C0UX*Z7F1O%%PBTIG$^9N!%N]V>)/L&
XM2%;:(754L:S8,J:DNL?0@<9]G5MC3$HFD"QVM;I#X.[1*+G4&U1]$NC)%*:5
XM"=1$]XEU2J:3(+>XMNX*Q)C"=%T63]PCW>(#03DT#-3!15F"7+DB<(5I$''P
XM'@Y]0&XVXFMPEE[9JI =V2,71=R,591ZE8^0M +]][PZCJ?6QFXR-MV\B<]5
XMLAZ25^L$4N 95]95;N%XY5!+ P0* !@"B>.P6L3K_<?@& !4#P "@
XM $%04%,O3%!1+D,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]U^J;*@0I$J03.'&
XM!=D29-RZ9>7F!0E7;EJW=)#7]=CN($$.?0LW#_4^BY8N2)1#4X*,F3-G3)8@
XMJ[I-:X=\STU+!WZ_-0OR:ICX9_OV#7T\U+=RZ:9]ZW9.?Z@P^K?3,-LS+!ON
XM769=@C3#OD%.K0LG>8]]VQ9NG>@9%"Y<MFG'F/<YT618MV2XKFI\3#5R3#4^
XME&U8N6OG="^N<5#CJ:)-.X>KOSTK-VQ;$,IO5F[9LB#:MUFZ=^IWV9T@\[ZM
XM0ZW$-8CE389[T]'68HR>^:93+U]T_;9OK+?9/,J$]6)7WS??VX8)<KM]L[SG
XMEF7+!OM=Q ,)&X%4C:E!TD4#KM$8U660[ZQ2EW?3"+N8YUUG69NMRY9%,8$N
XMLM?X?G-\3!>[<GO/JLZ==T=UN@Q;U4RG;4/G<9MXIL41DVVT=#32'U;,N)JC
XMS6G'VVW9N7/VY&',[C!8^M@Z09KRKBO'3"5T)84)GD7T[K%KBK?;,VCUVC+3
XM17",L=M-@ZR+MFP:9ES=QQL-8VVF5_QW5]6I0/=GP.,4%QQL!#X'2J:L66^X
XM;6!_%U\UG215VNVR[AWVTD4>"QI>)DP8U+!!D+<+)K'@$8X-H9\LF^UWY0Y+
XMYC_6J4RF(&<>C?$7F=2,&OP.D':F?O/%<-.8T"SX,"5_SIN[S'<[W%TA7Y:E
XM._8%%BOL=LF&#V7ED$+3B;<GT2^(5_ >@;['LJU#58/D<;XN7T U6A_3X<S8
XM8JC#56LXT6WZG+<9)$VV&NE3J52_,DTZE<K;59UD^M3I$>H:)(WV6*90HWZ%
XM O\@:\:LT1X[-"B3Z_JF3!GOLRR>MN\FJ67N#K<VNW=0C[3J>:, J\^.96'6
XMS]I-$;V^!_3P/LU=6:U2!?9H_CUDK4BC;KS39LT0ZRWQ>F;7'=9QHRJWSJQA
XM'8G.,5T$C^M!U[].??.'+A.:,VYIK#S4T*URSGUQA%K<OC.F)K/?OZ:%8UUP
XM':(_W3KG&?28M78#5X_IS>P)$L9UW+#R?;/)U)B..=UJCD^S'&>Y%^-9[Q&,
XM"6))03"74]3>EAZ&MD>J <FE&>:L.*N6MQO?"??&/AIM775>%'DGB\IL.N*/
XM4@096^I4J59%IDRY8SP2G(5YJGPG=4JUJ)3SBA\>2I&*<[P,6V_;)I:2#1DB
XMBZ^C+^?LHVK]*-/VC$&HG99GCR(DB.1?N3(%=Q6$)VCE<D/:W9JVZU:87>!<
XM<>Z3+4]X?X+MF7".KBZ.!9Z.V25[W"_N.D&3:NB?A'I21W-+%D4-2GO/4_J4
XMF4*[>J^>K2Q$$]BXS"Y?1?CL8UP)6FDK_0AU?T<Q<-JQ8(AB2*-HHW><C9]R
XM-L"(HY$-@ BSL &?3=A,=WD,^"(]+G8%>F';'2;UC>*:JI9]KJ#[I%Z@_E8*
XMX1Y.Z3Q]Y^ ^K)W1"4*NB-4@0C-,.7+NQY;!U<E>>)D DTQ!^88!>V564#?Q
XM+3((IS-.JJ*;CL/).2*GQ_"OB_L0E;"<>IF:N^X;'5BN;D6\;<>X&87;9TZ]
XM6T)I D/$0$Q8.T"JF-=BI"[N]5C213$VR%6N4<8@3&$7"XKH4_@-1F!LT"_7
XM3E#HP:ESF!E0P+EU]3?H"9!;(,4HMQOMLW4E/1;Y)C*)W(&6J,@=$D4D"? S
XM?85O-D,W"E)R$+/6*>2*E:/-M"UBWEC!CFX1B-1Q=82<=KMF\7W7S7M=<D[5
XMS56N2!9T]AWX69C 2T2*WF76K ERQ='=Q*\>.^3ZU\Q=:!?UD"_48P8N814+
XM*D&&X 4!DO?&!K&R!I]FL0HX"XE#1;A79<KD*I!%//0Z4UAV0(N%)UV*> HX
XM<#*;4=G[:YF&-V U,PH(3:9IRV[:FDU/&#_-PHB#>0YBF&AYV!A78?0K-JXW
XM3C9/LX/ &Y--,7JESKQOG1$L->]I]98)R8WBN00Q\BD2;R?+Q$.K$(_1"^=R
XMJ.#S'"Y%JH:3H%Y6!QA<A#GF-U.:LO!?8[1]128 U*&4=8I5N=_HVMLDN,GJ
XMI#>;3YF)5+?&>I/0JP!9V"8YIVDAEA19<@S3:J#0+%B589%:8X"B"0,.1R:&
XM@:<%A;VN-PHQ83Y-.=<I2I.^TQ**]RMRQP211D]P>0);O;"+/!SD(2:PMB..
XMO&$!B R5+JG214LII^K_AIO6XG1PP:N:F?9U9*4XIK4]?RINM4;SNW50%Y(7
XM';]!##PJO+>,J4.W:!"31B,QM-""L&Q!0-Z%I1G)4];(&=80WD1-BDT6G6)T
XMJ79PC7D1UZ(&KX;39# HDRE;3-(%_,Y"0^'%P"BKQ*!1])P:=3(<S-;<(;ZF
XMBB!$W=)FU\//MK+%C34Z4=1-R<5(![EEX-)=EJ\1".7)MDLKA!+M&E!+ P0*
XM 8 !@!'A$88;=*U6ND- !5)0 "@ $%04%,O3%!2+D-A"GL'!AL&NPQ+
XM PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085! 87!0H(!085!@HE!@@'
XM& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\^_O[# LL"RP+/ LL*ZP,
XM 2(C%!4V-VB)FML\!082(Q3E]I;W,6,5%?]8OY_4^=-?G\NE'T)[\R_[+VW7
XML=R;SFMP^?^/]E*X[:I6EE\X*OB3Z-$G^3_QN"+<VWHMX?Y>^Y$?M7_N.]I)
XMTKXMUWZL>H?.S?^]Q^9]SC^ZO=]?V[??GDOWUMC+I5GD'9=*Y]5@>E;1ZW/4
XM?TGUTE ];:A>1N>S):S[@3,",M*J7"OPWJO;4_X4O[;=]U_WVA+_;'<P^N'V
XM^3>>XV]W_5J7[6HR['\MZF],G5W>ZU<M'.7U6O*_SS=[RD^X?^S+7^_SA/EY
XMX@<%>UK_U_&7ROTK>^F&^,]"_<9?A+]Y_WF]:_.9KWB%?N.OI;+/&&NXS[6W
XMYUC"!2.5\QWAUKRO,EJ/^XDN-#7BM4S;5TC^T[Q.LXIY?RW'O:[VG>>7'MB^
XM,0OVOS1OI7V])8<+O.]V-1+^>U3O,^$VN0H<9_P1KN>_T^3G.MU.4A[6SY3&
XM^]=QW\AY%>B$,L'#GL(_P;"NO,^]5 ;+\^*?95V>+6^.Q[KF-1[0DYS<7-3C
XMXPAW'F:+P"M\R?]=R\^6/\=3]SO>R^G_[*@3A8"U>/O:?IY[/-X&K][KE\X;
XM^[%L^VD34W^61[4_97[\O=U_;RX/]ZY+YWL9)W)LSNA18NNUR8;0W3!+*G.3
XM7E,D?S2=:EDGNP)7:M>V+E^RWIZ&4JABZLG\B=['8Y?+%IM[IGFW&^RS]DS'
XM+=YGJ\Z6G?_'Y[J++E]W.^7/*O'OQ?=3S?4;YU%[B<?_>,K.NU#V1WBV:Y]5
XM?[C2O1:H)6W,VP;\SW!"_[SJ-!.EO=W1;!,+L3^=_C@$;E7?.*[=YG,<OKOT
XM5&^F\XCI:9P/6ASJ(/:A'N?XO3UG',[0+3;9;>PRW:G:N:7V+-=RRGZ4T)+-
XM:12;I[);]O+7&KQ_HP+:C:]@5\_2QAXV]M\/B-$DMH?5W;UV&)\[0ICQ<3H/
XMG)[KD.Z7./\I[[/0IMHB]S?V1W'6.M>T'H7B.+*S<?4.O^B4F2=FY]/L<*M3
XM1:^.D6FSWH[\7U([:,AFOJ>T%4X*V,X+VV';7JL)?9R!.[P.KU]B![XN=EB$
XMB^K@JE2'E\Y]*9Q$I3W8"%Z'5O3_V[-"F;$?5@CN#!Q>Z4<;>H<WKAKXBWUP
XM$ZZGPYT?1+=\6G]!.N<@/0.D@Y"-]*0B'80LI*>-=!!Z2 ]S9+BET"Y>_\UP
XMS/&088\F2CWSX>J=H!"I]&2[RWL$XT@%[L*GQMB-OP5;P8Q_89*HWQP2_S-<
XM :!GJR>9]REK6L?Q?/E"L4,/XQ"_&])2-\?>'E,:\]HG4(<O*7/65\;9UJ5
XM*]:"9C?1Q146MX[/<3=(ZV<+1^,<!>TS6G_P=[4V/IF^EM/K:)QS_?XAEO_[
XM^3]*/N639._2P?&K]\'O%=YQJ>Z@<7V_UR,VHKWWY]RV]K .4FY4HCU8Y"\5
XMC&D3V[?:)W?ZU]*-G%^F&K7TA?,E?':5O\5?JZ<:9"T8N_DT77J%TJ.QX_4-
XMO-YP5-RTOB4A7AN'Q#&7F_<65D@X. 7LAB74ASC.>U_"+WY<,\M_H?AUR ?E
XMM3&HV>\Y/F"FL[']JRS;]OZ%N93V]?I=+_CD&;L7QAJFS'8]5&8&::&*Q>QJ
XMBH7#%G\'DKZ.1RG[[>PHU9)/Y<&,PQBE[.^0S4K5W:+BV^'NX]<_ESQ;^/0
XM]P0U?X9*,_.6RA56^I=17EIOX77;-F4K;=(9CK/=&&;M6IRCHD7ZL-1NLU-=
XMGG%F@\XC.P.F5#SN,EQL2;1WKUH^A3[^ZS*7K(W=/N9;VCD%4=$WMBHE%D%J
XM%60UV[SKI=4#2\726?*YP#4^G_A_U:#%Q/-)4TO=PNE]T9ZLNV\)OW#=RZ+/
XM45UUTRROXQ-"C&L-R0B5J'+"AFR^YUOP%8^J].B^1KK7?($*\5,!C!9[_AU>
XM.KZ@9252!3:#U 6J>)\W#+,[N[Q+G2^G[J@N?6KY*%[TA<9+E3P\@_'$UD]U
XM-WIIWEOCLPI51#:F9\Y*S*)B@3>8\'@2$NM2O_:\2E@FQT$.6QHED<?DUV^M
XM3CM*M].*V!^T6S];Y;3?[45%N7^6UO%^4HA&3 +[/W.2J75\-.Z[W!DY.3!S
XM43&3>B&Q=^,Y[2?YZ!S)_YO)*>LDG]V)Q WQ(UC<W\!:2NN/17DL&*E<1*\>
XM9]BSR-GW G)FOH"<M4])?@CJ]K!:&Z6([;V1<)LX,SRL7O.M?C#RN<_]J.+G
XM=6G/5TAOE\,=5I.KNUOS>I$33_NY*">POKJ&78ZD7OS9-3E^'\2'2X950X.1
XM=E=$B^;:G&NU>XOT)[DY63_48"1SHF1TH>A$^NFY-D<VRG7(E>T(Z3/=EU'G
XMC>?+QZ(+9G[51U(&_5>Z#T;V)29OS%A*42WN$)U-.<7CY=JHN*OP)_1:J^7I
XML52+LYA@^CB&.[L1<Z:EHSAT:K\PE(4UK;ZFX+30+DF<K1FGH*#@\]5Q33*U
XMPCB)!XZS>(C6*^ Y=C!>8X?P$8<]Z2]0VW&W>YDWT)_-\5B_00_]JE^-:+^7
XM0IDK8C7D)DE1;IE9WDX:!+?[&>$N5([TTTQE5-> IF3^]X81CD.M'NW/1\*Q
XMQQ]\EH/QBK3ZG5$F_T--)R)7I8E8,O_/R<S\8?_"Y/5NC%Q^0F'!#SG*6P"5
XM@K7^4 K'*K89G/W.^?Y/OK3/@-03^WV]@5)NN$P[+P[9*/2[5N:EKKL16R0'
XMFO>"D]<9[75Z?E..:EY>7@AOLA>82OQS+1%YC0GVM5;N.N8B\X#8/^'TYGRO
XMFC^8[NH>\$DP8C^F?D4_H]CSGL0Q;!:-NYG><.72+_IVRYYRU<VGRJR/*=P_
XMZH]?V-TLLOUZ2755 CM4K6;'W$R_'HYO?^O&*><:"'^>%W?Q]8V\]<,[4^]Q
XMJWW89K2;F'H"V&,_&A=MA:0O(_9IB@GG&C?.G5\O8(9G]2AB]HGU7B4)PS$=
XM]2!=,-["'W((5WE;5LM6<(_FQZF-\X)Q^AD>X=$/E\-%O$H1^96WGZ]WQ;MZ
XM_W@S>F^E(MI7UXM!<YP0SH$*AK4$>0I$'.Y3D\MR!;S ='U9KY)-/FGA5-W[
XM!Y,<HZ+*2:]#[OLFT&RG;@4XLAM.O5'YA;%D;H7$Q2JY/]IO<OX$Z*(NS\3E
XMB[N2Y#U5=NL3JX7O$X&5-Y%?J,;1W<2M[FK^]I6(E[4EY*S>M<>1..NGZL9I
XMHRO5<87<WTGXK2AX=GPWDZ"6AR!, E$"(6BC<9=4ZWQ7+LO8-BKU- 39+L5'
XMLJ\N%6E;=X<OUB*28+.#,83P.DLJYB4?WR1*D3&2?(W$V M "9.SQ=^2M7!1
XM@5I;ZA!QG40!XKJD69*"W)-H1C9,?Z:U;"FH,[TKFZ#-1XM8:E<H"QSKG>.1
XM@GD<6EC&OR[[YNAU+3V-&R1!BR1#=3'@(U_,<CMKK%]*K!%P36&^4<.!KO7=
XMI(/JE/$T)-S.!8(G/N=@!'9%U695J_Z2E#U*)B3%[JVFN:4^VS=9W%NXTAL#
XM?LW"4.\"H;.)K5\ND7$=+)#.CWO;$/9HGS%DFP%#8?%=\)&OUE_&F+WM0(I?
XMP:V&!3V*4F'VWM1P-3Y-,YL+?EC>WM"!: 5N "\V%\K21N6VE>?8JE-<=MSA
XMJEM(U "P! :0,J4BHU8!B,JNX+9]</9FO=TAA&Y%,4+$U;7:L&:&3WT+!^H+
XM;*0B+HL*-=_DQXG"X0;B)T'<<48.U[[#X_S&C=,RN=;J$->>PS41Y!)BJJZY
XM/BL7B;+>53]2JUR;#$[BX"QQ4;FL=+F-X6KCK//0\ZC/61^.*%T5C^L2!>O6
XM/,?5H]8(2<V+"KR"5D)L;[; 48%^[%$AF)4T(O-"5 !HRQ"[2]YQXW@O$:'P
XMR2<[4N>E_38W^0V7XLTCDU!_,*"6K50(20V7<&:SU#H_880U+/T%?A8,)2 )
XM+0BXJ.>\5CC]J!W)$% (,PL:(@!1J<3.$H_@5!@+*+IC/A9W32RUL&J2=8KE
XMX!.!4\Z#E?&1B?(:[GC @?C47,9$BU4;9W41=H6&R;1'DGKO!=P0RT&J7"6'
XMQ8U+7W#P1JJ "U2'P\'@&XY*XVR<0R$?=]=Q?7RW_:G# E8S+,B-LE_ DFAF
XM31!Y<$,>4I\[ VXVJ(HSO^5X3'=S/N03ND)J\VPJ ^GSR.<H$Y1*(?P$I<A$
XM049,%62H#IQ"Q&;A0$/XD&6I6*W:.%8A@YX#E?!PN<"^V8X)S?J.O,Q0\%LE
XM/[WK[M23[JWRE%9SK!VJ2*\+3F/>2R,FU;KFF<(7(QM*I#&P(VA4BS4)>F*:
XM/;46"E-NY#M3&D%H$Y(*\J(3.1;,ZTVD0B3X)"<=B(0Q$G"44WT"-3FE,GO5
XMJ0BU-6-S3 >/RQ"0J&.^FUDJWP/QXR3VPNQU(_?B&)T]9-;Z;$J9 >2W1DE0
XM@0%]45^ADF1' Y$5,G[L,%S1X3/-XT:F:7X=/W-&62CY+'/-D3D3<R7-D]PX
XM[#(,_XF!?Q)?V4],I,J?ZH]QGRS<,T:SRY,9JH1B34(-8'H=L[2=)IQV/.;-
XM_61QG^C!,MKKPL#QAO >@J)AX*,4#<^6.1O+,)<K,P5F6_O3&NU;5B,A3$,5
XM\LU[CH32:M .U5E(OS!B%_R")&+BX/ZHF,@*SZ3T*%!HL<ZMQH&) _A02P,$
XM"@ 8 ,!*]%BQH!3>H!@ ( X P !!4%!3+TY424U%+D,- @$2(Q05
XM-C=HB9K;/ 4&$A-$Q?:6]QLJ?*E217!T ;0&"2)X.Z6:M&E1D"U!SBU+%R39
XMMW-!CF7[=NQ:D&;EOFT+,JU;NF7ENKE>Z%5PAK[+@I1J="A(G#9Q8"_M>NA;
XMN'GEICV+)EBC')H29,R<.6.R!%G5;5H[_7MN6KIY0;XU"_)J&&7+UF_>:[AO
XMY=)-^];M'/Q08>!OIV&V9U@VW+O,OU"ZV#?(J77A).\Q4C?<.M$S*%RX;-..
XM,>]SA.94T:9QUG#J[K-RP^#].4#-[,_)UW3OADG>.T'F?5LGJP[K%L3R)L.]
XMZ<AK,<AFONR5]";[XMO;OK'>9O,D4]5KZ/(^^=XV3-_M]BV=N<Z6#?:[: <&
XM-9),G0^2+AINC4:K+H-\99>YO)OF_\4\[SK(VFQ=MBR(*7*!O<3WF^,[NM!5
XMVG-6<G7>'=7I,D$J9CIMF[BV;>*9E#9,M['RT41_6#'A2DWVYAVO.?;<.7?V
XM,&1W&#5]S+PR7LJ[KAP\%=!%%!4\B]1=;7A1MV? ZK5ERH )+H;=;IIB7;1E
XMTS#@RCYI-(RT94'M7URUICI6Q^L[P0=PK!'V'"B9KV:]X;8YPUUDU72$5&2W
XMR[IWV$L7;JQGI$R8,*9A@R!OERRZ$]_8'?M)LA7O(5#NL&3ZXYW*9 IRYM$8
XM=T5@H@U?2,L1>=5L=9VE&B0/H.KP=7>C]3$=2W<LG.API+GH-GW.V\R>U[@]
XM%.J7PC"Q[=1#[J+=&D+K$.HJ5G>'.\!WF=.-Q:?;NFW%$-:NM"649-7O5/6>
XMLVW72\RMH\Q'V38M63>1&8YYD$J0W'6FU'DP<]EKF1]M2L7+/;>.["MS-!UM
XM/ :WC"E3Q[!87I.]:^4?3G_N@/\TL3ED%QN&7U6V.MYR[6#V\%3,ZYGG+:.Z
XM>V//M.D"?;!W(X7[LGC##/;+ZJ!.6<%9H&^<+'/B&-XXPM48JZGJ[*JKX4SE
XM=-] )8Y60_\F#+^%Z4_'KZSJ-"D6OVT:?T$E)"C]*]2G4JGHH6]4)X4&G5ID
XM35J&ON4;OIB3JMK=/$L4>^XSJ[M#YW,\XV3)9/VY+'[M= JS<&51/TDGB24[
XM&:2=!:O9]@*+6BPS.X)\HD^GD'>7(*1@?5.D:IMV,H-Y.\@N-D\8+\912S2;
XMSF1JE0F*#6]"$UK6L;2*?SNLU'7+N,F";(E5]@LIP7>FB*[O"-UDF/(=SWO/
XM9JG-^=<IK6!#3:EF.R?Y=V!78AJM[3M6Y1SM8N+/N]>!SMJ9_^)"P<L=F\K"
XMW#U!FJ &M<[UA %=T&?2D^D.Q=1FSKC'HN()Z(TRA-(!B7>+$@011_*'5+(8
XM U'S7Y4)X'8*/)963U#R/Q>ER"F-^[PL,F>;U&Q,^V\\]V[:W&/6^IO>5G>J
XMPZK)!\!5>>R[(46F,/H)KJ11X.Y3I"W[V%Q!RJ=K)EN)2J?18KITZ9*K7!'C
XM65KY)7M^+9/6Y!5JE1B;+(JVA]VL:C9EF-FJ>)M8LM+/KC&P113.U<TU'P&D
XMERDR[M>JR*@0M)3[.KN,=A%KGT5Y\7:[.5C[(RZ^O@.N]DV996W!#'2_!I@Q
XM60 S[D,KY*S#H/H8M<GF*3_\]U'ZIO%?%$UYCV%J<9F;GE9O&4YK%)>C4U 3
XMK@O7IGZ+EBV*Z$3Y3C"+R_) WA[]>3;Z6FO+B^($99H\PB-_#E[AMHV9(<.M
XMQS3>X%O9*O$$XN'NDV*D&FQEPCYSHH+7?6OZ.H H//H"P5$0KI"RCWF$\:76
XM">*HX8R784*[R17E3Q&E$\B:@!N&O[>,P=^JATX+^$)S&!EZR.W53-IXDU;E
XMIWIQC80!31'ZPWSTZ_!/!Q43$X))]1X<M&2?GJ,@I] W"E.-/O39,6(NC[)=
XM*I55S&\7A")_3ZT2D8R9CG1VWV$481V)$(QCMYN1.%UA,_%U$FNHNUX<<Y4=
XM0<Q.)SN5&(36D3!JX%5J8K2?:- LHM HMK*[06Z91W;92QWLXF/=U3/NPEB#
XM[]G#>ZC??D)V-G:_B9T5.;?*[')82V/;H"73'Z6FWB-$HE@<"GO=>PJBD$"O
XM>S!QX9NM'<I>-X_9Y=>$>%.2F"V#>#%?IS@, CPNN6RQ<O$KZ(09S?C4@>C@
XM.78Z;P,H^TQJ5#HMGK+*(\\>!5J[HA#UH*(838)P:VJE';PJ)(K_E'9"<CB5
XMM8.&"41ZR3F"_#',Q%$\A7QJCFJS91\XQ#!9I1+I,\BB(;&0*;9:FV,1B#P(
XM1T3R!0BA6;/59 *:15&P29_HND^,HGF1U8$E+F[9-0)02P,$"@ 8 3X5I
XM&-ZR%U# !0 \ X D !!4%!3+U!(+D,- @$2(Q05-C=HB9K;/ 4&$A-$
XMQ?:6]U^J;*@0I$J04)&Z+(JU*,B6((=.?0K2:=BV9:>6E6M'>#EOMFG+NJ4C
XM/LP[T;=N01Z!WFZR'V78L63).&^@=MNZK/OV;-VR;.&B=3DV;$J0=^6^I5L6
XM)%VT:>>"',NVS+ 0UG3I)*]L,<S'2'.7($%F?5L79-NP>>*7^D8#O]^"K#N'
XM?*EOD&'=DAE>Z?KI5)!BP](=D[W-IN$_[^M>V[LN'.U%S.>F;0O'^N95T%U6
XM[-NW:ZKUV[9M\E]']_KN(,N>";?@"U_#F^T;K)OM'*@T2)%QUFXY]-K-6.]9
XM,J8(K>@WVWO.L"Z#]]V>L;KKX'L;Z5WF6J [7A?G:2I)]YFDQ]W)(.\P71=:
XM5>7=KZ:GU]3U6S9"&3WCN\L,U772]UP671DX*ID=N=>6U3$VN&B<-*TI]CXU
XMSYP[+![WGTJGVUNL+[S&W_+8(+24+>B(EUIFK,^E@V05',R6+8*#,8\J4NH(
XMYV/GAME:K0&C).0SE5=JE5MW(]WX=QLN7T31D/> W7/KLJ4[MT\Z/(BE1#J@
XMJI@&21J :@8$0D0<LJ=JMFI--PWR0F+K(")X? *>GR#DC=O<LA-(V6#H('6T
XM!P(U@Q1\N1?,UF51!1L&8$BC$JU8N\V^^0]@<KV(:K)S@@*0:00+DA; &YXO
XM<BU'N%V>TG4LO4'R$-9DNM NT?J8CBAG-T8=3E0:3G2;/N<5=[FY\/BO4)]*
XMI0HR)LP:U@/\OT[I]%Y#:TOUSTG^'=3+4SNL'*FYV+IF3*WE;JT9LV;7'?"#
XM?*,<VY9,K-4F%[PJKO#I%&;/_?3C59R/ZBHZ<T_NP*Y0[6?O0&Z3"<_ A_;O
XMZ:ZXQOC/.?7%_Z8SC7I?@SSL$"ZIW?1#"*3/O2,=?HQTJ&G,LNF*E[HG2!-6
XMIKJ[F8W7(:[.MW"^-8I<.@PE,RP)Y.VT*E.F*51>[[%&PJU35Z,4D53+H9U2
XMQ55&BYGYBA'6[WPL'>5QBQVF%H[F-AHQQI?[+)KF[?;MW9 B4^XH1O2*@B[[
XMB,WA-.ETS73K.X[<=/Z0+EURE6.?PCN_9,\OM3M[6S@O2Z;NP&Z1;[9AH-[;
XM4;Q-($FGZ,NPI.68U7E1_$%]+R:L&HO7<*R+<]3Z]:_UM BAFZM;$<IP[8+(
XMIF_Y":"8$,M,;QECF1SS'/XN&I&5*,P'E9"V(NRJ;=.6,V$T!>GQ.&NK[V;#
XMP+V=TV2<)HX7:+>,]E@S,>LHT\ _S!USJ,.L_H'\*U<(C01Y)K>;- D"R')K
XMVJX@0^3ODRU/IJ@L@7@<:"7*$]R+'>88R#Z.7>8)QT5X;$S8IAVQSSQPIE'Y
XM8,<8 P?J.)KL ?YX802D>1$F'KY/&W"_6I3595$ YA0'BG8GLWV& S*(S[/P
XM)G3+T<DK9@ZQ:E*B\(*@KK0LQX"\67+K (KB\56$& 5]UDUH.(A[:A'M+*R8
XMQ*_3F3!O,0QG3&%FX>QR\$U'/[3=Y$6E2LGUHM\EY]3VJ%)Q;^Q.L1<3A^UC
XM&PBG)?O,JIJHH]0BY'ACGQW+@A&U2A7,;S<%)5&A"+R1I9QBAP#/9OVWRJQ1
XM""P70?)$T(J ^UY$;!2 3J ^4< =IK7!;)!\^8)HKGT\1OTVTUL<DD+^*@R]
XMSX#X$;11.+E53L;6772%JC!%[C.:,U>FWLL>CQ+%1_O@FMC.X)Q;8Z3%O@[
XM>P]!'%#-9GRC2*^ZAI&BF*D<1!34%!1\U30OPZ!7'\XF%<YL,K3P=,@QVM4G
XMA/6)8)"Z<AA=05,[]FRN^1F=#?>69>4RLF*K)7ODS%%,#-MP\83<@X9TB8XR
XM1CF$(R.U5.+@(H%PG^,N[IU-Q<=U;*IRXI9Q!QNZTS</-%/6:=!N-X(ER#,M
XMVR)$@F1<7$"4M!JUM>P:WW#4=A81*JZU".2GF8*1/05E8.*#X[Q(1L4'A+TC
XM/H0D(K6!2LM0+@'#'5!+ P0* !@#V<8@8ZWFR$^L& !8$ "P $%0
XM4%,O4$E.1RY##0(!$B,4%38W:(F:VSP%!A(31,7VEO<;*GRI4D5P= &T!@DB
XM>$--ZO0HR)8@T[JE6U:NV[)T09)-&_:LV[=SZ:8="Y+NV[=LR.NA;^'FE9OV
XM+!KOC7)H2I Q<^:,R1)D5;=I[<CON6GIY@7YUBS(JV'^GPW\>J_AOI4#K-^Z
XMG8,?*@S\[33,]@S+AGN7H9<@S;!OD%/KPDG>8]^VA5LG>@:%"Y?-OS+O<Z"5
XM-$T5;1IG#5?NV[-RP[8%H?QFY98M"W).OJ9[-TSRW@DR[]NZ(.*W6Q#+"ZCB
XMN^2U&&0S7_9*>I-]\>UMWUAOLWF2J>HU='F??&\;IN]JJY;WW+)LV6"_BW9@
XM4"/)J'E9;C3<&HU670;YRBYS>3?-_XMYWG60M=FZ;%D04^0">XGO-\=W=*&K
XMM.>LY.J\.ZK398)4S'3:-G%MV\0S*6V8;F/EHXG^L&+"E9KLS3M>:.RY<^[L
XM8<CN,&KZF'EEO)1W73EX*J"+*"IX%JF[QZXIWF[/@-5KRU!GP7'#;B<.!;Y;
XM-@V;A@TB>!H-(VU94/L75ZVICM7Q^D[P 1QKA#T'2N:K66^X;<YP%UDU'2$5
XMV>VR[AWVTH4;ZQDI$R:,:=@@R-LEB^[$-W;'?I)LQ7L(E#LLF?YXIS*9@IQY
XM-,9=(5IHPQ?2<D1>/99MG:4:) ^@ZO!U=Z/U,1U+=RR<Z!:\R^(1S 1Q=J&Y
XM[UBIR4SNZ7[18O%5:#C*E#O"AW;<40VR)TB83'=0Q^E.CRT3Y)/!#NTP"EFI
XMJS!TWCG:H5&OJ?M+Z-L.?8KUBT*K\'+9JW@FI]FI^A7RWM-F-8TL$[N] _6L
XM-D>^17)U"V4,4XR2_S2_GG-%U!W?C0^G:R9\3[$[YB1U@BP!Y 8QOT6R:$JM
XMAY72%%N/0!;UGEE&:5H!B[&?X!Q==^R8T([]^!+]'66,TS=3%<-XRA?X#1D^
XMA':J&6[1RXI=)C,_)]7W[W/A5.K+_-I:M;3U'&OFYH":0E-UGYN?0,QAI:/X
XM$U9%ZC3.F#.9Y&N4-6/*2!J_XQV.=S;H]9H-4BI5*GUKER5ARAAJU@J4JU$J
XMGMKF+T$X%<QE">9&-.^SM,336(UBSN2/,52TQU#;^_ QLFJV<+J .X**!+ZU
XMY5P^7NXNQT_F>)/MTBJ30IGE6]W6;8,J+;<+%ZAQ>@8U(GA54B75*)B:I[;<
XMLV.^KLG5*IC?3N)"RA9##;4O)TDO>\=Q?(?KPKY9+"IUG 4MG8YCJ]\[F>Y(
XM_45^3\,<D[[CUF%?3>XOC^!EU,>QS_U"+]F,RJ _1GN,^ J$?:9\4)=U[E *
XMM]T<:5!9G>)[FS5C=V^56;-F%\:BR= ?LTXS&PIZD+Q2Y/X2G6)=HLL&:!7Y
XM!M&ZH40%GEJ3Z6NG59DTQ5QAS.\T9)OQ\_"OE/?*%<P[!>P:-0^!\G*,UN7-
XM[6Y-VT6L%C&$:F.#Y,MG.V21+[2OOP(\2>0N$[,9@KI2V^FEDW$#%9QQF<4Y
XM]ALB_XNL!';_@FM9%L7JRH1]*DN!#>H<L$'1_A3BA!]A]EDVW&$H]B)( IE(
XM3ZG%EH'G,13FFM_%4\MHJBBQF4BO9N2BCY"V.XK,CF23M2EK.TR>U\I-HM59
XMS2V-V6P0^M^<YR!/5&J?L%3$!*.)$1H.L+=PFJR<;I0VG".,2)A;H)5K- O0
XM'A?K>K\-BR)W2!:]Z2ET!?,?$M1!3)"+V9HRX'%-+"E32 )J5+K.J?N<K9;=
XM["'@26 105:.QUL%UTQX);XAK4="AW\S_2 B_+_,DD*XT+PT-L(E@WM5A(2)
XM^;Q>T8H'(8S\<OKB[3H#=0=G 6JX]",_'U5BT'4N;-"$,,2:])?190V"HP2V
XMR?30 C6:ZBJR*%4D*JI]&*GQ"(=K?70&@2EX&(!9S?$QFB/+:(X\LTLP<&F4
XM1S+EFDNELGR3V';5WL1&KGC@M_UA),SI'.B8*CA%X5*O01)A"Y%\74A'6 T"
XM%" Y$2E4Q9PI<4A&P#AKDR:@(]A_ I BA"$]5.>!!D6T3B ]4+'*!U+^%<YE
XM#0W43U7.K&V31K#W$"(/MP1"<&2"UJ2*V<[R$3+5,#(&V4PN,HRW>1]+45_B
XM:\6B,7FA9]Q!JTO8:)A^ C,&)Q9!:30OO 6<V 2+X[AH=L-%4Y @#,+7HB"X
XM<=W&)0K744/WES3%D9%-]$PFR@_9 S<P3Q,+&;^RAVZKI=B7"J6R)B)18]+"
XMQ9(K\!!;5&,"$D8AQCE<.A294'P,L(,94[I#BF@3!(U/]SDN:C0FIN+FIIH&
XMY^3L="E1I*3&W$'K&'&$EP/ @^4WR\EBP2<.A3PO\A+-GU*%12T45Z<BME96
XM@6,FZ^')'KDM/ NNY["-7*-;,'<*J@J<!%!+ P0* 8 !@#P;%088UA5@,$'
XM #(%@ #@ $%04%,O4$]01%5-4"Y#80I[!P8;!KL,2P,)!PL)"PD'%@<(
XM!@4&!P8%-@<6%PL*!@@*"P4&%00&%P4*" 4&%08*)08(!Q@*!PH("P<+!"4$
XM)00*!@0%% 4)- <&%PD:*_S\_/O[^PP++ LL"SP++"NL# $B(Q05-C=HB9K;
XM/ 4&$B,4Y?:6]S%CQ1(XJE!47%3\__^EO52?RZ6\QI]^B/>7G^O\M6TOT[P8
XM;_:_CF7_:VG?S[_.S?JUW8UEW\(17D9[*=QV52O++QP5_$GTZ)/\GWA<$>YM
XMO99P?Z_]R,]R;^>^BUU:E6O]I6VO;D_Y4_S:=M]_W6M+_+/=P>B'V^??>(Z_
XMW?5K7;:K.2_WOY;_'/68^_;+>_VJA9.\KR7_\WRRI_R$^\>^_/4^3YB?IWVP
XMJ*=UVOV7ROTK>^F&^,_"_,9??K]Y_WF]:_.9CW@CO_'74MEGAS7<E]K;<RSA
XM@I'*^8YP8]Y7N71>MI_H(M ;WN5[:U1$_M.\3IG.]FO7<MRK0&_QGU]ZMN5J
XMS.>S_=*\E?;U1AP+O.]V-1+^>U3O,^%&N0B<&/X(U_/?:3);S7::\I!^B++=
XMOX[[WJZCZG-J5>!93]F?8%CWW:=(?A]+7ORSK,NSY<WQ6->\QN-YFI.;:WI\
XM'.'.R]<Y];WD_Z[DS_^CYWCJ>B>]G/[/CCIQ7\4CRA"3] TFU]$XY_K]0V)=
XMZM>>5PG+Y$B9+LH1]7T5.6)IE$0>DU^_:Z#]3^HF94=,ZG9:?S+)A7F+BL_]
XMJ/YS;SRG=YZPEI[&75A05!R"TK/TGQO+K\O'U(,1REV]%Y"G\.?F_Y#7?T$P
XMTB_9[F7>CL)?J/K&[UN]X-?SZK6(3P0MO[%<3EB>YGHW5 Z]\NT5]0EZ1<6&
XM.V)[;R3<B[/?5>*[?)WX)AVOU>XMTL^<9/]0!9:8L6C68RXW26LG;XUYQ8YI
XM[/.QN&5Y+CC>MWU=_^!=.6^ZD\(/_,1ZUL9UY7^A3JSZ1.*<\X&:2MTEF5:!
XM#>-?GM<%_XH51KW_4_/,*9;XRN7D+=W!?WR\U'YAX2_]-/%NH[(5?OQK[!^[
XMH."GI?U>8K__"X2;<]6;J/\UX2J1'L'\S_L7XFR^U_']I;##AIIR;NO_+/NI
XM_E*>.@RZ9##0$X,!P!R#(0@3SQ%($7CU;2VD=M^N>CZ ^[J"9?-%G-=%X48)
XMSM>Q4F/_!4ZIL= NL=1.8X$=CR5V"48:P42OZ!.,E(L5(HFU0DW-LKK>RPQR
XM_+R/8 23D'(96_L&HM,TMU"0F/R_[,MSJOWJ4LEG\(UQ4=GE<'S7E$'__;%J
XMVLV&;\@] I4K":732F3-UZ_YR*].6]WG?,'2@N^ZXY;F92V,T]ZW+5S^GX^G
XM254#&C?VXX SIGBEK92?1L7.*YWA8X\/91R9:ERHLOXUZ#GI;-HOM<(X\<^U
XM&+G-RPOA+0Y34K U(HSQ+;2T1DD1D[O#-^*X/1H,")*1'L WX@W<-\]KK=SU
XM0J\/\]3O\PDG.>M["Y3E#GT=O!OY03L8[R/Y_5>OQ]6SV[]">N^U0H\K6J]U
XM9>N@W"07^^Z/!74-)70\[-A,X>I.V(=LOA;](85:J=\XB>VW\X/Q&B<?42]2
XMW'&H7=*XW7:<C8-@%A3ET"_)M=T:M^*XGC&CHKPA?+"<28=V(9C02_S^(SSG
XM5=<WV=W"Y4W,91)R'U=##N02[1\2+G:_BJ-$C=NZ+WM#7OB];;[R^_'1&@&G
XMQ6I$S8,8+\M=+L%YY?=:W^./<W_J/QB?:L+EG)_JO?Y"C;<9;KG7 MXO)A-1
XM!]K')!*F&-@:=MB4VT0SYR"BWHO"PF+U!Q. U?H5M-GUE"- ] ?MEMDK=H37
XM,;\$.,,$6. "P=>*PT>W"'!!(A<(TA.=AO$=9R\X?6%(8P,13K%IAL>"&<@V
XMO7;)JY 0V?TWKZH9+ZZOC:H68K#-ZB62]!1QX%F,1?+Y-AR2(,%TWE:'(-$D
XM-@_XF+& 3Q@GMI<XP7@5^.><I\Q<K.%TBK K](?XCQ/"(1PG6IP\A9^/HER_
XMPUL7O/#7 -5K4JKASM(_?HGSJ27,N\ E:JEL^,I;^V<DSW8%IU(QN5(!1Q27
XM'?IPGP)0HP)(<IMUSEK#]5PVYVENJ)"5O-@_!$+ Y#(Q>7*M$AK7Y#C#5U':
XM)*)$O"84L0E$O5*--YJ@CGN^Q#M$$P=\.I5Y&B</;9<-HD+1/'7G 5U4[/.H
XMNYM?,*DW*K]07U).81K/>I-PC^9OE-S[OJJ'OS"?^28W$C?N;V[W8R:HUSV=
XM>#W+5;YM*$6).'J$O9U.MQ,-.XK("K(+5]<.[(F,2^0N#+IB<I71_RC$XO79
XMJHU\*)[&PO@17%EP%+&1)CGIH;K*-%*,+(T?"^:[4<?E$30NKL.%Z;)Q]<=1
XM@\+@Q9FC&D(-ALJW_=E2P^[PUU*8K5KL:7&].=N1M_G>A8F<66E\-$KA"J&?
XM?)(U F"8+++*6S"=X)X=.CC'X.H?*B2GR!?0BS&;HCXYJ*<R%]CCJLU(AP$?
XMQVM22-+JPZ""<^Q@"!4N<'-45(4H7^LJ9!2UZ>9!#76;-9GCM?4QY\Z';BB#
XM5$EEAJ9&JWE,FKGSNI\1Y$.][P*58;A!TUPQXCB!9<#Q;OOSOT^T,!XKK-/1
XM/I]U3FS K^;!L8/Q&ILI6/]J%$HY*.%1;I^@TQ-02P,$"@ 8 :300%S-3
XM<K(A!P :1 P !!4%!3+U)%6$5#+D,- @$2(Q05-C=HB9K;/ 4&$A-$
XMQ?:6]U^J5!$<7=A00? &"2)X2RV*M>A0D"U!RBW;]BW=LFSS@BR+M^S8.LD;
XM9%B059TFQ0IR[-NV;<.Z)>.>#WT+-Z_<M&?1T@6)<FA*D#%SYHS)XGR[36NW
XMK-RY:>GP[[=F05X-P[_ELGW[)CZGBC;M7)!PY;X]*S=L6Q#*;R9=<>LYZ)ON
XMW3#)>R?(O&_KC"MP]>]DN#<=;2UF7RAK$//^\JU<$%27]3:;)YFJ7NO*^^3;
XMU,6NW<!=R$KN9H/]+MJ!08TDX[S*-5TTW!J-4%T&^<PN<WDWS?^+>=YUD+79
XMNFQ9$%/D GN)[S?'=W2AJ[3GK-UXU3NJTV7@*F8Z;5NX;--LFW@6Y W3;8C<
XM8]%$?U@QX2K+ME2;.=YNR\X)\I:O2PTG?M--DZ9F8[R4=UVY<-\ 7411P;-(
XMW3UV3?%V>P:L7EN&.@N.&W:[:8IUT99-PX K^Z31,-*&1+5_<=6:ZE@=K^_$
XM&L&Q1MASH&2^FO6&,U3]W2ZR:CI"*K+;9=T[[*4+-]8S4B9,&-.P09"W2Q;=
XMB6_LCOTDV8KW$"AW6#+]\4YE,@4Y\VB,NZ*ST88OH/6(NWHLVSI)-4@>?E?A
XMJ^Y&ZV,ZPI6#.MP3*ZZ2_H0)5K/(:%$X&=_NM'JT%S1H4V@Q_.%0J]V4L_Y4
XM'IO.&,H-VX](=RP<_#9]SML,&!<8/17I5ZA/I5(%63.FC.MA^_'OL6W)%$Z;
XMW?*ET\0)LNN.ZGTG6I.I+ME8L7>@I]E$J>BN\VV31OGI,S?5%YN-;1R.Y=2^
XMVJTJK8W[W+IP3D<Q'??5UG%?2&?>%N\U:TBWX#6:E;L53Z-8W7Z;AO^8T'*(
XM4.M=A;U8SI3%<@;_(%/L[SUD4-_ECLSF<$'V($KN@*ZV]\H5TP_#N;#BOMQY
XMW#4<9P4NDO6.^\3V1"MGN\/ 3L%GQ<KZW&3R <%MBP^BHP2>F/BC4&*F1 F'
XMEF9='5()U3'4OT_[.*Q&B\(ND6K5K,RL^&BBWG( >7T&%/O.YKY6&Z?46HP0
XM>DSZ 4HQ9LDM?E^"M,YH.KY2T$4?JK++OO'+'43$$2]>2K-FA%!BZ)@P9=A!
XM=0_(^=<ILR\U5++:^U_G*)]=UET)%HVBS.QI,W)HC^H-TL3MA)##^'< 3B2"
XM<KKENG'^&*U==)GQQ;/=#;N%Y33*D"C$#F1[7_.:S:TU"KFM#CK%LQ+R$\(9
XMC=/AW18!JE6(S686_LUZ#O)DR;DGN51?MQGZDK=(%OUQ:#\!T6I:R^@"W8<?
XM2Q*S7=S3"3)$?PV"3R+R!K00Y9YSB"<3_3I!BOAFG/ZY*$9']Q@,=4\ETRJ4
XMD0F.X=YSD4JC0JTJE&G2(<L4U7"*FPG[T$U]37BVHF;00SY/<=O*VD7D#UQ8
XM:Q<UT9C4=\TF==6EB*H.Q?A8;U6%TC2((<S7GH>0;=<Z#,W5<P+Y92:9?@,+
XM?H>JIB.JJT*H#1_"L'<D<(<T-'4D"CQSDNKM[&$H5D>J+V*S5#5,-J^#_R*=
XMOCFI+%DMW+N!_(!A@H=%J;;+\1BY<9FG8!GKM"I3)H2B+E6IFD$:89;MEC6T
XMG>Y-[!9G 1OL<9(%K0MF"8*RX:7 )#-O/:W.]=@Q97H:T[Z(WT&.\3L8XVGF
XMOQBX:X0NPF)VFL$*F*NFX>E,.=WLL<?@K';IDJL<*%-DYQ?Z^;5,K@UPAW==
XM_ (**;QUJXS:>5D869H8505).*.AZ</<$]8JE]>U>/WD7*M3Q6IDMYNGB:@Q
XMC1M&(R51'6>[&/+).R:A(.TH8TA) 3.&]#7_D>C&P):'P$J':2BK["9S6;6>
XM3B&+TVW#>VV_;IGXP=[-AAG,L1\V)$/4++8H$R@96DN$%!PD)8M<TRJVJ<+J
XM'MVB:@$.M^,&;C%]U,LF#$REI'03C(M)^VM:&2;-".1RK5@TBK6YJ+/,,#]F
XM+"3(6,QO%)2FO 1X78);3^0V"Y/BN3M9T25@SJ%Y?X,8B[+X%-*,Z@5V ;&%
XM$S=_83:I%:=CVAD7KP-VA8%85Q7W@C*NE>:4+=6<KB-2195Z"&&KUQFX9M,A
XM3X9,2N@R$T8JR_\6^2W395&I4AQ".2^16Q?7]H6^/1DA&12WQ:VSK07B#>S^
XMP5"OXW4%5"8;5:J- J43<RO+QV_ZE@;F<E:>;X4C"F37+H<9-48I&F5?4S%@
XM;D?&=YU%L$$-\U3>I<*<+9D..G9\?4H!4$;%&C"/6R?5/Z<8E8EZ!M>$(7::
XMH*910_%]=HQ&X2J8WXZ&AS:2B8DL'+)H!='JU*]/@1GMA#RQ,N@>$HN)'!'P
XM%*U$*V/V4_VA31T/>3!&;!ZSMX/8/ ZBE!C"G++O,^C'=DEC^Z1A970D!GH.
XM LS7X;6@I[YYBWW"TJ"4+@07:L26G2?XX1^&A9CT.5[I.@P6%80U,Q$M'-LX
XMT"I'#9@#4$L#! H !@ & ">O0QA%'1?3S @ H7 . 05!04R]40U!)
XM3D9/+D-A"GL'!AL&NPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085


XM! 87!0H(!085!@HE!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\

XM^_O[# LL"RP+/ LL*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;W,6/%$CBJ4%1<
XM5/S__ZU1TJ"7TOW37[_6TOF$^XW]J%W5>7N6:S_^==3VOQ#\ROW7QG;?A]QE
XMM)?";5>ULOS"4<&?1(\^R?^)QQ7AWM9K"??WVH_\+/=V[KO77=HWT7>%.W1N
XM_N]I/\_Y1_>!]G]MWWY[+MU;8R^79I%W7"J=5X/I6?'&E6O]I6VO;D_Y4_R:
XMS_[K7EOBG^T.1C_</O_&<_SMMMW+=C4A_[^6_QSUF+Z_O->O6CC)^UKR/\\G
XM>\H(_;$O?[W/$^;G:1\LZFF=J1?J5/;2#?&?A?F-O_Q^\_[S>M?F,Q_Q1G[C
XMKZ6RSPYKN"^UM^=8P@4CE?,=X<:\K[+XMOU$%]+>\"ZS]!61_S2OD[KCU5_+
XM<:^K6^?YI8>Z;\SGL_W2O)7V]48<"[SO=C42_GM4[S/A1KD(G!C^"-?SWVGR
XM<YULIRD/Z9<MV_WKN._M.JH^I_@%GO64_0F&==]][J6R<YT7_RSK\FQY<SS6
XM-:_Q>)[FY.::'A]'N//R=4Y]+_F_*_GS_^@YGKK>22^G_[.C3MQ7N8 RQ"1]
XM@\EU-,ZY?O^06)?ZM>=5PC(YXMFJ*(=Q=5&.6!HED:>HN%SB^4NM\-/6VX\%
XM69<?E'A>7MXO*"H.0=A9JX>M_XG?-_;Y6'[:GP0CVA*XISG7:O<6Z6=.<GZH
XMP0CF)-::_V.5\G])XX6Y1G@BGHCQ'TMKEY9-\NSR7:I+X8>Y\S_'_ O@+JO6
XM9"78YC?2)1_MBG7Z1+R/NN6%Y8&YZ_MWW7&OVB_\)<<OU#<JF^G/_[%#^(C]
XM"PI\'CPOADO:CU48=M@EP5?EB:7VYFJ\0<_TC5NC\EY-UGS+7\<,Q;Z);ZJU
XM]$U/8X$\'*TB#],;=MBZ3=)^3I;8%?<2)R1*FW0HGM^$.YR-4S'GY3KF.ZPX
XM[A>A)6[U7AJ50H86@=?PCA/"6PAO5L=\+HUSN_>SD.]6+CC1$O2P9XKGQU>N
XM\Y9=Q%Z#3E&Q2_WG ]V[CM,*\M[AE^VIW"=8"V1JA/VJ_\)8.[?W5L#^P!PO
XM ^Q"O/3QE.]\R-0(SSG?)I':=D()?,K5%AC++=N]S-L!/0UZ_B5R;RBA;K1#
XMB@2)$\)'>R_?AK.M6XMM[[_^^'N[T?/Y\'="9[_AF8@:3Y\7IP#S6*MRK_<W
XM7%9J.TW9YSY6'#, 2S/<?[@M0F.9U)KR""2K7A<PN^0NHQK;Y)NG>5X('W&
XM2]A*^<X6?SX2CCW^B/:#L45L,%ZU?OZW[@ MK$5CQK+Z];TQNSD5_PINU=;M
XMP/^JYA'OI1+QJ=>W2.A^9:[Q^U;_$4L)B[ESXWS6E>;P,LGQ<S^J+'=SWY=2
XM95\7K\-AGN4JWVQQFT/L!\OASU:*2/^7B%6</OX)YWU(HY?GC5A_E@=PT'P/
XM2G>]-PQKGB/*)N97Q2=?J?T4%3,XT'[56DXDBQ^JT;7\7$?AAPE%<6_ 1F%P
XM&@$V$IY_8;EL'03L_6']B7-4_1B3!\LKE5U)CT,I;K=1+OD\$2*1?8D=9]SO
XMQX%U-:Z*CY/'Q&UN]Y-@[>-ND4+)&@GPAPH1?8>_B.RSH1V&#8QV[MQ/'=U:
XM)B*- I125+U;PXO(GM<MXG5<B^Z5XR+S8;RJ7".N\Q;!2)^_PKC$M8K;:->5
XMXC;.1J%.JTC7Z*ZA:J^?T;"IF;V1 /L4$HRJ=C0\#7G(]5Q2X.(A6]1*5OT0
XM8VMWK12/E(?@';9"*S<JOE\FX)JEC<?&>_*C"38-X>/EZ![W\L>\87F[6OZ5
XM\-$,#J7G%[%*:4?$I[GLM<;I1.-83JABA\PV.I:E<2PSU,]C^5LEJRTQU(8G
XM;?NR-_;37N%HO]T?),61.P(M6;TI9Z %+";5:#)(<FCA<Y:][=RG=J[ Y%;^
XMR_X4FH?D?P-C2:]7O;"@0$\FOL%6QP6U:)V$+3$"'.4^UUMEP'N/00:!?+CL
XMV?+<NQ=6[X2?_*P)DB>6![M>1\0RU5L G-3R')7<M<G$\L6P6,VPCP,-$;<8
XM[?9>L+/]2GLR;KV1QZ'%;G_ZS?.V$U-[;TNW"<@U>=P.DS]B0OS2NSMH_<'(
XMX8>$P:!B_>Q@!!)L91*!(UGZZ223=KLTQM(J:B.NL,,.%:C-Y3B4/H>'JB(3
XMXO'P31DG]EOV_19'7.;KA\WL+"Y'I,UV&,L 62![!CS2NQ" !TY$%H!$P#=&
XMO]BG:IHM_+W$?C^?H2[@G[J=HQ!]!BW:3=8X<I'U'KPK:Q.=7]]ES>H>*R Q
XM1?><9WG1.H2\@M!3<=TA1ON><*'H&HP;OE'S89UB9AH\CV^N8OQ#_,<6^-%^
XM[#6V0$!:';./B$^0#WKOT"\"1W@\&/VPP[YL='*9GB!&*%$9@>:!]KU:Q8#*
XM8)V&28[*J8S49FH$K$JI&HA>)UP-!JR!A#Q!:]2B?M>83U:\!G&($>-\+(1I
XMWSCXCGI%4$A-%43Y(1 ":!JN&Y"IW6XKR=)%$,Y^9X5JG,3V.XRCO7O=UK=X
XMJ ,SG3(U2-0KMT5^B/,;C=-.'(W>=RCZ,;LIXT&?XJ5B*=,0;:$RTY!$ L(N
XM-3=\K29P][_Q);73'0]'XW;+^(.\I!$2\93=1]#?+6B!Z:^7!W$YZ3J&(1A\
XMC$"$9NH*% ,48GC7'EQ]X%/>/_.>RC!K(K5^<^ JI,.2G_ J??6WKY#>/[G=
XMUKL5N*49ET'ENEWK=W.NED#?>SGO@X/!4L.L)2+)@FMK4-3:%Q=.C_V8DC$_
XMO"G7:5@ I^L0X6.#F@,N\?M\UJTI&Q&&%+[>LOC>Y?R_;-QLTV OR_]HC ?+
XMB\'1^%O:N)UA.0:$]T" 8+:\V^Z]N39FA^^#KCJEIJLUMDWVR;S"\^LT $2O
XMJC,ON<@T"5!+ P0* 8 !@ 1 'L7B(?3+$P8 <10 #@ $%04%,O5$-0
XM4$]25"Y#80I[!P8;!KL,2P,)!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&
XM%00&%P4*" 4&%08*)08(!Q@*!PH("P<+!"4$)00*!@0%% 4)- <&%PD:*_S\
XM_/O[^PP++ LL"SP++"NL# $B(Q05-C=HB9K;/ 4&$B,4Y?:6]\&D?M>NX_[=
XM_O!/_A=X8L;ZQQW_&Y7GJ-[K/_;E-_9RZ;R7^\>*651<5!PS5E'QC_5;HZ2D
XM;J?UI[_\)-Q_:92@_G'<C>7:C_77MKW\(US;,C_G7^_M8OBE?5M6O!?P&>VE
XM<-M5K2R_<%3P)]'3H^<K_.BY"L\D_R<>5X1[6Z\EW-]K/_*SW-NY[W1/$N17
XM?@P/=WM;V[PNM]U6^Z/]G,O-Z\$\ 7R@]W7\I7+_D>^UA[Y#V[>$O/^3[JU\
XMK2OP_]?ZJ]MS+'?]+_M_#KV3^A7AJN.N^Z;QU^5:9I/5Z9W7.Q^C+X7+QWFW
XMNWZMRW8UY^7FNRP5V;_NM27^V>[_K/_<CZK#>RWFKWIWW<_ZK_G]TK;7KB7?
XMX17_=]WP6 .@V>Q?C5OOW>[E8:WK>=3-_[>P7L&ON<M&+\EH7:*ELI<8Z\JS
XM(*SQUWG^YDVYUN8S7_'J]67^4MD=/D;_];9.-UPP4CG?$6[-^S+++]Q/=#'N
XM$:_E>]/-+D_S.O$[V_?=Q[VNW,OS2X]NW9C/QW[/6VE?;\G1\>S\MS4:QO-N
XM5R/AOU#Q4R!>>'.\P;!.L,^]5+Z/)2_^6=;EV?+F>+W4O,93@#G'9?M(O=F'
XM[T?"<;WZJ*HG6(#EIVZS<#]ZRJ7FS=,7-CU>\ ->-P3]@&)[4O3ZA%]__FB;
XM0_H+:_5&,&R@1LV[ZW/^3QF.1HG!<)081O(X+W70ZKTM\#NN?83Z(Z1];\X=
XM_O,?D_E'N);K7L42G^3EYN+Z)S_A_B3;Q/>/]M\\[^;I7Y?]O+F\J_3YP^X3
XMLR6VM)^X<>/^D/^4O#\4G+K%[_.X%PPO7J%*?J=AOIWD04O^FIN7FR5__1GR
XM!R_^_]VH[#&/W>'Y\73^EEOP-%OICTO;S\D2//C*TTA0]6OM]U#T5QQ!/,UA
XM6! /&MQ=ME]^"&_L?D/X@.TD]@:AFSG!_,31H*<3M)]R-S$^Z$&$V=:9V&8^
XM]?WBSI+/U*;D"QR/]E/S;")+_NU^'-]=QQMX@;P*%VWM7"MH7#Q@(,U+N)*B
XM^RI5<_J]#TO[_4"._1$>3?OFB>DJO+W9"[2N>_E6<2?-SXMS1U@FN3GY# ^J
XM_;TT>)/@__IMM*ZW[[->(;TILM9/^+LQ+\+O'SC5$13<2.YYL75_A/[&Y):I
XMM&097FIJ]CR/K+O5TPPG^4@&H>O^A'MS78FJ^NZE\PDGM=[;MF^4=YG _4$W
XMNU2V?:Y6")_40;?M9S8"KK-/H!!&@LEU-,ZY?O^06)?ZM>=5PC(Y4MDORA$-
XMU:[)$?5]%3F"M!=Y!%ZPETG?.@R2JU@O"3\$!39X31Z'WJ7\^I6_7OGU-?]>
XM\^OA\QOA\YOA\Y_P^5<IO['FU\[J&HR*BH->,,)\[_ >_4'5K2#W:Z%3SZI?
XM8Z]CE?(=K!6M?T$P@K]Q-!F,1[Z9G,Q,E--AM]="N;-0CG^I:S;*:62I<P[*
XMR:#?1[DG**?M5+Y++LII:N<=AXGR9IF>M%^I:U:NU/#6V^\FM2*^HR@0L^T)
XMS;4==2QW8Y[07%KC5F*;YBN/T%Q;K="27N_;YK2'<[?Y@]B\<B>CI!:I>]PX
XM$-<X<5V5#0,D92J(,7TP=S72S\[YH08CLI?3B7] Y!-'J^G+.QCD*UCE<)+V
XM)\&(WEGP@^QG/I>_'_E\>GSU;V"][K?82&?<:QO81VP-1F&VX^KU<3DDK>\"
XMRX)JOY;E_E-;!/Q8A\L(6N6\$_AOR\-2$U,BM@<A\OZLW.@Q? Z5/ [=O"2&
XMOT3+^[IP>A4_)?C,OZS5XGCIO*-W$,9+-HL7PN9",(1!X/E8KRJ2LKSBK1ZA
XML132Q_(<HGHO$:OW<6_/6>@3'&&_ZG AM*(CYK@\*H<O6E?-LW/9=1JQ.==J
XM]Q;)JZ%"#49HAV]WXV;4-SO[#D9V#"++_$94RM-^+LTAN.3:' KZJQV<S(MV
XMZGB17!KG+B&?II@(I2O=!.G"5IAFTXM&[3:7%L%.82Q_\4E6@6M3GT.E%P"W
XM%A5K."'Y*Z0[PXON%J[C(=](B/33)]%SC#HH3_.J0O8J9ZA0U!!$LZ4;XL\E
XM45[H=@3;:(>L\5/1B3-^G1^Q[;E]C&.M3L843_U9'O1I>8]PUR-&X.#.)4[6
XM!.J-:+*76>4B\,H\=SDBUN)R-K>)D1V(7UJV8(0QXK/"A++4DE<?3OF]QAPD
XM_9:T8B:/_'4NP2N%UJYK!L%8KX9P9:T^7M;^#ZZ&%+C8?CY9*9W6SJ=J87#M
XM8#*KXCQ*'K:96V-A_4:YOD8*U?2SF1JG_<;)_W%ZW22&=Y@\[H0)\:8R/#_.
XM@.5U^..NRCL.K:7RO*,X^7S7MP_S1AV[/.U4K>?'$;7J\G);=7VZ"K?&;6CN
XM]R(8#2:W'.<:Y$HU%;!QKW4O+5[#>)_406_<"8WRU;7J\'9&?DL[,2FI\[;;
XM/VKWCZ.\XZ'M,DY^O2;D,ZX5FK<U2![THG[U26?4TFB/NWV':Y+<,9 _ZJ!>
XMNU%:;8FSR24E1>(2ALY+=V083.<^T_V&WGI[PS]NCP8#C[??C=I-).JDAM9Z
XM6?:HTT4\-ARWQO_MM3JA?4>S#'V??3I,!&B1^%_Q)T&^1<5Q@6OBW^^.QJU!
XMMX>^R%T_I%&&!>AW4R"\=G%7M+<U'HU'[9\X<%HX;Z8.5V_XM$(C_1)O=DY&
XM+MV/.D!NQXT3>E[V3Y)OB<S<;B>]K\C33^EW(T,\@]Z;W!V^<3 4X58#7LI=
XM"XC=:X4@UX(?4^0BDW;V;$_3%3&/>#T- VXI/HUK&;=6[]/P,?JP_!*EX.?@
XMUKLN;/8>W*AVIT2,SLK6N9_$3X-6>F65&/=2^.G"F.ZEI8 GJL>%8N-$]9-S
XM[1'AO4;*YG6+0PO(-9<QUC[.<L2$Y;7\+$?DL+RZ-\L+Y:;VK$O\=BUWX4=V
XME[KF_VPE*4HOY%SX0^GA5$(KU/\%.F_0TW!Y<."R?TYA01\^3ZC(-(]]8?H=
XMRF?]TXE*UT60?*&>67M/H&DUMX)J]BHL,&A&<X%U<PWF,A"CXK6D640U\4\X
XM@QFC4_N% $55O>8S2,B" O,QU&9H83MRV$4[J[]DAX9,=J%\?S QEC*&0JX!
XMN42]":];.#5>EN<T9A7)K GE<UJ?60B'=[S7<.:DRT:U>Y9+/AR;_!$;U>I-
XMPTE=CQ0WYCL)Y8H1Y94E%N97GK,F>6R7H/RG4\2;E30T[<V O!.GUDP;W_&0
XMTCRL%<RQ2<5ZE)0E0G<8CNQ,9BV-_2T<@W-IU>+<N8G9M4C#=3WJXT3C>(FW
XMVDT^8\?[ 6"Y>3.R/OA7)?:/7^)P@2$*AF$U7X5/( KNDAD8;JDN[>J0X#QK
XMQ8.*ZYM..C%9S?_A]MGR"*UKKDI@_-*D;>>MFO73)FF72X?R]'BEX-/M+N\+
XM%Z'KPD+RZ#&J 0CE:RO>;)QJN$B<MS%O&WP5O*S+Z*)&E<)<PK#ME;D\ ?ED
XM\E"UQUN ?2OY&LV4)H(NXO/Y6GNN<U:,%Z;A.#Z@L!ISE_5=H,BD*'QI4XI+
XMBO^LB9PLS4@HEU ]5-"I(,( A:QSDX0+0_.X+I\76KP-.H]RO.')ZOROPQW'
XM*Z*B-F]X_:W3;<#5A*1SP]=J"(.IN7GJVI26B;O@344B767J1N47AB\0U6B#
XMG5;2)-%@!\GBP4&3 D5I_+0T(S>T'_!041RY79]P*RB&72*-:WBAK? =VN_M
XMBOC=[I+"E_HB\/;X(9LO4M2*=UQMMGJ)C1L7+<##4X5_7)O ".[XU[@L@4PG
XM+J$B3]!SN((%/&[0@VQ1'Y+67WU T?I0EL=#R3]P+EYK?Q"[S& 'Z97W^IQ@
XMI.OA#*?:0U![>Z]R_ZENMY;#X@-MUS+A'\ ,NV8%R3^.YT6NPQAA3%Y('P>)
XMMN,R.#'K,1S)1YL2%31Q03'3HQ_[K F0\.K',/]PR4/+)2ZIX;FH!INTX@_*
XMOD#$']-5 1H@V(8F:!9N653 PXVT 3QH,C58G#<AJU'WZ;@"[57 V\1 ,,0
XMH/D4GA@[T+YNRG>Y>6]^ :#C[]B0J@H&=4VA"Z ;"<<>?][UZFUU@0L@Z9.1
XM'=6NP4P*[1*.(J )2>@ QJ]!\4M0?@VLO@/*WU-[3UAZO08'& 53#,%_J&Q%
XMH?6/1V$*N*"451#TEI#-]TI(J8O&F@?+-]R[P4L$8(B%L0@P*T95X*3E@UVR
XM,5Y#&KP&83T/90THTHL6:FLXS,5 &'G4@%]),R:^D;S&/DV!"L_I@O7"NVN#
XM3N:!<1\R+N/C &$P51M@*DXX1#LUFFTC:0AUY$4\H6!_"LV+H519$ 3^9'J?
XM.F$6&+E!A,=7+@/4A<</"7^%.2)C_KZ9,IF@[/R@OJI2]9$S'H[64A@.32$%
XMJ#^WP"KMGHAP/^1IH@HD^4]^Y*!?Z:1>OOR&D"7 /]V+\+("M[!('V&'C<5J
XM.+YC.!4LZ&5XI?<V @\D;C"L\T1DHC9X. .OLAO"QP%\DP8^Y!?V00J\'*6
XM#A93B5XZGGE>?A\:)^3?IW$M[T%VG:$:?ZT.CK(?TFZE?T(>\F^XM%\T/Q?<
XMJ%5-7/N$KW+YKC/G]\FGFB6 ;U+E":@-K^WGN<>O MU\4EM9LZ(#3V3$="6*
XM"-'AWYZ6O5:3:9 F"@+;"M=; '+E]Y!\"260^E##?NJAQX\JX"OH+8J]Z=95
XMY(SGU<.Q%;_K(N)=6/ +@ ?I)D*!NIC JPZK^AYHC XIM=5CWT1=))D')VF"
XM<>$]",37,9+[SOQ$$V0(G /MYH W=XM["-8?FB]K":,A[N6 X]3%78"1*F#Q
XM$]K0!I3%\F@C2RU69&"59:2O#+SEP PI^=%EY%+M>@Y >RW;!EM8HV24'_@Y
XM+R^O@', R+3@[@?EV(%\0UPBPD@\:+EC44')"_IP<AT<S=4%SY)8A8+L-X$+
XMPLM@; R(<<+9B4S-="0='G@:&J6@(WE]9: /&$![6A:_]1\L#<JVXP;OY9#
XM"_&[G!821.]QBH?\G_=1Q:+L2-KT4(JWYY<T"@*LSJ)!W0%8 NN6V X*.:[
XMN!\)+XS%^"#8%_P0" &/[[*A45TV@8WQ#R+]L-+@=2KA80)SG,1>F+UNY%X<
XMSR2*=X9H4:Y3VM\HA2L,.9'^)-1\X9=N'NVE<+:0 :)@-+J:C0U/*UNAPSN7
XM-J8E7Y>K3#>:789O:S6N,9!C7VMLL##DV7T-.VQ[%$;107O;+^19-6#M5'U1
XM$,3P!OM7H^%+4- !Z84$LS;SM;IA<R%A%'@*$5A-B0U\ZK<[A,E ]Z>&G?,C
XM2R;DE7W>]%I1X67*N?*_,%U/TG<$)(#2@"^-BF=0G&@>N4XQ7(\&D1K#NR(Z
XM!NCWK?H<<(AE0*-.>6YX<IX]>>6+!5:/J ^NJ[>D//"+V%^J^'(4(TLJ"\QI
XMDL LGAB^$4=X!(L>W68V4,R @YG\7F*_SW($% (*TD @+S;(2Q08JTWB)C0K
XM%QZ 177>(VH#*=/?#YO#C8%:6F NJ$,R=PLX+"SH@;>08P,+@+1IP81AEF[8
XM8;-<PO(#I/0 7$ #@+ ?7N@$W )$J!%QSLUE5]9/(G#[ B)T<T'V]?/>"INE
XM_/J5OU[Y]37_7O/KX?,;X?.;X?.?\/E7*;^QYMNS7BU@B!!0&';(FR6'9@Z
XMF/R([3;.U D@(D^2R-7F>_R4I(CM-VJA F" 6XR^S$T-MJRW)H!I(!07P/Y[
XM^AD!%KL@S-.P'D),5R'($]CSI=#E)-_B7 ]/DTPP8RWTQ[ 6L19(B$24"BWT
XM"B(8B%#J@ED,\IK'BD.FPGI%N:3]0HI+V']2\(/Q;W7&O7;RH$5;S'Y6'-5;
XMU=:BXOE8^:1ON0K+#T8B1]3#.X%3F+/9\DA,6(X$&NN]/M!5.MSE,? #+A(V
XMWZNECU0A<OA);FXN-6RD0[$\E?%8PF<*2BH)FIY8>8F@=8$QD=@!9GY*=IIF
XMXYKSG$,P&ZR3W%^69E*!L8/7:WV:YXWZ47QN<))/^.2!M@:C,-O!2-P8ZA+T
XMT'3R</I%S\,*ZZ<C6Z00YE'F*YAI237F'?O:!7!S+PV^*Y.?E)1@1&,U+DR;
XM[XT=PEOL C+/L4/XB!V,X*]Q@=]"R 2V@/!%>MP==G5"9[?PQPGQ93.+C>@*
XMWA"/\S6$+.[0\+GIDM404$K'E6,)D$B<AI&PQB*GX(L%'&[%/15\0 /R&U'9
XM_L@8]B<\5\;>FD#A[!KLC8MD'3CAB4PQ#4$CH;T=:"$?%WIX?)6XHK:Z.W!"
XM(L,/#T$<(G4^&+^*TXGV <O"Q!$ME2AU3IKCG/;I":;2*83ZUJF6@>)SD"2F
XM\AIPVQ=/AY)@4*>$ 1YAE1P7Z@S]%&*H*N1-#*F(7#AAL7%;@5(P%D)8B#GJ
XMBB,T;88+1\@?\5/I0VD?@J05/",,5"C>#_&S[7.UXGNBO$B#"[@Q\*%HN(2Q
XMV$=A]!/LJI-7UD8&(T '4OXLD#1;()D$H(A7IT6R0! /R(DQ7)A]#.C8!.@6
XM=!@BPG(9QM=Q\7*L,#L?2H.("QUG-1-7R15G4(WHI*[DJJ$-AV%,3XELG)[8
XM:Q?ADD(?G;K:#@FCJ;(,!!Z++;@$],@T>(=*698Z);/8;$1*1II/<60VUVTA
XMC!@041QT <@1TZF<Q(60)J+ XTBI)^@!2% (@K6J^(<7QK)03B] '&,,K1#6
XMD5@ F+[&+BJL_(27?ZR=]7F-Q[A8'=+#Z1KQB?!<IP!A2Y4H\Z//U_P?<I$B
XM1<7!Y*JQ$__=_M!=)6 /.J\NC)CQB,Y+)F#R(.P&Y62XX8J^Y@)0^0X01AFH
XM LPM$).P/<@CG\^G4]^KBP[E?!L_Y%I)3]$@BT,X H#>Q\4?%]'C#N\HO2QW
XMN03EJ_FA[?DP_&/P4[(3\E%=4]*DF!2M*]W&,L#F\Q]#(F!&%Q N!*-.ICZ'
XM#D9Z!H&MQ;H:M_4 JS Q+GB!40$#?6B0#I]8C 9XA0EXXSJTD&HPDL)P->@?
XMC!RZ1_T"CD06".GAKK0">7M *3RD( 4[EZ'QF?QHK)+CA/ 1PEL(9T0*\1!G
XM!(VR_TK-[WX<=T,X-L1#/%2A-XX)M(&8K/A,%0_6 W!3<\0#BV,0'#I"D@Z-
XM[HF\C;3C0K-PM:XE!L$5$RZ"Q<&5#547$@EPI-7A85&=&!BE/G_$JV:LT3D8
XMT>L4ZW!] 8SM2/E3M9.PU$Z3QZ&["2IZ")LO3D*<\UJ1\XKOQKC%[C@,$2KD
XM4$SP/!LYCG?BU-072/;#A+@OD$T T@SGK,>$1)MJQBNZVPJN6TJW%UUMIN#(
XMS?Y,L7C#9C^18( E)( I/Y=3^-FJC7R%-P)?U801D:_TB="&>2.%2L*@0.^%
XMF#!](9%%*^$6PV&HKRSH69J6&@6WWTZK]RM H91(;WMU>YSP(QI9A0*]P[N2
XMYH%G.87KS;F*))=69[2*R%G_-)2%RK>LVW4_(]SN2P1NS/+F(B,_3JH;;C&_
XM]L_'/TAU2#MOU0\FSHFZ\+=&2:VWD\QIB ZCMS5G<^^*#+H',_I_7H*Y)-I:
XM9LI[A/)=IKSS\9"<CT5FD0OJUU@Y+IID!KD4@.$;JD0I<"O&.NCQ<7^3$_OC
XMUJ#;^]%$V]RS[:G9J7HSKDAIQ1@APS-JC.0""14W)!:A>B^\6BWPN'\[[9?#
XM1;Q*$9]Z?:-(;' H"0O"['I3NEG_P07_.I/*N>M0R#F2,E>\,(W(QAQ(_%HK
XM-XEN0_1H3A44I&#Y3T%1%+&P4,))C;B7;DVQA(_5:A)>]LLI-2?4 MA;ME15
XM^6!5."Z$P?1IQ+=Y58V\$8MZW-\$O@5H)D(^)9%:&#%4*5;["*Q!@]:5?9]/
XM.(R&U#LI[W58UVSQB,G=X1NQ-X[:?YD.)_9YP@+K!Q:P[$*J!"7>KG+&[Q]!
XMV7S?O$@4Y:U'5+E(OJ)83N?X?J$X;Z$8.TK%.G^2Q7.XR"] )L?,%KF3_%](
XMPD<4QG(77, %X8B+W&,RD3L"CX^+6 3^>+XPFKH0JB3V62W -6(.]EB4 '*"
XMVP0^NC,?!WO<-XX>&"0-G\D.5:,I4YK'Q]9P;.3+5E<X.P9>C ]' %[,_U"K
XM-=4B!X)YYAX$0"E&0Z;C/%1%@0N>R^]@WQFK4L&B2MP-L?2)M&+""+1#8%L9
XM&$=@AI$I1M?2(^A ,*YG.N&Z=.[RSLN[HBA#YA$>7- S%@E,XPBMR@V&YAAQ
XMP^5]UG2M/ EQ.>+1/@V$!%!+ P0* !@"4$KT62RUCT\(& !^$0 #@
XM $%04%,O5$-05$%,2RY##0(!$B,4%38W:(F:VSP%!A(31,7VEO='IG4[EFU=
XMLF5!\IQ+EVS:MR[1^FRH8#I6SO(^0QU^[%LWZ*'3'0LGNDV?\S9CO:0WU:!,
XMEWZ%^E0J59 R9UR/X%6]T])%F>)X[Q'>($$$;[AUZ<Y%*9+KC> M,N4.Z9IN
XM6;QTQ88=N_:LW+=UW9)%";)IT*-%G2!K$-\Q_9KM6SG:^RK2I%2+8*>*;KES
XMQU0OY]0VA;S;EIT[-^P9XJU#''WV+=VW>/.BC,E2)HWVT,?6E2NWK%NZ(-G\
XMO?@*O+[SO,F^O3.O9=!OEC=S$.\9;X-)-*C4I4>E!LUR-1C(6+]DB1-&\:Z1
XM'@RS1?J0GGV4SK!DR7YM._<,]1Z+-JQ<D"KGS&NY8\NR:"ZP'\26B+A!NT8(
XMKWU4')N-7,$/$K J3YBY%G^Z9JRWR)(X7>*<"U(GR))S180OHQG0=A;0MF%!
XM:"7;AGG?*+8=!%)]=@Q4;/GM;NTB%5&'0IR^DX<F"T*,W698ETT+QVK6WM&^
XM49V"CB5;MVW;O'7GEI6[%<2_!MF5!70M)[I!K^>L?CB/-%#[76Q=LV;PDW*<
XMB_KVO<)B22<<_Q79I5CM9CH&7.E5U,O*IQN63KLZWG?&]9<M%/HNH[U[@H2!
XMCGJM?YWZ)O==AJXB_[DRF$(J.ZBW"K04\[!/SY'_+X>IYB9V&WRJ0Z$$1I3Q
XM*$BGX0CKM&TR^V'9@K2CO.?(_91<W02_'-+&G0NQ+^)\B]R9\*4*RM]LV+IL
XMO&Z5+\+SM&:651BCU4N/G1*$%9]@'3S(+7+K+\O"["8+M,MS<:;H/CA5=MX%
XMG_UG2<?POAJ&21M#@S1CI$)\NP6AJ7\CQH*>8^QN-N)5?88X6B3*IGE!4-;E
XMD/K<E_#>\CC=A2IGP7]8ZB_C^VU8%$T0TJO0FH[1L:_2W"F,F1##MBMZ7;G(
XMMPDB#E8HY0U#N#NMRI0)\I6.)\B3,555+O9"KO[:]"G1HE^#3AV:-(EX_)VB
XM_K5,'RYFV]&6H;2YCV:TB<NKHQ"'/+'>[C&)FR#RX[HHK.':UYL'35&WVWC8
XM/-G@E,;%]3GM%6M3^)]6;]DWA#[I-(@FJW*H@-<A#G>O2<R#FV[T,(,W8"[R
XM[5H1V=@C>DR8,/PD4H^'\@8+?>VAOE".NN+1NS['^H1T%Y=-)]!ZD%F8Y0G=
XMOI&F[('/@UG/O4-UJ9P$F<>1%[ON4\2L4+QMM,F89Y\S-AMW)5A&%Q)0-;J%
XMO$6,"]9*$%_R'HNV4&HT,W>2[#$,]2>!GDP1F*I9\(JO7/%I0KI50[(OM@<^
XM15YT$]X)>S(DBE&BO*_-B]EMQW;&!G&/:%AXJ46)G$FA DR;O*J;QWD9,@4R
XMP7>99I\P32%-W6?.2LP'.0.Z[N,T#6+6!/;IHYP@JX UR"AN&6:/Q?FB63*!
XMH^ Z5S4"BAWQ>&*^RC)24!2XFD+$'>$F\(:%93-Z%91@GBGT3((,46GY%LZD
XM<1B5S914H(;$6 E"2;BG&)LI80D")>_2I0NLB#+K&&6F,A4 $@U<J$)!;;A*
XM(BA)3!(T^'!R(CP-H($:%$7('HT]5XLF_&0O+L>VA5,+"4E3:"*BV<,R:3$[
XM&""Z%#8:N$W8D\G<V7K38:AK<TDQFBB22)2>;CKU"$.)C[>QV7CJ+H)@J$L"
XM(C. !ZAT@H- E3I!*.%<T$FC<9WQ'9DB>OKSENF%OS.RM4N7+GUP?)!:'@PB
XMTWT4!OL8LU:8\3)59N"&,@BPP4E/+2A:!1!DCX1,L7( 9&,I2 .YTU364= 4
XM*U]PEQZ5HPFE*\Y!7+\XO%PK%@V;PPX$]40QB 5I:A*$]NZQO&7>"*\35!YB
XM@IR$'$.ZBX&JPZX)(^\C!@;ZDG80WO:.Z'R&"05#Y99[0B!M*LJ8$A_*D-R3
XM8MP'@.,M6UR9[M()&'^#49CHZG=49%'F@$W'7#S9D/<)[SB:R$$4C1N:A;P5
XM'0+&N(GP<&7#T2FTTSY!VJ1Q->Z#A2-*)-BZ]&93%32J,'C"?(LL*2-@>I5@
XM,M+D4)YEIX&<P$D(@(/DO#0']SH$RJ+[J%RD2U>R59BU=YUG<=6NPKD4G"/#
XMRGED),0$S3R5:0(S* 82G)()B<^,@T/NP:I1(3%NM8I2[ZQ/JX(<RO3IE/P?
XM^M2ITZ)#J28Q7MGMUV ^67@R"'X*@CKXIU21%I4*$LKPGA)N\T!*8$2D=5DX
XMH,1(#:?K%$\D;'!K3CU7GJAAH#P!MYG2=6P3D2Y!^#(',8 )P.0Q>BOT5CL*
XM%V1U9:5JE'ULRQCV*276R&RJ14$B*:NIK 5%&.0^=D.1?HU02P,$"@ 8
XMS8DS&K+*H$Y$ P %0< T !!4%!3+TU!2T5&24Q%#0(!$B,4%38W:(F:
XMVSP%!A(31,7VEO='@HP9DV9-EB"OEB63O$$JK<L69$Z9#16.$'Z03LO:3<OV
XMY%R0=LO*G9OVK5N0;\V"# H5ZE201KDV#;JTJ-&D3(OJ! FRCO9V>Q8DU;IR
XMQ;X%.13$\IY+MVQ8,NI3Z%NY;,.Z4=Y#FMFS!!'<FX9=6];,M2X+T@SXJM=A
XMW)?Y?J._J0Z%"G)NV+9PKC\LG.*==@SVDO<Y^T7W'IK4Z5"F58D6[3E6)U>Z
XM8[F<Z[%LZY(MD[VBM]"J1WN"),)-@BC7<\O2!4GW3?1]2[)IJ+68:>55%W'N
XM9=TTC_K=],G]9E*_F=2'SL2\W=URS\S_%.8^MVU8MFR ,BO+L'70?PS7152?
XMJ:O+Y/\8M>,["]XAT_#5)TFBR-I3GNS9\V31$]0["=JZI1VF7A0KE>;*:4U&
XM_LNRH0]+A#ZV17W,5,+^1]S_'*=V_'+EJ'T0X!UDFRD64RVVS%2\;%JZ:+Y7
XMD!?^1-8%%8M=H8UCLLUS)O,^9,NZ99NY%J=.*K2G2Y=<N&ZQ7.] L>Y46.RS
XM+IBO:85>K=F"PC4CIS3#SFD&04O5#(9-XBIA%=MN5H$]Q:ID8A5VJ%&F08].
XMZ4(M7?UT2I MY;9HOB:IYL.=&MP6TSDJ<:GJTWJ62[UN_2^P>\RP:.8I (_Y
XM?*=)>J+]LGCV4(PO)N8</Y NQ[JX?AW(BW/9L ^IUR15NG!F1!XS"U[E/]=%
XMGPNR&R0<P1S]<)T.FV=QNVV9Y6Z&^KXJY<X6SG$>Y[ASX484Z7"4:CK67<[3
XMD=S=%*.^[U@9=BVWV>FW:].6"<83W&^X9.O$9CUWN&C:,Z>:[9KE(8Z8UFC:
XMU&1"N\OXO3124'6;0S_(.T3<]BXKMN[9,X86X-69E%@1C]31CX^Y'OIP?8VY
XMR*Z4+*@LQQ@)QKI($H;.>!U!HO!#PT[IQXR)U/$F5K3!2>K(DPT-I;H=PV!1
XMZ@BCO8<8YSU"'?$ZA$#=AY*=V@\W1JX#CM3^)Z!/2%?T,;13IUBSLT2 VR:6
XMIF,PC1RC:5"T'X0V3.W2.@!'Y(=R7=3'A ZM@W5$?:ANW@BEL?$Z-)M*&[SL
XM:C]&M+4.U8[*A8RF*F102P,$"@ & 8 U8A-&_?NQ8+<$0 _$L L !3
XM3DU0+T%33C$N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+"@8(
XM"@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$"@8$!10%"30'!A<)
XM&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%!A(C%.7VEO<Q8Q45
XM_UA_W%R7[6DLOQWN6)[PO[<OSW+MQ^\>=_X?MWMY$Z=[_?6[=AUW_5_''[2[
XM,0?MGYZ>D_6?H^YQDJGUM"K7^J]RZ;S+][&L__GKW%SOY>^UOU3N_S3W"/<?
XM',N]'=S/<_[V(OF?K;X*_6=A?!#_.M=J5^-2_'_924]_NY><E(?T0CWOT=CK
XMM_/7G-2?Y?E+N)+)OPZX__SRTZCP;8Y?OTLWPD?\6/]^RBAK,]QRKY[GF$7%
XM,6/%$CB %17''>VE<-M5K2Q_$CT]/5_AC8[\_^C9CKMZW3_Y/D_E/O&X(MS;
XM>BWABHKE_Q<XY/@\?\?R77_G7N\MPEW'>I/NK7RMJU45>,\K5]U0__F_O->O
XMFL.'J=8OXWTUY^56[3F[>VV)?[8;Y[E$?U%Q?6_,I%WV<FW?;'ZX7YJWTKXZ
XMW?'74MGGY=?NFZ1:N;>;<E>WQZ^NYQ/^TK9'N.HTN5P5N$A#H?G8EZO!\DNE
XM^]D$LP_JYOD76O6 NXN*F_M2,;SE#HWTZ/\2^RCJ847%ZUPJ[=MR'=7O.BQ?
XM^<RS'$_Y9J^.DA,5W]^\BXH%>]N8IRY2+]=J^&+TI;EY L27</+O\ER'RPO>
XMRS9+K*S1_)^WA:QE+=V-"S">_^.W:UGNXY>V2_55'.?]KUF56(>#]J@_'B2W
XM_[C?_Y''G<ZXUQJ\[1]YT(KR.V_4<6?X6]W?BF(=;G=36D3_S?^#WJB?.!ST
XMHA85N[V#Y*3^X!WZ'>^F_.2W,XK"\<>I@_Z@%=H?]X8_9=#JO>VVX/M[W?^&
XM\?9:OQT%\7O,J>_O#\:I_?>G=#MB/[3?3GI'@W%?[!T..N^H]6'^J-MKOR&:
XMB/=I_A^.D\=1S=\.QR;['I?(4<:M=M?X=R1W.['? ML_I=--_OUNFVA);&/N
XMX;@U1GV3.EV>W<XO*HX<Y6U%4?M(>TSP1ZU!M\?ULO]6A^/G_]X;M3^(^O9&
XMK]S;U7I:W0[43VR#71W_N#-HF[_=Q!;?VQ5]$'_O);V1.W;?8158W@[[3AZS
XM/BGHG:)B]18J;R /0 2N,>&KP835,4.\];9;BA64?QV-<Z[?/\XSKT>YE%>)
XMPW+7M/X/<]![6X-1V^EX-=[H"2:R[E?-ZOH+R6PMG(\K?,$/><A_*$4NAI>"
XM L63D%C#K3'5G.15PG(Y?MRDX7N)>1TPM_()U'@])DRCA]/:2Y3, D\TWKBY
XM>*<NU[AOI]/M%(8OD'M13+7\$4O/MMX1\>S_U,#_/!&MBCF;^,^,5IY#QZRN
XM76<[=G:^FODG]]_TW06LGO=1%?6V,'N4V/ZSZON>R\U[0WPC/.=5Q[<M[RYB
XM'Z_K+WG_.()OG#S3._RUY'LY4[[;O<R;@U'-@S2\FIZE'O@MY5GQ[\T0NAN+
XMH$EI[5E?Y;6T7S!&D;VJO;5K6Q?5YY>>U<^UY!>^>A[Y"Z^\.X_H69=G\S;X
XMN,,O1->"/.\C6:J?T!W=[KUM^Y8G8.@<L5%A=>;9'(45LG1Y&\_W[^1+5$L*
XMSWJ%]"[ -+U9FZ^6*^8=U^2-1?<&H[@Q8_F'3K6'DXTQIPJKXC&I3WBJ?P<C
XMQR<FJM\I;($[[]H":[=)J:WS52\D4]";<#59(&_QK;I@#,H@%NTJOD). ::8
XM@Y@7^ZS^$90KXRW6&HPL7I06D-?NX$,0*;"-'+WWKMK\:-'2?F[XW!RZE3TJ
XM628$%=Z@IZJ*24']6+J_]--$*\&(ID5YH7CMJ]*M?$=@^/G2W?GF^[G!2% 5
XM>*^HTQ_*-,N%<A=ZO04%?EO<USCP1E'>. 5T/RYK,$>,]#7H,=PV%>#OM(0=
XM-LX5;4H3*=)<Z/+F_Y"SC1: 7556M#L-^9$8WGSJ7^NV&/"(+^WI#YOT.L7K
XM%/RP9"(.?!Q#>:M)>)M6R_>Z/M5;^H ,"S:PZLG 6/V(C:R-KMKA-RK_?+;J
XMS9*RVC9P2@Z9IK%5"GP'6K()6CKDY'EZKK5_7(64Z208(<:J1(%QYQ87D,>0
XM]D^)KUSG;3LRG0(>+X2X0R(D?GK!#P'T0HB'('VCQR.R[>+TBOR@AQ#K:&'-
XM^3KKCI9:/"N=);"^-O:#51:8+S?EM%!_3@LXE>)"#!OWB,ZWL4#@=,!Z1D3^
XME[$ (,5+:\9CS&(!_VN$JX,1PH%H]1 %$1R"V1<-"Y(_6L%" 2!M2,$KL@V7
END_OF_FILE
if test 55800 -ne `wc -c <'netramet/pc/NTM.Zip.UU.C'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU.C'\" unpacked with wrong size!


else
PARTS=""
for I in A B C D E ; do
if test -f netramet/pc/NTM.Zip.UU.$I ; then
PARTS="${PARTS}${I}"
fi
if test "${PARTS}" = "ABCDE" ; then
echo shar: Combining \"'netramet/pc/NTM.Zip.UU'\" \(264641 characters\)
cat netramet/pc/NTM.Zip.UU.[A-E] > 'netramet/pc/NTM.Zip.UU'
if test 264641 -ne `wc -c <'netramet/pc/NTM.Zip.UU'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU'\" combined with wrong size!
else
rm netramet/pc/NTM.Zip.UU.[A-E]
echo shar: Uudecoding \"'netramet/pc/NTM.Zip'\" \(192048 characters\)
cat netramet/pc/NTM.Zip.UU | uudecode
if test 192048 -ne `wc -c <'netramet/pc/NeTraMet.zip'`; then
echo shar: \"'netramet/pc/NTM.Zip'\" uudecoded with wrong size!
else
rm netramet/pc/NTM.Zip.UU
fi
fi
fi
done
fi

# end of 'netramet/pc/NTM.Zip.UU.C'
fi
if test -f 'netramet/src/apps/snmpwalk_asy.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpwalk_asy.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpwalk_asy.c'\" \(6401 characters\)
sed "s/^X//" >'netramet/src/apps/snmpwalk_asy.c' <<'END_OF_FILE'
X/*
X * snmpwalk.c - send snmp GETNEXT requests to a network entity, walking a subtree.
X * This uses the asynchronous interface directly.
X *
X */


X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/param.h>
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <ctype.h>
X#include <sys/time.h>
X#include <errno.h>
X
X#include "snmp.h"
X#include "snmp_impl.h"
X#include "asn1.h"
X#include "snmp_api.h"
X#include "snmp_client.h"
X
X#ifndef BSD4_3
X#define BSD4_2
X#endif
X
X#ifndef BSD4_3
X
Xtypedef long fd_mask;
X#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
X
X#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
X#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
X#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
X#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
X#endif
X
Xoid objid_mib[] = {1, 3, 6, 1, 2, 1};
X
Xextern int errno;
Xint snmp_dump_packet = 0;
Xstruct state {
X oid name[MAX_NAME_LEN];
X int name_length;
X oid root[MAX_NAME_LEN];
X int rootlen;
X int running;
X int waiting;
X} state_info;
X
Xsnmp_input(op, session, reqid, pdu, magic)
X int op;
X struct snmp_session *session;
X int reqid;
X struct snmp_pdu *pdu;
X void *magic;
X{
X struct variable_list *vars;
X struct state *state = (struct state *)magic;
X int count;
X
X state->waiting = 0;
X state->running = 0;
X if (op == RECEIVED_MESSAGE && pdu->command == GET_RSP_MSG){
X if (pdu->errstat == SNMP_ERR_NOERROR){
X for(vars = pdu->variables; vars; vars = vars->next_variable){
X if (vars->name_length < state->rootlen || bcmp(state->root, vars->name, state->rootlen * sizeof(oid)))
X continue; /* not part of this subtree */
X print_variable(vars->name, vars->name_length, vars);
X bcopy((char *)vars->name, (char *)state->name, vars->name_length * sizeof(oid));
X state->name_length = vars->name_length;
X state->running = 1; /* restart so we can get next variable */
X }
X } else {
X if (pdu->errstat == SNMP_ERR_NOSUCHNAME){
X printf("End of MIB.\n");
X } else {
X printf("Error in packet.\nReason: %s\n", snmp_errstring(pdu->errstat));
X if (pdu->errstat == SNMP_ERR_NOSUCHNAME){
X printf("The request for this object identifier failed: ");
X for(count = 1, vars = pdu->variables; vars && count != pdu->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X } else if (op == TIMED_OUT){
X /* We don't restart on timeout so main will exit */
X printf("Timed Out\n");
X }
X return 1;
X}


X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X struct snmp_session session, *ss;
X struct snmp_pdu *pdu;
X int arg;
X char *gateway = NULL;
X char *community = NULL;
X int count, numfds, gotroot = 0, block;
X fd_set fdset;
X struct timeval timeout, *tvp;
X struct state *state = &state_info;
X
X init_mib();
X /*
X * usage: snmpwalk gateway-name community-name [object-id]
X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;
X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {
X state->rootlen = MAX_NAME_LEN;
X if (read_objid(argv[arg], state->root, &state->rootlen)){
X gotroot = 1;
X } else {
X printf("Invalid object identifier: %s\n", argv[arg]);
X }
X }
X }
X
X if (gotroot == 0){
X bcopy((char *)objid_mib, (char *)state->root, sizeof(objid_mib));
X state->rootlen = sizeof(objid_mib) / sizeof(oid);
X gotroot = 1;
X }
X
X if (!(gateway && community && gotroot == 1)){
X printf("usage: snmpwalk gateway-name community-name object-identifier\n");
X exit(1);
X }
X
X session.peername = gateway;


X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;

X session.callback = snmp_input;
X session.callback_magic = (void *)state;
X ss = snmp_open(&session);
X if (ss == NULL){


X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X state->running = 1;
X state->waiting = 0;
X bcopy((char *)state->root, (char *)state->name, state->rootlen * sizeof(oid));
X state->name_length = state->rootlen;
X
X while(state->running){
X if (!state->waiting){
X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X
X snmp_add_null_var(pdu, state->name, state->name_length);
X
X if (snmp_send(ss, pdu) == 0){
X snmp_free_pdu(pdu);
X state->running = 0;
X }
X }
X state->waiting = 1;
X
X numfds = 0;
X FD_ZERO(&fdset);
X block = 1;
X tvp = &timeout;
X timerclear(tvp);
X snmp_select_info(&numfds, &fdset, tvp, &block);
X if (block == 1)
X tvp = NULL; /* block without timeout */
X count = select(numfds, &fdset, 0, 0, tvp);
X if (count > 0){
X snmp_read(&fdset);
X } else switch(count){
X case 0:
X snmp_timeout();
X break;
X case -1:
X if (errno == EINTR){
X continue;
X } else {
X perror("select");
X }
X default:
X printf("select returned %d\n", count);
X }
X }
X}
X
END_OF_FILE
if test 6401 -ne `wc -c <'netramet/src/apps/snmpwalk_asy.c'`; then
echo shar: \"'netramet/src/apps/snmpwalk_asy.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpwalk_asy.c'
fi
echo shar: End of archive 4 \(of 25\).
cp /dev/null ark4isdone

J Nevil Brownlee

unread,
Nov 6, 1993, 12:37:56 PM11/6/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 93
Archive-name: netramet/part05
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/snmp/snmpnetstat.1 netramet/pc/NTM.Zip.UU.A
# Wrapped by kent@sparky on Tue Nov 2 18:17:05 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 5 (of 25)."'
if test -f 'netramet/doc/snmp/snmpnetstat.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmpnetstat.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmpnetstat.1'\" \(6613 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmpnetstat.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1989 by Carnegie Mellon University
X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/
X.\" Copyright (c) 1983 The Regents of the University of California.
X.\" All rights reserved.
X.\"
X.\" Redistribution and use in source and binary forms are permitted
X.\" provided that the above copyright notice and this paragraph are
X.\" duplicated in all such forms and that any documentation,
X.\" advertising materials, and other materials related to such
X.\" distribution and use acknowledge that the software was developed
X.\" by the University of California, Berkeley. The name of the
X.\" University may not be used to endorse or promote products derived
X.\" from this software without specific prior written permission.
X.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X.\" WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X.\"
X.\" @(#)netstat.1 6.8 (Berkeley) 9/20/88
X.\"
X.TH SNMPNETSTAT 1 "September 17, 1989"
X.UC 5
X.SH NAME
Xsnmpnetstat \- show network status using SNMP
X.SH SYNOPSIS
X.B snmpnetstat
X.I host community
X[
X.B \-an
X]
X.br
X.B snmpnetstat
X.I host community
X[
X.B \-inrs
X]
X.br
X.B snmpnetstat
X.I host community
X[
X.B \-n
X] [
X.B \-I
X.I interface
X]
X.I interval
X.br
X.B snmpnetstat
X.I host community
X[
X.B \-p
X.I protocol
X]
X.SH DESCRIPTION
XThe
X.I snmpnetstat
Xcommand symbolically displays the values of various network-related
Xinformation retrieved from a remote system using the SNMP protocol.
XThere are a number of output formats,
Xdepending on the options for the information presented.
XThe first form of the command displays a list of active sockets.
XThe second form presents the values of other network-related
Xinformation according to the option selected.
XUsing the third form, with an
X.I interval
Xspecified,
X.I snmpnetstat
Xwill continuously display the information regarding packet
Xtraffic on the configured network interfaces.
XThe fourth form displays statistics about the named protocol.
X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP
XThe options have the following meaning:
X.TP
X.B \-a
XWith the default display,
Xshow the state of all sockets; normally sockets used by
Xserver processes are not shown.
X.TP
X.B \-i
XShow the state of all of the interfaces.
X.TP
X.BI \-I " interface"
XShow information only about this interface;
Xused with an
X.I interval
Xas described below.
X.TP
X.B \-n
XShow network addresses as numbers (normally
X.I snmpnetstat
Xinterprets addresses and attempts to display them
Xsymbolically).
XThis option may be used with any of the display formats.
X.TP
X.BI \-p " protocol"
XShow statistics about
X.IR protocol ,
Xwhich is either a well-known name for a protocol or an alias for it. Some
Xprotocol names and aliases are listed in the file
X.IR /etc/protocols .
XA null response typically means that there are no interesting numbers to
Xreport.
XThe program will complain if
X.I protocol
Xis unknown or if there is no statistics routine for it.
X.TP
X.B \-s
XShow per-protocol statistics.
X.TP
X.B \-r
XShow the routing tables.
XWhen
X.B \-s
Xis also present, show routing statistics instead.
X.PP
XThe default display, for active sockets, shows the local
Xand remote addresses, protocol,
Xand the internal state of the protocol.
XAddress formats are of the form ``host.port'' or ``network.port''
Xif a socket's address specifies a network but no specific host address.
XWhen known the host and network addresses are displayed symbolically
Xaccording to the data bases
X.I /etc/hosts
Xand
X.IR /etc/networks ,
Xrespectively. If a symbolic name for an address is unknown, or if
Xthe
X.B \-n
Xoption is specified, the address is printed numerically, according
Xto the address family.
XFor more information regarding
Xthe Internet ``dot format,''
Xrefer to
X.IR inet (3N).
XUnspecified,
Xor ``wildcard'', addresses and ports appear as ``*''.
X.PP
XThe interface display provides a table of cumulative
Xstatistics regarding packets transferred, errors, and collisions.
XThe network addresses of the interface
Xand the maximum transmission unit (``mtu'') are also displayed.
X.PP
XThe routing table display indicates the available routes and
Xtheir status. Each route consists of a destination host or network
Xand a gateway to use in forwarding packets. The flags field shows
Xthe state of the route (``U'' if ``up''), whether the route
Xis to a gateway (``G''), whether the route was created dynamically
Xby a redirect (``D''), and whether the route has been modified
Xby a redirect (``M''). Direct routes are created for each
Xinterface attached to the local host;
Xthe gateway field for such entries shows the address of the outgoing interface.
XThe interface entry indicates the network
Xinterface utilized for the route.
X.PP
XWhen
X.I snmpnetstat
Xis invoked with an
X.I interval
Xargument, it displays a running count of statistics related to
Xnetwork interfaces. This display consists of a
Xcolumn for the primary interface
Xand a column summarizing
Xinformation for all interfaces.
XThe primary interface may be replaced with another interface with the
X.I \-I
Xoption.
XThe first line of each screen of information contains a summary since the
Xsystem was last rebooted. Subsequent lines of output show values
Xaccumulated over the preceding interval.
X.SH SEE ALSO
Xiostat(1),
Xvmstat(1),
Xhosts(5),
Xnetworks(5),
Xprotocols(5),
Xservices(5),
XRFC1067
X.SH BUGS
XThe notion of errors is ill-defined.
END_OF_FILE
if test 6613 -ne `wc -c <'netramet/doc/snmp/snmpnetstat.1'`; then
echo shar: \"'netramet/doc/snmp/snmpnetstat.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmpnetstat.1'
fi
if test -f 'netramet/pc/NTM.Zip.UU.A' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NTM.Zip.UU.A'\"
else
echo shar: Extracting \"'netramet/pc/NTM.Zip.UU.A'\" \(55773 characters\)
sed "s/^X//" >'netramet/pc/NTM.Zip.UU.A' <<'END_OF_FILE'
Xbegin 664 netramet/pc/NeTraMet.zip
XM4$L#! H !@ & %0%9A?I(:6= B@ $Q\ & 4D5!1$U%80I[!P8;!KL,
XM2P,)!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&%00&%P4*" 4&%08*)08(
XM!Q@*!PH("P<+!"4$)00*!@0%% 4)- <&%PD:*_S\_/O[^PP++ LL"SP++"NL
XM# $B(Q05-C=HB9K;/ 4&$B,4Y?:6]T5%Q0*'_R]PH",_R[V=^_Y;HR2T W%P
XMK,MSGL]R[<?O[<N]8A\(S7#_W:Y&PG^/ZGTFW$Z#'AS+MM?G!NU;Q')PUH>6
XMVS$'2?]:_[$O__FE;:]N3SG_7PO*^_SU7OY><WF7O;&?ZX^O7(W*KSP1;LS#
XMFO=]_'^52^==OH_EKG_E77Z.< B_4;F.>\W[?WR>'.>_S<=Q'=7_')B',9ZQ
XMV@@KUE3KUW]C/XZ[8?S^9?]+Y?X_?M_.^H^_ZC*#5NCO[:#<SW;_QE-ZFN<M
XM^C;V<GD^KH;Q5]CQUU+YM\W^.^C?\KP:TN7?$._#<*]WA'M[3HE?VDOS^6PH
XM[[$?4]GWWAJ7S0,W$P_X]=?V[2>WI\-N&V8MS69;K/M?DJ56X_CBOW2KOIB'
XMU>YGF3?3OCDODO./\&P74%_?GOCFTTBP? ?_U_<C]F)5GY?=ENMN7@U-7VF<
XMM^=N5/:K<?MW]N-F*3C9"AHWW_==7_/Q7\S#YA5N$>O6MOOVJI8H8]&JS7OU
XMS;=?WAT^U*_-YW]*I9.D8M(S#WK;RT:E(%VVFJG K3=$53@LON^UL5U-D$_^
XMJG3W&61U/M'X$9[K=,EB'K;L]2><0_4GB?2N?P/HR\U[\WR?1?76/%(G@[UB
XM'K;NM26>Y^?_</O\)<+AV%?"M^P:4WK65?0IXX52]10...@T.KX+G^Z/^[3F6
XM<#S!).LZETK[YN@'*0[SSZM\B84I=VC[C'G8<ZZ[QR+A=;U1:\3W.AKG7%?,
XM93Q=\^ ]:%.7PGL8RXGUX7(.TX3:YL<9CL]O OV^:C)M8:]?Q*U<',Y?,7XI
XM[OS_D#:T2+#01,A5^[_'>W[,O^G$%]Y7<[O_VM- \+HI]3MI0S]G E^P_BIL
XMX\*%&?;L"?$<AENM=J[+-WMK]3[N33Q;NG>\<+Z5][,M5X/+J_ONS*MV%_.P
XMW@U2'TYIVMVTB2/U%W:(4.W3D?[-.9Q2S]2BU,X#<*!5VRXQ\XKM]L7+DCB5
XM_%N=)-:]W7@.[M-?NXZZ@0^EZ"]^)'1/X56[;=L%^1&NQR*^'^'*W"&UI03>
XMD.M\Y*W[G=?0Z!/ =]Y=GYUJ_DYI;L;TO:QSLWYMY/;[%B[/.8G $S&BP*%M
XM#D564!(1"1$#%\1LCTX.OQ/]% T[W5KM\LZ>X3Q\2':OR);/$\<L<].&Y0-Y
XM1<B=[.(8(?:->>AP)3RW[LY\45:4H.3-TM&*/T'0TW^75?.%W8-F&&.72.X4
XML/H._Y1-8B#6WAZ!W>\:;ETL/U-ZD!0ZYF'F=KG^(#79R8Q(F--H:T_@U^^@
XMO=Z!,;/NSN6G;A7S- Q=Z//"VSP3E?U&4/QBUJ)^3R0MA>W^(*F =D(Y>M4P
XM#Q.,Y73ZDV'ZYSY_LG3H<3]S;*[^;45Y.YBO8"NZ38"501QHN\ATL?!6]O@S
XMS]7]0/AYC8<I]CKR#'KT'?.&LG->)9T($S@45806C%#"'N3^69TW*Z/071\7
XMH[5$H0/E!46O>[>JU:5O:$/EVE5%TZ[KFK%5U<@+7^U<EZS=Y)-YDMKMMI+X
XM*PKV8D($GA 4\T5,T^N\R71((7>X99&13J"X,<R21P.[X]\P.5Q%1*JUEW-O
XM8"A06-Y">3[]+X7ST<W^&OL9]%*Z>6_HKX75'?8][GA<#W-(*$=_*7''QU4N
XMR$-YD=N+H^Z%P:_HKX&^M_JNKQ V]+@F5B/]\A/^*L]E7K_9N5R7?-7+7RO[
XMC"F^>/BEZ*H8 Q8$TJM;I2S*[D2KG:?:N71>IY?-:KY>%><QER$7R7QE,\XG
XM3,ILB6KH0UE " WOXF82&G6_0_!VP\4_X>SWLQH/TE%73R-<[LOV$&6J$CSQ
XMB@$Q>AU^L<R?Q:__K&V#]@H][\5',^XPE25?O<PD9BZQW]HV%,,"X\7[ F^
XM11=:3MK-ZD\X]G@]NWC2*CK7=\TO%GN N<_@PK(IT"ZJ2M5@.6%':>6WPS<,
XM8I IUT8L'+8HCF?7-JI@;_/'KNVH7_8IE5W%7C0;6CW4@R.>]0SH=;@[5-AY
XMW\:[.M\K:DUB:(3G]/B_/*_"!=U4#=WT0W%BX7VI[S9S_2D_U1MZ@8Y%]\NE
XM7-,1I@)M0M<9N!MUI?O%SYI\*RY6'K4Q64,VIPA3*VO+U^N:W/6M[VK>S\J;
XMY.7DY607Z-!!E\-%O$H_#=*6/(9#ZAU"919S+;_7!/([)S,SS^#.RLO-5]ON
XM;E%.#1Z.@<+\ED^:QP"B*A5F\><?/N$^**X+]P&VM%WEATGX\6#7O+:B/Y.<
XMZ'G1,_(F.>GR!]'M9;OB'V"?TX5>5:W\)^;U3"7V1V=A[<MM32*.R*Z0=;W
XM\+ 0,HW_A/LNZ?J7;DFZC?SHJ27S36S5,_4&Y$);#F# 2- .DC;I;Z7G^M0
XM65<%:^%.(H<CEFI9]=@++T \N#J\7.=8MBZ75=B7VBA9UN-J\2ZL@TXC)H&2
XM$T *' 2=0;28/1BKUU\ZK3G70:RZZ.6V B/0R.,6GWO>*"6JD@6=>I-;\Y.4
XM1QA'+?GN#,['<6OM!LYJ.1S[-1_(K0D?DM>EG.*AQ"^P$.%C28M#K=C][&60
XM.#^8N)R6#2B%/(B25L&%J[L(++M4G-#&U.\%0/@:A]0%E>;@2T:,O.C1L3T0
XMT\Q<C.A(N@$1(%#V,[]_3A;123""/(!,HL<0&:[O#W4">4#1#IEM21_RP DY
XMRMGX1.K@I7R%\LN1QQOY- Y\!&\C?M[F9*^7)L>8HHUYI]'$:-' TZB';!8B
XMAE 1SGC=GBEPCUGX/NOY("=V6II(1*A[4^#^@&#:)!<J%,_ XH^46*P*LM>F
XM%RTDSCY.X=D%ID.+XJLKSV*_EK H+61X5EF2G^9:(+9P^(.QKJLKH&3(J85C
XM'MUG&Z)B+OG>##_\0K5&*>9A>E=V5MPFAHK>G,>_5IL'I=Z+'PZ:QHV-VY)0
XM?<,2Z]5Q8F[Y6M^<_&X)I$HC(W0-VA[N=@84>1JMNKJCIIH*6^"3+)Q:X8SO
XM4A3'/D[%*@A&++CDHPC*K$"R$0)")#QX*LDQ.9<5G6DS-?H6;304-25^U__,
XMR^XOM2$E#'P\@<L-Z"E/]&_,F[:@]!Q(OE'\W-^)U4T;OE;7;@JZ.Y/NQ\)8
XM(T[GORI+@PNAE*N25N4^IG4XWMB9'"/@>,%FJO+FR1N4[W;ID*&>)K)P+RY8
XM:U8XX]OF6.5]N3X]=XHB$@BO7MD[O'SW6I0/A1@G4!6UMQ#V4N)7-X]P;?N!
XMX$< 671:+0;IHA4BQ-U[:93R&K5JVA$MA"] 6!5PP>D>YSW;5QJ5FPE_W:[>
XMW+5B,JW)BFB$J-_B^%%A(HL,&!M!J"OL8^4V#V#J\?($2&8LK@LONQFE-"BJ
XM2(P[K?XQ@E3!/!2C45(HM=14V[8D09VP7Q&N^NP-4RM"4&'$)BLB0]MSN]Y
XMVUZJ"A.:T(=N0<'.6M.2B<C%00)LBD&I#ZKWL<[0E#AWY#$A@R@@O: P%HX&
XMVN7; :KV="A3-:>+4AOJ'E0D2(@^-P\HGC+O%9E=%2K4 !?:+*JX^5HFZA$^
XM =S6=[YF6IZBN/:GHE](&K209V07@1TA>[",N6I-6Q<+J+(ODCNJ-(4U$6&#
XMJE17@=-P\(Q8>=!^<"9[+90E'EA,+"'8/8I>3"F/+BA,B)4'O55GS1#]EV.Y
XM6*"-*?!.["CPD:17$@^*UXSI^3*UHQ"?%:&"^;=[H0(?SVY;N[^%6ZVD^CI0
XMZG:)?$.%2U^*R2CKXZQ*OFM3XODOM$0HTRY,0?+YID1'74%F*BE$E!IM3(R.
XMY^,! ($(#&X^A9(9#%TS$"B! ^W12N5 7"">3:!M[[=V\>*Z^(1+BW_7PBH^
XM0>F)\0AAZC'(T,#"@[%&W0"WZ@(7BVS\)3DF80A<MK['']\'AJ^2=T(;EK@=
XMBS>U]P6%P,*(T:X;3&"],IFK5>$JQ!F?G/;BD^5_>5@0EHY!3# 4"2TI:":I
XM#RG'6<DS/(1%F93-V&?3&-G!X^M^\@-9-+ P 9J.Z[(V\"CF>5Y>00 OPYIY
XM6"Y\3_W';LREJQX;,P*/], -_(#<K;!W_9+"V--+/DI4,R#A'('T)_/KCPN!
XM T7F,."-6K);@%(><BA7K"-\"M2JL^ LCXUK N4(8&KYJ"RDGL]($*R/>6A<
XMX+((]'$3]J+C6A$ -(M=M:"_<I\ET0DD*^:H_)U$+B<VY:M:\16&QX:VC):C
XM0@D<!$\#_-@"F)CHA.68F1!*R*@.-)SEPI800W;)*Z.("4!*3 5!\31,W[">
XM"J7LBH!2*) L>IH5#5;C*8'VH8(L1]A!#0\' @'8BK].HY6=L]][LT (- EX
XM3+,$#3=YX (XH//_D:;U$(A9#Q7B74,@Y@KQ*SL&Q/39'\G0D5 A#S8T+]?<
XM3D\=]/5PK'H.VRLOX<9V-7T%90W7P*1>PFCPP$$))8J!D#RGJ0:?D6U&M$%[
XM@EK16\0]9#. 6A?4FYBNHLY,PCXG/WXCBT6T-&7<$S /OKGM3[WQT"M5M00<
XM#QI:-1*(\1GR6/3-N8IHI[S;^A=.ZZ)^8]8+X&1H(ILRMJD^DXW!'RR@)9!$
XM(?$$Q+:+:A,[ZA/V5=6',F6:%WA+AE)VS:Y4-.%YY 8,KH5T&]BVTXQI)Z:*
XM*R5ODSUDTUB\6RHID9#!NLA:@Z4'5BJX-8_9J^PUH*>KV2#9#AMUNV$.7O
XM5[F2!Y!$]X]$'!JJQD!17B /'*[7N^(>SB,EX3 1C"&N*CT?\B6<"VWQ#@&
XM#RP]K%CO"9<:@IDC^.$XM-8@^?T"#7>YZA\D\6M1Y7[K=L8R&)L[NS6(X!<;
XM-VX-RNG,%9"N!T:O]Z%>86P@!U!MBT5.$ ':*QXES8?;K^IYD>#63]>54 C.
XMHW&0C@Z5<:CT 5&K>?L39NRKDA%<^W:P"^O>8RASL2"=XV\'KN J5RT#O(>I
XMF&XV-+?T;%4%(\0-BO;^D?#>4(.A7P&/=?WWA@1\,%QG4L8DA71A %9@L.]Y
XM2+>#2S'NK;<@YWD[C-@J@ZTK/2YLQS:6RPI""6FU%J'%J C!CJ8(QC4_=N2V
XMH%0]VRCL\P4G-!F3F8U%651PG+FLJN"$5*N..>V[&H-85:Z 0/4:HI]DE#"2
XME\\&M^\G$*Q_".U-D$'WDT(4\] ABGGP(3J3V<7#&?3UTY]OW@*Q,Y-J6?'@
XM3*N\^H#KCL/@51O'=W@]F#$/:@WG"W-X>4Y'WKPXT3!U/SZ8M]UF$ZC5C*#-
XMH"6"MWP5 U[]_#E0W_BT "\-B@3C+OH@P>4YA-/-.]RNC0D,P1ZG6/:4D-_*
XM2$AG#R=[%>3R:#=4.OFR"R( 2>P-0B?@&["+>5!1NNU6.P\D_\)@9N+'$C!:
XM?4RE[J_=][FJXO5+P5:6 1JTJ44$C^D:Y1 *#KCE#[MM5L>\9HRZ/2&.R1M,
XM#]BB\&+K=7)W9W]Z$338#0*NEGSCW>B"PDM*S$<:J*!&JIY*I54MKU1I5F9+
XMTE75&&,RDD !"=^O[N2$&(7X)/]/HN?F_JC)+=QX\G.$8X5R.$]/4 1@\(8S
XM\(8!J,N48A4S/W7869\(9LXKT]67!U;G^2'=X1D9..(J2]],#.CG$AF_*2ZA
XM.A\(%"P8,;O7RV)F;BX;#DB?W[@W Y /# (!O2R[@PZ:HJV[7G9,\$RVL;17
XM=VR,&&/H-525_0_;+9@73JF8W^>L[AM:7<9$%?/@Z;BQ$C0<6KS.('?=U1@0
XMHZ2D;J<EKL!<KK@'WQ+AK.8:WOX"]I=2JZGU^<@L/9"Y9G!!I+_@Q@@^<8Q@
XM9"^A,$(("NGDF>R%P:HHVSL4L;@XW#.&UD!@'CQK*/\#>B5</1[D$E=3X3!L
XMQ@*1!CI 7$P;5 3 6IX56"K(^N)#I.F,A9:!AG% 0UI;(&]SJ#9*[F\:PKN$
XM*WD='" T>YTC+)/<'% NF)L>5GG+-%W%DN9-'F940(H>UGE#?T?N"4>Y\0_Q
XMAK\;_CTNN'=AOSY=>(2PA'J7\!F0I@?/_>#83*0D4NE9UU!#_8URG:'!2L#W
XMQP'Z<;[_V5=(;Z>Y3B?'(>(.#C@/>.K,E)HXV' N=E]4K"B!>UV]K1T<<!JJ
XM0JY770@?6";;AIV9WX(L>\'4,8)!R6R,JTP?LKQK>T+&O=6-IV<<]@0E=OBJ
XMX>\-6KD#'-PUGA.P$6OG4XVXUR):\X8%C>9G\<!HENL[ASV]6R[:](%)0",
XM,#2$9=IE%6Y6$!6<A%E%)[\W[K4'>>W0VL;H/M!*<1Y-K"BXI@1631\<O,^R
XM?60FOD)[(9OEO:O[7L<%ZX%6NE9(+3!NWL[ D<26+I<RHP9)S8XKP\<64IV8
XMHP&8/!"?@U<#!B\,9'H LL&:55TCW "$LNN!TZ>.<Q/?0$&54H,2"6D\I:?I
XM"O"B@BP0I$A,#'[,0=+_"4:XGQ--V'$]PD.NK1ZA.8;-JRC(%EN8M2;K)H)O
XM.!!Q^0^P'07^MQ1X, ]3"EM#7)<#CB@^KCWFK]5N*34<PBMW?48%"K\<M%EI
XMYH"#OIK;XP01T(9*;H?Y=I('K9^=-YD8.'"<(PD2HGNX@QK#L1A$S,Q+%NSH
XM^UW),?9LA=6B@YN4 PZB',XQ6WX2N'F>#QFD"C>5@[Y"V.698!Z<2_R\%/]O
XMO?W>V\)T;SB70E;;^V?,-^CX6<95$X]2EI#!,2L,+^(&@#5J3-L_GA$VYUPW
XMX1;SX%&51N"*H6N3)Z98JJ%9YB900'SLX"FK F&_#%45&,M5U0)S6%!2%E%<
XMHF6(C]?[62_"N. U7R8.4XIY\'C.6C6$T"N$4$1*+9QW'HY+#4EXWJB97Y@2
XM. =1< 4;7J1D,38#\\ !LBS[Q8]6$1XXP:F\63_^Z,%8\=F]^R-<CXB<_0A7
XM)H2LS%]*&':4%'#R5!B;W]+<C$GR2=5CNOLSPUW/"^E5RG-0H1-AEY%WQ%<'
XMAUVX5DA!.T#!)'1H[A8AJ5H"Y7$RJ7V ^'[N%3X1"@FNGJVN%ES2SZK#,!8J
XM?KFP'T-$%1@0EQNBFK+(7_*40(0]J,\9G='Y.A?V4)R"XO$771=4WO0 %N,O
XM8U<4QMBFR:B+6<U'Y-4*?#_[JIQ^-+2&:B_2I$F VX#GUQ\JDI#(SV\&/2IY
XM?9+';)I=,0OLUV^Q]ILZ8&7\O;&V;MNVO?96CZ>USN/Q<S#A 4.U6*_-9T'9
XM/B-$=<)JY,1ZD*W>J)N<G)<ZAO? W8T*H7--B &./$['2S">_)QL(O%H(0R:
XM!5,@HX!WR=D6E9XQ[#!Y3;A+U+R4\U#D52'U;SNG,IK3430#!@3[I;'/9UW4
XMKZ?O=2_?\;*52T*H)0MD1=/8+X%7S,.D70Q7#:^WD" ".25OJ0W7D'I-.!'@
XM7,4(72 1(-J3(W4A1 !A7,-WRSJ[8#>JYJ/X1,4W/$8,%.OF7,:HC#$/\W-J
XM[B12B(<X-BN_<;I1\G69),1#/%2JV;G[!>1<8M:8AY5EQ%8-8_6]\E 4F1;<
XM_@ZOY(\5A-TGK\L7V)B');CZ)O0*"5 !=*%6[4W 5=^KUP(/HQQT2L^$$JTV
XM<+RH=?FZEM_4@*1S1%3^O#4HD41I0Y@)@1V,J(-=*U0Q?]F4&,4@5ALS<!:>
XMR78,96'Z&S!PS,-,&"(?K^$!U_(K P;O&DTB@F=G5IV)U/40 @=@&1<\HU#4
XM5<T;I43]76NJ@4VB=) R?&@(3#WHHH()JG-M/F6T>H(V'"0 \B#PVB=TS+F
XM88(F)A/6%%@76VBD+3],0@[@Y8!WVW-S.H*Q(@W[20@'UD"'!+5:;EXD2)5V
XMK]X'%G0-FF >/*P=-<ETZFN9;#-X-<,_)3(M= 6158DNF ?/A:P<'2G)J CT
XMY(AX6H5]]3G&8)ZGB; Y&YP,3>1O;*4*])Z/;-75UK(EKDS#67IO$9P^1/U.
XM"W=$J&+<!9H7\QG]YF Q,!TL!QT4I$!_VO<S%X1/7J-6Q3Q8=\?^5_[C&C'V
XMG%=IJ$;FD.+O4"T,*)7&(&<=@=9MC"L.1K!@[04FS@GN]+#7K#8A\*K)4[_7
XM9R;6KI]@O)KS925'G" M@KM"2H<&!<@4@B;&5_?:@EIE85'TY&/%0H!VVSVP
XMX+@L!251,,C<=87.;HM4#K^BNO=UO>S=&8# V<KU_U/3+^=LA2ZX-?.V\>K0
XMN]'\"Z^\.R\?OMB!!Q8-L<UWPN@F)ZFO9'Y^3KCJ;O/2^M\%R!0!;;!.9DS(
XMEVYN*+58.=%!%.3YXNQX>"T_P#"@;C5 L)@1$>*:$0[I0B?9.PNB0N>"3;;0
XM>HA#VQ.NFLX7-C6[,,SQI*9%=TTD%-5<OFKO%+K N7&T9$#!7850SFT8H>@R
XMP:%PZYU53_-0C>Z*($3#&<#5G*/DG##+IG/!(LSH&7@?S$IJ59LLSF$A4LP5
XMG%S)00E81ZM/H^'G#]O@Z%= ^(E\Y5L0LK*N0AC$PU.40:5VNZTDM@(GW5DO
XM*.CRE.)SF.W)Q[/"$JZ#\U>0N^R-W90,3<O 0:@,92$55P=8EO5,$DP:P!W4
XM4K'+ZLL#,LO"-((U'*B6WHPWA0X!A%@,Q3 P'+M)Q[\4&TP !B(Z7$2UG?:M
XM'JF#I2C5,DD>OZ;"*&\TF!O/Z@)EG-9O+D%Q%]L 6<S9,YS'!X-[@5-AB>H6
XM2*JV2ZFK,.*.[BZ&0G2=[WP,JYS4B#0($AV1WI$'02A1I@LF#[.0@, )AZC?
XMM6?V9-0(K+*"1GC.V=#PS\ZE!Y$\/X70^>!0S:OP@CY>G%@/\!KA-.0+^("S
XM>C)S,0Q0QPY+$#.?(5< 0X \S!<G[BK8^"?<2@587U;EOT.&)4"^K2AO1XRE
XMD/8M) C3N> .$C_.8$H!*(K(ZAA9\V480QOJR7NY8)%%_4A8D"M0J/F(H>G[
XMH?)*[[1YH_)\(0,JHPW.2WFY&O#XO$2K65S3$R H4[%C<QB9#XZ\E68]77>^
XMWJW3 [F" R4$M*\J#']O#PQQRR I[;;-^7[^56)XL1(4UYV;&RUW$BTG)5KJ
XM*%I65K3L['RFT)S,G+SLS+PLQ 0#( A^+)GYJFJ51M*&B?6MV\K0U*%!(!CL
XM6^DB8=1^0GQE!**8!Z\WG(>@+OP"$51D, KXXL 6\^ K"(3KQ.Y"QJ2S$V3*
XMP-!C\V-@SFN<;S)R2\,&& EN7_!X ;WFZUL9\')I^4$%BP>,:B^0ZG@*N#$X
XM_WQ5K8CL@OD8)F@C.&P?\%@#%H$W* 2K1G!0O'K:AGB;@,JW-.0J>C0%L9=[
XMG_756 KEJRI% PGVEI%&[U?AV1*<OZ,D)U'2QX%C-3HD"IRN#2JH*6!-10RD
XM0!< 6<_+>MW!-!-]5Z4^0K & #VJX- 0\"P&D!NR^6HD:'O7+K"I6L)L!$:8
XM8A]<.&<:)?PR]:"7TE5GB\$@VP1&6",X!+,#_"S#ZA[V%'2[R$FEV%)B\[U$
XM.QI>03"6B& QP+NJ2R4A5U.1E4*BL^L+#)+[+,G!L<S ;8A.D,ZJ>O5L4TRX
XM&RR6($DC ?1RA-C%*D-[E607*PM<W;"-$3M@5F58H/'WXVJ$G$OM;H98&\9@
XMUBS$P,ZR4HRI$&*JQ82IAJ,;F+'+*,PL8PH+J,L$_G#$*C@VCA4T3:*!LP:Y
XM 0Q>-78F.::@&.$,Z?9E[G(\'U,*W<#AR(H(/^'&T<_W9$72,'==)^.4D:+F
XMBI"A(!DD4?"J=RIV8_>K-P>TP(-_A5"7>/G$1LK7NTB<(SJ^/]10C4Q0CJ>&
XMLF3$R)L078()BRR"!_B<?(U+;EYN_L_)S#2SSLS/S<]ED("W!%8;&'7"Q@]\
XM!_%X"\ @28)^L:>!X8<S'Z=CM3/:1=<?P,\%)<<R6!7NJZ'.FDX$!$H,$@\T
XMOK"F4D#'GC/G2F'6,N% ,3(*,&9\'@ +B@-22B@AM#_<O3KYB;WLI=B(.K@8
XMOPD.62BW4.5\0-T0$QA%H+J>-FA[O_Q6U/GL)2H$!U.(S:>@6(\:1@G<W8"G
XM=$-H-TX6]9]J[ JQIV947>=J]9;F!M@#:[)23.O.33$F0":(!!RD'Y=EFEUM
XMAN)UM00#3VL8V6-CC]T/MK<?6I@NYO35@>OHJU#Q.O-"1:) <3!O5.Y&@ORR
XM(5(1RG#9G=CULY4/\UV_9=4Q#UX?7>S9O7>!JZVA>6_HK\ @@:#30^HY#[ZM
XM ]VG5#JQ@!@WHX^*RYIP:$!XLS(7I,_&:+X/'XQ?>$-B]PZO@^C7>O(@X*F#
XM8E6QNG#UL=1\8QX\%X^0*65B@T#!+"D]:>B/B -*ZJ2\(W#,7F!%_:U8JBZK
XM&=%B$5/Y(N@"^>H7P$CS;$B-VHMV2QM%-%8KR)8ST] $D'C@2"B6<,**#HWI
XM^-&\,0^>DF%UD:U@CL"AAPM*'W,&JZ #$&]XZJ\P G I0B^XRZ:^AK_*<YE*
XMZ5H"SF^/^>.!&$?OC2B!<Z((Q<0%U&#@K$]/54#X\><2&@3KP8(EMUX5]9N.
XMS$((:^86K5PG1V>A/;Y2P _K^QJZ7%&C[Z/?:Y60&^G59Q8Q)N;XO.ZI;%@
XMX4@&E*Q7 YC/* D>7[&5CVLX\$N-?ORA1$'BVC9#@F;[T)A61$ JX89'TIL0
XMCHUT+GQ0NF4%:+ RP^M[03YUM-V5.0VV-MV-+AB!]7U@M:!!1'3='84Y?/OC
XMT-*0R,!8G68AD<&8DS"XV3J')BU-(F-/""ITL4IPAS=\\[GA]!-I5X4Q17M0
XM',S8H,A&G37@'./-IVX6<:.&3,8/VKZKS.S^-A3T,$0PR&Z9W!EY6Z/[D]MM
XM'3,$5N)A8X%>&YK/*X&5:50!V,.:(-<2S4T&>+FYW4YKAENLX<!:5HS>S$F.
XMXZ%&^YYPW>P;'UMH$!"<9=I N\4P2HI6B0AG1X*S-*O+$"H3!.5KFO.5=Z"D
XMSH(8S.M KS.Y?-X<+V1I7N,1&=C$$KG?22X\E2(TMH+Y(L_82Q!L31$:+(]7
XM2T+]O)25<,G3AV.?*Q9P0%^PB1L2)&J$T+Q3#/DC0 \$ZKXF:.D]<QZ\V7TQ
XM,PIDNVK "]5:-L._2](C(V."@FCJX)2,/S.X#9!&PN"H%+VX2=]J #'>4LQJ
XM",&J"7OC^%5Z4:6N<P/"Z^X+"YI>1]KK1+AU7G8UF#8X:?E5;*4\U')"@L A
XM6B$+TM-7M50VA\')K"Y65C$U4"Y":P+ZKFL$,-(8*I#@H(4AX=?GX)G9+' 7
XM[H?VUD35#<UHL06@/'#*VS@*WBMK5E+0$TPIX(&RBR8\ QY@(41!,$$Z2>HE
XMQ@J RLJ4/5DYM%OC-$"3\>EG:K[DX-K8-Z+M12@C%GL4 2.6X""$2ZP^^+GU
XMZD&) R[*N0MHJ]SD5P0EM?G,0X>&%C@0G2SPHJBNT8I #B,4PNRE0@D[EZ;+
XM/JU+K595'C6P&%U9 ;Q2J<%37J%YVX?S,0^CQ.2XXZT#,8[]3X3G.@F(Q@NW
XMW1V8!+:8A]J/<&5+=E.TH,<RQV$'3&YI;L;4^TNC9.]#CG']WN'OQLR!5P.7
XM+18K@,-M5[7"C(RU%I:GMMTW)2"4W*@HHPR('$KT6K-*@GIK7%[$7D2\6GX/
XMITP\2'$SS0V&'LBN,Y@*Y7!>F9P=V.7<)$[F@T=B)GA(&"N@2Q[M+<R=(XZX
XMTHY8T=3%5"IR).*8AR&.N XJ?M\25$'$]S7JVHN!VP^'"^VN%DBXNGN>E$(Q
XM8&O'L$FJ@L:P85/<"2*8J2#&/ P71BN<6\<N@5\"^ K#2-V)_VG"'=4KFKTC
XM,P[P>D/AH%$1C9<IR"'CL7"@#%OM$-HO/*C<WCZ2V?MD\PL!$<S#T!XB;Z7+
XMLJ/:8/2B@R'_E=5L'O0'E=[R$L4O'BIX=&$H6\OTFO479)C/N:X=Z\I66=A^
XM5^_3KC>DA(H*Y0:C)+RW74 X_+?N,W/9_H$E=#ZAV]L+$0!C%X_-S6(>EM@;
XMA)X'-&V(>@6N0Y&5^PM#D=@F@18)F)))36R/\W\H1O4#YHIY&-3EC\P0UQ_7
XM3_E"?EZ\CW#0,/9SF@<H2,*M1U83/E39T1[3GM!^(\_#<?I!KG4*S+O9POQ?
XM%\%G@I0%;I([R9U.K'GWX?O]/'ZG;LT QUF2_[O*=3[H%),*+B?$IEF];/8"
XMU4#"#:?Y6RC=;@D8 5WW6HV,'"JFT>2ZPQ35A29+KUZVKGMMB:=Q5 <NBCBD
XMO-)MC\ (9S@#RM#7/*7)P4I:![9WR5Q.9']S?E2&_7[LU8)N!>Q,NG%=Z!KY
XMET8OG0L9.G#!6'=K.7FD4(8[; !*,9"4'0*X2EZ@K*V9^V@R2C338[Y[H_88
XM1*+V'K2.'4E2Z*F]PS=N0=;VM(;0WD3M_-;;[[TM9>=..XH10<)H37)S,0^[
XMRPZL4=9\[];RC/OM8;YI';%EF=X39%H>1XJQ&]K5$,E7PRSSZKU%+1&SJ^U.
XM7]-58</H+J0^N9"ZE0R2CVNJN2&UI03H6A<+43XN*Z5YQ*BW!##R>7=]A@64
XM26:V*N YH 3=V-M4&O@0#_$0#W%]#H3CDZ'X<_,XW!UOM*I]@26T1R4+>NZA
XMXSQ@62E,M8X328-#J2O@L:DL:#)&&:J:_TB0#'IHWOM&KA:."VZ;=0 [HG?&
XMMCZ1@4M:JX&.1-;=1?_2@2R#01$="(0(5[)F0]9LK\!F-Q9G8':CW Z:A6_@
XM=]AM8QX4O#1-9@#-O0J6 V_C$(?8 Q<;5@D(]ECL_S"W9UX3]E(-';5J< \:
XM/D/Q8+N^K@C01PM*94# . *HAA%R XNM+^RZG[;^**9X<\"D;&35NJ;T:)M#
XMF@_,*3I^+K^C:9CW9LT^WQW350.KI=U&K1@06*1(#:<<%36T2;.:*[MOI9W4
XM[;3,U4@PP6'>#45^G\,I2W=5<FTS?QJ1K"AH8QY4;3])U8&<,H-44._]2#!!
XM8U-4]\K N5%@'(Z>/LEG>-(1]\;X[YM<X-%^SN7FA62"P]9]7!I:") +D'5D
XM\>+]'K_@T*QSO(-* E]72JTN= 4)'QZ"+.1.L%AEXS;"58>5PTP "T/W@07T
XM8NW;!:/YE.U\:F[Y<@Z/+?P X,#Z.KA\N;XW9E"KY QC<RJ"#,1[(<+E$YJ0
XM,@RR"XHU-.+Z:V8O: ;RN$ :O(&V249_Q6'KPLJB'":%!/76RZ"P#;$\<^Y+
XMX\2$J.H^5($+!M+=D[*N5]Z50E)$6A@&8OWV]VP%8R%FZ:[$".N9J\17E-?R
XM81)"DR*0*,Y-+N&+(J]FT/0!@V8BU5B@EA5 6?DXI[DU_Q4B%?=M=P8V#2;$
XM_-R3G= ]_(WK@C!5J1>WE?&\FBR(;0AWFP9.V(G7ZNWV.FK&E#74;0316&"8
XM!:52J5?,!C&>CL(";DQ_O*Q5<[K_J-L-<_ Z*\^UF@(LZ%/ &1RV#:QZ4=9W
XMJ>G872%=A7 ,9D^1N>KX,+,,./Q,7;L++]:5NC%A34Q5G&[.9FU8AI:MJ8WH
XM@D18FIZ0]5 "DMTWK\4L5-FI'V\)/4#NSQ9"]X5Y4"%F5M\X%F@.EKH@J"RD
XM?;&S@<2.G,4:*C<O%\<\>'].\+'%KF& J^.'S@GFH^AA@]AH=?5\ZKIT*$!7
XMY3@Q]0J5ZJ=B4E8<.6E0NO47H;5X8&">8%@W9I-X8[::HY!B6"@H8<=;HW(M
XMOC4K&1GA+C?UXC'RY:RC.R,/4$L#! H !@ & -P$?QB(F%J<\A@ "5 *
XM 4D5!1$U%+C).1&$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+
XM"@8("@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$"@8$!10%"30'
XM!A<)&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%!A(C%.7VEO>#
XMV@^WS__9[E_:]NKVE,O74?WQUU+Y2^7^D9_EWLY]_ZU1TC^OYO9LX?)EGMI^
XMGGL\UGOLR[T6%9>?<(9OA/M7[K-4F\__'/6O\E8>E-^\[^/OO']9[OJO;7OY
XMW\]V7O?V&WOINM>_UV#?HF*(R;VM?[MK]W8?C1OR'_-SYA45%Q5/O\ O*HYZ
XM'_?VG']4>8ZJW_\"ARK,CID]B1D]IZ"HF.-M5:[USZ6ZZE;9ZW_^N2_P[\FR
XM3Z0]5W_M"G^O^7\O+5?Y"NFS7/NQ4JZ"=Q7]>I6ME_)]+"O;?HX$AK^#GI;N
XMO73>L==_':5YR?M_< #>I6=;KL9\/EO^#[%GW8\_-/Q6G:C;4WG*O[,WKP/F
XM+7SFI;)OG&]2F*WDQ- GN04 G4G>3YK7RF]>"^,^ZB=#57:C3.MYTE."7][7
XMY0SWC[MQKRM>[59O/SLG(U=CX?K+WMA/[PWU_AV@5N^7[7Z6OS1*WZBSNGZ<
XM[G4 OJO.6W98<O)^B-S;SI4?]3U>\VU*K+)=[@IE%V,<?YWG3[CO$E>O]&UK
XMP1SB0RQW!*X?7T'XMMGM+IOFY'5#ZM^,ZQK_E$MN.5-7Z#WN)7[?$IA_8R_;
XMU^>^KN$DGV?;9Z3K^I3OKUC?6$MVWA\#5R[D>]P>#0;(R[K,M=J/?["JR[;7
XMYX;T]^_+V/MRV O?6MZ/I2)\\W[BP0:_OA^QEY]P0/279 SVH_I2WOM9__5+
XMK[^:,VH69<G*^^VK>ERUJ_$HY W*J/'H<?Y=OTVSE"_,OK?#/><N1LF?AO9[
XMWO6J0[3."-(5.OY@^KE@6QKWA>$/5A98,EE:YE5]$\8>QQ[NMT==RJ<$VU]-
XMP9PF\]=PZW*7Q?R!XB?4G@*TTC^1_:J1QRTKK_'76O&\"?UI_Y^/>.%-\E>(
XMN&F(@1?J4M>;(7XME$_\/G/U383^TOJ26R%>?@#SVOE4N?MDK5B[&CA<O^KP
XM707WJV%5BO1QYQAYOQ6N=&-UV_<6 >@%?#]2M9,R<MRR\4N^._V->9/VQ@J=
XM#XN.67_LQ[1\X7C#QUT6&/^%8:MXSM<^5R4_V)2Q9;T7D/"U;]>"ZY8]M/7V
XM>V_+\4%HCN =GBWS^4S0*B_;<ZPU!;_GE7#_E%92OIE'(*H1'*KVSI /<WVO
XM('U2Y3I_F,^FYIV\Y?TPQ]%#M N5'5TNU=P9]'0JMN,;O_ NKSN*/=<LG=V
XMS]<*Z%)^##9I:6.O"V:?!NRZEVZ,M7 ^F);V?'3;^3^U/<SW]+TT\@H$NX"A
XMGO'*U:C0=+_QB_E7GLJ[78T$49NT2_==CYET;UJ]M[U6K6DC)C%SLV).HGO:
XM$;7E-O2#LZCXQ?>_M^K.YKW*>+/YUV'L0"Y<SN498M<>[=S?62:4\6;==?R5
XMZIWDY/Z$Z]R;X>AV3'L[/WYS7(#NK!R?8[MMB.--[F6=FS[N=D[9_67Z/*P1
XM@GY57HE]5Z&=YNO7"]5;:HA5Y]79W+EZH,=2/H1.O'X^] GB"^7IT]P!?TZ,
XMGY :T]"MU@1NS<A5.1LO%N,4D+C(*Q@>*+EYFB>W%Z5J==_K8&[6O9$0D:M+
XM]>:IW;IWOL,4Z*+R_)@@-\8=0C.2/XOC!M#6[[GL']^7<8=#UW(:&Z-X6][6
XMKD+[;IK80\=>(57Z>^.A\ZKHJG<=L<W\C7N8/3>6>;M=QX/8ONY/O8YEE<DZ
XM_C<T7X#H\UZX-[C:JD]5RA)K<X=%U8_K\/L(V7S/=V&!H2F>K]I?5,QBGEK4
XMC:L&NM$FW-Z6?B5OH5?#*>\*>M7P NV'UXV%]4<.(F2_;V2Q%<4%S1]&J4^K
XMU$I\M:U>]-KG?5272K['0^.^+=HQME?SSM,0?=7][(Z7VU/.-I]V7D(3D)30
XM^3^J<@5=+[M5*/KQ^5B4O8F^XZF9&P2GLUFL^P6KSO</H=9#T/$U_\L-6P5V
XM7A%<6T:Q[BY-.:>%?_T%SE>[O=VVM9)S2)6UH:9EU.QS>KE;:M&M(FH"DX%R
XM3B@L^, ]Z\UQ/Z+=73[7*Q75;OB8S^2Q#D5X@C'O*+2A]%H9O;KZ$RA5]F*9
XM-@XJ'_JXZDV0,#[O:'H7BM7(^<C+LS'\:].PZB[ZB#_MP[R%/\_F#'&F_4"_
XM\$\0^A DN07>F+%DM.]&@KM127FF6/!*??]-!.TJ9#2CZE@QW4X=U M-FF4[
XM:6D_M^ W-?T3@A'51/BZWC?8&W]357B:R_NF7"I[N%M!Z[Z_ &X$7,R&IUXK
XMC&/48?1J7PW&\^=S$L)'G/Q?6TIUX;1F_!<$([\CJ=_"^D6[T_B>0LJ6^GG;
XM'7<\K."'A,<BV;CWR*WDKY0#JWQOVV[!ZU&_@#O<PP4N<"TFQX/>OT_8'/G@
XMX3IJ:S@3S4RUZR&U/>ROK$/:+RH-#WH<IQ37H.=9TL 0?BLUCG=F?GBNJ\H#
XM;TAR*ZG]=L(@-C;3>X-K$W$K&O-Q+GDA,DAR-PA-6(JCQ%[OTH)LM2D14WXN
XM?8Y+Y^/.7]*O0;Z[W&MIWT_:!TPTIK\]/U?=2?WR]!M.PI)X//:P*F,[][IM
XM\[B9RTZQC.+'N3]U38_>X6]M:TTSEKLT-V/&/XM"..9:7DJK@G1>2*^2F*#T
XM+-<N22?L9LU8]36+90]BLATKEXQ 5-W9[3^(M[RP&"Q/!8XF@+[]9ZO>P.+U
XM^R1E@8\><Y*-H'2"RE**%DRQ?%Y/P ? *:21LN3SE*#%&VZB\?>(TPN>6[?F
XMY'&8;\J@_RH;DA?"XZ2DMH#:^J5BONR;851G93[A][.&@ZV 6UDIE1L5:!47
XML;)N#>TNS3Y/-U?F92\_T"4E;JY7M*FBF3*PQ70S.]V(PGF/V]A^^/P7MJP,
XM=WUV3QO>BNR(6_%HI1\NH J-3F&D:+'9P7H!>0>L_!)&2J[AW+*QC=J)5?$2
XM[M?OAN!F8,224>71'X'E8\0:ROZQ1['I;K[U8!;+T#/>^W'R,#IO/TP\X_.J
XM5M@$/06T M-+KP)MP97:577YH )+".M<5>,?[H=LEK ^P]GH%3(Y_\]UB:N'
XMKRA*<?YIT5/V B'P9ISK>&%^V;J7#^7ZA>1-M,'>.SRR'X@X;N/.ZM+*3@&E
XM$%2;8D6I4H!P"E#^';6WM&\4,0#6ZHK"\5M!]#YF=?+[+$EE5F;R4"45X?U4
XMK41!CY%C4%]N)&.5*J5'J&+"7I:]J6[0&RA;XN51RJM?=[L=6#>IV0W'U2A%
XMCTX\,H23G\1F>V5I(LKZ7KV5GJ[^7LPDMZ=AWINAE*-QSO7;1#18:X(&[?O4
XM<+((RZIYY17TPN?E 6<IDR5*5&66PD1-/*,?3'R6$C75ERM?3+AQ_&KDT/I]
XMC/0VB;P>K+T0I>MN6#W^R-D_3Y+$><)["FQ_-<NEAN55U-7#GS6+NUG ?C]I
XM*.E9DEDLU>S\.EDS?&I9#59WN\]/&F&;^D-H;Q+2-+$W"-U/UC_ )U2/$3;)
XM<D37;WIZ, 7K4V9PW'A*W.6+T\1PC%A>A1]?*4>X/Z0W-S/J:I?SSM-^MMO4
XM?\/FU! G->A:A1[&JV5-10Q8G(<FC^DMWG&E&-@+/6;5*T@W I8^G%NIYE$W
XM>9CWAOYRM6FG!)K@K?HTPLB/$H')NHIN_?GZ.^V<[!S&J?X:F1M=P#'9<_&%
XMD%)M(H]1 [!MC(V+U;+E%:R+-FB9<J1)3O2\Z!EYDYSTO$GT&*%J:+B.=5U"
XMB^\81%-O-SQ=8@S&WN-S:FGA...@DDTI.6-EJZ>3YTMSDY@[9@R/R?4']I'
XM+5:J[F@_&*R%G$\A!U&8$7,2(Z:*PR:>-KAN%CEHB+CWN/NR0P?T42W66QLH
XM/0-R',8>COI].NRG=E93CJ!4?LX2H9CP(63TM"-E@Y;W17;#RFYX3+T:>+*0
XM6TMP*(^;7< 54$8L%JV1?'$O(G!(2C\7"X7 2Q]HQYDXK.-9]TZC>0ZV;3&%
XMQF]SVH@6PH9+7J-6!3?8&6/;6<>/6;2PVR;(BB&<AK&:$9>U;(!H54X-22ZK
XM'8X.*[0LL_=2=$%=']GC#-Q-PLS&Z[**D:W\,EY-0FUOS1OKIA)6Z<U#[-1-
XMA=4F5\X/O=*[Y,$K70=^:E5^G+2=>X5:KV5+X"A6:62(LS1D9$>$:)7ZS:LV
XMUK>R75=;>1G6%@A2Q>IEE###U[1<UI9<9UO,,)U+%K*RZ3?9J:;#J/B#SS,R
XM7TS@Q5Z)*KDJ*GH1,W&8]),(- _G<HD_8/JAN2HJ#G8QT[0.]KG7&@S^V=4N
XM'B1%)2DJI%)#6HUG8;JBDJO5JD//S8JXJJ/K)L!'"C?N=/OU=:P%8C;.\4U7
XMO>!G)OE!V1R"F=]X%')U R?0P)FX1=0R;1:5W&4+9T\V0%Q*I'3$BN,F-N<B
XM.9P1AG&@M;H3:H7%U^%%8JA/%--2:;-:4Z1CA2QV30FSL)<C=*PD7%G8?!H^
XM)?.4\29O!- 5 >-!;]1YQ^V758:FQ!'&4TFCB'M5APY@*\6[4G/%E<J"!!,^
XM*P%*](AB[T(L4L4\B5V@R^:@2[Y2%L6U@;.Q2S'IN_UK*:2@"W?O=OS':MZP
XM]1W+BJ X_ECTF)T]QD[>QGU,>&\PM &3Y&,-X["14F,B3QFEY(U2HGK8(C49
XMOJF)4?,@6$TC5*KBQN4-)JYI'V<_CZ+QRA(K[\1LXPA8X*""B?UEF!H51A(D
XM6+5F89('"FA,I>)H$FZ2A3Q0\BAI;-#^%@U/[@[?M&%B<A+8D;:OGL?.Y&H(
XMWO<$&[DNP&6!*?V!,KYMY;$>6W_V8U'>\?#MM-D/MB)+FEB?[A#C?I]X"+KG
XMAF 5V4\^WT7+-1@RDH^%P8KP@11F@=$6\?<DVJC,1*9F5E2EJ>0=K.9K\-@*
XM'71B'GBF$C$"\AE>:U-S\9 .9XL6PRA8D87)_U&GG\+B4]%@93@7TI"[_5CE
XMM?JA O>ZK3<:J"1*GHV0!?:4^Z*(B@UHUDTZ1&Y4X/98>#]3G.@"[=9/N<$I
XM#0)+$7TM6W9AV4/UBERA-T7MKVJ4@GV[>M!+Z>:- Q4(BH<=&6R[;G$S"P*
XM Q8C9J:^20:B^[*QK4^+CCZM_N8.;6JG-G^U!47X6Q7^GM0HF--!->%2!%,!
XM[;7R-)M\8GEL6ZRDT@C@;OJ#M^K-R_;4T*7SY1DY=D.0<7I#4?-10)D.!A=C
XM10?&7QD7$A(FI3K>B6HF8<P,J\?2D'.S^*E*P@HD+SZ6\@+$1KGL""<<&ET9
XM/;MMM]N8OOONRH#VHFL+""H9[64':$>@3(4Q1?RR\K5M8:WMQ;@-(Y<$7=G7
XM+5KR[ *WJBZ4SW97$8 J=SY*JN:BL(R\)B>V$N']0_MOZ*-^8GL0QINO#\->
XM8NF)HD*JEX9\? SE=$IF5&-S!UP+OH!=S1WIIT^BY_Q019!$YX'#Q^?)G/ <
XMJ=TCY/A2#W4X3!$NH>0G2>$/.:,C[KE>;+[X+@/C=[B8W+W$?K^ %1[:&4Y>
XM1_B OLA>+:MVZ&I1CV.(@)L16_BS;1&8*X*8P$2E+9=$ 0:\>S'BV*J=3RUF
XMKQ5Z7%5@JP3S%!@:X3?H%9:B^B_NOR\%L0++ZCB 1X4"!P:!H78 OQXLLBJ6
XM+W(\O0P8,85@AP[FD4J0+.15-+ NKGY0T'K-+*F4O!V;"9M!4Q";BEP8>U9H
XML.I@E*VU;@6B4FZX+_A0@<Z9/LO@LC#0=# \HH,QSX)M42X?6:=VQS+>'@LW
XMTIC8_^.^65BLZ# A18EB17U#ZE[906JU4[O=5A*2JW=X)L8,U"K9Q:?TJ)X@
XM0C%PI'V;>H[(0RE%>9W+Y,BJT<42/,#$,/%49!LZZF"B#:;K2&",@X9R,)%L
XM(XXDI+9H=&+ 174=%5UQLX*"Q6B1?&B!V%\DBF;(Z9CW&;.F;^<S5"/"*8TX
XMBA(F9<"P#F*ORW6ALWRXR_VQ%&(MXN'\F9<I.2-31@%]W_E1(33W4_19(;=#
XMW'04RHP0[@A,MNFT:)I&A:L@F[+X(>#3L@JLU%0?BC<<I]'5FC*B8KN_[<3>
XM$-LKY;W@[2CVS=W/K NY[G)@+S)_NZ<$I49CKD0E6+J]AS1V?%9W5OE*F2M!
XM:NOENA^N,R=,XN&2Q:%4W@NL4:W'Z"-O6';6V4Y:6;/6!Y1U51.$#2F%*CNI
XMVVD5Y/][:>1)^,HIZKE+HTL,H8W*?"2L HJ07]MNPL)>\F7OT*>1J90Y:U&S
XMSSEE8D73BQ $U;X!)9M)TRM5HF3')EERIA15=OBNZE9;O?;,YR()X8H&42!4
XMW[(E"FI=H?) R,\W'01?=&X1F5\W,*+<0@PA0/KT"$%ZXZAR8/M9"]AKK>;
XMD4"LZV"&!T'PHFC'/1GRL;9LGF@##.3UW9Q4079&OL"A<G'S1' =^9PV@)N*
XMW1,X[+KR;-[%M:YBAOFQG/]#")%?_0H4'.WM\?G^9J'H$;OM^Y#:0YT/?83>
XMXT0P +1+NQ"L,1'Z('L*F)?"&:7XW2HSEX]*$.T*,GJ@9;4X06RA:VBBLTN,
XMQW%P=S>_<O#L!.)P"G!:QP4N%9#!IY@_YDK4>&'!+R1WOX\**41M_)LPA NX
XM0=3Y_41T SK?XJZ;:HOF$^%Z6"&)!Y7IW=*\S7U?A.#*A$,?*$*2MKLCP-A,
XMZX5J!S])5LR<&(0M4HNAL&K'"W^$G0CP6!BHZ@L;JU[*1WIXU7J8W%: M!UC
XM?D"C<5]AB/4#"(FR+$<.'\A".&\>*X@;4U[1B&7D%(8K%X=D1.]2R1(BR#"E
XMY%%3_$2B\?M$0(*2HVJ#'):X2GSFA(H)EW5B/^HP]0J"V\?'B%J(SY,"BA_H
XMQ7$.SP\17J1J/JY*@?B- $^RX:C/6./A$ZI,JFFP5Q[A.6= )\I<T411)<DL
XM^.!SG/]SV;6(L49J/Y>C4DW8F K>-8BU:$L^-Z6@1"Q*0"L=Z-05"K,'#+,6
XMDC# %)BZ'T!7:DMM@A<':($#4C53H57;<2PN=J_+Z.@$55S+]^44(:@B!*NP
XM\4Z,TIT+34ZODDZD)(U<O9G5S(BZB0U-+:9ILV__T<3QJLA>D&61.05]T EF
XM!ND>S@K&4*^N5G>OT,)@26H.HD2& C#RU;$"(1 2C/FD>-]:(XJI)4+Y&W5A
XMF"J !L>R< I @F$1]/0@3(?PQETKUZ+PUH:(N(Q$)E/0BX#30F+'%EP*W7C:
XMSPV?GIL[$7AA#:4 B< KH^."Q/ $XS&HSAD"A42YT!85+65D(09)),W&E K"
XMAI.9_0?C-82/$-[B&!%Q7[?W$E&%\E,H,94P<I407V)[X6O0(XZHA:V.,T<8
XM<80VQ]O!1*)<V(T81^*ABX-I=X^QY$TU!$)NPV:X?C\CX)J%RMW:6*(YOYBK
XM!RBDVFN!B*K;XQ@((JD[/% >2USL CO..X);6'9KFL>?&K'6Q_)P&#@3\8O)
XM+L/7<6OZW#A#<%YL5/M/F12B)<CB28AH7,$IB*\(86J2RIP1":X[A-[82CS"
XM#21RE"K<""+DS(_=<SN&*SN<L.C;U+;?9@NB5@AYFMW\@(<;NE;!>3'T!T9E
XM7R#- %OZ'.$X"U?B,!W<Z\T&LOV#5ZJ'5^@5&6!Y^OHQ=D8)^6$\8<3ADJ58
XMK9P>=#X!RN4=6.[C"U)@1I0]]"*8@" D)-:E?NUYE;!8CD DCW*!]*#4O6@"
XM6JYTE\U*9G=_S+;D?;J(@#?T=/L#4(&#NY"-P@ X J>Z%,L604"HY]MHQ8G5
XM#3O]=0DEM2M>#H2N"^&*?94@?"@$PZ*+5:8GXKQ_M7(%P(&,_(AC:ECU=L7;
XM1Q86H!VJ1\@*VC&NB "_H(!3T@B6<W#;4SZU^$E1)[8.2A'QV4H108)*BT 4
XM.PZGX0<)?G/1]M9/B>L2%8OZP1B+H)-"K,_&N'81HY0E7H^WI8918QSH&1\*
XMU\?4K"MBVB)2ML/-'3$HI>#8QPVFO>9C2^7'Q%W+"<XG:,R1:L+(#:A_L]F^
XM1=B-9U K*#:<.%Q8'18<^$.(6#V 6JLA(1K:CKY! 7,XY*"J_5X?P/*1@]-Y
XM8 _.5M&#A%!;NK& BNRNI)^/[NH?=Y)4W-'=5T6X-#=P@/W$51E3 5/[8=1P
XM90(.K]UY6^7J,YP!1;"*L5MTP;5J[ [@K(QC>SC[(DHH#%QX%6*K=\<[D:2?
XMLT"[<A4#!B=UGAM(X%GUGW ( F6((:_K-Y[=AYG[7$+IV3L/![2IBDDK>1*V
XMTO-,(;*5L[-N-QPQ<.29%Q1_;I8B&'S4KJK':I-+N/:&*66GI@!9I18@6'NS
XM L)^9H/KA2%F"5<2?7%(4FI\=71HC1<3MGCH#ID(L7C<KKL\-> M239$@3;$
XM \+4N5( *PUAV%:.6J3MH-L!66IP@_-:"Z<H0& L?&XHHV\D7UW92C+M>%!5
XMG!LNY VYU^OGFE(%]*1A0!23U2651( D-NK/92FS>@;+M)H9>MS.[Z,=ED=G
XME<52/4,$.&A%4$L#! H & &MTJA8Z*"687 , %(% + 1$5614Q/
XM4"Y$3T,- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]Z^693OV;=NR(,F6M9.\W\(M
XM*W<NRX8*@G=1MV.:]]RR9$&FG0N2+AKO/?=M7;ECC#?=MR"OAJ5#OK87\J8Z
XM%"I+D&%!LDTK5FY8N7E!WD6;=BQ:D'#EOK6;9EG/Z9XOJQ(9WDFA,*MC+8=Z
XMCZ$^_\^#;.7S#/UN.]<E"&>=QEN%F[DADRS$)\BQ8=U$:SG;2YXMBV.!=KMU
XM6W8LW33&JWV'$=YEAG=:MGF21WSH1)].!6F&>\EK%TPE%6\Q[VKX#ZJ<(ZS9
XML@4IYZU2JM/4]3S_T^T99)D4Q+9Z/O"%=-/A*]RO6ID?M7ZBO]^*.:J8]5NS
XM(&/FS E#[PNM2V?+<:SRU_#/ =+^+FL=%BZ<I'I,MI4=5%;5ZWN')6.MZ\[A
XM>DQ:6F)9R=UDH%M2(U[8!CZ^?MNP:],\O7[S4L.98M<!NN1<QOJ-D$95OY7C
XM_6[SO!$GEI+?99@85^PUQIL.-8TW#5J[*J+&R(MR9>YFZH0TO>NX*R296(?3
XMU^"7/7M3&;G,F$'9!+Y!%!5(%[W.8Z8^BY:N2S1IBF4BB)P-E%9734&725;Q
XM2^AB7W)4Q9[4#.*>19E^QWVS)?-LNKO=K:A_MBP=M>WNX+RXWG)/S@F69L)T
XM-WK];!W,790$WB/=C]'68LJ8;NY;UX'8LT.H2SI&KPR#G$!Z6;K9.EP<G$3U
XMC\DJJ/4;_S-J4WH=,Y:7E98$UD/2H%355Z?@W8G].O2+68''\<F=OJG=1',G
XMH>YRYH0X%XU;GF8R7T>H\Z0[%@Z?V\>6RGXM[SOCR[E*]JMH\U#/'WTW%2R%
XM$1\&FPV?^ 8!AI;K-HQ0JANN<YZ'\,M*OR$_^X6L2-/@KG4#T^&<OU@V511$
XM;KIU6&>J\SE:^QO#9YEMPLYG KB"]Q7$AO-;6U9=DD&A0IU"^HLEFZ:.0U>Q
XM']?C[=T5X=5K&A-SJM0A9A3:"$);H-IC"-KB8<6^(<S7A$%GQ76[Z73A7]U9
XML/%BT)=E1%*?:^9XM\F4II/WSA*BPY,4CFZ36#E'DC-M&SZ8&4-7K6F"2T.\
XM;@LB6X]=@ZP"GV6&Y$E/T/YTO#J=S(>?6PY@5!%Y&[Z]ZAST*I1:[=L\JZ1"
XM^VN>C[";[9K9/E!+ P0* 0 B5E(;+Z**E4< !) "0 $Q)0B]$
XM54U-6530I)D#8B"(,"#(U&G3)@\(,VG8E&$! DT9.65 T'D# L[%.77"D,D(
XM9XV>-' T<IP3QDY&.A9!L$DCADO"-!C';)23QX4&4$L#! H & #A-9!>>
XMI0V4T00 'H) / 24Y#3%5$12]"3T]44"Y(#0(!$B,4%38W:(F:VSP%
XM!A(31,7VEO<;*GRI8GB#5 E2Z-NW=.?2E1L6+DBH<I+WV[%OV8)$*?3I4ZI0
XM4WC78>>6)0ORK5N04HT.!9FS9DP7U?,%\0J>(\F6-9O6;5D0[E-JT:A5BTZE
XM"C)AS 38&J08:H?K4BS<KV_AM+?TB%"99DTH U@(+?R][EBZ=>5\;[-OY33O
XMLF[@=9CA>]YCRZ:U6W9./$DW+]PRQM9>B-,@]USOA&+STBV;$ 0[WYF@7\(-
XM.W9MF?"U;TU5_ ;Y$F0;8CTW[)GD)2Q=,#/Z)!KJN<-^H@TKE^S=,$4_+%FR
XM<N+/O;,$&1-DC^$-8UB+!3&MT9:5ZR;;@L&SB;N @8-]_[OL69 G;9[0RHQ5
XM,04,)NV> \S'LDT3O^D$^73X_2U(/>WZ+0NC3C?-GSHL6[9Y0=998MBO_3NK
XM\C=(D&?#!"MXG8=];:GVU_J*URVBBRX;]3[#EF3SO\_>^==DV"7>M&36F1SN
XMALH]9EN"3$K$7(<% ?UDW[8%Z;8.V86O\"OZ(;;AZS%B*R,4TD7TX.WH>ENR
XM@'MHJOUE=)=E8[@E=L[Q7GJLLJFJ.!TM-QWNP]=YLMY707:Z0 <+!TC?,3?\
XMV#11"C%CDT(A$Q4U).9E^E[K]NU=-WU!SY.,/)GWC>S6%1N%?)U"&BYO2INX
XMMJI:KATJ[]K"B307^G9[DHXY(Q/4.>:(_ )N'/%:[;N16PAYSQO.%C8,^IEA
XM1!48,9+%V-3D+=E,SQ / MFEQZ)!EEMCVNQ2)0Q@P[((,DZ\,(8@Y ZSF;W5
XM)HUB2FAJ+G'9-8<&$3Y94.Z.E1QJ>K=9NK ^F4!5QPAS,]8Q9>(XIN:.?%F&
XM/SB!%E(MR/2)3*\F5?0>>\*]@SC-P;<NT7'K*-5TX$R:K:.80;W.KB9TFF8G
XMFP95USA5.=U"=TLSRCRUS,*($1*LG5/Y5A![0;,>S+K%81>U^O:Q()ST,/F]
XM[XY:TF7Q*'4WAHSXQ;COX$X-WN<PPE[[1:Z-QNU(5KP2797(X1M.^*:C&G(.
XM8 2<K);BC,H4,ER4"7+?4)]*I?H%$_B4K]KF#>W@#M%^'&:K=:TBN 91R^N5
XMT;E0NVXCT\[1^V\R>=-;3JO=Z="I0=QN-&@5)?>8. =U'UJ5ZA"Q"Q@[.L+\
XM))Y[.U+8%IZVS9.Z;!NSYVC1K>>,X6+KA-KT=]DW)?]M;F?K>BZ:48L@[I_7
XM^?@6OD$THT1!R:FV9QLQ+=$KKW9!QP4'6,U4VE1P /!%&?$B$J]%@&Y9;@6^
XMX?A.TH$K$'Y.B=YNS9RZJ7;(4<^9(\N\\!\?A[I8];R_7+DFK<=N@5W!W%@A
XM$J]1Z=L,(NPSKU DSQ>=4PD[4#]=[3&'C:MF>BY!S:TU%(V=J>4TO987V&UW
XM<+'G5IM^21D=U*D1VS?1A"*2IPC\\;7X"H%G8.R/H&U@-TT<>](BN<:D.9.K
XM3)@RCK?,&<M31)_5W^QX.6;IQ@X;V:K1+Z13JA,G38?9N1?:)'K1>C9!K:I]
XMASG2R&JW=B:]F-QM$KX=O6"P2(LRA8+:+4-FFLQM.!Y]6.ZD)]MHCNU50_6<
XMP7B9O1'(ZB.AY4:3,BW"5R?56N3W,N8,X_:P(N[ZF$R/BE//9F)?KMDQ-V-S
XMK29S4$L#! H & ,!FJA8VR]R*^0( #$% 2 24Y#3%5$12]#3U!9
XM4DE'2"Y(#0(!$B,4%38W:(F:VSP%!A(31,7VEO=?JFRH$*1*D"!!7@U+MZQ<
XMMF_?@J0Z%"K(%L7S91+DS3:M6+EAY>8%*?=M7;IIW9:=PS[@RZ%OX>:5F_8L
XM6KH@40Y-"3)FSIPP613/&,6[JMNT=I;UW+1T[O=;,]@H_7BH;^4TZ[=NYPP#
XMWVF8[1F6#?<NZR;_09IAWR"GUH63O,>^;0NW3O0,"A?.U3W&O,^)!N2A;(3J
XMM7.Z%]8X^\#&.8.IQ&FC>"=M&_8,T@7^<N$(KWF&%)XJVC3[*UN;I7LG7)<%
XML?QDAC>=8RW&[)-Q7O6;+IKJC49;ET$^_06]A/?=M&RP:C'/N^[<LF;KLF5A
XM3+Q?]HTO,AUD6#=UKF935WQUWAW5Z;)VAEZS3-MFKW&;>!:F$9-MPGPTTA]6
XMS+C2D^EYQVN.GR,D#PL2;ABV/K8.DZ>\ZS0UH=N%4O@LYDI8A['?9I#JLFSS
XM@!WO%M4"S^EDON$4OLG6'5OF>)Z9WFVV]QWP):]!YLDOSW!IS&38.\]';\3*
XMK1UY8BYXA7]'#WW399$]P_2O)X3:M=3+XBUC==V]Y3UGNXM]DZ^TANCF>D53
XM6"-MI9"@Q!Q_%^V.^I1(\*^[.ZV9.N^9&+S5(: 4QEC33;:,VEDVS;"(FQW[
XM4Z%*O&XZR9-I4B'JS2C%3(21WUG7=.F0<:CS-OGJ6RAI8=4X#UMG_.5(A0U"
XM)%;'GT"ZYFXS=]_MF,'UL';#6+F:'.-K>(<YXL>L/3LV'65.]HV:NPUF+7$H
XM9D.3NSE2%VW9)O_:8$LU'>5S#4SP+#)VCUU3O-U =K-=6V:Z"$YQ=Z!D4G>L
XMT7#$I0LB-!TA%5SMLNX=09<N:+.:X8V&8=R-NI*V3MOX(MYGP.,.#1SN$F6-
XMSZS4;)PX:[:,*3-FC&"-YUV#E)G39HW_>)DP80S#!D'>+F*+@X@5W.S["=LS
XM]?%VAR4#-M:I3*8@9QZ-063^@GB/\*K-H#W]'90**/_K4) B<)T(9*!S=2N"
XME1I02P,$"@ 8 \ECL%AZ#LOM* 0 SP( X !)3D-,541%+T5,24(N
XM2 T" 1(C%!4V-VB)FML\!082$T3%]I;W[;Y-2Q;DV[ITQZ)%"6)XAY5#_"!3
XM[DR8\*5*D'#EIG5+A[J''4NW3/:F^Q;D7+IDTQ1OE2\;*KC/Y]B79H9?Y9S\
XMPT^'!1ETZM"D2;70W_.?\0^VF__(+/"GFV((_N7=M'2R;K9EW8)L&Q:/^"*&
XMC+8L'KXQV)'+@(V4O%F"$&?FR;AMW]HM,[Z6VWB#UW+'LGB.)3.LZ=A7_@)_
XM+ _\/;8MG/L8^W#UH6SWKVO+EK&_Z_&]P]*M.V>\AD.FGQ'><-'. 4?.+=OV
XM:QUQ2.9KR?7=Z[J=F_:LVS+6F^T;+0]]T_U*-VW;,G&M?6FGQ'G9,>";[)SY
XM8- 'IWJ/76,T(>=>PPW2,+,NU-LW&/TORP8^C-%(X3VFC?$X[W#Y/K=NF[\P
XM?DU*%.EU4BA@O\S;0U^6XU!+ P0* 0!&MW(6-A*/^,H 1 0 $
XM $E.0TQ51$4O151(1$56+D@O5#10 $(@014@BM!!4T:.FS)T0"1Q0Z>AF3!C
XMR@PL^&+@P#)X*CH$(29/Q8)?(*+Y8N2-G#9AZ$#!N 8BBA0L4*K\<B5,&IDT
XM;:;8X5$!G3QPRI I8P;$'#IRZHR)J+(AB#T;06@M63'!TJ=;;'0A2E K29-E
XM$LR1,R;LV*Q:[[@DD^!H4K)FSW8E$S/,%A Q:L" >*M@CYDBXY8:B;-PX14
XMD'QIDL1) AN$\VK.&Q!$$\=IVM1IDW!APX<1X02-.">-GC(<!VH 4$L#! H
XM!@ & )")0QH"HX9(3@P !TB - 24Y#3%5$12]40U N2&$*>P<&&P:[
XM#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&
XM" <8"@<*" L'"P0E!"4$"@8$!10%"30'!A<)&BO\_/S[^_L,"RP++ L\"RPK
XMK P!(B,4%38W:(F:VSP%!A(C%.7VEO<Q8Q45_U@_\K/<V[GOOS5* GE1GM%>
XM"K==U<KR)]&C3_)_XG%%N+?U6L+]O49VYCJW*M?ZSZNY/5NX3_%KVWW_=:\M
XM\<]V!Z,?;I]_XSG^O-[_6OZ^_>VN7^NR7<UYN?]\U._-\5DJ]Z?]Y57YQ7C/
XMJW$?:N_1..?Z78?XOS\8O;WVFQ<ES__(TK97MZ?L_^*>BCV2;V4OV?[*LPBL
XM\==Y_N8-LM;F,]_PT?H_\J 5I9O8^N->:#_RN-,9]UJA!2.MOU1VG7]'N"WO
XMJUPZ+]JON[?G,.D0/LEO9Q3%[(]3!_U!*S3H-670ZKWM]D_I=O[X)XT[K<$H
XML3_N_*3$3E)7<?_?OF'66_"I7><-//IK@K^\;_>OW\MSG:OX$,>]Q.];@GQS
XM_+/^QG8_[&LSW'^WJY'PWZ-ZGPFW:(MD80")Y4N<=(_EV2Z(/WJ.I_ZXG_:>
XM\JU7K_LY+]=^_/7>(AC5ZX^_F3;5+^&_M6TO^]?S)O.6G[K,C^"WGZ;N;H:C
XM+NX]AN]S_M%]+'R?>VW/I7MK[.427KW]<4FZ;S ]ZR_LC=KC@O\<]3\ZGRUA
XMW0_*AW34:1RSJ+BH.)A<M?I=^]W^T.)+_.M B6TD1.S<3_U_@<?C(>OK1$>D
XM/.O"=/5X:AZ?Z5"1MPLP+GD:[_%2'LKI2GEV.L0YKQ7+DYK':W3(WAU^,3I^
XM>'RG(Y+F914>KMFO1$=$O8F.K-Y$ARG^AN(1#<5#$QU3_$2'#Y_EH>R&([K6
XM/3YE-YS3$:-S7RT;;WB\1D>,F_NV&)T\'J_:X-MU+#6U$8\'Z8BVAWL-\F3U
XM>-$R2M>Y7HK8+8'[ZTX]7D+O0^AT:0@=Z?$*';I/X6YT\7A/C\?HWT?]PHE:
XM5!PSU@_SWBA")6-@PX7E)X3T_2K<UZ%P*<"-$;Y$1K./&,;;^;GA<R>Y.90W
XMD.=PI1OIKUPA#;[P(N6^V@3\P EMAG.(7;!N"?OUJAZ _HW*L]D\P4AJ3'6%
XMN\![U^$.1=W3/&XG4K?;Y=R/JMW!T;P^9\ 3LE.T4PW_N;'\$ 3=GV9FM+HW
XM(OVL[-S<'RK?#WK>G;9N?2_!R.Y S,FQ.WM7[4[T#E/+/O7ZQG@!6B52UHA8
XM;S"".63)*PYS99W W%<I&'F,>)W7DE5XC10CU&#D\3+E\X%FKFJ&OI:P?\XR
XM:27H,4UE4I+'H4<<=;MA#MXVY3/)M3FR-TY^VV_'+F_;/#JGI-GD[O"-F#KH
XMC3NA?;@3FO.X/1H,XDYD3A.',M=1E##CYL:-&<OE/_.Y_&7'S.]&PCJ7Y2(&
XM=NYUR=X<Y$/UQE'[[_^Y&*TQ]:U6!:V?L[K[.5= CV0[[<+=6:@KKI_KN);"
XM@F!D$QBV5])*8+:TB\6AK9GV8UXUT\N6\U;NA2LHDL6%$?;+JXZUYC.58]5+
XM^>0Q)[$_\&ME85H'(H45JH.4>GD>KN<^0C;?,]B!E;:06C?;@+.T6OAA+S!'
XM(%O%.;4YPUIE.?4]U7MT8W M9CHDPXPPFSS.%FL=UD Z0MJJUA#>I\86>PX2
XMU@K,U>4XIA670P%:!AG.XR06EWKY6?)_7EX>UBFD%:L#H;S7'4;SI3R;O$)?
XM,&RKK!H)W&L16V^*I<)>RVL5]*DWYZIS9 6+&GF+QK'#?RW=C:MV-0#=YUHM
XM_Y?G=3$0:EU>B9W9V%Z6D4S+=V>#$-0.W T72G86$;Z%6RJ7F_U]KH1BB#9I
XME<L0^:2ZR^GO-I_>I=?QR%QA;KJW,)9>M>*PSWLK*"P 75U>7T-(CQ9@Z!3T
XM: #0=;G*MQ1_L>$WO''3^5?NNO-%J,Q7WJZ29(EXFOV,+$P$Y^(#7CBA2\Y[
XM77_U/N[-3+LV'PTB80!*#<_/LA^ ET5-JLSD6NW,TAP&MC::<.&$0HV(D9YP
XM.3T+=9J&EP^4YIG$H+O"W&!CFN[FKU&*SE6*R/( V88/C-E:O\\GW'K;J==Y
XM?6)VOL.7+D;V7CY2X.8SA/[!N&"$Q!Q A,.AU^4? 9@W"*_KG_[Z_H]]T>AB
XM<7>Q"B&^FK.W>,(A'F-X;+W!GN,&YKU"_C.<IA5RGFE/L;+8GY'_K!/">(3E
XM'LAOOV*AXTJ]2FTB3=VT'$Y).R)<-1CA')IK1RP_:T(PTC+H7=5EGQN^5A/X
XM=VYN'_4XE4.8N\&(K4&A9(&J,2'>M3(O]3V>:AC#/?U(3P(MLX_!5S1JZ66G
XM8>_$9K=#[@=?WS![M>6MZ.4HY:+73V>X8X6];NMWWE$W.?GM#=]A@5PCI(87
XMPD89Z#@P.3<K^8-'OTE6&S+?C]BP56%W$^V$8X__+M8SA29QZ=ZX(H[:]>K.
XM];E<,GGB0N86G^:7X>9[D1=VV79L^J>@4TQY1O\%(@3QA71X8?)6=(J838#@
XM)Y^@L_''RV4'X7==[,%0!?[,'[F 3U+ N>P:U<5NU<Q2JWN<<\;+3/L],@4
XMM&MQ#<^RM'?I62HP_JM\:+Y9^:GY*756".1!'[/7!UA7R)N)GCO\W9B-G H,
XMN0J2@R?CP@4SG!%=$7T4&O@%A-JIVP+?0]._]OJE\8;SHE:CWOXC3J?(PA+)
XM?JX%0*_LP)MVEWD#HCWY\151901O_F)JK>@1LYM*K'0NDFW@.O=B3'XM7PMS
XMUV[@H>(>GUBK>LA&=EE7%$O5!G&0J#WI@Z)1Q&:2KQ)2>2+<NB^3=DGU+Q0.
XME,"-[/^Q0[%>-K\+#ZG[05J8_!1T&&QA8 6UWHMU=$1&8WGYJ4MN@IL0;XHW
XM5\_NK:)=]W[]>V#" [>Y[G_PI$=HF0@@AY6,1CP!A3/G>\)UDSM0,M=(U%P2
XM*J0#DE"ORBX_KKD( Q<:KGQ&C;;E'5'L]C\4SFOZVCHE]8[DRH&%2CHDVA//
XM%%935]9/(#V5N:C\/>%6UJA^Q"QH-[:=4!>APZ!5W, KAU.8UYF;X^,*LUIZ
XM15*4J[HZ=!&-\4WE/'X="OPACZBQ5QHW-V%MK27$J]&U_(0S<]($T'M>0A>T
XM%YS$C"L'*V:^JM-[']6EHG\JX\?](F%NY@72; C9VMTEIUI#./NI:T:[/9<#
XM_\TD_HB[(9N:297$,N?#%5;E>-N8T?&R@H$= )E80+'S6EHV]9C%&YFX^K$'
XMK.>Z]@WRJ+8"8(E@#)@VL)Y<9SZ!>5T5U12E=B"*(;JRG[DD83Q/&(\2Y# >
XMP(J*N<A(3;_TTT(%$E).PLT.A7;PV-75:]RH). >RO!!C((N47"!R-K0]'B$
XM5H!]^"W07#LP/OGH#V$@SV[A0LS"R0ZJX%=WUR3!B/^0NL&*1WSY S.1/P#+
XMM%?E@_FA]&M>+7\(HCQ6YP**Q-,4PL%(^X@?]*0'*>.KVD Y#S+'>8 0Q,1/
XM"Y=:*>4KI+(*=1?B+IG"6/.*SG,!B*@LSVY)#;R=&KY=:GQ1I/IS,5(.#G3E
XM#5S"^#0<4MF%&4.R2&.?C^5P( QZ+*)RK-R!C^7?92!)Q&<K:1"OVC&[H9WP
XM;S4F!L]+1$=WHT#][GNIJ,I...@FR3QXCJTB.G5#"(R^LMO9BPE>.UQ?9KC)*\
XMJ[\^I*Y@1%SUM@!;\]*<:^9'"$),8Q?O&LOVC8@]#.G=[O-^R,A#CFK7S;4^
XM7:^R*M2;#%7]=-M[ <.GN5XA=28C<$[L!<4YF/.N29 0..>%]2 7UH-<6 \E
XM\ IDP$07FB$)T<4ZK1I>(A[+_G#1&+M(>*B3DN1!XR3!_ (T7/JXW[-M% ,-
XM]-K)2G1H%ORE6Y#;,L_AH)9PIE6ZL?QQPH,KTT>[U0XXSC'?%PN] #23,"C+
XMF260$N2(V\>5#7]#4Z@.AJNF/(6?>AT2R2.J9_;7](#5.ESTQ&Q1KRNK4-"'
XMY;0BX<YRI/)8[$4B0_-Z5.[S')K7 V!^-W"W&E'Y"$A,CY\2]<UA:\1U=J$=
XMX6[N^U*">1 QULU7OH01>:ZCD+:XV'X[\0BWQZ41?T%"'\]Q>2)4*2YKG3NP
XM(USO"-=IC5UA;\_?X.U%PJN?9X/B\AZAT(>@>[XB6HDX%P0C7$I&>RF<5P5C
XM6XK^<ZE.#Q :<W]9Q+"JD$3EW6OG4UTAKX1@83+#98[(C!Y@ U!+ P0* 8
XM!@ , '\8 %@/#[0/ #A, $ $E.0TQ51$4O5T%45$-0+DAA"GL'!AL&
XMNPQ+ PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&" H+!085! 87!0H(!085!@HE
XM!@@'& H'"@@+!PL$)00E! H&! 44!0DT!P87"1HK_/S\^_O[# LL"RP+/ LL
XM*ZP, 2(C%!4V-VB)FML\!082(Q3E]I;WP:1^UZ[C_I''K=8H*4I1<5$QR:7=
XM'87YMEOCU/Z@'>4=_@G-D<-Q:]QYQ\/0_O\Y-$>.^MTVV/\";Q;I&S,6T.GP
XM34V,6E0<*R;+D<E[A#MRX7]^_F_F_\8O^.4]0ODNDWR1%^1;G3;G-=P^+T]A
XMH^ 7EN:E49'X!::WX'(=C7.NWS\DUJ5^[7F5L$R.W^?5)'E 3]=[B5A>EZM\
XML_["'U[_%YJ\(I?<@K!_8?@?\V=F.K]J(^/0(T8=M]Z(&MT_<6@B\_;&R6_[
XM[83Q=MI_DFMSY*C;#7/PNARZW>H,>E%_9F[<F+$(^G7YZ[)=1W7]SW;_\RI?
XMRUW_TK/;21@AUAY[=R996;F?[D]R_\KT(!VI4LZ.D?N1#M$>I[RMT"3R_W/#
XM9V:GUW(RG^R^S^&)0Y\G^\[*O">963XGK4[BZU[^7HDOVWRS7(A>F=.4<;\M
XM=I%H4GO.5>Q"]"BF?ZMRNWR)[KM4[NVXEU_:]F5O[.<_YG+SWE:=?/F#/SM]
XMHE_^M7W[.];+\1T[R[Z;#]/<$9,ZW5;7=)VHC3#T,*>Y,6!.!Z-DF0O,GU 4
XM;O8F=X=OQ-1!;]RQ"><J3O$VT7_F<U&M&>("P]'.X_9H,*!KI,YJ\XRBA*G4
XM!CWTLO_*$P%W_T;E;B2L<UFUD(;G7E?QSC$\7>;M^'NM1G=P-./>.&K_Y3^R
XM]U1/C/JL[MNU5,IN!]>5N[-H?"_A2C?1_]>Q_,)8=G5CNVL%A07!".?X?*Q7
XM]6".G[OI1GCC]ZT>C-POV3F_>2U.,]EA:V7?EN]U2G9/8I =5*/R;+\9;KG%
XMSF3O3R<[--+[[Z42\:G7MWM=(\4(-1C)1)V/^KU>V],\;<MW^,4GCC?^R>O=
XM&)U[(\%Z86IIB+P1PWC.^>[L<[526 !U'#:QP2C,=L3V._J3=)?C;"6%OY3_
XMS_LHH.T;%9'CW_%8TC#BVXKR=HP3-_GM_L#4/X;4*S=56U:>]3J>QG)%X&G!
XMWM?Q2XWFOB^EO(;V<+,G8BEAJ=\1&N>SKL&(YH@RR:$9'VA'@U%<W(.B;":[
XM*S;.7@?1ZF0_F$H O>D\6KF?NHNW<.'8SG-C^2%85$R]4A>A7XCK1:-?+M!'
XMZ)#K/F^-&^<JL)@F_X_\TOR@I_9$P7]<A@^.Q66FN:/!#)1=E+@8;Z6^,5=_
XMM)\5C'@.%8%X.[P\IXRQ-,^RKU0#!_JK2P7GX*[Z?2Q7[6I(-(YT>&U[JMZ'
XM+2?)X7QV" _.-@K/%2"9YVK=&,[A5(4,>DJY>.,>6FNL77>5+8(X_:CW$@:D
XMM=POO$H2VI_AG8;EV$50"=0=Q;[C]$"=/4H+L%RB&?0**;R--#R>*M*OD!?<
XMPT(B)-#L"T!?%C<2KCT/KK4[7@5>E EU[>!A5-=6G^I$ZKJ<S(,E(1L*TG:Z
XMY2JXGMY<^IXRTK&AW*X1*LL/*RPLY8(?<C_CFFF#@'9DNME!,&P<[L@8<'=V
XM0^XPK4:BG3H_-;,&+%$+TPS80*$=USYS5NZC?ME$8N"!)\T2AJQ;(PG='#$0
XMEJ>^+BR'E/5A<:D#(NC]N5[""CBCAO??7M16%-7</KO7"JU./HW06 --Z^-F
XM@]8Y3C>DNP^[0W:@>&">1@+.J8D+.Y^JN LV_CKJ>[R$"T2>P^>M*N*<M%^"
XM=@D[2X.P(5C>%(2=,NAAR@Z?FYL+)<1]KNW0?$Y4^<3GTFFW?$ZS? Z=E-B.
XMXG-.]SGT>!2FWUF A_M<$CM1?<XY/H<:=LD$&CX%^/L<J1T?/LO3K=4(N1<N
XMWK$NW7,2HU#CG8:E4"DP\-3?)-CQF+3\)JWW7-\5#$4P0-$7[IF#))1C[FT1
XMK9)R,Z0JAW+D"W%!81A@U )FO]+-M#JF]F/1KGC[T7'/AS'>RUCO+S_'_)QY
XM0$]O7^YH'%+7>QK_7.J<:OU_<?(.5X)49A)OAOO/O.QE4_/&<Y[AM!YT09_?
XMV(_C;EB;Q7Q HU80S)]/G67\V]VX#>7K>0*<*QZ?X-_/&LZ.7SKQ76&1M CF
XMVB98\1FWWIZ[@*GJ\UJ7^X!_:;FE/_4[>,EX^^VU_L3OO(8["/V/)?^S2OY[
XMZ<8[Z(ZXN!=/\*Z4DWR-U]L_;-%+GN+!(]*BSJKBV48;2O"U5BB92G;(45^/
XM5K)#YA.S$W^=)VX'\! P/W++?&?*C0)MKP//O&-X'9;O/=9XX?P"'L*<VL@H
XMWAF 9[;CWS1+5JR<53QH?GK3&0;\+P0][C(7 ":X,7^OMJ.3GGV^89$:+[\)
XM8:.\U@_B(5J#Y%=WG3!$V[-*$/+4P)W=WKK%0OE/I0;V36[WOS,#USE2B/HD
XMAVH$9]./NE.1<&_R$SYUKK4EY.;D9J4+LO'R$_XJSV5E+^STLN6U&M>F"E\'
XM&^GO11(FC_7=DG-KP)_XN4A],7"@(\(;M;IZ."ISJ%@'!G=K'7Z5(DKP$E>/
XMV^>,?\*M L0*K1942OX2NWXVM3?6O6U\G*MJ]S'CQX$]0WQ+[SU![!QAOYS?
XMPECSND4,=]UGW9=A,Q4)RRX$M<$HKEB31\^^JNOV=SLHM $8%-;&P1Y>RAL:
XMNYO'3+IJO!$==[[&*2M;"<_>=.51;&0>Y3GJIY0=2PXDDS/)%WF1[])];[%7
XMII>)8ZL+T."@$[^/=]AES!&\PV7':K]DKU;MN$L6Y:4^F'(XZ8?RB'*XDJ)B
XME]N<6C45#]E\S[>M.88!!5[E>? .9O/KXKTF)^:QLQCN)@VOM-3H#M<[3A,&
XM/.L?/,]C<_#V'^>-Y!_@8?])J(04S%"X<I&?]G-!J$Y+^YG&_I@-=GUJ]Q).
XM<&,(N:T9$HPX=:SMY(,S$$)%A%JM?/ R)U8^"$)!N'Q,"$>Y?/Q[^1B*#Z @
XM/D@2'P3_%A4?4/H"*N,3R2NX6LX\WAF_+ZE[F=NNTXMXQO-!$>H,Y\-!-W H
XMH \L:>)^/MSP<.D(Y_39&ROP\B#O*F=DH9!+J"!\?93*UD=;:'UDV+"^JJJX
XM?F&$/DCBB'36:^82VRQ_4W2A?2,T+AL"/V(F+/W,)3H+UX]=_Y)QGG>^C\:-
XM!%>T83QX# &K-B,DUWQD7,O@TJAQKEUGLRA?P^>C\I1*X0R/<W,+^-:]"+TE
XM^%VVYU@AH0>4L][5)3;H07MW#Y-13&1@G;K<!/*89Y($Y<ZT>F,.H2P/UHT1
XM"H:>$^8'PPF%Q'Z%4&(H<PLLC*MS.,%-<QN,06.A=88R<3XU5- %=6,C9X>R
XM3.K44JKA$S=N7.4+? 1'%N"SE=3;'1XCN6)%JH]#-#R'".,Y?H@]C;VY[@?I
XMMH5%RAV+]Z*Q4",BA%#$]0$]#3'&.]\V]J@_U/T#B?NIWO(:M-Q;ESM(5<37
XMX^1"^%T(JX)GSPI/"F6,^:$W? S+CA.>[8C8V.=#\E3CH7:BD]&*H$%1]3A.
XMJ'2[#+OAS,Z(7EBFJPZNRD$@S-QW?=Z@1J5BS<$9P1\,)F"?G3&^!V9;%HB.
XM\<OG$([&W4\5#^):UH.[@A\PDILTWTSZNN>_2HX'IGZ?CXE'[<"5Y+.'L&MU
XM&9+R(*U?<QG!_^#4D >/9(%;'0B"?+@VM$24R9V/!#-\"YW]O*@&A"(>@[3
XM\=BB[>-\%#O+;$(*AQ)]I;1JB5Q3R7KMDN ([)4&1KPDIGB1I[BG%*^K%-TS
XM]]D6X%-/GH'3WB!T= ZDV0NA514+N6)>8 Y=LL2"7R->/A.ZQM>(:TD[C@L6
XM1I<%.OYQ>;';_9PBKH->, (#)[3G<CC8'Q%,59PKCXQ'Q+CP'%1SJS<>/4)T
XM#R<G';'\K F.X C.CG,T*).,.TE" K(BD\0>!MRSE2*V$'L@\.#B.LG-9>"$
XM\87(*,?UP%F0@P/ *N1!,Q[P\ BD2T94<,F(.(*S*=1^ ]'W1^R\(9JH1UH.
XMTXD,!K>YD_JAJ6*<8_.H#<EWG(=*Y([G& V\=9MIBX):C 9> AY<);[E%L&C
XM8(3GH"KQ@+ ="_9]8#U:W7AP)7 O;0><$Q<5[%Y"[5*"@-T:2/7874B1)=C6
XM&"3YG&@!P]8%\" ?<!ST$/+D,%#:0$<,;G=_I.LW%SA!>.U<"N8+.!8H53E
XM+,5+[6G<T6!8C,#N]PT6"05@1]Y/+),']>.B)S9<*,:.(GN73PG:?+LVQRL8
XM0_?ZJZ9[')T6$MW>/<YK?5+;[MOS0D!<_8AGVSP%U;O&TGTCEI;-\(@-DO>S
XMWH4L9[S;)ER/QW(O!+U+!70=H(>;S=1CKX7E?(<O79O[+_#R<%];RT]CV[4\
XMP3D6T1W7B!AH4EA@\\:="F.S^I@U(=X$YD0I+*N)+;]*"#CGJ08^D$<(5ZUY
XMS(4WXFMT+=OI'SN*F C/>0E=B$PQ@.F:EY<'!&=NM?,F)Q82SOJGCFK=S^2P
XM>[Q\(2$TETO>K^2B-00?.FYMM_M:&PSU2H$/#P<#>O$>SH?;*.(+0QN288\>
XM$OZ%7YA8]-S.*WQM2U/<AYK_;JX$_&O?((]J*^_%J$)NE=].;B&<3F*M\KPN
XM8A<]KN:3T[EV^-S\)ZXKYGF">50A!_-H@(M'-2+X3_@MSX8OW\D/83>>UGXA
XM5V-D!UWPJ[M;D6#$?TB]:,4COOR!F<@?@.5B_![E@_^A)%>J]*R6/P0=&T]C
XMS8,1[Q$_Z-$.DCHJTT#!#C('=H!0UF.KC(]L;]C.&Y'&8%GL:;V?$6XH5\U5
XMI<DB\R/%?4^X;B@%2N8:*7D<>L11MQOFX&V'2GB<"I]8YCMB'17\ZR \%,Y[
XM/&5_WAL:^Y7RZ8V3W_;;">/M<#X>@WF=ZIQ2WQ$K^[KPO H+\ -,="'0%4I;
XMA%;HE6#\+/OA<RB!U_PIB?Q"L5'BUS[W.,NQ@TXMZK&(C4J"W(&+A6#B$7'T
XM;G>5'JP;V@F+<+*3Z^#Y3SVBISN\'[1;KZQT_,FWTC!DHP^=B<=BW0F+DXX$
XM>1$,''\U>>4-^[1]H>WFF=KVI[O0_(CQ5^FV/(.\GA>^J[$G!E/QF]-VH7F+
XM1W.]'E&Y7,CD&KJ#?R' +]DXL?X3#N2$S'PFU"PHP.MW<ZY&W!UB/69:UO+%
XMGAVUJI#N0E$N'FNU?*1N0'^#^+(_=&?XD_!0)R7)@Z8J@OF%(@9XXO=L&\5
XM [VB^! =LGHO;NARA/(<D4^E*+MBW(ZA6+0KZHMVJQUPG&.^KQQ[<99%N93E
XMC!1)"7+$[1-YAK]1;HN7.F'P4Z]#XOE$^#&J*ZNZK _+:<7;G^5(D['8>QJ-
XMA.<Y4N[E.7102P,$"@ 8 PGQ=%1LZY$\V!0 40L !$ !%3$E"+T)!
XM0TM'4DY$+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;WH08]6C2A39LL8\Z4
XMV5#A#N%@@@0I-NS8M6?ENB7K,NS<-M-YW;EASY;5H?P)EE?P+HN7;AGP#3*M
XMV[1TOXI9WRB2GRY(E"KEOJU+)WF738DR)4N08]&&E0M2Y5PZR\["NREWMF7=
XMIB &/_=N6#C$##OLVK1LV6"GB':48U."C)DS)TR05?"U'?$]IU_G!?G6+,BK
XM8=Z?[=NW+,A;<-K(NZ[+)KPNZO;,U2-?Q/L,>;CL>)!-TXX)JL>^;0NWSK.#
XM=%J6[MVW<M>")%I&77%KN&W+#/6G9LV,[S)JY@GH]UBV=<F6!=D&S3/>9N>Z
XM1 /GL,X3MGU#O-E,5\%[#/.-/TBA08<N/2K5*9'I.;4H5:M%AR8L&[=N0IDU
XMT29,@'6;K;._A-1O^&JZ;[!<0!>>0^F66Q=.\B*ZL)?3-;^/S"=GS*_G337)
XMLRXJY;G''//\1)].@:9CHA$7P9M,ESL,O@UM0[P<934T\ENV9,@](=FX(&$X
XMC^55I=+[9,4X#_>]9O%E=(,D>Z=Y=1V$+Z$JZSA73/<:**CM78;K1J/>CK?<
XM!.F#N:7O,\RE'*/J^9@["^>#PM!S%O(4X"/\BC0_S<_C<Z<I/CZWW81!L8CO
XMJ5.8'T^\<M9#I^K IJ@7]@HONA=S$1[G;?8/A?J85[+ 8Y,)H@%UMV^<5-O[
XM3E1_LSQ!I*'GHOG_D"&"!_9:J[IU6[%L9%^(+:2N[TT'?Y7/+]@[ =CL>284
XMBB4Y'Y*<)I*<%@HE.9^:I#N5G)R2G!>= C8>3NF6.23G]5TA3R+(Z23(Y13D
XM;)W2GEB0RR'(N1#D;,R&9%P1_X4RLH43:@E5NKC?I<>&X<UBP\7F 6_2NTUD
XMK7B]H8!@^AW.:NU]AY&<W4ZF:8RF,^N1O;229I(0Q):&V4XA*RH>A!>_Q75U
XM%Z-EF<'=FSH-$9_6C!6C60T?T+<SF@.S2@,=E,D7.P8:<*BC^G FU!>NOMMR
XM5ZLW(="8"=B@_JYAG>=ZGVE#ARFJ"JOJB2I$]DIWMG*H/T\\7)IY&MH9^T#6
XM.A/T0>P7K%.T6D'7I+:=)^<;+MOI^\YBJ=B-Q5;LS0E*>28U"A(J5:E?N@YL
XMR_*+,M'U8J[<_"*(4>#K2D09#X>=>,U-J<Z4+&!G:ZZH;'K$(:Y[ EYB;D:*
XM6W3RC!RXL.T X6B>_\T6(VSJ:QR5"DA4_ ",+K,+;Y9M&&NQIW 3')CI,<5?
XM)Q56T;BUW&A5IT/8RJ=&/*.I+FD4I]'<F:A5S0V[!KD2) TE,_5X&>K!E8%F
XM:J^L4_N/^7G4W .X@*8E/\.) W+AMATA\(NW))%;_4J@086"W)*F[C)D0E>4
XM]CK-, OG/1:>#['/VIY^@08!S+I_2*&O*$$-<:4,[L=B![%U<*)ZK(=9)!PW
XM,67!-<(J%(ZD8!?G/87LAQ8V\1^GB29K43<F.TF$;QS9BDD_PPLR06$V&;#A
XM_CAP? X;B[O+D(:4) \B%V8QPRZ">!U6"6RSE,INH2HB=82-$ C!2"P,.3&8
XM)0GV&T<#[6'$)&8#?H<\C"51K1 I$!!WB'.-Q*B:F I5<!13*7336!4QIUTD
XM$@:1U)L4=[ H'_+"+(KA(Z$.\RAM9N[P-4$TJ_I3J@::,3Z%LM7*@WG+-NT@
XM_FA1BE@7N4DU!C[!2V1C1LI4QQ(S\41B)L,<5K5*C6*TV!DXUPHI0[D+]V8(
XMXRB45]JZBV2JZ#CPW04ME=$%6^R065#DF$(X28^4C)'Q3/LRDM8(4$L#! H
XM & .)J:!4VDX$X9P$ $H" 0 14Q)0B]$3U-,25-4+D%330T" 1(C
XM%!4V-VB)FML\!082$T3%]I;W=S94(#Q!@JPZ-^S9LB!U++?@M-VW:<F"-!M6
XM+DB59-_.99MV+EV4*=YSE&-3@HR9,R<,_.TVK=VR<N>FI9L7Y%NS(*^&I<.\
XMV;Y]RP(9HM&P8^NR":^+NCV;UFT9\D6\SY"'RXX'V33M6+EOQ[YM"[?.LX-T
XM6I;NW;=RUX(D6D9=<6NX;<NZI0ORJ5DSX[N,TTQH?^O&.0O>,%W&,)XW6SI]
XM:Q=DB[0MW%V"A.KB7!3K-?J%\/+'[/58MG7)#+G;AIW;QGB;G>L2S?'J#OD-
XM\6:C707O,<RG?E?WTZE,DTZE KW)^-5AH&^[M;GP7&;7=G+,4BUF2#T6A)*$
XM-N)ZST7SET^93K:I>\<S*%*6(&O*1#-F:JO:N^D(2Q##$--$><=39DPTQ"!C
XM(=9"L5R'2N3ZZ&'A:*E!(,W\5.>ZKEPW;1-K:K=DZ-M3K#Z[OB4G4$L#! H
XM & ,)A91BQIA?5F ( ,,$ 1 14Q)0B])3D-(2U-532Y!4TT- @$2
XM(Q05-C=HB9K;/ 4&$A-$Q?:6]W<V5" \08*L.C?LV;(@=2RWX+3=MVG)@C0;
XM5BY(E6G=CD6[=F[=MBA3P.=)W=(M*]=M6;H@Q[YM"S<LW;1BV?COF"?G.#?E
XMW;:LF^Q'6W8,_9#/48Y-(;YSYH3!KMVFM<._YZ:EFQ?D6[,@KX9)=K9OW[+@
XMAV@T[-BZ;,+KHF[/ -UER!?Q/D,>+CL>9-.T8^6^\9=UGAVD$ZW[[ENY:T$2
XM+:.NN#4<J/VI63/CNXS33&A_Z\8Y"]XP7<8PGC%OT/]8D"W4-G%W"1*J"W1A
XMK-?L%\+K'[ORV=8EDU>W#3NWC?$V.]<EVCENK3OT-\2;C785O,<PG_H!J9T.
XM1;IT:M4FT9L,D#M,]''W.<I;+ITNC3L]QJG24M7=((+(NA%S]Q"VU)VRQ9UP
XMY5?GL)8@Q=:9J\XJ^KC_V+IN@-QG_%QC:+9CMA#/R[F0@^4_B_#DF&NEAR=P
XMUW/1)B0ZA1C)ENR<XSXU"?M>"32H$.)EI :Y52C4+NQG5]O9[D.Q;*=I;#>@
XMZ;%X0?;0%GI%-%:?"V52OX<RR9X)YK4<9'3,A D3X.\S:>BZ<*9\NF]!E&%#
XM%_GC.5Y9%_@-K_ ^MPS@D"#,'T8X@HI-!AY63=&MYWC*Z7.'3>/XF2?';'&\
XM7^];QUE5QYY[I]S0V&/*>5 LS*<]$X17T##C=]S.)PS6P>&)J-UF@]GU.0>A
XMI7J<GJ.;+3=/?["LQ=5*Z [KE@R6Z1A^X_4<UV2H=9FB,4_><0^*I.TCB2,N
XMJ8MQAR7CCJ(JC :K:]#LI0X[Z@3_FT6?<H>2/F<W]D4=%D]_0FJ![BS6Y=NU
XM.IP[G#\7-86Y&_3"8]?!U'IM7)@++S59A#.&?;_24$L#! H & !U\01G"
XM>1&*AP$ -0# . 14Q)0B])3E1%3"Y!4TT- @$2(Q05-C=HB9K;/ 4&
XM$A-$Q?:6]Z$&/5H4)(C@;=,FRY@S9394N$,X&.([K5NZ9=F"; ER[%NW=LO*
XMI?-<\FS9TB=(L6G/EG5+-FU8-^[Q*,>F!!DS9TZ8(*NZ3?/^<]/2S0ORK5F0
XM5\/4;[ELW[YE0=Z"TT;#CJW+)KPNZO:,MBY#OHCW&?)PV?$@FZ8=*_>-TMT6
XM;IUG!^FT+-V[;^6N!4FTC+KBUG#;-%U?]U.S9L9WF:'P">[W6+9UR98%V3;L
XMW#;&V^Q<EVB.EW4R8=LWQ)O-=!6\QS#?^)6EG#<9NSN,\V7W.<K+KV5GVJY2
XM17#4@%M>=<H4K^/XF3YU>J2<1L%<V@T#ITXQ920GDG3?1%&:07*!U72L1AN.
XM,5.+9=.DFHNI^783!L7*$N1*H$&%$&^0,D%N%0JURW5)Y#H)XSK'.Q;M&?C-
XM!'L'1=*<$VE^(LUGA-ICUY7K1AMC$GHQJ5,JXG1,FRB:*R:A19PN)\'(&0*9
XMD>3GF-><W%%G$12KOD%O4$L#! H & 'EE:!7@KRV7P $ &P# -
XM14Q)0B]+1450+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;W=S94(#Q!@JPZ
XM-^S9LB!U++?@]->U9<O"10DRK5NZ(.?2#4NW[EP6RQUN6#GL2WC#13L79(K_
XM'.78E"!CYLP) UF[36NWK-RY:>GF!?G6+,@K]8MYLWW[E@4V1*-AQ]9E$UX7
XM=7MF6IEK.<3[#'FX['B03=..E?MV[-NV<.L\.TBG9>G>?2MW+4BB9=05MX;;
XMM@S5?VK6S/@NXS03VM^Z<<Z"-TR7,8SGS99.W]H%V2)M"W>7(*&Z.!?%>HU^
XM(;S\,7L]EFU=,E/NMF'GMC'>9N>Z<*O;=(?\AGBST:Z"]QCF4W^02XL6A=*\
XMR>S589H/N_GY<L8N['),42V6#=OE)26-;)/UCF=0)&9JFS+1)!D77!U59Q>?
XM/D<^KHEQ/&7&1&,NDL$6G9*LA6)!!BW9E%!5BF5(]!G\9H'_.K?*'(NVBS\H
XM:FJ[:9+8;N04\2#LG31S[ U1CIF[3)*Z## $N,'Y"K#:Y<P8[2#0L;94\E96
XMDSD'?E F^'LET*!"B!?F&^16H5"[B(=*%(MX6H9XN*J1+J>JW'7ENF$"$YQV
XM2V9[I$'%9]2'F@U02P,$"@ 8 XCZH%L"^P,N_ 0 ^@( X !%3$E"
XM+T]55$-(+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;WH08]6A0DB.!MTR;+
XMF#-E-E2X0S@8XOMM7;ICT;H,.[<-= Y7;EJW=$&&!5&]P\H-.Y9N6;D@Z;X%
XM.9<NV;1O621ONGG;OB5;!GF3?5MV+DBN;K1'\>8JYQF^ZMRP9\N"U+'\"8(.
XM;XZ"V4&F",]1CDT),F;.G##4M]NT=KSUW#34RGR;!7DUS+JS?5.NR%MPVLC0
XM79=->%W4[1FMNVR9KW^&/%QV/,BF:<?*?3OV;5NX=?9.IV7IWGTK=RU(HF74
XM%;>&V[;,5G]JULSX+N,T$]K?NG'.@C=,ES&,Y\V63M_:!=DB;0MWER"ANC@7
XMQ7IM&;=X@G<]EFV=)S?(-G^>\38[UR6:(X5UGF#-R6:Z"MYCF&_\^G55JD.1
XM.&\R;G48Y\MN72HUE=65G8_)N\6R ;OTK)S76*QZST5S/(5"F4ZV"7O3G8D4
XM.\:3<4=5NVJKZ\I)#S5(^J\$&E0HR"W'NDMZ=0;&'C(2]@VSS-"XS,?QC D3
XM#=ZA-86E!J$UPR+.&"<R#_,=DKF4<1U7CLN,4<Z<4$,HI=IM@B>+/+9;,MVC
XMS8(^J[XR)5!+ P0* !@#=LR071R=91A(" ! #P $5,24(O3U54
XM2$58+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;WH08]6A0DB.!MTR;+F#-E
XM-E2X0S@8XOMM7;IHR^)U&79NF^@<KMRT;NF"# O"^D&*S4NW+$BZ;T'.I1O6
XM+=FP<LFX#_[XJG/#GOG>.I8_@;O@_K%H48(8WB!3A.<HQZ8$&3-G3ACJVVU:
XMNV7ESDU+-X_Y-@OR:IAK+9?MV[<LR%MPVFC8L779A-=%W9XQNLN66?IGR,-E
XMQX-LFG:LW+=CW[:%6^?903HM2_?N6[EK01(MHZZX-=RV98[Z4[-FQG<9IYG0
XM_M:-<Q:\8;J,83QOMG3ZUB[(%FE;N+L$"=7%N2C6:\NXQ1.\Z[%LZY)QJ]NL
XM><;;[%R7:.8<UGG"MF^(-YOI*GB/8;[QZ]=5J2(MBN5Y[;F 5,^G/8QB5#=>
XMNG+=S%G)MS%=SMLEGPK>:&.DUW#$.HBXJGOQ)]NTO>,9E"E+D"N!!A4*<JM0
XMJ%V@!U5%=].QH[$G]#CV-$RS:(3&W;FPTSFLDVK9ECGN0&,,PY,91IX,>D+-
XM5;QS% _Q,]\ZQ$.%>6),!-S(2+BWC.LXU8WC*3/&U;@F]%PT[!W+VOBQ8=FR
XM(5UJ/?[-4&(]7FX9TEF?&>&;+)PO6;46RT;Q!=M"2<#Q#G6(]].P3H#=<NI3
XMVNL*&/B<2/8'R3Z@J+\EFBKA]@%'/G8,5:_S>N6WC[EJV\/U;#ZSOE=O4$L#
XM! H & %$WJ!:>PW]N_P$ +0# - 14Q)0B]/5513+D%330T" 1(C
XM%!4V-VB)FML\!082$T3%]I;WH08]6A0DB.!MTR;+F#-E-E2X0S@8XOMM7;IS
XM78:=V^8YARLWK5NZ(,."G$L'^<^"I/LF^<FF?1,?7W5NV+-E0>I8_@3C MC'
XMHD4)8GB#3!&>HQR;$F3,G#EAJ&^W:>V6E3LW+=T\YMLLR*MAZ3!OMF_?LB!O
XMP6FC8<?691->%XE7]+ILF7Q!'BX['F33M&/EOAW[MBW<.L\.TFE9NG??RET+
XMDF@9=<6MX;8MX_>?FC4SOLLXS83VMVZ<L^ -TV4,XWFSI=.W=D&V2-O"W25(
XMJ"[.1;%>6\8MGN!=CV5;EXQ;W4;,,]YFU-QHU!S6><*V;X@WF^DJ>(]AOO'K
XMUU6I3FG>9-KJ,,V'/8AB4C>>*K4;.8OXMJ4.*\?MBB_'0-5BV=Q=4K1Q:]YS
XMT28D<OT)V9*=FW!J4I8@5P(-*A3D5J%0NTQOH#%U6*]W/5=,-X+(=5P'9<IB
XM^.Q?K5Z0"8'* !IISB6>ADD639?H'7JWFS*?#O7%(8H?9ICZI%JW>HX[T!G+
XM,%[',L?R#3\V+%LVE*?6X]_<DUBJ@&_#IQU/(F\+[-#:5]F7D72CV8[CG#B>
XM,F, R:1N'4P#8$X#,A+L+4-I,-A46BHV=8RI7886:]ST:*A3G=-UY# IJ#^T
XM6S+QPPWJ&*.^WB=02P,$"@ 8 5#>H%B(YJ@PM @ 00 X !%3$E"
XM+T]55%-.+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;WH08]6A0DB.!MTR;+
XMF#-E-E2X0S@8XOMM7;ISW;H,.[<-= Y7;EJW=$&&!3F7#O*?!5D7+DBZ;YQ_
XM;%FY=,- ;Y!LR[J!'MV;;-HWQO!5YX8]6Q:DCN5/@"^J.0KZC3:L7)!FAE_E
XM7)8@K*7;%/ YRK$I0<;,F1-&_G:;ULZVGIN6;I[Z;1;DU;!TF#?;MV]9D+?@
XMM-&P8^NR":^+4%W)NFP9KH,\7'8\R*9IQ\I]._9M6[AUGAVDT[)T[[Z5NQ8D
XMT3+JBEO#;5M&Z3\U:V9\EW&:">UOW3AGP1NFRQC&\V9+IV_M@FR1MH6[2Y!0
XM79R+8KVV3%\\P;L>R[8NF;ZZ39%FO,W.=8FF26&=)VS[AGBSF:Z"]QCF&[]^
XM797J5"?.FXQ;'<;YLD=1;.K&DZ=V(R3S<V$/^FM3#:GB+OI\#%4MELW>12:%
XM;LY[+MJ$1*<D/UNR<Q-.3:*F7@DTJ%"06X5"[3)]_MINPJ%8INN5-*AKH#%U
XMK*^D>ZX8>X27Z[@.RI3%\%TGU>HYKH'*(!L)2]6>ADD6C1 I/1=8[69)IU-]
XMIH_BAQF&&=Y-,PUT!C/,WW$\P^(!AQ\;EBV;Q!5&CO7T&WQJ??0!1]:..Y&^
XM!7;H08)\F#*6;C3;<9 3QU-FC#,9U:W#:0",:4!'@KUE( T&%D>M$X2QI'89
XM9RQQXX(]=A%VU\'\ZB!,WV[)S(_)"V6L^DPW4$L#! H & $V#MA8)$:NE
XM90( ),$ - 14Q)0B]10TU0+D%330T" 1(C%!4V-VB)FML\!082$T3%
XM]I;WH08]6A0DB.!MTR;+F#-E-E2X0S@8XCONV+9P78:=V^8Y+VK6;-JQ:<NZ
XMI0MR[)OL'59N69!OX9:5&Y9NVK=N771OHF_+S@7I]@WW1AO6+5DVVWMNV;-M
XMUN>=\ UW;L@0P6N82RU+MZY<-^@;)LBT9HS1:9YW6C+KUZW#LOF'KSHW[!GN
XMK6.Y!:>H3A3<^LW2S:)XC5OQ)K/<R2RW:%U'WE/(?P+VP;SGICWKMBP9;U5]
XM\\-Z)WRI(OF&[C%][WG1K^NM\H5[<*#-/1)4[#W89+Q12O4<I=K-E6T<<,F,
XMH^9CT %G+*NOQ>:E6V8NP=[4["C'I@09,V?.&']NMVGM?+'R-]T\1A_D%6[%
XMO-F^?<OB28A&PXZMRR:\+NKVS+<N0[Z(]QGR<-GQ()N4L>6^R6/6>7:03KCJ
XMNV_EKNE#EU%7W!K.W?[D]%G&:2:T557.6?"&Z1*&\9P9L^73L71;I#WG621P
XM&ZJ+<U&LUTC5(%MH5>RZK!G^",([ = ]EFV=-3?(-I8SXZ6E=HG&<\(Z3]CV
XM#?%F,UT%[S',-_X@HPYM"J5YD_&KPS0?=E-3U6Z97=CE&*1:+)NW"W.M><7%
XMDK6=XTX4"^4VT2G7H0JY_J)3Q(P+SG?03MM9/<'9A>>><^;/N1?B.1L[U'&?
XMFF18KP0:5.A*F%N%0NWR'5_FNR;RG=/XCC T'XKEN\3Q/83&69ZPAQ%SDV%.
XM8-UPS#3JHZOGBBF/X<:#<!NXR@[!KF;AU]0,Z?J)7)_G:]0-2N+YD-QDOH>;
XMU'W"^IR'H#102P,$"@ 8 $*&=%C5LO52% @ MP0 X !%3$E"+U%-
XM3U9%+D%330T" 1(C%!4V-VB)FML\!082$T3%]I;WH08]6A0DB.!MTR;+F#-E
XM-E2X0S@8XCMNV[=VR[H,.[<-=%[4K-FT8].6=4L71/8$^19N6;EAZ:9]Z]:%
XM]B;ZMNQ<D&[?9&^T8=V29;.]YY8]VP9]W@G?<.>&#!&\KN&KS@U[)GSK6/X$
XM2<>R1 &_WW!K%L7K_HHWF>5.9KF/?5O'V%.P9\Q[;MJS;LN2!9FF^N:']4[X
XM4D7RUY4[)NH]+_IUO56^< \.M+E'(IN]!YN,-YH,5W56NUG+Q@&7S#AJ/@8=
XM<,:R^EIL7KIEYA+L#<Z.<FQ*D#%SXJ21YW:;9LTM)W_3S6/T05[A5LR;[=NW
XM+,A;<-IHV+%UV8371=V>^=9ER!?Q/D,>+CL>9!,JM-PW\[HMW#K/#M()5WWW
XMK=PU4>@RZHI;P[G;G^ ARSC-A+:JRCD+WC!=RC">,V.V?#J6;HNT.R>,<%'Y
XMANKB7!3K-5(UR!9:%;LN:X8_+K^.83QQME025Y=M,98U;R'VFXKP'AH&ZA:S
XMO]GDW^1" $;#,&[ZNFG8/,# TEV>@*T>R[;.%2MV:[)GO(S0+M%L=ECG"1"G
XMB#>;Z2IXCV&^\0<9M>E3JT6<-YDU=1CGRVY7Z+!RBJ[L?(R=6RR;+E=KJ68S
XM_H1$L;(D.F6Y%+*\BT[90B?<4=MM9RA2SO%..\=-.VI2Y&QV7\=]:I+:[I5
XM@PI="7.K4*A=ON/+?-=$OG,:WQ'8[;@/Q?)=XO@><B!W;"YA5%CG<]'*L4_'
XML$Y(N<F4Q[S=<,CQN7>LDVKT7,<=2'Z<^!3CO*2WCB;S*4UN+,N%DINED.6#
XMW2K=$HQV0V<&?51N,OR#2J(9<7U.3%!+ P0* !@!N=[ 4PY,K 9@! #)
XM @ $0 $5,24(O4T5-05!(3U(N05--#0(!$B,4%38W:(F:VSP%!A(31,7V
XMEO>A!CU:%"2(X&W3)LN8,V4V5+A#.!CB>V[9MF'AHGTKYSF'6U:NF>;=YCJ%
XMO.G6-6NF.T<Y-B7(F#ESP@19U6U:.^E[;EJZ>4&^-0OR:E@ZS)OMV[<LR%MP
XMVFC8L779A-=%W9Y-Z[8,^2+>9\C#9<>#;)IVK-RW8]^VA5OGV4$Z+4OW#M"]
XM%B31,NJ*6\-M6]8M79!/EJ[Q748H?(+[/99M7;)E0;C=<]L8;[-S7:(Y7M;)
XMA&W?$&\VTU7P'L-\XT<7GDS>'2;ZN.=.E2J"HP; \JI3B'@=QSM-W7OWKW7A
XMHIC>29U2!6DVC%:MXDR=HOP3_/487FXWTY^F[99;1KJ$(3WGUAV#5L^=<S7:
XM<$P3JE_3J0-F^MK48ME0J1.0K?0\.;?=A$&QLLBZEI^-T)V0:)+EO1)H4*$@
XMMPJ%VC5A@JWZ#!;K[WZ#U<L >T*\8]&>>6]L/)GK3:>K+CI5YQ;ZW27]&I>^
XM&R;;N%#XJZQVXV2QSZ;09 @?3Q.69]C'O#4"4$L#! H & +EP0Q@=2QO:
XM]@, ,X( 0 14Q)0B]35%))3D=3+D%330T" 1(C%!4V-VB)FML\!082
XM$T3%]I;WH08]6A0DB.!MTR;+F#-E-E2X0SA<]G9;EN[7N73EIG5[%F1+D&:,
XM-UF08:;GW;=RUX*X+LW*?=NF^L76-6NVK!S]>)1C4X*,F3.G3)!5W::UD[WG
XMIJ6;%^1;LR"OAJ7#O-F^?<N"O 6GC88=6Y=->%V$6EWKLF6X!7FX['B03=..
XMP==C]#7<.L\.TLG4DF@9=<6MX;8MZY8NR"=0U_@N\Q0^P?T>R[8NV;(@VX:=
XMV\9XFYWK$LWQLDXF;/N&>+.9KH+W&.8;OR#CIC>9O3O,]'FWZ1U6+ATP8ZKG
XM3I4J@J,&\/*J4\!X'<<[35-#1Z)84^>9JT&JB--9:#?D9P-7L[ NR"\[M5QQ
XM/\@4T#PH4Z8@H3Y-ZI1J4:E3F/?4J56;%B6BIPXJ)6^TX9@IME@V>JHM(PF!
XM:>^Y:(XGT2G3H1:9CHMBDX%2.&?->\YQGYH$JUX)-*@0X@T21O/>*A1JE_&$
XM']O.<1>*93Q-8SR,DNN8)G*,M'$,S"''R)@PQ@NP<;E;Y:EX-3KD#M/2=-&6
XM89=S-J>2^+(N9/=X8(LY<<9(M6&.:Y<P@ 9'6]&+[JTCNL_!4F6G96 6CEZW
XM&5+3R?8POMT@+*L@XV8:JX;VDUQAGA SN$/H1K+,T=UL-B/>>8QW2C'K3BWF
XM'.X].69;CW'->E?'2_D2JXY7823=-V'7L7JKS9@92NY6O(99%DTPW*.5\)XS
XMMEU9!'N;XR5TOQ%Z7J;Z29<S@(:Y<XENKW&-SC/ESX6S=#&S_N57,>NT9XQ:
XM[^]2!IU%M"*J!(_S<DEM8Y4Y_%B\>J8[#7.P<>NFH<R3?>L&48=D2.WA43:=
XMVL(RNRG(,V(HIJKH2=UPN%Q2KC.W7#E/W)4;Y)WE7>?YE3:%X@Q(_+T%?_\)
XM\DAC%EU6BK7+>HXJ-5T6K/NS=4(3P1FH;U2IWN1DT_#*9KG+R#GARK%6MKA,
XM;CFC5D:\W;1AV;)8!J13'/PF6E1HU2-BJ&4%YCWA(5/LWF?JR /4,'G \F1K
XMUL>>\&7$(&G4'FPR^Y'RJOU8-_RU"\;"/+8">86'HKH*0152=;GKELD-[ XB
XMC_4Y)_-/RY:-:IFU9-'%L..^N#*'ML9+9[.)U4.N,0\*:.Y)19^<0[//)N8.
XM<Y9RPS.:3N'B$%Z/672Q#7>76'+ C7&ZK*WK82M-;3;@-G;>11/$WVE"DG5[
XMD@['9*_(NFX=3'0:3-1XQAJ4V/#21FR66(<IJN\TJLK\ZU1^KO(S3RZ,&:?!
XMWVA?HFXIW*7R(+$BO%&O(H.\JCE]&TYK.(*A8@'2=);Q<\P^$? PKU-@'43,
XM0MC/M*^G-E!+ P0* !@ 0EWH74*TVDE\$ ">"@ $ $5,24(O5$E-
XM14]55"Y!4TT- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]W<V5+@3)$BJ:=N6E0M2
XM[MNZ=-.Z+3L79$N0=>>6!2&\Z7Y522?[K!\DW3?>N^S8LFGM7.^P(,>R?3MV
XM+4B[8=G6:=YWT:8=BX:8!8<^-JQ;D&S#TLEV,>?+>,\1WF22=Q[K9\O&7)\Y
XMWFC7?O'&[Z:E0PRLZQ6LX"$E?;)EJ+V-V@>9UHS3(\;2]YQAX/#OL77E^-UD
XM78*@AQ2]Z5AO-VXU#&/I]"D59"9V:;^+8Q.NXG?5N6'/H&L=V1">+J &YE@F
XM40AKMW2@?\SU)@.M4^YH#X9[9+AC_.^J>@^%>Z"-1P%,^:538$VC')L29,R<
XM.?KNJFZL>+ESA%1;ZC=(]94X!?Q^RV(:HM$P0VXVX7419K7GD2\BCCQ<=CS(
XM)EH7Y.NI;@NW3A#22=]]]ZV<(3;1,NJ*6\.YNL3^4[-FQG<9IYG0=G8Y9\$;
XMILL8QO-F2Z=O[4ANI6WA-L2&ZN)<%.NU9<K$[B+0T'6XT"#;(*';&&^S<UVB
XM.5[=(;\AWFRTJ^ M-.G3J4.9+DU8-F[=A#!IVE"<1)KT:].@6*+KF#B@G^D3
XMZ.R8PQ0+$XW^''-LY<;;G;1IT:=5J4!O,GGN,-"WW5BGP\JE@UG;SHPFMBK\
XMX82?(;)5L=K<8<6R+:.["^9EQB?9.^6:)8SG_98M631 J#XW6;$@FL_:F%3J
XM:\ZU>*1L)!XPU7$GBI7%\%TGV_QY7?0IU\$-\OXK@085"G*K4*A=O!/K>BY:
XM,\X)/G<:YL19348_9:UU;@5Q) FRBQ-QY'O,TQ1Y[$H9Y1&4D4/*-X@ALS<3
XMT;TL'N*U6<4-'/OT2I R_L:9;OG],:6AY RG)#CK/(&0G@#I<,,3)MP1ZC=3
XM.66O2*<"<U(L\A7GEING_/#\!$S*($R:DX"#%-*G"_HQS/;.F#%MUG >G%G.
XM1\^BYTN;-$'V2-XX7<J$.=.E2Q?QZ2'Q;V-YTZG,@M0G^&++&::67^Z8O-7R
XMZ(W#33!^76.: !"8#4U/$ 08-"4(U>.&@*Y8(P."3(#*." @G1'NR"#2$C56
XMB"6[6)="K"/LSKJ&T71,V#7Q;)#Z#E-V#M?$.NY"F:AEF,["C$]S""H0EIC+
XMT2KJ>J61RB)?*;??C-PAZSS'2#57$A2OXJH^U'7\&>SJ>L"WJK%UX63)%':7
XMR9I"7U%J,T?&!8%M/>]!=M&R6B,4\.+();Y02:F+>E*'8+&P2!9Q3;"0P]HA
XM6OGE9F+E;BJ_G&W(F%75LLMI"G*!#*)CNIMB+&Y8(9T+;39 7M$P=ANX<W6E
XMNI@#4L.IXLFD=$IA&:'C]$L9@0CG!RCLX^D*:5!WU#ZZ<1XO53S4A76X:7+:
XMT( 7<US+6:R46P<[/@QVTLS7M0\*9]@^\!;?:212Q?1Y2J_)F7$TW#Z0@E<[
XMJ6/GL=U4Y""4_YPNXM54+>4LQ'2CC%4;X5*-+,!K'85&P#KRF#\D")2%^\98
XMO@-02P,$"@ 8 %K!8&"ZVNW6( @ -PD \ !%3$E"+TU!0U)/4RY(
XM4TT- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]QLJ3&H4)(C@:;2JTZ%?F3QOH$&%
XM//>B4:L<=QO2'U:,=-BB3*<660^5QGHHTE_4*1%R9;R"=UHSZA!+/JU*Y7GR
XM-!I6#O6NZW8LW;1OW<[U@;W+LIU;QCO>:9GOL&[)+*MG)%2J4IQ!A_HVK5NZ
XM9>4T \,[AID*WF/+XJ4KUTWX;AMVK-PWZ7\UJ-2C,>J&6A2+NW;R_%]-@'>3
XM.HT8+W)L.W2G1;B;.'5,!2_G;P//QX9ERQ8$/&#8YT.#,F5RW<R77$&.XL?.
XMPWS'_0,;;EVQ;-..^0=37?S'10V3G?')I3X=4K5 FGF'@&3PH5:=BN1X"H4R
XMG6SZU"J(Z9KE%.LX]7QJDNE0B4S';45(U6.V!&4K- 72%/+#01K*,0QH+2T<
XM?EIN6;IU'F?XX?BBGT(%P1?,=$9FS),8DYJ%F3#JV?2 73"E%J6RN3#255I*
XM**#.I;.:36<O>!;%4T8]*,WD5RJ$.;B]Z-$FUIH*?9?A)ZH[ P_I3Z! M]($
XMCC^8JN24?##3!3NPWY(M$[S-P 6 "LT2O:A2H7VA3).,;I\<^I1HT1/QH2RM
XMB.9!ITZM JQ^_5-U@DB/"0KF'-#60O@& 1LS,KADP]RAC$S$-B<:E&H0?[CK
XM_50J$>[J'R4^3Z@G_NFO0O#5ES'X(8C_B?3$?16\B1X)C:YRVC,N07Q/%L?C
XM6V %E0A6DZ_(]Y3E^"++*;6@BIT[A[1%Z#*W6-UPO@'W'P<ZMM^"@F&/:,9<
XMM8-6O39E].V<" ?%OB*'D<_(07AO?XQS$*QHZ$"$/]+!T#=UX)R#PGJ$/0.G
XM'8PZ$(_)Z:>S#ASUX%W#@(>AR0U02P,$"@ 8 9EP\#@JFZ'; 4@$
XM !$ !%3$E"+TU!4TU$1493+DA330T" 1(C%!4V-VB)FML\!082$T3%]I;W
XM@TH]"C-APJ)1JQ!OF@T5-'^,YM)&<Y?17.)H[C.:RY@PG#L-YUR&<Z_AG"'3
XM-IRS9 O>2)-^9?K4Z9'I4BA4D"M!3)OTJ@ZM_:46I?KE?5&71+% 5^<+N@P"
XM_4:)?@U*5&G5J52D:QCA<HCX-B)>P@R*)GK"K3L7[=>T($&V#3M6[AOGA;R"
XME_0XGF33/$><\UR6=4NVC7Y_"R=_Z$>2WB#48YXS94P_!U!+ P0* 0"'
XMBJ$61Y.N9-, @ 0 #@ $5,24(O34]$14PN2%--.T (' B"3!DS:=R4
XM 2$FS1D0;^2 F-,F#!LV(-J\,8C13$00;-*(D1-&3AX08>;,*=-&#)N38S:6
XM::" II$@3*84&5@F3AV"(&#0I"*ERDZ>/H'&H$DS(!4T:>: B KBC)PW*AG6
XMH0/B3L0U4NNX,2B12I I35".!='D;%H:+F" J .G*<TT9D 8J>)DR!<F-OGZ
XMG0*BYT^A"J 0_5LXZ=+$BPD;#DJS#)N5@?M^D>R8IF(IC"<C_KRY\<_'9<;B
XM9:H@25\F58CLK#CFZAP7:"BR!E!+ P0* 0"9:7L56@7A;XT "R
XM#P $5,24(O3U542$5815,N0R]4-% 0@6(-W7HH"F#I\P<$"U D*G3!@X(
XM-R 6X@$A)@\=AR#HO $QAPZ9-&\&%E2IXL7 @0@5,G2( @0<%A=!I!@X!DT8
XM.2#,_"P(9\? -&[H7#2J8(]*$%#OH$G#I@R(FFY:1/0! D8*$$X)0AT+-:;&
XMFBK@K%B1@BE9LC%[HC@!XD3;IU#[#-2K %!+ P0* !@ $16459,+7LUH!
XM !8 @ "P $5,24(O44U31RY##0(!$B,4%38W:(F:VSP%!A(31,7VEO=?
XMJFRH$*1*D&3+BJU[]FQ:MV=!MBT[=V[8,\3;I4N7(,>&=0M2;%F0=>>6)0MB
XM>\]-4[Z,GVY9N7+KPJ4[YWX,SQ?$*WC/I1N6;MHQW1.DV;!RJ/?<L7++EG53
XMOI1W3Y P\0K%"1-&\&2Z(WV3A5N7[EBT*$'B!9F">2$O]L=3_7N2'43P3FL6
XM) KLW6-^G^3J]F1*$,40Q13#L<^R;*ZN=(V"/+UR98KS^]\FU+=9,\J;C_S?
XM:%_LWZ?>V\X],Z_GS*/ +GI$U$*>:9-WT:9ELZU1F%_\3# W<U[C&L3X[#-7
XMDD5;%F^,N+:4V"N4PDUO$W0G3+,[M"*HWR?('.SK^,1ZT),@5R1_B_(/(Q5&
XM>J_H?I@G=WB-1"Z6$O<NXQYH5>-]^J0)(BK&-E(V!*/[1#8\C6P@N,>T-4@<
XMVY"@II)IC5!+ P0* !@#C6^$8'S*4(6P" #Y P #0 $5,24(O34%+
XM149)3$4- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T>"C!ES)DR6(*^6)9.\02JM
XMRQ9D3ID-%8X0?I!.R]I-R_;D7)!VR\J=F_:M6Y!OS8(LRC2I4)!&N38-NK2H
XMT:1,B^H$";*.]G9[%B35NG+%O@4Y%,3RGDNW;%@RZE/H6[ELP[I1WD.:F33Q
XMWUN"9)M6K-RP<O.8SZ93A[ZD@K_'OFT+-RP=Z\VV+$BS==V.I?/N<^ GB. *
XM6;YE,[SP]=2F+]V6O8-<4R&^_%BZ;]^P8^ [[-HR>A?531<MR+EMP[)E(\R@
XM;KEGR[9L^Y9L639#R[1ES(7P'CJT)]VQ8X[?*-.@1Z?V&+O#"*_WW=+,VMWR
XMB/!^(KRU"&\B:S?1IU..=]*Q.KFP;RYK]5BV=9+5_&[ZE,A5-;^N]9SEDLGR
XMLS%:!YT[MVR;K2_'JN+79\!/[J7K,%)7\JE3ZAN/M*;C?,8X6:-5G0[],JQA
XM3.=,II,QJFFB9<WTJ[<:ZM"6<^&6'9N&>8\%T;0P5W+L,N33Y5B7;\6JU8&\
XMA,1)HABK4Z3K,<B73J>0'D-;\JMTP=?4<SI;/DB7+KD8/]<[6ZJU&L[;E;]7
XMD*]FH#)I!JALSS039D_)0QO:F.<L@SCC*+8LLN4.LP'>,K"9+ ,&V;C)+M0W
XMG=7N,MSO8OBD!V*GB^&KWE$JWT==/A6J%.33JE21%L5:= IS%QITZ-*C4IT2
XM86ZUG_J>2F6YX587A>*>#T62W+DXJ_WJ.I^"G':2W),ZI?*NDHOYO71JU2;,
XM+5\_M5HDN1[:%(HR/K7(9C54I$^E/'>J29L6.;;E!G1+\=]'MMEC)%!+ P0*
XM !@ A9^T8C>1,_R8' #\#@ #@ %-20R]!4TU02U0N05--#0(!$B,4
XM%38W:(F:VSP%!A(31,7VEO=W-E0@/$&"K#HW[-FR('4L?P+F%;Q;PEU+MZQ;
XMNG+S<+?@]!?K#SNW;5JW:>FB!&GW;5JR(,V&E0M2)4BQ=<V:+2MW+DL0V9LN
XMR+9A\3P?<Y'\;)!U"G,<Y=B4(&/FS!GC70EK._%WK/."?&L6Y-4P[5HNV[=O
XM6;A#-!IV;%TVX751MV><=1GR1;S/D(?+C@?9-.U8N6_'OFT+M\ZS@W1:EN[=
XMMW+7@B1:1EUQ:[AMH#K()VC7^"[C-!/:W[IQSH(W3)<QC*=,F2V;ALW;(NW+
XM")<N04)U<2Z*]1K]0GCY8_9Z+-NZ9,O4M2N7\;*K7:(Y7MTAOR'>;+2KX/U4
XM:M*C29T&9>*]R\:M,V]*44)WT"K@,T'8C6=/[39!F_Y5[EB[7\>&9<LVAG5P
XM9;S/,=VV;_U[:E.H2ZD\;S).ZC#/ISV4YQSA+9>.\IY*->C0I5^-)F7*I)WB
XM9W/ET*$S9R+IEU/0]Q@WMYDYU]'K8W2YY=:%,^=&&]8M&2*TG&"=1)B>FE1K
XMD6#(-6/*^%N*S4._Y_A%DKUS7,NL:6-Y*2L_U-"$Y%_4*=$OTA34B"3L5FYL
XM,ER9WPZ"*ZJ;IV&K01B)N+.Z79F 7B?\T=QP=\S%=9SR+'N&N: 7Y8I9#-LS
XM)B[1M+'AQ-5?R=1OHE?0QW,YYSDLG.?"[,/)W2?\<ELL"GB=(.%8:8O3(.66
XM 4+5]D&X,<I4[KL-]AZ;%@X<C*N>6K5I$68]5:?3IU21%-U'>JNG+,<764ZM
XMWQF'YDZCQ1*Z08:]4SH-D@[3%8Z3E5.9>7*.N$+>=--\?O/663T'";N<=NDB
END_OF_FILE
if test 55773 -ne `wc -c <'netramet/pc/NTM.Zip.UU.A'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU.A'\" unpacked with wrong size!


else
PARTS=""
for I in A B C D E ; do
if test -f netramet/pc/NTM.Zip.UU.$I ; then
PARTS="${PARTS}${I}"
fi
if test "${PARTS}" = "ABCDE" ; then
echo shar: Combining \"'netramet/pc/NTM.Zip.UU'\" \(264641 characters\)
cat netramet/pc/NTM.Zip.UU.[A-E] > 'netramet/pc/NTM.Zip.UU'
if test 264641 -ne `wc -c <'netramet/pc/NTM.Zip.UU'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU'\" combined with wrong size!
else
rm netramet/pc/NTM.Zip.UU.[A-E]
echo shar: Uudecoding \"'netramet/pc/NTM.Zip'\" \(192048 characters\)
cat netramet/pc/NTM.Zip.UU | uudecode
if test 192048 -ne `wc -c <'netramet/pc/NeTraMet.zip'`; then
echo shar: \"'netramet/pc/NTM.Zip'\" uudecoded with wrong size!
else
rm netramet/pc/NTM.Zip.UU
fi
fi
fi
done
fi

# end of 'netramet/pc/NTM.Zip.UU.A'
fi
echo shar: End of archive 5 \(of 25\).
cp /dev/null ark5isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:07:14 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 94
Archive-name: netramet/part06
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/apps/snmptrap.c netramet/src/meter/met_vars.c
# netramet/src/snmplib/include/ausnmp.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:06 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 6 (of 25)."'
if test -f 'netramet/src/apps/snmptrap.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmptrap.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmptrap.c'\" \(6730 characters\)
sed "s/^X//" >'netramet/src/apps/snmptrap.c' <<'END_OF_FILE'
X/*
X * snmptrap.c - send snmp traps to a network entity.


X *
X */
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X

XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <sys/time.h>
X#include <sys/socket.h>
X#include <net/if.h>
X#include <sys/ioctl.h>
X#include <sys/file.h>
X#include <nlist.h>
X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"


X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

X#define NUM_NETWORKS 16 /* max number of interfaces to check */
X
Xoid objid_enterprise[] = {1, 3, 6, 1, 4, 1, 3, 1, 1};
Xoid objid_sysdescr[] = {1, 3, 6, 1, 2, 1, 1, 1, 0};
X
Xstruct nlist nl[] = {
X { "_boottime" },
X { "" }
X};
X
X
Xint snmp_input(){
X}
X
X#ifndef IFF_LOOPBACK
X#define IFF_LOOPBACK 0
X#endif
X#define LOOPBACK 0x7f000001
Xu_long
Xget_myaddr(){
X int sd;
X struct ifconf ifc;
X struct ifreq conf[NUM_NETWORKS], *ifrp, ifreq;
X struct sockaddr_in *in_addr;
X int count;
X int interfaces; /* number of interfaces returned by ioctl */
X
X if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
X return 0;
X ifc.ifc_len = sizeof(conf);
X ifc.ifc_buf = (caddr_t)conf;
X if (ioctl(sd, SIOCGIFCONF, (char *)&ifc) < 0){
X close(sd);
X return 0;
X }
X ifrp = ifc.ifc_req;
X interfaces = ifc.ifc_len / sizeof(struct ifreq);
X for(count = 0; count < interfaces; count++, ifrp++){
X ifreq = *ifrp;
X if (ioctl(sd, SIOCGIFFLAGS, (char *)&ifreq) < 0)
X continue;
X in_addr = (struct sockaddr_in *)&ifrp->ifr_addr;
X if ((ifreq.ifr_flags & IFF_UP)
X && (ifreq.ifr_flags & IFF_RUNNING)
X && !(ifreq.ifr_flags & IFF_LOOPBACK)
X && in_addr->sin_addr.s_addr != LOOPBACK){
X close(sd);
X return in_addr->sin_addr.s_addr;
X }
X }
X close(sd);
X return 0;
X}
X
X/*
X * Returns uptime in centiseconds(!).
X */
Xlong uptime(){
X struct timeval boottime, now, diff;
X int kmem;
X
X if ((kmem = open("/dev/kmem", 0)) < 0)
X return 0;
X nlist("/vmunix", nl);
X if (nl[0].n_type == 0){
X close(kmem);
X return 0;
X }
X
X lseek(kmem, (long)nl[0].n_value, L_SET);
X read(kmem, &boottime, sizeof(boottime));
X close(kmem);
X
X gettimeofday(&now, 0);
X now.tv_sec--;
X now.tv_usec += 1000000L;
X diff.tv_sec = now.tv_sec - boottime.tv_sec;
X diff.tv_usec = now.tv_usec - boottime.tv_usec;
X if (diff.tv_usec > 1000000L){
X diff.tv_usec -= 1000000L;
X diff.tv_sec++;
X }
X return ((diff.tv_sec * 100) + (diff.tv_usec / 10000));
X}
X
Xu_long parse_address(address)
X char *address;
X{
X u_long addr;
X struct sockaddr_in saddr;
X struct hostent *hp;
X
X if ((addr = inet_addr(address)) != -1)
X return addr;
X hp = gethostbyname(address);
X if (hp == NULL){
X fprintf(stderr, "unknown host: %s\n", address);
X return 0;
X } else {
X bcopy((char *)hp->h_addr, (char *)&saddr.sin_addr, hp->h_length);
X return saddr.sin_addr.s_addr;
X }


X
X}
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X struct snmp_session session, *ss;
X struct snmp_pdu *pdu;

X struct variable_list *vars;


X int arg;
X char *gateway = NULL;
X char *community = NULL;

X char *trap = NULL, *specific = NULL, *description = NULL, *agent = NULL;
X
X
X /*
X * usage: snmptrap gateway-name community-name trap-type specific-type device-description [ -a agent-addr ]


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){

X case 'a':
X agent = argv[++arg];
X break;


X case 'd':
X snmp_dump_packet++;
X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];

X } else if (trap == NULL){
X trap = argv[arg];
X } else if (specific == NULL){
X specific = argv[arg];
X } else {
X description = argv[arg];
X }
X }
X
X if (!(gateway && community && trap && specific && description)){
X printf("usage: snmptrap host community trap-type specific-type device-description [ -a agent-addr ]\n");
X exit(1);
X }
X
X bzero((char *)&session, sizeof(struct snmp_session));


X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X session.callback = snmp_input;

X session.callback_magic = NULL;
X session.remote_port = SNMP_TRAP_PORT;


X ss = snmp_open(&session);
X if (ss == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X pdu = snmp_pdu_create(TRP_REQ_MSG);
X pdu->enterprise = (oid *)malloc(sizeof(objid_enterprise));
X bcopy((char *)objid_enterprise, (char *)pdu->enterprise, sizeof(objid_enterprise));
X pdu->enterprise_length = sizeof(objid_enterprise) / sizeof(oid);
X if (agent != NULL)
X pdu->agent_addr.sin_addr.s_addr = parse_address(agent);
X else
X pdu->agent_addr.sin_addr.s_addr = get_myaddr();
X pdu->trap_type = atoi(trap);
X pdu->specific_type = atoi(specific);
X pdu->time = uptime();
X
X pdu->variables = vars = (struct variable_list *)malloc(sizeof(struct variable_list));
X vars->next_variable = NULL;
X vars->name = (oid *)malloc(sizeof(objid_sysdescr));
X bcopy((char *)objid_sysdescr, (char *)vars->name, sizeof(objid_sysdescr));
X vars->name_length = sizeof(objid_sysdescr) / sizeof(oid);
X vars->type = ASN_OCTET_STR;
X vars->val.string = (u_char *)malloc(strlen(description) + 1);
X strcpy((char *)vars->val.string, description);
X vars->val_len = strlen(description);
X
X if (snmp_send(ss, pdu)== 0){
X printf("error\n");
X }
X snmp_close(ss);
X}
X
END_OF_FILE
if test 6730 -ne `wc -c <'netramet/src/apps/snmptrap.c'`; then
echo shar: \"'netramet/src/apps/snmptrap.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmptrap.c'
fi
if test -f 'netramet/src/meter/met_vars.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/met_vars.c'\"
else
echo shar: Extracting \"'netramet/src/meter/met_vars.c'\" \(53127 characters\)
sed "s/^X//" >'netramet/src/meter/met_vars.c' <<'END_OF_FILE'
X/* 1125, Tue 5 Oct 93
X
X MET_VARS.C: AU Internet Accounting Meter snmp agent
X Based on the CMU snmpd version, snmpd.c
X
X Copyright (C) 1992,1993 by Nevil Brownlee,
X Computer Centre, University of Auckland */
X
X#define noTESTING
X#define noGC_TEST
X
X#include "ausnmp.h"
X
X#include <ctype.h>
X#include <sys/types.h>
X
X#ifdef AU_MSDOS
X#include <alloc.h>
X#endif
X
X#ifdef SUNOS
X#include <malloc.h>
X#ifdef TESTING
X#include "stdio.h"
X#endif
X#endif
X
X#include "pktsnap.h"
X#include "flowhash.h"
X
X#ifdef AU_MSDOS
X#include "tcp.h"
X
X#else
X
X#include <nlist.h> /* BSD include files, used in CMU snmpvars.c */
X#include <syslog.h>
X#include <sys/time.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <sys/param.h>
X#include <sys/dir.h>
X#include <net/if.h>
X#include <net/route.h>
X#include <netinet/in_pcb.h>
X#include <netinet/if_ether.h>
X#include <netinet/in_systm.h>
X#include <netinet/in_var.h>
X#include <netinet/ip.h>
X#include <netinet/ip_var.h>
X#include <netinet/tcp.h>
X#include <netinet/tcp_timer.h>
X#include <netinet/tcp_var.h>
X#include <netinet/tcp_fsm.h>
X#include <netinet/udp.h>
X#include <netinet/udp_var.h>
X#include <netinet/ip_icmp.h>
X#include <netinet/icmp_var.h>
X
X#ifdef BSD_UNIX /* Not provided by SG Irix or giving errors with SunOS */
X#include <machine/pte.h>
X#include <sys/ioctl.h>
X#include <sys/proc.h>
X#include <sys/protosw.h>
X#include <sys/user.h>
X#include <sys/vm.h>
X#endif
X
X#endif /* End !AU_MSDOS */
X
X#ifndef NULL
X#define NULL 0
X#endif
X
X#include "asn1.h" /* CMU snmp include files */
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "mib.h"
X
X#include "met_vars.h" /* Constants for snmp oids */
X
Xlong long_return;
X
Xvoid init_snmp()
X{ }
X
X#define INT_ACCT 1, 3, 6, 1, 3, 99
X#define U_AUCKLAND 1, 3, 6, 1, 4, 1, 411
X
Xchar version_descr[] = "NeTraMet: Network Traffic Meter V2.0";
Xoid version_id[] = {
X 1, 3, 6, 1, 4, 1, 411, 1, 2,2};
X/* iso.org.dod.internet.private.enterprises.U_Auckland.monitor.2.2 */
X
Xstruct variable variables[] = {
X /* these must be lexicographly ordered by the name field */
X {{MIB, 1, 1, 0}, 9, STRING, VERSION_DESCR, RONLY, var_system},
X {{MIB, 1, 2, 0}, 9, OBJID, VERSION_ID, RONLY, var_system},
X {{MIB, 1, 3, 0}, 9, TIMETICKS, UPTIME, RONLY, var_system},
X {{MIB, 2, 1, 0}, 9, INTEGER, IFNUMBER, RONLY, var_system},
X
X {{INT_ACCT, 1, 1, 0}, 9, INTEGER, HIGHWATERMARK, RWRITE, var_system},
X {{INT_ACCT, 1, 2, 0}, 9, INTEGER, FLOODMARK, RWRITE, var_system},
X {{INT_ACCT, 1, 3, 0}, 9, INTEGER, INACT_TIMEOUT, RWRITE, var_system},
X {{INT_ACCT, 1, 5, 1, 1, MAX_SUBID}, 11, INTEGER, CIINDEX, RONLY, var_rinfo},
X {{INT_ACCT, 1, 5, 1, 2, MAX_SUBID}, 11, STRING, CIPEERADDR, RONLY, var_rinfo},
X {{INT_ACCT, 1, 5, 1, 3, MAX_SUBID}, 11, TIMETICKS, CILASTTIME, RONLY, var_rinfo},
X {{INT_ACCT, 1, 5, 1, 4, MAX_SUBID}, 11, TIMETICKS, CIPREVTIME, RONLY, var_rinfo},
X {{INT_ACCT, 1, 6, 0}, 9, TIMETICKS, LAST_COLLECT_TIME, RWRITE, var_system},
X {{INT_ACCT, 1, 7, 1, 1, MAX_SUBID}, 11, INTEGER, RIINDEX, RONLY, var_rinfo},
X {{INT_ACCT, 1, 7, 1, 2, MAX_SUBID}, 11, INTEGER, RIRULESIZE, RWRITE, var_rinfo},
X {{INT_ACCT, 1, 7, 1, 3, MAX_SUBID}, 11, INTEGER, RIACTIONSIZE, RWRITE, var_rinfo},
X {{INT_ACCT, 1, 8, 0}, 9, INTEGER, CURRENT_RULE_SET, RWRITE, var_system},
X {{INT_ACCT, 1, 9, 0}, 9, INTEGER, EMERGENCY_RULE_SET, RWRITE, var_system},
X
X {{INT_ACCT, 2, 1, 1, 1, MAX_SUBID}, 11, INTEGER, FTFLOWINDEX, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 2, MAX_SUBID}, 11, INTEGER, FTFLOWSTATUS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 3, MAX_SUBID}, 11, INTEGER, FTLOWINTERFACE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 4, MAX_SUBID}, 11, INTEGER, FTLOWADJACENTTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 5, MAX_SUBID}, 11, STRING, FTLOWADJACENTADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 6, MAX_SUBID}, 11, STRING, FTLOWADJACENTMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 7, MAX_SUBID}, 11, INTEGER, FTLOWPEERTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 8, MAX_SUBID}, 11, INTEGER, FTLOWPEERTYPEMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 9, MAX_SUBID}, 11, STRING, FTLOWPEERADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 10, MAX_SUBID}, 11, STRING, FTLOWPEERMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 11, MAX_SUBID}, 11, INTEGER, FTLOWDETAILTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 12, MAX_SUBID}, 11, INTEGER, FTLOWDETAILTYPEMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 13, MAX_SUBID}, 11, STRING, FTLOWDETAILADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 14, MAX_SUBID}, 11, STRING, FTLOWDETAILMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 17, MAX_SUBID}, 11, INTEGER, FTHIINTERFACE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 18, MAX_SUBID}, 11, INTEGER, FTHIADJACENTTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 19, MAX_SUBID}, 11, STRING, FTHIADJACENTADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 20, MAX_SUBID}, 11, STRING, FTHIADJACENTMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 21, MAX_SUBID}, 11, INTEGER, FTHIPEERTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 22, MAX_SUBID}, 11, INTEGER, FTHIPEERTYPEMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 23, MAX_SUBID}, 11, STRING, FTHIPEERADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 24, MAX_SUBID}, 11, STRING, FTHIPEERMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 25, MAX_SUBID}, 11, INTEGER, FTHIDETAILTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 26, MAX_SUBID}, 11, INTEGER, FTHIDETAILTYPEMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 27, MAX_SUBID}, 11, STRING, FTHIDETAILADDRESS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 28, MAX_SUBID}, 11, STRING, FTHIDETAILMASK, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 33, MAX_SUBID}, 11, INTEGER, FTPDUSCALE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 34, MAX_SUBID}, 11, INTEGER, FTOCTETSCALE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 35, MAX_SUBID}, 11, INTEGER, FTRULESET, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 36, MAX_SUBID}, 11, INTEGER, FTFLOWTYPE, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 37, MAX_SUBID}, 11, COUNTER, FTUPOCTETS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 38, MAX_SUBID}, 11, COUNTER, FTUPPDUS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 39, MAX_SUBID}, 11, COUNTER, FTDOWNOCTETS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 40, MAX_SUBID}, 11, COUNTER, FTDOWNPDUS, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 41, MAX_SUBID}, 11, TIMETICKS, FTFIRSTTIME, RONLY, var_ft},
X {{INT_ACCT, 2, 1, 1, 42, MAX_SUBID}, 11, TIMETICKS, FTLASTTIME, RONLY, var_ft},
X
X {{INT_ACCT, 2, 2, 1, 1, MAX_SUBID, MAX_SUBID}, 12, TIMETICKS, FTCRFIRSTTIME, RONLY, var_flow_index},
X {{INT_ACCT, 2, 2, 1, 2, MAX_SUBID, MAX_SUBID}, 12, INTEGER, FTCRFLOWINDEX, RONLY, var_flow_index},
X
X {{INT_ACCT, 2, 3, 1, 1, MAX_SUBID, MAX_SUBID}, 12, TIMETICKS, FTACFIRSTTIME, RONLY, var_flow_index},
X {{INT_ACCT, 2, 3, 1, 2, MAX_SUBID, MAX_SUBID}, 12, INTEGER, FTACFLOWINDEX, RONLY, var_flow_index},
X
X {{INT_ACCT, 2, 4, 1, 1, MAX_SUBID, MAX_SUBID, MAX_SUBID}, 13, INTEGER, FTCOLATTRIB, RONLY, var_col_tbl},
X {{INT_ACCT, 2, 4, 1, 2, MAX_SUBID, MAX_SUBID, MAX_SUBID}, 13, TIMETICKS, FTCOLTIME, RONLY, var_col_tbl},
X {{INT_ACCT, 2, 4, 1, 3, MAX_SUBID, MAX_SUBID, MAX_SUBID}, 13, INTEGER, FTCOLINDEX, RONLY, var_col_tbl},
X {{INT_ACCT, 2, 4, 1, 4, MAX_SUBID, MAX_SUBID, MAX_SUBID}, 13, OPAQUE, FTCOLBLOB, RONLY, var_col_tbl},
X
X {{INT_ACCT, 3, 1, 1, 1, MAX_SUBID, MAX_SUBID}, 12, INTEGER, RTRULESET, RONLY, var_rt},
X {{INT_ACCT, 3, 1, 1, 2, MAX_SUBID, MAX_SUBID}, 12, INTEGER, RTRULEINDEX, RONLY, var_rt},
X {{INT_ACCT, 3, 1, 1, 3, MAX_SUBID, MAX_SUBID}, 12, INTEGER, RTSELECTOR, RWRITE, var_rt},
X {{INT_ACCT, 3, 1, 1, 4, MAX_SUBID, MAX_SUBID}, 12, STRING, RTRULEMASK, RWRITE, var_rt},
X {{INT_ACCT, 3, 1, 1, 5, MAX_SUBID, MAX_SUBID}, 12, STRING, RTMATCHVALUE, RWRITE, var_rt},
X {{INT_ACCT, 3, 1, 1, 6, MAX_SUBID, MAX_SUBID}, 12, INTEGER, RTRULEACTION, RWRITE, var_rt},
X {{INT_ACCT, 3, 1, 1, 7, MAX_SUBID, MAX_SUBID}, 12, INTEGER, RTJUMPINDEX, RWRITE, var_rt},
X
X {{INT_ACCT, 4, 1, 1, 1, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATACTIONINDEX, RONLY, var_rt},
X {{INT_ACCT, 4, 1, 1, 3, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWINTERFACE, RONLY, var_rt},
X {{INT_ACCT, 4, 1, 1, 4, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWADJACENTTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 5, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWADJACENTADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 6, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWADJACENTMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 7, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWPEERTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 8, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWPEERTYPEMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 9, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWPEERADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 10, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWPEERMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 11, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWDETAILTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 12, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATLOWDETAILTYPEMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 13, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWDETAILADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 14, MAX_SUBID, MAX_SUBID}, 12, STRING, ATLOWDETAILMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 17, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIINTERFACE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 18, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIADJACENTTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 19, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIADJACENTADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 20, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIADJACENTMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 21, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIPEERTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 22, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIPEERTYPEMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 23, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIPEERADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 24, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIPEERMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 25, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIDETAILTYPE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 26, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATHIDETAILTYPEMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 27, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIDETAILADDRESS, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 28, MAX_SUBID, MAX_SUBID}, 12, STRING, ATHIDETAILMASK, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 33, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATPDUSCALE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 34, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATOCTETSCALE, RWRITE, var_rt},
X {{INT_ACCT, 4, 1, 1, 35, MAX_SUBID, MAX_SUBID}, 12, INTEGER, ATACTIONSET, RWRITE, var_rt},
X
X {{U_AUCKLAND, 1, 1, 0}, 10, INTEGER, MSSTATSRESET, RWRITE, var_system},
X {{U_AUCKLAND, 1, 2, 0}, 10, INTEGER, MSSTATSTIME, RONLY, var_system},
X {{U_AUCKLAND, 1, 3, 0}, 10, INTEGER, MSNPACKETS, RONLY, var_system},
X {{U_AUCKLAND, 1, 4, 0}, 10, INTEGER, MSTBACKLOG, RONLY, var_system},
X {{U_AUCKLAND, 1, 5, 0}, 10, INTEGER, MSMXPKTRATE, RONLY, var_system},
X {{U_AUCKLAND, 1, 6, 0}, 10, INTEGER, MSMXBACKLOG, RONLY, var_system},
X {{U_AUCKLAND, 1, 7, 0}, 10, INTEGER, MSNFLOWS, RONLY, var_system},
X {{U_AUCKLAND, 1, 8, 0}, 10, INTEGER, MSFLOWSRCV, RONLY, var_system},
X {{U_AUCKLAND, 1, 9, 0}, 10, INTEGER, MSNMATCHES, RONLY, var_system},
X {{U_AUCKLAND, 1, 10, 0}, 10, INTEGER, MSHASHSRCHS, RONLY, var_system},
X {{U_AUCKLAND, 1, 11, 0}, 10, INTEGER, MSHASHCMPS, RONLY, var_system},
X {{U_AUCKLAND, 1, 12, 0}, 10, INTEGER, MSTHASHSZ, RONLY, var_system},
X {{U_AUCKLAND, 1, 13, 0}, 10, INTEGER, MSNHASHENTS, RONLY, var_system},
X {{U_AUCKLAND, 1, 14, 0}, 10, INTEGER, MSGCINTERVAL, RWRITE, var_system},
X {{U_AUCKLAND, 1, 15, 0}, 10, INTEGER, MSMXFLOWS, RONLY, var_system},
X {{U_AUCKLAND, 1, 16, 0}, 10, INTEGER, MSAVIDLEPER1000, RONLY, var_system},
X {{U_AUCKLAND, 1, 17, 0}, 10, INTEGER, MSMINIDLEPER1000, RONLY, var_system},
X
X {{U_AUCKLAND, 2, 1, 0}, 10, INTEGER, PCNEARMEM, RONLY, var_system},
X {{U_AUCKLAND, 2, 2, 0}, 10, INTEGER, PCFARMEM, RONLY, var_system},
X {{U_AUCKLAND, 2, 3, 0}, 10, INTEGER, PCBADPKTS, RONLY, var_system},
X {{U_AUCKLAND, 2, 4, 0}, 10, INTEGER, PCNOBUFPKTS, RONLY, var_system},
X {{U_AUCKLAND, 2, 5, 0}, 10, INTEGER, PCLOSTPKTS, RONLY, var_system},
X };
X
Xint
Xcompare(name1, len1, name2, len2)
X register oid *name1, *name2;
X register int len1, len2;
X{
X register int len;
X /* len = minimum of len1 and len2 */
X if (len1 < len2)
X len = len1;
X else
X len = len2;
X /* find first non-matching byte */
X while(len-- > 0){
X if (*name1 < *name2)
X return -1;
X if (*name2++ < *name1++)
X return 1;
X }
X /* bytes match up to length of shorter string */
X if (len1 < len2)
X return -1; /* name1 shorter, so it is "less" */
X if (len2 < len1)
X return 1;
X return 0; /* both strings are equal */
X}
X
X/*
X * getStatPtr - return a pointer to the named variable, as well as it's
X * type, length, and access control list.
X *
X * If an exact match for the variable name exists, it is returned. If not,
X * and exact is false, the next variable lexicographically after the
X * requested one is returned.
X *
X * If no appropriate variable can be found, NULL is returned.
X */
Xu_char far *
XgetStatPtr(name, namelen, type, len, acl, exact, access_method)
X oid *name; /* IN - name of var, OUT - name matched */
X int *namelen; /* IN -number of sub-ids in name, OUT - subid-is in matched name */
X u_char *type; /* OUT - type of matched variable */
X int *len; /* OUT - length of matched variable */
X u_short *acl; /* OUT - access control list */
X int exact; /* IN - TRUE if exact match wanted */
X int *access_method; /* OUT - 1 if function, 0 if char * */
X{
X register struct variable *vp;
X register int x;
X u_char far *access;
X int result;
X register int minlen;
X register oid *name1, *name2;
X int b,t;
X
X b = 0; t = sizeof(variables)/sizeof(struct variable) - 1;
X do { /* Binary search averages about 6 compares instead of 22 */
X x = (b + t)/2;
X vp = &variables[x];
X result = compare(name, *namelen, vp->name, (int)vp->namelen);
X if (result < 0) t = x-1; /* Move top down */
X else b = x+1; /* Move bottom up */
X } while (b <= t);
X
X for (x = t, vp = &variables[x];
X x < sizeof(variables)/sizeof(struct variable); ++vp, ++x) {
X /* Find first vp entry >= requested one */
X result = compare(name, *namelen, vp->name, (int)vp->namelen);
X if ((result < 0) || (exact && (result == 0))) {
X access = (*(vp->findVar))(vp, name, namelen, exact, len, access_method);
X if (access != NULL) {
X *type = vp->type;
X *acl = vp->acl;
X return access;
X }
X }
X }
X
X return NULL;
X }
X
Xextern unsigned long snmp_peer_addr; /* Declared in meter_pc.c */
X
Xvoid display_msg(unsigned char timestamp, char *msg)
X{
X#ifdef AU_MSDOS
X if (display_enabled) {
X scpos(0,24);
X if (timestamp) printf("%02d%02d:%02d ", tod_h,tod_m,tod_s);
X else printf(" ");
X printf(msg);
X w_roll(0,7, 40,24, 1);
X }
X#else
X time_t t; char *ts;
X if (display_enabled) {
X if (timestamp) {
X time(&t); ts = ctime(&t);
X printf("%c%c%c%c:%c%c ",
X ts[11],ts[12],ts[14],ts[15], ts[17],ts[18]);
X }
X else printf(" ");
X printf("%s\n",msg);
X }
X#endif
X }
X
Xint writechar(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeint(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writelong(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeAddress(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
X
Xint writeRuleSet(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeRuleSize(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeActionSize(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeLastCollectTime(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
Xint writeStatsReset(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP);
X
Xu_char far *
Xvar_system(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X#ifndef AU_MSDOS
X struct timeval now, boottime;
X#endif
X unsigned long dummy;
X
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;
X bcopy((char far *)vp->name, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long); /* default length */
X switch (vp->magic){
X case VERSION_DESCR:
X *var_len = strlen(version_descr);
X return (u_char far *)version_descr;
X case VERSION_ID:
X *var_len = sizeof(version_id);
X return (u_char far *)version_id;
X case UPTIME:
X long_return = uptime();
X return (u_char far *)&long_return;
X case IFNUMBER:
X long_return = 1; /* 1 ethernet card to start with */
X return (u_char far *)&long_return;
X
X case HIGHWATERMARK:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&HighWaterMark;
X case FLOODMARK:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&FloodMark;
X case INACT_TIMEOUT:
X *write_method = (int (*)())writelong;
X return (u_char far *)&InactivityTimeout;
X case LAST_COLLECT_TIME:
X *write_method = (int (*)())writeLastCollectTime;
X return (u_char far *)&LastCollectTime;
X case CURRENT_RULE_SET:
X *write_method = (int (*)())writeRuleSet;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&CurrentRuleSet;
X case EMERGENCY_RULE_SET:
X *write_method = (int (*)())writeRuleSet;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&EmergencyRuleSet;
X
X case MSSTATSRESET:
X *write_method = (int (*)())writeStatsReset;
X long_return = 0;
X return (u_char far *)&long_return;
X case MSSTATSTIME:
X return (u_char far *)&stats_time;
X case MSNPACKETS:
X return (u_char far *)&npackets;
X case MSTBACKLOG:
X return (u_char far *)&t_backlog;
X case MSMXPKTRATE:
X *var_len = sizeof(unsigned int);
X return (u_char far *)&max_pkt_rate;
X case MSMXBACKLOG:
X *var_len = sizeof(unsigned int);
X return (u_char far *)&max_pkt_backlog;
X case MSNFLOWS:
X *var_len = sizeof(unsigned int);
X return (u_char far *)&nflows;
X case MSFLOWSRCV:
X return (u_char far *)&FlowsRecovered;
X case MSNMATCHES:
X return (u_char far *)&n_matches;
X case MSHASHSRCHS:
X return (u_char far *)&n_hash_searches;
X case MSHASHCMPS:
X return (u_char far *)&n_hash_compares;
X case MSTHASHSZ:
X *var_len = sizeof(unsigned int);
X return (u_char far *)&t_hash_size;
X case MSNHASHENTS:
X *var_len = sizeof(unsigned int);
X return (u_char far *)&n_hash_ents;
X case MSGCINTERVAL:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&gc_interval;
X case MSMXFLOWS:
X long_return = mxflowsp1-1; /* Set at meter startup */
X return (u_char far *)&long_return;
X case MSAVIDLEPER1000:
X#ifdef AU_MSDOS
X long_return = kilodummypackets;
X if (dummypackets >= 500) ++long_return;
X long_return = long_return*1000L/(long_return+npackets/1000L);
X#else
X long_return = 0;
X#endif
X return (u_char far *)&long_return;
X case MSMINIDLEPER1000:
X#ifdef AU_MSDOS
X long_return = (mindummyrate*10000L+5L)/((mindummyrate+mdpacketrate)*10L);
X#else
X long_return = 0;
X#endif
X return (u_char far *)&long_return;
X
X#ifdef AU_MSDOS
X case PCNEARMEM:
X long_return = (long)coreleft();
X return (u_char far *)&long_return;
X case PCFARMEM:
X long_return = (long)farcoreleft();
X return (u_char far *)&long_return;
X case PCBADPKTS:
X return (u_char far *)&badpackets;
X case PCNOBUFPKTS:
X return (u_char far *)&nobufpackets;
X case PCLOSTPKTS:
X return (u_char far *)&lostpackets;
X#else
X case PCLOSTPKTS:
X long_return = 0;
X return (u_char far *)&long_return;
X#endif
X
X default:
X ERROR("");
X }
X return NULL;
X }
X
Xint string_OK(t)
Xint t;
X{
X if (t != STRING) {
X display_msg(1,"Not string"); return FALSE;
X }
X return TRUE;
X }
X
Xint int_OK(t)
Xint t;
X{
X if (t != INTEGER){
X display_msg(1,"Not integer"); return FALSE;
X }
X return TRUE;
X }
X
Xint writelong(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X long intval = 0;
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (intval < 0) {
X display_msg(1,"Bad long"); return FALSE;
X }
X if (doSet) *((long far *)statP) = intval;
X return TRUE;
X }
X
Xint writeint(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X long intval = 0;
X unsigned int i;
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (intval < 0 || intval > 0xFFFF) {
X display_msg(1,"Bad int"); return FALSE;
X }
X if (doSet) {
X i = (int)intval;
X *((int far *)statP) = i;
X }
X return TRUE;
X }
X
Xint writechar(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X long intval = 0;
X unsigned char c;
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (intval < 0 || intval > 0xFF) {
X display_msg(1,"Bad char"); return FALSE;
X }
X if (doSet) {
X c = (char)intval;
X *((char far *)statP) = c;
X }
X return TRUE;
X }
X
Xint writeAddress(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int size, bigsize = 1000;
X u_char buf[RULE_ADDR_LEN], *cp;
X
X if (!string_OK(var_val_type)) return FALSE;
X if (var_val_len < 1 || var_val_len > RULE_ADDR_LEN) {
X display_msg(1,"Bad Address"); return FALSE;
X }
X size = sizeof(buf);
X asn_parse_string(var_val, &bigsize, &var_val_type, buf, &size);
X if (doSet) {
X addrcpy(statP, buf, var_val_len);
X }
X return TRUE;
X }
X
Xint writeRuleSet(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X long intval = 0;
X char msg[30];
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (intval < 1 || intval > MXNRTBLS) {
X display_msg(1,"Bad RuleSet"); return FALSE;
X }
X if (intval == CurrentRuleSet) return TRUE; /* No change needed */
X if (doSet) {
X if (statP == (unsigned char far *)&CurrentRuleSet) {
X if (!open_rule_set(0, intval)) {
X display_msg(1,"Incomplete RuleSet"); return FALSE;
X }
X else {
X close_rule_set();
X open_rule_set(1,intval);
X sprintf(msg,"Rule set %d opened", intval);
X display_msg(1,msg);
X }
X }
X else {
X sprintf(msg,"Emergency rule set %d", EmergencyRuleSet = intval);
X display_msg(1,msg);
X }
X }
X return TRUE;
X }
X
Xunsigned char info_table_index; /* Set by var_rinfo() */
X
Xint writeRuleSize(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X long intval = 0;
X char msg[30];
X struct rule far *rt;
X
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (info_table_index == CurrentRuleSet) {
X display_msg(1,"Can't modify current rules"); return FALSE;
X }
X if (info_table_index < 2) {
X display_msg(1,"Can't modify default rules"); return FALSE;
X }
X if (doSet) {
X if (intval > rt_size[info_table_index-1]) { /* Needs to be bigger */
X if (rt_size[info_table_index-1] != 0)
X farfree(rule_table[info_table_index-1]);
X rt = (struct rule far *)farmalloc(sizeof(struct rule)*intval);
X if (rt == NULL) {
X display_msg(1,"No mem for rule table"); return FALSE;
X }
X rule_table[info_table_index-1] = rt;
X rt_size[info_table_index-1] = intval;
X }
X sprintf(msg,"rt[%d]: %d rules", info_table_index,intval);
X display_msg(1,msg);
X }
X return TRUE;
X }
X
Xint writeActionSize(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000, j;
X long intval = 0;
X char msg[30];
X struct flow far *at;
X
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (info_table_index == CurrentRuleSet) {
X display_msg(1,"Can't modify current actions"); return FALSE;
X }
X if (info_table_index < 2) {
X display_msg(1,"Can't modify default actions"); return FALSE;
X }
X if (doSet) {
X if (intval > at_size[info_table_index-1]) { /* Needs to be bigger */
X if (at_size[info_table_index-1] != 0)
X farfree(action_table[info_table_index-1]);
X at = (struct flow far *)farmalloc(sizeof(struct flow)*intval);
X if (at == NULL) {
X display_msg(1,"No mem for action table"); return FALSE;
X }
X action_table[info_table_index-1] = at;
X at_size[info_table_index-1] = intval;
X }
X else at = action_table[info_table_index-1];
X for (j = 0; j != intval; ++j, ++at) {
X bcopy((unsigned char far *)Key(null_flow),
X (unsigned char far *)Key(at), sizeof(struct flow_key));
X }
X sprintf(msg,"at[%d]: %d actions", info_table_index,intval);
X display_msg(1,msg);
X }
X return TRUE;
X }
X
Xint writeLastCollectTime(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X unsigned char j;
X long intval = 0;
X char msg[30];
X unsigned char CollectPeer[4];
X struct CTinfo *ctip;
X
X if (var_val_type != TIMETICKS) {
X display_msg(1,"Not timeticks"); return FALSE;
X }
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (doSet) {
X CollectPeer[0] = snmp_peer_addr >> 24;
X CollectPeer[1] = (snmp_peer_addr >> 16) & 0xFF;
X CollectPeer[2] = (snmp_peer_addr >> 8) & 0xFF;
X CollectPeer[3] = snmp_peer_addr & 0xFF;
X for (j = 0; j != n_collectors; ++j) {
X ctip = &CTi[j];
X if (qcmp((unsigned char far *)ctip->LastCollectPeer,
X (unsigned char far *)CollectPeer, PEER_ADDR_LEN) == 0);
X break;
X }
X if (j == n_collectors) { /* New collector */
X ctip = &CTi[n_collectors++];
X bcopy((unsigned char far *)CollectPeer,
X (unsigned char far *)ctip->LastCollectPeer, PEER_ADDR_LEN);
X }
X ctip->PrevCollectTime = ctip->LastCollectTime;
X ctip->LastCollectTime = LastCollectTime = s_uptime;
X
X GarbageCollectTime = LastCollectTime < InactivityTimeout ? 0
X : LastCollectTime-InactivityTimeout; /* Must be >= 0 */
X for (j = 0; j != n_collectors; ++j) {
X ctip = &CTi[j];
X if (ctip->PrevCollectTime < GarbageCollectTime)
X GarbageCollectTime = ctip->PrevCollectTime;
X }
X
X sprintf(msg,"Collection by %d.%d.%d.%d",
X CollectPeer[0],CollectPeer[1],CollectPeer[2],CollectPeer[3]);
X display_msg(1,msg);
X#ifdef GC_TEST
X printf("uptime=%lu, GCtime=%lu\n",
X LastCollectTime,GarbageCollectTime);
X#endif
X }
X return TRUE;
X }
X
Xint writeStatsReset(int doSet, u_char *var_val,
X u_char var_val_type, int var_val_len, u_char far *statP)
X{
X int bigsize = 1000;
X unsigned char j;
X long intval = 0;
X if (!int_OK(var_val_type)) return FALSE;
X asn_parse_int(var_val, &bigsize, &var_val_type, &intval, sizeof(intval));
X if (doSet) zero_stats();
X return TRUE;
X }
X
Xu_char far * /* Rule+Action Info table */
Xvar_rinfo(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X unsigned char collect_rq, collect_ix, tblsz;
X oid newname[MAX_NAME_LEN];
X unsigned int x;
X struct flow far *t;
X#ifdef TESTING
X unsigned char j;
X int cmp;
X#endif
X
X collect_rq =(unsigned int)name[7] == 5; /* 5 = collector, 7 = rule set */
X x = (unsigned int)name[10];
X tblsz = collect_rq ? n_collectors : MXNRTBLS;
X#ifdef TESTING
X scpos(0,24);
X printf("\nvar_rinfo(): exact=%d, collect=%d, x=%d, tblsz=%d, magic=%d\n name=",
X collect_rq,exact,x,tblsz,vp->magic);
X for (j = 0; j != *length; ++j) printf(".%d",name[j]);
X printf("\n");
X#endif
X bcopy((char far *)vp->name, (char far *)newname, 10*sizeof(oid));
X
X if (exact) {
X if (x > tblsz) return NULL;
X newname[10] = (oid)x;
X if (compare(name,*length, newname,(int)vp->namelen) != 0) return NULL;
X }
X else {
X if (compare(name,10, newname,10) != 0) x = 0;
X for (++x; x <= tblsz; ++x) {
X newname[10] = (oid)x;
X#ifdef TESTING
X cmp = compare(name, *length, newname, (int)vp->namelen);
X printf("x=%d, cmp=%d ", x,cmp);
X for (j = 0; j != (int)vp->namelen; ++j) printf(".%d",newname[j]);
X printf("\n");
X if (cmp < 0) break;
X#else
X if (compare(name, *length, newname, (int)vp->namelen) < 0) break;
X#endif
X }
X if (x > tblsz) return NULL;
X }
X
X bcopy((char far *)newname, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = (int)vp->namelen;
X
X if (!collect_rq) info_table_index = x;
X *var_len = sizeof(long);
X *write_method = 0;
X switch (vp->magic) {
X case RIINDEX:
X case CIINDEX:
X long_return = (long)x;
X return (u_char *)&long_return;
X case RIRULESIZE:
X *write_method = (int (*)())writeRuleSize;
X *var_len = sizeof(unsigned int);
X return (u_char far *)&rt_size[x-1];
X case RIACTIONSIZE:
X *write_method = (int (*)())writeActionSize;
X *var_len = sizeof(unsigned int);
X return (u_char far *)&at_size[x-1];
X
X case CIPEERADDR:
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)CTi[x-1].LastCollectPeer;
X case CILASTTIME:
X return (u_char far *)&CTi[x-1].LastCollectTime;
X case CIPREVTIME:
X return (u_char far *)&CTi[x-1].PrevCollectTime;
X
X default:
X ERROR("");
X }
X return NULL;
X }
X
Xunsigned char *putshort(unsigned char *d, unsigned int n)
X{
X *d++ = (n >> 8) & 0xFF;
X *d++ = n & 0xFF;
X return d;
X }
X
Xunsigned char *putlong(unsigned char *d, unsigned long n)
X{
X *d++ = (n >> 24) & 0xFF;
X *d++ = (n >> 16) & 0xFF;
X *d++ = (n >> 8) & 0xFF;
X *d++ = n & 0xFF;
X return d;
X }
X
Xu_char far * /* Flow table */
Xvar_ft(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X oid newname[MAX_NAME_LEN];
X unsigned int x;
X struct flow far *t;
X
X bcopy((char far *)vp->name, (char far *)newname, (int)vp->namelen * sizeof(oid));
X
X if (exact) {
X newname[10] = name[10];
X x = (unsigned int)newname[10];
X if (compare(name,*length, newname,(int)vp->namelen) != 0 /* No match */
X || (t = find_flow(x)) == NULL) /* Doesn't exist */
X return NULL;
X }
X else {
X x = compare(name,10, newname,10) != 0 /* Not in this ptTable column */
X ? 0 /* Have to search whole table */
X : (unsigned int)name[10]; /* Only search from specified row */
X for (++x; x <= mxflowsp1; ++x) {
X if ((t = find_flow(x)) == NULL) /* Ignore deallocated flows */
X continue;
X newname[10] = (oid)x;
X if (compare(name, *length, newname, (int)vp->namelen) < 0) break;
X }
X if (x > mxflowsp1) return NULL;
X }
X
X bcopy((char far *)newname, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = (int)vp->namelen;
X
X *write_method = 0;
X *var_len = sizeof(long);
X switch (vp->magic) {
X case FTFLOWINDEX:
X long_return = (long)x;
X return (u_char *)&long_return;
X case FTFLOWSTATUS:
X long_return = find_flow(x) != NULL;
X return (u_char far *)&long_return;
X case FTLOWINTERFACE:
X case FTHIINTERFACE:
X case FTLOWADJACENTTYPE:
X case FTHIADJACENTTYPE:
X long_return = 1;
X return (u_char far *)&long_return;
X case FTLOWADJACENTADDRESS:
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&t->Low.AdjAddress;
X case FTLOWADJACENTMASK:
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&t->Low.AdjMask;
X case FTLOWPEERTYPE:
X case FTHIPEERTYPE:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->PeerAddrType;
X case FTLOWPEERTYPEMASK:
X case FTHIPEERTYPEMASK:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->PeerTypeMask;
X case FTLOWPEERADDRESS:
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&t->Low.PeerAddress;
X case FTLOWPEERMASK:
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&t->Low.PeerMask;
X case FTLOWDETAILTYPE:
X case FTHIDETAILTYPE:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->DetailAddrType;
X case FTLOWDETAILTYPEMASK:
X case FTHIDETAILTYPEMASK:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->DetailTypeMask;
X case FTLOWDETAILADDRESS:
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&t->Low.DetailAddress;
X case FTLOWDETAILMASK:
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&t->Low.DetailMask;
X case FTHIADJACENTADDRESS:
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&t->High.AdjAddress;
X case FTHIADJACENTMASK:
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&t->High.AdjMask;
X case FTHIPEERADDRESS:
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&t->High.PeerAddress;
X case FTHIPEERMASK:
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&t->High.PeerMask;
X case FTHIDETAILADDRESS:
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&t->High.DetailAddress;
X case FTHIDETAILMASK:
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&t->High.DetailMask;
X case FTRULESET:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->FlowRuleSet;
X case FTFLOWTYPE:
X *var_len = sizeof(unsigned char);
X return (u_char far *)&t->FlowType;
X case FTUPOCTETS:
X return (u_char far *)&t->UpOctets;
X case FTUPPDUS:
X return (u_char far *)&t->UpPDUs;
X case FTDOWNOCTETS:
X return (u_char far *)&t->DownOctets;
X case FTDOWNPDUS:
X return (u_char far *)&t->DownPDUs;
X case FTFIRSTTIME:
X return (u_char far *)&t->FirstTime;
X case FTLASTTIME:
X return (u_char far *)&t->LastTime;
X
X default:
X ERROR("");
X }
X return NULL;
X }
X
Xu_char far * /* Creation and activity tables */
Xvar_flow_index(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X unsigned char create;
X unsigned long t_time; /* 'Target' time */
X unsigned int x;
X oid newname[MAX_NAME_LEN];
X struct flow far *t;
X#ifdef TESTING
X unsigned char j;
X#endif
X
X create = name[7] == 2; /* acct.2.2.1 = CreateTime */
X t_time = (unsigned long)name[10];
X x = (unsigned int)name[11];
X bcopy((char far *)vp->name, (char far *)newname, (int)vp->namelen * sizeof(oid));
X#ifdef TESTING
X scpos(0,24);
X printf("flow_index(): exact=%d, create=%d, t=%lu, x=%d\n name=",
X exact,create,t_time,x);
X for (j = 0; j != *length; ++j) printf(".%d",name[j]);
X printf("\n");
X#endif
X
X if (exact) {
X if (compare(name, *length-2, newname, (int)vp->namelen-2) != 0)
X return NULL;
X for ( ; x <= mxflowsp1; ++x) {
X if ((t = find_flow(x)) == NULL) /* Ignore deallocated flows */
X continue;
X if (create) {
X if (t->FirstTime > t_time) /* Created after target time */
X break;
X }
X else if (t->LastTime > t_time) /* Active after target time */
X break;
X }
X newname[10] = t_time; newname[11] = (oid)x;
X }
X else { /* Does oid match up to indexes? */
X if (compare(name,10, newname,10) != 0) { /* No - find first entry */
X t_time = 1L; /* Have to search whole flow table */
X x = 1; /* Flow 1 is a dummy - never used by meter */
X }
X for (++x; x <= mxflowsp1; ++x) {
X if ((t = find_flow(x)) == NULL) /* Ignore deallocated flows */
X continue;
X if (create) {
X if (t->FirstTime <= t_time) /* Created up to target time */
X continue;
X }
X else if (t->LastTime <= t_time) /* Active up to target time */
X continue;
X newname[10] = t_time; newname[11] = (oid)x;
X if (compare(name, *length, newname, (int)vp->namelen) < 0) break;
X }
X }
X if (x > mxflowsp1) return NULL; /* No more flows to search */
X /* Only allow getnext to go through flow table once! */
X
X bcopy((char far *)newname, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = (int)vp->namelen;
X
X *write_method = 0;
X *var_len = sizeof(long);
X switch (vp->magic) {
X case FTCRFIRSTTIME:
X return (u_char far *)&t->FirstTime;
X case FTCRFLOWINDEX:
X long_return = (long)x;
X return (u_char far *)&long_return;
X case FTACFIRSTTIME:
X return (u_char far *)&t->LastTime;
X case FTACFLOWINDEX:
X long_return = (long)x;
X return (u_char far *)&long_return;
X }
X return NULL;
X }
X
Xu_char far * /* Activity Column Table */
Xvar_col_tbl(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X unsigned long t_time; /* 'Target' time */
X unsigned int x,n;
X unsigned char a;
X oid newname[MAX_NAME_LEN];
X unsigned char *ucp;
X struct flow far *t;
X#ifdef TESTING
X unsigned char j;
X#endif
X
X a = (unsigned char)name[10];
X t_time = (unsigned long)name[11];
X x = (unsigned int)name[12];
X#ifdef TESTING
X scpos(0,24);
X printf("col_tbl(): exct=%d, a=%d, t=%lu, x=%d\n name=",
X exact,a,t_time,x);
X for (j = 0; j != *length; ++j) printf(".%d",name[j]);
X printf("\n");
X#endif
X bcopy((char far *)vp->name, (char far *)newname, 10*sizeof(oid));
X if (exact) {
X if (compare(name, 10, newname, 10) != 0) return NULL;
X if (a < FTFLOWINDEX || a > FTLASTTIME) return NULL;
X newname[10] = (oid)a;
X for ( ; x <= mxflowsp1; ++x) {
X if ((t = find_flow(x)) == NULL) /* Ignore deallocated flows */
X continue;
X if (t->LastTime > t_time) /* Active after target time */
X break;
X }
X newname[11] = (oid)t_time; newname[12] = (oid)x;
X }
X else { /* Does oid match up to indexes? */
X if (compare(name,10, newname,10) != 0) { /* No - find first entry */
X a = FTLOWPEERTYPE;
X t_time = 1L; /* Have to search whole flow table */
X x = 1; /* Flow 1 is a dummy - never used by meter */
X }
X else if (a > FTLASTTIME) return NULL;
X newname[10] = (oid)a;
X for (++x; x <= mxflowsp1; ++x) {
X if ((t = find_flow(x)) == NULL) /* Ignore deallocated flows */
X continue;
X if (t->LastTime <= t_time) /* Active up to target time */
X continue;
X newname[11] = (oid)t_time; newname[12] = (oid)x;
X if (compare(name, *length, newname, (int)vp->namelen) < 0) break;
X }
X }
X if (x > mxflowsp1) return NULL; /* No more flows to search */
X /* Only allow getnext to go through flow table once! */
X
X bcopy((char far *)newname, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = (int)vp->namelen;
X
X *write_method = 0;
X *var_len = sizeof(long);
X switch (vp->magic) {
X case FTCOLATTRIB:
X long_return = (long)a;
X return (u_char far *)&long_return;
X case FTCOLTIME:
X return (u_char far *)&t->LastTime;
X case FTCOLINDEX:
X long_return = (long)x;
X return (u_char far *)&long_return;
X case FTCOLBLOB:
X for (n = 0, ucp = column_blob; /* Build the flow blob */
X n <= FLOWBLOBSZ*(2+RULE_ADDR_LEN); ++x) {
X for ( ; x <= mxflowsp1; ++x) { /* Find next active flow */
X if ((t = find_flow(x)) != NULL && t->LastTime > t_time) {
X ucp = putshort(ucp,netshort(x));
X switch (a) { /* Build the flow blob */
X case FTFLOWINDEX:
X ucp = putshort(ucp,netshort(x));
X break;
X case FTFLOWSTATUS:
X case FTLOWINTERFACE:
X case FTHIINTERFACE:
X case FTLOWADJACENTTYPE:
X case FTHIADJACENTTYPE:
X *ucp++ = 1;
X break;
X case FTLOWADJACENTADDRESS:
X bcopy(t->Low.AdjAddress,
X (unsigned char far *)ucp, MAC_ADDR_LEN);
X ucp += MAC_ADDR_LEN;
X break;
X case FTLOWADJACENTMASK:
X bcopy(t->Low.AdjMask,
X (unsigned char far *)ucp, MAC_ADDR_LEN);
X ucp += MAC_ADDR_LEN;
X break;
X case FTLOWPEERTYPE:
X case FTHIPEERTYPE:
X *ucp++ = t->PeerAddrType;
X break;
X case FTLOWPEERTYPEMASK:
X case FTHIPEERTYPEMASK:
X *ucp++ = t->PeerTypeMask;
X break;
X case FTLOWPEERADDRESS:
X bcopy(t->Low.PeerAddress,
X (unsigned char far *)ucp, PEER_ADDR_LEN);
X ucp += PEER_ADDR_LEN;
X break;
X case FTLOWPEERMASK:
X bcopy(t->Low.PeerMask,
X (unsigned char far *)ucp, PEER_ADDR_LEN);
X ucp += PEER_ADDR_LEN;
X break;
X case FTLOWDETAILTYPE:
X case FTHIDETAILTYPE:
X *ucp++ = t->DetailAddrType;
X break;
X case FTLOWDETAILTYPEMASK:
X case FTHIDETAILTYPEMASK:
X *ucp++ = t->DetailTypeMask;
X break;
X case FTLOWDETAILADDRESS:
X bcopy(t->Low.DetailAddress,
X (unsigned char far *)ucp, DETAIL_ADDR_LEN);
X ucp += DETAIL_ADDR_LEN;
X break;
X case FTLOWDETAILMASK:
X bcopy(t->Low.DetailMask,
X (unsigned char far *)ucp, DETAIL_ADDR_LEN);
X ucp += DETAIL_ADDR_LEN;
X break;
X case FTHIADJACENTADDRESS:
X bcopy(t->High.AdjAddress,
X (unsigned char far *)ucp, MAC_ADDR_LEN);
X ucp += MAC_ADDR_LEN;
X break;
X case FTHIADJACENTMASK:
X bcopy(t->High.AdjMask,
X (unsigned char far *)ucp, MAC_ADDR_LEN);
X ucp += MAC_ADDR_LEN;
X break;
X case FTHIPEERADDRESS:
X bcopy(t->High.PeerAddress,
X (unsigned char far *)ucp, PEER_ADDR_LEN);
X ucp += PEER_ADDR_LEN;
X break;
X case FTHIPEERMASK:
X bcopy(t->High.PeerMask,
X (unsigned char far *)ucp, PEER_ADDR_LEN);
X ucp += PEER_ADDR_LEN;
X break;
X case FTHIDETAILADDRESS:
X bcopy(t->High.DetailAddress,
X (unsigned char far *)ucp, DETAIL_ADDR_LEN);
X ucp += DETAIL_ADDR_LEN;
X break;
X case FTHIDETAILMASK:
X bcopy(t->High.DetailMask,
X (unsigned char far *)ucp, DETAIL_ADDR_LEN);
X ucp += DETAIL_ADDR_LEN;
X break;
X case FTRULESET:
X *ucp++ = t->FlowRuleSet;
X break;
X case FTFLOWTYPE:
X *ucp++ = t->FlowType;
X break;
X case FTUPOCTETS:
X ucp = putlong(ucp,netlong(t->UpOctets));
X break;
X case FTUPPDUS:
X ucp = putlong(ucp,netlong(t->UpPDUs));
X break;
X case FTDOWNOCTETS:
X ucp = putlong(ucp,netlong(t->DownOctets));
X break;
X case FTDOWNPDUS:
X ucp = putlong(ucp,netlong(t->DownPDUs));
X break;
X case FTFIRSTTIME:
X ucp = putlong(ucp,netlong(t->FirstTime));
X break;
X case FTLASTTIME:
X ucp = putlong(ucp,netlong(t->LastTime));
X break;
X }
X n += 2+attribs[a].len;
X break;
X }
X }
X if (x > mxflowsp1) {
X if (!exact) name[12] = mxflowsp1;
X /* Return index of last possible flow */
X putshort(ucp,0); /* Mark end of column */
X *var_len = n+2;
X return (u_char far *)&column_blob;
X }
X }
X if (!exact) name[12] = (oid)x;
X /* Return index of last flow in blob */
X putshort(ucp,1); /* Mark end of this blob (more to come) */
X *var_len = n+2;
X return (u_char far *)&column_blob;
X }
X return NULL;
X }
X
Xu_char far * /* Rule + action tables */
Xvar_rt(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X unsigned char rule_rq, rule_set;
X unsigned int x, sz;
X oid newname[MAX_NAME_LEN];
X struct rule far *r, far *rt;
X struct flow far *a, far *at;
X#ifdef TESTING
X unsigned char j;
X int cmp;
X#endif
X
X rule_rq = /* acct.3 = rule table, acct.4 = action table */
X (unsigned int)name[6] == 3;
X#ifdef TESTING
X rule_set = name[10];
X x = (unsigned int)name[11];
X scpos(0,24);
X printf("var_rt(): exact=%d, rule=%d, set=%d, x=%d\n name=",
X exact,rule_rq,rule_set,x);
X for (j = 0; j != *length; ++j) printf(".%d",name[j]);
X printf("\n");
X#endif
X bcopy((char far *)vp->name, (char far *)newname, 10*sizeof(oid));
X if (exact) {
X if ((rule_set = name[10]) > MXNRTBLS) return NULL;
X x = (unsigned int)name[11];
X if (rule_rq) {
X if ((rt = rule_table[rule_set-1]) == NULL) return NULL;
X if (x > (sz = rt_size[rule_set-1])) return NULL;
X }
X else {
X if ((at = action_table[rule_set-1]) == NULL) return NULL;
X if (x > (sz = at_size[rule_set-1])) return NULL;
X }
X newname[10] = (oid)rule_set; newname[11] = (oid)x;
X if (compare(name,*length, newname,(int)vp->namelen) != 0) return NULL;
X if (rule_rq) {
X if ((r = &rt[x-1]) == NULL) return NULL;
X }
X else {
X if ((a = &at[x-1]) == NULL) return NULL;
X }
X }
X else {
X if (compare(name,10, newname,10) != 0) { /* Not in this table column */
X rule_set = 1; x = 0; /* Have to search whole 2-D table */
X }
X else {
X rule_set = name[10]; x = (unsigned int)name[11];
X }
X for ( ; ; ++rule_set, x = 0) {
X if (rule_set > MXNRTBLS) return NULL;
X if (rule_rq) {
X if ((rt = rule_table[rule_set-1]) == NULL) continue;
X if (x >= (sz = rt_size[rule_set-1])) continue;
X }
X else {
X if ((at = action_table[rule_set-1]) == NULL) continue;
X if (x >= (sz = at_size[rule_set-1])) continue;
X }
X newname[10] = (oid)rule_set;
X for (++x; x <= sz; ++x) {
X if (rule_rq) {
X if ((r = &rt[x-1]) == NULL) continue;
X }
X else {
X if ((a = &at[x-1]) == NULL) continue;
X }
X newname[11] = (oid)x;
X#ifdef TESTING
X cmp = compare(name, *length, newname, (int)vp->namelen);
X printf("x=%d, cmp=%d ", x,cmp);
X for (j = 0; j != (int)vp->namelen; ++j) printf(".%d",newname[j]);
X printf("\n");
X if (cmp < 0) break;
X#else
X if (compare(name, *length, newname, (int)vp->namelen) < 0) break;
X#endif
X }
X if (x <= sz) break; /* Found the next one! */
X }
X }
X
X bcopy((char far *)newname, (char far *)name, (int)vp->namelen * sizeof(oid));
X *length = (int)vp->namelen;
X
X#ifdef TESTING
X#ifdef AU_MSDOS
Xif (rule_rq) printf(" rt[%d], address=%Fp, x=%d\n", rule_set, r, x);
Xelse printf(" at[%d], address=%Fp, x=%d\n", rule_set, a, x);
X#else
Xif (rule_rq) printf(" rt[%d], address=%lu, x=%d\n", rule_set, r, x);
Xelse printf(" at[%d], address=%lu, x=%d\n", rule_set, a, x);
Xfflush(stdout);
X#endif
X#endif
X *write_method = 0;
X *var_len = sizeof(long);
X switch (vp->magic) {
X case RTRULESET:
X case ATACTIONSET:
X long_return = (long)rule_set;
X return (u_char far *)&long_return;
X case RTRULEINDEX:
X case ATACTIONINDEX:
X long_return = (long)x;
X return (u_char far *)&long_return;
X
X case RTSELECTOR:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&r->RuleSelector;
X case RTRULEMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = RULE_ADDR_LEN;
X return (u_char far *)&r->RuleMask;
X case RTMATCHVALUE:
X *write_method = (int (*)())writeAddress;
X *var_len = RULE_ADDR_LEN;
X return (u_char far *)&r->RuleMatchedValue;
X case RTRULEACTION:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&r->RuleAction;
X case RTJUMPINDEX:
X *write_method = (int (*)())writeint;
X *var_len = sizeof(unsigned int);
X return (u_char far *)&r->RuleJumpIndex;
X
X case ATLOWINTERFACE:
X case ATHIINTERFACE:
X break; /* Interface 1 is the only one! */
X
X case ATLOWADJACENTTYPE:
X case ATHIADJACENTTYPE:
X break; /* Ethernet is the only adjacent type! */
X case ATLOWADJACENTADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&a->Low.AdjAddress;
X case ATLOWADJACENTMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&a->Low.AdjMask;
X
X case ATLOWPEERTYPE:
X case ATHIPEERTYPE:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&a->PeerAddrType;
X case ATLOWPEERTYPEMASK:
X case ATHIPEERTYPEMASK:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&a->PeerTypeMask;
X case ATLOWPEERADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&a->Low.PeerAddress;
X case ATLOWPEERMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&a->Low.PeerMask;
X
X case ATLOWDETAILTYPE:
X case ATHIDETAILTYPE:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&a->DetailAddrType;
X case ATLOWDETAILTYPEMASK:
X case ATHIDETAILTYPEMASK:
X *write_method = (int (*)())writechar;
X *var_len = sizeof(unsigned char);
X return (u_char far *)&a->DetailTypeMask;
X case ATLOWDETAILADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&a->Low.DetailAddress;
X case ATLOWDETAILMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&a->Low.DetailMask;
X
X case ATHIADJACENTADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&a->High.AdjAddress;
X case ATHIADJACENTMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = MAC_ADDR_LEN;
X return (u_char far *)&a->High.AdjMask;
X
X case ATHIPEERADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&a->High.PeerAddress;
X case ATHIPEERMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = PEER_ADDR_LEN;
X return (u_char far *)&a->High.PeerMask;
X
X case ATHIDETAILADDRESS:
X *write_method = (int (*)())writeAddress;
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&a->High.DetailAddress;
X case ATHIDETAILMASK:
X *write_method = (int (*)())writeAddress;
X *var_len = DETAIL_ADDR_LEN;
X return (u_char far *)&a->High.DetailMask;
X
X case ATPDUSCALE:
X case ATOCTETSCALE:
X break; /* Not yet implemented */
X
X default:
X ERROR("");
X }
X return NULL;
X }
END_OF_FILE
if test 53127 -ne `wc -c <'netramet/src/meter/met_vars.c'`; then
echo shar: \"'netramet/src/meter/met_vars.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/met_vars.c'
fi
if test -f 'netramet/src/snmplib/include/ausnmp.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/ausnmp.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/ausnmp.h'\" \(531 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/ausnmp.h' <<'END_OF_FILE'
X/* 1000, Fri 4 Jun 93
X
X Header file for AU_MSDOS implementation of CMU SNMP
X
X Nevil Brownlee, Computer Centre, University of Auckland */
X
X
X#ifdef AU_MSDOS
Xtypedef unsigned char u_char;
Xtypedef unsigned long u_long;
Xtypedef unsigned int u_short;
X
X#include <mem.h>
Xvoid qmove(unsigned char far *s, unsigned char far *d, unsigned int n);
X#define bcopy(s,d,n) qmove(s,d,n)
X
X#else /* Not AU_MSDOS */
X
X#define far
X#define farfree free
X#define farmalloc malloc
X#include <sys/types.h>
X#include <malloc.h>
X#include <memory.h>
X
X#endif
END_OF_FILE
if test 531 -ne `wc -c <'netramet/src/snmplib/include/ausnmp.h'`; then
echo shar: \"'netramet/src/snmplib/include/ausnmp.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/ausnmp.h'
fi
echo shar: End of archive 6 \(of 25\).
cp /dev/null ark6isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:08:28 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 95
Archive-name: netramet/part07
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/pc/NeTraMet.exe.UU.B netramet/src/snmplib/snmp.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:06 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 7 (of 25)."'
if test -f 'netramet/pc/NeTraMet.exe.UU.B' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NeTraMet.exe.UU.B'\"
else
echo shar: Extracting \"'netramet/pc/NeTraMet.exe.UU.B'\" \(51182 characters\)
sed "s/^X//" >'netramet/pc/NeTraMet.exe.UU.B' <<'END_OF_FILE'
XM/P@!N% $4%;H= =96>LEQX1!" 0 QH0_" &X50105NA=!UE9QX1!" ( N%<$
XM4%;H30=96>L6@X0S" &#E#4( ,>$,0@" +@! .E,!>L)5_]V!.A$"UE9Z3(%
XM]T;Z @!T*\>$00@2 ,:$/P@!N&8$4%;H"P=96;@- %#HX,-9B80["(F4/0BX
XM 0#I# 7W1OH0 '19_W4*_W4(Z/7:65F+G#D(BXPW"(/! 8/3 #O3=3P[P74X
XM_W4.Z.S:68F$0PC'A$$($ #'A#$( P"#A#<( 8.4.0@ QX0[" QX0]"
XMQH0_" "X 0#IK 3IG03W1OH" '04]T;Z$ !T#;A[!%!6Z'H&65GIC@3W1OH0
XM '4#Z80$]T;Z @!T#%?_=@3H=PI96>EQ!,>$.P@ ,>$/0@ /]U"O]U".A5
XMVEE9*X0W"!N4.0B)1O*)5O2+1O*)1OR#?O0 ?&EU!H-^\@!R88N$10@[1OQ\
XM6(M&_"F$10B+1OPIA$<(@[Q%" !]!L>$10@ (-\(@!T#HM&_ %$)(M&_"E$
XM(NL9_[1%"(O&!6T(4(O& T;\!6T(4.CG+(/$!HM&](M6\@&4-P@1A#D(ZP;'
XMA$<( "#O$<( 'T&QX1'" QX1!"! _W;^5U;HT@.#Q ;W1OH! '19@[PQ
XM" =T4O]U!O]U!.B5V5E9.Y0U"'5!.X0S"'4[@X0S" &#E#4( (-\! !U!<=$
XM!+A+QX0Q" < N*H$4%;H4@596<>$,0@) (N$00@- 0")A$$(QH0_" &#?OP
XM?P:#?OX ?B*#?OP ?PN+A&<(T>@[1OYS#+BS!%!6Z!4%65GK!5;H/^Y9@[PQ
XM" 1U!5;H%^U9N $ Z1,#Z00#_W4*_W4(Z #965DKA#<(&Y0Y"(E&\HE6](M&
XM\HE&_(-^] !\?'4&@W[R ')TBX1%"#M&_'QKBT;\*81%"(M&_"F$1PB#O$4(
XM 'T&QX1%" @WPB '0.BT;\ 40DBT;\*40BZQG_M$4(B\8%;0A0B\8#1OP%
XM;0A0Z)(K@\0&BT;TBU;R 90W"!&$.0B+1O(+1O1T!X.\1P@ ?0;'A$<( #_
XM=OY75NB# H/$!HM&^B41 #T1 '5[_W4*_W4(Z$G865F+G#D(BXPW"(/! 8/3
XM #O3<EQU!#O!<E;_=0;_=03H)MA963N4-0AU13N$,PAU/X.$-P@!@Y0Y" "#
XMA#,( 8.4-0@ QX1!"! N.L$4%;HY -96<:$/P@ N!H 4.BTP%F)A#L(B90]
XM",>$,0@* .MK]T;Z$ !T9/]U"O]U".C'UUE9BYPY"(N,-PB#P0&#TP [TW5'
XM.\%U0_]U!O]U!.BFUUE9.Y0U"'4R.X0S"'4L@[Q%" !U)8.$-P@!@Y0Y" #'
XMA#$(!@"X P!0Z$; 68F$.PB)E#T(QH0_" #I9 &+1OHE$0 ]$0!U:?]U"O]U
XM".A5UUE9.Y0Y"'58.X0W"'52_W4&_W4$Z#[765D[E#4(=4$[A#,(=3N#A#,(
XM 8.4-0@ QX1!"! N X%4%;H!@-96<:$/P@ N ( 4.C6OUF)A#L(B90]",>$
XM,0@, +@! .G\ .GM (M&^B41 #T0 '5)_[0Y"/^T-PCHW-9963M5"G4W.T4(
XM=3+_M#4(_[0S".C%UEE9.U4&=2 [101U&\>$,0@* +@- %#H>+]9B80["(F4
XM/0C&A#\( .F6 /=&^@$ =!W'A$$($0"X+@505NAT EE9QH0_" &X 0#I@ #K
XM2/]U"O]U".ANUEE9BYPY"(N,-PB#P0&#TP [TW4K.\%U)_]U!O]U!.A-UEE9
XM.Y0U"'46.X0S"'40QX0Q" P QH0_" "X 0#K-NLHBT;Z)1$ /1$ =1O'A$$(
XM$ "X1 505N@" EE9QH0_" #'A#$(# #K ("\/P@ = 56Z!KK65]>B^5=PSZL
XM^*SUK8JNBJXCL,.QBJXZLI&R_[)5B^R#[!!65XMV!(M>!O]W#NC>U5F)A$,(
XMBUX&_W<,Z-#568E&]HM>!O]W!O]W!.BKU5E9BYPU"(N,,P@KR!O:B4[\B5[^
XM]T;V @!T"(-N_ &#7OX BT;\B4;ZBUX&_W<,Z([56;$,T^C1X-'@B4;XBT8&
XM T;XB4;TBT;X+10 B4;R"\!T9HM&!@44 (OXZU*+WT='BP<+P'0,/0$ = X]
XM @!T"^L\QT;R #K->LS@ST"=1K_=0+H.-59B4;PBX1G"#M&\'8'BT;PB81G
XM"(L%0$"+5O(KT(E6\HL%T> #^.L BT;R_T[R"\!WI(M&^"E&"(-^_@!] ^FS
XM '4)@W[\ ',#Z:@ BT;Z 4;TBT;Z*48(@WP. '08_W8(_W;T5O]4#H/$!ID!
XMA#,($90U".M%@WPF 'P_BT0H*T0FB4;X.T8(?0:+1OB)1@B#?@@ ?B6+1@B9
XM 80S"!&4-0C_=@B+1"H#1"90_W;TZ'4G@\0&BT8( 40F@[Q%" !T!+ !ZP*P
XM (B$/PB+1OP+1OYU'H.\1P@ =!?_M%D(_[17".A O5E9"\!T!L>$1P@ .L%
XM5NA+Z5FX#0!0Z.^\68F$.PB)E#T(ZP!?7HOE7<-5B^R#["!65XMV!,:$0 @
XMN @ 4(O&!1 4.@*Q%E9B4;^BT;^!2@ B4;\BW[^BT;^!10 B4;Z@+Q5" )T
XM1(N$10@[A$,(<P:+A$4(ZP2+A$,(*X1'" O =AJ+A$4(.X1#"',&BX1%".L$
XMBX1#""N$1PCK C/ B4;PBX1'"(E&\NL<BX1%"#N$0PAR!HN$0PCK!(N$10B)
XM1O#'1O( ,=&]@ QT;N 0#ISP*+A&<(.T;P?@6+1O#K!(N$9PB)1OC_="#H
XM8=-9BU[ZB0?_=!KH5=-9BU[ZB4<"BX0Y"(N4-PA0BT;R4IE; ]A8$\)04^@@
XMTUE9BU[ZB4<$B5<&_[0U"/^T,PCH"M-968M>^HE'"(E7"HM$*"M$)E#H"M-9
XMBU[ZB4<.BX1!" T 4%#H^-)9BU[ZB4<,BU[ZQT<0 "+7OK'1Q( (N$00@E
XM$@ ] @!U.<=&]"P BU[Z_W<,Z,?2604 $%#HO])9BU[ZB4<,BU[^QT<H @3_
XMM&<(Z*G268M>_HE'*H-&_ 3K1H-^^ !^.XM&^ 4H (E&](-\(@!T%?]V^/]V
XM_(M$) -&\E#H9B6#Q ;K%?]V^/]V_(O& T;R!6T(4.A/)8/$!NL%QT;T* "
XM)0^ #4" )?" #06*A%8(B$4!_P;Z2:'Z25#H.-)9B44$QT4& #&10C^QD4)
XM!L=%"@ _W0>_W0<Z 3265F)10R)50[_=!C_=!;H\]%968E%$(E5$O]V].CZ
XMT5F)10*X% !0'E?H];F#Q ;WT(E%"HM%#HM5#(E6X(E&XHM%$HM5$(E6Y(E&
XMYL9&Z #&1ND&BT;T+10 4.B[T5F)1NJ+1O0M% !0'HM&_@44 %#HK;F#Q :)
XM1NRX#@!0%HU&X%#HF[F#Q ;WT(M>^HE'$(,^X$D = __=@;_=OI75O\6X$F#
XMQ B#/@1* 7<#Z88 Q![422;^!\0>V$DF_@?WA$$( @!T!+!3ZP*P(,0>V$DF
XMB$<"Q![422:(1P+WA$$($ !T!+!!ZP*P(,0>V$DFB$<$Q![422:(1P3WA$$(
XM 0!T!+!&ZP*P(,0>V$DFB$<&Q![422:(1P;WA$$(! !T!+!2ZP*P(,0>V$DF
XMB$<(Q![422:(1PC_=0+HW-!94.@OP5D+P'0(5NC9Y5GIMP"+1O@!1O:+1O@!
XM1O*+1O@I1O"#?O ?P+K$?]&[HJ$20BT #M&[GP#Z2/]BT;RB81'",>$3P@
XM ,>$40@ ("\50@"=2"#O%,( '01BX13"+H# /?JT>B)A%,(ZP;'A%,(! #K
XM(H"\/P@ =0>#O$4( '0/,\!0Z-^X68F$3PB)E%$(QH15" "+A%,(0$!0Z,>X
XM68F$8PB)E&4(@W[V 'X7BX1E"(N48P@#E%,(%0 B917"(F$60A?7HOE7<-5
XMB^R#["!65XMV!O\V%DK_-A1*Z.6X65D+P'4#Z74"N $ 4.AUN%FC%$J)%A9*
XM_W0,Z-G/68E&^/=&^ 0 = 4SP.E0 HM&^"41 #T1 '4LBT0&BU0$B5;NB4;P
XMBT0*BU0(B50$B40&BT;PBU;NB50(B40*QT;X$ #I@0"+1O@E$@ ] @!U+_]T
XM!O]T!.AISUE9!0$ @]( 4E#H7,]968E$"(E4"L=$! QT0& #'1O@4 .M'
XM]T;X$ !T&(M$"HM4"(E4!(E$!L=$" QT0* #K*/]T!O]T!.@;SUE9!0$
XM@]( 4E#H#L]968E$"(E4"L=$! QT0& #W1O@# '4)BT;X-10 B4;XBT8$
XMB4;\_W8$Z-2_68E&]+@( %#_=O3HY[Y968E&_HM&_@4H (E&^HM^_HM&_@44
XM (E&]L=&\B@ _W;RZ,+.68E% HM$ HM>]HD'BP2+7O:)1P*+1 :+5 2+7O:)
XM5P2)1P:+1 J+5 B+7O:)5PB)1PJ+7O;'1PX (M&^"7_#PT 4%#H>\Y9BU[V
XMB4<,BU[VQT<0 "+7O;'1Q( ( E#X -0( E\( -!8M>!(I' 8A% ?\&^DFA
XM^DE0Z$3.68E%!,=%!@ QD4(_L9%"0;'10H (M>!(M'$HM7$(E5#(E%#HM>
XM!(M'#HM7#(E5$(E%$K@4 % >5^@/MH/$!O?0B44*BT4.BU4,B5;@B4;BBT42
XMBU40B5;DB4;FQD;H ,9&Z0:+1O(M% !0Z-7-68E&ZHM&\BT4 $ E_O]0'HM&
XM_@44 %#HP[6#Q :)1NRX#@!0%HU&X%#HL;6#Q ;WT(M>]HE'$(,^X$D =!*X
XMJ@90_W;V5S/ 4/\6X$F#Q C_=0+H?\U94.C2O5E?7HOE7<-5B^Q,3%97BW8$
XMQT;^ "#? (1=1'_=@C_=@96Z/_F@\0&B_CK#_]V"/]V!E;HMNB#Q :+^(-\
XM!@!T _]4!H/_ 7T05N@ZY%D+P'4%BT;^ZQ;K"0%^_@%^!BE^"(-^" !UK8M&
XM_NL 7UZ+Y5W#58OL5E>+?@2+=@B#?0(1=0]6_W8&5^B8YH/$!HOPZPU6_W8&
XM5^A1Z(/$!HOPB\;K %]>7<-5B^R#[ 965XMV!(M&"(E&_C/_@WP"!G4%N $
XMZP(SP(E&^H-^^@!T"HN$00@E" ")1OSK58-^^@!T'XN$00@+1OR)A$$(_W8(
XMBT8& \=05NA8Z(/$!@/XZQ+_=@B+1@8#QU!6Z*+D@\0& _B+1OXKQXE&"(-\
XM!@!T _]4!E;H7N-9"\!U!#/ ZPN#?@@ ?Z6+1O[K %]>B^5=PU6+[%:+=@2#
XM? (1=0__=@C_=@96Z%?D@\0&ZPW_=@C_=@96Z.KG@\0&ZP!>7<-5B^Q65XMV
XM!(M^" O_?00SP.LG"_]T!H-^!@!U#XO&!2P B40JQT0H CK"8M&!HE$*HE\
XM*(M$*.L 7UY=PU6+[$Q,5E>+=@2+?@@+_WT$,\#K2(-\ A%U)U?_=@96Z-_C
XM@\0&B4;^BT;^ 48&@W[^ 'X%N $ ZP(SP"OX==OK%XM&!HE$)(E\(HF\10BX
XM'@=05NA,]UE9B\?K %]>B^5=PU6+[%:+=@2#? (&=056Z-'G65Y=PU6+[%:+
XM=@2#? (&=0N+A$$(#0@ B81!"%Y=PU6+[(!^!@IT!H!^!@UU!_]V!.C0_UFX
XM 0!0C48&4/]V!.A"_H/$!HI&!NL 7<-5B^Q,3+@! %"-1O]0_W8$Z(/]@\0&
XMBD;_F.L B^5=PU6+[%97BW8$_W8&Z,@@68OX]T0( 0!T-(-\ @9U"8M$" T
XM0(E$" O_= M7_W8&5NCE_8/$!E;H7?]9N ( 4+C*2U!6Z-']@\0&ZQ!6Z$?_
XM65?_=@96Z+_]@\0&B\?K %]>7<-5B^Q6BW8$@WP"!G47@WPF '4,N&0'4%;H
XM0_996>L%5NAMWUE>7<-5B^R#[ 965XM>!(-_ A%U$(M>!(M_*HM&! 4F (OP
XMZPZ+7@2+?RJ+1@0%)@"+\(,\ '4%,\#I_P" /0!T!8 ]"G4:_PR+!%!7B\=
XM4.C]'(/$!H,\ '4%,\#IVP#_3@B+1@@[!'X%BP2)1@C_=@A7_W8&Z.\?@\0&
XMBUX& UX(Q@< N H 4/]V!N@V'UE9B4;\N T 4/]V!N@G'UE9B4;Z@W[\ '0&
XMBU[\Q@< @W[Z '0&BU[ZQ@< _W8&Z(T?68E&_H-^^@!U"HM>!L8' #/ ZV:#
XM?OP =0V+1OJ)1OS'1OH .L.BT;\.T;Z=@:+1OJ)1OR+1OY B48(BP0[1@A^
XM#8M>"(H!F O =0/_1@B+1@@I!(L$4%>+QP-&"%#H+1R#Q :#/ !]!,<$ #_
XM=@3HI_Y9BT;^ZP!?7HOE7<-5B^Q,3%97BWX$BT4FB_ +P'4$,\#K4O=%" $
XM=$>+12J)1OZ+7OZ /PIU'4Z+QHE%)E#_=OZ+1OY 4.C1&X/$!@OV=00SP.L@
XM5K@- %#_=O[H$!N#Q 8+P'0$B\;K"C/ ZP;K!(O&ZP!?7HOE7<-5B^Q6BW8$
XMBT0"/08 = P]$0!T NLCN $ ZR*#O#$( W0.@[PQ" 1T!X.\,0@'=06X 0#K
XM C/ ZP0SP.L 7EW#58OL5HMV!(M$ CT& '0./1$ = +K$U;H&-Q9ZPQ6Z#_<
XM65;H6=]9ZP!>7<-5B^Q65XMV!/]V!E;HM==968-\ @9U#5;H.N!9"\!T!#/_
XMZUSH4!E6Z"C?60O =1"#? 0 =07'1 3-2[___^M 5NBIUUD+P'0/QT0$Y4M6
XMZ(+_6;___^LH@WX( '0-5O]6"%F+^ O = +K%8-\!@!T _]4!H-\ A%U!#/_
XMZP+KD8-^"@!T!8M>"HD_B\?K %]>7<-5B^Q65XMV!/]V!E;H(M=965;H-OQ9
XM5NAX_ED+P'0$,__K1^B^&%;HEMY9"\!U!;\! .LV5N@BUUD+P'0/QT0$]$M6
XMZ/O^6;___^L>@WX( '0-5O]6"%F+^ O = +K"X-\!@!T _]4!NNL@WX* '0%
XMBUX*B3^+Q^L 7UY=PU6+[%97BW8$_W8&5NBEUEE9@WP"!G0%N $ ZUO'1"8
XM .A#&%;H&]Y9"\!U!;\! .LV5NBGUED+P'0/QT0$"4Q6Z.#;6;___^L>@WX(
XM '0-5O]6"%F+^ O = +K"X-\!@!T _]4!NNT@WX* '0%BUX*B3^+Q^L 7UY=
XMPU6+[%97BWX$N H 4%?H#AQ968OP"\!T \8$ +@- %!7Z/L;65F+\ O = /&
XM! "+Q^L 7UY=PU6+[%8SP%#_=@3HP1-968OP@_[_=0+K&O=&!@( = ;WQ@$
XM=00SP.L)QP:2 4 N/__7EW#58OL@SX>3"!U!;@! .L3BQX>3-'CBT8$B8?J
XM@/\&'DPSP%W#58OL5HMV! OV? 6#_A1\";@& %#H^!;K#XO>T>/'AVI.__]6
XMZ&D365Y=PU6+[(/L",9&^P#HV!"T (E&_NC0$+$(T^BT (E&_.G; (M>"/]&
XM"(H'B$;[M M!P"+V(/[!G<NT>,N_Z=BQ+0.L ?HA1/K=J"L3K0 .T;^?6S_
XM3O[K9Z"L3K0 B4;^ZUW_1OSK6*"U3K0 "\!U+H,^NTX =">*)K!.BD;[B4;X
XMBT;^0%"+1OQ 4.B[(%)0%HU&^%"X 0!0Z-,@ZQZ*5OZ*=ORT K< Z"$3BAZP
XM3HI&^[0)MP"Y 0#H$!/_1OZ@KDZT #M&_GT.H*Q.M ")1OZAJDX!1OR@KTZT
XM #M&_'T<L 90H*Q.4*"M3E"@KDY0H*].4+ !4.@3#/]._(M&!O].!@O = /I
XM&/^*5OZ*=ORT K< Z+42BD;[M "+Y5W"!@" PXG#I\.BPZ?#I\.8PU6+[+A!
XMPU SP%#_=@2-1@90Z#X;7<-04U%2!AY65U6]\0Z.W?\6*H$+P'4',\!0Z(P\
XM65U?7A\'6EE;6,]5B^R+1@2C*H$.N(;$4+@C %#HAQ2#Q 9=P\-5B^SK"HL>
XM'DS1X_^7ZH"A'DS_#AY,"\!UZ_]V!.@G/%E=PU6+[%97BT8&0(OP*S:. (O&
XM!3\ L0;3Z(OP.S8H3742BT8&BU8$B1:@ *.B +@! .M&L0;3YHL^I@"+Q@,&
XMC@ [QW8(B\<K!HX B_!6_S:. .@1&5E9B_B#__]U"XO&L0;3Z*,H3>NXH8X
XM \?'!J0 "CI@ SP%]>7<($ %6+[(L.G@"+'IP BU8&BT8$Z.$G<B"+#J8
XMBQZD (M6!HM&!.C.)W<-_W8&_W8$Z%#_"\!U!;C__^L",\!=PU6+[(/L"(L6
XMH@"AH "+3@:+7@3HB"2)1OR)5OZ+#IX BQZ< (M&_.B,)W(3BPZF (L>I "+
XM5OZ+1OSH>2=V"+K__[C__^LBH:( BQ:@ (E6^(E&^O]V_O]V_.CF_@O =0+K
XMW(M6^HM&^(OE7<-5B^Q65XMV!+___SET#G0"ZV"#? 8 =!Z#/ !]"U;HJ0!9
XM"\!T NM*]T0"! !T!_]T".B&)%F ? 0 ? N*1 284.B]_%F+^,=$ @ QT0&
XM #'! QD0$_X-\# !T$S/ 4/]T#.C8#%#H$QE9QT0, "+QU]>7<-5B^R#
XM[ 3'1OP ,=&_@ BQ:F *&D (L.H@"+'J Z/<CB4;\B5;^@W[^ '(0=P:#
XM?OP0=@B#;OP0@U[^ (%F_/#_@6;^__^+5OZ+1OR+Y5W#58OL5E>+=@0+]G4%
XMZ', ZVLY= YT!;C__^MC@SP ?"GW1 (( '4*B\8%!0 Y1 IU%L<$ "+Q@4%
XM #E$"G4(BT0(B40*ZS7K,XM$!@,$0(OXBP0KQXD$5XM$"(E$"E"*1 284.@,
XM#8/$!CO'= [W1 ( G4'@4P"$ #KFC/ 7UY=PU6+[$Q,5E?'1OX +\4 +XJ
XM3>L2]T0" P!T"%;H7_]9_T;^@\80B\=/"\!UYXM&_E]>B^5=PU6+[$Q,5E>+
XM=@@S_\=&_@ ,\F+WD:*!XK0/')U"+\! +D! .L@@/IW=06_ @/K"(#Z874-
XMOP()QT;^@ "Y @#K!#/ ZW**!(K01H#Z*W0/@#PK=26 ^G1T!8#Z8G4;@/HK
XM=02*!(K0B\<E_/\-! "+^,=&_H !N0, @/IT=0:!SP! ZQZ ^F)U!H'/ (#K
XM#Z&23B4 P OXB\>I (!T!(')0 #'!B1-1=6+7@:)/XM>!(M&_HD'B\%?7HOE
XM7<(& %6+[(/L!%:+=@C_=@2-1OY0C4;\4.@H_XE$ @O =!R ? 0 ?2/_=OS_
XM=O[_=@;H-12#Q :(1 0*P'T-QD0$_\=$ @ ,\#K08I$!)A0Z+L160O = 6!
XM3 ( K@ E#W1 ( G0%N $ ZP(SP% SP%!6Z$<)@\0("\!T!U;H/_U9Z\+'
XM1 P (O&7HOE7<(& %:^*DV ? 0 ? J+QH/&$#UJ3G+P@'P$ 'P$,\#K HO&
XM7L-5B^Q6Z-?_B_ +P'4$,\#K"E;_=@3_=@;H,_]>7<-5B^Q6BW8(.70.= 0S
XMP.L/5NC:_%E6_W8$_W8&Z!'_7EW#58OL5H-^! !\">B1_XOP"\!U!#/ ZQ"*
XM1@2(1 16,\!0_W8&Z.?^7EW#58OLN '-4/]V!/]V!HU&"%#H.Q9=PU6+[%97
XMBUX$@S\ ?0B+1P8#!T#K"HM>!(L'F3/"*\*+\(O(BUX$]T<"0 !T NLOBUX$
XMBW\*@S\ ?1WK"4^+WX _"G4!08O&3@O =?#K$(O?1X _"G4!08O&3@O =?"+
XMP5]>7<(" %6+[%:+=@16Z.7\60O = 6X___K2H-^"@%U$(,\ 'X+5NAV_YDI
XM1@895@B!9 )?_L<$ "+1 B)1 K_=@K_=@C_=@:*1 284.@_$(/$"(/Z_W4*
XM/?__=06X___K C/ 7EW#58OL@^P$5HMV!(I$!)A0Z-H(68E&_(E6_H,\ 'T-
XM5N@6_YD!1OP15O[K"U;H"?^9*4;\&5;^BU;^BT;\7HOE7<-5B^Q65_]V!/]V
XM!O]V"/]V"NA&!0O =00SP.LOBT8(*T8$0(OXBW8&ZQD>_W8,_W8$5NC"&5)0
XM5^CB!(O'T> !1@Q&.W8*?N*X 0!?7EW#58OL5E>+1@@K1@1 B_B+=@;K&?]V
XM!%;HCAE24![_=@Q7Z*H$B\?1X %&#$8[=@I^XK@! %]>7<-5B^R#[ 965XM^
XM!O]V!%?_=@C_=@KHNP0+P'0D_W8,_W8.BT8(*T8$BU8, ]!2BT8**\>+5@X#
XMT%+HEP0+P'4$,\#K7(E^_HM&"HE&_,=&^@$ .WX.?0Z+1@J)1OZ)?OS'1OK_
XM_XMV_NLI_W8,B\8KQXM6#@/04NCV&%)0_W8$5NCM&%)0BT8(*T8$0%#H!@0#
XM=OJ+1OP#1OH[QG7-N $ 7UZ+Y5W#58OLN '-4+@Z35#_=@2...@90Z.X37<-5
XMB^Q6BW8&BP1(B016BD8$F%#H!0!965Y=PU6+[%:+=@:*1@2B+(&#//]]-XL$
XM0(D$BUP*_T0*H"R!B ?W1 (( '0=@#XL@0IT!X ^+($-=0]6Z+3Z60O = :X
XM___IM #IK #W1 *0 '4']T0" @!U!X%, A Z^*!3 ( 8-\!@!T1(,\ '0+
XM5NA]^ED+P'0"Z\>+1 ;WV(D$BUP*_T0*H"R!B ?W1 (( '09@#XL@0IT!X ^
XM+($-=0M6Z$OZ60O = +KE>M(@#XL@0IU'_=$ D =1BX 0!0N)A.4(I$!)A0
XMZ&T8@\0&/0$ =1BX 0!0N"R!4(I$!)A0Z%48@\0&/0$ = KW1 ( G4#Z6+_
XMH"R!M !>7<-5B^Q6BW8$N#I-4%;H]/Y965Y=PU6+[$Q,5E>+?@:+=@2)?O[W
XM1 (( '0FZQI6BUX(_T8(B@>84.C(_EE9/?__=04SP.GW (O'3PO ==_IZ@#W
XM1 ) '4#Z8, @WP& '1E.7P&<RB#/ !T"U;H@_E9"\!T NO,5_]V"(I$!)A0
XMZ+D7@\0&.\=S NNWZ:T BP0#QWP:@SP =0JX__\K1 :)!.L+5NA+^5D+P'0"
XMZY17_W8(_W0*Z"H.@\0&BP0#QXD$ 7P*ZW57_W8(BD0$F%#H:1>#Q 8[QW,#
XMZ6;_ZUV#? 8 =$'K-HL$0(D$"\!]%HM<"O]$"E.+7@C_1@B*!UN(![0 ZP]6
XMBUX(_T8(B@=0Z-?]65D]__]U ^DF_XO'3PO =</K%E?_=@B*1 284.@T!H/$
XM!CO'<P/I!_^+1OY?7HOE7<(& %6+[(U&!%"X 0!0,\!0Z/WT7<-5B^Q65XMV
XM!%;HW!!9B_A65[@Z35#HH_X[QW0%N/__ZQJX.DU0N H 4.A^_5E9/0H = 6X
XM___K [@* %]>7<-5B^Q,3(M&!-'HB\B@M$ZT %"+P3/26_?SB$;_M "*%K1.
XMM@#WZHK1*M"(5OZ*9O^*1OZ+Y5W"! !5B^Q65XM^!HMV!(L5.Q1T";< M +H
XM-@B)%/[".A:T3G($_L:R (D57UY=P@0 58OL@^P*5E?H+P6)1OB)1OJ+1@P[
XM!KE.=06X 0#K C/ B4;V"\!T#/]V#/]V"NAH_XE&_HM&"#L&N4YU!;@! .L"
XM,\"+^ O =%W_=@C_=@;H1O^)1OSK3PO_=!:-1OQ0C4;Z4.AK_[< M CHL@>+
XM\.L*Q%X&)HLW@T8& H-^]@!T&XU&_E"-1OI0Z$7_B\:*W+D! +< M GHA0?K
XM"L1>"B:)-X-&"@*+1@3_3@0+P'6GBU;XMP"T NAE!U]>B^5=P@H 58OLH+5.
XMM +P'4;@SZ[3@!T%/]V#/]V"O]V"/]V!O]V!.C;%.L2_W8,_W8*_W8(_W8&
XM_W8$Z 3_7<(* %6+[*"T3K0 B\B@LTZT (O0.4X*=R0Y3@9W'XM&"CM&!G\7
XM.58(=Q(Y5@1W#8M&"#M&!'\%N $ ZP(SP%W"" !5B^Q65XMV"(M^!HL,L2#K
XM!8D,1D9'.WX$?O9?7EW"!@!5B^R![* H+5.M +P'0#Z2H!@SZ[3@!U ^D@
XM 8!^! %T ^D7 ?Y&#/Y&"OY&"/Y&!H!^#@9T ^F( (I&"K0 4(I&#+0 4(I&
XM!K0 4(I&"+0 4(I&"K0 0%"*1@RT %#H:?J#Q R-AF#_4(I&!K0 4(I&#+0
XM4(I&!K0 4(I&#+0 4.B_^8/$"HV&8/]0BD8,M !0BD8(M !0Z$+_C89@_U"*
XM1@:T %"*1@BT %"*1@:T %"*1@RT %#HU_F#Q KIDP"*1@JT $!0BD8,M !0
XMBD8&M !(4(I&"+0 4(I&"K0 4(I&#+0 4.C@^8/$#(V&8/]0BD8*M !0BD8,
XMM !0BD8*M !0BD8,M !0Z#;Y@\0*C89@_U"*1@RT %"*1@BT %#HN?Z-AF#_
XM4(I&"K0 4(I&"+0 4(I&"NET_XH^L$Z*9@Z*1@2*;@J*3@R*=@:*5@CH:06+
XMY5W"# "@+DV84.BQ"%D+P'4&@28L3?_]N "4/<&+$T G0%N $ ZP(SP% S
XMP%"X*DU0Z#@ @\0(H#Y-F%#H?0A9"\!U!H$F/$W__;@ E#W!CQ- )T!;@"
XM .L",\!0,\!0N#I-4.@$ (/$",-5B^Q65XMV!(M^"CET#G4,@WX( G\&@?__
XM?W8&N/__Z:8 @SZ<3@!U#H'^.DUU",<&G$X! .L3@SZ:3@!U#('^*DUU!L<&
XMFDX! (,\ '01N $ 4#/ ,])04E;H@/>#Q CW1 ($ '0'_W0(Z%$868%D O/_
XMQT0& "+Q@4% (E$"(E$"H-^" )T/0O_=CG'!B)-9M6#?@8 =197Z/ 868E&
XM!@O = >!3 ($ .L#Z6W_BT8&B40*B40(B7P&@WX( 74%@4P"" SP%]>7<-5
XMB^Q65XM^!HMV!%?_=@C_-.C="(/$!@$\BQS&!P"+QU]>7<(& %6+[(M>!,8'
XM +C>TE"-1@10_W8&C48(4.BC#%W#58OLBUX$Q@< N-[24(U&!%#_=@;_=@CH
XMAPQ=PU6+[+@! % SP#/24%+_=@3H*0>#Q A=PU6+[%:+=@8+]G4#OC"!Q@0
XMN*!.4%;H_@I96;@* %"+Q@4# % SP%#_=@3HPP>#Q BXI$Y05NC>"EE9B\9>
XM7<($ %6+[%:+=@16@SXN@?]U!;@" .L#N $ 08N@:$N@5#HG/^+\#/ 4%;H
XM^^Y963W__W75B\9>7<-5B^R+5@2#^O]U!;C__^L:BL*T (O8]H<A3 1T"8K"
XMM %( #K!(K"M !=PU6+[(M6!(/Z_W4%N/__ZQJ*PK0 B]CVAR%,"'0)BL*T
XM 7@_^L$BL*T %W#M .W .C? HO"P^CS_[0 BA:L3K8 *\) P^CD_[$(T^BT
XM (H6K4ZV "O"0,-5B^R![(H 5E>+1@A /0( <P4SP.G6 (M>!-'C]X=J3@"
XM=!+_=@C_=@;_=@3HIA"#Q ;IMP"+7@31XX&G:D[__8M&!HE&^(M&"(E&_.M7
XM_T[\BU[X_T;XB@>(1OL\"G4$Q@0-1HI&^X@$1HV&=O^+UBO0@?J 'PSB]8K
XMT(OZ5U#_=@3H3Q"#Q :)1OX[QW05@W[^ ',%N/__ZTR+1@@K1OSK/^M"C89V
XM_XOP@W[\ '6=C89V_XO6*]"+^HO""\!V*%>-AG;_4/]V!.@($(/$!HE&_CO'
XM=!*#?OX <P+KMXM&" -&_BO'ZP.+1@A?7HOE7<-65S/_OBI-ZQ#W1 (# '0%
XM5NB\\%F#QA!'@_\4?.M?7L-65[\$ +XJ3>L0]T0" P!T!5;H9/%93X/&$ O_
XM=>Q?7L-5B^Q65U6+=@3\*\"9N0H MP"_(4R*'$;V 0%U^+T (#[*W0&@/LM
XM=01%BAQ&@/LY=RZ ZS!R*??A \,2UG3KZQ*+^KD* /?AEX?1]^*2EP/#$]&*
XM'$: ^SEW!8#K,'/A37P']]KWV(/: %U?7EW#58OL_W8$Z(?_65W#S1'#S1+#
XM58OLBF8$BTX(BU8&S1J2B]%=PU6+[(M&!(O4@>H CO"<P>CF@ SP.L)QP:2
XM @ N/__7<-5B^R+1@2+5@8#!IH @]( B\@+TG40@<$ G(*.\QS!H<&F@#K
XM"<<&D@ ( +C__UW#58OL_W8$Z*3_65W#58OLBT8$F5)0Z+?_65E=PU6+[(M.
XM"+1#BD8&BU8$S2%R Y'K!%#H@0-=PU6+[+0^BUX$S2%R#-'CQX=J3O__,\#K
XM!%#H8P-=PXO$*P:: "T@ G,",\ D\,-5B^Q6BW8$ZQ3$7@;_1@8FB@>+WD8Z
XM!W0$,\#K"( \ '7GN $ 7EW"!@"T$K,0Z < BL,$\+0 PU4>4;E ([968#\
XM '0)@/P/=%;-$.MJ/ -U&K@ &LT0/!IT!8 FAP#^M &Y!P;-$+@# .O>/$!U
XMVK,0M!+-$(#[$'0]N!(1,MO-$+@ $K,@S1"X !K-$#P:=": #H< ;0!N0 &
XMS1#K&,T0/ -U$E#H?_\*P%AT"8 ^A 8= *P0!]=P[0/Z'?_4.@7 %FT"+<
XMZ&O_BL0D?XK@B":Q3H@FL$[#58OLBD8$HK).M _H3O^()K1..@:R3G0MH+).
XMM #H//^T#^@W_Z*R3H@FM$Z /K). W42N$ CL F@#Z$ !A^!<8&LDY @#ZR
XM3@-V$X ^LDY <PR /K).!W0%N $ ZP(SP**U3H ^LDY = 2P&>L+N$ CL F
XMH(0 _L"BLTZ /K).!W0?N #PNNK_4%*XO4Y0Z)'^"\!U#.BT_@O =06X 0#K
XM C/ HK9.@#ZR3@=U!;@ L.L#N "XH[E.QP:W3@ L "BK4ZBK$Z@M$X$_Z*N
XM3J"S3@3_HJ].7<. /L1. '0*Q@;$3@"@Q4[K!;@ !\TAM ##5H ^Q$X = ?H
XMW/^+\.L*Z-7_B_!0Z'CU68O&7L-5B^R /L1. '0%N/__ZPO&!L1. 8M&!*+%
XM3EW#58OL3$Q65XM^!!X'"_]T&K BB6Y___\\J[WT4ET"XL^GD\+_XE^_G4+
XM,\#K*H-&_@*+?OZ+/0O_=.^*!0K =.DZX'7IB]F .3UUXHMV!/.FA\MUV4>+
XMQU]>B^5=PU6+[+0UBD8$S2&3C,)=PU6+[+0EBD8$'L56!LTA'UW#58OL@^P2
XM5E=5'IR-3NZ)3OR,5O['1NZ+;L9&\-[&1O'-BT8$B$;R/"5R'#PF=QC&1O,V
XMQT;TCP:)3O;&1OC*QT;Y @#K"L_&1O/*QT;T @"+?@8>5XL%BUT"BTT$BU4&
XM_W4(BW4*CD40Q7T,_U[\'E=5G(OLQ7X(B06)70*)302)50:)=0J,11"/11*/
XM10B/10R/10Z#Q 0.Z*K_'UU?7HOE7<-5B^RT1(I&!HM>!(M."HM6",TA<@R#
XM?@8 =02+PNL&ZP10Z ( 7<-5B^Q6BW8$"_9\%8/^6'X#OE< B3;&3HJ$R$Z8
XMB_#K$8O&]]B+\(/^(W_EQP;&3O__B3:2 +C__UY=P@( 58OLN !$BUX$S2&2
XM)8 7<.T"\TAF,-5B^R+7@31XX&G:D[__;1"BD8*BUX$BTX(BU8&S2%R NL%
XM4.B&_YE=PU6+[(/L(E97!HM^"AX'BUX(@_LD=UB ^P)R4XM&#(M.#@O)?1&
XM?@8 = O&!2U']]GWV(/9 (UVWN,/D2O2]_.1]_.(%$;C">OQ*]+W\X@41@O
XM=?6-3M[WV0/._$Z*!"P*<P0$.NL# D8$JN+OL "J!XM&"E]>B^5=P@P 58OL
XM@WX("G4&BT8$F>L%BT8$,])24/]V!O]V"+ !4+!A4.A>_UW#58OL_W8&_W8$
XM_W8(_W8*L !0L&%0Z$3_7<-5B^S_=@;_=@3_=@C_=@J#?@H*=06X 0#K C/
XM4+!A4.@?_UW#58OL5XS8CL"+?@2+3@CC"(I&!OSRKG0#OP$ 3XO'7UW#58OL
XM5E>+1@B+R.,7BW8$BWX&C-B.P/SSIHI$_S+DBDW_,NTKP5]>7<-5B^Q65XS8
XMCL"+?@2+=@:+3@C1Z?SSI7,!I(M&!%]>7<-5B^Q7C-B.P(M^!(M.!HI&"(K@
XM_/?' 0!T!.,)JDG1Z?.K<P&J7UW#58OLBD8&4/]V"/]V!.C(_X/$!HM&!%W#
XM58OL5E>,V([ BT8$.T8&<P;]N $ ZP/\,\"+=@2+?@:+3@@+P'0& _%. _E/
XM]\<! '0$XQ&D22OP*_C1Z?.E<P4#\ /XI/Q?7EW#58OL_W8(_W8$_W8&Z*;_
XM@\0&BT8$7<-5B^R+3@2T/(M6!LTA<@+K!%#H?OU=P@0 58OLBUX$*\DKTK1
XMS2%=P@( 58OL@^P$5E>+=@;WQ@# =0RADDXE ,"+U@O0B_+WQ@ !='JAE$XA
XM1@B+1@BI@ %U![@! %#H,/TSP%#_=@3HC?E968E&_CW__W4I]T8(@ !T!#/
XMZP.X 0")1O[WQO ="G_=@0SP%#H:O^+^ O ?1/IL0#WQ@ $=".X4 !0Z.?\
XMZ:, 5^AA^5GK%_]V!/]V_NA!_XOX"\!]:NF( ,=&_@ 5O]V!.B$ %E9B_@+
XMP'Q3,\!05^B)_%E9B4;\J8 =!Z!S@ @]\8 @'0>)?\ #2 4+@! %!7Z&;\
XM@\0&ZPKWQ@ "= 17Z 3_@W[^ '04]\;P '0.N $ 4%#_=@3HS?B#Q 8+_WP=
XM]\8 W0%N 0ZP(SP(O6@>+_^ O0B]_1XXF7:DZ+QU]>B^5=PU6+[$Q,L &+
XM3@;WP0( =0JP O?!! !U K BU8$L? B3@8*P;0]S2%R&HE&_HM>_M'CBT8&
XM)?_X#0" B8=J3HM&_NL$4.CS^XOE7<-5B^RT/XM>!(M."(M6!LTA<@+K!%#H
XMU_M=PU6+[+1*BUX&CD8$S2%R!;C__^L&4U#HO/M87<-5B^Q65_R+?@0>!XO7
XM,L"Y___RKHUU_XM^!KG___*N]]$K^8?W]\8! '0"I$G1Z?.E<P&DDE]>7<-5
XMB^Q6_(MV!(I>!O?& 0!T":PZPW09(L!T$:TZPW01(L!T"#KC= @BY'7O,\#K
XM!$:-1/Y>7<-5B^Q65XS8CL#\,\"+V(M^!HOW,L"Y___RKO?1B_Z+=@3SIHI$
XM_XI=_RO#7UY=PU6+[%97C-B.P/R+?@:+]S+ N?__\J[WT8M^!/.DBT8$7UY=
XMPU6+[%>,V([ BWX$,\#\N?__\JZ1]]!(7UW#58OL5E>,V([ _(M^!HOW,L"+
XM7@B+R_*N*]F+?@2'R_.DB\OSJHM&!%]>7<-5B^Q6_(MV!(O6ZPLL83P9=P4$
XM08A$_ZPBP'7PDEY=PU6+[+1!BU8$S2%R!#/ ZP10Z'WZ7<.*QN@" (K"U!"&
XMX.@" (;@!) G%$ GJL-5B^R![)8 5E?'1NX ,=&[% QT;J #K1E>Y__\R
XMP/*N]]%)7\,VB 5'_D[L=2]345(&C89J_ROXC89J_U!7_W8(_U8*"\!U!<=&
XMZ@$ QT;L4 !?NZ-OFK_!UI96\,&_(V^:O^)?OR+?OR+=@:L"L!T$CPE=!$V
XMB 5'_D[L?^[HK/_KZ>GN XEV\*P\)73GB7[\,\F)3O*)3OZ(3O7'1OC__\=&
XM]O__ZP&L,N2+T(O8@.L@@/M@<Q.*GRE/@_L7=@/IH0/1XR[_IUGDZ9<#@/T
XM=_B#3OX!Z]" _0!W[8-._@+KQ8#] '?B@'[U*W0#B%;UZ[6#9O[?ZP2#3OX@
XMM07KIX#] '=-]T;^ @!U*8-._@BU >N3Z4P#BWX$-HL%@T8$ H#] G,2"\!Y
XM!O?8@T[^ HE&^+4#Z6__@/T$==>)1O;^Q>EB_X#]!'/*M03_1O;I5?^2+#"8
XM@/T"=QFU H=&^ O ?-'1X(O0T>#1X /" 4;XZ3/_@/T$=9N'1O8+P'2UT>"+
XMT-'@T> #P@%&]ND7_X-._A#I9?^!3OX 8-F_N_I6?^W".L*MPKK"K<0L^D"
XMVL9&]0"(5OLSTHA6^HM^!#:+!>L0MPK&1OH!B%;[BWX$-HL%F4='B78&]T;^
XM$ !T!3:+%4='B7X$C7Z["\!U+PO2=2N#?O8 =2F+?OR+3OCC&H/Y_W05BT;^
XM)0@ = 2R,.L"LB"*PN@)_N+YZ4G^@T[^!%)05XK'F%"*1OI04^BJ^!8'BU;V
XM"])_ ^GQ .G\ (A6^XEV!HU^NHM>!#;_-T-#B5X$]T;^( !T$#:+%T-#B5X$
XM%@?H>_VP.JH6!UKH<OTVQ@4 QD;Z (-F_ON-3KHK^8?/BU;V.]%_ HO1Z9X
XMB78&B%;[BWX$-HL%@T8$ A8'C7Z[,N0VB06Y 0#IN0")=@:(5ON+?@3W1OX@
XM '4--HL]@T8$ AX'"__K"S;$/8-&! 2,P O'=04>![\B3^@S_3M.]G8#BT[V
XMZWV)=@:(5ON+?@2+3O8+R7T#N08 5U&-7KM34K@! "-&_E"+1OZI %T";@(
XM (-&! KK!X-&! BX!@!0Z(\*%@>-?KOW1OX( '08BU;X"])^$>C6_": /2UU
XM 4DKT7X#B5;RBD;U"L!T$B: /2UT#(-N\@&#5O( 3R:(!>BL_(OWBW[\BU[X
XMN 4 (T;^/04 =1.*9ON _&]U#8-^\@!_!<=&\@$ ZQN _'AT!8#\6'41@T[^
XM0$M+@V[R GT%QT;R #3O+W1OX" '4,ZP:P(.AE_$L[V7_V]T;^0 !T"[ P
XMZ%3\BD;[Z$[\BU;R"])^)RO**]HFB@0\+70(/"!T!#PK=0<FK.@O_$E+A\KC
XM![ PZ"3\XOF'RN,2*]DFK#:(!4?^3NQ_ ^@7_.+P"]M^"8O+L"#H ?SB^>E!
XM_(EV!HM^!/=&_B =0LVBSV#1@0"'@?K!S;$/8-&! 2X4 J1NP#1NXFB07W
XM1OX0 '0'1T<FQP4 .D"_(MV\(M^_+ EZ+7[K K =?B ?NQ0?0/HL/L'@W[J
XM '0%N/__ZP.+1NY?7HOE7<(( *C@DN#=X)W@"^$8X5;A7>%BX<;@B^%IX6WA
XM<>$'XK/B5^)WXNWC*>0IY"GDN."^X%6+[(M&!$B*%K1.M@#WZE"AMTY: \*+
XM5@9* \+1X(L6N4Y=P@0 58OL3$Q65Z"V3K0 B4;^'HM.!.-:Q'X*Q78&_#OW
XM<PJ+P4C1X /P _C]@W[^ '4$\Z7K.[K: XS C-L[PW01^NS0R'+[[-#(<_NE
XM^^+QZQ_Z[-#(<OOLT,AS^ZW[B]CLT,AR^^S0R'/[B\.K^^+A_!]?7HOE7<(*
XM %6+[(M>!-'C]X=J3@ (=!.X @!0,\ STE!2_W8$Z#'U@\0(M$"+7@2+3@B+
XM5@;-(7(/4(M>!-'C@8]J3@ 06.L$4.BX]%W# "X[%G#E
XM=#>.VHX> @"#/@( '0'+HP><N7K.(S8+CL&<.5T%:$( "ZC<N4>,\!0Z*$
XM+HX>=N7K(RZ+%G#E+L<&<.4 "['!G+E NQP9TY0 +HX>=N52,\!0Z([?
XM6%C#CMH>C@8" ,<& @ (P&" N.Q9PY70N)H,^ @ =2:A !;!B8!!@
XMC,$#T([")H,^ @ =0<FB0X( .L*)HD. @#K ^A1 >,P"8#!@ CMB#/@(
XM '0!PZ$ "8!!@ C,",VP,> ".PR:C @",VSL>!@!T&8X&!@".'@0 C 8&
XM ":,'@0 +HP>=.6.V\,NQP9TY0 PRZA=.4+P'0@C-/ZCM VC@8& #:,'@8
XMC!8$ ([3^R:,'@0 C 8& ,,NC!YTY8P>! ",'@8 PU6+[%97+HP>=N6+5@8+
XMTG0/+CL6<N5U!>BS_NL#Z!#_+HX>=N5?7EW#4"Z.'G;E,\!04.C$WEM;)0\
XM=!.Z$ KT#/ +HX>=N504NBLWEM;6% SVXK<L033Z]/@+HX>=N534.B4WEM;
XM6SW__W08+HD6<.4NB19RY8[:B1X (D6 @"X! ##,\"9PU SVXK<L033Z]/@
XM+HX>=N534.A;WEM;6SW__W08+HL.<N4NB19RY8[:B1X (D. @"X! ##,\"9
XMPXO:*08 ,6 ".VJ, (D> @"+V@,> ".VXD6 @"X! ##58OLBU8&BT8$
XM5E<NC!YVY8O("\IT7@43 (/2 ')!]\+P_W4[L033Z-/B"N(NBQ9PY0O2=" N
XMBQ9TY0O2=!*+VH[:.08 ',<BQ8& #O3=?#H4?_K'^CK_NL:Z(#_ZQ4SP)GK
XM$'?TZ%+^BQX( (D> @"X! NCAYVY5]>7<-3+HLV>.56+HLV>N56Z'/_6UL+
XMTG4"6\,?CL(&'E.+%@ _$J_! "+][D& /.E"])T-XS 0([ C-A CM@S_XOW
XMB\J!^0 0=@.Y !#1X='AT>'SI8'J !!V$(S !0 0CL",V 4 $([8Z],NCAYV
XMY>@L_EI:6K@$ ,,N.QYRY71#B_L#^(['B_$K\":)-@ )HD> @ &4([#)J,
XM (O3 ]&.PB:#/@( '0')HD^ @#K!2:)/@@ B_/HX_U:6HO6N 0 PU..PR:C
XM #V%,SP%#HAMQ:6EJX! ##58OLBU8*BT8(BUX&5E<NC!YVY2Z)%GCE+J-Z
XMY0O;=#*+R O*=#,%$P"#T@"Q!-/HT^(*XH[#)HL. [R'(.=P>+T[@$ .L;
XMZ%3_ZQ;HU_[K$5)0Z%/^ZPA34.AF_3/ F5]?+HX>=N5?7EW#60Y1,\GK%ED.
XM4;D! .L.60Y1N0( ZP99#E&Y P!55E>+[(OYBT8*BU8,BUX.BTX0"\EU" O2
XM=&D+VW1E]\<! '4<"])Y"O?:]]B#V@"#SPP+R7D*]]GWVX/9 (/W!(OIN2
XM5S/_,_;1X-'2T=;1USO]<@MW!#OS<@4K\QO]0.+G6_?# @!T!HO&B]?1Z_?#
XM! !T!_?:]]B#V@!?7EW*" #W\_?' @!T 9(STNOM6PY3@/D0<Q"+V-/@T^+V
XMV8#!$-/K"]/+@.D0DC/ T^++6PY3@/D0<Q"+VM/HT^KVV8#!$-/C"\/+@.D0
XMDC/2T^C+!PX&"\E]#/?3]]&#PP&#T0#K+P/#<P2!P@ 0BNFQ!-+E O6*Z-/H
XM ]"*Q24/ ,L'#@8+R7T,]]/WT8/# 8/1 .O1*\-S!('J !"*^;$$TN<RVRO3
XMBNC3Z /0BL4E#P#+!PX&5XOYBNZQ!-/BTNT#T(#5 (O'T^?2[ /?@-0 *],:
XM[(K%F))?RP 5E>+](M<!H/K!'(..QZ,3W0%Z$( ZP/H P!?7L,Y'HI/=".+
XM=P+V! %T!HDVC$_K(#LVBD]T#8O>Z%0 BT<"HXQ/ZPV+WC/ HXI/HXQ/HXY/
XM4^CWZEO#_P\['HI/=!B+=P*+!*@!=0\#!XD$BS\#^XEU HO>ZP/H,@"+/P/[
XMBP6H 70!PP$'B_<#\(E< HO?BW\&.]]T#HD^CD^+=P2)=02)? ;#QP:.3P
XMPXLVCD\+]G00BWP&B5P&B5T$B7\&B7<$PXD>CD^)7P2)7P;#5E>+](M$!@O
XM=%(%!0!R-B7^_ST( ',#N @ @SZ*3P!T'XL>CD\+VW0-B],Y!W,:BU\&.]IU
XM]>AF .LAZ(H ZQSH' #K%S/ ZQ.+\(/&"#DW<^GH:___!XO#!00 7U[#4#/
XM4%#H-^I;6R4! '0),])24.@IZEM;6% SVU-0Z![J6UL]__]T%(O8B1Z*3XD>
XMC$]80(D'@\,$B\/#6S/ PU SVU-0Z/?I6UL]__]T%HO8H8Q/B4<"B1Z,3UA
XMB0>#PP2+P\-8,\##*0>+\P,WB_X#^$")!(E< HEU H/&!(O&PXOL4U!14.@5
XM_UN+V O =!\>!_R+^(MV_HL,@\8$5H/I!='I\Z6)1O[H)/Y;BU[^@\0&PXO"
XM@\((.]%W-8O1.QZ,3W4/B0?_!P/#4U#H3.E;6^L>B_L#^(E= BO0*1>+]P/R
XMB7P"0HD5B\N+W^@W_HO9@\,$PU9758OLBUX(BT8*"\!T-PO;="V#ZP2+#TF+
XMT(/"!8/B_H/Z"',#N@@ .\IR#'<%@\,$ZPCHA__K ^A/_XO#ZPU0Z&7^ZP93
XMZ)#],\!;75]>PU:6DH7 = +WX^,%D??F \&6]^,#UE[#48KHL033Z /0BL6*
XMX]/K60/+BMPE#P"#XP\[T74".\/#_R:@3P CP:43X\&ED^/!IA/+HP>@^V)
XM-II/B3Z<3_R.!HX OH ,N0FK$",Q8?6DXLVB !&1KD! ( ^D #<A&.!HH
XMB_ZQ?S+ \J[C;H#Q?U"+P0/#0"7^_XO\*_AR7(OG!A\6!U%)\Z0RP*J.W8?R
XMA]F+PXO00^@9 '<'<D#H$@!W^3P@= @\#70$/ EUZ#+ Z^0+P'0'0JH*P'4!
XM0X;@,L#YXQ6L22PB= \$(CQ<=0> /")U JQ)"_;#Z>$360/*+HX>@^V)'I!/
XM0P/;B_2+["OK<N:+Y8DNDD_C#HEV (/% C:L"L#@^G3P,\")1@ NCAZ#[8LV
XMFD^+/IQ/_S:83_\VED^AD$^C@@"ADD^CA #_)I1/5E>+#H@ 4>C__%F+^ O
XM="(>'@>.'HH ,_;\\Z0?B_@&_S:, .CA_%N+V >CGD\+P'4#Z503,\"Y__^)
XM/X/# O*N)C@%=?2)!U]>H9Y/HX8 PP *IT0 !"0UP !"%
XM[0 !"6[@ 5'5R8F\@0RLK("T@0V]P>7)I9VAT(#$Y
XM.3 @0F]R;&%N9"!);G1L+@!.=6QL('!O:6YT97(@87-S:6=N;65N= T*1&EV
XM:61E(&5R<F]R#0I!8FYO<FUA;"!P<F]G<F%M('1E<FUI;F%T:6]N#0H
XM #Z!/H$
XM ) ! $UA>"!O9B T(')E860@8V]M;75N:71I97,@86QL;W=E9 H
XM26YV86QI9"!O<'1I;VXZ("TE8PH 4G5N;FEN9R!O;B E<P!U9'!?;W!E;B!F
XM86EL960A"@ E;'4@<V5C;VYD<R!S:6YC92 E,#)D)3 R9#HE,#)D '5D<%]O
XM<&5N(&9A:6QE9"$* '$])31D "4P,F0E,#)D.B4P,F0 <#TE-FQU+"!B/24Q
XM,&QU+"!U/24T9 *4VAU='1I;F<@9&]W;@H 8F%D/25L=2P@;F]B=68])6QU
XM+"!L;W-T/25L=0!#:&%R="!S8V%L92 P+BXE9" E "5U(&YE87(L("5L=2!F
XM87(@8GET97,@9G)E90 *0V]N;F5C=&EO;B!T:6UE9"!O=70A $%B;W)T:6YG
XM ')E8V5I=F5D("5D(&)Y=&5S(&9R;VT@)7,Z"@ E,#)8( * H* '-E;G0@
XM)60@8GET97,@=&\@)7,Z"@ E,#)8( * H* %!! K@0 +,$ 0*]
XM! (!R 0# =@$! 'K! 4& 04&!A0%" $G!0<!-@4)!$@%"@17!0P!; 4+ 7T%
XM#0*1!0X"H@4/ +4%$ #*!1$!V 42 >D%$P;]!10&#@86 1\&%0$L!A<$/ 88
XM!$D&&@%<!AD!:P8; GT&' *,!AT G08> + &'P"]!B S 8A -4&(@#@!B,!
XM[ 8D ?4&)03^!B8$!0<G!! '* 09!RD$(P<J!
XM %@" !59 ! ?_ " # 0 !_\
XM 8 ," '_P !0 P, ?_ '
XM #! "0 0
XM 0,"_P "PP /__
XM #0X /__
XM $#!O\ !46 #__P
XM !<8 #__P !
XM P7_ ?( __\ A(@
XM__\ 0,'_P
XM *2H /__ *R( /__
XM;G5L; !F;&]W:6YD97@ 9FQO=W-T871U<P!S;W5R8V5I;G1E<F9A8V4 <V]U
XM<F-E861J86-E;G1T>7!E '-O=7)C96%D:F%C96YT861D<F5S<P!S;W5R8V5A
XM9&IA8V5N=&UA<VL <V]U<F-E<&5E<G1Y<&5M87-K '-O=7)C97!E97)T>7!E
XM '-O=7)C97!E97)A9&1R97-S '-O=7)C97!E97)M87-K '-O=7)C961E=&%I
XM;'1Y<&5M87-K '-O=7)C961E=&%I;'1Y<&4 <V]U<F-E9&5T86EL861D<F5S
XM<P!S;W5R8V5D971A:6QM87-K '-O=7)C97-U8G-C<FEB97)I9 !S;W5R8V5S
XM=6)S8W)I8F5R;6%S:P!D97-T:6YT97)F86-E &1E<W1A9&IA8V5N='1Y<&4
XM9&5S=&%D:F%C96YT861D<F5S<P!D97-T861J86-E;G1M87-K &1E<W1P965R
XM='EP96UA<VL 9&5S='!E97)T>7!E &1E<W1P965R861D<F5S<P!D97-T<&5E
XM<FUA<VL 9&5S=&1E=&%I;'1Y<&5M87-K &1E<W1D971A:6QT>7!E &1E<W1D
XM971A:6QA9&1R97-S &1E<W1D971A:6QM87-K &1E<W1S=6)S8W)I8F5R:60
XM9&5S='-U8G-C<FEB97)M87-K '-U8G-C<FEB97)I9 !S=6)S8W)I8F5R;6%S
XM:P!P9'5S8V%L90!O8W1E='-C86QE &9L;W=R=6QE<V5T &9L;W=T>7!E '1O
XM;V-T971S '1O<&1U<P!F<F]M;V-T971S &9R;VUP9'5S &9I<G-T=&EM90!L
XM87-T=&EM90!.;R!M96UO<GD@9F]R(&YE=R!F;&]W<R$ 9FQO=W,N)3 S9 !W
XM "5U+B5U+B5U+B5U "4P,G@M)3 R>"TE,#)X+24P,G@M)3 R>"TE,#)X "5S
XM.B E1G @("5U("5U"B @('L ("8@ 'T@+3X@>P @)B ?0H 5&]O(&UA;GD@
XM9FQO=W, 26YV86QI9"!F;&]W(&YU;6)E<B$ ;6%T8V@@;V9L;SH@9&5P=&@]
XM)60L('-T:ST )60L H@("!,;W=0965R/0 L($AI9VA0965R/0 * &UA=&-H
XM('5F;&\Z('-T:ST )60L H@("!,;W=0965R/0 L($AI9VA0965R/0 * I$
XM3B!P:W0@='EP92 E,#)X.B ("4P,G@ "@ @)3 R> * &9L;W<@)60Z("
XM(" @57 Z("4X;'4@)39L=2!$;W=N.B E.&QU("4V;'4@5&EM93H@)3AL=2 E
XM.&QU"@!3=&%T:7-T:6-S(%IE<F]E9 !-971E<B!3=&%T:7-T:6-S("XN $%V
XM('!K="]S("5L=2P@878@<&MT(&)A8VML;V<@)6QU $UA>"!P:W0O<R E=2P@
XM;6%X('!K="!B86-K;&]G("5U $ED;&4@=&EM92!A=B E=2XE=2P@;6EN("5U
XM+B5U("4 )74@9FQO=W,@:6X@=7-E("AM87@@)74I "5L=2!F;&]W<R!R96-O
XM=F5R960@*$=#.B E=2 @)74@)74I "5U+B5U(')U;&5S+W!K="P@)74N)74@
XM=&%L;&EE<R]P:W0 )74N)74@8V]M<&%R97,O=&%L;'D )74@:&%S:"!S;&]T
XM<RP@)74@:6X@=7-E+" 0V]P>7)I9VAT("A#*2 Q.3DR+#$Y.3,@8GD@3F5V
XM:6P@0G)O=VYL964 0V]M<'5T97(@0V5N=')E+"!5;FEV97)S:71Y(&]F($%U
XM8VML86YD !+97EB;V%R9"!C;VUM86YD<R N+@ ("!B.B!S:&]W($)A9"!P
XM86-K970@8V]U;G1S " @;3H@<VAO=R!-96UO<GD@=7-A9V4 ("!S.B!S:&]W
XM(%-T871I<W1I8W, ("!V.B!S:&]W(&UE=&5R(%9E<G-I;VX ("!Z.B!:97)O
XM('-T871I<W1I8W, $5S8SH@<W1O<"!M971E<FEN9RP@97AI="!.951R84UE
XM= !.951R84UE=#H@3F5T=V]R:R!4<F%F9FEC($UE=&5R(%8R+C 0 ,
XM & 0 0 ! FP$ $ " @ $ # !@
XM $ " 0 $ !
XM
XM "00 JJJQ-@$ # !@ $ " 0 $ "
XM
XM "08!JJJQ-@$ # !@ $
XM " 0 $ #
XM
XM"4,#JJJQ-@$ # !@ $ " 0 ( !
XM
XM "0("JJJQ-@$ # !@ $ #
XM 8P $ !
XM "0(+
XMNJJQ-@$ # !@ $ # 8P $ "
XM
XM "0(,NJJQ-@$ # !@ $ #
XM8P $ #
XM "0(-NJJQ
XM-@$ # !@ $ # 8P $ % 0 $ #_____
XM
XM "P(+JJJ?0@$ # !@ $ # 8P
XM $ % 0 ( #_____
XM "P0,JJJ?0@$
XM # !@ $ # 8P $ % 0 , #_____
XM
XM "T,-JJJ?0@$ # !@ $ # 8P $
XM % 0 0 #_____
XM "T,.JJJ?0@$ #
XM !@ $ # 8P $ &
XM
XM "4,0NJJQ-@$ # !@ $ # 8P $ '
XM 0 $ #_____
XM "P(!JJJ?0@$ #
XM!@ $ # 8P $ ' 0 ( #_____
XM
XM "P("NJJ?0@$ # !@ $ # 8P $ '
XM 0 , #_____
XM "P(#NJJ?0@$ # !@
XM $ # 8P $ (
XM
XM "0(2NJJQ-@$ # !@ $ # 8P $ )
XM
XM "0(3NJJQ-@$ # !@ $
XM # 8P ( ! 0 $ #_____
XM
XM"P(!JJK[1 $ # !@ $ # 8P ( ! 0 (
XM #_____
XM "P("JJK[1 $ # !@ $ #
XM 8P ( ! 0 , #_____
XM "P(#
XMJJK[1 $ # !@ $ # 8P ( ! 0 0 #_
XM____
XM "P($JJK[1 $ # !@ $ #
XM8P ( ! 0 4 #_____
XM "P0%JJK[
XM1 $ # !@ $ # 8P ( ! 0 8 #_____
XM
XM "P0&JJK[1 $ # !@ $ # 8P
XM ( ! 0 < #_____
XM "P('JJK[1 $
XM # !@ $ # 8P ( ! 0 @ #_____
XM
XM "P((JJK[1 $ # !@ $ # 8P (
XM ! 0 D #_____
XM "P0)JJK[1 $ #
XM !@ $ # 8P ( ! 0 H #_____
XM
XM "P0*JJK[1 $ # !@ $ # 8P ( !
XM 0 L #_____
XM "P(+JJK[1 $ #
XM!@ $ # 8P ( ! 0 P #_____
XM
XM "P(,JJK[1 $ # !@ $ # 8P ( !
XM 0 T #_____
XM "P0-JJK[1 $ # !@
XM $ # 8P ( ! 0 X #_____
XM
XM "P0.JJK[1 $ # !@ $ # 8P ( ! 0
XM !$ #_____
XM "P(1JJK[1 $ # !@ $
XM # 8P ( ! 0 !( #_____
XM
XM"P(2JJK[1 $ # !@ $ # 8P ( ! 0 !,
XM #_____
XM "P03JJK[1 $ # !@ $ #
XM 8P ( ! 0 !0 #_____
XM "P04
XMJJK[1 $ # !@ $ # 8P ( ! 0 !4 #_
XM____
XM "P(5JJK[1 $ # !@ $ #
XM8P ( ! 0 !8 #_____
XM "P(6JJK[
XM1 $ # !@ $ # 8P ( ! 0 !< #_____
XM
XM "P07JJK[1 $ # !@ $ # 8P
XM ( ! 0 !@ #_____
XM "P08JJK[1 $
XM # !@ $ # 8P ( ! 0 !D #_____
XM
XM "P(9JJK[1 $ # !@ $ # 8P (
XM ! 0 !H #_____
XM "P(:JJK[1 $ #
XM !@ $ # 8P ( ! 0 !L #_____
XM
XM "P0;JJK[1 $ # !@ $ # 8P ( !
XM 0 !P #_____
XM "P0<JJK[1 $ #
XM!@ $ # 8P ( ! 0 "$ #_____
XM
XM "P(AJJK[1 $ # !@ $ # 8P ( !
XM 0 "( #_____
XM "P(BJJK[1 $ # !@
XM $ # 8P ( ! 0 ", #_____
XM
XM "P(CJJK[1 $ # !@ $ # 8P ( ! 0
XM "0 #_____
XM "P(DJJK[1 $ # !@ $
XM # 8P ( ! 0 "4 #_____
XM
XM"T$EJJK[1 $ # !@ $ # 8P ( ! 0 "8
XM #_____
XM "T$FJJK[1 $ # !@ $ #
XM 8P ( ! 0 "< #_____
XM "T$G
XMJJK[1 $ # !@ $ # 8P ( ! 0 "@ #_
XM____
XM "T$HJJK[1 $ # !@ $ #
XM8P ( ! 0 "D #_____
XM "T,IJJK[
XM1 $ # !@ $ # 8P ( ! 0 "H #_____
XM
XM "T,JJJK[1 $ # !@ $ # 8P
XM ( " 0 $ #__________P
XM #$, JJJ 2 $
XM # !@ $ # 8P ( " 0 ( #_________
XM_P
XM # (!JJJ 2 $ # !@ $ # 8P (
XM # 0 $ #__________P
XM #$,"JJJ 2 $ #
XM !@ $ # 8P ( # 0 ( #__________P
XM
XM # (#JJJ 2 $ # !@ $ # 8P ( $
XM 0 $ #_______________\
XM #0(+JJK@2@$ #
XM!@ $ # 8P ( $ 0 ( #_______________\
XM
XM #4,,JJK@2@$ # !@ $ # 8P ( $
XM 0 , #_______________\
XM #0(-JJK@2@$ # !@
XM $ # 8P ( $ 0 0 #_______________\
XM
XM #40.JJK@2@$ # !@ $ # 8P , ! 0
XM $ #__________P
XM # (!JJH(40$ # !@ $
XM # 8P , ! 0 ( #__________P
XM
XM# ("JJH(40$ # !@ $ # 8P , ! 0 ,
XM #__________P
XM # (#NJH(40$ # !@ $ #
XM 8P , ! 0 0 #__________P
XM # 0$
XMNJH(40$ # !@ $ # 8P , ! 0 4 #_
XM_________P
XM # 0%NJH(40$ # !@ $ #
XM8P , ! 0 8 #__________P
XM # (&NJH(
XM40$ # !@ $ # 8P , ! 0 < #_____
XM_____P
XM # ('NJH(40$ # !@ $ # 8P
XM 0 ! 0 $ #__________P
XM # )EJJH(40$
XM # !@ $ # 8P 0 ! 0 , #_________
XM_P
XM # )GJJH(40$ # !@ $ # 8P 0
XM ! 0 0 #__________P
XM # )HNJH(40$ #
XM !@ $ # 8P 0 ! 0 4 #__________P
XM
XM # 1INJH(40$ # !@ $ # 8P 0 !
XM 0 8 #__________P
XM # 1JNJH(40$ #
XM!@ $ # 8P 0 ! 0 < #__________P
XM
XM # )KNJH(40$ # !@ $ # 8P 0 !
XM 0 @ #__________P
XM # )LNJH(40$ # !@
XM $ # 8P 0 ! 0 D #__________P
XM
XM # 1MNJH(40$ # !@ $ # 8P 0 ! 0
XM H #__________P
XM # 1NNJH(40$ # !@ $
XM # 8P 0 ! 0 L #__________P
XM
XM# )ONJH(40$ # !@ $ # 8P 0 ! 0 P
XM #__________P
XM # )PNJH(40$ # !@ $ #
XM 8P 0 ! 0 T #__________P
XM # 1Q
XMNJH(40$ # !@ $ # 8P 0 ! 0 X #_
XM_________P
XM # 1RNJH(40$ # !@ $ #
XM8P 0 ! 0 !$ #__________P
XM # )UNJH(
XM40$ # !@ $ # 8P 0 ! 0 !( #_____
XM_____P
XM # )VNJH(40$ # !@ $ # 8P
XM 0 ! 0 !, #__________P
XM # 1WNJH(40$
XM # !@ $ # 8P 0 ! 0 !0 #_________
XM_P
XM # 1XNJH(40$ # !@ $ # 8P 0
XM ! 0 !4 #__________P
XM # )YNJH(40$ #
XM !@ $ # 8P 0 ! 0 !8 #__________P
XM
XM # )ZNJH(40$ # !@ $ # 8P 0 !
XM 0 !< #__________P
XM # 1[NJH(40$ #
XM!@ $ # 8P 0 ! 0 !@ #__________P
XM
XM # 1\NJH(40$ # !@ $ # 8P 0 !
XM 0 !D #__________P
XM # )]NJH(40$ # !@
XM $ # 8P 0 ! 0 !H #__________P
XM
XM # )^NJH(40$ # !@ $ # 8P 0 ! 0
XM !L #__________P
XM # 1_NJH(40$ # !@ $
XM # 8P 0 ! 0 !P #__________P
XM
XM# 2 NJH(40$ # !@ $ # 8P 0 ! 0 "$
XM #__________P
XM # *%NJH(40$ # !@ $ #
XM 8P 0 ! 0 "( #__________P
XM # *&
XMNJH(40$ # !@ $ # 8P 0 ! 0 ", #_
XM_________P
XM # *'NJH(40$ # !@ $ $
XM 0 )L! ! 0
XM "@(?NJJQ
XM-@$ # !@ $ $ 0 )L! ! @
XM
XM "@(@JJJQ-@$ # !@ $ $ 0
XM )L! ! P
XM "@(AJJJQ-@$
XM # !@ $ $ 0 )L! ! !
XM
XM "@(BJJJQ-@$ # !@ $ $ 0 )L!
XM ! !0
XM "@(CJJJQ-@$ #
XM !@ $ $ 0 )L! ! !@
XM
XM "@(DJJJQ-@$ # !@ $ $ 0 )L! !
XM !P
XM "@(EJJJQ-@$ #
XM!@ $ $ 0 )L! ! "
XM
XM "@(FJJJQ-@$ # !@ $ $ 0 )L! !
XM"0
XM "@(GJJJQ-@$ # !@
XM $ $ 0 )L! ! "@
XM
XM "@(HJJJQ-@$ # !@ $ $ 0 )L! ! "P
XM
XM "@(IJJJQ-@$ # !@ $
XM $ 0 )L! ! #
XM
XM"@(JJJJQ-@$ # !@ $ $ 0 )L! ! #0
XM
XM "@(KJJJQ-@$ # !@ $ $
XM 0 )L! ! #@
XM "@(L
XMNJJQ-@$ # !@ $ $ 0 )L! ! #P
XM
XM "@(MJJJQ-@$ # !@ $ $
XM 0 )L! ! $
XM "@(NJJJQ
XM-@$ # !@ $ $ 0 )L! ! $0
XM
XM "@(OJJJQ-@$ # !@ $ $ 0
XM )L! " 0
XM "@(]JJJQ-@$
XM # !@ $ $ 0 )L! " @
XM
XM "@(^JJJQ-@$ # !@ $ $ 0 )L!
XM " P
XM "@(_JJJQ-@$ #
XM !@ $ $ 0 )L! " !
XM
XM "@) JJJQ-@$ # !@ $ $ 0 )L! "
XM !0
XM "@)!JJJQ-B4P,F0E,#)D
XM.B4P,F0@( @(" 3F]T('-T<FEN9P!.;W0@:6YT96=E<@!"860@;&]N9P!"
XM860@:6YT $)A9"!C:&%R $)A9"!!9&1R97-S $)A9"!2=6QE4V5T $EN8V]M
XM<&QE=&4@4G5L95-E= !2=6QE('-E=" E9"!O<&5N960 16UE<F=E;F-Y(')U
XM;&4@<V5T("5D $-A;B=T(&UO9&EF>2!C=7)R96YT(')U;&5S $-A;B=T(&UO
XM9&EF>2!D969A=6QT(')U;&5S $YO(&UE;2!F;W(@<G5L92!T86)L90!R=%LE
XM9%TZ("5D(')U;&5S $-A;B=T(&UO9&EF>2!C=7)R96YT(&%C=&EO;G, 0V%N
XM)W0@;6]D:69Y(&1E9F%U;'0@86-T:6]N<P!.;R!M96T@9F]R(&%C=&EO;B!T
XM86)L90!A=%LE9%TZ("5D(&%C=&EO;G, 3F]T('1I;65T:6-K<P!#;VQL96-T
XM:6]N(&)Y("5D+B5D+B5D+B5D "4P,F0E,#)D.B4P,F0@*P!P=6)L:6, <'5B
XM;&EC '!U8FQI8P U#_;/^$_Z3_R/W!U8FQI8P!P<F]X>0!P<FEV871E ')E
XM9VEO;F%L &-O<F4

XM
XM
XM
XM
XM
XM
XM
XM
XM
XM

XM
XM
XM
XM $ HD*V0L="W$+M0@U#(4,Y0U)#
XM9T-Y0Y9# !.971W;W)K(%5N<F5A8VAA8FQE $AO<W0@
XM56YR96%C:&%B;&4 4')O=&]C;VP@56YR96%C:&%B;&4 4&]R="!5;G)E86-H
XM86)L90!&<F%G;65N=&%T:6]N(&YE961E9"!A;F0@1$8@<V5T %-O=7)C92!2
XM;W5T92!&86EL960 5%1,(&5X8V5E9&5D(&EN('1R86YS:70 1G)A9R!294%S
XM;2!T:6UE(&5X8V5E9&5D %)E9&ER96-T(&9O<B!.971W;W)K %)E9&ER96-T
XM(&9O<B!(;W-T %)E9&ER96-T(&9O<B!43U,@86YD($YE='=O<FL 4F5D:7)E
XM8W0@9F]R(%1/4R!A;F0@2&]S= *#4E#35 Z( *#0!)0TU0(')E8V5I=F5D
XM('=I=&@@8F%D(&-H96-K<W5M"@T 4V]U<F-E(%%U96YC: !)4"!087)A;65T
XM97(@<')O8FQE;0!4:6UE<W1A;7 @;65S<V%G90!4:6UE<W1A;7 @<F5P;'D
XM26YF;R!R97%U97-T960 26YF;R!R97!L>0 !.;R!N86UE<V5R=F5R(&1E
XM9FEN960A"@T +@ &9$?D0 H-5&5R;6EN871I;F<@<')O9W)A;0H-
XM H-0W1R;"U"<F5A:W,@:6=N;W)E9 H- H-26YT97)R=7!T:6YG"@T /__
XM__\> "@U5;F%B;&4@=&\@<F5S;VQV92!B;V]T<"!S97)V97(*#0 ,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PS
XMS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,,\PSS#/,
XM,\PSS#/,,\PSS#/,,\P $-O;F9I9W5R:6YG('1H<F]U9V@@0D]/5% 0D]/
XM5% @9F%I;&5D"@T @ " 8 ,AB!452
XM4D]2(#!X "!S971T:6YG(')E8V5I=F4@;6]D90H- %!+5"!$4E92 $Y/(%!!
XM0TM%5"!$4DE615(@1D]53D0 15)23U(@:6YI=&EA;&EZ:6YG('!A8VME="!D
XM<FEV97(*#0!%4E)/4B!O;FQY(&5T:&5R;F5T('!A8VME="!D<FEV97)S(&%L
XM;&]W960*#0!%4E)/4B P> @86-C97-S:6YG('!A8VME="!D<FEV97(@9F]R
XM($E0"@T 15)23U(@<F5A9&EN9R!E=&AE<FYE="!A9&1R97-S"@T 15)23U(@
XM,'@ (&%C8V5S<VEN9R!P86-K970@9')I=F5R(&9O<B!!4E *#0!%4E)/4B!R
XM96QE87-I;F<@<&%C:V5T(&1R:79E<B!F;W(@05)0"@T 15)23U(@<F5L96%S
XM:6YG('!A8VME="!D<FEV97(@9F]R($E0"@T 4')O9W)A;2!H86QT960 )Y(
XMI4BM2+1(P$C'2,Y(U4CA2"X +@ N $QI<W1E;@!3>6Y396YT %-Y;E)E8P!%
XM<W1A8FQI<VAE9 !&:6Y7=#$ 1FEN5W0R $-L;W-7= !,87-T06-K5&U7= !#
XM;&]S960 5410(%-O8VME= !.;W0@86X@86-T:79E('-O8VME= >
XM +9)35E?25 3D5434%32P!'051%5T%9 $Y!345315)615( 0T]/2TE% $1/
XM34%)3E-,25-4 $A/4U1.04U% %-/0TM$14Q!60!%5$A)4 !-4U, 0D]/5%
XM0D]/5%!43P!$3TU!24Y43P!)3D%#5$E610!-54Q424A/3453 %!224Y4 H-
XM $E.0TQ51$4 "@U5;F%B;&4@=&\@;W!E;B G "<*#0!705140U N0T9' %!!
XM5$@ (&YO="!F;W5N9 H- "P N &$IX!4Q*; 0
XM _O__ 0 ! # Q,C,T
XM-38W.#DP,3(S-#4V-S@Y,#$R,S0U-C<X.3 Q,C,T-38W.#DP,3(S-#4V-S@Y
XM, !#;W!Y<FEG:'0@,3DY,"P@,3DY,2P@56YI=F5R<VET>2!O9B!7871E<FQO
XM;PH 15)23U(Z($,@8V]M<&EL97(@<V]C:R!S:7IE(&5R<F]R"@!51% @0VQO
XM<V4@8V%L;&5D $-O;FYE8W1I;VX@8VQO<V5D(&YO<FUA;&QY %1#4%]!0D]2
XM5 !#;VYN96-T:6]N('1I;65D(&]U=" M(&YO(&%C=&EV:71Y %1I;65O=70L
XM(&%B;W)T:6YG $E0(%)E8V5I=F5D($)!1"!#:&5C:W-U;2 *#0!)0TU0(&-L
XM;W-E9"!C;VYN96-T:6]N &-H86EN(&5R<F]R(&EN('5D< T* &1I<V-A<F1I
XM;F<N+BX 8VAA:6X@97)R;W(@:6X@=&-P#0H 8F%D('1C<"!C:&5C:W-U;2 *
XM#0 '!P<'!P<'8V]N;F5C=&EO;B!R97-E= H 4F5M;W1E(')E<V5T(&-O;FYE
XM8W1I;VX 0V]N;F5C=&EO;B!C;&]S960 #0H 2&]S="!R969U<V5D(&-O;FYE
XM8W1I;VX 3W!E;B!T:6UE9"!O=70 0V]N;F5C=&EO;B!T:6UE9"!O=70 0V]N
XM;F5C=&EO;B!T:6UE9"!O=70 (" @(" @(" @(2$A(2$@(" @(" @(" @
XM(" @(" @(" !0$! 0$! 0$! 0$! 0$! @(" @(" @(" D! 0$! 0$ 4%!04
XM%!0$! 0$! 0$! 0$! 0$! 0$! 0$!$! 0$! 0!@8&!@8& @(" @(" @(" @(
XM" @(" @(" @(0$! 0"
XM
XM
XM #'Q,?$Q\0 "0( *DT H" 0
XM #I- " @( !*30 0P(# 6DT $("!
XM &I- /\ !Z30 #_ BDT _P
XM )I- /\ "J30 #_ NDT
XM_P ,I- /\ #:30 #_ ZDT
XM _P /I- /\ *3@ #_
XM&DX _P "I. /\ Z3@ #_
XM 2DX _P %I. 2 "( (@!* "H/__________________
XM_____________________P! __\ T 05$U0 "XD)"0 $
XM 0!#3TU005$ 3 @($!08(" @4%043_Q8%$0+_
XM________________!07_____________________#_\C O\/_____Q/__P("
XM!0\"____$___________(_____\C_Q/_ "AN=6QL*0 %!0!%!44%!04 @ 4
XM P04"04%!04%!04%!104%!04%!04%!04#Q</"!04% <4%A04%!04%!04% T4
XM%!04%!04%!04$ H/#P\("A04!A02"PX4%!$4#!04#104%!04%!0
X0 !04
X
Xend
END_OF_FILE
if test 51182 -ne `wc -c <'netramet/pc/NeTraMet.exe.UU.B'`; then
echo shar: \"'netramet/pc/NeTraMet.exe.UU.B'\" unpacked with wrong size!
elif test -f 'netramet/pc/NeTraMet.exe.UU.A'; then


echo shar: Combining \"'netramet/pc/NeTraMet.exe.UU'\" \(113155 characters\)
cat 'netramet/pc/NeTraMet.exe.UU.A' 'netramet/pc/NeTraMet.exe.UU.B' > 'netramet/pc/NeTraMet.exe.UU'
if test 113155 -ne `wc -c <'netramet/pc/NeTraMet.exe.UU'`; then

echo shar: \"'netramet/pc/NeTraMet.exe.UU'\" combined with wrong size!
else


rm netramet/pc/NeTraMet.exe.UU.A netramet/pc/NeTraMet.exe.UU.B
echo shar: Uudecoding \"'netramet/pc/NeTraMet.exe'\" \(82096 characters\)
cat netramet/pc/NeTraMet.exe.UU | uudecode
if test 82096 -ne `wc -c <'netramet/pc/NeTraMet.exe'`; then

echo shar: \"'netramet/pc/NeTraMet.exe'\" uudecoded with wrong size!
else


rm netramet/pc/NeTraMet.exe.UU
fi
# end of 'netramet/pc/NeTraMet.exe.UU'
fi
fi

# end of 'netramet/pc/NeTraMet.exe.UU.B'
fi
if test -f 'netramet/src/snmplib/snmp.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/snmp.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/snmp.c'\" \(10606 characters\)
sed "s/^X//" >'netramet/src/snmplib/snmp.c' <<'END_OF_FILE'
X/*
X * Simple Network Management Protocol (RFC 1067).


X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#define noTESTING
X
X#include "ausnmp.h"
X
X#ifdef KINETICS
X#include "gw.h"
X#include "ab.h"
X#include "inet.h"
X#include "fp4/cmdmacro.h"
X#include "fp4/pbuf.h"
X#include "glob.h"
X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>


X#ifndef NULL
X#define NULL 0
X#endif

X#endif
X
X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X
X#include "mib.h"
X
X
Xu_char *
Xsnmp_parse_var_op(data, var_name, var_name_len, var_val_type, var_val_len, var_val, listlength)
X register u_char *data; /* IN - pointer to the start of object */
X oid *var_name; /* OUT - object id of variable */
X int *var_name_len; /* IN/OUT - length of variable name */
X u_char *var_val_type; /* OUT - type of variable (int or octet string) (one byte) */
X int *var_val_len; /* OUT - length of variable */
X u_char **var_val; /* OUT - pointer to ASN1 encoded value of variable */
X int *listlength; /* IN/OUT - number of valid bytes left in var_op_list */
X{
X u_char var_op_type;
X int var_op_len = *listlength;
X u_char *var_op_start = data;
X
X data = asn_parse_header(data, &var_op_len, &var_op_type);
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X if (var_op_type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR))
X return NULL;
X data = asn_parse_objid(data, &var_op_len, &var_op_type, var_name, var_name_len);
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X if (var_op_type != (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID))
X return NULL;
X *var_val = data; /* save pointer to this object */
X /* find out what type of object this is */
X data = asn_parse_header(data, &var_op_len, var_val_type);
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X *var_val_len = var_op_len;
X data += var_op_len;
X *listlength -= (int)(data - var_op_start);
X return data;
X}
X
Xshift_array(begin, length, shift_amount)
X u_char *begin;
X register int length;
X int shift_amount;
X{
X register u_char *old, *new;
X
X if (shift_amount >= 0){
X old = begin + length - 1;
X new = old + shift_amount;
X
X while(length--)
X *new-- = *old--;
X } else {
X old = begin;
X new = begin + shift_amount;
X
X while(length--)
X *new++ = *old++;
X }
X}
X
Xu_char *
Xsnmp_build_var_op(data, var_name, var_name_len, var_val_type, var_val_len, var_val, listlength)
X register u_char *data; /* IN - pointer to the beginning of the output buffer */
X oid *var_name; /* IN - object id of variable */
X int *var_name_len; /* IN - length of object id */
X u_char var_val_type; /* IN - type of variable */
X int var_val_len; /* IN - length of variable */
X u_char far *var_val; /* IN - value of variable */
X register int *listlength; /* IN/OUT - number of valid bytes left in output buffer */
X{
X int dummyLen, headerLen, header_shift;
X u_char *dataPtr;
X
X dummyLen = *listlength;
X dataPtr = data;
X#ifdef TESTING
X scpos(0,24);
X printf("build_var_op(): type=%d, length=%d\n value=%d, data=%p\n",
X var_val_type,var_val_len,*var_val,data);
X#endif
X data = asn_build_header(data, &dummyLen, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), 0);
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X headerLen = data - dataPtr;
X *listlength -= headerLen;
X data = asn_build_objid(data, listlength,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID),
X var_name, *var_name_len);
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X#ifdef TESTING
X printf(" header & oid OK, data=%p\n",data);
X#endif
X switch(var_val_type){
X case ASN_INTEGER:
X case GAUGE:
X case COUNTER:
X case TIMETICKS:
X data = asn_build_int(data, listlength, var_val_type,
X (long far *)var_val, var_val_len);
X#ifdef TESTING
X printf(" build_int returned %p\n", data);
X#endif
X break;
X case ASN_OCTET_STR:
X case IPADDRESS:
X case OPAQUE:
X data = asn_build_string(data, listlength, var_val_type,
X var_val, var_val_len);
X break;
X case ASN_OBJECT_ID:
X data = asn_build_objid(data, listlength, var_val_type,
X (oid far *)var_val, var_val_len / sizeof(oid));
X break;
X case ASN_NULL:
X data = asn_build_null(data, listlength, var_val_type);
X break;
X default:
X ERROR("wrong type");
X return NULL;
X }
X if (data == NULL){
X ERROR("");
X return NULL;
X }
X dummyLen = (data - dataPtr) - headerLen;
X header_shift = 0;
X if (dummyLen >= 0x80){
X header_shift++;
X if (dummyLen > 0xFF)
X header_shift++;
X }
X if (header_shift){
X /* should check available length here */
X shift_array(dataPtr + headerLen, dummyLen, header_shift);
X data += header_shift;
X headerLen += header_shift;
X }
X
X
X if (asn_build_header(dataPtr, &dummyLen, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), dummyLen) == NULL){
X ERROR("");
X return NULL;
X }
X return data;


X}
X
X
X
Xint

Xsnmp_build_trap(out_data, length, sysOid, sysOidLen, myAddr, trapType, specificType, time, varName, varNameLen, varType, varLen, varVal)
X register u_char *out_data;
X int *length;
X oid *sysOid;
X int sysOidLen;
X u_long myAddr;
X int trapType;
X int specificType;
X u_long time;
X oid *varName;
X int varNameLen;
X u_char varType;
X int varLen;
X u_char *varVal;
X{
X long version = SNMP_VERSION_1;
X int sidLen = strlen("public");
X int dummyLen;
X u_char *out_auth, *out_header, *out_pdu, *out_varHeader, *out_varlist, *out_end;
X int auth_shift, pdu_shift, list_shift;
X
X
X
X out_auth = out_data;
X out_header = snmp_auth_build(out_data, length, (u_char *)"public", &sidLen, &version, 90);
X if (out_header == NULL){
X ERROR("auth build failed");
X return 0;
X }
X out_pdu = asn_build_header(out_header, length, (u_char)TRP_REQ_MSG, 90);
X if (out_pdu == NULL){
X ERROR("header build failed");
X return 0;
X }
X out_data = asn_build_objid(out_pdu, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID),
X (oid *)sysOid, sysOidLen);
X if (out_data == NULL){
X ERROR("build enterprise failed");
X return 0;
X }
X out_data = asn_build_string(out_data, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OCTET_STR),
X (u_char *)&myAddr, sizeof(myAddr));
X if (out_data == NULL){
X ERROR("build agent_addr failed");
X return 0;
X }
X out_data = asn_build_int(out_data, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&trapType, sizeof(trapType));
X if (out_data == NULL){
X ERROR("build trap_type failed");
X return 0;
X }
X out_data = asn_build_int(out_data, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&specificType, sizeof(specificType));
X if (out_data == NULL){
X ERROR("build specificType failed");
X return 0;
X }
X out_varHeader = asn_build_int(out_data, length,
X (u_char)(TIMETICKS),
X (long *)&time, sizeof(time));
X if (out_varHeader == NULL){
X ERROR("build timestampfailed");
X return 0;
X }
X out_varlist = asn_build_header(out_varHeader, length, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), 90);
X out_end = snmp_build_var_op(out_varlist, varName, &varNameLen, varType, varLen, varVal, length);
X if (out_end == NULL){
X ERROR("build varop failed");


X return 0;
X }
X

X /*
X * Because of the assumption above that header lengths would be encoded
X * in one byte, things need to be fixed, now that the actual lengths are known.
X */
X list_shift = 0;
X *length = out_end - out_varlist;
X if (*length >= 0x80){
X list_shift++;
X if (*length > 0xFF)
X list_shift++;
X }
X pdu_shift = 0;
X *length = (out_end - out_pdu) + list_shift;
X if (*length >= 0x80){
X pdu_shift++;
X if (*length > 0xFF)
X pdu_shift++;
X }
X auth_shift = 0;
X /* 2 below is the size of the assumed asn header in the auth header */
X *length = (out_end - out_auth) - 2 + pdu_shift + list_shift;
X if (*length >= 0x80){
X auth_shift++;
X if (*length > 0xFF)
X auth_shift++;
X }
X if (auth_shift + pdu_shift + list_shift){
X /*
X * Shift packet (from start of varlist to end of packet) by the sum of the
X * necessary shift counts.
X */
X shift_array(out_varlist, out_end - out_varlist, auth_shift + pdu_shift + list_shift);
X /* Now adjust pointers into the packet */
X out_end += auth_shift + pdu_shift + list_shift;
X out_varlist += auth_shift + pdu_shift + list_shift;
X out_varHeader += auth_shift + pdu_shift;
X }
X /* Now rebuild header with the actual lengths */
X dummyLen = out_end - out_varlist;
X if (asn_build_header(out_varHeader, &dummyLen, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), dummyLen) != out_varlist)
X return 0;
X
X if (auth_shift + pdu_shift){
X /*
X * Shift packet (from start of varlist to end of packet) by the sum of the
X * necessary shift counts.
X */
X shift_array(out_pdu, out_varHeader - out_pdu, auth_shift + pdu_shift);
X /* Now adjust pointers into the packet */
X out_pdu += auth_shift + pdu_shift;
X out_header += auth_shift;
X }
X /* Now rebuild header with the actual lengths */
X dummyLen = out_end - out_pdu;
X if (asn_build_header(out_header, &dummyLen, (u_char)TRP_REQ_MSG, dummyLen) != out_pdu)
X return 0;
X
X out_data = out_auth;
X *length = out_end - out_auth;
X out_data = snmp_auth_build(out_data, length, (u_char *)"public", &sidLen, &version, out_end - out_header);
X if (out_data != out_header){
X ERROR("internal error");
X return 0;
X }
X *length = out_end - out_auth;
X return *length;
X}
X
X
END_OF_FILE
if test 10606 -ne `wc -c <'netramet/src/snmplib/snmp.c'`; then
echo shar: \"'netramet/src/snmplib/snmp.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/snmp.c'
fi
echo shar: End of archive 7 \(of 25\).
cp /dev/null ark7isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:08:53 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 96
Archive-name: netramet/part08
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.D
# netramet/doc/snmp/exclude netramet/src/apps/snmpnetstat/route.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:06 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 8 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.D' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\" \(49262 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.D' <<'END_OF_FILE'
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (18) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC
X271 256 1826 (This rule set meters traffic on a busy Local Area Network. It attempts to tally each of four) 1826 SB
X271 310 1863 (protocols by detail type so as to measure the amount of traffic flowing for each of these. In) 1863 SB
X271 364 1893 (addition data transport flows are tallied by peer address pairs so as to determine which pairs) 1893 SB
X271 418 1308 (of hosts generate the greatest proportion of total network traffic.) 1308 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 555 32 (6) 34 SB
X305 555 16 (.) 18 SB
X360 555 42 (N) 44 SB
X404 555 32 (e) 34 SB
X438 555 48 (M) 50 SB
X488 555 32 (a) 34 SB
X522 555 42 (C) 44 SB
X566 555 16 ( ) 18 SB
X584 555 42 (U) 44 SB
X628 555 32 (s) 34 SB
X662 555 32 (e) 34 SB
X696 555 23 (r) 25 SB
X721 555 32 (s) 34 SB
X755 555 14 (') 16 SB
X771 555 16 ( ) 18 SB
X789 555 48 (M) 50 SB
X839 555 32 (a) 34 SB
X873 555 35 (n) 37 SB
X910 555 35 (u) 37 SB
X947 555 32 (a) 34 SB
X981 555 16 (l) 18 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 655 84 (6.1.) 84 SB
X413 655 528 (Overview of NeTraMet) 528 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 738 1822 (NeMaC is a combined manager and collector for the NeTraMet meter. It is a simple Unix) 1822 SB
X271 792 1812 (program, written in a simple and straightforward way. It is intended to provide control for) 1812 SB
X271 846 1714 (NeTraMet, so as to make the initial NeTraMet implementation a useful and effective) 1714 SB
X271 900 1842 (monitoring tool. Later versions will make the coding more elegant, add more features and) 1842 SB
X271 954 127 (so on.) 127 SB
X271 1033 1767 (If only one meter is to be controlled, all the arguments can be placed on the command) 1767 SB
X271 1087 1833 (line, which is useful when testing new meters and/or rule files. If several meters are to be) 1833 SB
X271 1141 1797 (controlled, default values for the options can be specified on the command line, and the) 1797 SB
X271 1195 1722 (particular parameter values required for each meter can be specified by records in a) 1722 SB
X271 1249 351 (configuration file.) 351 SB
X271 1328 1828 (While NeMaC is running it produces a log file, recording any unusual events observed for) 1828 SB
X271 1382 1856 (any of the meters being controlled. The name of this log file is NeMaC.log.nnn, where nnn) 1856 SB
X271 1436 1678 (is a sequence number starting from 001. When NeMaC starts it scans the current) 1678 SB
X271 1490 1829 (directory for NeMaC log files, then uses the next available sequence number. In this way) 1829 SB
X271 1544 1281 (the log files are preserved through successive runs of NeMaC.) 1281 SB
X271 1623 1835 (In the same way, when NeMaC starts controlling a meter it opens a 'flows' file. The name) 1835 SB
X271 1677 1848 (of this file is meter-name.flows.nnn. 'meter-name' is the name used to reach the meter via) 1848 SB
X271 1731 1829 (IP; it may be an IP address \(e.g. 130.216.234.234\) or a host name \(provided NeMaC can) 1829 SB
X271 1785 1851 (get its address from a nameserver\). For example the third run of NeMaC controlling meter) 1851 SB
X271 1839 1615 (130.216.234.234 would produce a flows file called 130.216.234.234.flows.003.) 1615 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 1926 84 (6.2.) 84 SB
X413 1926 568 (Command Line Options) 568 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 2009 1716 (NeMaC's command line options are specified as usual, i.e. each option starts with a) 1716 SB
X271 2063 1699 (hyphen, a letter indicating the options, then any parameters required by the option.) 1699 SB
X271 2142 336 (The options are:) 336 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2222 151 (-c nnn) 151 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 2222 1435 (Specifies the required collection interval in seconds. If nnn is zero the) 1435 SB
X596 2276 1335 (flow data will be collected once, then NeMaC will exit; this can be) 1335 SB
X596 2330 1403 (useful, for example for changing the rule set back to its default value) 1403 SB
X596 2384 703 (of 1 if no flows are to be collected.) 703 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2464 192 (-f cfgfile) 192 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 2464 1437 (Gives the name of NeMaC's configuration file, i.e. the file it will read to) 1437 SB
X596 2518 1439 (determine which meters will be managed and have flow data collected) 1439 SB
X596 2572 881 (from them. Its default name is NeMaC.cfg.) 881 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2652 28 (-l) 28 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 2652 1262 (Requests NeMaC to list the rule file\(s\) as they are processed.) 1262 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2732 211 (-r rulefile) 211 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 2732 1353 (Gives the name of a rule file to be read and downloaded to one or) 1353 SB
X596 2786 1245 (more meters. Configuration file records may override this for) 1245 SB
X596 2840 360 (individual meters.) 360 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2920 41 (-s) 41 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 2920 1370 (Tells NeMaC that the rule file is to be read and checked for syntax,) 1370 SB
X596 2974 642 (but not downloaded to a meter.) 642 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (19) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X330 257 30 (-t) 30 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 257 1328 (This option is for testing - it provides extra diagnostic output from) 1328 SB
X596 311 169 (NeMaC.) 169 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 391 41 (-v) 41 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X596 391 1353 (Asks NeMaC to run in 'verbose' mode. This produces a display of) 1353 SB
X596 445 1395 (meter status information on the screen at each collection from every) 1395 SB
X596 499 131 (meter.) 131 SB
X271 578 1620 (Following the options, the name of a meter and its write SNMP community may) 1620 SB
X271 632 1739 (appear on the command line. In this case, NeMaC will begin managing the specified) 1739 SB
X271 686 1670 (meter. If NeMaC can find a configuration file, the meter information in that file will) 1670 SB
X271 740 836 (override any given on the command line.) 836 SB
X271 819 257 (For example) 257 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X389 898 1344 (NeMaC -c120 -r rules.sample 130.216.234.237 test) 1344 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 972 1669 (would cause NeMaC to begin managing meter 130.216.234.237 with write SNMP) 1669 SB
X271 1026 1693 (community 'test'. The rule file 'rules.sample' would be read and downloaded to the) 1693 SB
X271 1080 1748 (meter, and that meter's flow data would be collected every two minutes and written to) 1748 SB
X271 1134 1727 (a file called 130.216.234.237.flows.00x, where 00x was the next available sequence) 1727 SB
X271 1188 170 (number.) 170 SB
X271 1267 119 (Again) 119 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X389 1346 1260 (NeMaC -s -l -r rules.special > syntax.special) 1260 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1420 1762 (would cause NeMaC to perform a syntax check on the rule file 'rules.special,' writing a) 1762 SB
X271 1474 1715 (listing of the file during the syntax cheak. Output from this operation is directed to a) 1715 SB
X271 1528 920 (file called 'syntax.special' for later inspection.) 920 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 1615 84 (6.3.) 84 SB
X413 1615 616 (Configuration File Format) 616 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1698 1789 (The name of the configuration file is specified by the -f command line option \(above\). If) 1789 SB
X271 1752 1795 (this option is not used, 'NeMaC.cfg' is used as the default name. If NeMaC can find the) 1795 SB
X271 1806 1858 (configuration file it will read it and start controlling meter\(s\) as specified in the configuration) 1858 SB
X271 1860 1830 (records; otherwise it assumes that only one meter is to be controlled, and that all options) 1830 SB
X271 1914 720 (are specified on the command line.) 720 SB
X271 1993 1399 (Each record in a configuration file may contain the following options:) 1399 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2073 134 (-g sss) 134 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X566 2073 994 (Specifies the meter's garbage collection interval.) 994 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2153 112 (-h pp) 112 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X566 2153 356 (Sets NeTraMet's ) 356 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X922 2153 320 (HighWaterMark) 320 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1242 2153 768 ( as a percentage of the available flow) 768 SB
X566 2207 599 (space. Default value is 85%.) 599 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2287 119 (-i sss) 119 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X566 2287 442 (Specifies the meter's ) 442 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1008 2287 347 (InactivityTimeout) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1355 2287 583 ( interval in seconds. Default) 583 SB
X566 2341 447 (value is 600 seconds.) 447 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2421 198 (-r rulefile) 198 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X566 2421 1144 (Gives the name of the rule file to be used for this meter.) 1144 SB
X301 2500 1633 (Following the options, the name of a meter and its write SNMP community must) 1633 SB
X301 2554 724 (appear on the configuration record.) 724 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 2691 32 (7) 34 SB
X305 2691 16 (.) 18 SB
X360 2691 42 (N) 44 SB
X404 2691 32 (e) 34 SB
X438 2691 35 (T) 37 SB
X475 2691 23 (r) 25 SB
X500 2691 32 (a) 34 SB
X534 2691 48 (M) 50 SB
X584 2691 32 (e) 34 SB
X618 2691 19 (t) 21 SB
X639 2691 16 ( ) 18 SB
X657 2691 42 (U) 44 SB
X701 2691 32 (s) 34 SB
X735 2691 32 (e) 34 SB
X769 2691 23 (r) 25 SB
X794 2691 32 (s) 34 SB
X828 2691 14 (') 16 SB
X844 2691 16 ( ) 18 SB
X862 2691 48 (M) 50 SB
X912 2691 32 (a) 34 SB
X946 2691 35 (n) 37 SB
X983 2691 35 (u) 37 SB
X1020 2691 32 (a) 34 SB
X1054 2691 16 (l) 18 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 2791 84 (7.1.) 84 SB
X413 2791 568 (Command Line Options) 568 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 2874 1701 (NeTraMet is started from the command line like any other program. Command line) 1701 SB
X271 2928 1838 (options are specified in a Unix-like way, i.e. each option starts with a hyphen, then a letter) 1838 SB
X271 2982 1365 (indicating the options, then any parameters required by the option.) 1365 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (20) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC
X271 256 336 (The options are:) 336 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 336 165 (-w wsc) 165 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 336 1289 (Specifies that NeTraMet's write SNMP community is to be wsc.) 1289 SB
X537 390 596 (The default for this is private.) 596 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 470 129 (-r rsc) 129 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 470 1349 (Specifies a read SNMP community for NeTraMet. Up to four read) 1349 SB
X537 524 633 (communities may be specified.) 633 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 604 41 (-k) 41 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 604 1464 (Disables the keyboard. If your PC has a BIOS which will start without a) 1464 SB
X537 658 1317 (keyboard connected, use this option to tell NeTraMet there is no) 1317 SB
X537 712 1474 (keyboard. If you are running NeTraMet as a background process under) 1474 SB
X537 766 251 (SunOS you ) 251 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X788 766 100 (must) 100 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X888 766 455 ( disable the keyboard.) 455 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 846 41 (-s) 41 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 846 1451 (Disables the screen display. If NeTraMet's screen will never be looked) 1451 SB
X537 900 1355 (at, it makes sense not to spend processor cycles on maintaining a) 1355 SB
X537 954 157 (display.) 157 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 1034 140 (-f nnn) 140 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 1034 1502 (Sets the maximum number of flows to nnn. The default for this is 4000; it) 1502 SB
X537 1088 1432 (may be sensible to use a smaller number on the PC if you are using a) 1432 SB
X537 1142 281 (large rule set.) 281 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 1222 153 (-p nnn) 153 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X537 1222 1415 (Sets the size of NeTraMet's buffer for incoming packet headers. The) 1415 SB
X537 1276 742 (default size is 1024 packet headers.) 742 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 1363 84 (7.2.) 84 SB
X413 1363 443 (PC Screen Display) 443 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1446 1826 (The display has three main areas; the top left corner is the 'status' area, the bottom left is) 1826 SB
X271 1500 1842 (the 'history' area, and the right-hand half displays a strip chart showing network utilisation.) 1842 SB
X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB
X330 1576 21 (\267) 21 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X389 1579 1664 (The Status Area is updated every second to indicate the time, number of packets) 1664 SB
X389 1633 1694 (\(p=\), bytes \(b=\), and utilisation % \(u=\) for that second. It also shows the maximum) 1694 SB
X389 1687 1653 (packet backlog \(q=\), i.e. the maximum length of the queue of uncounted packets) 1653 SB
X389 1741 1718 (during the second. The meter has buffer space for 1024 packets, so this parameter) 1718 SB
X389 1795 1601 (gives a good indication of the meter's ability to handle the current packet load.) 1601 SB
X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB
X330 1871 21 (\267) 21 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X389 1874 1600 (The History Area displays messages about the meter's operations. These are) 1600 SB
X389 1928 1581 (written on the bottom line of the area, which is then scrolled up one line. The) 1581 SB
X389 1982 1653 (messages are time-stamped, so this area tells you what the meter, manager and) 1653 SB
X389 2036 718 (collector have been doing recently.) 718 SB
X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB
X330 2112 21 (\267) 21 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X389 2115 1633 (Every ten seconds a new line of the chart is displayed on the bottom of the strip) 1633 SB
X389 2169 1628 (chart showing the minimum, average and maximum utilisation per second. The) 1628 SB
X389 2223 1714 (minimum is marked with a <, maximum with a > and the average with a *. The scale) 1714 SB
X389 2277 1552 (of the utilisation chart is normally 0 to 30% in 1% steps, but the 'h' keyboard) 1552 SB
X389 2331 1709 (command can be used to halve it, i.e. change it to 0 to 60% in 2% steps. The chart) 1709 SB
X389 2385 1594 (is scrolled up the screen as each line is displayed, so that it always shows the) 1594 SB
X389 2439 888 (network utilisation for the last 250 seconds.) 888 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 2526 84 (7.3.) 84 SB
X413 2526 519 (Keyboard Commands) 519 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 2609 1794 (If the keyboard is enabled, i.e. the -k option did not appear on its startup command line,) 1794 SB
X271 2663 1150 (pressing a key will perform various functions, as follows:) 1150 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2743 28 (b) 28 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 2743 583 (Display 'bad packets' counts) 583 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2823 28 (h) 28 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 2823 884 (Set/reset half scale for utilisation strip chart) 884 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2903 41 (m) 41 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 2903 633 (Display meter's memory usage) 633 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 2983 26 (s) 26 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 2983 1580 (Display meter performance statistics. These are explained further in the next) 1580 SB
X478 3037 160 (section.) 160 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (21) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X330 257 15 (t) 15 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 257 1029 (Display time in 1/100s intervals from meter startup) 1029 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 337 26 (v) 26 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 337 532 (Display meter version info) 532 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 417 23 (z) 23 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 417 744 (Set meter statistics variables to zero) 744 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 497 28 (?) 28 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 497 979 (Display help \(summary of keyboard commands\)) 979 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X330 577 95 (ESC) 95 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X478 577 565 (Stop metering, exit to DOS.) 565 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 664 84 (7.4.) 84 SB
X413 664 500 (PC Statistics Display) 500 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 747 788 (The statistics displayed are as follows:) 788 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X421 826 812 (Av pkt/s 90, av pkt backlog 1) 812 SB
X421 875 896 (Max pkt/s 154, max pkt backlog 1) 896 SB
X421 924 812 (Idle time av 98.2, min 96.5 %) 812 SB
X421 973 756 (247 flows in use \(max 4000\)) 756 SB
X421 1022 896 (13 flows recovered \(GC: 5 4 16\)) 896 SB
X421 1071 840 (2.3 rules/pkt, 1.2 tallies/pkt) 840 SB
X421 1120 504 (1.8 compares/tally) 504 SB
X421 1169 700 (512 hash slots, 83 in use) 700 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1243 1770 (Meter statistics are computed using counters which are updated every second. These) 1770 SB
X271 1297 1675 (counters can be set to zero by the manager, or by pressing the 'z' key. NeMaC, if) 1675 SB
X271 1351 1807 (instructed by the rule set, can read the statistics variables then set their counters to zero) 1807 SB
X271 1405 1704 (each time it collects the flow data. The statistics are provided so as to evaluate the) 1704 SB
X271 1459 1777 (meter's performance on various hardware configurations, network traffic loads and rule) 1777 SB
X271 1513 1003 (tables. A brief explanation of each is given here.) 1003 SB
X271 1592 1786 ('Packets per Second' gives the average and maximum packet rates observed since the) 1786 SB
X271 1646 809 (statistics counters were last set to zero.) 809 SB
X271 1725 1793 ('Packet Backlog' refers to the maximum length of the queue of packets received but not) 1793 SB
X271 1779 1835 (yet processed by the meter. The maximum queue length is 1024; packets received when) 1835 SB
X271 1833 1357 (the buffer is full are counted as lost packets, then discarded. The ) 1357 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1628 1833 230 (LostPacket) 230 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1858 1833 215 ( count can) 215 SB
X271 1887 744 (be displayed by pressing the 'b' key.) 744 SB
X271 1966 1854 (NeTraMet's highest-priority process attempts to take packets from the input queue, up to a) 1854 SB
X271 2020 1660 (maximum of 400 at a time. This prevents its lower-priority processes such as the) 1660 SB
X271 2074 1807 (keyboard handler from being blocked indefinitely. If there are no packets in the queue a) 1807 SB
X271 2128 1694 (dummy packet is generated and passed to the packet matching routine, where it is) 1694 SB
X271 2182 1801 (counted. The 'Idle Time' measurements are the ratio of dummy packets to total packets) 1801 SB
X271 2236 1070 (\(i.e. dummy + real packets\) processed by the meter.) 1070 SB
X271 2315 1833 ('Flows In Use' means flows which currently hold valid flow data. Flows normally remain in) 1833 SB
X271 2369 1750 (use until they become inactive and their data has been collected. Once they become) 1750 SB
X271 2423 1785 (inactive their space can be recovered by the garbage collector. If the meter runs out of) 1785 SB
X271 2477 1524 (space for new flows the garbage collector will reclaim the oldest flows first.) 1524 SB
X271 2556 1858 ('Flows Recovered' shows the number of flows reclaimed by the garbage collector since the) 1858 SB
X271 2610 1725 (statistics counters were last set to zero. The garbage collector is controlled by three) 1725 SB
X271 2664 1777 (parameters, which are displayed after the GC: label. The first of these is the interval in) 1777 SB
X271 2718 1836 (seconds between invocations of the garbage collector. Its default value is 5, but it can be) 1836 SB
X271 2772 1847 (changed by the manager. The other parameters are the number of 'in use' and 'idle' flows) 1847 SB
X271 2826 1823 (tested by the garbage collector each time it is invoked. These cannot be changed by the) 1823 SB
X271 2880 103 (user.) 103 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (22) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC
X271 256 1756 ('Rules per packet' and 'Tallies per Packet' show how many rules were tested and how) 1756 SB
X271 310 1742 (many tally actions were performed for each packet. Tallies are implemented by hash) 1742 SB
X271 364 1856 (tables; the number of 'Compares per Tally' gives an indication of how long the hash chains) 1856 SB
X271 418 292 (have become.) 292 SB
X271 497 1773 ('Number of Hash Slots' is the maximum number of entries in the tally hash tables. The) 1773 SB
X271 551 1852 (number of hash slots in use indicates how effectively the hashing function is spreading the) 1852 SB
X271 605 849 (incoming packets across the hash tables.) 849 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 692 84 (7.5.) 84 SB
X413 692 953 (Configuring Waterloo TCP for NeTraMet) 953 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 775 1773 (Waterloo TCP stores its configuration data in a file called WATTCP.CFG. For use with) 1773 SB
X271 829 1633 (NeTraMet it is simplest to place this file in the same directory as NeTraMet itself) 1633 SB
X271 908 1832 (A sample WATTCP.CFG file is included in the NeTraMet distribution. This will need to be) 1832 SB
X271 962 1786 (edited to specify the IP Address, Subnet Mask, Default Gateway and Domain Name for) 1786 SB
X271 1016 1848 (NeTraMet at the location where you intend to run it. The file is in plain ASCII text, and it is) 1848 SB
X271 1070 834 (obvious which lines need to be modified.) 834 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 1157 84 (7.6.) 84 SB
X413 1157 673 (Sample AUTOEXEC.BAT file) 673 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X389 1240 812 (wd8003e 0x60 5 0x300 0xD800) 812 SB
X389 1289 1092 (NeTraMet -r NOC remote -w Net*Manager) 1092 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1363 1730 (The first line above starts the packet driver for a Western Digital ethernet card, using) 1730 SB
X271 1417 1728 (hardware interrupt \(IRQ\) 5, I/O address 0x300, shared memory address 0xd800 and) 1728 SB
X271 1471 1774 (packet interrupt 0x60. NeTraMet searches the interrupt vector when it starts up, which) 1774 SB
X271 1525 1836 (allows you to use any valid packet interrupt address. For Version 2.0, NeTraMet can only) 1836 SB
X271 1579 604 (handle a single packet driver.) 604 SB
X271 1658 1580 (The second line starts NeTraMet, specifying that it is to have two read SNMP) 1580 SB
X271 1712 1740 (communities, 'NOC' and 'remote', and that its write community is 'Net*Manager'. The) 1740 SB
X271 1766 1818 (screen and keyboard are enabled by default, and the meter will use a maximum of 4,000) 1818 SB
X271 1820 118 (flows.) 118 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 1907 84 (7.7.) 84 SB
X413 1907 1384 (Differences between PC and SunOS versions of NeTraMet) 1384 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1990 1846 (The PC version of the meter runs on a system with a dedicated screen and keyboard, and) 1846 SB
X271 2044 1855 (hence will respond to keyboard commands, and will provide a continuously-updated status) 1855 SB
X271 2098 157 (display.) 157 SB
X271 2177 1835 (The SunOS version is intended to run as a background process on a Unix system. When) 1835 SB
X271 2231 1843 (starting NeTraMet as a background process, don't forget to use the '-k' option to prevent it) 1843 SB
X271 2285 389 (trying to read from ) 389 SB
X32 0 0 50 50 0 0 0 39 /Courier /font0 ANSIFont font
X660 2289 150 (stdin) 150 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X810 2292 28 (.) 28 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 2367 1723 (In the same way the SunOS version doesn't provide a status display. If its screen is) 1723 SB
X271 2421 1775 (enabled it will display history messages as events occur, but that is the full extent of its) 1775 SB
X271 2475 295 (screen output.) 295 SB
X271 2554 1682 (Some of the PC statistics variables have been specifically designed to monitor the) 1682 SB
X271 2608 1845 (hardware performance of the PC, so they are not relevant to SunOS. Packet backlog and) 1845 SB
X271 2662 1255 (processor utilisation stastics are not implemented for SunOS.) 1255 SB
X271 2741 1678 (Apart from the above comments about screen and keyboard, the two versions are) 1678 SB
X271 2795 1805 (identical. From the performance point of view, there is one further feature of the SunOS) 1805 SB
X271 2849 1774 (version; it is not limited by the PC's arcane memory models, so that it can handle more) 1774 SB
X271 2903 1724 (flows than the PC \(which has a limit of about 4500\). The SunOS limit is the fact that) 1724 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 2957 273 (FlowIndexes ) 273 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X544 2957 1120 (are 16-bit values, giving an upper limit of 65,534 flows.) 1120 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (23) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X271 264 32 (8) 34 SB
X305 264 16 (.) 18 SB
X360 264 42 (N) 44 SB
X404 264 32 (e) 34 SB
X438 264 35 (T) 37 SB
X475 264 23 (r) 25 SB
X500 264 32 (a) 34 SB
X534 264 48 (M) 50 SB
X584 264 32 (e) 34 SB
X618 264 19 (t) 21 SB
X639 264 16 ( ) 18 SB
X657 264 42 (D) 44 SB
X701 264 16 (i) 18 SB
X719 264 32 (s) 34 SB
X753 264 19 (t) 21 SB
X774 264 23 (r) 25 SB
X799 264 16 (i) 18 SB
X817 264 35 (b) 37 SB
X854 264 35 (u) 37 SB
X891 264 19 (t) 21 SB
X912 264 16 (i) 18 SB
X930 264 35 (o) 37 SB
X967 264 35 (n) 37 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 364 84 (8.1.) 84 SB
X413 364 512 (CopyRight Statement) 512 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 447 1796 (Netramet is free software, distributed under the terms of the GNU Emacs general public) 1796 SB
X271 501 1623 (license. A copy of this is provided with the NeTraMet software distribution files.) 1623 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 588 84 (8.2.) 84 SB
X413 588 412 (DIstribution Files) 412 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 671 1358 (There are two NeTraMet distribution files, containing the following:) 1358 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 750 313 (NeTraMet.tar.Z) 313 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X389 804 1690 (NeTraMet documentation, including example rule files and the Meter Services MIB) 1690 SB
X389 858 1082 (Source code for CMU SNMP, NeTraMet and NeMaC) 1082 SB
X389 912 981 (Make files for NeTraMet and NeMaC on SunOS) 981 SB
X389 966 586 (Make files for NeMaC on IrIx) 586 SB
X389 1020 545 (NeTraMet.exe file for DOS) 545 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 1099 277 (NeTraMet.zip) 277 SB
X389 1153 31 (S) 31 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X420 1153 1185 (ource code for Waterloo TCP, CMU SNMP and NeTraMet) 1185 SB
X389 1207 536 (Turbo Make files for these) 536 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1344 32 (9) 34 SB
X305 1344 16 (.) 18 SB
X360 1344 16 (I) 18 SB
X378 1344 35 (n) 37 SB
X415 1344 32 (s) 34 SB
X449 1344 19 (t) 21 SB
X470 1344 32 (a) 34 SB
X504 1344 16 (l) 18 SB
X522 1344 16 (l) 18 SB
X540 1344 32 (a) 34 SB
X574 1344 19 (t) 21 SB
X595 1344 16 (i) 18 SB
X613 1344 35 (o) 37 SB
X650 1344 35 (n) 37 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X330 1436 1797 (Create a directory for NeTraMet and place the NeTraMet.tar.Z file there. Uncompress it) 1797 SB
X330 1490 1773 (and unpack it; this will create directories and place NeTraMet's files in them as follows:) 1773 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1569 420 (./documentation) 420 SB
X507 1623 252 (/NeTraMet) 252 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1619 471 (NeTraMet documentation) 471 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X507 1677 252 (/examples) 252 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1673 155 (rule files) 155 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X507 1731 140 (/snmp) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1727 513 (CMU SNMP documentation) 513 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1785 140 (./mib) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1781 293 (Accounting MIB) 293 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1834 140 (./src) 140 SB
X507 1888 224 (/snmplib) 224 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1884 490 (CMU SNMP library source) 490 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X507 1942 140 (/apps) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1938 596 (CMU SNMP applications source) 596 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X507 1996 168 (/meter) 168 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1992 323 (NeTraMet source) 323 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X507 2050 224 (/manager) 224 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 2046 278 (NeMaC source) 278 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 2104 168 (./sun/) 168 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 2100 396 (Make files for SunOS) 396 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 2158 140 (./sg/) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 2154 317 (Make files for Irix) 317 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X1179 2158 252 (NeTraMet.) 252 SB
X419 2212 140 (./pc/) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 2208 706 (EXE and WATTCP.CFG files for DOS) 706 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 2286 465 (On a SunOS machine:) 465 SB
X330 2365 49 (cd) 49 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X379 2365 842 ( to the sun/snmplib directory and run the ) 842 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1221 2365 113 (make) 113 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1334 2365 763 ( file; this will create the SNMP library.) 763 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X330 2444 49 (cd) 49 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X379 2444 784 ( to the sun/apps directory and run the ) 784 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1163 2444 113 (make) 113 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1276 2444 725 ( file; this will create a minimal set of) 725 SB
X330 2498 602 (SNMP application programs..) 602 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X330 2577 49 (cd) 49 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X379 2577 801 ( to the sun/meter directory and run the ) 801 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1180 2577 113 (make) 113 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1293 2577 619 ( file; this will create NeTraMet.) 619 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X330 2656 49 (cd) 49 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X379 2656 866 ( to the sun/manager directory and run the ) 866 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1245 2656 113 (make) 113 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1358 2656 570 ( file; this will create NeMaC.) 570 SB
X330 2735 1768 (Copy NeTraMet and NaMaC to the location where they will be used. NeTraMet opens) 1768 SB
X330 2789 1748 (a UDP port for SNMP; make sure it has sufficient privilege to do this. NeMaC doesn't) 1748 SB
X330 2843 1777 (need special privilege, but it needs access to the mib.txt file \(in the /mib directory\). Set) 1777 SB
X330 2897 720 (a shell variable to specify this, e.g. ) 720 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X1050 2904 1064 (set MIBTXT = /usr/NeTraMet/mib/mib.txt) 1064 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (24) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC
X330 256 1761 (Decide on write community names for each meter you intend to run. Start the meters.) 1761 SB
X330 335 1798 (Create rule files for each meter. If there are many of these it will be sensible to create a) 1798 SB
X330 389 1282 (configuration file with an entry for each of them. Start NeMaC.) 1282 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 468 402 (On an Irix machine:) 402 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X330 547 1294 (Proceed as above. The only differences are that the Irix make ) 1294 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1624 547 82 (files) 82 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1706 547 282 ( are in the /sg) 282 SB
X330 601 1718 (directory instead of the /sun directory, and that NeTraMet is not implemented yet for) 1718 SB
X330 655 74 (Irix.) 74 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 734 191 (On a PC:) 191 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X330 813 1737 (If you only want to use NeTraMet, copy NeTraMet.exe and wattcp.cfg from your Unix) 1737 SB
X330 867 1766 (machine to the PC. Edit WATTCP.CFG to specify your meter's IP configuration. Start) 1766 SB
X330 921 218 (NeTraMet.) 218 SB
X330 1000 1746 (If you wish to compile and link NeTraMet yourself, copy NeTraMet.zip to your PC and) 1746 SB
X330 1054 1274 (unzip to create directories and place files into them as follows:) 1274 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1138 140 (/elib) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1134 562 (Waterloo TCP intrinsics library) 562 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1192 112 (/src) 112 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1188 388 (Waterloo TCP library) 388 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1246 140 (/apps) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1242 661 (Waterloo TCP application programs) 661 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1300 140 (/snmp) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1296 490 (CMU SNMP library source) 490 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1354 140 (/acct) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1350 323 (NeTraMet source) 323 SB
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X419 1408 112 (/lib) 112 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1404 323 (NeTraMet source) 323 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X330 1482 1786 (To create NeTraMet, run Turbo Make in each of the elib, src, snmp and acct directories) 1786 SB
X330 1536 1207 (in turn. This will create NeTraMet.exe in the acct directory.) 1207 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1673 32 (1) 34 SB
X305 1673 32 (0) 34 SB
X339 1673 16 (.) 18 SB
X421 1673 42 (N) 44 SB
X465 1673 32 (e) 34 SB
X499 1673 35 (T) 37 SB
X536 1673 23 (r) 25 SB
X561 1673 32 (a) 34 SB
X595 1673 48 (M) 50 SB
X645 1673 32 (e) 34 SB
X679 1673 19 (t) 21 SB
X700 1673 14 (') 16 SB
X716 1673 32 (s) 34 SB
X750 1673 16 ( ) 18 SB
X768 1673 35 (F) 37 SB
X805 1673 35 (u) 37 SB
X842 1673 19 (t) 21 SB
X863 1673 35 (u) 37 SB
X900 1673 23 (r) 25 SB
X925 1673 32 (e) 34 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1765 1794 (This is the initial version of NeTraMet; it will doubtless improve and grow. Please report) 1794 SB
X271 1819 1665 (any bugs or problems you encounter to me directly, n.bro...@auckland.ac.nz.) 1665 SB
X271 1898 1695 (Discussion about the Internet Accounting Architecture will continue on the Working) 1695 SB
X271 1952 1794 (Group's mailing list, accoun...@wugate.wustl.edu. If you are interested in network) 1794 SB
X271 2006 1674 (traffic metering please join this list by sending a request to accounting-wg-request) 1674 SB
X271 2060 1177 (@wugate.wustl.edu. Topics needing further work include) 1177 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2140 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2139 1588 (Improvements or modifications to the Meter Services MIB in the light of users') 1588 SB
X345 2193 240 (experience.) 240 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2273 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2272 1718 (Development of a language for describing metering requirements, and a compiler to) 1718 SB
X345 2326 1136 (test these for consistency and translate them into rules.) 1136 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2406 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2405 1394 (Development of standards for flow data files and their management.) 1394 SB
X271 2484 1855 (I would also appreciate user feedback and reports of your experiences with it, in particular:) 1855 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2564 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2563 1775 (Performance of various configurations of PC and SunOS meters on different networks.) 1775 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2643 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2642 1174 (Ports of NeTraMet or NeMaC to other operating systems.) 1174 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2722 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2721 1742 (Developments of programs for processing flow data files, e.g. to produce an input file) 1742 SB
X345 2775 485 (for a statistics package.) 485 SB
X32 0 0 42 42 0 0 0 42 /Symbol font
Xgs 290 3426 0 0 CB
X271 2855 19 (\267) 19 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X345 2854 1621 (Rule files. How hard or easy did you find it to create rule files for your metering) 1621 SB
X345 2908 1700 (requirements? Were there things you wanted to do but couldn't? Did you discover) 1700 SB
X345 2962 1304 (any particularly elegant sets of rules for metering your network?) 1304 SB
X271 3041 1807 (Please post 'experience' reports to the Internet Accounting Mailing List \(address above\).) 1807 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (25) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X271 264 32 (1) 34 SB
X305 264 32 (1) 34 SB
X339 264 16 (.) 18 SB
X421 264 42 (A) 44 SB
X465 264 32 (c) 34 SB
X499 264 32 (k) 34 SB
X533 264 35 (n) 37 SB
X570 264 35 (o) 37 SB
X607 264 45 (w) 47 SB
X654 264 16 (l) 18 SB
X672 264 32 (e) 34 SB
X706 264 35 (d) 37 SB
X743 264 35 (g) 37 SB
X780 264 52 (m) 54 SB
X834 264 32 (e) 34 SB
X868 264 35 (n) 37 SB
X905 264 19 (t) 21 SB
X926 264 32 (s) 34 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 356 1729 (Many people have contributed to the development of NeTraMet. I wish to record my) 1729 SB
X271 410 1696 (thanks particularly to those who participated in the early discussions of the Internet) 1696 SB
X271 464 1691 (Accounting Working Group, which developed the Internet Accounting Architecture.) 1691 SB
X271 518 217 (Thanks to:) 217 SB
X330 597 717 (Cyndi Mills and Greg Ruth \(BBN\) ) 717 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1047 597 455 (Co-chairs to March 93) 455 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X330 651 1388 (Kathy Robertson \(Concord Communications\), George Abe \(infoNet\)) 1388 SB
X330 705 838 (Marshall Rose \(Dover Beach Consulting\)) 838 SB
X271 784 1851 (NeTraMet is the first implementation of the Working Group's draft Meter Services MIB. My) 1851 SB
X271 838 1713 (colleagues here at Auckland have contributed many hours of discussion throughout) 1713 SB
X271 892 922 (NeTraMet's development. Special thanks to:) 922 SB
X330 971 857 (John White, Russell Fulton, Murray Johns) 857 SB
X330 1025 234 (Wilson Yan) 234 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1162 32 (1) 34 SB
X305 1162 32 (1) 34 SB
X339 1162 16 (.) 18 SB
X421 1162 42 (R) 44 SB
X465 1162 32 (e) 34 SB
X499 1162 19 (f) 21 SB
X520 1162 32 (e) 34 SB
X554 1162 23 (r) 25 SB
X579 1162 32 (e) 34 SB
X613 1162 35 (n) 37 SB
X650 1162 32 (c) 34 SB
X684 1162 32 (e) 34 SB
X718 1162 32 (s) 34 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X271 1254 1171 ("RFC 1060: Assigned Numbers," J. Reynolds, J. Postel,) 1171 SB
X389 1308 245 (March 1990) 245 SB
X271 1387 1537 ("RFC 1272: Internet Accounting: Background," C. Mills, D. Hirsh, G. Ruth,) 1537 SB
X389 1441 330 (November 1991) 330 SB
X271 1520 1263 ("Internetworking with TCP/IP Vol 1 \(2nd Edition\), " Comer, D,) 1263 SB
X389 1574 392 (Prentice Hall, 1991) 392 SB
X271 1653 1426 ("Inside AppleTalk \(2nd Edition\)," Sidhu, Andrews and Opppenheimer,) 1426 SB
X389 1707 462 (Addison Wesley, 1990) 462 SB
X271 1786 1375 ("Netware Communications Processes," Netware Application Notes,) 1375 SB
X389 1840 344 (September 1990) 344 SB
X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (26) 52 SB
X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
X%%Trailer
XSVDoc restore
Xend
X% TrueType font name key:
X% MSTT31c157 = 24b7DCourier NewF0000002e000001900000
X% MSTT31c163 = 24b7DCourier NewF00000026000001900000
X% MSTT31c16f = 24b7DCourier NewF00000032000001900000
X% MSTT31c17b = 24b7DCourier NewF00000032000002bc0000
X% MSTT31c187 = 24b7DCourier NewF0000001a000001900000
X% MSTT31c193 = 24b7DCourier NewF0000002e000002bc0000
X% MSTT31c19f = 24b7DCourier NewF0000002e000001900001
X%%DocumentSuppliedResources: procset Win35Dict 3 1
X
X%%DocumentNeededResources: font Courier
X%%+ font Courier-Bold
X%%+ font Courier-Oblique
X%%+ font Helvetica
X%%+ font Helvetica-Bold
X%%+ font Helvetica-Oblique
X%%+ font Symbol
X
X%%EOF
END_OF_FILE
if test 49262 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.D'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\" unpacked with wrong size!
else
PARTS=""
for I in A B C D ; do
if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then

PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(191941 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 191941 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi
# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.D'
fi
if test -f 'netramet/doc/snmp/exclude' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/exclude'\"
else
echo shar: Extracting \"'netramet/doc/snmp/exclude'\" \(234 characters\)
sed "s/^X//" >'netramet/doc/snmp/exclude' <<'END_OF_FILE'
Xapps/RCS
Xapps/snmpget
Xapps/snmpgetnext
Xapps/snmpnetstat
Xapps/snmpnetstat.c
Xapps/snmpns.c
Xapps/snmpstatus
Xapps/snmptest
Xapps/snmpwalk
Xman/RCS
Xsnmplib/OLDRCS
Xsnmplib/RCS
Xsnmplib/snmp_if.c
Xsnmplib/snmp_if.h
Xkip
Xexclude
Xapps/Makefile.new
END_OF_FILE
if test 234 -ne `wc -c <'netramet/doc/snmp/exclude'`; then
echo shar: \"'netramet/doc/snmp/exclude'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/exclude'
fi
if test -f 'netramet/src/apps/snmpnetstat/route.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/route.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpnetstat/route.c'\" \(11885 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/route.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * Copyright (c) 1983,1988 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X

X#include <stdio.h>
X#include <strings.h>
X#include <ctype.h>
X
X#include <sys/param.h>
X#include <sys/socket.h>
X
X#include <netinet/in.h>
X#define LOOPBACKNET 127
X
X#include <netdb.h>
X
X#include "ausnmp.h"
X#include "main.h"


X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"

X#include "snmpapi.h"
X#include "snmpclnt.h"
X#include "mib.h"
X
Xextern int nflag;
Xextern char *routename(), *netname(), *plural();


X/* extern char *malloc(); /* in ausnmp.h */

Xextern struct snmp_session *Session;
Xextern struct variable_list *getvarbyname();
Xextern int print_errors;
X
X
Xstruct route_entry {
X oid instance[4];
X struct in_addr destination;
X int set_destination;
X struct in_addr gateway;
X int set_gateway;
X int interface;
X int set_interface;
X int type;
X int set_type;
X int proto;
X int set_proto;
X char ifname[64];
X int set_name;
X};
X
X
X
X#define RTDEST 1
X#define RTIFINDEX 2
X#define RTNEXTHOP 7
X#define RTTYPE 8
X#define RTPROTO 9
Xstatic oid oid_rttable[] = {1, 3, 6, 1, 2, 1, 4, 21, 1};
Xstatic oid oid_rtdest[] = {1, 3, 6, 1, 2, 1, 4, 21, 1, 1};
Xstatic oid oid_rtifindex[] = {1, 3, 6, 1, 2, 1, 4, 21, 1, 2};
Xstatic oid oid_rtnexthop[] = {1, 3, 6, 1, 2, 1, 4, 21, 1, 7};
Xstatic oid oid_rttype[] = {1, 3, 6, 1, 2, 1, 4, 21, 1, 8};
Xstatic oid oid_rtproto[] = {1, 3, 6, 1, 2, 1, 4, 21, 1, 9};
Xstatic oid oid_ifdescr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 2};
Xstatic oid oid_ipnoroutes[] = {1, 3, 6, 1, 2, 1, 4, 12, 0};
X
X
X/*
X * Print routing tables.
X */
Xroutepr()
X{
X struct route_entry route, *rp = &route;
X struct snmp_pdu *request, *response;
X struct variable_list *vp;
X char name[16], *flags;
X oid *instance, type;
X int toloopback, status;
X char ch;
X
X printf("Routing tables\n");
X printf("%-16.16s %-18.18s %-6.6s %s\n",
X "Destination", "Gateway",
X "Flags", "Interface");
X
X
X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X
X snmp_add_null_var(request, oid_rtdest, sizeof(oid_rtdest)/sizeof(oid));
X snmp_add_null_var(request, oid_rtifindex, sizeof(oid_rtifindex)/sizeof(oid));
X snmp_add_null_var(request, oid_rtnexthop, sizeof(oid_rtnexthop)/sizeof(oid));
X snmp_add_null_var(request, oid_rttype, sizeof(oid_rttype)/sizeof(oid));
X snmp_add_null_var(request, oid_rtproto, sizeof(oid_rtproto)/sizeof(oid));
X
X while(request){
X status = snmp_synch_response(Session, request, &response);
X if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR){
X fprintf(stderr, "SNMP request failed\n");
X break;
X }
X instance = NULL;
X request = NULL;
X rp->set_destination = 0;
X rp->set_interface = 0;
X rp->set_gateway = 0;
X rp->set_type = 0;
X rp->set_proto = 0;
X for(vp = response->variables; vp; vp = vp->next_variable){
X if (vp->name_length != 14 ||
X bcmp((char *)vp->name, (char *)oid_rttable, sizeof(oid_rttable))){
X continue; /* if it isn't in this subtree, just continue */
X }
X
X if (instance != NULL){
X oid *ip, *op;
X int count;
X
X ip = instance;
X op = vp->name + 10;
X for(count = 0; count < 4; count++){
X if (*ip++ != *op++)
X break;
X }
X if (count < 4)
X continue; /* not the right instance, ignore */
X } else {
X instance = vp->name + 10;
X }
X /*
X * At this point, this variable is known to be in the routing table
X * subtree, and is of the right instance for this transaction.
X */
X
X if (request == NULL)
X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X snmp_add_null_var(request, vp->name, vp->name_length);
X
X type = vp->name[9];
X switch ((char)type){
X case RTDEST:
X bcopy((char *)vp->val.string, (char *)&rp->destination, sizeof(u_long));
X rp->set_destination = 1;
X break;
X case RTIFINDEX:
X rp->interface = *vp->val.integer;
X rp->set_interface = 1;
X break;
X case RTNEXTHOP:
X bcopy((char *)vp->val.string, (char *)&rp->gateway, sizeof(u_long));
X rp->set_gateway = 1;
X break;
X case RTTYPE:
X rp->type = *vp->val.integer;
X rp->set_type = 1;
X break;
X case RTPROTO:
X rp->proto = *vp->val.integer;
X rp->set_proto = 1;
X break;
X }
X }
X if (!(rp->set_destination && rp->set_gateway
X && rp->set_type && rp->set_interface)){
X if (request)
X snmp_free_pdu(request);
X request = 0;
X continue;
X }
X toloopback = *(char *)&rp->gateway == LOOPBACKNET;
X printf("%-16.16s ",
X (rp->destination.s_addr == 0) ? "default" :
X (toloopback) ?
X routename(rp->destination) : netname(rp->destination, 0L));
X printf("%-18.18s ", routename(rp->gateway));
X flags = name;
X *flags++ = 'U'; /* route is in use */
X /* this !toloopback shouldnt be necessary */
X if (!toloopback && rp->type == MIB_IPROUTETYPE_REMOTE)
X *flags++ = 'G';
X if (toloopback)
X *flags++ = 'H';
X if (rp->proto == MIB_IPROUTEPROTO_ICMP)
X *flags++ = 'D'; /* redirect */
X *flags = '\0';
X printf("%-6.6s ", name);
X get_ifname(rp->ifname, rp->interface);
X ch = rp->ifname[strlen(rp->ifname) - 1];
X ch = '5'; /* force the if statement */
X if (isdigit(ch))
X printf(" %.32s\n", rp->ifname);
X else
X printf(" %.32s%d\n", rp->ifname, rp->interface);
X
X }
X}
X
Xstruct iflist {
X int index;
X char name[64];
X struct iflist *next;
X} *Iflist = NULL;
X
Xget_ifname(name, index)
X char *name;
X int index;
X{
X struct snmp_pdu *pdu, *response;
X struct variable_list *vp;
X struct iflist *ip;
X oid varname[32];
X int status;
X
X for(ip = Iflist; ip; ip = ip->next){
X if (ip->index == index)
X break;
X }
X if (ip){
X strcpy(name, ip->name);
X return;
X }
X ip = (struct iflist *)malloc(sizeof(struct iflist));
X ip->next = Iflist;
X Iflist = ip;
X ip->index = index;
X pdu = snmp_pdu_create(GET_REQ_MSG);
X bcopy((char *)oid_ifdescr, (char *)varname, sizeof(oid_ifdescr));
X varname[10] = (oid)index;
X snmp_add_null_var(pdu, varname, sizeof(oid_ifdescr)/sizeof(oid) + 1);
X status = snmp_synch_response(Session, pdu, &response);
X if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR){
X vp = response->variables;
X bcopy((char *)vp->val.string, ip->name, vp->val_len);
X ip->name[vp->val_len] = '\0';
X } else {
X sprintf(ip->name, "if%d", index);
X }
X strcpy(name, ip->name);
X}
X
Xchar *
Xroutename(in)
X struct in_addr in;
X{
X register char *cp;
X static char line[MAXHOSTNAMELEN + 1];
X struct hostent *hp;
X static char domain[MAXHOSTNAMELEN + 1];
X static int first = 1;
X char *index();
X
X if (first) {
X first = 0;
X if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
X (cp = index(domain, '.')))
X (void) strcpy(domain, cp + 1);
X else
X domain[0] = 0;
X }
X cp = 0;
X if (!nflag) {
X hp = gethostbyaddr((char *)&in, sizeof (struct in_addr),
X AF_INET);
X if (hp) {
X if ((cp = index(hp->h_name, '.')) &&
X !strcmp(cp + 1, domain))
X *cp = 0;
X cp = hp->h_name;
X }
X }
X if (cp)
X strncpy(line, cp, sizeof(line) - 1);
X else {
X#define C(x) ((x) & 0xff)
X in.s_addr = ntohl(in.s_addr);
X sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
X C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
X }
X return (line);
X}
X
X/*
X * Return the name of the network whose address is given.
X * The address is assumed to be that of a net or subnet, not a host.
X */
Xchar *
Xnetname(in, mask)
X struct in_addr in;
X u_long mask;
X{
X char *cp = 0;
X static char line[MAXHOSTNAMELEN + 1];
X struct netent *np = 0;
X u_long net;
X register i;
X int subnetshift;
X
X i = ntohl(in.s_addr);
X if (!nflag && i) {
X if (mask == 0) {
X if (IN_CLASSA(i)) {
X mask = IN_CLASSA_NET;
X subnetshift = 8;
X } else if (IN_CLASSB(i)) {
X mask = IN_CLASSB_NET;
X subnetshift = 8;
X } else {
X mask = IN_CLASSC_NET;
X subnetshift = 4;
X }
X /*
X * If there are more bits than the standard mask
X * would suggest, subnets must be in use.
X * Guess at the subnet mask, assuming reasonable
X * width subnet fields.
X */
X while (i &~ mask)
X mask = (long)mask >> subnetshift;
X }
X net = i & mask;
X while ((mask & 1) == 0)
X mask >>= 1, net >>= 1;
X np = getnetbyaddr(net, AF_INET);
X if (np)
X cp = np->n_name;
X }
X if (cp)
X strncpy(line, cp, sizeof(line) - 1);
X else if ((i & 0xffffff) == 0)
X sprintf(line, "%u", C(i >> 24));
X else if ((i & 0xffff) == 0)
X sprintf(line, "%u.%u", C(i >> 24) , C(i >> 16));
X else if ((i & 0xff) == 0)
X sprintf(line, "%u.%u.%u", C(i >> 24), C(i >> 16), C(i >> 8));
X else
X sprintf(line, "%u.%u.%u.%u", C(i >> 24),
X C(i >> 16), C(i >> 8), C(i));
X return (line);
X}
X
X/*
X * Print routing statistics
X */
Xrt_stats()
X{
X struct variable_list *var;
X
X printf("routing:\n");
X var = getvarbyname(Session, oid_ipnoroutes, sizeof(oid_ipnoroutes) / sizeof(oid));
X if (var){
X printf("\t%u destination%s found unreachable\n",
X *var->val.integer, plural((int)*var->val.integer));
X } else {
X printf("\tCouldn't get ipOutNoRoutes variable\n");
X }
X}
X
X/*
X * Request a variable with a GET REQUEST message on the given
X * session. The session must have been opened as a synchronous
X * session (synch_setup_session()). If the variable is found, a
X * pointer to a struct variable_list object will be returned.
X * Otherwise, NULL is returned. The caller must free the returned
X * variable_list object when done with it.
X */
Xstruct variable_list *
Xgetvarbyname(sp, name, len)
X struct snmp_session *sp;
X oid *name;
X int len;
X{
X struct snmp_pdu *request, *response;
X struct variable_list *var = NULL, *vp;
X int status;
X
X request = snmp_pdu_create(GET_REQ_MSG);
X
X snmp_add_null_var(request, name, len);
X
X status = snmp_synch_response(sp, request, &response);
X
X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){
X for(var = response->variables; var; var = var->next_variable){
X if (var->name_length == len && !bcmp(name, var->name, len * sizeof(oid)))
X break; /* found our match */
X }
X if (var != NULL){
X /*
X * Now unlink this var from pdu chain so it doesn't get freed.
X * The caller will free the var.
X */
X if (response->variables == var){
X response->variables = var->next_variable;
X } else {
X for(vp = response->variables; vp; vp = vp->next_variable){
X if (vp->next_variable == var){
X vp->next_variable = var->next_variable;


X break;
X }
X }
X }

X }
X }
X }
X if (response)
X snmp_free_pdu(response);
X return var;
X}
END_OF_FILE
if test 11885 -ne `wc -c <'netramet/src/apps/snmpnetstat/route.c'`; then
echo shar: \"'netramet/src/apps/snmpnetstat/route.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/route.c'
fi
echo shar: End of archive 8 \(of 25\).
cp /dev/null ark8isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:10:10 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 97
Archive-name: netramet/part09
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.B
# netramet/src/meter/meter_pc.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:07 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 9 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.B' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\" \(48982 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.B' <<'END_OF_FILE'
X413 2731 1021 (Column Blobs: Recovering Bulk Flow Data) 1021 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2814 1848 (One vital element of an accounting meter is that it must be possible to retrieve flow data in) 1848 SB
X271 2868 1839 (an efficient manner. SNMP can be inefficient for this purpose, since every value retrieved) 1839 SB
X271 2922 1823 (is accompanied by its object identifier. To retrieve a long value \(four bytes\) can require a) 1823 SB
X271 2976 885 (further 12 or more bytes of object identifier!) 885 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (4) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1822 (NeTraMet solves this problem by using SNMP opaque objects to pass many values back) 1822 SB
X271 310 1286 (to NeMac as a single unit. The MIB defines an object called a ) 1286 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1557 310 265 (Column Blob) 265 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1822 310 272 ( to do this. A) 272 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 364 265 (Column Blob) 265 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X536 364 1433 ( is a three-dimensional SNMP object, the dimensions being a 'column') 1433 SB
X271 418 209 (number,a ) 209 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X480 418 190 (LastTime) 190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X670 418 267 ( value and a ) 267 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X937 418 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1148 418 983 (. NeMaC views the flow table as a matrix with a) 983 SB
X271 472 1792 (column for each flow attribute. It can retrieve values of a particular attribute for all flows) 1792 SB
X271 526 1834 (active since a specified time, starting at a given row of the flow table and recalling column) 1834 SB
X271 580 713 (blobs in sequence down a column.) 713 SB
X271 659 1684 (NeMac takes this idea a little further. The user specifies which attributes are to be) 1684 SB
X271 713 1756 (collected using a Format statement in the rule file. NeMaC uses the Format to decide) 1756 SB
X271 767 1816 (which columns are required, then retrieves column blobs for each attribute starting at the) 1816 SB
X271 821 1692 (first row of the flow table. The resulting collected flows are written to disk, then the) 1692 SB
X271 875 1583 (process is repeated starting at the row after the last collected row, and so on.) 1583 SB
X271 954 1809 (The maximum column blob size is chosen to fit into a 500-byte SNMP packet, which can) 1809 SB
X271 1008 1812 (carry from 50 to 60 attribute values \(together with their flow numbers\). As an example, if) 1812 SB
X271 1062 1803 (we wish to collect 10 attributes for 1000 flows, this will require only 10 x 20 = 200 SNMP) 1803 SB
X271 1116 1733 (packets To minimise network loading, NeMaC pauses for 90 milliseconds after each) 1733 SB
X271 1170 314 (SNMP request.) 314 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

Xgs 323 3426 0 0 CB
X271 1307 48 (3.) 48 SB
Xgr
X360 1307 35 (F) 37 SB
X397 1307 16 (l) 18 SB
X415 1307 35 (o) 37 SB
X452 1307 45 (w) 47 SB
X499 1307 16 ( ) 18 SB
X517 1307 42 (A) 44 SB
X561 1307 19 (t) 21 SB
X582 1307 19 (t) 21 SB
X603 1307 23 (r) 25 SB
X628 1307 16 (i) 18 SB
X646 1307 35 (b) 37 SB
X683 1307 35 (u) 37 SB
X720 1307 19 (t) 21 SB
X741 1307 32 (e) 34 SB
X775 1307 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

Xgs 355 3426 0 0 CB
X271 1407 84 (3.1.) 84 SB
Xgr
X413 1407 295 (Introduction) 295 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1490 1824 (A flow's attributes may be conveniently arranged into five groups: adjacent address, peer) 1824 SB
X271 1544 1680 (address, detail address, subscriber and general. Since NeTraMet can't determine) 1680 SB
X271 1598 1793 (subscriber information merely by watching the packets passing by, subscriber attributes) 1793 SB
X271 1652 1690 (are not currently implemented. A meter running in a network access server would,) 1690 SB
X271 1706 761 (however, be able to implement them.) 761 SB
X271 1785 1814 (Adjacent address attributes are described in the Ethernet Attributes section; they are the) 1814 SB
X271 1839 790 (same for all of the peer address types.) 790 SB
X271 1918 1842 (Peer and detail addresses, however, are different for each of the peer protocols. They are) 1842 SB
X271 1972 1759 (therefore explained together in the sections on IP, DECnet, Novell IPX and EtherTalk.) 1759 SB
X271 2026 1372 (The attributes which give a flow's peer and detail address type are ) 1372 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1643 2026 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1991 2026 91 ( and) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2080 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2080 39 (. ) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X678 2080 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1026 2080 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1130 2080 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1426 2080 456 ( are synonyms, as are) 456 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2134 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2134 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2134 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1059 2134 1033 (. If the meter were implemented on a gateway the) 1033 SB
X271 2188 1721 (source- and dest- types could be different, but this is impossible on a single network) 1721 SB
X271 2242 191 (segment.) 191 SB
X271 2321 93 (The ) 93 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X364 2321 458 (SourcePeerTypeMask) 458 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X822 2321 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X926 2321 478 (SourceDetailTypeMask) 478 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1404 2321 82 ( \(or ) 82 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1486 2321 406 (DestPeerTypeMask) 406 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1892 2321 91 ( and) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2375 426 (DestDetailTypeMask) 426 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X697 2375 1430 (\) attributes can be used to specify that the type fields are to be tallied.) 1430 SB
X271 2429 1487 (In this situation a mask value of 255 \(all bits on\) is the only sensible one.) 1487 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2516 84 (3.2.) 84 SB
X413 2516 448 (Ethernet attributes) 448 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2599 1685 (NeTraMet's initial implementation supports a single ethernet interface. It therefore) 1685 SB
X271 2653 1672 (supports only one adjacent address type, i.e. ethernet, which is the same for both) 1672 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2707 431 (SourceAdjacentType) 431 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X702 2707 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X806 2707 379 (DestAdjacentType) 379 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1185 2707 876 (. Since there is only one adjacent address) 876 SB
X271 2761 192 (type, the ) 192 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X463 2761 394 (AdjacentTypeMask) 394 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X857 2761 653 ( attributes are not implemented.) 653 SB
X271 2840 93 (The ) 93 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X364 2840 498 (SourceAdjacentAddress) 498 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X862 2840 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X966 2840 446 (DestAdjacentAddress) 446 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1412 2840 546 ( attributes are the ethernet) 546 SB
X271 2894 1750 (addresses of the source and destination hosts. These are written as six hexadecimal) 1750 SB
X271 2948 1828 (bytes separated by hyphens, e.g. 00-00-C0-00-13-A5. They may be entered in this form,) 1828 SB
X271 3002 864 (or as six decimal bytes separated by dots.) 864 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (5) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 438 (SourceAdjacentMask) 438 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X709 256 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X813 256 386 (DestAdjacentMask) 386 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1199 256 887 ( may be used in actions to tally fields within) 887 SB
X271 310 1645 (adjacent addresses. They are written and entered in the same form as adjacent) 1645 SB
X271 364 227 (addresses.) 227 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 451 84 (3.2.) 84 SB
X413 451 291 (IP attributes) 291 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 534 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 534 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 534 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 534 118 ( = 2) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 613 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 613 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 613 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 667 1733 (IP addresses of the flow's two hosts, written as four decimal bytes separated by dots) 1733 SB
X389 721 1078 (and entered in the same way, e.g. 130.216.234.237.) 1078 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 800 355 (SourcePeerMask) 355 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X626 800 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X730 800 303 (DestPeerMask) 303 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 854 1293 (Address masks for tallies; in the same form as peer addresses.) 1293 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 933 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 933 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 933 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 987 1647 (Protocol field from the IP packet header. The values of these are given in RFC ,) 1647 SB
X389 1041 857 (Assigned Numbers. Common values are:) 857 SB
X500 1095 66 (1 =) 66 SB
X596 1095 115 (ICMP) 115 SB
X500 1149 66 (6 =) 66 SB
X596 1149 92 (TCP) 92 SB
X500 1203 66 (7 =) 66 SB
X596 1203 97 (UDP) 97 SB
X389 1257 978 (These names can be used for them in rule files.) 978 SB
X389 1337 117 (If the ) 117 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X506 1337 221 (DetailType) 221 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X727 1337 59 ( is ) 59 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X786 1337 92 (TCP) 92 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X878 1337 67 ( or ) 67 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X945 1337 97 (UDP) 97 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1042 1337 104 (, the ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1146 1337 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1581 1337 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1685 1337 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1391 1656 (contain the flow's source and destination port numbers. Many of their values are) 1656 SB
X389 1445 1254 (given in RFC 1060, Assigned Numbers. Common values are) 1254 SB
X474 1499 92 (20 =) 92 SB
X596 1499 225 (FTP-DATA) 225 SB
X1183 1499 92 (53 =) 92 SB
X1305 1499 184 (DOMAIN) 184 SB
X474 1553 92 (21 =) 92 SB
X596 1553 87 (FTP) 87 SB
X1157 1553 118 (119 =) 118 SB
X1305 1553 125 (NNTP) 125 SB
X474 1607 92 (23 =) 92 SB
X596 1607 177 (TELNET) 177 SB
X1157 1607 118 (123 =) 118 SB
X1305 1607 92 (NTP) 92 SB
X474 1661 92 (25 =) 92 SB
X596 1661 128 (SMTP) 128 SB
X1157 1661 118 (161 =) 118 SB
X1305 1661 133 (SNMP) 133 SB
X389 1715 1128 (These names can be also be used for them in rule files) 1128 SB
X389 1795 117 (If the ) 117 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X506 1795 221 (DetailType) 221 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X727 1795 59 ( is ) 59 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X786 1795 115 (ICMP) 115 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X901 1795 130 (, then ) 130 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1031 1795 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1466 1795 584 ( contains the ICMP type and) 584 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X389 1849 383 (DestDetailAddress) 383 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X772 1849 1321 ( contains the ICMP code. For a description of these see Comer,) 1321 SB
X389 1903 1072 ("Internetworking with TCP/IP." Common values are:) 1072 SB
X500 1957 66 (0 =) 66 SB
X596 1957 214 (echo reply) 214 SB
X500 2011 66 (8 =) 66 SB
X596 2011 269 (echo request) 269 SB
X500 2065 66 (3 =) 66 SB
X596 2065 494 (destination unreachable) 494 SB
X500 2119 66 (5 =) 66 SB
X596 2119 154 (redirect) 154 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2198 375 (SourceDetailMask) 375 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X646 2198 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X750 2198 323 (DestDetailMask) 323 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2252 98 (Like ) 98 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X487 2252 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X855 2252 1246 (, these are 16-bit fields, which are written as a single integer,) 1246 SB
X389 2306 1641 (and can be entered in this form or as two decimal bytes separated by a dot, e.g.) 1641 SB
X389 2360 379 (255.255 or 65535.) 379 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2447 84 (3.3.) 84 SB
X421 2447 425 (DECnet attributes) 425 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2530 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 2530 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 2530 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 2530 118 ( = 5) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2609 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 2609 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 2609 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2663 1670 (DECnet Phase IV addresses of the flow's two hosts, written as four decimal bytes) 1670 SB
X389 2717 1710 (separated by dots and entered in the same way, e.g.4.1.150.0. The first byte is the) 1710 SB
X389 2771 1673 (DECnet Area Number, the next two are the \(16-bit\) DECnet Host Number and the) 1673 SB
X389 2825 489 (last byte is always zero.) 489 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2904 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2904 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2904 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2958 1306 (DECnet Phase IV protocol type, which has the following values:) 1306 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (6) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X474 256 92 (14 =) 92 SB
X596 256 293 (data + discard) 293 SB
X1183 256 92 (11 =) 92 SB
X1305 256 232 (router hello) 232 SB
X500 310 66 (6 =) 66 SB
X596 310 91 (data) 91 SB
X1209 310 66 (9 =) 66 SB
X1305 310 289 (level 2 routing) 289 SB
X500 364 66 (7 =) 66 SB
X596 364 289 (level 1 routing) 289 SB
X1183 364 92 (13 =) 92 SB
X1305 364 293 (endnode hello) 293 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 443 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 443 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 497 504 (Always zero for DECnet.) 504 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 584 84 (3.4.) 84 SB
X413 584 489 (Novell IPX attributes) 489 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 667 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 667 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 667 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 667 118 ( = 6) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 746 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 746 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 746 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 800 1742 (IPX network numbers of the flow's two hosts, written as four decimal bytes separated) 1742 SB
X389 854 1685 (by dots and entered in the same way, e.g. 130.216.0.28. Novell network numbers) 1685 SB
X389 908 1674 (are assigned by the network administrator; at the University of Auckland we use a) 1674 SB
X389 962 1023 (Novell Server's IP address as its network number.) 1023 SB
X389 1041 1588 (A full IPX host address is the combination of its network number and ethernet) 1588 SB
X389 1095 1719 (address. Because the current implementation of NeTraMet limits peer addresses to) 1719 SB
X389 1149 1715 (a maximum of four bytes, it can in general only handle IPX network numbers. For a) 1715 SB
X389 1203 1709 (host on the same network segment as its server the adjacent address provides that) 1709 SB
X389 1257 1562 (host's ethernet address but this is not the case for IPX packets from another) 1562 SB
X389 1311 1715 (segment, which have the adjacent address of the router through which they arrived.) 1715 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1390 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 1390 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 1390 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1444 1316 (XNS protocol type. Possible values are given in RFC 1060, e.g:) 1316 SB
X500 1498 66 (5 =) 66 SB
X596 1498 378 (sequenced packet) 378 SB
X500 1552 66 (4 =) 66 SB
X596 1552 352 (packet exchange) 352 SB
X500 1606 66 (1 =) 66 SB
X596 1606 384 (routing information) 384 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1685 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 1685 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 1685 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1739 1178 (Source and destination IPX port numbers. These include) 1178 SB
X422 1793 144 (1105 =) 144 SB
X596 1793 608 (NCP \(Netware Core Protocol\)) 608 SB
X422 1847 144 (1106 =) 144 SB
X596 1847 715 (SAP \(Service Advertising Protocol\)) 715 SB
X422 1901 144 (1107 =) 144 SB
X596 1901 708 (RIP \(Routing Information Protocol\)) 708 SB
X271 1980 1843 (Further details of Netware communications protocols are given "Netware Communications) 1843 SB
X271 2034 245 (Processes.") 245 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2121 84 (3.5.) 84 SB
X413 2121 473 (EtherTalk attributes) 473 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2204 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 2204 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 2204 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 2204 118 ( = 7) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2283 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 2283 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 2283 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2337 1732 (AppleTalk addresses of the flow's two hosts, written as four decimal bytes separated) 1732 SB
X389 2391 1697 (by dots and entered in the same way, e.g. 0.129.251.0. The first two bytes are the) 1697 SB
X389 2445 1698 (host's AppleTalk \(16-bit\) network number, the third is its node number \(dynamically) 1698 SB
X389 2499 1169 (assigned when it starts up\) and the fourth is always zero.) 1169 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2578 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2578 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2578 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2632 1185 (AppleTalk DDP protocol type. Some common values are:) 1185 SB
X500 2686 66 (1 =) 66 SB
X596 2686 130 (RTMP) 130 SB
X1209 2686 66 (5 =) 66 SB
X1305 2686 130 (RTMP) 130 SB
X500 2740 66 (2 =) 66 SB
X596 2740 95 (NBP) 95 SB
X1209 2740 66 (6 =) 66 SB
X1305 2740 72 (ZIP) 72 SB
X500 2794 66 (3 =) 66 SB
X596 2794 90 (ATP) 90 SB
X1209 2794 66 (7 =) 66 SB
X1305 2794 126 (ADSP) 126 SB
X500 2848 66 (4 =) 66 SB
X596 2848 62 (EP) 62 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (7) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 256 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 256 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 310 1677 (Source and destination AppleTalk socket numbers. These are two-byte numbers;) 1677 SB
X389 364 1525 (the socket numbers are the low-order byte and the high-order byte is zero.) 1525 SB
X271 443 1542 (Details of the AppleTalk protocols are given in the book "Inside Macintosh.") 1542 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 530 84 (3.6.) 84 SB
X413 530 431 (General attributes) 431 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 613 1825 (General attributes are those which relate to a traffic flow itself, rather than to its end-point) 1825 SB
X271 667 1783 (addresses. They may be collected from the meter and may be specified in actions, but) 1783 SB
X271 721 1087 (may not be used in rules. General attributes include:) 1087 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 800 630 (SourceInterface, DestInterface) 630 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 854 1678 (Interfaces corresponding to the flow's source and destination adjacent addresses.) 1678 SB
X389 908 1250 (In the current implementation these always have the value 1.) 1250 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 987 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1041 1211 (\(1-origin\) index of the flow within NeTraMet's table of flows.) 1211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1120 262 (FlowRuleSet) 262 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1174 1583 (Number of the rule set the meter was using when the flow was first observed.) 1583 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1253 200 (FlowType) 200 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1307 1323 (Type of the flow. Values are: 1 = count, 2 = tally, 3 = aggregate.) 1323 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1386 455 (ToOctets, FromOctets) 455 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1440 1682 (Number of bytes observed in the 'to' \(source to destination\) and 'from' direction for) 1682 SB
X389 1494 180 (this flow.) 180 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1573 427 (ToPDUs, FromPDUs) 427 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1627 1731 (Number of packets observed in the 'to' \(source to destination\) and 'from' direction for) 1731 SB
X389 1681 180 (this flow.) 180 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1760 191 (FirstTime) 191 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1814 1706 (Time \(in 1/100 second ticks from the time the meter started executing\) at which this) 1706 SB
X389 1868 752 (flow was first observed by the meter.) 752 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1947 190 (LastTime) 190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2001 1461 (Time \(units as above\) at which a packet was last observed for this flow.) 1461 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X271 2138 32 (4) 34 SB
X305 2138 16 (.) 18 SB
X360 2138 35 (F) 37 SB
X397 2138 16 (l) 18 SB
X415 2138 35 (o) 37 SB
X452 2138 45 (w) 47 SB
X499 2138 16 ( ) 18 SB
X517 2138 42 (D) 44 SB
X561 2138 32 (a) 34 SB
X595 2138 19 (t) 21 SB
X616 2138 32 (a) 34 SB
X650 2138 16 ( ) 18 SB
X668 2138 35 (F) 37 SB
X705 2138 16 (i) 18 SB
X723 2138 16 (l) 18 SB
X741 2138 32 (e) 34 SB
X775 2138 32 (s) 34 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2230 1290 (NeMaC produces files of flow data information with names like ) 1290 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1561 2230 307 (ccu2.flows.007) 307 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1868 2230 260 (. This would) 260 SB
X271 2284 1573 (be the seventh file of flow data collected from NeTraMet running on the host ) 1573 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1844 2284 98 (ccu2) 98 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1942 2284 176 (. Before) 176 SB
X271 2338 1732 (opening a flow data file NeMaC inspects its current working directory and selects the) 1732 SB
X271 2392 1219 (lowest sequence number not already used for this purpose.) 1219 SB
X271 2471 1773 (There are two kinds of records in a flow data file: flow records and information records.) 1773 SB
X271 2525 1860 (Each flow record is simply a sequence of attribute values separated by separators \(if these) 1860 SB
X271 2579 1834 (were specified - see the Format Statement section below\) or spaces, and terminated by a) 1834 SB
X271 2633 170 (newline.) 170 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2720 84 (4.1.) 84 SB
X413 2720 492 (Information Records) 492 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2803 1815 (Information records all start with a cross-hatch. The file's first record begins with ##, and) 1815 SB
X271 2857 1792 (identifies the file as being a file of data from NeTraMet. It records NeMaC's parameters) 1792 SB
X271 2911 810 (and the time this collection was started.) 810 SB
X271 2990 1841 (The file's second record begins with #Format: and is a copy of the Format statement used) 1841 SB
X271 3044 1843 (by NeMaC to collect the data. Note that any separators specified in the Format statement) 1843 SB
X271 3098 1175 (appear in the data file directly, not as C-language strings.) 1175 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (8) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1860 (The rest of the file is a sequence of collected data sets. Each of these starts with a #Time:) 1860 SB
X271 310 1847 (record, giving the time of day the collection was started, the meter name, and the range of) 1847 SB
X271 364 945 (meter times this collection represents. These ) 945 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1216 364 92 (from) 92 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1308 364 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1412 364 39 (to) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1451 364 347 ( times are meter ) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1798 364 184 (UpTimes) 184 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1982 364 88 (, i.e.) 88 SB
X271 418 1639 (they are times in hundredths of seconds since the meter commenced operation.) 1639 SB
X271 497 1767 (If meter statistics were requested, they appear in a #Stats: record following the #Time:) 1767 SB
X271 551 1804 (one. The statistics are given as a list of variable names and corresponding values. The) 1804 SB
X271 605 407 (variable names are:) 407 SB
X363 667 115 (aps =) 115 SB
X507 667 504 (average packets/second) 504 SB
X1214 667 91 (frc =) 91 SB
X1334 667 324 (flows recovered) 324 SB
X360 721 118 (apb =) 118 SB
X507 721 491 (average packet backlog) 491 SB
X1206 721 99 (gci =) 99 SB
X1334 721 755 (garbage collection interval \(seconds\)) 755 SB
X351 775 127 (mps =) 127 SB
X507 775 535 (maximum packets/second) 535 SB
X1198 775 107 (rpp =) 107 SB
X1334 775 521 (rules matched per packet) 521 SB
X348 829 130 (mpb =) 130 SB
X507 829 522 (maximum packet backlog) 522 SB
X1200 829 105 (tpp =) 105 SB
X1334 829 348 (tallies per packet) 348 SB
X379 883 99 (lsp =) 99 SB
X507 883 467 (number of packets lost) 467 SB
X1203 883 102 (cpt =) 102 SB
X1334 883 378 (compares per tally) 378 SB
X379 937 99 (avi =) 99 SB
X507 937 523 (average processor idle %) 523 SB
X1216 937 89 (tts =) 89 SB
X1334 937 505 (Total tally slots allocated) 505 SB
X364 991 114 (mni =) 114 SB
X507 991 456 (minimum processor %) 456 SB
X1203 991 115 (tsu = ) 115 SB
X1334 991 342 (Tally slots in use) 342 SB
X389 1045 89 (fiu =) 89 SB
X507 1045 242 (flows in use) 242 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1132 84 (4.2.) 84 SB
X413 1132 531 (Sample Flow Data File) 531 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X301 1215 1798 (A sample flow data file appears below. Most of the flow records have been deleted, but) 1798 SB
X301 1269 735 (lines of dots show where they were.) 735 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X330 1348 252 (##NeTraMe) 252 SB
X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X582 1354 1449 (t v2.2: -c300 -r rules.lan test_meter 4000 flows starting at) 1449 SB
X330 1397 506 (12:31:27 Fri 1 Oct 93) 506 SB
X330 1437 1702 (#Format: flowruleset flowindex firsttime sourcepeertype sourcepeeraddress) 1702 SB
X330 1477 1219 (destpeeraddress topdus frompdus tooctets fromoctets) 1219 SB
X330 1517 1495 (#Time: 12:31:27 Fri 1 Oct 93 130.216.14.251 Flows from 1 to 3642) 1495 SB
X330 1557 1748 (#Stats: aps=478 apb=11 mps=636 mpb=48 lsp=0 avi=97.3 mni = 93.4 fiu=44 frc=0) 1748 SB
X330 1597 1035 (gci=5 rpp=1.9 tpp=0.0 cpt=1.0 tts=1024 tsu=38) 1035 SB
X330 1637 1081 (1 2 13 5 31.32.0.0 33.34.0.0 1138 0 121824 0) 1081 SB
X330 1677 1081 (1 3 13 2 11.12.0.0 13.14.0.0 4215 0 689711 0) 1081 SB
X330 1717 1081 (1 4 13 7 41.42.0.0 43.34.0.0 1432 0 411712 0) 1081 SB
X330 1757 1104 (1 5 13 6 21.22.0.0 23.24.0.0 8243 0 4338744 0) 1104 SB
X330 1797 1150 (3 6 3560 2 130.216.14.0 130.216.3.0 0 10 0 1053) 1150 SB
X330 1837 1265 (3 7 3560 2 130.216.14.0 130.216.76.0 59 65 4286 3796) 1265 SB
X330 1877 1035 (3 8 3560 7 0.0.255.0 1.144.200.0 0 4 0 222) 1035 SB
X330 1917 1242 (3 9 3560 2 130.216.14.0 130.216.14.0 118 1 32060 60) 1242 SB
X330 1957 1311 (3 10 3560 6 130.216.0.28 130.216.0.192 782 1 344620 66) 1311 SB
X330 1997 1035 (3 11 3560 7 0.0.255.0 0.128.113.0 0 1 0 73) 1035 SB
X330 2037 1012 (3 12 3560 5 59.3.13.0 4.1.152.0 1 1 60 60) 1012 SB
X330 2077 1104 (3 13 3560 7 0.128.94.0 0.129.27.0 2 2 120 158) 1104 SB
X330 2117 1058 (3 14 3560 5 59.3.40.0 4.1.153.0 2 2 120 120) 1058 SB
X330 2157 943 (3 15 3560 5 0.0.0.0 4.1.153.0 0 1 0 60) 943 SB
X330 2197 1081 (3 16 3560 5 4.1.152.0 59.2.189.0 2 2 120 120) 1081 SB
X330 2237 713 ( . . . . . . . . .) 713 SB
X330 2292 1035 (3 42 3560 7 0.128.42.0 0.129.34.0 0 1 0 60) 1035 SB
X330 2332 1035 (3 43 3560 7 0.128.42.0 0.128.43.0 0 1 0 60) 1035 SB
X330 2372 1035 (3 44 3560 7 0.128.42.0 0.128.41.0 0 1 0 60) 1035 SB
X330 2412 1012 (3 45 3560 7 0.128.42.0 0.129.2.0 0 1 0 60) 1012 SB
X330 2452 1081 (3 46 3560 5 4.1.152.0 59.2.208.0 2 2 120 120) 1081 SB
X330 2492 1058 (3 47 3560 5 59.3.46.0 4.1.150.0 2 2 120 120) 1058 SB
X330 2532 1081 (3 48 3560 5 4.1.152.0 59.2.198.0 2 2 120 120) 1081 SB
X330 2572 966 (3 49 3560 5 0.0.0.0 59.2.120.0 0 1 0 60) 966 SB
X330 2612 1012 (3 50 3664 5 4.1.152.0 59.2.214.0 0 1 0 60) 1012 SB
X330 2652 943 (3 51 3664 5 0.0.0.0 4.2.142.0 0 1 0 60) 943 SB
X330 2692 1058 (3 52 3664 5 4.1.153.0 59.3.45.0 4 4 240 240) 1058 SB
X330 2732 1587 (#Time: 12:36:25 Fri 1 Oct 93 130.216.14.251 Flows from 3641 to 33420) 1587 SB
X330 2772 1679 (#Stats: aps=349 apb=16 mps=1357 mpb=537 lsp=0 avi=97.3 mni = 93.4 fiu=480) 1679 SB
X330 2812 1196 (frc=0 gci=5 rpp=2.4 tpp=1.2 cpt=1.2 tts=1024 tsu=328) 1196 SB
X330 2852 1150 (3 6 3560 2 130.216.14.0 130.216.3.0 0 21 0 2378) 1150 SB
X330 2892 1472 (3 7 3560 2 130.216.14.0 130.216.76.0 9586 7148 1111118 565274) 1472 SB
X330 2932 1081 (3 8 3560 7 0.0.255.0 1.144.200.0 0 26 0 1983) 1081 SB
X330 2972 1334 (3 9 3560 2 130.216.14.0 130.216.14.0 10596 1 2792846 60) 1334 SB
X330 3012 1380 (3 10 3560 6 130.216.0.28 130.216.0.192 16589 1 7878902 66) 1380 SB
X330 3052 1127 (3 11 3560 7 0.0.255.0 0.128.113.0 0 87 0 16848) 1127 SB
X330 3092 1150 (3 12 3560 5 59.3.13.0 4.1.152.0 20 20 1200 1200) 1150 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (9) 26 SB
X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC
X330 256 1173 (3 13 3560 7 0.128.94.0 0.129.27.0 15 14 900 1144) 1173 SB
X330 296 1150 (3 14 3560 5 59.3.40.0 4.1.153.0 38 38 2280 2280) 1150 SB
X330 336 1012 (3 15 3560 5 0.0.0.0 4.1.153.0 0 30 0 1800) 1012 SB
X330 376 1173 (3 16 3560 5 4.1.152.0 59.2.189.0 20 20 1200 1200) 1173 SB
X330 416 1012 (3 17 3560 5 0.0.0.0 59.2.141.0 0 11 0 660) 1012 SB
X330 456 713 ( . . . . . . . . .) 713 SB
X330 511 1104 (3 476 26162 7 0.129.113.0 0.128.37.0 0 1 0 82) 1104 SB
X330 551 1150 (3 477 27628 7 0.128.41.0 0.128.46.0 1 1 543 543) 1150 SB
X330 591 1173 (3 478 27732 7 0.128.211.0 0.128.46.0 1 1 543 543) 1173 SB
X330 631 1104 (3 479 31048 7 0.128.47.0 2.38.221.0 1 1 60 60) 1104 SB
X330 671 1196 (3 480 32717 2 202.14.100.0 130.216.76.0 0 4 0 240) 1196 SB
X330 711 1265 (3 481 32717 2 130.216.76.0 130.216.3.0 0 232 0 16240) 1265 SB
X330 751 1610 (#Time: 12:41:25 Fri 1 Oct 93 130.216.14.251 Flows from 33419 to 63384) 1610 SB
X330 791 1679 (#Stats: aps=415 apb=17 mps=1780 mpb=542 lsp=0 avi=97.3 mni = 93.4 fiu=567) 1679 SB
X330 831 1196 (frc=0 gci=5 rpp=1.8 tpp=1.0 cpt=1.3 tts=1024 tsu=372) 1196 SB
X330 871 1311 (3 6 3560 2 130.216.14.0 130.216.3.0 51 180 3079 138195) 1311 SB
X330 911 1541 (3 7 3560 2 130.216.14.0 130.216.76.0 21842 18428 2467693 1356570) 1541 SB
X330 951 1081 (3 8 3560 7 0.0.255.0 1.144.200.0 0 30 0 2282) 1081 SB
X330 991 1334 (3 9 3560 2 130.216.14.0 130.216.14.0 24980 1 5051834 60) 1334 SB
X330 1031 1380 (3 10 3560 6 130.216.0.28 130.216.0.192 20087 1 8800070 66) 1380 SB
X330 1071 1150 (3 11 3560 7 0.0.255.0 0.128.113.0 0 164 0 32608) 1150 SB
X330 1111 1150 (3 12 3560 5 59.3.13.0 4.1.152.0 41 41 2460 2460) 1150 SB
X330 1151 1150 (3 14 3560 5 59.3.40.0 4.1.153.0 82 82 4920 4920) 1150 SB
X330 1197 966 (3 15 3560 5 0.0.0.0 4.1.153.0 0 60 0 36) 966 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X1296 1191 56 (00) 56 SB
X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X330 1240 713 ( . . . . . . . . .) 713 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1313 84 (4.3.) 84 SB
X413 1313 462 (Flow Data Features) 462 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1396 1080 (Several features of the Flow data are worthy of note:) 1080 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1472 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1475 1471 (Collection times overlap slightly between samples. This allows for flows) 1471 SB
X389 1529 1522 (which were created after the collection started, and makes sure that flows) 1522 SB
X389 1583 667 (are not missed from a collection.) 667 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1659 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1662 1563 (The rule set may change during a run. The above shows flows from rule set) 1563 SB
X389 1716 1579 (1 - the default set - in the first collection, followed by the first flows created by) 1579 SB
X389 1770 1150 (rule set 3 \(which has just been downloaded by NeMaC\).) 1150 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1846 21 (\267) 21 SB
Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X389 1849 273 (FlowIndexes ) 273 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X662 1849 1144 (may be reused by the meter once their flows have been) 1144 SB
X389 1903 1162 (recovered by the garbage collector. The combination of ) 1162 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 1903 275 (FlowRuleSet,) 275 SB
X389 1957 224 (FlowIndex ) 224 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X613 1957 91 (and ) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X704 1957 213 (StartTime ) 213 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X917 1957 781 (are needed to identify a flow uniquely.) 781 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 2033 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2036 1548 (Packet and Byte counters are 32-bit unsigned integers, and are never reset) 1548 SB
X389 2090 1566 (by the meter. Computing the counts occurring within a collection interval will) 1566 SB
X389 2144 1564 (require taking the difference between the collected count and its value when) 1564 SB
X389 2198 1595 (the flow was last collected. Note that counter wrap-around can be allowed for) 1595 SB
X389 2252 1418 (by simply performing an unsigned subtraction and ignoring any carry.) 1418 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 2328 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2331 1551 (In the sample flow data file above I have used double spaces as separators) 1551 SB
X389 2385 1564 (between the flow identifiers, peer addresses, pdu counts and packet counts.) 1564 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X271 2522 32 (5) 34 SB
X305 2522 16 (.) 18 SB
X360 2522 55 (W) 57 SB
X417 2522 23 (r) 25 SB
X442 2522 16 (i) 18 SB
X460 2522 19 (t) 21 SB
X481 2522 16 (i) 18 SB
X499 2522 35 (n) 37 SB
X536 2522 35 (g) 37 SB
X573 2522 16 ( ) 18 SB
X591 2522 42 (R) 44 SB
X635 2522 35 (u) 37 SB
X672 2522 16 (l) 18 SB
X690 2522 32 (e) 34 SB
X724 2522 16 ( ) 18 SB
X742 2522 35 (F) 37 SB
X779 2522 16 (i) 18 SB
X797 2522 16 (l) 18 SB
X815 2522 32 (e) 34 SB
X849 2522 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2622 84 (5.1.) 84 SB
X413 2622 295 (Introduction) 295 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2705 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2705 162 (rule file ) 162 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X477 2705 1642 (is a file of ASCII text which contains information needed by an accounting meter) 1642 SB
X271 2759 1809 (and by a collector. This includes a rule set, rule and action tables, a format specification) 1809 SB
X271 2813 712 (and a statistics request. The term ) 712 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X983 2813 152 (rule set) 152 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1135 2813 938 ( means the combination of a rule table and its) 938 SB
X271 2867 1836 (corresponding action table. An accounting meter can have up to ten rule sets in memory,) 1836 SB
X271 2921 1607 (allowing its manager to switch between them simply by setting the value of the) 1607 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2975 319 (CurrentRuleSet) 319 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X590 2975 283 ( MIB variable.) 283 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (10) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1836 (NeTraMet has one rule set built in; this is the default rule set, which is set number 1. This) 1836 SB
X271 310 1747 (allows NeTraMet to be active as soon as it starts up, and it provides a default rule set) 1747 SB
X271 364 1853 (which it can use while other rule sets are downloaded by its manager. The default rule set) 1853 SB
X271 418 703 (can't be changed by the manager.) 703 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 505 84 (5.2.) 84 SB
X413 505 375 (Rule file Syntax) 375 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 588 1706 (The syntax for rule files is given below in the form of railway diagrams, and detailed) 1706 SB
X271 642 1737 (examples are given in the following sections. Note that NeMaC's parser is extremely) 1737 SB
X271 696 1699 (simple-minded - although it does a good job on valid rule files it has very poor error) 1699 SB
X271 750 190 (recovery!) 190 SB
X271 829 119 (Each ) 119 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X390 829 217 (statement ) 217 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X607 829 1412 (in a rule file starts at the beginning of a line. A cross-hatch character) 1412 SB
X271 883 1832 (marks the end of a line; all characters following a cross-hatch on a line are ignored by the) 1832 SB
X271 937 178 (scanner.) 178 SB
X271 1016 1804 (NeMaC's scanner looks for keywords, numbers and addresses. Keywords are shown in) 1804 SB
X271 1070 1705 (the railway diagrams in upper case, but case is ignored by the scanner. Keywords,) 1705 SB
X271 1124 1610 (including attribute names, must be given in full - abbreviations are not allowed.) 1610 SB
X0 lc
X0 lj
X0 0 0 pC
X6 4 SP
X255 255 255 fC
X/fm 256 def
X712 423 781 1241 B
X1 F
XS
Xn
X1 lc
X1 lj
X275 1325 M 1626 0 1 PP
XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X275 1203 300 (Rules File) 300 SB
X255 255 255 fC
X1869 1303 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn
X778 1394 M 713 0 1 PP
XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X400 84 925 1350 B
X1 F
XS
Xn


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X0 0 0 fC
X941 1373 364 (Rules section) 364 SB
X1 lc
X1 lj
X0 0 0 pC
X782 1482 M 712 0 1 PP
XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC
X456 71 894 1444 B
X1 F
XS
Xn
X0 0 0 fC
X912 1458 420 (Actions section) 420 SB
X255 255 255 fC
X514 86 869 1272 B
X1 F
XS
Xn
X0 0 0 fC
X885 1295 476 (RuleSet statement) 476 SB
X1 lc
X1 lj
X0 0 0 pC
X816 1210 M 34 28 -31 22 -3 6 3 PP
XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC
X615 83 822 1619 B
X1 F
XS
Xn
X0 0 0 fC
X847 1642 560 (Statistics statement) 560 SB
X1 lc
X1 lj
X0 0 0 pC
X782 1575 M 712 0 1 PP
XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC
X497 87 878 1525 B
X1 F
XS
END_OF_FILE
if test 48982 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.B'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(191941 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 191941 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi
# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.B'
fi
if test -f 'netramet/src/meter/meter_pc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/meter_pc.c'\"
else
echo shar: Extracting \"'netramet/src/meter/meter_pc.c'\" \(11885 characters\)
sed "s/^X//" >'netramet/src/meter/meter_pc.c' <<'END_OF_FILE'
X/* 1407, Wed 6 Oct 93
X
X METER_PC.C: The AU accounting meter mainline;
X based on CMU's snmpd,
X PCIP's packet monitoring
X and Waterloo's TCP/IP.


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X/*
X * snmpd.c - send snmp GET requests to a network entity.


X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#include "ausnmp.h"
X#define PKTSNAP


X#include "pktsnap.h"
X#include "flowhash.h"
X

X#define APPLETALK
X
Xextern char version_descr[]; /* In met_vars.c */
Xextern char *communities[]; /* In snmp/snmpagnt.c */
X
X#include <dos.h>
X#include <alloc.h>
X#include <ctype.h>
X
X#include <sys/types.h>
X/* #include <netinet/in.h> AU */
X#include <stdio.h>
X/* #include <sys/socket.h> AU */
X#include "tcp.h"
X
X#include <errno.h>
X
X#include "snmp.h"
X#include "snmpimpl.h" /* AU */
X#include "asn1.h"


X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

Xudp_Socket udpsock;
Xstatic udp_Socket *s;
Xint status; /* For socket */
X
Xvoid init_snmp();
Xvoid receive();
Xvoid snmp_read();
X
Xvoid pkt_rcv_call2(handle, len, buffp)
Xunsigned int handle, len;
Xunsigned char far *buffp;
X{
X unsigned char *buff = buffp; /* TCP's buffers are in our data segment! */
X struct pkt far *pp;
X
X if (buff[0] == 0xFF && buff[1] == 0xFF && buff[2] == 0xFF &&
X buff[3] == 0xFF && buff[4] == 0xFF && buff[5] == 0xFF) {
X if (buff[12] == 0x08 &&
X (buff[13] == 0x00 || buff[13] == 0x06 )) { /* IP or ARP */
X buff[-2] = 1; /* Ready for tcp/ip */
X }
X else buff[-2] = 0; /* Not for us; free the buffer */
X }
X else if (buff[5] == eth_addr[5] && buff[4] == eth_addr[4] &&
X buff[3] == eth_addr[3] && buff[2] == eth_addr[2] &&
X buff[1] == eth_addr[1] && buff[0] == eth_addr[0]) {
X if (buff[12] == 0x08 &&
X (buff[13] == 0x00 || buff[13] == 0x06 )) { /* IP or ARP */
X buff[-2] = 1; /* Ready for tcp/ip */
X }
X else buff[-2] = 0; /* Not for us; free the buffer */
X }
X else buff[-2] = 0; /* Not for us; free the buffer */
X
X ++npackets; nbytes += len;
X if(((pproc - prcv) & pktmask) == 1) { /* No pkts free, ignore the data */
X ++lostpackets;
X }
X else {
X pp = &pkts[prcv];
X if (buff[12] == 0x08 && buff[13] == 0x00) pp->p_type = AT_IP;
X else if (buff[12] <= maxpkthi) { /* 802.3 */
X if (buff[14] == 0xFF && buff[15] == 0xFF) pp->p_type = AT_NOVELL;
X#ifdef APPLETALK
X else if (buff[14] == 0xAA && buff[15] == 0xAA) { /* SNAP */
X if (buff[20] == 0x80 && buff[21] == 0x9B) pp->p_type = AT_ETHERTALK;
X else return;
X }
X#endif
X else return;
X }
X else if (buff[12] == 0x60 && buff[13] == 0x03) pp->p_type = AT_DECNET;
X else return;
X pp->p_len = len;
X qmove(&buffp[SNAPFROM], pp->p_data, SNAPLEN);
X prcv = (prcv+1) & pktmask;
X }
X }
X
Xvoid main(argc, argv)


X int argc;
X char *argv[];
X{

X int arg, c;
X char cbuf[20], *ap;
X
X sclear();
X scpos(0,0); printf(version_descr);
X scpos(0,1);
X
X maxpkt = 1024;
X display_enabled = kb_enabled = 1; /* Enabled by default */
X mxflowsp1 = DFMXFLOWS+1;
X /* Default (CMU) communities are: 0 = "public", 1 = "proxy",
X 2 = "private", 3 = "regional", 4 = "core"
X We only allow "public" and "private" by default */
X communities[1] = communities[3] = communities[4] = "";
X for (c = 0, arg = 1; arg < argc; ++arg) {


X if (argv[arg][0] == '-') {

X switch (argv[arg][1]) {


X case 'd':
X snmp_dump_packet++;
X break;

X case 'f':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X mxflowsp1 = atoi(ap)+1;
X break;
X case 'k':
X kb_enabled = 0; /* -k to disable keyboard */
X break;
X case 'p':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X maxpkt = atoi(ap);
X break;
X case 'r':
X for (;;) {
X if (c == 5) {
X printf("Max of 4 read communities allowed\n");
X exit(0);
X }
X communities[c++] = argv[++arg];
X if (c == 2) ++c; /* 2 -> "private" */
X if (arg == argc-1 || argv[arg+1][0] == '-') break;
X }
X break;
X case 's':
X display_enabled = 0; /* -s to disable screen */
X break;
X case 'w':
X communities[2] = argv[++arg]; /* -w to set write community */
X break;
X default:
X printf("Invalid option: -%c\n", argv[arg][1]);
X exit(0);
X }
X }
X }
X pktmask = maxpkt-1; maxpkthi = maxpkt/256;
X pkts = (struct pkt far *)farmalloc((maxpkt+1) * sizeof(struct pkt));
X pproc = prcv = 0;
X au_monitor = 1;
X
X sock_init();
X printf("Running on %s",inet_ntoa(cbuf,gethostid()));
X
X s = &udpsock; /* myport hisadr hisport */
X if (!udp_open( s, SNMP_PORT, 0, 0, 0 )) {
X puts("udp_open failed!\n");
X exit(1);
X }
X
X init_snmp();
X init_monitor();
X receive();
X }
X
Xvoid show_meter_time()
X{
X char msg[60];
X sprintf(msg,"%lu seconds since %02d%02d:%02d",
X elapsed_sec, s_tod_h,s_tod_m,s_tod_s);
X display_msg(0,msg);
X }
X
Xunsigned int mxmonpkts = 400; /* Max nbr of packets per pkt_monitor call */
Xunsigned int bkgi; /* Seconds before next run of backgound process */
X#define BKG_INTERVAL 30 /* 30 seconds */
X
Xvoid zero_pkt_stats()
X{
X npackets = nbytes = badpackets = nobufpackets = lostpackets =
X stats_time = t_backlog = spackets = sbytes =
X kilodummypackets = dummypacketrate = 0L;
X mindummyrate = 100000000L;
X pkt_backlog = max_pkt_backlog = max_pkt_rate =
X dummypackets = mdpacketrate = 0;
X clear_pkt_stats = 0;
X }
X
Xvoid receive()
X{
X unsigned char startup, ch, gci, p;
X unsigned int k, n, x, sumx, minx, maxx, samples, ax;
X char l_tod_s; /* Last tod_s displayed on chart */
X unsigned long pd, bd;
X long tot = set_timeout(1);
X struct pkt far *pkp;
X unsigned char half_scale = 0;
X
X startup = 1;
X pproc = prcv; /* Discard packets collected during initialisation */
X for (;;) {
X sock_tick(s, &status);
X if ((n = sock_dataready(s)) != 0) {
X snmp_read(n);
X sock_close(s);
X if (!udp_open( s, SNMP_PORT, 0, 0, 0 )) {
X puts("udp_open failed!\n");


X exit(1);
X }
X }
X

X k = (prcv-pproc) & pktmask;
X if (k == 0) { /* Build a dummy packet */
X pkp = &pkts[maxpkt];
X for (k = 0; k != SNAPLEN; ++k) pkp->p_data[k] = 0;
X pkt_monitor(pkp->p_data, 0, AT_DUMMY);
X }
X else {
X if (k > pkt_backlog) pkt_backlog = k;
X for (k = mxmonpkts; pproc != prcv && k != 0; --k) {
X pkp = &pkts[pproc];
X pkt_monitor(pkp->p_data, pkp->p_len, pkp->p_type);
X pproc = (pproc+1) & pktmask;
X }
X }
X
X if (chk_timeout(tot)) {
X tot = set_timeout(1); /* 1 second */
X ++elapsed_sec; set_tod();
X s_uptime = uptime(); /* Don't do this too often! */
X
X if (startup) { /* Running now, initialise counters etc. */
X clear_pkt_stats = 1;
X minx = 100; sumx = samples = maxx = 0;
X l_tod_s = -1;
X gci = gc_interval; /* Garbage collect interval */
X bkgi = BKG_INTERVAL; /* Background interval */
X startup = 0;
X }
X else {
X if (--gci == 0) {
X garbage_collect();
X gci = gc_interval;
X }
X if (--bkgi == 0) {
X p = (unsigned long)nflows*100/(mxflowsp1-1);
X if (p > HighWaterMark) { /* % flows in use */
X pd = s_uptime-InactivityTimeout;
X GarbageCollectTime += InactivityTimeout;
X if (GarbageCollectTime > pd) GarbageCollectTime = pd;
X }
X bkgi = BKG_INTERVAL;
X }
X pd = npackets-spackets; bd = nbytes-sbytes;
X if (display_enabled) {
X scpos(0,3);
X printf("q=%4d",pkt_backlog);
X scpos(23,3);
X printf("%02d%02d:%02d", tod_h,tod_m,tod_s);
X scpos(0,5);
X x = util_pc(pd,bd); /* % utilisation */
X printf("p=%6lu, b=%10lu, u=%4d", pd,bd, x);
X sumx += x; ++samples;
X if (x < minx) minx = x;
X if (x > maxx) maxx = x;
X if (tod_s != l_tod_s && tod_s%10 == 0) {
X if (samples) { /* 30% in col 79 */
X ax = (sumx+(samples>>1))/samples;
X if (half_scale)
X chart(41,0, 79,24, minx>>1,ax>>1,maxx>>1);
X else chart(41,0, 79,24, minx,ax,maxx);
X l_tod_s = tod_s;
X }
X minx = 100; sumx = samples = maxx = 0;
X }
X }
X }
X if (clear_pkt_stats) zero_pkt_stats();
X else {
X ++stats_time;
X if (pd > max_pkt_rate) max_pkt_rate = pd;
X t_backlog += (unsigned long)pkt_backlog;
X if (pkt_backlog > max_pkt_backlog)
X max_pkt_backlog = pkt_backlog;
X if (dummypacketrate < mindummyrate) {
X mindummyrate = dummypacketrate; mdpacketrate = pd;
X }
X }
X
X pkt_backlog = 0; dummypacketrate = 0;
X spackets = npackets; sbytes = nbytes;
X
X if (kb_enabled && kbhit()) {
X if ((ch = getch()) == 27) { /* ESC */
X scpos(0,24);
X printf("\nShutting down\n");
X exit(0);
X }
X w_clear(0,24, 40,24); scpos(0,24);
X switch (tolower(ch)) {
X case 'b':
X printf("bad=%lu, nobuf=%lu, lost=%lu",
X badpackets,nobufpackets,lostpackets);
X break;
X case 'h':
X half_scale = !half_scale;
X printf("Chart scale 0..%d \%",
X half_scale ? 60 : 30);
X break;
X case 'm':
X printf("%u near, %lu far bytes free",
X coreleft(),farcoreleft());
X break;
X case 'v':
X printf(version_descr);
X break;
X default:
X handle_kb(ch);


X break;
X }
X }
X }
X }
X

Xsock_err:
X switch (status) {
X case 1 : /* foreign host closed */
X exit(0);
X case -1: /* timeout */
X printf("\nConnection timed out!");
X exit(1);
X default: printf("Aborting");


X exit(1);
X }
X}
X

Xunsigned long snmp_peer_addr;
X
Xvoid snmp_read(length)
Xint length;
X{
X int out_length;
X u_char packet[1500], outpacket[1500];
X int count;
X struct sockaddr from;
X int fromlen = sizeof(struct sockaddr);
X char snmp_peer_name[30]; /* name of host which sent the snmp request */
X getpeername(s, &from,&fromlen);
X snmp_peer_addr = from.s_ip;
X
X sock_read(s, packet,length);
X
X if (snmp_dump_packet) {
X inet_ntoa(snmp_peer_name,from.s_ip);
X printf("received %d bytes from %s:\n", length, snmp_peer_name);
X for (count = 0; count < length; count++) {
X printf("%02X ", packet[count]);
X if ((count % 16) == 15) printf("\n");
X }
X printf("\n\n");
X }
X out_length = 1500;
X if (snmp_agent_parse(packet, length, outpacket, &out_length, from.s_ip)) {
X if (snmp_dump_packet) {
X printf("sent %d bytes to %s:\n", out_length, snmp_peer_name);
X for (count = 0; count < out_length; count++) {
X printf("%02X ", outpacket[count]);
X if ((count % 16) == 15) printf("\n");
X }
X printf("\n\n");
X }
X sock_write( s, (char *)outpacket, out_length);
X }
X }
X
END_OF_FILE
if test 11885 -ne `wc -c <'netramet/src/meter/meter_pc.c'`; then
echo shar: \"'netramet/src/meter/meter_pc.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/meter_pc.c'
fi
echo shar: End of archive 9 \(of 25\).
cp /dev/null ark9isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:10:42 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 98
Archive-name: netramet/part10
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.A
# netramet/sg/apps/snmpnetstat/Makefile
# netramet/src/meter/meter_ux.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:07 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 10 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.A' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\" \(48198 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.A' <<'END_OF_FILE'
X%!PS-Adobe-3.0 EPSF-2.0
X%%Creator: Windows PSCRIPT
X%%Title: Microsoft Word - NETRAMET.DOC
X%%BoundingBox: 13 10 577 832
X%%DocumentNeededResources: (atend)
X%%DocumentSuppliedResources: (atend)
X%%Pages: 0
X%%BeginResource: procset Win35Dict 3 1
X/Win35Dict 290 dict def Win35Dict begin/bd{bind def}bind def/in{72
Xmul}bd/ed{exch def}bd/ld{load def}bd/tr/translate ld/gs/gsave ld/gr
X/grestore ld/M/moveto ld/L/lineto ld/rmt/rmoveto ld/rlt/rlineto ld
X/rct/rcurveto ld/st/stroke ld/n/newpath ld/sm/setmatrix ld/cm/currentmatrix
Xld/cp/closepath ld/ARC/arcn ld/TR{65536 div}bd/lj/setlinejoin ld/lc
X/setlinecap ld/ml/setmiterlimit ld/sl/setlinewidth ld/scignore false
Xdef/sc{scignore{pop pop pop}{0 index 2 index eq 2 index 4 index eq
Xand{pop pop 255 div setgray}{3{255 div 3 1 roll}repeat setrgbcolor}ifelse}ifelse}bd
X/FC{bR bG bB sc}bd/fC{/bB ed/bG ed/bR ed}bd/HC{hR hG hB sc}bd/hC{
X/hB ed/hG ed/hR ed}bd/PC{pR pG pB sc}bd/pC{/pB ed/pG ed/pR ed}bd/sM
Xmatrix def/PenW 1 def/iPen 5 def/mxF matrix def/mxE matrix def/mxUE
Xmatrix def/mxUF matrix def/fBE false def/iDevRes 72 0 matrix defaultmatrix
Xdtransform dup mul exch dup mul add sqrt def/fPP false def/SS{fPP{
X/SV save def}{gs}ifelse}bd/RS{fPP{SV restore}{gr}ifelse}bd/EJ{gsave
Xshowpage grestore}bd/#C{userdict begin/#copies ed end}bd/FEbuf 2 string
Xdef/FEglyph(G )def/FE{1 exch{dup 16 FEbuf cvrs FEglyph exch 1 exch
Xputinterval 1 index exch FEglyph cvn put}for}bd/SM{/iRes ed/cyP ed
X/cxPg ed/cyM ed/cxM ed 72 100 div dup scale dup 0 ne{90 eq{cyM exch
X0 eq{cxM exch tr -90 rotate -1 1 scale}{cxM cxPg add exch tr +90 rotate}ifelse}{cyP
XcyM sub exch 0 ne{cxM exch tr -90 rotate}{cxM cxPg add exch tr -90
Xrotate 1 -1 scale}ifelse}ifelse}{pop cyP cyM sub exch 0 ne{cxM cxPg
Xadd exch tr 180 rotate}{cxM exch tr 1 -1 scale}ifelse}ifelse 100 iRes
Xdiv dup scale 0 0 transform .25 add round .25 sub exch .25 add round
X.25 sub exch itransform translate}bd/SJ{1 index 0 eq{pop pop/fBE false
Xdef}{1 index/Break ed div/dxBreak ed/fBE true def}ifelse}bd/ANSIVec[
X16#0/grave 16#1/acute 16#2/circumflex 16#3/tilde 16#4/macron 16#5/breve
X16#6/dotaccent 16#7/dieresis 16#8/ring 16#9/cedilla 16#A/hungarumlaut
X16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle 16#60/grave
X16#7C/bar 16#82/quotesinglbase 16#83/florin 16#84/quotedblbase 16#85
X/ellipsis 16#86/dagger 16#87/daggerdbl 16#89/perthousand 16#8A/Scaron
X16#8B/guilsinglleft 16#8C/OE 16#91/quoteleft 16#92/quoteright 16#93
X/quotedblleft 16#94/quotedblright 16#95/bullet 16#96/endash 16#97
X/emdash 16#99/trademark 16#9A/scaron 16#9B/guilsinglright 16#9C/oe
X16#9F/Ydieresis 16#A0/space 16#A4/currency 16#A6/brokenbar 16#A7/section
X16#A8/dieresis 16#A9/copyright 16#AA/ordfeminine 16#AB/guillemotleft
X16#AC/logicalnot 16#AD/hyphen 16#AE/registered 16#AF/macron 16#B0/degree
X16#B1/plusminus 16#B2/twosuperior 16#B3/threesuperior 16#B4/acute 16#B5
X/mu 16#B6/paragraph 16#B7/periodcentered 16#B8/cedilla 16#B9/onesuperior
X16#BA/ordmasculine 16#BB/guillemotright 16#BC/onequarter 16#BD/onehalf
X16#BE/threequarters 16#BF/questiondown 16#C0/Agrave 16#C1/Aacute 16#C2
X/Acircumflex 16#C3/Atilde 16#C4/Adieresis 16#C5/Aring 16#C6/AE 16#C7
X/Ccedilla 16#C8/Egrave 16#C9/Eacute 16#CA/Ecircumflex 16#CB/Edieresis
X16#CC/Igrave 16#CD/Iacute 16#CE/Icircumflex 16#CF/Idieresis 16#D0/Eth
X16#D1/Ntilde 16#D2/Ograve 16#D3/Oacute 16#D4/Ocircumflex 16#D5/Otilde
X16#D6/Odieresis 16#D7/multiply 16#D8/Oslash 16#D9/Ugrave 16#DA/Uacute
X16#DB/Ucircumflex 16#DC/Udieresis 16#DD/Yacute 16#DE/Thorn 16#DF/germandbls
X16#E0/agrave 16#E1/aacute 16#E2/acircumflex 16#E3/atilde 16#E4/adieresis
X16#E5/aring 16#E6/ae 16#E7/ccedilla 16#E8/egrave 16#E9/eacute 16#EA
X/ecircumflex 16#EB/edieresis 16#EC/igrave 16#ED/iacute 16#EE/icircumflex
X16#EF/idieresis 16#F0/eth 16#F1/ntilde 16#F2/ograve 16#F3/oacute 16#F4
X/ocircumflex 16#F5/otilde 16#F6/odieresis 16#F7/divide 16#F8/oslash
X16#F9/ugrave 16#FA/uacute 16#FB/ucircumflex 16#FC/udieresis 16#FD/yacute
X16#FE/thorn 16#FF/ydieresis ] def/reencdict 12 dict def/IsChar{basefontdict
X/CharStrings get exch known}bd/MapCh{dup IsChar not{pop/bullet}if
Xnewfont/Encoding get 3 1 roll put}bd/MapDegree{16#b0/degree IsChar{
X/degree}{/ring}ifelse MapCh}bd/MapBB{16#a6/brokenbar IsChar{/brokenbar}{
X/bar}ifelse MapCh}bd/ANSIFont{reencdict begin/newfontname ed/basefontname
Xed FontDirectory newfontname known not{/basefontdict basefontname findfont
Xdef/newfont basefontdict maxlength dict def basefontdict{exch dup/FID
Xne{dup/Encoding eq{exch dup length array copy newfont 3 1 roll put}{exch
Xnewfont 3 1 roll put}ifelse}{pop pop}ifelse}forall newfont/FontName
Xnewfontname put 127 1 159{newfont/Encoding get exch/bullet put}for
XANSIVec aload pop ANSIVec length 2 idiv{MapCh}repeat MapDegree MapBB
Xnewfontname newfont definefont pop}if newfontname end}bd/SB{FC/ULlen
Xed/str ed str length fBE not{dup 1 gt{1 sub}if}if/cbStr ed/dxGdi ed
X/y0 ed/x0 ed str stringwidth dup 0 ne{/y1 ed/x1 ed y1 y1 mul x1 x1
Xmul add sqrt dxGdi exch div 1 sub dup x1 mul cbStr div exch y1 mul
XcbStr div}{exch abs neg dxGdi add cbStr div exch}ifelse/dyExtra ed
X/dxExtra ed x0 y0 M fBE{dxBreak 0 BCh dxExtra dyExtra str awidthshow}{dxExtra
XdyExtra str ashow}ifelse fUL{x0 y0 M dxUL dyUL rmt ULlen fBE{Break
Xadd}if 0 mxUE transform gs rlt cyUL sl [] 0 setdash st gr}if fSO{x0
Xy0 M dxSO dySO rmt ULlen fBE{Break add}if 0 mxUE transform gs rlt cyUL
Xsl [] 0 setdash st gr}if n/fBE false def}bd/font{/name ed/Ascent ed
X0 ne/fT3 ed 0 ne/fSO ed 0 ne/fUL ed/Sy ed/Sx ed 10.0 div/ori ed -10.0
Xdiv/esc ed/BCh ed name findfont/xAscent 0 def/yAscent Ascent def/ULesc
Xesc def ULesc mxUE rotate pop fT3{/esc 0 def xAscent yAscent mxUE transform
X/yAscent ed/xAscent ed}if [Sx 0 0 Sy neg xAscent yAscent] esc mxE
Xrotate mxF concatmatrix makefont setfont [Sx 0 0 Sy neg 0 Ascent] mxUE
XmxUF concatmatrix pop fUL{currentfont dup/FontInfo get/UnderlinePosition
Xknown not{pop/Courier findfont}if/FontInfo get/UnderlinePosition get
X1000 div 0 exch mxUF transform/dyUL ed/dxUL ed}if fSO{0 .3 mxUF transform
X/dySO ed/dxSO ed}if fUL fSO or{currentfont dup/FontInfo get/UnderlineThickness
Xknown not{pop/Courier findfont}if/FontInfo get/UnderlineThickness get
X1000 div Sy mul/cyUL ed}if}bd/min{2 copy gt{exch}if pop}bd/max{2 copy
Xlt{exch}if pop}bd/CP{/ft ed{{ft 0 eq{clip}{eoclip}ifelse}stopped{currentflat
X1 add setflat}{exit}ifelse}loop}bd/patfont 10 dict def patfont begin
X/FontType 3 def/FontMatrix [1 0 0 -1 0 0] def/FontBBox [0 0 16 16]
Xdef/Encoding StandardEncoding def/BuildChar{pop pop 16 0 0 0 16 16
Xsetcachedevice 16 16 false [1 0 0 1 .25 .25]{pat}imagemask}bd end/p{
X/pat 32 string def{}forall 0 1 7{dup 2 mul pat exch 3 index put dup
X2 mul 1 add pat exch 3 index put dup 2 mul 16 add pat exch 3 index
Xput 2 mul 17 add pat exch 2 index put pop}for}bd/pfill{/PatFont patfont
Xdefinefont setfont/ch(AAAA)def X0 64 X1{Y1 -16 Y0{1 index exch M ch
Xshow}for pop}for}bd/vert{X0 w X1{dup Y0 M Y1 L st}for}bd/horz{Y0 w
XY1{dup X0 exch M X1 exch L st}for}bd/fdiag{X0 w X1{Y0 M X1 X0 sub dup
Xrlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup rlt st}for}bd/bdiag{X0 w
XX1{Y1 M X1 X0 sub dup neg rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup
Xneg rlt st}for}bd/AU{1 add cvi 15 or}bd/AD{1 sub cvi -16 and}bd/SHR{pathbbox
XAU/Y1 ed AU/X1 ed AD/Y0 ed AD/X0 ed}bd/hfill{/w iRes 37.5 div round
Xdef 0.1 sl [] 0 setdash n dup 0 eq{horz}if dup 1 eq{vert}if dup 2 eq{fdiag}if
Xdup 3 eq{bdiag}if dup 4 eq{horz vert}if 5 eq{fdiag bdiag}if}bd/F{/ft
Xed fm 256 and 0 ne{gs FC ft 0 eq{fill}{eofill}ifelse gr}if fm 1536
Xand 0 ne{SHR gs HC ft CP fm 1024 and 0 ne{/Tmp save def pfill Tmp restore}{fm
X15 and hfill}ifelse gr}if}bd/S{PenW sl PC st}bd/m matrix def/GW{iRes
X12 div PenW add cvi}bd/DoW{iRes 50 div PenW add cvi}bd/DW{iRes 8 div
XPenW add cvi}bd/SP{/PenW ed/iPen ed iPen 0 eq iPen 6 eq or{[] 0 setdash}if
XiPen 1 eq{[DW GW] 0 setdash}if iPen 2 eq{[DoW GW] 0 setdash}if iPen
X3 eq{[DW GW DoW GW] 0 setdash}if iPen 4 eq{[DW GW DoW GW DoW GW] 0
Xsetdash}if}bd/E{m cm pop tr scale 1 0 moveto 0 0 1 0 360 arc cp m sm}bd
X/AG{/sy ed/sx ed sx div 4 1 roll sy div 4 1 roll sx div 4 1 roll sy
Xdiv 4 1 roll atan/a2 ed atan/a1 ed sx sy scale a1 a2 ARC}def/A{m cm
Xpop tr AG m sm}def/P{m cm pop tr 0 0 M AG cp m sm}def/RRect{n 4 copy
XM 3 1 roll exch L 4 2 roll L L cp}bd/RRCC{/r ed/y1 ed/x1 ed/y0 ed/x0
Xed x0 x1 add 2 div y0 M x1 y0 x1 y1 r arcto 4{pop}repeat x1 y1 x0 y1
Xr arcto 4{pop}repeat x0 y1 x0 y0 r arcto 4{pop}repeat x0 y0 x1 y0 r
Xarcto 4{pop}repeat cp}bd/RR{2 copy 0 eq exch 0 eq or{pop pop RRect}{2
Xcopy eq{pop RRCC}{m cm pop/y2 ed/x2 ed/ys y2 x2 div 1 max def/xs x2
Xy2 div 1 max def/y1 exch ys div def/x1 exch xs div def/y0 exch ys div
Xdef/x0 exch xs div def/r2 x2 y2 min def xs ys scale x0 x1 add 2 div
Xy0 M x1 y0 x1 y1 r2 arcto 4{pop}repeat x1 y1 x0 y1 r2 arcto 4{pop}repeat
Xx0 y1 x0 y0 r2 arcto 4{pop}repeat x0 y0 x1 y0 r2 arcto 4{pop}repeat
Xm sm cp}ifelse}ifelse}bd/PP{{rlt}repeat}bd/OB{gs 0 ne{7 3 roll/y ed
X/x ed x y translate ULesc rotate x neg y neg translate x y 7 -3 roll}if
Xsc B fill gr}bd/B{M/dy ed/dx ed dx 0 rlt 0 dy rlt dx neg 0 rlt cp}bd
X/CB{B clip n}bd/ErrHandler{errordict dup maxlength exch length gt
Xdup{errordict begin}if/errhelpdict 12 dict def errhelpdict begin/stackunderflow(operand stack underflow)def
X/undefined(this name is not defined in a dictionary)def/VMerror(you have used up all the printer's memory)def
X/typecheck(operator was expecting a different type of operand)def
X/ioerror(input/output error occured)def end{end}if errordict begin
X/handleerror{$error begin newerror{/newerror false def showpage 72
X72 scale/x .25 def/y 9.6 def/Helvetica findfont .2 scalefont setfont
Xx y moveto(Offending Command = )show/command load{dup type/stringtype
Xne{(max err string)cvs}if show}exec/y y .2 sub def x y moveto(Error = )show
Xerrorname{dup type dup( max err string )cvs show( : )show/stringtype
Xne{( max err string )cvs}if show}exec errordict begin errhelpdict errorname
Xknown{x 1 add y .2 sub moveto errhelpdict errorname get show}if end
X/y y .4 sub def x y moveto(Stack =)show ostack{/y y .2 sub def x 1
Xadd y moveto dup type/stringtype ne{( max err string )cvs}if show}forall
Xshowpage}if end}def end}bd end
X%%EndResource
X/SVDoc save def
X%%EndProlog
X%%BeginSetup
XWin35Dict begin
XErrHandler
X%%EndSetup


XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 54 54 0 0 0 51 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X728 523 945 (INTRODUCTORY DOCUMENTATION) 945 SB
X32 0 0 100 100 0 0 0 94 /Helvetica-Bold /font13 ANSIFont font
X711 690 979 (NeTraMet & NeMaC) 979 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X641 910 1120 (Network Traffic Meter & NeTraMet Manager/Collector) 1120 SB
X32 0 0 75 75 0 0 0 71 /Helvetica-Oblique /font19 ANSIFont font
X949 1152 503 (Nevil Brownlee) 503 SB
X32 0 0 54 54 0 0 0 51 /Helvetica /font12 ANSIFont font
X994 1347 414 (Computer Centre) 414 SB
X880 1414 642 (The University of Auckland) 642 SB
X916 1481 570 (Auckland, New Zealand) 570 SB
X1037 1573 327 (October 1993) 327 SB
X32 0 0 54 54 0 0 0 51 /Helvetica-Bold /font13 ANSIFont font
X1057 2086 258 (PREFACE) 258 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X448 2198 39 (It ) 48 SB
X496 2198 46 (is ) 55 SB
X551 2198 39 (a ) 48 SB
X599 2198 191 (pleasure ) 200 SB
X799 2198 52 (to ) 61 SB
X860 2198 110 (write ) 119 SB
X979 2198 85 (this ) 94 SB
X1073 2198 168 (preface ) 177 SB
X1250 2198 52 (to ) 61 SB
X1311 2198 115 (Nevil ) 124 SB
X1435 2198 238 (Brownlee's ) 248 SB
X1683 2198 242 (introductory) 242 SB
X448 2252 318 (documentation ) 322 SB
X770 2252 67 (for ) 71 SB
X841 2252 218 (NeTraMet ) 222 SB
X1063 2252 91 (and ) 95 SB
X1158 2252 182 (NeMaC. ) 186 SB
X1344 2252 13 ( ) 17 SB
X1361 2252 93 (The ) 97 SB
X1458 2252 172 (system, ) 177 SB
X1635 2252 131 (which ) 136 SB
X1771 2252 154 (collects) 154 SB
X448 2306 238 (accounting ) 245 SB
X693 2306 104 (data ) 112 SB
X805 2306 67 (for ) 75 SB
X880 2306 175 (network ) 183 SB
X1063 2306 139 (traffic, ) 147 SB
X1210 2306 88 (has ) 96 SB
X1306 2306 165 (already ) 173 SB
X1479 2306 155 (proved ) 163 SB
X1642 2306 52 (to ) 60 SB
X1702 2306 65 (be ) 73 SB
X1775 2306 39 (a ) 47 SB
X1822 2306 103 (gold-) 103 SB
X448 2360 113 (mine ) 128 SB
X576 2360 64 (\(in ) 79 SB
X655 2360 78 (the ) 93 SB
X748 2360 201 (figurative ) 216 SB
X964 2360 165 (sense\), ) 180 SB
X1144 2360 201 (providing ) 216 SB
X1360 2360 242 (information ) 257 SB
X1617 2360 130 (about ) 146 SB
X1763 2360 162 (network) 162 SB
X448 2414 126 (traffic ) 136 SB
X584 2414 118 (flows ) 128 SB
X712 2414 91 (and ) 102 SB
X814 2414 154 (activity ) 165 SB
X979 2414 181 (patterns ) 192 SB
X1171 2414 131 (which ) 142 SB
X1313 2414 80 (are ) 91 SB
X1404 2414 222 (invaluable ) 233 SB
X1637 2414 49 (in ) 60 SB
X1697 2414 191 (reaching ) 202 SB
X1899 2414 26 (a) 26 SB
X448 2468 807 (better understanding of network usage.) 807 SB
X1393 2705 409 (Dr John C. B. White) 409 SB
X1393 2759 542 (Director, Computer Centre) 542 SB
X1393 2813 458 (University of Auckland) 458 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1116 3265 43 (-- ) 43 SB
X1159 3265 10 (i) 10 SB
X1169 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 63 63 0 0 0 59 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X1021 263 45 (C) 47 SB
X1068 263 49 (O) 51 SB
X1119 263 45 (N) 47 SB
X1166 263 38 (T) 40 SB
X1206 263 42 (E) 44 SB
X1250 263 45 (N) 47 SB
X1297 263 38 (T) 40 SB
X1337 263 42 (S) 44 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
Xgs 1936 158 233 336 CB
X330 440 39 (1.) 39 SB
Xgr
Xgs 1936 158 233 336 CB
X405 440 243 (Introduction) 243 SB
Xgr
Xgs 1936 158 233 336 CB
X1899 440 26 (1) 26 SB
Xgr
X419 504 78 (1.1.) 78 SB
X531 504 500 (Operating Environments) 500 SB
X1899 504 26 (1) 26 SB
X419 568 78 (1.2.) 78 SB
X531 568 261 (Traffic Flows) 261 SB
X1899 568 26 (1) 26 SB
X419 632 78 (1.3.) 78 SB
X531 632 910 (The Internet Accounting Meter Services MIB) 910 SB
X1899 632 26 (2) 26 SB
Xgs 1907 79 233 686 CB
X330 711 39 (2.) 39 SB
Xgr
Xgs 1907 79 233 686 CB
X405 711 471 (Implementation Details) 471 SB
Xgr
Xgs 1907 79 233 686 CB
X1899 711 26 (2) 26 SB
Xgr
X419 775 78 (2.1.) 78 SB
X531 775 736 (Program Development Environment) 736 SB
X1899 775 26 (2) 26 SB
X419 839 78 (2.2.) 78 SB
X531 839 951 (Data Structures: Flow, Rule and Action Tables) 951 SB
X1899 839 26 (2) 26 SB
X419 903 78 (2.3.) 78 SB
X531 903 581 (Meter Memory Management) 581 SB
X1899 903 26 (3) 26 SB
X419 967 78 (2.4.) 78 SB
X531 967 533 (Optimising the Rule Table) 533 SB
X1899 967 26 (3) 26 SB
X419 1031 78 (2.5.) 78 SB
X531 1031 498 (The Meter's Outer Block) 498 SB
X1899 1031 26 (3) 26 SB
X419 1095 78 (2.6.) 78 SB
X531 1095 397 (Matching the Rules) 397 SB
X1899 1095 26 (4) 26 SB
X419 1159 78 (2.7.) 78 SB
X531 1159 764 (SNMP: Getting and Setting Variables) 764 SB
X1899 1159 26 (4) 26 SB
X419 1223 78 (2.8.) 78 SB
X531 1223 577 (Creation and Activity Tables) 577 SB
X1899 1223 26 (4) 26 SB
X419 1287 78 (2.9.) 78 SB
X531 1287 872 (Column Blobs: Recovering Bulk Flow Data) 872 SB
X1899 1287 26 (4) 26 SB
Xgs 1907 79 233 1341 CB
X330 1366 39 (3.) 39 SB
Xgr
Xgs 1907 79 233 1341 CB
X405 1366 306 (Flow Attributes) 306 SB
Xgr
Xgs 1907 79 233 1341 CB
X1899 1366 26 (5) 26 SB
Xgr
X419 1430 78 (3.1.) 78 SB
X531 1430 243 (Introduction) 243 SB
X1899 1430 26 (5) 26 SB
X419 1494 78 (3.2.) 78 SB
X531 1494 380 (Ethernet attributes) 380 SB
X1899 1494 26 (5) 26 SB
X419 1558 78 (3.2.) 78 SB
X531 1558 248 (IP attributes) 248 SB
X1899 1558 26 (6) 26 SB
X419 1622 78 (3.3.) 78 SB
X531 1622 366 (DECnet attributes) 366 SB
X1899 1622 26 (6) 26 SB
X419 1686 78 (3.4.) 78 SB
X531 1686 420 (Novell IPX attributes) 420 SB
X1899 1686 26 (7) 26 SB
X419 1750 78 (3.5.) 78 SB
X531 1750 402 (EtherTalk attributes) 402 SB
X1899 1750 26 (7) 26 SB
X419 1814 78 (3.6.) 78 SB
X531 1814 369 (General attributes) 369 SB
X1899 1814 26 (8) 26 SB
Xgs 1907 79 233 1868 CB
X330 1893 39 (4.) 39 SB
Xgr
Xgs 1907 79 233 1868 CB
X405 1893 318 (Flow Data Files) 318 SB
Xgr
Xgs 1907 79 233 1868 CB
X1899 1893 26 (8) 26 SB
Xgr
X419 1957 78 (4.1.) 78 SB
X531 1957 417 (Information Records) 417 SB
X1899 1957 26 (8) 26 SB
X419 2021 78 (4.2.) 78 SB
X531 2021 465 (Sample Flow Data File) 465 SB
X1899 2021 26 (9) 26 SB
X419 2085 78 (4.3.) 78 SB
X531 2085 404 (Flow Data Features) 404 SB
X1873 2085 52 (10) 52 SB
Xgs 1907 79 233 2139 CB
X330 2164 39 (5.) 39 SB
Xgr
Xgs 1907 79 233 2139 CB
X405 2164 361 (Writing Rule Files) 361 SB
Xgr
Xgs 1907 79 233 2139 CB
X1873 2164 52 (10) 52 SB
Xgr
X419 2228 78 (5.1.) 78 SB
X531 2228 243 (Introduction) 243 SB
X1873 2228 52 (10) 52 SB
X419 2292 78 (5.2.) 78 SB
X531 2292 322 (Rule file Syntax) 322 SB
X1873 2292 52 (11) 52 SB
X537 2346 117 (5.2.1.) 117 SB
X687 2346 390 (RuleSet Statement) 390 SB
X1873 2346 52 (11) 52 SB
X537 2400 117 (5.2.2.) 117 SB
X687 2400 286 (Rules Section) 286 SB
X1873 2400 52 (11) 52 SB
X537 2454 117 (5.2.3.) 117 SB
X687 2454 320 (Actions Section) 320 SB
X1873 2454 52 (12) 52 SB
X537 2508 117 (5.2.4.) 117 SB
X687 2508 371 (Format Statement) 371 SB
X1873 2508 52 (13) 52 SB
X537 2562 117 (5.2.5.) 117 SB
X687 2562 410 (Statistics Statement) 410 SB
X1873 2562 52 (13) 52 SB
X419 2626 78 (5.3.) 78 SB
X531 2626 218 ( Rule Files) 218 SB
X1873 2626 52 (13) 52 SB
X537 2680 117 (5.3.1.) 117 SB
X687 2680 253 (rules.default) 253 SB
X1873 2680 52 (13) 52 SB
X537 2734 117 (5.3.2.) 117 SB
X687 2734 262 (rules.sample) 262 SB
X1873 2734 52 (14) 52 SB
X537 2788 117 (5.3.3.) 117 SB
X687 2788 286 (rules.gateway) 286 SB
X1873 2788 52 (16) 52 SB
X537 2842 117 (5.3.4.) 117 SB
X687 2842 216 (rules.UofA) 216 SB
X1873 2842 52 (16) 52 SB
X537 2896 117 (5.3.5.) 117 SB
X687 2896 175 (rules.lan) 175 SB
X1873 2896 52 (18) 52 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1111 3265 43 (-- ) 43 SB
X1154 3265 20 (ii) 20 SB
X1174 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

Xgs 1907 79 233 389 CB
X330 414 39 (6.) 39 SB
Xgr
Xgs 1907 79 233 389 CB
X405 414 463 (NeMaC Users' Manual) 463 SB
Xgr
Xgs 1907 79 233 389 CB
X1873 414 52 (19) 52 SB
Xgr
X419 478 78 (6.1.) 78 SB
X531 478 462 (Overview of NeTraMet) 462 SB
X1873 478 52 (19) 52 SB
X419 542 78 (6.2.) 78 SB
X531 542 487 (Command Line Options) 487 SB
X1873 542 52 (19) 52 SB
X419 606 78 (6.3.) 78 SB
X531 606 522 (Configuration File Format) 522 SB
X1873 606 52 (20) 52 SB
Xgs 1907 79 233 660 CB
X330 685 39 (7.) 39 SB
Xgr
Xgs 1907 79 233 660 CB
X405 685 512 (NeTraMet Users' Manual) 512 SB
Xgr
Xgs 1907 79 233 660 CB
X1873 685 52 (20) 52 SB
Xgr
X419 749 78 (7.1.) 78 SB
X531 749 487 (Command Line Options) 487 SB
X1873 749 52 (20) 52 SB
X419 813 78 (7.2.) 78 SB
X531 813 388 (PC Screen Display) 388 SB
X1873 813 52 (21) 52 SB
X419 877 78 (7.3.) 78 SB
X531 877 448 (Keyboard Commands) 448 SB
X1873 877 52 (21) 52 SB
X419 941 78 (7.4.) 78 SB
X531 941 426 (PC Statistics Display) 426 SB
X1873 941 52 (22) 52 SB
X419 1005 78 (7.5.) 78 SB
X531 1005 825 (Configuring Waterloo TCP for NeTraMet) 825 SB
X1873 1005 52 (23) 52 SB
X419 1069 78 (7.6.) 78 SB
X531 1069 599 (Sample AUTOEXEC.BAT file) 599 SB
X1873 1069 52 (23) 52 SB
X419 1133 78 (7.7.) 78 SB
X531 1133 1209 (Differences between PC and SunOS versions of NeTraMet) 1209 SB
X1873 1133 52 (23) 52 SB
Xgs 1907 79 233 1187 CB
X330 1212 39 (8.) 39 SB
Xgr
Xgs 1907 79 233 1187 CB
X405 1212 449 (NeTraMet Distribution) 449 SB
Xgr
Xgs 1907 79 233 1187 CB
X1873 1212 52 (24) 52 SB
Xgr
X419 1276 78 (8.1.) 78 SB
X531 1276 441 (CopyRight Statement) 441 SB
X1873 1276 52 (24) 52 SB
X419 1340 78 (8.2.) 78 SB
X531 1340 344 (DIstribution Files) 344 SB
X1873 1340 52 (24) 52 SB
Xgs 1936 316 233 1394 CB
X330 1419 39 (9.) 39 SB
Xgr
Xgs 1936 316 233 1394 CB
X405 1419 222 (Installation) 222 SB
Xgr
Xgs 1936 316 233 1394 CB
X1873 1419 52 (24) 52 SB
Xgr
Xgs 1936 316 233 1394 CB
X330 1498 65 (10.) 65 SB
Xgr
Xgs 1936 316 233 1394 CB
X419 1498 384 (NeTraMet's Future) 384 SB
Xgr
Xgs 1936 316 233 1394 CB
X1873 1498 52 (25) 52 SB
Xgr
Xgs 1936 316 233 1394 CB
X330 1577 65 (11.) 65 SB
Xgr
Xgs 1936 316 233 1394 CB
X419 1577 376 (Acknowledgments) 376 SB
Xgr
Xgs 1936 316 233 1394 CB
X1873 1577 52 (26) 52 SB
Xgr
Xgs 1936 316 233 1394 CB
X330 1656 65 (11.) 65 SB
Xgr
Xgs 1936 316 233 1394 CB
X419 1656 237 (References) 237 SB
Xgr
Xgs 1936 316 233 1394 CB
X1873 1656 52 (26) 52 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2683 1839 (Nevil Brownlee is the Deputy Director of the University of Auckland Computer Centre, and) 1839 SB
X271 2737 1847 (is responsible for support and development of the University's campus network, which has) 1847 SB
X271 2791 1820 (about 2,500 connected hosts. He is closely involved with Tuia, New Zealand's Research) 1820 SB
X271 2845 1747 (and Education network, co-ordinates Kawaihiko, the New Zealand Universities' group) 1747 SB
X271 2899 1795 (within Tuia, and is active within the IETF, especially on the Internet Accounting Working) 1795 SB
X271 2953 1181 (Group. He holds a Ph.D. degree in Atmospheric Physics.) 1181 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1106 3265 43 (-- ) 43 SB
X1149 3265 30 (iii) 30 SB
X1179 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X0 0 0 fC


Xgs 323 3426 0 0 CB

X271 339 48 (1.) 48 SB
Xgr
X360 339 16 (I) 18 SB
X378 339 35 (n) 37 SB
X415 339 19 (t) 21 SB
X436 339 23 (r) 25 SB
X461 339 35 (o) 37 SB
X498 339 35 (d) 37 SB
X535 339 35 (u) 37 SB
X572 339 32 (c) 34 SB
X606 339 19 (t) 21 SB
X627 339 16 (i) 18 SB
X645 339 35 (o) 37 SB
X682 339 35 (n) 37 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 431 1763 (NeTraMet is a meter for network traffic flows \(see below for definitions\), and is the first) 1763 SB
X271 485 1628 (implementation of the Internet Accounting Working Group's Internet Accounting) 1628 SB
X271 539 1780 (Architecture. This is outlined in RFC 1272, "Internet Accounting Background," and has) 1780 SB
X271 593 385 (three components:) 385 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 669 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 672 1424 (meters, i.e, small hosts which are attached to a network segment and) 1424 SB
X389 726 823 (measure traffic flowing on that segment;) 823 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 802 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 805 1020 (collectors, which retrieve information from meters;) 1020 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 881 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 884 1564 (managers, which instruct meters as to which flows they should measure and) 1564 SB
X389 938 1468 (collectors as to which meters they should collect from, at what intervals.) 1468 SB
X271 1017 1758 (A collector can collect flow data from many meters, and each meter may have its data) 1758 SB
X271 1071 1821 (retrieved by several collectors. Traffic flows of interest are defined by user-specified sets) 1821 SB
X271 1125 165 (of rules.) 165 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1212 84 (1.1.) 84 SB
X413 1212 587 (Operating Environments) 587 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1295 1781 (This release of NeTraMet runs on a SunOS host, using NIT to observe ethernet packet) 1781 SB
X271 1349 1783 (headers, or on a PC using a CRYNWYR packet driver. The PC implementation can be) 1783 SB
X271 1403 1794 (used with a 10 MHz 286 machine, on which it can handle a steady packet load of about) 1794 SB
X271 1457 1724 (750 packets per second. On a 25 MHz 386SX it will handle about 1250 packets per) 1724 SB
X271 1511 1839 (second. NeTraMet can cope with peak traffic bursts of up to 2250 packets per second for) 1839 SB
X271 1565 539 (several seconds at a time.) 539 SB
X271 1644 1803 (This release also includes NeMaC \(NeTraMet Manager/Collector\), a combined manager) 1803 SB
X271 1698 1802 (and collector program. It runs on Unix systems, and Make files are included for SunOS) 1802 SB
X271 1752 347 (and Irix systems.) 347 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1839 84 (1.2.) 84 SB
X413 1839 311 (Traffic Flows) 311 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1922 1854 (A traffic flow is a stream of packets exchanged between two network hosts, which we refer) 1854 SB
X271 1976 1829 (to as the flow's source and destination. Flows are bi-directional in that packets and bytes) 1829 SB
X271 2030 1674 (can be counted in the 'to' \(source to destination\) and 'from' \(destination to source\)) 1674 SB
X271 2084 211 (directions.) 211 SB
X271 2163 1808 (The 'identity' of a flow is determined by the address attributes of its two hosts, and these) 1808 SB
X271 2217 649 (attributes can be of three kinds:) 649 SB
X389 2296 176 (adjacent) 176 SB
X626 2296 212 (\(link layer\)) 212 SB
X389 2350 93 (peer) 93 SB
X626 2350 305 (\(network layer\)) 305 SB
X389 2404 111 (detail) 111 SB
X626 2404 326 (\(transport layer\)) 326 SB
X271 2483 1190 (Since NeTraMet is \(so far\) only implemented on ethernet, ) 1190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1461 2483 403 (adjacent addresses) 403 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1864 2483 251 ( can only be) 251 SB
X271 2537 411 (ethernet addresses.) 411 SB
X271 2616 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2616 271 (peer address) 271 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X586 2616 1423 ( can be an IP address, a DECnet phase IV address, a Novell network) 1423 SB
X271 2670 1802 (number or an EtherTalk address, these being the four protocols currently understood by) 1802 SB
X271 2724 218 (NeTraMet.) 218 SB
X271 2803 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2803 289 (detail address) 289 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X604 2803 1476 ( contains specifications for details within the peer protocol. For IP these) 1476 SB
X271 2857 1828 (are the protocol type and source and destination port numbers, and similar kinds of detail) 1828 SB
X271 2911 711 (are defined for the other protocols.) 711 SB
X271 2990 1811 (Within the meter a flow is implemented as a data structure containing the attributes of its) 1811 SB
X271 3044 1681 (source and destination, its packet and byte counters, the times it was first and last) 1681 SB
X271 3098 1206 (observed, and other information used for control purposes.) 1206 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (1) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1672 (The meter could simply create flows for every possible combination of source and) 1672 SB
X271 310 1814 (destination attributes it observes, but this would quickly exhaust its memory. Instead the) 1814 SB
X271 364 1732 (meter uses a set of rules to decide which flows are of interest, and other packets are) 1732 SB
X271 418 168 (ignored.) 168 SB
X271 497 1799 (Each rule tests one attribute of a flow, using a mask to specify which bits are of interest.) 1799 SB
X271 551 1792 (In this way a tree of rules can be built up to classify packets into flows; each packet can) 1792 SB
X271 605 1723 (then be 'counted' in its appropriate flow. If this is all that the rules specify, no further) 1723 SB
X271 659 1030 (information about the flow is retained in the meter.) 1030 SB
X271 738 1783 (If more detail is required, the rules can instruct the meter to 'tally' the packet, i.e, create) 1783 SB
X271 792 1826 (many sub-flows instead of a single flow. For example they might determine that a packet) 1826 SB
X271 846 1840 (has come from a class B IP source, then tally it into flows for each of the source network's) 1840 SB
X271 900 1859 (class C subnets. Sub-flow details are specified by a set of attribute masks, which make up) 1859 SB
X271 954 39 (a ) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X310 954 232 (tally action.) 232 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1033 1825 (It is also possible to combine several flows together in the meter. Each of the flows to be) 1825 SB
X271 1087 573 (combined will then have an ) 573 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X844 1087 347 (aggregate action) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1191 1087 934 ( which specifies all the attribute values for the) 934 SB
X271 1141 318 (aggregate flow.) 318 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1228 84 (1.3.) 84 SB
X413 1228 1055 (The Internet Accounting Meter Services MIB) 1055 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1311 1682 (The Internet Accounting Group produced an Internet Draft describing its proposed) 1682 SB
X271 1365 1693 (Accounting Meter Services MIB, which was assigned the number Experimental.99.) 1693 SB
X271 1444 1757 (The draft was discussed over several IETF meetings until the Working Group became) 1757 SB
X271 1498 1808 (dormant in March 1993, and informally at meetings and via the Group's mailing list since) 1808 SB
X271 1552 1787 (then. A copy of the current version - which NeTraMet implements - is included with this) 1787 SB
X271 1606 1557 (release. It defines all of the MIB variables mentioned in this documentation.) 1557 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
Xgs 323 3426 0 0 CB

X271 1743 48 (2.) 48 SB
Xgr
X360 1743 16 (I) 18 SB
X378 1743 52 (m) 54 SB
X432 1743 35 (p) 37 SB
X469 1743 16 (l) 18 SB
X487 1743 32 (e) 34 SB
X521 1743 52 (m) 54 SB
X575 1743 32 (e) 34 SB
X609 1743 35 (n) 37 SB
X646 1743 19 (t) 21 SB
X667 1743 32 (a) 34 SB
X701 1743 19 (t) 21 SB
X722 1743 16 (i) 18 SB
X740 1743 35 (o) 37 SB
X777 1743 35 (n) 37 SB
X814 1743 16 ( ) 18 SB
X832 1743 42 (D) 44 SB
X876 1743 32 (e) 34 SB
X910 1743 19 (t) 21 SB
X931 1743 32 (a) 34 SB
X965 1743 16 (i) 18 SB
X983 1743 16 (l) 18 SB
X1001 1743 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1843 84 (2.1.) 84 SB
Xgr
X413 1843 856 (Program Development Environment) 856 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1926 1687 (NeTraMet was developed on a PC using Borland's Turbo C, Turbo Assembler and) 1687 SB
X271 1980 1841 (interactive development environment. Turbo Make was used to organise the system, with) 1841 SB
X271 2034 1451 (Make files specifying how the various system components are created.) 1451 SB
X271 2113 1836 (Waterloo C provided a good PC implementation of TCP/IP, and was used to provide UDP) 1836 SB
X271 2167 1812 (transport for SNMP packets. Waterloo C interfaces with ethernet via a CRYNWR packet) 1812 SB
X271 2221 1835 (driver. I extended the packet interface to support monitoring by running the ethernet card) 1835 SB
X271 2275 1475 (in promiscuous mode and copying packet headers into a rotating buffer.) 1475 SB
X271 2354 1745 (An early version of CMU SNMP was used for communication between NeTraMet and) 1745 SB
X271 2408 1656 (NeMaC. This was ported to the PC, and extended to support SET operations on) 1656 SB
X271 2462 809 (character and \(16-bit\) integer variables.) 809 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2549 84 (2.2.) 84 SB
Xgr
X413 2549 1106 (Data Structures: Flow, Rule and Action Tables) 1106 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2632 1850 (Host addresses \(adjacent, peer and detail\) and their masks are held in a structure called a) 1850 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2686 85 (key.) 85 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X356 2686 1599 ( A flow is a larger structure which contains two keys, one each for source and) 1599 SB
X271 2740 1789 (destination host. General attributes are stored as variables within a flow, and there is a) 1789 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2794 69 (link) 69 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X340 2794 1711 ( field to enable flows to be linked together. Space for flows is allocated dynamically) 1711 SB
X271 2848 1751 (from a pool of flows. The flow table is implemented as an array of pointers to flows; a) 1751 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2902 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X482 2902 539 ( is an index into this array.) 539 SB
X271 2981 1745 (Rules are implemented in a smaller structure. Space for a rule table is allocated as a) 1745 SB
X271 3035 486 (single block of memory.) 486 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (2) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1853 (Actions are stored in a flow structure, since they have exactly the same set of components) 1853 SB
X271 310 1227 (as a flow. An action table is an array of pointers to actions.) 1227 SB
X271 389 1632 (The first time a flow is observed the meter allocates space for it and assigns it a) 1632 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 250 (FlowIndex. ) 250 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X521 443 1566 (The addresses of count and tally flows are held in the rule and action tables.) 1566 SB
X271 497 1800 (Tallies are implemented as hash tables; a hash table's address is held in its action table) 1800 SB
X271 551 116 (entry.) 116 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 638 84 (2.3.) 84 SB
Xgr
X413 638 662 (Meter Memory Management) 662 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 721 1829 (Once a flow has been created it could continue to exist indefinitely. In time, however, the) 1829 SB
X271 775 1772 (meter will run out of space for new flows. To deal with this problem NeTraMet uses an) 1772 SB
X271 829 621 (incremental garbage collector.) 621 SB
X271 908 735 (At regular intervals specified by the ) 735 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X1006 908 510 (GarbagecCollectInterval ) 510 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1516 908 609 (variable the garbage collector) 609 SB
X271 962 1815 (procedure is invoked. This searches through the flow table looking for flows which might) 1815 SB
X271 1016 1805 (be recovered. To control the resources consumed by garbage collection there are limits) 1805 SB
X271 1070 1858 (on the number of in-use and idle flows which the garbage collector may inspect - these are) 1858 SB
X271 1124 1410 (the parameters described in the 'PC Statistics display' section below.) 1410 SB
X271 1203 1794 (To decide whether a flow can be recovered, the garbage collector considers how long it) 1794 SB
X271 1257 1828 (has been inactive \(no packets in either direction\), and when its data was last collected. If) 1828 SB
X271 1311 894 (it has been collected at least once since its ) 894 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1165 1311 203 (LastTime,) 203 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1368 1311 749 ( it may be recovered. This alogrithm) 749 SB
X271 1365 796 (is implemented using a variable called ) 796 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1067 1365 437 (GarbageCollectTime,) 437 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1504 1365 582 ( which normally contains the) 582 SB
X271 1419 163 (meter's ) 163 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X434 1419 161 (UpTime) 161 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X595 1419 901 ( when the collection before last was started.) 901 SB
X271 1498 1740 (Should flows not be collected often enough the meter could run out of space. This is) 1740 SB
X271 1552 1801 (prevented by having a low-priority background process check the percentage of flows in) 1801 SB
X271 1606 581 (use and compare it with the ) 581 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X852 1606 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1172 1606 917 ( variable. If the percentage of flows in use is) 917 SB
X271 1660 699 (greater than the high-water mark, ) 699 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X970 1660 424 (GarbageCollectTime) 424 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1394 1660 735 ( is incremented by the current value) 735 SB
X271 1714 130 (of the ) 130 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X401 1714 347 (InactivityTimeout) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X748 1714 1344 ( variable. The effect of this is that if a collector fails NeTraMet will) 1344 SB
X271 1768 599 (continue to create flows until ) 599 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X870 1768 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1190 1768 930 ( is exceeded, then recover the oldest flows to) 930 SB
X271 1822 656 (maintain sufficient free memory.) 656 SB
X271 1901 1832 (The MIB specifies that a meter should generate an SNMP trap if flow data is lost; this has) 1832 SB
X271 1955 1822 (not yet been implemented. The values of the memory management variables mentioned) 1822 SB
X271 2009 1750 (above can be set by NeMaC - it should be possible to tune them to work effectively in) 1750 SB
X271 2063 332 (nearly all cases.) 332 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

Xgs 355 3426 0 0 CB

X271 2150 84 (2.4.) 84 SB
Xgr
X413 2150 622 (Optimising the Rule Table) 622 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2233 1836 (Rules are commonly tested in sequence until a successful match selects a new index into) 1836 SB
X271 2287 1711 (the rule table. Testing a packet against a long list of addresses is thus a sequential) 1711 SB
X271 2341 1783 (search, which would be slow. To improve rule testing performance NeTraMet performs) 1783 SB
X271 2395 1819 (flow analysis of a new rule table, looking for groups of rules which test the same attribute) 1819 SB
X271 2449 1807 (using the same mask. Groups which have more than four rules are organised into small) 1807 SB
X271 2503 1683 (hash tables - these can effectively be tested with a hash computation and a single) 1683 SB
X271 2557 193 (compare.) 193 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2644 84 (2.5.) 84 SB
Xgr
X413 2644 577 (The Meter's Outer Block) 577 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2727 1814 (MeTraMet's outer block is a single loop which implements four asynchronous processes.) 1814 SB
X271 2781 826 (These are - in decreasing priority order -) 826 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB
X271 2861 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 2860 484 (Handle SNMP requests) 484 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X829 2860 924 (. Process these and send SNMP responses.) 924 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB
X271 2940 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 2939 511 (Monitor ethernet packets) 511 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X856 2939 1112 ( \(including NeTraMet SNMP requests and responses\).) 1112 SB
X345 2993 1243 (Test each against the current rule set and count as required.) 1243 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (3) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 42 42 0 0 0 42 /Symbol font
X0 0 0 fC
Xgs 290 3426 0 0 CB
X271 257 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 256 603 (Handle keyboard commands.) 603 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X948 256 893 ( Test the keyboard once each second, and) 893 SB
X345 310 695 (process any incoming keystrokes.) 695 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB
X271 390 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 389 450 (Memory Management) 450 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X795 389 1039 (. Attempt to recover memory, as described above.) 1039 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 443 474 (GarbageCollectInterval) 474 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X819 443 730 ( is set to 5 seconds by default, and ) 730 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1549 443 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1869 443 46 ( is) 46 SB
X345 497 517 (tested every 30 seconds.) 517 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 584 84 (2.6.) 84 SB
Xgr
X413 584 463 (Matching the Rules) 463 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 667 1772 (When a packet arrives at the meter two key data structures are built, one for its source) 1772 SB
X271 721 1789 (and one for its destination. An attempt is made to match the packet against the current) 1789 SB
X271 775 1858 (rule set with the keys in source-to-destination order; if this succeeds the packet is counted.) 1858 SB
X271 854 1758 (If the match fails, the keys are interchanged and the packet is tested against the rules) 1758 SB
X271 908 804 (again. If it fails this time it is discarded.) 804 SB
X271 987 1837 (A third possibility is that the packet matched a tally rule, but its flow was not yet present in) 1837 SB
X271 1041 1767 (the tally. Since it might already have been seen travelling in the opposite direction the) 1767 SB
X271 1095 1842 (match is retried with the keys interchanged. If this fails the flow is added into the tally with) 1842 SB
X271 1149 783 (its keys in source-to-destination order.) 783 SB
X271 1228 1738 (This algorithm means that you can use symmetrical tallies, i.e. tallies having identical) 1738 SB
X271 1282 1852 (masks in both directions, if you don't care about flow direction. Alternatively you may write) 1852 SB
X271 1336 1833 (rules which enforce a particular source-to-destination order. Examples of these are given) 1833 SB
X271 1390 817 (in the section on writing rule files below.) 817 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1477 84 (2.7.) 84 SB
Xgr
X413 1477 878 (SNMP: Getting and Setting Variables) 878 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1560 1589 (The code for getting and setting SNMP variables was developed from CMU's ) 1589 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1860 1560 236 (snmpvars.c) 236 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1614 1714 (file. I have modified this to use a binary search to find object identifiers as required,) 1714 SB
X271 1668 719 (replacing the original linear search.) 719 SB
X271 1747 1765 (Simple procedures for setting character, \(16-bit\) integer and \(32-bit\) long variables are) 1765 SB
X271 1801 1460 (used when no special action is required. Special actions, e.g. updating) 1460 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1855 424 (GarbageCollectTime) 424 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X695 1855 215 ( when the ) 215 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X910 1855 331 (LastCollectTime) 331 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1241 1855 729 ( variable is set, are implemented as) 729 SB
X271 1909 451 (individual procedures.) 451 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1996 84 (2.8.) 84 SB
Xgr
X413 1996 678 (Creation and Activity Tables) 678 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2079 1590 (A rather unusual requirement for the accounting meter is the ability to support) 1590 SB
X271 2133 1842 (asynchronous collection of flow data by many meters simultaneously. This is described in) 1842 SB
X271 2187 1859 (the MIB by the Creation and Activity tables, which provide a collector with windows into the) 1859 SB
X271 2241 1805 (flow table, allowing it to inspect only those flows created or active since a specified time.) 1805 SB
X271 2295 1789 (This time is passed to the meter as one component of an object identifier; you can view) 1789 SB
X271 2349 1837 (this as a parameter being passed to the GET procedure which implements the creation or) 1837 SB
X271 2403 268 (activity table.) 268 SB
X271 2482 1808 (Another aspect of having multiple collectors is that one of them may collect performance) 1808 SB
X271 2536 1700 (statistics. One possibility would be to have one meter collecting flow data every 15) 1700 SB
X271 2590 1739 (minutes, a second collecting flow data every hour, and a third collecting performance) 1739 SB
X271 2644 853 (statistics \(but not flow data\) every minute.) 853 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2731 84 (2.9.) 84 SB
Xgr
END_OF_FILE
if test 48198 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.A'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(191941 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 191941 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi
# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.A'
fi
if test -f 'netramet/sg/apps/snmpnetstat/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sg/apps/snmpnetstat/Makefile'\"
else
echo shar: Extracting \"'netramet/sg/apps/snmpnetstat/Makefile'\" \(1593 characters\)
sed "s/^X//" >'netramet/sg/apps/snmpnetstat/Makefile' <<'END_OF_FILE'
X# Modified by Nevil Brownlee, Auckland University
X# Silicon Graphics version
X#
X#
X# Copyright (c) 1987 Regents of the University of California.
X# All rights reserved.
X#
X# Redistribution and use in source and binary forms are permitted
X# provided that the above copyright notice and this paragraph are
X# duplicated in all such forms and that any documentation,
X# advertising materials, and other materials related to such
X# distribution and use acknowledge that the software was developed
X# by the University of California, Berkeley. The name of the
X# University may not be used to endorse or promote products derived
X# from this software without specific prior written permission.
X# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X#
X# @(#)Makefile 5.10 (Berkeley) 9/20/88
X#
XSINCLUDE= ../../../src/snmplib/include
X
X#CFLAGS= -g -I$(SINCLUDE) -cckr -D_BSD_SIGNALS -D_BSD_COMPAT
XCFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT
X
XLIBS= ../../snmplib/libsnmp.a
X
XSRC= ../../../src/apps/snmpnetstat
X
XSRCS= ${SRC}/inet.c ${SRC}/if.c ${SRC}/main.c ${SRC}/route.c
XOBJS= ${SRC}/inet.o ${SRC}/if.o ${SRC}/main.o ${SRC}/route.o
X
Xall: snmpnetstat
X
Xsnmpnetstat: ${SRCS} ${LIBS}
X ${CC} -o $@ ${CFLAGS} ${SRCS} ${LIBS}
X
Xclean:
X rm -f ${OBJS} core snmpnetstat
X
Xcleandir: clean
X rm -f ${MAN} tags .depend
X
Xdepend: ${SRCS}
X mkdep ${CFLAGS} ${SRCS}
X
Xlint: ${SRCS}
X lint ${CFLAGS} ${SRCS}
X
Xtags: ${SRCS}
X ctags ${SRCS}
X
Xinstall:
X cp snmpnetstat ../../bin
X
END_OF_FILE
if test 1593 -ne `wc -c <'netramet/sg/apps/snmpnetstat/Makefile'`; then
echo shar: \"'netramet/sg/apps/snmpnetstat/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sg/apps/snmpnetstat/Makefile'
fi
if test -f 'netramet/src/meter/meter_ux.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/meter_ux.c'\"
else
echo shar: Extracting \"'netramet/src/meter/meter_ux.c'\" \(11571 characters\)
sed "s/^X//" >'netramet/src/meter/meter_ux.c' <<'END_OF_FILE'
X/* 1712, Wed 5 Oct 93
X
X SNMPD.C: The AU Internet Accouting Meter mainline;

X#define noUX_TESTING
X
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <sys/socket.h>
X#include <arpa/inet.h>
X
X#include <stdio.h>
X#include <errno.h>
X#include <string.h>
X
X#include <sys/types.h>
X#include <sys/time.h>
X#include <sys/timeb.h>
X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X


X#define PKTSNAP
X#include "pktsnap.h"
X#include "flowhash.h"
X
X#define APPLETALK
X
Xextern char version_descr[]; /* In met_vars.c */
Xextern char *communities[]; /* In snmp/snmpagnt.c */
X

X#include <sys/time.h>
X#include <stropts.h>
X#include <fcntl.h>
X
X#include <net/if.h>
X#include <net/nit_if.h>
X#include <net/nit_pf.h>
X#include <net/nit_buf.h>
X
X#define NIT_DEV "/dev/nit"
Xchar *device = "le0";
X
Xint initdevice(if_flags, snaplen, chunksize)
Xu_long if_flags,
X snaplen,
X chunksize;
X{
X int nit_fd;
X struct strioctl si;
X struct ifreq ifr;
X struct timeval timeout;
X
X nit_fd = open(NIT_DEV, O_RDONLY);
X
X /* Arrange to get discrete messages from the stream. */
X ioctl(nit_fd, I_SRDOPT, (char *)RMSGD);
X
X si.ic_timout = INFTIM;
X
X /* and configure the buffering module. */
X ioctl(nit_fd, I_PUSH, "nbuf");
X
X timeout.tv_sec = 0;
X timeout.tv_usec = 250000L; /* 0.25 sec */
X si.ic_cmd = NIOCSTIME;
X si.ic_len = sizeof timeout;
X si.ic_dp = (char *)&timeout;
X ioctl(nit_fd, I_STR, (char *)&si);
X
X si.ic_cmd = NIOCSCHUNK;
X si.ic_len = sizeof chunksize;
X si.ic_dp = (char *)&chunksize;
X
X ioctl(nit_fd, I_STR, (char *)&si);
X
X /* Configure the nit device, binding it to the proper
X underlying interface, setting the snapshot length,
X and setting nit_if-level flags. */
X
X strcpy(ifr.ifr_name, device);
X si.ic_cmd = NIOCBIND;
X si.ic_len = sizeof ifr;
X si.ic_dp = (char *)&ifr;
X ioctl(nit_fd, I_STR, (char *)&si);
X
X if (snaplen > 0) {
X si.ic_cmd = NIOCSSNAP;
X si.ic_len = sizeof snaplen;
X si.ic_dp = (char *)&snaplen;
X ioctl(nit_fd, I_STR, (char *)&si);
X }
X
X if (if_flags != 0) {
X si.ic_cmd = NIOCSFLAGS;
X si.ic_len = sizeof if_flags;
X si.ic_dp = (char *)&if_flags;
X ioctl(nit_fd, I_STR, (char *)&si);
X }
X
X /* Flush the read queue, to get rid of anything that accumulated
X before the device reached its final configuration. */
X
X if (ioctl(nit_fd, I_FLUSH, (char *)FLUSHR) < 0) {
X close(nit_fd);
X printf("FLUSH failed\n");
X exit(1);
X }
X return nit_fd;
X }
X
X#define CHUNKSIZE 70000
X
Xint init_nit()
X{
X return initdevice(NI_PROMISC | NI_LEN | NI_DROPS, SNAPTO+1, CHUNKSIZE);
X }
X
Xunsigned char buf[CHUNKSIZE];
X
Xvoid nit_read(nit_fd)
Xint nit_fd;
X{
X int cc;
X u_char *bp,*bufstop;
X register struct pt_entry *ptep;
X
X cc = read(nit_fd, buf, CHUNKSIZE);
X bp = buf;
X bufstop = buf+cc;
X while (bp < bufstop) {
X register u_char *cp = bp;
X struct nit_bufhdr *hdrp;
X struct nit_iflen *nlp;
X struct nit_ifdrops *drp;
X unsigned char pkt_type;
X unsigned int pktlen, b12_13;
X
X ++npackets;
X hdrp = (struct nit_bufhdr *)cp; cp += sizeof *hdrp;
X drp = (struct nit_ifdrops *)cp; cp += sizeof *drp;
X lostpackets += drp->nh_drops;
X nlp = (struct nit_iflen *)cp; cp += sizeof *nlp;
X pktlen = nlp->nh_pktlen;
X bp += hdrp->nhb_totlen;
X
X /* Process the packet */
X
X b12_13 = cp[12]<<8 | cp[13];
X if (b12_13 == 0x0800) pkt_type = AT_IP;
X else if (b12_13 <= MAXPKTLEN) { /* 802.2 packet */
X if (cp[14] == 0xFF && cp[15] == 0xFF) pkt_type = AT_NOVELL;
X#ifdef APPLETALK
X else if (cp[14] == 0xAA && cp[15] == 0xAA) { /* SNAP */
X if (cp[20] == 0x80 && cp[21] == 0x9B) pkt_type = AT_ETHERTALK;
X else continue; /* Ignore other SNAP packets */
X }
X#endif
X else continue; /* Ignore other 802.2 packets */
X }
X else if (b12_13 == 0x6003) pkt_type = AT_DECNET;
X else continue; /* Ignore other Blue Book packets */
X
X pkt_monitor(&cp[SNAPFROM], pktlen, pkt_type);
X }
X }
X
Xtime_t accounting_start_time; /* Seconds since start of Unix epoch */
X
Xunsigned long uptime(void) /* SNMP time */
X{
X return (time(NULL)-accounting_start_time)*100; /* centiseconds */


X }
X
Xvoid show_meter_time()
X{

X char msg[60], *ts;
X ts = ctime(&accounting_start_time);
X sprintf(msg,"%lu seconds since %c%c%c%c:%c%c",
X time(NULL)-accounting_start_time,


X ts[11],ts[12],ts[14],ts[15], ts[17],ts[18]);

X display_msg(0,msg);
X }


X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

Xvoid main(argc, argv)
X int argc;
X char *argv[];
X{

X int arg,c, sd;
X char *ap;
X struct sockaddr_in me;
X int nit_fd;
X
X printf("%s\n",version_descr);


X display_enabled = kb_enabled = 1; /* Enabled by default */
X mxflowsp1 = DFMXFLOWS+1;

X accounting_start_time = time(NULL) - 2; /* So flows have CreateTime > 1 */


X /* Default (CMU) communities are: 0 = "public", 1 = "proxy",
X 2 = "private", 3 = "regional", 4 = "core"
X We only allow "public" and "private" by default */
X communities[1] = communities[3] = communities[4] = "";
X for (c = 0, arg = 1; arg < argc; ++arg) {
X if (argv[arg][0] == '-') {
X switch (argv[arg][1]) {
X case 'd':
X snmp_dump_packet++;
X break;
X case 'f':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X mxflowsp1 = atoi(ap)+1;
X break;
X case 'k':
X kb_enabled = 0; /* -k to disable keyboard */
X break;

X case 'r':
X for (;;) {
X if (c == 5) {
X printf("Max of 4 read communities allowed\n");
X exit(0);
X }
X communities[c++] = argv[++arg];
X if (c == 2) ++c; /* 2 -> "private" */
X if (arg == argc-1 || argv[arg+1][0] == '-') break;
X }
X break;
X case 's':
X display_enabled = 0; /* -s to disable screen */
X break;
X case 'w':
X communities[2] = argv[++arg]; /* -w to set write community */
X break;
X default:
X printf("Invalid option: -%c\n", argv[arg][1]);
X exit(0);
X }
X }
X }

X /* Set up connections */
X sd = socket(AF_INET, SOCK_DGRAM, 0);
X if (sd < 0){
X perror("socket");
X exit(1);
X }
X me.sin_family = AF_INET;
X me.sin_addr.s_addr = INADDR_ANY;
X me.sin_port = htons(SNMP_PORT);
X if (bind(sd, (struct sockaddr *)&me, sizeof(me)) != 0){
X perror("bind");
X exit(2);
X }
X init_monitor();
X init_snmp();
X nit_fd = init_nit();
X receive(sd,nit_fd);
X}
X
X#define TICKS_PER_S 4 /* 0.25s timeout on NIT -> 4 ticks per second */
X#define BKG_INTERVAL 30 /* Seconds */
X
Xvoid zero_pkt_stats()
X{
X kilodummypackets = npackets = lostpackets = stats_time = spackets = 0L;
X max_pkt_rate = 0;


X clear_pkt_stats = 0;
X }
X

Xreceive(sd,nit_fd)
X int sd,nit_fd;
X{
X fd_set fdset;
X char kb_buf[25];
X int ch, count, onesi, gci;
X /* initdevice() sets the nit timeout to 0.25 seconds */
X /* If the ethernet is very busy, we'll garbage collect more often */
X unsigned char p;
X unsigned long pd;
X
X onesi = TICKS_PER_S; bkgi = BKG_INTERVAL*TICKS_PER_S;
X zero_pkt_stats();
X for (;;) {
X FD_ZERO(&fdset);
X FD_SET(sd, &fdset);
X FD_SET(nit_fd, &fdset);
X if (kb_enabled) FD_SET(0, &fdset); /* stdin */
X count = select(FD_SETSIZE, &fdset, 0, 0, 0);
X if (count > 0) {
X if (FD_ISSET(sd, &fdset))
X snmp_read(sd);
X if (FD_ISSET(nit_fd, &fdset)) {


X s_uptime = uptime(); /* Don't do this too often! */

X nit_read(nit_fd);
X if (--onesi == 0) { /* One-second process .. */


X if (clear_pkt_stats) zero_pkt_stats();
X else {
X ++stats_time;

X pd = npackets-spackets;


X if (pd > max_pkt_rate) max_pkt_rate = pd;

X spackets = npackets;
X }


X if (--gci == 0) {
X garbage_collect();
X gci = gc_interval;
X }
X if (--bkgi == 0) {
X p = (unsigned long)nflows*100/(mxflowsp1-1);
X if (p > HighWaterMark) { /* % flows in use */
X pd = s_uptime-InactivityTimeout;
X GarbageCollectTime += InactivityTimeout;
X if (GarbageCollectTime > pd) GarbageCollectTime = pd;
X }

X bkgi = BKG_INTERVAL*TICKS_PER_S;
X }
X onesi = TICKS_PER_S;
X }
X }
X if (FD_ISSET(0, &fdset)) { /* stdin */
X fgets(kb_buf, sizeof kb_buf, stdin);
X if ((ch = kb_buf[0]) == 27) { /* ESC */
X display_msg(1,"Shutting down");
X exit(0);
X }
X switch (tolower(ch)) {
X case 'v':
X printf("\n%s\n",version_descr);


X break;
X default:
X handle_kb(ch);
X break;
X }
X }
X }

X else switch (count) {
X case 0:


X break;
X case -1:

X if (errno == EINTR) continue;
X else perror("select");
X return -1;


X default:
X printf("select returned %d\n", count);

X return -1;
X }


X }
X }
X
Xunsigned long snmp_peer_addr;
X

Xsnmp_read(sd)
X int sd;
X{
X struct sockaddr_in from;
X int length, out_length, fromlength;


X u_char packet[1500], outpacket[1500];

X char snmp_peer_name[50]; /* Name of host which sent the snmp request */
X
X fromlength = sizeof from;
X length = recvfrom(sd, packet, 1500, 0, (struct sockaddr *)&from, &fromlength);
X snmp_peer_addr = from.sin_addr.s_addr;
X strcpy(snmp_peer_name,inet_ntoa(from.sin_addr));
X if (length == -1)
X perror("recvfrom");
X if (snmp_dump_packet){
X int count;
X
X printf("recieved %d bytes from %s:\n", length, snmp_peer_name);
X for(count = 0; count < length; count++){


X printf("%02X ", packet[count]);
X if ((count % 16) == 15)

X printf("\n");


X }
X printf("\n\n");
X }
X out_length = 1500;

X if (snmp_agent_parse(packet, length, outpacket, &out_length, from.sin_addr)){
X if (snmp_dump_packet){
X int count;
X


X printf("sent %d bytes to %s:\n", out_length, snmp_peer_name);

X for(count = 0; count < out_length; count++){


X printf("%02X ", outpacket[count]);
X if ((count % 16) == 15)

X printf("\n");


X }
X printf("\n\n");
X }

X if (sendto(sd, (char *)outpacket, out_length, 0, (struct sockaddr *)&from,
X sizeof(from)) < 0){
X perror("sendto");
X return 0;
X }
X
X }
X
X}
X
END_OF_FILE
if test 11571 -ne `wc -c <'netramet/src/meter/meter_ux.c'`; then
echo shar: \"'netramet/src/meter/meter_ux.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/meter_ux.c'
fi
echo shar: End of archive 10 \(of 25\).
cp /dev/null ark10isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:11:16 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 99
Archive-name: netramet/part11
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/apps/snmp_vars.c
# netramet/src/manager/include/nmc.h
# netramet/src/meter/include/decnet.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:07 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 11 (of 25)."'
if test -f 'netramet/src/apps/snmp_vars.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmp_vars.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmp_vars.c'\" \(46913 characters\)
sed "s/^X//" >'netramet/src/apps/snmp_vars.c' <<'END_OF_FILE'
X/*
X * snmp_vars.c - return a pointer to the named variable.
X *


X *
X */
X/***********************************************************

X Copyright 1988, 1989, 1990 by Carnegie Mellon University
X Copyright 1989 TGV, Incorporated


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU and TGV not be used
Xin advertising or publicity pertaining to distribution of the software
Xwithout specific, written prior permission.
X
XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
XPERFORMANCE OF THIS SOFTWARE.
X******************************************************************/
X
X#define USE_NAME_AS_DESCRIPTION /*"se0" instead of text */
X#define GATEWAY /* MultiNet is always configured this way! */
X#include <sys/types.h>
X#include <sys/socket.h>
X/* #include <sys/time.h> */
X#include <sys/param.h>
X#include <sys/dir.h>
X/* #include <sys/user.h> /* Inconsistencies in this file! */
X/* #include <sys/proc.h> /* Inconsistencies in this file! */
X/* #include <machine/pte.h> /* Not in Irix */
X/* #include <sys/vm.h> /* Not in Irix */
X#include <netinet/in.h>
X#include <syslog.h>
X#include <sys/ioctl.h>


X#include <net/if.h>
X#include <net/route.h>
X#include <netinet/in_pcb.h>
X#include <netinet/if_ether.h>
X#include <netinet/in_systm.h>
X#include <netinet/in_var.h>
X#include <netinet/ip.h>
X#include <netinet/ip_var.h>
X#include <netinet/tcp.h>
X#include <netinet/tcp_timer.h>
X#include <netinet/tcp_var.h>
X#include <netinet/tcp_fsm.h>
X#include <netinet/udp.h>
X#include <netinet/udp_var.h>
X#include <netinet/ip_icmp.h>
X#include <netinet/icmp_var.h>

X#include <nlist.h>
X/* #include <sys/protosw.h> */
X


X#ifndef NULL
X#define NULL 0
X#endif

X
X#include "ausnmp.h"
X#include "asn1.h"

X#include "snmp.h"
X#include "snmpimpl.h"
X#include "mib.h"
X#include "snmp_vars.h"
X
X
X#ifdef vax11c
X#define ioctl socket_ioctl
X#define perror socket_perror
X#endif vax11c
X
Xextern char *Lookup_Device_Annotation();
X
Xstatic struct nlist nl[] = {
X#define N_IPSTAT 0
X { "_ipstat" },
X#define N_IPFORWARDING 1
X { "_ipforwarding" },
X#define N_TCP_TTL 2
X { "_tcp_ttl" },
X#define N_UDPSTAT 3
X { "_udpstat" },
X#define N_IN_INTERFACES 4
X { "_in_interfaces" },
X#define N_ICMPSTAT 5
X { "_icmpstat" },
X#define N_IFNET 6
X { "_ifnet" },
X#define N_TCPSTAT 7
X { "_tcpstat" },
X#define N_TCB 8
X { "_tcb" },
X#define N_ARPTAB_SIZE 9
X { "_arptab_size" },
X#define N_ARPTAB 10
X { "_arptab" },
X#define N_IN_IFADDR 11
X { "_in_ifaddr" },
X#define N_BOOTTIME 12
X { "_boottime" },
X#ifdef ibm032
X#define N_PROC 13
X { "_proc" },
X#define N_NPROC 14
X { "_nproc" },
X#define N_DMMIN 15
X { "_dmmin" },
X#define N_DMMAX 16
X { "_dmmax" },
X#define N_NSWAP 17
X { "_nswap" },
X#define N_USRPTMAP 18
X { "_Usrptmap" },
X#define N_USRPT 19
X { "_usrpt" },
X#endif
X#ifdef ibm032
X#define N_USERSIZE 20
X { "_userSIZE" },
X#endif
X 0,
X};
X
X/*
X * Each variable name is placed in the variable table, without the terminating
X * substring that determines the instance of the variable. When a string is found that
X * is lexicographicly preceded by the input string, the function for that entry is
X * called to find the method of access of the instance of the named variable. If
X * that variable is not found, NULL is returned, and the search through the table
X * continues (it should stop at the next entry). If it is found, the function returns
X * a character pointer and a length or a function pointer. The former is the address
X * of the operand, the latter is a write routine for the variable.
X *
X * u_char *
X * findVar(name, length, exact, var_len, write_method)
X * oid *name; IN/OUT - input name requested, output name found
X * int length; IN/OUT - number of sub-ids in the in and out oid's
X * int exact; IN - TRUE if an exact match was requested.
X * int len; OUT - length of variable or 0 if function returned.
X * int write_method; OUT - 1 if function, 0 if char pointer.
X *
X * writeVar(doSet, var_val, var_val_type, var_val_len, statP)
X * int doSet; IN - 0 if only check of validity of operation
X * u_char *var_val; IN - input or output buffer space
X * u_char var_val_type; IN - type of input buffer
X * int var_val_len; IN - input and output buffer len
X * u_char *statP; IN - pointer to local statistic
X */
X
Xlong long_return;
Xu_char return_buf[256]; /* nee 64 */
X
Xinit_snmp()
X{
X nlist("/vmunix",nl);
X init_kmem("/dev/kmem");
X init_routes();
X
X}


X
Xstruct variable variables[] = {
X /* these must be lexicographly ordered by the name field */

X {{MIB, 1, 1, 0}, 9, STRING, VERSION_DESCR, RWRITE, var_system },


X {{MIB, 1, 2, 0}, 9, OBJID, VERSION_ID, RONLY, var_system },
X {{MIB, 1, 3, 0}, 9, TIMETICKS, UPTIME, RONLY, var_system },
X {{MIB, 2, 1, 0}, 9, INTEGER, IFNUMBER, RONLY, var_system },

X {{MIB, 2, 2, 1, 1, 0xFF}, 11, INTEGER, IFINDEX, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 2, 0xFF}, 11, STRING, IFDESCR, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 3, 0xFF}, 11, INTEGER, IFTYPE, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 4, 0xFF}, 11, INTEGER, IFMTU, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 5, 0xFF}, 11, GAUGE, IFSPEED, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 6, 0xFF}, 11, STRING, IFPHYSADDRESS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 7, 0xFF}, 11, INTEGER, IFADMINSTATUS, RWRITE, var_ifEntry },
X {{MIB, 2, 2, 1, 8, 0xFF}, 11, INTEGER, IFOPERSTATUS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 9, 0xFF}, 11, TIMETICKS, IFLASTCHANGE, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 10, 0xFF}, 11, COUNTER, IFINOCTETS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 11, 0xFF}, 11, COUNTER, IFINUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 12, 0xFF}, 11, COUNTER, IFINNUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 13, 0xFF}, 11, COUNTER, IFINDISCARDS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 14, 0xFF}, 11, COUNTER, IFINERRORS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 15, 0xFF}, 11, COUNTER, IFINUNKNOWNPROTOS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 16, 0xFF}, 11, COUNTER, IFOUTOCTETS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 17, 0xFF}, 11, COUNTER, IFOUTUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 18, 0xFF}, 11, COUNTER, IFOUTNUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 19, 0xFF}, 11, COUNTER, IFOUTDISCARDS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 20, 0xFF}, 11, COUNTER, IFOUTERRORS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 21, 0xFF}, 11, GAUGE, IFOUTQLEN, RONLY, var_ifEntry },
X {{MIB, 3, 1, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, INTEGER, ATIFINDEX, RONLY, var_atEntry },
X {{MIB, 3, 1, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, STRING, ATPHYSADDRESS, RONLY, var_atEntry },
X {{MIB, 3, 1, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, IPADDRESS, ATNETADDRESS, RONLY, var_atEntry },
X {{MIB, 4, 1, 0}, 9, INTEGER, IPFORWARDING, RONLY, var_ip },
X {{MIB, 4, 2, 0}, 9, INTEGER, IPDEFAULTTTL, RONLY, var_ip },
X {{MIB, 4, 3, 0}, 9, COUNTER, IPINRECEIVES, RONLY, var_ip },
X {{MIB, 4, 4, 0}, 9, COUNTER, IPINHDRERRORS, RONLY, var_ip },
X {{MIB, 4, 5, 0}, 9, COUNTER, IPINADDRERRORS, RONLY, var_ip },
X {{MIB, 4, 6, 0}, 9, COUNTER, IPFORWDATAGRAMS, RONLY, var_ip },
X {{MIB, 4, 7, 0}, 9, COUNTER, IPINUNKNOWNPROTOS, RONLY, var_ip },
X {{MIB, 4, 8, 0}, 9, COUNTER, IPINDISCARDS, RONLY, var_ip },
X {{MIB, 4, 9, 0}, 9, COUNTER, IPINDELIVERS, RONLY, var_ip },
X {{MIB, 4, 10, 0}, 9, COUNTER, IPOUTREQUESTS, RONLY, var_ip },
X {{MIB, 4, 11, 0}, 9, COUNTER, IPOUTDISCARDS, RONLY, var_ip },
X {{MIB, 4, 12, 0}, 9, COUNTER, IPOUTNOROUTES, RONLY, var_ip },
X {{MIB, 4, 13, 0}, 9, INTEGER, IPREASMTIMEOUT, RONLY, var_ip },
X {{MIB, 4, 14, 0}, 9, COUNTER, IPREASMREQDS, RONLY, var_ip },
X {{MIB, 4, 15, 0}, 9, COUNTER, IPREASMOKS, RONLY, var_ip },
X {{MIB, 4, 16, 0}, 9, COUNTER, IPREASMFAILS, RONLY, var_ip },
X {{MIB, 4, 17, 0}, 9, COUNTER, IPFRAGOKS, RONLY, var_ip },
X {{MIB, 4, 18, 0}, 9, COUNTER, IPFRAGFAILS, RONLY, var_ip },
X {{MIB, 4, 19, 0}, 9, COUNTER, IPFRAGCREATES, RONLY, var_ip },
X {{MIB, 4, 20, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADADDR, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPADIFINDEX, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADNETMASK, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPADBCASTADDR, RONLY, var_ipAddrEntry },
X {{MIB, 4, 21, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTEDEST, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEIFINDEX, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC1, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC2, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 5, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC3, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 6, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC4, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 7, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTENEXTHOP, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 8, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTETYPE, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 9, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEPROTO, RONLY, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 10, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEAGE, RONLY, var_ipRouteEntry },
X {{MIB, 5, 1, 0}, 9, COUNTER, ICMPINMSGS, RONLY, var_icmp },
X {{MIB, 5, 2, 0}, 9, COUNTER, ICMPINERRORS, RONLY, var_icmp },
X {{MIB, 5, 3, 0}, 9, COUNTER, ICMPINDESTUNREACHS, RONLY, var_icmp },
X {{MIB, 5, 4, 0}, 9, COUNTER, ICMPINTIMEEXCDS, RONLY, var_icmp },
X {{MIB, 5, 5, 0}, 9, COUNTER, ICMPINPARMPROBS, RONLY, var_icmp },
X {{MIB, 5, 6, 0}, 9, COUNTER, ICMPINSRCQUENCHS, RONLY, var_icmp },
X {{MIB, 5, 7, 0}, 9, COUNTER, ICMPINREDIRECTS, RONLY, var_icmp },
X {{MIB, 5, 8, 0}, 9, COUNTER, ICMPINECHOS, RONLY, var_icmp },
X {{MIB, 5, 9, 0}, 9, COUNTER, ICMPINECHOREPS, RONLY, var_icmp },
X {{MIB, 5, 10, 0}, 9, COUNTER, ICMPINTIMESTAMPS, RONLY, var_icmp },
X {{MIB, 5, 11, 0}, 9, COUNTER, ICMPINTIMESTAMPREPS, RONLY, var_icmp },
X {{MIB, 5, 12, 0}, 9, COUNTER, ICMPINADDRMASKS, RONLY, var_icmp },
X {{MIB, 5, 13, 0}, 9, COUNTER, ICMPINADDRMASKREPS, RONLY, var_icmp },
X {{MIB, 5, 14, 0}, 9, COUNTER, ICMPOUTMSGS, RONLY, var_icmp },
X {{MIB, 5, 15, 0}, 9, COUNTER, ICMPOUTERRORS, RONLY, var_icmp },
X {{MIB, 5, 16, 0}, 9, COUNTER, ICMPOUTDESTUNREACHS, RONLY, var_icmp },
X {{MIB, 5, 17, 0}, 9, COUNTER, ICMPOUTTIMEEXCDS, RONLY, var_icmp },
X {{MIB, 5, 18, 0}, 9, COUNTER, ICMPOUTPARMPROBS, RONLY, var_icmp },
X {{MIB, 5, 19, 0}, 9, COUNTER, ICMPOUTSRCQUENCHS, RONLY, var_icmp },
X {{MIB, 5, 20, 0}, 9, COUNTER, ICMPOUTREDIRECTS, RONLY, var_icmp },
X {{MIB, 5, 21, 0}, 9, COUNTER, ICMPOUTECHOS, RONLY, var_icmp },
X {{MIB, 5, 22, 0}, 9, COUNTER, ICMPOUTECHOREPS, RONLY, var_icmp },
X {{MIB, 5, 23, 0}, 9, COUNTER, ICMPOUTTIMESTAMPS, RONLY, var_icmp },
X {{MIB, 5, 24, 0}, 9, COUNTER, ICMPOUTTIMESTAMPREPS, RONLY, var_icmp },
X {{MIB, 5, 25, 0}, 9, COUNTER, ICMPOUTADDRMASKS, RONLY, var_icmp },
X {{MIB, 5, 26, 0}, 9, COUNTER, ICMPOUTADDRMASKREPS, RONLY, var_icmp },
X {{MIB, 6, 1, 0}, 9, INTEGER, TCPRTOALGORITHM, RONLY, var_tcp },
X {{MIB, 6, 2, 0}, 9, INTEGER, TCPRTOMIN, RONLY, var_tcp },
X {{MIB, 6, 3, 0}, 9, INTEGER, TCPRTOMAX, RONLY, var_tcp },
X {{MIB, 6, 4, 0}, 9, INTEGER, TCPMAXCONN, RONLY, var_tcp },
X {{MIB, 6, 5, 0}, 9, COUNTER, TCPACTIVEOPENS, RONLY, var_tcp },
X {{MIB, 6, 6, 0}, 9, COUNTER, TCPPASSIVEOPENS, RONLY, var_tcp },
X {{MIB, 6, 7, 0}, 9, COUNTER, TCPATTEMPTFAILS, RONLY, var_tcp },
X {{MIB, 6, 8, 0}, 9, COUNTER, TCPESTABRESETS, RONLY, var_tcp },
X {{MIB, 6, 9, 0}, 9, GAUGE, TCPCURRESTAB, RONLY, var_tcp },
X {{MIB, 6,10, 0}, 9, COUNTER, TCPINSEGS, RONLY, var_tcp },
X {{MIB, 6,11, 0}, 9, COUNTER, TCPOUTSEGS, RONLY, var_tcp },
X {{MIB, 6,12, 0}, 9, COUNTER, TCPRETRANSSEGS, RONLY, var_tcp },
X {{MIB, 6,13, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, INTEGER, TCPCONNSTATE, RONLY, var_tcp },
X {{MIB, 6,13, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, IPADDRESS, TCPCONNLOCALADDRESS, RONLY, var_tcp },
X {{MIB, 6,13, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, INTEGER, TCPCONNLOCALPORT, RONLY, var_tcp },
X {{MIB, 6,13, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, IPADDRESS, TCPCONNREMADDRESS, RONLY, var_tcp },
X {{MIB, 6,13, 1, 5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, INTEGER, TCPCONNREMPORT, RONLY, var_tcp },
X {{MIB, 7, 1, 0}, 9, COUNTER, UDPINDATAGRAMS, RONLY, var_udp },
X {{MIB, 7, 2, 0}, 9, COUNTER, UDPNOPORTS, RONLY, var_udp },
X {{MIB, 7, 3, 0}, 9, COUNTER, UDPINERRORS, RONLY, var_udp },
X {{MIB, 7, 4, 0}, 9, COUNTER, UDPOUTDATAGRAMS, RONLY, var_udp }


X};
X
X
X
X

X/*
X * getStatPtr - return a pointer to the named variable, as well as it's
X * type, length, and access control list.
X *
X * If an exact match for the variable name exists, it is returned. If not,
X * and exact is false, the next variable lexicographically after the
X * requested one is returned.
X *
X * If no appropriate variable can be found, NULL is returned.
X */

Xu_char *


XgetStatPtr(name, namelen, type, len, acl, exact, access_method)
X oid *name; /* IN - name of var, OUT - name matched */
X int *namelen; /* IN -number of sub-ids in name, OUT - subid-is in matched name */
X u_char *type; /* OUT - type of matched variable */
X int *len; /* OUT - length of matched variable */
X u_short *acl; /* OUT - access control list */
X int exact; /* IN - TRUE if exact match wanted */
X int *access_method; /* OUT - 1 if function, 0 if char * */
X{
X
X register struct variable *vp;
X
X register int x;

X register u_char *access;


X int result;
X register int minlen;
X register oid *name1, *name2;
X

X for(x = 0, vp = variables; x < sizeof(variables)/sizeof(struct variable); vp++, x++){
X if (*namelen < (int)vp->namelen)
X minlen = *namelen;
X else
X minlen = (int)vp->namelen;
X name1 = name; name2 = vp->name;
X result = 0;
X while(minlen-- > 0){
X if (*name1 < *name2){
X result = -1;
X break;
X }
X if (*name2++ < *name1++){
X result = 1;
X break;
X }
X }
X if (result == 0){
X if (*namelen < (int)vp->namelen)
X result = -1; /* name1 shorter so it is "less" */
X else if ((int)vp->namelen < *namelen)
X result = 1;
X else
X result = 0;
X }
X/* result = compare(name, *namelen, vp->name, (int)vp->namelen); */


X if ((result < 0) || (exact && (result == 0))){
X access = (*(vp->findVar))(vp, name, namelen, exact, len, access_method);
X if (access != NULL)

X break;
X }
X }
X if (x == sizeof(variables)/sizeof(struct variable))
X return NULL;
X
X /* vp now points to the approprate struct */


X *type = vp->type;
X *acl = vp->acl;
X return access;

X}
X
X
X
Xint

Xchar version_descr[32] = "Unix 4.3BSD";
Xoid version_id[] = {1, 3, 6, 1, 4, 1, 3, 1, 1};
X
Xu_char *


Xvar_system(vp, name, length, exact, var_len, write_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{

X struct timeval now, boottime;
X extern int writeVersion();


X
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;

X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long); /* default length */
X switch (vp->magic){
X case VERSION_DESCR:
X *var_len = strlen(version_descr);

X *write_method = writeVersion;
X return (u_char *)version_descr;


X case VERSION_ID:
X *var_len = sizeof(version_id);

X return (u_char *)version_id;
X case UPTIME:
X klseek(nl[N_BOOTTIME].n_value);
X klread((char *)&boottime, sizeof(boottime));
X gettimeofday(&now, (struct timezone *)0);
X long_return = (now.tv_sec - boottime.tv_sec) * 100
X + (now.tv_usec - boottime.tv_usec) / 10000;
X return (u_char *) &long_return;
X case IFNUMBER:
X long_return = Interface_Scan_Get_Count();
X return (u_char *) &long_return;


X default:
X ERROR("");
X }

X return NULL;
X}
X

X#include <ctype.h>
Xint
XwriteVersion(doSet, var_val, var_val_type, var_val_len, statP)
X int doSet;
X u_char *var_val;
X u_char var_val_type;
X int var_val_len;
X u_char *statP;


X{
X int bigsize = 1000;

X u_char buf[sizeof(version_descr)], *cp;
X int count, size;
X
X if (var_val_type != STRING){
X printf("not string\n");
X return FALSE;
X }
X if (var_val_len > sizeof(version_descr)-1){
X printf("bad length\n");
X return FALSE;


X }
X size = sizeof(buf);

X asn_parse_string(var_val, &bigsize, &var_val_type, (long *)buf, &size);
X for(cp = buf, count = 0; count < size; count++, cp++){
X if (!isprint(*cp)){
X printf("not print %x\n", *cp);
X return FALSE;
X }
X }
X buf[size] = 0;
X if (doSet){
X strcpy(version_descr, buf);


X
X }
X return TRUE;
X}

X
X
X
Xu_char *

Xvar_ifEntry(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{
X oid newname[MAX_NAME_LEN];

X register int interface;
X int result, count;
X static struct ifnet ifnet;
X static struct in_ifaddr in_ifaddr;
X static char Name[16];


X register char *cp;
X

X bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));
X /* find "next" interface */
X count = Interface_Scan_Get_Count();
X for(interface = 1; interface <= count; interface++){
X newname[10] = (oid)interface;
X result = compare(name, *length, newname, (int)vp->namelen);
X if ((exact && (result == 0)) || (!exact && (result < 0)))
X break;
X }
X if (interface > count)
X return NULL;
X
X bcopy((char *)newname, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long);

X
X Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddr);
X switch (vp->magic){
X case IFINDEX:
X long_return = interface;
X return (u_char *) &long_return;
X case IFDESCR:
X#define USE_NAME_AS_DESCRIPTION
X#ifdef USE_NAME_AS_DESCRIPTION
X cp = Name;
X#else USE_NAME_AS_DESCRIPTION
X cp = Lookup_Device_Annotation(Name, "snmp-descr");
X if (!cp)
X cp = Lookup_Device_Annotation(Name, 0);
X if (!cp) cp = Name;
X#endif USE_NAME_AS_DESCRIPTION
X *var_len = strlen(cp);
X return (u_char *)cp;
X case IFTYPE:
X#if 0
X cp = Lookup_Device_Annotation(Name, "snmp-type");
X if (cp) long_return = atoi(cp);
X else
X#endif
X long_return = 1; /* OTHER */
X return (u_char *) &long_return;
X case IFMTU: {
X long_return = (long) ifnet.if_mtu;
X return (u_char *) &long_return;
X }
X case IFSPEED:
X#if 0
X cp = Lookup_Device_Annotation(Name, "snmp-speed");
X if (cp) long_return = atoi(cp);
X else
X#endif
X long_return = 1; /* OTHER */
X return (u_char *) &long_return;
X case IFPHYSADDRESS:
X#if 0
X if (Lookup_Device_Annotation(Name, "ethernet-device")) {
X Interface_Get_Ether_By_Index(interface, return_buf);
X *var_len = 6;
X return(u_char *) return_buf;
X } else {
X long_return = 0;
X return (u_char *) long_return;
X }
X#endif
X *var_len = 6;
X return (u_char *)return_buf;
X case IFADMINSTATUS:
X long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2;
X return (u_char *) &long_return;
X case IFOPERSTATUS:
X long_return = ifnet.if_flags & IFF_UP ? 1 : 2;
X return (u_char *) &long_return;
X case IFLASTCHANGE:
X long_return = 0; /* XXX */
X return (u_char *) &long_return;
X case IFINOCTETS:
X long_return = ifnet.if_ipackets * (ifnet.if_mtu / 2); /* XXX */
X return (u_char *) &long_return;
X case IFINUCASTPKTS:
X long_return = ifnet.if_ipackets;
X return (u_char *) &long_return;
X case IFINNUCASTPKTS:
X long_return = 0; /* XXX */
X return (u_char *) &long_return;
X case IFINDISCARDS:
X long_return = 0; /* XXX */
X return (u_char *) &long_return;
X case IFINERRORS:
X return (u_char *) &ifnet.if_ierrors;
X case IFINUNKNOWNPROTOS:
X long_return = 0; /* XXX */
X return (u_char *) &long_return;
X case IFOUTOCTETS:
X long_return = ifnet.if_opackets * (ifnet.if_mtu / 2); /* XXX */
X return (u_char *) &long_return;
X case IFOUTUCASTPKTS:
X long_return = ifnet.if_opackets;
X return (u_char *) &long_return;
X case IFOUTNUCASTPKTS:
X long_return = 0; /* XXX */
X return (u_char *) &long_return;
X case IFOUTDISCARDS:
X return (u_char *) &ifnet.if_snd.ifq_drops;
X case IFOUTERRORS:
X return (u_char *) &ifnet.if_oerrors;
X case IFOUTQLEN:
X return (u_char *) &ifnet.if_snd.ifq_len;


X default:
X ERROR("");
X }
X return NULL;

X}
X
X/*
X * Read the ARP table
X */
X
Xu_char *
Xvar_atEntry(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */

X{
X /*
X * object identifier is of form:
X * 1.3.6.1.2.1.3.1.1.1.interface.1.A.B.C.D, where A.B.C.D is IP address.
X * Interface is at offset 10,
X * IPADDR starts at offset 12.
X */
X u_char *cp;
X oid *op;
X oid lowest[16];
X oid current[16];
X static char PhysAddr[6], LowPhysAddr[6];
X u_long Addr, LowAddr;
X
X /* fill in object part of name for current (less sizeof instance part) */
X
X bcopy((char *)vp->name, (char *)current, (int)(vp->namelen - 6) * sizeof(oid));
X
X LowAddr = -1; /* Don't have one yet */
X ARP_Scan_Init();
X for (;;) {
X if (ARP_Scan_Next(&Addr, PhysAddr) == 0) break;
X current[10] = 1; /* IfIndex == 1 (ethernet???) XXX */
X current[11] = 1;
X cp = (u_char *)&Addr;
X op = current + 12;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X
X if (exact){
X if (compare(current, 16, name, *length) == 0){
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));
X LowAddr = Addr;
X bcopy(PhysAddr, LowPhysAddr, sizeof(PhysAddr));
X break; /* no need to search further */
X }
X } else {
X if ((compare(current, 16, name, *length) > 0) &&
X ((LowAddr == -1) || (compare(current, 16, lowest, 16) < 0))){
X /*
X * if new one is greater than input and closer to input than
X * previous lowest, save this one as the "next" one.
X */
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));
X LowAddr = Addr;
X bcopy(PhysAddr, LowPhysAddr, sizeof(PhysAddr));
X }
X }
X }
X if (LowAddr == -1) return(NULL);
X
X bcopy((char *)lowest, (char *)name, 16 * sizeof(oid));
X *length = 16;
X *write_method = 0;
X switch(vp->magic){
X case ATIFINDEX:
X *var_len = sizeof long_return;
X long_return = 1; /* XXX */
X return (u_char *)&long_return;
X case ATPHYSADDRESS:
X *var_len = sizeof(LowPhysAddr);
X return (u_char *)LowPhysAddr;
X case ATNETADDRESS:
X *var_len = sizeof long_return;
X long_return = LowAddr;
X return (u_char *)&long_return;


X default:
X ERROR("");
X }

X return NULL;
X}
X

Xu_char *
Xvar_ip(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */

X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */


X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{

X int i;
X static struct ipstat ipstat;


X
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;

X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));


X
X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long); /* default length */

X /*
X * Get the IP statistics from the kernel...
X */
X
X klseek(nl[N_IPSTAT].n_value);
X klread((char *)&ipstat, sizeof (ipstat));
X
X switch (vp->magic){
X case IPFORWARDING:
X klseek(nl[N_IPFORWARDING].n_value);
X klread((char *) &i, sizeof(i));
X if (i) {
X klseek(nl[N_IN_INTERFACES].n_value);
X klread((char *) &i, sizeof(i));
X if (i > 1)
X long_return = 1; /* GATEWAY */
X else
X long_return = 2; /* GATEWAY configured as HOST */
X } else {
X long_return = 2; /* HOST */
X }
X return (u_char *) &long_return;
X case IPDEFAULTTTL:
X /*
X * Allow for a kernel w/o TCP.
X */
X if (nl[N_TCP_TTL].n_value) {
X klseek(nl[N_TCP_TTL].n_value);
X klread((char *) &long_return, sizeof(long_return));
X } else long_return = 60; /* XXX */
X return (u_char *) &long_return;
X case IPINRECEIVES:
X return (u_char *) &ipstat.ips_total;
X case IPINHDRERRORS:
X long_return = ipstat.ips_badsum + ipstat.ips_tooshort +
X ipstat.ips_toosmall + ipstat.ips_badhlen +
X ipstat.ips_badlen;
X return (u_char *) &long_return;
X case IPINADDRERRORS:
X return (u_char *) &ipstat.ips_cantforward;
X case IPFORWDATAGRAMS:
X return (u_char *) &ipstat.ips_forward;
X case IPINUNKNOWNPROTOS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPINDISCARDS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPINDELIVERS:
X long_return = ipstat.ips_total -
X (ipstat.ips_badsum + ipstat.ips_tooshort +
X ipstat.ips_toosmall + ipstat.ips_badhlen +
X ipstat.ips_badlen);
X return (u_char *) &long_return;
X case IPOUTREQUESTS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPOUTDISCARDS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPOUTNOROUTES:
X return (u_char *) &ipstat.ips_cantforward;
X case IPREASMTIMEOUT:
X long_return = IPFRAGTTL;
X return (u_char *) &long_return;
X case IPREASMREQDS:
X return (u_char *) &ipstat.ips_fragments;
X case IPREASMOKS:
X return (u_char *) &ipstat.ips_fragments;
X case IPREASMFAILS:
X long_return = ipstat.ips_fragdropped + ipstat.ips_fragtimeout;
X return (u_char *) &long_return;
X case IPFRAGOKS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPFRAGFAILS:
X long_return = 0;
X return (u_char *) &long_return;
X case IPFRAGCREATES:
X long_return = 0;
X return (u_char *) &long_return;


X default:
X ERROR("");
X }

X return NULL;
X}
X

Xu_char *
Xvar_ipAddrEntry(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */

X{
X /*
X * object identifier is of form:
X * 1.3.6.1.2.1.4.20.1.?.A.B.C.D, where A.B.C.D is IP address.
X * IPADDR starts at offset 10.
X */
X oid lowest[14];
X oid current[14], *op;
X u_char *cp;
X int interface, lowinterface=0;
X static struct ifnet ifnet;
X static struct in_ifaddr in_ifaddr, lowin_ifaddr;
X
X /* fill in object part of name for current (less sizeof instance part) */
X
X bcopy((char *)vp->name, (char *)current, (int)(vp->namelen - 4) * sizeof(oid));
X
X Interface_Scan_Init();
X for (;;) {
X if (Interface_Scan_Next(&interface, (char *)0, &ifnet, &in_ifaddr) == 0) break;
X
X cp = (u_char *)&(((struct sockaddr_in *) &(in_ifaddr.ia_addr))->sin_addr.s_addr);
X op = current + 10;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X
X if (exact){
X if (compare(current, 14, name, *length) == 0){
X bcopy((char *)current, (char *)lowest, 14 * sizeof(oid));
X lowinterface = interface;
X lowin_ifaddr = in_ifaddr;
X break; /* no need to search further */
X }
X } else {
X if ((compare(current, 14, name, *length) > 0) &&
X (!lowinterface || (compare(current, 14, lowest, 14) < 0))){
X /*
X * if new one is greater than input and closer to input than
X * previous lowest, save this one as the "next" one.
X */
X lowinterface = interface;
X lowin_ifaddr = in_ifaddr;
X bcopy((char *)current, (char *)lowest, 14 * sizeof(oid));
X }
X }
X }
X if (!lowinterface) return(NULL);
X bcopy((char *)lowest, (char *)name, 14 * sizeof(oid));
X *length = 14;
X *write_method = 0;
X *var_len = sizeof(long_return);
X switch(vp->magic){
X case IPADADDR:
X return(u_char *) &((struct sockaddr_in *) &lowin_ifaddr.ia_addr)->sin_addr.s_addr;
X case IPADIFINDEX:
X long_return = lowinterface;
X return(u_char *) &long_return;
X case IPADNETMASK:
X long_return = ntohl(lowin_ifaddr.ia_subnetmask);
X return(u_char *) &long_return;
X case IPADBCASTADDR:
X long_return = ntohl(((struct sockaddr_in *) &lowin_ifaddr.ia_addr)->sin_addr.s_addr) & 1;
X return(u_char *) &long_return;


X default:
X ERROR("");
X }

X return NULL;
X}
X

X
Xu_char *
Xvar_icmp(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */

X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */


X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{

X register int i;
X static struct icmpstat icmpstat;


X
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;

X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;
X *write_method = 0;

X *var_len = sizeof(long); /* all following variables are sizeof long */
X
X /*
X * Get the UDP statistics from the kernel...
X */
X
X klseek(nl[N_ICMPSTAT].n_value);
X klread((char *)&icmpstat, sizeof (icmpstat));
X
X switch (vp->magic){
X case ICMPINMSGS:
X long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort +
X icmpstat.icps_checksum + icmpstat.icps_badlen;
X for (i=0; i <= ICMP_MAXTYPE; i++)
X long_return += icmpstat.icps_inhist[i];
X return (u_char *)&long_return;
X case ICMPINERRORS:
X long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort +
X icmpstat.icps_checksum + icmpstat.icps_badlen;
X return (u_char *)&long_return;
X case ICMPINDESTUNREACHS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_UNREACH];
X case ICMPINTIMEEXCDS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_TIMXCEED];
X case ICMPINPARMPROBS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_PARAMPROB];
X case ICMPINSRCQUENCHS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
X case ICMPINREDIRECTS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_REDIRECT];
X case ICMPINECHOS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_ECHO];
X case ICMPINECHOREPS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_ECHOREPLY];
X case ICMPINTIMESTAMPS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_TSTAMP];
X case ICMPINTIMESTAMPREPS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
X case ICMPINADDRMASKS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_MASKREQ];
X case ICMPINADDRMASKREPS:
X return (u_char *) &icmpstat.icps_inhist[ICMP_MASKREPLY];
X case ICMPOUTMSGS:
X long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
X for (i=0; i <= ICMP_MAXTYPE; i++)
X long_return += icmpstat.icps_outhist[i];
X return (u_char *)&long_return;
X case ICMPOUTERRORS:
X long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
X return (u_char *)&long_return;
X case ICMPOUTDESTUNREACHS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_UNREACH];
X case ICMPOUTTIMEEXCDS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_TIMXCEED];
X case ICMPOUTPARMPROBS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_PARAMPROB];
X case ICMPOUTSRCQUENCHS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
X case ICMPOUTREDIRECTS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_REDIRECT];
X case ICMPOUTECHOS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_ECHO];
X case ICMPOUTECHOREPS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_ECHOREPLY];
X case ICMPOUTTIMESTAMPS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_TSTAMP];
X case ICMPOUTTIMESTAMPREPS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
X case ICMPOUTADDRMASKS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_MASKREQ];
X case ICMPOUTADDRMASKREPS:
X return (u_char *) &icmpstat.icps_outhist[ICMP_MASKREPLY];


X default:
X ERROR("");
X }

X return NULL;
X}
X

X
Xu_char *
Xvar_udp(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */

X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */


X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{

X static struct udpstat udpstat;


X
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;

X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));


X
X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long); /* default length */

X /*
X * Get the IP statistics from the kernel...
X */
X
X klseek(nl[N_UDPSTAT].n_value);
X klread((char *)&udpstat, sizeof (udpstat));
X
X switch (vp->magic){
X case UDPINDATAGRAMS:
X case UDPNOPORTS:
X case UDPOUTDATAGRAMS:
X long_return = 0;
X return (u_char *) &long_return;
X case UDPINERRORS:
X long_return = udpstat.udps_hdrops + udpstat.udps_badsum +
X udpstat.udps_badlen;
X return (u_char *) &long_return;


X default:
X ERROR("");
X }

X return NULL;
X}
X

Xu_char *
Xvar_tcp(vp, name, length, exact, var_len, write_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */

X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */


X int exact; /* IN - TRUE if an exact match was requested. */

X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
X{

X int i;
X static struct tcpstat tcpstat;
X oid newname[MAX_NAME_LEN], lowest[MAX_NAME_LEN], *op;
X u_char *cp;
X int State, LowState;
X static struct inpcb inpcb, Lowinpcb;
X
X /*
X * Allow for a kernel w/o TCP
X */
X
X if (nl[N_TCPSTAT].n_value == 0) return(NULL);
X
X if (vp->magic < TCPCONNSTATE) {


X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
X return NULL;

X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));


X
X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long); /* default length */

X /*
X * Get the TCP statistics from the kernel...
X */
X
X klseek(nl[N_TCPSTAT].n_value);
X klread((char *)&tcpstat, sizeof (tcpstat));
X
X switch (vp->magic){
X case TCPRTOALGORITHM:
X long_return = 4; /* Van Jacobsen's algorithm */ /* XXX */
X return (u_char *) &long_return;
X case TCPRTOMIN:
X long_return = 0;
X/* $$$$$ long_return = TCPTV_MIN / PR_SLOWHZ * 1000; */
X return (u_char *) &long_return;
X case TCPRTOMAX:
X long_return = 0;
X/* $$$$$ long_return = TCPTV_REXMTMAX / PR_SLOWHZ * 1000; */
X return (u_char *) &long_return;
X case TCPMAXCONN:
X long_return = -1;
X return (u_char *) &long_return;
X case TCPACTIVEOPENS:
X return (u_char *) &tcpstat.tcps_connattempt;
X case TCPPASSIVEOPENS:
X return (u_char *) &tcpstat.tcps_accepts;
X case TCPATTEMPTFAILS:
X return (u_char *) &tcpstat.tcps_conndrops;
X case TCPESTABRESETS:
X return (u_char *) &tcpstat.tcps_drops;
X case TCPCURRESTAB:
X long_return = TCP_Count_Connections();
X return (u_char *) &long_return;
X case TCPINSEGS:
X return (u_char *) &tcpstat.tcps_rcvtotal;
X case TCPOUTSEGS:
X return (u_char *) &tcpstat.tcps_sndtotal;
X case TCPRETRANSSEGS:
X return (u_char *) &tcpstat.tcps_sndrexmitpack;


X default:
X ERROR("");
X }

X } else { /* Info about a particular connection */
X bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));
X /* find "next" connection */
XAgain:
XLowState = -1; /* Don't have one yet */
X TCP_Scan_Init();
X for (;;) {
X if ((i = TCP_Scan_Next(&State, &inpcb)) < 0) goto Again;
X if (i == 0) break; /* Done */
X cp = (u_char *)&inpcb.inp_laddr.s_addr;
X op = newname + 10;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X
X newname[14] = ntohs(inpcb.inp_lport);
X
X cp = (u_char *)&inpcb.inp_faddr.s_addr;
X op = newname + 15;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X
X newname[19] = ntohs(inpcb.inp_fport);
X
X if (exact){
X if (compare(newname, 20, name, *length) == 0){
X bcopy((char *)newname, (char *)lowest, 20 * sizeof(oid));
X LowState = State;
X Lowinpcb = inpcb;
X break; /* no need to search further */
X }
X } else {
X if ((compare(newname, 20, name, *length) > 0) &&
X ((LowState < 0) || (compare(newname, 20, lowest, 20) < 0))){
X /*
X * if new one is greater than input and closer to input than
X * previous lowest, save this one as the "next" one.
X */
X bcopy((char *)newname, (char *)lowest, 20 * sizeof(oid));
X LowState = State;
X Lowinpcb = inpcb;
X }
X }
X }
X if (LowState < 0) return(NULL);
X bcopy((char *)lowest, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;
X *write_method = 0;
X *var_len = sizeof(long);

X switch (vp->magic) {
X case TCPCONNSTATE: {
X static int StateMap[]={1, 2, 3, 4, 5, 8, 6, 10, 9, 7, 11};
X return (u_char *) &StateMap[LowState];
X }
X case TCPCONNLOCALADDRESS:
X return (u_char *) &Lowinpcb.inp_laddr.s_addr;
X case TCPCONNLOCALPORT:
X long_return = ntohs(Lowinpcb.inp_lport);
X return (u_char *) &long_return;
X case TCPCONNREMADDRESS:
X return (u_char *) &Lowinpcb.inp_faddr.s_addr;
X case TCPCONNREMPORT:
X long_return = ntohs(Lowinpcb.inp_fport);
X return (u_char *) &long_return;


X }
X }
X return NULL;

X}
X
X/*
X * Print INTERNET connections
X */
X
Xstatic int TCP_Count_Connections()
X{
X int Established;
X struct inpcb cb;
X register struct inpcb *prev, *next;
X struct inpcb inpcb;
X struct tcpcb tcpcb;
X
XAgain: /*
X * Prepare to scan the control blocks
X */
X Established = 0;
X klseek(nl[N_TCB].n_value);
X klread((char *)&cb, sizeof(struct inpcb));
X inpcb = cb;
X prev = (struct inpcb *) nl[N_TCB].n_value;
X /*
X * Scan the control blocks
X */
X while (inpcb.inp_next != (struct inpcb *) nl[N_TCB].n_value) {
X next = inpcb.inp_next;
X klseek((caddr_t)next);
X klread((char *)&inpcb, sizeof (inpcb));
X if (inpcb.inp_prev != prev) { /* ??? */
X sleep(1);
X goto Again;
X }
X if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) {
X prev = next;
X continue;
X }
X klseek((caddr_t)inpcb.inp_ppcb);
X klread((char *)&tcpcb, sizeof (tcpcb));
X if ((tcpcb.t_state == TCPS_ESTABLISHED) ||
X (tcpcb.t_state == TCPS_CLOSE_WAIT))
X Established++;
X prev = next;
X }
X return(Established);
X}
X
X
Xstatic struct inpcb inpcb, *prev;
X
Xstatic TCP_Scan_Init()
X{
X klseek(nl[N_TCB].n_value);
X klread((char *)&inpcb, sizeof(inpcb));
X prev = (struct inpcb *) nl[N_TCB].n_value;
X}
X
Xstatic int TCP_Scan_Next(State, RetInPcb)
Xint *State;
Xstruct inpcb *RetInPcb;
X{
X register struct inpcb *next;
X struct tcpcb tcpcb;
X
X if (inpcb.inp_next == (struct inpcb *) nl[N_TCB].n_value) {
X return(0); /* "EOF" */
X }
X
X next = inpcb.inp_next;
X klseek((caddr_t)next);
X klread((char *)&inpcb, sizeof (inpcb));
X if (inpcb.inp_prev != prev) /* ??? */
X return(-1); /* "FAILURE" */
X klseek((caddr_t)inpcb.inp_ppcb);
X klread((char *)&tcpcb, sizeof (tcpcb));
X *State = tcpcb.t_state;
X *RetInPcb = inpcb;
X prev = next;
X return(1); /* "OK" */
X}
X
Xstatic int arptab_size, arptab_current;
Xstatic struct arptab *at=0;
Xstatic ARP_Scan_Init()
X{
X if (!at) {
X klseek(nl[N_ARPTAB_SIZE].n_value);
X klread((char *)&arptab_size, sizeof arptab_size);
X
X at = (struct arptab *) malloc(arptab_size * sizeof(struct arptab));
X }
X
X klseek(nl[N_ARPTAB].n_value);
X klread((char *)at, arptab_size * sizeof(struct arptab));
X arptab_current = 0;
X}
X
Xstatic int ARP_Scan_Next(IPAddr, PhysAddr)
Xu_long *IPAddr;
Xchar *PhysAddr;
X{
X register struct arptab *atab;
X
X while (arptab_current < arptab_size) {
X atab = &at[arptab_current++];
X if (!(atab->at_flags & ATF_COM)) continue;
X *IPAddr = atab->at_iaddr.s_addr;
X bcopy((char *)&atab->at_enaddr, PhysAddr, sizeof(atab->at_enaddr));
X return(1);
X }
X return(0); /* "EOF" */
X}
X
X
Xstatic struct ifnet *ifnetaddr, saveifnet, *saveifnetaddr;
Xstatic struct in_ifaddr savein_ifaddr;
Xstatic int saveIndex=0;
Xstatic char saveName[16];
X
XInterface_Scan_Init()
X{
X klseek(nl[N_IFNET].n_value);
X klread((char *)&ifnetaddr, sizeof ifnetaddr);
X saveIndex=0;
X}
X
Xint Interface_Scan_Next(Index, Name, Retifnet, Retin_ifaddr)
Xint *Index;
Xchar *Name;
Xstruct ifnet *Retifnet;
Xstruct in_ifaddr *Retin_ifaddr;
X{
X struct ifnet ifnet;
X struct in_ifaddr *ia, in_ifaddr;
X register char *cp;
X extern char *index();
X
X while (ifnetaddr) {
X /*
X * Get the "ifnet" structure and extract the device name
X */
X klseek(ifnetaddr);
X klread((char *)&ifnet, sizeof ifnet);
X klseek((caddr_t)ifnet.if_name);
X klread(saveName, 16);
X saveName[15] = '\0';
X cp = index(saveName, '\0');
X *cp++ = ifnet.if_unit + '0';
X *cp = '\0';
X if (1 || strcmp(saveName,"lo0") != 0) { /* XXX */
X /*
X * Try to find an addres for this interface
X */
X klseek(nl[N_IN_IFADDR].n_value);
X klread((char *) &ia, sizeof(ia));
X while (ia) {
X klseek(ia);
X klread((char *) &in_ifaddr, sizeof(in_ifaddr));
X if (in_ifaddr.ia_ifp == ifnetaddr) break;
X ia = in_ifaddr.ia_next;
X }
X
X ifnet.if_addrlist = (struct ifaddr *)ia; /* WRONG DATA TYPE; ONLY A FLAG */
X/* ifnet.if_addrlist = (struct ifaddr *)&ia->ia_ifa; */ /* WRONG DATA TYPE; ONLY A FLAG */
X if (Index)
X *Index = ++saveIndex;
X if (Retifnet)
X *Retifnet = ifnet;
X if (Retin_ifaddr)
X *Retin_ifaddr = in_ifaddr;
X if (Name)
X strcpy(Name, saveName);
X saveifnet = ifnet;
X saveifnetaddr = ifnetaddr;
X savein_ifaddr = in_ifaddr;
X ifnetaddr = ifnet.if_next;
X return(1); /* DONE */
X }
X ifnetaddr = ifnet.if_next;
X }
X return(0); /* EOF */
X}
X
Xstatic int Interface_Scan_By_Index(Index, Name, Retifnet, Retin_ifaddr)
Xint Index;
Xchar *Name;
Xstruct ifnet *Retifnet;
Xstruct in_ifaddr *Retin_ifaddr;
X{
X int i;
X
X if (saveIndex != Index) { /* Optimization! */
X Interface_Scan_Init();
X while (Interface_Scan_Next(&i, Name, Retifnet, Retin_ifaddr)) {
X if (i == Index) break;
X }
X if (i != Index) return(-1); /* Error, doesn't exist */
X } else {
X if (Retifnet)
X *Retifnet = saveifnet;
X if (Retin_ifaddr)
X *Retin_ifaddr = savein_ifaddr;
X if (Name)
X strcpy(Name, saveName);
X }
X return(0); /* DONE */
X}
X
Xstatic int Interface_Count=0;
X
Xstatic int Interface_Scan_Get_Count()
X{
X if (!Interface_Count) {
X Interface_Scan_Init();
X while (Interface_Scan_Next((int *)0, (char *)0, (struct ifnet *)0, (struct in_ifaddr *)0) != 0)
X Interface_Count++;
X }
X return(Interface_Count);
X}
X
Xstatic int Interface_Get_Ether_By_Index(Index, EtherAddr)
Xint Index;
Xchar *EtherAddr;
X{
X int i;
X struct arpcom arpcom;
X
X if (saveIndex != Index) { /* Optimization! */
X Interface_Scan_Init();
X while (Interface_Scan_Next(&i, (char *)0, (struct ifnet *)0, (struct in_ifaddr *)0)) {
X if (i == Index) break;
X }
X if (i != Index) return(-1); /* Error, doesn't exist */
X }
X
X /*
X * the arpcom structure is an extended ifnet structure which
X * contains the ethernet address.
X */
X klseek(saveifnetaddr);
X klread((char *)&arpcom, sizeof arpcom);
X bcopy((char *)&arpcom.ac_enaddr, EtherAddr, sizeof(arpcom.ac_enaddr));
X return(0); /* DONE */
X}
X
END_OF_FILE
if test 46913 -ne `wc -c <'netramet/src/apps/snmp_vars.c'`; then
echo shar: \"'netramet/src/apps/snmp_vars.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmp_vars.c'
fi
if test -f 'netramet/src/manager/include/nmc.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/include/nmc.h'\"
else
echo shar: Extracting \"'netramet/src/manager/include/nmc.h'\" \(11711 characters\)
sed "s/^X//" >'netramet/src/manager/include/nmc.h' <<'END_OF_FILE'
X/* 1635, Mon 11 Oct 93
X
X NMC.H: Global declarations for the NeTraMet Manager/Collector


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X#ifndef EXTERN
X#define EXTERN extern
X#define DECLARE 0
X#define INIT(v)
X#else
X#define EXTERN
X#define DECLARE 1
X#define INIT(v) = v
X#endif
X
X#define CFGFILE "NeMaC.cfg"
X#define RULEFILE "rules.txt"
X#define LOGFILE "NeMaC.log"
X
Xextern int errno;
X
XEXTERN int snmp_dump_packet INIT(0);
X
XEXTERN int verbose, testing, listrules, interval;
X
X#define MAC_ADDR_LEN 6
X#define PEER_ADDR_LEN 4
X#define DETAIL_ADDR_LEN 2
X
X#define RULE_ADDR_LEN 6
X
Xstruct flow_info { /* Accounting flow as viewed by NeMaC */
X unsigned int FlowIndex;
X unsigned char LowInterface, HighInterface;
X unsigned char LowAdjType, HighAdjType,
X LowAdjAddress[MAC_ADDR_LEN], LowAdjMask[MAC_ADDR_LEN],
X HighAdjAddress[MAC_ADDR_LEN], HighAdjMask[MAC_ADDR_LEN];
X unsigned char
X LowPeerType,LowPeerTypeMask, HighPeerType,HighPeerTypeMask,
X LowPeerAddress[PEER_ADDR_LEN], LowPeerMask[PEER_ADDR_LEN],
X HighPeerAddress[PEER_ADDR_LEN], HighPeerMask[PEER_ADDR_LEN];
X unsigned char
X LowDetailType,LowDetailTypeMask, HighDetailType,HighDetailTypeMask,
X LowDetailAddress[DETAIL_ADDR_LEN], LowDetailMask[DETAIL_ADDR_LEN],
X HighDetailAddress[DETAIL_ADDR_LEN], HighDetailMask[DETAIL_ADDR_LEN];
X unsigned char FlowStatus, FlowRuleSet, FlowType;
X unsigned long
X FwdPackets,FwdBytes, BackPackets,BackBytes,
X FirstTime,LastTime;
X };
X
Xstruct rule_info {
X int RuleSet, RuleNbr;
X unsigned char RuleSelector,
X RuleMask[RULE_ADDR_LEN], RuleMatchedValue[RULE_ADDR_LEN],
X RuleAction, RuleJumpIndex;
X };
X
X#define AT_IGNORE 0 /* Addr_type values */
X#define AT_IP 2
X#define AT_NOVELL 6
X#define AT_DECNET 5
X#define AT_ETHERTALK 7
X
X#define PT_ICMP 1 /* IP protocol type values */
X#define PT_TCP 6
X#define PT_UDP 17
X
X#define WNP_FTPDATA 20 /* Well-known tcp/udp port numbers */
X#define WNP_FTP 21
X#define WNP_TELNET 23
X#define WNP_SMTP 25
X#define WNP_DOMAIN 53
X#define WNP_NNTP 119
X#define WNP_NTP 123
X#define WNP_SNMP 161
X
X#define RA_COUNT 1
X#define RA_TALLY 2
X#define RA_AGGREGATE 3
X#define RA_SUCCEED 4
X#define RA_FAIL 5
X#define RA_PUSHTO 6
X#define RA_POPTO 7
X#define RA_GOTO 8
X
X#define RF_SET -1
X#define RF_RULES -2
X#define RF_ACTIONS -3
X#define RF_FORMAT -4
X#define RF_STATS -5
X
X#define FTFLOWINDEX 1 /* Flow table attribute values */
X#define FTFLOWSTATUS 2
X
X#define FTLOWINTERFACE 3
X#define FTLOWADJACENTTYPE 4
X#define FTLOWADJACENTADDRESS 5
X#define FTLOWADJACENTMASK 6
X#define FTLOWPEERTYPE 7
X#define FTLOWPEERTYPEMASK 8
X#define FTLOWPEERADDRESS 9
X#define FTLOWPEERMASK 10
X#define FTLOWDETAILTYPE 11
X#define FTLOWDETAILTYPEMASK 12
X#define FTLOWDETAILADDRESS 13
X#define FTLOWDETAILMASK 14
X#define FTLOWSUBSCRIBERID 15
X#define FTLOWSUBSCRIBERMASK 16
X#define FTHIINTERFACE 17
X#define FTHIADJACENTTYPE 18
X#define FTHIADJACENTADDRESS 19
X#define FTHIADJACENTMASK 20
X#define FTHIPEERTYPE 21
X#define FTHIPEERTYPEMASK 22
X#define FTHIPEERADDRESS 23
X#define FTHIPEERMASK 24
X#define FTHIDETAILTYPE 25
X#define FTHIDETAILTYPEMASK 26
X#define FTHIDETAILADDRESS 27
X#define FTHIDETAILMASK 28
X#define FTHISUBSCRIBERID 29
X#define FTHISUBSCRIBERMASK 30
X
X#define FTSUBSCRIBERID 31
X#define FTSUBSCRIBERMASK 32
X
X#define FTPDUSCALE 33
X#define FTOCTETSCALE 34
X#define FTRULESET 35
X#define FTFLOWTYPE 36
X
X#define FTUPOCTETS 37
X#define FTUPPDUS 38
X#define FTDOWNOCTETS 39
X#define FTDOWNPDUS 40
X
X#define FTFIRSTTIME 41
X#define FTLASTTIME 42
X
X#define NATTRIBS FTLASTTIME
X
Xstruct attrib_info {
X char *name;
X unsigned char index;
X unsigned char len;
X };
X
XEXTERN struct attrib_info attribs[1+NATTRIBS]
X#if DECLARE
X = {
X /* Serial search -> longest names first! */
X "null", 0, 0,
X "flowindex", FTFLOWINDEX, 2,
X "flowstatus", FTFLOWSTATUS, 1,
X "sourceinterface", FTLOWINTERFACE, 1,
X "sourceadjacenttype", FTLOWADJACENTTYPE, 1,
X "sourceadjacentaddress", FTLOWADJACENTADDRESS, MAC_ADDR_LEN,
X "sourceadjacentmask", FTLOWADJACENTMASK, MAC_ADDR_LEN,
X "sourcepeertypemask", FTLOWPEERTYPEMASK, 1,
X "sourcepeertype", FTLOWPEERTYPE, 1,
X "sourcepeeraddress", FTLOWPEERADDRESS, PEER_ADDR_LEN,
X "sourcepeermask", FTLOWPEERMASK, PEER_ADDR_LEN,
X "sourcedetailtypemask", FTLOWDETAILTYPEMASK, 1,
X "sourcedetailtype", FTLOWDETAILTYPE, 1,
X "sourcedetailaddress", FTLOWDETAILADDRESS, DETAIL_ADDR_LEN,
X "sourcedetailmask", FTLOWDETAILMASK, DETAIL_ADDR_LEN,
X "sourcesubscriberid", FTLOWSUBSCRIBERID, 0,
X "sourcesubscribermask", FTLOWSUBSCRIBERMASK, 0,
X "destinterface", FTHIINTERFACE, 1,
X "destadjacenttype", FTHIADJACENTTYPE, 1,
X "destadjacentaddress", FTHIADJACENTADDRESS, MAC_ADDR_LEN,
X "destadjacentmask", FTHIADJACENTMASK, MAC_ADDR_LEN,
X "destpeertypemask", FTHIPEERTYPEMASK, 1,
X "destpeertype", FTHIPEERTYPE, 1,
X "destpeeraddress", FTHIPEERADDRESS, PEER_ADDR_LEN,
X "destpeermask", FTHIPEERMASK, PEER_ADDR_LEN,
X "destdetailtypemask", FTHIDETAILTYPEMASK, 1,
X "destdetailtype", FTHIDETAILTYPE, 1,
X "destdetailaddress", FTHIDETAILADDRESS, DETAIL_ADDR_LEN,
X "destdetailmask", FTHIDETAILMASK, DETAIL_ADDR_LEN,
X "destsubscriberid", FTHISUBSCRIBERID, 0,
X "destsubscribermask", FTHISUBSCRIBERMASK, 0,
X "subscriberid", FTSUBSCRIBERID, 0,
X "subscribermask", FTSUBSCRIBERMASK, 0,
X "pduscale", FTPDUSCALE, 0,
X "octetscale", FTOCTETSCALE, 0,
X "flowruleset", FTRULESET, 1,
X "flowtype", FTFLOWTYPE, 1,
X "tooctets", FTUPOCTETS, 4,
X "topdus", FTUPPDUS, 4,
X "fromoctets", FTDOWNOCTETS, 4,
X "frompdus", FTDOWNPDUS, 4,
X "firsttime", FTFIRSTTIME, 4,
X "lasttime", FTLASTTIME, 4 }
X#endif
X ;
X
XEXTERN unsigned char col_order[1+NATTRIBS] /* In descending-length order */
X#if DECLARE
X = {
X FTLOWADJACENTADDRESS,FTLOWADJACENTMASK,
X FTHIADJACENTADDRESS,FTHIADJACENTMASK,
X
X FTLOWPEERADDRESS,FTLOWPEERMASK,
X FTHIPEERADDRESS,FTHIPEERMASK,
X FTUPOCTETS,FTUPPDUS, FTDOWNOCTETS,FTDOWNPDUS,
X FTFIRSTTIME,FTLASTTIME,
X
X FTLOWDETAILADDRESS,FTLOWDETAILMASK,
X FTHIDETAILADDRESS,FTHIDETAILMASK,
X
X FTFLOWSTATUS,
X FTLOWINTERFACE,FTLOWADJACENTTYPE,
X FTLOWPEERTYPE,FTLOWPEERTYPEMASK,
X FTLOWDETAILTYPE,FTLOWDETAILTYPEMASK,
X FTHIINTERFACE,FTHIADJACENTTYPE,
X FTHIPEERTYPE,FTHIPEERTYPEMASK,
X FTHIDETAILTYPE,FTHIDETAILTYPEMASK,
X FTRULESET,FTFLOWTYPE,
X
X NULL, /* Marks end of implemented attributes */
X
X FTPDUSCALE,FTOCTETSCALE,
X FTLOWSUBSCRIBERID,FTLOWSUBSCRIBERMASK,
X FTHISUBSCRIBERID,FTHISUBSCRIBERMASK,
X FTSUBSCRIBERID,FTSUBSCRIBERMASK,
X
X FTFLOWINDEX } /* Never retrieve FlowIndex explicitly! */
X#endif
X ;
X
X#define FLOWBLOBSZ 55
X
XEXTERN unsigned char column_blob[
X (FLOWBLOBSZ+2)*(2+RULE_ADDR_LEN)];
X
XEXTERN struct flow_info flows[(FLOWBLOBSZ+2)*MAC_ADDR_LEN/DETAIL_ADDR_LEN];
X
X#ifdef AU_MSDOS /* PC ntoh routines swap the byte order */
X#define netshort(x) x
X#define netlong(x) x
X#else /* SunOS ntoh routines don't */
X#define netshort(x) htons(x)
X#define netlong(x) htonl(x)
X#endif
X
X#define NAME_LN 64
X
Xstruct meter_status {
X struct meter_status *next;
X
X char name[NAME_LN]; /* Meter name (DNS name or IP address) */
X unsigned char community[NAME_LN]; /* Write-access SNMP community */
X char rulefile[NAME_LN];
X
X struct snmp_session *ss;
X
X short status;
X
X char descr[NAME_LN]; /* From meter_info() */
X unsigned long uptime;
X unsigned long OurLastCollectTime;
X
X int CurrentRuleSet, /* From meter */
X ruleset, nrules, nactions; /* From rule file */
X
X unsigned char format[1+NATTRIBS];
X char *separator[1+NATTRIBS];
X unsigned char required[1+NATTRIBS];
X
X unsigned long LastCollectTime; /* By any collector, not neccessarily us */
X
X unsigned int snmp_delay; /* ms to wait after snmp requests */
X
X unsigned char statsreqd;
X
X int InactivityTime; /* Meter control variables */
X unsigned char HighWaterMark, GCIntervalReqd;
X
X unsigned char GCInterval; /* Meter Statistics variables */
X unsigned int
X MaxPktRate,MaxPktBacklog,
X TotalHashSize,NbrHashEntries,
X NbrFlows,MaxFlows,
X AvIdle1000,MinIdle1000;
X unsigned long
X StatsTime,NbrPackets,TotPktBacklog,LostPackets,
X RuleMatches,HashSearches,HashCompares,
X FlowsRecovered;
X
X FILE *flows;
X };
X
XEXTERN FILE *log;
X
XEXTERN struct meter_status *first_meter;
XEXTERN int nmeters;
X
X/* Values for status */
X
X#define MT_MANAGE 0x0001 /* Manage this meter */
X#define MT_INFO 0x0002 /* Have basic info */
X#define MT_UP 0x0004 /* Meter is running */
X#define MT_REPORTED 0x0008 /* Current status reported */
X
X
XEXTERN FILE *rfp; /* Scanner globals */
XEXTERN char inbuf[256], *ibp;
XEXTERN int lic, ic, /* Last input char, current input char */
X iblisted, rule_line, rferrors;
X
X
X/* Forward procedure declarations .. */
X
Xunsigned short getshort(unsigned char *ucp);
Xunsigned long getlong(unsigned char *ucp);
Xunsigned short get_slice(struct meter_status *ms,
X unsigned short first_row, unsigned char col,
X unsigned char first);
X
Xvoid write_attrib(FILE *f,
X struct flow_info *fp, unsigned char col);
X
Xint create_meter(struct meter_status *ms);
Xvoid monitor(struct meter_status *ms);
Xvoid print_meters();
Xvoid meter_print(FILE *f,struct meter_status *ms);
X
X/* Functions declared in nmc_pars.c */
X
Xvoid mswait(unsigned int ms);
XFILE *wfopen(char *fn);
Xchar *gnbr(unsigned int *n, char *s);
Xchar *gcstring(char *s, int *len);
X
Xchar *fmt_time(time_t *t);
Xchar *uptime_string(unsigned long timeticks, char *buf);
Xvoid printaddress(FILE *f,unsigned char *a,unsigned char addrsz);
Xvoid printruleaddress(FILE *f,unsigned char *a,unsigned char addrsz);
X
Xint parse_open(char *fn);
Xint nextchar(void);
Xvoid getarg(char *arg);
Xint wordis(char *p,char *w);
Xint getword(void);
Xint getnbr(void);
Xunsigned int getint(unsigned int *base);
Xvoid getaddress(unsigned char *a,unsigned char len,
X unsigned char addrsz);
Xint getattribute(unsigned char col,struct flow_info *fp);
X
Xint scan_rulefile(struct meter_status *ms, int doset, int list);
Xvoid parse_rulefile(struct meter_status *ms, int list);
X
X/* Functions declared in nmc_snmp.c */
X
Xint start_snmp_session(struct meter_status *ms);
Xint set_meter_params(struct meter_status *ms);
Xint set_collect_time(struct meter_status *ms, int v);
Xint set_rule_info(struct meter_status *ms, int setset);
Xint add_rule(struct meter_status *ms, struct rule_info *ri);
Xint add_action(struct meter_status *ms, struct flow_info *ai,
X unsigned char ActionSet,unsigned char ActionNbr,
X unsigned char *required);
Xint same_acct_oid(oid *a, oid *b);
Xint column_info(struct meter_status *ms, unsigned char *fb,
X unsigned char a, unsigned long ft, int *fn);
Xint meter_info(struct meter_status *ms);
X
X
X
END_OF_FILE
if test 11711 -ne `wc -c <'netramet/src/manager/include/nmc.h'`; then
echo shar: \"'netramet/src/manager/include/nmc.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/include/nmc.h'
fi
if test -f 'netramet/src/meter/include/decnet.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/include/decnet.h'\"
else
echo shar: Extracting \"'netramet/src/meter/include/decnet.h'\" \(1935 characters\)
sed "s/^X//" >'netramet/src/meter/include/decnet.h' <<'END_OF_FILE'
X/* 1555, Wed 30 Sep 92
X
X DECnet packet layouts
X
X Nevil Brownlee, Computer Centre, University of Auckland */
X
Xstruct level1_routing { /* Type 07 */
X unsigned char
X src_dn_addr[2], /* Router DECnet address */
X rsrv1[5], /* 00 20 00 e0 01 */
X rt_info; /* 2 bytes per entry */
X };
X
Xstruct level2_routing { /* Type 09 */
X unsigned char
X src_dn_addr[2], /* Router DECnet address */
X rsrv1[5], /* 00 20 00 01 00 */
X rt_info; /* 2 bytes per entry */
X };
X
Xstruct router_hello { /* Type 0b, (81 0b ?) */
X unsigned char rsrv1, /* 02 */
X en_zero1[2], /* 00 00 */
X dec_en_hdr1[4], /* aa 00 04 00 */
X src_dn_addr[2], /* Router DECnet address */
X rsrv2[17], /* 02 da 05 00 ... */
X dec_en_hdr2[4], /* aa 00 04 00 Other Router addresses */
X rtr_dn_addr[2], /* DECnet address */
X rtr_info; /* 7 bytes per entry */
X };
X
Xstruct endnode_hello { /* Type 0d, 81 0d */
X unsigned char rsrv1, /* 02 */
X en_zero1[2], /* 00 00 */
X dec_en_hdr1[4], /* aa 00 04 00 */
X src_dn_addr[2], /* Host DECnet address */
X rsrv2[10], /* 03 da 05 00 ... */
X en_zero2[2], /* 00 00 */
X dec_en_hdr2[4], /* aa 00 04 00 */
X rtr_dn_addr[2]; /* Designated Router DECnet address */
X };
X
Xstruct data { /* Type 26, 81 26, 2e, 81 2e */
X unsigned char
X en_zero1[2], /* 00 00 */
X dec_en_hdr1[4], /* aa 00 04 00 */
X dest_dn_addr[2], /* Host DECnet address */
X en_zero2[2], /* 00 00 */
X dec_en_hdr2[4], /* aa 00 04 00 */
X src_dn_addr[2], /* Host DECnet address */
X data[1];
X };
X
Xunion decnet {
X struct level1_routing l1r;
X struct level2_routing l2r;
X struct router_hello rh;
X struct endnode_hello eh;
X struct data d;
X };
X
X
END_OF_FILE
if test 1935 -ne `wc -c <'netramet/src/meter/include/decnet.h'`; then
echo shar: \"'netramet/src/meter/include/decnet.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/include/decnet.h'
fi
echo shar: End of archive 11 \(of 25\).
cp /dev/null ark11isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:11:35 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 100
Archive-name: netramet/part12
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/mib/mib.txt netramet/src/apps/snmpnetstat/inet.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:08 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 12 (of 25)."'
if test -f 'netramet/mib/mib.txt' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/mib/mib.txt'\"
else
echo shar: Extracting \"'netramet/mib/mib.txt'\" \(47344 characters\)
sed "s/^X//" >'netramet/mib/mib.txt' <<'END_OF_FILE'
X mgmt OBJECT IDENTIFIER ::= { iso org(3) dod(6) internet(1) mgmt(2) }
X mib OBJECT IDENTIFIER ::= { mgmt 1 }
X directory OBJECT IDENTIFIER ::= { internet 1 }
X experimental OBJECT IDENTIFIER ::= { internet 3 }
X private OBJECT IDENTIFIER ::= { internet 4 }
X enterprises OBJECT IDENTIFIER ::= { private 1 }
X
X system OBJECT IDENTIFIER ::= { mib 1 }
X interfaces OBJECT IDENTIFIER ::= { mib 2 }
X at OBJECT IDENTIFIER ::= { mib 3 }
X ip OBJECT IDENTIFIER ::= { mib 4 }
X icmp OBJECT IDENTIFIER ::= { mib 5 }
X tcp OBJECT IDENTIFIER ::= { mib 6 }
X udp OBJECT IDENTIFIER ::= { mib 7 }
X egp OBJECT IDENTIFIER ::= { mib 8 }
X
X -- object types
X
X -- the System group
X
X sysDescr OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { system 1 }
X
X sysObjectID OBJECT-TYPE
X SYNTAX OBJECT IDENTIFIER
X ACCESS read-only
X STATUS mandatory
X ::= { system 2 }
X
X sysUpTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory
X ::= { system 3 }
X
X -- the Interfaces group
X
X ifNumber OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { interfaces 1 }
X
X -- the Interfaces table
X
X ifTable OBJECT-TYPE
X SYNTAX SEQUENCE OF IfEntry
X ACCESS read-write
X STATUS mandatory
X ::= { interfaces 2 }
X
X ifEntry OBJECT-TYPE
X SYNTAX IfEntry
X ACCESS read-write
X STATUS mandatory
X ::= { ifTable 1 }
X
X IfEntry ::= SEQUENCE {
X ifIndex INTEGER,
X ifDescr OCTET STRING,
X ifType INTEGER,
X ifMtu INTEGER,
X ifSpeed Gauge,
X ifPhysAddress OCTET STRING,
X ifAdminStatus INTEGER,
X ifOperStatus INTEGER,
X ifLastChange TimeTicks,
X ifInOctets Counter,
X ifInUcastPkts Counter,
X ifInNUcastPkts Counter,
X ifInDiscards Counter,
X ifInErrors Counter,
X ifInUnknownProtos Counter,
X ifOutOctets Counter,
X ifOutUcastPkts Counter,
X ifOutNUcastPkts Counter,
X ifOutDiscards Counter,
X ifOutErrors Counter,
X ifOutQLen Gauge
X }
X
X ifIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 1 }
X
X ifDescr OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 2 }
X
X ifType OBJECT-TYPE
X SYNTAX INTEGER {
X other(1), -- none of the following
X regular1822(2),
X hdh1822(3),
X ddn-x25(4),
X rfc877-x25(5),
X ethernet-csmacd(6),
X iso88023-csmacd(7),
X iso88024-tokenBus(8),
X iso88025-tokenRing(9),
X iso88026-man(10),
X starLan(11),
X proteon-10MBit(12),
X proteon-80MBit(13),
X hyperchannel(14),
X fddi(15),
X lapb(16),
X sdlc(17),
X t1-carrier(18),
X cept(19),
X basicIsdn(20),
X primaryIsdn(21),
X -- proprietary serial
X propPointToPointSerial(22)
X }
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 3 }
X
X ifMtu OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 4 }
X
X ifSpeed OBJECT-TYPE
X SYNTAX Gauge
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 5 }
X
X ifPhysAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 6 }
X
X ifAdminStatus OBJECT-TYPE
X SYNTAX INTEGER {
X up(1), -- ready to pass packets
X down(2),
X testing(3) -- in some test mode
X }
X ACCESS read-write
X STATUS mandatory
X ::= { ifEntry 7 }
X
X ifOperStatus OBJECT-TYPE
X SYNTAX INTEGER {
X up(1), -- ready to pass packets
X down(2),
X testing(3) -- in some test mode
X }
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 8 }
X
X ifLastChange OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 9 }
X
X ifInOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 10 }
X
X ifInUcastPkts OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 11 }
X
X ifInNUcastPkts OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 12 }
X
X ifInDiscards OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 13 }
X
X ifInErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 14 }
X
X ifInUnknownProtos OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 15 }
X
X ifOutOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 16 }
X
X ifOutUcastPkts OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 17 }
X
X ifOutNUcastPkts OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 18 }
X
X ifOutDiscards OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 19 }
X
X ifOutErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 20 }
X
X ifOutQLen OBJECT-TYPE
X SYNTAX Gauge
X ACCESS read-only
X STATUS mandatory
X ::= { ifEntry 21 }
X
X -- the Address Translation group
X
X atTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AtEntry
X ACCESS read-write
X STATUS mandatory
X ::= { at 1 }
X
X atEntry OBJECT-TYPE
X SYNTAX AtEntry
X ACCESS read-write
X STATUS mandatory
X ::= { atTable 1 }
X
X AtEntry ::= SEQUENCE {
X atIfIndex INTEGER,
X atPhysAddress OCTET STRING,
X atNetAddress NetworkAddress
X }
X
X atIfIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { atEntry 1 }
X
X atPhysAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { atEntry 2 }
X
X atNetAddress OBJECT-TYPE
X SYNTAX NetworkAddress
X ACCESS read-write
X STATUS mandatory
X ::= { atEntry 3 }
X
X -- the IP group
X
X ipForwarding OBJECT-TYPE
X SYNTAX INTEGER {
X gateway(1), -- entity forwards datagrams
X host(2) -- entity does NOT forward datagrams
X }
X ACCESS read-only
X STATUS mandatory
X ::= { ip 1 }
X
X ipDefaultTTL OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ip 2 }
X
X ipInReceives OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 3 }
X
X ipInHdrErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 4 }
X
X ipInAddrErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 5 }
X
X ipForwDatagrams OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 6 }
X
X ipInUnknownProtos OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 7 }
X
X ipInDiscards OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 8 }
X
X ipInDelivers OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 9 }
X
X ipOutRequests OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 10 }
X
X ipOutDiscards OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 11 }
X
X ipOutNoRoutes OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 12 }
X
X ipReasmTimeout OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { ip 13 }
X
X ipReasmReqds OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 14 }
X
X ipReasmOKs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 15 }
X
X ipReasmFails OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 16 }
X
X ipFragOKs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 17 }
X
X ipFragFails OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 18 }
X
X ipFragCreates OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { ip 19 }
X
X -- the IP Interface table
X
X ipAddrTable OBJECT-TYPE
X SYNTAX SEQUENCE OF IpAddrEntry
X ACCESS read-only
X STATUS mandatory
X ::= { ip 20 }
X
X ipAddrEntry OBJECT-TYPE
X SYNTAX IpAddrEntry
X ACCESS read-only
X STATUS mandatory
X ::= { ipAddrTable 1 }
X
X IpAddrEntry ::= SEQUENCE {
X ipAdEntAddr IpAddress,
X ipAdEntIfIndex INTEGER,
X ipAdEntNetMask IpAddress,
X ipAdEntBcastAddr INTEGER
X }
X
X ipAdEntAddr OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-only
X STATUS mandatory
X ::= { ipAddrEntry 1 }
X
X ipAdEntIfIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { ipAddrEntry 2 }
X
X ipAdEntNetMask OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-only
X STATUS mandatory
X ::= { ipAddrEntry 3 }
X
X ipAdEntBcastAddr OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { ipAddrEntry 4 }
X
X -- the IP Routing table
X
X ipRoutingTable OBJECT-TYPE
X SYNTAX SEQUENCE OF IpRouteEntry
X ACCESS read-write
X STATUS mandatory
X ::= { ip 21 }
X
X ipRouteEntry OBJECT-TYPE
X SYNTAX IpRouteEntry
X ACCESS read-write
X STATUS mandatory
X ::= { ipRoutingTable 1 }
X
X IpRouteEntry ::= SEQUENCE {
X ipRouteDest
X IpAddress,
X ipRouteIfIndex INTEGER,
X ipRouteMetric1 INTEGER,
X ipRouteMetric2 INTEGER,
X ipRouteMetric3 INTEGER,
X ipRouteMetric4 INTEGER,
X ipRouteNextHop IpAddress,
X ipRouteType INTEGER,
X ipRouteProto INTEGER,
X ipRouteAge INTEGER
X }
X
X ipRouteDest OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 1 }
X
X ipRouteIfIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 2 }
X
X ipRouteMetric1 OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 3 }
X
X ipRouteMetric2 OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 4 }
X
X ipRouteMetric3 OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 5 }
X
X ipRouteMetric4 OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 6 }
X
X ipRouteNextHop OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 7 }
X
X ipRouteType OBJECT-TYPE
X SYNTAX INTEGER {
X other(1), -- none of the following
X
X invalid(2), -- an invalidated route
X
X -- route to directly
X direct(3), -- connected (sub-)network
X
X -- route to a non-local
X remote(4), -- host/network/sub-network
X }
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 8 }
X
X ipRouteProto OBJECT-TYPE
X SYNTAX INTEGER {
X other(1), -- none of the following
X
X -- non-protocol information
X -- e.g., manually
X local(2), -- configured entries
X
X -- set via a network
X netmgmt(3), -- management protocol
X
X -- obtained via ICMP,
X icmp(4), -- e.g., Redirect
X
X -- the following are
X -- gateway routing protocols
X egp(5),
X ggp(6),
X hello(7),
X rip(8),
X is-is(9),
X es-is(10),
X ciscoIgrp(11),
X bbnSpfIgp(12),
X oigp(13)
X }
X ACCESS read-only
X STATUS mandatory
X ::= { ipRouteEntry 9 }
X
X ipRouteAge OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { ipRouteEntry 10 }
X
X -- the ICMP group
X
X icmpInMsgs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 1 }
X
X icmpInErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 2 }
X
X icmpInDestUnreachs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 3 }
X
X icmpInTimeExcds OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 4 }
X
X icmpInParmProbs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 5 }
X
X icmpInSrcQuenchs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 6 }
X
X icmpInRedirects OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 7 }
X
X icmpInEchos OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 8 }
X
X icmpInEchoReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 9 }
X
X icmpInTimestamps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 10 }
X
X icmpInTimestampReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 11 }
X
X icmpInAddrMasks OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 12 }
X
X icmpInAddrMaskReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 13 }
X
X icmpOutMsgs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 14 }
X
X icmpOutErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 15 }
X
X icmpOutDestUnreachs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 16 }
X
X icmpOutTimeExcds OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 17 }
X
X icmpOutParmProbs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 18 }
X
X icmpOutSrcQuenchs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 19 }
X
X icmpOutRedirects OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 20 }
X
X icmpOutEchos OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 21 }
X
X icmpOutEchoReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 22 }
X
X icmpOutTimestamps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 23 }
X
X icmpOutTimestampReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 24 }
X
X icmpOutAddrMasks OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 25 }
X
X icmpOutAddrMaskReps OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { icmp 26 }
X
X -- the TCP group
X
X tcpRtoAlgorithm OBJECT-TYPE
X SYNTAX INTEGER {
X other(1), -- none of the following
X constant(2), -- a constant rto
X rsre(3), -- MIL-STD-1778, Appendix B
X vanj(4) -- Van Jacobson's algorithm [11]
X }
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 1 }
X
X tcpRtoMin OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 2 }
X
X tcpRtoMax OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 3 }
X
X tcpMaxConn OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 4 }
X
X tcpActiveOpens OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 5 }
X
X tcpPassiveOpens OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 6 }
X
X tcpAttemptFails OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 7 }
X
X tcpEstabResets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 8 }
X
X tcpCurrEstab OBJECT-TYPE
X SYNTAX Gauge
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 9 }
X
X tcpInSegs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 10 }
X
X tcpOutSegs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 11 }
X
X tcpRetransSegs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 12 }
X
X -- the TCP connections table
X
X tcpConnTable OBJECT-TYPE
X SYNTAX SEQUENCE OF TcpConnEntry
X ACCESS read-only
X STATUS mandatory
X ::= { tcp 13 }
X
X tcpConnEntry OBJECT-TYPE
X SYNTAX TcpConnEntry
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnTable 1 }
X
X TcpConnEntry ::= SEQUENCE {
X tcpConnState INTEGER,
X tcpConnLocalAddress IpAddress,
X tcpConnLocalPort INTEGER (0..65535),
X tcpConnRemAddress IpAddress,
X tcpConnRemPort INTEGER (0..65535)
X }
X
X tcpConnState OBJECT-TYPE
X SYNTAX INTEGER {
X closed(1),
X listen(2),
X synSent(3),
X synReceived(4),
X established(5),
X finWait1(6),
X finWait2(7),
X closeWait(8),
X lastAck(9),
X closing(10),
X timeWait(11)
X }
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnEntry 1 }
X
X tcpConnLocalAddress OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnEntry 2 }
X
X tcpConnLocalPort OBJECT-TYPE
X SYNTAX INTEGER (0..65535)
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnEntry 3 }
X
X tcpConnRemAddress OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnEntry 4 }
X
X tcpConnRemPort OBJECT-TYPE
X SYNTAX INTEGER (0..65535)
X ACCESS read-only
X STATUS mandatory
X ::= { tcpConnEntry 5 }
X
X -- the UDP group
X
X udpInDatagrams OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { udp 1 }
X
X udpNoPorts OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { udp 2 }
X
X udpInErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { udp 3 }
X
X udpOutDatagrams OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { udp 4 }
X
X -- the EGP group
X
X egpInMsgs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { egp 1 }
X
X egpInErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { egp 2 }
X
X egpOutMsgs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { egp 3 }
X
X egpOutErrors OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { egp 4 }
X
X -- the EGP Neighbor table
X
X egpNeighTable OBJECT-TYPE
X SYNTAX SEQUENCE OF EgpNeighEntry
X ACCESS read-only
X STATUS mandatory
X ::= { egp 5 }
X
X egpNeighEntry OBJECT-TYPE
X SYNTAX EgpNeighEntry
X ACCESS read-only
X STATUS mandatory
X ::= { egpNeighTable 1 }
X
X EgpNeighEntry ::= SEQUENCE {
X egpNeighState INTEGER,
X egpNeighAddr IpAddress
X }
X
X egpNeighState OBJECT-TYPE
X SYNTAX INTEGER {
X idle(1),
X acquisition(2),
X down(3),
X up(4),
X cease(5)
X }
X ACCESS read-only
X STATUS mandatory
X ::= { egpNeighEntry 1 }
X
X egpNeighAddr OBJECT-TYPE
X SYNTAX IpAddress
X ACCESS read-only
X STATUS mandatory
X ::= { egpNeighEntry 2 }
Xinternet-accounting OBJECT IDENTIFIER ::= { experimental 99 }
Xcontrol OBJECT IDENTIFIER ::= { internet-accounting 1 }
Xflowdata OBJECT IDENTIFIER ::= { internet-accounting 2 }
Xruledata OBJECT IDENTIFIER ::= { internet-accounting 3 }
Xactiondata OBJECT IDENTIFIER ::= { internet-accounting 4 }
XacctHighWaterMark OBJECT-TYPE
X SYNTAX INTEGER (0..100)
X ACCESS read-write
X STATUS mandatory
X ::= { control 1 }
XacctFloodMark OBJECT-TYPE
X SYNTAX INTEGER (0..100)
X ACCESS read-write
X STATUS mandatory
X ::= { control 2 }
XacctInactivityTimeout OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { control 3 }
XacctFlowSamplingRate OBJECT-TYPE
X SYNTAX SEQUENCE OF FlowSamplingRate
X ACCESS not-accessible
X STATUS mandatory
X ::= { control 4 }
XFlowSamplingRate ::= SEQUENCE { rate INTEGER }
XacctCollectorInfo OBJECT-TYPE
X SYNTAX SEQUENCE OF acctCollectorInfoEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { control 5 }
XacctCollectorInfoEntry OBJECT-TYPE
X SYNTAX AcctCollectorInfoEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctCollectorIndex }
X ::= { acctCollectorInfo 1 }
XAcctCollectorInfoEntry ::= SEQUENCE {
X acctCollectorIndex INTEGER,
X acctCollectorPeerAddress OCTET STRING,
X acctCollectorLastTime TIMETICKS,
X acctCollectorPreviousTime TIMETICKS
X }
XacctCollectorIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctCollectorInfoEntry 1 }
XacctCollectorPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctCollectorInfoEntry 2 }
XcacctCollectorLastTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-only
X STATUS mandatory
X ::= { acctCollectorInfoEntry 3 }
XacctCollectorPreviousTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-only
X STATUS mandatory
X ::= { acctCollectorInfoEntry 4 }
XacctLastCollectTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-write
X STATUS mandatory
X ::= { control 6 }
XacctRuleSetInfo OBJECT-TYPE
X SYNTAX SEQUENCE OF acctRuleInfoEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { control 7 }
XacctRuleInfoEntry OBJECT-TYPE
X SYNTAX AcctRuleInfoEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctRuleInfoIndex }
X ::= { acctRuleSetInfo 1 }
XAcctRuleInfoEntry ::= SEQUENCE {
X acctRuleInfoIndex INTEGER,
X acctRuleInfoRuleSize INTEGER,
X acctRuleInfoActionSize INTEGER
X }
XacctRuleInfoIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleInfoEntry 1 }
XacctRuleInfoRuleSize OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleInfoEntry 2 }
XacctRuleInfoActionSize OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleInfoEntry 3 }
XacctCurrentRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { control 8 }
XacctEmergencyRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { control 9 }
XacctFlowTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctFlowEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { flowdata 1 }
XacctFlowEntry OBJECT-TYPE
X SYNTAX AcctFlowEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctFlowIndex }
X ::= { acctFlowTable 1 }
XAcctFlowEntry ::= SEQUENCE {
X acctFlowIndex INTEGER,
X acctFlowStatus INTEGER,
X acctFlowSourceInterface INTEGER, -- Source Address Tuple
X acctFlowSourceAdjacentType INTEGER,
X acctFlowSourceAdjacentAddress OCTET STRING,
X acctFlowSourceAdjacentMask OCTET STRING,
X acctFlowSourcePeerType INTEGER,
X acctFlowSourcePeerTypeMask INTEGER,
X acctFlowSourcePeerAddress OCTET STRING,
X acctFlowSourcePeerMask OCTET STRING,
X acctFlowSourceDetailType INTEGER,
X acctFlowSourceDetailTypeMask INTEGER,
X acctFlowSourceDetailAddress OCTET STRING,
X acctFlowSourceDetailMask OCTET STRING,
X acctFlowSourceSubscriberID OCTET STRING,
X acctFlowSourceSubscriberMask OCTET STRING,
X acctFlowDestInterface INTEGER, -- Dest Address Tuple
X acctFlowDestAdjacentType INTEGER,
X acctFlowDestAdjacentAddress OCTET STRING,
X acctFlowDestAdjacentMask OCTET STRING,
X acctFlowDestPeerType INTEGER,
X acctFlowDestPeerTypeMask INTEGER,
X acctFlowDestPeerAddress OCTET STRING,
X acctFlowDestPeerMask OCTET STRING,
X acctFlowDestDetailType INTEGER,
X acctFlowDestDetailTypeMask INTEGER,
X acctFlowDestDetailAddress OCTET STRING,
X acctFlowDestDetailMask OCTET STRING,
X acctFlowDestSubscriberID OCTET STRING,
X acctFlowDestSubscriberMask OCTET STRING,
X acctFlowSubscriberID OCTET STRING, -- Session attributes
X acctFlowSessionID INTEGER,
X acctFlowPDUScale INTEGER, -- Rule Set attributes
X acctFlowOctetScale INTEGER,
X acctFlowRuleSet INTEGER,
X acctFlowType INTEGER,
X acctFlowToOctets Counter, -- Source-to-Dest counters
X acctFlowToPDUs Counter,
X acctFlowFromOctets Counter, -- Dest-to-Source counters
X acctFlowFromPDUs Counter,
X acctFlowFirstTime TimeTicks, -- Activity times
X acctFlowLastTime TimeTicks
X }
XacctFlowIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 1 }
XacctFlowStatus OBJECT-TYPE
X SYNTAX INTEGER { valid(1), invalid(2) }
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 2 }
XacctFlowSourceInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 3 }
XacctFlowSourceAdjacentType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 4 }
XacctFlowSourceAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 5 }
XacctFlowSourceAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 6 }
XacctFlowSourcePeerType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 7 }
XacctFlowSourcePeerTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 8 }
XacctFlowSourcePeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 9 }
XacctFlowSourcePeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 10 }
XacctFlowSourceDetailType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 11 }
XacctFlowSourceDetailTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 12 }
XacctFlowSourceDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 13 }
XacctFlowSourceDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 14 }
XacctFlowSourceSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 15 }
XacctFlowSourceSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 16 }
XacctFlowDestInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 17 }
XacctFlowDestAdjacentType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 18 }
XacctFlowDestAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 19 }
XacctFlowDestAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 20 }
XacctFlowDestPeerType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 21 }
XacctFlowDestPeerTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 22 }
XacctFlowDestPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 23 }
XacctFlowDestPeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 24 }
XacctFlowDestDetailType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 25 }
XacctFlowDestDetailTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 26 }
XacctFlowDestDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 27 }
XacctFlowDestDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 28 }
XacctFlowDestSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 29 }
XacctFlowDestSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 30 }
XacctFlowSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 31 }
XacctFlowSessionID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 32 }
XacctFlowPDUScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 33 }
XacctFlowOctetScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 34 }
XacctFlowRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 35 }
XacctFlowType OBJECT-TYPE
X SYNTAX INTEGER { count(1), tally(2), aggregate(3) }
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 36 }
XacctFlowToOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 37 }
XacctFlowToPDUs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 38 }
XacctFlowFromOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 39 }
XacctFlowFromPDUs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 40 }
XacctFlowFirstTime OBJECT-TYPE
X SYNTAX Timeticks
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 41 }
XacctFlowLastTime OBJECT-TYPE
X SYNTAX Timeticks
X ACCESS read-only
X STATUS mandatory
X ::= { acctFlowEntry 42 }
XacctCreationTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctCreationEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { flowdata 2 }
XacctCreationEntry OBJECT-TYPE
X SYNTAX AcctCreationEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctCreationTime, acctCreationIndex }
X ::= { acctCreationTable 1 }
XAcctCreationEntry ::= SEQUENCE {
X acctCreationTime TimeTicks,
X acctCreationIndex INTEGER
X }
XacctCreationTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory
X ::= { acctCreationEntry 1 }
XacctCreationIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctCreationEntry 2 }
XacctActivityTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctActivityEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { flowdata 3 }
XacctActivityEntry OBJECT-TYPE
X SYNTAX AcctActivityEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctActivityTime, acctActivityIndex }
X ::= { acctActivityTable 1 }
XAcctActivityEntry ::= SEQUENCE {
X acctActivitytTime TimeTicks,
X acctActivityIndex INTEGER
X }
XacctActivityTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory
X ::= { acctActivityEntry 1 }
XacctActivityIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctActivityEntry 2 }
XacctActivityColumnTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctColumnEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { flowdata 4 }
XacctColumnEntry OBJECT-TYPE
X SYNTAX AcctColumnEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctColumnAttribute, acctColumnTime, acctColumnIndex }
X ::= { acctActivityColumnTable 1 }
XAcctColumnEntry ::= SEQUENCE {
X acctColumnAttribute INTEGER,
X acctColumntTime TimeTicks,
X acctColumnIndex INTEGER,
X acctColumnData OPAQUE
X }
XacctColumnAttribute OBJECT-TYPE
X SYNTAX INTEGER { Null(0),
X FlowIndex(1),FlowStatus(2),
X FlowSourceInterface(3), -- Source Address Tuple
X FlowSourceAdjacentType(4),
X FlowSourceAdjacentAddress(5),FlowSourceAdjacentMask(6),
X FlowSourcePeerType(7),FlowSourcePeerTypeMask(8),
X FlowSourcePeerAddress(9),FlowSourcePeerMask(10),
X FlowSourceDetailType(11),FlowSourceDetailTypeMask(12),
X FlowSourceDetailAddress(13),FlowSourceDetailMask(14),
X FlowSourceSubscriberID(15),FlowSourceSubscriberMask(16),
X FlowDestInterface(17), -- Dest Address Tuple
X FlowDestAdjacentType(18),
X FlowDestAdjacentAddress(19),FlowDestAdjacentMask(20),
X FlowDestPeerType(21),FlowDestPeerTypeMask(22),
X FlowDestPeerAddress(23),FlowDestPeerMask(24),
X FlowDestDetailType(25),FlowDestDetailTypeMask(26),
X FlowDestDetailAddress(27),FlowDestDetailMask(28),
X FlowDestSubscriberID(29),FlowDestSubscriberMask(30),
X FlowSubscriberID(31), -- Session attributes
X FlowSessionID(32),
X FlowPDUScale(33), -- Rule Set attributes
X FlowOctetScale(34),
X FlowRuleSet(35),
X FlowType(36),
X FlowToOctets(37), -- Source-to-Dest counters
X FlowToPDUs(38),
X FlowFromOctets(39), -- Dest-to-Source counters
X FlowFromPDUs(40),
X FlowFirstTime(41), -- Activity times
X FlowLastTime(42)
X }
X ACCESS read-only
X STATUS mandatory
X ::= { acctColumnEntry 1 }
XacctColumnTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory
X ::= { acctColumnEntry 2 }
XacctColumnIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { acctColumnEntry 3 }
XacctColumnFlowData OBJECT-TYPE
X SYNTAX OPAQUE
X ACCESS read-only
X STATUS mandatory
X ::= { acctColumnEntry 4 }
XacctRuleTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctRuleEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { ruledata 1 }
XacctRuleEntry OBJECT-TYPE
X SYNTAX AcctRuleEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctRuleSet, acctRuleIndex }
X ::= { acctRuleTable 1 }
XAcctRuleEntry ::= SEQUENCE {
X acctRuleSet INTEGER,
X acctRuleIndex INTEGER,
X acctRuleSelector INTEGER, -- what to select on
X acctRuleMask OCTET STRING, -- mask value
X acctRuleMatchedValue OCTET STRING, -- matched value
X acctRuleAction INTEGER, -- action to take
X acctRuleJumpIndex INTEGER -- where to go
X }
XacctRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 1 }
XacctRuleIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 2 }
XacctRuleSelector OBJECT-TYPE
X SYNTAX INTEGER { Null(0),
X FlowSourceInterface(3),
X FlowSourceAdjacentType(4),FlowSourceAdjacentAddress(5),
X FlowSourcePeerType(7),
X FlowSourcePeerAddress(9),
X FlowSourceDetailType(11),
X FlowSourceDetailAddress(13),
X FlowSourceSubscriberID(15),
X FlowDestInterface(17),
X FlowDestAdjacentType(18),FlowDestAdjacentAddress(19),
X FlowDestPeerType(21),
X FlowDestPeerAddress(23),
X FlowDestDetailType(25),
X FlowDestDetailAddress(27),
X FlowDestSubscriberID(29),
X FlowSubscriberID(31),FlowSessionID(32),
X }
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 3 }
XacctRuleMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 4 }
XacctRuleMatchedValue OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 5 }
XacctRuleAction OBJECT-TYPE
X SYNTAX INTEGER { count(1), tally(2), aggregate(3),
X succeed(4), fail(5),
X pushto(6), popto(7),
X goto(8) }
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 6 }
XacctRuleJumpIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctRuleEntry 7 }
XacctActionTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctActionEntry
X ACCESS not-accessible
X STATUS mandatory
X ::= { actiondata 1 }
XacctActionEntry OBJECT-TYPE
X SYNTAX AcctActionEntry
X ACCESS not-accessible
X STATUS mandatory
X-- INDEX { acctActionSet, acctActionIndex }
X ::= { acctActionTable 1 }
XAcctActionEntry ::= SEQUENCE {
X acctActionIndex INTEGER,
X acctActionStatus INTEGER,
X acctActionSourceInterface INTEGER, -- Source AddressTuple
X acctActionSourceAdjacentType INTEGER,
X acctActionSourceAdjacentAddress OCTET STRING,
X acctActionSourceAdjacentMask OCTET STRING,
X acctActionSourcePeerType INTEGER,
X acctActionSourcePeerTypeMask INTEGER,
X acctActionSourcePeerAddress OCTET STRING,
X acctActionSourcePeerMask OCTET STRING,
X acctActionSourceDetailType INTEGER,
X acctActionSourceDetailTypeMask INTEGER,
X acctActionSourceDetailAddress OCTET STRING,
X acctActionSourceDetailMask OCTET STRING,
X acctActionSourceSubscriberID OCTET STRING,
X acctActionSourceSubscriberMask OCTET STRING,
X acctActionDestInterface INTEGER, -- Dest AddressTuple
X acctActionDestAdjacentType INTEGER,
X acctActionDestAdjacentAddress OCTET STRING,
X acctActionDestAdjacentMask OCTET STRING,
X acctActionDestPeerType INTEGER,
X acctActionDestPeerTypeMask INTEGER,
X acctActionDestPeerAddress OCTET STRING,
X acctActionDestPeerMask OCTET STRING,
X acctActionDestDetailType INTEGER,
X acctActionDestDetailTypeMask INTEGER,
X acctActionDestDetailAddress OCTET STRING,
X acctActionSoDestDetailMask OCTET STRING,
X acctActionDestSubscriberID OCTET STRING,
X acctActionDestSubscriberMask OCTET STRING,
X acctActionSubscriberID OCTET STRING, -- Session attributes
X acctActionSessionID INTEGER,
X acctActionPDUScale INTEGER, -- Rule Set attributes
X acctActionOctetScale INTEGER
X acctActionSet INTEGER,
X }
XacctActionIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 1 }
XacctActionStatus OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 2 }
XacctActionSourceInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 3 }
XacctActionSourceAdjacentType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 4 }
XacctActionSourceAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 5 }
XacctActionSourceAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 6 }
XacctActionSourcePeerType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 7 }
XacctActionSourcePeerTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 8 }
XacctActionSourcePeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 9 }
XacctActionSourcePeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 10 }
XacctActionSourceDetailType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 11 }
XacctActionSourceDetailTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 12 }
XacctActionSourceDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 13 }
XacctActionSourceDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 14 }
XacctActionSourceSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 15 }
XacctActionSourceSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 16 }
XacctActionDestInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 17 }
XacctActionDestAdjacentType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 18 }
XacctActionDestAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 19 }
XacctActionDestAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 20 }
XacctActionDestPeerType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 21 }
XacctActionDestPeerTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 22 }
XacctActionDestPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 23 }
XacctActionDestPeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 24 }
XacctActionDestDetailType OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 25 }
XacctActionDestDetailTypeMask OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 26 }
XacctActionDestDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 27 }
XacctActionDestDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 28 }
XacctActionDestSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 29 }
XacctActionDestSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 30 }
XacctActionSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 31 }
XacctActionSessionID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 32 }
XacctActionPDUScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 33 }
XacctActionOctetScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 34 }
XacctActionSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { acctActionEntry 35 }
X -- Auckland University Monitor MIB
X -- Nevil Brownlee, 5 Oct 93
X
X UofAuckland OBJECT IDENTIFIER ::= { enterprises 411 }
X
X MeterStats OBJECT IDENTIFIER ::= { UofAuckland 1 }
X
X msStatsReset OBJECT-TYPE -- Write to zero statistics counters
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { MeterStats 1 }
X
X msStatsTime OBJECT-TYPE -- Seconds since stats counters were zeroed
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 2 }
X
X msNbrPackets OBJECT-TYPE -- Nbr of packets this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 3 }
X
X msTotalPacketBacklog OBJECT-TYPE -- Sum of pkt backlogs this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 4 }
X
X msMaxPacketRate OBJECT-TYPE -- Max packet rate this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 5 }
X
X msMaxPacketBacklog OBJECT-TYPE -- Max packet backlog this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 6 }
X
X msNbrFlows OBJECT-TYPE -- Nbr of flows currently in use
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 7 }
X
X msFlowsRecovered OBJECT-TYPE -- Flows recovered during this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 8 }
X
X msRuleMatches OBJECT-TYPE -- Rules matched during this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 9 }
X
X msHashSearches OBJECT-TYPE -- Tally hash searches this stats interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 10 }
X
X msHashCompares OBJECT-TYPE -- Compares for tally searches this interval
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 11 }
X
X msTotalHashSize OBJECT-TYPE -- Current sum of tally hash table sizes
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 12 }
X
X msNbrHashEntries OBJECT-TYPE -- Nbr of in-use slots in tally hash tables
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 13 }
X
X msGarbageCollectInterval OBJECT-TYPE -- Seconds between G.C. invocations
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory
X ::= { MeterStats 14 }
X
X msMaxFlows OBJECT-TYPE -- Max nbr of flows in meter's flows table
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 15 }
X
X msAvIdlePer1000 OBJECT-TYPE -- Average idle processor % * 10
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 16 }
X
X msMinIdlePer1000 OBJECT-TYPE -- Minimum idels processor % * 10
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { MeterStats 17 }
X
X
X pcSystem OBJECT IDENTIFIER ::= { UofAuckland 2 }
X
X pcNearMem OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { pcSystem 1 }
X
X pcFarMem OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { pcSystem 2 }
X
X pcBadPackets OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { pcSystem 3 }
X
X pcNoBufPackets OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { pcSystem 4 }
X
X pcLostPackets OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory
X ::= { pcSystem 5 }
END_OF_FILE
if test 47344 -ne `wc -c <'netramet/mib/mib.txt'`; then
echo shar: \"'netramet/mib/mib.txt'\" unpacked with wrong size!
fi
# end of 'netramet/mib/mib.txt'
fi
if test -f 'netramet/src/apps/snmpnetstat/inet.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/inet.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpnetstat/inet.c'\" \(14067 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/inet.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X


X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X


XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * Copyright (c) 1983,1988 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X

X#include <strings.h>
X#include <stdio.h>


X
X#include <sys/param.h>
X#include <sys/socket.h>
X
X#include <netinet/in.h>

X
X#include <netdb.h>
X
X#include "ausnmp.h"
X#include "main.h"

X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"

X#include "snmpapi.h"
X#include "snmpclnt.h"
X#include "mib.h"
X

Xextern int aflag;
Xextern int nflag;
Xextern char *plural();


X/* extern char *malloc(); /* in ausnmp.h */
Xextern struct snmp_session *Session;
Xextern struct variable_list *getvarbyname();
X

X
Xchar *inetname();
X
Xstruct stat_table {
X int entry; /* entry number in table */
X /* format string to printf(description, value, plural(value)); */
X /* warning: the %d must be before the %s */
X char description[80];
X};
X
Xstatic oid oid_ipstats[] = {1, 3, 6, 1, 2, 1, 4, 0, 0};
Xstruct stat_table ip_stattab[] = {
X {3, "%d total datagram%s received"},
X {4, "%d datagram%s with header errors"},
X {5, "%d datagram%s with an invalid destination address"},
X {6, "%d datagram%s forwarded"},
X {7, "%d datagram%s with unknown protocol"},
X {8, "%d datagram%s discarded"},
X {9, "%d datagram%s delivered"},
X {10, "%d output datagram request%s"},
X {11, "%d output datagram%s discarded"},
X {12, "%d datagram%s with no route"},
X {14, "%d fragment%s received"},
X {15, "%d datagram%s reassembled"},
X {16, "%d reassembly failure%s"},
X {17, "%d datagram%s fragmented"},
X {18, "%d fragmentation failure%s"},
X {19, "%d fragment%s created"}
X};
X
Xstatic oid oid_udpstats[] = {1, 3, 6, 1, 2, 1, 7, 0, 0};
Xstruct stat_table udp_stattab[] = {
X {1, "%d total datagram%s received"},
X {2, "%d datagram%s to invalid port"},
X {3, "%d datagram%s dropped due to errors"},
X {4, "%d output datagram request%s"}
X};
X
Xstatic oid oid_tcpstats[] = {1, 3, 6, 1, 2, 1, 6, 0, 0};
Xstruct stat_table tcp_stattab[] = {
X {5, "%d active open%s"},
X {6, "%d passive open%s"},
X {7, "%d failed attempt%s"},
X {8, "%d reset%s of established connections"},
X {9, "%d current established connection%s"},
X {10, "%d segment%s received"},
X {11, "%d segment%s sent"},
X {12, "%d segment%s retransmitted"}
X};
X
Xstatic oid oid_icmpstats[] = {1, 3, 6, 1, 2, 1, 5, 0, 0};
Xstruct stat_table icmp_stattab[] = {
X {1, "%d total message%s received"},
X {2, "%d message%s dropped due to errors"},
X {14, "%d ouput message request%s"},
X {15, "%d output message%s discarded"}
X};
X
Xstruct stat_table icmp_inhistogram[] = {
X {3, "Destination unreachable: %d"},
X {4, "Time Exceeded: %d"},
X {5, "Parameter Problem: %d"},
X {6, "Source Quench: %d"},
X {7, "Redirect: %d"},
X {8, "Echo Request: %d"},
X {9, "Echo Reply: %d"},
X {10, "Timestamp Request: %d"},
X {11, "Timestamp Reply: %d"},
X {12, "Address Mask Request: %d"},
X {13, "Addrss Mask Reply:%d"},
X};
X
Xstruct stat_table icmp_outhistogram[] = {
X {16, "Destination unreachable: %d"},
X {17, "Time Exceeded: %d"},
X {18, "Parameter Problem: %d"},
X {19, "Source Quench: %d"},
X {20, "Redirect: %d"},
X {21, "Echo Request: %d"},
X {22, "Echo Reply: %d"},
X {23, "Timestamp Request: %d"},
X {24, "Timestamp Reply: %d"},
X {25, "Address Mask Request: %d"},
X {26, "Addrss Mask Reply:%d"},
X};
X
Xstruct tcpconn_entry {
X oid instance[10];
X struct in_addr localAddress;
X int locAddrSet;
X u_short localPort;
X int locPortSet;
X struct in_addr remoteAddress;
X int remAddrSet;
X u_short remotePort;
X int remPortSet;
X int state;
X int stateSet;
X struct tcpconn_entry *next;
X};
X
X#define TCPCONN_STATE 1
X#define TCPCONN_LOCADDR 2
X#define TCPCONN_LOCPORT 3
X#define TCPCONN_REMADDR 4
X#define TCPCONN_REMPORT 5
X
X
X
Xstatic oid oid_tcpconntable[] = {1, 3, 6, 1, 2, 1, 6, 13, 1};
X#define ENTRY 9
X
Xchar *tcpstates[] = {
X "", "CLOSED", "LISTEN", "SYNSENT",
X "SYNRECEIVED", "ESTABLISHED", "FINWAIT1", "FINWAIT2",
X "CLOSEWAIT", "LASTACK", "CLOSING", "TIMEWAIT"
X};
X#define TCP_NSTATES 11
X
X/*
X * Print a summary of connections related to an Internet
X * protocol (currently only TCP). For TCP, also give state of connection.
X */
Xprotopr(){
X struct tcpconn_entry *tcpconn = NULL, *tp, *newp;


X struct snmp_pdu *request, *response;
X struct variable_list *vp;

X oid *instance;
X int first, status;
X
X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X
X snmp_add_null_var(request, oid_tcpconntable, sizeof(oid_tcpconntable)/sizeof(oid));
X
X while(1){


X status = snmp_synch_response(Session, request, &response);
X if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR){
X fprintf(stderr, "SNMP request failed\n");
X break;
X }

X vp = response->variables;

X if (vp->name_length != 20 ||
X bcmp((char *)vp->name, (char *)oid_tcpconntable, sizeof(oid_tcpconntable))){
X break;
X }
X

X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X snmp_add_null_var(request, vp->name, vp->name_length);
X

X instance = vp->name + 10;

X for(tp = tcpconn; tp != NULL; tp = tp->next){
X if (!bcmp((char *)instance, (char *)tp->instance,
X sizeof(tp->instance)))
X break;
X }
X if (tp == NULL){
X newp = (struct tcpconn_entry *)malloc(sizeof(struct tcpconn_entry));
X if (tcpconn == NULL){
X tcpconn = newp;
X } else {
X for(tp = tcpconn; tp->next != NULL; tp = tp->next)
X ;
X tp->next = newp;
X }
X tp = newp;
X bzero((char *)tp, sizeof(*tp));
X tp->next = NULL;
X bcopy((char *)instance, (char *)tp->instance, sizeof(tp->instance));
X }
X
X if (vp->name[ENTRY] == TCPCONN_STATE){
X tp->state = *vp->val.integer;
X tp->stateSet = 1;
X
X }
X
X if (vp->name[ENTRY] == TCPCONN_LOCADDR){
X bcopy((char *)vp->val.string, (char *)&tp->localAddress, sizeof(u_long));
X tp->locAddrSet = 1;
X
X }
X
X if (vp->name[ENTRY] == TCPCONN_LOCPORT){
X tp->localPort = *vp->val.integer;
X tp->locPortSet = 1;
X
X }
X
X if (vp->name[ENTRY] == TCPCONN_REMADDR){
X bcopy((char *)vp->val.string, (char *)&tp->remoteAddress, sizeof(u_long));
X tp->remAddrSet = 1;
X
X }
X
X if (vp->name[ENTRY] == TCPCONN_REMPORT){
X tp->remotePort = *vp->val.integer;
X tp->remPortSet = 1;


X
X }
X
X }
X

X for(first = 1, tp = tcpconn; tp != NULL; tp = tp->next){
X if (!(tp->stateSet && tp->locAddrSet
X && tp->locPortSet && tp->remAddrSet && tp->remPortSet)){
X printf("incomplete entry\n");
X continue;
X }
X if (!aflag && tp->state == MIB_TCPCONNSTATE_LISTEN)
X continue;
X if (first){
X printf("Active Internet Connections");
X if (aflag)
X printf(" (including servers)");
X putchar('\n');
X printf("%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s %s\n",
X "Proto", "Recv-Q", "Send-Q",
X "Local Address", "Foreign Address", "(state)");


X first = 0;
X }

X printf("%-5.5s %6d %6d ", "tcp", 0, 0);
X inetprint(&tp->localAddress, tp->localPort, "tcp");
X inetprint(&tp->remoteAddress, tp->remotePort, "tcp");
X if (tp->state < 1 || tp->state > TCP_NSTATES)
X printf(" %d", tp->state);
X else
X printf(" %s", tcpstates[tp->state]);
X putchar('\n');


X }
X
X}
X
X
X/*

X * Dump UDP statistics structure.
X */
Xudp_stats()
X{
X oid varname[MAX_NAME_LEN], *udpentry;
X int varname_len;
X struct variable_list *var;
X int count;
X struct stat_table *sp = udp_stattab;
X
X bcopy((char *)oid_udpstats, (char *)varname, sizeof(oid_udpstats));
X varname_len = sizeof(oid_udpstats) / sizeof(oid);
X udpentry = varname + 7;
X printf("udp:\n");
X count = sizeof(udp_stattab) / sizeof (struct stat_table);
X while (count--){
X *udpentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var){
X putchar('\t');
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;


X }
X
X}
X
X/*

X * Dump TCP statistics structure.
X */
Xtcp_stats()
X{
X oid varname[MAX_NAME_LEN], *tcpentry;
X int varname_len;
X struct variable_list *var;
X int count;
X struct stat_table *sp = tcp_stattab;
X
X bcopy((char *)oid_tcpstats, (char *)varname, sizeof(oid_tcpstats));
X varname_len = sizeof(oid_tcpstats) / sizeof(oid);
X tcpentry = varname + 7;
X printf("tcp:\n");
X count = sizeof(tcp_stattab) / sizeof (struct stat_table);
X while (count--){
X *tcpentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var){
X putchar('\t');
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;


X }
X
X}
X
X/*

X * Dump IP statistics structure.
X */
Xip_stats()
X{
X oid varname[MAX_NAME_LEN], *ipentry;
X int varname_len;
X struct variable_list *var;
X int count;
X struct stat_table *sp = ip_stattab;
X
X bcopy((char *)oid_ipstats, (char *)varname, sizeof(oid_ipstats));
X varname_len = sizeof(oid_ipstats) / sizeof(oid);
X ipentry = varname + 7;
X printf("ip:\n");
X count = sizeof(ip_stattab) / sizeof (struct stat_table);
X while (count--){
X *ipentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var){
X putchar('\t');
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;


X }
X
X}
X
X/*

X * Dump ICMP statistics.
X */
Xicmp_stats()
X{
X oid varname[MAX_NAME_LEN], *icmpentry;
X int varname_len;
X struct variable_list *var;
X int count, first;
X struct stat_table *sp;
X
X bcopy((char *)oid_icmpstats, (char *)varname, sizeof(oid_icmpstats));
X varname_len = sizeof(oid_icmpstats) / sizeof(oid);
X icmpentry = varname + 7;
X printf("icmp:\n");
X sp = icmp_stattab;
X count = sizeof(icmp_stattab) / sizeof (struct stat_table);
X while (count--){
X *icmpentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var){
X putchar('\t');
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;
X }
X
X sp = icmp_outhistogram;
X first = 1;
X count = sizeof(icmp_outhistogram) / sizeof (struct stat_table);
X while (count--){
X *icmpentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var && *var->val.integer != 0){
X if (first){
X printf("\tOutput Histogram:\n");


X first = 0;
X }

X printf("\t\t");
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;
X }
X
X sp = icmp_inhistogram;
X first = 1;
X count = sizeof(icmp_inhistogram) / sizeof (struct stat_table);
X while (count--){
X *icmpentry = sp->entry;
X var = getvarbyname(Session, varname, varname_len);
X if (var && *var->val.integer != 0){
X if (first){
X printf("\tInput Histogram:\n");


X first = 0;
X }

X printf("\t\t");
X printf(sp->description, *var->val.integer, plural((int)*var->val.integer));
X putchar('\n');
X }
X sp++;
X }
X}
X
X/*
X * Pretty print an Internet address (net address + port).
X * If the nflag was specified, use numbers instead of names.
X */
Xinetprint(in, port, proto)
X register struct in_addr *in;
X u_short port;
X char *proto;
X{
X struct servent *sp = 0;
X char line[80], *cp, *index();
X int width;
X
X sprintf(line, "%.*s.", 16, inetname(*in));
X cp = index(line, '\0');
X if (!nflag && port)
X sp = getservbyport((int)port, proto);
X if (sp || port == 0)
X sprintf(cp, "%.8s", sp ? sp->s_name : "*");
X else
X sprintf(cp, "%d", ntohs((u_short)port));
X width = 22;
X printf(" %-*.*s", width, width, line);
X}
X
X/*
X * Construct an Internet address representation.
X * If the nflag has been supplied, give
X * numeric value, otherwise try for symbolic name.
X */
Xchar *
Xinetname(in)


X struct in_addr in;
X{

X register char *cp;
X static char line[50];
X struct hostent *hp;
X struct netent *np;


X static char domain[MAXHOSTNAMELEN + 1];
X static int first = 1;
X

X if (first && !nflag) {


X first = 0;
X if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
X (cp = index(domain, '.')))
X (void) strcpy(domain, cp + 1);
X else
X domain[0] = 0;
X }
X cp = 0;

X if (!nflag && in.s_addr != INADDR_ANY) {
X u_long net = inet_netof(in);
X u_long lna = inet_lnaof(in);
X
X if (lna == INADDR_ANY) {


X np = getnetbyaddr(net, AF_INET);
X if (np)
X cp = np->n_name;
X }

X if (cp == 0) {
X hp = gethostbyaddr((char *)&in, sizeof (in), AF_INET);


X if (hp) {
X if ((cp = index(hp->h_name, '.')) &&
X !strcmp(cp + 1, domain))

X *cp = 0;
X cp = hp->h_name;
X }
X }
X }
X if (in.s_addr == INADDR_ANY)
X strcpy(line, "*");
X else if (cp)
X strcpy(line, cp);
X else {
X in.s_addr = ntohl(in.s_addr);


X#define C(x) ((x) & 0xff)

X sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
X C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
X }
X return (line);
X}

END_OF_FILE
if test 14067 -ne `wc -c <'netramet/src/apps/snmpnetstat/inet.c'`; then
echo shar: \"'netramet/src/apps/snmpnetstat/inet.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/inet.c'
fi
echo shar: End of archive 12 \(of 25\).
cp /dev/null ark12isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ; do


if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then

echo You have unpacked all 24 archives.

J Nevil Brownlee

unread,
Nov 7, 1993, 5:11:52 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 101
Archive-name: netramet/part13
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/mib/mib.IAWG.txt netramet/src/apps/snmpd.c
# netramet/src/meter/include/flowhash.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:08 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 13 (of 25)."'
if test -f 'netramet/mib/mib.IAWG.txt' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/mib/mib.IAWG.txt'\"
else
echo shar: Extracting \"'netramet/mib/mib.IAWG.txt'\" \(46845 characters\)
sed "s/^X//" >'netramet/mib/mib.IAWG.txt' <<'END_OF_FILE'
X-- Internet Accounting MIB $Revision: 2.2, 16 Sep 93 $
X-- $Principal-Author: cbrooks $
X-- $Current-Author: nbrownlee @
X
X-- Internet Accounting Management Information Base
X-- This following text defines an initial SNMP MIB for Internet Accounting.
X-- For additional details, see RFC 1272, "Internet Accounting: Background",
X-- C. Mills, D. Hirsch, and G. Ruth, and the Internet Draft
X-- "Internet Accounting Architecture", Mills, Laube, and Ruth.
X
X
XACCOUNTING-MIB DEFINITIONS ::= BEGIN
X
XIMPORTS experimental, OBJECT-TYPE, ObjectName, Counter, Gauge,
X NetworkAddress, TimeTicks FROM RFC1155-SMI
X TRAP-TYPE FROM RFC1215;
X


Xinternet-accounting OBJECT IDENTIFIER ::= { experimental 99 }
X
Xcontrol OBJECT IDENTIFIER ::= { internet-accounting 1 }
X
Xflowdata OBJECT IDENTIFIER ::= { internet-accounting 2 }
X
Xruledata OBJECT IDENTIFIER ::= { internet-accounting 3 }
X
Xactiondata OBJECT IDENTIFIER ::= { internet-accounting 4 }
X

X
X-- The AddressTuple construct:
X-- In future might have any address for any layer in the protocol stack
X-- (session, presentation, transport, application). The intent here is
X-- to represent the fact that the address tuple field can contain many
X-- attributes.
X
X-- AddressTuple ::= SEQUENCE {
X-- interface [ 0] INTEGER OPTIONAL, -- interface
X
X-- adjacent_type [ 1] AddressType OPTIONAL, -- adjacent
X-- adjacent_address [ 2] NetWork_Address OPTIONAL,
X-- adjacent_mask [ 3] NetWork_Address OPTIONAL,
X
X-- peer_type [ 4] AddressType OPTIONAL, -- peer
X-- peer_address [ 5] NetWork_Address OPTIONAL,
X-- peer_mask [ 6] NetWork_Address OPTIONAL,
X
X-- detail_type [ 7] AddressType OPTIONAL, -- transport
X-- detail_address [ 8] NetWork_Address OPTIONAL,
X-- detail_mask [ 9] NetWork_Address OPTIONAL,
X
X-- subscriber_id [10] OCTET STRING OPTIONAL -- subscriber
X-- subscriber_mask [11] OCTET STRING OPTIONAL
X-- }
X
X-- Within an address tuple the mask attributes are used to specify
X-- which parts of the addresses must match exactly when address tuples
X-- are compared. For example peer_type = ipaddress, peer_address =
X-- 130.216.0.0, peer_mask = 255.255.0.0 would match any peer address
X-- representing an IP interface within network 130.216.
X
X-- As an example of types and values, here is an address tuple for a flow
X-- carrying a stream of SMTP data over an ethernet:
X-- adjacent type = ethernet, adjacent address = 02-07-01-04-ED-4A
X-- peer type = IP, peer address = 130.216.240.7
X-- detail type = TCP, detail address = 25 (port number)
X
X-- The Network Address construct:
X-- The intent here is that this address type represent a choice of N-1
X-- layer addresses based on the protocol layer at which accounting is
X-- done. For example, if accounting is being performed at the
X-- presentation level, then this address might be a session layer
X-- address; if done at the transport level it might be an IP address.
X-- The level at which accounting is done is the "peer" level, N.
X
X-- In the following, "adjacent" means the level below the current level
X-- and "detail" means the level above it. For IP, the adjacent layer
X-- address might be the ethernet or 802 MAC layer address. A better
X-- encoding convention may be needed so that addresses at any layer can
X-- be specified unambiguously.
X
X-- NetWorkAddress ::= CHOICE {
X-- adjacentLayerAddress [1] IMPLICIT OCTET STRING,
X
X-- ipAddress [2] IMPLICIT IpAddress,
X-- nsapAddress [3] IMPLICIT OCTET STRING,
X-- idprAddress [4] IMPLICIT OCTET STRING,
X-- decnetAddress [5] IMPLICIT OCTET STRING,
X-- ipxnetAddress [6] IMPLICIT OCTET STRING,
X-- ethertalkAddress [7] IMPLICIT OCTET STRING,
X
X-- detailAddress [7] IMPLICIT OCTET STRING
X-- }
X
X-- The AddressType type:
X-- The intent of this type is to indicate the type of address
X-- that is being recorded. This would probably be encoded as a
X-- tag in the above NetworkAddress type if using full ASN.1. Instead
X-- we explicitly call it out as a separate value, and instantiate it
X-- as a separate field.
X
XAddressType ::= INTEGER {
X adjacentlayer(1), ipaddress(2), nsapaddress(3),
X idpraddress(4), decnetaddress(5),
X ipxnetaddress(6), ethertalkaddress(7),
X detailaddress(8)
X }
X
X
X--
X-- The Control Group
X--
X


XacctHighWaterMark OBJECT-TYPE
X SYNTAX INTEGER (0..100)
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "A value expressed as a percent, interpreted by the meter as an
X indication of when to send a trap indicating that the management
X station should increase the polling frequency. Values of 0% or
X 100% disable the checking represented by this variable."


X ::= { control 1 }
X

XacctFloodMark OBJECT-TYPE


X SYNTAX INTEGER (0..100)
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "A value expressed as a percent, interpreted by the meter as
X an indication of how full the flow record table should become
X before the meter should panic and start dumping the contents of
X the flow table to the management station in raw form.
X 0% or 100% disables the checking represented by this variable."
X ::= { control 2 }
X


XacctInactivityTimeout OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The time in seconds since the last packet seen (and the last
X report) after which the flow may be terminated."
X DEFVAL { 600 } -- 10 minutes
X ::= { control 3 }
X


XacctFlowSamplingRate OBJECT-TYPE
X SYNTAX SEQUENCE OF FlowSamplingRate
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "One for each interface. The paramater N for statistical counting.
X Set to zero to count every packet on this interface. Set to N to
X count 1/Nth of the packets from this interface. A meter should
X choose its own algorithm to introduce variance into the sampling
X so that exactly every Nth packet is not counted. A sampling rate
X of 1 yields a normal counter."
X DEFVAL { 1 } -- Count every packet
X ::= { control 4 }
X


XFlowSamplingRate ::= SEQUENCE { rate INTEGER }
X
XacctCollectorInfo OBJECT-TYPE
X SYNTAX SEQUENCE OF acctCollectorInfoEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Information about snmp peers which have collected flow data
X from this meter."
X ::= { control 5 }
X


XacctCollectorInfoEntry OBJECT-TYPE
X SYNTAX AcctCollectorInfoEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Information about a particular collector."
X INDEX { acctCollectorIndex }


X ::= { acctCollectorInfo 1 }
X
XAcctCollectorInfoEntry ::= SEQUENCE {
X acctCollectorIndex INTEGER,
X acctCollectorPeerAddress OCTET STRING,
X acctCollectorLastTime TIMETICKS,
X acctCollectorPreviousTime TIMETICKS
X }
X
XacctCollectorIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Selects an entry from the array of collector info entries."
X ::= { acctCollectorInfoEntry 1 }
X


XacctCollectorPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Peer address of this collector."
X ::= { acctCollectorInfoEntry 2 }
X


XcacctCollectorLastTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Time this collector last began a collection."
X ::= { acctCollectorInfoEntry 3 }
X


XacctCollectorPreviousTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Time this collector began the collection before last."
X ::= { acctCollectorInfoEntry 4 }
X


XacctLastCollectTime OBJECT-TYPE
X SYNTAX TIMETICKS
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Time last collection of meter data began. This variable will be
X written by a collector as the first step in making a collection.
X The meter will set its LastTime value to uptime and set its
X PreviousTime value to the old LastTime. This allows the meter to
X recover flows which have been inactive since PreviousTime, for
X these have been collected at least once."
X ::= { control 6 }
X


XacctRuleSetInfo OBJECT-TYPE
X SYNTAX SEQUENCE OF acctRuleInfoEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Array of information about the rule sets held in the meter,
X i.e. about each rule table and its accompanying action table."
X ::= { control 7 }
X


XacctRuleInfoEntry OBJECT-TYPE
X SYNTAX AcctRuleInfoEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Information about a particular rule set."
X INDEX { acctRuleInfoIndex }


X ::= { acctRuleSetInfo 1 }
X
XAcctRuleInfoEntry ::= SEQUENCE {
X acctRuleInfoIndex INTEGER,
X acctRuleInfoRuleSize INTEGER,
X acctRuleInfoActionSize INTEGER
X }
X
XacctRuleInfoIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Selects an entry from the array of rule set info entries."
X ::= { acctRuleInfoEntry 1 }
X


XacctRuleInfoRuleSize OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Number of rules in this table. Setting this variable will
X cause the meter to allocate space for these rules."
X ::= { acctRuleInfoEntry 2 }
X


XacctRuleInfoActionSize OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Number of actions in this table. Setting this variable will
X cause the meter to allocate space for these actions, and will
X set the values of all variables in them to zero."
X ::= { acctRuleInfoEntry 3 }
X


XacctCurrentRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Index to the arrays of rule and action tables. Specifies which
X set of rules and actions is currently being used for accounting by
X the meter. When the manager sets this variable the meter will
X close its current rule set and start using the new one. Flows
X created by the old rule set remain in memory, orphaned until their
X data has been collected."
X ::= { control 8 }
X


XacctEmergencyRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Index to the arrays of rule and action tables. After a
X declareDataLoss trap the meter may switch to using the emergency
X rule set. For this to be effective the manager must have
X downloaded an emergency rule set which uses a coarser collecting
X granularity."
X ::= { control 9 }
X
X
X--
X-- The Flow Table
X--
X
X-- This is a table kept by a meter, with one entry for every flow
X-- currently being accounted for.
X
X-- The variables kept for each flow comprise:
X-- Housekeeping information for the flow.
X-- The flow's "counters", i.e. its octet and PDU counts for each
X-- direction, and its first and last packet times.
X-- The flow's "keys", i.e. the information used to distinguish
X-- packets for this particular flow.
X
X-- Each flow has at least one key, but "aggregate" flows may have more
X-- than one key. Every key is associated with a single flow, and every
X-- PDU matching a key is counted in its associated flow's counters.
X
X-- Each packet which arrives at a meter is examined, and values for all
X-- the "key" variables are extracted and assembled into a "packet key".
X-- The set of current keys is searched to see whether this flow has
X-- already been seen. If it has, the packet is simply counted;
X-- if not, the rules are consulted to create a new flow in which this
X-- packet may be counted. Once a flow has been created in this way a
X-- collector will have to read the flow's key data just once. After
X-- that the collector needs only to read the flow's counts from time to
X-- time.
X
X-- Each key has two AddressTuples, one for each of its end points.
X-- Flows are bidirectional and have two sets of counters, one for each
X-- of the two possible directions. Since we may be accounting for
X-- packets observed in transit along a network segment the choice of
X-- "to" and "from" direction is arbitrary; "source" and "destination"
X-- (abbreviated to "dest" elsewhere in this MIB) are specified for each
X-- flow by the rules in the current rule set. In the special case where
X-- the address tuples are identical all packets are counted in the "to"
X-- direction's counters.
X
X-- From time to time a collector may sweep the flow table so as collect
X-- counts. To reduce the number of SNMP requests required to do this,
X-- two further tables provide alternative windows into the flow table.
X
X-- The Creation Table allows a collector to find the first entry created
X-- after a specified time, then make successive getnext requests to find
X-- all other entries created since that time. Similarly, the Activity Table
X-- allows a collector to find all the entries last counted after a specified
X-- time. Note that it is not sensible for the meter to keep the Activity
X-- Table in LastTime order, since that would result in very active flows
X-- being counted many times during the same collection.
X
X-- This scheme allows multiple collectors to independently use the same
X-- meter; the collectors do not have to be synchronised and they may use
X-- different collection intervals.
X
X-- A meter may reclaim the memory space used by flows (or keys) for which
X-- no packets have been seen since lastCollectTime, or for an interval
X-- longer than the inactivityTimeout, whichever is the longer. The meter
X-- may reuse flow indexes for flows thus reclaimed.
X


XacctFlowTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctFlowEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The list of all flows being kept for
X accounting purposes on this system."
X ::= { flowdata 1 }
X


XacctFlowEntry OBJECT-TYPE
X SYNTAX AcctFlowEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The flow record for a particular flow."
X INDEX { acctFlowIndex }


X ::= { acctFlowTable 1 }
X
XAcctFlowEntry ::= SEQUENCE {
X acctFlowIndex INTEGER,
X acctFlowStatus INTEGER,
X
X acctFlowSourceInterface INTEGER, -- Source Address Tuple

X acctFlowSourceAdjacentType AddressType,


X acctFlowSourceAdjacentAddress OCTET STRING,
X acctFlowSourceAdjacentMask OCTET STRING,

X acctFlowSourcePeerType AddressType,
X acctFlowSourcePeerTypeMask AddressType,


X acctFlowSourcePeerAddress OCTET STRING,
X acctFlowSourcePeerMask OCTET STRING,

X acctFlowSourceDetailType AddressType,
X acctFlowSourceDetailTypeMask AddressType,


X acctFlowSourceDetailAddress OCTET STRING,
X acctFlowSourceDetailMask OCTET STRING,
X acctFlowSourceSubscriberID OCTET STRING,
X acctFlowSourceSubscriberMask OCTET STRING,
X
X acctFlowDestInterface INTEGER, -- Dest Address Tuple

X acctFlowDestAdjacentType AddressType,


X acctFlowDestAdjacentAddress OCTET STRING,
X acctFlowDestAdjacentMask OCTET STRING,

X acctFlowDestPeerType AddressType,
X acctFlowDestPeerTypeMask AddressType,


X acctFlowDestPeerAddress OCTET STRING,
X acctFlowDestPeerMask OCTET STRING,

X acctFlowDestDetailType AddressType,
X acctFlowDestDetailTypeMask AddressType,

X DESCRIPTION
X "The bucket number for this flow. The different values for this
X variable need not be consecutive."
X ::= { acctFlowEntry 1 }
X


XacctFlowStatus OBJECT-TYPE
X SYNTAX INTEGER { valid(1), invalid(2) }
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Status of this flow. Allows all table rows to be collected
X via a simple table sweep, whilst throwing out all flows that are
X invalid."
X ::= { acctFlowEntry 2 }
X


XacctFlowSourceInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Index of the interface associated with the source address for
X this flow. This value is one of the values contained in the
X ifIndex field of the interfaces table."
X ::= { acctFlowEntry 3 }
X
XacctFlowSourceAdjacentType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Adjacent address type of the source for this flow."
X ::= { acctFlowEntry 4 }
X
XacctFlowSourceAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the adjacent device on the path for the source
X for this flow."
X ::= { acctFlowEntry 5 }
X


XacctFlowSourceAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the adjacent source address for this flow."
X ::= { acctFlowEntry 6 }
X
XacctFlowSourcePeerType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Peer address type of the source for this flow."
X ::= { acctFlowEntry 7 }
X
XacctFlowSourcePeerTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the source peer type for this flow."
X ::= { acctFlowEntry 8 }
X
XacctFlowSourcePeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the peer device for the source of this flow."
X ::= { acctFlowEntry 9 }
X


XacctFlowSourcePeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the source peer address for this flow."
X ::= { acctFlowEntry 10 }
X
XacctFlowSourceDetailType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Detail address type of the source for this flow."
X ::= { acctFlowEntry 11 }
X
XacctFlowSourceDetailTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the source detail type for this flow."
X ::= { acctFlowEntry 12 }
X
XacctFlowSourceDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the detail device for the source of this flow."
X ::= { acctFlowEntry 13 }
X


XacctFlowSourceDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the detail source address for this flow."
X ::= { acctFlowEntry 14 }
X


XacctFlowSourceSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Subscriber ID associated with the source address for this flow."
X ::= { acctFlowEntry 15 }
X


XacctFlowSourceSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the source Subsccriber ID for this flow."
X ::= { acctFlowEntry 16 }
X


XacctFlowDestInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Index of the interface associated with the dest address for
X this flow. This value is one of the values contained in the
X ifIndex field of the interfaces table."
X ::= { acctFlowEntry 17 }
X
XacctFlowDestAdjacentType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Adjacent address type of the destination for this flow."
X ::= { acctFlowEntry 18 }
X


XacctFlowDestAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the adjacent device on the path for the destination
X for this flow."
X ::= { acctFlowEntry 19 }
X


XacctFlowDestAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the adjacent dest address for this flow."
X ::= { acctFlowEntry 20 }
X
XacctFlowDestPeerType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Peer address type of the destination for this flow."
X ::= { acctFlowEntry 21 }
X
XacctFlowDestPeerTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the dest peer address for this flow."
X ::= { acctFlowEntry 22 }
X


XacctFlowDestPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the peer device for the destination of this flow."
X ::= { acctFlowEntry 23 }
X


XacctFlowDestPeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the dest peer type for this flow."
X ::= { acctFlowEntry 24 }
X
XacctFlowDestDetailType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Detail address type for the destination of this flow."
X ::= { acctFlowEntry 25 }
X
XacctFlowDestDetailTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the dest detail type for this flow."
X ::= { acctFlowEntry 26 }
X
XacctFlowDestDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Address of the detail device for the destination of this flow."
X ::= { acctFlowEntry 27 }
X


XacctFlowDestDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the detail destination address for this flow."
X ::= { acctFlowEntry 28 }
X


XacctFlowDestSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Subscriber ID associated with the dest address for this flow."
X ::= { acctFlowEntry 29 }
X


XacctFlowDestSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "1-bits in this mask indicate which bits must match when
X comparing the dest Subsccriber ID for this flow."
X ::= { acctFlowEntry 30 }
X


XacctFlowSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Subscriber ID for this flow, not associated with flow direction."
X ::= { acctFlowEntry 31 }
X


XacctFlowSessionID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Session ID for this flow. Such an ID might be allocated by a
X network access server to distinguish a series of sessions between
X the same pair of addresses, which would otherwise appear to be
X parts of the same accounting flow"
X ::= { acctFlowEntry 32 }
X


XacctFlowPDUScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The scale factor applied to this particular flow. Indicates
X the number of bits the PDU counter values should be moved left
X to obtain the actual values."
X ::= { acctFlowEntry 33 }
X


XacctFlowOctetScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The scale factor applied to this particular flow. Indicates
X the number of bits the octet counter values should be moved left
X to obtain the actual values."
X ::= { acctFlowEntry 34 }
X


XacctFlowRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The rule set which created this flow."
X ::= { acctFlowEntry 35 }
X


XacctFlowType OBJECT-TYPE
X SYNTAX INTEGER { count(1), tally(2), aggregate(3) }
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Type of flow. Details are given for acctRuleAction (below)."
X ::= { acctFlowEntry 36 }
X


XacctFlowToOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The count of octets flowing from source to dest address and
X being delivered to the protocol level being metered. In the
X case of IP this would count the number of octets delivered to
X the IP level."
X ::= { acctFlowEntry 37 }
X


XacctFlowToPDUs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The count of protocol packets flowing from source to dest
X address and being delivered to the protocol level being metered.
X In the case of IP, for example, this would count the IP packets
X delivered to the IP protocol level."
X ::= { acctFlowEntry 38 }
X


XacctFlowFromOctets OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The count of octets flowing from dest to source address and
X being delivered to the protocol level being metered."
X ::= { acctFlowEntry 39 }
X


XacctFlowFromPDUs OBJECT-TYPE
X SYNTAX Counter
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The count of protocol packets flowing from dest to source
X address and being delivered to the protocol level being metered.
X In the case of IP, for example, this would count the IP packets
X delivered to the IP protocol level."
X ::= { acctFlowEntry 40 }
X


XacctFlowFirstTime OBJECT-TYPE
X SYNTAX Timeticks
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The time at which this flow was first entered in the table"
X ::= { acctFlowEntry 41 }
X


XacctFlowLastTime OBJECT-TYPE
X SYNTAX Timeticks
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "The last time this flow had activity, i.e. the time of arrival
X of the last PDU belonging to this flow."
X ::= { acctFlowEntry 42 }
X
X
X--
X-- The Creation Table
X--
X


XacctCreationTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctCreationEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Window into the Flow Table. Allows a collector to find all
X flows wich were created after a given time."
X ::= { flowdata 2 }
X


XacctCreationEntry OBJECT-TYPE
X SYNTAX AcctCreationEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The Creation Entry for a particular flow."
X INDEX { acctCreationTime, acctCreationIndex }


X ::= { acctCreationTable 1 }
X
XAcctCreationEntry ::= SEQUENCE {
X acctCreationTime TimeTicks,
X acctCreationIndex INTEGER
X }
XacctCreationTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Earliest time after which a required flow could
X have been created."
X ::= { acctCreationEntry 1 }
X


XacctCreationIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Index of next entry in flow table created after Creation Time."
X ::= { acctCreationEntry 2 }
X
X
X--
X-- The Activity Table
X--
X


XacctActivityTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctActivityEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Window into the Flow Table. Allows a collector to find all
X flows wich were last used after a given time."
X ::= { flowdata 3 }
X


XacctActivityEntry OBJECT-TYPE
X SYNTAX AcctActivityEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The Activity Entry for a particular flow."
X INDEX { acctActivityTime, acctActivityIndex }


X ::= { acctActivityTable 1 }
X
XAcctActivityEntry ::= SEQUENCE {
X acctActivitytTime TimeTicks,
X acctActivityIndex INTEGER
X }
XacctActivityTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Earliest time after which a required flow could have
X been active."
X ::= { acctActivityEntry 1 }
X


XacctActivityIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Index of next entry in flow table active after Active Time."
X ::= { acctActivityEntry 2 }
X
X
X--
X-- The Activity Column Table
X--
X


XacctActivityColumnTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctColumnEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "Window into the Flow Table. Allows a collector to find all
X flows wich were last used after a given time, and to retrieve
X data values for a specified attribute of each active flow."
X ::= { flowdata 4 }
X


XacctColumnEntry OBJECT-TYPE
X SYNTAX AcctColumnEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The Activity Column Entry for a particular flow."
X INDEX { acctColumnAttribute, acctColumnTime, acctColumnIndex }

X DESCRIPTION
X "Attribute for which values are required from active flows."
X ::= { acctColumnEntry 1 }
X


XacctColumnTime OBJECT-TYPE
X SYNTAX TimeTicks
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Earliest time after which a required flow could have
X been active."
X ::= { acctColumnEntry 2 }
X


XacctColumnIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Index of next entry in flow table active after acctColumnTime."
X ::= { acctColumnEntry 3 }
X


XacctColumnFlowData OBJECT-TYPE
X SYNTAX OPAQUE
X ACCESS read-only
X STATUS mandatory

X DESCRIPTION
X "Collection of attribute data for flows active after
X acctColumnTime. Within the opaque object is a sequence of
X { flow -1, attribute value } pairs, one for each active flow.
X The end of the sequence is marked by a flow -1 value of 0
X if there are no more rows in this column, and 1 otherwise."
X ::= { acctColumnEntry 4 }
X
X
X--
X-- The Rule Table
X--
X
X-- This is an array of rule tables; the one in use is selected by
X-- CurrentRuleSet. To change the rule set the manager chooses a set
X-- number which is not in use, downloads the new rule set there, then
X-- writes the new set number into CurrentRuleSet. Several rule sets can
X-- be held in a meter so that the manager can change thr rules easily,
X-- for example with time of day. Note that the manager may not change
X-- rules in the current rule set!
X


XacctRuleTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctRuleEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The list of rules used to determine the
X granularity of accounting data."
X ::= { ruledata 1 }
X


XacctRuleEntry OBJECT-TYPE
X SYNTAX AcctRuleEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The rule record itself."
X INDEX { acctRuleSet, acctRuleIndex }


X ::= { acctRuleTable 1 }
X
XAcctRuleEntry ::= SEQUENCE {
X acctRuleSet INTEGER,
X acctRuleIndex INTEGER,
X acctRuleSelector INTEGER, -- what to select on
X acctRuleMask OCTET STRING, -- mask value
X acctRuleMatchedValue OCTET STRING, -- matched value
X acctRuleAction INTEGER, -- action to take
X acctRuleJumpIndex INTEGER -- where to go
X }
X
XacctRuleSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Selects a table from the array of rule tables."
X ::= { acctRuleEntry 1 }
X


XacctRuleIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The index into the Rule table. N.B: These values will
X often be consecutive, given the fall-through semantics of
X processing the table."
X ::= { acctRuleEntry 2 }
X


XacctRuleSelector OBJECT-TYPE
X SYNTAX INTEGER { Null(0),

X-- FlowIndex(1),FlowStatus(2),
X
X FlowSourceInterface(3),
X FlowSourceAdjacentType(4),FlowSourceAdjacentAddress(5),
X-- FlowSourceAdjacentMask(6),
X FlowSourcePeerType(7),
X-- FlowSourcePeerTypeMask(8),
X FlowSourcePeerAddress(9),
X-- FlowSourcePeerMask(10),
X FlowSourceDetailType(11),
X-- FlowSourceDetailTypeMask(12),
X FlowSourceDetailAddress(13),
X-- FlowSourceDetailMask(14),
X FlowSourceSubscriberID(15),
X-- FlowSourceSubscriberMask(16),
X
X FlowDestInterface(17),
X FlowDestAdjacentType(18),FlowDestAdjacentAddress(19),
X-- FlowDestAdjacentMask(20),
X FlowDestPeerType(21),
X-- FlowDestPeerTypeMask(22),
X FlowDestPeerAddress(23),
X-- FlowDestPeerMask(24),
X FlowDestDetailType(25),
X-- FlowDestDetailTypeMask(26),
X FlowDestDetailAddress(27),
X-- FlowDestDetailMask(28),
X FlowDestSubscriberID(29),
X-- FlowDestSubscriberMask(30),
X


X FlowSubscriberID(31),FlowSessionID(32),
X }
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Defines the source of the value to match. Null(0) is a
X special case; it always succeeds."
X ::= { acctRuleEntry 3 }
X


XacctRuleMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The initial mask used to compute the desired value, encoded
X as an OCTET STRING."
X ::= { acctRuleEntry 4 }
X


XacctRuleMatchedValue OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The resulting value to be matched for equality.
X Specifically, if the attribute chosen by the acctRuleSelector
X logically ANDed with the mask specified by the acctRuleMask
X equals the value specified in the acctRuleMatchedValue, then
X continue processing the table entry based on the action
X specified by the acctRuleAction entry. Otherwise, proceed to
X the next entry in the rule table."
X ::= { acctRuleEntry 5 }
X


XacctRuleAction OBJECT-TYPE
X SYNTAX INTEGER { count(1), tally(2), aggregate(3),
X succeed(4), fail(5),
X pushto(6), popto(7),
X goto(8) }
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The action to be taken if there is a match between this rule
X and the PDU being considered. The meter maintains a stack of
X indexes of rules which have been successfully matched, which
X provides information needed for counting and tallying.
X
X Count(1) counts in a flowEntry which takes values from the PDU
X and masks from the matched rules. There is no ActionEntry
X associated with a count flow.
X Tally(2) counts in a flowEntry which takes values from the PDU
X and masks from acctAction[acctRuleJumpIndex]. Fields are
X only tallied if the masks in their ActionEntry are non-zero.
X Values for fields not being tallied are taken from the
X ActionEntry.
X Aggregate(3) counts in a flowEntry which takes all its values
X from acctAction[acctRuleJumpIndex]. An aggregate flow
X makes no reference to the matched rules, and many rules
X may count in the same aggregate flow.
X
X Succeed(4) terminates rule matching and indicates that the PDU
X was successfuly matched. It will not be counted, and the
X meter will not try to match it again.
X Fail(5) terminates rule matching and indicates that the PDU
X was not matched. The meter may try to match it again, for
X example with the source and dest keys interchanged.
X
X Pushto(6) tells the meter to use RuleJumpIndex as the index of
X the next rule to match. It also saves the current rule
X -1 in the stack.
X Popto(7) tells the meter to use RuleJumpIndex as the index of
X the next rule to match. It also deletes the top entry
X from the stack.
X
X Goto(8) tells the meter to use RuleJumpIndex as the index of
X the next rule to match. The stack is not changed."
X ::= { acctRuleEntry 6 }
X


XacctRuleJumpIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "An index into the Rule table. Where to restart the search.
X Must take on one of the values allowed for acctRuleIndex."
X ::= { acctRuleEntry 7 }
X
X
X--
X-- The Action Table
X--
X


XacctActionTable OBJECT-TYPE
X SYNTAX SEQUENCE OF AcctActionEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The list of values used to create flowEntries for flows
X matching entries in the rule table (above)."
X ::= { actiondata 1 }
X


XacctActionEntry OBJECT-TYPE
X SYNTAX AcctActionEntry
X ACCESS not-accessible
X STATUS mandatory

X DESCRIPTION
X "The rule action record."
X INDEX { acctActionSet, acctActionIndex }


X ::= { acctActionTable 1 }
X
XAcctActionEntry ::= SEQUENCE {
X acctActionIndex INTEGER,
X acctActionStatus INTEGER,
X
X acctActionSourceInterface INTEGER, -- Source AddressTuple

X acctActionSourceAdjacentType AddressType,


X acctActionSourceAdjacentAddress OCTET STRING,
X acctActionSourceAdjacentMask OCTET STRING,

X acctActionSourcePeerType AddressType,
X acctActionSourcePeerTypeMask AddressType,


X acctActionSourcePeerAddress OCTET STRING,
X acctActionSourcePeerMask OCTET STRING,

X acctActionSourceDetailType AddressType,
X acctActionSourceDetailTypeMask AddressType,


X acctActionSourceDetailAddress OCTET STRING,
X acctActionSourceDetailMask OCTET STRING,
X acctActionSourceSubscriberID OCTET STRING,
X acctActionSourceSubscriberMask OCTET STRING,
X
X acctActionDestInterface INTEGER, -- Dest AddressTuple

X acctActionDestAdjacentType AddressType,


X acctActionDestAdjacentAddress OCTET STRING,
X acctActionDestAdjacentMask OCTET STRING,

X acctActionDestPeerType AddressType,
X acctActionDestPeerTypeMask AddressType,


X acctActionDestPeerAddress OCTET STRING,
X acctActionDestPeerMask OCTET STRING,

X acctActionDestDetailType AddressType,
X acctActionDestDetailTypeMask AddressType,


X acctActionDestDetailAddress OCTET STRING,
X acctActionSoDestDetailMask OCTET STRING,
X acctActionDestSubscriberID OCTET STRING,
X acctActionDestSubscriberMask OCTET STRING,
X
X acctActionSubscriberID OCTET STRING, -- Session attributes
X acctActionSessionID INTEGER,
X
X acctActionPDUScale INTEGER, -- Rule Set attributes
X acctActionOctetScale INTEGER
X acctActionSet INTEGER,
X }
X

X-- Most of the variables in acctActionEntry provide values for the
X-- corresponding variables in acctFlowEntry. For their descriptions
X-- please refer to their definitions in acctFlowEntry.


X
XacctActionIndex OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "The index into the Action table."
X ::= { acctActionEntry 1 }
X


XacctActionStatus OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 2 }
X


XacctActionSourceInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 3 }
X
XacctActionSourceAdjacentType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 4 }
X
XacctActionSourceAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 5 }
X


XacctActionSourceAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 6 }
X
XacctActionSourcePeerType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 7 }
X
XacctActionSourcePeerTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 8 }
X
XacctActionSourcePeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 9 }
X


XacctActionSourcePeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 10 }
X
XacctActionSourceDetailType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 11 }
X
XacctActionSourceDetailTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 12 }
X
XacctActionSourceDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 13 }
X


XacctActionSourceDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 14 }
X


XacctActionSourceSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 15 }
X


XacctActionSourceSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 16 }
X


XacctActionDestInterface OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 17 }
X
XacctActionDestAdjacentType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 18 }
X


XacctActionDestAdjacentAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 19 }
X


XacctActionDestAdjacentMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 20 }
X
XacctActionDestPeerType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 21 }
X
XacctActionDestPeerTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 22 }
X


XacctActionDestPeerAddress OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 23 }
X


XacctActionDestPeerMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 24 }
X
XacctActionDestDetailType OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 25 }
X
XacctActionDestDetailTypeMask OBJECT-TYPE
X SYNTAX AddressType


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 26 }
X
XacctActionDestDetailAddress OBJECT-TYPE
X SYNTAX OCTET STRING -- actually NetworkAddress


X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 27 }
X


XacctActionDestDetailMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 28 }
X


XacctActionDestSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 29 }
X


XacctActionDestSubscriberMask OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 30 }
X


XacctActionSubscriberID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 31 }
X


XacctActionSessionID OBJECT-TYPE
X SYNTAX OCTET STRING
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 32 }
X


XacctActionPDUScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 33 }
X


XacctActionOctetScale OBJECT-TYPE
X SYNTAX INTEGER (1..127)
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION ""
X ::= { acctActionEntry 34 }
X


XacctActionSet OBJECT-TYPE
X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X DESCRIPTION
X "Selects a table from the array of action tables."


X ::= { acctActionEntry 35 }
X

X
X--
X-- Internet Accounting Traps
X--
X
XdeclareHighWater TRAP-TYPE
X ENTERPRISE { internet-accounting }
X VARIABLES { highWaterMark }
X DESCRIPTION
X "Sent by the meter to the management host to
X indicate that the high water mark has been exceeded.
X This should be interpreted by the management host as a
X request to increase the polling frequency. N.B: this
X trap is optional. Meters are not required to implement
X this trap; management hosts are not required to
X increase their polling frequency."
X ::= 1
X
XdeclareDataLoss TRAP-TYPE
X ENTERPRISE { internet-accounting }
X DESCRIPTION
X "Sent by the meter to the management host to
X indicate that usage data is being lost."
X ::= 2
X
XdeclareFlood TRAP-TYPE
X ENTERPRISE { internet-accounting }
X DESCRIPTION
X "This trap contains, as part of the trap body, Internet
X Accounting flow records. The assumption here is that
X these flow records will be send as Opaque values, allowing
X an escape to more detailed ASN.1 types."
X ::= 3
X
XEND
END_OF_FILE
if test 46845 -ne `wc -c <'netramet/mib/mib.IAWG.txt'`; then
echo shar: \"'netramet/mib/mib.IAWG.txt'\" unpacked with wrong size!
fi
# end of 'netramet/mib/mib.IAWG.txt'
fi
if test -f 'netramet/src/apps/snmpd.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpd.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpd.c'\" \(3756 characters\)
sed "s/^X//" >'netramet/src/apps/snmpd.c' <<'END_OF_FILE'


X/*
X * snmpd.c - send snmp GET requests to a network entity.

X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>
X#include <sys/socket.h>
X#include <errno.h>
X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"


X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

Xmain(argc, argv)


X int argc;
X char *argv[];
X{

X int arg;
X int sd;
X struct sockaddr_in me;
X
X
X /*
X * usage: snmpd


X */
X for(arg = 1; arg < argc; arg++){

X if (argv[arg][0] == '-'){

X switch(argv[arg][1]){


X case 'd':
X snmp_dump_packet++;
X break;

X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;


X }
X }
X /* Set up connections */
X sd = socket(AF_INET, SOCK_DGRAM, 0);
X if (sd < 0){
X perror("socket");

X return 0;


X }
X me.sin_family = AF_INET;
X me.sin_addr.s_addr = INADDR_ANY;
X me.sin_port = htons(SNMP_PORT);
X if (bind(sd, (struct sockaddr *)&me, sizeof(me)) != 0){
X perror("bind");

X return 0;
X }
X init_snmp();
X receive(sd);
X}
X
Xreceive(sd)
X int sd;
X{
X int numfds;
X fd_set fdset;
X int count;
X
X while(1){


X numfds = 0;
X FD_ZERO(&fdset);

X numfds = sd + 1;
X FD_SET(sd, &fdset);
X count = select(numfds, &fdset, 0, 0, 0);


X if (count > 0){
X if(FD_ISSET(sd, &fdset))
X snmp_read(sd);

X } else switch(count){


X case 0:
X break;
X case -1:

X if (errno == EINTR){
X continue;
X } else {
X perror("select");
X }

X return -1;
X default:
X printf("select returned %d\n", count);
X return -1;
X }
X }
X}
X

Xsnmp_read(sd)
X int sd;
X{
X struct sockaddr_in from;
X int length, out_length, fromlength;
X u_char packet[1500], outpacket[1500];

X fromlength = sizeof from;
X length = recvfrom(sd, packet, 1500, 0, (struct sockaddr *)&from, &fromlength);

X if (length == -1)
X perror("recvfrom");
X if (snmp_dump_packet){
X int count;
X

X printf("recieved %d bytes from %s:\n", length, inet_ntoa(from.sin_addr));


X for(count = 0; count < length; count++){
X printf("%02X ", packet[count]);
X if ((count % 16) == 15)
X printf("\n");
X }
X printf("\n\n");
X }
X out_length = 1500;
X if (snmp_agent_parse(packet, length, outpacket, &out_length, from.sin_addr)){
X if (snmp_dump_packet){
X int count;
X

X printf("sent %d bytes to %s:\n", out_length, inet_ntoa(from.sin_addr));


X for(count = 0; count < out_length; count++){
X printf("%02X ", outpacket[count]);
X if ((count % 16) == 15)
X printf("\n");
X }
X printf("\n\n");
X }
X if (sendto(sd, (char *)outpacket, out_length, 0, (struct sockaddr *)&from,
X sizeof(from)) < 0){
X perror("sendto");
X return 0;

X }
X
X }
X
X}
X

END_OF_FILE
if test 3756 -ne `wc -c <'netramet/src/apps/snmpd.c'`; then
echo shar: \"'netramet/src/apps/snmpd.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpd.c'
fi
if test -f 'netramet/src/meter/include/flowhash.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/include/flowhash.h'\"
else
echo shar: Extracting \"'netramet/src/meter/include/flowhash.h'\" \(11145 characters\)
sed "s/^X//" >'netramet/src/meter/include/flowhash.h' <<'END_OF_FILE'
X/* 1310, Tue 5 Oct 93
X
X FLOWHASH.H: Data structures for AU Meter


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X#ifndef EXTFLOW
X#define EXTFLOW extern


X#define DECLARE 0
X#define INIT(v)
X#else

X#define EXTFLOW


X#define DECLARE 1
X#define INIT(v) = v
X#endif
X

X#define DFMXFLOWS 4000 /* Default max nbr of traffic flows */
X
X#define MXCLCTRS 10 /* Max nbr of active Collectors */
X#define MXNRTBLS 10 /* Max nbr of rule+action tables */
X
X#define RSTKSIZ 20 /* Max depth of rule matches */
X#define HASHMOD 256 /* Size of flow hash tables */
X#define MNCGRPSZ 5 /* Min nbr of rules in a compare group */
X#define INITHSZ 1500 /* Initial rule_hash size (ints) */
X#define FLOWBLOBSZ 55 /* Nbr of {index, info} pairs in a column blob */
X
Xstruct hash_tbl {
X struct flow far *hash_ent[HASHMOD];


X };
X
X#define AT_IGNORE 0 /* Addr_type values */

X#define AT_DUMMY 1
X


X#define AT_IP 2
X#define AT_NOVELL 6
X#define AT_DECNET 5
X#define AT_ETHERTALK 7
X

X#define PT_ICMP 1 /* IP protocol types */


X#define PT_TCP 6
X#define PT_UDP 17
X

X#define MAC_ADDR_LEN 6 /* Ethernet */
X#define PEER_ADDR_LEN 4 /* IP, IPX, Decnet, EtherTalk */
X#define DETAIL_ADDR_LEN 2 /* TCP/UDP port, .. */
X
X#define RULE_ADDR_LEN 6 /* Max of above three */
X
Xstruct key {
X unsigned char AdjAddress[MAC_ADDR_LEN], AdjMask[MAC_ADDR_LEN];
X unsigned char PeerAddress[PEER_ADDR_LEN], PeerMask[PEER_ADDR_LEN];
X unsigned char DetailAddress[DETAIL_ADDR_LEN], DetailMask[DETAIL_ADDR_LEN];
X };
X
Xstruct flow {
X union { /* Must be first to line up with hash_tbl entries */
X struct flow far *action; /* For aggregates and tallies */
X struct rule far *count; /* For counts */
X struct hash_tbl far *hash; /* For tally action entries */
X struct flow far *next; /* For hash chains */
X } link;
X unsigned long UpOctets,UpPDUs, DownOctets,DownPDUs,
X FirstTime,LastTime;
X unsigned char FlowRuleSet, FlowType;
X unsigned char PeerAddrType, PeerTypeMask,
X DetailAddrType, DetailTypeMask;
X struct key Low, High;
X };
X
Xstruct flow_key {
X unsigned char PeerAddrType, PeerTypeMask,
X DetailAddrType, DetailTypeMask;
X struct key Low, High;
X };
X
X#define Key(fp) &fp->PeerAddrType
X
X#define FT_RULE 0 /* Flow types */
X#define FT_COUNT 1
X#define FT_TALLY 2
X#define FT_AGGREGATE 3
X
XEXTFLOW unsigned int nflows, /* Nbr of flows in use */
X mxflowsp1; /* Max nbr of flows + 1 */
XEXTFLOW struct flow far **flow_ix; /* The flow table */
X /* Flow 1 is a dummy for the Create and Active tables */
X
XEXTFLOW unsigned int empty_ix; /* Last flow number used by number_flow */
X
XEXTFLOW unsigned int gcf_ix; /* Next possible flow for garbage collector */
X
XEXTFLOW unsigned char /* Parameters for garbage collector */
X gc_interval INIT(5), /* Seconds between calls */
X gc_f INIT(4), /* Non-zero (in-use) flow indexes */
X gc_e INIT(16); /* Zero (unused) flow indexes */
XEXTFLOW unsigned long GarbageCollectTime,
X /* OK to recover flows with LastTime greater than this */
X FlowsRecovered INIT(0);
X
Xstruct rule {
X unsigned char RuleSelector; /* Rule's MIB variables */
X unsigned char RuleMask[RULE_ADDR_LEN];
X unsigned char RuleMatchedValue[RULE_ADDR_LEN];
X unsigned char RuleAction;
X unsigned int RuleJumpIndex;
X
X unsigned int hash_tbl_index; /* 0 => simple compare */
X unsigned int hash_link;
X };
X
XEXTFLOW struct flow far *null_flow; /* All fields zeroed */
X
XEXTFLOW struct rule far *rule_table[MXNRTBLS];
XEXTFLOW unsigned int rt_size[MXNRTBLS];
XEXTFLOW struct rule far *c_rt; /* Current Rule Table */
XEXTFLOW int c_rsz; /* Nbr of rules in current rule table */
X
Xstruct rule_hash_tbl {
X unsigned int group_last; /* Nbr of last rule in group */
X unsigned int hash_mask; /* Group hash table size - 1 */
X int hash_ent[1];
X };
X
XEXTFLOW int far *rule_hash;
XEXTFLOW unsigned int rh_size;
X
XEXTFLOW struct flow far *action_table[MXNRTBLS];
XEXTFLOW unsigned int at_size[MXNRTBLS];
XEXTFLOW struct flow far *c_at; /* Current Action Table */
XEXTFLOW int c_asz; /* Nbr of actions in current action table */
X
X#define RA_COUNT 1 /* RuleAction values */


X#define RA_TALLY 2
X#define RA_AGGREGATE 3
X#define RA_SUCCEED 4
X#define RA_FAIL 5
X#define RA_PUSHTO 6
X#define RA_POPTO 7
X#define RA_GOTO 8
X

X#define RS_NULL 0 /* Rule Selector dummy value */

Xstruct attrib_info {
X char *name;
X unsigned char index;
X unsigned char len;
X };
X

XEXTFLOW struct attrib_info attribs[1+FTLASTTIME]

X#endif
X ;
X
X/* Global Variables */
X
XEXTFLOW unsigned char column_blob[(FLOWBLOBSZ+2)*(2+RULE_ADDR_LEN)];


X
X#ifdef AU_MSDOS /* PC ntoh routines swap the byte order */
X#define netshort(x) x
X#define netlong(x) x
X#else /* SunOS ntoh routines don't */
X#define netshort(x) htons(x)
X#define netlong(x) htonl(x)
X#endif
X

XEXTFLOW unsigned int n_hash_tables INIT(0), /* Performance statistics */
X n_hash_ents INIT(0), t_hash_size INIT(0);
XEXTFLOW unsigned long n_matches INIT(0),
X n_hash_compares INIT(0), n_hash_searches INIT(0);
X
XEXTFLOW unsigned long s_uptime; /* uptime() value for current sample */
X
XEXTFLOW unsigned char kb_enabled;
XEXTFLOW unsigned char display_enabled;
X
X/* MIB variables */
X
XEXTFLOW unsigned long InactivityTimeout INIT(600L); /* 10 minutes */
XEXTFLOW unsigned char HighWaterMark INIT(85); /* 85 % */
XEXTFLOW unsigned char FloodMark INIT(100); /* Disabled */
X
Xstruct CTinfo {
X unsigned char LastCollectPeer[PEER_ADDR_LEN];
X unsigned long LastCollectTime;
X unsigned long PrevCollectTime;
X };
X
XEXTFLOW struct CTinfo CTi[MXCLCTRS];
XEXTFLOW unsigned char n_collectors INIT(0);
X
XEXTFLOW unsigned long LastCollectTime INIT(0L);
X
XEXTFLOW unsigned char CurrentRuleSet INIT(0);
XEXTFLOW unsigned char EmergencyRuleSet INIT(0);
X
X/* Flowhash functions */
X
X#define addrcpy(d,s,n) qmove(s,d,n) /* Stick to d,s order for copies! */
X
Xstruct flow far *get_flow(void);
Xvoid free_flow(struct flow far *q);
X
Xint open_rule_set(unsigned char doSet, unsigned char n);
Xvoid close_rule_set(void);
X
Xvoid init_flow(struct flow far *f, unsigned char type);
Xunsigned int number_flow(struct flow far *fp);
Xvoid garbage_collect(void);
X
Xstruct flow far *find_flow(int x);
X
Xstruct flow far *search_hash_table(
X struct hash_tbl far *t, /* Table to search */
X struct key far *Low, /* Target keys */
X struct key far *High,
X struct flow far *pdu,
X struct flow far *ap, /* Action with table's masks */
X unsigned char OK_to_add /* 1 = add new flow if not found */
X );
X
Xint pkt_match(unsigned char forward, unsigned char OK_to_match,
X int len, struct flow far *pdu, struct key far *from, struct key far *to);
X
Xvoid build_flow_blob(unsigned long t_time, unsigned int fx);
X
Xvoid pkt_monitor(unsigned char far *pp,int len,unsigned char pt);
X
Xvoid open_log(void);
Xvoid write_flows(void);
X
Xvoid show_stats(void);
Xvoid show_time(void);
X
Xvoid init_monitor(void);
X
Xvoid show_help(void);
Xvoid handle_kb(int ch);
X
END_OF_FILE
if test 11145 -ne `wc -c <'netramet/src/meter/include/flowhash.h'`; then
echo shar: \"'netramet/src/meter/include/flowhash.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/include/flowhash.h'
fi
echo shar: End of archive 13 \(of 25\).
cp /dev/null ark13isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:12:14 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 102
Archive-name: netramet/part14
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.C
# netramet/src/apps/snmpwalk.c netramet/src/snmplib/include/mib.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:08 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 14 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\" \(45499 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.C' <<'END_OF_FILE'


Xn
X0 0 0 fC

X903 1548 448 (Format statement) 448 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1732 1823 (A rule file contains one or more of five possible elements, which may appear in any order) 1823 SB
X271 1786 199 (in the file.) 199 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1858 117 (5.2.1.) 117 SB
X419 1858 408 (RuleSet Statement) 408 SB


X1 lc
X1 lj
X0 0 0 pC

X277 2046 M 1626 0 1 PP
XS


Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 1937 510 (RuleSet statement) 510 SB
X255 255 255 fC
X1871 2024 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X58 84 1659 2005 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 2018 28 (;) 28 SB
X255 255 255 fC
X130 96 574 2002 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X593 2026 84 (SET) 84 SB
X255 255 255 fC
X212 103 855 1999 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X877 2023 168 (setnbr) 168 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2132 1839 (The RuleSet statement tells the meter which rule set it is to use. If a rule file doesn't have) 1839 SB
X271 2186 1442 (a RuleSet statement, the meter will continue to use its current rule set.) 1442 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2258 117 (5.2.2.) 117 SB
X419 2258 306 (Rules Section) 306 SB


X1 lc
X1 lj
X0 0 0 pC

X275 2387 M 1626 0 1 PP
XS
Xn
X255 255 255 fC
X1869 2365 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X446 90 994 2340 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1019 2360 392 (Rule statement) 392 SB
X255 255 255 fC
X170 77 413 2349 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X428 2364 140 (RULES) 140 SB


X1 lc
X1 lj
X0 0 0 pC

X816 2390 M 0 -85 831 0 0 85 3 PP
XS
Xn
X862 2443 M 40 31 -37 24 -3 7 3 PP
XS
Xn
X277 2644 M 1626 0 1 PP
XS


Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 2534 420 (Rule statement) 420 SB
X255 255 255 fC
X1871 2622 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X759 100 349 2594 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X362 2618 728 (attribute & mask = value :) 728 SB
X255 255 255 fC
X59 84 1727 2603 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1743 2615 28 (;) 28 SB
X255 255 255 fC
X428 97 1199 2594 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1212 2618 392 (action , index) 392 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2724 1845 (The Rules section specifies the rule table for a rule set, and requests NeMaC to download) 1845 SB
X271 2778 297 (it to the meter.) 297 SB
X271 2857 1795 (It starts with the keyword RULES, followed by a series of Rule statements, one for each) 1795 SB
X271 2911 1829 (rule. Each rule has five components, which must appear in the correct order. These are:) 1829 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2990 173 (Attribute) 173 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 3044 1645 (The name of the attribute to be tested by this rule. Any of the address attributes) 1645 SB
X389 3098 1075 (may be used, but not the mask or general attributes.) 1075 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (11) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 110 (Mask) 110 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 310 1730 (Specifies a mask which is ANDed with the attribute's value from an incoming packet.) 1730 SB
X389 364 1343 (Must be the same length \(number of bytes\) as the attribute value.) 1343 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 119 (Value) 119 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 497 1729 (Specifies the value to be compared with the masked value from an incoming packet.) 1729 SB
X389 551 1284 (If the compare fails the next rule is tested, otherwise the rule's ) 1284 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1673 551 129 (Action) 129 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1802 551 283 ( is performed.) 283 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 630 129 (Action) 129 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 684 1534 (Action to be performed if the rule's value is matched. Possible actions are:) 1534 SB
X448 751 124 (Count) 124 SB
X714 751 837 (Count this packet. Attribute values for a ) 837 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 751 114 (count) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1665 751 407 ( flow are taken from) 407 SB
X714 805 1316 (the matched rules, which means that only those attributes which) 1316 SB
X714 859 741 (have been matched will appear in it.) 741 SB
X448 926 97 (Tally) 97 SB
X714 926 1351 (Tally this packet. The attributes \(or parts thereof\) are specified by) 1351 SB
X714 980 1229 (the mask attributes in the tally action specified by this rule's ) 1229 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1943 980 114 (Index) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X2057 980 13 (.) 13 SB
X714 1034 1352 (The non-mask attributes of a tally action can be specified, and will) 1352 SB
X714 1088 918 (appear in each flow which is part of this tally.) 918 SB
X448 1155 215 (Aggregate) 215 SB
X714 1155 1404 (Aggregate this packet, i.e. count it in the aggregate flow specified by) 1404 SB
X714 1209 207 (this rule's ) 207 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X921 1209 124 (index.) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1045 1209 998 ( All the attribute values of an aggregate flow are) 998 SB
X714 1263 1018 (specified in the aggregate action which created it.) 1018 SB
X448 1330 181 (Succeed) 181 SB
X714 1330 1286 (Force rule matching to finish, returning a 'succeed' result. This) 1286 SB
X714 1384 1409 (means the incoming packet will not be counted, i.e. it will be ignored.) 1409 SB
X448 1451 74 (Fail) 74 SB
X714 1451 1395 (Stop rule matching and return a 'fail' result. This allows the meter to) 1395 SB
X714 1505 1280 (interchange the source and destination attributes and retry the) 1280 SB
X714 1559 139 (match.) 139 SB
X448 1626 160 (PushTo) 160 SB
X714 1626 1409 (Save the current rule number on the 'pattern stack' and set the index) 1409 SB
X714 1680 837 (of the next rule to be tested to this rule's ) 837 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 1680 124 (index.) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1675 1680 385 ( The pattern stack) 385 SB
X714 1734 1353 (records the rules which were correctly matched; this information is) 1353 SB
X714 1788 367 (used to construct ) 367 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1081 1788 114 (count) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1195 1788 131 ( flows.) 131 SB
X448 1855 137 (PopTo) 137 SB
X714 1855 1122 (Set the index of the next rule to be tested to this rule's ) 1122 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1836 1855 124 (index ) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1960 1855 169 (and pop) 169 SB
X714 1909 978 (the topmost rule number from the pattern stack.) 978 SB
X448 1976 116 (GoTo) 116 SB
X714 1976 1122 (Set the index of the next rule to be tested to this rule's ) 1122 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1836 1976 124 (index.) 124 SB
X271 2055 114 (Index) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2109 476 (This is a parameter for ) 476 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X865 2109 155 (Action; ) 155 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1020 2109 627 (see above for its various uses.) 627 SB
X271 2188 1855 (Rule and action numbers are 1-origin indexes to their corresponding tables. Since there is) 1855 SB
X271 2242 1781 (no provision for labelling the rule and action statements it is very important to get these) 1781 SB
X271 2296 1807 (numbers correct! The simplest way to do this is to include the rule or action number in a) 1807 SB
X271 2350 778 (comment attached to each statement.) 778 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2422 117 (5.2.3.) 117 SB
X419 2422 349 (Actions Section) 349 SB


X1 lc
X1 lj
X0 0 0 pC

X6 4 SP
X275 2551 M 1626 0 1 PP
XS
Xn


X255 255 255 fC
X/fm 256 def

X1869 2529 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X501 89 982 2504 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1007 2524 448 (Action statement) 448 SB
X255 255 255 fC
X227 71 406 2513 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X422 2528 196 (ACTIONS) 196 SB


X1 lc
X1 lj
X0 0 0 pC

X816 2554 M 0 -85 831 0 0 85 3 PP
XS
Xn
X862 2607 M 40 31 -37 24 -3 7 3 PP
XS
Xn
X277 2808 M 1626 0 1 PP
XS


Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 2699 480 (Action statement) 480 SB
X255 255 255 fC
X1871 2786 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X592 93 793 2764 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X818 2785 532 (attribute = value) 532 SB


X1 lc
X1 lj
X0 0 0 pC

X1146 2868 M 34 28 -31 22 -3 6 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X58 84 1659 2767 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 2779 28 (;) 28 SB


X1 lc
X1 lj
X0 0 0 pC

X674 2811 M 0 -85 832 0 0 85 3 PP
XS
Xn
X721 2864 M 41 32 -37 24 -4 7 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X59 84 1046 2861 B


X1 F
XS
Xn
X0 0 0 fC

X1062 2873 28 (,) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2975 1747 (The Actions section specifies the action table for a rule set. It starts with the keyword) 1747 SB
X271 3029 1507 (ACTIONS, followed by a series of Action statements, one for each action.) 1507 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (12) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1804 (Each Action statement is a list of attribute values, separated by commas and terminated) 1804 SB
X271 310 1794 (with a semicolon. Attribute values must be in the correct form for their attributes - these) 1794 SB
X271 364 1056 (are explained in the 'Flow Attributes' section above.) 1056 SB
X271 443 1848 (Detail addresses are a special case. They have two-byte values, but may also be entered) 1848 SB
X271 497 1460 (as single integers. Examples of this are given in the following sections.) 1460 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 569 117 (5.2.4.) 117 SB
X419 569 392 (Format Statement) 392 SB


X1 lc
X1 lj
X0 0 0 pC

X6 4 SP
X277 757 M 1626 0 1 PP
XS


Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 647 480 (Format statement) 480 SB
X255 255 255 fC
X/fm 256 def
X1871 735 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X312 89 952 710 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X977 730 252 (attribute) 252 SB
X255 255 255 fC
X202 83 377 710 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X393 733 168 (FORMAT) 168 SB


X1 lc
X1 lj
X0 0 0 pC

X1290 819 M 34 28 -31 22 -3 7 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X58 84 1659 716 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 728 28 (;) 28 SB


X1 lc
X1 lj
X0 0 0 pC

X799 757 M 0 -91 635 0 0 91 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X295 80 959 810 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X977 821 252 (separator) 252 SB


X1 lc
X1 lj
X0 0 0 pC

X834 819 M 35 28 -31 22 -4 7 3 PP
XS
Xn


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 920 1788 (The Format statement specifies the format of rule data lines in a NeMaC Flow Data file.) 1788 SB
X271 999 1751 (It starts with the FORMAT keyword, which is followed by a list of flow attributes, in the) 1751 SB
X271 1053 932 (order they are to appear in the Flow Data file.) 932 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1125 117 (5.2.5.) 117 SB
X419 1125 442 (Statistics Statement) 442 SB
X277 1313 M 1626 0 1 PP
XS


Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 1203 600 (Statistics statement) 600 SB
X255 255 255 fC
X1871 1291 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X58 84 1659 1272 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 1284 28 (;) 28 SB
X255 255 255 fC
X321 94 718 1269 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X737 1293 280 (STATISTICS) 280 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1393 1799 (The Statistics statement tells NeMaC to collect meter performance statistics each time it) 1799 SB
X271 1447 1789 (collects flow data, and to write it to the flow data file. NeMaC sets NeTraMet's statistics) 1789 SB
X271 1501 877 (variables to zero after reading their values.) 877 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1588 84 (5.3.) 84 SB
X413 1588 252 ( Rule Files) 252 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1671 1802 (This section gives a few examples of rule files, with comments on what they do and why) 1802 SB
X271 1725 606 (they were written as they are.) 606 SB
X271 1804 1624 (I have found it simplest, when developing a new rule file, to proceed as follows:) 1624 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 1880 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 1883 1698 (Make sure that every rule or action has a comment which includes its rule or action) 1698 SB
X271 1937 1611 (number. Check carefully that these numbers start at one and are consecutive.) 1611 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 2013 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 2016 1683 (Make sure that rule actions have indexes which really do refer to the intended rule) 1683 SB
X271 2070 191 (or action.) 191 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 2146 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 2149 1611 (Check the rule file by using NeMaC's syntax check \(-s\) option, piping NeMaC's) 1611 SB
X271 2203 1807 (output to a file. Compare the syntax check output with the rule file using two windows in) 1807 SB
X271 2257 1687 (your favourite file editor. It's helpful to start by verifying that NeMaC has found the) 1687 SB
X271 2311 778 (intended number of rules and actions!) 778 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2383 117 (5.3.1.) 117 SB
X419 2383 275 (rules.default) 275 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2461 483 (# 1705, Mon 1 Sep 93) 483 SB
X330 2501 23 (#) 23 SB
X330 2541 1311 (# Default rule file for NeTraMet \(built in to the meter\)) 1311 SB
X330 2581 23 (#) 23 SB
X330 2621 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 2661 23 (#) 23 SB
X330 2701 115 (SET 1) 115 SB
X330 2741 23 (#) 23 SB
X330 2781 115 (RULES) 115 SB
X330 2821 23 (#) 23 SB
X330 2861 1311 (SourcePeerType & 255 = IP : Aggregate, 1; # 1) 1311 SB
X330 2901 1311 (SourcePeerType & 255 = Novell : Aggregate, 2; # 2) 1311 SB
X330 2941 1311 (SourcePeerType & 255 = DECnet : Aggregate, 3; # 3) 1311 SB
X330 2981 1311 (SourcePeerType & 255 = EtherTalk : Aggregate, 4; # 4) 1311 SB
X330 3021 1495 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1495 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (13) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1838 (This is the default rule set, which is built in to the meter and can't be changed. It provides) 1838 SB
X271 310 1736 (rule set 1 which produces four aggregate flows, one for each of the peer types which) 1736 SB
X271 364 487 (NeTraMet understands.) 487 SB
X271 443 548 (Rule five, above, tests the ) 548 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X819 443 79 (Null) 79 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X898 443 1167 ( attribute. This is a special case which always succeeds.) 1167 SB
X271 497 366 (The rule action is ) 366 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X637 497 207 (Succeed, ) 207 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X844 497 1251 (which means that any other packets \(e.g. dummy packets for) 1251 SB
X271 551 975 (measuring processor utilisation\) will be ignored.) 975 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 630 161 (ACTIONS) 161 SB
X330 670 23 (#) 23 SB
X330 710 1311 (SourcePeerType=IP, SourcePeerMask=255, # 1) 1311 SB
X330 750 1357 ( SourcePeerAddress=11.12.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 790 1265 ( DestPeerAddress=13.14.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 830 1311 (SourcePeerType=Novell, SourcePeerMask=255, # 2) 1311 SB
X330 870 1357 ( SourcePeerAddress=21.22.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 910 1265 ( DestPeerAddress=23.24.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 950 1311 (SourcePeerType=DECnet, SourcePeerMask=255, # 3) 1311 SB
X330 990 1357 ( SourcePeerAddress=31.32.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 1030 1265 ( DestPeerAddress=33.34.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 1070 1311 (SourcePeerType=EtherTalk, SOurcePeerMask=255, # 4) 1311 SB
X330 1110 1357 ( SourcePeerAddress=41.42.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 1150 1265 ( DestPeerAddress=43.44.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 1190 23 (#) 23 SB
X330 1230 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1295 1851 (The default action table provides aggregate actions as required by the default rules. Each) 1851 SB
X271 1349 1717 (of these specifies a set of values for flow attributes. These have been chosen to be) 1717 SB
X271 1403 1738 (values which would not occur in normal traffic flows - they simply serve to identify the) 1738 SB
X271 1457 246 (aggregates.) 246 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1529 117 (5.3.2.) 117 SB
X419 1529 284 (rules.sample) 284 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1607 506 (# 1705, Mon 13 Sep 93) 506 SB
X330 1647 23 (#) 23 SB
X330 1687 1242 (# Rule specification file to tally IP net <-> IP net,) 1242 SB
X330 1727 1219 (# tally DECnet and Novell and aggregate EtherTalk) 1219 SB
X330 1767 23 (#) 23 SB
X330 1807 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 1847 23 (#) 23 SB
X330 1887 828 (SET 2 # Rule + action set number 2) 828 SB
X330 1927 23 (#) 23 SB
X330 1967 115 (RULES) 115 SB
X330 2007 23 (#) 23 SB
X330 2047 1311 (SourcePeerType & 255 = DECnet : Tally, 9; # 1) 1311 SB
X330 2087 1311 (SourcePeerType & 255 = IP.0.0.0 : Pushto, 8; # 2) 1311 SB
X330 2127 1311 (SourcePeerType & 255 = EtherTalk : Aggregate, 7; # 3) 1311 SB
X330 2167 1311 (SourcePeerType & 255 = Novell : Tally, 8; # 4) 1311 SB
X330 2207 1495 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1495 SB
X330 2247 23 (#) 23 SB
X330 2287 1311 (Null & 0 = 0 : Succeed, 0; # 6) 1311 SB
X330 2327 1311 (Null & 0 = 0 : Succeed, 0; # 7) 1311 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2392 1739 (The first part of this rule table determines the peer protocol type. DECnet and Novell) 1739 SB
X271 2446 1843 (packets are tallied by actions 9 and 8, and EtherTalk packets are aggregated using action) 1843 SB
X271 2500 1832 (7. IP packets cause the meter to save rule 2's index on the pattern stack then test rule 8.) 1832 SB
X271 2554 1839 (Rules 6 and 7 are never executed; they merely provide a gap in the rule table for possible) 1839 SB
X271 2608 191 (later use.) 191 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2687 1610 (SourcePeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 13; # 8 Low B) 1610 SB
X330 2727 1610 (SourcePeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 16; # 9 Low C) 1610 SB
X330 2767 1610 (SourcePeerAddress & 192.0.0.0 = 64.0.0.0 : Pushto, 18; # 10 Low A) 1610 SB
X330 2807 1610 (SourcePeerAddress & 192.0.0.0 = 0.0.0.0 : Pushto, 18; # 11 Low A) 1610 SB
X330 2847 1449 (Null & 0 = 0 : Fail, 0; # 12) 1449 SB
X330 2887 23 (#) 23 SB
X330 2927 1748 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 1; # 13 High B: B-B) 1748 SB
X330 2967 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 2; # 14 High C: B-C) 1748 SB
X330 3007 1449 (Null & 0 = 0 : Fail, 0; # 15) 1449 SB
X330 3047 23 (#) 23 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (14) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC
X330 256 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 3; # 16 High C: C-C) 1748 SB
X330 296 1449 (Null & 0 = 0 : Fail, 0; # 17) 1449 SB
X330 336 23 (#) 23 SB
X330 376 1748 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 4; # 18 High B: A-B) 1748 SB
X330 416 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 5; # 19 High C: A-C) 1748 SB
X330 456 1748 (DestPeerAddress & 192.0.0.0 = 64.0.0.0 : Tally, 6; # 20 High A: A-A) 1748 SB
X330 496 1748 (DestPeerAddress & 192.0.0.0 = 0.0.0.0 : Tally, 6; # 21 High A: A-A) 1748 SB
X330 536 1449 (Null & 0 = 0 : Fail, 0; # 22) 1449 SB
X330 576 23 (#) 23 SB
X330 616 1449 (Null & 0 = 0 : Fail, 0; # 23) 1449 SB
X330 656 1449 (Null & 0 = 0 : Fail, 0; # 24) 1449 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 721 1760 (This part of the rule table handles IP packets. The first two bits of the packet's source) 1760 SB
X271 775 1747 (peer address are examined to decide whether it is class A, B or C. For each of these) 1747 SB
X271 829 1802 (cases the first two bits of the destination peer address is tested to determine its address) 1802 SB
X271 883 1709 (class. The packet is then tallied in one of six tallies for each of the possible pairs of) 1709 SB
X271 937 296 (address class.) 296 SB
X271 1016 1848 (Note that the above rules make no attempt to impose any order on source and destination) 1848 SB
X271 1070 1796 (addresses. When a packet appears which is the first of a new traffic flow, its source will) 1796 SB
X271 1124 535 (be the source for the flow.) 535 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1203 161 (ACTIONS) 161 SB
X330 1243 23 (#) 23 SB
X330 1283 1058 (SourcePeerType=IP, SourcePeerMask=255.255.0.0,) 1058 SB
X330 1323 1472 ( DestPeerMask=255.255.0.0; # 1 B-B) 1472 SB
X330 1363 1058 (SourcePeerType=IP, SourcePeerMask=255.255.0.0,) 1058 SB
X330 1403 1472 ( DestPeerMask=255.255.255.0; # 2 B-C) 1472 SB
X330 1443 1104 (SourcePeerType=IP, SourcePeerMask=255.255.255.0,) 1104 SB
X330 1483 1472 ( DestPeerMask=255.255.255.0; # 3 C-C) 1472 SB
X330 1523 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB
X330 1563 1472 ( DestPeerMask=255.255.0.0; # 4 A-B) 1472 SB
X330 1603 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB
X330 1643 1472 ( DestPeerMask=255.255.255.0; # 5 A-C) 1472 SB
X330 1683 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB
X330 1723 1472 ( DestPeerMask=255.0.0.0; # 6 A-A) 1472 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1788 1805 (The first six actions are tallies for each of the possible combinations of IP address class.) 1805 SB
X271 1842 1807 (Each has the appropriate peer address masks set, telling the meter which parts of those) 1807 SB
X271 1896 561 (attributes are to be tallied. ) 561 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X832 1896 361 (SourcePeerType ) 361 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1193 1896 788 (is set to IP; without this it would not be) 788 SB
X271 1950 1609 (possible to determine the peer address type when the flow data was collected.) 1609 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2029 575 (SourcePeerType=EtherTalk,) 575 SB
X330 2069 1265 ( SourcePeerAddress=1.0.0.0, SourcePeerMask=255.0.0.0,) 1265 SB
X330 2109 1610 ( DestPeerAddress=1.0.0.0, DestPeerMask=255.0.0.0; # 7 Aggregate) 1610 SB
X330 2149 23 (#) 23 SB
X330 2189 1242 (SourcePeerType=Novell, SourcePeerMask=255.255.255.255,) 1242 SB
X330 2229 1610 ( DestPeerMask=255.255.255.255; # 8 Tally all) 1610 SB
X330 2269 1196 (SourcePeerType=DECnet, SourcePeerMask=255.255.255.0,) 1196 SB
X330 2309 1610 ( DestPeerMask=255.255.255.0; # 9 Tally all) 1610 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2374 1801 (The remaining actions aggreagate EtherTalk and tally Novell and DECnet packets. The) 1801 SB
X271 2428 1803 (tallies use the entire peer address in each case. This instructs the meter to create flows) 1803 SB
X271 2482 1799 (for every possible pair of peer addresses. The network segment which this rule set was) 1799 SB
X271 2536 1219 (written for has very little EtherTalk, Novell or DECnet traffic.) 1219 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2615 989 (FORMAT FlowRuleSet FlowIndex FirstTime " ") 989 SB
X330 2655 1288 ( SourcePeerType SourcePeerAddress DestPeerAddress " ") 1288 SB
X330 2695 1012 ( ToPDUs FromPDUs " " ToOctets FromOctets;) 1012 SB
X330 2735 23 (#) 23 SB
X330 2775 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2840 1734 (The Format statement specifies the attributes to be collected from the meter. It uses) 1734 SB
X271 2894 1177 (double spaces to separate the attributes into four groups.) 1177 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (15) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC
X271 257 117 (5.3.3.) 117 SB
X419 257 307 (rules.gateway) 307 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 335 506 (# 1605, Fri 24 Sep 93) 506 SB
X330 375 23 (#) 23 SB
X330 415 1288 (# Rule specification file to tally traffic to/from ccr1) 1288 SB
X330 455 23 (#) 23 SB
X330 495 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 535 23 (#) 23 SB
X330 575 828 (SET 6 # Rule + action set number 6) 828 SB
X330 615 23 (#) 23 SB
X330 655 115 (RULES) 115 SB
X330 695 23 (#) 23 SB
X330 735 1610 (DestAdjacentAddress & ff-ff-ff-ff-ff-ff = aa-00-04-00-f4-ed : # ccr1) 1610 SB
X330 775 506 ( Pushto, 3; # 1) 506 SB
X330 815 1150 (Null & 0 = 0 : Fail, 0; # 2 Try again) 1150 SB
X330 855 23 (#) 23 SB
X330 895 1518 (SourcePeerType, 255, IP, Pushto, 5; # 3) 1518 SB
X330 935 1702 (Null, 0, 0, Succeed, 0; # 4 Ignore) 1702 SB
X330 975 23 (#) 23 SB
X330 1015 1748 (SourcePeerAddress, 255.255.0.0, 130.216.0.0, Pushto, 8; # 5 Auckland) 1748 SB
X330 1055 1679 (SourcePeerAddress, 192.0.0.0, 192.0.0.0, Pushto, 8; # 6 Low C) 1679 SB
X330 1095 1679 (Null, 0, 0, Pushto, 11; # 7 Low B) 1679 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1160 1776 (This rule set was intended for metering traffic through a gateway ethernet, which has a) 1776 SB
X271 1214 289 (router named ) 289 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X560 1214 87 (ccr1) 87 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X647 1214 1358 ( providing our connection to the Internet. Rule 1 above tests each) 1358 SB
X271 1268 182 (packet's ) 182 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X453 1268 446 (DestAdjacentAddress) 446 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X899 1268 1034 ( to see whether its destination is on the far side of ) 1034 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1933 1268 100 (ccr1.) 100 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X2033 1268 88 ( If it) 88 SB
X271 1322 1858 (is, rule 5 will be tested next, otherwise rule two is tested, Rule two fails, allowing the meter) 1858 SB
X271 1376 1828 (to interchange source and destinations and try again. If the match fails on the second try) 1828 SB
X271 1430 442 (the packet is ignored.) 442 SB
X271 1509 1240 (The rest of this rule file is very similar to rules.sample above.) 1240 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1581 117 (5.3.4.) 117 SB
X419 1581 233 (rules.UofA) 233 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1659 483 (# 1440, Fri 1 Oct 93) 483 SB
X330 1699 23 (#) 23 SB
X330 1739 1449 (# Rule specification file to tally traffic for Auckland, using) 1449 SB
X330 1779 966 (# three groups of sites: UA, Local, NZ) 966 SB
X330 1819 23 (#) 23 SB
X330 1859 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 1899 23 (#) 23 SB
X330 1939 782 (SET 8 # Rule + action set number) 782 SB
X330 1979 23 (#) 23 SB
X330 2019 115 (RULES) 115 SB
X330 2059 23 (#) 23 SB
X330 2099 1104 (SourcePeerType & 255 = IP : Pushto, 7; # 1) 1104 SB
X330 2139 1288 (Null & 0 = 0 : Succeed, 0; # 2 Ignore) 1288 SB
X330 2179 23 (#) 23 SB
X330 2219 1288 (Null & 0 = 0 : Succeed, 0; # 3 Ignore) 1288 SB
X330 2259 1288 (Null & 0 = 0 : Succeed, 0; # 4 Ignore) 1288 SB
X330 2299 1288 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1288 SB
X330 2339 1288 (Null & 0 = 0 : Succeed, 0; # 6 Ignore) 1288 SB
X330 2379 23 (#) 23 SB
X330 2419 1725 (SourcePeerAddress & 255.255.0.0 = 130.216.0.0 : Pushto, 33 # 7 UofA) 1725 SB
X330 2459 23 (#) 23 SB
X330 2499 1702 (SourcePeerAddress & 255.255.255.0 = 192.156.165.0 : Pushto, 31 # 8 decus) 1702 SB
X330 2539 1817 (SourcePeerAddress & 255.255.255.0 = 192.251.230.0 : Pushto, 31 # 9 clearfield) 1817 SB
X330 2579 1656 (SourcePeerAddress & 255.255.255.0 = 202.12.104.0 : Pushto, 31 # 10 dse) 1656 SB
X330 2659 1725 (SourcePeerAddress & 255.255.255.0 = 202.14.254.0 : Pushto, 31 # 18 cray 3) 1725 SB
X330 2699 23 (#) 23 SB
X330 2739 1679 (SourcePeerAddress & 255.255.0.0 = 156.62.0.0 : Pushto, 31 # 19 ati) 1679 SB
X330 2779 23 (#) 23 SB
X330 2819 598 (# Source isn't UA or local) 598 SB
X330 2859 23 (#) 23 SB
X330 2899 1495 (Null & 0 = 0 : Fail, 0; # 20 Try match again) 1495 SB
X330 2939 23 (#) 23 SB
X330 2979 1104 (Null & 0 = 0 : Succeed, 0; # 21) 1104 SB
X330 3019 1104 (Null & 0 = 0 : Succeed, 0; # 22) 1104 SB
X330 3099 1104 (Null & 0 = 0 : Succeed, 0; # 30) 1104 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (16) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC
X330 256 23 (#) 23 SB
X330 296 391 (# Source is local) 391 SB
X330 336 23 (#) 23 SB
X330 376 1748 (DestPeerAddress & 255.255.0.0 = 130.216.0.0 : Fail, 0; # 31 Retry match) 1748 SB
X330 416 1472 (Null & 0 = 0 : Pushto, 34; # 32 Tally packet) 1472 SB
X330 456 23 (#) 23 SB
X330 496 322 (# Source is UA) 322 SB
X330 536 23 (#) 23 SB
X330 576 1610 (DestPeerAddress & 255.255.0.0 = 130.216.0.0 : Count, 0; # 33 UA-UA) 1610 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 641 1865 (This rule set meters traffic through our gateway ethernet. IP packets are classified into two) 1865 SB
X271 695 1887 (groups: 'source is Auckland' and 'source is local to Auckland,' i.e. one of the list of networks) 1887 SB
X271 749 1790 (in rules 8 to 19. The rules above make sure that if either of a flow's hosts is Auckland it) 1790 SB
X271 803 1897 (appears as the flow's source, so that flows between Auckland and one of our local networks) 1897 SB
X271 857 338 (are well defined.) 338 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 936 920 (# Direction determined; tally the packet) 920 SB
X330 976 23 (#) 23 SB
X330 1016 1610 (DestPeerAddress & 140.200.0.0 = 255.255.0.0 : Pushto, 48; # 34 Tuia) 1610 SB
X330 1056 23 (#) 23 SB
X330 1096 1633 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 49; # 35 Tally C) 1633 SB
X330 1136 1633 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 43; # 36 Tally B) 1633 SB
X330 1176 23 (#) 23 SB
X330 1216 1610 (SourceDetailType & 255 = icmp : Tally, 4; # 37 Tally A) 1610 SB
X330 1256 1403 (SourceDetailAddress & 255.255 = domain : Tally, 7; # 38) 1403 SB
X330 1296 1403 (DestDetailAddress & 255.255 = domain : Tally, 7; # 39) 1403 SB
X330 1336 1403 (DestDetailAddress & 255.255 = ftpdata : Tally, 10; # 40) 1403 SB
X330 1376 1403 (SourceDetailAddress & 255.255 = ftpdata : Tally, 13; # 41) 1403 SB
X330 1416 1403 (Null & 0 = 0 : Tally, 1; # 42) 1403 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1481 1899 (Once classified, packets are tallied in various ways, depending on their IP protocol type. For) 1899 SB
X271 1535 1427 (example, Domain Name Service traffic flows have a detail address of ) 1427 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1698 1535 152 (domain) 152 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1850 1535 232 ( for source,) 232 SB
X271 1589 1016 (destination or both. - these are tallied by action 7.) 1016 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1668 161 (ACTIONS) 161 SB
X330 1708 23 (#) 23 SB
X330 1748 1679 (SourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 1 Tally ports A) 1679 SB
X330 1788 644 ( SourceDetailTypeMask=255,) 644 SB
X330 1828 1196 ( SourceDetailMask=255.255, DestDetailMask=255.255;) 1196 SB
X330 1868 1725 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 2 Tally ports B) 1725 SB
X330 1908 644 ( SourceDetailTypeMask=255,) 644 SB
X330 1948 1196 ( SourceDetailMask=255.255, DestDetailMask=255.255;) 1196 SB
X330 1988 1771 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 3 Tally ports C) 1771 SB
X330 2028 644 ( SourceDetailTypeMask=255,) 644 SB
X330 2068 1196 ( SourceDetailMask=255.255, DestDetailMask=255.255;) 1196 SB
X330 2108 23 (#) 23 SB
X330 2148 1656 (SourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 4 Tally icmp A) 1656 SB
X330 2188 1058 ( SourceDetailType=icmp, DestDetailType=icmp;) 1058 SB
X330 2228 1702 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 5 Tally icmp B) 1702 SB
X330 2268 1058 ( SourceDetailType=icmp, DestDetailType=icmp;) 1058 SB
X330 2308 1748 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 6 Tally icmp C) 1748 SB
X330 2348 1058 ( SourceDetailType=icmp, DestDetailType=icmp;) 1058 SB
X330 2388 23 (#) 23 SB
X330 2428 1702 (SourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 7 Tally domain A) 1702 SB
X330 2468 644 ( SourceDetailTypeMask=255,) 644 SB
X330 2508 1288 ( SourceDetailAddress=domain, DestDetailAddress=domain;) 1288 SB
X330 2548 1748 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 8 Tally domain B) 1748 SB
X330 2588 644 ( SourceDetailTypeMask=255,) 644 SB
X330 2628 1288 ( SourceDetailAddress=domain, DestDetailAddress=domain;) 1288 SB
X330 2668 1794 (SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 9 Tally domain C) 1794 SB
X330 2708 644 ( SourceDetailTypeMask=255,) 644 SB
X330 2748 1288 ( SourceDetailAddress=domain, DestDetailAddress=domain;) 1288 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2813 1823 (The actions are arranged in groups of three, for class A, B and C destination networks. A) 1823 SB
X271 2867 1857 (class C mask is used for all the source networks, which breaks the class B ones \(Auckland) 1857 SB
X271 2921 699 (and ait\) into their class C subnets.) 699 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (17) 52 SB
X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC
X330 256 989 (FORMAT FlowRuleSet FlowIndex FirstTime " ") 989 SB
X330 296 943 ( SourcePeerAddress DestPeerAddress " ") 943 SB
X330 336 1426 ( SourceDetailType SourceDetailAddress DestDetailAddress " ") 1426 SB
X330 376 1012 ( ToPDUs FromPDUs " " ToOctets FromOctets;) 1012 SB
X330 416 23 (#) 23 SB
X330 456 897 (STATISTICS # Collect meter statistics) 897 SB
X330 496 23 (#) 23 SB
X330 536 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 601 1774 (The Format statement specifies the attributes to be collected. These include the detail) 1774 SB
X271 655 1743 (addresses, allowing for analysis of the traffic by IP service. The meter's performance) 1743 SB
X271 709 625 (statistics will also be collected.) 625 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 781 117 (5.3.5.) 117 SB
X419 781 191 (rules.lan) 191 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 859 483 (# 1015, Mon 4 Oct 93) 483 SB
X330 899 23 (#) 23 SB
X330 939 1426 (# Rule specification file to tally Local Area Network traffic) 1426 SB
X330 979 23 (#) 23 SB
X330 1019 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 1059 23 (#) 23 SB
X330 1099 759 (SET 4 # Rule + action set number) 759 SB
X330 1139 23 (#) 23 SB
X330 1179 115 (RULES) 115 SB
X330 1219 23 (#) 23 SB
X330 1259 1311 (SourcePeerType & 255 = IP.0.0.0 : Tally, 1; # 1) 1311 SB
X330 1299 1311 (SourcePeerType & 255 = DECnet : Pushto, 6; # 2) 1311 SB
X330 1339 1311 (SourcePeerType & 255 = EtherTalk : Pushto, 11; # 3) 1311 SB
X330 1379 1311 (SourcePeerType & 255 = Novell : Tally, 6; # 4) 1311 SB
X330 1419 1495 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1495 SB
X330 1459 23 (#) 23 SB
X330 1499 1702 (SourceDetailType & 255 = 38 : Tally, 2; # 6 Tally DECnet data by host) 1702 SB
X330 1539 1081 (SourceDetailType & 255 = 6 : Tally, 2; # 7) 1081 SB
X330 1579 1081 (SourceDetailType & 255 = 46 : Tally, 2; # 8) 1081 SB
X330 1619 1081 (SourceDetailType & 255 = 14 : Tally, 2; # 9) 1081 SB
X330 1659 1656 (Null & 0 = 0 : Tally, 3; # 10 Tally rest of DECnet by) 1656 SB
X330 1699 138 (detail) 138 SB
X330 1739 23 (#) 23 SB
X330 1779 1610 (SourceDetailType & 255 = 3 : Tally, 4; # 11 Tally AT data by host) 1610 SB
X330 1819 1725 (Null & 0 = 0 : Tally, 5; # 12 Tally rest of AT by detail) 1725 SB
X330 1859 23 (#) 23 SB
X330 1899 161 (ACTIONS) 161 SB
X330 1939 23 (#) 23 SB
X330 1979 1656 (SourcePeerType=IP, # 1 Tally IP by subnet and port) 1656 SB
X330 2019 1380 ( SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,) 1380 SB
X330 2059 1794 ( SourceDetailTypeMask=255, SourceDetailMask=255.255, DestDetailMask=255.255;) 1794 SB
X330 2099 23 (#) 23 SB
X330 2139 1587 (SourcePeerType=DECnet, # 2 Tally DECnet data by host) 1587 SB
X330 2179 1380 ( SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,) 1380 SB
X330 2219 644 ( SourceDetailTypeMask=255;) 644 SB
X330 2259 1564 (SourcePeerType=DECnet, # 3 Tally DECnet by protocol) 1564 SB
X330 2299 644 ( SourceDetailTypeMask=255;) 644 SB
X330 2339 23 (#) 23 SB
X330 2379 1656 (SourcePeerType=EtherTalk, # 4 Tally Ethertalk data by host) 1656 SB
X330 2419 1380 ( SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,) 1380 SB
X330 2459 644 ( SourceDetailTypeMask=255;) 644 SB
X330 2499 1633 (SourcePeerType=EtherTalk, # 5 Tally Ethertalk by DDP type) 1633 SB
X330 2539 644 ( SourceDetailTypeMask=255;) 644 SB
X330 2579 23 (#) 23 SB
X330 2619 1794 (SourcePeerType=Novell, # 6 Tally IPX by network nbr and port) 1794 SB
X330 2659 1472 ( SourcePeerMask=255.255.255.255, DestPeerMask=255.255.255.255,) 1472 SB
X330 2699 644 ( SourceDetailTypeMask=255,) 644 SB
X330 2739 1196 ( SourceDetailMask=255.255, DestDetailMask=255.255;) 1196 SB
X330 2779 23 (#) 23 SB
X330 2819 230 (STATISTICS) 230 SB
X330 2859 23 (#) 23 SB
X330 2899 989 (FORMAT FlowRuleSet FlowIndex FirstTime " ") 989 SB
X330 2939 1288 ( SourcePeerType SourcePeerAddress DestPeerAddress " ") 1288 SB
X330 2979 1426 ( SourceDetailType SourceDetailAddress DestDetailAddress " ") 1426 SB
X330 3019 1012 ( ToPDUs FromPDUs " " ToOctets FromOctets;) 1012 SB
X330 3059 23 (#) 23 SB
X330 3099 299 (# end of file) 299 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB

END_OF_FILE
if test 45499 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.C'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(191941 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 191941 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi
# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.C'
fi
if test -f 'netramet/src/apps/snmpwalk.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpwalk.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpwalk.c'\" \(4841 characters\)
sed "s/^X//" >'netramet/src/apps/snmpwalk.c' <<'END_OF_FILE'


X/*
X * snmpwalk.c - send snmp GETNEXT requests to a network entity, walking a subtree.

X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"

X#include "snmpapi.h"
X#include "snmpclnt.h"
X

Xoid objid_mib[] = {1, 3, 6, 1, 2, 1};
X


Xint snmp_dump_packet = 0;
X
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X struct snmp_session session, *ss;


X struct snmp_pdu *pdu, *response;

X struct variable_list *vars;
X int arg;
X char *gateway = NULL;
X char *community = NULL;

X int gotroot = 0;
X oid name[32];


X int name_length;
X oid root[MAX_NAME_LEN];

X int rootlen, count;
X int running;
X int status;
X
X init_mib();
X /*
X * usage: snmpwalk gateway-name community-name [object-id]


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;
X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;
X }

X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];

X } else {
X rootlen = MAX_NAME_LEN;
X if (read_objid(argv[arg], root, &rootlen)){
X gotroot = 1;
X } else {


X printf("Invalid object identifier: %s\n", argv[arg]);

X }
X }
X }
X


X if (gotroot == 0){

X bcopy((char *)objid_mib, (char *)root, sizeof(objid_mib));
X rootlen = sizeof(objid_mib) / sizeof(oid);
X gotroot = 1;
X }
X


X if (!(gateway && community && gotroot == 1)){

X printf("usage: snmpwalk gateway-name community-name object-identifier\n");
X exit(1);
X }
X


X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;

X snmp_synch_setup(&session);


X ss = snmp_open(&session);
X if (ss == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X bcopy((char *)root, (char *)name, rootlen * sizeof(oid));
X name_length = rootlen;
X
X running = 1;
X while(running){
X running = 0;


X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X snmp_add_null_var(pdu, name, name_length);
X
X status = snmp_synch_response(ss, pdu, &response);


X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){

X for(vars = response->variables; vars; vars = vars->next_variable){
X if (vars->name_length < rootlen || bcmp(root, vars->name, rootlen * sizeof(oid)))


X continue; /* not part of this subtree */
X print_variable(vars->name, vars->name_length, vars);

X bcopy((char *)vars->name, (char *)name, vars->name_length * sizeof(oid));
X name_length = vars->name_length;
X running = 1; /* restart so we can get next variable */
X }
X } else {
X if (response->errstat == SNMP_ERR_NOSUCHNAME){


X printf("End of MIB.\n");
X } else {

X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){


X printf("The request for this object identifier failed: ");

X for(count = 1, vars = response->variables; vars && count != response->errindex;


X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);

X printf("\n");
X }
X }

X }
X
X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);
X } else { /* status == STAT_ERROR */
X printf("An error occurred, Quitting\n");
X }
X


X if (response)
X snmp_free_pdu(response);
X }

X printf("rootlen %d\n", rootlen);
X snmp_close(ss);
X}
X
END_OF_FILE
if test 4841 -ne `wc -c <'netramet/src/apps/snmpwalk.c'`; then
echo shar: \"'netramet/src/apps/snmpwalk.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpwalk.c'
fi
if test -f 'netramet/src/snmplib/include/mib.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/mib.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/mib.h'\" \(10793 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/mib.h' <<'END_OF_FILE'
X/*
X * Definitions for the variables as defined in the MIB


X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

Xstruct mib_system {
X char sysDescr[32]; /* textual description */
X u_char sysObjectID[16];/* OBJECT IDENTIFIER of system */
X u_char ObjIDLen; /* length of sysObjectID */
X u_long sysUpTime; /* Uptime in 100/s of a second */
X};
X
Xstruct mib_interface {
X long ifNumber; /* number of interfaces */
X};
X
Xstruct mib_ifEntry {
X long ifIndex; /* index of this interface */
X char ifDescr[32]; /* english description of interface */
X long ifType; /* network type of device */
X long ifMtu; /* size of largest packet in bytes */
X u_long ifSpeed; /* bandwidth in bits/sec */
X u_char ifPhysAddress[11]; /* interface's address */
X u_char PhysAddrLen; /* length of physAddr */
X long ifAdminStatus; /* desired state of interface */
X long ifOperStatus; /* current operational status */
X u_long ifLastChange; /* value of sysUpTime when current state entered */
X u_long ifInOctets; /* number of octets received on interface */
X u_long ifInUcastPkts; /* number of unicast packets delivered */
X u_long ifInNUcastPkts; /* number of broadcasts or multicasts */
X u_long ifInDiscards; /* number of packets discarded with no error */
X u_long ifInErrors; /* number of packets containing errors */
X u_long ifInUnknownProtos; /* number of packets with unknown protocol */
X u_long ifOutOctets; /* number of octets transmitted */
X u_long ifOutUcastPkts; /* number of unicast packets sent */
X u_long ifOutNUcastPkts;/* number of broadcast or multicast pkts */
X u_long ifOutDiscards; /* number of packets discarded with no error */
X u_long ifOutErrors; /* number of pkts discarded with an error */
X u_long ifOutQLen; /* number of packets in output queue */
X};
X
Xstruct mib_atEntry {
X long atIfIndex; /* interface on which this entry maps */
X u_char atPhysAddress[11]; /* physical address of destination */
X u_char PhysAddressLen; /* length of atPhysAddress */
X u_long atNetAddress; /* IP address of physical address */
X};
X
Xstruct mib_ip {
X long ipForwarding; /* 1 if gateway, 2 if host */
X long ipDefaultTTL; /* default TTL for pkts originating here */
X u_long ipInReceives; /* no. of IP packets received from interfaces */
X u_long ipInHdrErrors; /* number of pkts discarded due to header errors */
X u_long ipInAddrErrors; /* no. of pkts discarded due to bad address */
X u_long ipForwDatagrams;/* number pf pkts forwarded through this entity */
X u_long ipInUnknownProtos;/* no. of local-addressed pkts w/unknown proto */
X u_long ipInDiscards; /* number of error-free packets discarded */
X u_long ipInDelivers; /* number of datagrams delivered to upper level */
X u_long ipOutRequests; /* number of IP datagrams originating locally */
X u_long ipOutDiscards; /* number of error-free output IP pkts discarded */
X u_long ipOutNoRoutes; /* number of IP pkts discarded due to no route */
X long ipReasmTimeout; /* seconds fragment is held awaiting reassembly */
X u_long ipReasmReqds; /* no. of fragments needing reassembly (here) */
X u_long ipReasmOKs; /* number of fragments reassembled */
X u_long ipReasmFails; /* number of failures in IP reassembly */
X u_long ipFragOKs; /* number of datagrams fragmented here */
X u_long ipFragFails; /* no. pkts unable to be fragmented here */
X u_long ipFragCreates; /* number of IP fragments created here */
X};
X
Xstruct mib_ipAddrEntry {
X u_long ipAdEntAddr; /* IP address of this entry */
X long ipAdEntIfIndex; /* IF for this entry */
X u_long ipAdEntNetMask; /* subnet mask of this entry */
X long ipAdEntBcastAddr;/* read the MIB for this one */
X};
X
Xstruct mib_ipRouteEntry {
X u_long ipRouteDest; /* destination IP addr for this route */
X long ipRouteIfIndex; /* index of local IF for this route */
X long ipRouteMetric1; /* Primary routing metric */
X long ipRouteMetric2; /* Alternate routing metric */
X long ipRouteMetric3; /* Alternate routing metric */
X long ipRouteMetric4; /* Alternate routing metric */
X u_long ipRouteNextHop; /* IP addr of next hop */
X long ipRouteType; /* Type of this route */
X long ipRouteProto; /* How this route was learned */
X long ipRouteAge; /* No. of seconds since updating this route */
X};
X
Xstruct mib_icmp {
X u_long icmpInMsgs; /* Total of ICMP msgs received */
X u_long icmpInErrors; /* Total of ICMP msgs received with errors */
X u_long icmpInDestUnreachs;
X u_long icmpInTimeExcds;
X u_long icmpInParmProbs;
X u_long icmpInSrcQuenchs;
X u_long icmpInRedirects;
X u_long icmpInEchos;
X u_long icmpInEchoReps;
X u_long icmpInTimestamps;
X u_long icmpInTimestampReps;
X u_long icmpInAddrMasks;
X u_long icmpInAddrMaskReps;
X u_long icmpOutMsgs;
X u_long icmpOutErrors;
X u_long icmpOutDestUnreachs;
X u_long icmpOutTimeExcds;
X u_long icmpOutParmProbs;
X u_long icmpOutSrcQuenchs;
X u_long icmpOutRedirects;
X u_long icmpOutEchos;
X u_long icmpOutEchoReps;
X u_long icmpOutTimestamps;
X u_long icmpOutTimestampReps;
X u_long icmpOutAddrMasks;
X u_long icmpOutAddrMaskReps;
X};
X
Xstruct mib_tcp {
X long tcpRtoAlgorithm; /* retransmission timeout algorithm */
X long tcpRtoMin; /* minimum retransmission timeout (mS) */
X long tcpRtoMax; /* maximum retransmission timeout (mS) */
X long tcpMaxConn; /* maximum tcp connections possible */
X u_long tcpActiveOpens; /* number of SYN-SENT -> CLOSED transitions */
X u_long tcpPassiveOpens; /* number of SYN-RCVD -> LISTEN transitions */
X u_long tcpAttemptFails;/*(SYN-SENT,SYN-RCVD)->CLOSED or SYN-RCVD->LISTEN*/
X u_long tcpEstabResets; /* (ESTABLISHED,CLOSE-WAIT) -> CLOSED */
X u_long tcpCurrEstab; /* number in ESTABLISHED or CLOSE-WAIT state */
X u_long tcpInSegs; /* number of segments received */
X u_long tcpOutSegs; /* number of segments sent */
X u_long tcpRetransSegs; /* number of retransmitted segments */
X};
X
Xstruct mib_tcpConnEntry {
X long tcpConnState; /* State of this connection */
X u_long tcpConnLocalAddress;/* local IP address for this connection */
X long tcpConnLocalPort; /* local port for this connection */
X u_long tcpConnRemAddress; /* remote IP address for this connection */
X long tcpConnRemPort; /* remote port for this connection */
X};
X
Xstruct mib_udp {
X u_long udpInDatagrams; /* No. of UDP datagrams delivered to users */
X u_long udpNoPorts; /* No. of UDP datagrams to port with no listener */
X u_long udpInErrors; /* No. of UDP datagrams unable to be delivered */
X u_long udpOutDatagrams;/* No. of UDP datagrams sent from this entity */
X};
X
Xstruct mib_egp {
X u_long egpInMsgs; /* No. of EGP msgs received without error */
X u_long egpInErrors;/* No. of EGP msgs received with error */
X u_long egpOutMsgs; /* No. of EGP msgs sent */
X u_long egpOutErrors;/* No. of (outgoing) EGP msgs dropped due to error */
X};
X
Xstruct mib_egpNeighEntry {
X long egpNeighState; /* local EGP state with this entry's neighbor */
X u_long egpNeighAddr; /* IP address of this entry's neighbor */
X};
X
X#define MIB 1, 3, 6, 1, 2, 1
X
X#define MIB_IFTYPE_OTHER 1
X#define MIB_IFTYPE_REGULAR1822 2
X#define MIB_IFTYPE_HDH1822 3
X#define MIB_IFTYPE_DDNX25 4
X#define MIB_IFTYPE_RFC877X25 5
X#define MIB_IFTYPE_ETHERNETCSMACD 6
X#define MIB_IFTYPE_ISO88023CSMACD 7
X#define MIB_IFTYPE_ISO88024TOKENBUS 8
X#define MIB_IFTYPE_ISO88025TOKENRING 9
X#define MIB_IFTYPE_ISO88026MAN 10
X#define MIB_IFTYPE_STARLAN 11
X#define MIB_IFTYPE_PROTEON10MBIT 12
X#define MIB_IFTYPE_PROTEON80MBIT 13
X#define MIB_IFTYPE_HYPERCHANNEL 14
X#define MIB_IFTYPE_FDDI 15
X#define MIB_IFTYPE_LAPB 16
X#define MIB_IFTYPE_SDLC 17
X#define MIB_IFTYPE_T1CARRIER 18
X#define MIB_IFTYPE_CEPT 19
X#define MIB_IFTYPE_BASICISDN 20
X#define MIB_IFTYPE_PRIMARYISDN 21
X#define MIB_IFTYPE_PROPPOINTTOPOINTSERIAL 22
X
X#define MIB_IFSTATUS_UP 1
X#define MIB_IFSTATUS_DOWN 2
X#define MIB_IFSTATUS_TESTING 3
X
X#define MIB_FORWARD_GATEWAY 1
X#define MIB_FORWARD_HOST 2
X
X#define MIB_IPROUTETYPE_OTHER 1
X#define MIB_IPROUTETYPE_INVALID 2
X#define MIB_IPROUTETYPE_DIRECT 3
X#define MIB_IPROUTETYPE_REMOTE 4
X
X#define MIB_IPROUTEPROTO_OTHER 1
X#define MIB_IPROUTEPROTO_LOCAL 2
X#define MIB_IPROUTEPROTO_NETMGMT 3
X#define MIB_IPROUTEPROTO_ICMP 4
X#define MIB_IPROUTEPROTO_EGP 5
X#define MIB_IPROUTEPROTO_GGP 6
X#define MIB_IPROUTEPROTO_HELLO 7
X#define MIB_IPROUTEPROTO_RIP 8
X#define MIB_IPROUTEPROTO_ISIS 9
X#define MIB_IPROUTEPROTO_ESIS 10
X#define MIB_IPROUTEPROTO_CISCOIGRP 11
X#define MIB_IPROUTEPROTO_BBNSPFIGP 12
X#define MIB_IPROUTEPROTO_OIGP 13
X
X#define MIB_TCPRTOALG_OTHER 1
X#define MIB_TCPRTOALG_CONSTANT 2
X#define MIB_TCPRTOALG_RSRE 3
X#define MIB_TCPRTOALG_VANJ 4
X
X#define MIB_TCPCONNSTATE_CLOSED 1
X#define MIB_TCPCONNSTATE_LISTEN 2
X#define MIB_TCPCONNSTATE_SYNSENT 3
X#define MIB_TCPCONNSTATE_SYNRECEIVED 4
X#define MIB_TCPCONNSTATE_ESTABLISHED 5
X#define MIB_TCPCONNSTATE_FINWAIT1 6
X#define MIB_TCPCONNSTATE_FINWAIT2 7
X#define MIB_TCPCONNSTATE_CLOSEWAIT 8
X#define MIB_TCPCONNSTATE_LASTACK 9
X#define MIB_TCPCONNSTATE_CLOSING 10
X#define MIB_TCPCONNSTATE_TIMEWAIT 11
X
X#define MIB_EGPNEIGHSTATE_IDLE 1
X#define MIB_EGPNEIGHSTATE_AQUISITION 2
X#define MIB_EGPNEIGHSTATE_DOWN 3
X#define MIB_EGPNEIGHSTATE_UP 4
X#define MIB_EGPNEIGHSTATE_CEASE 5
X
X
X
END_OF_FILE
if test 10793 -ne `wc -c <'netramet/src/snmplib/include/mib.h'`; then
echo shar: \"'netramet/src/snmplib/include/mib.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/mib.h'
fi
echo shar: End of archive 14 \(of 25\).
cp /dev/null ark14isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:12:41 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 103
Archive-name: netramet/part15
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/manager/nm.jul.c netramet/src/manager/nmc.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:09 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 15 (of 25)."'
if test -f 'netramet/src/manager/nm.jul.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/nm.jul.c'\"
else
echo shar: Extracting \"'netramet/src/manager/nm.jul.c'\" \(43638 characters\)
sed "s/^X//" >'netramet/src/manager/nm.jul.c' <<'END_OF_FILE'
X/* 1730, Fri 3 Sep 93
X
X NM.C: First attempt at a manager for the AU Accounting Meter


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X/***********************************************************
X Copyright 1988 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/param.h>
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <netdb.h>
X


X#include <stdio.h>
X#include <ctype.h>
X#include <sys/time.h>
X#include <errno.h>
X

X#include <string.h>
X#include <malloc.h>
X


X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"

X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"


X
X#ifndef BSD4_3
X#define BSD4_2
X#endif
X

X#define RULEFILE "rules.txt"
X
Xextern int errno;


Xint snmp_dump_packet = 0;
X

X#define INT_ACCT 1, 3, 6, 1, 3, 99

X#define AUKUNI 1, 3, 6, 1, 4, 1, 411
X
Xoid o_sysDescr[] = {MIB, 1, 1, 0};
Xoid o_sysUpTime[] = {MIB, 1, 3, 0};
Xoid o_ifNumber[] = {MIB, 2, 1, 0};
X
Xoid o_InactivityTimeout[] = {INT_ACCT, 1, 3, 0};
Xoid o_LastCollectTime[] = {INT_ACCT, 1, 6, 0};
Xoid o_riRuleSize[] = {INT_ACCT, 1, 7, 1, 2, 0xFF};
Xoid o_riActionSize[] = {INT_ACCT, 1, 7, 1, 3, 0xFF};
Xoid o_CurrentRuleSet[] = {INT_ACCT, 1, 8, 0};
Xoid o_EmergencyRuleSet[] = {INT_ACCT, 1, 9, 0};
X
Xoid o_ftFlowIndex[] = {INT_ACCT, 2, 1, 1, 1, 0xFFFF};
Xoid o_ftFlowStatus[] = {INT_ACCT, 2, 1, 1, 2, 0xFFFF};
Xoid o_ftLowInterface[] = {INT_ACCT, 2, 1, 1, 3, 0xFFFF};
Xoid o_ftLowAdjacentType[] = {INT_ACCT, 2, 1, 1, 4, 0xFFFF};
Xoid o_ftLowAdjacentAddress[] = {INT_ACCT, 2, 1, 1, 5, 0xFFFF};
Xoid o_ftLowAdjacentMask[] = {INT_ACCT, 2, 1, 1, 6, 0xFFFF};
Xoid o_ftLowPeerType[] = {INT_ACCT, 2, 1, 1, 7, 0xFFFF};
Xoid o_ftLowPeerAddress[] = {INT_ACCT, 2, 1, 1, 8, 0xFFFF};
Xoid o_ftLowPeerMask[] = {INT_ACCT, 2, 1, 1, 9, 0xFFFF};
Xoid o_ftLowDetailType[] = {INT_ACCT, 2, 1, 1, 10, 0xFFFF};
Xoid o_ftLowDetailAddress[] = {INT_ACCT, 2, 1, 1, 11, 0xFFFF};
Xoid o_ftLowDetailMask[] = {INT_ACCT, 2, 1, 1, 12, 0xFFFF};
Xoid o_ftHighInterface[] = {INT_ACCT, 2, 1, 1, 15, 0xFFFF};
Xoid o_ftHighAdjacentType[] = {INT_ACCT, 2, 1, 1, 16, 0xFFFF};
Xoid o_ftHighAdjacentAddress[] = {INT_ACCT, 2, 1, 1, 17, 0xFFFF};
Xoid o_ftHighAdjacentMask[] = {INT_ACCT, 2, 1, 1, 18, 0xFFFF};
Xoid o_ftHighPeerType[] = {INT_ACCT, 2, 1, 1, 19, 0xFFFF};
Xoid o_ftHighPeerAddress[] = {INT_ACCT, 2, 1, 1, 20, 0xFFFF};
Xoid o_ftHighPeerMask[] = {INT_ACCT, 2, 1, 1, 21, 0xFFFF};
Xoid o_ftHighDetailType[] = {INT_ACCT, 2, 1, 1, 22, 0xFFFF};
Xoid o_ftHighDetailAddress[] = {INT_ACCT, 2, 1, 1, 23, 0xFFFF};
Xoid o_ftHighDetailMask[] = {INT_ACCT, 2, 1, 1, 24, 0xFFFF};
Xoid o_ftPDUScale[] = {INT_ACCT, 2, 1, 1, 29, 0xFFFF};
Xoid o_ftOctetScale[] = {INT_ACCT, 2, 1, 1, 30, 0xFFFF};
Xoid o_ftRuleSet[] = {INT_ACCT, 2, 1, 1, 31, 0xFFFF};
Xoid o_ftFlowType[] = {INT_ACCT, 2, 1, 1, 32, 0xFFFF};
Xoid o_ftUpOctets[] = {INT_ACCT, 2, 1, 1, 33, 0xFFFF};
Xoid o_ftUpPDUs[] = {INT_ACCT, 2, 1, 1, 34, 0xFFFF};
Xoid o_ftDownOctets[] = {INT_ACCT, 2, 1, 1, 35, 0xFFFF};
Xoid o_ftDownPDUs[] = {INT_ACCT, 2, 1, 1, 36, 0xFFFF};
Xoid o_ftFirstTime[] = {INT_ACCT, 2, 1, 1, 37, 0xFFFF};
Xoid o_ftLastTime[] = {INT_ACCT, 2, 1, 1, 38, 0xFFFF};
X
Xoid o_ftCreateTime[] = {INT_ACCT, 2, 2, 1, 1, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftCreateIndex[] = {INT_ACCT, 2, 2, 1, 2, 0xFFFFFFFF, 0xFFFF};
X
Xoid o_ftActiveTime[] = {INT_ACCT, 2, 3, 1, 1, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftActiveIndex[] = {INT_ACCT, 2, 3, 1, 2, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftActiveFlowBlob[] = {INT_ACCT, 2, 3, 1, 3, 0xFFFFFFFF, 0xFFFF};
X
Xoid o_rtSelector[] = {INT_ACCT, 3, 1, 1, 3, 0xFF, 0xFFFF};
Xoid o_rtRuleMask[] = {INT_ACCT, 3, 1, 1, 4, 0xFF, 0xFFFF};
Xoid o_rtMatchedValue[] = {INT_ACCT, 3, 1, 1, 5, 0xFF, 0xFFFF};
Xoid o_rtRuleAction[] = {INT_ACCT, 3, 1, 1, 6, 0xFF, 0xFFFF};
Xoid o_rtJumpIndex[] = {INT_ACCT, 3, 1, 1, 7, 0xFF, 0xFFFF};
X
Xoid o_atLowInterface[] = {INT_ACCT, 4, 1, 1, 3, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentType[] = {INT_ACCT, 4, 1, 1, 4, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentAddress[] = {INT_ACCT, 4, 1, 1, 5, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentMask[] = {INT_ACCT, 4, 1, 1, 6, 0xFF, 0xFFFF};
Xoid o_atLowPeerType[] = {INT_ACCT, 4, 1, 1, 7, 0xFF, 0xFFFF};
Xoid o_atLowPeerAddress[] = {INT_ACCT, 4, 1, 1, 8, 0xFF, 0xFFFF};
Xoid o_atLowPeerMask[] = {INT_ACCT, 4, 1, 1, 9, 0xFF, 0xFFFF};
Xoid o_atLowDetailType[] = {INT_ACCT, 4, 1, 1, 10, 0xFF, 0xFFFF};
Xoid o_atLowDetailAddress[] = {INT_ACCT, 4, 1, 1, 11, 0xFF, 0xFFFF};
Xoid o_atLowDetailMask[] = {INT_ACCT, 4, 1, 1, 12, 0xFF, 0xFFFF};
Xoid o_atHighInterface[] = {INT_ACCT, 4, 1, 1, 15, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentType[] = {INT_ACCT, 4, 1, 1, 16, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentAddress[] = {INT_ACCT, 4, 1, 1, 17, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentMask[] = {INT_ACCT, 4, 1, 1, 18, 0xFF, 0xFFFF};
Xoid o_atHighPeerType[] = {INT_ACCT, 4, 1, 1, 19, 0xFF, 0xFFFF};
Xoid o_atHighPeerAddress[] = {INT_ACCT, 4, 1, 1, 20, 0xFF, 0xFFFF};
Xoid o_atHighPeerMask[] = {INT_ACCT, 4, 1, 1, 21, 0xFF, 0xFFFF};
Xoid o_atHighDetailType[] = {INT_ACCT, 4, 1, 1, 22, 0xFF, 0xFFFF};
Xoid o_atHighDetailAddress[] = {INT_ACCT, 4, 1, 1, 23, 0xFF, 0xFFFF};
Xoid o_atHighDetailMask[] = {INT_ACCT, 4, 1, 1, 24, 0xFF, 0xFFFF};
Xoid o_atPDUScale[] = {INT_ACCT, 4, 1, 1, 29, 0xFF, 0xFFFF};
Xoid o_atOctetScale[] = {INT_ACCT, 4, 1, 1, 30, 0xFF, 0xFFFF};
Xoid o_atRuleSet[] = {INT_ACCT, 4, 1, 1, 31, 0xFF, 0xFFFF};
X
Xoid o_pcNearMem[] = {AUKUNI, 2, 1, 0};
Xoid o_pcFarMem[] = {AUKUNI, 2, 2, 0};
Xoid o_pcBadPackets[] = {AUKUNI, 2, 3, 0};
Xoid o_pcNoBufPackets[] = {AUKUNI, 2, 4, 0};
Xoid o_pcLostPackets[] = {AUKUNI, 2, 5, 0};
Xoid o_pcPacketBacklog[] = {AUKUNI, 2, 6, 0};
Xoid o_pcChkSearches[] = {AUKUNI, 2, 7, 0};
Xoid o_pcChkCompares[] = {AUKUNI, 2, 8, 0};


X
X#define MAC_ADDR_LEN 6
X#define PEER_ADDR_LEN 4
X#define DETAIL_ADDR_LEN 2
X
X#define RULE_ADDR_LEN 6
X
Xstruct flow_info {

X unsigned char AdjAddrType,


X LowAdjAddress[MAC_ADDR_LEN], LowAdjMask[MAC_ADDR_LEN],
X HighAdjAddress[MAC_ADDR_LEN], HighAdjMask[MAC_ADDR_LEN];

X unsigned char PeerAddrType,


X LowPeerAddress[PEER_ADDR_LEN], LowPeerMask[PEER_ADDR_LEN],
X HighPeerAddress[PEER_ADDR_LEN], HighPeerMask[PEER_ADDR_LEN];

X unsigned char DetailAddrType,


X LowDetailAddress[DETAIL_ADDR_LEN], LowDetailMask[DETAIL_ADDR_LEN],
X HighDetailAddress[DETAIL_ADDR_LEN], HighDetailMask[DETAIL_ADDR_LEN];

X unsigned long
X FwdPackets,FwdBytes, BackPackets,BackBytes,
X FirstTime,LastTime;
X };
X
Xstruct rule_info {
X int RuleSet, RuleNbr;
X unsigned char RuleSelector,
X RuleMask[RULE_ADDR_LEN], RuleMatchedValue[RULE_ADDR_LEN],
X RuleAction, RuleJumpIndex;
X };
X

Xstruct action_info {
X int ActionSet, ActionNbr;
X unsigned char AdjAddrType,


X LowAdjAddress[MAC_ADDR_LEN], LowAdjMask[MAC_ADDR_LEN],
X HighAdjAddress[MAC_ADDR_LEN], HighAdjMask[MAC_ADDR_LEN];

X unsigned char PeerAddrType,


X LowPeerAddress[PEER_ADDR_LEN], LowPeerMask[PEER_ADDR_LEN],
X HighPeerAddress[PEER_ADDR_LEN], HighPeerMask[PEER_ADDR_LEN];

X unsigned char DetailAddrType,


X LowDetailAddress[DETAIL_ADDR_LEN], LowDetailMask[DETAIL_ADDR_LEN],
X HighDetailAddress[DETAIL_ADDR_LEN], HighDetailMask[DETAIL_ADDR_LEN];

X };
X
X#define AT_IGNORE 0 /* Addr_type values */

X#define AT_IP 2
X#define AT_NOVELL 6
X#define AT_DECNET 5
X#define AT_ETHERTALK 7
X

X#define RS_NULL 0
X#define RS_LOWPEERTYPE 7
X#define RS_LOWPEERADDR 8
X#define RS_HIPEERADDR 20
X
X#define RA_COUNT 1


X#define RA_TALLY 2
X#define RA_AGGREGATE 3
X#define RA_SUCCEED 4
X#define RA_FAIL 5
X#define RA_PUSHTO 6
X#define RA_POPTO 7
X#define RA_GOTO 8
X

X#define RF_SET -1
X#define RF_RULES -2
X#define RF_ACTIONS -3

X
X#define FTFLOWINDEX 1 /* Flow table attribute values */
X#define FTFLOWSTATUS 2
X
X#define FTLOWINTERFACE 3
X#define FTLOWADJACENTTYPE 4
X#define FTLOWADJACENTADDRESS 5
X#define FTLOWADJACENTMASK 6
X#define FTLOWPEERTYPE 7

X#define FTLOWPEERADDRESS 8
X#define FTLOWPEERMASK 9
X#define FTLOWDETAILTYPE 10
X#define FTLOWDETAILADDRESS 11
X#define FTLOWDETAILMASK 12
X#define FTLOWSUBSCRIBERID 13
X#define FTLOWSUBSCRIBERMASK 14
X#define FTHIINTERFACE 15
X#define FTHIADJACENTTYPE 16
X#define FTHIADJACENTADDRESS 17
X#define FTHIADJACENTMASK 18
X#define FTHIPEERTYPE 19
X#define FTHIPEERADDRESS 20
X#define FTHIPEERMASK 21
X#define FTHIDETAILTYPE 22
X#define FTHIDETAILADDRESS 23
X#define FTHIDETAILMASK 24
X#define FTHISUBSCRIBERID 25
X#define FTHISUBSCRIBERMASK 26
X
X#define FTSUBSCRIBERID 27
X#define FTSUBSCRIBERMASK 28
X
X#define FTPDUSCALE 29
X#define FTOCTETSCALE 30
X#define FTRULESET 31
X#define FTFLOWTYPE 32
X
X#define FTUPOCTETS 33
X#define FTUPPDUS 34
X#define FTDOWNOCTETS 35
X#define FTDOWNPDUS 36
X
X#define FTFIRSTTIME 37
X#define FTLASTTIME 38
X
X#define ATN 1 /* Number. Attribute type values */
X#define ATA 2 /* Address */
X#define ANI 0 /* Not implemented */
X
Xstruct attrib_info {
X unsigned char *name;
X unsigned char index;
X unsigned char type;


X unsigned char len;
X };
X

Xstruct attrib_info attribs[1+FTLASTTIME-FTFLOWINDEX] = {
X "flowindex", FTFLOWINDEX, ATN, 2,
X "flowstatus", FTFLOWSTATUS, ATN, 1,
X "sourceinterface", FTLOWINTERFACE, ATN, 1,
X "sourceadjacenttype", FTLOWADJACENTTYPE, ATN, 1,
X "sourceadjacentaddress", FTLOWADJACENTADDRESS, ATA, MAC_ADDR_LEN,
X "sourceadjacentmask", FTLOWADJACENTMASK, ATA, MAC_ADDR_LEN,
X "sourcepeertype", FTLOWPEERTYPE, ATN, 1,
X "sourcepeeraddress", FTLOWPEERADDRESS, ATA, PEER_ADDR_LEN,
X "sourcapeermask", FTLOWPEERMASK, ATA, PEER_ADDR_LEN,
X "sourcedetailtype", FTLOWDETAILTYPE, ATN, 1,
X "sourcedetailaddress", FTLOWDETAILADDRESS, ATA, DETAIL_ADDR_LEN,
X "sourcedetailmask", FTLOWDETAILMASK, ATA, DETAIL_ADDR_LEN,
X "sourcesubscriberid", FTLOWSUBSCRIBERID, ANI, 0,
X "sourcesubscribermask", FTLOWSUBSCRIBERMASK, ANI, 0,
X "destinterface", FTHIINTERFACE, ATN, 1,
X "destadjacenttype", FTHIADJACENTTYPE, ATN, 1,
X "destadjacentaddress", FTHIADJACENTADDRESS, ATA, MAC_ADDR_LEN,
X "destadjacentmask", FTHIADJACENTMASK, ATA, MAC_ADDR_LEN,
X "destpeertype", FTHIPEERTYPE, ATN, 1,
X "destpeeraddress", FTHIPEERADDRESS, ATA, PEER_ADDR_LEN,
X "sourcapeermask", FTHIPEERMASK, ATA, PEER_ADDR_LEN,
X "destdetailtype", FTHIDETAILTYPE, ATN, 1,
X "destdetailaddress", FTHIDETAILADDRESS, ATA, DETAIL_ADDR_LEN,
X "destdetailmask", FTHIDETAILMASK, ATA, DETAIL_ADDR_LEN,
X "destsubscriberid", FTHISUBSCRIBERID, ANI, 0,
X "destsubscribermask", FTHISUBSCRIBERMASK, ANI, 0,
X "subscriberid", FTSUBSCRIBERID, ANI, 0,
X "subscribermask", FTSUBSCRIBERMASK, ANI, 0,
X "pduscale", FTPDUSCALE, ANI, 0,
X "octetscale", FTOCTETSCALE, ANI, 0,
X "flowruleset", FTRULESET, ATN, 1,
X "flowtype", FTFLOWTYPE, ATN, 1,
X "tooctets", FTUPOCTETS, ATN, 4,
X "topdus", FTUPPDUS, ATN, 4,
X "fromoctets", FTDOWNOCTETS, ATN, 4,
X "frompdus", FTDOWNPDUS, ATN, 4,
X "firsttime", FTFIRSTTIME, ATN, 4,
X "lasttime", FTLASTTIME, ATN, 4
X };
X
X#define FLOWBLOBSZ 25
X
Xunsigned char column_blob[
X (FLOWBLOBSZ+2)*(2+RULE_ADDR_LEN)];


X
X#ifdef AU_MSDOS /* PC ntoh routines swap the byte order */
X#define netshort(x) x
X#define netlong(x) x
X#else /* SunOS ntoh routines don't */
X#define netshort(x) htons(x)
X#define netlong(x) htonl(x)
X#endif
X

X#define NAME_LN 64
X
Xstruct meter_status {
X struct meter_status *next;
X
X char name[NAME_LN];

X char community[NAME_LN];


X char rulefile[NAME_LN];
X
X struct snmp_session *ss;
X
X short status;
X
X char descr[NAME_LN]; /* From meter_info() */
X unsigned long uptime;

X unsigned long LastCollectTime; /* By any collector, not neccessarily us */

X unsigned char LastCollectPeer[PEER_ADDR_LEN];
X

X int ruleset, nrules, nactions;
X


X unsigned long OurLastCollectTime;
X

X FILE *keys;
X FILE *flows;
X FILE *log;
X };
X
Xstruct meter_status *first_meter;


X
X/* Values for status */
X
X#define MT_MANAGE 0x0001 /* Manage this meter */
X#define MT_INFO 0x0002 /* Have basic info */
X#define MT_UP 0x0004 /* Meter is running */
X#define MT_REPORTED 0x0008 /* Current status reported */
X

X#ifdef MTR_LIST
X/* #define CTLFILE "/usr/local/src/snmp/manager.cfg" */
X#define CTLFILE "manager.cfg"
X#endif


X
Xunsigned short getshort(unsigned char *ucp);
Xunsigned long getlong(unsigned char *ucp);
X

Xvoid init_meter();
Xvoid monitor_meter();


Xvoid monitor(struct meter_status *ms);
Xvoid print_meters();

Xvoid meter_print(struct meter_status *ms);
X
Xvoid printaddress(FILE *f,unsigned char *a,unsigned char len);
Xvoid getaddress(unsigned char *a,unsigned char len);


X
Xint scan_rulefile(struct meter_status *ms, int doset, int list);
Xvoid parse_rulefile(struct meter_status *ms, int list);

Xint add_rule(struct meter_status *ms, struct rule_info *ri);

Xint add_action(struct meter_status *ms, struct action_info *ai);
X


Xint same_acct_oid(oid *a, oid *b);

Xint blob_info(struct meter_status *ms, unsigned char *fb,
X unsigned long ft, int *fn);
Xint flow_info(struct meter_status *ms, struct flow_info *fi,
X unsigned long ft, int *fn, int getkey);
X

Xchar *uptime_string(unsigned long timeticks, char *buf);
X

Xint verbose = 0, testing = 0;
X
Xvoid main(argc,argv)
Xint argc;
Xchar *argv[];
X{
X struct meter_status *ms;
X struct snmp_session session, *ssp;
X
X int arg;
X char meter[NAME_LN], community[NAME_LN], rfname[NAME_LN],
X filename[NAME_LN*2];
X int interval = 0;
X int syntax = 0;
X
X meter[0] = community[0] = rfname[0] = NULL;
X
X#ifdef MTR_LIST
X parse_ctlfile();
X#endif
X
X init_mib();
X
X /* usage: nm meter-name community */
X
X for (arg = 1; arg < argc; arg++) {


X if (argv[arg][0] == '-') {

X switch (argv[arg][1]) {


X case 'd':
X snmp_dump_packet++;
X break;

X case 'c':
X if ((interval = atoi(argv[arg]+2)) == 0) interval = 120;


X break;
X case 'r':

X strcpy(rfname, argv[++arg]);


X break;
X case 's':

X syntax++;
X break;
X case 't':
X testing++;


X break;
X case 'v':

X verbose++;
X break;
X default:
X printf("Invalid option: -%c\n", argv[arg][1]);


X break;
X }
X continue;
X }

X if (meter[0] == NULL) strcpy(meter,argv[arg]);
X else if (community[0] == NULL) strcpy(community,argv[arg]);
X }
X
X if (meter[0] == NULL) {
X printf("nm meter-name community\n\n");
X exit(0);
X }
X
X ms = (struct meter_status *)calloc(sizeof(struct meter_status), 1);
X strcpy(ms->name,meter);
X strcpy(ms->community,community);
X if (*rfname) strcpy(ms->rulefile, rfname);
X else strcpy(ms->rulefile, RULEFILE);
X
X if (syntax) { /* For testing rule files */
X scan_rulefile(ms,0,1); exit(0);
X }
X
X ms->OurLastCollectTime = 2L;
X
X strcpy(filename,meter);
X strcat(filename,".log");
X if ((ms->log = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);
X }
X strcpy(filename,meter);
X strcat(filename,".keys");
X if ((ms->keys = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);
X }
X strcpy(filename,meter);
X strcat(filename,".flows");
X if ((ms->flows = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);


X }
X
X bzero((char *)&session, sizeof(struct snmp_session));

X session.peername = ms->name;
X session.community = ms->community;
X session.community_len = strlen(ms->community);


X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);

X ssp = snmp_open(&session);
X if (ssp == NULL) {
X printf("Couldn't open snmp to %s\n", session.peername);
X exit(-1);
X }
X ms->ss = ssp;
X
X ms->status = MT_MANAGE;
X first_meter = ms; /* $$$$$$$ */
X
X#ifdef MTR_LIST
X if (!explicit) add_all_meters();
X#endif
X
X init_meter();
X
X if (!interval) {
X print_meters();
X exit (0);
X }
X
X parse_rulefile(ms,TRUE); /* Download the rules we want to use */
X
X for (;;) {
X sleep(interval);
X
X monitor_meter();
X if (verbose) print_meters();
X }
X }
X
X#ifdef MTR_LIST
Xvoid parse_ctlfile()
X{
X struct meter_status *ms, *mp;
X FILE *fp;
X char linebuffer[256];
X char label[128];
X char community[128];
X int n;
X
X if ((fp = fopen(CTLFILE, "r")) == NULL) {
X perror(CTLFILE);
X exit(1);
X }
X
X while (fgets(linebuffer, sizeof(linebuffer), fp) != NULL) {
X if (linebuffer[0] < '0' || linebuffer[0] > 'z') continue;
X n = sscanf(linebuffer, "%s %s", label, community);
X if (n < 1) continue;
X ms = (struct meter_status *)calloc(sizeof(struct meter_status), 1);
X ms->name = savestr(label);
X ms->community = n > 1 ? savestr(community) : savestr("public");
X ms->next = NULL;
X
X if ((mp = first_meter) == NULL) first_meter = ms;
X else {
X while (mp->next) mp = mp->next;
X mp->next = ms;
X }
X }
X }
X
Xvoid add_all_meters()
X{
X struct meter_status *ms;
X for (ms = first_meter; ms != NULL; ms = ms->next)
X ms->status = MT_MANAGE;
X }
X
Xvoid add_meter(name)
Xchar *name;
X{
X struct meter_status *ms;
X
X for (ms = first_meter; ms != NULL; ms = ms->next) {
X if (strcasecmp(name,ms->name) == 0) break;
X }
X
X if (ms == NULL) {
X struct hostent *hp;
X u_long addr;
X
X if ((addr = (u_long)inet_addr(name)) == (u_long)-1) {
X hp = gethostbyname(name);
X if (hp != NULL) {
X for (ms = first_meter; ms != NULL; ms = ms->next) {
X#ifdef h_addr
X char **ap;
X#endif
X if (strcasecmp(hp->h_name, ms->name) == 0) break;
X#ifdef h_addr
X if (hp->h_addr_list == NULL) continue;
X
X for (ap = hp->h_addr_list; *ap; ap++) {
X if (addr == *(u_long *)(*ap)) break;
X }
X if (*ap) break;
X#else
X if (addr == *(u_long *)(hp->h_addr)) break;
X#endif
X
X }
X if (ms == NULL) {
X printf("No config info for %s\n", name);
X return;
X }
X }
X else {
X printf("No config info for %s\n", name);
X return;
X }
X }
X }
X
X ms->status = MT_MANAGE;
X }
X#endif
X
Xvoid init_meter()
X{
X struct meter_status *ms;
X int haveone = 0;
X
X for (ms = first_meter; ms; ms = ms->next) {
X if (!(ms->status & MT_MANAGE)) continue;
X haveone++;
X if (meter_info(ms)) {
X ms->status |= (MT_UP | MT_INFO);
X meter_print(ms);
X }
X }
X
X if (!haveone) {
X printf("No meters to monitor\n");
X exit(5);
X }
X }
X
X
Xvoid monitor_meter()
X{
X struct meter_status *ms;
X for (ms = first_meter; ms; ms = ms->next)
X if (ms->status & MT_MANAGE) monitor(ms);
X }
X
X/* CAUTION: Following struct doesn't work because of alignment on 32-bit words
X *
X * struct active_flow_data {
X * unsigned short flow_nbr;
X * unsigned long fwd_bytes, back_bytes;
X * };
X */
X
X#define flow_nbr_x 0
X#define fwd_bytes_x (flow_nbr_x + sizeof(unsigned short))
X#define back_bytes_x (fwd_bytes_x + sizeof(unsigned long))
X#define flow_data_sz (back_bytes_x + sizeof(unsigned long))
X
X#define FLOWBLOBSZ 25
X
Xunsigned short getshort(ucp)
Xunsigned char *ucp;
X{
X return ucp[0]<<8 | ucp[1];
X }
X
Xunsigned long getlong(ucp)
Xunsigned char *ucp;
X{
X return ucp[0]<<24 | ucp[1]<<16 | ucp[2]<<8 | ucp[3];
X }
X
Xvoid monitor(ms) /* Called every interval for each meter */
Xstruct meter_status *ms;
X{
X time_t t;
X char *ts;
X unsigned short newflows,activeflows, n;
X int fn;
X struct flow_info fi;
X unsigned char flowblob[FLOWBLOBSZ*flow_data_sz], *afdp;
X unsigned long fwd_bytes, back_bytes;
X


X time(&t); ts = ctime(&t);

X if (!(ms->status & MT_INFO)) { /* No info */
X if (meter_info(ms)) /* Got some */
X ms->status |= (MT_UP | MT_INFO);
X return;
X }
X if (meter_info(ms) == 0) { /* Lost contact */
X if (ms->status & MT_UP) { /* Was up */
X fprintf(ms->log,"%19.19s -- %s: No response\n", ts,ms->name);
X if (verbose) printf("%19.19s -- %s: No response\n", ts,ms->name);
X }
X ms->status &= ~MT_UP; /* Mark as 'down' */
X return;
X }
X if (!(ms->status & MT_UP)) { /* Have contact now, was down */
X fprintf(ms->log,"%19.19s -- %s: Regained contact\n", ts,ms->name);
X if (verbose) printf("%19.19s -- %s: Regained contact\n", ts,ms->name);
X }
X ms->status |= MT_UP;
X
X /* Meter processing .. */
X
X set_collect_time(ms,1); /* Tell meter we're starting a collection */
X
X fprintf(ms->keys,
X "## %19.19s %s: New flows from %lu to %lu##\n",
X ts,ms->name, ms->LastCollectTime,ms->uptime);
X fn = 1; newflows = 0;
X while (flow_info(ms, &fi, ms->OurLastCollectTime,&fn, 1)) {
X ++newflows;
X fprintf(ms->keys, "%u %lu %u", fn, fi.FirstTime,fi.PeerAddrType);
X printaddress(ms->keys, fi.LowPeerAddress,PEER_ADDR_LEN);
X printaddress(ms->keys, fi.HighPeerAddress,PEER_ADDR_LEN);
X fprintf(ms->keys,"\n");
X }
X fflush(ms->keys);
X
X fprintf(ms->flows,
X "## %19.19s %s: Active flows from %lu to %lu##\n",
X ts,ms->name, ms->LastCollectTime,ms->uptime);
X fn = 1; activeflows = 0;
X while (blob_info(ms,flowblob, ms->OurLastCollectTime,&fn)) {
X for (n = 0, afdp = flowblob; n != FLOWBLOBSZ;
X ++n, afdp += flow_data_sz) {
X fn = ntohs(getshort(afdp + flow_nbr_x));
X if (fn == 0) break; /* No more active flows in blob */
X ++activeflows;
X fprintf(ms->flows,"%u %lu %lu\n", fn,
X ntohl(getlong(afdp + fwd_bytes_x)),
X ntohl(getlong(afdp + back_bytes_x)) );
X }
X if (fn == 0) break; /* Don't bother to look for more */
X }
X fflush(ms->flows);
X
X ms->OurLastCollectTime = ms->uptime - 1;
X /* -1 to make sure we don't miss any flows. We may
X collect some of them twice, but we don't mind that */
X
X if (verbose) printf(
X "%19.19s %s: %d new and %d active flows from %lu to %lu\n",
X ts,ms->name, newflows,activeflows, ms->LastCollectTime,ms->uptime);
X fprintf(ms->log,
X "## %19.19s %s: %d new and %d active flows from %ld to %ld##\n",
X ts,ms->name, newflows,activeflows, ms->LastCollectTime,ms->uptime);
X fflush(ms->log);
X }
X
X#define ADD_VAR(v) snmp_add_null_var(pdu, v, sizeof(v)/sizeof(oid))
X#define ADD_X_VAR(v,n1) { v[sizeof(v)/sizeof(oid) - 1] = n1; \
X ADD_VAR(v); }
X#define ADD_X2_VAR(v,n1,n2) { v[sizeof(v)/sizeof(oid) - 2] = n1; \
X v[sizeof(v)/sizeof(oid) - 1] = n2; \
X ADD_VAR(v); }
X
X#define SET_INT(v) { vars->type = INTEGER; \
X vars->val.integer = (long *)malloc(vars->val_len = sizeof(long)); \
X *(vars->val.integer) = (long)v; }
X#define SET_TIMETICKS(v) { vars->type = TIMETICKS; \
X vars->val.integer = (long *)malloc(vars->val_len = sizeof(long)); \
X *(vars->val.integer) = (long)v; }
X#define SET_STRING(v,len) { vars->type = STRING; \
X vars->val.string = (u_char *)malloc(RULE_ADDR_LEN) ;\
X bcopy(v, (char *)vars->val.string, vars->val_len = len); }
X
X#define STRING_VAL(v) bcopy(vars->val.string, v, vars->val_len)
X#define INT_VAL(v) v = *(vars->val.integer)
X
Xint set_collect_time(ms,v) /* Set LastCollectTime for meter - */
Xstruct meter_status *ms; /* this tells meter a collection is starting */
Xint v;
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;

X pdu = snmp_pdu_create(SET_REQ_MSG);
X ADD_VAR(o_LastCollectTime);
X vars = pdu->variables;
X SET_TIMETICKS(v);
X
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X printf("Set %d: starting collection\n", ms->ruleset);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint set_rule_info(ms,setset) /* 1 to set rule+action set */
Xstruct meter_status *ms; /* 0 to set rule and actions tables sizes */
Xint setset;
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;

X pdu = snmp_pdu_create(SET_REQ_MSG);
X if (setset) {
X ADD_VAR(o_CurrentRuleSet);
X vars = pdu->variables;
X SET_INT(ms->ruleset);
X }
X else {
X ADD_X_VAR(o_riRuleSize, ms->ruleset);
X vars = pdu->variables;
X SET_INT(ms->nrules);
X ADD_X_VAR(o_riActionSize, ms->ruleset);
X vars = vars->next_variable;
X SET_INT(ms->nactions);
X }
X
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X if (setset) ("Meter is now using rule+action set %d\n", ms->ruleset);
X else printf("Set %d: sizes set to %d rules + %d actions\n",
X ms->ruleset,ms->nrules,ms->nactions);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint add_rule(ms,ri)
Xstruct meter_status *ms;
Xstruct rule_info *ri;
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X pdu = snmp_pdu_create(SET_REQ_MSG);
X ADD_X2_VAR(o_rtSelector, ri->RuleSet,ri->RuleNbr);
X vars = pdu->variables;
X SET_INT(ri->RuleSelector);
X ADD_X2_VAR(o_rtRuleMask, ri->RuleSet,ri->RuleNbr);
X vars = vars->next_variable;
X SET_STRING(ri->RuleMask,RULE_ADDR_LEN);
X ADD_X2_VAR(o_rtMatchedValue, ri->RuleSet,ri->RuleNbr);
X vars = vars->next_variable;
X SET_STRING(ri->RuleMatchedValue,RULE_ADDR_LEN);
X ADD_X2_VAR(o_rtRuleAction, ri->RuleSet,ri->RuleNbr);
X vars = vars->next_variable;
X SET_INT(ri->RuleAction);
X ADD_X2_VAR(o_rtJumpIndex, ri->RuleSet,ri->RuleNbr);
X vars = vars->next_variable;
X SET_INT(ri->RuleJumpIndex);
X
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X printf("Rule %d added to table %d\n", ri->RuleNbr,ri->RuleSet);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint add_action(ms,ai)
Xstruct meter_status *ms;
Xstruct action_info *ai;
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X pdu = snmp_pdu_create(SET_REQ_MSG);
X ADD_X2_VAR(o_atLowPeerType, ai->ActionSet,ai->ActionNbr);
X vars = pdu->variables;
X SET_INT(ai->PeerAddrType);
X ADD_X2_VAR(o_atLowPeerAddress, ai->ActionSet,ai->ActionNbr);
X vars = vars->next_variable;
X SET_STRING(ai->LowPeerAddress,PEER_ADDR_LEN);
X ADD_X2_VAR(o_atLowPeerMask, ai->ActionSet,ai->ActionNbr);
X vars = vars->next_variable;
X SET_STRING(ai->LowPeerMask,PEER_ADDR_LEN);
X ADD_X2_VAR(o_atHighPeerAddress, ai->ActionSet,ai->ActionNbr);
X vars = vars->next_variable;
X SET_STRING(ai->HighPeerAddress,PEER_ADDR_LEN);
X ADD_X2_VAR(o_atHighPeerMask, ai->ActionSet,ai->ActionNbr);
X vars = vars->next_variable;
X SET_STRING(ai->HighPeerMask,PEER_ADDR_LEN);
X
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X printf("Action %d added to table %d\n", ai->ActionNbr,ai->ActionSet);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint same_acct_oid(oid *a, oid *b)

X /* Compare oids for equality within internet-accounting MIB */
X{
X int j;
X for (j = 6; j != 10; ++j) {
X if (a[j] != b[j]) return 0;
X }


X return 1;
X }
X

Xint blob_info(struct meter_status *ms, unsigned char *fb,
X unsigned long ft, int *fn)
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X if (testing) printf("blob_info(ms,fb,ft=%lu,fn=%d)\n",ft,*fn);
X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X ADD_X2_VAR(o_ftActiveFlowBlob,ft,*fn)
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X vars = response->variables;
X if (!same_acct_oid(vars->name,o_ftActiveFlowBlob))
X return 0; /* No more flows with last-active time > ft */
X STRING_VAL(fb);
X }
X else if (response->errstat == SNMP_ERR_NOSUCHNAME) return 0;
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint flow_info(struct meter_status *ms, struct flow_info *fi,
X unsigned long ft, int *fn, int getkey)
X /* getkey = 1 to get keys created after ft,
X 0 to get flows active after ft */
X{
X int j, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X if (testing) printf("flow_info(ms,fi,ft=%lu,fn=%d,getkey=%d)\n",
X ft,*fn,getkey);
X
X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X if (getkey) ADD_X2_VAR(o_ftCreateIndex,ft,*fn)
X else ADD_X2_VAR(o_ftActiveIndex,ft,*fn)
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X vars = response->variables;
X if (getkey) {
X if (!same_acct_oid(vars->name,o_ftCreateIndex))
X return 0; /* No more flows with create time > ft */
X }
X else {
X if (!same_acct_oid(vars->name,o_ftActiveIndex))
X return 0; /* No more flows with last-active time > ft */
X }
X INT_VAL(*fn); /* Index of next flow created or active after ft */
X }
X else if (response->errstat == SNMP_ERR_NOSUCHNAME) return 0;
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }

X else return 0;
X snmp_free_pdu(response);
X
X pdu = snmp_pdu_create(GET_REQ_MSG);
X if (getkey) {
X ADD_X_VAR(o_ftLowPeerType,*fn);
X ADD_X_VAR(o_ftLowPeerAddress,*fn);
X ADD_X_VAR(o_ftHighPeerAddress,*fn);
X ADD_X_VAR(o_ftFirstTime,*fn);
X }
X else {
X ADD_X_VAR(o_ftUpOctets,*fn);
X ADD_X_VAR(o_ftDownOctets,*fn);
X ADD_X_VAR(o_ftLastTime,*fn);
X }
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X vars = response->variables;
X if (getkey) {
X INT_VAL(fi->PeerAddrType);
X vars = vars->next_variable;
X STRING_VAL(fi->LowPeerAddress);
X vars = vars->next_variable;
X STRING_VAL(fi->HighPeerAddress);
X vars = vars->next_variable;
X INT_VAL(fi->FirstTime);
X vars = vars->next_variable;
X }
X else {
X INT_VAL(fi->FwdBytes);
X vars = vars->next_variable;
X INT_VAL(fi->BackBytes);
X vars = vars->next_variable;
X INT_VAL(fi->LastTime);
X }
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xint meter_info(ms)
Xstruct meter_status *ms;
X{
X int i, count, status;


X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X if (testing) printf("meter_info(ms)\n");
X pdu = snmp_pdu_create(GET_REQ_MSG);
X ADD_VAR(o_sysDescr);
X ADD_VAR(o_sysUpTime);
X ADD_VAR(o_LastCollectTime);
X status = snmp_synch_response(ms->ss, pdu, &response);


X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X vars = response->variables;
X STRING_VAL(ms->descr);
X vars = vars->next_variable;
X INT_VAL(ms->uptime);
X vars = vars->next_variable;
X INT_VAL(ms->LastCollectTime);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME) {

X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;


X vars = vars->next_variable, count++) ;

X if (vars) print_objid(vars->name, vars->name_length);


X printf("\n");
X }
X }
X }

X else return 0;
X snmp_free_pdu(response);


X return 1;
X }
X

Xvoid print_meters()
X{
X struct meter_status *ms;
X for (ms = first_meter; ms; ms = ms->next)
X if (ms->status & MT_MANAGE) meter_print(ms);
X }
X
Xvoid meter_print(ms)
Xstruct meter_status *ms;
X{
X struct timeval tv;
X char buf[32];
X time_t t; char tsbuf[32];
X
X time(&t); strcpy(tsbuf,ctime(&t));
X
X gettimeofday(&tv, (struct timezone *)0);
X tv.tv_sec -= ms->uptime / 100;
X if ((ms->uptime % 100)*10000 > tv.tv_usec) {
X tv.tv_sec--;
X tv.tv_usec += 1000000;
X }
X tv.tv_usec -= (ms->uptime % 100)*10000;
X
X fprintf(ms->log,
X "%19.19s -- %s: %s\n\tUp %s (since %.24s)\n",
X tsbuf,ms->name, ms->descr, uptime_string(ms->uptime, buf),
X ctime(&tv.tv_sec));
X if (verbose) printf(
X "%19.19s -- %s: %s\n\tUp %s (since %.24s)\n",
X tsbuf,ms->name, ms->descr, uptime_string(ms->uptime, buf),
X ctime(&tv.tv_sec));
X }
X
X
Xchar *uptime_string(timeticks, buf)
Xunsigned long timeticks;
Xchar *buf;
X{
X int seconds, minutes, hours, days;
X
X timeticks /= 100;
X days = timeticks / (60 * 60 * 24);
X timeticks %= (60 * 60 * 24);
X
X hours = timeticks / (60 * 60);
X timeticks %= (60 * 60);
X
X minutes = timeticks / 60;
X seconds = timeticks % 60;
X
X if (days == 0){
X sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
X }
X else if (days == 1) {
X sprintf(buf, "%d day, %d:%02d:%02d",
X days, hours, minutes, seconds);
X }
X else {
X sprintf(buf, "%d days, %d:%02d:%02d",
X days, hours, minutes, seconds);
X }
X return buf;
X }
X
Xvoid printaddress(f,a,len)
XFILE *f;
Xunsigned char *a, len;
X{
X int j;
X fprintf(f," %u", a[0]);
X for (j = 1; j != len; ++j) fprintf(f,".%u", a[j]);
X }
X
X
XFILE *rfp; /* For rules file */
Xchar inbuf[256], *ibp;
Xint lic, ic, /* Last input char, current input char */


X iblisted, rule_line, rferrors;
X

Xint nextchar()
X{
X lic = ic;
X for (;;) {
X if (lic == '\n') {
X if (fgets(inbuf, sizeof(inbuf), rfp) == NULL) return ic = EOF;
X iblisted = 0; ++rule_line;
X ibp = inbuf;
X }
X ic = *ibp++;
X if (ic == '#') lic = '\n'; /* Ignore comments */
X else return ic;
X }
X }
X
Xint wordis(p,w)
Xchar *p, *w;
X{
X return strncmp(p,w,strlen(w)) == 0;
X }
X
Xint getword()
X{
X char wbuf[30], *wp = wbuf;
X for (;;) {
X *wp++ = tolower(ic);
X nextchar(rfp);
X if (ic == EOF) return EOF;
X if (!isalpha(ic)) break;
X }
X
X if (wordis(wbuf,"null")) return RS_NULL;
X if (wordis(wbuf,"lowpeertype")) return RS_LOWPEERTYPE;
X if (wordis(wbuf,"lowpeeraddress")) return RS_LOWPEERADDR;
X if (wordis(wbuf,"highpeeraddress")) return RS_HIPEERADDR;
X
X if (wordis(wbuf,"ip")) return AT_IP;
X if (wordis(wbuf,"novell")) return AT_NOVELL;
X if (wordis(wbuf,"decnet")) return AT_DECNET;
X if (wordis(wbuf,"ethertalk")) return AT_ETHERTALK;
X
X if (wordis(wbuf,"count")) return RA_COUNT;
X if (wordis(wbuf,"tally")) return RA_TALLY;
X if (wordis(wbuf,"aggregate")) return RA_AGGREGATE;
X if (wordis(wbuf,"succeed")) return RA_SUCCEED;
X if (wordis(wbuf,"fail")) return RA_FAIL;
X if (wordis(wbuf,"pushto")) return RA_PUSHTO;
X if (wordis(wbuf,"popto")) return RA_POPTO;
X if (wordis(wbuf,"goto")) return RA_GOTO;
X
X if (wordis(wbuf,"set")) return RF_SET;
X if (wordis(wbuf,"rules")) return RF_RULES;
X if (wordis(wbuf,"actions")) return RF_ACTIONS;
X
X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }
X printf("Unknown word %s !!!\n", wbuf);
X ++rferrors;


X return 0;
X }
X

Xint getnbr()
X{
X int v = 0;
X for (;;) {
X if (ic == EOF) return EOF;
X if (isdigit(ic)) break;
X else if (isalpha(ic)) return getword();
X else nextchar(rfp);
X }
X for (;;) {
X v = v*10 + ic-'0';
X if (nextchar(ic) == EOF) return EOF;
X if (!isdigit(ic)) break;
X }
X if (v > 255) {
X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }
X printf("Number > 255 !!!\n");
X ++rferrors;
X }
X return v;
X }
X
Xvoid getaddress(a,len)
Xunsigned char *a, len;
X{
X int j;
X for (j = 0; j != len; ++j) {
X a[j] = getnbr();
X if (ic != '.') { /* End of address; pad with zeroes */
X for (++j; j != len; ++j) a[j] = 0;
X return;
X }
X }
X }
X
Xint scan_rulefile(ms,doset,list)
Xstruct meter_status *ms;
Xint doset,list;
X{
X struct rule_info ri;
X struct action_info ai;
X int rule_set, nrules, nactions, n, kind;
X
X if ((rfp = fopen(ms->rulefile, "r")) == NULL) {
X perror(ms->rulefile);
X printf(" -> Using meter's default rules <-\n\n");
X return 0; /* Fail */
X }
X
X rferrors = 0;
X ic = '\n'; rule_set = 2; /* Default rule+action set */
X nrules = nactions = 0; kind = RF_RULES;
X for (;;) {
X do { /* First char of a line */
X nextchar(rfp);
X if (ic == EOF) break;
X } while (lic != '\n');
X if (ic == EOF) break;
X n = getnbr(); /* What kind of line is it? */
X if (n == RF_SET) {
X ri.RuleSet = ai.ActionSet = rule_set = getnbr();
X kind = RF_RULES;
X continue;
X }
X else if (n == RF_RULES) {
X kind = RF_RULES; continue;
X }
X if (n == RF_ACTIONS) {
X kind = RF_ACTIONS; continue;
X }
X
X if (kind == RF_RULES) {
X ri.RuleSelector = n;
X getaddress(ri.RuleMask,RULE_ADDR_LEN);
X if (ic == EOF) break;
X getaddress(ri.RuleMatchedValue,RULE_ADDR_LEN);
X if (ic == EOF) break;
X ri.RuleAction = getnbr();
X if (ic == EOF) break;
X ri.RuleJumpIndex = getnbr();
X if (ic == EOF) break;
X ri.RuleNbr = ++nrules;
X if (list) {
X printf("Rule %d,%d: %d ", rule_set,nrules,ri.RuleSelector);
X printaddress(stdout, ri.RuleMask, RULE_ADDR_LEN);
X printaddress(stdout, ri.RuleMatchedValue,RULE_ADDR_LEN);
X printf(" %d %d\n", ri.RuleAction,ri.RuleJumpIndex);
X }
X if (doset) add_rule(ms,&ri); /* Add rule to meter's rule table */
X }
X
X if (kind == RF_ACTIONS) {
X ai.PeerAddrType = n;
X if (ic == EOF) break;
X getaddress(ai.LowPeerAddress,PEER_ADDR_LEN);
X if (ic == EOF) break;
X getaddress(ai.LowPeerMask,PEER_ADDR_LEN);
X if (ic == EOF) break;
X getaddress(ai.HighPeerAddress,PEER_ADDR_LEN);
X if (ic == EOF) break;
X getaddress(ai.HighPeerMask,PEER_ADDR_LEN);
X if (ic == EOF) break;
X ai.ActionNbr = ++nactions;
X if (list) {
X printf("Action %d,%d: %d ", rule_set,nactions,ai.PeerAddrType);
X printaddress(stdout, ai.LowPeerAddress,PEER_ADDR_LEN);
X printaddress(stdout, ai.LowPeerMask,PEER_ADDR_LEN);
X printf(" ");
X printaddress(stdout, ai.HighPeerAddress,PEER_ADDR_LEN);
X printaddress(stdout, ai.HighPeerMask,PEER_ADDR_LEN);


X printf("\n");
X }

X if (doset) add_action(ms,&ai); /* Add rule to meter's action table */
X }
X }
X
X fclose(rfp);
X if (rferrors == 0) {
X ms->ruleset = rule_set; ms->nrules = nrules; ms->nactions = nactions;
X return 1; /* Succeed */
X }
X return 0; /* Fail */
X }
X
Xvoid parse_rulefile(ms,list)
Xstruct meter_status *ms;
Xint list;
X{
X if (scan_rulefile(ms,0,list)) { /* Rulefile is OK */
X if (set_rule_info(ms,0)) { /* Set rule+action table sizes */
X scan_rulefile(ms,1,0); /* Download the rules and actions */
X set_rule_info(ms,1); /* Tell meter to start using new rules */
X }
X }
X }
END_OF_FILE
if test 43638 -ne `wc -c <'netramet/src/manager/nm.jul.c'`; then
echo shar: \"'netramet/src/manager/nm.jul.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/nm.jul.c'
fi
if test -f 'netramet/src/manager/nmc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/nmc.c'\"
else
echo shar: Extracting \"'netramet/src/manager/nmc.c'\" \(17129 characters\)
sed "s/^X//" >'netramet/src/manager/nmc.c' <<'END_OF_FILE'
X/* 1430, Wed 13 Oct 93
X
X NMC.C: First attempt at a manager for the AU Accounting Meter


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X#include <sys/param.h>
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <netdb.h>
X


X#include <stdio.h>
X#include <ctype.h>
X#include <sys/time.h>
X#include <errno.h>
X

X#include <string.h>
X#include <malloc.h>
X
X#include "ausnmp.h"
X


X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"

X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"
X
X#define EXTERN
X#include "nmc.h"


X
Xint create_meter(struct meter_status *ms)

X{
X char filename[NAME_LN*2];


X time_t t; char *ts;

X unsigned char a,b, n;
X
X if (ms->name[0] == NULL || ms->community == 0) {
X printf("Meter name or community not specified !!!\n");


X return 0;
X }
X

X if (!start_snmp_session(ms)) return 0;
X
X ms->status = MT_MANAGE;
X if (meter_info(ms)) {
X ms->status |= (MT_UP | MT_INFO);
X meter_print(stdout,ms);
X meter_print(log,ms);
X fflush(log);
X }
X else {
X printf("Couldn't get meter info from %s\n",ms->name);
X fprintf(log,"Couldn't get meter info from %s\n",ms->name);
X fflush(log);


X return 0;
X }
X

X set_meter_params(ms);
X
X if (ms->rulefile[0] == NULL) /* No rule file specified */
X ms->ruleset = ms->CurrentRuleSet;
X else { /* Download the rules we want to use */
X parse_rulefile(ms,listrules);
X if (rferrors != 0) return 0;
X }
X ++nmeters;
X
X ms->OurLastCollectTime = 1L;
X ms->snmp_delay = 90; /* Wait 90 ms after an snmp request */
X
X sprintf(filename, "%s.flows", ms->name); /* Open flows file */
X ms->flows = wfopen(filename);
X
X time(&t); ts = fmt_time(&t);
X fprintf(ms->flows,
X "##NeTraMet v2.2: -c%d -r %s %s %u flows starting at %s\n",
X interval,ms->rulefile,ms->name, ms->MaxFlows, ts);
X fprintf(ms->flows, "#Format: ");
X if ((n = ms->format[a = 0]) != NULL) for (;;) {
X for (b = 1; attribs[b].index != n; ++b) ;
X fprintf(ms->flows,attribs[b].name);
X if ((n = ms->format[a+1]) == NULL) break;
X fprintf(ms->flows,ms->separator[a++]);
X }
X fprintf(ms->flows,"\n");
X fflush(ms->flows);
X }
X
Xchar cfname[NAME_LN], rfname[NAME_LN],
X meter[NAME_LN], community[NAME_LN];
X
Xvoid main(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int syntax;
X char *ap, arg[NAME_LN];
X int a;
X time_t t1,t2; int busy_seconds;
X struct meter_status *ms, *nms;
X
X if (argc < 2) {
X printf("nm [options] meter-name community\n\n");
X exit(0);
X }
X
X syntax = verbose = testing = listrules = 0;
X interval = 120; /* Default 2 minutes */
X strcpy(cfname, CFGFILE);
X rfname[0] = meter[0] = community[0] = NULL;
X
X for (a = 1; a < argc; ++a) {
X if (argv[a][0] == '-') {
X switch (argv[a][1]) {


X case 'd':
X snmp_dump_packet++;
X break;

X case 'c':
X ap = argv[a]+2;
X if (*ap == NULL) ap = argv[++a];
X interval = atoi(ap);
X break;
X case 'l':
X listrules++;


X break;
X case 'r':

X strcpy(rfname, argv[++a]); /* Rule file name */
X break;
X case 'f':
X strcpy(cfname, argv[++a]); /* Config file name */
X break;
X case 's':
X syntax++;
X break;
X case 't':
X testing++;


X break;
X case 'v':

X verbose++;
X break;
X default:
X printf("Invalid option: -%c\n", argv[a][1]);


X break;
X }
X continue;
X }

X if (meter[0] == NULL) strcpy(meter,argv[a]);
X else if (community[0] == NULL) strcpy(community,argv[a]);
X }
X
X if (syntax) { /* Test a rule file */
X ms = (struct meter_status *)calloc(sizeof(struct meter_status), 1);
X strcpy(ms->rulefile,rfname);
X scan_rulefile(ms,0,1);
X printf("\n%d errors in rule file %s\n\n", rferrors,rfname);
X exit(0);
X }
X
X init_mib(); /* Initialise SNMP handler */
X
X log = wfopen(LOGFILE);
X time(&t1);
X if (!parse_open(cfname)) { /* No config file */
X first_meter = (struct meter_status *)calloc
X (sizeof(struct meter_status), 1);
X strcpy(first_meter->rulefile,rfname);
X strcpy(first_meter->name,meter);
X strcpy((char *)first_meter->community,community);
X }
X else for (first_meter = NULL; ; ) { /* Parse config file */
X ms = (struct meter_status *)calloc(sizeof(struct meter_status), 1);
X strcpy(ms->rulefile,rfname);
X do { /* Start with first char of a line */
X nextchar();
X if (ic == EOF) break;
X } while (lic != '\n');
X if (ic == EOF) break;
X getarg(arg);
X for ( ; arg[0] == '-'; ) {
X ap = &arg[2];
X switch (arg[1]) {
X case 'g':
X if (*ap == NULL) getarg(ap = arg);
X ms->GCIntervalReqd = atoi(ap);
X break;
X case 'h':
X if (*ap == NULL) getarg(ap = arg);
X ms->HighWaterMark = atoi(ap);
X break;
X case 'i':
X if (*ap == NULL) getarg(ap = arg);
X ms->InactivityTime = atoi(ap);


X break;
X case 'r':

X getarg(ms->rulefile);
X break;
X }
X getarg(arg);
X }
X strcpy(ms->name,arg);
X getarg((char *)ms->community);
X if (first_meter == NULL) first_meter = ms;
X else for (nms = first_meter; ; nms = nms->next) {
X if (nms->next == NULL) {
X nms->next = ms; break;
X }
X }
X }
X
X for (nmeters = 0, ms = first_meter; ms; ms = ms->next)
X create_meter(ms);
X
X if (nmeters == 0) {
X printf("No meters to monitor !!!\n");
X exit(0);
X }
X
X for (;;) {
X for (ms = first_meter; ms; ms = ms->next)
X if (ms->status & MT_MANAGE) monitor(ms);
X
X if (verbose) {
X for (ms = first_meter; ms; ms = ms->next)
X if (ms->status & MT_MANAGE) meter_print(stdout,ms);
X }
X
X if (interval == 0) exit();
X time(&t2); busy_seconds = t2-t1;
X if (busy_seconds < interval) sleep(interval-busy_seconds);
X time(&t1);
X }
X }
X
X
Xvoid write_attrib(FILE *f, struct flow_info *fp, unsigned char col)
X{
X switch(col) {
X case FTFLOWINDEX: /* Used to synchronise column blobs */
X fprintf(f,"%u",fp->FlowIndex);


X break;
X case FTFLOWSTATUS:

X fprintf(f,"%u",fp->FlowStatus);
X break;
X case FTLOWINTERFACE:
X fprintf(f,"%u",fp->LowInterface);
X break;
X case FTLOWADJACENTTYPE:
X fprintf(f,"%u",fp->LowAdjType);


X break;
X case FTLOWADJACENTADDRESS:

X printaddress(f,fp->LowAdjAddress,MAC_ADDR_LEN);


X break;
X case FTLOWADJACENTMASK:

X printaddress(f,fp->LowAdjMask,MAC_ADDR_LEN);


X break;
X case FTLOWPEERTYPE:

X fprintf(f,"%u",fp->LowPeerType);


X break;
X case FTLOWPEERTYPEMASK:

X fprintf(f,"%u",fp->LowPeerTypeMask);


X break;
X case FTLOWPEERADDRESS:

X printaddress(f,fp->LowPeerAddress,PEER_ADDR_LEN);


X break;
X case FTLOWPEERMASK:

X printaddress(f,fp->LowPeerMask,PEER_ADDR_LEN);


X break;
X case FTLOWDETAILTYPE:

X fprintf(f,"%u",fp->LowDetailType);


X break;
X case FTLOWDETAILTYPEMASK:

X fprintf(f,"%u",fp->LowDetailTypeMask);


X break;
X case FTLOWDETAILADDRESS:

X printaddress(f,fp->LowDetailAddress,DETAIL_ADDR_LEN);


X break;
X case FTLOWDETAILMASK:

X printaddress(f,fp->LowDetailMask,DETAIL_ADDR_LEN);
X break;
X case FTHIINTERFACE:
X fprintf(f,"%u",fp->HighInterface);
X break;
X case FTHIADJACENTTYPE:
X fprintf(f,"%u",fp->HighAdjType);


X break;
X case FTHIADJACENTADDRESS:

X printaddress(f,fp->HighAdjAddress,MAC_ADDR_LEN);


X break;
X case FTHIADJACENTMASK:

X printaddress(f,fp->HighAdjMask,MAC_ADDR_LEN);
X break;
X case FTHIPEERTYPE:
X fprintf(f,"%u",fp->HighPeerType);
X break;
X case FTHIPEERTYPEMASK:
X fprintf(f,"%u",fp->HighPeerTypeMask);


X break;
X case FTHIPEERADDRESS:

X printaddress(f,fp->HighPeerAddress,PEER_ADDR_LEN);


X break;
X case FTHIPEERMASK:

X printaddress(f,fp->HighPeerMask,PEER_ADDR_LEN);
X break;
X case FTHIDETAILTYPE:
X fprintf(f,"%u",fp->HighDetailType);
X break;
X case FTHIDETAILTYPEMASK:
X fprintf(f,"%u",fp->HighDetailTypeMask);


X break;
X case FTHIDETAILADDRESS:

X printaddress(f,fp->HighDetailAddress,DETAIL_ADDR_LEN);


X break;
X case FTHIDETAILMASK:

X printaddress(f,fp->HighDetailMask,DETAIL_ADDR_LEN);


X break;
X case FTRULESET:

X fprintf(f,"%u",fp->FlowRuleSet);


X break;
X case FTFLOWTYPE:

X fprintf(f,"%u",fp->FlowType);
X break;
X case FTUPOCTETS:
X fprintf(f,"%lu",fp->FwdBytes);


X break;
X case FTUPPDUS:

X fprintf(f,"%lu",fp->FwdPackets);


X break;
X case FTDOWNOCTETS:

X fprintf(f,"%lu",fp->BackBytes);


X break;
X case FTDOWNPDUS:

X fprintf(f,"%lu",fp->BackPackets);


X break;
X case FTFIRSTTIME:

X fprintf(f,"%lu",fp->FirstTime);


X break;
X case FTLASTTIME:

X fprintf(f,"%lu",fp->LastTime);


X break;
X }
X }
X

Xunsigned short getshort(ucp)
Xunsigned char *ucp;
X{
X return ucp[0]<<8 | ucp[1];
X }
X
Xunsigned long getlong(ucp)
Xunsigned char *ucp;
X{
X return ucp[0]<<24 | ucp[1]<<16 | ucp[2]<<8 | ucp[3];
X }
X


Xunsigned short get_slice(struct meter_status *ms,
X unsigned short first_row, unsigned char col,
X unsigned char first)

X{
X int fn, row, n, r;
X struct flow_info *fp;
X unsigned char *ucp;
X fn = first_row; row = n = 0;
X if (column_info(ms,column_blob, col,ms->OurLastCollectTime,&fn) != 0) {
X for (r = 0, ucp = column_blob; ; ++r) {
X fp = &flows[row];
X n = ntohs(getshort(ucp)); ucp += 2; /* Flow nbr */
X if (n < 2) break; /* No more active flows in blob */
X switch (col) {
X case FTFLOWINDEX: /* Used to synchronise column blobs */
X break;
X case FTFLOWSTATUS:
X fp->FlowStatus = *ucp;
X break;
X case FTLOWINTERFACE:
X fp->LowInterface = *ucp;
X break;
X case FTLOWADJACENTTYPE:
X fp->LowAdjType = *ucp;


X break;
X case FTLOWADJACENTADDRESS:

X bcopy(ucp,fp->LowAdjAddress,MAC_ADDR_LEN);


X break;
X case FTLOWADJACENTMASK:

X bcopy(ucp,fp->LowAdjMask,MAC_ADDR_LEN);


X break;
X case FTLOWPEERTYPE:

X fp->LowPeerType = *ucp;


X break;
X case FTLOWPEERTYPEMASK:

X fp->LowPeerTypeMask = *ucp;


X break;
X case FTLOWPEERADDRESS:

X bcopy(ucp,fp->LowPeerAddress,PEER_ADDR_LEN);


X break;
X case FTLOWPEERMASK:

X bcopy(ucp,fp->LowPeerMask,PEER_ADDR_LEN);


X break;
X case FTLOWDETAILTYPE:

X fp->LowDetailType = *ucp;


X break;
X case FTLOWDETAILTYPEMASK:

X fp->LowDetailTypeMask = *ucp;


X break;
X case FTLOWDETAILADDRESS:

X bcopy(ucp,fp->LowDetailAddress,DETAIL_ADDR_LEN);


X break;
X case FTLOWDETAILMASK:

X bcopy(ucp,fp->LowDetailMask,DETAIL_ADDR_LEN);
X break;
X case FTHIINTERFACE:
X fp->HighInterface = *ucp;
X break;
X case FTHIADJACENTTYPE:
X fp->HighAdjType = *ucp;


X break;
X case FTHIADJACENTADDRESS:

X bcopy(ucp,fp->HighAdjAddress,MAC_ADDR_LEN);


X break;
X case FTHIADJACENTMASK:

X bcopy(ucp,fp->HighAdjMask,MAC_ADDR_LEN);
X break;
X case FTHIPEERTYPE:
X fp->HighPeerType = *ucp;
X break;
X case FTHIPEERTYPEMASK:
X fp->HighPeerTypeMask = *ucp;


X break;
X case FTHIPEERADDRESS:

X bcopy(ucp,fp->HighPeerAddress,PEER_ADDR_LEN);


X break;
X case FTHIPEERMASK:

X bcopy(ucp,fp->HighPeerMask,PEER_ADDR_LEN);
X break;
X case FTHIDETAILTYPE:
X fp->HighDetailType = *ucp;
X break;
X case FTHIDETAILTYPEMASK:
X fp->HighDetailTypeMask = *ucp;


X break;
X case FTHIDETAILADDRESS:

X bcopy(ucp,fp->HighDetailAddress,DETAIL_ADDR_LEN);


X break;
X case FTHIDETAILMASK:

X bcopy(ucp,fp->HighDetailMask,DETAIL_ADDR_LEN);


X break;
X case FTRULESET:

X fp->FlowRuleSet = *ucp;


X break;
X case FTFLOWTYPE:

X fp->FlowType = *ucp;
X break;
X case FTUPOCTETS:
X fp->FwdBytes = ntohl(getlong(ucp));


X break;
X case FTUPPDUS:

X fp->FwdPackets = ntohl(getlong(ucp));


X break;
X case FTDOWNOCTETS:

X fp->BackBytes = ntohl(getlong(ucp));


X break;
X case FTDOWNPDUS:

X fp->BackPackets = ntohl(getlong(ucp));


X break;
X case FTFIRSTTIME:

X fp->FirstTime = ntohl(getlong(ucp));


X break;
X case FTLASTTIME:

X fp->LastTime = ntohl(getlong(ucp));
X break;
X }
X ucp += attribs[col].len;
X if (first) {
X fp->FlowIndex = n; ++row;
X }
X else {
X if (n == fp->FlowIndex) ++row;
X }
X }
X }
X if (first) flows[row].FlowIndex = n; /* Return end-of-blob marker */
X return row; /* Nbr of rows may decrease with later columns */
X }
X
Xvoid monitor(ms) /* Called every interval for each meter */
Xstruct meter_status *ms;
X{


X time_t t; char *ts;

X unsigned short activeflows, first_row, nrows, r;
X unsigned char a, col, first;
X unsigned long aps,apb;
X unsigned int i,j;
X struct flow_info *fp;
X
X time(&t); ts = fmt_time(&t);
X if (!(ms->status & MT_INFO)) { /* No info */
X if (meter_info(ms)) /* Got some */
X ms->status |= (MT_UP | MT_INFO);
X return;
X }
X if (meter_info(ms) == 0) { /* Lost contact */
X if (ms->status & MT_UP) { /* Was up */
X fprintf(log,"%s -- %s: No response\n", ts,ms->name);
X fflush(log);
X if (verbose) printf("%s -- %s: No response\n", ts,ms->name);
X }
X ms->status &= ~MT_UP; /* Mark as 'down' */
X return;
X }
X if (!(ms->status & MT_UP)) { /* Have contact now, was down */
X fprintf(log,"%s -- %s: Regained contact\n", ts,ms->name);
X fflush(log);
X if (verbose) printf("%s -- %s: Regained contact\n", ts,ms->name);
X }
X ms->status |= MT_UP;
X
X /* Meter processing .. */
X
X set_collect_time(ms,1); /* Tell meter we're starti[20~ng a collection */
X
X fprintf(ms->flows,
X "#Time: %s %s Flows from %lu to %lu\n",
X ts,ms->name, ms->OurLastCollectTime,ms->uptime);
X
X if (ms->statsreqd) {
X if (ms->StatsTime != 0) {
X aps = (ms->NbrPackets*10+5L)/(ms->StatsTime*10L);
X apb = (ms->TotPktBacklog*10+5L)/(ms->StatsTime*10L);
X }
X else {
X aps = apb = 0;
X }
X fprintf(ms->flows,"#Stats: aps=%lu apb=%lu mps=%lu mpb=%lu lsp=%lu",
X aps,apb, ms->MaxPktRate,ms->MaxPktBacklog, ms->LostPackets);
X fprintf(ms->flows," avi=%u.%u mni=%u.%u",
X ms->AvIdle1000/10,ms->AvIdle1000%10,
X ms->MinIdle1000/10,ms->MinIdle1000%10);
X if (ms->NbrPackets != 0)
X i = (ms->RuleMatches*100L+5L)/(ms->NbrPackets*10L);
X else i = 0;
X fprintf(ms->flows," fiu=%u frc=%lu gci=%u rpp=%u.%u",
X ms->NbrFlows,ms->FlowsRecovered,ms->GCInterval, i/10,i%10);
X if (ms->NbrPackets != 0)
X i = (ms->HashSearches*100L+5L)/(ms->NbrPackets*10L);
X else i = 0;
X if (ms->HashSearches != 0) {
X j = (ms->HashCompares*100L+5L)/(ms->HashSearches*10L);
X }
X else j = 0;
X fprintf(ms->flows," tpp=%u.%u cpt=%u.%u tts=%u tsu=%u\n",
X i/10,i%10, j/10,j%10, ms->TotalHashSize,ms->NbrHashEntries);
X }
X
X if (ms->format[0] != 0) { /* Collect flow data */
X activeflows = 0; first_row = 1;
X do {
X for (first = 1, a = 0; (col = col_order[a]) != NULL; ++a) {
X if (ms->required[col] == 0) continue;
X nrows = get_slice(ms, first_row,col, first);


X first = 0;
X }

X if (testing) fprintf(ms->flows,
X "#monitor(): first_row=%u, nrows=%u, next_row=%d, end_mark=%u\n",
X first_row, nrows,
X nrows != 0 ? flows[nrows-1].FlowIndex : -1,
X flows[nrows].FlowIndex);
X activeflows += nrows;
X if (nrows != 0) {
X first_row = flows[nrows-1].FlowIndex; /* Last data row */
X for (r = 0; r != nrows; ++r) {
X for (col = ms->format[a = 0]; ; ) {
X if (col != NULL) write_attrib(ms->flows, &flows[r],col);
X if ((col = ms->format[a+1]) == NULL) break;
X fprintf(ms->flows,ms->separator[a++]);
X }
X fprintf(ms->flows,"\n");
X }
X }
X } while (flows[nrows].FlowIndex != 0);
X }
X
X fflush(ms->flows);
X if (verbose) printf(
X "%s %s: %d active flows from %lu to %lu\n",
X ts,ms->name, activeflows, ms->OurLastCollectTime,ms->uptime);
X
X ms->OurLastCollectTime = ms->uptime - 1L;
X /* -1 to make sure we don't miss any flows. We may
X collect some of them twice, but we don't mind that */
X }
X


Xvoid meter_print(FILE *f,struct meter_status *ms)

X{
X time_t t; char tsbuf[32];
X struct timeval tv;
X char buf[32];
X
X if (!verbose) return;
X
X time(&t); strcpy(tsbuf,fmt_time(&t));
X gettimeofday(&tv, (struct timezone *)0);
X tv.tv_sec -= ms->uptime / 100;
X if ((ms->uptime % 100)*10000 > tv.tv_usec) {
X tv.tv_sec--;
X tv.tv_usec += 1000000;
X }
X tv.tv_usec -= (ms->uptime % 100)*10000;
X fprintf(f,"%s -- %s: %s\n\tUp %s (since %s)\n",
X tsbuf,ms->name, ms->descr, uptime_string(ms->uptime, buf),
X fmt_time(&tv.tv_sec));
X }
END_OF_FILE
if test 17129 -ne `wc -c <'netramet/src/manager/nmc.c'`; then
echo shar: \"'netramet/src/manager/nmc.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/nmc.c'
fi
echo shar: End of archive 15 \(of 25\).
cp /dev/null ark15isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:12:59 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 104
Archive-name: netramet/part16
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/pc/NTM.Zip.UU.E netramet/src/snmplib/asn1.c
# netramet/sun/manager/Makefile
# Wrapped by kent@sparky on Tue Nov 2 18:17:09 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 16 (of 25)."'
if test -f 'netramet/pc/NTM.Zip.UU.E' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NTM.Zip.UU.E'\"
else
echo shar: Extracting \"'netramet/pc/NTM.Zip.UU.E'\" \(41468 characters\)
sed "s/^X//" >'netramet/pc/NTM.Zip.UU.E' <<'END_OF_FILE'
XM#$,VZ]!"MH3145M^SG-O%(J6$IT4Q,+Q<9F9LZK+**\+!MZY?)=_;=^8;XQ%
XMV 7!;R"X;=R8N*X-$I.#@WD$Q<6V)5(PKH<:C=VM<SF?R8.Y.00M(45<]=,
XM,_8%?S]$/;0F_X<0J@?04N@"WP^JAUX^+A56#S71/F!@/1 ?6 \ ^1T4K ?A
XM-M-ZP#VT'HZ7E-8#0_32>M /K0<HF1G7 \IPP-GMA]>S3H/D]<#KJ^%?E ^<
XM=#'>6AA""GY^"*%W7:^X<(=0/L)_<"5I-G9%WAHB1)AWN,)C/L^(DIU\[2G5
XMP9!^VL $12(FW.$*@!6$EX,]7@X%C"+FH"']9UU&^WG>C:6%#S2$C-YH-A+2
XM :3=D9K3I/O>(F51.\A1R[.KRGBY7!F8YG"D;&N0_+8&HS IN:!04%W ^N5J
XM)$A[P K9*(2;"T<?GNL7NA[E4L02QX\HQ.@/*ZR?DZ4RUCJN'5+(=>A)C((?
XM<EERV Z1PW9P/YWM(&;;#(KK"#(?=C #+?CLVPKGA\Q7Q2K3#[EJ'2F$0I5U
XM.62-<@G2!P_V3L,2CX1D]?1!=#K^D]ZW@T4A:8)V[5T1^,WM?A)\?23'&D)0
XM+^%P.HO&?Y6SFJ6DP\V.AQVV[ZSD@B(=X!$:/.X0C$.2W4G;'4'*(]B$4A[N
XM\CH6ZQQ"[8L<>HTXEQ:Z&^\2]=F:3_66.P@A\0<'E=,(UQ(.Y-WGY8?XS[5;
XMHV$=/J4ZS(CEY'E=\/2B YT+ D 0(@ D:_ AX3HH!$W$!\%X")P210O"Z:JE
XMEYYY,*[G$5SBJ&2</&0^A(?D.);#<61VJ.86\&Y &G44L?6V6U07FFD<X'):
XM,#[G?*)O<0GA0V6V*D2^4D-I L)T32#;]M9KYUY)\6@.K E8= ':0VII2.]M
XMCTB[KK8 D &)]$D+F08AM^P_;EF\5<V5E-#&@) IA%*^?]XA.NOV5>72OZ_
XMP[/XDZ$-W&&K1'0UKNSU NOR=E>O=9$5KJBKU;]L[P@E1']%OX/>G_[2K@3<
XM34-0HC,^_RW<7RIJTCS/^BOW=D/[3'O>KWK<6#)K,,+P0_K$[":V6/]UE%R]
XM;5ZN'[+Y]OKU_ _HS7*N[?,ACF/34^X?-Y;S'(Q0#V>Y_U[CO3Z G_1*L6.O
XMFF?$-VY<I0[-B.#GJ+I5G\.P_<O/TJC\^&=E&LUC/"(6<ZM:*\7@:LWX[KFV
XM;VT^0,L$:=!#%\:*!58860Y[.B$\GB]ZFV6@2C'O$,2&A(3W'7$+6;[%^0J?
XM_Y?FN8;4(%JIIT8?[]^-E#P./6)OG/RBP<0+!"J\-Q/<PN92,[>#7E0Q'[3C
XM"ZO-X!(,T5+CG\9M4"/0RBP9H>KKS:2VG EJ%]&2_)\A32T71EA;PZ,J93ST
XM1%H4@ [C*?L;XC0F!F_. "^X [\V2OOJACPG2]=7(5M"^'#"D&BFZ;1@7 <H
XMMGC"*SP*B\13?JI70^*'\"'YJ=:T.)J.:1K+1_8=/A_NR8] :@[W"$RM#1A:
XM8&8C0!-#,QR=$+(PQ6XT#I"%@%+4727J+[UGE>.$J?E@]K%D')7-69S .*RW
XM&-$1X7GH:RXV-E,R*V2P3)2)A2"D3WB<LX\6$[B?[2[$?V)A.*(Q008,V$01
XMLEQT4Q_"P3 ,O @?W"07]W22RWD);V]1AI*PP[9#%)UZ&G;0CU"'MU95=>"4
XM$QX7*A0I1F $M<1A]"L/!JO&M(0Z+?D=_I=@'C[?XA/=8 F3/%PN(?"F(<1(
XM5;M$L,D*MT."IHLID& "V]4Y@P[@+0_GB0;B(R@3>&A91".T^RG*<8E!_%CN
XMNNA&(02HO*U^#<6 PQU]6L!!@]E]UZBTEM@#4V.UTA<D"T=/NL9?9&8+03Q*
XM&+7Q:,8[@T%O^(8>3>1T)')<4=&(9JV(&_QA#A3F6J@M2T'(O4Z"D?-Q!8"V
XM!R'RPIZ]!L>34AB+U[R #0JS/NL/&M'&3 96&TRAD2)'HC#3\:@UZ/9H!B@!
XM),496L!$$)RI1N%F[)*QBS,J?>K)QH@/ AVWNF\>"@M!T60TZ(_;+19*K<]:
XM V]Y2!46=9MTWC L#VA_+C3<PXU6Q?/;Z70[A7'B"!# J?H4$!0JEKS\6MFW
XMQ8R!B&7@;*EB!SB?8]7##AL@>[!3JTY%V%P/E&,.TSK"0#0*-1A(.5X0!LY4
XM6V&0.+<G&<XW=," ATBAE>O.1]86=#[JC\Y',0WYJ(&X!)!&.C "(A@(&4G$
XM1RKRP8.=,H@ _GG;[4#><0"(%?Z +3FHHV$VP*PQ<(80,,;;%WN-^K%43O
XM\%!QMJNG"/CPFA+<4X1TF2[@VSY\K;^TM& S@.IS^2"_ACC4-<H3X4;SN][/
XM)AA;V?$ !>H:#8(#5C'Z.,/976K;7D8@?#>NVH7U-YH<$H]0%9)R>)[N6IK(
XM"C&+*F #-Z@>NZ)W_4:&R",=9HA9O:;BW!S+=<Q >&,)P$F*Z("@".4Z5A11
XM*'T)G)@((HT(0DHKI=^-C"&B$K)WNS5N);9I#XXH<?A8Y\8D5?#6!XNXM-Y.
XMRGCT.@M)2BO*P.7@P?YX&&(JO]=JA99D=CC-H?$&FT@-0'4OJ%+?MDY3QR+)
XMXY&Y!(20+S1P[_%YXWH(C0V@OM>5^V"3Q^TPK8\>)#]K O3A4L)B-A3+D8P"
XM$+!?1P%P"!M56.VU)8)>86"Y1R4&DVBP&@,0B=6DP3H7*%P^8/!;["?2!:7Y
XMV@ZL] '"=)##MS4>]*4+"N9PW48'AO?R7*=V@24_]2XHG$.:#$TP+[#LMWJ!
XM KHU"A .3>4+2O16'ECO XCO8#@.Y7/1@RA7M>+G@N4^Y7-1 NN+ZZ"H?)0!
XM^K'RP6+?5#Y:('TV'11%1"&T'XL(FOQ"$=$#[Q/?P;A)>5NP/IK@SJP),?=B
XMJ<)<7;2!^A5U88E)W5'K;5$5Y3N8Q%*WL=R+?B,3DY*&W K!.RBG3W?DL!NY
XM9W_ #_?X0_]0A*__@0CX"@R6,NC($(&TZU[;JD&$.SC+$H'HZ_;A.P,040$\
XM"F*$R]^=$19:O5E?$:XE' G'*R>%\M?T:%L"H_Z6P.@I:_86I2 4<5DB+IBQ
XM?$OLUK-5[R7V)WEA)@!D2#,R\,; ,H*C$1;;"FB".P<J?EI-):\'($_X?EF
XM(7?+; 1U!B!C%*SP4Y#.P&#]X063A$98 %:V2<40$CNQ0#(:<'XG$& C \<
XM?V!H#<]D=SY+.S\\.3!J@04,HC858IKC304US3$"424B6,#EHY+1%\U%M&-\
XM%9[B6C@G6+4[PC=1M*A]S=,)<XARH'$Y9UDRX;$<5P!OVRN\);1'6$-5D;#L
XM08&1H%R(2 ./6<X3,0 H$QR.B6,*+U".YQ*45;"8>PUQ?0*! !""&+8JHI]
XMJE5!^)J]N*6:,ZS/DWXP$L2!K@G (N-*^YF W3JP@71>__/K<[D<#OL?=P2[
XM?EZ!ZF:X+^^L\>%NL&9!''J#G4"&A&&)=B)%RMH)EOD8>(+(>X1XJNY!&6!
XM62=P-!C4(>BAN R$ :6)8)FJ1MDT*62DY"B1J\9_]GW<X1>IM^K05[9]KE;L
XM$]^/QAU*OD<=@RZ..MI" $#XZ= & H+_'A$-," "HC@,:&A%!Y\0(P)^#+R
XM@W'+%01#A3GBTCQQ05!_!3X::BT Z/P#C(]0?AX"/I!F1\::&R4:/KKPT DP
XM-6IL!4@!/@C" A'@@\T)U4H " A?H 1Q$NA#) #4HR- /T1Y #W)C<5N00L+
XM@(@LXU]9IHX"2+SW$=07!2>8@'W ]&4HE.[@@4&@'A\^*N0E0"VP% JI0.>@
XM"= J++^\D%@PHA2@.\0B^R9*@,)';8 $: 1N E9)@/HK"="0;G_<:G4&J7PB
XMB):1 @L!J?MQA0"B]^T%* ;N3^UWV4>1_+"^?NX,ZA"_02E,Q.:Y-TW3J?-U
XMUFUR;D]A7JI #]U0%[.J;SM$8A7FA&T'708H+L#V,7)+/#QP;JZ9G*+$/%"^
XMU1_PLY<'+I1>GG_(0_YQ+? Z=-%3ZKRHBZ^5?5L*.7[^<6-<P[O$2%T84QZ<
XMB46#B J%-"R)&U?\0,8%)B$PCVRWQBU^F-@<X?RTWDX*),@ZAXXRP#DHN@\
XM+/Z0JG>8S^% WTILV&$K6T$;B+HG1J#4ZQ'T(@&H-$ T7^<6^' BTC.J6-<#
XM"#-KD>V&304$@QD0)4%599 @H"49JF*OBT)!VAP7*%QK*P"*-I@:'XCL$^>#
XM96EB?;CS:P6LU@?&O4#I 1#E!HH- &-N!"D W&7 L!=8: 1&<K"!F#[ JMS
XMI$@A[ #L7X"S/!5(L$*'%C^$0@+.\W9(4(*C$@D$T5N^P>H<X3,@>"18G%DD
XM 2\S- '>H70-+LI5K=@YJ S,J%E#JDSL''2%S;53@[3V4!J7F:G!6'MH#*\O
XM5@W2PT=U?"9F#<;#1V] Q;;?EH<#9<QL9S[O]KT8RL HVN ,7S\;F,2D[JCU
XMMMA*0"5V%M13$HM']">6NHV%5QI6 BXQ*6F8*'H@2'W/ SOL1NXI#;##/?YP
XM&A!=7ZD!7O6U&E "L#CJ@66"8=4#IT45U -EQ!/30\?5!E=CJGK%YH3]+,MV
XM-==(3ZAY-DRS $) @8G#Q8P.Q02*AQ(*IX@THL*AI*?PO#O*;%,0HX;HJ;=)
XMD:_K...@B0.7G7E8;H$BV\G/EN!.NH[W$K,-=DK)($?8.? 76!9X'A8N/1R+
XMRJX#AT,AG .KN%R'*H>"WIS#)IR#6BK(Q-&>0GQJ,*G;4S9G;W@J/)@= R3Q
XMD"J0 "OB]H?-QXPB[(Z4K"B0[+@](%%_#T@4%.C9&/.(6\CR(>Z5V(P")/1?
XM0TH.!21;JN4K%;WE.UP7>RAP#]#U08 $G$C[-\HE$4BXY90_+--]&HTE+QOC
XM:RQ (?DH=Q;*=PLXH4\D(*%BA.J$:C;/P*NUD/O%A\18(<&R0PHC)!@^7Q4A
XM\S!"JO(+\4A_AX<2DATA(4Q+<":>D&A>(7!#%5";)X?>Z[12^VTQ./#X#1SN
XMU:G5" [?%K#4B#*92/R7Z214+CAB?B2 3@O7D/*]2T3@U>Z8V:$I37&!,L#X
XM 5AQH@D&( _! "4, \GA,3PD! R*&L#""&!A K#0"J @J!2D^P_YMD0*;] @
XM\$(A39OPO0_? 0L&CEN RP03!9BK61:A#UC*)AI)!,WR(#X\8< DS,=\D-@
XMS(-B<"$9 O".)V (8?!JYC'+K%#$^*P?0$.= !9#^BP;@$2!P#@@:1IM !'M
XM<"HI.$T%)K0!\ 8#WC: -QB$:P I!<MXH+&"#;(Q(RSA"! R#HX2P$,,CL4G
XM)(VI-.,$\(P'Y>&!TS'@R* N:T,;"100ZA=V2\*KF\'\#O_'L8GG6WRE,ZL)
XM0P:'^9J0BE-BT]K'D$TE*$9<U4"P8"+9!3J. R -0T1Y<!),DP7-DCSBY&!
XMJAUD]H,-1/%<)"((2N-?<(_K.#%B<GO8;1<5:T;,NL50Z1(I&-=#M9$7(3DM
XM&*>4A%6)XR)2B:_R*5;&&+^3Q^] >/RN>J4< ]PY<PP ^QT<QZ16.^>U4K@N
XM=17>N J.K! =0!2B TXB)I=Q:SQJ#;H]E3,+$#@J/E('"!#PMST0H3]F H@Z
XMN!]OO_UWU.IV>,^J#6>-_86Q:+D7R#RLK_;9NJ%I>%@!RX#?IF$9XGW>C67?
XM0!H&@E68 =$.HS:#= ' 3 9$91CU&$T>MT91PACW$U^1H3=R\;L>QG,"F)%J
XM)%0:L5"=L:$6F&$AEIB<9!>1+@..X[,,*&FG*@-BB,WETH":5/:(C0D@.^BU
XMWDZ**<SB 8LR<#G"&<_T-,/16WL:MRZ]*[J5_3C#H5L4^0@U:!% JO-QFD-3
XM'_GB?G/:B_.QIQY"^!^M7]R0A]*((=Z'IH:C5!$ B$ AT!ODPP=N'PC*D81G
XM&*R/&M@,H&A]I1G"$[I*!<5R)&U 6\RV(80XP2K9(#2;L@T&W8"B&QH!!DCH
XM!C.*: (&.!PB@<8!)3B#%(JH@<P PBB"MX.P4H2".1R[4!@_4"H5(7U&K2(4
XMSB$!A]IX1;" P'"7! ,(- R"302$$8T\&X1-? 9@-A%*&V3PICH#21@9$QP
XM/*,P)DIC,Y%K""H'Y:%9K!RP.#.5@];(C-4: LQ'@7P6,1\TT03,1V]\1@0;
XM*FF8V!Z-^] 6LCMJO2V6$S 1"8QI."^QY=)YEY'$;Q0P4SWJM)_Y7-S.;Z?3
XM[13&B2-C4V<0T%!+ P0* 8 !@ IBDT;%'MC\S(2 *, #P $%#0U0O
XM345415)?4$,N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%!@<&!38'%A<+"@8(


XM"@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$"@8$!10%"30'!A<)

XM&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%!A(C%.7VEO<Q8_U)
XM5FY&_H]\UW^,WVTL/WIV47%1\?\_^6V]G8A)H[Q1M/];E?N/$__3:.SSL5Q'
XM]9?OY=Y^^;F.\SKN8%14'#<NVF\^J^3?CS]*3HR]_O4HE^KY-M>DT2#)Y)>>
XM1L*]_/)^7,N^47Z>ZW/4?^0']9_[SO1;HZ28@Z0\C.EH+X7;KFIE^86C@C^)
XM'CTG'^%G_V:XW[LC7.=/W?;XX[SO?*YKN33[K*/[6+8[___$XXIP;^NUA/M[
XM[8_G1L()_L:*"?S&C*7V8VG->8T__>MM\SG>'_5M_>T.V7ROR_J7_3__N)?X
XM?4OXLE_SY\F]!F],QC>6P $,H3<>G41/3\]7>*,#KZ-G.^[J=?_D^SQI>\I1
XMG%:!0XW/\W<LW_5W[O7>(MQUK#?IWLK7NEZ*WW+/JTS?4/_Y&G7]JCE\DV[]
XM6I?M:OKU?ZE<B/5>6^*?[<9Y+M%?5%S?&W,9H'\6RK>V;S8_W"_-6VE?G>[X
XM:ZGL\_)K]_T-?^7>;LI=W9YCN>OYA+^T[1&N.E:^5)X%X;/]YA[A]E@4VL>^
XM7 V67RK=S_:OXS^HF^=?]TK\P+U%Q<U]J1C><H=&>O1_B7T4];"BXG4NE?8-
XM-<9U6+[RF6<YGO)MEY6-*[Z_>1<5S]JQ,FM=I%ZNU?#%Z$MS\[P:UEGYOQ"%
XM75[P7K998J7\K)__\[:0M:RENW'5KD;^C]^N9;F/7]HNU5=QG/>_9E5B'0[:
XMH_YXD-S^XW[_1QYW.N->:_"V?^1!*\KOO%''G>%O=7\KRJ#]V]V4%M%_\_^@
XM-^HG#@>]J$7%;N\@.:D_>(=^Q[LI MZ=412./TX=] >MT/ZX-_PI@U;O;;<%
XMW]_K_C>,M]?Z[2B(WV-.?7]_,$[MOS^EVQ'[H?UVTCL:C/MB[W#0>4>M#_-'
XMW5[[#=%$O$_S_W"</(YJ_G8X-MGWN$2.,FZUN\:_([G;B?T6V/XIG6[R[W?;
XM1$MB&W,/QZTQZIO4Z?+L-H%WY"AO*XK:1]IC@C]J#;H]KI?]MSH</__WWJC]
XM0=2W-WKEWJ[6T^IVH'YB&^SJ^,>=0=O\[2:V^-ZNZ(/X>R_IC=RQ^PZKP/)V
XMV'?RF/5)0>\4%:NW4'D#>0 B</5R$TRNHW'.]?O'>68EMWF5."B_?M<D[']2
XMF*UV;YRD=+R4L*S'PW15.=?./;[RK!66Q^]TG)34?UOC?I@H[QU>T?GXC0I6
XM&-W+?D2LWVMCBQ1J,/J?SWIP2%B-&.'95CEGGI7L>*S&7B[/T/9F_F(G9FM,
XMA/>I'@O;568D).K[FE<)2^0XO?_>,#FBL80KW2:/RO$UW!H3YA6\O3_-J9P]
XM\%YB7H?-YS3K_LJ=+/5K5SLTZ+ON9F;57K;#XBR-DF"+V?G>MF.G&3P.55&2
XM8U>Y=+)\G([N8<]Z3'BOL*W7L7S?Q]S8XB5\(]9GA"]K:-K/#49>[UPO16S#
XM+9_B$ZXL?[5UV_@V)[%6R O-GU>D<HJW]^ISQ:E$V"]IM]<2T?LM+ A&)-?M
XM;MP<YB"G',MV/W62!^4*$(^X-2)$;#C6.8455^>3WOJ\C9V;<ZU6*M#:QWI5
XM#TXGRQ<Z"48T)Z:9FFM6[:'Y(0A@!.A(G$>A-[HY%TQM4FV0US#^L9VBV>_S
XM]NO/\FCK5]'MAI)ZX?Q(]K.$,MK&ODLER47F7[5?J/A&R@WUISGWX5-2?LA#
XM#OM$FI <.H?DN+"^RIT-=>@LDD-GDIP+?@@RZ^)_GM!><M-IKSJ?YNI[R<W]
XM(1 "W^2(&+_ \T/X3K(R.^XDN2\XTRGL^R=L[0YC'8Y7#W(\YE6"N@8]CLE]
XM:NNSG>2RW3T=8[07,UO;;D:M-WXK<8O 5[P)']8Q^GPOE8A/O;YQO$*-E#EG
XMR;RBC< Y9[.=YL@<F<-V;()SY(3M-%?FR-Q0#0H%)3S VCUAAWVP>X;S>C3#
XM+3CR8:?!^:K5*2PL+&'+LPI;,O N^"&7#2T_:T*!1W="T=+;7=Z5^LG_GO[[
XM1GX;^3$;#3OL<U\7](ODH*2*2R7,'7+4-Y+\&RK6F;# .14\MX#P3\,J1?2T
XM2OG'K8B#),2S7$1*OB&1YL$]O/>O7*B3]-R<O&RR4JM3;A]JXNWCZH?WNF&\
XM_7XP<K%:4](GTO&X#H/;7L9CVT./QRX3(:TL4X_&<UQ=2<\E#!36E>BI,H-F
XM5B*Q!B/*J\:RW<N\'207FCJ8>'*_:EICGQ/'B(0IZ!@0HS!%LR$&/7Q'O;>%
XM4TCF,T<*V2L3_SZ1"/R0E=WY%X:<RTHDF*ZPU%#SO:[ZV7RO3O_M%6">@N:.
XMO]#A#7N"&HE(1 0] X.IF"U\MJJK8(4?H<#IUC9'ZL"\=%=$,PX_%M,;22TV
XM!*U.3;X99ZGC#;@-5\T'^U FKXW3EW>AUW1MN' NS,W/+0A&<JOCKQ5JRIC3
XM$9,"QXMGM(;;W)PLI!N1=^E\PD6\CZ=YFANG_80FQ@F;JR_(%9VS6/R9SX70
XMEW)X>*EK:8+UARG)H:?TNY';84]P;[D_Y+H6<O(O^( 2<=-+03O7[<<1YCH.
XM$G.-9]O#AXOC3._/\;BO")+T>7XVQ[OI,=^/Y_3X61YO0]8[#E-)9%3.QQD.
XME]T]'O9,SXGC67%0L"(.% IR+!OD<!2_/TX<X]G4:6'#V:E$QJP-\8:$0EK8
XMW>&+6PB+#,(/U<;4V-/80D_<O[JQ;U2$CD]"I;DV-"C_V/78T21\I9+@88=M
XMY$M33#X!XS&[:V;G!]&I[3GL'+$+RAH+YTW[O<1^OP#JQ&\)%>KB7?BS[%?A
XM4RK@KL ?(@'^K)H8B:G3!$:FNKP_X0[7W)^M#NE2S<-+C$,3)((83@0'=C,_
XM0U>"43#"*+4LVM!^,X&+"!SG\35.\A.>B-ZL;RDL0T!*Q=[U$#[B<+A4X/@=
XM_EH*<VT./NA)C/I$O!%VV*&R#SS9\)P"FGA#HISSIV$!!2)0S!6IV.L9.YT0
XM**5O"7LB&#&\%J:!LVWX:MNLX$(3I:Q$B=NZW^#V0 DF'O3,T7@.1L-E[WC9
XM=R7A[D+I+78.QWM(+D]U+ZHE@R/"<V)8[R4#<J/]:3!N.-;Y,I'B^;4T&++8
XMT1 O@T#<Z)9^>4VF_$X15%$YQ\S)C!&,O"XKFUEB'KQ X9>1F2DL-+M1S9)@
XMOT)Z[S6NDP+75%+9:0Z&Y*K<SQS1%:.J;C!,@60?T8Y=#U,T6CKS04.,!O%@
XMO,;)QV$TXK'L3Z&IV?RJOW!I^4N2?0&(R7IKR#E9PE(IA],C5"Z%F_!3WQA>
XME4?+5I+84)JSNI?NH_"OH'J3DR(F...@5.V0>]@3_ !K[DX@C#K/"]K81RYBU5_
XM8>>AI ^84F7B<1KTK-B"Q<1 +CRM)A<^)JZE86MECX]HC$S$Y2H#?05-S/64
XMUVJD&+F@HJZ<K2@_/TXP/F>B>&,_ZG"8%>G?/QCGYM0-WF@(;QP?I(64/"4]
XMW!&Q?OY?(RY[/6(EW^$N.US7 G$="?QQM!6^UG W!E8.[[N-4[-R17R5='LT
XM-TVW:@*EQ-6$'JP4%WJM*IK'F@G5B_!NBTZ;=TV%WX."^M]F0VR:I+^* C<R
XM?9'XO:Z 5&.2-#7,J!$'/4BXPV#&_[-S-1^&3]2"2R,AO;<](LKJ0.T*WM27
XM)Z3;EZ>T])^ZRLFN%><XU>&1GZ;=8OI(5H3^$A%M/7=ZO2O<Z:I[-;LD7.>.
XMI>\;)SISG&SNSO"A?8MR^3IP'I;K)#=7X.Z[^XQ^(NP?4>3@^6Z!B?X1Y3K]
XMD;2WM!2XIC"GF)$J1P:C@'?[VS*77,4K^;_:N.B%!R.F(S6R"?F?BWQXK/A<
XM5OC@6^%]PHN\#R'Q6]7_"1^,D (]$:,%T_UG943L\7)&<8*RU,ODL?>9&?;J
XMEX/Z-^N@-\BS[/YZ :PA*U2(V7T6(\,2! <762K/68NX8L?Y6O"N_(N8H[8.
XM0F\>7FH?6MVBI+&?Y]V0A)VH)H2LK9=+UGH5@;'G%$#%':)2V 7 GU"HU8=<
XMG& ZES(Y+>3AENF1YQ5?:[C"E<0YE&*;3$5*$^B!K6%X3X,A?!?:GBC8 &QA
XM T[$!F^J$1Q;>$/Y.#+U[A!R(,'6!'-VW)B2.E]G'0%\F1!*,.'7;5YSTYG0
XM,*)BA$H"D.H$QJXE6YT%):#.]IG9$BDA5)?4N#H.7DAT8M3A9C4Q.3FT D$F
XM5 A*TR7AAZ7NXP4$'B+!9D@XFX.1?FHH:77%9XZVX.WI-(%2I-K#Q1XQB>4&
XM!N.JCHG%U8]17Y79HW"1C<J$$R@84.&-2H*'ST+^!493+!_"L#+1M]6M-.RP
XM*0PB],F>G0]E7>X1YQ*;K1!WH>)UN!^Q%S#PA<&][#N&N17$H22U%*%,ZZM>
XMBK<JQQZ?3^932:FH@,N@>B^-/$V)RCK0;%S6=\ML6VP%<;9>%1QKV@XOF:SG
XM5L(QR9\*GIV=/7ZU 2-/_U7$6>>HS]9\JK>P)U_G8BP2%7VY+VO@='>JA-Z-
XM0H_:H9%=JC(.>AYDAO81<MWI%&A!]\26+U6>.2+/U$T1@>.P@^;E@X&^06?I
XMPZG60A +*S@@68F%WL<L5&7Q= (86?1:D@]'<0 Z,I/QEOQL"?PEP?B;/?;P
XMA0/>I@WW2WJ\.J=,!\?36*X(K/Q;;M'!2.F&*1W!SS:O,[9:!^NPBAV*Q+M>
XM0'E(;?\ZW96(3:@+4N<4ZN*W*"DR!57%)&_6S12>XJI69^*"' 2W+;H7"Y)D
XM\S8.QY>0I07C+$MQ7Q=7.J&[<[+M#MY#B/CRHMU%JXNL,'@FRG';4$. SXBE
XM1B&2=K-.XFDP5GD,=-S^\%):,(YQSJS::<%XD@OQSI#S9WQTU>V/L?HUKL,'
XM(W14=7VU3D1X-/(67@M$/ D/=%A8'%X*4#P!.ES&L[ ]DB?B]A"/T%8)T&A7
XMC"ELE.S<8(P:B^+_,Z)3(8C $8__6\BZABUX"2NL24%!3-M1MT.(OW0*+?A,
XM!^<NZU*8-<E7,LZ(GI^3Y219^><_"@]"U_RUCJIFB-O!H7VQA^N$TJ&XDF'.
XM;('XV GRL"=7,B@YVF)B(4H0./!@I&I Q8P)^"Q<R/,W-2=T@A\+B#A(WP\
XMLQW7U&C84@X,QB?D/DZ@XMRG@KY@-/7A08,>G <7'A(.7$PN8D!<A-P1:M3J
XM\I >CB$*&D<6FU'B*@P'BD\S$YO .%2:(SB.!B,PC:+CB+S29@6-6L=1($&P
XM,?N:4VE7:%X70C,@?'G;(W</XW,E)TO"@0SAHUV9ET5$;7V//T#QX#7Q8$Q:
XMXB-:PSN7+20+^Z8_A!1*EAT0UPURTXYX$-ST(+#3B#;SM&"LY52:&8I;F5F)
XM5QT1L"_"H/D>##Q?@T$(&H<B4/ISA?ZX% <+I<:I8D.-!-FQNG/S\H)Q_8=P
XM,%:9,)Z$^*>$.AJ5,\. +PLT9#">S6D_6_[GI5287< T%6BI+ZAP/>\:5YX/
XM]#5.N0]\!.Y#T4##_ XAC$.@=8[Z>4=,:,I6V0X6VH7F.,Z+PXN*)=FYMRV:
XM$]-\J6HL%7:5<9G(]OQQ''(5W#\;OE^ E;J&220CQO9,)VP/$%^I3H0"'>W'
XM@:0,JI?I-:,_+Z'4)X E:?$[CYL(N'W#7'@0'(E(:GILF2G=^H2?>GT+1BQX
XM:LYD1N[5I8+F;$,MQBT%SB2OTX[(<I:@-:(KN#&"38#/)0.OT@<Y#H63A81G
XM7!J&4<58U?.]#'6J\9J"V@J-Y+IXMT!3HCH^GO(=*3M7%JD:KR6A;I7XRJ5<
XMK[?MUP>HV0M(/F3SO0H5X[LKOFRO(RT&:W[():8D%!%LC&?SO'EKQ,L(E.IF
XM+3N&7Z&=K]I*=+%6@P:)@(' P5 L.V2^]1D,&"=)6Q"U_H,Q#F@5?>]E?]31
XM(. #,.=3-8+Q% _<.%5YRQ1W2 BD>-QAA^WJJ+E(0O]QE">1D!YG>"6UK/@$
XMXS^) 6IE@@,U0:!QG.D(F5,Q"_.YV9/RJS7-@Q%D(]WY'XMDO^F0-V\U'V-$
XM)JT=3_/EBIJ0<9H"HSYJF&%NMH,9N07W.'1#QT5N,*:!0#?"EX^T[M &RMTX
XMHL[B#;2-@W!OF$D1RQ@6J+@24\@=$JM M(G=*%G!P> 24$L#! H !@ & "J*
XM31O^W?2%0!( .0N / 04-#5"]-151%4E]56"Y#80I[!P8;!KL,2P,)


XM!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&%00&%P4*" 4&%08*)08(!Q@*
XM!PH("P<+!"4$)00*!@0%% 4)- <&%PD:*_S\_/O[^PP++ LL"SP++"NL# $B

XM(Q05-C=HB9K;/ 4&$B,4Y?:6]S%C_4G&)"?_1[[K/_-W&\N/GEU47%3\_V_W
XMDI.&>:-H_[<J]Q\G_L&QW-MQ+W_<:.SS<AW5GWR3_%]^KN.\CCL8%17'C=M\
XM5LN_'W^4G!A[_>M1+M7S8=ZDT2 )Y)>>1H+A+^_'M>P;XK=YGZ/^(S^6_]QW
XMH]\:)<4<).5!3$=[*=QV52O++QP5_$GTZ#GY"#_[-\/]WAWA.G_JML<?YWWG
XM<UW+I9EE'=W'LMWY_R<>5X1[6Z\EW-]K?SPW$D[P-U9,X#=F++4?RVG.:_SI
XM7V^;S_'^J&_K;W?(YGM=UK_L__GZ.W[?$K[LU_QY<J_!&Y/QC25P !/HC4<G
XMT=/3\Q7>Z,#KZ!'OJ]<MW9\G:D\YBM,J<*CQ>?Z.Y;O^SKW>6X2[CO4FW5OY
XM6M=+\5ON>97I&^H_GZ*N7S6';]*M7^NR74V__B^5BZ_>:TO\L]TXSR7ZBXKK
XM>V,N _3/0OG6]LWFA_NE>2OMJ],=?RT5H/S7[OL;_LJ]W92[NCV >3V?\)>V
XM/<)59\J7RK,@?+;?W"/<'HM"^]B7J\'R2Z7[V?YU_ =U\_SK7HD?N+>HN+DO
XM%<-;[M!(C_XOL8^B'E94O,ZETKY9QK@.RU<^\RS'4[[MLJ9QQ?<W[Z+BV3E6
XM9JV+U,NU&KX8?6ENGE?#.BO_%YFPRPO>RS9+K)2?]?-_WA:REK5T-Z[:U<C_
XM\=NU+/?Q2]NE^BJ.\_[7K$JLPT%[U!\/DMM_W.__R.-.9]QK#=[VCSQH1?F=
XM-^JX,_RM[F]%&;1_NYO2(OIO_A_T1OW$X: 7M:C8[1TD)_4'[]#O>#?E)[^=
XM412./TX=] >MT/ZX-_PI@U;O;;<%W]_K_C>,M]?Z[2B(WV-.?7]_,$[MOS^E
XMVQ'[H?UVTCL:C/MB[W#0>4>M#_-'W5[[#=%$O$_S_W"</(YJ_G8X-MGWN$2.
XM,FZUN\:_([G;B?T6V/XIG6[R[W?;1$MB&W,/QZTQZIO4Z?+L-H%WY"AO*XK:
XM1]IC@C]J#;H]KI?]MSH</__WWJC]0=2W-WKEWJ[6T^IVH'YB&^SJ^,>=0=O\
XM[2:V^-ZNZ(/X>R_IC=RQ^PZKP/)VV'?RF/5)0>\4%:NW4'D#>0 B</5R$TSJ
XM=\W:F2&>&'K$UMMN059<_G4TSKE^_Y!8PZTQEW"E>\VKA.5R',\=[B\QKP/F
XM"+!WW5GLPASQ;*4GIMGK\I =6^K7KG7$O6V'R>'FL4>5[]!$ ^?R7.6;Y>":
XMD(?'>68INWF5."C'20[N*I=.EB.>]9B0/*Y-D\)LM7OC)*7CI81E/1[2PVOG
XM'E]YUHK?$>.DI/[;&O?#1'GO\&1&?Z/B[>UF9S\BUN^UL44*-1C]KV\\.'[Y
XM7B)&>+85WUJX2G8\5F,OEV<H8W9WL1/,-2;"^U2/A>VJV$ MVUY:R!M>:QS+
XM"50PITP-,*%C8NR(, =3@CG8YEPCOC"U]@:MB,,WC!\G9OV.8/0B]N:SQU>R
XMF_;CG'=NG&"$]E['(NU\+31WX56+6#N?ZIK_6:KGK67?J,Q'PGJ%]"Z L8\H
XM95S]2F<G(U(7C$?KK/M#4.01?J'66CT8<=W+-F,H\\7NC>5T-;)>-L>NFHTV
XMW5O;7([)=R,\I\-#:A^,H'35O5GW7KJ/0OYI_N]&[ R[O7YH!4X7XGJ\41E7
XM;S6K52IE.>O&!JTLE:_K4Q4PKFU[V<4,^;^?<IY AF*U6@NE;W/GB&W;GP3N
XM7BC;+N@DMZ,.I<_KE7<U(C)M>*MINNXIK4$RPXB T<9^U*[JO'%HO3]C7;M!
XM_9IIG<\;_F"2$MM1\G^< ^S'\3Z#M.8M$2*N=T/\YP8CE\-GF#LG,S<W-[</
XM'IV;EY/Y75[K*]O<*%MV>X/N2, Y^0U&-"?,-<WGK3(;52CV.==+/)^D)>1
XMQP ;UNKH-0WY>MDU F%D%"6Q%Z;"P( G[C!P1,<M!DBC?L14F-G_5,'YOWD=
XM=; JR>?,=5Y\94UM/$GFHZXN/!S1XRMH[5%[UWLQ46*<D0NO%71UT5U=*OER
XM%YZLTT7%\_2\(]SG5P_)4W'5);A1"J?FO^49_(B62O-]I@4>C6LV3>72MFPP
XMWH$J-A3.6:\!=]5^(8ZG/ZR?6_!#$'AB7# 7J\%(YTB988Q7HB. AC0ZW&E
XM2=U!#VS$UI4?RC2R@9#2'T=MFPVDY 5M("(=IC: 18JGG/-:(<V@N=>_*_<9
XM(D=V=;OJ*L)2\E<3+)^A%_XT2 3/)PS[NN>E>8OS9XZ&LA3S-RJW#L^TUH\3
XMOQK!DH) 1"+7D1LBI4_EQF["\70*?DBP-M8X:7FC76E'900?2ZTPCMGS:\]U
XMWO40/N( G=[AKZ5P8M&8PJ>TGX'UM2T\Z,D8N*27]B!$WO\S&)P"&'A$@U]8
XM@&8*Y87&(#U[9R/A,/Q_" CD$?MO#^(>=KI)<H()8UO=L"?YS*<^$X1E/M:K
XM>FCV'AT^^TA.YU#%0B+L4+7$:E@E:0&:1<<Z4Y.WT="]SA&%V\U2?BS6ORY[
XM*1@A3JHTW+T8^QE:6B+",1KNQRHM=XG)%\DO$D<_R==9&0?5E(NE^1P7Z]OD
XM#IMC'%_1JG\AU@\)HHMW):[&&&S2L'L<UKA 4U!5*W6=C_!I#K]JP*&QCA/F
XMT'5ZYU58?;.?"-@F;]Q:.J*,L$"'!.WZ?' US4E.Q$FV3K/ &W;8!R[53G[C
XMRJR&?M$&5= HT1K#[K 9/(8<JQV:;<QV2,HAF<(+P13IQ?G3L(Y*1+\']S7I
XM<0_#ZM >$K!->W&?]3[+1WU ;M6WR?94M*_-B,LN<P6B$G[OI&UO "H;&$8@
XM6<9S7,Q6W-\H19KDA!H2(9&.%K9XLT,E&/'S0G5Q=PZ?FYZKY"U6PO?'K8@#
XM(8L*>#U)J+.=A$3:3QZ'3LS?Q=\[=UG2<W/R<D2&Q[6^"*Q9H5K?*2D_Y"$W
XM63)%SO:'][IAO/U^, (0M(;I3<'#XVH,@ST^'L,>/A[33+2\DHRJC.;D4EW3
XM<_&N.1.1:_14E<$U&%%8@Y'CJ<3"9(^G/=^N/*T>L'9%*>.'X1_)%(#A2.[!
XMQ(?P52,=#GE0N(U+G@0]HP+%N,3(S<V&''SXCGIOB[=@^@>5>L[W3]WW!(%A
XM!JOL2X#5PI#[]> K+JVAY@O[C'_QLZC;1,J.F]B(1$;V&6"M1ER79UL\!:68
XMMF^:73<DS,&9BE^=3VR4$'_X?Y?V1D5CZNLQ&S=S2? M=+9;@)":G,0H#-<3
XM@H8F7DCU]!+[_8(IQ" *8DUR<S7FAAFV*\F44J!!3]1B8.GXB&5-=-T>8Y.B
XM."FOU4@Q<FWZ6(N!JI2]EC_5$W+Y@S>2%$E7P9\?)QB?\Q>8H+2#<4/@CH;P
XMQJ$5F77 09VND2:34/,9WAR&.XOASL3:#F\&QYT>JL?4DG/I?,)%]-B%N?D*
XMOT! (_0,9;;[,:D)1K!&XE(S&K$^(WPE3^FXIFO51[;PV:IF^!5^A )\@Z5C
XM8%[ 5,J.PX_%]$:2=6O/HB0_'_"O(*K2FWY*&$PD$?FG7M\B7FBT!B,W)K3(
XMHZ)(,%XME//1:9A!(^[C:9(I:^Z$)L;)Q"O]@ESET%NZ/_.YJ*64P]-3NY8F
XM6'^8DAQZ2K\;N1WV!/?V*@BH3UJ4&'$.4-#]2SZ_\N"C'^%J+W>+ZPWK3[ O
XM3'_(?RTTQEWP22A$K;]Y8,^UHI4=XSARB#6>;0\?SC,;]^=XW%<$W,_SE:W&
XM0=:Z2XE[_"R/MT'F'<<T);*>]W&&$T=UCX<]<W/C>%9I*"HRCF$7Y%@VR.'Z
XM=G^<.&9M0T0+01@AS!B4(=Z0X$O+:CM\#R'1<HJ80?BA1L*P''L:6U#Q7S%1
XMXWH+G4Q"I;DV<*#_L>NQHSG8*AOA88>-9$E3HTX(1F:G-;/S8ZC5]AQVCM@%
XM98V%\]+S=JY G?HMH4)=_!)_EOTJ?$H%?!GX0R3 GY4BINKJ-,$6H2[O3[C#
XM-?=GJT-;5//P3?.,W@E&P0BFE=<@@&LF=A.!X[A!DI_PE':S)+DFB9A:UH&'
XM$#ANPDNNS<$'/8E1J\0;88<=JF2#)QN>4\"4-U3:.7\:%E8D@AK<. /Z-*:3
XM'P(AH%D<]D0S,;P6IH&S;?AJVRSL07.5K%R%LQ*K+Q6KP,:#GCD:S\%HN.P=
XM+_MZ4(>#R2UV#L=[2#I?=2^J)8/##;\#LR4X5J/]:3!N&#K%CA0RU+X%LJBH
XM*G%950IQ1="RD.HCJ3WN!NN+;S"V/0.][H@4CE,B#G#5@=AW1V%&'$;MC)/S
XM/U.R$35U%&:T8OG(;V[J<>QNZ$Q<:Q;2_TJ VMDX8NTI7Z#NB,K*=S#2.49J
XM-6]E>!1P&0^'G8@2T"L=J011GE]9!'<AB=J(26(P PV7)E5IY_ORV<L4$EK)
XMR87EN]!&N\"-:LOA>J_D2([D$/C,@,FB?D9Y"=V*G)$QC,6@RBQNW'0@ ZV.
XM=.K.P%J#49CMB(K01VR#O5GX.%X1<:(*6#CTN*%9)K^1H L64E59*Y:7U#"C
XM2O>MMQ.&,.0_.]=#PM1EVVD)Z;WMDMQ:&5U6=84F7"<PYG(YG)LH[MPI3IDY
XM>!JLU&5E-F1U.<V5X!6P^H0G?C@HW^@8VC@-0*8_A3DUZ6@U-"F=FIP!5:[5
XM(\*'UNH*WT\E7O: M.9DAFJETD9%':A VOF8_;U>^;_:N(@]PM1K4DD!J-_5
XM%,L,)=#^*"C1%'' RP 7)/\FX!< =@+ ,BB'<Z:_*@,>?\>F!+KZ;$U*Q!;[
XM/%W\/9&C\5M;.%QEH4,'(Y0CJ00IH2MLN1CVADE8W)L)5907(_%80L?I'H*$
XMDVA$QU38.648,43>3K<PY,P=0(NZ_/;;@@^A.3@OBO <CN;7U* %7)=<J5/.
XM#C5X59HM[/#5U-E;KENH=@N0ZW;)=U2;R^?F6Q^'NXTQ2)HKXA^T&8<H,%)Q
XM>'+6.K=CL6.Z0WCJ=(U(R375-N4JZ'2X'[&!$&L@>GF8W>'+H92RJ"\1;F @
XM_-_IU+P4 &W8IWO<4PQ/2]@TS2."8<## 7Q$ 42"L],P;E9=5(BPPU;P**T&
XM4:H3>F2JY G5(7!6KA\6G(<5,'KPDA1/!8[P]P@&$8]+SD R-N[OC]BBI%*!
XM+^1K1"%?/1I2Z=5[%7Y$/-CPZ<,J8.T/ >0;_U!,Q&#[6,&!)L:3V9B%@B)/
XM)P :XS6QZZ-<U4IDJ7Y+?K8$GY1@S,U3SC TY-SIN#Q%P:),!\=#I1T!3[V%
XM \E0UZ@J[1%*&XL;>^)@!P6RHATJ+/)?H'E(V5*]*UQ#?U87" (%+)D#Z4S&
XMH,@P=A]3<JENBY,+%[AKN'"OA12F"53Y'&>R5[#8]W6 VX-I.;.Y;-QEA<T@
XMOKRLB#&%N"8=G^3':5=F#@C7]WA_ 02^ SWA(XCRZ[([Z:Q05V"(G0$%"'+
XMB22$#VX&.*B+O4C95GX1*? KNJS/.V)"4_QE.UB60FJ+Z]H,X\9NPFP'#P9G
XM6W.Q'U ^$N:93J*1VD).#7CW9<T[THS"$A3H)7[@1::WPB79@BC3">S9=[A0
XM"]F-=37U#\9U6D&P9L?#* 4P'!BDOAX7,Z5;C#BR6 DM5"8FIN H,-22 AVW
XMMNUE49&90?@S^D>TN!"]%C<G#-(5I]ZD<WD()?L@Q]W)N-:H/T@C9>:Z<;6G
XM\2E9K9A*J\!4L%ZE\,L#:[G$TD.!OUHAA#0$8\P(1@U':,Z(TA%<7E0]+C,/
XM99BMHT6)#ZGUNOH%/E,%L6ZD[2=Z]7APJPLWD,&'S%<1#,)_V9]"NF,%@CQ<
XM;I*&D!?8\ CDA-1G,R#349&:O!"+(<UR9.+BIP#^BP9@]:P<^86)/N?[@_$:
XM#2%&N81L2)48!^E"<$4,F5/<(2%V];B&'78!D2?X!,[-"?W'46^)Q/30L2BT
XM:\HG&/])#&0WDTSQ56SL1].X04]Q)(0/51KQ"8H4J1JIMK50PWFMCX6HWP!!
XM-D@1CH3D$G+M"!<J ML1;[#08*S>%*)QRQCU9CC^YBW>Q]T;2HBL]@TI=^K?
XM2*=F_!8-G_HWB8O?H$1M9!Q;.M+F&$_A-!T3F)==GVE)0,5M8CU</H!$,,6)
XM89*W0 + O#.^P]:O_QT7S=%<C*E-8KY,#5!+ P0* !@ XBDT;5=\4'L\#
XM !C!P #0 $%#0U0O34%+149)3$4- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6
XM]T>"!!D31O!F"9(JVCK).R?(H'7/@LPYLZ'"$<*GO9N&75O6;%JV94&:?2M'
XM>P\=2E4G2*=E[4#ODW-!0AT"O<>.?5O7+=VT;N1WT[)TR\JISX>^A9M7;MJS
XM:.F"1#DT!;4]:Y!B\^#7((7*?7O7#;0NRR*]; NW3OXA[S+'6@[U!EG5;5H[
XMSGMN6CKO^ZT9IC]V+=NP;LE@L^!-=2C1GESICD'>1(L*K7JT)T@BP"JX2M9S
XM_C5(NF^B#^TDFW9N6+%LFKV(<]-6S:-^-WUROYG4[RGUH3,Q;^A:[IGYG\+<
XMY[8-RY;-O!Q!E0Q;!_W<:C=-[K-UT*[\'W-7-:_O+'B'3.-VGR2)(FM/>;)G
XMSY-%3U#O)&CKEG;V?E&L5)HKI]549^IT*12C%W7392.D7@OR99MB+\OF&"R1
XM8]@6R#!FB6007\ZQ>LP^QZX=OUPY4AU$?0?9MNX<NEILF;UX&34UFC\MS17^
XM1(".-E70!16.SH:T,T'Z0X:D6[;9\AS?5*$R32JTITN77.JU6*YA&%_]^JP+
XMY=/>4YTVT8Z=ZZ8,I9T-H;)C[X:E\X3:3@_)?A!'V;U:PU.(][%HFF.L6&X7
XM=.0R3]645=:*"'8DG-_D%+^Q<_RVON'F4'V#IIWU#6$[133%>_$GX2>VW?P$
XM]A0_)1,_86*W@\X9WVV^,.QMIJH^$W=.;=J3;M@YIE_D[X3-7>59I;G>T&/9
XMUB5;IFY5/:17UYL[N6BGAQIE&O3HE"H%D-5D=(O#=TLYSX>YZOF)!JWZM>E4
XMHD^0[I9)Q^H@S?5GS_=LS(GYA8ZG:&Y(RQ1QSQS8+<X!-'0@,)1"[;VQJO<8
XM=4'/_)EU/L4Z,@CH 2G5&@E"\^W&247'+M,K[>)(!Y')CF)>1;'+AB7SJNGR
XMK5@UU3W%F+)I4"B-(U4D&FM>:J@_3OW+X@FTDK3ZS9P3:-+E&&I%N*T#>2<
XMJMG,7_-@OJ5'2'.^6WF"S[B8KK>[ZJJOT)8)Y4C:VY89'_\B/XMFT!=ML<*6
XM8;QOJ($7Y=;Y:3?JWQ%ZW!-MSYQ+XE8O-IKPC=8EFNJ8?4WWJQW<ZCG5SV69
XM9:?AKJFLVKKAN$?PJL<8J>E,KW*1U)\*53J%S--&\7T0T2CF84MUO>72H8II
XMU@A>4CEBS?R[,-*HQW,L2!UIV=\\!;.H8W^%.Z;+&H4\F2)MR^4(7X<;J^8P
XMY[2G64SC+ IM2>B4+.Q$:*Y2+B1=)<\AQVT9/0?K<)S2?+L)HJI":%$TIZ)>
XM<^H;]1WGE0-02P,$"@ 8 _%92&U=V".BM 0 VP( \ !!0T-4+U=!
XM5%1#4"Y#1D<- @$2(Q05-C=HB9K;/ 4&$A-$Q?:6]T&""*Y'@IQ;EB[(M'!!
XMNJW;5FQ9N0T58.=M\WZIWCUCRISI8CC..W&_W\H%:6;XQ;Y]2Q<.,8NOGMOY
XM2H_AGF' ]5NW+?6$ZS?(RWG?P=]KWG?8N6O,$]4'/7O*K%G3Q7 .XQAB6;=T
XM_M>]2E_[LLWP.MYNP[8MTZWEVA'><Y+AJ%-^$\Y*&;#/AHG>=\/F.8:++HAA
XM:]+("A[MV[ILR8)$&X9=A76R;X+JM&Y!LDT[EP[Y3M!<SVF>/46&K3MV+=NP
XM;LFZ##O6I5N](HHAOH5+-XW2'9:-$8MXCU%>RVYF?9\%T:_9LIT+\FI0JE2'
XM0F%>=^ZU:9XWR#'HB^X>\S[:MYDIG2X:^GV&&6;I...@NGJYZS19.ZE+<<]05V
XMOU%?\JO*!6Y,G+"3,0O'Y)]UH8_N.1,FC.H*>; 79,X:9J[Q76?JGK,W(MFR
XM9M,4:=U"R4VGGCFIXFH05_M<%DS^FC$MZCF?L\^=D_?X(0$;EYLMW3EAY8QX
XME->P<]_\N=(WFR;>AM>R+)ZE"WW=W73P!Q+":X6_-0)02P,$"@ 8 %XI-
XM&\]"&^XW @ S0< !4 !!0T-4+TE.0TQ51$4O1$5#3D54+D@- @$2(Q05
XM-C=HB9K;/ 4&$A-$Q?:6]U^J!!FS9LV:+$%>+4L6Y$R8(*>6A0LRI\R&"H(W
XM2) @B18=ZK8L79!PPXY=8_QLP^9]6Y?NG.W2:5F[:=F"%"KW[5VW;,N6^=\@
XMA[YM"\=[EY6#O,NZI2LG>E9UF];.\YZ;EFY>D&_-@@Q:IU@):S?E6N4+83EG
XM?$$O:C/69=G&_"HGV].Z/0MR3_V*^E3SPBT+$N:-]*;N==T,Z[-NOOY8M&'E
XM1+?@GRMW[%>R;K^&)4M6[E:975E05_LO]0W1IK?PGF7GSDG&@N_IEFLWYM8:
XM\=E]&L9>+1-&\2Q3_#'@8^E^R;K-OMWQ'@,_98(4FR==:6LX[197YIG/^^[X
XM"E;&5^#G^ JMP=6*[ROTH!RG_2L:LIKMFZZ0Q0#=*'&HNUB0/U.@!5[:FH77
XM7(;4.'?]50^U?AL#+V(H2F]DLF7&7.N/9LBEOFF,&1\VC'JGT1XA2@!4YM:8
XM-Z2$)+<F@^XURJ5+ERZN!E_&U: _I8N&WO8)>K*,/20PE=O@G0T*_"4!&OS?
XM0 (092]V_0;O2@)D,OL*"4FF"&A7I&^0JB$ $\80H,\8 AA]2QE] \8:0*$"
XMF#NH0):94H:E4Z4Y#@CDB)1WTPV31JQ,&VDTXRFSC')=9E1!$$:T0OOZNL0(
XM+8S >!-:H?4 4O!^NZRILF)^G.G?>N&7\3//=@MX("CO.7N\ X-X!/*RSO"
XM+R'+1;,=23(0RW!'X(.3$1M#,QM02P,$"@ & 8 &(I-&PN9U/ "#@ URP
XM !< !!0T-4+TE.0TQ51$4O1DQ/5TA!4T@N2&$*>P<&&P:[#$L#"0<+"0L)
XM!Q8'" 8%!@<&!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'
XM"P0E!"4$"@8$!10%"30'!A<)&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W
XM:(F:VSP%!A(C%.7VEO<Q8_U)]B0W_[?F^V?^;F/YT;.+BHN*__\I_6[D*.-V
XME+PHT?X?/LOSUV6;&\N\W>NO[=L?)_[D>[DWK^MH+X7;KFIE^86C@C^)'CTG
XM'^%G_V:XW[LC7.=/W?;XX[SO?*YKN33K_3^ZCV6[\_]//*X(][9>2[B_U_YX
XM;B2<SU'_L6("O\'DJAWUN_;?T%LP*\C7^-=Q@US^O\-K_@/F=/B.^N/.^W^N
XMR>F@-V@51B@ ^?>YWHB'X1UJ@G?8_VD_@N![U*\:S6)V24D.7?%M_ZS<W-S_
XM<?OA77OF<_GE)_P_FIOKNFQ/K78U?NW<XU?<B> U.?11?]3JM'GZ/Q&\D^5.
XMG\8"U,/UYWDWEGW3N^U.>YU6:M_NX+;YO,,&?/?C+T_SO.D/[[1;8;8'(:+W
XM_AR^T_I=6BJ %\:]-"JW^Y%$V>3NT.W)C 'WM*^0WF8O\?HKSUHA/^XU[HVB
XM=I+:XG<F^'T=7L/7[_&?WX#*G^W^U6V?2X3'0*I1!)]))GCKX+B6ZSG]GHCT
XMSXJQ%E['LA;@'9.JIO:[J7YOIO_=L[]#\)+.P^?K_]H>]'[IN3:)\3F7C]\\
XM]Z9>JTBP\1)Q:9X_!&EC5*[\2^W9?BR?ASD>":LUU&#D] 0]AMMD=-R*.(C:
XMZ[IG!;[H/*[7MXA+N-+](SSGC-@(L#],3$X.S>NQBK4\,LGEIJG"'.MUPWC[
XM?9@G!N:1[ZCWMDC*,,?>5I2WTQKWP_P_0_EXDO(?)3M?)@;EI%_:]F7GZC_<
XM2C:DV&^-8,;\)S _<2AY5CZ6/!Y%' ^'G8C]M\=V0S_O4A'WOQ??(]^W@W4L
XM"V6:;_!#SR?Q;Y#]?+R[]9P)>L>&;VL\Z/N=Y.@]8CLFSEK:-[J?EX<7X(G]
XMU_Q8#,# ;GZ;.YO_4MGNFRV1"7<XL=3Y6*_J<==_H^*5C^LAI%Z]US62_/!0
XM\V7>Y&=-8#DR&!$>*NF^-\.+2&.(W^95?&".9#SD\%Z>ZX2\X#0B5,RNSXOY
XMX!Q.'*GW&"0$?"+A-@29VO.Z_.;]:]#AY2_[/TV[UO[QE[VW;6 FJQ=F*E+:
XM.<" 70<CU2=%R/RI5K>[^BQJ7]+J\IRGX"%PW0@^C7T^%L!3C@?L4"AC7I_-
XM3I7?<-_:4;0!?<"9ZYV:N;'OKP/M>- SZ28(%>+<C^I/+*'IW\N:GUA*&B:N
XM)#6R,<F5XD5Y&"\IPMW65;[S^P_$C5Z0*32[(]*WF4(QWA:B/W*"]'E9TQ*O
XM1E;\#)@4Z?:XF2[!B,O!-4+[>WS^CX*HK9?@(I(%L!1#2\!]"?,.5U@K46B'
XMO%::AH5_7.EX2BNBC%=25SEM>W95'"BJ/^HF]EJ0-L.<L#OW0V.T83!_'#5J
XMYXTZ;@E_-#D4BM TJYO_ UI+/K")TVLF-9_7&SFE'%[E*4V"$9T&U[K#QK6G
XM>HTOC!$6RZ=RA?>[6Y7;YI;7@WSQGTS^)>+_ZW.Y'(Y2BH7]'VVWE#^4G[&T
XM:C6-,!GQ'<1=+BWAW,^NL?#W,9>;NM+$NTX@EN..2/,@V-8\1+51LSSW8/S%
XM[=?U(ERE9ZM=?;;F4[TUM#K(]CQ8F!C(-^G9GK*4L"O@00GO:B.BP;XW:'UL
XMR9D%;N7VW=B/^HKDO,3?]_$;Q-XNS6J_QG5G<5U[^S$-Z;WM[&JG 'T!WLRJ
XMQK.IVS<5=1*C0'P.$;1G/M"Z:(<2'DS 353.F45472_8)=TP.>UN>AM6,&0J
XMJAU^3U#ET:L V0=&O'+IC)VR:T?NEOY.2VZ!AX>CV;'P(.U<T[9=9Y$W]OJ3
XM!ZF(RMO%FIC=H3G-D.J8C0%!=8,(6P]#1B[9@3 V,JUS)'U6YPFQN5P:D'>#
XMD2I7B8YTMR0B2P5WSOUI82F+ETLG:=9*:-O!\4X=+2KJVM,'<\SGR16B?(]/
XM;//K/A7BM-G;A2-^1T@:5$ 003^1:'ABTE4/$-L2D4E0J$,0Z= 1-R]#1_.V
XM 1O#=7X+VF.YB^R+]=>0!B-\%Y?E<T/O*OLPN=0WL8BR H25AP3A->))&0<^
XM!O*BWL@?C4?U#I=]RO)6\9ZH4 \6E[KQ/%5W%.^;G1WYG? J&/AP^Z8J:L ;
XM; 6\(Y @$*HV+, _A@4,[6DCXF-8")9@Q0+S*!;"9G8L3)>%^PC@8UT#,_$8
XM_0K+A1+[[ 9XF,]N(&%.VHFCT?M2,),%<RQ%1GC<S\J%P_RDQ':45E>""X=Y
XMNTDN5V]N84ZB=ETN/]V/@8S82S3EJ,#Q7.SQ-W'$W5#U!:H1*>:=06_XAAXW
XM[@1,):B=9\$4;Z)1%FM(NKO=&K<2VW'CYJ@>B?JTWD[*>,2AR-=KC.@9#T/,
XMY_=:K="2E"Z.38B.,3M]VVW11A =2QZWPU1F0Q,]\+PBOW'CXC:1.8;WQDW'
XM.13\-6YTFT.A/8 L42<3H,>':]J1/V&6,:)C=I,)N(P1G?5'_ @3'4)_Y$\4
XM&]Y.3&V/.H/4MS,8$ET5&TYT:C%6;"S* +2@)IR-11F %M0$M3&B4]*1B6UC
XM1*>D(SFZC449@!;[7&@;\SDE/$[;&-&-6T)TH6V,Z#8N/,>UL2@#XH(F(4YT
XML!3C'-=&$!?TSW%M!'%!_QS71A 7],]Q;01Q0?_L7#<?J7@HI(_;F.*AB+Z_
XMCU!@W1Z-*;B,=.5MK#MJO2VDP[.%&P-6VN8A*=&I<&,&;@$*(WIB: R9F(1]
XM.Y9D\S:6F*2UVIQ=&QMV(_?LCD!MS.?5.Y[EV8B4@3/VUB 9*G*6@8<<ZQR1
XMXZ$2?<<157#54-542JSC862 OQ@EA3GLO \!"13S<8M[C30)VV8T5%R!M.]-
XM&MOU?K9&Y4_#TN#GME<'65=-BD-)9/FJ@2(%[TGSFPK\.,Q2X^2SF3 X<Y1#
XMLKQT9TZMR(O?X8HFD3F>0W?DNCS+O-H=H6CB,B<3NM-UG[?&[<1)[6G<?J?*
XM)I+E3'?84P\AMW\L"/3J7?5-6#[=07A "-9[50Q(E@^$QQ4/%E\JP" =_;+<
XMB@=90J=-N"H>3NW@C -'=[%O0G>,Y93N$/HC=,?T1P5>7!S&>$BX$<9C<*.,
XM![9.2(Y"8Y Z5#[D(.E.#<9T1[!<Z Y.H3$;#9KE,<$@( _>H3%!#<%R@3SP
XMZ]Q<&U+>(MYUB\3Y+#R?SX?3'4[82%8+F4]W9)W96\"'^BXJDC$AZ%X!'^I[
XMJ;!\NH.HWPA'%9:O%\ H'J=O!+6*=+DJ'K2 #_6U51CCP OX4'1'VKO@Z2X"
XM/H+NE,!'X@6PC!<!'\%X2N C&0]2P(?ZT I4/N2@!'PHNL,1;4BZ4P<79B<C
XM\ND"")"G$BY,6,9=SI '4<"'^@X2+)_0@-$=2=@( A^:S\?$#TEWFQ^*[N#D
XM!S,_%-VQ4GU>]7'#123=;2R)S#&ZDQT%-GB'LI=PF1-I#>%&SKW8'6DBLNB1
XM7$GH7ND D]:H=4#0'5MVLIGN4(*BR!S+HCL.U755H'A%D3F"[J2V[67W0^B+
XMN,P)W1'NAX 14K"!U9*RB*"WE*',A")SG.[$FUBY0WH*B?J1]J)9Q.^C?M4T
XM'@AA% BE!=A4/ PD-$:+ .N'>"X?$9MF/U*ASYO:[Z:V0R3LG()8A3EA:Z"Q
XM@E#YH'W5K 7_<6+$Y/:PV\:!]^@?RU[Y_H1-S<G_&O^40&#3#"=-?=_J-Q"\
XMF?BB!_1:<0"Z,+P_].%=C@D(RO*X//?)"S/\B)F@\\'^O8^L[T=L0D"D\+'*
XMXDQ<XD,?',][\MR<K0Y08"VQZMKV1*@7G),@]7<+[Z/!CEM%\*6KWP!",-SU
XMA@ IVWE!N9&PL8&G0'#@#V;L3(CRG;H>)T.J[0G,%99GF%,L+B9\Y!IQ+A'$
XM$N%L<1<6"!.5'*9&.%D?)D14$V1"DWHC=>N@@R1ZZM=:.I]P3B=X,;QPT%X#
XM.SBPL(UP+>$08 J1&\\Q<G/[$M ZR?WEZYCE "L/ ^&PZ( V,A],DY\M@?!.
XMSP2\IF?^8$QW4*KX]SK;Z20WU^TZO%;4Q0*!'+78643R2$KHVD.K T@C86F8
XM @Q<?Q$[(0"$(GJ2MCL"T6%<3 B9*<.71SWJCUH=(B1XJ^6(: [!K D4U!!B
XMUS[9P0D_G$CE U": )+K><OW5KV/1CBP0Y-F\#$U@4MM/L21"H9&&BAME,(5
XMUO/7_*/@AZSL!7'AFE_'>,&]2/HG(( 7Z%NZZA&REZY[#25R(7G@:?5>Z*%3
XM&&&_ZABKP_MKVWVSW&"'A4QL=O:ZE^XC(@!LM/0+X0)B-][Y* 4'/C?.?;WM
XM3O$O.M?KN!;^@ZN9'BZNE^X5<) $0)3P4"6&L0^P6J4XC*@=VI\VZ W\AE<Z
XM.$G7_@XI](QQNA)#L=6SD-AV@+%;S4M1"UO)K@EW.*V[O\=[71QSF,?-9JO#
XMM;SFRQP'&D73ECFXI^1[2\$H'G (%TZ0\:0R@H#KAAEQV2/BQ#%=BY.W>(\[
XM'A5(:__8F?\^'W7 BV#24L(B9EDO$7#Q^&>K6Q?<^@9[\J4@V)AXOO/ NS1,
XM3:G*H9>=/DESOD[GLK86EU$F+TM$;ZLL(P[@">]W(KKL?O%],QV<92GEFTUT
XMCBPMB">P(>=>1?&1\=NUJ/A>P0+<4#L^HJ=>F5.74R(CP@'2:8)YR,I]EBR/
XMK#Q'G<L_H0D0TJ@HZ0Y02P,$"@ & 8 &8I-&Z&[3O/<# 52( !< !!
XM0T-4+TE.0TQ51$4O34547U9!4E,N2&$*>P<&&P:[#$L#"0<+"0L)!Q8'" 8%
XM!@<&!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&" <8"@<*" L'"P0E!"4$
XM"@8$!10%"30'!A<)&BO\_/S[^_L,"RP++ L\"RPKK P!(B,4%38W:(F:VSP%
XM!A(C%.7VEO<Q8_W))"<S_[?F^V?^;F/YT;.+BHN*___);RMB&.-..R]*M/^'
XMS_+\==GFQC)O]_IK^_;'B3_Y7N[MMWO)2?\Z*'[M:=Q\U]%>"K==U<KR"T<%
XM?Q(]>DX^PL_^S7"_=T>XSI^Z[?''>=_Y7-=R:<9\1_>Q;'?^_XG'%>'>UFL)
XM]_?:'\^-A/,YZC]63. 7;@_OVG5<R[4?'+/"4MA)&?U);HR,@O]4)?^/\&S7
XMTSSOC_7K]Y:'_6,9W#%CQ1(X@!45Q_4=G41/3\]7>*/CKJ-G.^[J==OTY[D?
XMC"-HAT>/VXH:1OX?'(U]*^W;L]QUVC5N7(Y>X(_/\W>LWO5W[O7>(O#<2?=6
XMOM:5??]E__-*U3=4?_XO[_6KYO"1NO7+JKZ:H/U?*M?ZU[VVQ#_;C?-<RUI4
XM7-\;<QFH?P"[?IWG"/=+L\1>F>[X:ZGL\_)K]_T)?^7>;MY=W1[HNHY6E[8]
XMPE6_Z\+_61"^VF_N$6Z-Q7@^]N5JL/Q2Z7XVH/P_I)OG7X"Y\ OW%A4W]Z5B
XM>,L=&NG!_R7T4=3#BXK7N<37+]=1_:K#\I'/.LOQE&_)["@Y$>;![S'?W[P5
XMN[8]T%JWJI=KM7Q)^M+</*^&0"S 7A[NW.6K][S-("OIYWV)6XJ*X5K6TMVX
XM:E<C_\=OU[+<QR]ME^J+.<X#K7JLX][08QD.VJ/^>)#<_N-^_T<>=SKC7FOP
XMMG_D02O*[[Q1QQVHW_VM*(/V;W=36D3_M:@'O5$_<3CH175[!LE)_<$[]#O>
XM3?'T[XRB</QQZJ _:(5F_J0,6KVWW4:(]WZO6U3\AO'V6K\=1?%U6;L=EB7U
XM_?W!.+7__A21/^Z%]MM)[V@P[L.]PT'G';6H/N7N]MIOB"8:?IO_A^/D<53[
XME^SFN$2.,FZUN]*_ [K;B?T6VYK2Z2;_?K<MM185)[;??*_?&MN]29TNTS;:
XMD:.\K2AJWVJ/"?ZH->CV8%?UW^IP_/S?>Z/V!U'?WNCE6+I<3ZO;D?J);;%K
XM_A]W!FWSMYO8XGN[H@_B[[VDMW6'[G^&[?@DO1WWG3QV?5+P&TE8.WH (G E
XM=3-';%1$XS6#'TO-/>(:;EWN<F%!,*(Y]%5[D9S#V1SB66P.^BJQ'-RX7M_8
XM#K+C&;^!#JI1ECWXI>%R\'/=Y>!-O1OWNMH<XHX ZR]SB.TZ:KO,_Y_%>N!@
XM]KB7/VXT]OE@\9*7QV;%[?#&?D9<FJ?I(6K4!U\[]_B(DE;#2PR\VJ&K]]+V
XM<$]:-IJGJ/@.#[1^&^LJPA-QNTV-CV D<]:[LMP1FW,M4JAP3S"IBYN]M>+M
XM5MS<\"DI G=<] WH%L9M[1)VMO<JXO8ZUN4Y&O1F[[/NY J((>M?7(QX&H)B
XM]+<JM[Y=*.N9UOB7G^K5^,=<;@J:(UFYGT:%\(QI)";-<%3_-F$XXO!MCSJ.
XMIN;R''HPM+E.;$X3DUJ#Y!??E&SND91>8G+JRWG)\3X>91 U2N1QZ\7Q[X3I
XM<Z/^"41F(FX518O1*G9)Z7>[0ZWC8D^.;N-.WA$M5A^O0!>/D?ZXW8HXZO;[
XMK],5Z(D!=#I*['0(G"-V$OMOQ/:+>$_2@4Y?"GLEMZ$1'9]$AQV>W&ZWF)R!
XMG%^$\<_F:@)T];\ 71U'DMN]I/$HS+?5AA[)=AQ);K=2@7Z_&Q7H>!;0\>30
XMD\*D=6X1'\\$.I+PL&R))@;;NX\L,!SH9P =]WDZHS" CE,U$?S)X]8HRJLX
XM+#K0\2CC=A3!'T7H),L\"= ]2DX2/)XEV5B+\ D1I.%9DHT$>DEKXN.2C44=
XM#7H*\3#4S8'.DHV :%B69&/C, ;#_BMM/<G-S06Z2C:6/.@)'9Z5099XTJCW
XMCCO);S)4< SBD:11BLSC4%@,XI&D4>IX:%VW[:ZX(ZR_FYJ8@G,".Y(T,M-O
XMV9QD0KE8BH[V&[JIO\7(( 7'<]R/'O"45FA);USAHC3'DUN)6E_]9)#"K_T.
XM43YADT%*4I30VN/AT"RLL>V:#%+&PV0TI^-6HLSG3S)(Z7KV,!?V)(,49;]<
XM2J.J;.XDI&MWU%(-QYT@)V%Y$T=CBM8)][!!C^8X^C \I>V1J3S,)Q\VZ+V=
XM3K?#\MF'(?]>F+UNY)Z)<JO;_A/_85[N-!/]82X?8(1_R,06SJB1B]D\.J,$
XMC<E\GFF.06,N/T3[;R]NSD0A\7'+(07K9-S2*MRKR1A$O.5RL;:Q01*"/+DR
XMLUC*XX.DX9LR=I1NM?J2QP=)@YZ,^#L(XY5\7(Y'\?V",WOC,%_^D;GE&Z=_
XM0,1&[8QQ!+,WGH12</O&DX2+P#?N\K[]@8?1N.B-)Q'V'4%AVU2U>>-)&H7I
XM#S.L=CLF5?E$)'7><3M9TE3Y1-+<TE\^X3!W-TSY1+#<*>-!'^;K#TOIC*-R
XM/>S#5%ZM*_LPEW=D^:V6=-U"CH?X7<%"CH=V*7K#QD.D/'G<#I.OD.-AJF4L
XMXY.%>Z1/!]Z[)9=(EH?X8M=(F9> >F<PFN ?*7.2XW^DS$DV7R)E3K+B^C4F
XM\_3>T%M1NDEQ#1N3>5B<$#;&\E!GY!+I\@!SC^NH80-X\T$/R!S(5OWA- ]V
XM5 T9CG.#=1,1PV-=PPR-^SRVV3?TT;"M9D/[/$GJUC [U>=*TKC/PZ:OQ:Z=
XM+C"-^SR=%Y=MORM/XWCS*$K7;FK4N,VY\R;Q7*D:IQM3Y2R:6 ?<YTC#]XL'
XMS.=!S@K$MLDE]3E8O@=80OI\J]JDV#]@-C=*$08?T[E5"M/P,9];I3 7'_.Y
XM50KS\3&?6Z4P$POSN54*D[$PO:E*,8^%X9R:M'U>MD;@35V*<]@:VJ60.78-
XM#5-8CEY#PQ26XZ5BK5%2I]4=]Z-V.P3TDXEX,)^;4CNN!$]DCAB''A<BP&4^
XMR]>E-ZY!@--\$EK#>!'4>TY1-8OP_*1QN^US(0@POK>EZIW4DG;R&0+<YTMU
XM4PWY80C0/!^*%Z(WKD& XWP=_U<H"F,1F4^4I3GS-(+8?=QK\YP:-9*AJZWT
XMA8\PG&N_.QKW]76ECYC/\210RGX/5B-]WLZ;K'>ACTB?4[TWKGP4?C89>KL5
XMUB6NE8/0^;VNW,LZ=3O"RR?@(S1?RZ^:QC*I#FRB3:PW86EU\,-I'C,QZ.3C
XMHA^N\T#UG60?*_"'\SR:3,K<1.:Q]SL:XY+FN96;\#RTA*0,1DQO7Y.OTDV,
XM;CY"$?$+WLY-=!X3=A.36(6B$I% )[QCF8C@FPF9#WEOETAH[BC =91NG^>J
XM$W&?(_L<O\\4849',CBK<4Y\N2),H&S\K2*,K=RU"_?'8/A"V=!"#RU?^$J4
XM&H["8Z"+4L.3NSU@_\X@E58.(AU&]"*ZCP<=6)SC<MAPH8<_&Q?#AAFTU;5I
XMKCP-'QG;=4(;Z(9I&"Q';5Z:AGOV YO2' 89ZPP\V%"= 0*U[4&(O")LK#-0
XMG6%NMH"-&.^O+6*C 0G[CJ!DQI/1 ))3BQ#"PD>B8L-@N;,\H36E]75N:9*E
XM"24B:ID5;EZB37[E62MY%7<2(D6L3QETI*^*+ %O O0(T =HLY(9Z/AX)'AH
XMR1&@1_ PF,:0?[=/E@:Z$#7.\_ >AVH<Y[$]YM6XSI/:[[J>PA:R95BA(C7N
XM=Q3B,#?KE5&(2SJ_@,1V60DC"G&PFU:03RC$.RT&<JA\)13B8C=!$$(AWFF%
XM6**B:/Q7V\90PF /^/!)+@,+H^Y(R*>,1_PDGN12C1 ]XV&(^7S+L(,]T55M
XMA.@8C,F37+X1HF/NJ^+5<83HT8TUHI))KI9'@(X9GFAYA.C,8U"BA\LC1&?!
XM,V!:C8$1_:$/XT$??$STPC6<Z-3R.J%.G.A$8V3BG3C1B<;(Q-C!QPPP Q6,
XMZ+LT%F4 5#"B[](8T:F<1A@=G.@XQNB$T\&)7J""FSJXSW'"XRB-11%TV:>8
XMZ*,T1G3[%$;T41KA4S"B#YX8T7'+RR0'/#&BB\;P20YM(WP*1O1I&TL:)HK1
XM[NNAB:I7T6%@)",=.4% X5*^X'K+MF2C"2( \MSP!2 AB &WSM^O.KUE;I!&
XMRHD1:C#2>'SM]V8(W6"?#&@4Z$E@WT1@RW?VM OUXL-:\'S>!^#9XE>I@%;[
XMT$ FNX"=EW"E6^N,\0H?IP)MZXT* C:N=>'>6.ZEX+>M["7 QC\4/6PPSZ5G
XM%8:1^6BP ^<Q!/Q7KF/1.UDK#H";/4_CQ#L_#5/(Z@+N!_%^_A,/:&$S]@/'
XM!E6Z)U9A+(*Z'L:S%>!"BOY9%3 Z[\IX9-#3 CM02P,$"@ 8 &8I-&YU5
XMS2Y\!0 B0L !8 !!0T-4+TE.0TQ51$4O4$M44TY!4"Y(#0(!$B,4%38W
XM:(F:VSP%!A(31,7VEO=?J@09DR9,F"Q!7BU+%J1-D$_'T@69<V9#!<$;)$B0
XM4)=2G>HT*%272'4L;Z)EQ[(-*S<LW;1OW<X%:?:M7)!!JX*$&W;LVC+ONXWT
XM3DLG>J=U>Z9^)TR@OLOBI5N&?*$WZW6MYG=9N6S?(&^J0Z&^3 I%FQSZ%FZ>
XM^'T63?]&.31%T)TSITP6Q#\3I-B\()V6M9N6+4BA<M_>=<NV;%D6[F5;N'6.
XM#7EE:[IRJ%?TKC*O[3RO<DT'?K\UPW372;J\;C=!M<H7X')D6K-DRYKYFSU?
XM\WG=94$6Q4JUJ%0GSU^6[=PRUF'N=KENN@>R E;'<&KUUZ93B3Z= KW:/"0K
XM-B]_@[RS5=,="Y?K7+ECN<(YWFOINAP+TJ6+H:7=MVG&U_1_X=YVOXX-RY:M
XM3)1UJORS;O3;78W&[;-):M21H+<;N%1U>LSYJJO-#+]*L77-FDVY0UN@K;3K
XML'6__$GNJ%],B#E%L0XK1EEA$3>UP"^X(02AT7X-2Y:LW*TVN^X0#R6/U?]N
XMTJ#GLG3SQ?+><W<$B<JS: \.U.K-V+9EN/UK73QG'M2!)N)*X!BKQFDN\Y67
XM:DL8>S!Z3K%KSZ:)IZ<D*Z.;#.^VV#*GLR*W&ZD.4L[Z.GV*R?IGW]9!_>%\
XM;H])JN= TF9TXGMSQ'>8]"W':X[395"OA+CVX;%^^4+!MIGD0;K%D'NLRRR
XML^?,O9.MV[9MGB,Q_DU&N>*?.XX$3GV? _3G?@&ZVX@;-/@YS/@<*AIUO4:W
XM^DTZA.:XM'4;KFJZ-3?Z9JW)@(%^8[K[([L:"NQ#OJVQRX:IXLA:V+:[N.QV
XMMYHSG!G 4-Q.*Y9K7)4NP\YM(P9"-Z$]IL>1[*KU.DR"L\@YB(FK3I+Q3'@W
XMOQ7(,^Z81RUC -!@21#)#5&%UXI8P2_QQ=IOPU7G18GBF*M,,;V2LS(]Q7R<
XMTB$?UWSH"?Z$_*!/WJG=?A.IC1)O3)9YA#=(/+S4>66,?3C6\'/V]=LYX M[
XM3<?5+RZ:?>04A@'?9-:4'G&U"3/J1KS"4*8GQ!&OF$:E/FTB^L/P=8&^0+%$
XMM2AU*G^G&K7)Y&.I/H%_D#1GR#>2WUC\+M*H6ZJB_B;DF7M8ID6=N#^*_+)%
XM/7+%X'0*W-!AD-@@+LM!8#?,6?K-[F1GH<N@R:9!L:#\2?.8-67:N 5@X$\R
XML--A-'N,6I?2=3)UQZ*YZNY[<B%"ZA/NETCP'9$ $O;"N0W'-T7P.2]MN64K
XMV26^[KNC3KASN,DQY)_S'=-NE<*TGP61O6F=/:V0JDYEOQA6\>P!TF7T"B,_
XM]3UW#?JEC_JZ98Q-QCT_VK0LNN-?RJQIHS]%<:9?)N%]@6)IBU.TKV--H[<O
XMUQ]+9.ZM1IG695D7W95G-YR7N?%/@8PZA+D#&0A2H4B&:+:.;Q<R(K")T4$:
XM4RU2;=-4 '':HDR=![Z9%THT\O^*ED7Q;%/<$E'.Z1_8=URW.2[G/,/?H>PB
XMF&MX [DSW:KD8M/GAHDK7 O)\"&+3=8-2XG?K*4JJ7J8VT2<VB[F(S>=4F!2
XMP&2W4>VP</8:OBYC9M%QF+&!UOR!,C$1-JVZ)0I"S!3'Q'\[A9>SV V7A6;E
XMF(WT-.?FS0HAB.R<=%%@E73QY(_CS\N"94 K;RE#/&DCT]P+S&@6TRE&V7$M
XMX[B<T8GJRCK-J:YG]=HY>6.A#B%YP[2#R&X:CXPI(]9E&BFGF8]38QS)SC*6
XM=AS:!>,6('6;C1S2FX9T\[0>.N53D4Q<":QR:4<QY1:CJ%N$C5(F33:M6>_G
XMO%^$ZYHPV2A_33;+E[Q459>0;WBN#6V. _?GNP%2.JW*E(DXHGE\TM!C8E0#
XM4$L! @H "@ & 8 5 5F%^DAI9T"* 3'P 8 0 @
XM %)%041-15!+ 0(* H !@ & -P$?QB(F%J<\A@ "5 * $
XM( "8H !214%$344N,DY$4$L! @H "@ 8 :W2J%CHH)9A< P 4@4
XM L 0 @ 0$$ $1%5D5,3U N1$]#4$L! @H "@ $ (E92
XM&R^BBI5' 20 D 0 @ Q40 $Q)0B]$54U-65!+ 0(*
XM H & #A-9!>>I0V4T00 'H) / $ ( #-% !)3D-,
XM541%+T)/3U10+DA02P$""@ * !@# 9JH6-LO<BOD" Q!0 $@
XM ! " Q2@ 24Y#3%5$12]#3U!94DE'2"Y(4$L! @H "@ 8 \ECL
XM%AZ#LOM* 0 SP( X 0 @ 6DT $E.0TQ51$4O14Q)0BY(
XM4$L! @H "@ $ 1K=R%C82C_C* $0$ ! 0 @ T$X
XM $E.0TQ51$4O151(1$56+DA02P$""@ * 8 !@"0B4,: J.&2$X, =(@
XM#0 ! " #(3P 24Y#3%5$12]40U N2%!+ 0(* H !@ & P
XM?Q@ 6 \/M \ .$P 0 $ ( $%< !)3D-,541%+U=!5%1#
XM4"Y(4$L! @H "@ 8 PGQ=%1LZY$\V!0 40L !$ 0 @
XM(VP $5,24(O0D%#2T=23D0N05--4$L! @H "@ 8 XFIH%3:3@3AG 0
XM2@( ! 0 @ B'$ $5,24(O1$]33$E35"Y!4TU02P$""@ *
XM !@#"8648L:87U9@" ##! $0 ! " =<P 14Q)0B])
XM3D-(2U-532Y!4TU02P$""@ * !@ =?$$9PGD1BH<! #4 P #@
XM ! " #D=0 14Q)0B])3E1%3"Y!4TU02P$""@ * !@!Y96@5X*\M
XME\ ! !L P #0 ! " "7=P 14Q)0B]+1450+D%335!+ 0(*
XM H & .(^J!; OL#+OP$ /H" . $ ( ()Y !%3$E"
XM+T]55$-(+D%335!+ 0(* H & -VS)!=')UE&$@( $ /
XM $ ( &U[ !%3$E"+T]55$A%6"Y!4TU02P$""@ * !@!1-Z@6GL-_
XM;O\! "T P #0 ! " "L?0 14Q)0B]/5513+D%335!+ 0(*
XM H & %0WJ!8B.:H,+0( $$ . $ ( -9_ !%3$E"
XM+T]55%-.+D%335!+ 0(* H & $V#MA8)$:NE90( ),$ -
XM $ ( "^" !%3$E"+U%#35 N05--4$L! @H "@ 8 $*&=%C5LO52%
XM @ MP0 X 0 @ OX0 $5,24(O44U/5D4N05--4$L! @H
XM"@ 8 ;G>P%,.3*P&8 0 R0( !$ 0 @ <(< $5,24(O
XM4T5-05!(3U(N05--4$L! @H "@ 8 N7!#&!U+&]KV P S@@ !
XM 0 @ -XD $5,24(O4U1224Y'4RY!4TU02P$""@ * !@ 0EWH7
XM4*TVDE\$ ">"@ $ ! " !;C0 14Q)0B]424U%3U54+D%3
XM35!+ 0(* H & !:P6!@NMKMUB ( #<) / $ ( .B1
XM !%3$E"+TU!0U)/4RY(4TU02P$""@ * !@!F7#P."J;H=L !2 0
XM$0 ! " "=E 14Q)0B]-05--1$5&4RY(4TU02P$""@ *
XM 0"'BJ$61Y.N9-, @ 0 #@ ! " ",E0 14Q)0B]-3T1%
XM3"Y(4TU02P$""@ * 0"9:7L56@7A;XT "R #P ! "
XM "+E@ 14Q)0B]/551(15A%4RY#4$L! @H "@ 8 !$5E%63"U[-: 0
XM6 ( L 0 @ 19< $5,24(O44U31RY#4$L! @H "@ 8
XMXUOA&!\RE"%L @ ^0, T 0 @ R)@ $5,24(O34%+149)
XM3$502P$""@ * !@ A9^T8C>1,_R8' #\#@ #@ ! " !?
XMFP 4U)#+T%335!+5"Y!4TU02P$""@ * 0!$:JH6O1.MKW0 "3
XM#@ ! " "QH@ 4U)#+T-/3E-404Y4+D-02P$""@ * !@!S
XMB4L8R!(QIIP! "K P #0 ! " !1HP 4U)#+TY%5$)!0TLN
XM0U!+ 0(* H !@ & !JK0QC3ZR4Q(PL +LC + $ ( !BE
XM !34D,O4$-!4E N0U!+ 0(* H !@ & #QQ0QA0^B"CG0@ '47 -
XM $ ( &2P !34D,O4$-"3T]44"Y#4$L! @H "@ 8 AW9#&EB7
XM/]3P! _PX L 0 @ ++D %-20R]00T)31"Y#4$L! @H
XM"@ 8 &+Q*&.%&8EB* 0 ( 4 L 0 @ 1;X %-20R]0
XM0T)51BY#4$L! @H "@ & 8 W&1/&FL8*=+3"0 Y1D X 0 @
XM ^+\ %-20R]00T-/3D9)1RY#4$L! @H "@ & 8 76-L&+"1*. S"
XM,Q@ P 0 @ ]\D %-20R]00T1"54<N0U!+ 0(* H !@ &
XM %E1C1A&".'R[P@ *(: , $ ( %32 !34D,O4$-)0TU0
XM+D-02P$""@ * !@!G06P7IQ+J1I<" #J!0 # ! " !M
XMVP 4U)#+U!#24Y44BY#4$L! @H "@ 8 33D-%W+XP5@[ P \ 8 P
XM 0 @ +MX %-20R]00U!)3D<N0U!+ 0(* H !@ & .-T0QI1
XMB#1UH@L %TB + $ ( )/A !34D,O4$-02U0N0U!+ 0(*
XM H & #M]6QA@R(_"1@4 .P1 , $ ( %[M !34D,O
XM4$-214-6+D-02P$""@ * !@#A6# 7_&F DG4% !U"P "P !
XM " #.\@ 4U)#+U!#4T5$+D-02P$""@ * !@!+N7H7(!!1RQ$! "3
XM 0 # ! " !L^ 4U)#+U!#4U1!5"Y#4$L! @H "@ & 8
XM?%.7&L68DM*-00 1O( L 0 @ I_D %-20R]00U1#4"Y#
XM4$L! @H "@ 8 0&!M%W8290\4 @ V0, T 0 @ 73L!
XM %-20R]00U]#0E)++D-02P$""@ * !@"LKF48(!/_SJ8! !S P #
XM ! " "</0$ 4U)#+U-%3$5#5"Y#4$L! @H "@ 8 6&JJ%ENN
XMK3I' 0 +@( X 0 @ ;#\! %-20R]33T-+7T1"52Y#4$L!
XM @H "@ 8 R!:[%D%!+&8^ @ >0, X 0 @ WT ! %-2
XM0R]33T-+7TE.22Y#4$L! @H "@ 8 <E?3%H9I:7/L 0 *@0 X
XM 0 @ 24,! %-20R]33T-+7U!23BY#4$L! @H "@ $ EQG5%O!!
XMI]Z+ K@ H 0 @ 844! %-20R]415-4+D-02P$""@ *
XM 8 !@!R@'H7R;M&JIP4 "C- #0 ! " 41@$ 4U)#+U5$
XM4%]$3TTN0U!+ 0(* H & < )1<"CPGM)0( +8# - $
XM( -M: 0!34D,O54107TY$4RY#4$L! @H "@ 8 +$DV&D'(%93' P
XMB D P 0 @ *UT! %-20R]-04M%1DE,15!+ 0(* H &
XM %9P\18:W8@%; 0 .L( - $ ( !QA 0!!4%!3+T-/3TM)
XM12Y#4$L! @H "@ 8 NQ&]%FVT%V*4! :0D X 0 @
XMLV4! $%04%,O1$%95$E-12Y#4$L! @H "@ 8 964M&+7.5-G4! G0D
XM T 0 @ <VH! $%04%,O1DE.1T52+D-02P$""@ * !@"B
XM>.P6L3K_<?@& !4#P "@ ! " !R;P$ 05!04R],4%$N0U!+
XM 0(* H !@ & $>$1AAMTK5:Z0T %4E * $ ( ))V 0!!
XM4%!3+TQ04BY#4$L! @H "@ 8 ,!*]%BQH!3>H!@ ( X P
XM 0 @ HX0! $%04%,O3E1)344N0U!+ 0(* H & $^%:1C>LA=0P 4
XM / . ) $ ( '6+ 0!!4%!3+U!(+D-02P$""@ * !@#V
XM<8@8ZWFR$^L& !8$ "P ! " !<D0$ 05!04R]024Y'+D-0
XM2P$""@ * 8 !@#P;%088UA5@,$' #(%@ #@ ! " !PF $
XM05!04R]03U!$54U0+D-02P$""@ * !@!I-! 7,U-RLB$' !I$ #
XM ! " !=H $ 05!04R]215A%0RY#4$L! @H "@ & 8 )Z]#&$4=
XM%]/," "A< X 0 @ J*<! $%04%,O5$-024Y&3RY#4$L!
XM @H "@ & 8 $0![%XB'TRQ,& '$4 X 0 @ H+ ! $%0
XM4%,O5$-04$]25"Y#4$L! @H "@ 8 E!*]%DLM8]/"!@ ?A$ X
XM 0 @ &,D! $%04%,O5$-05$%,2RY#4$L! @H "@ 8 S8DS&K+*
XMH$Y$ P %0< T 0 @ !M ! $%04%,O34%+149)3$502P$"
XM"@ * 8 !@#5B$T;]^[%@MP1 #\2P "P ! " !UTP$ 4TY-
XM4"]!4TXQ+D-02P$""@ * 8 !@#8B$T;TV<Y:F4, #2*@ "P !
XM " !ZY0$ 4TY-4"]33DU0+D-02P$""@ * 8 !@#9B$T;7/ML=2\6 1
XM20 #P ! " (\@$ 4TY-4"]33DU004=.5"Y#4$L! @H "@
XM 8 VXA-&S4(W*5:!0 8 P \ 0 @ 9 @" %-.35 O4TY-
XM4$%55$@N0U!+ 0(* H & +B K1IQ)O*_:0, ( & - $
XM( .L- @!33DU0+TU!2T5&24Q%4$L! @H "@ 8 NHA-&^3"%#]^!0
XMJPT !, 0 @ ?Q$" %-.35 O24Y#3%5$12]!4TXQ+DA02P$"
XM"@ * !@"[B$T;J0A8IFX! M @ %0 ! " N%P( 4TY-
XM4"])3D-,541%+T%54TY-4"Y(4$L! @H "@ & 8 O(A-&U5:Y9O/#0 *BL
XM !( 0 @ SQ@" %-.35 O24Y#3%5$12]-24(N2%!+ 0(* H
XM & ,*(31O@9B052@0 %D( 3 $ ( ,XF @!33DU0+TE.
XM0TQ51$4O4TY-4"Y(4$L! @H "@ 8 Q8A-&\( (H3U!0 E0H !<
XM 0 @ 22L" %-.35 O24Y#3%5$12]33DU024U03"Y(4$L! @H "@
XM 8 )XI-&U1 'F"?!P 01$ P 0 @ <S$" $%#0U0O0TA!
XM4E0N0U!+ 0(* H !@ & "B*31O3%TF/ "D ."; / $ (
XM #PY @!!0T-4+T9,3U=(05-(+D-02P$""@ * 8 !@ HBDT;@\@_1C(H !H
XMU0 #P ! " !I8@( 04-#5"]-151?5D%24RY#4$L! @H "@ &
XM 8 *8I-&Q1[8_,R$@ "C \ 0 @ R(H" $%#0U0O3454
XM15)?4$,N0U!+ 0(* H !@ & "J*31O^W?2%0!( .0N / $
XM( ">= @!!0T-4+TU%5$527U58+D-02P$""@ * !@ XBDT;5=\4'L\#
XM !C!P #0 ! " "4KP( 04-#5"]-04M%1DE,15!+ 0(* H
XM & /Q64AM7=@CHK0$ -L" / $ ( (ZS @!!0T-4+U=!
XM5%1#4"Y#1D=02P$""@ * !@ 7BDT;ST(;[C<" #-!P %0 !
XM " !HM0( 04-#5"])3D-,541%+T1%0TY%5"Y(4$L! @H "@ & 8 &(I-
XM&PN9U/ "#@ URP !< 0 @ TK<" $%#0U0O24Y#3%5$12]&
XM3$]72$%32"Y(4$L! @H "@ & 8 &8I-&Z&[3O/<# 52( !<
XM 0 @ "<8" $%#0U0O24Y#3%5$12]-151?5D%24RY(4$L! @H "@ 8
XM&8I-&YU5S2Y\!0 B0L !8 0 @ &M," $%#0U0O24Y#3%5$
XA12]02U133D%0+DA02P4& %L 6P!0%0 RM@"
X
Xend
END_OF_FILE
if test 41468 -ne `wc -c <'netramet/pc/NTM.Zip.UU.E'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU.E'\" unpacked with wrong size!


else
PARTS=""
for I in A B C D E ; do
if test -f netramet/pc/NTM.Zip.UU.$I ; then
PARTS="${PARTS}${I}"
fi
if test "${PARTS}" = "ABCDE" ; then
echo shar: Combining \"'netramet/pc/NTM.Zip.UU'\" \(264641 characters\)
cat netramet/pc/NTM.Zip.UU.[A-E] > 'netramet/pc/NTM.Zip.UU'
if test 264641 -ne `wc -c <'netramet/pc/NTM.Zip.UU'`; then
echo shar: \"'netramet/pc/NTM.Zip.UU'\" combined with wrong size!
else
rm netramet/pc/NTM.Zip.UU.[A-E]
echo shar: Uudecoding \"'netramet/pc/NTM.Zip'\" \(192048 characters\)
cat netramet/pc/NTM.Zip.UU | uudecode
if test 192048 -ne `wc -c <'netramet/pc/NeTraMet.zip'`; then
echo shar: \"'netramet/pc/NTM.Zip'\" uudecoded with wrong size!
else
rm netramet/pc/NTM.Zip.UU
fi
fi
fi
done
fi

# end of 'netramet/pc/NTM.Zip.UU.E'
fi
if test -f 'netramet/src/snmplib/asn1.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/asn1.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/asn1.c'\" \(18859 characters\)
sed "s/^X//" >'netramet/src/snmplib/asn1.c' <<'END_OF_FILE'
X/*
X * Abstract Syntax Notation One, ASN.1
X * As defined in ISO/IS 8824 and ISO/IS 8825
X * This implements a subset of the above International Standards that
X * is sufficient to implement SNMP.
X *
X * Encodes abstract data types into a machine independent stream of bytes.


X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X
X#define noTESTING
X
X#include "ausnmp.h"
X
X#ifdef KINETICS
X#include "gw.h"

X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>

X#endif
X
X#include "asn1.h"


X
X#ifndef NULL
X#define NULL 0
X#endif

X#define ERROR(x)
X
X/*
X * asn_parse_int - pulls a long out of an ASN int type.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the end of this object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_int(data, datalength, type, intp, intsize)
X register u_char *data; /* IN - pointer to start of object */
X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */
X u_char *type; /* OUT - asn type of object */
X long *intp; /* IN/OUT - pointer to start of output buffer */
X int intsize; /* IN - size of output buffer */
X{
X/*
X * ASN.1 integer ::= 0x02 asnlength byte {byte}*
X */
X register u_char *bufp = data;
X u_long asn_length;
X register long value = 0;
X
X if (intsize != sizeof (long)){
X ERROR("not long");
X return NULL;
X }
X *type = *bufp++;
X bufp = asn_parse_length(bufp, &asn_length);
X if (bufp == NULL){
X ERROR("bad length");
X return NULL;
X }
X if (asn_length + (bufp - data) > *datalength){
X ERROR("overflow of message");
X return NULL;
X }
X if (asn_length > intsize){
X ERROR("I don't support such large integers");
X return NULL;
X }
X *datalength -= (int)asn_length + (bufp - data);
X if (*bufp & 0x80)
X value = -1; /* integer is negative */
X while(asn_length--)
X value = (value << 8) | *bufp++;
X *intp = value;
X return bufp;
X}
X
X
X/*
X * asn_build_int - builds an ASN object containing an integer.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the end of this object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_build_int(
X u_char *data, /* IN - pointer to start of output buffer */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X u_char type, /* IN - asn type of object */
X long far *intp, /* IN - pointer to start of long integer */
X int intsize) /* IN - size of *intp */
X{
X/*
X * ASN.1 integer ::= 0x02 asnlength byte {byte}*
X */
X
X register long integer;
X register u_long mask;
X int i; char c; /* AU: Handle 1- and 2-byte integers */
X
X#ifdef OLDWAY
X if (intsize != sizeof (long))
X return NULL;
X integer = *intp;
X#endif
X if (intsize == sizeof (long)) integer = *intp;
X else if (intsize == sizeof(int)) {
X i = *((int far *)intp); integer = (long)i;
X }
X else if (intsize == sizeof(char)) {
X c = *((char far *)intp); integer = (long)c;
X }
X else return NULL;
X#ifdef TESTING
X scpos(0,24);
X printf("build_int(): type=%d, size=%d, integer=%lu\n",
X type,intsize, integer);
X#endif
X intsize = sizeof(long);
X /*
X * Truncate "unnecessary" bytes off of the most significant end of this 2's complement integer.
X * There should be no sequence of 9 consecutive 1's or 0's at the most significant end of the
X * integer.
X */
X mask = 0x1FFL << ((8 * (sizeof(long) - 1)) - 1); /* AU: L constant */
X /* mask is 0xFF800000 on a big-endian machine */
X while((((integer & mask) == 0) || ((integer & mask) == mask)) && intsize > 1){
X intsize--;
X integer <<= 8;
X }
X data = asn_build_header(data, datalength, type, intsize);


X if (data == NULL)

X return NULL;
X if (*datalength < intsize)
X return NULL;
X *datalength -= intsize;
X mask = 0xFFL << (8 * (sizeof(long) - 1)); /* AU: L constant */
X /* mask is 0xFF000000 on a big-endian machine */
X while(intsize--){
X *data++ = (u_char)((integer & mask) >> (8 * (sizeof(long) - 1)));
X integer <<= 8;
X }
X return data;
X}
X
X
X/*
X * asn_parse_string - pulls an octet string out of an ASN octet string type.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * "string" is filled with the octet string.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_string(data, datalength, type, string, strlength)
X u_char *data; /* IN - pointer to start of object */
X register int *datalength; /* IN/OUT - number of valid bytes left in buffer */
X u_char *type; /* OUT - asn type of object */
X u_char *string; /* IN/OUT - pointer to start of output buffer */
X register int *strlength; /* IN/OUT - size of output buffer */
X{
X/*
X * ASN.1 octet string ::= primstring | cmpdstring
X * primstring ::= 0x04 asnlength byte {byte}*
X * cmpdstring ::= 0x24 asnlength string {string}*
X * This doesn't yet support the compound string.
X */
X register u_char *bufp = data;
X u_long asn_length;
X
X *type = *bufp++;
X bufp = asn_parse_length(bufp, &asn_length);
X if (bufp == NULL)
X return NULL;
X if (asn_length + (bufp - data) > *datalength){
X ERROR("overflow of message");
X return NULL;
X }
X if (asn_length > *strlength){
X ERROR("I don't support such long strings");
X return NULL;
X }
X bcopy((char far *)bufp, (char far *)string, (int)asn_length);
X *strlength = (int)asn_length;
X *datalength -= (int)asn_length + (bufp - data);
X return bufp + asn_length;
X}
X
X
X/*
X * asn_build_string - Builds an ASN octet string object containing the input string.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_build_string(
X u_char *data, /* IN - pointer to start of object */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X u_char type, /* IN - ASN type of string */
X u_char far *string, /* IN - pointer to start of input buffer */
X int strlength) /* IN - size of input buffer */
X{
X/*
X * ASN.1 octet string ::= primstring | cmpdstring
X * primstring ::= 0x04 asnlength byte {byte}*
X * cmpdstring ::= 0x24 asnlength string {string}*
X * This code will never send a compound string.
X */
X data = asn_build_header(data, datalength, type, strlength);


X if (data == NULL)

X return NULL;
X if (*datalength < strlength)
X return NULL;
X bcopy((char far *)string, (char far *)data, strlength);
X *datalength -= strlength;
X return data + strlength;
X}
X
X
X/*
X * asn_parse_header - interprets the ID and length of the current object.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * in this object following the id and length.
X *
X * Returns a pointer to the first byte of the contents of this object.
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_header(data, datalength, type)
X u_char *data; /* IN - pointer to start of object */
X int *datalength;/* IN/OUT - number of valid bytes left in buffer */
X u_char *type; /* OUT - ASN type of object */
X{
X register u_char *bufp = data;
X register header_len;
X u_long asn_length;
X
X /* this only works on data types < 30, i.e. no extension octets */
X if (IS_EXTENSION_ID(*bufp)){
X ERROR("can't process ID >= 30");
X return NULL;
X }
X *type = *bufp;
X bufp = asn_parse_length(bufp + 1, &asn_length);
X if (bufp == NULL)
X return NULL;
X header_len = bufp - data;
X if (header_len + asn_length > *datalength){
X ERROR("asn length too long");
X return NULL;
X }
X *datalength = (int)asn_length;
X return bufp;
X}
X
X/*
X * asn_build_header - builds an ASN header for an object with the ID and
X * length specified.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * in this object following the id and length.
X *
X * This only works on data types < 30, i.e. no extension octets.
X * The maximum length is 0xFFFF;
X *
X * Returns a pointer to the first byte of the contents of this object.
X * Returns NULL on any error.
X */
Xu_char *
Xasn_build_header(
X u_char *data, /* IN - pointer to start of object */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X u_char type, /* IN - ASN type of object */
X int length) /* IN - length of object */
X{
X if (*datalength < 1)
X return NULL;
X *data++ = type;
X (*datalength)--;
X return asn_build_length(data, datalength, length);
X
X}
X
X/*
X * asn_parse_length - interprets the length of the current object.
X * On exit, length contains the value of this length field.
X *
X * Returns a pointer to the first byte after this length
X * field (aka: the start of the data field).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_length(data, length)
X u_char *data; /* IN - pointer to start of length field */
X u_long *length; /* OUT - value of length field */
X{
X register u_char lengthbyte = *data;
X#ifdef AU_MSDOS
X u_char k, *dp; long v;
X#endif
X
X if (lengthbyte & ASN_LONG_LEN){
X lengthbyte &= ~ASN_LONG_LEN; /* turn MSb off */
X if (lengthbyte == 0){
X ERROR("We don't support indefinite lengths");
X return NULL;
X }
X if (lengthbyte > sizeof(long)){
X ERROR("we can't support data lengths that long");
X return NULL;
X }
X#ifdef AU_MSDOS
X v = 0; dp = data+1;
X for (k = lengthbyte; k != 0; --k) v = v << 8 | *dp++;
X *length = v;
X#else
X bcopy((char far *)data + 1, (char far *)length, (int)lengthbyte);
X *length = ntohl(*length);
X *length >>= (8 * ((sizeof *length) - lengthbyte));
X#endif
X return data + lengthbyte + 1;
X } else { /* short asnlength */
X *length = (long)lengthbyte;
X return data + 1;


X }
X}
X
Xu_char *

Xasn_build_length(
X u_char *data, /* IN - pointer to start of object */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X int length) /* IN - length of object */
X{
X u_char *start_data = data;
X
X /* no indefinite lengths sent */
X if (length < 0x80){
X *data++ = (u_char)length;
X } else if (length <= 0xFF){
X *data++ = (u_char)(0x01 | ASN_LONG_LEN);
X *data++ = (u_char)length;
X } else { /* 0xFF < length <= 0xFFFF */
X *data++ = (u_char)(0x02 | ASN_LONG_LEN);
X *data++ = (u_char)((length >> 8) & 0xFF);
X *data++ = (u_char)(length & 0xFF);
X }
X if (*datalength < (data - start_data)){
X ERROR("build_length");
X return NULL;
X }
X *datalength -= (data - start_data);
X return data;
X
X}
X
X/*
X * asn_parse_objid - pulls an object indentifier out of an ASN object identifier type.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * "objid" is filled with the object identifier.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_objid(data, datalength, type, objid, objidlength)
X u_char *data; /* IN - pointer to start of object */
X int *datalength; /* IN/OUT - number of valid bytes left in buffer */
X u_char *type; /* OUT - ASN type of object */
X oid *objid; /* IN/OUT - pointer to start of output buffer */
X int *objidlength; /* IN/OUT - number of sub-id's in objid */
X{
X/*
X * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}*
X * subidentifier ::= {leadingbyte}* lastbyte
X * leadingbyte ::= 1 7bitvalue
X * lastbyte ::= 0 7bitvalue
X */
X register u_char *bufp = data;
X register oid *oidp = objid + 1;
X register u_long subidentifier;
X register long length;
X u_long asn_length;
X
X *type = *bufp++;
X bufp = asn_parse_length(bufp, &asn_length);
X if (bufp == NULL)
X return NULL;
X if (asn_length + (bufp - data) > *datalength){
X ERROR("overflow of message");
X return NULL;
X }
X *datalength -= (int)asn_length + (bufp - data);
X
X length = asn_length;
X (*objidlength)--; /* account for expansion of first byte */
X while (length > 0 && (*objidlength)-- > 0){
X subidentifier = 0;
X do { /* shift and add in low order 7 bits */
X subidentifier = (subidentifier << 7) + (*(u_char *)bufp & ~ASN_BIT8);
X length--;
X } while (*(u_char *)bufp++ & ASN_BIT8); /* last byte has high bit clear */
X if (subidentifier > (u_long)MAX_SUBID){
X ERROR("subidentifier too long");
X return NULL;
X }
X *oidp++ = (oid)subidentifier;
X }
X
X /*
X * The first two subidentifiers are encoded into the first component
X * with the value (X * 40) + Y, where:
X * X is the value of the first subidentifier.
X * Y is the value of the second subidentifier.
X */
X subidentifier = (u_long)objid[1];
X objid[1] = (u_char)(subidentifier % 40);
X objid[0] = (u_char)((subidentifier - objid[1]) / 40);
X
X *objidlength = (int)(oidp - objid);
X return bufp;
X}
X
X/*
X * asn_build_objid - Builds an ASN object identifier object containing the input string.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_build_objid(
X u_char *data, /* IN - pointer to start of object */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X u_char type, /* IN - ASN type of object */
X oid far *objid, /* IN - pointer to start of input buffer */
X int objidlength) /* IN - number of sub-id's in objid */
X{
X/*
X * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}*
X * subidentifier ::= {leadingbyte}* lastbyte
X * leadingbyte ::= 1 7bitvalue
X * lastbyte ::= 0 7bitvalue
X */
X u_char buf[MAX_OID_LEN];
X u_char *bp = buf;
X oid objbuf[MAX_OID_LEN];
X oid *op = objbuf;
X register int asnlength;
X register u_long subid, mask, testmask;
X register int bits, testbits;
X
X bcopy((char far *)objid, (char far *)objbuf, objidlength * sizeof(oid));
X /* transform size in bytes to size in subid's */
X /* encode the first two components into the first subidentifier */
X op[1] = op[1] + (op[0] * 40);
X op++;
X objidlength--;
X
X while(objidlength-- > 0){
X subid = *op++;
X mask = 0x7F; /* handle subid == 0 case */
X bits = 0;
X /* testmask *MUST* !!!! be of an unsigned type */
X for(testmask = 0x7F, testbits = 0; testmask != 0; testmask <<= 7, testbits += 7){
X if (subid & testmask){ /* if any bits set */
X mask = testmask;
X bits = testbits;
X }
X }
X /* mask can't be zero here */
X for(;mask != 0x7F; mask >>= 7, bits -= 7){
X if (mask == 0x1E00000) /* fix a mask that got truncated above */
X mask = 0xFE00000;
X *bp++ = (u_char)(((subid & mask) >> bits) | ASN_BIT8);
X }
X *bp++ = (u_char)(subid & mask);
X }
X asnlength = bp - buf;
X data = asn_build_header(data, datalength, type, asnlength);


X if (data == NULL)

X return NULL;
X if (*datalength < asnlength)
X return NULL;
X bcopy((char far *)buf, (char far *)data, asnlength);
X *datalength -= asnlength;
X return data + asnlength;
X}
X
X/*
X * asn_parse_null - Interprets an ASN null type.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_parse_null(data, datalength, type)
X u_char *data; /* IN - pointer to start of object */
X int *datalength; /* IN/OUT - number of valid bytes left in buffer */
X u_char *type; /* OUT - ASN type of object */
X{
X/*
X * ASN.1 null ::= 0x05 0x00
X */
X register u_char *bufp = data;
X u_long asn_length;
X
X *type = *bufp++;
X bufp = asn_parse_length(bufp, &asn_length);
X if (bufp == NULL)
X return NULL;
X if (asn_length != 0){
X ERROR("Malformed NULL");
X return NULL;
X }
X *datalength -= (bufp - data);
X return bufp + asn_length;
X}
X
X
X/*
X * asn_build_null - Builds an ASN null object.
X * On entry, datalength is input as the number of valid bytes following
X * "data". On exit, it is returned as the number of valid bytes
X * following the beginning of the next object.
X *
X * Returns a pointer to the first byte past the end
X * of this object (i.e. the start of the next object).
X * Returns NULL on any error.
X */
Xu_char *
Xasn_build_null(
X u_char *data, /* IN - pointer to start of object */
X int *datalength, /* IN/OUT - number of valid bytes left in buffer */
X u_char type) /* IN - ASN type of object */
X{
X/*
X * ASN.1 null ::= 0x05 0x00
X */
X return asn_build_header(data, datalength, type, 0);
X}
X
END_OF_FILE
if test 18859 -ne `wc -c <'netramet/src/snmplib/asn1.c'`; then
echo shar: \"'netramet/src/snmplib/asn1.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/asn1.c'
fi
if test -f 'netramet/sun/manager/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sun/manager/Makefile'\"
else
echo shar: Extracting \"'netramet/sun/manager/Makefile'\" \(1097 characters\)
sed "s/^X//" >'netramet/sun/manager/Makefile' <<'END_OF_FILE'
X#
X# Makefile for snmpget, manager, snmpgetnext, collect, snmpwalk, snmpstatus, snmptest snmptrap snmptrapd snmpd
X#
X
XSRC= ../../src/manager
XSINCLUDE= ../../src/snmplib/include
XNINCLUDE= ../../src/manager/include
X
XSNMPH = $(SINCLUDE)/asn1.h $(SINCLUDE)/mib.h $(SINCLUDE)/parse.h \
X $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/snmpclnt.h $(SINCLUDE)/snmpimpl.h
X
XTARG= NeMaC
X
XLIBS= ../snmplib/libsnmp.a
X
XCC= acc # Sun ANSI C compiler
XCFLAGS= -g -I$(NINCLUDE) -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT -DSUNOS
X
X
Xall: $(TARG)
X
X
Xgwmon.o: $(SNMPH) $(SRC)/gwmon.c
X ${CC} $(CFLAGS) -c $(SRC)/gwmon.c
X
Xgwmon: gwmon.o ${LIBS}
X ${CC} -o $@ gwmon.o ${LIBS}
X
X
Xnmc.o: $(SNMPH) $(SRC)/nmc.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc.c
X
Xnmc_pars.o: $(SNMPH) $(SRC)/nmc_pars.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc_pars.c
X
Xnmc_snmp.o: $(SNMPH) $(SRC)/nmc_snmp.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc_snmp.c
X
XNeMaC: nmc.o nmc_pars.o nmc_snmp.o ${LIBS}
X ${CC} -o $@ nmc.o nmc_pars.o nmc_snmp.o ${LIBS}
X
X
Xgwtraffic:
X ${CC} ${CFLAGS} -o $@ $(SRC)/gwtraffic.c ${LIBS}
X
Xclean:
X rm -f *.o ${TARG}
X
Xinstall:
X cp ${TARG} ../bin
END_OF_FILE
if test 1097 -ne `wc -c <'netramet/sun/manager/Makefile'`; then
echo shar: \"'netramet/sun/manager/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sun/manager/Makefile'
fi
echo shar: End of archive 16 \(of 25\).
cp /dev/null ark16isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:13:24 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 105
Archive-name: netramet/part17
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/meter/flowhash.c netramet/src/snmplib/parse.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:10 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 17 (of 25)."'
if test -f 'netramet/src/meter/flowhash.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/flowhash.c'\"
else
echo shar: Extracting \"'netramet/src/meter/flowhash.c'\" \(38647 characters\)
sed "s/^X//" >'netramet/src/meter/flowhash.c' <<'END_OF_FILE'
X/* 1807, Mon 4 Oct 93
X
X FLOWHASH.C: AU Meter, using hash tables for tallies


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X#define DEBUG /* Required if any of the following are set */
X
X#define STACK_CHECK
X#define noGC_DEBUG
X#define noTESTING
X#define noGC_TEST1
X#define noGC_TEST
X#define noH_TEST
X
X#define noDECNET
X
X#include <stdio.h>


X
X#ifdef AU_MSDOS
X#include <alloc.h>

X#include <mem.h>
X#ifdef DEBUG
X#include <dos.h>
X#endif
X#endif
X
X#include "ausnmp.h"
X
X#ifdef SUNOS
X#include <sys/types.h>
X#include <malloc.h>
X#include <string.h>
X#endif
X
X#include "pktsnap.h"
X
X#define EXTFLOW
X#include "flowhash.h"
X#include "decnet.h"
X
X#ifdef DEBUG
Xvoid paddr(unsigned char far *a);
Xvoid daddr(unsigned char far *a);
Xvoid pkey(char *msg,struct flow far *n);
X#endif
X
XFILE *log;
X
X#define FBLKSZ 425
X
Xstruct flow far *fl INIT(NULL);
Xstruct flow far *fa; int nf_flows INIT(0);
X
Xstruct flow far *get_flow(void) /* Get an unused flow */
X{
X struct flow far *q;
X if (fl != NULL) {
X q = fl; fl = fl->link.next;
X }
X else {
X if (nf_flows == 0) {
X fa = (struct flow far *)farmalloc(sizeof(struct flow)*FBLKSZ);
X if (fa == NULL) {
X scpos(0,24); printf("No memory for new flows!");
X return NULL;
X }
X nf_flows = FBLKSZ-1;
X }
X else {
X ++fa; --nf_flows;
X }
X#ifdef GC_DEBUG
Xscpos(0,24); printf("\nfa=%Fp, nff=%d, empty_ix=%u\n",fa,nf_flows,empty_ix);
X#endif
X q = fa;
X }
X return q;
X }
X
Xvoid free_flow(struct flow far *q) /* Return a flow to free list */
X{
X#ifdef GC_DEBUG
Xscpos(0,24); printf("\nfree_flow(%Fp), empty_ix=%u\n", q,empty_ix);
X#endif
X q->link.next = fl;
X fl = q;
X }
X
X#ifdef DEBUG
Xint log_nbr = 1;
X
Xvoid open_log()
X{
X char fn[30];
X sprintf(fn,"flows.%03d",log_nbr++);
X log = fopen(fn, "w");
X }
X
Xvoid paddr(a)
Xunsigned char far *a;
X{
X fprintf(log,"%u.%u.%u.%u", a[0],a[1],a[2],a[3]);
X }
X
Xvoid daddr(a)
Xunsigned char far *a;
X{
X/* printf("%u.%u.%u.%u", a[0],a[1],a[2],a[3]); @@@ */
X printf("%02x-%02x-%02x-%02x-%02x-%02x", a[0],a[1],a[2],a[3],a[4],a[5]);
X }
X
Xvoid pkey(msg,f)
Xchar *msg;
Xstruct flow far *f;
X{
X if (!log) open_log();
X fprintf(log,"%s: %Fp %u %u\n {", msg,f, f->FlowType,f->PeerAddrType);
X paddr(f->Low.PeerAddress); fprintf(log," & ");
X paddr(f->Low.PeerMask); fprintf(log,"} -> {");
X paddr(f->High.PeerAddress); fprintf(log," & ");
X paddr(f->High.PeerMask); fprintf(log,"}\n");
X }
X#endif
X
X#define DRT_SIZE 5
Xstruct rule default_rule_table[DRT_SIZE] = {
X/* Selector, Mask, Value, Action, JumpIndex */
X {FTLOWPEERTYPE, 255,0,0,0,0,0, AT_IP,0,0,0,0,0, RA_AGGREGATE, 1}, /* 1 */
X {FTLOWPEERTYPE, 255,0,0,0,0,0, AT_NOVELL,0,0,0,0,0, RA_AGGREGATE, 2}, /* 2 */
X {FTLOWPEERTYPE, 255,0,0,0,0,0, AT_DECNET,0,0,0,0,0, RA_AGGREGATE, 3}, /* 3 */
X {FTLOWPEERTYPE, 255,0,0,0,0,0, AT_ETHERTALK,0,0,0,0,0, RA_AGGREGATE, 4}, /* 4 */
X {FTLOWPEERADDRESS, 0,0,0,0,0,0, 0,0,0,0,0,0, RA_SUCCEED, 0} };
X
X#define DAT_SIZE 4
Xstruct flow default_action_table[DAT_SIZE] = {
X {NULL, 0L,0L,0L,0L, 0L,0L, 1,FT_AGGREGATE, AT_IP,255, 0,0, /* 1 */
X {0,0,0,0,0,0, 0,0,0,0,0,0, 11,12,0,0, 255,255,0,0, 0,0, 0,0},
X {0,0,0,0,0,0, 0,0,0,0,0,0, 13,14,0,0, 255,255,0,0, 0,0, 0,0} },
X {NULL, 0L,0L,0L,0L, 0L,0L, 1,FT_AGGREGATE, AT_NOVELL,255, 0,0, /* 2 */
X {0,0,0,0,0,0, 0,0,0,0,0,0, 21,22,0,0, 255,255,0,0, 0,0, 0,0},
X {0,0,0,0,0,0, 0,0,0,0,0,0, 23,24,0,0, 255,255,0,0, 0,0, 0,0} },
X {NULL, 0L,0L,0L,0L, 0L,0L, 1,FT_AGGREGATE, AT_DECNET,255, 0,0, /* 3 */
X {0,0,0,0,0,0, 0,0,0,0,0,0, 31,32,0,0, 255,255,0,0, 0,0, 0,0},
X {0,0,0,0,0,0, 0,0,0,0,0,0, 33,34,0,0, 255,255,0,0, 0,0, 0,0} },
X {NULL, 0L,0L,0L,0L, 0L,0L, 1,FT_AGGREGATE, AT_ETHERTALK,255, 0,0, /* 4 */
X {0,0,0,0,0,0, 0,0,0,0,0,0, 41,42,0,0, 255,255,0,0, 0,0, 0,0},
X {0,0,0,0,0,0, 0,0,0,0,0,0, 43,34,0,0, 255,255,0,0, 0,0, 0,0} } };


X
Xvoid init_flow(struct flow far *f, unsigned char type)

X{
X f->UpOctets = f->UpPDUs = f->DownOctets = f->DownPDUs = f->LastTime = 0L;
X f->FirstTime = s_uptime; /* Initialise flow */
X f->FlowType = type; f->FlowRuleSet = CurrentRuleSet;
X f->link.next = NULL;
X }
X
Xvoid optimise_rule_table()
X{
X unsigned int j, k, g, h, x, l,
X nht, /* Nbr of rule_hash_tbls */
X ths, /* Sum of rule_hash_tbl sizes */
X rhss; /* Total rule_hash sequence size */
X struct rule far *rp, far *hp;
X struct rule_hash_tbl far *c_rh;
X unsigned char hash;
X
X hp = &c_rt[0]; hp->hash_tbl_index = 1;
X for (j = 1; j != c_rsz; ++j) { /* Mark match break points */
X rp = &c_rt[j];
X rp->hash_tbl_index = rp->RuleSelector != hp->RuleSelector ||
X qcmp(rp->RuleMask,hp->RuleMask,RULE_ADDR_LEN) != 0;
X hp = rp;
X }
X for (j = 0; j != c_rsz; ++j) { /* Mark goto break points */
X rp = &c_rt[j]; rp->hash_link = 0;
X k = rp->RuleAction;
X if (k == RA_PUSHTO || k == RA_POPTO || k == RA_GOTO) {
X hp = &c_rt[rp->RuleJumpIndex-1];
X hp->hash_tbl_index = 2;
X }
X }
X#ifdef H_TEST
X scpos(0,24); printf("rule index link MARKED\n");
X for (j = 0; j != c_rsz; ++j) {
X rp = &c_rt[j];
X printf("%3d %5d %5d\n", j, rp->hash_tbl_index,rp->hash_link);
X }
X#endif
X nht = ths = 0;
X hp = &c_rt[0]; k = 1;
X for (j = 1; j != c_rsz; ++j) { /* Find compare groups */
X rp = &c_rt[j];
X if ((g = rp->hash_tbl_index) == 0) ++k; /* Same group */
X if (g != 0 || j == c_rsz-1) { /* End of a group */
X if (k >= MNCGRPSZ && hp->RuleSelector != RS_NULL) {
X for (h = 2; h <= k; h <<= 1) ; /* h = next power of 2 */
X if (h > 256) h = 256;
X hp->hash_tbl_index = k; /* Remember group and */
X hp->hash_link = h; /* hash table sizes */
X ++nht; ths += h;
X }
X else hp->hash_tbl_index = 0;
X hp = rp; k = 1;
X }
X rp->hash_tbl_index = 0; /* Last row can't start a group */
X }
X rhss = 1 + nht*2 + ths; /* rule_hash set size (ints) */
X if (rh_size < rhss) rule_hash =
X (int far *)farmalloc(sizeof(int)*(rh_size = rhss));
X#ifdef H_TEST
X printf("rule index link GROUPED\n");
X for (j = 0; j != c_rsz; ++j) {
X rp = &c_rt[j];
X printf("%3d %5d %5d\n", j, rp->hash_tbl_index,rp->hash_link);
X }
X#endif
X rule_hash[0] = 0; k = 1; rp = &c_rt[j = 0];
X for ( ; nht != 0; --nht, k += 2+h) {
X c_rh = (struct rule_hash_tbl far *)&rule_hash[k];
X while (rp->hash_tbl_index == 0) {
X ++rp; ++j;
X }
X g = rp->hash_tbl_index; /* Group size */
X h = rp->hash_link; /* Hash table size */
X rp->hash_tbl_index = k; /* Index of hash_tbl in rule_hash */
X rp->hash_link = 0;
X c_rh->group_last = j+g;
X c_rh->hash_mask = h-1;
X for (x = 0; x != h; ++x) c_rh->hash_ent[x] = 0;
X for ( ; g != 0; --g) {
X for (hash = x = 0; x != RULE_ADDR_LEN; ++x)
X hash += rp->RuleMatchedValue[x] & rp->RuleMask[x];
X hash &= h-1;
X if ((l = c_rh->hash_ent[hash]) == 0)
X c_rh->hash_ent[hash] = j+1; /* First rule with this hash */
X else {
X do {
X hp = &c_rt[l-1]; l = hp->hash_link;
X } while (l != 0);
X hp->hash_link = j+1; /* Add to end of hash chain */
X }
X ++rp; ++j;
X }
X }
X#ifdef H_TEST
X printf("rule index link HASHED\n");
X for (j = 0; j != c_rsz; ++j) {
X rp = &c_rt[j];
X printf("%3d %5d %5d\n", j, rp->hash_tbl_index,rp->hash_link);
X }
X printf("rule_hash . . .\n");
X for (j = 0; j != rhss; ++j) printf("%d ",rule_hash[j]);


X printf("\n");
X#endif
X }

X
Xint open_rule_set(unsigned char doSet, unsigned char n)

X{
X unsigned int j;
X struct rule far *rp;
X if (rt_size[n-1] == 0) return 0; /* Incomplete tables */
X if (doSet) {
X c_rt = rule_table[n-1]; c_rsz = rt_size[n-1];
X for (j = 0; j != c_rsz; ++j) {
X rp = &c_rt[j];
X if (rp->RuleAction == RA_COUNT) rp->RuleJumpIndex = 0;
X }
X c_at = action_table[n-1]; c_asz = at_size[n-1];
X CurrentRuleSet = n;
X for (j = 0; j != c_asz; ++j) init_flow(&c_at[j],FT_RULE);
X optimise_rule_table();
X }


X
X return 1;
X }
X

Xvoid close_rule_set(void)
X{
X unsigned int j,k;
X struct rule far *rp;
X struct flow far *fp, far *ap, far *lfp;
X struct hash_tbl far *ht;
X struct flow far * far *sf;
X for (j = 0; j != c_rsz; ++j) {
X rp = &c_rt[j];
X switch (rp->RuleAction) {
X case RA_COUNT:
X if (rp->RuleJumpIndex != 0) {
X fp = find_flow(rp->RuleJumpIndex);
X fp->link.count = NULL;
X }
X rp->RuleJumpIndex = 0;
X break;
X case RA_TALLY:
X ap = &c_at[rp->RuleJumpIndex-1];
X if ((ht = ap->link.hash) != NULL) {
X for (k = 0; k != HASHMOD; ++k) {
X sf = &ht->hash_ent[k]; /* Address of hash table entry */
X if ((fp = sf[0]) != NULL) {
X do {
X lfp = fp; fp = lfp->link.next;
X lfp->link.next = NULL;
X } while (fp != (struct flow far *)sf);
X --n_hash_ents;
X }
X }
X farfree(ht);
X --n_hash_tables; t_hash_size -= HASHMOD;
X ap->link.hash = NULL;
X }
X break;
X case RA_AGGREGATE:
X ap = &c_at[rp->RuleJumpIndex-1];
X if ((fp = ap->link.action) != NULL) {
X fp->link.action = NULL;
X ap->link.action = NULL;
X }


X break;
X }
X }
X }
X

X#ifdef GC_DEBUG
Xint dup_flow(struct flow far *f, char *msg)
X{
X int x;
X for (x = 253; x <= mxflowsp1; ++x)
X if (flow_ix[x-1] != NULL) {
X scpos(0,24);
X printf(" flow_ix[%d]=%Fp !!\n", x,flow_ix[x-1]);
X }
X for (x = 2; x <= mxflowsp1; ++x)
X if (flow_ix[x-1] == f) {
X scpos(0,24);
X printf("Flow %Fp is flow_ix[%d], msg=%s\n", f,x, msg);
X exit(0);
X }
X return 0;
X }
X#endif
X
Xunsigned int number_flow(struct flow far *fp) /* Allocate a flow_nbr */
X{
X unsigned int start_ix = empty_ix;
X do {
X if (++empty_ix > mxflowsp1) /* empty_ix goes from 2 to MXFLOWS+1 */
X empty_ix = 2; /* Flow 1 is a dummy for snmp */
X if (flow_ix[empty_ix-1] == NULL) {
X ++nflows; /* Nbr of active accounting flows */
X flow_ix[empty_ix-1] = fp;
X#ifdef GC_DEBUG
X printf("nbr_flow(%Fp) -> %u\n", fp,empty_ix);
X#endif
X return empty_ix; /* 1-org */
X }
X } while (empty_ix != start_ix);
X scpos(0,24); printf("Too many flows");
X bkgi = 1; /* Kick background process: get busy on garbage collecting! */


X return NULL;
X }
X

Xstruct flow far *find_flow(int x) /* Find flow with flow_nbr x */
X{
X if (x > mxflowsp1 || x < 2) {
X display_msg(1,"Invalid flow number!");
X return NULL;
X }
X return flow_ix[x-1];
X }
X
Xvoid garbage_collect()
X{
X unsigned char e = gc_e, f = gc_f;
X struct rule far *rp;
X struct flow far *fp, far *np, far *tp, far *ltp;
X#ifdef GC_DEBUG
X int k;
X#endif
X#ifdef GC_TEST1
X scpos(0,24);
X printf("GC: gctime=%lu, gcf_ix=%u, e=%d, f=%d\n",
X GarbageCollectTime,gcf_ix,e,f);
X#endif
X for (;;) {
X if (++gcf_ix > mxflowsp1) /* gcf_ix goes from 2 to MXFLOWS+1 */
X gcf_ix = 2; /* Flow 1 is a dummy for snmp */
X if ((fp = flow_ix[gcf_ix-1]) == NULL) { /* Unused flow index */
X if (--e == 0) return;
X continue;
X }
X if (fp->LastTime <= GarbageCollectTime) { /* OK, recover it */
X#ifdef GC_TEST1
X printf(" f=%d, gcf_ix=%d, LastTime=%lu\n",
X f,gcf_ix,fp->LastTime);
X#endif
X if (fp->link.next != NULL) { /* Not an orphaned flow */
X#ifdef GC_DEBUG
X scpos(0,24);
X printf("GC: typ=%u, set=%u, ix=%u, fp=%Fp, np=%Fp\n",
X fp->FlowType,fp->FlowRuleSet,gcf_ix, fp,fp->link.next);
X k = 0;
X#endif
X switch(fp->FlowType) {
X case FT_COUNT:
X rp = fp->link.count;
X rp->RuleJumpIndex = 0;
X break;
X case FT_TALLY:
X np = fp->link.next;
X tp = fp; do {
X ltp = tp;
X#ifdef GC_DEBUG
Xprintf(" k=%d, ltp=%Fp, tp=%Fp\n", ++k, ltp,ltp->link.next);
Xif (tp->link.next == NULL || k > 10) exit(0); /* Infinite loop - stop */
X#endif
X } while ((tp = tp->link.next) != fp);
X ltp->link.next = ltp == np ? NULL : np;
X break;
X case FT_AGGREGATE:
X tp = fp->link.action;
X tp->link.action = NULL;
X break;
X }
X }
X flow_ix[gcf_ix-1] = NULL;
X#ifdef GC_DEBUG
X printf("\ngarbage_collect ..\n");
X#endif
X free_flow(fp);
X --nflows;
X ++FlowsRecovered;
X#ifdef GC_TEST
X scpos(0,24);
X printf("Flow %d (type %d) recovered\n", gcf_ix,fp->FlowType);
X#endif
X }
X if (--f == 0) return;
X }
X }
X
Xstruct flow far *data; /* Work space for building target flows */
Xstruct flow far *tally;
X
Xunsigned int p_stack[RSTKSIZ]; /* Pattern stack */
Xint p_s_depth;
X
X#ifdef GC_DEBUG
Xvoid print_chain(struct hash_tbl far *t, unsigned char hash, char *msg)
X{
X struct flow far * far *sf;
X struct flow far *f, far *lf;
X sf = &t->hash_ent[hash]; /* Address of hash table entry */
X scpos(0,24); printf("Chain: t=%Fp, hash=%u, sf=%Fp, msg=%s\n",
X t,hash,sf, msg);
X lf = f = sf[0];
X do {
X printf(" f=%Fp\n", f);
X if ((lf = f) == NULL) return;
X } while ((f = lf->link.next) != (struct flow far *)sf);
X }
X#endif


X
Xstruct flow far *search_hash_table(
X struct hash_tbl far *t, /* Table to search */
X struct key far *Low, /* Target keys */
X struct key far *High,
X struct flow far *pdu,
X struct flow far *ap, /* Action with table's masks */
X unsigned char OK_to_add /* 1 = add new flow if not found */
X )

X{
X struct flow far * far *sf;
X struct flow far *f, far *lf;
X struct rule far *rp;
X unsigned char hash, k, t_PeerType, t_DetailType,
X t_LowAdj,t_HighAdj, t_LowPeer,t_HighPeer, t_LowDetail,t_HighDetail;
X t_PeerType = t_DetailType = t_LowAdj = t_HighAdj =
X t_LowPeer = t_HighPeer = t_LowDetail = t_HighDetail = hash = 0;
X ++n_hash_searches;
X bcopy((unsigned char far *)Key(ap), /* Copy action entry into tally */
X (unsigned char far *)Key(tally), sizeof(struct flow_key));
X if (qcmp(tally->Low.PeerMask,null_flow->Low.PeerMask,PEER_ADDR_LEN) != 0) {
X t_LowPeer = 1; /* Tally this field */
X for (k = 0; k != PEER_ADDR_LEN; ++k)
X hash += (tally->Low.PeerAddress[k] =
X Low->PeerAddress[k] & tally->Low.PeerMask[k]);
X }
X if (qcmp(tally->High.PeerMask,null_flow->High.PeerMask,PEER_ADDR_LEN) != 0) {
X t_HighPeer = 1; /* Tally this field */
X for (k = 0; k != PEER_ADDR_LEN; ++k)
X hash += (tally->High.PeerAddress[k] =
X High->PeerAddress[k] & tally->High.PeerMask[k]);
X }
X if (tally->DetailTypeMask != 0) {
X t_DetailType = 1; /* Tally this field */
X hash += (tally->DetailAddrType =
X pdu->DetailAddrType & tally->DetailTypeMask);
X }
X if (qcmp(tally->Low.DetailMask,null_flow->Low.DetailMask,DETAIL_ADDR_LEN) != 0) {
X t_LowDetail = 1; /* Tally this field */
X for (k = 0; k != DETAIL_ADDR_LEN; ++k)
X hash += (tally->Low.DetailAddress[k] =
X Low->DetailAddress[k] & tally->Low.DetailMask[k]);
X }
X if (qcmp(tally->High.DetailMask,null_flow->High.DetailMask,DETAIL_ADDR_LEN) != 0) {
X t_HighDetail = 1; /* Tally this field */
X for (k = 0; k != DETAIL_ADDR_LEN; ++k)
X hash += (tally->High.DetailAddress[k] =
X High->DetailAddress[k] & tally->High.DetailMask[k]);
X }
X if (qcmp(tally->Low.AdjMask,null_flow->Low.AdjMask,MAC_ADDR_LEN) != 0) {
X t_LowAdj = 1; /* Tally this field */
X for (k = 0; k != MAC_ADDR_LEN; ++k)
X hash += (tally->Low.AdjAddress[k] =
X Low->AdjAddress[k] & tally->Low.AdjMask[k]);
X }
X if (qcmp(tally->High.AdjMask,null_flow->High.AdjMask,MAC_ADDR_LEN) != 0) {
X t_HighAdj = 1; /* Tally this field */
X for (k = 0; k != MAC_ADDR_LEN; ++k)
X hash += (tally->High.AdjAddress[k] =
X High->AdjAddress[k] & tally->High.AdjMask[k]);
X }
X if (tally->PeerTypeMask != 0) {
X t_PeerType = 1; /* Tally this field */
X hash += (tally->PeerAddrType =
X pdu->PeerAddrType & tally->PeerTypeMask);
X }
X
X sf = &t->hash_ent[hash]; /* Address of hash table entry */
X#ifdef TESTING
Xif (!log) open_log();
Xfprintf(log,"Search_hash(): add=%d, lo=%d, hi=%d, hash=%d\n LowPeer=",
X OK_to_add, t_LowPeer,t_HighPeer, hash);
Xpaddr(tally->Low.PeerAddress); fprintf(log,", HighPeer=");
Xpaddr(tally->High.PeerAddress);
Xfprintf(log,"\n sf=%Fp, sf[0]=%Fp\n", sf,sf[0]);
X#endif
X if ((f = sf[0]) == NULL) {
X lf = NULL; /* Empty hash chain */
X ++n_hash_compares; /* Make sure compares >= searches! */
X }
X else {
X do {
X#ifdef GC_DEBUG
X if (f == NULL) {
X print_chain(t,hash,"existing");
X exit(0);
X }
X#endif
X ++n_hash_compares;
X for (;;) {
X if (t_LowPeer && qcmp(tally->Low.PeerAddress,
X f->Low.PeerAddress,PEER_ADDR_LEN) != 0) break;
X if (t_HighPeer && qcmp(tally->High.PeerAddress,
X f->High.PeerAddress,PEER_ADDR_LEN) != 0) break;
X if (t_DetailType &&
X tally->DetailAddrType != f->DetailAddrType) break;
X if (t_LowDetail && qcmp(tally->Low.DetailAddress,
X f->Low.DetailAddress,DETAIL_ADDR_LEN) != 0) break;
X if (t_HighDetail && qcmp(tally->High.DetailAddress,
X f->High.DetailAddress,DETAIL_ADDR_LEN) != 0) break;
X if (t_LowAdj && qcmp(tally->Low.AdjAddress,
X f->Low.AdjAddress,MAC_ADDR_LEN) != 0) break;
X if (t_HighAdj && qcmp(tally->High.AdjAddress,
X f->High.AdjAddress,MAC_ADDR_LEN) != 0) break;
X if (t_PeerType &&
X tally->PeerAddrType != f->PeerAddrType) break;
X return f; /* Matched */
X }
X lf = f;
X } while ((f = lf->link.next) != (struct flow far *)sf);
X f = NULL; /* Loop stops with lf -> last flow in chain */
X }
X#ifdef TESTING
Xfprintf(log," after search: f=%Fp, lf=%Fp, sf=%Fp, sf[0]=%Fp\n",
X f, lf, sf, sf[0]);
X#endif
X if (OK_to_add) {
X if ((f = get_flow()) == NULL) /* Build new tally flow */
X return NULL; /* Out of memory */
X bcopy((unsigned char far *)Key(tally), /* bcopy (s,d,n) */
X (unsigned char far *)Key(f), sizeof(struct flow_key));
X init_flow(f,FT_TALLY);
X if (number_flow(f) == NULL) { /* No room in flow_index */
X free_flow(f); return NULL;
X }
X f->link.next = (struct flow far *)sf;
X#ifdef GC_DEBUG
X if (f->link.next == NULL) {
X print_chain(t,hash,"adding new flow");
X exit(0);
X }
X#endif
X if (lf == NULL) { /* Empty hash chain */
X sf[0] = f; ++n_hash_ents;
X }
X else lf->link.next = f;
X#ifdef TESTING
Xfprintf(log," flow %d added, addr=%Fp\n", empty_ix,f);
X#endif
X }
X return f;
X }
X
Xunsigned char masked_value[RULE_ADDR_LEN];
X
Xunsigned char mk_hash(
X unsigned char far *vp, unsigned char far *mp, unsigned char n)
X{
X unsigned char hash,j;
X for (hash = j = 0; j != n; ++j)
X hash += (masked_value[j] = vp[j] & mp[j]);
X return hash;
X }
X
Xint pkt_match( /* 0 = failed to match, 1 = matched, */
X /* 2 = matched but flow not yet in tally */
X unsigned char forward, /* 0 => from & to have been swapped */
X unsigned char OK_to_add,
X int len, /* Octets in PDU */
X struct flow far *pdu, struct key far *from, struct key far *to)
X{
X unsigned int rx, j, f;
X struct rule far *rp;
X unsigned char match, hash;
X struct flow far *fp, far *ap;
X struct rule_hash_tbl far *c_rh;
X struct hash_tbl far *ht;
X
X p_s_depth = 0;
X for (rx = 1; rx <= c_rsz; ) { /* Search the rule table */
X rp = &c_rt[rx-1];
X ++n_matches;
X if (rp->hash_tbl_index == 0) { /* Simple compare */
X switch (rp->RuleSelector) {
X case FTLOWPEERADDRESS:
X for (j = 0; j != PEER_ADDR_LEN; ++j) {
X if ((from->PeerAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == PEER_ADDR_LEN;


X break;
X case FTHIPEERADDRESS:

X for (j = 0; j != PEER_ADDR_LEN; ++j) {
X if ((to->PeerAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == PEER_ADDR_LEN;


X break;
X case FTLOWPEERTYPE:

X case FTHIPEERTYPE:
X match = pdu->PeerAddrType == rp->RuleMatchedValue[0];


X break;
X case FTLOWDETAILADDRESS:

X for (j = 0; j != DETAIL_ADDR_LEN; ++j) {
X if ((from->DetailAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == DETAIL_ADDR_LEN;


X break;
X case FTHIDETAILADDRESS:

X for (j = 0; j != DETAIL_ADDR_LEN; ++j) {
X if ((to->DetailAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == DETAIL_ADDR_LEN;


X break;
X case FTLOWDETAILTYPE:

X case FTHIDETAILTYPE:
X match = pdu->DetailAddrType == rp->RuleMatchedValue[0];


X break;
X case FTLOWADJACENTADDRESS:

X for (j = 0; j != MAC_ADDR_LEN; ++j) {
X if ((from->AdjAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == MAC_ADDR_LEN;


X break;
X case FTHIADJACENTADDRESS:

X for (j = 0; j != MAC_ADDR_LEN; ++j) {
X if ((to->AdjAddress[j] & rp->RuleMask[j]) !=
X rp->RuleMatchedValue[j]) break;
X }
X match = j == MAC_ADDR_LEN;
X break;
X case RS_NULL:
X match = 1; /* Don't test anything */
X break;
X default:
X match = 0;
X }
X }
X else { /* Hashed compare */
X switch (rp->RuleSelector) {
X case FTLOWPEERADDRESS:
X hash = mk_hash(from->PeerAddress,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTHIPEERADDRESS:

X hash = mk_hash(to->PeerAddress,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTLOWPEERTYPE:

X case FTHIPEERTYPE:
X hash = mk_hash(&pdu->PeerAddrType,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTLOWDETAILADDRESS:

X hash = mk_hash(from->DetailAddress,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTHIDETAILADDRESS:

X hash = mk_hash(to->DetailAddress,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTLOWDETAILTYPE:

X case FTHIDETAILTYPE:
X hash = mk_hash(&pdu->DetailAddrType,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTLOWADJACENTADDRESS:

X hash = mk_hash(from->AdjAddress,rp->RuleMask,RULE_ADDR_LEN);


X break;
X case FTHIADJACENTADDRESS:

X hash = mk_hash(to->AdjAddress,rp->RuleMask,RULE_ADDR_LEN);
X break;
X }
X c_rh = (struct rule_hash_tbl far *)&rule_hash[rp->hash_tbl_index];
X hash &= c_rh->hash_mask; match = 0;
X if ((rx = c_rh->hash_ent[hash]) != 0) {
X do {
X rp = &c_rt[rx-1];
X if (qcmp((unsigned char far *)masked_value,
X rp->RuleMatchedValue, RULE_ADDR_LEN) == 0) {
X match = 1; break; /* Matched */
X }
X } while ((rx = rp->hash_link) != 0);
X }
X if (match == 0) rx = c_rh->group_last; /* Not in group */
X }
X if (match) {
X switch (rp->RuleAction) {
X case RA_COUNT:
X p_stack[p_s_depth++] = rx; /* Remember last matched rule */
X if ((j = rp->RuleJumpIndex) == 0) {
X if ((fp = get_flow()) == NULL)
X return 1; /* Out of memory: don't try match again */
X bcopy((unsigned char far *)Key(null_flow), /* bcopy (s,d,n) */
X (unsigned char far *)Key(fp), sizeof(struct flow_key));
X for (j = 0; j != p_s_depth; ++j) {
X rp = &c_rt[p_stack[j]-1];
X switch (rp->RuleSelector) {
X case FTLOWPEERADDRESS:
X addrcpy(fp->Low.PeerAddress,
X rp->RuleMatchedValue, PEER_ADDR_LEN);
X addrcpy(fp->Low.PeerMask, rp->RuleMask, PEER_ADDR_LEN);


X break;
X case FTHIPEERADDRESS:

X addrcpy(fp->High.PeerAddress,
X rp->RuleMatchedValue, PEER_ADDR_LEN);
X addrcpy(fp->High.PeerMask, rp->RuleMask, PEER_ADDR_LEN);


X break;
X case FTLOWPEERTYPE:

X case FTHIPEERTYPE:
X fp->PeerAddrType = rp->RuleMatchedValue[0];
X fp->PeerTypeMask = rp->RuleMask[0];


X break;
X case FTLOWDETAILADDRESS:

X addrcpy(fp->Low.DetailAddress,
X rp->RuleMatchedValue, DETAIL_ADDR_LEN);
X addrcpy(fp->Low.DetailMask, rp->RuleMask, DETAIL_ADDR_LEN);


X break;
X case FTHIDETAILADDRESS:

X addrcpy(fp->High.DetailAddress,
X rp->RuleMatchedValue, DETAIL_ADDR_LEN);
X addrcpy(fp->High.DetailMask, rp->RuleMask, DETAIL_ADDR_LEN);


X break;
X case FTLOWDETAILTYPE:

X case FTHIDETAILTYPE:
X fp->DetailAddrType = rp->RuleMatchedValue[0];
X fp->DetailTypeMask = rp->RuleMask[0];


X break;
X case FTLOWADJACENTADDRESS:

X addrcpy(fp->Low.AdjAddress,
X rp->RuleMatchedValue, MAC_ADDR_LEN);
X addrcpy(fp->Low.AdjMask, rp->RuleMask, MAC_ADDR_LEN);


X break;
X case FTHIADJACENTADDRESS:

X addrcpy(fp->High.AdjAddress,
X rp->RuleMatchedValue, MAC_ADDR_LEN);
X addrcpy(fp->High.AdjMask, rp->RuleMask, MAC_ADDR_LEN);
X break;
X }
X }
X init_flow(fp,FT_COUNT);
X#ifdef GC_DEBUG
X dup_flow(fp, "adding count");
X#endif
X if ((f = number_flow(fp)) == NULL) {
X#ifdef GC_DEBUG
X printf("\nno room for count ..\n");
X#endif
X free_flow(fp); /* No room in flow_index */
X return 1; /* Succeed: don't try to match again */
X }
X fp->link.count = rp;
X rp->RuleJumpIndex = f;
X }
X else fp = find_flow(j);
X#ifdef COUNT_TRACE
Xscpos(0,24);
Xprintf("count "); daddr(from->PeerAddress);
Xprintf(" -> "); daddr(to->PeerAddress);
Xprintf("\n");
X#endif
X break; /* Count this PDU */
X case RA_TALLY:
X ap = &c_at[rp->RuleJumpIndex-1];
X if ((ht = ap->link.hash) == NULL) { /* No hash table yet */
X ht = (struct hash_tbl far *)farmalloc(sizeof(struct hash_tbl));
X for (j = 0; j != HASHMOD; ++j) ht->hash_ent[j] = NULL;
X ap->link.hash = ht;
X ++n_hash_tables; t_hash_size += HASHMOD;
X }
X if ((fp = search_hash_table(ht, from,to,pdu,
X ap, OK_to_add)) == NULL)
X return 2; /* Not OK to add */
X break; /* Count this PDU */
X case RA_AGGREGATE:
X ap = &c_at[rp->RuleJumpIndex-1];
X if ((fp = ap->link.action) == NULL) {
X if ((fp = get_flow()) == NULL)
X return 1; /* Out of memory: don't try match again */
X bcopy((unsigned char far *)Key(ap), /* bcopy (s,d,n) */
X (unsigned char far *)Key(fp), sizeof(struct flow_key));
X init_flow(fp,FT_AGGREGATE);
X#ifdef GC_DEBUG
X dup_flow(fp, "adding aggregate");
X#endif
X if (number_flow(fp) == NULL) {
X#ifdef GC_DEBUG
X printf("\nno room for aggregate ..\n");
X#endif
X free_flow(fp); /* No room in flow_index */
X return 1; /* Succeed: don't try to match again */
X }
X fp->link.action = ap;
X ap->link.action = fp;
X }
X break; /* Count this PDU */
X case RA_SUCCEED:
X return 1;
X case RA_FAIL:
X return 0;
X case RA_PUSHTO:
X p_stack[p_s_depth++] = rx; /* Remember which rules matched */
X rx = rp->RuleJumpIndex;
X#ifdef STACK_CHECK
X if (p_s_depth >= RSTKSIZ) {
X scpos(0,24);
X printf("match oflo: depth=%d, stk=", p_s_depth);
X for (j = 0; j != p_s_depth; ++j) printf("%d,", p_stack[j]);
X printf("\n LowPeer="); daddr(from->PeerAddress);
X printf(", HighPeer="); daddr(to->PeerAddress);
X printf("\n");
X return 0;
X }
X#endif
X continue;
X case RA_POPTO:
X --p_s_depth; /* Forget last matched rule */
X rx = rp->RuleJumpIndex;
X#ifdef STACK_CHECK
X if (p_s_depth < 0) {
X scpos(0,24);
X printf("match uflo: stk=");
X for (j = 0; j != RSTKSIZ; ++j) printf("%d,", p_stack[j]);
X printf("\n LowPeer="); daddr(tally->Low.PeerAddress);
X printf(", HighPeer="); daddr(tally->High.PeerAddress);
X printf("\n");
X return 0;
X }
X#endif
X continue;
X case RA_GOTO:
X rx = rp->RuleJumpIndex;
X#ifdef TESTING
Xscpos(0,24);
Xprintf(" GOTO %d\n", rx);
X#endif
X continue;
X }
X if (forward) {
X fp->UpOctets += len; fp->UpPDUs += 1;
X }
X else {
X fp->DownOctets += len; fp->DownPDUs += 1;
X }
X fp->LastTime = s_uptime;
X return 1;
X }
X else ++rx;
X }
X return 0; /* Not matched */
X }
X
X
X#define MAXPKTLEN 1526
X
X#ifdef DECNET
Xint dn_node(dn_addr)
Xunsigned char far *dn_addr;
X{
X return dn_addr[1]<<8 | dn_addr[0];
X }
X
X#define dn_area(node) (node >> 10)
X#define dn_host(node) (node & 0x3FF)
X#endif
X
Xvoid unpack_dn_node(ap, dn_addr)
Xunsigned char far *ap;
Xunsigned char far *dn_addr;
X{
X unsigned char dl = dn_addr[1];
X ap[0] = dl >> 2; /* DECnet area */
X ap[1] = dl & 0x03; ap[2] = dn_addr[0]; /* DECnet host */
X ap[3] = 0;
X }
X
Xvoid unpack_at_node(ap, at_net,at_node)
Xunsigned char far *ap;
Xunsigned char far *at_net;
Xunsigned char at_node;
X{
X ap[0] = at_net[0]; ap[1] = at_net[1];
X ap[2] = at_node;
X ap[3] = 0;
X }
X
Xvoid pkt_monitor(unsigned char far *pp, int len, unsigned char type)
X{
X unsigned char j, dtype, dx;
X union decnet far *dp;
X struct rule far *r;
X#ifdef DECNET
X unsigned int dlen, snode, dnode, area, host;
X#endif
X
X addrcpy(data->Low.AdjAddress,&pp[6-SNAPFROM],MAC_ADDR_LEN); /* Ethernet source */
X addrcpy(data->High.AdjAddress,&pp[0-SNAPFROM],MAC_ADDR_LEN); /* Ethernet dest */
X
X if (type == AT_IP) {
X data->PeerAddrType = AT_IP;
X addrcpy(data->Low.PeerAddress,&pp[26-SNAPFROM],PEER_ADDR_LEN); /* IP source */
X addrcpy(data->High.PeerAddress,&pp[30-SNAPFROM],PEER_ADDR_LEN); /* IP dest */
X j = data->DetailAddrType = pp[23-SNAPFROM]; /* IP Protocol Type */
X dx = 14 + ((pp[14-SNAPFROM] & 0x0F) << 2) - SNAPFROM; /* HLEN */
X /* Data offset. HLEN = IP header length in 32-bit units */
X if (j == PT_ICMP) {
X data->Low.DetailAddress[0] = data->High.DetailAddress[0] = 0;
X data->Low.DetailAddress[1] = pp[dx]; /* Type field */
X data->High.DetailAddress[1] = pp[dx+1]; /* Code field */
X }
X else {
X data->Low.DetailAddress[0] = pp[dx]; /* Source port */
X data->Low.DetailAddress[1] = pp[dx+1];
X data->High.DetailAddress[0] = pp[dx+2]; /* Dest port */
X data->High.DetailAddress[1] = pp[dx+3];
X }
X }
X else if (type == AT_NOVELL) {
X data->PeerAddrType = AT_NOVELL;
X addrcpy(data->Low.PeerAddress,&pp[20-SNAPFROM],PEER_ADDR_LEN); /* IPX soure net */
X addrcpy(data->High.PeerAddress,&pp[32-SNAPFROM],PEER_ADDR_LEN); /* IPX dest net */
X data->DetailAddrType = pp[19-SNAPFROM]; /* XNS packet type */
X data->Low.DetailAddress[0] = pp[42-SNAPFROM];
X data->Low.DetailAddress[1] = pp[43-SNAPFROM]; /* IPX source socket */
X data->High.DetailAddress[0] = pp[30-SNAPFROM];
X data->High.DetailAddress[1] = pp[31-SNAPFROM]; /* IPX dest socket */
X }
X else if (type == AT_ETHERTALK) {
X data->PeerAddrType = AT_ETHERTALK;
X unpack_at_node(data->Low.PeerAddress, &pp[28-SNAPFROM],pp[31-SNAPFROM]); /* AT source */
X unpack_at_node(data->High.PeerAddress, &pp[26-SNAPFROM],pp[30-SNAPFROM]); /* AT source */
X data->DetailAddrType = pp[34-SNAPFROM]; /* AT DDP protocol type */
X data->Low.DetailAddress[0] = data->High.DetailAddress[0] = 0;
X data->Low.DetailAddress[1] = pp[33-SNAPFROM]; /* AT source socket */
X data->High.DetailAddress[1] = pp[32-SNAPFROM]; /* AT dest socket */
X }
X else if (type == AT_DECNET) {
X data->PeerAddrType = AT_DECNET;
X addrcpy(data->High.PeerAddress,null_flow->High.PeerAddress,PEER_ADDR_LEN);
X dtype = pp[16-SNAPFROM]; /* DECnet packet type */
X if (dtype != 0x81) dp = (union decnet far *)&pp[17-SNAPFROM];
X else {
X dtype = pp[17-SNAPFROM];
X dp = (union decnet far *)&pp[18-SNAPFROM];
X }
X data->Low.DetailAddress[0] = data->High.DetailAddress[0] =
X data->Low.DetailAddress[1] = data->High.DetailAddress[1] = 0;
X switch (data->DetailAddrType = dtype & 0x0F) {
X case 0x06: /* Data */
X case 0x0E: /* Data + discard flag */
X unpack_dn_node(data->Low.PeerAddress, dp->d.src_dn_addr);
X unpack_dn_node(data->High.PeerAddress, dp->d.dest_dn_addr);
X#ifdef DECNET
X dnode = dn_node(dp->d.dest_dn_addr);
X snode = dn_node(dp->d.src_dn_addr);
X fprintf(log,"Data to %d.%d from %d.%d\n",
X dn_area(dnode),dn_host(dnode),
X dn_area(snode),dn_host(snode) );
X#endif
X break;
X case 0x07: /* Level 1 routing */
X unpack_dn_node(data->Low.PeerAddress, dp->l1r.src_dn_addr);
X#ifdef DECNET
X snode = dn_node(dp->l1r.src_dn_addr);
X fprintf(log,"Level 1 routing from %d.%d\n",
X dn_area(snode),dn_host(snode));
X#endif
X break;
X case 0x09: /* Level 2 routing */
X unpack_dn_node(data->Low.PeerAddress, dp->l2r.src_dn_addr);
X#ifdef DECNET
X snode = dn_node(dp->l2r.src_dn_addr);
X fprintf(log,"Level 2 routing from %d.%d\n",
X dn_area(snode),dn_host(snode));
X#endif
X break;
X case 0x0B: /* Router hello */
X unpack_dn_node(data->Low.PeerAddress, dp->rh.src_dn_addr);
X#ifdef DECNET
X snode = dn_node(dp->rh.src_dn_addr);
X dnode = dn_node(dp->rh.rtr_dn_addr);
X fprintf(log,"Router hello from %d.%d, other router %d.%d\n",
X dn_area(snode),dn_host(snode),
X dn_area(dnode),dn_host(dnode) );
X#endif
X break;
X case 0x0D: /* Endnode hello */
X unpack_dn_node(data->Low.PeerAddress, dp->eh.src_dn_addr);
X#ifdef DECNET
X snode = dn_node(dp->eh.src_dn_addr);
X dnode = dn_node(dp->eh.rtr_dn_addr);
X fprintf(log,"Endnode hello from %d.%d, designated router %d.%d\n",
X dn_area(snode),dn_host(snode),
X dn_area(dnode),dn_host(dnode) );
X#endif
X break;
X default: /* Unknown DECnet type */
X scpos(0,24);
X printf("\nDN pkt type %02x: ", dtype);
X for (j=0; j != 16; ++j) printf(" %02x",pp[j-SNAPFROM]);
X printf("\n");
X for (j=16; j != 34; ++j) printf(" %02x",pp[j-SNAPFROM]);
X printf("\n");
X#ifdef TESTING
X if (!log) open_log();
X fprintf(log, "\nDN pkt type %02x: ", dtype);
X for (j=17; j != 34; ++j) fprintf(log," %02x",pp[j-SNAPFROM]);
X fprintf(log, "\n");
X#endif
X return; /* Ignore it */
X }
X }
X else if (type == AT_DUMMY) {
X if (++dummypackets == 1000) {
X ++kilodummypackets; dummypackets = 0;
X }
X ++dummypacketrate;
X return; /* Don't try to match the dummy packets! */
X }
X
X#ifdef TESTING
X j = pkt_match(1,0, len, data, &data->Low, &data->High);
Xfprintf(log,"pkt_match(1,0) returned %d\n", j);
Xswitch (j) {
X#else
X switch (pkt_match(1,0, len, data, &data->Low, &data->High)) {
X#endif
X case 0: /* Failed */
X pkt_match(0,1, len, data, &data->High, &data->Low);
X return;
X case 1: /* Matched */
X return;
X case 2: /* Matched but not yet in tally */
X if (pkt_match(0,1, len, data, &data->High, &data->Low) == 1)
X return; /* Matched */
X pkt_match(1,1, len, data, &data->Low, &data->High);


X return;
X }
X }
X

X#ifdef AU_MSDOS
Xvoid save_time()
X{
X s_tod_h = tod_h; s_tod_m = tod_m; s_tod_s = tod_s;
X elapsed_sec = 0;
X }
X#endif
X
X#ifdef DEBUG
Xvoid write_flows()
X{
X int x;
X char msg[40];


X struct flow far *t;

X if (!log) open_log();
X for (x = 1; x <= nflows; ++x) {
X if ((t = find_flow(x)) == NULL) continue;
X sprintf(msg,"flow %d: ",x); pkey(msg,t);
X fprintf(log," Up: %8lu %6lu Down: %8lu %6lu Time: %8lu %8lu\n",
X t->UpOctets,t->UpPDUs, t->DownOctets,t->DownPDUs,
X t->FirstTime, t->LastTime);
X }
X fclose(log); log = NULL;
X }
X#endif
X
Xvoid zero_stats(void)
X{
X FlowsRecovered = n_matches = n_hash_compares = n_hash_searches = 0L;
X clear_pkt_stats = 1;
X display_msg(1,"Statistics Zeroed");
X }
X
Xvoid show_stats(void)
X{
X unsigned int i,j;
X unsigned long aps,apb, kdp;
X char msg[60];
X#ifdef AU_MSDOS
X if (stats_time == 0 || npackets == 0 ||
X kilodummypackets == 0 || mindummyrate == 0)
X#else
X if (stats_time == 0 || npackets == 0)
X#endif
X return; /* Avoid divides by zero */
X
X display_msg(1,"Meter Statistics ..");
X aps = (npackets*10+5L)/(stats_time*10L);
X#ifdef AU_MSDOS
X apb = (t_backlog*10+5L)/(stats_time*10L);
X sprintf(msg,"Av pkt/s %lu, av pkt backlog %lu", aps,apb);
X display_msg(0,msg);
X sprintf(msg,"Max pkt/s %u, max pkt backlog %u",
X max_pkt_rate,max_pkt_backlog);
X display_msg(0,msg);
X#else
X sprintf(msg,"Av pkt/s %lu, max pkt/s %u", aps,max_pkt_rate);
X display_msg(0,msg);
X#endif
X if (kilodummypackets != 0) {
X if (dummypackets >= 500) ++kilodummypackets;
X i = kilodummypackets*1000L/(kilodummypackets+npackets/1000L);
X j = (mindummyrate*10000L+5L)/((mindummyrate+mdpacketrate)*10L);
X sprintf(msg,"Idle time av %u.%u, min %u.%u %", i/10,i%10, j/10,j%10);
X display_msg(0,msg);
X }
X sprintf(msg,"%u flows in use (max %u)",nflows,mxflowsp1-1);
X display_msg(0,msg);
X sprintf(msg,"%lu flows recovered (GC: %u %u %u)",
X FlowsRecovered, gc_interval,gc_f,gc_e);
X display_msg(0,msg);
X i = (n_matches*100L+5L)/(npackets*10L);
X j = (n_hash_searches*100L+5L)/(npackets*10L);
X sprintf(msg,"%u.%u rules/pkt, %u.%u tallies/pkt",
X i/10,i%10, j/10,j%10);
X display_msg(0,msg);
X if (n_hash_searches != 0) {
X i = (n_hash_compares*100L+5L)/(n_hash_searches*10L);
X sprintf(msg,"%u.%u compares/tally", i/10,i%10);
X display_msg(0,msg);
X sprintf(msg,"%u hash slots, %u in use, ", t_hash_size,n_hash_ents);
X }
X }
X
Xvoid init_monitor()
X{
X int j;
X unsigned char far *fp;
X unsigned char *np;
X#ifdef AU_MSDOS
X set_tod();
X save_time(); /* For screen display */
X start_uptime_clock(); /* Starts 1 tick early; flows have CreateTime > 1 */
X#else
X boot_time = 0;
X#endif
X data = get_flow(); null_flow = get_flow(); tally = get_flow();
X fp = (unsigned char far *)null_flow;
X for (j = 0; j != sizeof(struct flow); ++j) *fp++ = 0;
X rule_hash = (int far *)farmalloc(sizeof(int)*(rh_size = INITHSZ));
X flow_ix = (struct flow far **)malloc(sizeof(struct flow far *)*(mxflowsp1));
X for (j = 0; j != mxflowsp1; ++j) flow_ix[j] = NULL;
X nflows = 0; /* No accounting flows in use yet */
X gcf_ix = empty_ix = mxflowsp1; /* Flow 2 will be the first allocated */
X np = (unsigned char *)CTi;
X for (j = 0; j != sizeof(CTi); ++j) *np++ = 0;
X n_collectors = 0;
X s_uptime = uptime();
X
X /* Start with default rule and action tables */
X
X rule_table[0] = (struct rule far *)default_rule_table;
X rt_size[0] = DRT_SIZE;
X action_table[0] = (struct flow far *)default_action_table;
X at_size[0] = DAT_SIZE;
X for (j = 1; j != MXNRTBLS; ++j) {
X rule_table[j] = NULL; action_table[j] = NULL;
X rt_size[j] = at_size[j] = 0;
X }
X open_rule_set(1, 1); /* Open set 1 */
X }
X
Xvoid show_help()
X{
X display_msg(0,"Copyright (C) 1992,1993 by Nevil Brownlee");
X display_msg(0,"Computer Centre, University of Auckland");
X display_msg(0,"");
X display_msg(0,"Keyboard commands ..");
X display_msg(0,"");
X#ifdef AU_MSDOS
X display_msg(0," b: show Bad packet counts");
X display_msg(0," m: show Memory usage");
X#endif
X display_msg(0," s: show Statistics");
X display_msg(0," v: show meter Version");
X display_msg(0," z: Zero statistics");
X if (kb_enabled) {
X display_msg(0,"");
X display_msg(0,"Esc: stop metering, exit NeTraMet");
X }
X }
X
Xvoid handle_kb(ch)
Xint ch;
X{
X switch (tolower(ch)) {
X case 's':
X show_stats();


X break;
X case 't':

X show_meter_time();
X break;
X#ifdef DEBUG
X case 'x':
X if (kb_enabled) write_flows();
X break;
X#endif
X case 'z':
X zero_stats();
X break;
X case '?':
X show_help();
X break;
X default:
X break;
X }
X }
END_OF_FILE
if test 38647 -ne `wc -c <'netramet/src/meter/flowhash.c'`; then
echo shar: \"'netramet/src/meter/flowhash.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/flowhash.c'
fi
if test -f 'netramet/src/snmplib/parse.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/parse.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/parse.c'\" \(22322 characters\)
sed "s/^X//" >'netramet/src/snmplib/parse.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * parse.c
X */
X#include <stdio.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include "parse.h"
X
X/*
X * This is one element of an object identifier with either an integer subidentifier,
X * or a textual string label, or both.
X * The subid is -1 if not present, and label is NULL if not present.
X */
Xstruct subid {
X int subid;
X char *label;
X};
X
Xint Line = 1;
X
X/* types of tokens */
X#define CONTINUE -1
X#define LABEL 1
X#define SUBTREE 2
X#define SYNTAX 3
X#define OBJID 4
X#define OCTETSTR 5
X#define INTEGER 6
X#define NETADDR 7
X#define IPADDR 8
X#define COUNTER 9
X#define GAUGE 10
X#define TIMETICKS 11
X#define OPAQUE 12
X#define NUL 13
X#define SEQUENCE 14
X#define OF 15 /* SEQUENCE OF */
X#define OBJTYPE 16
X#define ACCESS 17
X#define READONLY 18
X#define READWRITE 19
X#define WRITEONLY 20
X#define NOACCESS 21
X#define STATUS 22
X#define MANDATORY 23
X#define OPTIONAL 24
X#define OBSOLETE 25
X#define RECOMMENDED 26
X#define PUNCT 27
X#define EQUALS 28
X
Xstruct tok {
X char *name; /* token name */
X int len; /* length not counting nul */
X int token; /* value */
X int hash; /* hash of name */
X struct tok *next; /* pointer to next in hash table */
X};
X
X
Xstruct tok tokens[] = {
X { "obsolete", sizeof ("obsolete")-1, OBSOLETE },
X { "Opaque", sizeof ("Opaque")-1, OPAQUE },
X { "recommended", sizeof("recommended")-1, RECOMMENDED },
X { "optional", sizeof ("optional")-1, OPTIONAL },
X { "mandatory", sizeof ("mandatory")-1, MANDATORY },
X { "not-accessible", sizeof ("not-accessible")-1, NOACCESS },
X { "write-only", sizeof ("write-only")-1, WRITEONLY },
X { "read-write", sizeof ("read-write")-1, READWRITE },
X { "TimeTicks", sizeof ("TimeTicks")-1, TIMETICKS },
X { "OBJECTIDENTIFIER", sizeof ("OBJECTIDENTIFIER")-1, OBJID },
X /*
X * This CONTINUE appends the next word onto OBJECT,
X * hopefully matching OBJECTIDENTIFIER above.
X */
X { "OBJECT", sizeof ("OBJECT")-1, CONTINUE },
X { "NetworkAddress", sizeof ("NetworkAddress")-1, NETADDR },
X { "Gauge", sizeof ("Gauge")-1, GAUGE },
X { "OCTETSTRING", sizeof ("OCTETSTRING")-1, OCTETSTR },
X { "OCTET", sizeof ("OCTET")-1, -1 },
X { "OF", sizeof ("OF")-1, OF },
X { "SEQUENCE", sizeof ("SEQUENCE")-1, SEQUENCE },
X { "NULL", sizeof ("NULL")-1, NUL },
X { "IpAddress", sizeof ("IpAddress")-1, IPADDR },
X { "INTEGER", sizeof ("INTEGER")-1, INTEGER },
X { "Counter", sizeof ("Counter")-1, COUNTER },
X { "read-only", sizeof ("read-only")-1, READONLY },
X { "ACCESS", sizeof ("ACCESS")-1, ACCESS },
X { "STATUS", sizeof ("STATUS")-1, STATUS },
X { "SYNTAX", sizeof ("SYNTAX")-1, SYNTAX },
X { "OBJECT-TYPE", sizeof ("OBJECT-TYPE")-1, OBJTYPE },
X { "{", sizeof ("{")-1, PUNCT },
X { "}", sizeof ("}")-1, PUNCT },
X { "::=", sizeof ("::=")-1, EQUALS },
X { NULL }
X};
X
X#define HASHSIZE 32
X#define BUCKET(x) (x & 0x01F)
X
Xstruct tok *buckets[HASHSIZE];
X
Xstatic
Xhash_init()
X{
X register struct tok *tp;
X register char *cp;
X register int h;
X register int b;
X
X for (tp = tokens; tp->name; tp++) {
X for (h = 0, cp = tp->name; *cp; cp++)
X h += *cp;
X tp->hash = h;
X b = BUCKET(h);
X if (buckets[b])
X tp->next = buckets[b];
X buckets[b] = tp;
X }
X}
X
X
Xstatic char *
XMalloc(num)
X unsigned num;
X{
X char *cp;
X char *malloc();
X
X /* this is to fix (what seems to be) a problem with the IBM RT C library malloc */
X if (num < 16)
X num = 16;
X cp = malloc(num);
X return cp;
X}
X
Xstatic
Xprint_error(string, token)
X char *string;
X char *token;
X{
X if (token)
X fprintf(stderr, "%s(%s): On or around line %d\n", string, token, Line);
X else
X fprintf(stderr, "%s: On or around line %d\n", string, Line);
X}
X
X#ifdef TEST
Xprint_subtree(tree, count)
X struct tree *tree;
X int count;
X{
X struct tree *tp;
X int i;
X
X for(i = 0; i < count; i++)
X printf(" ");
X printf("Children of %s:\n", tree->label);
X count++;
X for(tp = tree->child_list; tp; tp = tp->next_peer){
X for(i = 0; i < count; i++)
X printf(" ");
X printf("%s\n", tp->label);
X }
X for(tp = tree->child_list; tp; tp = tp->next_peer){
X print_subtree(tp, count);
X }
X}
X#endif /* TEST */
X
X
Xstatic struct tree *
Xbuild_tree(nodes)
X struct node *nodes;
X{
X struct node *np;
X struct tree *tp;
X
X /* build root node */
X tp = (struct tree *)Malloc(sizeof(struct tree));
X tp->parent = NULL;
X tp->next_peer = NULL;
X tp->child_list = NULL;
X tp->enums = NULL;
X strcpy(tp->label, "iso");
X tp->subid = 1;
X tp->type = 0;
X /* grow tree from this root node */
X do_subtree(tp, &nodes);
X#ifdef TEST
X print_subtree(tp, 0);
X#endif /* TEST */
X /* If any nodes are left, the tree is probably inconsistent */
X if (nodes){
X fprintf(stderr, "The mib description doesn't seem to be consistent.\n");
X fprintf(stderr, "Some nodes couldn't be linked under the \"iso\" tree.\n");
X fprintf(stderr, "these nodes are left:\n");
X for(np = nodes; np; np = np->next)
X fprintf(stderr, "%s ::= { %s %d } (%d)\n", np->label, np->parent, np->subid,
X np->type);
X }
X return tp;
X}
X
X
X/*
X * Find all the children of root in the list of nodes. Link them into the
X * tree and out of the nodes list.
X */
Xstatic
Xdo_subtree(root, nodes)
X struct tree *root;
X struct node **nodes;
X{
X register struct tree *tp;
X struct tree *peer = NULL;
X register struct node *np;
X struct node *oldnp = NULL, *child_list = NULL, *childp = NULL;
X
X tp = root;
X /*
X * Search each of the nodes for one whose parent is root, and
X * move each into a separate list.
X */
X for(np = *nodes; np; np = np->next){
X if ((tp->label[0] == np->parent[0]) && !strcmp(tp->label, np->parent)){
X if (child_list == NULL){
X child_list = childp = np; /* first entry in child list */
X } else {
X childp->next = np;
X childp = np;
X }
X /* take this node out of the node list */
X if (oldnp == NULL){
X *nodes = np->next; /* fix root of node list */
X } else {
X oldnp->next = np->next; /* link around this node */
X }
X } else {
X oldnp = np;
X }
X }
X if (childp)
X childp->next = 0; /* re-terminate list */
X /*
X * Take each element in the child list and place it into the tree.
X */
X for(np = child_list; np; np = np->next){
X tp = (struct tree *)Malloc(sizeof(struct tree));
X tp->parent = root;
X tp->next_peer = NULL;
X tp->child_list = NULL;
X strcpy(tp->label, np->label);
X tp->subid = np->subid;
X switch(np->type){
X case OBJID:
X tp->type = TYPE_OBJID;
X break;
X case OCTETSTR:
X tp->type = TYPE_OCTETSTR;
X break;
X case INTEGER:
X tp->type = TYPE_INTEGER;
X break;
X case NETADDR:
X tp->type = TYPE_IPADDR;
X break;
X case IPADDR:
X tp->type = TYPE_IPADDR;
X break;
X case COUNTER:
X tp->type = TYPE_COUNTER;
X break;
X case GAUGE:
X tp->type = TYPE_GAUGE;
X break;
X case TIMETICKS:
X tp->type = TYPE_TIMETICKS;
X break;
X case OPAQUE:
X tp->type = TYPE_OPAQUE;
X break;
X case NUL:
X tp->type = TYPE_NULL;
X break;
X default:
X tp->type = TYPE_OTHER;
X break;
X }
X tp->enums = np->enums;
X np->enums = NULL; /* so we don't free them later */
X if (root->child_list == NULL){
X root->child_list = tp;
X } else {
X peer->next_peer = tp;
X }
X peer = tp;
X do_subtree(tp, nodes); /* recurse on this child */
X }
X /* free all nodes that were copied into tree */
X for(np = child_list; np;){
X oldnp = np;
X np = np->next;
X free_node(oldnp);
X }
X}
X
X
X/*
X * Takes a list of the form:
X * { iso org(3) dod(6) 1 }
X * and creates several nodes, one for each parent-child pair.
X * Returns NULL on error.
X */
Xstatic int
Xgetoid(fp, oid, length)
X register FILE *fp;
X register struct subid *oid; /* an array of subids */
X int length; /* the length of the array */
X{
X register int count;
X int type;
X char token[64], label[32];
X register char *cp, *tp;
X
X if ((type = get_token(fp, token)) != PUNCT){
X if (type == -1)
X print_error("Unexpected EOF", (char *)NULL);
X else
X print_error("Unexpected", token);
X return NULL;
X }
X if (*token != '{'){
X print_error("Unexpected", token);
X return NULL;
X }
X for(count = 0; count < length; count++, oid++){
X oid->label = 0;
X oid->subid = -1;
X if ((type = get_token(fp, token)) != LABEL){
X if (type == -1){
X print_error("Unexpected EOF", (char *)NULL);
X return NULL;
X }
X else if (type == PUNCT && *token == '}'){
X return count;
X } else {
X print_error("Unexpected", token);


X return NULL;
X }
X }

X tp = token;
X if (!isdigit(*tp)){
X /* this entry has a label */
X cp = label;
X while(*tp && *tp != '(')
X *cp++ = *tp++;
X *cp = 0;
X cp = (char *)Malloc((unsigned)strlen(label));
X strcpy(cp, label);
X oid->label = cp;
X if (*tp == '('){
X /* this entry has a label-integer pair in the form label(integer). */
X cp = ++tp;
X while(*cp && *cp != ')')
X cp++;
X if (*cp == ')')
X *cp = 0;
X else {
X print_error("No terminating parenthesis", (char *)NULL);
X return NULL;
X }
X oid->subid = atoi(tp);
X }
X } else {
X /* this entry has just an integer sub-identifier */
X oid->subid = atoi(tp);
X }
X }
X return count;
X
X
X}
X
Xstatic
Xfree_node(np)
X struct node *np;
X{
X struct enum_list *ep, *tep;
X
X ep = np->enums;
X while(ep){
X tep = ep;
X ep = ep->next;
X free((char *)tep);
X }
X free((char *)np);
X}
X
X/*
X * Parse an entry of the form:
X * label OBJECT IDENTIFIER ::= { parent 2 }
X * The "label OBJECT IDENTIFIER" portion has already been parsed.
X * Returns 0 on error.
X */
Xstatic struct node *
Xparse_objectid(fp, name)
X FILE *fp;
X char *name;
X{
X int type;
X char token[64];
X register int count;
X register struct subid *op, *nop;
X int length;
X struct subid oid[16];
X struct node *np, *root, *oldnp = NULL;
X
X type = get_token(fp, token);
X if (type != EQUALS){
X print_error("Bad format", token);
X return 0;
X }
X if (length = getoid(fp, oid, 16)){
X np = root = (struct node *)Malloc(sizeof(struct node));
X /*
X * For each parent-child subid pair in the subid array,
X * create a node and link it into the node list.
X */
X for(count = 0, op = oid, nop=oid+1; count < (length - 2); count++,
X op++, nop++){
X /* every node must have parent's name and child's name or number */
X if (op->label && (nop->label || (nop->subid != -1))){
X strcpy(np->parent, op->label);
X if (nop->label)
X strcpy(np->label, nop->label);
X if (nop->subid != -1)
X np->subid = nop->subid;
X np ->type = 0;
X np->enums = 0;
X /* set up next entry */
X np->next = (struct node *)Malloc(sizeof(*np->next));
X oldnp = np;
X np = np->next;
X }
X }
X np->next = (struct node *)NULL;
X /*
X * The above loop took care of all but the last pair. This pair is taken
X * care of here. The name for this node is taken from the label for this
X * entry.
X * np still points to an unused entry.
X */
X if (count == (length - 2)){
X if (op->label){
X strcpy(np->parent, op->label);
X strcpy(np->label, name);
X if (nop->subid != -1)
X np->subid = nop->subid;
X else
X print_error("Warning: This entry is pretty silly", token);
X } else {
X free_node(np);
X if (oldnp)
X oldnp->next = NULL;
X else
X return NULL;
X }
X } else {
X print_error("Missing end of oid", (char *)NULL);
X free_node(np); /* the last node allocated wasn't used */
X if (oldnp)
X oldnp->next = NULL;
X return NULL;
X }
X /* free the oid array */
X for(count = 0, op = oid; count < length; count++, op++){
X if (op->label)
X free(oid->label);
X op->label = 0;
X }
X return root;
X } else {
X print_error("Bad object identifier", (char *)NULL);
X return 0;
X }
X}
X
X/*
X * Parses an asn type. This structure is ignored by this parser.
X * Returns NULL on error.
X */
Xstatic int
Xparse_asntype(fp)
X FILE *fp;
X{
X int type;
X char token[64];
X
X type = get_token(fp, token);
X if (type != SEQUENCE){
X print_error("Not a sequence", (char *)NULL); /* should we handle this */
X return NULL;
X }
X while((type = get_token(fp, token)) != NULL){
X if (type == -1)
X return NULL;
X if (type == PUNCT && (token[0] == '}' && token[1] == '\0'))
X return -1;
X }
X print_error("Premature end of file", (char *)NULL);


X return NULL;
X}
X

X/*
X * Parses an OBJECT TYPE macro.
X * Returns 0 on error.
X */
Xstatic struct node *
Xparse_objecttype(fp, name)
X register FILE *fp;
X char *name;
X{
X register int type;
X char token[64];
X int count, length;
X struct subid oid[16];
X char syntax[32];
X int nexttype;
X char nexttoken[64];
X register struct node *np;
X register struct enum_list *ep;
X register char *cp;
X register char *tp;
X
X type = get_token(fp, token);
X if (type != SYNTAX){
X print_error("Bad format for OBJECT TYPE", token);
X return 0;
X }
X np = (struct node *)Malloc(sizeof(struct node));
X np->next = 0;
X np->enums = 0;
X type = get_token(fp, token);
X nexttype = get_token(fp, nexttoken);
X np->type = type;
X switch(type){
X case SEQUENCE:
X strcpy(syntax, token);
X if (nexttype == OF){
X strcat(syntax, " ");
X strcat(syntax, nexttoken);
X nexttype = get_token(fp, nexttoken);
X strcat(syntax, " ");
X strcat(syntax, nexttoken);
X nexttype = get_token(fp, nexttoken);
X }
X break;
X case INTEGER:
X strcpy(syntax, token);
X if (nexttype == PUNCT &&
X (nexttoken[0] == '{' && nexttoken[1] == '\0')) {
X /* if there is an enumeration list, parse it */
X while((type = get_token(fp, token)) != NULL){
X if (type == -1){
X free_node(np);
X return 0;
X }
X if (type == PUNCT &&
X (token[0] == '}' && token[1] == '\0'))
X break;
X if (type == 1){
X /* this is an enumerated label */
X if (np->enums == 0){
X ep = np->enums = (struct enum_list *)
X Malloc(sizeof(struct enum_list));
X } else {
X ep->next = (struct enum_list *)
X Malloc(sizeof(struct enum_list));
X ep = ep->next;
X }
X ep->next = 0;
X /* a reasonable approximation for the length */
X ep->label = (char *)Malloc((unsigned)strlen(token));
X cp = ep->label;
X tp = token;
X while(*tp != '(' && *tp != 0)
X *cp++ = *tp++;
X *cp = 0;
X if (*tp == 0){
X type = get_token(fp, token);
X if (type != LABEL){
X print_error("Expected \"(\"", (char *)NULL);
X free_node(np);
X return 0;
X }
X tp = token;
X }
X if (*tp == '('){
X tp++;
X } else {
X print_error("Expected \"(\"", token);
X free_node(np);
X return 0;
X }
X if (*tp == 0){
X type = get_token(fp, token);
X if (type != LABEL){
X print_error("Expected integer", token);
X free_node(np);
X return 0;
X }
X tp = token;
X }
X
X cp = tp;
X if (!isdigit(*cp)){
X print_error("Expected integer", token);
X free_node(np);
X return 0;
X }
X while(isdigit(*tp) && *tp != 0)
X tp++;
X if (*tp == ')')
X *tp = '\0'; /* terminate number */
X else if (*tp == 0){
X type = get_token(fp, token);
X if (type != LABEL || *token != ')'){
X print_error("Expected \")\"", token);
X free_node(np);
X return 0;
X }
X } else {
X print_error("Expected \")\"", token);
X free_node(np);
X return 0;
X }
X ep->value = atoi(cp);
X }
X }
X if (type == NULL){
X print_error("Premature end of file", (char *)NULL);
X free_node(np);
X return 0;
X }
X nexttype = get_token(fp, nexttoken);
X } else if (nexttype == LABEL && *nexttoken == '('){
X /* ignore the "constrained integer" for now */
X nexttype = get_token(fp, nexttoken);
X }
X break;
X case OBJID:
X case OCTETSTR:
X case NETADDR:
X case IPADDR:
X case COUNTER:
X case GAUGE:
X case TIMETICKS:
X case OPAQUE:
X case NUL:
X case LABEL:
X strcpy(syntax, token);
X break;
X default:
X print_error("Bad syntax", token);
X free_node(np);
X return 0;
X }
X if (nexttype != ACCESS){
X print_error("Should be ACCESS", nexttoken);
X free_node(np);
X return 0;
X }
X type = get_token(fp, token);
X if (type != READONLY && type != READWRITE && type != WRITEONLY
X && type != NOACCESS){
X print_error("Bad access type", nexttoken);
X free_node(np);
X return 0;
X }
X type = get_token(fp, token);
X if (type != STATUS){
X print_error("Should be STATUS", token);
X free_node(np);
X return 0;
X }
X type = get_token(fp, token);
X if (type != MANDATORY && type != OPTIONAL && type != OBSOLETE && type != RECOMMENDED){
X print_error("Bad status", token);
X free_node(np);
X return 0;
X }
X type = get_token(fp, token);
X if (type != EQUALS){
X print_error("Bad format", token);
X free_node(np);
X return 0;
X }
X length = getoid(fp, oid, 16);
X if (length > 1 && length <= 16){
X /* just take the last pair in the oid list */
X if (oid[length - 2].label)
X strncpy(np->parent, oid[length - 2].label, 32);
X strcpy(np->label, name);
X if (oid[length - 1].subid != -1)
X np->subid = oid[length - 1].subid;
X else
X print_error("Warning: This entry is pretty silly", (char *)NULL);
X } else {
X print_error("No end to oid", (char *)NULL);
X free_node(np);
X np = 0;
X }
X /* free oid array */


X for(count = 0; count < length; count++){

X if (oid[count].label)
X free(oid[count].label);
X oid[count].label = 0;
X }
X return np;
X}
X
X
X/*
X * Parses a mib file and returns a linked list of nodes found in the file.
X * Returns NULL on error.
X */
Xstatic struct node *
Xparse(fp)
X FILE *fp;
X{
X char token[64];
X char name[32];
X int type = 1;
X struct node *np, *root = NULL;
X
X hash_init();
X
X while(type != NULL){
X type = get_token(fp, token);
X if (type != LABEL){
X if (type == NULL){
X return root;
X }
X print_error(token, "is a reserved word");
X return NULL;
X }
X strncpy(name, token, 32);
X type = get_token(fp, token);
X if (type == OBJTYPE){
X if (root == NULL){
X /* first link in chain */
X np = root = parse_objecttype(fp, name);
X if (np == NULL){
X print_error("Bad parse of object type", (char *)NULL);
X return NULL;
X }
X } else {
X np->next = parse_objecttype(fp, name);
X if (np->next == NULL){
X print_error("Bad parse of objecttype", (char *)NULL);


X return NULL;
X }
X }

X /* now find end of chain */
X while(np->next)
X np = np->next;
X } else if (type == OBJID){
X if (root == NULL){
X /* first link in chain */
X np = root = parse_objectid(fp, name);
X if (np == NULL){
X print_error("Bad parse of object id", (char *)NULL);
X return NULL;
X }
X } else {
X np->next = parse_objectid(fp, name);
X if (np->next == NULL){
X print_error("Bad parse of object type", (char *)NULL);


X return NULL;
X }
X }

X /* now find end of chain */
X while(np->next)
X np = np->next;
X } else if (type == EQUALS){
X type = parse_asntype(fp);
X } else if (type == NULL){
X break;
X } else {
X print_error("Bad operator", (char *)NULL);


X return NULL;
X }
X }

X#ifdef TEST
X{
X struct enum_list *ep;
X
X for(np = root; np; np = np->next){
X printf("%s ::= { %s %d } (%d)\n", np->label, np->parent, np->subid,
X np->type);
X if (np->enums){
X printf("Enums: \n");
X for(ep = np->enums; ep; ep = ep->next){
X printf("%s(%d)\n", ep->label, ep->value);
X }
X }
X }
X}
X#endif /* TEST */
X return root;
X}
X
X/*
X * Parses a token from the file. The type of the token parsed is returned,
X * and the text is placed in the string pointed to by token.
X */
Xstatic int
Xget_token(fp, token)
X register FILE *fp;
X register char *token;
X{
X static char last = ' ';
X register int ch;
X register char *cp = token;
X register int hash = 0;
X register struct tok *tp;
X
X *cp = 0;
X ch = last;
X /* skip all white space */
X while(isspace(ch) && ch != -1){
X ch = getc(fp);
X if (ch == '\n')
X Line++;
X }
X if (ch == -1)
X return NULL;
X
X /*
X * Accumulate characters until white space is found. Then attempt to match this
X * token as a reserved word. If a match is found, return the type. Else it is
X * a label.
X */
X do {
X if (!isspace(ch)){
X hash += ch;
X *cp++ = ch;
X if (ch == '\n')
X Line++;
X } else {
X last = ch;
X *cp = '\0';
X
X for (tp = buckets[BUCKET(hash)]; tp; tp = tp->next) {
X if ((tp->hash == hash) && (strcmp(tp->name, token) == 0))
X break;
X }
X if (tp){
X if (tp->token == CONTINUE)
X continue;
X return (tp->token);
X }
X
X if (token[0] == '-' && token[1] == '-'){
X /* strip comment */
X while ((ch = getc(fp)) != -1)
X if (ch == '\n'){
X Line++;
X break;
X }
X if (ch == -1)
X return NULL;
X last = ch;
X return get_token(fp, token);
X }
X return LABEL;
X }
X
X } while ((ch = getc(fp)) != -1);


X return NULL;
X}
X

Xstruct tree *
Xread_mib(filename)
X char *filename;
X{
X FILE *fp;
X struct node *nodes;
X struct tree *tree;
X struct node *parse();
X
X fp = fopen(filename, "r");
X if (fp == NULL)
X return NULL;
X nodes = parse(fp);
X if (!nodes){
X fprintf(stderr, "Mib table is bad. Exiting\n");
X exit(1);
X }
X tree = build_tree(nodes);
X fclose(fp);
X return tree;
X}
X
X
X#ifdef TEST


Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X FILE *fp;
X struct node *nodes;
X struct tree *tp;
X
X fp = fopen("mib.txt", "r");
X if (fp == NULL){
X fprintf(stderr, "open failed\n");
X return 1;
X }
X nodes = parse(fp);
X tp = build_tree(nodes);
X print_subtree(tp, 0);
X fclose(fp);
X}
X
X#endif /* TEST */
END_OF_FILE
if test 22322 -ne `wc -c <'netramet/src/snmplib/parse.c'`; then
echo shar: \"'netramet/src/snmplib/parse.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/parse.c'
fi
echo shar: End of archive 17 \(of 25\).
cp /dev/null ark17isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:13:48 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 106
Archive-name: netramet/part18
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/manager/nmc_snmp.c
# netramet/src/snmplib/~snmp_vars.c.kip
# Wrapped by kent@sparky on Tue Nov 2 18:17:10 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 18 (of 25)."'
if test -f 'netramet/src/manager/nmc_snmp.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/nmc_snmp.c'\"
else
echo shar: Extracting \"'netramet/src/manager/nmc_snmp.c'\" \(27166 characters\)
sed "s/^X//" >'netramet/src/manager/nmc_snmp.c' <<'END_OF_FILE'
X/* 1427, Wed 5 Oct 93
X
X NMC_SNMP.C: NMC's SNMP interface with the meter


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X/***********************************************************

X Copyright 1988 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/param.h>
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <netdb.h>
X

X#include <stdio.h>
X#include <ctype.h>


X#include <sys/time.h>
X#include <errno.h>
X
X#include <string.h>
X#include <malloc.h>
X
X#include "ausnmp.h"
X
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"
X

X#include "nmc.h"


X
X#ifndef BSD4_3
X#define BSD4_2
X#endif
X

X
X#define INT_ACCT 1, 3, 6, 1, 3, 99

X#define U_AUCKLAND 1, 3, 6, 1, 4, 1, 411


X
Xoid o_sysDescr[] = {MIB, 1, 1, 0};
Xoid o_sysUpTime[] = {MIB, 1, 3, 0};
Xoid o_ifNumber[] = {MIB, 2, 1, 0};
X

Xoid o_HighWaterMark[] = {INT_ACCT, 1, 1, 0};
Xoid o_FloodMark[] = {INT_ACCT, 1, 2, 0};


Xoid o_InactivityTimeout[] = {INT_ACCT, 1, 3, 0};
Xoid o_LastCollectTime[] = {INT_ACCT, 1, 6, 0};
Xoid o_riRuleSize[] = {INT_ACCT, 1, 7, 1, 2, 0xFF};
Xoid o_riActionSize[] = {INT_ACCT, 1, 7, 1, 3, 0xFF};
Xoid o_CurrentRuleSet[] = {INT_ACCT, 1, 8, 0};
Xoid o_EmergencyRuleSet[] = {INT_ACCT, 1, 9, 0};
X
Xoid o_ftFlowIndex[] = {INT_ACCT, 2, 1, 1, 1, 0xFFFF};
Xoid o_ftFlowStatus[] = {INT_ACCT, 2, 1, 1, 2, 0xFFFF};
Xoid o_ftLowInterface[] = {INT_ACCT, 2, 1, 1, 3, 0xFFFF};
Xoid o_ftLowAdjacentType[] = {INT_ACCT, 2, 1, 1, 4, 0xFFFF};
Xoid o_ftLowAdjacentAddress[] = {INT_ACCT, 2, 1, 1, 5, 0xFFFF};
Xoid o_ftLowAdjacentMask[] = {INT_ACCT, 2, 1, 1, 6, 0xFFFF};
Xoid o_ftLowPeerType[] = {INT_ACCT, 2, 1, 1, 7, 0xFFFF};

Xoid o_ftLowPeerTypeMask[] = {INT_ACCT, 2, 1, 1, 8, 0xFFFF};
Xoid o_ftLowPeerAddress[] = {INT_ACCT, 2, 1, 1, 9, 0xFFFF};
Xoid o_ftLowPeerMask[] = {INT_ACCT, 2, 1, 1, 10, 0xFFFF};
Xoid o_ftLowDetailType[] = {INT_ACCT, 2, 1, 1, 11, 0xFFFF};
Xoid o_ftLowDetailTypeMask[] = {INT_ACCT, 2, 1, 1, 12, 0xFFFF};
Xoid o_ftLowDetailAddress[] = {INT_ACCT, 2, 1, 1, 13, 0xFFFF};
Xoid o_ftLowDetailMask[] = {INT_ACCT, 2, 1, 1, 14, 0xFFFF};
Xoid o_ftHighInterface[] = {INT_ACCT, 2, 1, 1, 17, 0xFFFF};
Xoid o_ftHighAdjacentType[] = {INT_ACCT, 2, 1, 1, 18, 0xFFFF};
Xoid o_ftHighAdjacentAddress[] = {INT_ACCT, 2, 1, 1, 19, 0xFFFF};
Xoid o_ftHighAdjacentMask[] = {INT_ACCT, 2, 1, 1, 20, 0xFFFF};
Xoid o_ftHighPeerType[] = {INT_ACCT, 2, 1, 1, 21, 0xFFFF};
Xoid o_ftHighPeerTypeMask[] = {INT_ACCT, 2, 1, 1, 22, 0xFFFF};
Xoid o_ftHighPeerAddress[] = {INT_ACCT, 2, 1, 1, 23, 0xFFFF};
Xoid o_ftHighPeerMask[] = {INT_ACCT, 2, 1, 1, 24, 0xFFFF};
Xoid o_ftHighDetailType[] = {INT_ACCT, 2, 1, 1, 25, 0xFFFF};
Xoid o_ftHighDetailTypeMask[] = {INT_ACCT, 2, 1, 1, 26, 0xFFFF};
Xoid o_ftHighDetailAddress[] = {INT_ACCT, 2, 1, 1, 27, 0xFFFF};
Xoid o_ftHighDetailMask[] = {INT_ACCT, 2, 1, 1, 28, 0xFFFF};
Xoid o_ftPDUScale[] = {INT_ACCT, 2, 1, 1, 33, 0xFFFF};
Xoid o_ftOctetScale[] = {INT_ACCT, 2, 1, 1, 34, 0xFFFF};
Xoid o_ftRuleSet[] = {INT_ACCT, 2, 1, 1, 35, 0xFFFF};
Xoid o_ftFlowType[] = {INT_ACCT, 2, 1, 1, 36, 0xFFFF};
Xoid o_ftUpOctets[] = {INT_ACCT, 2, 1, 1, 37, 0xFFFF};
Xoid o_ftUpPDUs[] = {INT_ACCT, 2, 1, 1, 38, 0xFFFF};
Xoid o_ftDownOctets[] = {INT_ACCT, 2, 1, 1, 39, 0xFFFF};
Xoid o_ftDownPDUs[] = {INT_ACCT, 2, 1, 1, 40, 0xFFFF};
Xoid o_ftFirstTime[] = {INT_ACCT, 2, 1, 1, 41, 0xFFFF};
Xoid o_ftLastTime[] = {INT_ACCT, 2, 1, 1, 42, 0xFFFF};


X
Xoid o_ftCreateTime[] = {INT_ACCT, 2, 2, 1, 1, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftCreateIndex[] = {INT_ACCT, 2, 2, 1, 2, 0xFFFFFFFF, 0xFFFF};
X
Xoid o_ftActiveTime[] = {INT_ACCT, 2, 3, 1, 1, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftActiveIndex[] = {INT_ACCT, 2, 3, 1, 2, 0xFFFFFFFF, 0xFFFF};
Xoid o_ftActiveFlowBlob[] = {INT_ACCT, 2, 3, 1, 3, 0xFFFFFFFF, 0xFFFF};
X

Xoid o_ftColumnBlob[] = {INT_ACCT, 2, 4, 1, 4, 0xFF, 0xFFFFFFFF, 0xFFFF};


X
Xoid o_rtSelector[] = {INT_ACCT, 3, 1, 1, 3, 0xFF, 0xFFFF};
Xoid o_rtRuleMask[] = {INT_ACCT, 3, 1, 1, 4, 0xFF, 0xFFFF};
Xoid o_rtMatchedValue[] = {INT_ACCT, 3, 1, 1, 5, 0xFF, 0xFFFF};
Xoid o_rtRuleAction[] = {INT_ACCT, 3, 1, 1, 6, 0xFF, 0xFFFF};
Xoid o_rtJumpIndex[] = {INT_ACCT, 3, 1, 1, 7, 0xFF, 0xFFFF};
X
Xoid o_atLowInterface[] = {INT_ACCT, 4, 1, 1, 3, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentType[] = {INT_ACCT, 4, 1, 1, 4, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentAddress[] = {INT_ACCT, 4, 1, 1, 5, 0xFF, 0xFFFF};
Xoid o_atLowAdjacentMask[] = {INT_ACCT, 4, 1, 1, 6, 0xFF, 0xFFFF};
Xoid o_atLowPeerType[] = {INT_ACCT, 4, 1, 1, 7, 0xFF, 0xFFFF};

Xoid o_atLowPeerTypeMask[] = {INT_ACCT, 4, 1, 1, 8, 0xFF, 0xFFFF};
Xoid o_atLowPeerAddress[] = {INT_ACCT, 4, 1, 1, 9, 0xFF, 0xFFFF};
Xoid o_atLowPeerMask[] = {INT_ACCT, 4, 1, 1, 10, 0xFF, 0xFFFF};
Xoid o_atLowDetailType[] = {INT_ACCT, 4, 1, 1, 11, 0xFF, 0xFFFF};
Xoid o_atLowDetailTypeMask[] = {INT_ACCT, 4, 1, 1, 12, 0xFF, 0xFFFF};
Xoid o_atLowDetailAddress[] = {INT_ACCT, 4, 1, 1, 13, 0xFF, 0xFFFF};
Xoid o_atLowDetailMask[] = {INT_ACCT, 4, 1, 1, 14, 0xFF, 0xFFFF};
Xoid o_atHighInterface[] = {INT_ACCT, 4, 1, 1, 17, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentType[] = {INT_ACCT, 4, 1, 1, 18, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentAddress[] = {INT_ACCT, 4, 1, 1, 19, 0xFF, 0xFFFF};
Xoid o_atHighAdjacentMask[] = {INT_ACCT, 4, 1, 1, 20, 0xFF, 0xFFFF};
Xoid o_atHighPeerType[] = {INT_ACCT, 4, 1, 1, 21, 0xFF, 0xFFFF};
Xoid o_atHighPeerTypeMask[] = {INT_ACCT, 4, 1, 1, 22, 0xFF, 0xFFFF};
Xoid o_atHighPeerAddress[] = {INT_ACCT, 4, 1, 1, 23, 0xFF, 0xFFFF};
Xoid o_atHighPeerMask[] = {INT_ACCT, 4, 1, 1, 24, 0xFF, 0xFFFF};
Xoid o_atHighDetailType[] = {INT_ACCT, 4, 1, 1, 25, 0xFF, 0xFFFF};
Xoid o_atHighDetailTypeMask[] = {INT_ACCT, 4, 1, 1, 26, 0xFF, 0xFFFF};
Xoid o_atHighDetailAddress[] = {INT_ACCT, 4, 1, 1, 27, 0xFF, 0xFFFF};
Xoid o_atHighDetailMask[] = {INT_ACCT, 4, 1, 1, 28, 0xFF, 0xFFFF};
Xoid o_atPDUScale[] = {INT_ACCT, 4, 1, 1, 33, 0xFF, 0xFFFF};
Xoid o_atOctetScale[] = {INT_ACCT, 4, 1, 1, 34, 0xFF, 0xFFFF};
Xoid o_atRuleSet[] = {INT_ACCT, 4, 1, 1, 35, 0xFF, 0xFFFF};
X
Xoid o_msStatsReset[] = {U_AUCKLAND, 1, 1, 0};
Xoid o_msStatsTime[] = {U_AUCKLAND, 1, 2, 0};
Xoid o_msNbrPackets[] = {U_AUCKLAND, 1, 3, 0};
Xoid o_msTotPktBacklog[] = {U_AUCKLAND, 1, 4, 0};
Xoid o_msMaxPktRate[] = {U_AUCKLAND, 1, 5, 0};
Xoid o_msMaxPktBacklog[] = {U_AUCKLAND, 1, 6, 0};
Xoid o_msNbrFlows[] = {U_AUCKLAND, 1, 7, 0};
Xoid o_msFlowsRecovered[] = {U_AUCKLAND, 1, 8, 0};
Xoid o_msRuleMatches[] = {U_AUCKLAND, 1, 9, 0};
Xoid o_msHashSearches[] = {U_AUCKLAND, 1, 10, 0};
Xoid o_msHashCompares[] = {U_AUCKLAND, 1, 11, 0};
Xoid o_msTotalHashSize[] = {U_AUCKLAND, 1, 12, 0};
Xoid o_msNbrHashEntries[] = {U_AUCKLAND, 1, 13, 0};
Xoid o_msGCInterval[] = {U_AUCKLAND, 1, 14, 0};
Xoid o_msMaxFlows[] = {U_AUCKLAND, 1, 15, 0};
Xoid o_msAvIdle1000[] = {U_AUCKLAND, 1, 16, 0};
Xoid o_msMinIdle1000[] = {U_AUCKLAND, 1, 17, 0};
X
Xoid o_pcNearMem[] = {U_AUCKLAND, 2, 1, 0};
Xoid o_pcFarMem[] = {U_AUCKLAND, 2, 2, 0};
Xoid o_pcBadPackets[] = {U_AUCKLAND, 2, 3, 0};
Xoid o_pcNoBufPackets[] = {U_AUCKLAND, 2, 4, 0};
Xoid o_pcLostPackets[] = {U_AUCKLAND, 2, 5, 0};
X


X
Xint start_snmp_session(struct meter_status *ms)

X{


X struct snmp_session session, *ssp;
X

X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = ms->name;
X session.community = ms->community;

X session.community_len = strlen((char *)ms->community);


X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ssp = snmp_open(&session);
X if (ssp == NULL) {
X printf("Couldn't open snmp to %s\n", session.peername);

X return 0;
X }
X ms->ss = ssp;


X return 1;
X }
X

X#define ADD_VAR(v) snmp_add_null_var(pdu, v, sizeof(v)/sizeof(oid))
X#define ADD_X_VAR(v,n1) { v[sizeof(v)/sizeof(oid) - 1] = n1; \
X ADD_VAR(v); }
X#define ADD_X2_VAR(v,n1,n2) { v[sizeof(v)/sizeof(oid) - 2] = n1; \
X v[sizeof(v)/sizeof(oid) - 1] = n2; \
X ADD_VAR(v); }

X#define ADD_X3_VAR(v,n1,n2,n3) { v[sizeof(v)/sizeof(oid) - 3] = n1; \
X v[sizeof(v)/sizeof(oid) - 2] = n2; \
X v[sizeof(v)/sizeof(oid) - 1] = n3; \


X ADD_VAR(v); }
X
X#define SET_INT(v) { vars->type = INTEGER; \
X vars->val.integer = (long *)malloc(vars->val_len = sizeof(long)); \
X *(vars->val.integer) = (long)v; }
X#define SET_TIMETICKS(v) { vars->type = TIMETICKS; \
X vars->val.integer = (long *)malloc(vars->val_len = sizeof(long)); \
X *(vars->val.integer) = (long)v; }
X#define SET_STRING(v,len) { vars->type = STRING; \
X vars->val.string = (u_char *)malloc(RULE_ADDR_LEN) ;\
X bcopy(v, (char *)vars->val.string, vars->val_len = len); }
X
X#define STRING_VAL(v) bcopy(vars->val.string, v, vars->val_len)
X#define INT_VAL(v) v = *(vars->val.integer)
X
X

Xint set_meter_params(struct meter_status *ms)


X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X if (ms->GCIntervalReqd == 0 && ms->HighWaterMark == 0 &&
X ms->InactivityTime == 0) return 1; /* Nothing to do */


X
X pdu = snmp_pdu_create(SET_REQ_MSG);

X i = 0;
X if (ms->GCInterval != 0) {
X ADD_VAR(o_msGCInterval);
X vars = pdu->variables; i = 1;
X SET_INT(ms->GCIntervalReqd);
X }
X if (ms->HighWaterMark != 0) {
X ADD_VAR(o_HighWaterMark);
X vars = i ? vars->next_variable : pdu->variables; i = 1;
X SET_INT(ms->HighWaterMark);
X }
X if (ms->InactivityTime != 0) {
X ADD_VAR(o_InactivityTimeout);
X vars = i ? vars->next_variable : pdu->variables;
X SET_INT(ms->InactivityTime);


X }
X
X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X if (verbose) printf("Meter parameters set: GCI=%u, HWM=%u, IAT=%u\n",
X ms->GCIntervalReqd,ms->HighWaterMark,ms->InactivityTime);
X fprintf(log, "Meter parameters set: GCI=%u, HWM=%u, IAT=%u\n",
X ms->GCIntervalReqd,ms->HighWaterMark,ms->InactivityTime);


X fflush(log);
X }
X else {

X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X return 1;
X }
X

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X return 1;
X }
X

X if (setset) printf(
X "Meter is now using rule+action set %d\n", ms->ruleset);


X else printf("Set %d: sizes set to %d rules + %d actions\n",
X ms->ruleset,ms->nrules,ms->nactions);
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X return 1;
X }
X

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X return 1;
X }
X

Xint add_action(struct meter_status *ms, struct flow_info *ai,
X unsigned char ActionSet,unsigned char ActionNbr,
X unsigned char *required)

X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X
X pdu = snmp_pdu_create(SET_REQ_MSG);

X ADD_X2_VAR(o_atLowPeerType, ActionSet,ActionNbr);


X vars = pdu->variables;

X SET_INT(ai->LowPeerType);
X
X if (required[FTLOWINTERFACE]) {
X ADD_X2_VAR(o_atLowInterface, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->LowInterface);
X }
X if (required[FTLOWADJACENTTYPE]) {
X ADD_X2_VAR(o_atLowAdjacentType, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->LowAdjType);
X }
X if (required[FTLOWADJACENTADDRESS]) {
X ADD_X2_VAR(o_atLowAdjacentAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->LowAdjAddress,MAC_ADDR_LEN);
X }
X if (required[FTLOWADJACENTMASK]) {
X ADD_X2_VAR(o_atLowAdjacentMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->LowAdjMask,MAC_ADDR_LEN);
X }
X if (required[FTLOWPEERTYPEMASK]) {
X ADD_X2_VAR(o_atLowPeerTypeMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->LowPeerTypeMask);
X }
X if (required[FTLOWPEERADDRESS]) {
X ADD_X2_VAR(o_atLowPeerAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;
X SET_STRING(ai->LowPeerAddress,PEER_ADDR_LEN);
X }

X if (required[FTLOWPEERMASK]) {
X ADD_X2_VAR(o_atLowPeerMask, ActionSet,ActionNbr);


X vars = vars->next_variable;
X SET_STRING(ai->LowPeerMask,PEER_ADDR_LEN);
X }

X if (required[FTLOWDETAILTYPE]) {
X ADD_X2_VAR(o_atLowDetailType, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->LowDetailType);
X }
X if (required[FTLOWDETAILTYPEMASK]) {
X ADD_X2_VAR(o_atLowDetailTypeMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->LowDetailTypeMask);
X }
X if (required[FTLOWDETAILADDRESS]) {
X ADD_X2_VAR(o_atLowDetailAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->LowDetailAddress,DETAIL_ADDR_LEN);
X }
X if (required[FTLOWDETAILMASK]) {
X ADD_X2_VAR(o_atLowDetailMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->LowDetailMask,DETAIL_ADDR_LEN);
X }
X if (required[FTHIINTERFACE]) {
X ADD_X2_VAR(o_atHighInterface, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighInterface);
X }
X if (required[FTHIADJACENTTYPE]) {
X ADD_X2_VAR(o_atHighAdjacentType, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighAdjType);
X }
X if (required[FTHIADJACENTADDRESS]) {
X ADD_X2_VAR(o_atHighAdjacentAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->HighAdjAddress,MAC_ADDR_LEN);
X }
X if (required[FTHIADJACENTMASK]) {
X ADD_X2_VAR(o_atHighAdjacentMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->HighAdjMask,MAC_ADDR_LEN);
X }
X if (required[FTHIPEERTYPE]) {
X ADD_X2_VAR(o_atHighPeerType, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighPeerType);
X }
X if (required[FTHIPEERTYPEMASK]) {
X ADD_X2_VAR(o_atHighPeerTypeMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighPeerTypeMask);
X }
X if (required[FTHIPEERADDRESS]) {
X ADD_X2_VAR(o_atHighPeerAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;
X SET_STRING(ai->HighPeerAddress,PEER_ADDR_LEN);
X }

X if (required[FTHIPEERMASK]) {
X ADD_X2_VAR(o_atHighPeerMask, ActionSet,ActionNbr);


X vars = vars->next_variable;
X SET_STRING(ai->HighPeerMask,PEER_ADDR_LEN);
X }

X if (required[FTHIDETAILTYPE]) {
X ADD_X2_VAR(o_atHighDetailType, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighDetailType);
X }
X if (required[FTHIDETAILTYPEMASK]) {
X ADD_X2_VAR(o_atHighDetailTypeMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_INT(ai->HighDetailTypeMask);
X }
X if (required[FTHIDETAILADDRESS]) {
X ADD_X2_VAR(o_atHighDetailAddress, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->HighDetailAddress,DETAIL_ADDR_LEN);
X }
X if (required[FTHIDETAILMASK]) {
X ADD_X2_VAR(o_atHighDetailMask, ActionSet,ActionNbr);


X vars = vars->next_variable;

X SET_STRING(ai->HighDetailMask,DETAIL_ADDR_LEN);


X }
X
X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X printf("Action %d added to table %d\n", ActionNbr,ActionSet);


X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X return 1;
X }
X

Xint same_acct_oid(oid *a, oid *b)
X /* Compare oids for equality within internet-accounting MIB */

X{
X int j;


X for (j = 6; j != 10; ++j) {
X if (a[j] != b[j]) return 0;

X }
X return 1;
X }
X

Xint column_info(struct meter_status *ms, unsigned char *fb,
X unsigned char a, unsigned long ft, int *fn)


X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;

X int result;
X
X if (testing) printf("column_info(ms,fb,a=%d,ft=%lu,fn=%d)\n",a,ft,*fn);
X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X ADD_X3_VAR(o_ftColumnBlob,a,ft,*fn)


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;

X if (!same_acct_oid(vars->name,o_ftColumnBlob))

X return 0; /* No more flows with last-active time > ft */

X STRING_VAL(fb); result = vars->val_len;


X }
X else if (response->errstat == SNMP_ERR_NOSUCHNAME) return 0;
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X result = 0;
X }
X }


X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);
X return result;


X }
X
Xint meter_info(ms)
Xstruct meter_status *ms;
X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X
X if (testing) printf("meter_info(ms)\n");
X pdu = snmp_pdu_create(GET_REQ_MSG);
X ADD_VAR(o_sysDescr);
X ADD_VAR(o_sysUpTime);
X ADD_VAR(o_LastCollectTime);

X ADD_VAR(o_CurrentRuleSet);
X ADD_VAR(o_msMaxFlows);
X if (ms->statsreqd) {
X ADD_VAR(o_msStatsTime);
X ADD_VAR(o_msNbrPackets);
X ADD_VAR(o_msTotPktBacklog);
X ADD_VAR(o_msMaxPktRate);
X ADD_VAR(o_msMaxPktBacklog);
X ADD_VAR(o_msNbrFlows);
X ADD_VAR(o_msFlowsRecovered);
X ADD_VAR(o_msRuleMatches);
X ADD_VAR(o_msHashSearches);
X ADD_VAR(o_msHashCompares);
X ADD_VAR(o_msTotalHashSize);
X ADD_VAR(o_msNbrHashEntries);
X ADD_VAR(o_msGCInterval);
X ADD_VAR(o_msAvIdle1000);
X ADD_VAR(o_msMinIdle1000);
X ADD_VAR(o_pcLostPackets);


X }
X
X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X vars = response->variables;
X STRING_VAL(ms->descr);
X vars = vars->next_variable;
X INT_VAL(ms->uptime);
X vars = vars->next_variable;
X INT_VAL(ms->LastCollectTime);
X vars = vars->next_variable;

X INT_VAL(ms->CurrentRuleSet);


X vars = vars->next_variable;

X INT_VAL(ms->MaxFlows);
X if (ms->statsreqd) {


X vars = vars->next_variable;

X INT_VAL(ms->StatsTime);


X vars = vars->next_variable;

X INT_VAL(ms->NbrPackets);


X vars = vars->next_variable;

X INT_VAL(ms->TotPktBacklog);


X vars = vars->next_variable;

X INT_VAL(ms->MaxPktRate);


X vars = vars->next_variable;

X INT_VAL(ms->MaxPktBacklog);


X vars = vars->next_variable;

X INT_VAL(ms->NbrFlows);


X vars = vars->next_variable;

X INT_VAL(ms->FlowsRecovered);


X vars = vars->next_variable;

X INT_VAL(ms->RuleMatches);


X vars = vars->next_variable;

X INT_VAL(ms->HashSearches);


X vars = vars->next_variable;

X INT_VAL(ms->HashCompares);


X vars = vars->next_variable;

X INT_VAL(ms->TotalHashSize);


X vars = vars->next_variable;

X INT_VAL(ms->NbrHashEntries);


X vars = vars->next_variable;

X INT_VAL(ms->GCInterval);


X vars = vars->next_variable;

X INT_VAL(ms->AvIdle1000);


X vars = vars->next_variable;

X INT_VAL(ms->MinIdle1000);


X vars = vars->next_variable;

X INT_VAL(ms->LostPackets);
X if (testing) printf(" stats read: StatsTime=%lu\n",ms->StatsTime);


X }
X }
X else {
X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);
X
X if (ms->statsreqd) { /* Zero meter statistics */
X pdu = snmp_pdu_create(SET_REQ_MSG);
X ADD_VAR(o_msStatsReset);


X vars = pdu->variables;

X SET_INT(1);


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {

X if (testing) printf(" stats zeroed\n");
X if (response->errstat != SNMP_ERR_NOERROR) {


X printf("Error in packet, reason = %s\n",
X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X }
X else return 0;
X snmp_free_pdu(response);

X mswait(ms->snmp_delay);


X }
X return 1;
X }
X

END_OF_FILE
if test 27166 -ne `wc -c <'netramet/src/manager/nmc_snmp.c'`; then
echo shar: \"'netramet/src/manager/nmc_snmp.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/nmc_snmp.c'
fi
if test -f 'netramet/src/snmplib/~snmp_vars.c.kip' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/~snmp_vars.c.kip'\"
else
echo shar: Extracting \"'netramet/src/snmplib/~snmp_vars.c.kip'\" \(33903 characters\)
sed "s/^X//" >'netramet/src/snmplib/~snmp_vars.c.kip' <<'END_OF_FILE'


X/*
X * snmp_vars.c - return a pointer to the named variable.
X *

X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#ifdef KINETICS
X#include "gw.h"
X#include "fp4/pbuf.h"
X#include "fp4/cmdmacro.h"
X#include "ab.h"
X#include "glob.h"


X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>

X#ifndef NULL
X#define NULL 0
X#endif

X#endif
X
X
X#include "asn1.h"
X#include "snmp.h"
X#include "snmp_impl.h"
X#include "mib.h"
X#include "inet.h"
X#include "snmp_vars.h"


X/*
X * Each variable name is placed in the variable table, without the terminating
X * substring that determines the instance of the variable. When a string is found that
X * is lexicographicly preceded by the input string, the function for that entry is
X * called to find the method of access of the instance of the named variable. If
X * that variable is not found, NULL is returned, and the search through the table
X * continues (it should stop at the next entry). If it is found, the function returns
X * a character pointer and a length or a function pointer. The former is the address

X * of the operand, the latter is an access routine for the variable.


X *
X * u_char *

X * findVar(name, length, exact, var_len, access_method)


X * oid *name; IN/OUT - input name requested, output name found
X * int length; IN/OUT - number of sub-ids in the in and out oid's
X * int exact; IN - TRUE if an exact match was requested.
X * int len; OUT - length of variable or 0 if function returned.

X * int access_method; OUT - 1 if function, 0 if char pointer.
X *
X * accessVar(rw, var, varLen)
X * int rw; IN - request to READ or WRITE the variable
X * u_char *var; IN/OUT - input or output buffer space
X * int *varLen;IN/OUT - input and output buffer len
X */
X
Xstruct variable {
X oid name[16]; /* object identifier of variable */
X u_char namelen; /* length of above */
X char type; /* type of variable, INTEGER or (octet) STRING */
X u_char magic; /* passed to function as a hint */
X u_short acl; /* access control list for variable */
X u_char *(*findVar)(); /* function that finds variable */
X};
X
Xchar version_descr[30] = "Kinetics FastPath4";
Xoid version_id[] = {1, 3, 6, 1, 4, 1, 3, 1, 1};
Xint version_id_len = sizeof(version_id);
Xu_long uptime;
Xlong cfg_nnets = MAX_INTERFACES;
Xlong long_return;
Xu_char return_buf[64];
X
X
Xstruct mib_ifEntry mib_ifEntry_proto[MAX_INTERFACES] = {
X {1, "Kinetics KFPS2 Ethernet", MIB_IFTYPE_ETHERNETCSMACD,
X 1500, 10000000L, "",
X 6, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
X {2, "Kinetics KFPS2 Appletalk", MIB_IFTYPE_OTHER,
X 1500, 230000L, "",
X 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
X};
Xstruct mib_ifEntry mib_ifEntry[MAX_INTERFACES];
X
Xstruct mib_ip mib_ip_proto = {
X 1, IPFRAGTTL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
X};
Xstruct mib_ip mib_ip;
X
X#define ROUTE_DEFAULT 0
X#define ROUTE_LOCAL 1
Xstruct mib_ipRouteEntry mib_ipRouteEntry_proto[2] = {
X {0, 1, 1, -1, -1, -1, 0, MIB_IPROUTETYPE_REMOTE, MIB_IPROUTEPROTO_LOCAL, 0}, /* default route */
X {0, 1, 0, -1, -1, -1, 0, MIB_IPROUTETYPE_DIRECT, MIB_IPROUTEPROTO_LOCAL, 0} /* local route */
X};
Xstruct mib_ipRouteEntry mib_ipRouteEntry[2];
X
Xstruct mib_udp mib_udp_proto = {


X 0, 0, 0, 0
X};

Xstruct mib_udp mib_udp;
X
Xlong mib_icmpInMsgs;
Xlong mib_icmpOutMsgs;
Xlong mib_icmpInErrors; /* not checked in KIP */
Xlong mib_icmpOutErrors; /* not checked in KIP */
Xlong mib_icmpInCount[ICMP_MAXTYPE + 1];
Xlong mib_icmpOutCount[ICMP_MAXTYPE + 1];
X
X
Xinit_snmp(){
X bcopy((char *)mib_ifEntry_proto, (char *)mib_ifEntry, sizeof(mib_ifEntry));
X bcopy((char *)&mib_ip_proto, (char *)&mib_ip, sizeof(mib_ip));
X bcopy((char *)mib_ipRouteEntry_proto, (char *)mib_ipRouteEntry, sizeof(mib_ipRouteEntry));
X bcopy((char *)&mib_udp_proto, (char *)&mib_udp, sizeof(mib_udp));
X}
X
X/*
X * These are byte offsets into their structures.
X * This really should be computed by the compiler, but the
X * compiler I'm using doesn't want to do this.
X */
X#define VERSION_DESCR 0
X#define VERSION_ID 32
X#define CFG_NNETS 48
X#define UPTIME 52
X
X#define IFINDEX 0
X#define IFDESCR 4
X#define IFTYPE 36
X#define IFMTU 40
X#define IFSPEED 44
X#define IFPHYSADDRESS 48
X#define IFADMINSTATUS 60
X#define IFOPERSTATUS 64
X#define IFLASTCHANGE 68
X#define IFINOCTETS 72
X#define IFINUCASTPKTS 76
X#define IFINNUCASTPKTS 80
X#define IFINDISCARDS 84
X#define IFINERRORS 88
X#define IFINUNKNOWNPROTOS 92
X#define IFOUTOCTETS 96
X#define IFOUTUCASTPKTS 100
X#define IFOUTNUCASTPKTS 104
X#define IFOUTDISCARDS 108
X#define IFOUTERRORS 112
X#define IFOUTQLEN 116
X
X#define ATIFINDEX 0
X#define ATPHYSADDRESS 4
X#define ATNETADDRESS 16
X
X#define IPFORWARDING 0
X#define IPDEFAULTTTL 4
X#define IPINRECEIVES 8
X#define IPINHDRERRORS 12
X#define IPINADDRERRORS 16
X#define IPFORWDATAGRAMS 20
X#define IPINUNKNOWNPROTOS 24
X#define IPINDISCARDS 28
X#define IPINDELIVERS 32
X#define IPOUTREQUESTS 36
X#define IPOUTDISCARDS 40
X#define IPOUTNOROUTES 44
X#define IPREASMTIMEOUT 48
X#define IPREASMREQDS 52
X#define IPREASMOKS 56
X#define IPREASMFAILS 60
X#define IPFRAGOKS 64
X#define IPFRAGFAILS 68
X#define IPFRAGCREATES 72
X
X#define IPADADDR 0
X#define IPADIFINDEX 4
X#define IPADNETMASK 8
X#define IPADBCASTADDR 12
X
X#define IPROUTEDEST 0
X#define IPROUTEIFINDEX 4
X#define IPROUTEMETRIC1 8
X#define IPROUTEMETRIC2 12
X#define IPROUTEMETRIC3 16
X#define IPROUTEMETRIC4 20
X#define IPROUTENEXTHOP 24
X#define IPROUTETYPE 28
X#define IPROUTEPROTO 32
X#define IPROUTEAGE 36
X
X#define ICMPINMSGS 0
X#define ICMPINERRORS 4
X#define ICMPINDESTUNREACHS 8
X#define ICMPINTIMEEXCDS 12
X#define ICMPINPARMPROBS 16
X#define ICMPINSRCQUENCHS 20
X#define ICMPINREDIRECTS 24
X#define ICMPINECHOS 28
X#define ICMPINECHOREPS 32
X#define ICMPINTIMESTAMPS 36
X#define ICMPINTIMESTAMPREPS 40
X#define ICMPINADDRMASKS 44
X#define ICMPINADDRMASKREPS 48
X#define ICMPOUTMSGS 52
X#define ICMPOUTERRORS 56
X#define ICMPOUTDESTUNREACHS 60
X#define ICMPOUTTIMEEXCDS 64
X#define ICMPOUTPARMPROBS 68
X#define ICMPOUTSRCQUENCHS 72
X#define ICMPOUTREDIRECTS 76
X#define ICMPOUTECHOS 80
X#define ICMPOUTECHOREPS 84
X#define ICMPOUTTIMESTAMPS 88
X#define ICMPOUTTIMESTAMPREPS 92
X#define ICMPOUTADDRMASKS 96
X#define ICMPOUTADDRMASKREPS 100
X
X#define UDPINDATAGRAMS 0
X#define UDPNOPORTS 4
X#define UDPINERRORS 8
X#define UDPOUTDATAGRAMS 12


X
Xstruct variable variables[] = {
X /* these must be lexicographly ordered by the name field */

X {{MIB, 1, 1, 0}, 9, STRING, VERSION_DESCR, RONLY, var_system },


X {{MIB, 1, 2, 0}, 9, OBJID, VERSION_ID, RONLY, var_system },
X {{MIB, 1, 3, 0}, 9, TIMETICKS, UPTIME, RONLY, var_system },

X {{MIB, 2, 1, 0}, 9, INTEGER, CFG_NNETS, RONLY, var_system },


X {{MIB, 2, 2, 1, 1, 0xFF}, 11, INTEGER, IFINDEX, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 2, 0xFF}, 11, STRING, IFDESCR, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 3, 0xFF}, 11, INTEGER, IFTYPE, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 4, 0xFF}, 11, INTEGER, IFMTU, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 5, 0xFF}, 11, GAUGE, IFSPEED, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 6, 0xFF}, 11, STRING, IFPHYSADDRESS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 7, 0xFF}, 11, INTEGER, IFADMINSTATUS, RWRITE, var_ifEntry },
X {{MIB, 2, 2, 1, 8, 0xFF}, 11, INTEGER, IFOPERSTATUS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 9, 0xFF}, 11, TIMETICKS, IFLASTCHANGE, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 10, 0xFF}, 11, COUNTER, IFINOCTETS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 11, 0xFF}, 11, COUNTER, IFINUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 12, 0xFF}, 11, COUNTER, IFINNUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 13, 0xFF}, 11, COUNTER, IFINDISCARDS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 14, 0xFF}, 11, COUNTER, IFINERRORS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 15, 0xFF}, 11, COUNTER, IFINUNKNOWNPROTOS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 16, 0xFF}, 11, COUNTER, IFOUTOCTETS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 17, 0xFF}, 11, COUNTER, IFOUTUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 18, 0xFF}, 11, COUNTER, IFOUTNUCASTPKTS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 19, 0xFF}, 11, COUNTER, IFOUTDISCARDS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 20, 0xFF}, 11, COUNTER, IFOUTERRORS, RONLY, var_ifEntry },
X {{MIB, 2, 2, 1, 21, 0xFF}, 11, GAUGE, IFOUTQLEN, RONLY, var_ifEntry },

X {{MIB, 3, 1, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, INTEGER, ATIFINDEX, RWRITE, var_atEntry },
X {{MIB, 3, 1, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, STRING, ATPHYSADDRESS, RWRITE, var_atEntry },
X {{MIB, 3, 1, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, IPADDRESS, ATNETADDRESS, RWRITE, var_atEntry },


X {{MIB, 4, 1, 0}, 9, INTEGER, IPFORWARDING, RONLY, var_ip },

X {{MIB, 4, 2, 0}, 9, INTEGER, IPDEFAULTTTL, RWRITE, var_ip },


X {{MIB, 4, 3, 0}, 9, COUNTER, IPINRECEIVES, RONLY, var_ip },
X {{MIB, 4, 4, 0}, 9, COUNTER, IPINHDRERRORS, RONLY, var_ip },
X {{MIB, 4, 5, 0}, 9, COUNTER, IPINADDRERRORS, RONLY, var_ip },
X {{MIB, 4, 6, 0}, 9, COUNTER, IPFORWDATAGRAMS, RONLY, var_ip },
X {{MIB, 4, 7, 0}, 9, COUNTER, IPINUNKNOWNPROTOS, RONLY, var_ip },
X {{MIB, 4, 8, 0}, 9, COUNTER, IPINDISCARDS, RONLY, var_ip },
X {{MIB, 4, 9, 0}, 9, COUNTER, IPINDELIVERS, RONLY, var_ip },
X {{MIB, 4, 10, 0}, 9, COUNTER, IPOUTREQUESTS, RONLY, var_ip },
X {{MIB, 4, 11, 0}, 9, COUNTER, IPOUTDISCARDS, RONLY, var_ip },
X {{MIB, 4, 12, 0}, 9, COUNTER, IPOUTNOROUTES, RONLY, var_ip },
X {{MIB, 4, 13, 0}, 9, INTEGER, IPREASMTIMEOUT, RONLY, var_ip },
X {{MIB, 4, 14, 0}, 9, COUNTER, IPREASMREQDS, RONLY, var_ip },
X {{MIB, 4, 15, 0}, 9, COUNTER, IPREASMOKS, RONLY, var_ip },
X {{MIB, 4, 16, 0}, 9, COUNTER, IPREASMFAILS, RONLY, var_ip },
X {{MIB, 4, 17, 0}, 9, COUNTER, IPFRAGOKS, RONLY, var_ip },
X {{MIB, 4, 18, 0}, 9, COUNTER, IPFRAGFAILS, RONLY, var_ip },
X {{MIB, 4, 19, 0}, 9, COUNTER, IPFRAGCREATES, RONLY, var_ip },
X {{MIB, 4, 20, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADADDR, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPADIFINDEX, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADNETMASK, RONLY, var_ipAddrEntry },
X {{MIB, 4, 20, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPADBCASTADDR, RONLY, var_ipAddrEntry },

X {{MIB, 4, 21, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTEDEST, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEIFINDEX, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC1, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC2, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 5, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC3, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 6, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEMETRIC4, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 7, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTENEXTHOP, RWRITE, var_ipRouteEntry },
X {{MIB, 4, 21, 1, 8, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTETYPE, RWRITE, var_ipRouteEntry },


X {{MIB, 4, 21, 1, 9, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEPROTO, RONLY, var_ipRouteEntry },

X {{MIB, 4, 21, 1, 10, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER, IPROUTEAGE, RWRITE, var_ipRouteEntry },

X {{MIB, 7, 1, 0}, 9, COUNTER, UDPINDATAGRAMS, RONLY, var_udp },
X {{MIB, 7, 2, 0}, 9, COUNTER, UDPNOPORTS, RONLY, var_udp },
X {{MIB, 7, 3, 0}, 9, COUNTER, UDPINERRORS, RONLY, var_udp },
X {{MIB, 7, 4, 0}, 9, COUNTER, UDPOUTDATAGRAMS, RONLY, var_udp }
X};

X
X
X
X
X/*

X for(x = 0, vp = variables; x < sizeof(variables)/sizeof(struct variable); vp++, x++){

X /*
X * compare should be expanded inline.
X */
X result = compare(name, *namelen, vp->name, (int)vp->namelen);


X if ((result < 0) || (exact && (result == 0))){
X access = (*(vp->findVar))(vp, name, namelen, exact, len, access_method);
X if (access != NULL)

X break;
X }
X }


X if (x == sizeof(variables)/sizeof(struct variable))

X return NULL;
X


X /* vp now points to the approprate struct */
X *type = vp->type;
X *acl = vp->acl;
X return access;

X}
X
X
X
Xint

Xcompare(name1, len1, name2, len2)
X register oid *name1, *name2;
X register int len1, len2;
X{
X register int len;
X
X /* len = minimum of len1 and len2 */
X if (len1 < len2)
X len = len1;
X else
X len = len2;
X /* find first non-matching byte */
X while(len-- > 0){
X if (*name1 < *name2)
X return -1;
X if (*name2++ < *name1++)

X return 1;
X }


X /* bytes match up to length of shorter string */
X if (len1 < len2)
X return -1; /* name1 shorter, so it is "less" */
X if (len2 < len1)
X return 1;
X return 0; /* both strings are equal */

X}
X
X
Xu_char *

Xvar_system(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))

X return NULL;


X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;

X *access_method = 0;


X *var_len = sizeof(long); /* default length */
X switch (vp->magic){
X case VERSION_DESCR:
X *var_len = strlen(version_descr);

X return (u_char *)version_descr;
X case VERSION_ID:
X *var_len = sizeof(version_id);
X return (u_char *)version_id;

X case CFG_NNETS:
X return (u_char *)&cfg_nnets;
X case UPTIME:
X return (u_char *)&uptime;


X default:
X ERROR("");
X }

X return NULL;
X}
X
X

Xu_char *
Xvar_ifEntry(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X oid newname[MAX_NAME_LEN];
X register int interface;

X register struct mib_ifEntry *ifp;
X extern struct conf conf;
X int result;


X
X bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));
X /* find "next" interface */

X for(interface = 1; interface <= MAX_INTERFACES; interface++){


X newname[10] = (oid)interface;
X result = compare(name, *length, newname, (int)vp->namelen);
X if ((exact && (result == 0)) || (!exact && (result < 0)))

X break;
X }
X if (interface > MAX_INTERFACES)
X return NULL;
X interface--; /* translate into internal index of interfaces */
X bcopy((char *)newname, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;

X *access_method = 0;


X *var_len = sizeof(long);
X

X ifp = &mib_ifEntry[interface];
X switch (vp->magic){
X case IFDESCR:
X *var_len = strlen(ifp->ifDescr);
X return (u_char *)ifp->ifDescr;
X case IFPHYSADDRESS:
X *var_len = ifp->PhysAddrLen;
X if (interface == 0)
X return (u_char *)ifie.if_haddr;
X else {
X /*
X * As far as IP is concerned, the "physical" address includes the Appletalk
X * network address as well as node number.
X */
X return_buf[0] = ((u_char *)&conf.atneta)[0];
X return_buf[1] = ((u_char *)&conf.atneta)[1];
X return_buf[2] = ifab.if_dnode;


X return (u_char *)return_buf;
X }

X case IFOUTQLEN:
X#ifdef notdef
X if (interface == 0)
X long_return = sendq->pq_len;
X else
X long_return = 0; /* There is no appletalk transmit queue */


X#else
X long_return = 0;
X#endif

X return (u_char *)&long_return;
X default:

X return (u_char *)(((char *)ifp) + vp->magic);
X }
X}
X
X/*
X * from arp.c:
X * There is no arp.h, so this must be recreated here.
X */
X#define ARPHLNMAX 6 /* largest arp_hln value needed */
X#define ARPPLN 4 /* length of protocol address (IP) */
Xstruct arptab {
X iaddr_t at_iaddr; /* internet address */
X u_char at_haddr[ARPHLNMAX]; /* hardware address */
X u_char at_timer; /* minutes since last reference */
X u_char at_flags; /* flags */
X struct pbuf *at_hold; /* last packet until resolved/timeout */
X};
X/* at_flags field values */
X#define ATF_INUSE 1 /* entry in use */
X#define ATF_COM 2 /* completed entry (haddr valid) */
X
X#define ARPTAB_BSIZ 5 /* bucket size */
X#define ARPTAB_NB 11 /* number of buckets */
X#define ARPTAB_SIZE (ARPTAB_BSIZ * ARPTAB_NB)
X
X
Xu_char *
Xvar_atEntry(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */
X{
X /*


X * object identifier is of form:
X * 1.3.6.1.2.1.3.1.1.1.interface.1.A.B.C.D, where A.B.C.D is IP address.
X * Interface is at offset 10,
X * IPADDR starts at offset 12.
X */

X oid lowest[16];
X oid current[16];

X register struct arptab *arp;
X struct arptab *lowarp = 0;
X extern struct arptab arptab[];
X register struct ipdad *ipdp;
X struct ipdad *lowipdp = 0;
X extern struct ipdad ipdad[];
X long ipaddr;
X int addrlen;
X extern struct conf conf;
X register u_char *cp;
X register oid *op;


X register int count;
X

X /* fill in object part of name for current (less sizeof instance part) */
X bcopy((char *)vp->name, (char *)current, (int)(vp->namelen - 6) * sizeof(oid));

X for(arp = arptab; arp < arptab + ARPTAB_SIZE; arp++){
X if (!(arp->at_flags & ATF_COM)) /* if this entry isn't valid */
X continue;
X /* create new object id */
X current[10] = 1; /* ifIndex == 1 (ethernet) */


X current[11] = 1;

X cp = (u_char *)&(arp->at_iaddr);


X op = current + 12;

X for(count = 4; count > 0; count--)
X *op++ = *cp++;


X if (exact){
X if (compare(current, 16, name, *length) == 0){
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));

X lowarp = arp;
X break; /* no need to search further */
X }
X } else {
X if ((compare(current, 16, name, *length) > 0) && (!lowarp || (compare(current, 16, lowest, 16) < 0))){


X /*
X * if new one is greater than input and closer to input than
X * previous lowest, save this one as the "next" one.
X */
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));

X lowarp = arp;
X }
X }
X }
X ipaddr = conf.ipaddr + conf.ipstatic + 1;
X for(ipdp = ipdad; ipdp < ipdad + NIPDAD; ipdp++, ipaddr++){
X if (ipdp->timer == 0) /* if this entry is unused, continue */
X continue;
X /* create new object id */
X current[10] = 2; /* ifIndex == 2 (appletalk) */


X current[11] = 1;

X cp = (u_char *)&ipaddr;


X op = current + 12;

X for(count = 4; count > 0; count--)
X *op++ = *cp++;


X if (exact){
X if (compare(current, 16, name, *length) == 0){
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));

X lowipdp = ipdp;
X lowarp = 0;
X break; /* no need to search further */
X }
X } else {
X if ((compare(current, 16, name, *length) > 0) && ((!lowarp && !lowipdp) || (compare(current, 16, lowest, 16) < 0))){


X /*
X * if new one is greater than input and closer to input than
X * previous lowest, save this one as the "next" one.
X */
X bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));

X lowipdp = ipdp;
X /* ipdad entry is lower, so invalidate arp entry */
X lowarp = 0;
X }
X }
X }
X if (lowarp != 0){ /* arp entry was lowest */
X addrlen = 6;
X bcopy((char *)lowarp->at_haddr, (char *)return_buf, 6);
X } else if (lowipdp != 0) {
X addrlen = 3;
X /*
X * As far as IP is concerned, the "physical" address includes the Appletalk
X * network address as well as node number.
X */
X return_buf[0] = ((u_char *)&lowipdp->net)[0];
X return_buf[1] = ((u_char *)&lowipdp->net)[1];
X return_buf[2] = lowipdp->node;
X } else
X return NULL; /* no match */


X bcopy((char *)lowest, (char *)name, 16 * sizeof(oid));
X *length = 16;

X *access_method = 0;


X switch(vp->magic){
X case ATIFINDEX:
X *var_len = sizeof long_return;

X long_return = lowest[10];


X return (u_char *)&long_return;
X case ATPHYSADDRESS:

X *var_len = addrlen;
X return (u_char *)return_buf;


X case ATNETADDRESS:
X *var_len = sizeof long_return;

X cp = (u_char *)&long_return;
X op = lowest + 12;
X for(count = 4; count > 0; count--)
X *cp++ = *op++;


X return (u_char *)&long_return;
X default:
X ERROR("");
X }

X return NULL;
X}
X

Xu_char *
Xvar_ip(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))

X return NULL;


X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;

X *access_method = 0;
X *var_len = sizeof(long);
X return ((u_char *)&mib_ip) + vp->magic;
X}
X
Xu_char *
Xvar_ipRouteEntry(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */

X register int *length; /* IN/OUT - length of input and output strings */


X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X oid newname[MAX_NAME_LEN];

X register int entry;
X register struct mib_ipRouteEntry *routep;
X int result;
X register int count;
X register u_char *cp;
X register oid *op;
X extern struct conf conf;
X
X /* set up a routing table to search. All other values are set at startup. */
X routep = mib_ipRouteEntry;
X routep[ROUTE_DEFAULT].ipRouteDest = 0;
X routep[ROUTE_DEFAULT].ipRouteNextHop = conf.iproutedef;
X routep[ROUTE_LOCAL].ipRouteDest = ipnetpart(conf.ipaddr);
X routep[ROUTE_LOCAL].ipRouteNextHop = conf.ipaddr;


X
X bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));

X /* find "next" route */
X for(entry = 0; entry < ROUTE_ENTRIES; entry++){
X cp = (u_char *)&routep->ipRouteDest;


X op = newname + 10;

X for(count = 4; count > 0; count--)
X *op++ = *cp++;


X result = compare(name, *length, newname, (int)vp->namelen);
X if ((exact && (result == 0)) || (!exact && (result < 0)))
X break;

X routep++;
X }
X if (entry >= ROUTE_ENTRIES)
X return NULL;


X bcopy((char *)newname, (char *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;

X *access_method = 0;


X *var_len = sizeof(long);
X

X routep = &mib_ipRouteEntry[entry];
X switch (vp->magic){
X case IPROUTENEXTHOP:
X if (entry == ROUTE_DEFAULT)
X return (u_char *)&conf.iproutedef;
X else
X return (u_char *)&conf.ipaddr;
X default:
X return (u_char *)(((u_char *)routep) + vp->magic);


X }
X}
X
Xu_char *

Xvar_ipAddrEntry(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */
X{
X oid newname[14];
X int result;
X extern struct conf conf;
X register int count;
X register u_char *cp;
X register oid *op;


X
X bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));

X /* now find "next" ipaddr */
X /*
X * foreach ipaddress entry, cobble up newname with its IP address,
X * by copying the ipaddress into the 10 - 13't subid's
X * then compare with name. If greater than name and less than lowest,
X * save as new lowest.
X * Having said all that, I'm now going to cheat because I only have one
X * IP address (on both interfaces).
X */
X cp = (u_char *)&conf.ipaddr;


X op = newname + 10;

X for(count = sizeof(conf.ipaddr); count > 0; count--)
X *op++ = *cp++;


X result = compare(name, *length, newname, (int)vp->namelen);

X if ((exact && (result != 0)) || (!exact && (result >= 0)))
X return NULL; /* no match */
X bcopy((char *)newname, (char *)name, (int)vp->namelen * sizeof(oid));


X *length = vp->namelen;

X *access_method = 0;
X *var_len = sizeof(long);
X
X switch (vp->magic){
X case IPADADDR:
X return (u_char *)&conf.ipaddr;
X case IPADIFINDEX:
X /*
X * Always return ethernet interface. SNMP
X * has no access method to access instances
X * on different interfaces with same IP address.
X */
X long_return = 1;
X return (u_char *)&long_return;
X case IPADNETMASK:
X long_return = (IN_CLASSA(conf.ipaddr) ? IN_CLASSA_NET :
X (IN_CLASSB(conf.ipaddr) ? IN_CLASSB_NET : IN_CLASSC_NET));
X return (u_char *)&long_return;
X case IPADBCASTADDR:
X long_return = conf.ipbroad & 1;


X return (u_char *)&long_return;
X default:
X ERROR("");
X }

X return NULL;
X}
X
X

Xu_char *
Xvar_icmp(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))

X return NULL;


X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;

X *access_method = 0;


X *var_len = sizeof(long); /* all following variables are sizeof long */

X switch (vp->magic){
X case ICMPINMSGS:
X return (u_char *)&mib_icmpInMsgs;
X case ICMPINERRORS:
X return (u_char *)&mib_icmpInErrors;
X case ICMPINDESTUNREACHS:
X return (u_char *)&mib_icmpInCount[3];
X case ICMPINTIMEEXCDS:
X return (u_char *)&mib_icmpInCount[11];
X case ICMPINPARMPROBS:
X return (u_char *)&mib_icmpInCount[12];
X case ICMPINSRCQUENCHS:
X return (u_char *)&mib_icmpInCount[4];
X case ICMPINREDIRECTS:
X return (u_char *)&mib_icmpInCount[5];
X case ICMPINECHOS:
X return (u_char *)&mib_icmpInCount[8];
X case ICMPINECHOREPS:
X return (u_char *)&mib_icmpInCount[0];
X case ICMPINTIMESTAMPS:
X return (u_char *)&mib_icmpInCount[13];
X case ICMPINTIMESTAMPREPS:
X return (u_char *)&mib_icmpInCount[14];
X case ICMPINADDRMASKS:
X return (u_char *)&mib_icmpInCount[17];
X case ICMPINADDRMASKREPS:
X return (u_char *)&mib_icmpInCount[18];
X case ICMPOUTMSGS:
X return (u_char *)&mib_icmpOutMsgs;
X case ICMPOUTERRORS:
X return (u_char *)&mib_icmpOutErrors;
X case ICMPOUTDESTUNREACHS:
X return (u_char *)&mib_icmpOutCount[3];
X case ICMPOUTTIMEEXCDS:
X return (u_char *)&mib_icmpOutCount[11];
X case ICMPOUTPARMPROBS:
X return (u_char *)&mib_icmpOutCount[12];
X case ICMPOUTSRCQUENCHS:
X return (u_char *)&mib_icmpOutCount[4];
X case ICMPOUTREDIRECTS:
X return (u_char *)&mib_icmpOutCount[5];
X case ICMPOUTECHOS:
X return (u_char *)&mib_icmpOutCount[8];
X case ICMPOUTECHOREPS:
X return (u_char *)&mib_icmpOutCount[0];
X case ICMPOUTTIMESTAMPS:
X return (u_char *)&mib_icmpOutCount[13];
X case ICMPOUTTIMESTAMPREPS:
X return (u_char *)&mib_icmpOutCount[14];
X case ICMPOUTADDRMASKS:
X return (u_char *)&mib_icmpOutCount[17];
X case ICMPOUTADDRMASKREPS:
X return (u_char *)&mib_icmpOutCount[18];


X default:
X ERROR("");
X }

X return NULL;
X}
X
X

Xu_char *
Xvar_udp(vp, name, length, exact, var_len, access_method)


X register struct variable *vp; /* IN - pointer to variable entry that points here */
X oid *name; /* IN/OUT - input name requested, output name found */
X int *length; /* IN/OUT - length of input and output oid's */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */

X int *access_method; /* OUT - 1 if function, 0 if char pointer. */


X{
X if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))

X return NULL;


X bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
X *length = vp->namelen;

X *access_method = 0;
X *var_len = sizeof(long);
X return ((u_char *)&mib_udp) + vp->magic;
X}
END_OF_FILE
if test 33903 -ne `wc -c <'netramet/src/snmplib/~snmp_vars.c.kip'`; then
echo shar: \"'netramet/src/snmplib/~snmp_vars.c.kip'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/~snmp_vars.c.kip'
fi
echo shar: End of archive 18 \(of 25\).
cp /dev/null ark18isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:14:09 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 107
Archive-name: netramet/part19
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/manager/oldnm.c
# netramet/src/snmplib/snmpapi.c
# netramet/src/snmplib/~snmp_vars.h.kip
# Wrapped by kent@sparky on Tue Nov 2 18:17:11 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 19 (of 25)."'
if test -f 'netramet/src/manager/oldnm.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/oldnm.c'\"
else
echo shar: Extracting \"'netramet/src/manager/oldnm.c'\" \(29675 characters\)
sed "s/^X//" >'netramet/src/manager/oldnm.c' <<'END_OF_FILE'
X/* 1200, Fri 23 Oct 92


X
X NM.C: First attempt at a manager for the AU Accounting Meter
X

X Copyright (C) 1992 by Nevil Brownlee,

X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"
X

X#ifndef BSD4_3
X#define BSD4_2
X#endif
X

X#define FLOWLIMIT 6000


X#define RULEFILE "rules.txt"
X
Xextern int errno;
Xint snmp_dump_packet = 0;

X
X#define INT_ACCT 1, 3, 6, 1, 3, 99

X#define AUKUNI 1, 3, 6, 1, 4, 1, 411


X
Xoid o_sysDescr[] = {MIB, 1, 1, 0};
Xoid o_sysUpTime[] = {MIB, 1, 3, 0};
Xoid o_ifNumber[] = {MIB, 2, 1, 0};
X

X#define FT_INDEX (sizeof(o_ftFlowNbr)/sizeof(oid) - 1)
X
Xoid o_ftFlowNbr[] = {INT_ACCT, 3, 1, 1, 0xFFFF};
Xoid o_ftFlowStatus[] = {INT_ACCT, 3, 1, 2, 0xFFFF};
Xoid o_ftNextActiveFlow[] = {INT_ACCT, 3, 1, 3, 0xFFFF};
Xoid o_ftAddrType[] = {INT_ACCT, 3, 1, 4, 0xFFFF};
Xoid o_ftFromAddr[] = {INT_ACCT, 3, 1, 5, 0xFFFF};
Xoid o_ftFromMask[] = {INT_ACCT, 3, 1, 6, 0xFFFF};
Xoid o_ftFromTally[] = {INT_ACCT, 3, 1, 7, 0xFFFF};
Xoid o_ftToAddr[] = {INT_ACCT, 3, 1, 8, 0xFFFF};
Xoid o_ftToMask[] = {INT_ACCT, 3, 1, 9, 0xFFFF};
Xoid o_ftToTally[] = {INT_ACCT, 3, 1,10, 0xFFFF};
Xoid o_ftFwdPackets[] = {INT_ACCT, 3, 1,11, 0xFFFF};
Xoid o_ftFwdBytes[] = {INT_ACCT, 3, 1,12, 0xFFFF};
Xoid o_ftBackPackets[] = {INT_ACCT, 3, 1,13, 0xFFFF};
Xoid o_ftBackBytes[] = {INT_ACCT, 3, 1,14, 0xFFFF};
Xoid o_ftChkFwdPackets[] = {INT_ACCT, 3, 1,15, 0xFFFF};
Xoid o_ftChkFwdBytes[] = {INT_ACCT, 3, 1,16, 0xFFFF};
Xoid o_ftChkBackPackets[] = {INT_ACCT, 3, 1,17, 0xFFFF};
Xoid o_ftChkBackBytes[] = {INT_ACCT, 3, 1,18, 0xFFFF};
Xoid o_ftFlowBlob[] = {INT_ACCT, 3, 1,19, 0xFFFF};
Xoid o_ftFlowCount[] = {INT_ACCT, 3, 2, 0};
Xoid o_ftChkTime[] = {INT_ACCT, 3, 3, 0};
Xoid o_ftChkFlowCount[] = {INT_ACCT, 3, 4, 0};
Xoid o_ftPrevChkTime[] = {INT_ACCT, 3, 5, 0};
Xoid o_ftChkActFlows[] = {INT_ACCT, 3, 6, 0};
Xoid o_ftFirstActFlow[] = {INT_ACCT, 3, 7, 0};
Xoid o_ftCheckPoint[] = {INT_ACCT, 3, 8, 0};
X
X#define RT_INDEX (sizeof(o_rtIndex)/sizeof(oid) - 1)
X
Xoid o_rtIndex[] = {INT_ACCT, 4, 1, 1, 0xFFFF};
Xoid o_rtTreeNbr[] = {INT_ACCT, 4, 1, 2, 0xFFFF};
Xoid o_rtAddrType[] = {INT_ACCT, 4, 1, 3, 0xFFFF};
Xoid o_rtFromAddr[] = {INT_ACCT, 4, 1, 4, 0xFFFF};
Xoid o_rtFromMask[] = {INT_ACCT, 4, 1, 5, 0xFFFF};
Xoid o_rtFromTally[] = {INT_ACCT, 4, 1, 6, 0xFFFF};
Xoid o_rtToAddr[] = {INT_ACCT, 4, 1, 7, 0xFFFF};
Xoid o_rtToMask[] = {INT_ACCT, 4, 1, 8, 0xFFFF};
Xoid o_rtToTally[] = {INT_ACCT, 4, 1, 9, 0xFFFF};
X
Xoid o_crRuleCount[] = {INT_ACCT, 4, 2, 0};
Xoid o_crTreeNbr[] = {INT_ACCT, 4, 3, 0};
Xoid o_crAddrType[] = {INT_ACCT, 4, 4, 0};
Xoid o_crFromAddr[] = {INT_ACCT, 4, 5, 0};
Xoid o_crFromMask[] = {INT_ACCT, 4, 6, 0};
Xoid o_crFromTally[] = {INT_ACCT, 4, 7, 0};
Xoid o_crToAddr[] = {INT_ACCT, 4, 8, 0};
Xoid o_crToMask[] = {INT_ACCT, 4, 9, 0};
Xoid o_crToTally[] = {INT_ACCT, 4,10, 0};
X
X#define PT_INDEX (sizeof(o_ptPacketType) - 1)
X
Xoid o_ptpacket_types[] = {AUKUNI, 1, 1, 0};
Xoid o_ptPacketType[] = {AUKUNI, 1, 2, 1, 1, 0xFF};
Xoid o_ptPacketCount[] = {AUKUNI, 1, 2, 1, 2, 0xFF};
Xoid o_ptByteCount[] = {AUKUNI, 1, 2, 1, 3, 0xFF};


X
Xoid o_pcNearMem[] = {AUKUNI, 2, 1, 0};
Xoid o_pcFarMem[] = {AUKUNI, 2, 2, 0};
Xoid o_pcBadPackets[] = {AUKUNI, 2, 3, 0};
Xoid o_pcNoBufPackets[] = {AUKUNI, 2, 4, 0};
Xoid o_pcLostPackets[] = {AUKUNI, 2, 5, 0};
Xoid o_pcPacketBacklog[] = {AUKUNI, 2, 6, 0};
Xoid o_pcChkSearches[] = {AUKUNI, 2, 7, 0};
Xoid o_pcChkCompares[] = {AUKUNI, 2, 8, 0};
X
X

X#define ADDR_LEN 4
X
Xstruct flow_info {
X unsigned char AddrType,
X FromAddr[ADDR_LEN], FromMask[ADDR_LEN], FromTally[ADDR_LEN],
X ToAddr[ADDR_LEN], ToMask[ADDR_LEN], ToTally[ADDR_LEN];
X unsigned long
X FwdPackets,FwdBytes, BackPackets,BackBytes;
X unsigned short NextActiveFlow;
X };
X
Xstruct rule_info {
X int RuleNbr;
X unsigned char TreeNbr, AddrType,
X FromAddr[ADDR_LEN], FromMask[ADDR_LEN], FromTally[ADDR_LEN],
X ToAddr[ADDR_LEN], ToMask[ADDR_LEN], ToTally[ADDR_LEN];


X };
X
X#define AT_IGNORE 0 /* Addr_type values */

X#define AT_IP 1
X#define AT_NOVELL 2
X#define AT_DECNET 3
X#define AT_ETHERTALK 4


X
X#define NAME_LN 64
X
Xstruct meter_status {
X struct meter_status *next;
X
X char name[NAME_LN];
X char community[NAME_LN];
X char rulefile[NAME_LN];
X
X struct snmp_session *ss;
X
X short status;
X
X char descr[NAME_LN]; /* From meter_info() */

X long uptime;
X short ifcount;
X
X unsigned short flowcount; /* Current nbr of flows */
X unsigned short rulecount; /* and rules */
X
X unsigned short flowsknown; /* Nbr of flows we have key data for */
X
X unsigned short CheckPoint;
X unsigned short ChkFlowCount;
X unsigned short ChkActFlows;
X unsigned short FirstActFlow;
X long ChkTime;
X long PrevChkTime;

Xvoid printaddress(FILE *f,unsigned char *a);
Xvoid getaddress(unsigned char *a);
X


Xvoid parse_rulefile(struct meter_status *ms, int list);
Xint add_rule(struct meter_status *ms, struct rule_info *ri);
X

Xint chk_info(struct meter_status *ms, int control);
X
Xint blob_info(struct meter_status *ms, unsigned char *fb, int fn);


Xint flow_info(struct meter_status *ms, struct flow_info *fi,

X int fn, int getkey, int getflow);


X
Xchar *uptime_string(unsigned long timeticks, char *buf);
X

Xint verbose;


X
Xvoid main(argc,argv)
Xint argc;
Xchar *argv[];
X{
X struct meter_status *ms;

X struct snmp_session session, *ssp;
X

X int arg;
X char meter[NAME_LN], community[NAME_LN], rfname[NAME_LN],
X filename[NAME_LN*2];
X int interval = 0;
X

X meter[0] = community[0] = rfname[0] = NULL;
X
X#ifdef MTR_LIST
X parse_ctlfile();
X#endif
X
X init_mib();
X
X /* usage: nm meter-name community */
X
X for (arg = 1; arg < argc; arg++) {
X if (argv[arg][0] == '-') {
X switch (argv[arg][1]) {
X case 'd':
X snmp_dump_packet++;
X break;
X case 'c':
X if ((interval = atoi(argv[arg]+2)) == 0) interval = 120;
X break;
X case 'r':
X strcpy(rfname, argv[++arg]);
X break;

X case 'v':
X verbose++;
X break;
X default:


X printf("Invalid option: -%c\n", argv[arg][1]);
X break;
X }

X continue;
X }


X if (meter[0] == NULL) strcpy(meter,argv[arg]);
X else if (community[0] == NULL) strcpy(community,argv[arg]);
X }
X
X if (meter[0] == NULL) {
X printf("nm meter-name community\n\n");
X exit(0);
X }
X
X ms = (struct meter_status *)calloc(sizeof(struct meter_status), 1);
X strcpy(ms->name,meter);
X strcpy(ms->community,community);
X if (*rfname) strcpy(ms->rulefile, rfname);
X else strcpy(ms->rulefile, RULEFILE);
X

X strcpy(filename,meter);
X strcat(filename,".log");
X if ((ms->log = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);
X }
X strcpy(filename,meter);
X strcat(filename,".keys");
X if ((ms->keys = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);
X }
X strcpy(filename,meter);
X strcat(filename,".flows");
X if ((ms->flows = fopen(filename,"wa")) == NULL) {
X printf("Failed to open %s\n",filename);
X exit(0);
X }

X
X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = ms->name;
X session.community = ms->community;

X session.community_len = strlen(ms->community);


X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ssp = snmp_open(&session);
X if (ssp == NULL) {
X printf("Couldn't open snmp to %s\n", session.peername);

X exit(-1);


X }
X ms->ss = ssp;
X

X ms->status = MT_MANAGE;
X first_meter = ms; /* $$$$$$$ */
X
X#ifdef MTR_LIST
X if (!explicit) add_all_meters();
X#endif
X
X init_meter();
X
X if (!interval) {
X print_meters();
X exit (0);
X }
X
X parse_rulefile(ms,TRUE); /* Download the rules we want to use */
X

X for (;;) {


X sleep(interval);
X
X monitor_meter();
X if (verbose) print_meters();
X }
X }
X
X#ifdef MTR_LIST
Xvoid parse_ctlfile()
X{
X struct meter_status *ms, *mp;

X FILE *fp;


X char linebuffer[256];
X char label[128];
X char community[128];
X int n;

X

X if (strcasecmp(name,ms->name) == 0) break;
X }
X

X }
X }
X else {


X printf("No config info for %s\n", name);
X return;

X }
X }
X }
X


X ms->status = MT_MANAGE;
X }
X#endif
X
Xvoid init_meter()
X{
X struct meter_status *ms;

X int haveone = 0;
X


X for (ms = first_meter; ms; ms = ms->next) {
X if (!(ms->status & MT_MANAGE)) continue;
X haveone++;
X if (meter_info(ms)) {
X ms->status |= (MT_UP | MT_INFO);
X meter_print(ms);

X }
X }
X

Xstruct meter_status *ms;
X{


X time_t t;
X char *ts;

X unsigned short fn, nactive, n;

X if (!chk_info(ms,1)) {
X printf("%19.19s -- %s: Failed to get chk info\n", ts,ms->name);
X return;
X }
X else {
X if (verbose) printf(
X "%19.19s -- %s: %u flows, %u active, %u first. From %ld to %ld\n",
X ts,ms->name,
X ms->ChkFlowCount,ms->ChkActFlows,ms->FirstActFlow,
X ms->PrevChkTime,ms->ChkTime);
X
X /* Get the keys and flows here .. */
X
X fprintf(ms->keys,
X "## %19.19s %s: %u flows, %u active. Checkpoint %u, from %ld to %ld##\n",
X ts,ms->name, ms->ChkFlowCount,ms->ChkActFlows,
X ms->CheckPoint, ms->PrevChkTime,ms->ChkTime);
X for (fn = ms->flowsknown+1; fn <= ms->ChkFlowCount; ++fn) {
X if (!flow_info(ms, &fi, fn, 1, 0)) {
X printf(ms->log," Failed to get key for flow %d\n", fn);
X printf("Failed to get key for flow %d\n", fn);
X }
X else {
X fprintf(ms->keys, "%u %u", fn, fi.AddrType);
X printaddress(ms->keys, fi.FromAddr);
X printaddress(ms->keys, fi.ToAddr);
X fprintf(ms->keys,"\n");
X }
X }
X ms->flowsknown = ms->ChkFlowCount;


X fflush(ms->keys);
X
X fprintf(ms->flows,

X "## %19.19s %s: %u flows, %u active. Checkpoint %u, from %ld to %ld##\n",
X ts,ms->name, ms->ChkFlowCount,ms->ChkActFlows,
X ms->CheckPoint, ms->PrevChkTime,ms->ChkTime);
X fn = ms->FirstActFlow; nactive = ms->ChkActFlows;
X while (nactive != 0) {
X if (!blob_info(ms,flowblob, fn)) {
X printf(ms->log," Failed to get flow for flow %d\n", fn);
X printf("Failed to get flow for flow %d\n", fn);
X }
X else {
X for (n = 0, afdp = flowblob; nactive != 0 && n != FLOWBLOBSZ;
X --nactive, ++n, afdp += flow_data_sz) {


X fprintf(ms->flows,"%u %lu %lu\n",

X fn = ntohs(getshort(afdp + flow_nbr_x)),


X ntohl(getlong(afdp + fwd_bytes_x)),
X ntohl(getlong(afdp + back_bytes_x)) );
X }
X }

X ++fn;


X }
X fflush(ms->flows);
X

X if (ms->flowsknown > FLOWLIMIT) chk_info(ms,-1); /* Restart meter */
X }
X
X fflush(ms->log);

X }
X
X#define ADD_VAR(v) snmp_add_null_var(pdu, v, sizeof(v)/sizeof(oid))

X#define ADD_X_VAR(v,x,n) { v[x] = n; ADD_VAR(v); }


X
X#define STRING_VAL(v) bcopy(vars->val.string, v, vars->val_len)
X#define INT_VAL(v) v = *(vars->val.integer)
X

X#define SET_INT(v) { vars->type = INTEGER;\
X vars->val.integer = (long *)malloc(vars->val_len = sizeof(long));\
X *(vars->val.integer) = (long)v; }

X#define SET_STRING(v) { vars->type = STRING;\
X vars->val.string = (u_char *)malloc(ADDR_LEN);\
X bcopy(v, (char *)vars->val.string, vars->val_len = ADDR_LEN); }


X
Xint add_rule(ms,ri)
Xstruct meter_status *ms;
Xstruct rule_info *ri;
X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X
X pdu = snmp_pdu_create(SET_REQ_MSG);

X if (ri->RuleNbr == 0) {
X ADD_VAR(o_crRuleCount); /* Clear rule table */


X vars = pdu->variables;

X SET_INT(ri->RuleNbr);
X }
X else {
X ADD_VAR(o_crTreeNbr);


X vars = pdu->variables;

X SET_INT(ri->TreeNbr);
X ADD_VAR(o_crAddrType);


X vars = vars->next_variable;

X SET_INT(ri->AddrType);
X ADD_VAR(o_crFromAddr);


X vars = vars->next_variable;

X SET_STRING(ri->FromAddr);
X ADD_VAR(o_crFromMask);


X vars = vars->next_variable;

X SET_STRING(ri->FromMask);
X ADD_VAR(o_crFromTally);


X vars = vars->next_variable;

X SET_STRING(ri->FromTally);
X ADD_VAR(o_crToAddr);


X vars = vars->next_variable;

X SET_STRING(ri->ToAddr);
X ADD_VAR(o_crToMask);


X vars = vars->next_variable;

X SET_STRING(ri->ToMask);
X ADD_VAR(o_crToTally);


X vars = vars->next_variable;

X SET_STRING(ri->ToTally);
X ADD_VAR(o_crRuleCount); /* Add current rule to rule table */


X vars = vars->next_variable;

X SET_INT(ri->RuleNbr);


X }
X
X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {

X if (ri->RuleNbr == 0) printf("Rule table cleared\n");
X else printf("Rule %d added to table\n", ri->RuleNbr);
X ms->rulecount = ri->RuleNbr;
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);

X return 1;
X }
X

Xint chk_info(ms,control)
Xstruct meter_status *ms;
Xint control; /* 0 = read, -1 = restart, 1 = checkpoint */


X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X if (control == -1) {
X ms->CheckPoint = ms->flowsknown = 0;
X }
X else if (control == 1) ++ms->CheckPoint;
X
X if (control != 0) { /* Make new checkpoint */
X pdu = snmp_pdu_create(SET_REQ_MSG);
X ADD_VAR(o_ftCheckPoint);


X vars = pdu->variables;

X SET_INT(ms->CheckPoint); /* New checkpoint number */


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;

X INT_VAL(ms->CheckPoint);
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);
X }

X
X pdu = snmp_pdu_create(GET_REQ_MSG);
X ADD_VAR(o_ftChkFlowCount);
X ADD_VAR(o_ftChkActFlows);
X ADD_VAR(o_ftFirstActFlow);
X ADD_VAR(o_ftChkTime);
X ADD_VAR(o_ftPrevChkTime);


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;

X INT_VAL(ms->ChkFlowCount);


X vars = vars->next_variable;

X INT_VAL(ms->ChkActFlows);


X vars = vars->next_variable;

X INT_VAL(ms->FirstActFlow);


X vars = vars->next_variable;

X INT_VAL(ms->ChkTime);


X vars = vars->next_variable;

X INT_VAL(ms->PrevChkTime);
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);

X return 1;
X }
X

Xint blob_info(ms,fb, fn)
Xstruct meter_status *ms;
Xunsigned char *fb;
Xint fn;


X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X pdu = snmp_pdu_create(GET_REQ_MSG);
X ADD_X_VAR(o_ftFlowBlob,FT_INDEX,fn);


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;

X STRING_VAL(fb);
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);

X return 1;
X }
X

Xint flow_info(ms,fi, fn, getkey,getflow)
Xstruct meter_status *ms;
Xstruct flow_info *fi;
Xint fn, getkey,getflow;


X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X pdu = snmp_pdu_create(GET_REQ_MSG);
X if (getkey) {

X ADD_X_VAR(o_ftAddrType,FT_INDEX,fn);
X ADD_X_VAR(o_ftFromAddr,FT_INDEX,fn);
X ADD_X_VAR(o_ftToAddr,FT_INDEX,fn);
X }
X if (getflow) {
X ADD_X_VAR(o_ftChkFwdBytes,FT_INDEX,fn);
X ADD_X_VAR(o_ftChkBackBytes,FT_INDEX,fn);
X ADD_X_VAR(o_ftNextActiveFlow,FT_INDEX,fn);


X }
X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;

X if (getkey) {
X INT_VAL(fi->AddrType);


X vars = vars->next_variable;

X STRING_VAL(fi->FromAddr);


X vars = vars->next_variable;

X STRING_VAL(fi->ToAddr);


X vars = vars->next_variable;
X }

X if (getflow) {
X INT_VAL(fi->FwdBytes);


X vars = vars->next_variable;

X INT_VAL(fi->BackBytes);


X vars = vars->next_variable;

X INT_VAL(fi->NextActiveFlow);
X }
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);

X return 1;
X }
X

Xint meter_info(ms)
Xstruct meter_status *ms;
X{
X int i, count, status;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X

X pdu = snmp_pdu_create(GET_REQ_MSG);
X ADD_VAR(o_sysDescr);
X ADD_VAR(o_sysUpTime);

X ADD_VAR(o_ifNumber);
X ADD_VAR(o_ftFlowCount);


X status = snmp_synch_response(ms->ss, pdu, &response);
X if (status == STAT_SUCCESS) {
X if (response->errstat == SNMP_ERR_NOERROR) {
X vars = response->variables;
X STRING_VAL(ms->descr);
X vars = vars->next_variable;
X INT_VAL(ms->uptime);
X vars = vars->next_variable;

X INT_VAL(ms->ifcount);


X vars = vars->next_variable;

X INT_VAL(ms->flowcount);
X }
X else {
X printf("Error in packet\nReason: %sn",


X snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME) {
X printf("This name does not exist: ");
X for (count=1, vars = response->variables;
X vars && count != response->errindex;
X vars = vars->next_variable, count++) ;
X if (vars) print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X else return 0;
X snmp_free_pdu(response);

X return 1;
X }
X

Xvoid print_meters()
X{
X struct meter_status *ms;
X for (ms = first_meter; ms; ms = ms->next)
X if (ms->status & MT_MANAGE) meter_print(ms);
X }
X
Xvoid meter_print(ms)

Xstruct meter_status *ms;
X{


X struct timeval tv;
X char buf[32];

X time_t t; char *ts;


X
X time(&t); ts = ctime(&t);
X

X gettimeofday(&tv, (struct timezone *)0);
X tv.tv_sec -= ms->uptime / 100;
X if ((ms->uptime % 100)*10000 > tv.tv_usec) {
X tv.tv_sec--;
X tv.tv_usec += 1000000;
X }
X tv.tv_usec -= (ms->uptime % 100)*10000;
X
X fprintf(ms->log,

X "%19.19s -- %s: %s\n\tUp %s (since %.24s)\n\t\t%d interfaces, %u flows\n\n",
X ts,ms->name, ms->descr, uptime_string(ms->uptime, buf),
X ctime(&tv.tv_sec), ms->ifcount, ms->flowcount);
X if (verbose) printf(
X "%19.19s -- %s: %s\n\tUp %s (since %.24s)\n\t\t%d interfaces, %u flows\n\n",
X ts,ms->name, ms->descr, uptime_string(ms->uptime, buf),
X ctime(&tv.tv_sec), ms->ifcount, ms->flowcount);

Xvoid printaddress(f,a)
XFILE *f;
Xunsigned char *a;
X{
X int j;
X fprintf(f," %u", a[0]);
X for (j = 1; j != ADDR_LEN; ++j) fprintf(f,".%u", a[j]);


X }
X
X
XFILE *rfp; /* For rules file */
Xchar inbuf[256], *ibp;

Xint lic, ic, iblisted, rule_line;


X
Xint nextchar()
X{
X lic = ic;

X for (;;) {


X if (lic == '\n') {
X if (fgets(inbuf, sizeof(inbuf), rfp) == NULL) return ic = EOF;
X iblisted = 0; ++rule_line;
X ibp = inbuf;
X }
X ic = *ibp++;
X if (ic == '#') lic = '\n'; /* Ignore comments */
X else return ic;
X }
X }
X

Xint getnbr()
X{
X int v = 0;
X for (;;) {
X if (ic == EOF) return EOF;
X if (isdigit(ic)) break;

X else nextchar(rfp);
X }
X for (;;) {


X v = v*10 + ic-'0';
X if (nextchar(ic) == EOF) return EOF;
X if (!isdigit(ic)) break;
X }
X if (v > 255) {
X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }
X printf("Number > 255 !!!\n");
X }

X return v;
X }
X

Xvoid getaddress(a)
Xunsigned char *a;
X{
X int j;
X for (j = 0; j != ADDR_LEN; ++j) a[j] = getnbr();
X }


X
Xvoid parse_rulefile(ms,list)
Xstruct meter_status *ms;
Xint list;
X{

X struct rule_info ri;
X int c, rule_nbr = 0;
X


X if ((rfp = fopen(ms->rulefile, "r")) == NULL) {
X perror(ms->rulefile);

X exit(1);
X }
X
X ri.RuleNbr = 0; add_rule(ms, &ri); /* Clear rule table */
X
X ic = '\n'; rule_line = 0;


X for (;;) {
X do { /* First char of a line */
X nextchar(rfp);
X if (ic == EOF) break;
X } while (lic != '\n');
X if (ic == EOF) break;

X ri.TreeNbr = getnbr();


X if (ic == EOF) break;

X for (;;) {


X if (ic == EOF) break;

X if (isalpha(ic)) break;
X else nextchar(rfp);
X }
X c = toupper(ic);
X if (c == 'I') ri.AddrType = AT_IP;
X else if (c == 'N') ri.AddrType = AT_NOVELL;
X else if (c == 'D') ri.AddrType = AT_DECNET;
X else if (c == 'A') ri.AddrType = AT_ETHERTALK;
X else ri.AddrType = AT_IGNORE;
X
X getaddress(ri.FromAddr);


X if (ic == EOF) break;

X getaddress(ri.FromMask);


X if (ic == EOF) break;

X getaddress(ri.FromTally);


X if (ic == EOF) break;

X getaddress(ri.ToAddr);


X if (ic == EOF) break;

X getaddress(ri.ToMask);


X if (ic == EOF) break;

X getaddress(ri.ToTally);


X if (ic == EOF) break;
X

X ri.RuleNbr = ++rule_nbr;
X
X if (list) {
X printf("Rule %d: %d, %d,", ri.RuleNbr, ri.TreeNbr, ri.AddrType);
X printaddress(stdout, ri.FromAddr);
X printaddress(stdout, ri.FromMask);
X printaddress(stdout, ri.FromTally);
X printf("\n ");
X printaddress(stdout, ri.ToAddr);
X printaddress(stdout, ri.ToMask);
X printaddress(stdout, ri.ToTally);


X printf("\n");
X }
X

X add_rule(ms,&ri); /* Add rule to meter's rule table */
X }
X chk_info(ms,-1); /* Restart with new rule table */
X fclose(rfp);
X }
END_OF_FILE
if test 29675 -ne `wc -c <'netramet/src/manager/oldnm.c'`; then
echo shar: \"'netramet/src/manager/oldnm.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/oldnm.c'
fi
if test -f 'netramet/src/snmplib/snmpapi.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/snmpapi.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/snmpapi.c'\" \(28823 characters\)
sed "s/^X//" >'netramet/src/snmplib/snmpapi.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * snmp_api.c - API for access to snmp.


X */
X
X#include <stdio.h>

X#include <sys/types.h>
X#include <sys/param.h>
X#include <sys/time.h>
X#include <netinet/in.h>
X#include <sys/socket.h>
X#include <netdb.h>
X#include "ausnmp.h"
X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "snmpapi.h"
X
X#define PACKET_LENGTH 4500


X
X#ifndef BSD4_3
X#define BSD4_2
X#endif
X

X#ifndef BSD4_3
X
Xtypedef long fd_mask;
X#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
X
X#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
X#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
X#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
X#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
X#endif
X

Xoid default_enterprise[] = {1, 3, 6, 1, 4, 1, 3, 1, 1}; /* enterprises.cmu.systems.cmuSNMP */
X
X#define DEFAULT_COMMUNITY "public"
X#define DEFAULT_RETRIES 4
X#define DEFAULT_TIMEOUT 1000000L
X#define DEFAULT_REMPORT SNMP_PORT
X#define DEFAULT_ENTERPRISE default_enterprise
X#define DEFAULT_TIME 0
X
X/*
X * Internal information about the state of the snmp session.
X */
Xstruct snmp_internal_session {
X int sd; /* socket descriptor for this connection */
X ipaddr addr; /* address of connected peer */
X struct request_list *requests;/* Info about outstanding requests */
X};
X
X/*
X * A list of all the outstanding requests for a particular session.
X */
Xstruct request_list {
X struct request_list *next_request;
X u_long request_id; /* request id */
X int retries; /* Number of retries */
X u_long timeout; /* length to wait for timeout */
X struct timeval time; /* Time this request was made */
X struct timeval expire; /* time this request is due to expire */
X struct snmp_pdu *pdu; /* The pdu for this request (saved so it can be retransmitted */
X};
X
X/*
X * The list of active/open sessions.
X */
Xstruct session_list {
X struct session_list *next;
X struct snmp_session *session;
X struct snmp_internal_session *internal;
X};
X
Xstruct session_list *Sessions = NULL;
X
Xu_long Reqid = 0;
Xint snmp_errno = 0;
X
Xchar *api_errors[4] = {
X "Unknown session",
X "Unknown host",
X "Invalid local port",
X "Unknown Error"


X};
X
Xstatic char *

Xapi_errstring(snmp_errnumber)
X int snmp_errnumber;
X{
X if (snmp_errnumber <= SNMPERR_BAD_SESSION && snmp_errnumber >= SNMPERR_GENERR){
X return api_errors[snmp_errnumber + 4];
X } else {
X return "Unknown Error";


X }
X}
X
X
X/*

X * Gets initial request ID for all transactions.
X */
Xstatic
Xinit_snmp(){


X struct timeval tv;
X

X gettimeofday(&tv, (struct timezone *)0);

X srandom(tv.tv_sec ^ tv.tv_usec);
X Reqid = random();
X}
X
X/*
X * Sets up the session with the snmp_session information provided
X * by the user. Then opens and binds the necessary UDP port.
X * A handle to the created session is returned (this is different than
X * the pointer passed to snmp_open()). On any error, NULL is returned
X * and snmp_errno is set to the appropriate error code.
X */
Xstruct snmp_session *
Xsnmp_open(session)
X struct snmp_session *session;
X{
X struct session_list *slp;
X struct snmp_internal_session *isp;
X u_char *cp;
X int sd;
X u_long addr;
X struct sockaddr_in me;
X struct hostent *hp;
X struct servent *servp;
X
X
X if (Reqid == 0)
X init_snmp();
X
X /* Copy session structure and link into list */
X slp = (struct session_list *)malloc(sizeof(struct session_list));
X slp->internal = isp = (struct snmp_internal_session *)malloc(sizeof(struct snmp_internal_session));
X bzero((char *)isp, sizeof(struct snmp_internal_session));
X slp->internal->sd = -1; /* mark it not set */
X slp->session = (struct snmp_session *)malloc(sizeof(struct snmp_session));
X bcopy((char *)session, (char *)slp->session, sizeof(struct snmp_session));
X session = slp->session;
X /* now link it in. */
X slp->next = Sessions;
X Sessions = slp;
X /*
X * session now points to the new structure that still contains pointers to
X * data allocated elsewhere. Some of this data is copied to space malloc'd
X * here, and the pointer replaced with the new one.
X */
X
X if (session->peername != NULL){
X cp = (u_char *)malloc((unsigned)strlen(session->peername) + 1);
X strcpy((char *)cp, session->peername);
X session->peername = (char *)cp;
X }
X
X /* Fill in defaults if necessary */
X if (session->community_len != SNMP_DEFAULT_COMMUNITY_LEN){
X cp = (u_char *)malloc((unsigned)session->community_len);
X bcopy((char *)session->community, (char *)cp, session->community_len);
X } else {
X session->community_len = strlen(DEFAULT_COMMUNITY);
X cp = (u_char *)malloc((unsigned)session->community_len);
X bcopy((char *)DEFAULT_COMMUNITY, (char *)cp, session->community_len);
X }
X session->community = cp; /* replace pointer with pointer to new data */
X
X if (session->retries == SNMP_DEFAULT_RETRIES)
X session->retries = DEFAULT_RETRIES;
X if (session->timeout == SNMP_DEFAULT_TIMEOUT)
X session->timeout = DEFAULT_TIMEOUT;
X isp->requests = NULL;


X
X /* Set up connections */
X sd = socket(AF_INET, SOCK_DGRAM, 0);
X if (sd < 0){
X perror("socket");

X snmp_errno = SNMPERR_GENERR;
X if (!snmp_close(session)){
X fprintf(stderr, "Couldn't abort session: %s. Exiting\n", api_errstring(snmp_errno));
X exit(1);
X }
X return 0;
X }
X isp->sd = sd;
X if (session->peername != SNMP_DEFAULT_PEERNAME){
X if ((addr = inet_addr(session->peername)) != -1){
X bcopy((char *)&addr, (char *)&isp->addr.sin_addr, sizeof(isp->addr.sin_addr));
X } else {
X hp = gethostbyname(session->peername);


X if (hp == NULL){

X fprintf(stderr, "unknown host: %s\n", session->peername);
X snmp_errno = SNMPERR_BAD_ADDRESS;
X if (!snmp_close(session)){
X fprintf(stderr, "Couldn't abort session: %s. Exiting\n", api_errstring(snmp_errno));
X exit(2);
X }
X return 0;
X } else {
X bcopy((char *)hp->h_addr, (char *)&isp->addr.sin_addr, hp->h_length);
X }
X }
X isp->addr.sin_family = AF_INET;
X if (session->remote_port == SNMP_DEFAULT_REMPORT){
X servp = getservbyname("snmp", "udp");
X if (servp != NULL){
X isp->addr.sin_port = servp->s_port;
X } else {
X isp->addr.sin_port = htons(SNMP_PORT);
X }
X } else {
X isp->addr.sin_port = htons(session->remote_port);
X }
X } else {
X isp->addr.sin_addr.s_addr = SNMP_DEFAULT_ADDRESS;
X }


X
X me.sin_family = AF_INET;
X me.sin_addr.s_addr = INADDR_ANY;

X me.sin_port = htons(session->local_port);


X if (bind(sd, (struct sockaddr *)&me, sizeof(me)) != 0){
X perror("bind");

X snmp_errno = SNMPERR_BAD_LOCPORT;
X if (!snmp_close(session)){
X fprintf(stderr, "Couldn't abort session: %s. Exiting\n", api_errstring(snmp_errno));
X exit(3);
X }
X return 0;
X }
X return session;
X}
X
X
X/*
X * Free each element in the input request list.
X */
Xstatic
Xfree_request_list(rp)
X struct request_list *rp;
X{
X struct request_list *orp;
X
X while(rp){
X orp = rp;
X rp = rp->next_request;
X if (orp->pdu != NULL)
X snmp_free_pdu(orp->pdu);
X free((char *)orp);
X }
X}
X
X/*
X * Close the input session. Frees all data allocated for the session,
X * dequeues any pending requests, and closes any sockets allocated for
X * the session. Returns 0 on error, 1 otherwise.
X */
Xint
Xsnmp_close(session)
X struct snmp_session *session;
X{
X struct session_list *slp = NULL, *oslp = NULL;
X
X if (Sessions->session == session){ /* If first entry */
X slp = Sessions;
X Sessions = slp->next;
X } else {
X for(slp = Sessions; slp; slp = slp->next){
X if (slp->session == session){
X if (oslp) /* if we found entry that points here */
X oslp->next = slp->next; /* link around this entry */
X break;
X }
X oslp = slp;
X }
X }
X /* If we found the session, free all data associated with it */
X if (slp){
X if (slp->session->community != NULL)
X free((char *)slp->session->community);
X if(slp->session->peername != NULL)
X free((char *)slp->session->peername);
X free((char *)slp->session);
X if (slp->internal->sd != -1)
X close(slp->internal->sd);
X free_request_list(slp->internal->requests);
X free((char *)slp->internal);
X free((char *)slp);
X } else {
X snmp_errno = SNMPERR_BAD_SESSION;
X return 0;
X }
X return 1;
X}
X
X/*
X * Takes a session and a pdu and serializes the ASN PDU into the area
X * pointed to by packet. out_length is the size of the data area available.
X * Returns the length of the completed packet in out_length. If any errors
X * occur, -1 is returned. If all goes well, 0 is returned.
X */
Xstatic int
Xsnmp_build(session, pdu, packet, out_length)
X struct snmp_session *session;
X struct snmp_pdu *pdu;
X register u_char *packet;
X int *out_length;
X{
X u_char buf[PACKET_LENGTH];
X register u_char *cp;
X struct variable_list *vp;
X int length;
X long zero = 0;
X int totallength;
X
X length = *out_length;
X cp = packet;
X for(vp = pdu->variables; vp; vp = vp->next_variable){
X cp = snmp_build_var_op(cp, vp->name, &vp->name_length, vp->type, vp->val_len, (u_char *)vp->val.string, &length);
X if (cp == NULL)
X return -1;
X }
X totallength = cp - packet;
X
X length = PACKET_LENGTH;
X cp = asn_build_header(buf, &length, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), totallength);
X if (cp == NULL)
X return -1;
X bcopy((char *)packet, (char *)cp, totallength);
X totallength += cp - buf;
X
X length = *out_length;
X if (pdu->command != TRP_REQ_MSG){
X /* request id */
X cp = asn_build_int(packet, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->reqid, sizeof(pdu->reqid));
X if (cp == NULL)
X return -1;
X /* error status */
X cp = asn_build_int(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->errstat, sizeof(pdu->errstat));
X if (cp == NULL)
X return -1;
X /* error index */
X cp = asn_build_int(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->errindex, sizeof(pdu->errindex));
X if (cp == NULL)
X return -1;
X } else { /* this is a trap message */
X /* enterprise */
X cp = asn_build_objid(packet, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID),
X (oid *)pdu->enterprise, pdu->enterprise_length);
X if (cp == NULL)
X return -1;
X /* agent-addr */
X cp = asn_build_string(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OCTET_STR),
X (u_char *)&pdu->agent_addr.sin_addr.s_addr, sizeof(pdu->agent_addr.sin_addr.s_addr));
X if (cp == NULL)
X return -1;
X /* generic trap */
X cp = asn_build_int(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->trap_type, sizeof(pdu->trap_type));
X if (cp == NULL)
X return -1;
X /* specific trap */
X cp = asn_build_int(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->specific_type, sizeof(pdu->specific_type));
X if (cp == NULL)
X return -1;
X /* timestamp */
X cp = asn_build_int(cp, &length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)&pdu->time, sizeof(pdu->time));
X if (cp == NULL)
X return -1;
X }
X if (length < totallength)
X return -1;
X bcopy((char *)buf, (char *)cp, totallength);
X totallength += cp - packet;
X
X length = PACKET_LENGTH;
X cp = asn_build_header(buf, &length, (u_char)pdu->command, totallength);
X if (cp == NULL)
X return -1;
X if (length < totallength)
X return -1;
X bcopy((char *)packet, (char *)cp, totallength);
X totallength += cp - buf;
X
X length = *out_length;
X cp = snmp_auth_build(packet, &length, session->community, &session->community_len, &zero, totallength);
X if (cp == NULL)
X return -1;
X if ((*out_length - (cp - packet)) < totallength)
X return -1;
X bcopy((char *)buf, (char *)cp, totallength);
X totallength += cp - packet;
X *out_length = totallength;


X return 0;
X}
X

X/*
X * Parses the packet recieved on the input session, and places the data into
X * the input pdu. length is the length of the input packet. If any errors
X * are encountered, -1 is returned. Otherwise, a 0 is returned.
X */
Xstatic int
Xsnmp_parse(session, pdu, data, length)
X struct snmp_session *session;
X struct snmp_pdu *pdu;
X u_char *data;
X int length;
X{
X u_char msg_type;
X u_char type;
X u_char *var_val;
X long version;
X int len, four;
X u_char community[128];
X int community_length = 128;
X struct variable_list *vp;
X oid objid[MAX_NAME_LEN], *op;
X
X /* authenticates message and returns length if valid */
X data = snmp_auth_parse(data, &length, community, &community_length, &version);


X if (data == NULL)

X return -1;
X if (version != SNMP_VERSION_1){
X fprintf(stderr, "Wrong version: %d\n", version);
X fprintf(stderr, "Continuing anyway\n");
X }
X if (session->authenticator){
X data = session->authenticator(data, &length, community, community_length);


X if (data == NULL)

X return 0;
X }
X data = asn_parse_header(data, &length, &msg_type);


X if (data == NULL)

X return -1;
X pdu->command = msg_type;
X if (pdu->command != TRP_REQ_MSG){
X data = asn_parse_int(data, &length, &type, (long *)&pdu->reqid, sizeof(pdu->reqid));


X if (data == NULL)

X return -1;
X data = asn_parse_int(data, &length, &type, (long *)&pdu->errstat, sizeof(pdu->errstat));


X if (data == NULL)

X return -1;
X data = asn_parse_int(data, &length, &type, (long *)&pdu->errindex, sizeof(pdu->errindex));


X if (data == NULL)

X return -1;
X } else {
X pdu->enterprise_length = MAX_NAME_LEN;
X data = asn_parse_objid(data, &length, &type, objid, &pdu->enterprise_length);


X if (data == NULL)

X return -1;
X pdu->enterprise = (oid *)malloc(pdu->enterprise_length * sizeof(oid));
X bcopy((char *)objid, (char *)pdu->enterprise, pdu->enterprise_length * sizeof(oid));
X
X four = 4;
X data = asn_parse_string(data, &length, &type, (u_char *)&pdu->agent_addr.sin_addr.s_addr, &four);


X if (data == NULL)

X return -1;
X data = asn_parse_int(data, &length, &type, (long *)&pdu->trap_type, sizeof(pdu->trap_type));


X if (data == NULL)

X return -1;
X data = asn_parse_int(data, &length, &type, (long *)&pdu->specific_type, sizeof(pdu->specific_type));


X if (data == NULL)

X return -1;
X data = asn_parse_int(data, &length, &type, (long *)&pdu->time, sizeof(pdu->time));


X if (data == NULL)

X return -1;
X }
X data = asn_parse_header(data, &length, &type);


X if (data == NULL)

X return -1;
X if (type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR))
X return -1;
X while((int)length > 0){
X if (pdu->variables == NULL){
X pdu->variables = vp = (struct variable_list *)malloc(sizeof(struct variable_list));
X } else {
X vp->next_variable = (struct variable_list *)malloc(sizeof(struct variable_list));
X vp = vp->next_variable;
X }
X vp->next_variable = NULL;
X vp->val.string = NULL;
X vp->name = NULL;
X vp->name_length = MAX_NAME_LEN;
X data = snmp_parse_var_op(data, objid, &vp->name_length, &vp->type, &vp->val_len, &var_val, (int *)&length);


X if (data == NULL)

X return -1;
X op = (oid *)malloc((unsigned)vp->name_length * sizeof(oid));
X bcopy((char *)objid, (char *)op, vp->name_length * sizeof(oid));
X vp->name = op;
X
X len = PACKET_LENGTH;
X switch((short)vp->type){
X case ASN_INTEGER:


X case COUNTER:
X case GAUGE:
X case TIMETICKS:

X vp->val.integer = (long *)malloc(sizeof(long));
X vp->val_len = sizeof(long);
X asn_parse_int(var_val, &len, &vp->type, (long *)vp->val.integer, sizeof(vp->val.integer));


X break;
X case ASN_OCTET_STR:
X case IPADDRESS:
X case OPAQUE:

X vp->val.string = (u_char *)malloc((unsigned)vp->val_len);
X asn_parse_string(var_val, &len, &vp->type, vp->val.string, &vp->val_len);


X break;
X case ASN_OBJECT_ID:

X vp->val_len = MAX_NAME_LEN;
X asn_parse_objid(var_val, &len, &vp->type, objid, &vp->val_len);
X vp->val_len *= sizeof(oid);
X vp->val.objid = (oid *)malloc((unsigned)vp->val_len);
X bcopy((char *)objid, (char *)vp->val.objid, vp->val_len);


X break;
X case ASN_NULL:

X break;
X default:
X fprintf(stderr, "bad type returned (%x)\n", vp->type);
X break;
X }
X }
X return 0;
X}
X
X/*
X * Sends the input pdu on the session after calling snmp_build to create
X * a serialized packet. If necessary, set some of the pdu data from the
X * session defaults. Add a request corresponding to this pdu to the list
X * of outstanding requests on this session, then send the pdu.
X * Returns the request id of the generated packet if applicable, otherwise 1.
X * On any error, 0 is returned.
X * The pdu is freed by snmp_send() unless a failure occured.
X */
Xint
Xsnmp_send(session, pdu)
X struct snmp_session *session;
X struct snmp_pdu *pdu;
X{
X struct session_list *slp;
X struct snmp_internal_session *isp = NULL;
X u_char packet[PACKET_LENGTH];
X int length = PACKET_LENGTH;
X struct request_list *rp;


X struct timeval tv;
X

X for(slp = Sessions; slp; slp = slp->next){
X if (slp->session == session){
X isp = slp->internal;
X break;
X }
X }
X if (isp == NULL){
X snmp_errno = SNMPERR_BAD_SESSION;
X return 0;
X }
X if (pdu->command == GET_REQ_MSG || pdu->command == GETNEXT_REQ_MSG
X || pdu->command == GET_RSP_MSG || pdu->command == SET_REQ_MSG){
X if (pdu->reqid == SNMP_DEFAULT_REQID)
X pdu->reqid = ++Reqid;
X if (pdu->errstat == SNMP_DEFAULT_ERRSTAT)
X pdu->errstat = 0;
X if (pdu->errindex == SNMP_DEFAULT_ERRINDEX)
X pdu->errindex = 0;
X } else {
X /* fill in trap defaults */
X pdu->reqid = 1; /* give a bogus non-error reqid for traps */
X if (pdu->enterprise_length == SNMP_DEFAULT_ENTERPRISE_LENGTH){
X pdu->enterprise = (oid *)malloc(sizeof(DEFAULT_ENTERPRISE));
X bcopy((char *)DEFAULT_ENTERPRISE, (char *)pdu->enterprise, sizeof(DEFAULT_ENTERPRISE));
X pdu->enterprise_length = sizeof(DEFAULT_ENTERPRISE)/sizeof(oid);
X }
X if (pdu->time == SNMP_DEFAULT_TIME)
X pdu->time = DEFAULT_TIME;
X }
X if (pdu->address.sin_addr.s_addr == SNMP_DEFAULT_ADDRESS){
X if (isp->addr.sin_addr.s_addr != SNMP_DEFAULT_ADDRESS){
X bcopy((char *)&isp->addr, (char *)&pdu->address, sizeof(pdu->address));
X } else {
X fprintf(stderr, "No remote IP address specified\n");
X snmp_errno = SNMPERR_BAD_ADDRESS;


X return 0;
X }
X }

X
X
X if (snmp_build(session, pdu, packet, &length) < 0){
X fprintf(stderr, "Error building packet\n");
X snmp_errno = SNMPERR_GENERR;
X return 0;
X }
X if (snmp_dump_packet){
X int count;
X


X for(count = 0; count < length; count++){

X printf("%02X ", packet[count]);
X if ((count % 16) == 15)
X printf("\n");
X }

X printf("\n\n");
X }
X


X gettimeofday(&tv, (struct timezone *)0);

X if (sendto(isp->sd, (char *)packet, length, 0, (struct sockaddr *)&pdu->address, sizeof(pdu->address)) < 0){
X perror("sendto");
X snmp_errno = SNMPERR_GENERR;
X return 0;
X }
X if (pdu->command == GET_REQ_MSG || pdu->command == GETNEXT_REQ_MSG || pdu->command == SET_REQ_MSG){
X /* set up to expect a response */
X rp = (struct request_list *)malloc(sizeof(struct request_list));
X rp->next_request = isp->requests;
X isp->requests = rp;
X rp->pdu = pdu;
X rp->request_id = pdu->reqid;
X
X rp->retries = 1;
X rp->timeout = session->timeout;
X rp->time = tv;
X tv.tv_usec += rp->timeout;
X tv.tv_sec += tv.tv_usec / 1000000L;
X tv.tv_usec %= 1000000L;
X rp->expire = tv;
X }
X return pdu->reqid;
X}
X
X/*
X * Frees the pdu and any malloc'd data associated with it.
X */
Xvoid
Xsnmp_free_pdu(pdu)
X struct snmp_pdu *pdu;
X{
X struct variable_list *vp, *ovp;
X
X vp = pdu->variables;
X while(vp){
X if (vp->name)
X free((char *)vp->name);
X if (vp->val.string)
X free((char *)vp->val.string);
X ovp = vp;
X vp = vp->next_variable;
X free((char *)ovp);
X }
X if (pdu->enterprise)
X free((char *)pdu->enterprise);
X free((char *)pdu);
X}
X
X
X/*
X * Checks to see if any of the fd's set in the fdset belong to
X * snmp. Each socket with it's fd set has a packet read from it
X * and snmp_parse is called on the packet received. The resulting pdu
X * is passed to the callback routine for that session. If the callback
X * routine returns successfully, the pdu and it's request are deleted.
X */
Xvoid
Xsnmp_read(fdset)
X fd_set *fdset;
X{
X struct session_list *slp;
X struct snmp_session *sp;
X struct snmp_internal_session *isp;
X u_char packet[PACKET_LENGTH];
X struct sockaddr_in from;
X int length, fromlength;
X struct snmp_pdu *pdu;
X struct request_list *rp, *orp;
X
X for(slp = Sessions; slp; slp = slp->next){
X if (FD_ISSET(slp->internal->sd, fdset)){
X sp = slp->session;
X isp = slp->internal;


X fromlength = sizeof from;

X length = recvfrom(isp->sd, (char *)packet, PACKET_LENGTH, 0, (struct sockaddr *)&from, &fromlength);


X if (length == -1)
X perror("recvfrom");
X if (snmp_dump_packet){

X int count;
X


X printf("recieved %d bytes from %s:\n", length, inet_ntoa(from.sin_addr));

X for(count = 0; count < length; count++){

X printf("%02X ", packet[count]);
X if ((count % 16) == 15)
X printf("\n");
X }

X printf("\n\n");
X }
X
X pdu = (struct snmp_pdu *)malloc(sizeof(struct snmp_pdu));
X pdu->address = from;
X pdu->reqid = 0;
X pdu->variables = NULL;
X pdu->enterprise = NULL;
X pdu->enterprise_length = 0;
X if (snmp_parse(sp, pdu, packet, length) != SNMP_ERR_NOERROR){
X fprintf(stderr, "Mangled packet\n");
X snmp_free_pdu(pdu);
X return;
X }
X
X if (pdu->command == GET_RSP_MSG){
X for(rp = isp->requests; rp; rp = rp->next_request){
X if (rp->request_id == pdu->reqid){
X if (sp->callback(RECEIVED_MESSAGE, sp, pdu->reqid, pdu, sp->callback_magic) == 1){
X /* successful, so delete request */
X orp = rp;
X if (isp->requests == orp){
X /* first in list */
X isp->requests = orp->next_request;
X } else {
X for(rp = isp->requests; rp; rp = rp->next_request){
X if (rp->next_request == orp){
X rp->next_request = orp->next_request; /* link around it */


X break;
X }
X }
X }

X snmp_free_pdu(orp->pdu);
X free((char *)orp);
X break; /* there shouldn't be any more request with the same reqid */
X }
X }
X }
X } else if (pdu->command == GET_REQ_MSG || pdu->command == GETNEXT_REQ_MSG
X || pdu->command == TRP_REQ_MSG || pdu->command == SET_REQ_MSG){
X sp->callback(RECEIVED_MESSAGE, sp, pdu->reqid, pdu, sp->callback_magic);
X }
X snmp_free_pdu(pdu);


X }
X }
X}
X
X/*

X * Returns info about what snmp requires from a select statement.
X * numfds is the number of fds in the list that are significant.
X * All file descriptors opened for SNMP are OR'd into the fdset.
X * If activity occurs on any of these file descriptors, snmp_read
X * should be called with that file descriptor set
X *
X * The timeout is the latest time that SNMP can wait for a timeout. The
X * select should be done with the minimum time between timeout and any other
X * timeouts necessary. This should be checked upon each invocation of select.
X * If a timeout is received, snmp_timeout should be called to check if the
X * timeout was for SNMP. (snmp_timeout is idempotent)
X *
X * Block is 1 if the select is requested to block indefinitely, rather than time out.
X * If block is input as 1, the timeout value will be treated as undefined, but it must
X * be available for setting in snmp_select_info. On return, if block is true, the value
X * of timeout will be undefined.
X *
X * snmp_select_info returns the number of open sockets. (i.e. The number of sessions open)
X */
Xint
Xsnmp_select_info(numfds, fdset, timeout, block)
X int *numfds;
X fd_set *fdset;
X struct timeval *timeout;
X int *block; /* should the select block until input arrives (i.e. no input) */
X{
X struct session_list *slp;
X struct snmp_internal_session *isp;
X struct request_list *rp;
X struct timeval now, earliest;
X int active = 0, requests = 0;
X
X timerclear(&earliest);
X /*
X * For each request outstanding, add it's socket to the fdset,
X * and if it is the earliest timeout to expire, mark it as lowest.
X */
X for(slp = Sessions; slp; slp = slp->next){
X active++;
X isp = slp->internal;
X if ((isp->sd + 1) > *numfds)
X *numfds = (isp->sd + 1);
X FD_SET(isp->sd, fdset);
X if (isp->requests){
X /* found another session with outstanding requests */
X requests++;
X for(rp = isp->requests; rp; rp = rp->next_request){
X if (!timerisset(&earliest) || timercmp(&rp->expire, &earliest, <))
X earliest = rp->expire;
X }
X }
X }
X if (requests == 0) /* if none are active, skip arithmetic */
X return active;
X
X /*
X * Now find out how much time until the earliest timeout. This
X * transforms earliest from an absolute time into a delta time, the
X * time left until the select should timeout.
X */


X gettimeofday(&now, (struct timezone *)0);

X earliest.tv_sec--; /* adjust time to make arithmetic easier */
X earliest.tv_usec += 1000000L;
X earliest.tv_sec -= now.tv_sec;
X earliest.tv_usec -= now.tv_usec;
X while (earliest.tv_usec >= 1000000L){
X earliest.tv_usec -= 1000000L;
X earliest.tv_sec += 1;
X }
X if (earliest.tv_sec < 0){
X earliest.tv_sec = 0;
X earliest.tv_usec = 0;
X }
X
X /* if it was blocking before or our delta time is less, reset timeout */
X if (*block == 1 || timercmp(&earliest, timeout, <)){
X *timeout = earliest;
X *block = 0;
X }
X return active;
X}
X
X/*
X * snmp_timeout should be called whenever the timeout from snmp_select_info expires,
X * but it is idempotent, so snmp_timeout can be polled (probably a cpu expensive
X * proposition). snmp_timeout checks to see if any of the sessions have an
X * outstanding request that has timed out. If it finds one (or more), and that
X * pdu has more retries available, a new packet is formed from the pdu and is
X * resent. If there are no more retries available, the callback for the session
X * is used to alert the user of the timeout.
X */
Xvoid
Xsnmp_timeout(){
X struct session_list *slp;
X struct snmp_session *sp;
X struct snmp_internal_session *isp;
X struct request_list *rp, *orp, *freeme = NULL;
X struct timeval now;
X


X gettimeofday(&now, (struct timezone *)0);

X /*
X * For each request outstanding, check to see if it has expired.
X */
X for(slp = Sessions; slp; slp = slp->next){
X sp = slp->session;
X isp = slp->internal;
X orp = NULL;
X for(rp = isp->requests; rp; rp = rp->next_request){
X if (freeme != NULL){ /* frees rp's after the for loop goes on to the next_request */
X free((char *)freeme);
X freeme = NULL;
X }
X if (timercmp(&rp->expire, &now, <)){
X /* this timer has expired */
X if (rp->retries >= sp->retries){
X /* No more chances, delete this entry */
X sp->callback(TIMED_OUT, sp, rp->pdu->reqid, rp->pdu, sp->callback_magic);
X if (orp == NULL){
X isp->requests = rp->next_request;
X } else {
X orp->next_request = rp->next_request;
X }
X snmp_free_pdu(rp->pdu);
X freeme = rp;
X continue; /* don't update orp below */
X } else {
X u_char packet[PACKET_LENGTH];
X int length = PACKET_LENGTH;


X struct timeval tv;
X

X /* retransmit this pdu */
X rp->retries++;
X rp->timeout <<= 1;
X if (snmp_build(sp, rp->pdu, packet, &length) < 0){
X fprintf(stderr, "Error building packet\n");
X }
X if (snmp_dump_packet){
X int count;
X


X for(count = 0; count < length; count++){

X printf("%02X ", packet[count]);
X if ((count % 16) == 15)
X printf("\n");
X }
X printf("\n\n");

X }
X gettimeofday(&tv, (struct timezone *)0);

X if (sendto(isp->sd, (char *)packet, length, 0, (struct sockaddr *)&rp->pdu->address, sizeof(rp->pdu->address)) < 0){


X perror("sendto");
X }

X rp->time = tv;
X tv.tv_usec += rp->timeout;
X tv.tv_sec += tv.tv_usec / 1000000L;
X tv.tv_usec %= 1000000L;
X rp->expire = tv;
X }
X }
X orp = rp;
X }
X if (freeme != NULL){
X free((char *)freeme);
X freeme = NULL;
X }
X }
X}
END_OF_FILE
if test 28823 -ne `wc -c <'netramet/src/snmplib/snmpapi.c'`; then
echo shar: \"'netramet/src/snmplib/snmpapi.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/snmpapi.c'
fi
if test -f 'netramet/src/snmplib/~snmp_vars.h.kip' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/~snmp_vars.h.kip'\"
else
echo shar: Extracting \"'netramet/src/snmplib/~snmp_vars.h.kip'\" \(1789 characters\)
sed "s/^X//" >'netramet/src/snmplib/~snmp_vars.h.kip' <<'END_OF_FILE'
X/*
X * Definitions for SNMP (RFC 1067) agent variable finder.

X#define MAX_INTERFACES 2
Xextern struct mib_ifEntry mib_ifEntry[MAX_INTERFACES];
Xextern struct mib_ip mib_ip;
X#define ROUTE_ENTRIES 2
Xextern struct mib_udp mib_udp;
Xextern long mib_icmpInMsgs;
Xextern long mib_icmpOutMsgs;
Xextern long mib_icmpInErrors; /* not checked in KIP */
Xextern long mib_icmpOutErrors; /* not checked in KIP */
Xextern long mib_icmpInCount[];
Xextern long mib_icmpOutCount[];
X
Xu_char *var_system();
Xu_char *var_ifEntry();
Xu_char *var_atEntry();
Xu_char *var_ip();
Xu_char *var_ipAddrEntry();
Xu_char *var_ipRouteEntry();
Xu_char *var_icmp();
Xu_char *var_udp();
Xu_char *getStatPtr();
X
X
END_OF_FILE
if test 1789 -ne `wc -c <'netramet/src/snmplib/~snmp_vars.h.kip'`; then
echo shar: \"'netramet/src/snmplib/~snmp_vars.h.kip'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/~snmp_vars.h.kip'
fi
echo shar: End of archive 19 \(of 25\).
cp /dev/null ark19isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:58:09 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 96
Archive-name: netramet/part08
Environment: INET, UNIX, DOS

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.D
# netramet/doc/snmp/exclude netramet/src/apps/snmpnetstat/route.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:06 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 8 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.D' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\"
else

echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\" \(48329 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.D' <<'END_OF_FILE'


X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (18) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X981 555 16 (l) 18 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 655 84 (6.1.) 84 SB

X413 655 528 (Overview of NeTraMet) 528 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 738 1822 (NeMaC is a combined manager and collector for the NeTraMet meter. It is a simple Unix) 1822 SB
X271 792 1812 (program, written in a simple and straightforward way. It is intended to provide control for) 1812 SB
X271 846 1714 (NeTraMet, so as to make the initial NeTraMet implementation a useful and effective) 1714 SB
X271 900 1842 (monitoring tool. Later versions will make the coding more elegant, add more features and) 1842 SB
X271 954 127 (so on.) 127 SB
X271 1033 1767 (If only one meter is to be controlled, all the arguments can be placed on the command) 1767 SB
X271 1087 1833 (line, which is useful when testing new meters and/or rule files. If several meters are to be) 1833 SB
X271 1141 1797 (controlled, default values for the options can be specified on the command line, and the) 1797 SB
X271 1195 1722 (particular parameter values required for each meter can be specified by records in a) 1722 SB
X271 1249 351 (configuration file.) 351 SB
X271 1328 1828 (While NeMaC is running it produces a log file, recording any unusual events observed for) 1828 SB
X271 1382 1856 (any of the meters being controlled. The name of this log file is NeMaC.log.nnn, where nnn) 1856 SB
X271 1436 1678 (is a sequence number starting from 001. When NeMaC starts it scans the current) 1678 SB
X271 1490 1829 (directory for NeMaC log files, then uses the next available sequence number. In this way) 1829 SB
X271 1544 1281 (the log files are preserved through successive runs of NeMaC.) 1281 SB
X271 1623 1835 (In the same way, when NeMaC starts controlling a meter it opens a 'flows' file. The name) 1835 SB
X271 1677 1848 (of this file is meter-name.flows.nnn. 'meter-name' is the name used to reach the meter via) 1848 SB
X271 1731 1829 (IP; it may be an IP address \(e.g. 130.216.234.234\) or a host name \(provided NeMaC can) 1829 SB
X271 1785 1851 (get its address from a nameserver\). For example the third run of NeMaC controlling meter) 1851 SB

X271 1839 1615 (130.216.234.234 would produce a flows file called 130.216.234.234.flows.003.) 1615 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1926 84 (6.2.) 84 SB

X413 1926 568 (Command Line Options) 568 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2009 1716 (NeMaC's command line options are specified as usual, i.e. each option starts with a) 1716 SB
X271 2063 1699 (hyphen, a letter indicating the options, then any parameters required by the option.) 1699 SB

X271 2142 336 (The options are:) 336 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2222 151 (-c nnn) 151 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 2222 1435 (Specifies the required collection interval in seconds. If nnn is zero the) 1435 SB
X596 2276 1335 (flow data will be collected once, then NeMaC will exit; this can be) 1335 SB
X596 2330 1403 (useful, for example for changing the rule set back to its default value) 1403 SB

X596 2384 703 (of 1 if no flows are to be collected.) 703 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2464 192 (-f cfgfile) 192 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 2464 1437 (Gives the name of NeMaC's configuration file, i.e. the file it will read to) 1437 SB
X596 2518 1439 (determine which meters will be managed and have flow data collected) 1439 SB

X596 2572 881 (from them. Its default name is NeMaC.cfg.) 881 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2652 28 (-l) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 2652 1262 (Requests NeMaC to list the rule file\(s\) as they are processed.) 1262 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2732 211 (-r rulefile) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 2732 1353 (Gives the name of a rule file to be read and downloaded to one or) 1353 SB
X596 2786 1245 (more meters. Configuration file records may override this for) 1245 SB

X596 2840 360 (individual meters.) 360 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2920 41 (-s) 41 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 2920 1370 (Tells NeMaC that the rule file is to be read and checked for syntax,) 1370 SB

X596 2974 642 (but not downloaded to a meter.) 642 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (19) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC

X330 257 30 (-t) 30 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 257 1328 (This option is for testing - it provides extra diagnostic output from) 1328 SB

X596 311 169 (NeMaC.) 169 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 391 41 (-v) 41 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X596 391 1353 (Asks NeMaC to run in 'verbose' mode. This produces a display of) 1353 SB
X596 445 1395 (meter status information on the screen at each collection from every) 1395 SB
X596 499 131 (meter.) 131 SB
X271 578 1620 (Following the options, the name of a meter and its write SNMP community may) 1620 SB
X271 632 1739 (appear on the command line. In this case, NeMaC will begin managing the specified) 1739 SB
X271 686 1670 (meter. If NeMaC can find a configuration file, the meter information in that file will) 1670 SB
X271 740 836 (override any given on the command line.) 836 SB

X271 819 257 (For example) 257 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X389 898 1344 (NeMaC -c120 -r rules.sample 130.216.234.237 test) 1344 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 972 1669 (would cause NeMaC to begin managing meter 130.216.234.237 with write SNMP) 1669 SB
X271 1026 1693 (community 'test'. The rule file 'rules.sample' would be read and downloaded to the) 1693 SB
X271 1080 1748 (meter, and that meter's flow data would be collected every two minutes and written to) 1748 SB
X271 1134 1727 (a file called 130.216.234.237.flows.00x, where 00x was the next available sequence) 1727 SB
X271 1188 170 (number.) 170 SB

X271 1267 119 (Again) 119 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X389 1346 1260 (NeMaC -s -l -r rules.special > syntax.special) 1260 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1420 1762 (would cause NeMaC to perform a syntax check on the rule file 'rules.special,' writing a) 1762 SB
X271 1474 1715 (listing of the file during the syntax cheak. Output from this operation is directed to a) 1715 SB

X271 1528 920 (file called 'syntax.special' for later inspection.) 920 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1615 84 (6.3.) 84 SB

X413 1615 616 (Configuration File Format) 616 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1698 1789 (The name of the configuration file is specified by the -f command line option \(above\). If) 1789 SB
X271 1752 1795 (this option is not used, 'NeMaC.cfg' is used as the default name. If NeMaC can find the) 1795 SB
X271 1806 1858 (configuration file it will read it and start controlling meter\(s\) as specified in the configuration) 1858 SB
X271 1860 1830 (records; otherwise it assumes that only one meter is to be controlled, and that all options) 1830 SB
X271 1914 720 (are specified on the command line.) 720 SB

X271 1993 1399 (Each record in a configuration file may contain the following options:) 1399 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2073 134 (-g sss) 134 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X566 2073 994 (Specifies the meter's garbage collection interval.) 994 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2153 112 (-h pp) 112 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X566 2153 356 (Sets NeTraMet's ) 356 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X922 2153 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1242 2153 768 ( as a percentage of the available flow) 768 SB

X566 2207 599 (space. Default value is 85%.) 599 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2287 119 (-i sss) 119 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X566 2287 442 (Specifies the meter's ) 442 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1008 2287 347 (InactivityTimeout) 347 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1355 2287 583 ( interval in seconds. Default) 583 SB
X566 2341 447 (value is 600 seconds.) 447 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2421 198 (-r rulefile) 198 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1054 2691 16 (l) 18 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2791 84 (7.1.) 84 SB

X413 2791 568 (Command Line Options) 568 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2874 1701 (NeTraMet is started from the command line like any other program. Command line) 1701 SB
X271 2928 1838 (options are specified in a Unix-like way, i.e. each option starts with a hyphen, then a letter) 1838 SB

X271 2982 1365 (indicating the options, then any parameters required by the option.) 1365 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (20) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 336 (The options are:) 336 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 336 165 (-w wsc) 165 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 336 1289 (Specifies that NeTraMet's write SNMP community is to be wsc.) 1289 SB

X537 390 596 (The default for this is private.) 596 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 470 129 (-r rsc) 129 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 470 1349 (Specifies a read SNMP community for NeTraMet. Up to four read) 1349 SB

X537 524 633 (communities may be specified.) 633 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 604 41 (-k) 41 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 604 1464 (Disables the keyboard. If your PC has a BIOS which will start without a) 1464 SB
X537 658 1317 (keyboard connected, use this option to tell NeTraMet there is no) 1317 SB
X537 712 1474 (keyboard. If you are running NeTraMet as a background process under) 1474 SB

X537 766 251 (SunOS you ) 251 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X788 766 100 (must) 100 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X888 766 455 ( disable the keyboard.) 455 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 846 41 (-s) 41 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 846 1451 (Disables the screen display. If NeTraMet's screen will never be looked) 1451 SB
X537 900 1355 (at, it makes sense not to spend processor cycles on maintaining a) 1355 SB

X537 954 157 (display.) 157 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 1034 140 (-f nnn) 140 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 1034 1502 (Sets the maximum number of flows to nnn. The default for this is 4000; it) 1502 SB
X537 1088 1432 (may be sensible to use a smaller number on the PC if you are using a) 1432 SB

X537 1142 281 (large rule set.) 281 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 1222 153 (-p nnn) 153 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X537 1222 1415 (Sets the size of NeTraMet's buffer for incoming packet headers. The) 1415 SB

X537 1276 742 (default size is 1024 packet headers.) 742 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1363 84 (7.2.) 84 SB

X413 1363 443 (PC Screen Display) 443 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1446 1826 (The display has three main areas; the top left corner is the 'status' area, the bottom left is) 1826 SB

X271 1500 1842 (the 'history' area, and the right-hand half displays a strip chart showing network utilisation.) 1842 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 351 3426 0 0 CB

X330 1576 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1579 1664 (The Status Area is updated every second to indicate the time, number of packets) 1664 SB
X389 1633 1694 (\(p=\), bytes \(b=\), and utilisation % \(u=\) for that second. It also shows the maximum) 1694 SB
X389 1687 1653 (packet backlog \(q=\), i.e. the maximum length of the queue of uncounted packets) 1653 SB
X389 1741 1718 (during the second. The meter has buffer space for 1024 packets, so this parameter) 1718 SB

X389 1795 1601 (gives a good indication of the meter's ability to handle the current packet load.) 1601 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 351 3426 0 0 CB

X330 1871 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1874 1600 (The History Area displays messages about the meter's operations. These are) 1600 SB
X389 1928 1581 (written on the bottom line of the area, which is then scrolled up one line. The) 1581 SB
X389 1982 1653 (messages are time-stamped, so this area tells you what the meter, manager and) 1653 SB

X389 2036 718 (collector have been doing recently.) 718 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 351 3426 0 0 CB

X330 2112 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2115 1633 (Every ten seconds a new line of the chart is displayed on the bottom of the strip) 1633 SB
X389 2169 1628 (chart showing the minimum, average and maximum utilisation per second. The) 1628 SB
X389 2223 1714 (minimum is marked with a <, maximum with a > and the average with a *. The scale) 1714 SB
X389 2277 1552 (of the utilisation chart is normally 0 to 30% in 1% steps, but the 'h' keyboard) 1552 SB
X389 2331 1709 (command can be used to halve it, i.e. change it to 0 to 60% in 2% steps. The chart) 1709 SB
X389 2385 1594 (is scrolled up the screen as each line is displayed, so that it always shows the) 1594 SB

X389 2439 888 (network utilisation for the last 250 seconds.) 888 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2526 84 (7.3.) 84 SB

X413 2526 519 (Keyboard Commands) 519 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2609 1794 (If the keyboard is enabled, i.e. the -k option did not appear on its startup command line,) 1794 SB

X271 2663 1150 (pressing a key will perform various functions, as follows:) 1150 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2743 28 (b) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 2743 583 (Display 'bad packets' counts) 583 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2823 28 (h) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 2823 884 (Set/reset half scale for utilisation strip chart) 884 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2903 41 (m) 41 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 2903 633 (Display meter's memory usage) 633 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 2983 26 (s) 26 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 2983 1580 (Display meter performance statistics. These are explained further in the next) 1580 SB

X478 3037 160 (section.) 160 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (21) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC

X330 257 15 (t) 15 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 257 1029 (Display time in 1/100s intervals from meter startup) 1029 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 337 26 (v) 26 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 337 532 (Display meter version info) 532 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 417 23 (z) 23 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 417 744 (Set meter statistics variables to zero) 744 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 497 28 (?) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 497 979 (Display help \(summary of keyboard commands\)) 979 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X330 577 95 (ESC) 95 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X478 577 565 (Stop metering, exit to DOS.) 565 SB
X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
X271 664 84 (7.4.) 84 SB

X413 664 500 (PC Statistics Display) 500 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 747 788 (The statistics displayed are as follows:) 788 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X421 826 812 (Av pkt/s 90, av pkt backlog 1) 812 SB
X421 875 896 (Max pkt/s 154, max pkt backlog 1) 896 SB
X421 924 812 (Idle time av 98.2, min 96.5 %) 812 SB
X421 973 756 (247 flows in use \(max 4000\)) 756 SB
X421 1022 896 (13 flows recovered \(GC: 5 4 16\)) 896 SB
X421 1071 840 (2.3 rules/pkt, 1.2 tallies/pkt) 840 SB
X421 1120 504 (1.8 compares/tally) 504 SB

X421 1169 700 (512 hash slots, 83 in use) 700 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1243 1770 (Meter statistics are computed using counters which are updated every second. These) 1770 SB
X271 1297 1675 (counters can be set to zero by the manager, or by pressing the 'z' key. NeMaC, if) 1675 SB
X271 1351 1807 (instructed by the rule set, can read the statistics variables then set their counters to zero) 1807 SB
X271 1405 1704 (each time it collects the flow data. The statistics are provided so as to evaluate the) 1704 SB
X271 1459 1777 (meter's performance on various hardware configurations, network traffic loads and rule) 1777 SB
X271 1513 1003 (tables. A brief explanation of each is given here.) 1003 SB
X271 1592 1786 ('Packets per Second' gives the average and maximum packet rates observed since the) 1786 SB
X271 1646 809 (statistics counters were last set to zero.) 809 SB
X271 1725 1793 ('Packet Backlog' refers to the maximum length of the queue of packets received but not) 1793 SB
X271 1779 1835 (yet processed by the meter. The maximum queue length is 1024; packets received when) 1835 SB

X271 1833 1357 (the buffer is full are counted as lost packets, then discarded. The ) 1357 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1628 1833 230 (LostPacket) 230 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1858 1833 215 ( count can) 215 SB
X271 1887 744 (be displayed by pressing the 'b' key.) 744 SB
X271 1966 1854 (NeTraMet's highest-priority process attempts to take packets from the input queue, up to a) 1854 SB
X271 2020 1660 (maximum of 400 at a time. This prevents its lower-priority processes such as the) 1660 SB
X271 2074 1807 (keyboard handler from being blocked indefinitely. If there are no packets in the queue a) 1807 SB
X271 2128 1694 (dummy packet is generated and passed to the packet matching routine, where it is) 1694 SB
X271 2182 1801 (counted. The 'Idle Time' measurements are the ratio of dummy packets to total packets) 1801 SB
X271 2236 1070 (\(i.e. dummy + real packets\) processed by the meter.) 1070 SB
X271 2315 1833 ('Flows In Use' means flows which currently hold valid flow data. Flows normally remain in) 1833 SB
X271 2369 1750 (use until they become inactive and their data has been collected. Once they become) 1750 SB
X271 2423 1785 (inactive their space can be recovered by the garbage collector. If the meter runs out of) 1785 SB
X271 2477 1524 (space for new flows the garbage collector will reclaim the oldest flows first.) 1524 SB
X271 2556 1858 ('Flows Recovered' shows the number of flows reclaimed by the garbage collector since the) 1858 SB
X271 2610 1725 (statistics counters were last set to zero. The garbage collector is controlled by three) 1725 SB
X271 2664 1777 (parameters, which are displayed after the GC: label. The first of these is the interval in) 1777 SB
X271 2718 1836 (seconds between invocations of the garbage collector. Its default value is 5, but it can be) 1836 SB
X271 2772 1847 (changed by the manager. The other parameters are the number of 'in use' and 'idle' flows) 1847 SB
X271 2826 1823 (tested by the garbage collector each time it is invoked. These cannot be changed by the) 1823 SB

X271 2880 103 (user.) 103 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (22) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1756 ('Rules per packet' and 'Tallies per Packet' show how many rules were tested and how) 1756 SB
X271 310 1742 (many tally actions were performed for each packet. Tallies are implemented by hash) 1742 SB
X271 364 1856 (tables; the number of 'Compares per Tally' gives an indication of how long the hash chains) 1856 SB
X271 418 292 (have become.) 292 SB
X271 497 1773 ('Number of Hash Slots' is the maximum number of entries in the tally hash tables. The) 1773 SB
X271 551 1852 (number of hash slots in use indicates how effectively the hashing function is spreading the) 1852 SB

X271 605 849 (incoming packets across the hash tables.) 849 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 692 84 (7.5.) 84 SB

X413 692 953 (Configuring Waterloo TCP for NeTraMet) 953 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 775 1773 (Waterloo TCP stores its configuration data in a file called WATTCP.CFG. For use with) 1773 SB
X271 829 1633 (NeTraMet it is simplest to place this file in the same directory as NeTraMet itself) 1633 SB
X271 908 1832 (A sample WATTCP.CFG file is included in the NeTraMet distribution. This will need to be) 1832 SB
X271 962 1786 (edited to specify the IP Address, Subnet Mask, Default Gateway and Domain Name for) 1786 SB
X271 1016 1848 (NeTraMet at the location where you intend to run it. The file is in plain ASCII text, and it is) 1848 SB

X271 1070 834 (obvious which lines need to be modified.) 834 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1157 84 (7.6.) 84 SB
X413 1157 673 (Sample AUTOEXEC.BAT file) 673 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X389 1240 812 (wd8003e 0x60 5 0x300 0xD800) 812 SB

X389 1289 1092 (NeTraMet -r NOC remote -w Net*Manager) 1092 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1363 1730 (The first line above starts the packet driver for a Western Digital ethernet card, using) 1730 SB
X271 1417 1728 (hardware interrupt \(IRQ\) 5, I/O address 0x300, shared memory address 0xd800 and) 1728 SB
X271 1471 1774 (packet interrupt 0x60. NeTraMet searches the interrupt vector when it starts up, which) 1774 SB
X271 1525 1836 (allows you to use any valid packet interrupt address. For Version 2.0, NeTraMet can only) 1836 SB
X271 1579 604 (handle a single packet driver.) 604 SB
X271 1658 1580 (The second line starts NeTraMet, specifying that it is to have two read SNMP) 1580 SB
X271 1712 1740 (communities, 'NOC' and 'remote', and that its write community is 'Net*Manager'. The) 1740 SB
X271 1766 1818 (screen and keyboard are enabled by default, and the meter will use a maximum of 4,000) 1818 SB

X271 1820 118 (flows.) 118 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1907 84 (7.7.) 84 SB

X413 1907 1384 (Differences between PC and SunOS versions of NeTraMet) 1384 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1990 1846 (The PC version of the meter runs on a system with a dedicated screen and keyboard, and) 1846 SB
X271 2044 1855 (hence will respond to keyboard commands, and will provide a continuously-updated status) 1855 SB
X271 2098 157 (display.) 157 SB
X271 2177 1835 (The SunOS version is intended to run as a background process on a Unix system. When) 1835 SB
X271 2231 1843 (starting NeTraMet as a background process, don't forget to use the '-k' option to prevent it) 1843 SB
X271 2285 389 (trying to read from ) 389 SB
X32 0 0 50 50 0 0 0 39 /Courier /font0 ANSIFont font

X660 2289 150 (stdin) 150 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X810 2292 28 (.) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2367 1723 (In the same way the SunOS version doesn't provide a status display. If its screen is) 1723 SB
X271 2421 1775 (enabled it will display history messages as events occur, but that is the full extent of its) 1775 SB
X271 2475 295 (screen output.) 295 SB
X271 2554 1682 (Some of the PC statistics variables have been specifically designed to monitor the) 1682 SB
X271 2608 1845 (hardware performance of the PC, so they are not relevant to SunOS. Packet backlog and) 1845 SB
X271 2662 1255 (processor utilisation stastics are not implemented for SunOS.) 1255 SB
X271 2741 1678 (Apart from the above comments about screen and keyboard, the two versions are) 1678 SB
X271 2795 1805 (identical. From the performance point of view, there is one further feature of the SunOS) 1805 SB
X271 2849 1774 (version; it is not limited by the PC's arcane memory models, so that it can handle more) 1774 SB

X271 2903 1724 (flows than the PC \(which has a limit of about 4500\). The SunOS limit is the fact that) 1724 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2957 273 (FlowIndexes ) 273 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X544 2957 1120 (are 16-bit values, giving an upper limit of 65,534 flows.) 1120 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (23) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC


X271 264 32 (8) 34 SB
X305 264 16 (.) 18 SB
X360 264 42 (N) 44 SB
X404 264 32 (e) 34 SB
X438 264 35 (T) 37 SB
X475 264 23 (r) 25 SB
X500 264 32 (a) 34 SB
X534 264 48 (M) 50 SB
X584 264 32 (e) 34 SB
X618 264 19 (t) 21 SB
X639 264 16 ( ) 18 SB
X657 264 42 (D) 44 SB
X701 264 16 (i) 18 SB
X719 264 32 (s) 34 SB
X753 264 19 (t) 21 SB
X774 264 23 (r) 25 SB
X799 264 16 (i) 18 SB
X817 264 35 (b) 37 SB
X854 264 35 (u) 37 SB
X891 264 19 (t) 21 SB
X912 264 16 (i) 18 SB
X930 264 35 (o) 37 SB

X967 264 35 (n) 37 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 364 84 (8.1.) 84 SB

X413 364 512 (CopyRight Statement) 512 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 447 1796 (Netramet is free software, distributed under the terms of the GNU Emacs general public) 1796 SB

X271 501 1623 (license. A copy of this is provided with the NeTraMet software distribution files.) 1623 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 588 84 (8.2.) 84 SB

X413 588 412 (DIstribution Files) 412 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 671 1358 (There are two NeTraMet distribution files, containing the following:) 1358 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 750 313 (NeTraMet.tar.Z) 313 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 804 1690 (NeTraMet documentation, including example rule files and the Meter Services MIB) 1690 SB
X389 858 1082 (Source code for CMU SNMP, NeTraMet and NeMaC) 1082 SB
X389 912 981 (Make files for NeTraMet and NeMaC on SunOS) 981 SB
X389 966 586 (Make files for NeMaC on IrIx) 586 SB

X389 1020 545 (NeTraMet.exe file for DOS) 545 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1099 277 (NeTraMet.zip) 277 SB

X389 1153 31 (S) 31 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X420 1153 1185 (ource code for Waterloo TCP, CMU SNMP and NeTraMet) 1185 SB
X389 1207 536 (Turbo Make files for these) 536 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1344 32 (9) 34 SB
X305 1344 16 (.) 18 SB
X360 1344 16 (I) 18 SB
X378 1344 35 (n) 37 SB
X415 1344 32 (s) 34 SB
X449 1344 19 (t) 21 SB
X470 1344 32 (a) 34 SB
X504 1344 16 (l) 18 SB
X522 1344 16 (l) 18 SB
X540 1344 32 (a) 34 SB
X574 1344 19 (t) 21 SB
X595 1344 16 (i) 18 SB

X613 1344 35 (o) 37 SB
X650 1344 35 (n) 37 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X330 1436 1797 (Create a directory for NeTraMet and place the NeTraMet.tar.Z file there. Uncompress it) 1797 SB

X330 1490 1773 (and unpack it; this will create directories and place NeTraMet's files in them as follows:) 1773 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1569 420 (./documentation) 420 SB
X507 1623 252 (/NeTraMet) 252 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1619 471 (NeTraMet documentation) 471 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X507 1677 252 (/examples) 252 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font
X862 1673 155 (rule files) 155 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X507 1731 140 (/snmp) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1727 513 (CMU SNMP documentation) 513 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1785 140 (./mib) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1781 293 (Accounting MIB) 293 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1834 140 (./src) 140 SB
X507 1888 224 (/snmplib) 224 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1884 490 (CMU SNMP library source) 490 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X507 1942 140 (/apps) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1938 596 (CMU SNMP applications source) 596 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X507 1996 168 (/meter) 168 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1992 323 (NeTraMet source) 323 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X507 2050 224 (/manager) 224 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 2046 278 (NeMaC source) 278 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 2104 168 (./sun/) 168 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 2100 396 (Make files for SunOS) 396 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 2158 140 (./sg/) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 2154 317 (Make files for Irix) 317 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X1179 2158 252 (NeTraMet.) 252 SB
X419 2212 140 (./pc/) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 2208 706 (EXE and WATTCP.CFG files for DOS) 706 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2286 465 (On a SunOS machine:) 465 SB

X330 2365 49 (cd) 49 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X379 2365 842 ( to the sun/snmplib directory and run the ) 842 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1221 2365 113 (make) 113 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1334 2365 763 ( file; this will create the SNMP library.) 763 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X330 2444 49 (cd) 49 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X379 2444 784 ( to the sun/apps directory and run the ) 784 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1163 2444 113 (make) 113 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1276 2444 725 ( file; this will create a minimal set of) 725 SB

X330 2498 602 (SNMP application programs..) 602 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X330 2577 49 (cd) 49 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X379 2577 801 ( to the sun/meter directory and run the ) 801 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1180 2577 113 (make) 113 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1293 2577 619 ( file; this will create NeTraMet.) 619 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X330 2656 49 (cd) 49 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X379 2656 866 ( to the sun/manager directory and run the ) 866 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1245 2656 113 (make) 113 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1358 2656 570 ( file; this will create NeMaC.) 570 SB
X330 2735 1768 (Copy NeTraMet and NaMaC to the location where they will be used. NeTraMet opens) 1768 SB
X330 2789 1748 (a UDP port for SNMP; make sure it has sufficient privilege to do this. NeMaC doesn't) 1748 SB
X330 2843 1777 (need special privilege, but it needs access to the mib.txt file \(in the /mib directory\). Set) 1777 SB

X330 2897 720 (a shell variable to specify this, e.g. ) 720 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X1050 2904 1064 (set MIBTXT = /usr/NeTraMet/mib/mib.txt) 1064 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (24) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X330 256 1761 (Decide on write community names for each meter you intend to run. Start the meters.) 1761 SB
X330 335 1798 (Create rule files for each meter. If there are many of these it will be sensible to create a) 1798 SB

X330 389 1282 (configuration file with an entry for each of them. Start NeMaC.) 1282 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 468 402 (On an Irix machine:) 402 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X330 547 1294 (Proceed as above. The only differences are that the Irix make ) 1294 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1624 547 82 (files) 82 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1706 547 282 ( are in the /sg) 282 SB
X330 601 1718 (directory instead of the /sun directory, and that NeTraMet is not implemented yet for) 1718 SB

X330 655 74 (Irix.) 74 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 734 191 (On a PC:) 191 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X330 813 1737 (If you only want to use NeTraMet, copy NeTraMet.exe and wattcp.cfg from your Unix) 1737 SB
X330 867 1766 (machine to the PC. Edit WATTCP.CFG to specify your meter's IP configuration. Start) 1766 SB
X330 921 218 (NeTraMet.) 218 SB
X330 1000 1746 (If you wish to compile and link NeTraMet yourself, copy NeTraMet.zip to your PC and) 1746 SB

X330 1054 1274 (unzip to create directories and place files into them as follows:) 1274 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1138 140 (/elib) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1134 562 (Waterloo TCP intrinsics library) 562 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1192 112 (/src) 112 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1188 388 (Waterloo TCP library) 388 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1246 140 (/apps) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1242 661 (Waterloo TCP application programs) 661 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1300 140 (/snmp) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1296 490 (CMU SNMP library source) 490 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1354 140 (/acct) 140 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1350 323 (NeTraMet source) 323 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X419 1408 112 (/lib) 112 SB
X32 0 0 42 42 0 0 0 40 /Helvetica /font12 ANSIFont font

X862 1404 323 (NeTraMet source) 323 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X330 1482 1786 (To create NeTraMet, run Turbo Make in each of the elib, src, snmp and acct directories) 1786 SB
X330 1536 1207 (in turn. This will create NeTraMet.exe in the acct directory.) 1207 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1673 32 (1) 34 SB
X305 1673 32 (0) 34 SB
X339 1673 16 (.) 18 SB
X421 1673 42 (N) 44 SB
X465 1673 32 (e) 34 SB
X499 1673 35 (T) 37 SB
X536 1673 23 (r) 25 SB
X561 1673 32 (a) 34 SB
X595 1673 48 (M) 50 SB
X645 1673 32 (e) 34 SB
X679 1673 19 (t) 21 SB
X700 1673 14 (') 16 SB
X716 1673 32 (s) 34 SB
X750 1673 16 ( ) 18 SB
X768 1673 35 (F) 37 SB
X805 1673 35 (u) 37 SB
X842 1673 19 (t) 21 SB
X863 1673 35 (u) 37 SB
X900 1673 23 (r) 25 SB

X925 1673 32 (e) 34 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1765 1794 (This is the initial version of NeTraMet; it will doubtless improve and grow. Please report) 1794 SB
X271 1819 1665 (any bugs or problems you encounter to me directly, n.bro...@auckland.ac.nz.) 1665 SB
X271 1898 1695 (Discussion about the Internet Accounting Architecture will continue on the Working) 1695 SB
X271 1952 1794 (Group's mailing list, accoun...@wugate.wustl.edu. If you are interested in network) 1794 SB
X271 2006 1674 (traffic metering please join this list by sending a request to accounting-wg-request) 1674 SB

X271 2060 1177 (@wugate.wustl.edu. Topics needing further work include) 1177 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2140 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2139 1588 (Improvements or modifications to the Meter Services MIB in the light of users') 1588 SB

X345 2193 240 (experience.) 240 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2273 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2272 1718 (Development of a language for describing metering requirements, and a compiler to) 1718 SB

X345 2326 1136 (test these for consistency and translate them into rules.) 1136 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2406 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2405 1394 (Development of standards for flow data files and their management.) 1394 SB

X271 2484 1855 (I would also appreciate user feedback and reports of your experiences with it, in particular:) 1855 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2564 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2563 1775 (Performance of various configurations of PC and SunOS meters on different networks.) 1775 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2643 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2642 1174 (Ports of NeTraMet or NeMaC to other operating systems.) 1174 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2722 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2721 1742 (Developments of programs for processing flow data files, e.g. to produce an input file) 1742 SB

X345 2775 485 (for a statistics package.) 485 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2855 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X345 2854 1621 (Rule files. How hard or easy did you find it to create rule files for your metering) 1621 SB
X345 2908 1700 (requirements? Were there things you wanted to do but couldn't? Did you discover) 1700 SB
X345 2962 1304 (any particularly elegant sets of rules for metering your network?) 1304 SB

X271 3041 1807 (Please post 'experience' reports to the Internet Accounting Mailing List \(address above\).) 1807 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (25) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC


X271 264 32 (1) 34 SB
X305 264 32 (1) 34 SB
X339 264 16 (.) 18 SB
X421 264 42 (A) 44 SB
X465 264 32 (c) 34 SB
X499 264 32 (k) 34 SB
X533 264 35 (n) 37 SB
X570 264 35 (o) 37 SB
X607 264 45 (w) 47 SB
X654 264 16 (l) 18 SB
X672 264 32 (e) 34 SB
X706 264 35 (d) 37 SB
X743 264 35 (g) 37 SB
X780 264 52 (m) 54 SB
X834 264 32 (e) 34 SB
X868 264 35 (n) 37 SB
X905 264 19 (t) 21 SB

X926 264 32 (s) 34 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 356 1729 (Many people have contributed to the development of NeTraMet. I wish to record my) 1729 SB
X271 410 1696 (thanks particularly to those who participated in the early discussions of the Internet) 1696 SB
X271 464 1691 (Accounting Working Group, which developed the Internet Accounting Architecture.) 1691 SB
X271 518 217 (Thanks to:) 217 SB

X330 597 717 (Cyndi Mills and Greg Ruth \(BBN\) ) 717 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1047 597 455 (Co-chairs to March 93) 455 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X330 651 1388 (Kathy Robertson \(Concord Communications\), George Abe \(infoNet\)) 1388 SB
X330 705 838 (Marshall Rose \(Dover Beach Consulting\)) 838 SB
X271 784 1851 (NeTraMet is the first implementation of the Working Group's draft Meter Services MIB. My) 1851 SB
X271 838 1713 (colleagues here at Auckland have contributed many hours of discussion throughout) 1713 SB
X271 892 922 (NeTraMet's development. Special thanks to:) 922 SB
X330 971 857 (John White, Russell Fulton, Murray Johns) 857 SB
X330 1025 234 (Wilson Yan) 234 SB
X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
X271 1162 32 (1) 34 SB
X305 1162 32 (1) 34 SB
X339 1162 16 (.) 18 SB
X421 1162 42 (R) 44 SB
X465 1162 32 (e) 34 SB
X499 1162 19 (f) 21 SB
X520 1162 32 (e) 34 SB
X554 1162 23 (r) 25 SB
X579 1162 32 (e) 34 SB
X613 1162 35 (n) 37 SB
X650 1162 32 (c) 34 SB
X684 1162 32 (e) 34 SB

X718 1162 32 (s) 34 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1254 1171 ("RFC 1060: Assigned Numbers," J. Reynolds, J. Postel,) 1171 SB
X389 1308 245 (March 1990) 245 SB
X271 1387 1537 ("RFC 1272: Internet Accounting: Background," C. Mills, D. Hirsh, G. Ruth,) 1537 SB
X389 1441 330 (November 1991) 330 SB
X271 1520 1263 ("Internetworking with TCP/IP Vol 1 \(2nd Edition\), " Comer, D,) 1263 SB
X389 1574 392 (Prentice Hall, 1991) 392 SB
X271 1653 1426 ("Inside AppleTalk \(2nd Edition\)," Sidhu, Andrews and Opppenheimer,) 1426 SB
X389 1707 462 (Addison Wesley, 1990) 462 SB
X271 1786 1375 ("Netware Communications Processes," Netware Application Notes,) 1375 SB

X389 1840 344 (September 1990) 344 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (26) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer

X%%Trailer
XSVDoc restore
Xend
X% TrueType font name key:
X% MSTT31c157 = 24b7DCourier NewF0000002e000001900000
X% MSTT31c163 = 24b7DCourier NewF00000026000001900000
X% MSTT31c16f = 24b7DCourier NewF00000032000001900000
X% MSTT31c17b = 24b7DCourier NewF00000032000002bc0000
X% MSTT31c187 = 24b7DCourier NewF0000001a000001900000
X% MSTT31c193 = 24b7DCourier NewF0000002e000002bc0000
X% MSTT31c19f = 24b7DCourier NewF0000002e000001900001
X%%DocumentSuppliedResources: procset Win35Dict 3 1
X
X%%DocumentNeededResources: font Courier
X%%+ font Courier-Bold
X%%+ font Courier-Oblique
X%%+ font Helvetica
X%%+ font Helvetica-Bold
X%%+ font Helvetica-Oblique
X%%+ font Symbol
X
X%%EOF
END_OF_FILE

if test 48329 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.D'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.D'\" unpacked with wrong size!
else
PARTS=""


for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then

PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then

echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(188008 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 188008 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi

echo shar: \"'netramet/doc/snmp/exclude'\" unpacked with wrong size!
fi


# end of 'netramet/doc/snmp/exclude'
fi
if test -f 'netramet/src/apps/snmpnetstat/route.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/route.c'\"
else

echo shar: Extracting \"'netramet/src/apps/snmpnetstat/route.c'\" \(11885 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/route.c' <<'END_OF_FILE'


X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X/*

X * Copyright (c) 1983,1988 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.

X */
X
X#include <stdio.h>

X#include <strings.h>
X#include <ctype.h>


X
X#include <sys/param.h>
X#include <sys/socket.h>
X
X#include <netinet/in.h>

X#define LOOPBACKNET 127


X
X#include <netdb.h>
X
X#include "ausnmp.h"
X#include "main.h"

X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "snmpapi.h"

X#include "snmpclnt.h"
X#include "mib.h"
X

Xextern int nflag;
Xextern char *routename(), *netname(), *plural();


X/* extern char *malloc(); /* in ausnmp.h */
Xextern struct snmp_session *Session;
Xextern struct variable_list *getvarbyname();

Xstatic oid oid_ipnoroutes[] = {1, 3, 6, 1, 2, 1, 4, 12, 0};
X
X
X/*


X * Print routing tables.
X */
Xroutepr()
X{
X struct route_entry route, *rp = &route;

X struct snmp_pdu *request, *response;

X struct variable_list *vp;


X char name[16], *flags;
X oid *instance, type;
X int toloopback, status;
X char ch;
X
X printf("Routing tables\n");
X printf("%-16.16s %-18.18s %-6.6s %s\n",
X "Destination", "Gateway",
X "Flags", "Interface");

X
X
X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X snmp_add_null_var(request, oid_rtdest, sizeof(oid_rtdest)/sizeof(oid));
X snmp_add_null_var(request, oid_rtifindex, sizeof(oid_rtifindex)/sizeof(oid));
X snmp_add_null_var(request, oid_rtnexthop, sizeof(oid_rtnexthop)/sizeof(oid));
X snmp_add_null_var(request, oid_rttype, sizeof(oid_rttype)/sizeof(oid));
X snmp_add_null_var(request, oid_rtproto, sizeof(oid_rtproto)/sizeof(oid));
X
X while(request){

X status = snmp_synch_response(Session, request, &response);
X if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR){

X fprintf(stderr, "SNMP request failed\n");
X break;
X }


X instance = NULL;
X request = NULL;
X rp->set_destination = 0;
X rp->set_interface = 0;
X rp->set_gateway = 0;
X rp->set_type = 0;
X rp->set_proto = 0;
X for(vp = response->variables; vp; vp = vp->next_variable){
X if (vp->name_length != 14 ||
X bcmp((char *)vp->name, (char *)oid_rttable, sizeof(oid_rttable))){

X continue; /* if it isn't in this subtree, just continue */
X }
X


X if (instance != NULL){
X oid *ip, *op;

X int count;
X


X ip = instance;
X op = vp->name + 10;
X for(count = 0; count < 4; count++){
X if (*ip++ != *op++)

X break;
X }


X if (count < 4)
X continue; /* not the right instance, ignore */
X } else {

X instance = vp->name + 10;

X }
X /*


X * At this point, this variable is known to be in the routing table
X * subtree, and is of the right instance for this transaction.

X */
X
X if (request == NULL)


X request = snmp_pdu_create(GETNEXT_REQ_MSG);
X snmp_add_null_var(request, vp->name, vp->name_length);
X

X type = vp->name[9];
X switch ((char)type){
X case RTDEST:
X bcopy((char *)vp->val.string, (char *)&rp->destination, sizeof(u_long));

X rp->set_destination = 1;
X break;


X case RTIFINDEX:
X rp->interface = *vp->val.integer;

X rp->set_interface = 1;
X break;


X case RTNEXTHOP:
X bcopy((char *)vp->val.string, (char *)&rp->gateway, sizeof(u_long));

X rp->set_gateway = 1;
X break;


X case RTTYPE:
X rp->type = *vp->val.integer;

X rp->set_type = 1;
X break;


X case RTPROTO:
X rp->proto = *vp->val.integer;
X rp->set_proto = 1;

X break;
X }
X }

X struct snmp_pdu *pdu, *response;

X struct variable_list *vp;
X struct iflist *ip;
X oid varname[32];

X int status;
X


X for(ip = Iflist; ip; ip = ip->next){
X if (ip->index == index)
X break;
X }
X if (ip){

X strcpy(name, ip->name);
X return;
X }


X ip = (struct iflist *)malloc(sizeof(struct iflist));
X ip->next = Iflist;
X Iflist = ip;
X ip->index = index;

X pdu = snmp_pdu_create(GET_REQ_MSG);


X bcopy((char *)oid_ifdescr, (char *)varname, sizeof(oid_ifdescr));
X varname[10] = (oid)index;
X snmp_add_null_var(pdu, varname, sizeof(oid_ifdescr)/sizeof(oid) + 1);
X status = snmp_synch_response(Session, pdu, &response);
X if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR){

X vp = response->variables;

X bcopy((char *)vp->val.string, ip->name, vp->val_len);

X ip->name[vp->val_len] = '\0';
X } else {


X sprintf(ip->name, "if%d", index);
X }
X strcpy(name, ip->name);
X}
X
Xchar *
Xroutename(in)

X struct in_addr in;
X{

X register char *cp;


X static char line[MAXHOSTNAMELEN + 1];

X struct hostent *hp;


X static char domain[MAXHOSTNAMELEN + 1];
X static int first = 1;

X char *index();
X
X if (first) {

X first = 0;


X if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
X (cp = index(domain, '.')))
X (void) strcpy(domain, cp + 1);
X else
X domain[0] = 0;
X }
X cp = 0;

X if (!nflag) {
X hp = gethostbyaddr((char *)&in, sizeof (struct in_addr),
X AF_INET);


X if (hp) {
X if ((cp = index(hp->h_name, '.')) &&
X !strcmp(cp + 1, domain))

X *cp = 0;


X cp = hp->h_name;
X }
X }

X if (cp)
X strncpy(line, cp, sizeof(line) - 1);
X else {

X#define C(x) ((x) & 0xff)

X in.s_addr = ntohl(in.s_addr);


X sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
X C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
X }
X return (line);

X}
X
X/*


X * Return the name of the network whose address is given.
X * The address is assumed to be that of a net or subnet, not a host.
X */
Xchar *
Xnetname(in, mask)

X struct in_addr in;


X u_long mask;
X{
X char *cp = 0;
X static char line[MAXHOSTNAMELEN + 1];
X struct netent *np = 0;
X u_long net;
X register i;
X int subnetshift;
X
X i = ntohl(in.s_addr);
X if (!nflag && i) {
X if (mask == 0) {
X if (IN_CLASSA(i)) {
X mask = IN_CLASSA_NET;
X subnetshift = 8;
X } else if (IN_CLASSB(i)) {
X mask = IN_CLASSB_NET;
X subnetshift = 8;
X } else {
X mask = IN_CLASSC_NET;
X subnetshift = 4;

X }
X /*


X * If there are more bits than the standard mask
X * would suggest, subnets must be in use.
X * Guess at the subnet mask, assuming reasonable
X * width subnet fields.
X */
X while (i &~ mask)
X mask = (long)mask >> subnetshift;
X }
X net = i & mask;
X while ((mask & 1) == 0)
X mask >>= 1, net >>= 1;

X np = getnetbyaddr(net, AF_INET);
X if (np)
X cp = np->n_name;
X }

X if (cp)
X strncpy(line, cp, sizeof(line) - 1);
X else if ((i & 0xffffff) == 0)
X sprintf(line, "%u", C(i >> 24));
X else if ((i & 0xffff) == 0)
X sprintf(line, "%u.%u", C(i >> 24) , C(i >> 16));
X else if ((i & 0xff) == 0)
X sprintf(line, "%u.%u.%u", C(i >> 24), C(i >> 16), C(i >> 8));
X else
X sprintf(line, "%u.%u.%u.%u", C(i >> 24),
X C(i >> 16), C(i >> 8), C(i));
X return (line);

X}
X
X/*


X * Print routing statistics
X */
Xrt_stats()
X{

X struct variable_list *var;
X

X printf("routing:\n");
X var = getvarbyname(Session, oid_ipnoroutes, sizeof(oid_ipnoroutes) / sizeof(oid));
X if (var){
X printf("\t%u destination%s found unreachable\n",

X *var->val.integer, plural((int)*var->val.integer));
X } else {
X printf("\tCouldn't get ipOutNoRoutes variable\n");
X }
X}
X


X/*
X * Request a variable with a GET REQUEST message on the given
X * session. The session must have been opened as a synchronous
X * session (synch_setup_session()). If the variable is found, a
X * pointer to a struct variable_list object will be returned.
X * Otherwise, NULL is returned. The caller must free the returned
X * variable_list object when done with it.
X */
Xstruct variable_list *
Xgetvarbyname(sp, name, len)

X struct snmp_session *sp;


X oid *name;
X int len;
X{

X struct snmp_pdu *request, *response;

X struct variable_list *var = NULL, *vp;
X int status;
X


X request = snmp_pdu_create(GET_REQ_MSG);
X
X snmp_add_null_var(request, name, len);
X
X status = snmp_synch_response(sp, request, &response);
X

X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){

X for(var = response->variables; var; var = var->next_variable){
X if (var->name_length == len && !bcmp(name, var->name, len * sizeof(oid)))
X break; /* found our match */
X }
X if (var != NULL){

X /*


X * Now unlink this var from pdu chain so it doesn't get freed.
X * The caller will free the var.
X */
X if (response->variables == var){
X response->variables = var->next_variable;
X } else {
X for(vp = response->variables; vp; vp = vp->next_variable){
X if (vp->next_variable == var){
X vp->next_variable = var->next_variable;

X break;
X }
X }
X }
X }

X }
X }
X if (response)
X snmp_free_pdu(response);

X return var;
X}
END_OF_FILE


if test 11885 -ne `wc -c <'netramet/src/apps/snmpnetstat/route.c'`; then

echo shar: \"'netramet/src/apps/snmpnetstat/route.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/route.c'
fi
echo shar: End of archive 8 \(of 25\).
cp /dev/null ark8isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 5:59:33 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 97
Archive-name: netramet/part09
Environment: INET, UNIX, DOS

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.B
# netramet/src/meter/meter_pc.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:07 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 9 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.B' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\"
else

echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\" \(47982 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.B' <<'END_OF_FILE'
X413 2731 1021 (Column Blobs: Recovering Bulk Flow Data) 1021 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2814 1848 (One vital element of an accounting meter is that it must be possible to retrieve flow data in) 1848 SB
X271 2868 1839 (an efficient manner. SNMP can be inefficient for this purpose, since every value retrieved) 1839 SB
X271 2922 1823 (is accompanied by its object identifier. To retrieve a long value \(four bytes\) can require a) 1823 SB

X271 2976 885 (further 12 or more bytes of object identifier!) 885 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (4) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1822 (NeTraMet solves this problem by using SNMP opaque objects to pass many values back) 1822 SB

X271 310 1286 (to NeMac as a single unit. The MIB defines an object called a ) 1286 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1557 310 265 (Column Blob) 265 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1822 310 272 ( to do this. A) 272 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 364 265 (Column Blob) 265 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X536 364 1433 ( is a three-dimensional SNMP object, the dimensions being a 'column') 1433 SB

X271 418 209 (number,a ) 209 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X480 418 190 (LastTime) 190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X670 418 267 ( value and a ) 267 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X937 418 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1148 418 983 (. NeMaC views the flow table as a matrix with a) 983 SB
X271 472 1792 (column for each flow attribute. It can retrieve values of a particular attribute for all flows) 1792 SB
X271 526 1834 (active since a specified time, starting at a given row of the flow table and recalling column) 1834 SB
X271 580 713 (blobs in sequence down a column.) 713 SB
X271 659 1684 (NeMac takes this idea a little further. The user specifies which attributes are to be) 1684 SB
X271 713 1756 (collected using a Format statement in the rule file. NeMaC uses the Format to decide) 1756 SB
X271 767 1816 (which columns are required, then retrieves column blobs for each attribute starting at the) 1816 SB
X271 821 1692 (first row of the flow table. The resulting collected flows are written to disk, then the) 1692 SB
X271 875 1583 (process is repeated starting at the row after the last collected row, and so on.) 1583 SB
X271 954 1809 (The maximum column blob size is chosen to fit into a 500-byte SNMP packet, which can) 1809 SB
X271 1008 1812 (carry from 50 to 60 attribute values \(together with their flow numbers\). As an example, if) 1812 SB
X271 1062 1803 (we wish to collect 10 attributes for 1000 flows, this will require only 10 x 20 = 200 SNMP) 1803 SB
X271 1116 1733 (packets To minimise network loading, NeMaC pauses for 90 milliseconds after each) 1733 SB

X271 1170 314 (SNMP request.) 314 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

Xgs 323 3426 0 0 CB
X271 1307 48 (3.) 48 SB
Xgr
X360 1307 35 (F) 37 SB
X397 1307 16 (l) 18 SB
X415 1307 35 (o) 37 SB
X452 1307 45 (w) 47 SB
X499 1307 16 ( ) 18 SB
X517 1307 42 (A) 44 SB
X561 1307 19 (t) 21 SB
X582 1307 19 (t) 21 SB
X603 1307 23 (r) 25 SB
X628 1307 16 (i) 18 SB
X646 1307 35 (b) 37 SB
X683 1307 35 (u) 37 SB
X720 1307 19 (t) 21 SB
X741 1307 32 (e) 34 SB

X775 1307 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

Xgs 355 3426 0 0 CB
X271 1407 84 (3.1.) 84 SB
Xgr

X413 1407 295 (Introduction) 295 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1490 1824 (A flow's attributes may be conveniently arranged into five groups: adjacent address, peer) 1824 SB
X271 1544 1680 (address, detail address, subscriber and general. Since NeTraMet can't determine) 1680 SB
X271 1598 1793 (subscriber information merely by watching the packets passing by, subscriber attributes) 1793 SB
X271 1652 1690 (are not currently implemented. A meter running in a network access server would,) 1690 SB
X271 1706 761 (however, be able to implement them.) 761 SB
X271 1785 1814 (Adjacent address attributes are described in the Ethernet Attributes section; they are the) 1814 SB
X271 1839 790 (same for all of the peer address types.) 790 SB
X271 1918 1842 (Peer and detail addresses, however, are different for each of the peer protocols. They are) 1842 SB
X271 1972 1759 (therefore explained together in the sections on IP, DECnet, Novell IPX and EtherTalk.) 1759 SB

X271 2026 1372 (The attributes which give a flow's peer and detail address type are ) 1372 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1643 2026 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1991 2026 91 ( and) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2080 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2080 39 (. ) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X678 2080 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1026 2080 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1130 2080 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1426 2080 456 ( are synonyms, as are) 456 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2134 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2134 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2134 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1059 2134 1033 (. If the meter were implemented on a gateway the) 1033 SB
X271 2188 1721 (source- and dest- types could be different, but this is impossible on a single network) 1721 SB
X271 2242 191 (segment.) 191 SB

X271 2321 93 (The ) 93 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X364 2321 458 (SourcePeerTypeMask) 458 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X822 2321 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X926 2321 478 (SourceDetailTypeMask) 478 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1404 2321 82 ( \(or ) 82 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1486 2321 406 (DestPeerTypeMask) 406 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1892 2321 91 ( and) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2375 426 (DestDetailTypeMask) 426 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X697 2375 1430 (\) attributes can be used to specify that the type fields are to be tallied.) 1430 SB

X271 2429 1487 (In this situation a mask value of 255 \(all bits on\) is the only sensible one.) 1487 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2516 84 (3.2.) 84 SB
X413 2516 448 (Ethernet attributes) 448 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2599 1685 (NeTraMet's initial implementation supports a single ethernet interface. It therefore) 1685 SB

X271 2653 1672 (supports only one adjacent address type, i.e. ethernet, which is the same for both) 1672 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2707 431 (SourceAdjacentType) 431 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X702 2707 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X806 2707 379 (DestAdjacentType) 379 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1185 2707 876 (. Since there is only one adjacent address) 876 SB
X271 2761 192 (type, the ) 192 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X463 2761 394 (AdjacentTypeMask) 394 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X857 2761 653 ( attributes are not implemented.) 653 SB

X271 2840 93 (The ) 93 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X364 2840 498 (SourceAdjacentAddress) 498 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X862 2840 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X966 2840 446 (DestAdjacentAddress) 446 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1412 2840 546 ( attributes are the ethernet) 546 SB
X271 2894 1750 (addresses of the source and destination hosts. These are written as six hexadecimal) 1750 SB
X271 2948 1828 (bytes separated by hyphens, e.g. 00-00-C0-00-13-A5. They may be entered in this form,) 1828 SB

X271 3002 864 (or as six decimal bytes separated by dots.) 864 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (5) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 438 (SourceAdjacentMask) 438 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X709 256 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X813 256 386 (DestAdjacentMask) 386 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1199 256 887 ( may be used in actions to tally fields within) 887 SB
X271 310 1645 (adjacent addresses. They are written and entered in the same form as adjacent) 1645 SB

X271 364 227 (addresses.) 227 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 451 84 (3.2.) 84 SB

X413 451 291 (IP attributes) 291 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 534 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 534 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 534 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 534 118 ( = 2) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 613 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 613 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 613 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 667 1733 (IP addresses of the flow's two hosts, written as four decimal bytes separated by dots) 1733 SB

X389 721 1078 (and entered in the same way, e.g. 130.216.234.237.) 1078 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 800 355 (SourcePeerMask) 355 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X626 800 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X730 800 303 (DestPeerMask) 303 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 854 1293 (Address masks for tallies; in the same form as peer addresses.) 1293 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 933 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 933 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 933 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 987 1647 (Protocol field from the IP packet header. The values of these are given in RFC ,) 1647 SB
X389 1041 857 (Assigned Numbers. Common values are:) 857 SB
X500 1095 66 (1 =) 66 SB
X596 1095 115 (ICMP) 115 SB
X500 1149 66 (6 =) 66 SB
X596 1149 92 (TCP) 92 SB
X500 1203 66 (7 =) 66 SB
X596 1203 97 (UDP) 97 SB
X389 1257 978 (These names can be used for them in rule files.) 978 SB

X389 1337 117 (If the ) 117 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X506 1337 221 (DetailType) 221 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X727 1337 59 ( is ) 59 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X786 1337 92 (TCP) 92 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X878 1337 67 ( or ) 67 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X945 1337 97 (UDP) 97 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1042 1337 104 (, the ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1146 1337 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1581 1337 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1685 1337 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1391 1656 (contain the flow's source and destination port numbers. Many of their values are) 1656 SB
X389 1445 1254 (given in RFC 1060, Assigned Numbers. Common values are) 1254 SB
X474 1499 92 (20 =) 92 SB
X596 1499 225 (FTP-DATA) 225 SB
X1183 1499 92 (53 =) 92 SB
X1305 1499 184 (DOMAIN) 184 SB
X474 1553 92 (21 =) 92 SB
X596 1553 87 (FTP) 87 SB
X1157 1553 118 (119 =) 118 SB
X1305 1553 125 (NNTP) 125 SB
X474 1607 92 (23 =) 92 SB
X596 1607 177 (TELNET) 177 SB
X1157 1607 118 (123 =) 118 SB
X1305 1607 92 (NTP) 92 SB
X474 1661 92 (25 =) 92 SB
X596 1661 128 (SMTP) 128 SB
X1157 1661 118 (161 =) 118 SB
X1305 1661 133 (SNMP) 133 SB
X389 1715 1128 (These names can be also be used for them in rule files) 1128 SB

X389 1795 117 (If the ) 117 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X506 1795 221 (DetailType) 221 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X727 1795 59 ( is ) 59 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font

X786 1795 115 (ICMP) 115 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X901 1795 130 (, then ) 130 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1031 1795 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1466 1795 584 ( contains the ICMP type and) 584 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X389 1849 383 (DestDetailAddress) 383 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X772 1849 1321 ( contains the ICMP code. For a description of these see Comer,) 1321 SB
X389 1903 1072 ("Internetworking with TCP/IP." Common values are:) 1072 SB
X500 1957 66 (0 =) 66 SB
X596 1957 214 (echo reply) 214 SB
X500 2011 66 (8 =) 66 SB
X596 2011 269 (echo request) 269 SB
X500 2065 66 (3 =) 66 SB
X596 2065 494 (destination unreachable) 494 SB
X500 2119 66 (5 =) 66 SB

X596 2119 154 (redirect) 154 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2198 375 (SourceDetailMask) 375 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X646 2198 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X750 2198 323 (DestDetailMask) 323 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2252 98 (Like ) 98 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X487 2252 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X855 2252 1246 (, these are 16-bit fields, which are written as a single integer,) 1246 SB
X389 2306 1641 (and can be entered in this form or as two decimal bytes separated by a dot, e.g.) 1641 SB

X389 2360 379 (255.255 or 65535.) 379 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2447 84 (3.3.) 84 SB
X421 2447 425 (DECnet attributes) 425 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2530 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 2530 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 2530 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 2530 118 ( = 5) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2609 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 2609 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 2609 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2663 1670 (DECnet Phase IV addresses of the flow's two hosts, written as four decimal bytes) 1670 SB
X389 2717 1710 (separated by dots and entered in the same way, e.g.4.1.150.0. The first byte is the) 1710 SB
X389 2771 1673 (DECnet Area Number, the next two are the \(16-bit\) DECnet Host Number and the) 1673 SB

X389 2825 489 (last byte is always zero.) 489 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2904 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2904 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2904 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2958 1306 (DECnet Phase IV protocol type, which has the following values:) 1306 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (6) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X474 256 92 (14 =) 92 SB
X596 256 293 (data + discard) 293 SB
X1183 256 92 (11 =) 92 SB
X1305 256 232 (router hello) 232 SB
X500 310 66 (6 =) 66 SB
X596 310 91 (data) 91 SB
X1209 310 66 (9 =) 66 SB
X1305 310 289 (level 2 routing) 289 SB
X500 364 66 (7 =) 66 SB
X596 364 289 (level 1 routing) 289 SB
X1183 364 92 (13 =) 92 SB

X1305 364 293 (endnode hello) 293 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 443 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 443 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 497 504 (Always zero for DECnet.) 504 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 584 84 (3.4.) 84 SB

X413 584 489 (Novell IPX attributes) 489 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 667 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 667 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 667 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 667 118 ( = 6) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 746 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 746 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 746 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 800 1742 (IPX network numbers of the flow's two hosts, written as four decimal bytes separated) 1742 SB
X389 854 1685 (by dots and entered in the same way, e.g. 130.216.0.28. Novell network numbers) 1685 SB
X389 908 1674 (are assigned by the network administrator; at the University of Auckland we use a) 1674 SB
X389 962 1023 (Novell Server's IP address as its network number.) 1023 SB
X389 1041 1588 (A full IPX host address is the combination of its network number and ethernet) 1588 SB
X389 1095 1719 (address. Because the current implementation of NeTraMet limits peer addresses to) 1719 SB
X389 1149 1715 (a maximum of four bytes, it can in general only handle IPX network numbers. For a) 1715 SB
X389 1203 1709 (host on the same network segment as its server the adjacent address provides that) 1709 SB
X389 1257 1562 (host's ethernet address but this is not the case for IPX packets from another) 1562 SB

X389 1311 1715 (segment, which have the adjacent address of the router through which they arrived.) 1715 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1390 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 1390 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 1390 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1444 1316 (XNS protocol type. Possible values are given in RFC 1060, e.g:) 1316 SB
X500 1498 66 (5 =) 66 SB
X596 1498 378 (sequenced packet) 378 SB
X500 1552 66 (4 =) 66 SB
X596 1552 352 (packet exchange) 352 SB
X500 1606 66 (1 =) 66 SB

X596 1606 384 (routing information) 384 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1685 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 1685 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 1685 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1739 1178 (Source and destination IPX port numbers. These include) 1178 SB
X422 1793 144 (1105 =) 144 SB
X596 1793 608 (NCP \(Netware Core Protocol\)) 608 SB
X422 1847 144 (1106 =) 144 SB
X596 1847 715 (SAP \(Service Advertising Protocol\)) 715 SB
X422 1901 144 (1107 =) 144 SB
X596 1901 708 (RIP \(Routing Information Protocol\)) 708 SB
X271 1980 1843 (Further details of Netware communications protocols are given "Netware Communications) 1843 SB

X271 2034 245 (Processes.") 245 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2121 84 (3.5.) 84 SB

X413 2121 473 (EtherTalk attributes) 473 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2204 348 (SourcePeerType) 348 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X619 2204 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X723 2204 296 (DestPeerType) 296 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1019 2204 118 ( = 7) 118 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2283 415 (SourcePeerAddress) 415 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X686 2283 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X790 2283 363 (DestPeerAddress) 363 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2337 1732 (AppleTalk addresses of the flow's two hosts, written as four decimal bytes separated) 1732 SB
X389 2391 1697 (by dots and entered in the same way, e.g. 0.129.251.0. The first two bytes are the) 1697 SB
X389 2445 1698 (host's AppleTalk \(16-bit\) network number, the third is its node number \(dynamically) 1698 SB

X389 2499 1169 (assigned when it starts up\) and the fourth is always zero.) 1169 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2578 368 (SourceDetailType) 368 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X639 2578 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X743 2578 316 (DestDetailType) 316 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2632 1185 (AppleTalk DDP protocol type. Some common values are:) 1185 SB
X500 2686 66 (1 =) 66 SB
X596 2686 130 (RTMP) 130 SB
X1209 2686 66 (5 =) 66 SB
X1305 2686 130 (RTMP) 130 SB
X500 2740 66 (2 =) 66 SB
X596 2740 95 (NBP) 95 SB
X1209 2740 66 (6 =) 66 SB
X1305 2740 72 (ZIP) 72 SB
X500 2794 66 (3 =) 66 SB
X596 2794 90 (ATP) 90 SB
X1209 2794 66 (7 =) 66 SB
X1305 2794 126 (ADSP) 126 SB
X500 2848 66 (4 =) 66 SB

X596 2848 62 (EP) 62 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (7) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 435 (SourceDetailAddress) 435 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X706 256 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X810 256 383 (DestDetailAddress) 383 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 310 1677 (Source and destination AppleTalk socket numbers. These are two-byte numbers;) 1677 SB
X389 364 1525 (the socket numbers are the low-order byte and the high-order byte is zero.) 1525 SB

X271 443 1542 (Details of the AppleTalk protocols are given in the book "Inside Macintosh.") 1542 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 530 84 (3.6.) 84 SB

X413 530 431 (General attributes) 431 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 613 1825 (General attributes are those which relate to a traffic flow itself, rather than to its end-point) 1825 SB
X271 667 1783 (addresses. They may be collected from the meter and may be specified in actions, but) 1783 SB

X271 721 1087 (may not be used in rules. General attributes include:) 1087 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 800 630 (SourceInterface, DestInterface) 630 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 854 1678 (Interfaces corresponding to the flow's source and destination adjacent addresses.) 1678 SB

X389 908 1250 (In the current implementation these always have the value 1.) 1250 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 987 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1041 1211 (\(1-origin\) index of the flow within NeTraMet's table of flows.) 1211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1120 262 (FlowRuleSet) 262 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1174 1583 (Number of the rule set the meter was using when the flow was first observed.) 1583 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1253 200 (FlowType) 200 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1307 1323 (Type of the flow. Values are: 1 = count, 2 = tally, 3 = aggregate.) 1323 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1386 455 (ToOctets, FromOctets) 455 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1440 1682 (Number of bytes observed in the 'to' \(source to destination\) and 'from' direction for) 1682 SB

X389 1494 180 (this flow.) 180 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1573 427 (ToPDUs, FromPDUs) 427 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1627 1731 (Number of packets observed in the 'to' \(source to destination\) and 'from' direction for) 1731 SB

X389 1681 180 (this flow.) 180 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1760 191 (FirstTime) 191 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1814 1706 (Time \(in 1/100 second ticks from the time the meter started executing\) at which this) 1706 SB

X389 1868 752 (flow was first observed by the meter.) 752 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1947 190 (LastTime) 190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2001 1461 (Time \(units as above\) at which a packet was last observed for this flow.) 1461 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X271 2138 32 (4) 34 SB
X305 2138 16 (.) 18 SB
X360 2138 35 (F) 37 SB
X397 2138 16 (l) 18 SB
X415 2138 35 (o) 37 SB
X452 2138 45 (w) 47 SB
X499 2138 16 ( ) 18 SB
X517 2138 42 (D) 44 SB
X561 2138 32 (a) 34 SB
X595 2138 19 (t) 21 SB
X616 2138 32 (a) 34 SB
X650 2138 16 ( ) 18 SB
X668 2138 35 (F) 37 SB
X705 2138 16 (i) 18 SB
X723 2138 16 (l) 18 SB
X741 2138 32 (e) 34 SB

X775 2138 32 (s) 34 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2230 1290 (NeMaC produces files of flow data information with names like ) 1290 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1561 2230 307 (ccu2.flows.007) 307 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1868 2230 260 (. This would) 260 SB

X271 2284 1573 (be the seventh file of flow data collected from NeTraMet running on the host ) 1573 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1844 2284 98 (ccu2) 98 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1942 2284 176 (. Before) 176 SB
X271 2338 1732 (opening a flow data file NeMaC inspects its current working directory and selects the) 1732 SB
X271 2392 1219 (lowest sequence number not already used for this purpose.) 1219 SB
X271 2471 1773 (There are two kinds of records in a flow data file: flow records and information records.) 1773 SB
X271 2525 1860 (Each flow record is simply a sequence of attribute values separated by separators \(if these) 1860 SB
X271 2579 1834 (were specified - see the Format Statement section below\) or spaces, and terminated by a) 1834 SB

X271 2633 170 (newline.) 170 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2720 84 (4.1.) 84 SB

X413 2720 492 (Information Records) 492 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2803 1815 (Information records all start with a cross-hatch. The file's first record begins with ##, and) 1815 SB
X271 2857 1792 (identifies the file as being a file of data from NeTraMet. It records NeMaC's parameters) 1792 SB
X271 2911 810 (and the time this collection was started.) 810 SB
X271 2990 1841 (The file's second record begins with #Format: and is a copy of the Format statement used) 1841 SB
X271 3044 1843 (by NeMaC to collect the data. Note that any separators specified in the Format statement) 1843 SB

X271 3098 1175 (appear in the data file directly, not as C-language strings.) 1175 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (8) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1860 (The rest of the file is a sequence of collected data sets. Each of these starts with a #Time:) 1860 SB
X271 310 1847 (record, giving the time of day the collection was started, the meter name, and the range of) 1847 SB

X271 364 945 (meter times this collection represents. These ) 945 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1216 364 92 (from) 92 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1308 364 104 ( and ) 104 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1412 364 39 (to) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1451 364 347 ( times are meter ) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1798 364 184 (UpTimes) 184 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X507 1045 242 (flows in use) 242 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1132 84 (4.2.) 84 SB

X413 1132 531 (Sample Flow Data File) 531 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X301 1215 1798 (A sample flow data file appears below. Most of the flow records have been deleted, but) 1798 SB

X301 1269 735 (lines of dots show where they were.) 735 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X330 1348 252 (##NeTraMe) 252 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 3092 1150 (3 12 3560 5 59.3.13.0 4.1.152.0 20 20 1200 1200) 1150 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1115 3265 43 (-- ) 43 SB
X1158 3265 26 (9) 26 SB

X1184 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC


X330 256 1173 (3 13 3560 7 0.128.94.0 0.129.27.0 15 14 900 1144) 1173 SB
X330 296 1150 (3 14 3560 5 59.3.40.0 4.1.153.0 38 38 2280 2280) 1150 SB
X330 336 1012 (3 15 3560 5 0.0.0.0 4.1.153.0 0 30 0 1800) 1012 SB
X330 376 1173 (3 16 3560 5 4.1.152.0 59.2.189.0 20 20 1200 1200) 1173 SB
X330 416 1012 (3 17 3560 5 0.0.0.0 59.2.141.0 0 11 0 660) 1012 SB
X330 456 713 ( . . . . . . . . .) 713 SB
X330 511 1104 (3 476 26162 7 0.129.113.0 0.128.37.0 0 1 0 82) 1104 SB
X330 551 1150 (3 477 27628 7 0.128.41.0 0.128.46.0 1 1 543 543) 1150 SB
X330 591 1173 (3 478 27732 7 0.128.211.0 0.128.46.0 1 1 543 543) 1173 SB
X330 631 1104 (3 479 31048 7 0.128.47.0 2.38.221.0 1 1 60 60) 1104 SB
X330 671 1196 (3 480 32717 2 202.14.100.0 130.216.76.0 0 4 0 240) 1196 SB
X330 711 1265 (3 481 32717 2 130.216.76.0 130.216.3.0 0 232 0 16240) 1265 SB
X330 751 1610 (#Time: 12:41:25 Fri 1 Oct 93 130.216.14.251 Flows from 33419 to 63384) 1610 SB
X330 791 1679 (#Stats: aps=415 apb=17 mps=1780 mpb=542 lsp=0 avi=97.3 mni = 93.4 fiu=567) 1679 SB
X330 831 1196 (frc=0 gci=5 rpp=1.8 tpp=1.0 cpt=1.3 tts=1024 tsu=372) 1196 SB
X330 871 1311 (3 6 3560 2 130.216.14.0 130.216.3.0 51 180 3079 138195) 1311 SB
X330 911 1541 (3 7 3560 2 130.216.14.0 130.216.76.0 21842 18428 2467693 1356570) 1541 SB
X330 951 1081 (3 8 3560 7 0.0.255.0 1.144.200.0 0 30 0 2282) 1081 SB
X330 991 1334 (3 9 3560 2 130.216.14.0 130.216.14.0 24980 1 5051834 60) 1334 SB
X330 1031 1380 (3 10 3560 6 130.216.0.28 130.216.0.192 20087 1 8800070 66) 1380 SB
X330 1071 1150 (3 11 3560 7 0.0.255.0 0.128.113.0 0 164 0 32608) 1150 SB
X330 1111 1150 (3 12 3560 5 59.3.13.0 4.1.152.0 41 41 2460 2460) 1150 SB
X330 1151 1150 (3 14 3560 5 59.3.40.0 4.1.153.0 82 82 4920 4920) 1150 SB

X330 1197 966 (3 15 3560 5 0.0.0.0 4.1.153.0 0 60 0 36) 966 SB


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X1296 1191 56 (00) 56 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1240 713 ( . . . . . . . . .) 713 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1313 84 (4.3.) 84 SB

X413 1313 462 (Flow Data Features) 462 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1396 1080 (Several features of the Flow data are worthy of note:) 1080 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1472 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1475 1471 (Collection times overlap slightly between samples. This allows for flows) 1471 SB
X389 1529 1522 (which were created after the collection started, and makes sure that flows) 1522 SB

X389 1583 667 (are not missed from a collection.) 667 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1659 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 1662 1563 (The rule set may change during a run. The above shows flows from rule set) 1563 SB
X389 1716 1579 (1 - the default set - in the first collection, followed by the first flows created by) 1579 SB

X389 1770 1150 (rule set 3 \(which has just been downloaded by NeMaC\).) 1150 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 1846 21 (\267) 21 SB
Xgr


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X389 1849 273 (FlowIndexes ) 273 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X662 1849 1144 (may be reused by the meter once their flows have been) 1144 SB

X389 1903 1162 (recovered by the garbage collector. The combination of ) 1162 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 1903 275 (FlowRuleSet,) 275 SB

X389 1957 224 (FlowIndex ) 224 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X613 1957 91 (and ) 91 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X704 1957 213 (StartTime ) 213 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X917 1957 781 (are needed to identify a flow uniquely.) 781 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 2033 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2036 1548 (Packet and Byte counters are 32-bit unsigned integers, and are never reset) 1548 SB
X389 2090 1566 (by the meter. Computing the counts occurring within a collection interval will) 1566 SB
X389 2144 1564 (require taking the difference between the collected count and its value when) 1564 SB
X389 2198 1595 (the flow was last collected. Note that counter wrap-around can be allowed for) 1595 SB

X389 2252 1418 (by simply performing an unsigned subtraction and ignoring any carry.) 1418 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 2328 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2331 1551 (In the sample flow data file above I have used double spaces as separators) 1551 SB

X389 2385 1564 (between the flow identifiers, peer addresses, pdu counts and packet counts.) 1564 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X271 2522 32 (5) 34 SB
X305 2522 16 (.) 18 SB
X360 2522 55 (W) 57 SB
X417 2522 23 (r) 25 SB
X442 2522 16 (i) 18 SB
X460 2522 19 (t) 21 SB
X481 2522 16 (i) 18 SB
X499 2522 35 (n) 37 SB
X536 2522 35 (g) 37 SB
X573 2522 16 ( ) 18 SB
X591 2522 42 (R) 44 SB
X635 2522 35 (u) 37 SB
X672 2522 16 (l) 18 SB
X690 2522 32 (e) 34 SB
X724 2522 16 ( ) 18 SB
X742 2522 35 (F) 37 SB
X779 2522 16 (i) 18 SB
X797 2522 16 (l) 18 SB
X815 2522 32 (e) 34 SB

X849 2522 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 2622 84 (5.1.) 84 SB

X413 2622 295 (Introduction) 295 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2705 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2705 162 (rule file ) 162 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X477 2705 1642 (is a file of ASCII text which contains information needed by an accounting meter) 1642 SB
X271 2759 1809 (and by a collector. This includes a rule set, rule and action tables, a format specification) 1809 SB

X271 2813 712 (and a statistics request. The term ) 712 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X983 2813 152 (rule set) 152 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1135 2813 938 ( means the combination of a rule table and its) 938 SB
X271 2867 1836 (corresponding action table. An accounting meter can have up to ten rule sets in memory,) 1836 SB

X271 2921 1607 (allowing its manager to switch between them simply by setting the value of the) 1607 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2975 319 (CurrentRuleSet) 319 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X590 2975 283 ( MIB variable.) 283 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1102 3265 43 (-- ) 43 SB

X1145 3265 52 (10) 52 SB


X1197 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1836 (NeTraMet has one rule set built in; this is the default rule set, which is set number 1. This) 1836 SB
X271 310 1747 (allows NeTraMet to be active as soon as it starts up, and it provides a default rule set) 1747 SB
X271 364 1853 (which it can use while other rule sets are downloaded by its manager. The default rule set) 1853 SB

X271 418 703 (can't be changed by the manager.) 703 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 505 84 (5.2.) 84 SB

X413 505 375 (Rule file Syntax) 375 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 588 1706 (The syntax for rule files is given below in the form of railway diagrams, and detailed) 1706 SB
X271 642 1737 (examples are given in the following sections. Note that NeMaC's parser is extremely) 1737 SB
X271 696 1699 (simple-minded - although it does a good job on valid rule files it has very poor error) 1699 SB
X271 750 190 (recovery!) 190 SB
X271 829 119 (Each ) 119 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X390 829 217 (statement ) 217 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X607 829 1412 (in a rule file starts at the beginning of a line. A cross-hatch character) 1412 SB
X271 883 1832 (marks the end of a line; all characters following a cross-hatch on a line are ignored by the) 1832 SB
X271 937 178 (scanner.) 178 SB
X271 1016 1804 (NeMaC's scanner looks for keywords, numbers and addresses. Keywords are shown in) 1804 SB
X271 1070 1705 (the railway diagrams in upper case, but case is ignored by the scanner. Keywords,) 1705 SB
X271 1124 1610 (including attribute names, must be given in full - abbreviations are not allowed.) 1610 SB
X0 lc

X0 lj


X0 0 0 pC
X6 4 SP

X255 255 255 fC
X/fm 256 def

X712 423 781 1241 B
X1 F
XS
Xn
X1 lc
X1 lj
X275 1325 M 1626 0 1 PP
XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X275 1203 300 (Rules File) 300 SB
X255 255 255 fC
X1869 1303 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn
X778 1394 M 713 0 1 PP
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X400 84 925 1350 B
X1 F
XS
Xn


X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font

X0 0 0 fC
X941 1373 364 (Rules section) 364 SB


X1 lc
X1 lj
X0 0 0 pC

X782 1482 M 712 0 1 PP
XS
Xn


X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X456 71 894 1444 B


X1 F
XS
Xn
X0 0 0 fC

X912 1458 420 (Actions section) 420 SB
X255 255 255 fC
X514 86 869 1272 B
X1 F
XS
Xn
X0 0 0 fC
X885 1295 476 (RuleSet statement) 476 SB


X1 lc
X1 lj
X0 0 0 pC

X816 1210 M 34 28 -31 22 -3 6 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X615 83 822 1619 B


X1 F
XS
Xn
X0 0 0 fC

X847 1642 560 (Statistics statement) 560 SB


X1 lc
X1 lj
X0 0 0 pC

X782 1575 M 712 0 1 PP
XS
Xn


X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X497 87 878 1525 B
X1 F
XS
END_OF_FILE

if test 47982 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.B'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.B'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(188008 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 188008 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi


# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.B'
fi
if test -f 'netramet/src/meter/meter_pc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/meter_pc.c'\"
else
echo shar: Extracting \"'netramet/src/meter/meter_pc.c'\" \(11885 characters\)
sed "s/^X//" >'netramet/src/meter/meter_pc.c' <<'END_OF_FILE'
X/* 1407, Wed 6 Oct 93
X

X METER_PC.C: The AU accounting meter mainline;


X based on CMU's snmpd,
X PCIP's packet monitoring
X and Waterloo's TCP/IP.

X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X/*


X * snmpd.c - send snmp GET requests to a network entity.

X *
X */
X/***********************************************************

X Copyright 1988, 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#include "ausnmp.h"


X#define PKTSNAP
X#include "pktsnap.h"
X#include "flowhash.h"
X
X#define APPLETALK
X
Xextern char version_descr[]; /* In met_vars.c */
Xextern char *communities[]; /* In snmp/snmpagnt.c */
X

X#include <dos.h>
X#include <alloc.h>
X#include <ctype.h>
X
X#include <sys/types.h>
X/* #include <netinet/in.h> AU */
X#include <stdio.h>
X/* #include <sys/socket.h> AU */

X#include "tcp.h"
X
X#include <errno.h>


X
X#include "snmp.h"
X#include "snmpimpl.h" /* AU */
X#include "asn1.h"

X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

Xudp_Socket udpsock;
Xstatic udp_Socket *s;
Xint status; /* For socket */
X
Xvoid init_snmp();
Xvoid receive();
Xvoid snmp_read();
X
Xvoid pkt_rcv_call2(handle, len, buffp)
Xunsigned int handle, len;
Xunsigned char far *buffp;
X{
X unsigned char *buff = buffp; /* TCP's buffers are in our data segment! */
X struct pkt far *pp;
X
X if (buff[0] == 0xFF && buff[1] == 0xFF && buff[2] == 0xFF &&
X buff[3] == 0xFF && buff[4] == 0xFF && buff[5] == 0xFF) {
X if (buff[12] == 0x08 &&
X (buff[13] == 0x00 || buff[13] == 0x06 )) { /* IP or ARP */

X buff[-2] = 1; /* Ready for tcp/ip */
X }
X else buff[-2] = 0; /* Not for us; free the buffer */
X }


X else if (buff[5] == eth_addr[5] && buff[4] == eth_addr[4] &&
X buff[3] == eth_addr[3] && buff[2] == eth_addr[2] &&
X buff[1] == eth_addr[1] && buff[0] == eth_addr[0]) {
X if (buff[12] == 0x08 &&
X (buff[13] == 0x00 || buff[13] == 0x06 )) { /* IP or ARP */

X buff[-2] = 1; /* Ready for tcp/ip */
X }


X else buff[-2] = 0; /* Not for us; free the buffer */
X }
X else buff[-2] = 0; /* Not for us; free the buffer */
X
X ++npackets; nbytes += len;
X if(((pproc - prcv) & pktmask) == 1) { /* No pkts free, ignore the data */
X ++lostpackets;
X }
X else {
X pp = &pkts[prcv];
X if (buff[12] == 0x08 && buff[13] == 0x00) pp->p_type = AT_IP;
X else if (buff[12] <= maxpkthi) { /* 802.3 */

X if (buff[14] == 0xFF && buff[15] == 0xFF) pp->p_type = AT_NOVELL;
X#ifdef APPLETALK


X else if (buff[14] == 0xAA && buff[15] == 0xAA) { /* SNAP */
X if (buff[20] == 0x80 && buff[21] == 0x9B) pp->p_type = AT_ETHERTALK;
X else return;
X }
X#endif
X else return;
X }
X else if (buff[12] == 0x60 && buff[13] == 0x03) pp->p_type = AT_DECNET;
X else return;
X pp->p_len = len;
X qmove(&buffp[SNAPFROM], pp->p_data, SNAPLEN);
X prcv = (prcv+1) & pktmask;
X }
X }
X

Xvoid main(argc, argv)


X int argc;
X char *argv[];
X{

X int arg, c;
X char cbuf[20], *ap;
X
X sclear();
X scpos(0,0); printf(version_descr);
X scpos(0,1);
X
X maxpkt = 1024;

X display_enabled = kb_enabled = 1; /* Enabled by default */
X mxflowsp1 = DFMXFLOWS+1;

X /* Default (CMU) communities are: 0 = "public", 1 = "proxy",
X 2 = "private", 3 = "regional", 4 = "core"
X We only allow "public" and "private" by default */
X communities[1] = communities[3] = communities[4] = "";
X for (c = 0, arg = 1; arg < argc; ++arg) {

X if (argv[arg][0] == '-') {
X switch (argv[arg][1]) {
X case 'd':
X snmp_dump_packet++;
X break;

X case 'f':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X mxflowsp1 = atoi(ap)+1;
X break;
X case 'k':

X kb_enabled = 0; /* -k to disable keyboard */
X break;


X case 'p':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X maxpkt = atoi(ap);

X break;
X case 'r':

X for (;;) {


X if (c == 5) {

X printf("Max of 4 read communities allowed\n");
X exit(0);
X }


X communities[c++] = argv[++arg];
X if (c == 2) ++c; /* 2 -> "private" */
X if (arg == argc-1 || argv[arg+1][0] == '-') break;

X }
X break;
X case 's':
X display_enabled = 0; /* -s to disable screen */
X break;


X case 'w':
X communities[2] = argv[++arg]; /* -w to set write community */

X break;
X default:
X printf("Invalid option: -%c\n", argv[arg][1]);

X exit(0);
X }
X }
X }

X pktmask = maxpkt-1; maxpkthi = maxpkt/256;
X pkts = (struct pkt far *)farmalloc((maxpkt+1) * sizeof(struct pkt));
X pproc = prcv = 0;
X au_monitor = 1;
X
X sock_init();
X printf("Running on %s",inet_ntoa(cbuf,gethostid()));
X
X s = &udpsock; /* myport hisadr hisport */
X if (!udp_open( s, SNMP_PORT, 0, 0, 0 )) {
X puts("udp_open failed!\n");

X exit(1);
X }
X


X init_snmp();
X init_monitor();
X receive();

X }
X
Xvoid show_meter_time()
X{

X char msg[60];
X sprintf(msg,"%lu seconds since %02d%02d:%02d",
X elapsed_sec, s_tod_h,s_tod_m,s_tod_s);
X display_msg(0,msg);
X }
X
Xunsigned int mxmonpkts = 400; /* Max nbr of packets per pkt_monitor call */

Xunsigned int bkgi; /* Seconds before next run of backgound process */
X#define BKG_INTERVAL 30 /* 30 seconds */
X
Xvoid zero_pkt_stats()
X{


X npackets = nbytes = badpackets = nobufpackets = lostpackets =
X stats_time = t_backlog = spackets = sbytes =
X kilodummypackets = dummypacketrate = 0L;
X mindummyrate = 100000000L;
X pkt_backlog = max_pkt_backlog = max_pkt_rate =
X dummypackets = mdpacketrate = 0;

X clear_pkt_stats = 0;
X }
X


Xvoid receive()
X{
X unsigned char startup, ch, gci, p;
X unsigned int k, n, x, sumx, minx, maxx, samples, ax;
X char l_tod_s; /* Last tod_s displayed on chart */
X unsigned long pd, bd;
X long tot = set_timeout(1);
X struct pkt far *pkp;
X unsigned char half_scale = 0;
X
X startup = 1;
X pproc = prcv; /* Discard packets collected during initialisation */

X for (;;) {


X sock_tick(s, &status);
X if ((n = sock_dataready(s)) != 0) {
X snmp_read(n);
X sock_close(s);
X if (!udp_open( s, SNMP_PORT, 0, 0, 0 )) {
X puts("udp_open failed!\n");

X exit(1);
X }
X }
X

X k = (prcv-pproc) & pktmask;
X if (k == 0) { /* Build a dummy packet */
X pkp = &pkts[maxpkt];
X for (k = 0; k != SNAPLEN; ++k) pkp->p_data[k] = 0;
X pkt_monitor(pkp->p_data, 0, AT_DUMMY);

X }
X else {


X if (k > pkt_backlog) pkt_backlog = k;
X for (k = mxmonpkts; pproc != prcv && k != 0; --k) {
X pkp = &pkts[pproc];
X pkt_monitor(pkp->p_data, pkp->p_len, pkp->p_type);
X pproc = (pproc+1) & pktmask;

X }
X }
X


X if (chk_timeout(tot)) {
X tot = set_timeout(1); /* 1 second */
X ++elapsed_sec; set_tod();

X s_uptime = uptime(); /* Don't do this too often! */
X

X if (startup) { /* Running now, initialise counters etc. */

X clear_pkt_stats = 1;


X minx = 100; sumx = samples = maxx = 0;
X l_tod_s = -1;
X gci = gc_interval; /* Garbage collect interval */
X bkgi = BKG_INTERVAL; /* Background interval */

X startup = 0;
X }
X else {


X if (--gci == 0) {
X garbage_collect();
X gci = gc_interval;
X }
X if (--bkgi == 0) {
X p = (unsigned long)nflows*100/(mxflowsp1-1);
X if (p > HighWaterMark) { /* % flows in use */
X pd = s_uptime-InactivityTimeout;
X GarbageCollectTime += InactivityTimeout;
X if (GarbageCollectTime > pd) GarbageCollectTime = pd;
X }

X bkgi = BKG_INTERVAL;
X }
X pd = npackets-spackets; bd = nbytes-sbytes;
X if (display_enabled) {
X scpos(0,3);
X printf("q=%4d",pkt_backlog);
X scpos(23,3);
X printf("%02d%02d:%02d", tod_h,tod_m,tod_s);
X scpos(0,5);
X x = util_pc(pd,bd); /* % utilisation */
X printf("p=%6lu, b=%10lu, u=%4d", pd,bd, x);
X sumx += x; ++samples;
X if (x < minx) minx = x;
X if (x > maxx) maxx = x;
X if (tod_s != l_tod_s && tod_s%10 == 0) {
X if (samples) { /* 30% in col 79 */
X ax = (sumx+(samples>>1))/samples;
X if (half_scale)
X chart(41,0, 79,24, minx>>1,ax>>1,maxx>>1);
X else chart(41,0, 79,24, minx,ax,maxx);
X l_tod_s = tod_s;
X }

X minx = 100; sumx = samples = maxx = 0;
X }
X }
X }


X if (clear_pkt_stats) zero_pkt_stats();
X else {
X ++stats_time;

X if (pd > max_pkt_rate) max_pkt_rate = pd;

X t_backlog += (unsigned long)pkt_backlog;
X if (pkt_backlog > max_pkt_backlog)
X max_pkt_backlog = pkt_backlog;
X if (dummypacketrate < mindummyrate) {
X mindummyrate = dummypacketrate; mdpacketrate = pd;
X }
X }
X
X pkt_backlog = 0; dummypacketrate = 0;
X spackets = npackets; sbytes = nbytes;
X
X if (kb_enabled && kbhit()) {

X if ((ch = getch()) == 27) { /* ESC */
X scpos(0,24);
X printf("\nShutting down\n");
X exit(0);
X }
X w_clear(0,24, 40,24); scpos(0,24);
X switch (tolower(ch)) {


X case 'b':
X printf("bad=%lu, nobuf=%lu, lost=%lu",
X badpackets,nobufpackets,lostpackets);

X break;
X case 'h':

X half_scale = !half_scale;
X printf("Chart scale 0..%d \%",
X half_scale ? 60 : 30);
X break;
X case 'm':
X printf("%u near, %lu far bytes free",
X coreleft(),farcoreleft());

X break;
X case 'v':

X printf(version_descr);
X break;
X default:
X handle_kb(ch);


X break;
X }
X }
X }
X }
X

Xsock_err:
X switch (status) {
X case 1 : /* foreign host closed */
X exit(0);
X case -1: /* timeout */
X printf("\nConnection timed out!");
X exit(1);
X default: printf("Aborting");

X exit(1);
X }
X}
X

Xunsigned long snmp_peer_addr;
X
Xvoid snmp_read(length)
Xint length;
X{
X int out_length;

X u_char packet[1500], outpacket[1500];

X int count;
X struct sockaddr from;
X int fromlen = sizeof(struct sockaddr);
X char snmp_peer_name[30]; /* name of host which sent the snmp request */
X getpeername(s, &from,&fromlen);
X snmp_peer_addr = from.s_ip;
X
X sock_read(s, packet,length);

X
X if (snmp_dump_packet) {
X inet_ntoa(snmp_peer_name,from.s_ip);
X printf("received %d bytes from %s:\n", length, snmp_peer_name);
X for (count = 0; count < length; count++) {


X printf("%02X ", packet[count]);

X if ((count % 16) == 15) printf("\n");


X }
X printf("\n\n");
X }

X out_length = 1500;


X if (snmp_agent_parse(packet, length, outpacket, &out_length, from.s_ip)) {
X if (snmp_dump_packet) {
X printf("sent %d bytes to %s:\n", out_length, snmp_peer_name);

X for (count = 0; count < out_length; count++) {
X printf("%02X ", outpacket[count]);
X if ((count % 16) == 15) printf("\n");


X }
X printf("\n\n");
X }

X sock_write( s, (char *)outpacket, out_length);
X }
X }

X
END_OF_FILE


if test 11885 -ne `wc -c <'netramet/src/meter/meter_pc.c'`; then

echo shar: \"'netramet/src/meter/meter_pc.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/meter_pc.c'
fi
echo shar: End of archive 9 \(of 25\).
cp /dev/null ark9isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 6:01:03 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 98
Archive-name: netramet/part10
Environment: INET, UNIX, DOS

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.A
# netramet/sg/apps/snmpnetstat/Makefile
# netramet/src/meter/meter_ux.c

# Wrapped by kent@sparky on Tue Nov 2 18:17:07 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 10 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.A' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\"
else

echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\" \(47198 characters\)

XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 54 54 0 0 0 51 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC


X728 523 945 (INTRODUCTORY DOCUMENTATION) 945 SB
X32 0 0 100 100 0 0 0 94 /Helvetica-Bold /font13 ANSIFont font

X711 690 979 (NeTraMet & NeMaC) 979 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X641 910 1120 (Network Traffic Meter & NeTraMet Manager/Collector) 1120 SB
X32 0 0 75 75 0 0 0 71 /Helvetica-Oblique /font19 ANSIFont font
X949 1152 503 (Nevil Brownlee) 503 SB
X32 0 0 54 54 0 0 0 51 /Helvetica /font12 ANSIFont font
X994 1347 414 (Computer Centre) 414 SB
X880 1414 642 (The University of Auckland) 642 SB
X916 1481 570 (Auckland, New Zealand) 570 SB
X1037 1573 327 (October 1993) 327 SB
X32 0 0 54 54 0 0 0 51 /Helvetica-Bold /font13 ANSIFont font

X1057 2086 258 (PREFACE) 258 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1393 2813 458 (University of Auckland) 458 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1116 3265 43 (-- ) 43 SB
X1159 3265 10 (i) 10 SB

X1169 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 63 63 0 0 0 59 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC

X1899 1366 26 (5) 26 SB
Xgr

X1873 2896 52 (18) 52 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1111 3265 43 (-- ) 43 SB

X1154 3265 20 (ii) 20 SB
X1174 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X1873 1656 52 (26) 52 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2683 1839 (Nevil Brownlee is the Deputy Director of the University of Auckland Computer Centre, and) 1839 SB
X271 2737 1847 (is responsible for support and development of the University's campus network, which has) 1847 SB
X271 2791 1820 (about 2,500 connected hosts. He is closely involved with Tuia, New Zealand's Research) 1820 SB
X271 2845 1747 (and Education network, co-ordinates Kawaihiko, the New Zealand Universities' group) 1747 SB
X271 2899 1795 (within Tuia, and is active within the IETF, especially on the Internet Accounting Working) 1795 SB

X271 2953 1181 (Group. He holds a Ph.D. degree in Atmospheric Physics.) 1181 SB
X32 0 0 46 46 1 0 0 43 /Helvetica-Oblique /font19 ANSIFont font


X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1106 3265 43 (-- ) 43 SB
X1149 3265 30 (iii) 30 SB

X1179 3265 56 ( --) 56 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font

X0 0 0 fC


Xgs 323 3426 0 0 CB

X271 339 48 (1.) 48 SB
Xgr
X360 339 16 (I) 18 SB
X378 339 35 (n) 37 SB
X415 339 19 (t) 21 SB
X436 339 23 (r) 25 SB
X461 339 35 (o) 37 SB
X498 339 35 (d) 37 SB
X535 339 35 (u) 37 SB
X572 339 32 (c) 34 SB
X606 339 19 (t) 21 SB
X627 339 16 (i) 18 SB
X645 339 35 (o) 37 SB

X682 339 35 (n) 37 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 431 1763 (NeTraMet is a meter for network traffic flows \(see below for definitions\), and is the first) 1763 SB
X271 485 1628 (implementation of the Internet Accounting Working Group's Internet Accounting) 1628 SB
X271 539 1780 (Architecture. This is outlined in RFC 1272, "Internet Accounting Background," and has) 1780 SB

X271 593 385 (three components:) 385 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 669 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 672 1424 (meters, i.e, small hosts which are attached to a network segment and) 1424 SB

X389 726 823 (measure traffic flowing on that segment;) 823 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 802 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 805 1020 (collectors, which retrieve information from meters;) 1020 SB


X32 0 0 46 46 0 0 0 46 /Symbol font
Xgs 351 3426 0 0 CB

X330 881 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 884 1564 (managers, which instruct meters as to which flows they should measure and) 1564 SB
X389 938 1468 (collectors as to which meters they should collect from, at what intervals.) 1468 SB
X271 1017 1758 (A collector can collect flow data from many meters, and each meter may have its data) 1758 SB
X271 1071 1821 (retrieved by several collectors. Traffic flows of interest are defined by user-specified sets) 1821 SB

X271 1125 165 (of rules.) 165 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1212 84 (1.1.) 84 SB

X413 1212 587 (Operating Environments) 587 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1295 1781 (This release of NeTraMet runs on a SunOS host, using NIT to observe ethernet packet) 1781 SB
X271 1349 1783 (headers, or on a PC using a CRYNWYR packet driver. The PC implementation can be) 1783 SB
X271 1403 1794 (used with a 10 MHz 286 machine, on which it can handle a steady packet load of about) 1794 SB
X271 1457 1724 (750 packets per second. On a 25 MHz 386SX it will handle about 1250 packets per) 1724 SB
X271 1511 1839 (second. NeTraMet can cope with peak traffic bursts of up to 2250 packets per second for) 1839 SB
X271 1565 539 (several seconds at a time.) 539 SB
X271 1644 1803 (This release also includes NeMaC \(NeTraMet Manager/Collector\), a combined manager) 1803 SB
X271 1698 1802 (and collector program. It runs on Unix systems, and Make files are included for SunOS) 1802 SB

X271 1752 347 (and Irix systems.) 347 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1839 84 (1.2.) 84 SB

X413 1839 311 (Traffic Flows) 311 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1922 1854 (A traffic flow is a stream of packets exchanged between two network hosts, which we refer) 1854 SB
X271 1976 1829 (to as the flow's source and destination. Flows are bi-directional in that packets and bytes) 1829 SB
X271 2030 1674 (can be counted in the 'to' \(source to destination\) and 'from' \(destination to source\)) 1674 SB
X271 2084 211 (directions.) 211 SB
X271 2163 1808 (The 'identity' of a flow is determined by the address attributes of its two hosts, and these) 1808 SB
X271 2217 649 (attributes can be of three kinds:) 649 SB
X389 2296 176 (adjacent) 176 SB
X626 2296 212 (\(link layer\)) 212 SB
X389 2350 93 (peer) 93 SB
X626 2350 305 (\(network layer\)) 305 SB
X389 2404 111 (detail) 111 SB
X626 2404 326 (\(transport layer\)) 326 SB

X271 2483 1190 (Since NeTraMet is \(so far\) only implemented on ethernet, ) 1190 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1461 2483 403 (adjacent addresses) 403 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1864 2483 251 ( can only be) 251 SB
X271 2537 411 (ethernet addresses.) 411 SB

X271 2616 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2616 271 (peer address) 271 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X586 2616 1423 ( can be an IP address, a DECnet phase IV address, a Novell network) 1423 SB
X271 2670 1802 (number or an EtherTalk address, these being the four protocols currently understood by) 1802 SB
X271 2724 218 (NeTraMet.) 218 SB

X271 2803 44 (A ) 44 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X315 2803 289 (detail address) 289 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X604 2803 1476 ( contains specifications for details within the peer protocol. For IP these) 1476 SB
X271 2857 1828 (are the protocol type and source and destination port numbers, and similar kinds of detail) 1828 SB
X271 2911 711 (are defined for the other protocols.) 711 SB
X271 2990 1811 (Within the meter a flow is implemented as a data structure containing the attributes of its) 1811 SB
X271 3044 1681 (source and destination, its packet and byte counters, the times it was first and last) 1681 SB

X271 3098 1206 (observed, and other information used for control purposes.) 1206 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (1) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1672 (The meter could simply create flows for every possible combination of source and) 1672 SB
X271 310 1814 (destination attributes it observes, but this would quickly exhaust its memory. Instead the) 1814 SB
X271 364 1732 (meter uses a set of rules to decide which flows are of interest, and other packets are) 1732 SB
X271 418 168 (ignored.) 168 SB
X271 497 1799 (Each rule tests one attribute of a flow, using a mask to specify which bits are of interest.) 1799 SB
X271 551 1792 (In this way a tree of rules can be built up to classify packets into flows; each packet can) 1792 SB
X271 605 1723 (then be 'counted' in its appropriate flow. If this is all that the rules specify, no further) 1723 SB
X271 659 1030 (information about the flow is retained in the meter.) 1030 SB
X271 738 1783 (If more detail is required, the rules can instruct the meter to 'tally' the packet, i.e, create) 1783 SB
X271 792 1826 (many sub-flows instead of a single flow. For example they might determine that a packet) 1826 SB
X271 846 1840 (has come from a class B IP source, then tally it into flows for each of the source network's) 1840 SB
X271 900 1859 (class C subnets. Sub-flow details are specified by a set of attribute masks, which make up) 1859 SB

X271 954 39 (a ) 39 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X310 954 232 (tally action.) 232 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1033 1825 (It is also possible to combine several flows together in the meter. Each of the flows to be) 1825 SB
X271 1087 573 (combined will then have an ) 573 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X844 1087 347 (aggregate action) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X1191 1087 934 ( which specifies all the attribute values for the) 934 SB

X271 1141 318 (aggregate flow.) 318 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1228 84 (1.3.) 84 SB

X413 1228 1055 (The Internet Accounting Meter Services MIB) 1055 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1311 1682 (The Internet Accounting Group produced an Internet Draft describing its proposed) 1682 SB
X271 1365 1693 (Accounting Meter Services MIB, which was assigned the number Experimental.99.) 1693 SB
X271 1444 1757 (The draft was discussed over several IETF meetings until the Working Group became) 1757 SB
X271 1498 1808 (dormant in March 1993, and informally at meetings and via the Group's mailing list since) 1808 SB
X271 1552 1787 (then. A copy of the current version - which NeTraMet implements - is included with this) 1787 SB

X271 1606 1557 (release. It defines all of the MIB variables mentioned in this documentation.) 1557 SB


X32 0 0 58 58 0 0 0 54 /Helvetica-Bold /font13 ANSIFont font
Xgs 323 3426 0 0 CB

X271 1743 48 (2.) 48 SB
Xgr
X360 1743 16 (I) 18 SB
X378 1743 52 (m) 54 SB
X432 1743 35 (p) 37 SB
X469 1743 16 (l) 18 SB
X487 1743 32 (e) 34 SB
X521 1743 52 (m) 54 SB
X575 1743 32 (e) 34 SB
X609 1743 35 (n) 37 SB
X646 1743 19 (t) 21 SB
X667 1743 32 (a) 34 SB
X701 1743 19 (t) 21 SB
X722 1743 16 (i) 18 SB
X740 1743 35 (o) 37 SB
X777 1743 35 (n) 37 SB
X814 1743 16 ( ) 18 SB
X832 1743 42 (D) 44 SB
X876 1743 32 (e) 34 SB
X910 1743 19 (t) 21 SB
X931 1743 32 (a) 34 SB
X965 1743 16 (i) 18 SB
X983 1743 16 (l) 18 SB

X1001 1743 32 (s) 34 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1843 84 (2.1.) 84 SB
Xgr

X413 1843 856 (Program Development Environment) 856 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1926 1687 (NeTraMet was developed on a PC using Borland's Turbo C, Turbo Assembler and) 1687 SB
X271 1980 1841 (interactive development environment. Turbo Make was used to organise the system, with) 1841 SB
X271 2034 1451 (Make files specifying how the various system components are created.) 1451 SB
X271 2113 1836 (Waterloo C provided a good PC implementation of TCP/IP, and was used to provide UDP) 1836 SB
X271 2167 1812 (transport for SNMP packets. Waterloo C interfaces with ethernet via a CRYNWR packet) 1812 SB
X271 2221 1835 (driver. I extended the packet interface to support monitoring by running the ethernet card) 1835 SB
X271 2275 1475 (in promiscuous mode and copying packet headers into a rotating buffer.) 1475 SB
X271 2354 1745 (An early version of CMU SNMP was used for communication between NeTraMet and) 1745 SB
X271 2408 1656 (NeMaC. This was ported to the PC, and extended to support SET operations on) 1656 SB

X271 2462 809 (character and \(16-bit\) integer variables.) 809 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2549 84 (2.2.) 84 SB
Xgr

X413 2549 1106 (Data Structures: Flow, Rule and Action Tables) 1106 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2632 1850 (Host addresses \(adjacent, peer and detail\) and their masks are held in a structure called a) 1850 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2686 85 (key.) 85 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X356 2686 1599 ( A flow is a larger structure which contains two keys, one each for source and) 1599 SB

X271 2740 1789 (destination host. General attributes are stored as variables within a flow, and there is a) 1789 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2794 69 (link) 69 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X340 2794 1711 ( field to enable flows to be linked together. Space for flows is allocated dynamically) 1711 SB

X271 2848 1751 (from a pool of flows. The flow table is implemented as an array of pointers to flows; a) 1751 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2902 211 (FlowIndex) 211 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X482 2902 539 ( is an index into this array.) 539 SB
X271 2981 1745 (Rules are implemented in a smaller structure. Space for a rule table is allocated as a) 1745 SB

X271 3035 486 (single block of memory.) 486 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (2) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1853 (Actions are stored in a flow structure, since they have exactly the same set of components) 1853 SB
X271 310 1227 (as a flow. An action table is an array of pointers to actions.) 1227 SB

X271 389 1632 (The first time a flow is observed the meter allocates space for it and assigns it a) 1632 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 250 (FlowIndex. ) 250 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X521 443 1566 (The addresses of count and tally flows are held in the rule and action tables.) 1566 SB
X271 497 1800 (Tallies are implemented as hash tables; a hash table's address is held in its action table) 1800 SB

X271 551 116 (entry.) 116 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 638 84 (2.3.) 84 SB
Xgr

X413 638 662 (Meter Memory Management) 662 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 721 1829 (Once a flow has been created it could continue to exist indefinitely. In time, however, the) 1829 SB
X271 775 1772 (meter will run out of space for new flows. To deal with this problem NeTraMet uses an) 1772 SB
X271 829 621 (incremental garbage collector.) 621 SB
X271 908 735 (At regular intervals specified by the ) 735 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1006 908 510 (GarbagecCollectInterval ) 510 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1516 908 609 (variable the garbage collector) 609 SB
X271 962 1815 (procedure is invoked. This searches through the flow table looking for flows which might) 1815 SB
X271 1016 1805 (be recovered. To control the resources consumed by garbage collection there are limits) 1805 SB
X271 1070 1858 (on the number of in-use and idle flows which the garbage collector may inspect - these are) 1858 SB
X271 1124 1410 (the parameters described in the 'PC Statistics display' section below.) 1410 SB
X271 1203 1794 (To decide whether a flow can be recovered, the garbage collector considers how long it) 1794 SB
X271 1257 1828 (has been inactive \(no packets in either direction\), and when its data was last collected. If) 1828 SB

X271 1311 894 (it has been collected at least once since its ) 894 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1165 1311 203 (LastTime,) 203 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1368 1311 749 ( it may be recovered. This alogrithm) 749 SB

X271 1365 796 (is implemented using a variable called ) 796 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1067 1365 437 (GarbageCollectTime,) 437 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1504 1365 582 ( which normally contains the) 582 SB
X271 1419 163 (meter's ) 163 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X434 1419 161 (UpTime) 161 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X595 1419 901 ( when the collection before last was started.) 901 SB
X271 1498 1740 (Should flows not be collected often enough the meter could run out of space. This is) 1740 SB
X271 1552 1801 (prevented by having a low-priority background process check the percentage of flows in) 1801 SB

X271 1606 581 (use and compare it with the ) 581 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X852 1606 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1172 1606 917 ( variable. If the percentage of flows in use is) 917 SB

X271 1660 699 (greater than the high-water mark, ) 699 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X970 1660 424 (GarbageCollectTime) 424 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1394 1660 735 ( is incremented by the current value) 735 SB

X271 1714 130 (of the ) 130 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X401 1714 347 (InactivityTimeout) 347 SB
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X748 1714 1344 ( variable. The effect of this is that if a collector fails NeTraMet will) 1344 SB

X271 1768 599 (continue to create flows until ) 599 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X870 1768 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1190 1768 930 ( is exceeded, then recover the oldest flows to) 930 SB
X271 1822 656 (maintain sufficient free memory.) 656 SB
X271 1901 1832 (The MIB specifies that a meter should generate an SNMP trap if flow data is lost; this has) 1832 SB
X271 1955 1822 (not yet been implemented. The values of the memory management variables mentioned) 1822 SB
X271 2009 1750 (above can be set by NeMaC - it should be possible to tune them to work effectively in) 1750 SB

X271 2063 332 (nearly all cases.) 332 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

Xgs 355 3426 0 0 CB

X271 2150 84 (2.4.) 84 SB
Xgr

X413 2150 622 (Optimising the Rule Table) 622 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2233 1836 (Rules are commonly tested in sequence until a successful match selects a new index into) 1836 SB
X271 2287 1711 (the rule table. Testing a packet against a long list of addresses is thus a sequential) 1711 SB
X271 2341 1783 (search, which would be slow. To improve rule testing performance NeTraMet performs) 1783 SB
X271 2395 1819 (flow analysis of a new rule table, looking for groups of rules which test the same attribute) 1819 SB
X271 2449 1807 (using the same mask. Groups which have more than four rules are organised into small) 1807 SB
X271 2503 1683 (hash tables - these can effectively be tested with a hash computation and a single) 1683 SB

X271 2557 193 (compare.) 193 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2644 84 (2.5.) 84 SB
Xgr

X413 2644 577 (The Meter's Outer Block) 577 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2727 1814 (MeTraMet's outer block is a single loop which implements four asynchronous processes.) 1814 SB

X271 2781 826 (These are - in decreasing priority order -) 826 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2861 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 2860 484 (Handle SNMP requests) 484 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X829 2860 924 (. Process these and send SNMP responses.) 924 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 2940 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 2939 511 (Monitor ethernet packets) 511 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X856 2939 1112 ( \(including NeTraMet SNMP requests and responses\).) 1112 SB

X345 2993 1243 (Test each against the current rule set and count as required.) 1243 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB
X1115 3265 43 (-- ) 43 SB

X1158 3265 26 (3) 26 SB


X1184 3265 43 ( --) 43 SB
X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 42 42 0 0 0 42 /Symbol font
X0 0 0 fC


Xgs 290 3426 0 0 CB

X271 257 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 256 603 (Handle keyboard commands.) 603 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X948 256 893 ( Test the keyboard once each second, and) 893 SB

X345 310 695 (process any incoming keystrokes.) 695 SB


X32 0 0 42 42 0 0 0 42 /Symbol font

Xgs 290 3426 0 0 CB

X271 390 19 (\267) 19 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 389 450 (Memory Management) 450 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X795 389 1039 (. Attempt to recover memory, as described above.) 1039 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X345 443 474 (GarbageCollectInterval) 474 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X819 443 730 ( is set to 5 seconds by default, and ) 730 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1549 443 320 (HighWaterMark) 320 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1869 443 46 ( is) 46 SB
X345 497 517 (tested every 30 seconds.) 517 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 584 84 (2.6.) 84 SB
Xgr

X413 584 463 (Matching the Rules) 463 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 667 1772 (When a packet arrives at the meter two key data structures are built, one for its source) 1772 SB
X271 721 1789 (and one for its destination. An attempt is made to match the packet against the current) 1789 SB
X271 775 1858 (rule set with the keys in source-to-destination order; if this succeeds the packet is counted.) 1858 SB
X271 854 1758 (If the match fails, the keys are interchanged and the packet is tested against the rules) 1758 SB
X271 908 804 (again. If it fails this time it is discarded.) 804 SB
X271 987 1837 (A third possibility is that the packet matched a tally rule, but its flow was not yet present in) 1837 SB
X271 1041 1767 (the tally. Since it might already have been seen travelling in the opposite direction the) 1767 SB
X271 1095 1842 (match is retried with the keys interchanged. If this fails the flow is added into the tally with) 1842 SB
X271 1149 783 (its keys in source-to-destination order.) 783 SB
X271 1228 1738 (This algorithm means that you can use symmetrical tallies, i.e. tallies having identical) 1738 SB
X271 1282 1852 (masks in both directions, if you don't care about flow direction. Alternatively you may write) 1852 SB
X271 1336 1833 (rules which enforce a particular source-to-destination order. Examples of these are given) 1833 SB

X271 1390 817 (in the section on writing rule files below.) 817 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1477 84 (2.7.) 84 SB
Xgr

X413 1477 878 (SNMP: Getting and Setting Variables) 878 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1560 1589 (The code for getting and setting SNMP variables was developed from CMU's ) 1589 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1860 1560 236 (snmpvars.c) 236 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1614 1714 (file. I have modified this to use a binary search to find object identifiers as required,) 1714 SB
X271 1668 719 (replacing the original linear search.) 719 SB
X271 1747 1765 (Simple procedures for setting character, \(16-bit\) integer and \(32-bit\) long variables are) 1765 SB

X271 1801 1460 (used when no special action is required. Special actions, e.g. updating) 1460 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 1855 424 (GarbageCollectTime) 424 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X695 1855 215 ( when the ) 215 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X910 1855 331 (LastCollectTime) 331 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1241 1855 729 ( variable is set, are implemented as) 729 SB

X271 1909 451 (individual procedures.) 451 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 1996 84 (2.8.) 84 SB
Xgr

X413 1996 678 (Creation and Activity Tables) 678 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2079 1590 (A rather unusual requirement for the accounting meter is the ability to support) 1590 SB
X271 2133 1842 (asynchronous collection of flow data by many meters simultaneously. This is described in) 1842 SB
X271 2187 1859 (the MIB by the Creation and Activity tables, which provide a collector with windows into the) 1859 SB
X271 2241 1805 (flow table, allowing it to inspect only those flows created or active since a specified time.) 1805 SB
X271 2295 1789 (This time is passed to the meter as one component of an object identifier; you can view) 1789 SB
X271 2349 1837 (this as a parameter being passed to the GET procedure which implements the creation or) 1837 SB
X271 2403 268 (activity table.) 268 SB
X271 2482 1808 (Another aspect of having multiple collectors is that one of them may collect performance) 1808 SB
X271 2536 1700 (statistics. One possibility would be to have one meter collecting flow data every 15) 1700 SB
X271 2590 1739 (minutes, a second collecting flow data every hour, and a third collecting performance) 1739 SB

X271 2644 853 (statistics \(but not flow data\) every minute.) 853 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font
Xgs 355 3426 0 0 CB

X271 2731 84 (2.9.) 84 SB
Xgr
END_OF_FILE

if test 47198 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.A'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.A'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(188008 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 188008 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi

Xsnmpnetstat: ${SRCS} ${LIBS}
X ${CC} -o $@ ${CFLAGS} ${SRCS} ${LIBS}
X
Xclean:


X rm -f ${OBJS} core snmpnetstat
X
Xcleandir: clean
X rm -f ${MAN} tags .depend
X
Xdepend: ${SRCS}
X mkdep ${CFLAGS} ${SRCS}
X
Xlint: ${SRCS}
X lint ${CFLAGS} ${SRCS}
X
Xtags: ${SRCS}
X ctags ${SRCS}
X
Xinstall:
X cp snmpnetstat ../../bin
X
END_OF_FILE
if test 1593 -ne `wc -c <'netramet/sg/apps/snmpnetstat/Makefile'`; then

echo shar: \"'netramet/sg/apps/snmpnetstat/Makefile'\" unpacked with wrong size!
fi


# end of 'netramet/sg/apps/snmpnetstat/Makefile'
fi
if test -f 'netramet/src/meter/meter_ux.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/meter_ux.c'\"
else
echo shar: Extracting \"'netramet/src/meter/meter_ux.c'\" \(11571 characters\)
sed "s/^X//" >'netramet/src/meter/meter_ux.c' <<'END_OF_FILE'

X/* 1712, Wed 5 Oct 93
X
X SNMPD.C: The AU Internet Accouting Meter mainline;

X#define noUX_TESTING
X
X#include <sys/types.h>
X#include <netinet/in.h>


X#include <sys/socket.h>
X#include <arpa/inet.h>
X
X#include <stdio.h>
X#include <errno.h>
X#include <string.h>
X
X#include <sys/types.h>
X#include <sys/time.h>
X#include <sys/timeb.h>
X
X#include "ausnmp.h"

X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X


X#define PKTSNAP
X#include "pktsnap.h"
X#include "flowhash.h"
X
X#define APPLETALK
X
Xextern char version_descr[]; /* In met_vars.c */
Xextern char *communities[]; /* In snmp/snmpagnt.c */
X

X printf("FLUSH failed\n");
X exit(1);
X }

X if (cp[14] == 0xFF && cp[15] == 0xFF) pkt_type = AT_NOVELL;
X#ifdef APPLETALK


X else if (cp[14] == 0xAA && cp[15] == 0xAA) { /* SNAP */
X if (cp[20] == 0x80 && cp[21] == 0x9B) pkt_type = AT_ETHERTALK;
X else continue; /* Ignore other SNAP packets */
X }
X#endif

X else continue; /* Ignore other 802.2 packets */
X }


X else if (b12_13 == 0x6003) pkt_type = AT_DECNET;
X else continue; /* Ignore other Blue Book packets */
X
X pkt_monitor(&cp[SNAPFROM], pktlen, pkt_type);
X }
X }
X
Xtime_t accounting_start_time; /* Seconds since start of Unix epoch */
X
Xunsigned long uptime(void) /* SNMP time */
X{
X return (time(NULL)-accounting_start_time)*100; /* centiseconds */

X }
X
Xvoid show_meter_time()
X{

X char msg[60], *ts;
X ts = ctime(&accounting_start_time);
X sprintf(msg,"%lu seconds since %c%c%c%c:%c%c",
X time(NULL)-accounting_start_time,
X ts[11],ts[12],ts[14],ts[15], ts[17],ts[18]);
X display_msg(0,msg);
X }

X
Xextern int errno;
Xint snmp_dump_packet = 0;
X

Xvoid main(argc, argv)
X int argc;
X char *argv[];
X{

X int arg,c, sd;
X char *ap;
X struct sockaddr_in me;


X int nit_fd;
X
X printf("%s\n",version_descr);

X display_enabled = kb_enabled = 1; /* Enabled by default */
X mxflowsp1 = DFMXFLOWS+1;

X accounting_start_time = time(NULL) - 2; /* So flows have CreateTime > 1 */


X /* Default (CMU) communities are: 0 = "public", 1 = "proxy",
X 2 = "private", 3 = "regional", 4 = "core"
X We only allow "public" and "private" by default */
X communities[1] = communities[3] = communities[4] = "";
X for (c = 0, arg = 1; arg < argc; ++arg) {
X if (argv[arg][0] == '-') {
X switch (argv[arg][1]) {
X case 'd':
X snmp_dump_packet++;
X break;
X case 'f':
X ap = argv[arg]+2;
X if (*ap == NULL) ap = argv[++arg];
X mxflowsp1 = atoi(ap)+1;
X break;
X case 'k':
X kb_enabled = 0; /* -k to disable keyboard */
X break;

X case 'r':
X for (;;) {
X if (c == 5) {
X printf("Max of 4 read communities allowed\n");
X exit(0);
X }
X communities[c++] = argv[++arg];
X if (c == 2) ++c; /* 2 -> "private" */
X if (arg == argc-1 || argv[arg+1][0] == '-') break;
X }
X break;
X case 's':
X display_enabled = 0; /* -s to disable screen */
X break;
X case 'w':
X communities[2] = argv[++arg]; /* -w to set write community */
X break;
X default:
X printf("Invalid option: -%c\n", argv[arg][1]);
X exit(0);
X }
X }
X }

X /* Set up connections */
X sd = socket(AF_INET, SOCK_DGRAM, 0);
X if (sd < 0){

X perror("socket");
X exit(1);
X }


X me.sin_family = AF_INET;
X me.sin_addr.s_addr = INADDR_ANY;

X me.sin_port = htons(SNMP_PORT);


X if (bind(sd, (struct sockaddr *)&me, sizeof(me)) != 0){
X perror("bind");

X exit(2);
X }
X init_monitor();
X init_snmp();
X nit_fd = init_nit();
X receive(sd,nit_fd);
X}
X

X#define TICKS_PER_S 4 /* 0.25s timeout on NIT -> 4 ticks per second */
X#define BKG_INTERVAL 30 /* Seconds */
X
Xvoid zero_pkt_stats()
X{


X kilodummypackets = npackets = lostpackets = stats_time = spackets = 0L;

X max_pkt_rate = 0;


X clear_pkt_stats = 0;
X }
X

Xreceive(sd,nit_fd)
X int sd,nit_fd;
X{
X fd_set fdset;
X char kb_buf[25];
X int ch, count, onesi, gci;
X /* initdevice() sets the nit timeout to 0.25 seconds */
X /* If the ethernet is very busy, we'll garbage collect more often */
X unsigned char p;
X unsigned long pd;
X
X onesi = TICKS_PER_S; bkgi = BKG_INTERVAL*TICKS_PER_S;
X zero_pkt_stats();

X for (;;) {


X FD_ZERO(&fdset);
X FD_SET(sd, &fdset);
X FD_SET(nit_fd, &fdset);
X if (kb_enabled) FD_SET(0, &fdset); /* stdin */

X count = select(FD_SETSIZE, &fdset, 0, 0, 0);
X if (count > 0) {


X if (FD_ISSET(sd, &fdset))
X snmp_read(sd);
X if (FD_ISSET(nit_fd, &fdset)) {

X s_uptime = uptime(); /* Don't do this too often! */

X nit_read(nit_fd);
X if (--onesi == 0) { /* One-second process .. */

X if (clear_pkt_stats) zero_pkt_stats();
X else {
X ++stats_time;

X pd = npackets-spackets;


X if (pd > max_pkt_rate) max_pkt_rate = pd;

X spackets = npackets;
X }


X if (--gci == 0) {
X garbage_collect();
X gci = gc_interval;
X }
X if (--bkgi == 0) {
X p = (unsigned long)nflows*100/(mxflowsp1-1);
X if (p > HighWaterMark) { /* % flows in use */
X pd = s_uptime-InactivityTimeout;
X GarbageCollectTime += InactivityTimeout;
X if (GarbageCollectTime > pd) GarbageCollectTime = pd;
X }

X bkgi = BKG_INTERVAL*TICKS_PER_S;
X }
X onesi = TICKS_PER_S;
X }
X }
X if (FD_ISSET(0, &fdset)) { /* stdin */
X fgets(kb_buf, sizeof kb_buf, stdin);

X if ((ch = kb_buf[0]) == 27) { /* ESC */
X display_msg(1,"Shutting down");
X exit(0);
X }


X switch (tolower(ch)) {
X case 'v':
X printf("\n%s\n",version_descr);

X break;
X default:
X handle_kb(ch);
X break;
X }
X }
X }

X else switch (count) {
X case 0:
X break;
X case -1:


X if (errno == EINTR) continue;
X else perror("select");

X return -1;
X default:
X printf("select returned %d\n", count);
X return -1;
X }

X }
X }
X
Xunsigned long snmp_peer_addr;
X

Xsnmp_read(sd)
X int sd;
X{

X struct sockaddr_in from;
X int length, out_length, fromlength;


X u_char packet[1500], outpacket[1500];

X char snmp_peer_name[50]; /* Name of host which sent the snmp request */
X


X fromlength = sizeof from;

X length = recvfrom(sd, packet, 1500, 0, (struct sockaddr *)&from, &fromlength);
X snmp_peer_addr = from.sin_addr.s_addr;
X strcpy(snmp_peer_name,inet_ntoa(from.sin_addr));

X if (length == -1)
X perror("recvfrom");
X if (snmp_dump_packet){

X int count;
X
X printf("recieved %d bytes from %s:\n", length, snmp_peer_name);
X for(count = 0; count < length; count++){


X printf("%02X ", packet[count]);
X if ((count % 16) == 15)

X printf("\n");


X }
X printf("\n\n");
X }
X out_length = 1500;

X if (snmp_agent_parse(packet, length, outpacket, &out_length, from.sin_addr)){


X if (snmp_dump_packet){
X int count;
X

X printf("sent %d bytes to %s:\n", out_length, snmp_peer_name);

X for(count = 0; count < out_length; count++){


X printf("%02X ", outpacket[count]);
X if ((count % 16) == 15)

X printf("\n");


X }
X printf("\n\n");
X }

X if (sendto(sd, (char *)outpacket, out_length, 0, (struct sockaddr *)&from,

X sizeof(from)) < 0){
X perror("sendto");
X return 0;
X }
X
X }
X
X}
X
END_OF_FILE


if test 11571 -ne `wc -c <'netramet/src/meter/meter_ux.c'`; then

echo shar: \"'netramet/src/meter/meter_ux.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/meter_ux.c'
fi
echo shar: End of archive 10 \(of 25\).
cp /dev/null ark10isdone

J Nevil Brownlee

unread,
Nov 7, 1993, 6:02:24 PM11/7/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 102
Archive-name: netramet/part14
Environment: INET, UNIX, DOS

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/NeTraMet.man.ps.C
# netramet/src/apps/snmpwalk.c netramet/src/snmplib/include/mib.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:08 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 14 (of 25)."'
if test -f 'netramet/doc/NeTraMet/NeTraMet.man.ps.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\"
else

echo shar: Extracting \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\" \(44499 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/NeTraMet.man.ps.C' <<'END_OF_FILE'


Xn
X0 0 0 fC

X903 1548 448 (Format statement) 448 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1732 1823 (A rule file contains one or more of five possible elements, which may appear in any order) 1823 SB
X271 1786 199 (in the file.) 199 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1858 117 (5.2.1.) 117 SB

X419 1858 408 (RuleSet Statement) 408 SB


X1 lc
X1 lj
X0 0 0 pC

X277 2046 M 1626 0 1 PP


XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 1937 510 (RuleSet statement) 510 SB
X255 255 255 fC
X1871 2024 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X58 84 1659 2005 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 2018 28 (;) 28 SB
X255 255 255 fC
X130 96 574 2002 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X593 2026 84 (SET) 84 SB
X255 255 255 fC
X212 103 855 1999 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X877 2023 168 (setnbr) 168 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2132 1839 (The RuleSet statement tells the meter which rule set it is to use. If a rule file doesn't have) 1839 SB
X271 2186 1442 (a RuleSet statement, the meter will continue to use its current rule set.) 1442 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2258 117 (5.2.2.) 117 SB

X419 2258 306 (Rules Section) 306 SB


X1 lc
X1 lj
X0 0 0 pC

X275 2387 M 1626 0 1 PP
XS
Xn
X255 255 255 fC
X1869 2365 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X446 90 994 2340 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1019 2360 392 (Rule statement) 392 SB
X255 255 255 fC
X170 77 413 2349 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X428 2364 140 (RULES) 140 SB


X1 lc
X1 lj
X0 0 0 pC

X816 2390 M 0 -85 831 0 0 85 3 PP
XS
Xn
X862 2443 M 40 31 -37 24 -3 7 3 PP
XS
Xn

X277 2644 M 1626 0 1 PP


XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 2534 420 (Rule statement) 420 SB
X255 255 255 fC
X1871 2622 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X759 100 349 2594 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X362 2618 728 (attribute & mask = value :) 728 SB
X255 255 255 fC
X59 84 1727 2603 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1743 2615 28 (;) 28 SB
X255 255 255 fC
X428 97 1199 2594 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1212 2618 392 (action , index) 392 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2724 1845 (The Rules section specifies the rule table for a rule set, and requests NeMaC to download) 1845 SB
X271 2778 297 (it to the meter.) 297 SB
X271 2857 1795 (It starts with the keyword RULES, followed by a series of Rule statements, one for each) 1795 SB

X271 2911 1829 (rule. Each rule has five components, which must appear in the correct order. These are:) 1829 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 2990 173 (Attribute) 173 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 3044 1645 (The name of the attribute to be tested by this rule. Any of the address attributes) 1645 SB

X389 3098 1075 (may be used, but not the mask or general attributes.) 1075 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (11) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X0 0 0 fC
X271 256 110 (Mask) 110 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 310 1730 (Specifies a mask which is ANDed with the attribute's value from an incoming packet.) 1730 SB

X389 364 1343 (Must be the same length \(number of bytes\) as the attribute value.) 1343 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 443 119 (Value) 119 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 497 1729 (Specifies the value to be compared with the masked value from an incoming packet.) 1729 SB

X389 551 1284 (If the compare fails the next rule is tested, otherwise the rule's ) 1284 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1673 551 129 (Action) 129 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1802 551 283 ( is performed.) 283 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X271 630 129 (Action) 129 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 684 1534 (Action to be performed if the rule's value is matched. Possible actions are:) 1534 SB
X448 751 124 (Count) 124 SB

X714 751 837 (Count this packet. Attribute values for a ) 837 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 751 114 (count) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1665 751 407 ( flow are taken from) 407 SB
X714 805 1316 (the matched rules, which means that only those attributes which) 1316 SB
X714 859 741 (have been matched will appear in it.) 741 SB
X448 926 97 (Tally) 97 SB
X714 926 1351 (Tally this packet. The attributes \(or parts thereof\) are specified by) 1351 SB

X714 980 1229 (the mask attributes in the tally action specified by this rule's ) 1229 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1943 980 114 (Index) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X2057 980 13 (.) 13 SB
X714 1034 1352 (The non-mask attributes of a tally action can be specified, and will) 1352 SB
X714 1088 918 (appear in each flow which is part of this tally.) 918 SB
X448 1155 215 (Aggregate) 215 SB
X714 1155 1404 (Aggregate this packet, i.e. count it in the aggregate flow specified by) 1404 SB

X714 1209 207 (this rule's ) 207 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X921 1209 124 (index.) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1045 1209 998 ( All the attribute values of an aggregate flow are) 998 SB
X714 1263 1018 (specified in the aggregate action which created it.) 1018 SB
X448 1330 181 (Succeed) 181 SB
X714 1330 1286 (Force rule matching to finish, returning a 'succeed' result. This) 1286 SB
X714 1384 1409 (means the incoming packet will not be counted, i.e. it will be ignored.) 1409 SB
X448 1451 74 (Fail) 74 SB
X714 1451 1395 (Stop rule matching and return a 'fail' result. This allows the meter to) 1395 SB
X714 1505 1280 (interchange the source and destination attributes and retry the) 1280 SB
X714 1559 139 (match.) 139 SB
X448 1626 160 (PushTo) 160 SB
X714 1626 1409 (Save the current rule number on the 'pattern stack' and set the index) 1409 SB

X714 1680 837 (of the next rule to be tested to this rule's ) 837 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1551 1680 124 (index.) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1675 1680 385 ( The pattern stack) 385 SB
X714 1734 1353 (records the rules which were correctly matched; this information is) 1353 SB

X714 1788 367 (used to construct ) 367 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1081 1788 114 (count) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1195 1788 131 ( flows.) 131 SB
X448 1855 137 (PopTo) 137 SB

X714 1855 1122 (Set the index of the next rule to be tested to this rule's ) 1122 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1836 1855 124 (index ) 124 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1960 1855 169 (and pop) 169 SB
X714 1909 978 (the topmost rule number from the pattern stack.) 978 SB
X448 1976 116 (GoTo) 116 SB

X714 1976 1122 (Set the index of the next rule to be tested to this rule's ) 1122 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1836 1976 124 (index.) 124 SB

X271 2055 114 (Index) 114 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X389 2109 476 (This is a parameter for ) 476 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X865 2109 155 (Action; ) 155 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1020 2109 627 (see above for its various uses.) 627 SB
X271 2188 1855 (Rule and action numbers are 1-origin indexes to their corresponding tables. Since there is) 1855 SB
X271 2242 1781 (no provision for labelling the rule and action statements it is very important to get these) 1781 SB
X271 2296 1807 (numbers correct! The simplest way to do this is to include the rule or action number in a) 1807 SB
X271 2350 778 (comment attached to each statement.) 778 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2422 117 (5.2.3.) 117 SB

X419 2422 349 (Actions Section) 349 SB


X1 lc
X1 lj
X0 0 0 pC

X6 4 SP
X275 2551 M 1626 0 1 PP
XS
Xn


X255 255 255 fC
X/fm 256 def

X1869 2529 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X501 89 982 2504 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X1007 2524 448 (Action statement) 448 SB
X255 255 255 fC
X227 71 406 2513 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X422 2528 196 (ACTIONS) 196 SB


X1 lc
X1 lj
X0 0 0 pC

X816 2554 M 0 -85 831 0 0 85 3 PP
XS
Xn
X862 2607 M 40 31 -37 24 -3 7 3 PP
XS
Xn

X277 2808 M 1626 0 1 PP


XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 2699 480 (Action statement) 480 SB
X255 255 255 fC
X1871 2786 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X592 93 793 2764 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X818 2785 532 (attribute = value) 532 SB


X1 lc
X1 lj
X0 0 0 pC

X1146 2868 M 34 28 -31 22 -3 6 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X58 84 1659 2767 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 2779 28 (;) 28 SB


X1 lc
X1 lj
X0 0 0 pC

X674 2811 M 0 -85 832 0 0 85 3 PP
XS
Xn

X721 2864 M 41 32 -37 24 -4 7 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X59 84 1046 2861 B


X1 F
XS
Xn
X0 0 0 fC

X1062 2873 28 (,) 28 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2975 1747 (The Actions section specifies the action table for a rule set. It starts with the keyword) 1747 SB

X271 3029 1507 (ACTIONS, followed by a series of Action statements, one for each action.) 1507 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (12) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1804 (Each Action statement is a list of attribute values, separated by commas and terminated) 1804 SB
X271 310 1794 (with a semicolon. Attribute values must be in the correct form for their attributes - these) 1794 SB
X271 364 1056 (are explained in the 'Flow Attributes' section above.) 1056 SB
X271 443 1848 (Detail addresses are a special case. They have two-byte values, but may also be entered) 1848 SB
X271 497 1460 (as single integers. Examples of this are given in the following sections.) 1460 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 569 117 (5.2.4.) 117 SB

X419 569 392 (Format Statement) 392 SB


X1 lc
X1 lj
X0 0 0 pC

X6 4 SP
X277 757 M 1626 0 1 PP


XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 647 480 (Format statement) 480 SB
X255 255 255 fC
X/fm 256 def
X1871 735 M -38 -19 35 -28 0 41 3 6 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X312 89 952 710 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X977 730 252 (attribute) 252 SB
X255 255 255 fC
X202 83 377 710 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X393 733 168 (FORMAT) 168 SB


X1 lc
X1 lj
X0 0 0 pC

X1290 819 M 34 28 -31 22 -3 7 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X58 84 1659 716 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 728 28 (;) 28 SB


X1 lc
X1 lj
X0 0 0 pC

X799 757 M 0 -91 635 0 0 91 3 PP


XS
Xn
X0 lc
X0 lj
X255 255 255 pC
X255 255 255 fC

X295 80 959 810 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 39 /Courier-Oblique /font11 ANSIFont font
X0 0 0 fC
X977 821 252 (separator) 252 SB


X1 lc
X1 lj
X0 0 0 pC

X834 819 M 35 28 -31 22 -4 7 3 PP
XS
Xn

X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 920 1788 (The Format statement specifies the format of rule data lines in a NeMaC Flow Data file.) 1788 SB
X271 999 1751 (It starts with the FORMAT keyword, which is followed by a list of flow attributes, in the) 1751 SB
X271 1053 932 (order they are to appear in the Flow Data file.) 932 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1125 117 (5.2.5.) 117 SB
X419 1125 442 (Statistics Statement) 442 SB

X277 1313 M 1626 0 1 PP


XS
Xn
X32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font

X271 1203 600 (Statistics statement) 600 SB
X255 255 255 fC
X1871 1291 M -38 -19 35 -28 0 40 3 7 4 PP
X1 F
XS
Xn


X0 lc
X0 lj
X255 255 255 pC

X58 84 1659 1272 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 38 /Courier-Bold /font9 ANSIFont font
X0 0 0 fC
X1674 1284 28 (;) 28 SB
X255 255 255 fC
X321 94 718 1269 B
X1 F
XS
Xn
X32 0 0 46 46 0 0 0 36 /Courier /font0 ANSIFont font
X0 0 0 fC
X737 1293 280 (STATISTICS) 280 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1393 1799 (The Statistics statement tells NeMaC to collect meter performance statistics each time it) 1799 SB
X271 1447 1789 (collects flow data, and to write it to the flow data file. NeMaC sets NeTraMet's statistics) 1789 SB

X271 1501 877 (variables to zero after reading their values.) 877 SB


X32 0 0 50 50 0 0 0 47 /Helvetica-Bold /font13 ANSIFont font

X271 1588 84 (5.3.) 84 SB

X413 1588 252 ( Rule Files) 252 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1671 1802 (This section gives a few examples of rule files, with comments on what they do and why) 1802 SB
X271 1725 606 (they were written as they are.) 606 SB

X271 1804 1624 (I have found it simplest, when developing a new rule file, to proceed as follows:) 1624 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 1880 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 1883 1698 (Make sure that every rule or action has a comment which includes its rule or action) 1698 SB

X271 1937 1611 (number. Check carefully that these numbers start at one and are consecutive.) 1611 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 2013 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 2016 1683 (Make sure that rule actions have indexes which really do refer to the intended rule) 1683 SB

X271 2070 191 (or action.) 191 SB


X32 0 0 46 46 0 0 0 46 /Symbol font

Xgs 292 3426 0 0 CB
X271 2146 21 (\267) 21 SB


Xgr
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X421 2149 1611 (Check the rule file by using NeMaC's syntax check \(-s\) option, piping NeMaC's) 1611 SB
X271 2203 1807 (output to a file. Compare the syntax check output with the rule file using two windows in) 1807 SB
X271 2257 1687 (your favourite file editor. It's helpful to start by verifying that NeMaC has found the) 1687 SB
X271 2311 778 (intended number of rules and actions!) 778 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 2383 117 (5.3.1.) 117 SB

X419 2383 275 (rules.default) 275 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2461 483 (# 1705, Mon 1 Sep 93) 483 SB
X330 2501 23 (#) 23 SB
X330 2541 1311 (# Default rule file for NeTraMet \(built in to the meter\)) 1311 SB
X330 2581 23 (#) 23 SB
X330 2621 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 2661 23 (#) 23 SB
X330 2701 115 (SET 1) 115 SB
X330 2741 23 (#) 23 SB
X330 2781 115 (RULES) 115 SB
X330 2821 23 (#) 23 SB
X330 2861 1311 (SourcePeerType & 255 = IP : Aggregate, 1; # 1) 1311 SB
X330 2901 1311 (SourcePeerType & 255 = Novell : Aggregate, 2; # 2) 1311 SB
X330 2941 1311 (SourcePeerType & 255 = DECnet : Aggregate, 3; # 3) 1311 SB
X330 2981 1311 (SourcePeerType & 255 = EtherTalk : Aggregate, 4; # 4) 1311 SB

X330 3021 1495 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1495 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (13) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM
X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font
X0 0 0 fC

X271 256 1838 (This is the default rule set, which is built in to the meter and can't be changed. It provides) 1838 SB
X271 310 1736 (rule set 1 which produces four aggregate flows, one for each of the peer types which) 1736 SB
X271 364 487 (NeTraMet understands.) 487 SB

X271 443 548 (Rule five, above, tests the ) 548 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X819 443 79 (Null) 79 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X898 443 1167 ( attribute. This is a special case which always succeeds.) 1167 SB

X271 497 366 (The rule action is ) 366 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X637 497 207 (Succeed, ) 207 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X844 497 1251 (which means that any other packets \(e.g. dummy packets for) 1251 SB

X271 551 975 (measuring processor utilisation\) will be ignored.) 975 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 630 161 (ACTIONS) 161 SB
X330 670 23 (#) 23 SB
X330 710 1311 (SourcePeerType=IP, SourcePeerMask=255, # 1) 1311 SB
X330 750 1357 ( SourcePeerAddress=11.12.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 790 1265 ( DestPeerAddress=13.14.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 830 1311 (SourcePeerType=Novell, SourcePeerMask=255, # 2) 1311 SB
X330 870 1357 ( SourcePeerAddress=21.22.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 910 1265 ( DestPeerAddress=23.24.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 950 1311 (SourcePeerType=DECnet, SourcePeerMask=255, # 3) 1311 SB
X330 990 1357 ( SourcePeerAddress=31.32.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 1030 1265 ( DestPeerAddress=33.34.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 1070 1311 (SourcePeerType=EtherTalk, SOurcePeerMask=255, # 4) 1311 SB
X330 1110 1357 ( SourcePeerAddress=41.42.0.0, SourcePeerMask=255.255.0.0,) 1357 SB
X330 1150 1265 ( DestPeerAddress=43.44.0.0, DestPeerMask=255.255.0.0;) 1265 SB
X330 1190 23 (#) 23 SB

X330 1230 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1295 1851 (The default action table provides aggregate actions as required by the default rules. Each) 1851 SB
X271 1349 1717 (of these specifies a set of values for flow attributes. These have been chosen to be) 1717 SB
X271 1403 1738 (values which would not occur in normal traffic flows - they simply serve to identify the) 1738 SB
X271 1457 246 (aggregates.) 246 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1529 117 (5.3.2.) 117 SB

X419 1529 284 (rules.sample) 284 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1607 506 (# 1705, Mon 13 Sep 93) 506 SB
X330 1647 23 (#) 23 SB
X330 1687 1242 (# Rule specification file to tally IP net <-> IP net,) 1242 SB
X330 1727 1219 (# tally DECnet and Novell and aggregate EtherTalk) 1219 SB
X330 1767 23 (#) 23 SB
X330 1807 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 1847 23 (#) 23 SB
X330 1887 828 (SET 2 # Rule + action set number 2) 828 SB
X330 1927 23 (#) 23 SB
X330 1967 115 (RULES) 115 SB
X330 2007 23 (#) 23 SB
X330 2047 1311 (SourcePeerType & 255 = DECnet : Tally, 9; # 1) 1311 SB
X330 2087 1311 (SourcePeerType & 255 = IP.0.0.0 : Pushto, 8; # 2) 1311 SB
X330 2127 1311 (SourcePeerType & 255 = EtherTalk : Aggregate, 7; # 3) 1311 SB
X330 2167 1311 (SourcePeerType & 255 = Novell : Tally, 8; # 4) 1311 SB
X330 2207 1495 (Null & 0 = 0 : Succeed, 0; # 5 Ignore) 1495 SB
X330 2247 23 (#) 23 SB
X330 2287 1311 (Null & 0 = 0 : Succeed, 0; # 6) 1311 SB

X330 2327 1311 (Null & 0 = 0 : Succeed, 0; # 7) 1311 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2392 1739 (The first part of this rule table determines the peer protocol type. DECnet and Novell) 1739 SB
X271 2446 1843 (packets are tallied by actions 9 and 8, and EtherTalk packets are aggregated using action) 1843 SB
X271 2500 1832 (7. IP packets cause the meter to save rule 2's index on the pattern stack then test rule 8.) 1832 SB

X271 2554 1839 (Rules 6 and 7 are never executed; they merely provide a gap in the rule table for possible) 1839 SB
X271 2608 191 (later use.) 191 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2687 1610 (SourcePeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 13; # 8 Low B) 1610 SB
X330 2727 1610 (SourcePeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 16; # 9 Low C) 1610 SB
X330 2767 1610 (SourcePeerAddress & 192.0.0.0 = 64.0.0.0 : Pushto, 18; # 10 Low A) 1610 SB
X330 2807 1610 (SourcePeerAddress & 192.0.0.0 = 0.0.0.0 : Pushto, 18; # 11 Low A) 1610 SB
X330 2847 1449 (Null & 0 = 0 : Fail, 0; # 12) 1449 SB
X330 2887 23 (#) 23 SB
X330 2927 1748 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 1; # 13 High B: B-B) 1748 SB
X330 2967 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 2; # 14 High C: B-C) 1748 SB
X330 3007 1449 (Null & 0 = 0 : Fail, 0; # 15) 1449 SB

X330 3047 23 (#) 23 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (14) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC


X330 256 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 3; # 16 High C: C-C) 1748 SB
X330 296 1449 (Null & 0 = 0 : Fail, 0; # 17) 1449 SB
X330 336 23 (#) 23 SB
X330 376 1748 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 4; # 18 High B: A-B) 1748 SB
X330 416 1748 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 5; # 19 High C: A-C) 1748 SB
X330 456 1748 (DestPeerAddress & 192.0.0.0 = 64.0.0.0 : Tally, 6; # 20 High A: A-A) 1748 SB
X330 496 1748 (DestPeerAddress & 192.0.0.0 = 0.0.0.0 : Tally, 6; # 21 High A: A-A) 1748 SB
X330 536 1449 (Null & 0 = 0 : Fail, 0; # 22) 1449 SB
X330 576 23 (#) 23 SB
X330 616 1449 (Null & 0 = 0 : Fail, 0; # 23) 1449 SB

X330 656 1449 (Null & 0 = 0 : Fail, 0; # 24) 1449 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 721 1760 (This part of the rule table handles IP packets. The first two bits of the packet's source) 1760 SB
X271 775 1747 (peer address are examined to decide whether it is class A, B or C. For each of these) 1747 SB
X271 829 1802 (cases the first two bits of the destination peer address is tested to determine its address) 1802 SB
X271 883 1709 (class. The packet is then tallied in one of six tallies for each of the possible pairs of) 1709 SB
X271 937 296 (address class.) 296 SB
X271 1016 1848 (Note that the above rules make no attempt to impose any order on source and destination) 1848 SB
X271 1070 1796 (addresses. When a packet appears which is the first of a new traffic flow, its source will) 1796 SB

X271 1124 535 (be the source for the flow.) 535 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 1203 161 (ACTIONS) 161 SB
X330 1243 23 (#) 23 SB
X330 1283 1058 (SourcePeerType=IP, SourcePeerMask=255.255.0.0,) 1058 SB
X330 1323 1472 ( DestPeerMask=255.255.0.0; # 1 B-B) 1472 SB
X330 1363 1058 (SourcePeerType=IP, SourcePeerMask=255.255.0.0,) 1058 SB
X330 1403 1472 ( DestPeerMask=255.255.255.0; # 2 B-C) 1472 SB
X330 1443 1104 (SourcePeerType=IP, SourcePeerMask=255.255.255.0,) 1104 SB
X330 1483 1472 ( DestPeerMask=255.255.255.0; # 3 C-C) 1472 SB
X330 1523 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB
X330 1563 1472 ( DestPeerMask=255.255.0.0; # 4 A-B) 1472 SB
X330 1603 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB
X330 1643 1472 ( DestPeerMask=255.255.255.0; # 5 A-C) 1472 SB
X330 1683 1012 (SourcePeerType=IP, SourcePeerMask=255.0.0.0,) 1012 SB

X330 1723 1472 ( DestPeerMask=255.0.0.0; # 6 A-A) 1472 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1788 1805 (The first six actions are tallies for each of the possible combinations of IP address class.) 1805 SB
X271 1842 1807 (Each has the appropriate peer address masks set, telling the meter which parts of those) 1807 SB

X271 1896 561 (attributes are to be tallied. ) 561 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X832 1896 361 (SourcePeerType ) 361 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1193 1896 788 (is set to IP; without this it would not be) 788 SB

X271 1950 1609 (possible to determine the peer address type when the flow data was collected.) 1609 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2029 575 (SourcePeerType=EtherTalk,) 575 SB
X330 2069 1265 ( SourcePeerAddress=1.0.0.0, SourcePeerMask=255.0.0.0,) 1265 SB
X330 2109 1610 ( DestPeerAddress=1.0.0.0, DestPeerMask=255.0.0.0; # 7 Aggregate) 1610 SB
X330 2149 23 (#) 23 SB
X330 2189 1242 (SourcePeerType=Novell, SourcePeerMask=255.255.255.255,) 1242 SB
X330 2229 1610 ( DestPeerMask=255.255.255.255; # 8 Tally all) 1610 SB
X330 2269 1196 (SourcePeerType=DECnet, SourcePeerMask=255.255.255.0,) 1196 SB

X330 2309 1610 ( DestPeerMask=255.255.255.0; # 9 Tally all) 1610 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2374 1801 (The remaining actions aggreagate EtherTalk and tally Novell and DECnet packets. The) 1801 SB
X271 2428 1803 (tallies use the entire peer address in each case. This instructs the meter to create flows) 1803 SB
X271 2482 1799 (for every possible pair of peer addresses. The network segment which this rule set was) 1799 SB

X271 2536 1219 (written for has very little EtherTalk, Novell or DECnet traffic.) 1219 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2615 989 (FORMAT FlowRuleSet FlowIndex FirstTime " ") 989 SB
X330 2655 1288 ( SourcePeerType SourcePeerAddress DestPeerAddress " ") 1288 SB
X330 2695 1012 ( ToPDUs FromPDUs " " ToOctets FromOctets;) 1012 SB
X330 2735 23 (#) 23 SB

X330 2775 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2840 1734 (The Format statement specifies the attributes to be collected from the meter. It uses) 1734 SB

X271 2894 1177 (double spaces to separate the attributes into four groups.) 1177 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (15) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X0 0 0 fC


X271 257 117 (5.3.3.) 117 SB

X419 257 307 (rules.gateway) 307 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 335 506 (# 1605, Fri 24 Sep 93) 506 SB
X330 375 23 (#) 23 SB
X330 415 1288 (# Rule specification file to tally traffic to/from ccr1) 1288 SB
X330 455 23 (#) 23 SB
X330 495 1380 (# Nevil Brownlee, Computer Centre, University of Auckland) 1380 SB
X330 535 23 (#) 23 SB
X330 575 828 (SET 6 # Rule + action set number 6) 828 SB
X330 615 23 (#) 23 SB
X330 655 115 (RULES) 115 SB
X330 695 23 (#) 23 SB
X330 735 1610 (DestAdjacentAddress & ff-ff-ff-ff-ff-ff = aa-00-04-00-f4-ed : # ccr1) 1610 SB
X330 775 506 ( Pushto, 3; # 1) 506 SB
X330 815 1150 (Null & 0 = 0 : Fail, 0; # 2 Try again) 1150 SB
X330 855 23 (#) 23 SB
X330 895 1518 (SourcePeerType, 255, IP, Pushto, 5; # 3) 1518 SB
X330 935 1702 (Null, 0, 0, Succeed, 0; # 4 Ignore) 1702 SB
X330 975 23 (#) 23 SB
X330 1015 1748 (SourcePeerAddress, 255.255.0.0, 130.216.0.0, Pushto, 8; # 5 Auckland) 1748 SB
X330 1055 1679 (SourcePeerAddress, 192.0.0.0, 192.0.0.0, Pushto, 8; # 6 Low C) 1679 SB

X330 1095 1679 (Null, 0, 0, Pushto, 11; # 7 Low B) 1679 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1160 1776 (This rule set was intended for metering traffic through a gateway ethernet, which has a) 1776 SB
X271 1214 289 (router named ) 289 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X560 1214 87 (ccr1) 87 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X647 1214 1358 ( providing our connection to the Internet. Rule 1 above tests each) 1358 SB

X271 1268 182 (packet's ) 182 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X453 1268 446 (DestAdjacentAddress) 446 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X899 1268 1034 ( to see whether its destination is on the far side of ) 1034 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1933 1268 100 (ccr1.) 100 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X2033 1268 88 ( If it) 88 SB
X271 1322 1858 (is, rule 5 will be tested next, otherwise rule two is tested, Rule two fails, allowing the meter) 1858 SB
X271 1376 1828 (to interchange source and destinations and try again. If the match fails on the second try) 1828 SB
X271 1430 442 (the packet is ignored.) 442 SB
X271 1509 1240 (The rest of this rule file is very similar to rules.sample above.) 1240 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 1581 117 (5.3.4.) 117 SB

X419 1581 233 (rules.UofA) 233 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 3099 1104 (Null & 0 = 0 : Succeed, 0; # 30) 1104 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (16) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC


X330 256 23 (#) 23 SB
X330 296 391 (# Source is local) 391 SB
X330 336 23 (#) 23 SB
X330 376 1748 (DestPeerAddress & 255.255.0.0 = 130.216.0.0 : Fail, 0; # 31 Retry match) 1748 SB
X330 416 1472 (Null & 0 = 0 : Pushto, 34; # 32 Tally packet) 1472 SB
X330 456 23 (#) 23 SB
X330 496 322 (# Source is UA) 322 SB
X330 536 23 (#) 23 SB

X330 576 1610 (DestPeerAddress & 255.255.0.0 = 130.216.0.0 : Count, 0; # 33 UA-UA) 1610 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 641 1865 (This rule set meters traffic through our gateway ethernet. IP packets are classified into two) 1865 SB
X271 695 1887 (groups: 'source is Auckland' and 'source is local to Auckland,' i.e. one of the list of networks) 1887 SB
X271 749 1790 (in rules 8 to 19. The rules above make sure that if either of a flow's hosts is Auckland it) 1790 SB
X271 803 1897 (appears as the flow's source, so that flows between Auckland and one of our local networks) 1897 SB

X271 857 338 (are well defined.) 338 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 936 920 (# Direction determined; tally the packet) 920 SB
X330 976 23 (#) 23 SB
X330 1016 1610 (DestPeerAddress & 140.200.0.0 = 255.255.0.0 : Pushto, 48; # 34 Tuia) 1610 SB
X330 1056 23 (#) 23 SB
X330 1096 1633 (DestPeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 49; # 35 Tally C) 1633 SB
X330 1136 1633 (DestPeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 43; # 36 Tally B) 1633 SB
X330 1176 23 (#) 23 SB
X330 1216 1610 (SourceDetailType & 255 = icmp : Tally, 4; # 37 Tally A) 1610 SB
X330 1256 1403 (SourceDetailAddress & 255.255 = domain : Tally, 7; # 38) 1403 SB
X330 1296 1403 (DestDetailAddress & 255.255 = domain : Tally, 7; # 39) 1403 SB
X330 1336 1403 (DestDetailAddress & 255.255 = ftpdata : Tally, 10; # 40) 1403 SB
X330 1376 1403 (SourceDetailAddress & 255.255 = ftpdata : Tally, 13; # 41) 1403 SB

X330 1416 1403 (Null & 0 = 0 : Tally, 1; # 42) 1403 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 1481 1899 (Once classified, packets are tallied in various ways, depending on their IP protocol type. For) 1899 SB

X271 1535 1427 (example, Domain Name Service traffic flows have a detail address of ) 1427 SB


X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font

X1698 1535 152 (domain) 152 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X1850 1535 232 ( for source,) 232 SB

X271 1589 1016 (destination or both. - these are tallied by action 7.) 1016 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 2748 1288 ( SourceDetailAddress=domain, DestDetailAddress=domain;) 1288 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 2813 1823 (The actions are arranged in groups of three, for class A, B and C destination networks. A) 1823 SB
X271 2867 1857 (class C mask is used for all the source networks, which breaks the class B ones \(Auckland) 1857 SB

X271 2921 699 (and ait\) into their class C subnets.) 699 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB
X2003 3186 78 ( ) 78 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Oblique /font19 ANSIFont font
X271 3265 182 (10/15/93) 182 SB

X1102 3265 43 (-- ) 43 SB
X1145 3265 52 (17) 52 SB

X1197 3265 43 ( --) 43 SB


X1866 3265 205 (NeTraMet) 205 SB
XEJ RS
X%%PageTrailer
XSS
X0 0 18 13 783 1169 300 SM

X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font
X0 0 0 fC


X330 256 989 (FORMAT FlowRuleSet FlowIndex FirstTime " ") 989 SB
X330 296 943 ( SourcePeerAddress DestPeerAddress " ") 943 SB
X330 336 1426 ( SourceDetailType SourceDetailAddress DestDetailAddress " ") 1426 SB
X330 376 1012 ( ToPDUs FromPDUs " " ToOctets FromOctets;) 1012 SB
X330 416 23 (#) 23 SB
X330 456 897 (STATISTICS # Collect meter statistics) 897 SB
X330 496 23 (#) 23 SB

X330 536 299 (# end of file) 299 SB


X32 0 0 46 46 0 0 0 43 /Helvetica /font12 ANSIFont font

X271 601 1774 (The Format statement specifies the attributes to be collected. These include the detail) 1774 SB
X271 655 1743 (addresses, allowing for analysis of the traffic by IP service. The meter's performance) 1743 SB
X271 709 625 (statistics will also be collected.) 625 SB
X32 0 0 46 46 0 0 0 43 /Helvetica-Bold /font13 ANSIFont font
X271 781 117 (5.3.5.) 117 SB

X419 781 191 (rules.lan) 191 SB


X32 0 0 38 38 0 0 0 30 /Courier /font0 ANSIFont font

X330 3099 299 (# end of file) 299 SB


X32 0 0 46 46 1 0 0 43 /Helvetica /font12 ANSIFont font
X271 3186 416 ( ) 416 SB
X687 3186 416 ( ) 416 SB
X1103 3186 78 ( ) 78 SB
X1171 3186 416 ( ) 416 SB
X1587 3186 416 ( ) 416 SB

END_OF_FILE
if test 44499 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps.C'`; then
echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps.C'\" unpacked with wrong size!
else
PARTS=""

for I in A B C D ; do

if test -f netramet/doc/NeTraMet/NeTraMet.man.ps.$I ; then


PARTS="${PARTS}${I}"
fi

if test "${PARTS}" = "ABCD" ; then
echo shar: Combining \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" \(188008 characters\)
cat netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D] > 'netramet/doc/NeTraMet/NeTraMet.man.ps'
if test 188008 -ne `wc -c <'netramet/doc/NeTraMet/NeTraMet.man.ps'`; then

echo shar: \"'netramet/doc/NeTraMet/NeTraMet.man.ps'\" combined with wrong size!
else
rm netramet/doc/NeTraMet/NeTraMet.man.ps.[A-D]
fi
fi
done
fi


# end of 'netramet/doc/NeTraMet/NeTraMet.man.ps.C'
fi
if test -f 'netramet/src/apps/snmpwalk.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpwalk.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpwalk.c'\" \(4841 characters\)
sed "s/^X//" >'netramet/src/apps/snmpwalk.c' <<'END_OF_FILE'
X/*
X * snmpwalk.c - send snmp GETNEXT requests to a network entity, walking a subtree.

X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>


X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"

X#include "snmpapi.h"
X#include "snmpclnt.h"
X

Xoid objid_mib[] = {1, 3, 6, 1, 2, 1};
X


Xint snmp_dump_packet = 0;
X
X

Xmain(argc, argv)


X int argc;
X char *argv[];
X{

X struct snmp_session session, *ss;


X struct snmp_pdu *pdu, *response;

X struct variable_list *vars;
X int arg;


X char *gateway = NULL;
X char *community = NULL;
X int gotroot = 0;
X oid name[32];
X int name_length;
X oid root[MAX_NAME_LEN];
X int rootlen, count;
X int running;

X int status;
X


X init_mib();
X /*
X * usage: snmpwalk gateway-name community-name [object-id]
X */

X for(arg = 1; arg < argc; arg++){


X if (argv[arg][0] == '-'){

X switch(argv[arg][1]){


X case 'd':
X snmp_dump_packet++;
X break;

X default:
X printf("invalid option: -%c\n", argv[arg][1]);


X break;
X }
X continue;
X }

X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {
X rootlen = MAX_NAME_LEN;
X if (read_objid(argv[arg], root, &rootlen)){
X gotroot = 1;
X } else {
X printf("Invalid object identifier: %s\n", argv[arg]);

X }
X }
X }
X


X if (gotroot == 0){
X bcopy((char *)objid_mib, (char *)root, sizeof(objid_mib));
X rootlen = sizeof(objid_mib) / sizeof(oid);
X gotroot = 1;
X }
X
X if (!(gateway && community && gotroot == 1)){

X printf("usage: snmpwalk gateway-name community-name object-identifier\n");
X exit(1);
X }
X


X bzero((char *)&session, sizeof(struct snmp_session));

X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);

X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);

X ss = snmp_open(&session);
X if (ss == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X
X bcopy((char *)root, (char *)name, rootlen * sizeof(oid));
X name_length = rootlen;
X
X running = 1;
X while(running){
X running = 0;

X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X snmp_add_null_var(pdu, name, name_length);
X

X status = snmp_synch_response(ss, pdu, &response);


X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){

X for(vars = response->variables; vars; vars = vars->next_variable){
X if (vars->name_length < rootlen || bcmp(root, vars->name, rootlen * sizeof(oid)))
X continue; /* not part of this subtree */
X print_variable(vars->name, vars->name_length, vars);
X bcopy((char *)vars->name, (char *)name, vars->name_length * sizeof(oid));
X name_length = vars->name_length;
X running = 1; /* restart so we can get next variable */

X }
X } else {


X if (response->errstat == SNMP_ERR_NOSUCHNAME){

X printf("End of MIB.\n");

X } else {


X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){
X printf("The request for this object identifier failed: ");

X for(count = 1, vars = response->variables; vars && count != response->errindex;


X vars = vars->next_variable, count++)

X ;
X if (vars)
X print_objid(vars->name, vars->name_length);

X printf("\n");
X }
X }

X }
X


X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);
X } else { /* status == STAT_ERROR */

X printf("An error occurred, Quitting\n");
X }
X


X if (response)
X snmp_free_pdu(response);
X }

X printf("rootlen %d\n", rootlen);
X snmp_close(ss);

X}
X
END_OF_FILE


if test 4841 -ne `wc -c <'netramet/src/apps/snmpwalk.c'`; then

echo shar: \"'netramet/src/apps/snmpwalk.c'\" unpacked with wrong size!
fi


# end of 'netramet/src/apps/snmpwalk.c'
fi
if test -f 'netramet/src/snmplib/include/mib.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/mib.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/mib.h'\" \(10793 characters\)

sed "s/^X//" >'netramet/src/snmplib/include/mib.h' <<'END_OF_FILE'
X/*


X * Definitions for the variables as defined in the MIB

X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X
X
X
END_OF_FILE


if test 10793 -ne `wc -c <'netramet/src/snmplib/include/mib.h'`; then

echo shar: \"'netramet/src/snmplib/include/mib.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/mib.h'
fi
echo shar: End of archive 14 \(of 25\).
cp /dev/null ark14isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:04:15 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 108
Archive-name: netramet/part20
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/src/apps/snmp_vars.h netramet/src/apps/snmpagnt.c
# netramet/src/snmplib/mib.c netramet/src/snmplib/snmpagnt.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:12 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 20 (of 25)."'
if test -f 'netramet/src/apps/snmp_vars.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmp_vars.h'\"
else
echo shar: Extracting \"'netramet/src/apps/snmp_vars.h'\" \(5636 characters\)
sed "s/^X//" >'netramet/src/apps/snmp_vars.h' <<'END_OF_FILE'
X/*


X * Definitions for SNMP (RFC 1067) agent variable finder.
X *
X *

X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University

X Copyright 1989 TGV, Incorporated


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU and TGV not be used

Xin advertising or publicity pertaining to distribution of the software
Xwithout specific, written prior permission.
X


XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
XPERFORMANCE OF THIS SOFTWARE.
X******************************************************************/

X
Xu_char *var_system();
Xu_char *var_ifEntry();
Xu_char *var_atEntry();
Xu_char *var_ip();
Xu_char *var_ipAddrEntry();
Xu_char *var_ipRouteEntry();
Xu_char *var_icmp();

Xu_char *var_tcp();
Xu_char *var_udp();
Xu_char *var_process();
Xu_char *var_event();
Xu_char *getStatPtr();
X
Xextern long long_return;
Xextern u_char return_buf[];
X
X#define INST 0xFFFFFFFF /* used to fill out the instance field of the variables table */
X
X/*
X * These are unit magic numbers for each variable.
X */
X
X#define VERSION_DESCR 0
X#define VERSION_ID 1
X#define IFNUMBER 2
X#define UPTIME 3
X#define EVENTNEXTINDEX 4
X
X
X#define IFINDEX 1
X#define IFDESCR 2
X#define IFTYPE 3
X#define IFMTU 4
X#define IFSPEED 5
X#define IFPHYSADDRESS 6
X#define IFADMINSTATUS 7
X#define IFOPERSTATUS 8
X#define IFLASTCHANGE 9
X#define IFINOCTETS 10
X#define IFINUCASTPKTS 11
X#define IFINNUCASTPKTS 12
X#define IFINDISCARDS 13
X#define IFINERRORS 14
X#define IFINUNKNOWNPROTOS 15
X#define IFOUTOCTETS 16
X#define IFOUTUCASTPKTS 17
X#define IFOUTNUCASTPKTS 18
X#define IFOUTDISCARDS 19
X#define IFOUTERRORS 20
X#define IFOUTQLEN 21
X
X#define ATIFINDEX 0
X#define ATPHYSADDRESS 1
X#define ATNETADDRESS 2
X
X#define IPFORWARDING 0
X#define IPDEFAULTTTL 1
X#define IPINRECEIVES 2
X#define IPINHDRERRORS 3
X#define IPINADDRERRORS 4
X#define IPFORWDATAGRAMS 5
X#define IPINUNKNOWNPROTOS 6
X#define IPINDISCARDS 7
X#define IPINDELIVERS 8
X#define IPOUTREQUESTS 9
X#define IPOUTDISCARDS 10
X#define IPOUTNOROUTES 11
X#define IPREASMTIMEOUT 12
X#define IPREASMREQDS 13
X#define IPREASMOKS 14
X#define IPREASMFAILS 15
X#define IPFRAGOKS 16
X#define IPFRAGFAILS 17
X#define IPFRAGCREATES 18
X
X#define IPADADDR 1
X#define IPADIFINDEX 2
X#define IPADNETMASK 3
X#define IPADBCASTADDR 4
X
X#define IPROUTEDEST 0
X#define IPROUTEIFINDEX 1
X#define IPROUTEMETRIC1 2
X#define IPROUTEMETRIC2 3
X#define IPROUTEMETRIC3 4
X#define IPROUTEMETRIC4 5
X#define IPROUTENEXTHOP 6
X#define IPROUTETYPE 7
X#define IPROUTEPROTO 8
X#define IPROUTEAGE 9
X
X#define ICMPINMSGS 0
X#define ICMPINERRORS 1
X#define ICMPINDESTUNREACHS 2
X#define ICMPINTIMEEXCDS 3
X#define ICMPINPARMPROBS 4
X#define ICMPINSRCQUENCHS 5
X#define ICMPINREDIRECTS 6
X#define ICMPINECHOS 7
X#define ICMPINECHOREPS 8
X#define ICMPINTIMESTAMPS 9
X#define ICMPINTIMESTAMPREPS 10
X#define ICMPINADDRMASKS 11
X#define ICMPINADDRMASKREPS 12
X#define ICMPOUTMSGS 13
X#define ICMPOUTERRORS 14
X#define ICMPOUTDESTUNREACHS 15
X#define ICMPOUTTIMEEXCDS 16
X#define ICMPOUTPARMPROBS 17
X#define ICMPOUTSRCQUENCHS 18
X#define ICMPOUTREDIRECTS 19
X#define ICMPOUTECHOS 20
X#define ICMPOUTECHOREPS 21
X#define ICMPOUTTIMESTAMPS 22
X#define ICMPOUTTIMESTAMPREPS 23
X#define ICMPOUTADDRMASKS 24
X#define ICMPOUTADDRMASKREPS 25
X
X#define TCPRTOALGORITHM 1
X#define TCPRTOMIN 2
X#define TCPRTOMAX 3
X#define TCPMAXCONN 4
X#define TCPACTIVEOPENS 5
X#define TCPPASSIVEOPENS 6
X#define TCPATTEMPTFAILS 7
X#define TCPESTABRESETS 8
X#define TCPCURRESTAB 9
X#define TCPINSEGS 10
X#define TCPOUTSEGS 11
X#define TCPRETRANSSEGS 12
X#define TCPCONNSTATE 13
X#define TCPCONNLOCALADDRESS 14
X#define TCPCONNLOCALPORT 15
X#define TCPCONNREMADDRESS 16
X#define TCPCONNREMPORT 17
X
X#define UDPINDATAGRAMS 0
X#define UDPNOPORTS 1
X#define UDPINERRORS 2
X#define UDPOUTDATAGRAMS 3
X
X#define EVENTCLASS 0
X#define EVENTINSTANCE 1
X#define EVENTALARMTYPE 2
X#define EVENTTIME 3
X#define EVENTPROBCAUSE 4
X#define EVENTSPECIFICPROBLEM 5
X#define EVENTSEVERITY 6
X#define EVENTBACKUPSTATUS 7
X#define EVENTBACKUPINSTANCE 8
X#define EVENTTREND 9
X#define EVENTTHRESHOLD 10
X#define EVENTTHRESHOLDLEVEL 11
X#define EVENTTHRESHOLDOBSVALUE 12
X#define EVENTID 13
X#define EVENTCORRELATIONS 14
X#define EVENTOPERSTATE 16
X#define EVENTADMINSTATE 17
X#define EVENTMONATTRIBUTES 18
X#define EVENTREPAIRACTION 19
X#define EVENTDATA 20
X#define EVENTTEXT 21
X#define EVENTCREDIBILITY 22
X#define EVENTINDEX 23
X#define EVENTVALID 24
X
X
Xstruct variable {
X oid name[26]; /* object identifier of variable */


X u_char namelen; /* length of above */
X char type; /* type of variable, INTEGER or (octet) STRING */
X u_char magic; /* passed to function as a hint */
X u_short acl; /* access control list for variable */
X u_char *(*findVar)(); /* function that finds variable */
X};

END_OF_FILE
if test 5636 -ne `wc -c <'netramet/src/apps/snmp_vars.h'`; then
echo shar: \"'netramet/src/apps/snmp_vars.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmp_vars.h'
fi
if test -f 'netramet/src/apps/snmpagnt.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpagnt.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpagnt.c'\" \(18099 characters\)
sed "s/^X//" >'netramet/src/apps/snmpagnt.c' <<'END_OF_FILE'


X/*
X * Simple Network Management Protocol (RFC 1067).

X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#include "ausnmp.h"
X
X#ifdef KINETICS
X#include "gw.h"


X#include "ab.h"
X#include "inet.h"
X#include "fp4/cmdmacro.h"
X#include "fp4/pbuf.h"

X#include "glob.h"
X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>
X#ifndef NULL
X#define NULL 0
X#endif
X#endif

X
X#include "snmp.h"
X#include "snmpimpl.h" /* AU */
X#include "asn1.h"
X

X#include "mib.h"
X
Xvoid snmp_input();
Xvoid snmp_trap();
Xint create_identical();
Xint parse_var_op_list();
Xint snmp_access();
X
X#if kinetics
Xchar version_descr[];
Xoid version_id[];
Xint version_id_len;
X#endif
X
Xstruct pbuf *definitelyGetBuf();
X
X#define NUM_COMMUNITIES 5
Xchar *communities[NUM_COMMUNITIES] = {
X "public",
X "proxy",
X "private",
X "regional",
X "core"
X};
X
X/* these can't be global in a multi-process router */
X u_char sid[SID_MAX_LEN + 1];
X int sidlen;
X u_char *packet_end;
X int community;
X
X
X#ifdef KINETICS
Xvoid
Xsnmp_input(p)
X struct pbuf *p;
X{
X struct ip *ip = (struct ip *)p->p_off;
X int hlen = (int)ip->ip_hl << 2;
X register struct udp *udp;
X register u_char *data; /* pointer to the rest of the unread data */
X int length; /* bytes of data left in msg after the "data" pointer */
X struct pbuf *out_packet;
X register u_char *out_data;
X int out_length;
X u_short udp_src;
X extern struct mib_udp mib_udp;
X
X
X udp = (struct udp *)(p->p_off + hlen);
X if (ntohs(ip->ip_len) - hlen < sizeof(struct udp) || /* IP length < minimum UDP packet */
X ntohs(udp->length) > ntohs(ip->ip_len) - hlen){ /* UDP length > IP data */
X ERROR("dropped packet with bad length"); /* delete me */
X return; /* drop packet */
X }
X data = (u_char *)udp + sizeof(struct udp);
X length = ntohs(udp->length) - sizeof(struct udp);
X
X out_packet = definitelyGetBuf(); /* drop packets off input queue if necessary */
X out_data = (u_char *)(out_packet->p_off + sizeof (struct ip) + sizeof (struct udp));
X out_length = MAXDATA - sizeof(struct ip) - sizeof (struct udp);
X
XK_LEDON();
X if (!snmp_agent_parse(data, length, out_data, &out_length, (u_long)ip->ip_src)){
X K_PFREE(out_packet);
XK_LEDOFF();
X return;
X }
XK_LEDOFF();
X out_packet->p_len = packet_end - (u_char *)out_packet->p_off;
X setiphdr(out_packet, ip->ip_src); /* address to source of request packet (ntohl ??? ) */
X udp_src = ntohs(udp->src);
X udp = (struct udp *)(out_packet->p_off + sizeof (struct ip));
X udp->src = htons(SNMP_PORT);
X udp->dst = htons(udp_src);
X udp->length = out_packet->p_len - sizeof(struct ip);
X udp->checksum = 0; /* this should be computed */
X
X mib_udp.udpOutDatagrams++;
X routeip(out_packet, 0, 0);
X}
X
X
Xvoid
Xsnmp_trap(destAddr, trapType, specificType)
X u_long destAddr;


X int trapType;
X int specificType;

X{
X struct pbuf *out_packet;
X register u_char *out_data;
X register struct udp *udp;
X int out_length;
X static oid sysDescrOid[] = {1, 3, 6, 1, 2, 1, 1, 1, 0};
X
X out_packet = definitelyGetBuf(); /* drop packets off input queue if necessary */
X out_data = (u_char *)(out_packet->p_off + sizeof (struct ip) + sizeof (struct udp));
X out_length = MAXDATA - sizeof(struct ip) - sizeof (struct udp);
X
XK_LEDON();
X out_packet->p_len = snmp_build_trap(out_data, out_length, version_id, version_id_len,
X conf.ipaddr, trapType, specificType, TICKS2MS(tickclock)/10, sysDescrOid, sizeof(sysDescrOid)/sizeof(oid),
X ASN_OCTET_STR, strlen(version_descr), (u_char *)version_descr);
X if (out_packet->p_len == 0){
X K_PFREE(out_packet);
XK_LEDOFF();
X return;
X }
XK_LEDOFF();
X out_packet->p_len += sizeof(struct ip) + sizeof(struct udp);
X setiphdr(out_packet, destAddr); /* address to source of request packet (ntohl ??? ) */
X udp = (struct udp *)(out_packet->p_off + sizeof (struct ip));
X udp->src = htons(SNMP_PORT);
X udp->dst = htons(SNMP_TRAP_PORT);
X udp->length = out_packet->p_len - sizeof(struct ip);
X udp->checksum = 0; /* this should be computed */
X
X mib_udp.udpOutDatagrams++;
X routeip(out_packet, 0, 0);
X}
X#endif
X
Xint
Xsnmp_agent_parse(data, length, out_data, out_length, sourceip)
X register u_char *data;
X int length;
X register u_char *out_data;
X int *out_length;
X u_long sourceip; /* possibly for authentication */
X{
X u_char msg_type, type;


X long zero = 0;

X long reqid, errstat, errindex;
X register u_char *out_auth, *out_header, *out_reqid;
X u_char *startData = data;
X int startLength = length;
X long version;
X int header_shift, auth_shift;
X
X sidlen = SID_MAX_LEN;
X data = snmp_auth_parse(data, &length, sid, &sidlen, &version); /* authenticates message and returns length if valid */


X if (data == NULL){

X ERROR("bad authentication");
X /* send auth fail trap */
X return 0;
X }


X if (version != SNMP_VERSION_1){

X ERROR("wrong version");
X return NULL;
X }
X community = get_community(sid);
X if (community == -1)
X return NULL;


X data = asn_parse_header(data, &length, &msg_type);
X if (data == NULL){

X ERROR("bad header");
X return 0;
X }
X if (msg_type != GET_REQ_MSG && msg_type != GETNEXT_REQ_MSG && msg_type != SET_REQ_MSG){
X return 0;
X }
X data = asn_parse_int(data, &length, &type, &reqid, sizeof(reqid));


X if (data == NULL){

X ERROR("bad parse of reqid");


X return 0;
X }
X

X data = asn_parse_int(data, &length, &type, &errstat, sizeof(errstat));


X if (data == NULL){

X ERROR("bad parse of errstat");
X return 0;
X }
X data = asn_parse_int(data, &length, &type, &errindex, sizeof(errindex));


X if (data == NULL){

X ERROR("bad parse of errindex");
X return 0;
X }
X /*
X * Now start cobbling together what is known about the output packet.
X * The final lengths are not known now, so they will have to be recomputed
X * later.
X */
X out_auth = out_data;
X out_header = snmp_auth_build(out_auth, out_length, sid, &sidlen, &zero, 0);


X if (out_header == NULL){

X ERROR("snmp_auth_build failed");
X return 0;
X }
X out_reqid = asn_build_header(out_header, out_length, (u_char)GET_RSP_MSG, 0);
X if (out_reqid == NULL){
X ERROR("");


X return 0;
X }
X

X type = (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
X /* return identical request id */
X out_data = asn_build_int(out_reqid, out_length, type, &reqid, sizeof(reqid));


X if (out_data == NULL){

X ERROR("build reqid failed");


X return 0;
X }
X

X /* assume that error status will be zero */
X out_data = asn_build_int(out_data, out_length, type, &zero, sizeof(zero));


X if (out_data == NULL){

X ERROR("build errstat failed");


X return 0;
X }
X

X /* assume that error index will be zero */
X out_data = asn_build_int(out_data, out_length, type, &zero, sizeof(zero));


X if (out_data == NULL){

X ERROR("build errindex failed");
X return 0;
X }
X errstat = parse_var_op_list(data, length, out_data, *out_length, msg_type, &errindex, 0);
X if (msg_type == SET_REQ_MSG && errstat == SNMP_ERR_NOERROR){
X /*
X * SETS require 2 passes through the var_op_list. The first pass verifies that
X * all types, lengths, and values are valid, and the second does the set. Then
X * the identical GET RESPONSE packet is returned.
X */
X errstat = parse_var_op_list(data, length, out_data, *out_length, msg_type, &errindex, 1);
X if (create_identical(startData, out_auth, startLength, 0L, 0L)) {
X *out_length = packet_end - out_auth; /* AU: Have to set this! */
X return 1;
X }
X return 0;
X }
X switch((short)errstat){
X case SNMP_ERR_NOERROR:


X /*
X * Because of the assumption above that header lengths would be encoded
X * in one byte, things need to be fixed, now that the actual lengths are known.
X */

X header_shift = 0;
X *out_length = packet_end - out_reqid;
X if (*out_length >= 0x80){
X header_shift++;
X if (*out_length > 0xFF)
X header_shift++;
X }
X auth_shift = 0;
X *out_length = (packet_end - out_auth) - 2 + header_shift;
X if (*out_length >= 0x80){
X auth_shift++;
X if (*out_length > 0xFF)
X auth_shift++;
X }
X if (auth_shift + header_shift){
X /*
X * Shift packet (from request id to end of packet) by the sum of the


X * necessary shift counts.
X */

X shift_array(out_reqid, packet_end - out_reqid, auth_shift + header_shift);


X /* Now adjust pointers into the packet */

X packet_end += auth_shift + header_shift;
X out_reqid += auth_shift + header_shift;


X out_header += auth_shift;
X }
X

X /* re-encode the headers with the real lengths */
X out_data = out_header;
X *out_length = packet_end - out_reqid;
X out_data = asn_build_header(out_data, out_length, GET_RSP_MSG, *out_length);
X if (out_data != out_reqid){
X ERROR("internal error: header");


X return 0;
X }
X

X out_data = out_auth;
X *out_length = packet_end - out_auth;
X out_data = snmp_auth_build(out_data, out_length, sid, &sidlen, &zero, packet_end - out_header);


X if (out_data != out_header){

X ERROR("internal error");
X return 0;
X }
X break;
X case SNMP_ERR_NOSUCHNAME:
X case SNMP_ERR_TOOBIG:
X case SNMP_ERR_BADVALUE:
X case SNMP_ERR_READONLY:
X case SNMP_ERR_GENERR:
X if (create_identical(startData, out_auth, startLength, errstat, errindex))
X break;
X return 0;
X default:
X return 0;
X }
X *out_length = packet_end - out_auth;
X return 1;
X}
X
X/*
X * Parse_var_op_list goes through the list of variables and retrieves each one,
X * placing it's value in the output packet. If doSet is non-zero, the variable is set
X * with the value in the packet. If any error occurs, an error code is returned.
X */
Xint
Xparse_var_op_list(data, length, out_data, out_length, msgtype, index, doSet)
X register u_char *data;
X int length;
X register u_char *out_data;
X int out_length;
X u_char msgtype;
X register long *index;
X int doSet;
X{
X u_char type;
X oid var_name[MAX_NAME_LEN];
X int var_name_len, var_val_len;
X u_char var_val_type, *var_val, statType;
X u_char far *statP;
X int statLen;
X u_short acl;
X int rw, exact;
X int (*write_method)();
X u_char *headerP, *var_list_start;
X int dummyLen;
X int header_shift;
X u_char far *getStatPtr();
X
X if (msgtype == SET_REQ_MSG)
X rw = WRITE;
X else
X rw = READ;
X if (msgtype == GETNEXT_REQ_MSG)
X exact = FALSE;
X else
X exact = TRUE;


X data = asn_parse_header(data, &length, &type);
X if (data == NULL){

X ERROR("not enough space for varlist");
X return PARSE_ERROR;
X }


X if (type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR)){

X ERROR("wrong type");

X return PARSE_ERROR;
X }
X headerP = out_data;
X out_data = asn_build_header(out_data, &out_length, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), 0);


X if (out_data == NULL){

X ERROR("not enough space in output packet");
X return BUILD_ERROR;
X }
X var_list_start = out_data;
X
X *index = 1;
X while((int)length > 0){
X /* parse the name, value pair */
X var_name_len = MAX_NAME_LEN;
X data = snmp_parse_var_op(data, var_name, &var_name_len, &var_val_type, &var_val_len, &var_val, (int *)&length);


X if (data == NULL)

X return PARSE_ERROR;
X /* now attempt to retrieve the variable on the local entity */
X statP = getStatPtr(var_name, &var_name_len, &statType, &statLen, &acl, exact, &write_method);
X if (statP == NULL)
X return SNMP_ERR_NOSUCHNAME;
X /* Check if this user has access rights to this variable */
X if (!snmp_access(acl, community, rw))
X return SNMP_ERR_NOSUCHNAME; /* bogus */
X if (msgtype == SET_REQ_MSG){
X if (write_method == 0){
X /* see if the type and value is consistent with this entities variable */
X if (!goodValue(var_val_type, var_val_len, statType, statLen)){
X return SNMP_ERR_BADVALUE;
X }
X /* actually do the set if necessary */
X if (doSet)
X setVariable(var_val, var_val_type, var_val_len, statP, statLen);
X } else {
X if (!(*write_method)(doSet, var_val, var_val_type, var_val_len, statP))
X return SNMP_ERR_BADVALUE;
X }
X }
X /* retrieve the value of the variable and place it into the outgoing packet */
X out_data = snmp_build_var_op(out_data, var_name, &var_name_len, statType, statLen, statP, &out_length);


X if (out_data == NULL){

X return SNMP_ERR_TOOBIG;
X }
X
X (*index)++;
X }
X packet_end = out_data; /* save a pointer to the end of the packet */
X


X /*
X * Because of the assumption above that header lengths would be encoded
X * in one byte, things need to be fixed, now that the actual lengths are known.
X */

X header_shift = 0;
X out_length = packet_end - var_list_start;
X if (out_length >= 0x80){
X header_shift++;
X if (out_length > 0xFF)


X header_shift++;
X }
X if (header_shift){

X shift_array(var_list_start, packet_end - var_list_start, header_shift);
X packet_end += header_shift;
X var_list_start += header_shift;
X }
X


X /* Now rebuild header with the actual lengths */

X dummyLen = packet_end - var_list_start;
X if (asn_build_header(headerP, &dummyLen, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), dummyLen) == NULL){
X return SNMP_ERR_TOOBIG; /* bogus error ???? */
X }
X *index = 0;
X return SNMP_ERR_NOERROR;
X}
X
X/*
X * create a packet identical to the input packet, except for the error status
X * and the error index which are set according to the input variables.
X * Returns 1 upon success and 0 upon failure.
X */
Xint
Xcreate_identical(snmp_in, snmp_out, snmp_length, errstat, errindex)
X u_char *snmp_in;
X u_char *snmp_out;
X int snmp_length;
X long errstat, errindex;
X{
X register u_char *data;
X u_char type;
X u_long dummy;
X int length, headerLength;
X register u_char *headerPtr, *reqidPtr, *errstatPtr, *errindexPtr, *varListPtr;
X
X bcopy((char far *)snmp_in, (char far *)snmp_out, snmp_length);
X length = snmp_length;
X headerPtr = snmp_auth_parse(snmp_out, &length, sid, &sidlen, (long *)&dummy);
X if (headerPtr == NULL)
X return 0;
X reqidPtr = asn_parse_header(headerPtr, &length, (u_char *)&dummy);
X if (reqidPtr == NULL)
X return 0;
X headerLength = length;
X errstatPtr = asn_parse_int(reqidPtr, &length, &type, (long *)&dummy, sizeof dummy); /* request id */
X if (errstatPtr == NULL)
X return 0;
X errindexPtr = asn_parse_int(errstatPtr, &length, &type, (long *)&dummy, sizeof dummy); /* error status */
X if (errindexPtr == NULL)
X return 0;
X varListPtr = asn_parse_int(errindexPtr, &length, &type, (long *)&dummy, sizeof dummy); /* error index */
X if (varListPtr == NULL)
X return 0;
X
X data = asn_build_header(headerPtr, &headerLength, GET_RSP_MSG, headerLength);
X if (data != reqidPtr)
X return 0;
X length = snmp_length;
X type = (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
X data = asn_build_int(errstatPtr, &length, type, &errstat, sizeof errstat);
X if (data != errindexPtr)
X return 0;
X data = asn_build_int(errindexPtr, &length, type, &errindex, sizeof errindex);
X if (data != varListPtr)
X return 0;
X packet_end = snmp_out + snmp_length;


X return 1;
X}
X

X#ifdef KINETICS
Xstruct pbuf *
XdefinitelyGetBuf(){
X register struct pbuf *p;
X
X K_PGET(PT_DATA, p);
X while(p == 0){
X#ifdef notdef
X if (pq->pq_head != NULL){
X K_PDEQ(SPLIMP, pq, p);
X if (p) K_PFREE(p);
X } else if (sendq->pq_head != NULL){
X K_PDEQ(SPLIMP, sendq, p);
X if (p) K_PFREE(p);
X }
X#endif
X K_PGET(PT_DATA, p);
X }
X return p;
X}
X#endif
X
Xint
Xsnmp_access(acl, community, rw)
X u_short acl;
X int community;
X int rw;
X{
X /*
X * Each group has 2 bits, the more significant one is for read access,
X * the less significant one is for write access.
X */
X
X community <<= 1; /* multiply by two two shift two bits at a time */
X if (rw == READ){
X return (acl & (2 << community)); /* return the correct bit */
X } else {
X return (acl & (1 << community));
X }
X}
X
Xint
Xget_community(sessionid)
X u_char *sessionid;
X{
X int count;
X
X for(count = 0; count < NUM_COMMUNITIES; count++){
X if (!strcmp(communities[count], (char *)sessionid))
X break;
X }
X if (count == NUM_COMMUNITIES)
X return -1;


X return count;
X}
X

Xint
XgoodValue(inType, inLen, actualType, actualLen)
X u_char inType, actualType;
X int inLen, actualLen;
X{
X if (inLen > actualLen)
X return FALSE;
X return (inType == actualType);
X}
X
XsetVariable(var_val, var_val_type, var_val_len, statP, statLen)


X u_char *var_val;
X u_char var_val_type;
X int var_val_len;

X u_char far *statP;
X int statLen;
X{
X int buffersize = 1000;
X
X switch(var_val_type){


X case ASN_INTEGER:
X case COUNTER:
X case GAUGE:
X case TIMETICKS:

X asn_parse_int(var_val, &buffersize, &var_val_type, (long *)statP, statLen);


X break;
X case ASN_OCTET_STR:
X case IPADDRESS:
X case OPAQUE:

X asn_parse_string(var_val, &buffersize, &var_val_type, statP, &statLen);


X break;
X case ASN_OBJECT_ID:

X asn_parse_objid(var_val, &buffersize, &var_val_type, (oid *)statP, &statLen);
X break;
X }
X}
X
X
END_OF_FILE
if test 18099 -ne `wc -c <'netramet/src/apps/snmpagnt.c'`; then
echo shar: \"'netramet/src/apps/snmpagnt.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpagnt.c'
fi
if test -f 'netramet/src/snmplib/mib.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/mib.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/mib.c'\" \(17927 characters\)
sed "s/^X//" >'netramet/src/snmplib/mib.c' <<'END_OF_FILE'


X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <stdio.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <sys/time.h>
X#include "ausnmp.h"
X#include "asn1.h"
X#include "snmpimpl.h"
X#include "snmpapi.h"
X#include "parse.h"
X
Xstatic void sprint_by_type();
X
Xstatic char *
XuptimeString(timeticks, buf)
X register long timeticks;
X char *buf;


X{
X int seconds, minutes, hours, days;
X
X timeticks /= 100;
X days = timeticks / (60 * 60 * 24);
X timeticks %= (60 * 60 * 24);
X
X hours = timeticks / (60 * 60);
X timeticks %= (60 * 60);
X
X minutes = timeticks / 60;
X seconds = timeticks % 60;
X
X if (days == 0){
X sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
X } else if (days == 1) {

X sprintf(buf, "%d day, %d:%02d:%02d", days, hours, minutes, seconds);
X } else {
X sprintf(buf, "%d days, %d:%02d:%02d", days, hours, minutes, seconds);


X }
X return buf;
X}
X

Xstatic sprint_hexstring(buf, cp, len)
X char *buf;
X u_char *cp;


X int len;
X{
X

X for(; len >= 16; len -= 16){
X sprintf(buf, "%02X %02X %02X %02X %02X %02X %02X %02X ", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
X buf += strlen(buf);
X cp += 8;
X sprintf(buf, "%02X %02X %02X %02X %02X %02X %02X %02X\n", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
X buf += strlen(buf);
X cp += 8;
X }
X for(; len > 0; len--){
X sprintf(buf, "%02X ", *cp++);
X buf += strlen(buf);
X }
X *buf = '\0';
X}
X
Xstatic sprint_asciistring(buf, cp, len)
X char *buf;
X u_char *cp;
X int len;
X{
X int x;
X
X for(x = 0; x < len; x++){
X if (isprint(*cp)){
X *buf++ = *cp++;
X } else {
X *buf++ = '.';
X cp++;
X }
X if ((x % 48) == 47)
X *buf++ = '\n';
X }
X *buf = '\0';
X}
X
X#ifdef UNUSED
Xint
Xread_rawobjid(input, output, out_len)
X char *input;
X oid *output;
X int *out_len;
X{
X char buf[12], *cp;
X oid *op = output;
X u_long subid;
X
X while(*input != '\0'){
X if (!isdigit(*input))
X break;
X cp = buf;
X while(isdigit(*input))
X *cp++ = *input++;
X *cp = '\0';
X subid = atoi(buf);
X if(subid > MAX_SUBID){
X fprintf(stderr, "sub-identifier too large: %s\n", buf);
X return 0;
X }
X if((*out_len)-- <= 0){
X fprintf(stderr, "object identifier too long\n");
X return 0;
X }
X *op++ = subid;
X if(*input++ != '.')
X break;
X }
X *out_len = op - output;
X if (*out_len == 0)
X return 0;


X return 1;
X}
X

X#endif /* UNUSED */
X
Xstatic void
Xsprint_octet_string(buf, var)
X char *buf;


X struct variable_list *var;
X{

X int hex, x;
X u_char *cp;
X
X if (var->type != ASN_OCTET_STR){
X sprintf(buf, "Wrong Type (should be OCTET STRING): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X hex = 0;
X for(cp = var->val.string, x = 0; x < var->val_len; x++, cp++){
X if (!(isprint(*cp) || isspace(*cp)))
X hex = 1;
X }
X if (var->val_len <= 4)
X hex = 1; /* not likely to be ascii */
X if (hex){
X sprintf(buf, "OCTET STRING- (hex):\t");
X buf += strlen(buf);
X sprint_hexstring(buf, var->val.string, var->val_len);
X } else {
X sprintf(buf, "OCTET STRING- (ascii):\t");
X buf += strlen(buf);
X sprint_asciistring(buf, var->val.string, var->val_len);
X }
X}
X
Xstatic void
Xsprint_opaque(buf, var)
X char *buf;


X struct variable_list *var;
X{
X

X if (var->type != OPAQUE){
X sprintf(buf, "Wrong Type (should be Opaque): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "OPAQUE - (hex):\t");
X buf += strlen(buf);
X sprint_hexstring(buf, var->val.string, var->val_len);
X}
X
Xstatic void
Xsprint_object_identifier(buf, var)
X char *buf;


X struct variable_list *var;
X{

X if (var->type != ASN_OBJECT_ID){
X sprintf(buf, "Wrong Type (should be OBJECT IDENTIFIER): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "OBJECT IDENTIFIER:\t");
X buf += strlen(buf);
X sprint_objid(buf, (oid *)(var->val.objid), var->val_len / sizeof(oid));
X}
X
Xstatic void
Xsprint_timeticks(buf, var)
X char *buf;


X struct variable_list *var;
X{

X char timebuf[32];
X
X if (var->type != TIMETICKS){
X sprintf(buf, "Wrong Type (should be Timeticks): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "Timeticks: (%d) %s", *(var->val.integer), uptimeString(*(var->val.integer), timebuf));
X}
X
Xstatic void
Xsprint_integer(buf, var, enums)
X char *buf;
X struct variable_list *var;
X struct enum_list *enums;
X{
X char *enum_string = NULL;
X
X if (var->type != ASN_INTEGER){
X sprintf(buf, "Wrong Type (should be INTEGER): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X for (; enums; enums = enums->next)
X if (enums->value == *var->val.integer){
X enum_string = enums->label;
X break;
X }
X if (enum_string == NULL)
X sprintf(buf, "INTEGER: %d", *var->val.integer);
X else
X sprintf(buf, "INTEGER: %s(%d)", enum_string, *var->val.integer);
X}
X
Xstatic void
Xsprint_gauge(buf, var)
X char *buf;


X struct variable_list *var;
X{

X if (var->type != GAUGE){
X sprintf(buf, "Wrong Type (should be Gauge): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "Gauge: %lu", *var->val.integer);
X}
X
Xstatic void
Xsprint_counter(buf, var)
X char *buf;


X struct variable_list *var;
X{

X if (var->type != COUNTER){
X sprintf(buf, "Wrong Type (should be Counter): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "Counter: %lu", *var->val.integer);
X}
X
Xstatic void
Xsprint_networkaddress(buf, var)
X char *buf;


X struct variable_list *var;
X{

X int x, len;
X u_char *cp;
X
X sprintf(buf, "Network Address:\t");
X buf += strlen(buf);
X cp = var->val.string;
X len = var->val_len;
X for(x = 0; x < len; x++){
X sprintf(buf, "%02X", *cp++);
X buf += strlen(buf);
X if (x < (len - 1))
X *buf++ = ':';
X }
X}
X
Xstatic void
Xsprint_ipaddress(buf, var)
X char *buf;


X struct variable_list *var;
X{

X u_char *ip;
X
X if (var->type != IPADDRESS){
X sprintf(buf, "Wrong Type (should be Ipaddress): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X ip = var->val.string;
X sprintf(buf, "IpAddress:\t%d.%d.%d.%d",ip[0], ip[1], ip[2], ip[3]);
X}
X
Xstatic void
Xsprint_unsigned_short(buf, var)
X char *buf;


X struct variable_list *var;
X{

X if (var->type != ASN_INTEGER){
X sprintf(buf, "Wrong Type (should be INTEGER): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "INTEGER (0..65535): %lu", *var->val.integer);
X}
X
Xstatic void
Xsprint_null(buf, var)
X char *buf;


X struct variable_list *var;
X{

X if (var->type != ASN_NULL){
X sprintf(buf, "Wrong Type (should be NULL): ");
X buf += strlen(buf);
X sprint_by_type(buf, var, (struct enum_list *)NULL);
X return;
X }
X sprintf(buf, "NULL");
X}
X
Xstatic void
Xsprint_unknowntype(buf, var)
X char *buf;
X struct variable_list *var;
X{
X/* sprintf(buf, "Variable has bad type"); */
X sprint_by_type(buf, var, NULL);
X}
X
Xstatic void
Xsprint_badtype(buf)
X char *buf;
X{
X sprintf(buf, "Variable has bad type");
X}
X
Xstatic void
Xsprint_by_type(buf, var, enums)
X char *buf;
X struct variable_list *var;
X struct enum_list *enums;
X{
X switch (var->type){
X case ASN_INTEGER:
X sprint_integer(buf, var, enums);


X break;
X case ASN_OCTET_STR:

X sprint_octet_string(buf, var);


X break;
X case OPAQUE:

X sprint_opaque(buf, var);


X break;
X case ASN_OBJECT_ID:

X sprint_object_identifier(buf, var);


X break;
X case TIMETICKS:

X sprint_timeticks(buf, var);


X break;
X case GAUGE:

X sprint_gauge(buf, var);


X break;
X case COUNTER:

X sprint_counter(buf, var);
X break;
X case IPADDRESS:
X sprint_ipaddress(buf, var);


X break;
X case ASN_NULL:

X sprint_null(buf, var);
X break;
X default:
X sprint_badtype(buf);


X break;
X }
X}
X

Xstruct tree *get_symbol();
X
Xoid RFC1066_MIB[] = { 1, 3, 6, 1, 2, 1 };
Xunsigned char RFC1066_MIB_text[] = ".iso.org.dod.internet.mgmt.mib";
Xstruct tree *Mib;
X
Xinit_mib()
X{
X char *file, *getenv();
X
X Mib = 0;
X file = getenv("MIBFILE");
X if (file)
X Mib = read_mib(file);
X if (!Mib)
X Mib = read_mib("mib.txt");
X if (!Mib)
X Mib = read_mib("/etc/mib.txt");
X if (!Mib){
X fprintf(stderr, "Couldn't find mib file\n");
X exit(2);
X }
X set_functions(Mib);
X}
X
Xstatic
Xset_functions(subtree)
X struct tree *subtree;
X{
X for(; subtree; subtree = subtree->next_peer){
X switch(subtree->type){
X case TYPE_OBJID:
X subtree->printer = sprint_object_identifier;
X break;
X case TYPE_OCTETSTR:
X subtree->printer = sprint_octet_string;
X break;
X case TYPE_INTEGER:
X subtree->printer = sprint_integer;
X break;
X case TYPE_NETADDR:
X subtree->printer = sprint_networkaddress;
X break;
X case TYPE_IPADDR:
X subtree->printer = sprint_ipaddress;
X break;
X case TYPE_COUNTER:
X subtree->printer = sprint_counter;
X break;
X case TYPE_GAUGE:
X subtree->printer = sprint_gauge;
X break;
X case TYPE_TIMETICKS:
X subtree->printer = sprint_timeticks;
X break;
X case TYPE_OPAQUE:
X subtree->printer = sprint_opaque;
X break;
X case TYPE_NULL:
X subtree->printer = sprint_null;
X break;
X case TYPE_OTHER:
X default:
X subtree->printer = sprint_unknowntype;
X break;
X }
X set_functions(subtree->child_list);
X }
X}
X
X#ifdef testing


Xint snmp_dump_packet = 0;
X

Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X oid objid[64];
X int objidlen = sizeof (objid);
X int count;
X struct variable variable;
X
X init_mib(&Mib);
X if (argc < 2)
X print_subtree(Mib, 0);
X variable.type = ASN_INTEGER;
X variable.val.integer = 3;
X variable.val_len = 4;
X for (argc--; argc; argc--, argv++) {
X objidlen = sizeof (objid);
X printf("read_objid(%s) = %d\n",
X argv[1], read_objid(argv[1], objid, &objidlen));
X for(count = 0; count < objidlen; count++)
X printf("%d.", objid[count]);
X printf("\n");
X print_variable(objid, objidlen, &variable);
X }
X}
X
X#endif testing


X
X
Xstatic struct tree *

Xfind_rfc1066_mib(root)
X struct tree *root;
X{
X oid *op = RFC1066_MIB;
X struct tree *tp;
X int len;
X
X for(len = sizeof(RFC1066_MIB)/sizeof(oid); len; len--, op++){
X for(tp = root; tp; tp = tp->next_peer){
X if (tp->subid == *op){
X root = tp->child_list;
X break;
X }
X }
X if (tp == NULL)
X return NULL;
X }
X return root;
X}
X
Xint read_objid(input, output, out_len)
X char *input;
X oid *output;
X int *out_len; /* number of subid's in "output" */
X{
X struct tree *root = Mib;
X oid *op = output;
X int i;
X
X if (*input == '.')
X input++;
X else {
X root = find_rfc1066_mib(root);
X for (i = 0; i < sizeof (RFC1066_MIB)/sizeof(oid); i++) {
X if ((*out_len)-- > 0)
X *output++ = RFC1066_MIB[i];
X else {
X fprintf(stderr, "object identifier too long\n");
X return (0);
X }
X }
X }
X
X if (root == NULL){
X fprintf(stderr, "Mib not initialized. Exiting.\n");
X exit(1);
X }
X if ((*out_len =
X parse_subtree(root, input, output, out_len)) == 0)
X return (0);
X *out_len += output - op;
X
X return (1);
X}
X
Xstatic
Xparse_subtree(subtree, input, output, out_len)
X struct tree *subtree;
X char *input;
X oid *output;
X int *out_len; /* number of subid's */
X{
X char buf[128], *to = buf;
X u_long subid = 0;
X struct tree *tp;
X
X /*
X * No empty strings. Can happen if there is a trailing '.' or two '.'s
X * in a row, i.e. "..".
X */
X if ((*input == '\0') ||
X (*input == '.'))
X return (0);
X
X if (isdigit(*input)) {
X /*
X * Read the number, then try to find it in the subtree.
X */
X while (isdigit(*input)) {
X subid *= 10;
X subid += *input++ - '0';
X }
X for (tp = subtree; tp; tp = tp->next_peer) {
X if (tp->subid == subid)
X goto found;
X }
X tp = NULL;
X }
X else {
X /*
X * Read the name into a buffer.
X */
X while ((*input != '\0') &&
X (*input != '.')) {
X *to++ = *input++;
X }
X *to = '\0';
X
X /*
X * Find the name in the subtree;
X */
X for (tp = subtree; tp; tp = tp->next_peer) {
X if (lc_cmp(tp->label, buf) == 0) {
X subid = tp->subid;
X goto found;


X }
X }
X
X /*

X * If we didn't find the entry, punt...
X */


X if (tp == NULL) {

X fprintf(stderr, "sub-identifier not found: %s\n", buf);
X return (0);
X }
X }
X
Xfound:
X if(subid > (u_long)MAX_SUBID){
X fprintf(stderr, "sub-identifier too large: %s\n", buf);
X return (0);
X }
X
X if ((*out_len)-- <= 0){
X fprintf(stderr, "object identifier too long\n");
X return (0);
X }
X *output++ = subid;
X
X if (*input != '.')
X return (1);
X if ((*out_len =
X parse_subtree(tp ? tp->child_list : NULL, ++input, output, out_len)) == 0)
X return (0);
X return (++*out_len);
X}
X
Xprint_objid(objid, objidlen)
X oid *objid;
X int objidlen; /* number of subidentifiers */
X{
X char buf[256];
X struct tree *subtree = Mib;
X
X *buf = '.'; /* this is a fully qualified name */
X get_symbol(objid, objidlen, subtree, buf + 1);
X printf("%s\n", buf);
X
X}
X
Xsprint_objid(buf, objid, objidlen)
X char *buf;
X oid *objid;
X int objidlen; /* number of subidentifiers */
X{
X struct tree *subtree = Mib;
X
X *buf = '.'; /* this is a fully qualified name */
X get_symbol(objid, objidlen, subtree, buf + 1);
X}
X
X
Xprint_variable(objid, objidlen, variable)
X oid *objid;
X int objidlen;
X struct variable_list *variable;
X{
X char buf[512], *cp;
X struct tree *subtree = Mib;
X
X *buf = '.'; /* this is a fully qualified name */
X subtree = get_symbol(objid, objidlen, subtree, buf + 1);
X cp = buf;
X if ((strlen(buf) >= strlen((char *)RFC1066_MIB_text)) && !bcmp(buf, (char *)RFC1066_MIB_text,
X strlen((char *)RFC1066_MIB_text))){
X cp += sizeof(RFC1066_MIB_text);
X }
X printf("Name: %s\n", cp);
X *buf = '\0';
X if (subtree->printer)
X (*subtree->printer)(buf, variable, subtree->enums);
X else {
X sprint_by_type(buf, variable, subtree->enums);
X }
X printf("%s\n", buf);
X}
X
Xsprint_variable(buf, objid, objidlen, variable)
X char *buf;
X oid *objid;
X int objidlen;
X struct variable_list *variable;
X{
X char tempbuf[512], *cp;
X struct tree *subtree = Mib;
X
X *tempbuf = '.'; /* this is a fully qualified name */
X subtree = get_symbol(objid, objidlen, subtree, tempbuf + 1);
X cp = tempbuf;
X if ((strlen(buf) >= strlen((char *)RFC1066_MIB_text)) && !bcmp(buf, (char *)RFC1066_MIB_text,
X strlen((char *)RFC1066_MIB_text))){
X cp += sizeof(RFC1066_MIB_text);
X }
X sprintf(buf, "Name: %s\n", cp);
X buf += strlen(buf);
X if (subtree->printer)
X (*subtree->printer)(buf, variable, subtree->enums);
X else {
X sprint_by_type(buf, variable, subtree->enums);
X }
X strcat(buf, "\n");
X}
X
Xsprint_value(buf, objid, objidlen, variable)
X char *buf;
X oid *objid;
X int objidlen;
X struct variable_list *variable;
X{
X char tempbuf[512];
X struct tree *subtree = Mib;
X
X subtree = get_symbol(objid, objidlen, subtree, tempbuf);
X if (subtree->printer)
X (*subtree->printer)(buf, variable, subtree->enums);
X else {
X sprint_by_type(buf, variable, subtree->enums);
X }
X}
X
Xprint_value(objid, objidlen, variable)
X oid *objid;
X int objidlen;
X struct variable_list *variable;
X{
X char tempbuf[512];
X struct tree *subtree = Mib;
X
X subtree = get_symbol(objid, objidlen, subtree, tempbuf);
X if (subtree->printer)
X (*subtree->printer)(tempbuf, variable, subtree->enums);
X else {
X sprint_by_type(tempbuf, variable, subtree->enums);
X }
X printf("%s\n", tempbuf);


X}
X
Xstruct tree *

Xget_symbol(objid, objidlen, subtree, buf)
X oid *objid;
X int objidlen;
X struct tree *subtree;
X char *buf;
X{
X struct tree *return_tree = NULL;
X
X for(; subtree; subtree = subtree->next_peer){
X if (*objid == subtree->subid){
X strcpy(buf, subtree->label);
X goto found;
X }
X }
X
X /* subtree not found */
X while(objidlen--){ /* output rest of name, uninterpreted */
X sprintf(buf, "%u.", *objid++);
X while(*buf)
X buf++;
X }
X *(buf - 1) = '\0'; /* remove trailing dot */
X return NULL;
X
Xfound:
X if (objidlen > 1){
X while(*buf)
X buf++;
X *buf++ = '.';
X *buf = '\0';
X return_tree = get_symbol(objid + 1, objidlen - 1, subtree->child_list, buf);
X }
X if (return_tree != NULL)
X return return_tree;
X else
X return subtree;
X}
X
X
Xstatic int
Xlc_cmp(s1, s2)
X char *s1, *s2;
X{
X char c1, c2;
X
X while(*s1 && *s2){
X if (isupper(*s1))
X c1 = tolower(*s1);
X else
X c1 = *s1;
X if (isupper(*s2))
X c2 = tolower(*s2);
X else
X c2 = *s2;
X if (c1 != c2)
X return ((c1 - c2) > 0 ? 1 : -1);
X s1++;
X s2++;
X }
X
X if (*s1)
X return -1;
X if (*s2)


X return 1;
X return 0;

X}
X
END_OF_FILE
if test 17927 -ne `wc -c <'netramet/src/snmplib/mib.c'`; then
echo shar: \"'netramet/src/snmplib/mib.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/mib.c'
fi
if test -f 'netramet/src/snmplib/snmpagnt.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/snmpagnt.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/snmpagnt.c'\" \(18099 characters\)
sed "s/^X//" >'netramet/src/snmplib/snmpagnt.c' <<'END_OF_FILE'


X/*
X * Simple Network Management Protocol (RFC 1067).

X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#include "ausnmp.h"
X
X#ifdef KINETICS
X#include "gw.h"


X#include "ab.h"
X#include "inet.h"
X#include "fp4/cmdmacro.h"
X#include "fp4/pbuf.h"

X#include "glob.h"
X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>
X#ifndef NULL
X#define NULL 0
X#endif
X#endif

X
X#include "snmp.h"
X#include "snmpimpl.h" /* AU */
X#include "asn1.h"
X

X#include "mib.h"
X
Xvoid snmp_input();
Xvoid snmp_trap();
Xint create_identical();
Xint parse_var_op_list();
Xint snmp_access();
X
X#if kinetics
Xchar version_descr[];
Xoid version_id[];
Xint version_id_len;
X#endif
X
Xstruct pbuf *definitelyGetBuf();
X
X#define NUM_COMMUNITIES 5
Xchar *communities[NUM_COMMUNITIES] = {
X "public",
X "proxy",
X "private",
X "regional",
X "core"
X};
X
X/* these can't be global in a multi-process router */
X u_char sid[SID_MAX_LEN + 1];
X int sidlen;
X u_char *packet_end;
X int community;
X
X
X#ifdef KINETICS
Xvoid
Xsnmp_input(p)
X struct pbuf *p;
X{
X struct ip *ip = (struct ip *)p->p_off;
X int hlen = (int)ip->ip_hl << 2;
X register struct udp *udp;
X register u_char *data; /* pointer to the rest of the unread data */
X int length; /* bytes of data left in msg after the "data" pointer */
X struct pbuf *out_packet;
X register u_char *out_data;
X int out_length;
X u_short udp_src;
X extern struct mib_udp mib_udp;
X
X
X udp = (struct udp *)(p->p_off + hlen);
X if (ntohs(ip->ip_len) - hlen < sizeof(struct udp) || /* IP length < minimum UDP packet */
X ntohs(udp->length) > ntohs(ip->ip_len) - hlen){ /* UDP length > IP data */
X ERROR("dropped packet with bad length"); /* delete me */
X return; /* drop packet */
X }
X data = (u_char *)udp + sizeof(struct udp);
X length = ntohs(udp->length) - sizeof(struct udp);
X
X out_packet = definitelyGetBuf(); /* drop packets off input queue if necessary */
X out_data = (u_char *)(out_packet->p_off + sizeof (struct ip) + sizeof (struct udp));
X out_length = MAXDATA - sizeof(struct ip) - sizeof (struct udp);
X
XK_LEDON();
X if (!snmp_agent_parse(data, length, out_data, &out_length, (u_long)ip->ip_src)){
X K_PFREE(out_packet);
XK_LEDOFF();
X return;
X }
XK_LEDOFF();
X out_packet->p_len = packet_end - (u_char *)out_packet->p_off;
X setiphdr(out_packet, ip->ip_src); /* address to source of request packet (ntohl ??? ) */
X udp_src = ntohs(udp->src);
X udp = (struct udp *)(out_packet->p_off + sizeof (struct ip));
X udp->src = htons(SNMP_PORT);
X udp->dst = htons(udp_src);
X udp->length = out_packet->p_len - sizeof(struct ip);
X udp->checksum = 0; /* this should be computed */
X
X mib_udp.udpOutDatagrams++;
X routeip(out_packet, 0, 0);
X}
X
X
Xvoid
Xsnmp_trap(destAddr, trapType, specificType)
X u_long destAddr;


X int trapType;
X int specificType;

X{
X struct pbuf *out_packet;
X register u_char *out_data;
X register struct udp *udp;
X int out_length;
X static oid sysDescrOid[] = {1, 3, 6, 1, 2, 1, 1, 1, 0};
X
X out_packet = definitelyGetBuf(); /* drop packets off input queue if necessary */
X out_data = (u_char *)(out_packet->p_off + sizeof (struct ip) + sizeof (struct udp));
X out_length = MAXDATA - sizeof(struct ip) - sizeof (struct udp);
X
XK_LEDON();
X out_packet->p_len = snmp_build_trap(out_data, out_length, version_id, version_id_len,
X conf.ipaddr, trapType, specificType, TICKS2MS(tickclock)/10, sysDescrOid, sizeof(sysDescrOid)/sizeof(oid),
X ASN_OCTET_STR, strlen(version_descr), (u_char *)version_descr);
X if (out_packet->p_len == 0){
X K_PFREE(out_packet);
XK_LEDOFF();
X return;
X }
XK_LEDOFF();
X out_packet->p_len += sizeof(struct ip) + sizeof(struct udp);
X setiphdr(out_packet, destAddr); /* address to source of request packet (ntohl ??? ) */
X udp = (struct udp *)(out_packet->p_off + sizeof (struct ip));
X udp->src = htons(SNMP_PORT);
X udp->dst = htons(SNMP_TRAP_PORT);
X udp->length = out_packet->p_len - sizeof(struct ip);
X udp->checksum = 0; /* this should be computed */
X
X mib_udp.udpOutDatagrams++;
X routeip(out_packet, 0, 0);
X}
X#endif
X
Xint
Xsnmp_agent_parse(data, length, out_data, out_length, sourceip)
X register u_char *data;
X int length;
X register u_char *out_data;
X int *out_length;
X u_long sourceip; /* possibly for authentication */
X{
X u_char msg_type, type;


X long zero = 0;

X long reqid, errstat, errindex;
X register u_char *out_auth, *out_header, *out_reqid;
X u_char *startData = data;
X int startLength = length;
X long version;
X int header_shift, auth_shift;
X
X sidlen = SID_MAX_LEN;
X data = snmp_auth_parse(data, &length, sid, &sidlen, &version); /* authenticates message and returns length if valid */


X if (data == NULL){

X ERROR("bad authentication");
X /* send auth fail trap */
X return 0;
X }


X if (version != SNMP_VERSION_1){

X ERROR("wrong version");
X return NULL;
X }
X community = get_community(sid);
X if (community == -1)
X return NULL;


X data = asn_parse_header(data, &length, &msg_type);
X if (data == NULL){

X ERROR("bad header");
X return 0;
X }
X if (msg_type != GET_REQ_MSG && msg_type != GETNEXT_REQ_MSG && msg_type != SET_REQ_MSG){
X return 0;
X }
X data = asn_parse_int(data, &length, &type, &reqid, sizeof(reqid));


X if (data == NULL){

X ERROR("bad parse of reqid");


X return 0;
X }
X

X data = asn_parse_int(data, &length, &type, &errstat, sizeof(errstat));


X if (data == NULL){

X ERROR("bad parse of errstat");
X return 0;
X }
X data = asn_parse_int(data, &length, &type, &errindex, sizeof(errindex));


X if (data == NULL){

X ERROR("bad parse of errindex");
X return 0;
X }
X /*
X * Now start cobbling together what is known about the output packet.
X * The final lengths are not known now, so they will have to be recomputed
X * later.
X */
X out_auth = out_data;
X out_header = snmp_auth_build(out_auth, out_length, sid, &sidlen, &zero, 0);


X if (out_header == NULL){

X ERROR("snmp_auth_build failed");
X return 0;
X }
X out_reqid = asn_build_header(out_header, out_length, (u_char)GET_RSP_MSG, 0);
X if (out_reqid == NULL){
X ERROR("");


X return 0;
X }
X

X type = (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
X /* return identical request id */
X out_data = asn_build_int(out_reqid, out_length, type, &reqid, sizeof(reqid));


X if (out_data == NULL){

X ERROR("build reqid failed");


X return 0;
X }
X

X /* assume that error status will be zero */
X out_data = asn_build_int(out_data, out_length, type, &zero, sizeof(zero));


X if (out_data == NULL){

X ERROR("build errstat failed");


X return 0;
X }
X

X /* assume that error index will be zero */
X out_data = asn_build_int(out_data, out_length, type, &zero, sizeof(zero));


X if (out_data == NULL){

X ERROR("build errindex failed");
X return 0;
X }
X errstat = parse_var_op_list(data, length, out_data, *out_length, msg_type, &errindex, 0);
X if (msg_type == SET_REQ_MSG && errstat == SNMP_ERR_NOERROR){
X /*
X * SETS require 2 passes through the var_op_list. The first pass verifies that
X * all types, lengths, and values are valid, and the second does the set. Then
X * the identical GET RESPONSE packet is returned.
X */
X errstat = parse_var_op_list(data, length, out_data, *out_length, msg_type, &errindex, 1);
X if (create_identical(startData, out_auth, startLength, 0L, 0L)) {
X *out_length = packet_end - out_auth; /* AU: Have to set this! */
X return 1;
X }
X return 0;
X }
X switch((short)errstat){
X case SNMP_ERR_NOERROR:


X /*
X * Because of the assumption above that header lengths would be encoded
X * in one byte, things need to be fixed, now that the actual lengths are known.
X */

X header_shift = 0;
X *out_length = packet_end - out_reqid;
X if (*out_length >= 0x80){
X header_shift++;
X if (*out_length > 0xFF)
X header_shift++;
X }
X auth_shift = 0;
X *out_length = (packet_end - out_auth) - 2 + header_shift;
X if (*out_length >= 0x80){
X auth_shift++;
X if (*out_length > 0xFF)
X auth_shift++;
X }
X if (auth_shift + header_shift){
X /*
X * Shift packet (from request id to end of packet) by the sum of the


X * necessary shift counts.
X */

X shift_array(out_reqid, packet_end - out_reqid, auth_shift + header_shift);


X /* Now adjust pointers into the packet */

X packet_end += auth_shift + header_shift;
X out_reqid += auth_shift + header_shift;


X out_header += auth_shift;
X }
X

X /* re-encode the headers with the real lengths */
X out_data = out_header;
X *out_length = packet_end - out_reqid;
X out_data = asn_build_header(out_data, out_length, GET_RSP_MSG, *out_length);
X if (out_data != out_reqid){
X ERROR("internal error: header");


X return 0;
X }
X

X out_data = out_auth;
X *out_length = packet_end - out_auth;
X out_data = snmp_auth_build(out_data, out_length, sid, &sidlen, &zero, packet_end - out_header);


X if (out_data != out_header){

X ERROR("internal error");
X return 0;
X }
X break;
X case SNMP_ERR_NOSUCHNAME:
X case SNMP_ERR_TOOBIG:
X case SNMP_ERR_BADVALUE:
X case SNMP_ERR_READONLY:
X case SNMP_ERR_GENERR:
X if (create_identical(startData, out_auth, startLength, errstat, errindex))
X break;
X return 0;
X default:
X return 0;
X }
X *out_length = packet_end - out_auth;
X return 1;
X}
X
X/*
X * Parse_var_op_list goes through the list of variables and retrieves each one,
X * placing it's value in the output packet. If doSet is non-zero, the variable is set
X * with the value in the packet. If any error occurs, an error code is returned.
X */
Xint
Xparse_var_op_list(data, length, out_data, out_length, msgtype, index, doSet)
X register u_char *data;
X int length;
X register u_char *out_data;
X int out_length;
X u_char msgtype;
X register long *index;
X int doSet;
X{
X u_char type;
X oid var_name[MAX_NAME_LEN];
X int var_name_len, var_val_len;
X u_char var_val_type, *var_val, statType;
X u_char far *statP;
X int statLen;
X u_short acl;
X int rw, exact;
X int (*write_method)();
X u_char *headerP, *var_list_start;
X int dummyLen;
X int header_shift;
X u_char far *getStatPtr();
X
X if (msgtype == SET_REQ_MSG)
X rw = WRITE;
X else
X rw = READ;
X if (msgtype == GETNEXT_REQ_MSG)
X exact = FALSE;
X else
X exact = TRUE;


X data = asn_parse_header(data, &length, &type);
X if (data == NULL){

X ERROR("not enough space for varlist");
X return PARSE_ERROR;
X }


X if (type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR)){

X ERROR("wrong type");

X return PARSE_ERROR;
X }
X headerP = out_data;
X out_data = asn_build_header(out_data, &out_length, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), 0);


X if (out_data == NULL){

X ERROR("not enough space in output packet");
X return BUILD_ERROR;
X }
X var_list_start = out_data;
X
X *index = 1;
X while((int)length > 0){
X /* parse the name, value pair */
X var_name_len = MAX_NAME_LEN;
X data = snmp_parse_var_op(data, var_name, &var_name_len, &var_val_type, &var_val_len, &var_val, (int *)&length);


X if (data == NULL)

X return PARSE_ERROR;
X /* now attempt to retrieve the variable on the local entity */
X statP = getStatPtr(var_name, &var_name_len, &statType, &statLen, &acl, exact, &write_method);
X if (statP == NULL)
X return SNMP_ERR_NOSUCHNAME;
X /* Check if this user has access rights to this variable */
X if (!snmp_access(acl, community, rw))
X return SNMP_ERR_NOSUCHNAME; /* bogus */
X if (msgtype == SET_REQ_MSG){
X if (write_method == 0){
X /* see if the type and value is consistent with this entities variable */
X if (!goodValue(var_val_type, var_val_len, statType, statLen)){
X return SNMP_ERR_BADVALUE;
X }
X /* actually do the set if necessary */
X if (doSet)
X setVariable(var_val, var_val_type, var_val_len, statP, statLen);
X } else {
X if (!(*write_method)(doSet, var_val, var_val_type, var_val_len, statP))
X return SNMP_ERR_BADVALUE;
X }
X }
X /* retrieve the value of the variable and place it into the outgoing packet */
X out_data = snmp_build_var_op(out_data, var_name, &var_name_len, statType, statLen, statP, &out_length);


X if (out_data == NULL){

X return SNMP_ERR_TOOBIG;
X }
X
X (*index)++;
X }
X packet_end = out_data; /* save a pointer to the end of the packet */
X


X /*
X * Because of the assumption above that header lengths would be encoded
X * in one byte, things need to be fixed, now that the actual lengths are known.
X */

X header_shift = 0;
X out_length = packet_end - var_list_start;
X if (out_length >= 0x80){
X header_shift++;
X if (out_length > 0xFF)


X header_shift++;
X }
X if (header_shift){

X shift_array(var_list_start, packet_end - var_list_start, header_shift);
X packet_end += header_shift;
X var_list_start += header_shift;
X }
X


X /* Now rebuild header with the actual lengths */

X dummyLen = packet_end - var_list_start;
X if (asn_build_header(headerP, &dummyLen, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), dummyLen) == NULL){
X return SNMP_ERR_TOOBIG; /* bogus error ???? */
X }
X *index = 0;
X return SNMP_ERR_NOERROR;
X}
X
X/*
X * create a packet identical to the input packet, except for the error status
X * and the error index which are set according to the input variables.
X * Returns 1 upon success and 0 upon failure.
X */
Xint
Xcreate_identical(snmp_in, snmp_out, snmp_length, errstat, errindex)
X u_char *snmp_in;
X u_char *snmp_out;
X int snmp_length;
X long errstat, errindex;
X{
X register u_char *data;
X u_char type;
X u_long dummy;
X int length, headerLength;
X register u_char *headerPtr, *reqidPtr, *errstatPtr, *errindexPtr, *varListPtr;
X
X bcopy((char far *)snmp_in, (char far *)snmp_out, snmp_length);
X length = snmp_length;
X headerPtr = snmp_auth_parse(snmp_out, &length, sid, &sidlen, (long *)&dummy);
X if (headerPtr == NULL)
X return 0;
X reqidPtr = asn_parse_header(headerPtr, &length, (u_char *)&dummy);
X if (reqidPtr == NULL)
X return 0;
X headerLength = length;
X errstatPtr = asn_parse_int(reqidPtr, &length, &type, (long *)&dummy, sizeof dummy); /* request id */
X if (errstatPtr == NULL)
X return 0;
X errindexPtr = asn_parse_int(errstatPtr, &length, &type, (long *)&dummy, sizeof dummy); /* error status */
X if (errindexPtr == NULL)
X return 0;
X varListPtr = asn_parse_int(errindexPtr, &length, &type, (long *)&dummy, sizeof dummy); /* error index */
X if (varListPtr == NULL)
X return 0;
X
X data = asn_build_header(headerPtr, &headerLength, GET_RSP_MSG, headerLength);
X if (data != reqidPtr)
X return 0;
X length = snmp_length;
X type = (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
X data = asn_build_int(errstatPtr, &length, type, &errstat, sizeof errstat);
X if (data != errindexPtr)
X return 0;
X data = asn_build_int(errindexPtr, &length, type, &errindex, sizeof errindex);
X if (data != varListPtr)
X return 0;
X packet_end = snmp_out + snmp_length;


X return 1;
X}
X

X#ifdef KINETICS
Xstruct pbuf *
XdefinitelyGetBuf(){
X register struct pbuf *p;
X
X K_PGET(PT_DATA, p);
X while(p == 0){
X#ifdef notdef
X if (pq->pq_head != NULL){
X K_PDEQ(SPLIMP, pq, p);
X if (p) K_PFREE(p);
X } else if (sendq->pq_head != NULL){
X K_PDEQ(SPLIMP, sendq, p);
X if (p) K_PFREE(p);
X }
X#endif
X K_PGET(PT_DATA, p);
X }
X return p;
X}
X#endif
X
Xint
Xsnmp_access(acl, community, rw)
X u_short acl;
X int community;
X int rw;
X{
X /*
X * Each group has 2 bits, the more significant one is for read access,
X * the less significant one is for write access.
X */
X
X community <<= 1; /* multiply by two two shift two bits at a time */
X if (rw == READ){
X return (acl & (2 << community)); /* return the correct bit */
X } else {
X return (acl & (1 << community));
X }
X}
X
Xint
Xget_community(sessionid)
X u_char *sessionid;
X{
X int count;
X
X for(count = 0; count < NUM_COMMUNITIES; count++){
X if (!strcmp(communities[count], (char *)sessionid))
X break;
X }
X if (count == NUM_COMMUNITIES)
X return -1;


X return count;
X}
X

Xint
XgoodValue(inType, inLen, actualType, actualLen)
X u_char inType, actualType;
X int inLen, actualLen;
X{
X if (inLen > actualLen)
X return FALSE;
X return (inType == actualType);
X}
X
XsetVariable(var_val, var_val_type, var_val_len, statP, statLen)


X u_char *var_val;
X u_char var_val_type;
X int var_val_len;

X u_char far *statP;
X int statLen;
X{
X int buffersize = 1000;
X
X switch(var_val_type){


X case ASN_INTEGER:
X case COUNTER:
X case GAUGE:
X case TIMETICKS:

X asn_parse_int(var_val, &buffersize, &var_val_type, (long *)statP, statLen);


X break;
X case ASN_OCTET_STR:
X case IPADDRESS:
X case OPAQUE:

X asn_parse_string(var_val, &buffersize, &var_val_type, statP, &statLen);


X break;
X case ASN_OBJECT_ID:

X asn_parse_objid(var_val, &buffersize, &var_val_type, (oid *)statP, &statLen);
X break;
X }
X}
X
X
END_OF_FILE
if test 18099 -ne `wc -c <'netramet/src/snmplib/snmpagnt.c'`; then
echo shar: \"'netramet/src/snmplib/snmpagnt.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/snmpagnt.c'
fi
echo shar: End of archive 20 \(of 25\).
cp /dev/null ark20isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:04:49 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 109
Archive-name: netramet/part21
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/examples/rules.sample
# netramet/src/apps/snmpnetstat/if.c netramet/src/apps/snmpstatus.c
# netramet/src/apps/snmptest.c netramet/src/manager/nmc_pars.c
# netramet/src/snmplib/snmpclnt.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:12 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 21 (of 25)."'
if test -f 'netramet/examples/rules.sample' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/examples/rules.sample'\"
else
echo shar: Extracting \"'netramet/examples/rules.sample'\" \(3166 characters\)
sed "s/^X//" >'netramet/examples/rules.sample' <<'END_OF_FILE'
X# 1705, Mon 13 Sep 93
X#
X# Rule specification file to tally IP net <-> IP net,
X# tally DECnet and Novell and aggregate EtherTalk
X#
X# Nevil Brownlee, Computer Centre, University of Auckland
X#
XSET 2 # Rule + action set number 2
X#
XRULES
X#
XSourcePeerType & 255 = DECnet : Tally, 9; # 1
XSourcePeerType & 255 = IP.0.0.0 : Pushto, 8; # 2
XSourcePeerType & 255 = EtherTalk : Aggregate, 7; # 3
XSourcePeerType & 255 = Novell : Tally, 8; # 4
XNull & 0 = 0 : Succeed, 0; # 5 Ignore
X#
XNull & 0 = 0 : Succeed, 0; # 6
XNull & 0 = 0 : Succeed, 0; # 7
X#
X# IP ...
X#
XSourcePeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 13; # 8 Low B
XSourcePeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 16; # 9 Low C
XSourcePeerAddress & 192.0.0.0 = 64.0.0.0 : Pushto, 18; # 10 Low A
XSourcePeerAddress & 192.0.0.0 = 0.0.0.0 : Pushto, 18; # 11 Low A
XNull & 0 = 0 : Fail, 0; # 12
X#
XDestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 1; # 13 High B: B-B
XDestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 2; # 14 High C: B-C
XNull & 0 = 0 : Fail, 0; # 15
X#
XDestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 3; # 16 High C: C-C
XNull & 0 = 0 : Fail, 0; # 17
X#
XDestPeerAddress & 192.0.0.0 = 128.0.0.0 : Tally, 4; # 18 High B: A-B
XDestPeerAddress & 192.0.0.0 = 192.0.0.0 : Tally, 5; # 19 High C: A-C
XDestPeerAddress & 192.0.0.0 = 64.0.0.0 : Tally, 6; # 20 High A: A-A
XDestPeerAddress & 192.0.0.0 = 0.0.0.0 : Tally, 6; # 21 High A: A-A
XNull & 0 = 0 : Fail, 0; # 22
X#
XNull & 0 = 0 : Fail, 0; # 23
XNull & 0 = 0 : Fail, 0; # 24
X#
XACTIONS
X#
XSourcePeerType=IP, SourcePeerMask=255.255.0.0,
X DestPeerMask=255.255.0.0; # 1 B-B
XSourcePeerType=IP, SourcePeerMask=255.255.0.0,
X DestPeerMask=255.255.255.0; # 2 B-C
XSourcePeerType=IP, SourcePeerMask=255.255.255.0,
X DestPeerMask=255.255.255.0; # 3 C-C
XSourcePeerType=IP, SourcePeerMask=255.0.0.0,
X DestPeerMask=255.255.0.0; # 4 A-B
XSourcePeerType=IP, SourcePeerMask=255.0.0.0,
X DestPeerMask=255.255.255.0; # 5 A-C
XSourcePeerType=IP, SourcePeerMask=255.0.0.0,
X DestPeerMask=255.0.0.0; # 6 A-A
X#
XSourcePeerType=EtherTalk,
X SourcePeerAddress=1.0.0.0, SourcePeerMask=255.0.0.0,
X DestPeerAddress=1.0.0.0, DestPeerMask=255.0.0.0; # 7 Aggregate
X#
XSourcePeerType=Novell, SourcePeerMask=255.255.255.255,
X DestPeerMask=255.255.255.255; # 8 Tally all
XSourcePeerType=DECnet, SourcePeerMask=255.255.255.0,
X DestPeerMask=255.255.255.0; # 9 Tally all
X#
XFORMAT FlowRuleSet FlowIndex FirstTime " "
X SourcePeerType SourcePeerAddress DestPeerAddress " "
X ToPDUs FromPDUs " " ToOctets FromOctets;
X#
X# end of file
END_OF_FILE
if test 3166 -ne `wc -c <'netramet/examples/rules.sample'`; then
echo shar: \"'netramet/examples/rules.sample'\" unpacked with wrong size!
fi
# end of 'netramet/examples/rules.sample'
fi
if test -f 'netramet/src/apps/snmpnetstat/if.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpnetstat/if.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpnetstat/if.c'\" \(9741 characters\)
sed "s/^X//" >'netramet/src/apps/snmpnetstat/if.c' <<'END_OF_FILE'
X/***********************************************************
X Copyright 1989 by Carnegie Mellon University


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * Copyright (c) 1983,1988 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X

X#include <sys/types.h>


X#include <sys/socket.h>
X
X#include <netinet/in.h>
X

X#include <stdio.h>
X#include <signal.h>


X
X#include "ausnmp.h"
X#include "main.h"
X#include "asn1.h"
X#include "snmp.h"

X#include "snmpimpl.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"
X#include "mib.h"
X
X#define YES 1
X#define NO 0
X
Xextern int nflag;
Xextern char *interface;
Xextern char *routename(), *netname();


Xextern struct snmp_session *Session;
Xextern struct variable_list *getvarbyname();
X

Xoid oid_ifname[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 1};
Xstatic oid oid_ifinucastpkts[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1};
Xstatic oid oid_cfg_nnets[] = {1, 3, 6, 1, 2, 1, 2, 1, 0};
X
X#define IFNAME 2
X#define IFMTU 4
X#define IFOPERSTATUS 8
X#define INUCASTPKTS 11
X#define INNUCASTPKTS 12
X#define INERRORS 14
X#define OUTUCASTPKTS 17
X#define OUTNUCASTPKTS 18
X#define OUTERRORS 20
X
X/*
X * Print a description of the network interfaces.
X */
Xintpr(interval)
X int interval;
X{
X oid varname[MAX_NAME_LEN], *instance, *ifentry;
X int varname_len;
X int ifnum, cfg_nnets;
X struct variable_list *var;
X char name[128];
X int mtu;
X int ipkts, ierrs, opkts, oerrs, operstatus, collisions;
X
X if (interval) {
X sidewaysintpr((unsigned)interval);
X return;
X }
X printf("%-11.11s %-5.5s %-11.11s %-15.15s %8.8s %5.5s %8.8s %5.5s",
X "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs",
X "Opkts", "Oerrs");
X putchar('\n');
X var = getvarbyname(Session, oid_cfg_nnets, sizeof(oid_cfg_nnets) / sizeof(oid));
X if (var)
X cfg_nnets = *var->val.integer;
X else
X return;
X bcopy((char *)oid_ifname, (char *)varname, sizeof(oid_ifname));
X varname_len = sizeof(oid_ifname) / sizeof(oid);
X ifentry = varname + 9;
X instance = varname + 10;
X for (ifnum = 1; ifnum <= cfg_nnets; ifnum++) {
X register char *cp;
X char *index();
X
X *name = mtu = 0;
X ipkts = ierrs = opkts = oerrs = operstatus = collisions = 0;
X *instance = ifnum;
X *ifentry = IFNAME;


X var = getvarbyname(Session, varname, varname_len);
X if (var){

X bcopy((char *)var->val.string, name, var->val_len);
X name[var->val_len] = 0;
X }
X *ifentry = IFMTU;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X mtu = *var->val.integer;
X *ifentry = IFOPERSTATUS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X operstatus = *var->val.integer;
X *ifentry = INUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X ipkts = *var->val.integer;
X *ifentry = INNUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X ipkts += *var->val.integer;
X *ifentry = INERRORS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X ierrs = *var->val.integer;
X *ifentry = OUTUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X opkts = *var->val.integer;
X *ifentry = OUTNUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X opkts += *var->val.integer;
X *ifentry = OUTERRORS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X oerrs = *var->val.integer;
X
X name[15] = '\0';
X if (interface != 0 &&
X strcmp(name, interface) != 0)
X continue;
X cp = index(name, '\0');
X if (operstatus != MIB_IFSTATUS_UP)
X *cp++ = '*';
X *cp = '\0';
X printf("%-11.11s %-5d ", name, mtu);
X printf("%-11.11s ", "none");
X printf("%-15.15s ", "none");
X printf("%8d %5d %8d %5d %5d",
X ipkts, ierrs,
X opkts, oerrs, collisions);
X putchar('\n');
X }
X}
X
X#define MAXIF 10
Xstruct iftot {
X char ift_name[128]; /* interface name */
X int ift_ip; /* input packets */
X int ift_ie; /* input errors */
X int ift_op; /* output packets */
X int ift_oe; /* output errors */
X int ift_co; /* collisions */
X} iftot[MAXIF];
X
Xu_char signalled; /* set if alarm goes off "early" */
X
X/*
X * Print a running summary of interface statistics.
X * Repeat display every interval seconds, showing statistics
X * collected over that interval. Assumes that interval is non-zero.
X * First line printed at top of screen is always cumulative.
X */
Xsidewaysintpr(interval)
X unsigned interval;
X{
X register struct iftot *ip, *total;
X register int line;
X struct iftot *lastif, *sum, *interesting, ifnow, *now = &ifnow;
X int oldmask;
X int catchalarm();
X struct variable_list *var;
X oid varname[MAX_NAME_LEN], *instance, *ifentry;
X int varname_len;
X int ifnum, cfg_nnets;
X char *index();
X
X lastif = iftot;
X sum = iftot + MAXIF - 1;
X total = sum - 1;
X interesting = iftot;
X var = getvarbyname(Session, oid_cfg_nnets, sizeof(oid_cfg_nnets) / sizeof(oid));
X if (var)
X cfg_nnets = *var->val.integer;
X else
X return;
X bcopy((char *)oid_ifname, (char *)varname, sizeof(oid_ifname));
X varname_len = sizeof(oid_ifname) / sizeof(oid);
X for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets; ifnum++) {
X char *cp;
X
X ip->ift_name[0] = '(';
X varname[10] = ifnum;


X var = getvarbyname(Session, varname, varname_len);
X if (var){

X bcopy((char *)var->val.string, ip->ift_name + 1, var->val_len);
X }
X if (interface && strcmp(ip->ift_name + 1, interface) == 0)
X interesting = ip;
X ip->ift_name[15] = '\0';
X cp = index(ip->ift_name, '\0');
X sprintf(cp, ")");
X ip++;
X if (ip >= iftot + MAXIF - 2)
X break;
X }
X lastif = ip;
X
X (void)signal(SIGALRM, catchalarm);
X signalled = NO;
X (void)alarm(interval);
Xbanner:
X printf(" input %-6.6s output ", interesting->ift_name);
X if (lastif - iftot > 0)
X printf(" input (Total) output");
X for (ip = iftot; ip < iftot + MAXIF; ip++) {
X ip->ift_ip = 0;
X ip->ift_ie = 0;
X ip->ift_op = 0;
X ip->ift_oe = 0;
X ip->ift_co = 0;
X }
X putchar('\n');
X printf("%8.8s %5.5s %8.8s %5.5s %5.5s ",
X "packets", "errs", "packets", "errs", "colls");
X if (lastif - iftot > 0)
X printf("%8.8s %5.5s %8.8s %5.5s %5.5s ",
X "packets", "errs", "packets", "errs", "colls");
X putchar('\n');
X fflush(stdout);
X line = 0;
Xloop:
X sum->ift_ip = 0;
X sum->ift_ie = 0;
X sum->ift_op = 0;
X sum->ift_oe = 0;
X sum->ift_co = 0;
X bcopy((char *)oid_ifinucastpkts, (char *)varname, sizeof(oid_ifinucastpkts));
X varname_len = sizeof(oid_ifinucastpkts) / sizeof(oid);
X ifentry = varname + 9;
X instance = varname + 10;
X for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets && ip < lastif; ip++, ifnum++) {
X bzero((char *)now, sizeof(*now));
X *instance = ifnum;
X *ifentry = INUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_ip = *var->val.integer;
X *ifentry = INNUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_ip += *var->val.integer;
X *ifentry = INERRORS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_ie = *var->val.integer;
X *ifentry = OUTUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_op = *var->val.integer;
X *ifentry = OUTNUCASTPKTS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_op += *var->val.integer;
X *ifentry = OUTERRORS;


X var = getvarbyname(Session, varname, varname_len);
X if (var)

X now->ift_oe = *var->val.integer;
X
X if (ip == interesting)
X printf("%8d %5d %8d %5d %5d ",
X now->ift_ip - ip->ift_ip,
X now->ift_ie - ip->ift_ie,
X now->ift_op - ip->ift_op,
X now->ift_oe - ip->ift_oe,
X now->ift_co - ip->ift_co);
X ip->ift_ip = now->ift_ip;
X ip->ift_ie = now->ift_ie;
X ip->ift_op = now->ift_op;
X ip->ift_oe = now->ift_oe;
X ip->ift_co = now->ift_co;
X sum->ift_ip += ip->ift_ip;
X sum->ift_ie += ip->ift_ie;
X sum->ift_op += ip->ift_op;
X sum->ift_oe += ip->ift_oe;
X sum->ift_co += ip->ift_co;
X }
X if (lastif - iftot > 0)
X printf("%8d %5d %8d %5d %5d ",
X sum->ift_ip - total->ift_ip,
X sum->ift_ie - total->ift_ie,
X sum->ift_op - total->ift_op,
X sum->ift_oe - total->ift_oe,
X sum->ift_co - total->ift_co);
X *total = *sum;
X putchar('\n');
X fflush(stdout);
X line++;
X oldmask = sigblock(sigmask(SIGALRM));
X if (! signalled) {
X sigpause(0);
X }
X sigsetmask(oldmask);
X signalled = NO;
X (void)alarm(interval);
X if (line == 21)
X goto banner;
X goto loop;
X /*NOTREACHED*/
X}
X
X/*
X * Called if an interval expires before sidewaysintpr has completed a loop.
X * Sets a flag to not wait for the alarm.
X */
Xcatchalarm()
X{
X signalled = YES;
X}
END_OF_FILE
if test 9741 -ne `wc -c <'netramet/src/apps/snmpnetstat/if.c'`; then
echo shar: \"'netramet/src/apps/snmpnetstat/if.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpnetstat/if.c'
fi
if test -f 'netramet/src/apps/snmpstatus.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpstatus.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpstatus.c'\" \(9974 characters\)
sed "s/^X//" >'netramet/src/apps/snmpstatus.c' <<'END_OF_FILE'
X/*
X * snmpstatus.c - send snmp GET requests to a network entity.


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>


X#include <stdio.h>
X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"

X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"
X

Xint snmp_dump_packet = 0;
X

Xoid objid_sysDescr[] = {1, 3, 6, 1, 2, 1, 1, 1, 0};
Xint length_sysDescr = sizeof(objid_sysDescr)/sizeof(oid);
Xoid objid_sysUpTime[] = {1, 3, 6, 1, 2, 1, 1, 3, 0};
Xint length_sysUpTime = sizeof(objid_sysUpTime)/sizeof(oid);
Xoid objid_ifOperStatus[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 8};
Xint length_ifOperStatus = sizeof(objid_ifOperStatus)/sizeof(oid);
Xoid objid_ifInUCastPkts[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 11};
Xint length_ifInUCastPkts = sizeof(objid_ifInUCastPkts)/sizeof(oid);
Xoid objid_ifInNUCastPkts[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 12};
Xint length_ifInNUCastPkts = sizeof(objid_ifInNUCastPkts)/sizeof(oid);
Xoid objid_ifOutUCastPkts[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 17};
Xint length_ifOutUCastPkts = sizeof(objid_ifOutUCastPkts)/sizeof(oid);
Xoid objid_ifOutNUCastPkts[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 18};
Xint length_ifOutNUCastPkts = sizeof(objid_ifOutNUCastPkts)/sizeof(oid);
Xoid objid_ipInReceives[] = {1, 3, 6, 1, 2, 1, 4, 3, 0};
Xint length_ipInReceives = sizeof(objid_ipInReceives)/sizeof(oid);
Xoid objid_ipOutRequests[] = {1, 3, 6, 1, 2, 1, 4, 10, 0};
Xint length_ipOutRequests = sizeof(objid_ipOutRequests)/sizeof(oid);
X
Xchar *
Xuptime_string(timeticks, buf)
X register u_long timeticks;


X char *buf;
X{
X int seconds, minutes, hours, days;
X
X timeticks /= 100;
X days = timeticks / (60 * 60 * 24);
X timeticks %= (60 * 60 * 24);
X
X hours = timeticks / (60 * 60);
X timeticks %= (60 * 60);
X
X minutes = timeticks / 60;
X seconds = timeticks % 60;
X
X if (days == 0){
X sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
X } else if (days == 1) {
X sprintf(buf, "%d day, %d:%02d:%02d", days, hours, minutes, seconds);
X } else {
X sprintf(buf, "%d days, %d:%02d:%02d", days, hours, minutes, seconds);
X }
X return buf;
X}
X

Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X struct snmp_session session, *ss;
X struct snmp_pdu *pdu, *response;
X struct variable_list *vars;
X int arg;
X char *gateway = NULL;
X char *community = NULL;

X char name[256];
X char buf[64];
X int good_var, index;
X int status, count;
X u_long ipackets = 0, opackets = 0, down_interfaces = 0;
X u_long ipin = 0, ipout = 0;
X u_long uptime = 0;
X
X /*
X * usage: snmpstatus gateway-name [community-name]


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;

X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }


X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {

X printf("usage: snmpstatus gateway-name [community-name]\n");
X exit(1);
X }
X }
X if (!(gateway)){
X printf("usage: snmpstatus gateway-name [community-name]\n");
X exit(1);
X }
X


X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = gateway;
X session.community = (u_char *)community;

X if (community == NULL){
X session.community_len = SNMP_DEFAULT_COMMUNITY_LEN;
X } else {
X session.community_len = strlen(community);
X }
X session.retries = 4;
X session.timeout = 500000;


X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ss = snmp_open(&session);
X if (ss == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X strcpy(name, "No System Description Available");


X pdu = snmp_pdu_create(GET_REQ_MSG);
X

X snmp_add_null_var(pdu, objid_sysDescr, length_sysDescr);
X snmp_add_null_var(pdu, objid_sysUpTime, length_sysUpTime);
X snmp_add_null_var(pdu, objid_ipInReceives, length_ipInReceives);
X snmp_add_null_var(pdu, objid_ipOutRequests, length_ipOutRequests);
X
Xretry:


X status = snmp_synch_response(ss, pdu, &response);
X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){
X for(vars = response->variables; vars; vars = vars->next_variable){

X if (vars->name_length == length_sysDescr &&
X !bcmp((char *)objid_sysDescr, (char*)vars->name, sizeof(objid_sysDescr))){
X bcopy((char *)vars->val.string, name, vars->val_len);
X name[vars->val_len] = '\0';
X }
X if (vars->name_length == length_sysUpTime &&
X !bcmp((char *)objid_sysUpTime, (char*)vars->name, sizeof(objid_sysUpTime))){
X uptime = *vars->val.integer;
X }
X if (vars->name_length == length_ipInReceives &&
X !bcmp((char *)objid_ipInReceives, (char*)vars->name, sizeof(objid_ipInReceives))){
X ipin = *vars->val.integer;
X }
X if (vars->name_length == length_ipOutRequests &&
X !bcmp((char *)objid_ipOutRequests, (char*)vars->name, sizeof(objid_ipOutRequests))){
X ipout = *vars->val.integer;
X }
X }


X } else {
X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){

X printf("This name doesn't exist: ");


X for(count = 1, vars = response->variables; vars && count != response->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X if ((pdu = snmp_fix_pdu(response, GET_REQ_MSG)) != NULL)
X goto retry;


X }
X
X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);

X exit(1);


X } else { /* status == STAT_ERROR */

X printf("An error occurred, Quitting\n");
X exit(2);
X }
X
X printf("[%s]=>[%s] Up: %s\n", inet_ntoa(response->address.sin_addr), name,
X uptime_string(uptime, buf));


X
X if (response)
X snmp_free_pdu(response);
X

X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X snmp_add_null_var(pdu, objid_ifOperStatus, length_ifOperStatus);
X snmp_add_null_var(pdu, objid_ifInUCastPkts, length_ifInUCastPkts);
X snmp_add_null_var(pdu, objid_ifInNUCastPkts, length_ifInNUCastPkts);
X snmp_add_null_var(pdu, objid_ifOutUCastPkts, length_ifOutUCastPkts);
X snmp_add_null_var(pdu, objid_ifOutNUCastPkts, length_ifOutNUCastPkts);
X
X good_var = 5;
X while(good_var == 5){
X good_var = 0;


X status = snmp_synch_response(ss, pdu, &response);
X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){

X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X index = 0;


X for(vars = response->variables; vars; vars = vars->next_variable){

X if (index == 0 && vars->name_length >= length_ifOperStatus &&
X !bcmp((char *)objid_ifOperStatus, (char *)vars->name,
X sizeof(objid_ifOperStatus))){
X if (*vars->val.integer != MIB_IFSTATUS_UP)
X down_interfaces++;
X snmp_add_null_var(pdu, vars->name, vars->name_length);
X good_var++;
X } else if (index == 1 && vars->name_length >= length_ifInUCastPkts &&
X !bcmp((char *)objid_ifInUCastPkts, (char *)vars->name,
X sizeof(objid_ifInUCastPkts))){
X ipackets += *vars->val.integer;
X snmp_add_null_var(pdu, vars->name, vars->name_length);
X good_var++;
X } else if (index == 2 && vars->name_length >= length_ifInNUCastPkts &&
X !bcmp((char *)objid_ifInNUCastPkts, (char *)vars->name,
X sizeof(objid_ifInNUCastPkts))){
X ipackets += *vars->val.integer;
X snmp_add_null_var(pdu, vars->name, vars->name_length);
X good_var++;
X } else if (index == 3 && vars->name_length >= length_ifOutUCastPkts &&
X !bcmp((char *)objid_ifOutUCastPkts, (char *)vars->name,
X sizeof(objid_ifOutUCastPkts))){
X opackets += *vars->val.integer;
X snmp_add_null_var(pdu, vars->name, vars->name_length);
X good_var++;
X } else if (index == 4 && vars->name_length >= length_ifOutNUCastPkts &&
X !bcmp((char *)objid_ifOutNUCastPkts, (char *)vars->name,
X sizeof(objid_ifOutNUCastPkts))){
X opackets += *vars->val.integer;
X snmp_add_null_var(pdu, vars->name, vars->name_length);
X good_var++;
X }
X index++;
X }


X } else {
X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){

X printf("This name doesn't exist: ");


X for(count = 1, vars = response->variables; vars && count != response->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);

X printf("\n");
X }

X }
X
X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);
X } else { /* status == STAT_ERROR */
X printf("An error occurred, Quitting\n");
X }
X
X if (response)
X snmp_free_pdu(response);
X }

X printf("Recv/Trans packets: Interfaces: %d/%d | IP: %d/%d\n", ipackets, opackets, ipin, ipout);
X if (down_interfaces > 0){
X printf("%d interface%s down!\n", down_interfaces, down_interfaces > 1 ? "s are": " is" );
X }
X}
X
END_OF_FILE
if test 9974 -ne `wc -c <'netramet/src/apps/snmpstatus.c'`; then
echo shar: \"'netramet/src/apps/snmpstatus.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpstatus.c'
fi
if test -f 'netramet/src/apps/snmptest.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmptest.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmptest.c'\" \(9319 characters\)
sed "s/^X//" >'netramet/src/apps/snmptest.c' <<'END_OF_FILE'
X/*
X * snmptest.c - send snmp requests to a network entity.


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>
X#include <ctype.h>
X#include <errno.h>


X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "asn1.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"
X

Xextern int errno;
Xint command = GET_REQ_MSG;


Xint snmp_dump_packet = 0;
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{

X struct snmp_session session, *ss;
X struct snmp_pdu *pdu, *response;

X struct variable_list *vars, *vp;
X int arg, ret;


X char *gateway = NULL;
X char *community = NULL;

X int status, count;


X
X init_mib();
X /*

X * usage: snmptest gateway-name community-name


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;

X break;
X default:
X fprintf(stderr, "invalid option: -%c\n", argv[arg][1]);
X break;
X }


X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {

X fprintf(stderr, "usage: snmptest gateway-name community-name\n");
X exit(1);
X }
X }
X if (community == NULL)
X community = "public"; /* default to public */
X
X if (!(gateway && community)){
X fprintf(stderr, "usage: snmptest gateway-name community-name\n");
X exit(1);
X }
X


X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ss = snmp_open(&session);
X if (ss == NULL){

X fprintf(stderr, "Couldn't open snmp\n");
X exit(-1);
X }
X
X while(1){
X vars = NULL;
X for(ret = 1; ret != 0;){
X vp = (struct variable_list *)malloc(sizeof(struct variable_list));


X vp->next_variable = NULL;

X vp->name = NULL;

X vp->val.string = NULL;
X
X while((ret = input_variable(vp)) == -1)
X ;
X if (ret == 1){
X /* add it to the list */
X if (vars == NULL){
X /* if first variable */
X pdu = snmp_pdu_create(command);
X pdu->variables = vp;
X } else {
X vars->next_variable = vp;
X }
X vars = vp;
X } else {
X /* free the last (unused) variable */


X if (vp->name)
X free((char *)vp->name);
X if (vp->val.string)
X free((char *)vp->val.string);

X free((char *)vp);
X }


X }
X status = snmp_synch_response(ss, pdu, &response);
X if (status == STAT_SUCCESS){

X switch(response->command){
X case GET_REQ_MSG:
X printf("Received GET REQUEST ");
X break;
X case GETNEXT_REQ_MSG:
X printf("Received GETNEXT REQUEST ");
X break;
X case GET_RSP_MSG:
X printf("Received GET RESPONSE ");
X break;
X case SET_REQ_MSG:
X printf("Received SET REQUEST ");
X break;
X case TRP_REQ_MSG:
X printf("Received TRAP REQUEST ");
X break;
X }
X printf("from %s\n", inet_ntoa(response->address.sin_addr));
X printf("requestid 0x%x errstat 0x%x errindex 0x%x\n",
X response->reqid, response->errstat, response->errindex);


X if (response->errstat == SNMP_ERR_NOERROR){
X for(vars = response->variables; vars; vars = vars->next_variable)

X print_variable(vars->name, vars->name_length, vars);

X } else {
X fprintf(stderr, "Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));


X if (response->errstat == SNMP_ERR_NOSUCHNAME){

X for(count = 1, vars = response->variables; vars && count != response->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars){

X printf("This name doesn't exist: ");


X print_objid(vars->name, vars->name_length);
X }

X printf("\n");
X }

X }
X
X } else if (status == STAT_TIMEOUT){

X fprintf(stderr, "No Response from %s\n", gateway);


X } else { /* status == STAT_ERROR */

X fprintf(stderr, "An error occurred, Quitting\n");


X }
X
X if (response)
X snmp_free_pdu(response);
X }
X}

X
Xint
Xascii_to_binary(cp, bufp)
X u_char *cp;
X u_char *bufp;
X{
X int subidentifier;
X u_char *bp = bufp;
X
X for(; *cp != '\0'; cp++){
X if (isspace(*cp))
X continue;
X if (!isdigit(*cp)){
X fprintf(stderr, "Input error\n");
X return -1;
X }
X subidentifier = atoi(cp);
X if (subidentifier > 255){
X fprintf(stderr, "subidentifier %d is too large ( > 255)\n", subidentifier);
X return -1;
X }
X *bp++ = (u_char)subidentifier;
X while(isdigit(*cp))
X cp++;
X cp--;
X }
X return bp - bufp;
X}
X
X
Xint
Xhex_to_binary(cp, bufp)
X u_char *cp;
X u_char *bufp;
X{
X int subidentifier;
X u_char *bp = bufp;
X
X for(; *cp != '\0'; cp++){
X if (isspace(*cp))
X continue;
X if (!isxdigit(*cp)){
X fprintf(stderr, "Input error\n");
X return -1;
X }
X sscanf(cp, "%x", &subidentifier);
X if (subidentifier > 255){
X fprintf(stderr, "subidentifier %d is too large ( > 255)\n", subidentifier);
X return -1;
X }
X *bp++ = (u_char)subidentifier;
X while(isxdigit(*cp))
X cp++;
X cp--;
X }
X return bp - bufp;
X}
X
X
Xinput_variable(vp)
X struct variable_list *vp;
X{
X u_char buf[256], value[256], ch;
X
X printf("Please enter the variable name: ");
X fflush(stdout);
X gets(buf);
X
X if (*buf == 0){
X vp->name_length = 0;
X return 0;
X }
X if (*buf == '$'){
X switch(buf[1]){
X case 'G':
X command = GET_REQ_MSG;
X printf("Request type is GET REQUEST\n");
X break;
X case 'N':
X command = GETNEXT_REQ_MSG;
X printf("Request type is GETNEXT REQUEST\n");
X break;
X case 'S':
X command = SET_REQ_MSG;
X printf("Request type is SET REQUEST\n");
X break;
X case 'D':
X if (snmp_dump_packet){
X snmp_dump_packet = 0;
X printf("Turned packet dump off\n");
X } else {
X snmp_dump_packet = 1;
X printf("Turned packet dump on\n");
X }
X break;
X case 'Q':
X printf("Quitting, Goodbye\n");
X exit(0);
X break;
X default:
X fprintf(stderr, "Bad command\n");
X }
X return -1;
X }


X vp->name_length = MAX_NAME_LEN;

X if (!read_objid(buf, value, &vp->name_length))
X return -1;
X vp->name = (oid *)malloc(vp->name_length * sizeof(oid));
X bcopy((char *)value, (char *)vp->name, vp->name_length * sizeof(oid));
X
X if (command == SET_REQ_MSG){
X printf("Please enter variable type [i|s|x|d|n|o|t|a]: ");
X fflush(stdout);
X gets(buf);
X ch = *buf;
X switch(ch){
X case 'i':
X vp->type = INTEGER;


X break;
X case 's':

X vp->type = STRING;
X break;
X case 'x':
X vp->type = STRING;


X break;
X case 'd':

X vp->type = STRING;
X break;
X case 'n':
X vp->type = NULLOBJ;
X break;
X case 'o':
X vp->type = OBJID;


X break;
X case 't':

X vp->type = TIMETICKS;
X break;
X case 'a':
X vp->type = IPADDRESS;
X break;
X default:
X fprintf(stderr, "bad type \"%c\", use \"i\", \"s\", \"x\", \"d\", \"n\", \"o\", \"t\", or \"a\".\n", *buf);
X return -1;
X }
X printf("Please enter new value: "); fflush(stdout);
X gets(buf);
X switch(vp->type){
X case INTEGER:


X vp->val.integer = (long *)malloc(sizeof(long));

X *(vp->val.integer) = atoi(buf);


X vp->val_len = sizeof(long);

X break;
X case STRING:
X if (ch == 'd'){
X vp->val_len = ascii_to_binary(buf, value);
X } else if (ch == 's'){
X strcpy(value, buf);
X vp->val_len = strlen(buf);
X } else if (ch == 'x'){
X vp->val_len = hex_to_binary(buf, value);
X }
X vp->val.string = (u_char *)malloc(vp->val_len);
X bcopy((char *)value, (char *)vp->val.string, vp->val_len);
X break;
X case NULLOBJ:
X vp->val_len = 0;


X vp->val.string = NULL;

X break;
X case OBJID:


X vp->val_len = MAX_NAME_LEN;;

X read_objid(buf, value, &vp->val_len);


X vp->val_len *= sizeof(oid);

X vp->val.objid = (oid *)malloc(vp->val_len);
X bcopy((char *)value, (char *)vp->val.objid, vp->val_len);


X break;
X case TIMETICKS:

X vp->val.integer = (long *)malloc(sizeof(long));

X *(vp->val.integer) = atoi(buf);


X vp->val_len = sizeof(long);

X break;
X case IPADDRESS:

X vp->val.integer = (long *)malloc(sizeof(long));

X *(vp->val.integer) = inet_addr(buf);


X vp->val_len = sizeof(long);

X break;
X default:
X fprintf(stderr, "Internal error\n");
X break;
X }
X } else { /* some form of get message */
X vp->type = NULLOBJ;
X vp->val_len = 0;
X }


X return 1;
X}
X

END_OF_FILE
if test 9319 -ne `wc -c <'netramet/src/apps/snmptest.c'`; then
echo shar: \"'netramet/src/apps/snmptest.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmptest.c'
fi
if test -f 'netramet/src/manager/nmc_pars.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/manager/nmc_pars.c'\"
else
echo shar: Extracting \"'netramet/src/manager/nmc_pars.c'\" \(16910 characters\)
sed "s/^X//" >'netramet/src/manager/nmc_pars.c' <<'END_OF_FILE'
X/* 1135, Tue 28 Sep 93
X
X NMCC_PARS.C: Scanner/parser for nmc config and rules files


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X#include <stdio.h>
X#include <ctype.h>


X#include <errno.h>
X
X#include <string.h>
X#include <malloc.h>

X#include <sys/param.h>
X#include <sys/types.h>
X#include <sys/time.h>
X#include <netinet/in.h>
X
X#include "ausnmp.h"


X
X#include "snmp.h"
X#include "snmpimpl.h"

X#include "asn1.h"
X#include "snmpclnt.h"
X#include "snmpapi.h"
X#include "mib.h"
X

X#include "nmc.h"
X
Xvoid mswait(unsigned int ms) /* Wait for ms milliseconds */
X{
X struct timeval timeout;
X timeout.tv_sec = ms/1000; timeout.tv_usec = (long)(ms%1000)*1000L;
X select(FD_SETSIZE, 0, 0, 0, &timeout);
X }
X
XFILE *wfopen(fn) /* Open next file in sequence for write */
Xchar *fn;
X{
X char lfn[NAME_LN];
X int n;
X FILE *f;
X for (n = 1; ; ++n) {
X sprintf(lfn,"%s.%03d",fn,n);
X if ((f = fopen(lfn,"r")) == NULL) {
X if ((f = fopen(lfn,"w")) != NULL) return f;
X printf("Failed to open %s\n",lfn);
X exit(0);
X }
X fclose(f);
X }
X }
X


Xchar *gnbr(unsigned int *n, char *s)

X /* Get nbr from 's', return updated 's' */
X{
X unsigned int v = 0, b = 10, d;
X while (*s == ' ') ++s;
X if (*s == 'x' || *s == 'X') {
X ++s; b = 16;
X }
X else if (*s == '0') {
X ++s; b = 8;
X }
X for (;;) {
X d = *s;
X if (b == 16) {
X if (!isxdigit(d)) break;
X }
X else {
X if (!isdigit(d)) break;
X if (b == 8 && d > '7') break;
X }
X if (d <= '9') d -= '0';
X else if (d <= 'F') d -= ('A'-10);
X else d -= ('a'-10);
X v = v*b + d; ++s;
X }
X *n = v; return s;
X }
X
Xchar *gcstring(char *s, int *len) /* Get string from s */
X{
X static char escin[] = {
X 'b', 'f', 'n', 'r', 't', 'v','\\','\'','\"','\?', 0 };
X static char escout[] ={
X '\b','\f','\n','\r','\t','\v','\\','\'','\"','\?' };
X unsigned int c,j;
X char sbuf[80], *t = sbuf, *rp;
X while (*s) {
X if (*s == '\\') {
X ++s; c = *s;
X if (c == '0' || c == 'x' || c == 'X') { /* Octal or hex nbr */
X s = gnbr(&c,s); *t++ = c;
X }
X else if isdigit(c) { /* Octal number */
X --s; *s = '0'; /* Make gnbr use base 8 */
X s = gnbr(&c,s); *t++ = c;
X }
X else {
X j = 0; do {
X if (c == escin[j]) break;
X } while (escin[++j] != 0);
X if (escin[j] != 0) {
X *t++ = escout[j]; ++s;
X }
X }
X }
X else *t++ = *s++;
X }
X *t = '\0';
X rp = malloc(*len = t-sbuf); strcpy(rp,sbuf);
X return rp;
X }
X
Xstatic char ftb[32];
X
Xchar *fmt_time(time_t *t)
X{
X char *ts = ctime(t);
X strncpy(&ftb[0], &ts[11], 9); /* 17:31:42_ */
X strncpy(&ftb[9], &ts[0], 4); /* Thu_ */
X strncpy(&ftb[13], &ts[8], 3); /* 23_ */
X strncpy(&ftb[16], &ts[4], 4); /* Sep_ */
X strncpy(&ftb[20], &ts[22], 2); /* 93 */
X ftb[22] = '\0';
X return ftb;
X }

X
Xchar *uptime_string(unsigned long timeticks, char *buf)

X{
X int seconds, minutes, hours, days;
X
X timeticks /= 100;
X days = timeticks / (60 * 60 * 24);
X timeticks %= (60 * 60 * 24);
X
X hours = timeticks / (60 * 60);
X timeticks %= (60 * 60);
X
X minutes = timeticks / 60;
X seconds = timeticks % 60;
X
X if (days == 0){
X sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
X }
X else if (days == 1) {
X sprintf(buf, "%d day, %d:%02d:%02d",

X days, hours, minutes, seconds);


X }
X else {
X sprintf(buf, "%d days, %d:%02d:%02d",

X days, hours, minutes, seconds);


X }
X return buf;
X }
X

Xvoid printaddress(FILE *f, unsigned char *a, unsigned char addrsz)
X{
X int j;
X switch (addrsz) {
X case MAC_ADDR_LEN:
X fprintf(f,"%02X", a[0]);
X for (j = 1; j != addrsz; ++j) fprintf(f,"-%02X", a[j]);
X break;
X case PEER_ADDR_LEN:


X fprintf(f,"%u", a[0]);

X for (j = 1; j != addrsz; ++j) fprintf(f,".%u", a[j]);
X break;
X case DETAIL_ADDR_LEN:
X fprintf(f,"%u", a[0]*256 + a[1]);
X break;
X }
X }
X
Xvoid printruleaddress(FILE *f, unsigned char *a, unsigned char addrsz)


X{
X int j;
X fprintf(f,"%u", a[0]);

X for (j = 1; j != addrsz; ++j) fprintf(f,".%u", a[j]);
X for ( ; j != RULE_ADDR_LEN; ++j) fprintf(f,".0");
X }
X
X
Xint parse_open(char *fn) /* Open file and initialise parser */
X{
X if ((rfp = fopen(fn, "r")) == NULL) return 0;
X rferrors = rule_line = 0; ic = '\n';


X return 1;
X }
X

Xvoid getarg(char *arg)
X{
X for (;;) {
X if (ic == EOF) {
X *arg = NULL; return;
X }
X if (!isspace(ic)) break;
X nextchar();
X }
X do {
X *arg++ = ic;
X nextchar();
X } while (ic != EOF && !isspace(ic));
X *arg = NULL; return;
X }


X
Xint nextchar()
X{
X lic = ic;

X for (;;) {


X if (lic == '\n') {
X if (fgets(inbuf, sizeof(inbuf), rfp) == NULL) return ic = EOF;
X iblisted = 0; ++rule_line;
X ibp = inbuf;
X }
X ic = *ibp++;
X if (ic == '#') lic = '\n'; /* Ignore comments */
X else return ic;
X }
X }
X

Xint wordis(p,w)
Xchar *p, *w;
X{
X return strncmp(p,w,strlen(w)) == 0;
X }
X
Xint getword()
X{
X char wbuf[30], *wp = wbuf;

X int j;
X for (;;) {
X *wp++ = tolower(ic);
X nextchar();


X if (ic == EOF) return EOF;

X if (!isalpha(ic)) break;
X }
X


X if (wordis(wbuf,"ip")) return AT_IP;
X if (wordis(wbuf,"novell")) return AT_NOVELL;
X if (wordis(wbuf,"decnet")) return AT_DECNET;
X if (wordis(wbuf,"ethertalk")) return AT_ETHERTALK;
X
X if (wordis(wbuf,"count")) return RA_COUNT;
X if (wordis(wbuf,"tally")) return RA_TALLY;
X if (wordis(wbuf,"aggregate")) return RA_AGGREGATE;
X if (wordis(wbuf,"succeed")) return RA_SUCCEED;
X if (wordis(wbuf,"fail")) return RA_FAIL;
X if (wordis(wbuf,"pushto")) return RA_PUSHTO;
X if (wordis(wbuf,"popto")) return RA_POPTO;
X if (wordis(wbuf,"goto")) return RA_GOTO;
X
X if (wordis(wbuf,"set")) return RF_SET;
X if (wordis(wbuf,"rules")) return RF_RULES;
X if (wordis(wbuf,"actions")) return RF_ACTIONS;

X if (wordis(wbuf,"format")) return RF_FORMAT;
X if (wordis(wbuf,"statistics")) return RF_STATS;
X
X if (wordis(wbuf,"icmp")) return PT_ICMP;
X if (wordis(wbuf,"tcp")) return PT_TCP;
X if (wordis(wbuf,"udp")) return PT_UDP;
X
X if (wordis(wbuf,"ftpdata")) return WNP_FTPDATA;
X if (wordis(wbuf,"ftp")) return WNP_FTP;
X if (wordis(wbuf,"telnet")) return WNP_TELNET;
X if (wordis(wbuf,"smtp")) return WNP_SMTP;
X if (wordis(wbuf,"domain")) return WNP_DOMAIN;
X if (wordis(wbuf,"nntp")) return WNP_NNTP;
X if (wordis(wbuf,"ntp")) return WNP_NTP;
X if (wordis(wbuf,"snmp")) return WNP_SNMP;
X
X for (j = 0; j != NATTRIBS+1; ++j)
X if (wordis(wbuf,attribs[j].name)) return attribs[j].index;
X


X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }

X printf("Unknown word %s !!!\n", wbuf);
X ++rferrors;

X return 0;
X }
X

Xint getnbr()
X{
X int v = 0;

X for (;;) {


X if (ic == EOF) return EOF;
X if (isdigit(ic)) break;

X else if (isalpha(ic)) return getword();

X else nextchar();
X }
X for (;;) {


X v = v*10 + ic-'0';

X if (nextchar() == EOF) return EOF;


X if (!isdigit(ic)) break;
X }
X if (v > 255) {
X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }
X printf("Number > 255 !!!\n");

X ++rferrors;


X }
X return v;
X }
X

Xunsigned int getint(unsigned int *base)

X{
X char wbuf[30], *wp;
X unsigned long v;
X unsigned char c, word;
X int sic; char *sibp;
X for (;;) {


X if (ic == EOF) return EOF;

X if (isalnum(ic)) break;
X else nextchar();
X }
X sic = ic; sibp = ibp; /* Save scanner state */
X for (word = 0, wp = wbuf; ; ) {
X if (isalpha(ic) && !isxdigit(ic)) word = 1;
X *wp++ = tolower(ic);
X nextchar();


X if (ic == EOF) break;

X if (!isalnum(ic)) break;
X }
X if (word) {
X if (*base == 0) *base = 10;
X ic = sic; ibp = sibp; /* Back up scanner */
X return getword();
X }
X *wp = NULL;
X if (*base == 0)
X *base = ic == '-' ? 16 : 10; /* Hex address bytes separated by - */
X for (wp = wbuf, v = 0; *wp != NULL; ) {
X c = *wp++;
X if (isdigit(c)) c -= '0';
X else c = c-'a' + 10;
X v = v*(*base) + c;


X }
X return v;
X }
X

Xvoid getaddress(unsigned char *a,unsigned char len, unsigned char addrsz)
X{
X unsigned int j, base, v;
X for (base = j = 0; j != addrsz; ++j) {
X v = getint(&base);
X if (len != 1 && /* Two or more bytes in address */
X ic != '.' && ic != '-' && /* No byte separator character */
X j == 0) { /* Allow 16-bit decimal in first two bytes */
X a[j++] = (v>>8) & 0xFF; v &= 0x00FF;
X }
X a[j] = v;
X if (ic != '.' && ic != '-') { /* End of token; pad with zeroes */
X for (++j; j != addrsz; ++j) a[j] = 0;


X return;
X }
X }
X }
X

Xint getattribute(unsigned char col, struct flow_info *fp)
X{
X switch(col) {
X case FTLOWINTERFACE:
X fp->LowInterface = getnbr();


X break;
X case FTLOWADJACENTTYPE:

X fp->LowAdjType = getnbr();


X break;
X case FTLOWADJACENTADDRESS:

X getaddress(fp->LowAdjAddress,MAC_ADDR_LEN, MAC_ADDR_LEN);
X break;
X case FTLOWADJACENTMASK:
X getaddress(fp->LowAdjMask,MAC_ADDR_LEN, MAC_ADDR_LEN);
X break;
X case FTLOWPEERTYPE:
X fp->LowPeerType = getnbr();


X break;
X case FTLOWPEERTYPEMASK:

X fp->LowPeerTypeMask = getnbr();


X break;
X case FTLOWPEERADDRESS:

X getaddress(fp->LowPeerAddress,PEER_ADDR_LEN, PEER_ADDR_LEN);
X break;
X case FTLOWPEERMASK:
X getaddress(fp->LowPeerMask,PEER_ADDR_LEN, PEER_ADDR_LEN);
X break;
X case FTLOWDETAILTYPE:
X fp->LowDetailType = getnbr();


X break;
X case FTLOWDETAILTYPEMASK:

X fp->LowDetailTypeMask = getnbr();


X break;
X case FTLOWDETAILADDRESS:

X getaddress(fp->LowDetailAddress,DETAIL_ADDR_LEN, DETAIL_ADDR_LEN);
X break;
X case FTLOWDETAILMASK:
X getaddress(fp->LowDetailMask,DETAIL_ADDR_LEN, DETAIL_ADDR_LEN);
X break;
X case FTHIINTERFACE:
X fp->HighInterface = getnbr();


X break;
X case FTHIADJACENTTYPE:

X fp->HighAdjType = getnbr();


X break;
X case FTHIADJACENTADDRESS:

X getaddress(fp->HighAdjAddress,MAC_ADDR_LEN, MAC_ADDR_LEN);
X break;
X case FTHIADJACENTMASK:
X getaddress(fp->HighAdjMask,MAC_ADDR_LEN, MAC_ADDR_LEN);
X break;
X case FTHIPEERTYPE:
X fp->HighPeerType = getnbr();


X break;
X case FTHIPEERTYPEMASK:

X fp->HighPeerTypeMask = getnbr();


X break;
X case FTHIPEERADDRESS:

X getaddress(fp->HighPeerAddress,PEER_ADDR_LEN, PEER_ADDR_LEN);
X break;
X case FTHIPEERMASK:
X getaddress(fp->HighPeerMask,PEER_ADDR_LEN, PEER_ADDR_LEN);
X break;
X case FTHIDETAILTYPE:
X fp->HighDetailType = getnbr();


X break;
X case FTHIDETAILTYPEMASK:

X fp->HighDetailTypeMask = getnbr();


X break;
X case FTHIDETAILADDRESS:

X getaddress(fp->HighDetailAddress,DETAIL_ADDR_LEN, DETAIL_ADDR_LEN);
X break;
X case FTHIDETAILMASK:
X getaddress(fp->HighDetailMask,DETAIL_ADDR_LEN, DETAIL_ADDR_LEN);
X break;
X default:


X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }

X printf("Attribute %d not allowed in action !!!\n",col);
X ++rferrors;


X }
X }
X
Xint scan_rulefile(ms,doset,list)
Xstruct meter_status *ms;
Xint doset,list;

X{
X struct rule_info ri;

X int rule_set, nrules, nactions, n, kind;

X struct flow_info ai;
X unsigned char a, b, actions[1+NATTRIBS];
X char sbuf[32], *sp;
X int len;
X
X if (!parse_open(ms->rulefile)) {
X printf(" Couldn't open rule file %s !!!\n", ms->rulefile);


X return 0; /* Fail */
X }
X

X rule_set = 0;


X nrules = nactions = 0; kind = RF_RULES;

X for (;;) {


X do { /* First char of a line */

X nextchar();


X if (ic == EOF) break;
X } while (lic != '\n');
X if (ic == EOF) break;

X n = getnbr(); /* What kind of line is it? */
X if (n == RF_SET) {

X ri.RuleSet = rule_set = getnbr();


X kind = RF_RULES; continue;
X }

X if (n == RF_RULES) {


X kind = RF_RULES; continue;
X }
X if (n == RF_ACTIONS) {
X kind = RF_ACTIONS; continue;
X }

X if (n == RF_FORMAT) {
X for (a = 0; a != NATTRIBS+1; ++a)
X ms->format[a] = ms->required[a] = 0;
X for (a = 0; ; ) {
X n = getnbr();
X if (n < NULL || n > FTLASTTIME) {


X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }

X printf("Attribute %d not allowed in format !!!\n",n);
X ++rferrors;
X }
X else {
X ms->format[a] = n; ms->required[n] = 1;
X }
X if (ic == ';' || ic == EOF) break;
X for (;;) {


X if (ic == EOF) return EOF;

X if (ic == '\"' || isalnum(ic)) break;
X else nextchar();
X }
X if (ic == '\"') { /* Separator string */
X nextchar();
X for (sp = sbuf; ; ) {
X if (ic == EOF) {


X if (!iblisted) {
X printf("RULEFILE line %d: %s\n", rule_line,inbuf);
X iblisted = 1;
X }

X printf("Missing \" !!!\n");
X ++rferrors; break;
X }
X else if (ic == '\"') {
X *sp = '\0';
X ms->separator[a] = gcstring(sbuf, &len);
X break;
X }
X else *sp++ = ic;
X nextchar();
X }
X }
X else ms->separator[a] = " ";
X ++a;
X if (ic == ';' || ic == EOF) break;
X }
X if (list) {
X printf("Format: ");
X for (n = ms->format[a = 0]; ; ) {


X for (b = 1; attribs[b].index != n; ++b) ;

X if (n != NULL) printf(attribs[b].name);


X if ((n = ms->format[a+1]) == NULL) break;

X printf(ms->separator[a++]);
X }


X printf("\n");
X }

X continue;
X }
X if (n == RF_STATS) {
X ms->statsreqd = 1; /* Collect statistics */
X continue;


X }
X
X if (kind == RF_RULES) {

X ri.RuleSelector = n; /* Attribute nbr */
X getaddress(ri.RuleMask,attribs[n].len, RULE_ADDR_LEN);


X if (ic == EOF) break;

X getaddress(ri.RuleMatchedValue,attribs[n].len, RULE_ADDR_LEN);


X if (ic == EOF) break;

X ri.RuleAction = getnbr();


X if (ic == EOF) break;

X ri.RuleJumpIndex = getnbr();


X if (ic == EOF) break;

X ri.RuleNbr = ++nrules;
X if (list) {


X printf("Rule %d,%d: %d ", rule_set,nrules,ri.RuleSelector);

X printruleaddress(stdout, ri.RuleMask, RULE_ADDR_LEN);
X printf(" ");
X printruleaddress(stdout, ri.RuleMatchedValue,RULE_ADDR_LEN);


X printf(" %d %d\n", ri.RuleAction,ri.RuleJumpIndex);
X }

X if (doset) add_rule(ms,&ri); /* Add rule to meter's rule table */
X }
X
X if (kind == RF_ACTIONS) {
X for (a = 0; a != NATTRIBS+1; ++a) actions[a] = 0;
X for (;;) {
X getattribute(n,&ai);
X if (n > NULL || n <= NATTRIBS) {
X actions[n] = 1; /* Remember which attribs are set */
X }
X if (ic == ';' || ic == EOF) break;
X n = getnbr();
X }
X ++nactions;
X if (list) {
X printf("Action %d,%d: ", rule_set,nactions);
X for (a = 1; a != NATTRIBS+1; ++a) {
X if (actions[a] != 0) {
X for (b = 1; attribs[b].index != a; ++b) ;
X printf(" %s=",attribs[b].name);
X write_attrib(stdout,&ai,a);
X }
X }


X printf("\n");
X }

X if (doset) add_action(ms, &ai, rule_set,nactions, actions);


X }
X }
X
X fclose(rfp);
X if (rferrors == 0) {
X ms->ruleset = rule_set; ms->nrules = nrules; ms->nactions = nactions;

X return 1; /* Succeed */
X }
X return 0; /* Fail */


X }
X
Xvoid parse_rulefile(ms,list)
Xstruct meter_status *ms;
Xint list;
X{

X int NewRuleSet;


X if (scan_rulefile(ms,0,list)) { /* Rulefile is OK */

X if (ms->ruleset == 0) return;
X if (ms->nrules != 0) { /* Rules were specified */
X if (ms->CurrentRuleSet == (NewRuleSet = ms->ruleset)) {
X ms->ruleset = 1; /* Ask meter to use default rule set */
X set_rule_info(ms,1);
X ms->ruleset = NewRuleSet;
X }


X if (set_rule_info(ms,0)) { /* Set rule+action table sizes */
X scan_rulefile(ms,1,0); /* Download the rules and actions */
X }

X }
X set_rule_info(ms,1); /* Tell meter to start using specified rules */
X }
X }
END_OF_FILE
if test 16910 -ne `wc -c <'netramet/src/manager/nmc_pars.c'`; then
echo shar: \"'netramet/src/manager/nmc_pars.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/manager/nmc_pars.c'
fi
if test -f 'netramet/src/snmplib/snmpclnt.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/snmpclnt.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/snmpclnt.c'\" \(9588 characters\)
sed "s/^X//" >'netramet/src/snmplib/snmpclnt.c' <<'END_OF_FILE'
X/*
X * snmp_client.c - a toolkit of common functions for an SNMP client.


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <sys/param.h>
X#include <stdio.h>
X#include <netinet/in.h>
X#include <sys/time.h>
X#include <errno.h>
X
X#include "ausnmp.h"
X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"


X
X#ifndef BSD4_3
X#define BSD4_2
X#endif
X
X#ifndef BSD4_3
X
Xtypedef long fd_mask;
X#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
X
X#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
X#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
X#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
X#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
X#endif

X
X
Xextern int errno;

Xstruct synch_state snmp_synch_state;
X
Xstruct snmp_pdu *
Xsnmp_pdu_create(command)
X int command;
X{


X struct snmp_pdu *pdu;
X

X pdu = (struct snmp_pdu *)malloc(sizeof(struct snmp_pdu));

X bzero((char *)pdu, sizeof(struct snmp_pdu));
X pdu->command = command;
X pdu->errstat = SNMP_DEFAULT_ERRSTAT;
X pdu->errindex = SNMP_DEFAULT_ERRINDEX;
X pdu->address.sin_addr.s_addr = SNMP_DEFAULT_ADDRESS;


X pdu->enterprise = NULL;
X pdu->enterprise_length = 0;
X pdu->variables = NULL;

X return pdu;
X}
X
X/*
X * Add a null variable with the requested name to the end of the list of
X * variables for this pdu.
X */
Xsnmp_add_null_var(pdu, name, name_length)
X struct snmp_pdu *pdu;
X oid *name;
X int name_length;
X{


X struct variable_list *vars;
X

X if (pdu->variables == NULL){

X pdu->variables = vars = (struct variable_list *)malloc(sizeof(struct variable_list));
X } else {
X for(vars = pdu->variables; vars->next_variable; vars = vars->next_variable)
X ;
X vars->next_variable = (struct variable_list *)malloc(sizeof(struct variable_list));


X vars = vars->next_variable;
X }
X

X vars->next_variable = NULL;

X vars->name = (oid *)malloc(name_length * sizeof(oid));
X bcopy((char *)name, (char *)vars->name, name_length * sizeof(oid));
X vars->name_length = name_length;
X vars->type = ASN_NULL;
X vars->val.string = NULL;
X vars->val_len = 0;
X}
X
Xsnmp_synch_input(op, session, reqid, pdu, magic)
X int op;
X struct snmp_session *session;
X int reqid;
X struct snmp_pdu *pdu;
X void *magic;
X{
X struct variable_list *var, *newvar;
X struct synch_state *state = (struct synch_state *)magic;
X struct snmp_pdu *newpdu;
X
X if (reqid != state->reqid)
X return 0;


X state->waiting = 0;

X if (op == RECEIVED_MESSAGE && pdu->command == GET_RSP_MSG){

X /* clone the pdu */
X state->pdu = newpdu = (struct snmp_pdu *)malloc(sizeof(struct snmp_pdu));
X bcopy((char *)pdu, (char *)newpdu, sizeof(struct snmp_pdu));
X newpdu->variables = 0;
X var = pdu->variables;


X if (var != NULL){

X newpdu->variables = newvar = (struct variable_list *)malloc(sizeof(struct variable_list));
X bcopy((char *)var, (char *)newvar, sizeof(struct variable_list));
X if (var->name != NULL){
X newvar->name = (oid *)malloc(var->name_length * sizeof(oid));
X bcopy((char *)var->name, (char *)newvar->name, var->name_length * sizeof(oid));
X }
X if (var->val.string != NULL){
X newvar->val.string = (u_char *)malloc(var->val_len);
X bcopy((char *)var->val.string, (char *)newvar->val.string, var->val_len);
X }
X newvar->next_variable = 0;
X while(var->next_variable){
X newvar->next_variable = (struct variable_list *)malloc(sizeof(struct variable_list));
X var = var->next_variable;
X newvar = newvar->next_variable;
X bcopy((char *)var, (char *)newvar, sizeof(struct variable_list));
X if (var->name != NULL){
X newvar->name = (oid *)malloc(var->name_length * sizeof(oid));
X bcopy((char *)var->name, (char *)newvar->name, var->name_length * sizeof(oid));
X }
X if (var->val.string != NULL){
X newvar->val.string = (u_char *)malloc(var->val_len);
X bcopy((char *)var->val.string, (char *)newvar->val.string, var->val_len);
X }
X newvar->next_variable = 0;
X }
X }
X state->status = STAT_SUCCESS;


X } else if (op == TIMED_OUT){

X state->status = STAT_TIMEOUT;
X }


X return 1;
X}
X

X
X/*
X * If there was an error in the input pdu, creates a clone of the pdu
X * that includes all the variables except the one marked by the errindex.
X * The command is set to the input command and the reqid, errstat, and
X * errindex are set to default values.
X * If the error status didn't indicate an error, the error index didn't
X * indicate a variable, the pdu wasn't a get response message, or there
X * would be no remaining variables, this function will return NULL.
X * If everything was successful, a pointer to the fixed cloned pdu will
X * be returned.
X */
Xstruct snmp_pdu *
Xsnmp_fix_pdu(pdu, command)
X struct snmp_pdu *pdu;
X int command;
X{
X struct variable_list *var, *newvar;
X struct snmp_pdu *newpdu;
X int index, copied = 0;
X
X if (pdu->command != GET_RSP_MSG || pdu->errstat == SNMP_ERR_NOERROR || pdu->errindex <= 0)
X return NULL;
X /* clone the pdu */
X newpdu = (struct snmp_pdu *)malloc(sizeof(struct snmp_pdu));
X bcopy((char *)pdu, (char *)newpdu, sizeof(struct snmp_pdu));
X newpdu->variables = 0;
X newpdu->command = command;
X newpdu->reqid = SNMP_DEFAULT_REQID;
X newpdu->errstat = SNMP_DEFAULT_ERRSTAT;
X newpdu->errindex = SNMP_DEFAULT_ERRINDEX;
X var = pdu->variables;
X index = 1;
X if (pdu->errindex == index){ /* skip first variable */
X var = var->next_variable;
X index++;


X }
X if (var != NULL){

X newpdu->variables = newvar = (struct variable_list *)malloc(sizeof(struct variable_list));
X bcopy((char *)var, (char *)newvar, sizeof(struct variable_list));
X if (var->name != NULL){
X newvar->name = (oid *)malloc(var->name_length * sizeof(oid));
X bcopy((char *)var->name, (char *)newvar->name, var->name_length * sizeof(oid));
X }
X if (var->val.string != NULL){
X newvar->val.string = (u_char *)malloc(var->val_len);
X bcopy((char *)var->val.string, (char *)newvar->val.string, var->val_len);
X }
X newvar->next_variable = 0;
X copied++;
X
X while(var->next_variable){
X var = var->next_variable;
X if (++index == pdu->errindex)
X continue;
X newvar->next_variable = (struct variable_list *)malloc(sizeof(struct variable_list));
X newvar = newvar->next_variable;
X bcopy((char *)var, (char *)newvar, sizeof(struct variable_list));
X if (var->name != NULL){
X newvar->name = (oid *)malloc(var->name_length * sizeof(oid));
X bcopy((char *)var->name, (char *)newvar->name, var->name_length * sizeof(oid));
X }
X if (var->val.string != NULL){
X newvar->val.string = (u_char *)malloc(var->val_len);
X bcopy((char *)var->val.string, (char *)newvar->val.string, var->val_len);
X }
X newvar->next_variable = 0;
X copied++;
X }
X }
X if (index < pdu->errindex || copied == 0){
X snmp_free_pdu(newpdu);
X return NULL;
X }
X return newpdu;
X}
X
X
Xint
Xsnmp_synch_response(ss, pdu, response)
X struct snmp_session *ss;
X struct snmp_pdu *pdu;
X struct snmp_pdu **response;
X{
X struct synch_state *state = &snmp_synch_state;
X int numfds, count;


X fd_set fdset;
X struct timeval timeout, *tvp;

X int block;
X
X
X if ((state->reqid = snmp_send(ss, pdu)) == 0){
X *response = NULL;
X snmp_free_pdu(pdu);
X return STAT_ERROR;


X }
X state->waiting = 1;
X

X while(state->waiting){


X numfds = 0;
X FD_ZERO(&fdset);

X block = 1;
X tvp = &timeout;
X timerclear(tvp);
X snmp_select_info(&numfds, &fdset, tvp, &block);
X if (block == 1)
X tvp = NULL; /* block without timeout */

X count = select(numfds, &fdset, 0, 0, tvp);
X if (count > 0){
X snmp_read(&fdset);


X } else switch(count){
X case 0:

X snmp_timeout();


X break;
X case -1:

X if (errno == EINTR){
X continue;
X } else {
X perror("select");
X }

X /* FALLTHRU */
X default:
X return STAT_ERROR;
X }
X }
X *response = state->pdu;
X return state->status;
X}
X
Xsnmp_synch_setup(session)


X struct snmp_session *session;
X{

X session->callback = snmp_synch_input;
X session->callback_magic = (void *)&snmp_synch_state;
X}
X
Xchar *error_string[6] = {
X "No Error",
X "Response message would have been too large.",
X "There is no such variable name in this MIB.",
X "The value given has the wrong type or length",
X "This variable is read only",
X "A general failure occured"
X};
X
Xchar *
Xsnmp_errstring(errstat)
X int errstat;
X{
X if (errstat <= SNMP_ERR_GENERR && errstat >= SNMP_ERR_NOERROR){
X return error_string[errstat];


X } else {
X return "Unknown Error";

X }
X}
END_OF_FILE
if test 9588 -ne `wc -c <'netramet/src/snmplib/snmpclnt.c'`; then
echo shar: \"'netramet/src/snmplib/snmpclnt.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/snmpclnt.c'
fi
echo shar: End of archive 21 \(of 25\).
cp /dev/null ark21isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:07:16 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 110
Archive-name: netramet/part22
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/copyright.notice
# netramet/doc/snmp/snmp_api.3 netramet/examples/rules.UofA
# netramet/mib/mib.UofA.txt netramet/src/apps/snmp_var_route.c
# netramet/src/meter/include/met_vars.h
# netramet/src/snmplib/include/snmpapi.h
# netramet/src/snmplib/include/snmpvars.h
# Wrapped by kent@sparky on Tue Nov 2 18:17:13 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 22 (of 25)."'
if test -f 'netramet/doc/NeTraMet/copyright.notice' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/copyright.notice'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/copyright.notice'\" \(8103 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/copyright.notice' <<'END_OF_FILE'
XNeTraMet is free software, distributed under the terms of
Xthe GNU Emacs general public license. A copy of this is attached; for
X'GNU Emacs' read 'NeTraMet,' for 'Richard M. Stallman' read 'Nevil
XBrownlee,' and for 'Free Software Foundation, Inc.' read 'The
XUniversity of Auckland.'
X
X--------------------------------------------------------------------------
X
X GNU EMACS GENERAL PUBLIC LICENSE
X (Clarified 11 Feb 1988)
X
X Copyright (C) 1985, 1987, 1988 Richard M. Stallman
X Everyone is permitted to copy and distribute verbatim copies
X of this license, but changing it is not allowed. You can also
X use this wording to make the terms for other programs.
X
X The license agreements of most software companies keep you at the
Xmercy of those companies. By contrast, our general public license is
Xintended to give everyone the right to share GNU Emacs. To make
Xsure that you get the rights we want you to have, we need to make
Xrestrictions that forbid anyone to deny you these rights or to ask you
Xto surrender the rights. Hence this license agreement.
X
X Specifically, we want to make sure that you have the right to give
Xaway copies of Emacs, that you receive source code or else can get it
Xif you want it, that you can change Emacs or use pieces of it in new
Xfree programs, and that you know you can do these things.
X
X To make sure that everyone has such rights, we have to forbid you to
Xdeprive anyone else of these rights. For example, if you distribute
Xcopies of Emacs, you must give the recipients all the rights that you
Xhave. You must make sure that they, too, receive or can get the
Xsource code. And you must tell them their rights.
X
X Also, for our own protection, we must make certain that everyone
Xfinds out that there is no warranty for GNU Emacs. If Emacs is
Xmodified by someone else and passed on, we want its recipients to know
Xthat what they have is not what we distributed, so that any problems
Xintroduced by others will not reflect on our reputation.
X
X Therefore we (Richard Stallman and the Free Software Fundation,
XInc.) make the following terms which say what you must do to be
Xallowed to distribute or change GNU Emacs.
X
X COPYING POLICIES
X
X 1. You may copy and distribute verbatim copies of GNU Emacs source code
Xas you receive it, in any medium, provided that you conspicuously and
Xappropriately publish on each copy a valid copyright notice "Copyright
X(C) 1988 Free Software Foundation, Inc." (or with whatever year is
Xappropriate); keep intact the notices on all files that refer to this
XLicense Agreement and to the absence of any warranty; and give any
Xother recipients of the GNU Emacs program a copy of this License
XAgreement along with the program. You may charge a distribution fee
Xfor the physical act of transferring a copy.
X
X 2. You may modify your copy or copies of GNU Emacs source code or
Xany portion of it, and copy and distribute such modifications under
Xthe terms of Paragraph 1 above, provided that you also do the following:
X
X a) cause the modified files to carry prominent notices stating
X that you changed the files and the date of any change; and
X
X b) cause the whole of any work that you distribute or publish,
X that in whole or in part contains or is a derivative of GNU Emacs
X or any part thereof, to be licensed at no charge to all third
X parties on terms identical to those contained in this License
X Agreement (except that you may choose to grant more extensive
X warranty protection to some or all third parties, at your option).
X
X c) if the modified program serves as a text editor, cause it when
X started running in the simplest and usual way, to print an
X announcement including a valid copyright notice "Copyright (C)
X 1988 Free Software Foundation, Inc." (or with the year that is
X appropriate), saying that there is no warranty (or else, saying
X that you provide a warranty) and that users may redistribute the
X program under these conditions, and telling the user how to view a
X copy of this License Agreement.
X
X d) You may charge a distribution fee for the physical act of
X transferring a copy, and you may at your option offer warranty
X protection in exchange for a fee.
X
XMere aggregation of another unrelated program with this program (or its
Xderivative) on a volume of a storage or distribution medium does not bring
Xthe other program under the scope of these terms.
X
X 3. You may copy and distribute GNU Emacs (or a portion or derivative of it,
Xunder Paragraph 2) in object code or executable form under the terms of
XParagraphs 1 and 2 above provided that you also do one of the following:
X
X a) accompany it with the complete corresponding machine-readable
X source code, which must be distributed under the terms of
X Paragraphs 1 and 2 above; or,
X
X b) accompany it with a written offer, valid for at least three
X years, to give any third party free (except for a nominal
X shipping charge) a complete machine-readable copy of the
X corresponding source code, to be distributed under the terms of
X Paragraphs 1 and 2 above; or,
X
X c) accompany it with the information you received as to where the
X corresponding source code may be obtained. (This alternative is
X allowed only for noncommercial distribution and only if you
X received the program in object code or executable form alone.)
X
XFor an executable file, complete source code means all the source code for
Xall modules it contains; but, as a special exception, it need not include
Xsource code for modules which are standard libraries that accompany the
Xoperating system on which the executable file runs.
X
X 4. You may not copy, sublicense, distribute or transfer GNU Emacs
Xexcept as expressly provided under this License Agreement. Any attempt
Xotherwise to copy, sublicense, distribute or transfer GNU Emacs is void and
Xyour rights to use GNU Emacs under this License agreement shall be
Xautomatically terminated. However, parties who have received computer
Xsoftware programs from you with this License Agreement will not have
Xtheir licenses terminated so long as such parties remain in full compliance.
X
X 5. If you wish to incorporate parts of GNU Emacs into other free programs
Xwhose distribution conditions are different, write to the Free Software
XFoundation. We have not yet worked out a simple rule that can be stated
Xhere, but we will often permit this. We will be guided by the two goals of
Xpreserving the free status of all derivatives of our free software and of
Xpromoting the sharing and reuse of software.
X
XYour comments and suggestions about our licensing policies and our
Xsoftware are welcome! Please contact the Free Software Foundation, Inc.,
X675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296.
X
X NO WARRANTY
X
X BECAUSE GNU EMACS IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
XNO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT
XWHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
XRICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GNU EMACS "AS IS"
XWITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
XBUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY
XAND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE GNU EMACS
XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
XSERVICING, REPAIR OR CORRECTION.
X
X IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL FREE SOFTWARE
XFOUNDATION, INC., RICHARD M. STALLMAN, AND/OR ANY OTHER PARTY WHO MAY
XMODIFY AND REDISTRIBUTE GNU EMACS AS PERMITTED ABOVE, BE LIABLE TO YOU
XFOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER
XSPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
XINABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
XBEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A
XFAILURE OF THE PROGRAM TO OPERATE WITH PROGRAMS NOT DISTRIBUTED BY
XFREE SOFTWARE FOUNDATION, INC.) THE PROGRAM, EVEN IF YOU HAVE BEEN
XADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY
XOTHER PARTY.
X
END_OF_FILE
if test 8103 -ne `wc -c <'netramet/doc/NeTraMet/copyright.notice'`; then
echo shar: \"'netramet/doc/NeTraMet/copyright.notice'\" unpacked with wrong size!
fi
# end of 'netramet/doc/NeTraMet/copyright.notice'
fi
if test -f 'netramet/doc/snmp/snmp_api.3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmp_api.3'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmp_api.3'\" \(8220 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmp_api.3' <<'END_OF_FILE'


X.\* /***********************************************************
X.\" Copyright 1989 by Carnegie Mellon University
X.\"
X.\" All Rights Reserved
X.\"

X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/
X.TH SNMP_API 3 "Sept 17, 1989"
X.UC 5
X.SH NAME
Xsnmp_open, snmp_close, snmp_send, snmp_read, snmp_free_pdu, snmp_select_info, snmp_timeout \- send and receive SNMP messages
X.SH SYNOPSIS
X.B "#include <sys/types>
X.br
X.B "#include <netinet/in.h>
X.br
X.B "#include <sys/time.h>
X.br
X.B #include """snmp.h""
X.br
X.B #include """snmp_impl.h""
X.br
X.B #include """asn1.h""
X.br
X.B #include """snmp_api.c""
X.PP
X.B "extern int snmp_errno;
X.PP
X.B "struct snmp_session *snmp_open(session)
X.br
X.B "struct snmp_session *session;
X.PP
X.B "int snmp_close(session)
X.br
X.B "struct snmp_session *session;
X.PP
X.B "int snmp_send(session, pdu)
X.br
X.B "struct snmp_session *session;
X.br
X.B "struct snmp_pdu *pdu;
X.PP
X.B "void snmp_read(fdset)
X.br
X.B "fd_set *fdset;
X.PP
X.B "int snmp_select_info(numfds, fdset, timeout, block)
X.br
X.B "int *numfds;
X.br
X.B "fd_set *fdset;
X.br
X.B "struct timeval *timeout;
X.br
X.B "int *block;
X.PP
X.B "void snmp_timeout()
X.PP
X.B "void snmp_free_pdu(pdu)
X.br
X.B "struct snmp_pdu *pdu;
X.PP
X.SH DESCRIPTION
X.I Snmp_open, snmp_close,
Xand
X.I snmp_send
Xeach take as input a pointer to an object with the
Xfollowing structure. In addition,
X.I snmp_open
Xalso returns a pointer to an object with this structure.
XThis structure contains information for a set of transactions that
Xwill share similar transport characteristics.
X.RS
X.PP
X.nf
Xtypedef struct sockaddr_in ipaddr;
X
Xstruct snmp_session {
X u_char *community; /* community for outgoing requests. */
X int community_len; /* Length of community name. */
X int retries; /* Number of retries before timeout. */
X long timeout; /* Number of uS until first timeout, then exponential backoff */
X char *peername; /* Domain name or dotted IP address of default peer */
X u_short remote_port;/* UDP port number of peer. */
X u_short local_port; /* My UDP port number, 0 for default, picked randomly */
X
X /* Authentication function or NULL if null authentication is used */
X u_char *(*authenticator)();
X
X int (*callback)(); /* Function to interpret incoming data */
X
X /* Pointer to data that the callback function may consider important */
X void *callback_magic;
X};
X
X/*
X * Set fields in session and pdu to the following to get a default or unconfigured value.
X */
X#define SNMP_DEFAULT_COMMUNITY_LEN 0/* for default community name */
X#define SNMP_DEFAULT_RETRIES -1
X#define SNMP_DEFAULT_TIMEOUT -1
X#define SNMP_DEFAULT_REMPORT 0
X#define SNMP_DEFAULT_REQID 0
X#define SNMP_DEFAULT_ERRSTAT -1
X#define SNMP_DEFAULT_ERRINDEX -1
X#define SNMP_DEFAULT_ADDRESS 0
X#define SNMP_DEFAULT_PEERNAME NULL
X#define SNMP_DEFAULT_ENTERPRISE_LENGTH 0
X#define SNMP_DEFAULT_TIME 0
X
X/*
X * This routine must be supplied by the application:
X *
X * u_char *authenticator(pdu, length, community, community_len)
X * u_char *pdu; The rest of the PDU to be authenticated
X * int *length; The length of the PDU (updated by the authenticator)
X * u_char *community; The community name to authenticate under.
X * int community_len The length of the community name.
X *
X * Returns the authenticated pdu, or NULL if authentication failed.
X * If null authentication is used, the authenticator in snmp_session can be
X * set to NULL(0).
X */
X
X/*
X * This routine must be supplied by the application:
X *
X * int callback(operation, session, reqid, pdu, magic)
X * int operation;
X * struct snmp_session *session; The session authenticated under.
X * int reqid; The request id of this pdu (0 for TRAP)
X * struct snmp_pdu *pdu; The pdu information.
X * void *magic A link to the data for this routine.
X *
X * Returns 1 if request was successful, 0 if it should be kept pending.
X * Any data in the pdu must be copied because it will be freed elsewhere.
X * Operations are defined below:
X */
X#define RECEIVED_MESSAGE 1
X#define TIMED_OUT 2
X.ft R
X.ad
X.fi
X.RE
X.PP
X.I Snmp_send
Xand
X.I snmp_free_pdu
Xeach take as input a pointer to an object with the
Xfollowing structure.
XThis structure contains information that describes a transaction
Xthat will be performed over an open session.
X.RS
X.PP
X.nf
Xstruct snmp_pdu {
X ipaddr address; /* Address of peer */
X
X int command; /* Type of this PDU */
X
X u_long reqid; /* Request id */
X u_long errstat; /* Error status */
X u_long errindex; /* Error index */
X
X /* Trap information */
X oid *enterprise;/* System OID */
X int enterprise_length;
X ipaddr agent_addr; /* address of object generating trap */
X int trap_type; /* trap type */
X int specific_type; /* specific type */
X u_long time; /* Uptime */
X
X struct variable_list *variables;
X};
X
X
Xstruct variable_list {
X struct variable_list *next_variable; /* NULL for last variable */
X oid *name; /* Object identifier of variable */
X int name_length; /* number of subid's in name */
X u_char type; /* ASN type of variable */
X union { /* value of variable */
X long *integer;
X u_char *string;
X oid *objid;
X } val;
X int val_len;
X};
X.ft R
X.ad
X.fi
X.RE
X.PP
X.I Snmp_read, snmp_select_info,
Xand
X.I snmp_timeout
Xprovide an interface for the use of the
X.IR select (2)
Xsystem call so that SNMP transactions can occur asynchronously.
X.PP
X.I Snmp_select_info
Xis given the information that would have been passed to
X.I select
Xin the absence of SNMP. For example, this might include window update information.
XThis information is modified so that SNMP will get the service it requires from the
Xcall to
X.I select.
XIn this case,
X.I numfds, fdset,
Xand
X.I timeout
Xcorrespond to the
X.I nfds, readfds,
Xand
X.I timeout
Xarguments to
X.I select,
Xrespectively. The only exception is that timeout must always point to an allocated (but perhaps uninitialized)
X.I struct timeval.
XIf
X.I timeout
Xwould have been passed as NULL,
X.I block
Xis set to true, and
X.I timeout
Xis treated as undefined. This same rule applies upon return from
X.I snmp_select_info.
X.PP
XAfter calling
X.I snmp_select_info, select
Xis called with the returned data. When select returns,
X.I snmp_read
Xis called with the
X.I fd_set
Xreturned from
X.I select.
XThis will read all SNMP sockets with input.
XIf
X.I select
Xtimes out,
X.I snmp_timeout
Xshould be called to see if the timeout was intended for SNMP.
X.SH DIAGNOSTICS
X.PP
XError return status from
X.I snmp_open
Xis indicated by return of a null pointer.
XError return status from
X.I snmp_close
Xand
X.I snmp_send
Xis indicated by return of 0. A successful status will return a 1.
XThe external integer
X.IR snmp_errno
Xmay then be checked to see what type of error has occurred
X.PP
X.IR snmp_errno
Xcan have the following values:
X.RS
X.IP SNMPERR_GENERR \w'SNMPERR_BAD_LOCPORT'u+2n
XA generic error occurred.
X.IP SNMPERR_BAD_LOCPORT \w'SNMPERR_BAD_LOCPORT'u+2n
XThe local port was bad because it had already been
Xallocated or permission was denied.
X.IP SNMPERR_BAD_ADDRESS \w'SNMPERR_BAD_LOCPORT'u+2n
XThe host name or address given was not useable.
X.IP SNMPERR_BAD_SESSION \w'SNMPERR_BAD_SESSION'u+2n
XThe specified session was not open.
X.RE
X.SH "SEE ALSO"
Xselect(2), snmp_api.h
END_OF_FILE
if test 8220 -ne `wc -c <'netramet/doc/snmp/snmp_api.3'`; then
echo shar: \"'netramet/doc/snmp/snmp_api.3'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmp_api.3'
fi
if test -f 'netramet/examples/rules.UofA' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/examples/rules.UofA'\"
else
echo shar: Extracting \"'netramet/examples/rules.UofA'\" \(6310 characters\)
sed "s/^X//" >'netramet/examples/rules.UofA' <<'END_OF_FILE'
X# 1440, Fri 1 Oct 93
X#
X# Rule specification file to tally traffic for Auckland, using
X# three groups of sites: UA, Local, NZ
X#
X# Nevil Brownlee, Computer Centre, University of Auckland
X#
XSET 8 # Rule + action set number
X#
XRULES
X#
XSourcePeerType & 255 = IP : Pushto, 7; # 1
XNull & 0 = 0 : Succeed, 0; # 2 Ignore
X#
XNull & 0 = 0 : Succeed, 0; # 3 Ignore
XNull & 0 = 0 : Succeed, 0; # 4 Ignore


XNull & 0 = 0 : Succeed, 0; # 5 Ignore

XNull & 0 = 0 : Succeed, 0; # 6 Ignore
X#
XSourcePeerAddress & 255.255.0.0 = 130.216.0.0 : Pushto, 33 # 7 UA
X#
XSourcePeerAddress & 255.255.255.0 = 192.156.165.0 : Pushto, 31 # 8 decus
XSourcePeerAddress & 255.255.255.0 = 192.251.230.0 : Pushto, 31 # 9 clearfield
XSourcePeerAddress & 255.255.255.0 = 202.12.104.0 : Pushto, 31 # 10 dse
XSourcePeerAddress & 255.255.255.0 = 202.12.105.0 : Pushto, 31 # 11 f&p
XSourcePeerAddress & 255.255.255.0 = 202.14.100.0 : Pushto, 31 # 12 status
XSourcePeerAddress & 255.255.255.0 = 202.14.102.0 : Pushto, 31 # 13 kcbbs
XSourcePeerAddress & 255.255.255.0 = 202.14.216.0 : Pushto, 31 # 14 manakau
XSourcePeerAddress & 255.255.255.0 = 202.14.217.0 : Pushto, 31 # 15 maleficarun
XSourcePeerAddress & 255.255.255.0 = 202.14.252.0 : Pushto, 31 # 16 cray 1
XSourcePeerAddress & 255.255.255.0 = 202.14.253.0 : Pushto, 31 # 17 cray 2
XSourcePeerAddress & 255.255.255.0 = 202.14.254.0 : Pushto, 31 # 18 cray 3
X#
XSourcePeerAddress & 255.255.0.0 = 156.62.0.0 : Pushto, 31 # 19 ati
X#
X# Source isn't UA or local
X#
XNull & 0 = 0 : Fail, 0; # 20 Try match again
X#
XNull & 0 = 0 : Succeed, 0; # 21
XNull & 0 = 0 : Succeed, 0; # 22
XNull & 0 = 0 : Succeed, 0; # 23
XNull & 0 = 0 : Succeed, 0; # 24
XNull & 0 = 0 : Succeed, 0; # 25
XNull & 0 = 0 : Succeed, 0; # 26
XNull & 0 = 0 : Succeed, 0; # 27
XNull & 0 = 0 : Succeed, 0; # 28
XNull & 0 = 0 : Succeed, 0; # 29
XNull & 0 = 0 : Succeed, 0; # 30
X#
X# Source is local
X#
XDestPeerAddress & 255.255.0.0 = 130.216.0.0 : Fail, 0; # 31 Retry match
XNull & 0 = 0 : Pushto, 34; # 32 Tally packet
X#
X# Source is UA
X#
XDestPeerAddress & 255.255.0.0 = 130.216.0.0 : Count, 0; # 33 UA-UA
X#
X# Direction determined; tally the packet
X#
XDestPeerAddress & 140.200.0.0 = 255.255.0.0 : Pushto, 48; # 34 Tuia: tally C
X#
XDestPeerAddress & 192.0.0.0 = 192.0.0.0 : Pushto, 49; # 35 Tally C
XDestPeerAddress & 192.0.0.0 = 128.0.0.0 : Pushto, 43; # 36 Tally B
X#
XSourceDetailType & 255 = icmp : Tally, 4; # 37 Tally A
XSourceDetailAddress & 255.255 = domain : Tally, 7; # 38
XDestDetailAddress & 255.255 = domain : Tally, 7; # 39
XDestDetailAddress & 255.255 = ftpdata : Tally, 10; # 40
XSourceDetailAddress & 255.255 = ftpdata : Tally, 13; # 41
XNull & 0 = 0 : Tally, 1; # 42
X#
XSourceDetailType & 255 = icmp : Tally, 5; # 43 Tally B
XSourceDetailAddress & 255.255 = domain : Tally, 8; # 44
XDestDetailAddress & 255.255 = domain : Tally, 8; # 45
XDestDetailAddress & 255.255 = ftpdata : Tally, 11; # 46
XSourceDetailAddress & 255.255 = ftpdata : Tally, 14; # 47
XNull & 0 = 0 : Tally, 2; # 48
X#
XSourceDetailType & 255 = icmp : Tally, 6; # 49 Tally C
XSourceDetailAddress & 255.255 = domain : Tally, 9; # 50
XDestDetailAddress & 255.255 = domain : Tally, 9; # 51
XDestDetailAddress & 255.255 = ftpdata : Tally, 12; # 52
XSourceDetailAddress & 255.255 = ftpdata : Tally, 15; # 53
XNull & 0 = 0 : Tally, 3; # 54
X#
XACTIONS
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 1 Tally ports A
X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 2 Tally ports B
X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 3 Tally ports C
X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 4 Tally icmp A
X SourceDetailType=icmp, DestDetailType=icmp;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 5 Tally icmp B
X SourceDetailType=icmp, DestDetailType=icmp;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 6 Tally icmp C
X SourceDetailType=icmp, DestDetailType=icmp;
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 7 Tally domain A
X SourceDetailTypeMask=255,
X SourceDetailAddress=domain, DestDetailAddress=domain;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 8 Tally domain B
X SourceDetailTypeMask=255,
X SourceDetailAddress=domain, DestDetailAddress=domain;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 9 Tally domain C
X SourceDetailTypeMask=255,
X SourceDetailAddress=domain, DestDetailAddress=domain;
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 10 Tally ftp in A
X SourceDetailTypeMask=255, DestDetailAddress=ftpdata;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 11 Tally ftp in B
X SourceDetailTypeMask=255, DestDetailAddress=ftpdata;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 12 Tally ftp in C
X SourceDetailTypeMask=255, DestDetailAddress=ftpdata;
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 13 Tally ftp out A
X SourceDetailTypeMask=255, SourceDetailAddress=ftpdata;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 14 Tally ftp out B
X SourceDetailTypeMask=255, SourceDetailAddress=ftpdata;
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 15 Tally ftp out C
X SourceDetailTypeMask=255, SourceDetailAddress=ftpdata;


X#
XFORMAT FlowRuleSet FlowIndex FirstTime " "

X# SourceAdjacentAddress DestAdjacentAddress " "
X# SourcePeerType
X SourcePeerAddress DestPeerAddress " "
X SourceDetailType SourceDetailAddress DestDetailAddress " "


X ToPDUs FromPDUs " " ToOctets FromOctets;
X#

XSTATISTICS # Collect meter statistics


X#
X# end of file
END_OF_FILE

if test 6310 -ne `wc -c <'netramet/examples/rules.UofA'`; then
echo shar: \"'netramet/examples/rules.UofA'\" unpacked with wrong size!
fi
# end of 'netramet/examples/rules.UofA'
fi
if test -f 'netramet/mib/mib.UofA.txt' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/mib/mib.UofA.txt'\"
else
echo shar: Extracting \"'netramet/mib/mib.UofA.txt'\" \(3743 characters\)
sed "s/^X//" >'netramet/mib/mib.UofA.txt' <<'END_OF_FILE'


X -- Auckland University Monitor MIB

X -- Nevil Brownlee, 5 Oct 93
X


X UofAuckland OBJECT IDENTIFIER ::= { enterprises 411 }
X
X MeterStats OBJECT IDENTIFIER ::= { UofAuckland 1 }
X
X msStatsReset OBJECT-TYPE -- Write to zero statistics counters

X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X ::= { MeterStats 1 }
X
X msStatsTime OBJECT-TYPE -- Seconds since stats counters were zeroed

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 2 }
X
X msNbrPackets OBJECT-TYPE -- Nbr of packets this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 3 }
X
X msTotalPacketBacklog OBJECT-TYPE -- Sum of pkt backlogs this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 4 }
X
X msMaxPacketRate OBJECT-TYPE -- Max packet rate this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 5 }
X
X msMaxPacketBacklog OBJECT-TYPE -- Max packet backlog this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 6 }
X
X msNbrFlows OBJECT-TYPE -- Nbr of flows currently in use

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 7 }
X
X msFlowsRecovered OBJECT-TYPE -- Flows recovered during this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 8 }
X
X msRuleMatches OBJECT-TYPE -- Rules matched during this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 9 }
X
X msHashSearches OBJECT-TYPE -- Tally hash searches this stats interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 10 }
X
X msHashCompares OBJECT-TYPE -- Compares for tally searches this interval

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 11 }
X
X msTotalHashSize OBJECT-TYPE -- Current sum of tally hash table sizes

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 12 }
X
X msNbrHashEntries OBJECT-TYPE -- Nbr of in-use slots in tally hash tables

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 13 }
X
X msGarbageCollectInterval OBJECT-TYPE -- Seconds between G.C. invocations

X SYNTAX INTEGER
X ACCESS read-write
X STATUS mandatory

X ::= { MeterStats 14 }
X
X msMaxFlows OBJECT-TYPE -- Max nbr of flows in meter's flows table

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 15 }
X
X msAvIdlePer1000 OBJECT-TYPE -- Average idle processor % * 10

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 16 }
X
X msMinIdlePer1000 OBJECT-TYPE -- Minimum idels processor % * 10

X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { MeterStats 17 }
X
X
X pcSystem OBJECT IDENTIFIER ::= { UofAuckland 2 }
X

X pcNearMem OBJECT-TYPE


X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { pcSystem 1 }
X

X pcFarMem OBJECT-TYPE


X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { pcSystem 2 }
X

X pcBadPackets OBJECT-TYPE


X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { pcSystem 3 }
X

X pcNoBufPackets OBJECT-TYPE


X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { pcSystem 4 }
X

X pcLostPackets OBJECT-TYPE


X SYNTAX INTEGER
X ACCESS read-only
X STATUS mandatory

X ::= { pcSystem 5 }
END_OF_FILE

if test 3743 -ne `wc -c <'netramet/mib/mib.UofA.txt'`; then
echo shar: \"'netramet/mib/mib.UofA.txt'\" unpacked with wrong size!
fi
# end of 'netramet/mib/mib.UofA.txt'
fi
if test -f 'netramet/src/apps/snmp_var_route.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmp_var_route.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmp_var_route.c'\" \(8556 characters\)
sed "s/^X//" >'netramet/src/apps/snmp_var_route.c' <<'END_OF_FILE'
X/*
X * snmp_var_route.c - return a pointer to the named variable.
X *


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University

X Copyright 1989 TGV, Incorporated


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU and TGV not be used

Xin advertising or publicity pertaining to distribution of the software
Xwithout specific, written prior permission.
X


XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
XPERFORMANCE OF THIS SOFTWARE.
X******************************************************************/
X

X#define GATEWAY /* MultiNet is always configured this way! */
X#include <sys/types.h>
X#include <sys/socket.h>

X#include <sys/time.h>
X#include <netinet/in.h>
X#include <syslog.h>
X/* #include <sys/mbuf.h> */
X#include <net/if.h>
X#define KERNEL /* to get routehash and RTHASHSIZ */
X#include <net/route.h>
X#undef KERNEL
X#define rt_unit rt_hash /* Reuse this field for device # */
X#include <nlist.h>


X#ifndef NULL
X#define NULL 0
X#endif
X

X#define CACHE_TIME (120) /* Seconds */
X
X#include "ausnmp.h"
X


X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"

X#include "mib.h"
X#include "snmp_vars.h"
X
Xstatic struct rtentry **rthead=0;
Xstatic int rtsize=0, rtalloc=0;


X
Xstatic struct nlist nl[] = {

X#define N_RTHOST 0
X { "_rthost" },
X#define N_RTNET 1
X { "_rtnet" },
X#define N_RTHASHSIZE 2
X { "_rthashsize" },
X 0,


X};
X
Xu_char *
Xvar_ipRouteEntry(vp, name, length, exact, var_len, access_method)
X register struct variable *vp; /* IN - pointer to variable entry that points here */
X register oid *name; /* IN/OUT - input name requested, output name found */
X register int *length; /* IN/OUT - length of input and output strings */
X int exact; /* IN - TRUE if an exact match was requested. */
X int *var_len; /* OUT - length of variable or 0 if function returned. */
X int *access_method; /* OUT - 1 if function, 0 if char pointer. */

X{
X /*


X * object identifier is of form:

X * 1.3.6.1.2.1.4.21.1.1.A.B.C.D, where A.B.C.D is IP address.


X * IPADDR starts at offset 10.
X */

X register int Save_Valid, result, RtIndex;
X static int saveNameLen=0, saveExact=0, saveRtIndex=0;
X static oid saveName[14], Current[14];


X u_char *cp;
X oid *op;
X

X
X /*
X * OPTIMIZATION:
X *
X * If the name was the same as the last name, with the possible
X * exception of the [9]th token, then don't read the routing table
X *
X */
X
X if ((saveNameLen == *length) && (saveExact == exact)) {
X register int temp=name[9];
X name[9] = 0;
X Save_Valid = (compare(name, *length, saveName, saveNameLen) == 0);
X name[9] = temp;
X } else Save_Valid = 0;
X
X if (Save_Valid) {
X register int temp=name[9]; /* Fix up 'lowest' found entry */
X bcopy((char *) Current, (char *) name, 14 * sizeof(oid));
X name[9] = temp;
X *length = 14;
X RtIndex = saveRtIndex;
X } else {


X /* fill in object part of name for current (less sizeof instance part) */
X

X bcopy((char *)vp->name, (char *)Current, (int)(vp->namelen - 4) * sizeof(oid));
X
X#if 0
X /*
X * Only reload if this is the start of a wildcard
X */
X if (*length < 14) {
X Route_Scan_Reload();
X }
X#else
X Route_Scan_Reload();
X#endif
X for(RtIndex=0; RtIndex < rtsize; RtIndex++) {
X cp = (u_char *)&(((struct sockaddr_in *) &(rthead[RtIndex]->rt_dst))->sin_addr.s_addr);
X op = Current + 10;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X *op++ = *cp++;
X
X result = compare(name, *length, Current, 14);


X if ((exact && (result == 0)) || (!exact && (result < 0)))

X break;
X }
X if (RtIndex >= rtsize) return(NULL);
X /*
X * Save in the 'cache'
X */
X bcopy((char *) name, (char *) saveName, *length * sizeof(oid));
X saveName[9] = '\0';
X saveNameLen = *length;
X saveExact = exact;
X saveRtIndex = RtIndex;
X /*


X * Return the name

X */
X bcopy((char *) Current, (char *) name, 14 * sizeof(oid));
X *length = 14;
X }
X
X *access_method = 0;
X *var_len = sizeof(long_return);
X switch(vp->magic){
X case IPROUTEDEST:
X return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_dst)->sin_addr.s_addr;
X case IPROUTEIFINDEX:
X long_return = rthead[RtIndex]->rt_unit;
X return (u_char *)&long_return;
X case IPROUTEMETRIC1:
X long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 1 : 0;
X return (u_char *)&long_return;
X case IPROUTEMETRIC2:
X long_return = -1;
X return (u_char *)&long_return;
X case IPROUTEMETRIC3:
X long_return = -1;
X return (u_char *)&long_return;
X case IPROUTEMETRIC4:
X long_return = -1;
X return (u_char *)&long_return;
X case IPROUTENEXTHOP:
X return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_gateway)->sin_addr.s_addr;
X case IPROUTETYPE:
X long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 4 : 3;
X return (u_char *)&long_return;
X case IPROUTEPROTO:
X long_return = (rthead[RtIndex]->rt_flags & RTF_DYNAMIC) ? 4 : 2;
X return (u_char *)&long_return;
X case IPROUTEAGE:
X long_return = 0;


X return (u_char *)&long_return;
X default:
X ERROR("");
X }

X return NULL;
X}
X

Xinit_routes(){


X
X nlist("/vmunix",nl);
X}

X
Xstatic Route_Scan_Reload()
X{
X#ifdef XXYYZZ
X struct mbuf **routehash, mb;
X register struct mbuf *m;
X struct ifnet ifnet;
X struct rtentry *rt;
X int i, table, qsort_compare();
X register char *cp;
X char name[16], temp[16];
X static int Time_Of_Last_Reload=0;
X struct timeval now;
X int hashsize;


X
X gettimeofday(&now, (struct timezone *)0);

X if (Time_Of_Last_Reload+CACHE_TIME > now.tv_sec)
X return;
X Time_Of_Last_Reload = now.tv_sec;
X
X /*
X * Makes sure we have SOME space allocated for new routing entries
X */
X if (!rthead) {
X rthead = (struct rtentry **) malloc(100 * sizeof(struct rtentry *));
X bzero((char *)rthead, 100 * sizeof(struct rtentry *));
X rtalloc = 100;
X }
X
X for (table=N_RTHOST; table<=N_RTNET; table++) {
X klseek(nl[N_RTHASHSIZE].n_value);
X klread((char *)&hashsize, sizeof(hashsize));
X routehash = (struct mbuf **)malloc(hashsize * sizeof(struct mbuf *));
X klseek(nl[table].n_value);
X klread((char *)routehash, hashsize * sizeof(struct mbuf *));
X for (i = 0; i < hashsize; i++) {
X if (routehash[i] == 0)
X continue;
X m = routehash[i];
X while (m) {
X /*
X * Dig the route out of the kernel...
X */
X klseek(m);
X klread(&mb, sizeof (mb));
X m = mb.m_next;
X rt = mtod(&mb, struct rtentry *);
X if (rt->rt_ifp != 0) {
X klseek(rt->rt_ifp);
X klread((char *)&ifnet, sizeof (ifnet));
X klseek((int)ifnet.if_name);
X klread(name, 16);


X name[15] = '\0';

X cp = (char *) index(name, '\0');


X *cp++ = ifnet.if_unit + '0';
X *cp = '\0';

X/* if (strcmp(name,"lo0") == 0) continue; */
X Interface_Scan_Init();
X while (Interface_Scan_Next(&rt->rt_unit, temp, 0, 0) != 0) {
X if (strcmp(name, temp) == 0) break;
X }
X }
X /*
X * Allocate a block to hold it and add it to the database
X */
X if (rtsize >= rtalloc) {
X rthead = (struct rtentry **) realloc((char *)rthead, 2 * rtalloc * sizeof(struct rtentry *));
X bzero((char *) &rthead[rtalloc], rtalloc * sizeof(struct rtentry *));
X rtalloc *= 2;
X }
X if (!rthead[rtsize])
X rthead[rtsize] = (struct rtentry *) malloc(sizeof(struct rtentry));
X /*
X * Add this to the database
X */
X bcopy((char *)rt, (char *)rthead[rtsize], sizeof(struct rtentry));
X rtsize++;
X }
X }
X }
X /*
X * Sort it!
X */
X qsort((char *)rthead,rtsize,sizeof(rthead[0]),qsort_compare);
X#endif /* $$$ */
X}
X
X
X
X/*
X * Create a host table
X */
Xstatic int qsort_compare(r1,r2)
Xstruct rtentry **r1, **r2;
X{
X register u_long dst1 = ntohl(((struct sockaddr_in *) &((*r1)->rt_dst))->sin_addr.s_addr);
X register u_long dst2 = ntohl(((struct sockaddr_in *) &((*r2)->rt_dst))->sin_addr.s_addr);
X
X /*
X * Do the comparison
X */
X if (dst1 == dst2) return(0);
X if (dst1 > dst2) return(1);
X return(-1);
X}
END_OF_FILE
if test 8556 -ne `wc -c <'netramet/src/apps/snmp_var_route.c'`; then
echo shar: \"'netramet/src/apps/snmp_var_route.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmp_var_route.c'
fi
if test -f 'netramet/src/meter/include/met_vars.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/include/met_vars.h'\"
else
echo shar: Extracting \"'netramet/src/meter/include/met_vars.h'\" \(8490 characters\)
sed "s/^X//" >'netramet/src/meter/include/met_vars.h' <<'END_OF_FILE'
X/* 1125, Tue 5 Oct 93
X
X MET_VARS.H: Data structures for AU Meter SNMP interface


X
X Copyright (C) 1992,1993 by Nevil Brownlee,

X Computer Centre, University of Auckland */
X
X/* Definitions for SNMP (RFC 1067) agent variable finder.
X *
X *


X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University

X Copyright 1989 TGV, Incorporated


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU and TGV not be used

Xin advertising or publicity pertaining to distribution of the software
Xwithout specific, written prior permission.
X


XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
XPERFORMANCE OF THIS SOFTWARE.
X******************************************************************/
X

Xu_char far *var_system();
Xu_char far *var_ifEntry();
Xu_char far *var_atEntry();
Xu_char far *var_ip();
Xu_char far *var_ipAddrEntry();
Xu_char far *var_ipRouteEntry();
Xu_char far *var_icmp();
Xu_char far *var_tcp();
Xu_char far *var_udp();
Xu_char far *var_process();
Xu_char far *var_event();
Xu_char far *var_rinfo(); /* Internet Accounting .. */
Xu_char far *var_col_tbl();
Xu_char far *var_ft();
Xu_char far *var_flow_index();
Xu_char far *var_rt();
Xu_char far *getStatPtr();


X
Xextern long long_return;
Xextern u_char return_buf[];
X

X#define INST 0xFFFFFFFF /* used to fill out the instance field of the variables table */
X
X/*


X * These are unit magic numbers for each variable.
X */
X
X#define VERSION_DESCR 0
X#define VERSION_ID 1

X#define UPTIME 3
X#define IFNUMBER 2
X
X#define HIGHWATERMARK 11 /* 1 in SNMP */
X#define FLOODMARK 12
X#define INACT_TIMEOUT 13
X#define LAST_COLLECT_TIME 16
X#define CURRENT_RULE_SET 18
X#define EMERGENCY_RULE_SET 19
X
X#define MSSTATSRESET 31
X#define MSSTATSTIME 32
X#define MSNPACKETS 33
X#define MSTBACKLOG 34
X#define MSMXPKTRATE 35
X#define MSMXBACKLOG 36
X#define MSNFLOWS 37
X#define MSFLOWSRCV 38
X#define MSNMATCHES 39
X#define MSHASHSRCHS 40
X#define MSHASHCMPS 41
X#define MSTHASHSZ 42
X#define MSNHASHENTS 43
X#define MSGCINTERVAL 44
X#define MSMXFLOWS 45
X#define MSAVIDLEPER1000 46
X#define MSMINIDLEPER1000 47
X
X#define PCNEARMEM 61
X#define PCFARMEM 62
X#define PCBADPKTS 63
X#define PCNOBUFPKTS 64
X#define PCLOSTPKTS 65

X#define RIINDEX 1
X#define RIRULESIZE 2
X#define RIACTIONSIZE 3
X
X#define CIINDEX 11
X#define CIPEERADDR 12
X#define CILASTTIME 13
X#define CIPREVTIME 14
X
X/* FT defines for flow table moved to flowhash.h */
X
X#define FTCRFIRSTTIME 0
X#define FTCRFLOWINDEX 1
X#define FTACFIRSTTIME 2
X#define FTACFLOWINDEX 3
X
X#define FTCOLATTRIB 11
X#define FTCOLTIME 12
X#define FTCOLINDEX 13
X#define FTCOLBLOB 14
X
X#define RTRULESET 1
X#define RTRULEINDEX 2
X#define RTSELECTOR 3
X#define RTRULEMASK 4
X#define RTMATCHVALUE 5
X#define RTRULEACTION 6
X#define RTJUMPINDEX 7
X
X#define ATACTIONINDEX 101
X#define ATLOWINTERFACE 103
X#define ATLOWADJACENTTYPE 104
X#define ATLOWADJACENTADDRESS 105
X#define ATLOWADJACENTMASK 106
X#define ATLOWPEERTYPE 107
X#define ATLOWPEERTYPEMASK 108
X#define ATLOWPEERADDRESS 109
X#define ATLOWPEERMASK 110
X#define ATLOWDETAILTYPE 111
X#define ATLOWDETAILTYPEMASK 112
X#define ATLOWDETAILADDRESS 113
X#define ATLOWDETAILMASK 114
X#define ATHIINTERFACE 117
X#define ATHIADJACENTTYPE 118
X#define ATHIADJACENTADDRESS 119
X#define ATHIADJACENTMASK 120
X#define ATHIPEERTYPE 121
X#define ATHIPEERTYPEMASK 122
X#define ATHIPEERADDRESS 123
X#define ATHIPEERMASK 124
X#define ATHIDETAILTYPE 125
X#define ATHIDETAILTYPEMASK 126
X#define ATHIDETAILADDRESS 127
X#define ATHIDETAILMASK 128
X#define ATPDUSCALE 133
X#define ATOCTETSCALE 134
X#define ATACTIONSET 135


X
Xstruct variable {
X oid name[26]; /* object identifier of variable */
X u_char namelen; /* length of above */
X char type; /* type of variable, INTEGER or (octet) STRING */
X u_char magic; /* passed to function as a hint */
X u_short acl; /* access control list for variable */

X u_char far *(*findVar)(); /* function that finds variable */
X};
END_OF_FILE
if test 8490 -ne `wc -c <'netramet/src/meter/include/met_vars.h'`; then
echo shar: \"'netramet/src/meter/include/met_vars.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/include/met_vars.h'
fi
if test -f 'netramet/src/snmplib/include/snmpapi.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/snmpapi.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/snmpapi.h'\" \(8565 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/snmpapi.h' <<'END_OF_FILE'


X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X/*

X * snmp_api.h - API for access to snmp.
X */
X
X
Xtypedef struct sockaddr_in ipaddr;
X
Xstruct snmp_session {
X u_char *community; /* community for outgoing requests. */
X int community_len; /* Length of community name. */
X int retries; /* Number of retries before timeout. */
X long timeout; /* Number of uS until first timeout, then exponential backoff */
X char *peername; /* Domain name or dotted IP address of default peer */
X u_short remote_port;/* UDP port number of peer. */
X u_short local_port; /* My UDP port number, 0 for default, picked randomly */
X /* Authentication function or NULL if null authentication is used */
X u_char *(*authenticator)();
X int (*callback)(); /* Function to interpret incoming data */
X /* Pointer to data that the callback function may consider important */
X void *callback_magic;
X};
X
X/*
X * Set fields in session and pdu to the following to get a default or unconfigured value.
X */
X#define SNMP_DEFAULT_COMMUNITY_LEN 0 /* to get a default community name */
X#define SNMP_DEFAULT_RETRIES -1
X#define SNMP_DEFAULT_TIMEOUT -1
X#define SNMP_DEFAULT_REMPORT 0
X#define SNMP_DEFAULT_REQID 0
X#define SNMP_DEFAULT_ERRSTAT -1
X#define SNMP_DEFAULT_ERRINDEX -1
X#define SNMP_DEFAULT_ADDRESS 0
X#define SNMP_DEFAULT_PEERNAME NULL
X#define SNMP_DEFAULT_ENTERPRISE_LENGTH 0
X#define SNMP_DEFAULT_TIME 0
X
Xextern int snmp_errno;
X/* Error return values */
X#define SNMPERR_GENERR -1
X#define SNMPERR_BAD_LOCPORT -2 /* local port was already in use */
X#define SNMPERR_BAD_ADDRESS -3
X#define SNMPERR_BAD_SESSION -4
X#define SNMPERR_TOO_LONG -5
X
X
Xstruct snmp_pdu {
X ipaddr address; /* Address of peer */
X
X int command; /* Type of this PDU */
X
X u_long reqid; /* Request id */
X u_long errstat; /* Error status */
X u_long errindex; /* Error index */
X
X /* Trap information */
X oid *enterprise;/* System OID */
X int enterprise_length;
X ipaddr agent_addr; /* address of object generating trap */
X int trap_type; /* trap type */
X int specific_type; /* specific type */
X u_long time; /* Uptime */
X
X struct variable_list *variables;
X};
X
X
Xstruct variable_list {
X struct variable_list *next_variable; /* NULL for last variable */
X oid *name; /* Object identifier of variable */
X int name_length; /* number of subid's in name */
X u_char type; /* ASN type of variable */
X union { /* value of variable */
X long *integer;
X u_char *string;
X oid *objid;
X } val;
X int val_len;
X};
X
X/*
X * struct snmp_session *snmp_open(session)
X * struct snmp_session *session;
X *

X * Sets up the session with the snmp_session information provided
X * by the user. Then opens and binds the necessary UDP port.
X * A handle to the created session is returned (this is different than
X * the pointer passed to snmp_open()). On any error, NULL is returned
X * and snmp_errno is set to the appropriate error code.
X */

Xstruct snmp_session *snmp_open();
X
X/*
X * int snmp_close(session)
X * struct snmp_session *session;
X *

X * Close the input session. Frees all data allocated for the session,
X * dequeues any pending requests, and closes any sockets allocated for
X * the session. Returns 0 on error, 1 otherwise.
X */

Xint snmp_close();
X
X
X/*
X * int snmp_send(session, pdu)
X * struct snmp_session *session;
X * struct snmp_pdu *pdu;
X *

X * Sends the input pdu on the session after calling snmp_build to create
X * a serialized packet. If necessary, set some of the pdu data from the
X * session defaults. Add a request corresponding to this pdu to the list
X * of outstanding requests on this session, then send the pdu.
X * Returns the request id of the generated packet if applicable, otherwise 1.
X * On any error, 0 is returned.
X * The pdu is freed by snmp_send() unless a failure occured.
X */

Xint snmp_send();
X
X
X/*
X * void snmp_read(fdset)
X * fd_set *fdset;
X *

X * Checks to see if any of the fd's set in the fdset belong to
X * snmp. Each socket with it's fd set has a packet read from it
X * and snmp_parse is called on the packet received. The resulting pdu
X * is passed to the callback routine for that session. If the callback
X * routine returns successfully, the pdu and it's request are deleted.
X */

Xvoid snmp_read();
X
X
X/*
X * void
X * snmp_free_pdu(pdu)
X * struct snmp_pdu *pdu;
X *

X * Frees the pdu and any malloc'd data associated with it.
X */

Xvoid snmp_free_pdu();
X
X/*
X * int snmp_select_info(numfds, fdset, timeout, block)
X * int *numfds;
X * fd_set *fdset;
X * struct timeval *timeout;
X * int *block;
X *


X * Returns info about what snmp requires from a select statement.
X * numfds is the number of fds in the list that are significant.
X * All file descriptors opened for SNMP are OR'd into the fdset.
X * If activity occurs on any of these file descriptors, snmp_read

X * should be called with that file descriptor set.


X *
X * The timeout is the latest time that SNMP can wait for a timeout. The
X * select should be done with the minimum time between timeout and any other
X * timeouts necessary. This should be checked upon each invocation of select.
X * If a timeout is received, snmp_timeout should be called to check if the
X * timeout was for SNMP. (snmp_timeout is idempotent)
X *
X * Block is 1 if the select is requested to block indefinitely, rather than time out.
X * If block is input as 1, the timeout value will be treated as undefined, but it must
X * be available for setting in snmp_select_info. On return, if block is true, the value
X * of timeout will be undefined.
X *
X * snmp_select_info returns the number of open sockets. (i.e. The number of sessions open)
X */

Xint snmp_select_info();
X
X/*
X * void snmp_timeout();
X *

X * snmp_timeout should be called whenever the timeout from snmp_select_info expires,
X * but it is idempotent, so snmp_timeout can be polled (probably a cpu expensive
X * proposition). snmp_timeout checks to see if any of the sessions have an
X * outstanding request that has timed out. If it finds one (or more), and that
X * pdu has more retries available, a new packet is formed from the pdu and is
X * resent. If there are no more retries available, the callback for the session
X * is used to alert the user of the timeout.
X */

Xvoid snmp_timeout();
X
X
X/*
X * This routine must be supplied by the application:
X *
X * u_char *authenticator(pdu, length, community, community_len)
X * u_char *pdu; The rest of the PDU to be authenticated
X * int *length; The length of the PDU (updated by the authenticator)
X * u_char *community; The community name to authenticate under.
X * int community_len The length of the community name.
X *
X * Returns the authenticated pdu, or NULL if authentication failed.
X * If null authentication is used, the authenticator in snmp_session can be
X * set to NULL(0).
X */
X
X/*
X * This routine must be supplied by the application:
X *
X * int callback(operation, session, reqid, pdu, magic)
X * int operation;
X * struct snmp_session *session; The session authenticated under.
X * int reqid; The request id of this pdu (0 for TRAP)
X * struct snmp_pdu *pdu; The pdu information.
X * void *magic A link to the data for this routine.
X *
X * Returns 1 if request was successful, 0 if it should be kept pending.
X * Any data in the pdu must be copied because it will be freed elsewhere.
X * Operations are defined below:
X */
X#define RECEIVED_MESSAGE 1
X#define TIMED_OUT 2
X
X
Xextern int snmp_dump_packet;
END_OF_FILE
if test 8565 -ne `wc -c <'netramet/src/snmplib/include/snmpapi.h'`; then
echo shar: \"'netramet/src/snmplib/include/snmpapi.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/snmpapi.h'
fi
if test -f 'netramet/src/snmplib/include/snmpvars.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/snmpvars.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/snmpvars.h'\" \(6610 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/snmpvars.h' <<'END_OF_FILE'


X/*
X * Definitions for SNMP (RFC 1067) agent variable finder.
X *
X *

X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University

X Copyright 1989 TGV, Incorporated


X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in

Xsupporting documentation, and that the name of CMU and TGV not be used

Xin advertising or publicity pertaining to distribution of the software
Xwithout specific, written prior permission.
X


XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
XPERFORMANCE OF THIS SOFTWARE.
X******************************************************************/
X
Xu_char *var_system();
Xu_char *var_ifEntry();
Xu_char *var_atEntry();
Xu_char *var_ip();
Xu_char *var_ipAddrEntry();
Xu_char *var_ipRouteEntry();
Xu_char *var_icmp();
Xu_char *var_tcp();
Xu_char *var_udp();
Xu_char *var_process();
Xu_char *var_event();

Xu_char *var_pt(); /* AU: packet types table */
Xu_char *var_ft(); /* AU: flow table */
Xu_char *var_rt(); /* AU: rule table */


Xu_char *getStatPtr();
X
Xextern long long_return;
Xextern u_char return_buf[];
X

X#define INST 0xFFFFFFFF /* used to fill out the instance field of the variables table */
X
X/*


X * These are unit magic numbers for each variable.
X */
X
X#define VERSION_DESCR 0
X#define VERSION_ID 1
X#define IFNUMBER 2
X#define UPTIME 3
X#define EVENTNEXTINDEX 4
X

X#define PTTYPES 5 /* Don't really need this in var_system */
X
X#define FTFLOWCOUNT 6
X#define FTCHKTIME 7
X#define FTCHKFLOWCOUNT 8
X#define FTPREVCHKTIME 9

X#define PTPACKETTYPE 1
X#define PTPACKETCOUNT 2
X#define PTBYTECOUNT 3
X
X#define FTFLOWNBR 1
X#define FTFLOWSTATUS 2
X#define FTNEXTACTIVEFLOW 3
X#define FTADDRTYPE 4
X#define FTFROMADDR 5
X#define FTFROMMASK 6
X#define FTFROMTALLY 7
X#define FTTOADDR 8
X#define FTTOMASK 9
X#define FTTOTALLY 10
X#define FTFWDPACKETS 11
X#define FTFWDBYTES 12
X#define FTBACKPACKETS 13
X#define FTBACKBYTES 14
X#define FTCHKFWDPKTS 15
X#define FTCHKFWDBYTES 16
X#define FTCHKBACKPKTS 17
X#define FTCHKBACKBYTES 18
X
X#define RTINDEX 1
X#define RTTREENBR 2
X#define RTADDRTYPE 3
X#define RTFROMADDR 4
X#define RTFROMMASK 5
X#define RTFROMTALLY 6
X#define RTTOADDR 7
X#define RTTOMASK 8
X#define RTTOTALLY 9


X
Xstruct variable {
X oid name[26]; /* object identifier of variable */
X u_char namelen; /* length of above */
X char type; /* type of variable, INTEGER or (octet) STRING */
X u_char magic; /* passed to function as a hint */
X u_short acl; /* access control list for variable */
X u_char *(*findVar)(); /* function that finds variable */
X};
END_OF_FILE

if test 6610 -ne `wc -c <'netramet/src/snmplib/include/snmpvars.h'`; then
echo shar: \"'netramet/src/snmplib/include/snmpvars.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/snmpvars.h'
fi
echo shar: End of archive 22 \(of 25\).
cp /dev/null ark22isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:07:46 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 111
Archive-name: netramet/part23
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/snmp/README netramet/doc/snmp/snmpstatus.1
# netramet/doc/snmp/snmptest.1 netramet/doc/snmp/snmptrap.1
# netramet/doc/snmp/snmpwalk.1 netramet/doc/snmp/variables.5
# netramet/sg/apps/Makefile netramet/src/apps/snmpget.c
# netramet/src/apps/snmpgetnext.c netramet/src/apps/snmptrapd.c
# netramet/src/meter/chart.c netramet/src/meter/include/pktsnap.h
# netramet/src/snmplib/include/asn1.h
# netramet/src/snmplib/include/snmpimpl.h
# netramet/src/snmplib/snmpauth.c
# Wrapped by kent@sparky on Tue Nov 2 18:17:14 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 23 (of 25)."'
if test -f 'netramet/doc/snmp/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/README'\"
else
echo shar: Extracting \"'netramet/doc/snmp/README'\" \(4489 characters\)
sed "s/^X//" >'netramet/doc/snmp/README' <<'END_OF_FILE'
X
X The files in this directory compromise the 1.0 release of the CMU SNMP
Xdistribution. This includes the SNMP/ASN.1 library, many client
Xapplications, and supporting documentation. The snmp agent for the Kinetics
Xbox is included in this distribution, but the KIP code it links against is not
Xyet distributable (this is not the released KIP code). This will probably
Xbe distributed at another time if there is sufficient demand.
X
XThis code was written with efficiency and portability in mind. The
Xapplications compile and run on the following systems: IBM PC/RT running ACIS
XRelease 3, Sun3/60 running SUNOS 3.5, DEC microVax running Ultrix 2.2, and
XDECStation 3100's runing Ultrix 3.0. They are expected to run on any system
Xwith a Berkeley socket interface.
X
XThe agent compiles into about 10 KB of 68000 code. The machine independent
Xportions of this agent also run on CMU's IBM PC/AT based router.
X
XThe applications are designed to be useful in the real world. Snmpnetstat
Xis a port of the Berkeley Unix netstat that gathers it's information using
XSNMP. (Many people will enjoy "snmpnetstat mygateway public -r"). Snmpstatus
Xcollects several pieces of information and presents them in a useful format
Xand is good for everyday status monitoring. The rest of the tools are simpler,
Xbut still interpret input and output symbolicly (they can be used without
Xreferencing the RFC's!).
X
XFor instance,
Xsnmpnetstat mygateway public -r returns:
XRouting tables
XDestination Gateway Flags Interface
Xbbn-net-temp psc-gw3.psc.edu UG Ethernet0
Xarpanet prpnet-gw.cc.cmu.e UG Ethernet0
Xxerox-net psc-gw3.psc.edu UG Ethernet0
Xhp-internet psc-gw3.psc.edu UG Ethernet0
X...
X
Xsnmpstatus returns:
X[128.2.56.220]=>[Kinetics Fastpath2] Up: 1 day, 4:43:31
XRecv/Trans packets - Interface: 262874/39867 | IP 47432/34587
X
XThe rest of the applications typically present a variable in a form similar
Xto the following:
XName: interfaces.ifTable.ifEntry.ifType.1
XINTEGER: ethernet-csmacd(6)
X
XThe parsing and printing of symbolic object identifiers and the printing of
Xtyped variables is driven by a database that describes the MIB.
XThe MIB database is now retrieved from a text file in the ASN.1 format used in
Xthe RFC1066 MIB. This makes adding new (enterprise specific) mibs to the database
Xvery simple. I will solicit description files from other SNMP vendors and redistribute
Xthem via anonymous FTP. Initially, the mib.txt file contains a discription of the
XRFC 1066 MIB and portions of the CMU enterprise specific MIB. I had help in optimizing
Xthe parser from Phil Lapsley of Berkeley (Thanks Phil!).
X
XFor further information, please consult the man pages. There are man pages for
Xeach of the applications, as well as for the Application Programming Interface (API).
X
XThe API has been redesigned to present a very convenient and useful asynchronous
Xinterface to the SNMP transport. In addition, snmp_client.c contains a toolkit
Xof routines that simplify writing client applications. In particular, there is
Xa synchronous interface built on top of the asyncronous interface that makes
Xwriting applications very easy.
X
XThis distribution is coprighted by CMU, but may be used and sold without
Xpermission. The snmpnetstat application is derived from the Berkeley 4.3 netstat,
Xand is therefore also copyrighted by Berkeley. Consult the copyright notices for
Xfurther information.
X
XThe distribution is available by anonymous FTP from the host
Xlancaster.andrew.cmu.edu (128.2.13.21) as the file pub/cmu-snmp1.0.tar. I will
Xmaintain a repository of mib description files in the directory pub/mibs.
X
XPlease direct questions, comments, and bug reports to sw0l...@andrew.cmu.edu.
XI have received very helpful feedback in the past that has been integrated into
Xthe current release. This wil continue in the future.
X
XIf you pick up this package, please send me a note to the above address, so
Xthat I may notify you of future enhancements/changes and additions to the
Xset of applications (several are planned). I will also redistribute applications
Xusing the CMU SNMP library that were written elsewhere and placed in the public domain.
XThere are already several such applications pending such a distribution.
X
XThere is a gateway at CMU running the agent. Feel free to query it. You
Xcan access as netdev-kbox.cc.cmu.edu (128.2.56.220) with community name
X"public".
X
X
XSteve Waldbusser
XNetwork Development
XCarnegie-Mellon University
END_OF_FILE
if test 4489 -ne `wc -c <'netramet/doc/snmp/README'`; then
echo shar: \"'netramet/doc/snmp/README'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/README'
fi
if test -f 'netramet/doc/snmp/snmpstatus.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmpstatus.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmpstatus.1'\" \(3422 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmpstatus.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPSTATUS 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmpstatus - Retrieves important information from a network entity.
X.SH SYNOPSIS
Xsnmpstatus host [community]
X.SH DESCRIPTION
XSnmpstatus is an SNMP application that retrieves several important
Xstatistics from a network entity.


X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.

XIf this argument is not given, the community name will default to
X.I "public".
X.PP
XThe information returned is:
X.PP
XThe IP address of the entity.
X.br
XA textual description of the entity
X.I (sysDescr.0)
X.br
XThe uptime of the entity
X.I (sysUpTime.0)
X.br
XThe sum of received packets on all interfaces
X.I (ifInUCastPkts.* + ifInNUCastPkts.*)
X.br
XThe sum of transmitted packets on all interfaces
X.I (ifOutUCastPkts.* + ifOutNUCastPkts.*)
X.br
XThe number of IP input packets
X.I (ipInReceives.0)
X.br
XThe number of IP output packets
X.I (ipOutRequests.0)
X.PP
XFor example
X.PP
X.I snmpstatus netdev-kbox.cc.cmu.edu public
X.PP
Xwill produce output similar to the following:
X.PP
X.I [128.2.56.220]=>[Kinetics FastPath2] Up: 1 day, 4:43:31
X.br
X.I IF recv/trans packets 262874/39867 |
X.I IP recv/trans packets 31603/15805
X.PP
XSnmpstatus also checks the operational status of all interfaces (ifOperStatus.*),
Xand if it finds any that are not running, it will report in a manner similar to this:
X.PP
X.I 2 interfaces are down!


XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community

Xspecifies the community name for the transaction with the remote system. If none is
Xgiven, the community name defaults to
X.I "public".
X.PP
XIf the network entity has an error processing the request packet, an error
Xpacket will be returned and a message will be shown, helping to pinpoint in what way
Xthe request was malformed. Snmpstatus will attempt to reform it's request to eliminate
Xthe malformed variable, but this variable will then be missing from the displayed data.
X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"
XRFC 1065, RFC 1066, RFC 1067
END_OF_FILE
if test 3422 -ne `wc -c <'netramet/doc/snmp/snmpstatus.1'`; then
echo shar: \"'netramet/doc/snmp/snmpstatus.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmpstatus.1'
fi
if test -f 'netramet/doc/snmp/snmptest.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmptest.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmptest.1'\" \(3555 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmptest.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPTEST 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmptest - communicates with a network entity using SNMP GET Requests.
X.SH SYNOPSIS
Xsnmptest host community
X.SH DESCRIPTION
XSnmptest is a flexible SNMP application that can monitor and manage
Xinformation on a network entity.


X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP

XAfter invoking the program, a command line
Xinterpreter proceeds to accept commands. It will prompt with:
X.PP
X.I Please enter the variable name:
X.PP
XAt this point you can enter one or more variable names, one per line.
XA blank line is a command to send a request for each of the variables (in a single
Xpacket) to the remote entity. Each variable name is given in the format specified in
X.IR variables (5).
XFor example
X.PP
X.I snmpget netdev-kbox.cc.cmu.edu public
X.br
X.I Please enter the variable name: system.sysdescr.0
X.br
X.I Please enter the variable name:
X.PP
XWill return some information about the request and reply packets, as well as the
Xinformation:
X.PP
X.I Name: system.sysDescr.0
X.br
X.I OCTET STRING- (ascii): Kinetics FastPath2
X.PP
XUpon startup, the program defaults to sending a GET Request packet. This can be changed
Xto a GET NEXT Request or a SET Request by typing the commands "$N" or "$S" repectively. Typing
X"$G" will go back to the GET Request mode.
X.PP
XThe command "$D" will toggle the dumping of each sent and received packet.
X.PP
XWhen in the "SET Request" mode, more information is requested by the prompt for each variable. The prompt:
X.PP
X.I Please enter variable type [i|s|n]:
X.PP
Xrequests the type of the variable be entered. Type "i" for an integer, "s" for an octet string,
Xand "n" for a null value.
X.br
XAt this point a value will be prompted for:
X.PP
X.I Please enter new value:
X.PP
XIf this is an integer value, just type the integer (in decimal). If it is a string, type in
Xwhite-space seperated decimal numbers, one per byte of the string. Again type a blank line at
Xthe prompt for the variable name to send the packet.
X.PP
XAt the variable name line, typing "$Q" will quit the program.
X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"
Xvariables(5), RFC 1065, RFC 1066, RFC 1067
END_OF_FILE
if test 3555 -ne `wc -c <'netramet/doc/snmp/snmptest.1'`; then
echo shar: \"'netramet/doc/snmp/snmptest.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmptest.1'
fi
if test -f 'netramet/doc/snmp/snmptrap.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmptrap.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmptrap.1'\" \(3877 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmptrap.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPTRAP 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmptrap - Send an SNMP TRAP message to a host.
X.SH SYNOPSIS
Xsnmptrap host community trap-type specific-type device-description [ -a agent-addr ]
X.SH DESCRIPTION
Xsnmptrap is an SNMP application that forms and sends an SNMP TRAP message to
Xa host.


X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP
XThe

X.I trap-type
Xand
X.I specific-type
Xare integers that specify the type of trap message being sent.
X.PP
XThe
X.I device-description
Xis a textual description of the device sending this trap, to be used as the value of
Xa system.sysDescr.0 variable sent in the variable list of this trap message.
XThe optional argument
X.I -a agent-addr
Xcan be used to change the address from which the trap reports it is being sent. Otherwise
Xthe sending host's address is used.
X.PP
XFor example
X.PP
X.I snmptrap nic.andrew.cmu.edu public 0 0
X.I 'SUN 3/60: SUNOS4.0'
X.PP
Xwill send a Cold Start trap to the specified machine.
X.PP
XThe defined trap types are:
X.TP
X.B 0
XcoldStart \- signifies that the sending protocol entity is
Xreinitializing itself such that the agent's configuration or the
Xprotocol entity implementation may be altered.
X.TP
X.B 1
XwarmStart \- signifies that the sending protocol entity is
Xreinitializing itself such that neither the agent configuration nor
Xthe protocol entity implementation is altered.
X.TP
X.B 2
XlinkDown \- signifies that the sending protocol entity
Xrecognizes a failure in one of the communication links represented in
Xthe agent's configuration.
X.TP
X.B 3
XlinkUp \- signifies that the sending protocol entity
Xrecognizes that one of the communication links represented in the
Xagent's configuration has come up.
X.TP
X.B 4
XauthenticationFailure \- signifies that the sending protocol
Xentity is the addressee of a protocol message that is not properly
Xauthenticated. While implementations of the SNMP must be capable of
Xgenerating this trap, they must also be capable of suppressing the
Xemission of such traps via an implementation-specific mechanism.
X.TP
X.B 5
XegpNeighborLoss \- signifies that an EGP neighbor for whom
Xthe sending protocol entity was an EGP peer has been marked down and
Xthe peer relationship no longer obtains.
X.TP
X.B 6
XenterpriseSpecific \- signifies that the sending protocol
Xentity recognizes that some enterprise-specific event has occurred.
XThe specific-trap field identifies the particular trap which
Xoccurred.
X.PP
XAdding a "-d" to the argument list will cause the application to dump the output packet.
X.PP
X.SH "SEE ALSO"
XRFC 1065, RFC 1066, RFC 1067
END_OF_FILE
if test 3877 -ne `wc -c <'netramet/doc/snmp/snmptrap.1'`; then
echo shar: \"'netramet/doc/snmp/snmptrap.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmptrap.1'
fi
if test -f 'netramet/doc/snmp/snmpwalk.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmpwalk.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmpwalk.1'\" \(3034 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmpwalk.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPWALK 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmpwalk - communicates with a network entity using SNMP GET Next Requests.
X.SH SYNOPSIS
Xsnmpwalk host community [variable-name]
X.SH DESCRIPTION
XSnmpwalk is an SNMP application that uses GET NEXT Requests to query for a tree
Xof information about a network entity.


X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP

XA variable may also be given on the
Xcommand line. This variable specifies which portion of the object identifier
Xspace will be searched using GET NEXT Requests. All variables in the subtree
Xbelow the given variable are queried and their values presented to the user.
XEach variable name is given in the format specified in
X.IR variables (5).
X.PP
XIf the "variable-name" argument is not present, snmpwalk will search the whole Internet MIB.
X.PP
XFor example
X.PP
X.I snmpwalk netdev-kbox.cc.cmu.edu public system
X.PP
Xwill retrieve the variables sysDescr.0 and sysObjectID.0 and sysUpTime.0:
X.PP
X.I Name: system.sysDescr.0
X.br
X.I OCTET STRING- (ascii): Kinetics FastPath2
X.PP
X.I Name: system.sysObjectID.0
X.br
X.I OBJECT IDENTIFIER: .iso.org.dod.internet.private.enterprises.CMU.sysID.CMU-KIP
X.PP
X.I Name: system.sysUpTime.0
X.br
X.I Timeticks: (2291082) 6:21:50
X.PP
XIf the network entity has an error processing the request packet, an error
Xpacket will be returned and a message will be shown, helping to pinpoint why
Xthe request was malformed.
X.PP
XIf the tree search causes attempts to search beyond the end of the MIB, a message
Xwill be displayed:
X.PP
X.I End of MIB.
X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"
Xvariables(5), RFC 1065, RFC 1066, RFC 1067
END_OF_FILE
if test 3034 -ne `wc -c <'netramet/doc/snmp/snmpwalk.1'`; then
echo shar: \"'netramet/doc/snmp/snmpwalk.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmpwalk.1'
fi
if test -f 'netramet/doc/snmp/variables.5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/variables.5'\"
else
echo shar: Extracting \"'netramet/doc/snmp/variables.5'\" \(2850 characters\)
sed "s/^X//" >'netramet/doc/snmp/variables.5' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH VARIABLES 5 "17 September 1989"
X.UC 4
X.SH NAME
X variables - Format of specifying variable names to SNMP tools.
X.SH SYNOPSIS
X system.sysdescr.0
X.SH DESCRIPTION
XVariable names are in the format of Object Identifiers (ASN.1). There are
Xseveral methods of representation. Each variable name is given in the format of A.B.C.D...,
Xwhere A, B, C, and D are subidentifiers in one of two forms of notation.
XEach subidentifier may be encoded as a decimal integer, or a symbol as found in
Xthe RFC1066 MIB. The case of the symbols is not significant.
X.br
XIf there is no leading "." in the variable name, the name will be formed
Xas if having been preceded with "iso.org.dod.internet.mgmt.mib.". A "." must
Xbe placed before the first variable if the user is to fully specify the name.
XFor example:
X.PP
X.I 1.1.0 system.sysDescr.0 and 1.sysDescr.0
X.PP
Xall refer to the same variable name. Likewise:
X.PP
X.I .1.3.6.1.2.1.1.1.0 .iso.org.dod.internet.mgmt.mib.system.sysdescr.0 .1.3.6.1.2.1.1.sysdescr.0
X.PP
XAll refer to the same variable name.
X.PP
XThe description of the variables in the MIB is given in a file named
X.I "mib.txt"
Xin the current directory or in a file named in the environment variable
X.I "MIBFILE" or in
X.I "/etc/mib.txt".
XThese files are searched in the above order. The files are in the ASN.1 notation and use the
XOBJECT TYPE macro defined in RFC 1065. Most of the file describing the RFC 1066 MIB is pulled
Xout of RFC 1066 without change.
X.SH "SEE ALSO"
XRFC 1065, RFC 1066, RFC 1067, ISO IS 8824(ASN.1)
X.SH BUGS
XThe parser of the
X.I "mib.txt"
Xfile is not expected to handle bizarre (although correct) interpretations of the ASN.1 notation.
X
X
END_OF_FILE
if test 2850 -ne `wc -c <'netramet/doc/snmp/variables.5'`; then
echo shar: \"'netramet/doc/snmp/variables.5'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/variables.5'
fi
if test -f 'netramet/sg/apps/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sg/apps/Makefile'\"
else
echo shar: Extracting \"'netramet/sg/apps/Makefile'\" \(2730 characters\)
sed "s/^X//" >'netramet/sg/apps/Makefile' <<'END_OF_FILE'


X# Modified by Nevil Brownlee, Auckland University
X# Silicon Graphics version
X#

X# Makefile for snmpget, manager, snmpgetnext, collect, snmpwalk, snmpstatus, snmptest snmptrap snmptrapd snmpd
X#
X

XSRC= ../../src/apps
XSINCLUDE= ../../src/snmplib/include


X
XSNMPH = $(SINCLUDE)/asn1.h $(SINCLUDE)/mib.h $(SINCLUDE)/parse.h \
X $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/snmpclnt.h $(SINCLUDE)/snmpimpl.h
X

XTARG= snmpagnt.o snmptest
X# snmpget snmpgetnext snmpwalk snmpstatus \
X# snmptrap snmptrapd snmpd
X
XLIBS= ../snmplib/libsnmp.a
X
XCFLAGS= -g -I$(SINCLUDE) -cckr -D_BSD_SIGNALS -D_BSD_COMPAT
X#CFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT
X


X
Xall: $(TARG)
X
X

Xsnmptest.o: $(SNMPH) $(SRC)/snmptest.c
X ${CC} $(CFLAGS) -c $(SRC)/snmptest.c
X
Xsnmptest: snmptest.o ${LIBS}
X ${CC} -o $@ snmptest.o ${LIBS}
X
X
Xsnmptrap.o: $(SNMPH) $(SRC)/snmptrap.c
X ${CC} $(CFLAGS) -c $(SRC)/snmptrap.c
X
Xsnmptrap: snmptrap.o ${LIBS}
X ${CC} -o $@ snmptrap.o ${LIBS} -lmld
X# ${CC} -o $@ snmptrap.o ${LIBS}
X
X
Xsnmptrapd.o: $(SNMPH) $(SRC)/snmptrapd.c
X ${CC} $(CFLAGS) -c $(SRC)/snmptrapd.c
X
Xsnmptrapd: snmptrapd.o ${LIBS}
X ${CC} -o $@ snmptrapd.o ${LIBS}
X
X
Xsnmpget.o: $(SNMPH) $(SRC)/snmpget.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpget.c
X
Xsnmpget: snmpget.o ${LIBS}
X ${CC} -o $@ snmpget.o ${LIBS}
X
X
X#manager.o: $(SNMPH) $(SRC)/manager.c
X# ${CC} $(CFLAGS) -c $(SRC)/manager.c
X
X#manager: manager.o ${LIBS}
X# ${CC} -o $@ manager.o ${LIBS}
X
X
X#monitor.o: $(SNMPH) $(SRC)/monitor.c
X# ${CC} $(CFLAGS) -c $(SRC)/monitor.c
X
X#monitor: monitor.o ${LIBS}
X# ${CC} -o $@ monitor.o ${LIBS}
X
X
Xsnmpgetnext.o: $(SNMPH) $(SRC)/snmpgetnext.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpgetnext.c
X
Xsnmpgetnext: snmpgetnext.o ${LIBS}
X ${CC} -o $@ snmpgetnext.o ${LIBS}
X
X
X#collect: collect.o ${LIBS}
X# ${CC} -o $@ collect.o ${LIBS}
X
X
Xsnmpwalk.o: $(SNMPH) $(SRC)/snmpwalk.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpwalk.c
X
Xsnmpwalk: snmpwalk.o ${LIBS}
X ${CC} -o $@ snmpwalk.o ${LIBS}
X
X
Xsnmpstatus.o: $(SNMPH) $(SRC)/snmpstatus.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpstatus.c
X
Xsnmpstatus: snmpstatus.o ${LIBS}
X ${CC} -o $@ snmpstatus.o ${LIBS}
X
X
Xsnmpd.o: $(SNMPH) $(SRC)/snmpd.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpd.c
X
Xkernel.o: $(SNMPH) $(SRC)/kernel.c
X ${CC} $(CFLAGS) -c $(SRC)/kernel.c
X
Xsnmpagnt.o: $(SNMPH) $(SRC)/snmpagnt.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpagnt.c
X
Xsnmp_vars.o: $(SNMPH) $(SRC)/snmp_vars.c
X ${CC} $(CFLAGS) -c $(SRC)/snmp_vars.c
X
Xsnmp_var_route.o: $(SNMPH) $(SRC)/snmp_var_route.c
X ${CC} $(CFLAGS) -c $(SRC)/snmp_var_route.c
X
Xsnmpd: snmpd.o kernel.o snmpagnt.o snmp_vars.o snmp_var_route.o ${LIBS}
X ${CC} -o $@ snmpd.o kernel.o snmpagnt.o snmp_vars.o \
X snmp_var_route.o ${LIBS} -lmld
X
X
Xclean:


X rm -f *.o ${TARG}
X
Xinstall:
X cp ${TARG} ../bin

X
X
END_OF_FILE
if test 2730 -ne `wc -c <'netramet/sg/apps/Makefile'`; then
echo shar: \"'netramet/sg/apps/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sg/apps/Makefile'
fi
if test -f 'netramet/src/apps/snmpget.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpget.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpget.c'\" \(4151 characters\)
sed "s/^X//" >'netramet/src/apps/snmpget.c' <<'END_OF_FILE'
X/*
X * snmpget.c - send snmp GET requests to a network entity.


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X

X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>
X
X#include "ausnmp.h"

X#include "snmp.h"
X#include "snmpimpl.h"


X#include "asn1.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"
X
Xextern int errno;

Xint snmp_dump_packet = 0;
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X struct snmp_session session, *ss;
X struct snmp_pdu *pdu, *response;

X struct variable_list *vars;
X int arg;
X char *gateway = NULL;
X char *community = NULL;

X int count, current_name = 0;
X char *names[128];


X oid name[MAX_NAME_LEN];
X int name_length;

X int status;


X
X init_mib();
X /*

X * usage: snmpget gateway-name community-name


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;
X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {

X names[current_name++] = argv[arg];
X }
X }
X
X if (!(gateway && community && current_name > 0)){
X printf("usage: snmpget gateway-name community-name object-identifier [object-identifier ...]\n");


X exit(1);
X }
X
X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ss = snmp_open(&session);
X if (ss == NULL){

X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X pdu = snmp_pdu_create(GET_REQ_MSG);
X

X for(count = 0; count < current_name; count++){
X name_length = MAX_NAME_LEN;
X if (!read_objid(names[count], name, &name_length)){
X printf("Invalid object identifier: %s\n", names[count]);
X }


X
X snmp_add_null_var(pdu, name, name_length);
X }

X
Xretry:
X status = snmp_synch_response(ss, pdu, &response);
X if (status == STAT_SUCCESS){
X if (response->errstat == SNMP_ERR_NOERROR){
X for(vars = response->variables; vars; vars = vars->next_variable)

X print_variable(vars->name, vars->name_length, vars);
X } else {

X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){
X printf("This name doesn't exist: ");
X for(count = 1, vars = response->variables; vars && count != response->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X if ((pdu = snmp_fix_pdu(response, GET_REQ_MSG)) != NULL)
X goto retry;
X }
X
X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);

X } else { /* status == STAT_ERROR */
X printf("An error occurred, Quitting\n");
X }
X
X if (response)
X snmp_free_pdu(response);

X snmp_close(ss);
X}
X
END_OF_FILE
if test 4151 -ne `wc -c <'netramet/src/apps/snmpget.c'`; then
echo shar: \"'netramet/src/apps/snmpget.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpget.c'
fi
if test -f 'netramet/src/apps/snmpgetnext.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmpgetnext.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmpgetnext.c'\" \(4233 characters\)
sed "s/^X//" >'netramet/src/apps/snmpgetnext.c' <<'END_OF_FILE'
X/*
X * snmpgetnext.c - send snmp GETNEXT requests to a network entity.


X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X

X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>
X
X#include "ausnmp.h"

X#include "snmp.h"
X#include "snmpimpl.h"


X#include "asn1.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"
X
Xextern int errno;

Xint snmp_dump_packet = 0;
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X struct snmp_session session, *ss;
X struct snmp_pdu *pdu, *response;

X struct variable_list *vars;
X int arg;
X char *gateway = NULL;
X char *community = NULL;

X int count, current_name = 0;
X char *names[128];


X oid name[MAX_NAME_LEN];
X int name_length;

X int status;


X
X init_mib();
X /*

X * usage: snmpgetnext gateway-name community-name object-id-list


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;
X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);
X break;
X }
X continue;
X }
X if (gateway == NULL){
X gateway = argv[arg];
X } else if (community == NULL){
X community = argv[arg];
X } else {

X names[current_name++] = argv[arg];
X }
X }
X
X if (!(gateway && community && current_name > 0)){
X printf("usage: snmpgetnext gateway-name community-name object-identifier [object-identifier ...]\n");


X exit(1);
X }
X
X bzero((char *)&session, sizeof(struct snmp_session));
X session.peername = gateway;
X session.community = (u_char *)community;
X session.community_len = strlen((char *)community);
X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;
X snmp_synch_setup(&session);
X ss = snmp_open(&session);
X if (ss == NULL){

X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X pdu = snmp_pdu_create(GETNEXT_REQ_MSG);
X

X for(count = 0; count < current_name; count++){
X name_length = MAX_NAME_LEN;
X if (!read_objid(names[count], name, &name_length)){
X printf("Invalid object identifier: %s\n", names[count]);
X }


X
X snmp_add_null_var(pdu, name, name_length);

X }
X
X status = snmp_synch_response(ss, pdu, &response);
X if (status == STAT_SUCCESS){

X if (response->errstat == SNMP_ERR_NOERROR){
X for(vars = response->variables; vars; vars = vars->next_variable)
X print_variable(vars->name, vars->name_length, vars);
X } else {

X if (response->errstat == SNMP_ERR_NOSUCHNAME){

X printf("You have reached the end of the MIB.\n");
X } else {


X printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
X if (response->errstat == SNMP_ERR_NOSUCHNAME){
X printf("This name doesn't exist: ");
X for(count = 1, vars = response->variables; vars && count != response->errindex;
X vars = vars->next_variable, count++)
X ;
X if (vars)
X print_objid(vars->name, vars->name_length);
X printf("\n");
X }
X }
X }
X
X } else if (status == STAT_TIMEOUT){
X printf("No Response from %s\n", gateway);
X } else { /* status == STAT_ERROR */
X printf("An error occurred, Quitting\n");
X }
X
X if (response)
X snmp_free_pdu(response);

X snmp_close(ss);
X}
X
END_OF_FILE
if test 4233 -ne `wc -c <'netramet/src/apps/snmpgetnext.c'`; then
echo shar: \"'netramet/src/apps/snmpgetnext.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmpgetnext.c'
fi
if test -f 'netramet/src/apps/snmptrapd.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/snmptrapd.c'\"
else
echo shar: Extracting \"'netramet/src/apps/snmptrapd.c'\" \(5934 characters\)
sed "s/^X//" >'netramet/src/apps/snmptrapd.c' <<'END_OF_FILE'
X/*
X * snmptrapd.c - receive and log snmp traps


X *
X */
X/***********************************************************

X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X#include <sys/types.h>
X#include <netinet/in.h>
X#include <stdio.h>

X#include <sys/time.h>
X#include <errno.h>
X#include <syslog.h>
X
X#include "ausnmp.h"
X#include "snmp.h"
X#include "snmpimpl.h"


X#include "asn1.h"
X#include "snmpapi.h"
X#include "snmpclnt.h"
X

X#ifndef BSD4_3
X
Xtypedef long fd_mask;
X#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
X
X#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
X#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
X#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
X#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
X#endif
X

Xextern int errno;
Xint snmp_dump_packet = 0;

Xint Print = 0;
X
Xchar *
Xtrap_description(trap)
X int trap;
X{
X switch(trap){
X case SNMP_TRAP_COLDSTART:
X return "Cold Start";
X case SNMP_TRAP_WARMSTART:
X return "Warm Start";
X case SNMP_TRAP_LINKDOWN:
X return "Link Down";
X case SNMP_TRAP_LINKUP:
X return "Link Up";
X case SNMP_TRAP_AUTHFAIL:
X return "Authentication Failure";
X case SNMP_TRAP_EGPNEIGHBORLOSS:
X return "EGP Neighbor Loss";
X case SNMP_TRAP_ENTERPRISESPECIFIC:
X return "Enterprise Specific";
X default:
X return "Unknown Type";
X }
X}

Xint snmp_input(op, session, reqid, pdu, magic)


X int op;
X struct snmp_session *session;
X int reqid;
X struct snmp_pdu *pdu;
X void *magic;
X{

X struct variable_list *vars;


X char buf[64];
X

X if (op == RECEIVED_MESSAGE && pdu->command == TRP_REQ_MSG){
X if (Print){
X printf("%s: %s Trap (%d) Uptime: %s\n", inet_ntoa(pdu->agent_addr.sin_addr),
X trap_description(pdu->trap_type), pdu->specific_type, uptime_string(pdu->time, buf));
X for(vars = pdu->variables; vars; vars = vars->next_variable)


X print_variable(vars->name, vars->name_length, vars);
X } else {

X syslog(LOG_WARNING, "%s: %s Trap (%d) Uptime: %s\n", inet_ntoa(pdu->agent_addr.sin_addr),
X trap_description(pdu->trap_type), pdu->specific_type, uptime_string(pdu->time, buf));
X }


X } else if (op == TIMED_OUT){

X printf("Timeout: This shouldn't happen!\n");
X }
X}
X
X


Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X struct snmp_session session, *ss;

X int arg;
X int count, numfds, block;


X fd_set fdset;
X struct timeval timeout, *tvp;
X

X
X init_syslog();
X init_mib();
X /*
X * usage: snmptrapd [-p]


X */
X for(arg = 1; arg < argc; arg++){
X if (argv[arg][0] == '-'){
X switch(argv[arg][1]){
X case 'd':
X snmp_dump_packet++;
X break;

X case 'p':
X Print++;


X break;
X default:
X printf("invalid option: -%c\n", argv[arg][1]);

X printf("Usage: snmptrapd [-p ]\n");
X break;
X }
X continue;
X }


X }
X
X bzero((char *)&session, sizeof(struct snmp_session));

X session.peername = NULL;
X session.community = NULL;
X session.community_len = 0;


X session.retries = SNMP_DEFAULT_RETRIES;
X session.timeout = SNMP_DEFAULT_TIMEOUT;
X session.authenticator = NULL;

X session.callback = snmp_input;
X session.callback_magic = NULL;

X session.local_port = SNMP_TRAP_PORT;


X ss = snmp_open(&session);
X if (ss == NULL){
X printf("Couldn't open snmp\n");
X exit(-1);
X }
X

X while(1){


X numfds = 0;
X FD_ZERO(&fdset);
X block = 1;
X tvp = &timeout;
X timerclear(tvp);
X snmp_select_info(&numfds, &fdset, tvp, &block);
X if (block == 1)
X tvp = NULL; /* block without timeout */
X count = select(numfds, &fdset, 0, 0, tvp);
X if (count > 0){
X snmp_read(&fdset);
X } else switch(count){
X case 0:
X snmp_timeout();
X break;
X case -1:
X if (errno == EINTR){
X continue;
X } else {
X perror("select");
X }

X return -1;
X default:
X printf("select returned %d\n", count);

X return -1;
X }
X }

X}
X
Xinit_syslog(){
X/*
X * These definitions handle 4.2 systems without additional syslog facilities.
X */
X#ifndef LOG_CONS
X#define LOG_CONS 0 /* Don't bother if not defined... */
X#endif
X#ifndef LOG_LOCAL0
X#define LOG_LOCAL0 0
X#endif
X /*
X * All messages will be logged to the local0 facility and will be sent to
X * the console if syslog doesn't work.
X */
X openlog("snmptrapd", LOG_CONS, LOG_LOCAL0);
X syslog(LOG_INFO, "Starting snmptrapd");
X}
END_OF_FILE
if test 5934 -ne `wc -c <'netramet/src/apps/snmptrapd.c'`; then
echo shar: \"'netramet/src/apps/snmptrapd.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/snmptrapd.c'
fi
if test -f 'netramet/src/meter/chart.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/chart.c'\"
else
echo shar: Extracting \"'netramet/src/meter/chart.c'\" \(4246 characters\)
sed "s/^X//" >'netramet/src/meter/chart.c' <<'END_OF_FILE'
X/* 0920, Mon 21 Jun 93
X
X CHART.C: Strip chart in screen window for AU monitor


X
X Copyright (C) 1992,1993 by Nevil Brownlee,
X Computer Centre, University of Auckland */
X

X#include "pktsnap.h"
X
X#include <mem.h>
X
X#include <bios.h>
X#include <dos.h>
X
X#ifdef XXYYZZ
Xint kbstatus() /* See if there's a kb character */
X{
X#ifdef INLINE
X _AH = 0x01; geninterrupt(0x16);
X asm mov ax,0
X asm jz kbsret
X asm mov al,1
Xkbsret:
X return _AX;
X#else
X return bioskey(1);
X#endif
X#ifdef doitourselves
X union REGS call_regs, ret_regs;
X call_regs.h.ah = 0x01; /* Test kb: Zero flag on => no char */
X int86(0x16,&call_regs,&ret_regs);
X /* Ecosoft C88 int86 returns flags as result instead of in REGS */
X /* Turbo C int86 puts flags in REGS and returns AX as result ! */
X return !(ret_regs.x.flags & 0x40); /* Zero flag */
X#endif
X }
X
Xunsigned char kbcode() /* Read char from the keyboard */
X{ _AH = 0x00; geninterrupt(0x16); return _AL; } /* AH = scan code */
X#endif
X
X
X#define UP 0x06 /* BIOS scroll parameters */
X#define DOWN 0x07
X#define CHATR 0x07 /* Screen attribute for chart */
X
Xvoid bios_scroll(way, tx,ty, bx,by, nrows, attr)
Xint way, tx,ty, bx,by, nrows, attr;
X{
X _AH = (way == UP) ? UP : DOWN; /* Scroll direction */
X _AL = nrows; /* Rows to scroll */
X _BH = attr; /* Screen attribute for blank fill */
X _CH = ty; _CL = tx; /* Top left */
X _DH = by; _DL = bx; /* Bottom right */
X geninterrupt(0x10);
X }
X
Xvoid scpos(x,y) /* Set Cursor Position */
Xunsigned char x,y;
X{
X _AH = 2; _BH = 0; _DH = y; _DL = x;
X geninterrupt(0x10);
X }
X
Xvoid sputc(c) /* Write char to screen, don't move cursor */
Xunsigned char c;
X{
X _BH = 0; _CX = 1; _AH = 10; _AL = c;
X geninterrupt(0x10);
X }
X
Xvoid swrite(c) /* Write char to screen */
Xunsigned char c;
X{
X _AH = 14; _AL = c;
X geninterrupt(0x10);
X }
X
X#define MTICKS 1092L /* 18.20000 per second */
X#define HTICKS 65543L /* 18.20639 */
X#define DTICKS 1573040L /* 18.20648 */
X
X#define DCSEC 8640000L /* centiseconds per day */
X
Xlong biosticks()
X{
X long tt = biostime(0,0L); /* Clock ticks */
X if (tt < l_tod) ++midnight_crossings;
X return l_tod = tt;
X }
X
Xvoid start_uptime_clock(void)
X{
X midnight_crossings = 0;
X boot_time = biostime(0,0L) - 1;
X /* About 5 cs early, to allow first flow create times to be > 1 cs */
X }
X
Xunsigned long uptime() /* Since startup, in centiseconds */
X{
X return ((biosticks()-boot_time)*549L+275L)/100L /* cs per clock tick */
X + (long)midnight_crossings*DCSEC;
X }
X
Xvoid set_tod()
X{
X long tt = biosticks();
X tod_h = tt/HTICKS; tt -= (long)tod_h*HTICKS;
X tod_m = tt/MTICKS; tt -= (long)tod_m*MTICKS;
X tod_s = (tt*10+91l)/182l;
X if (tod_s == 60) {
X ++tod_m; tod_s = 0;
X }
X if (tod_m == 60) {
X ++tod_h; tod_m = 0;
X }
X if (tod_h == 24) tod_h = 0;
X }
X
Xvoid sclear()
X{
X bios_scroll(UP, 0,0, 79,24, 0, CHATR); /* Blank screen */
X }
X
Xvoid w_clear(tx,ty, bx,by)
Xint tx,ty, bx,by;
X{
X bios_scroll(UP, tx,ty, bx,by, 0, CHATR); /* Blank window */
X }
X
Xvoid w_roll(tx,ty, bx,by, n)
Xint tx,ty, bx,by, n;
X{
X bios_scroll(UP, tx,ty, bx,by, n, CHATR); /* Roll window up n lines */
X scpos(tx,by); /* Leave cursor at start of bottom window line */
X }
X
X#define DOT 0xFA /* Small dot in centre of char rectangle */
X
Xvoid chart(tx,ty, bx,by, x1,x2,x3)
Xint tx,ty, bx,by, x1,x2,x3;
X{
X int w,k;
X#define TIMEWIDTH 8
X char buf[TIMEWIDTH+102], *bar;
X bios_scroll(UP, tx,ty, bx,by, 1, CHATR);
X w = bx+1-tx - TIMEWIDTH; /* Plot chars from bar[0] to bar[w-1], 0-org */
X bar = &buf[TIMEWIDTH];
X if (tod_s%30 == 0) {
X sprintf(buf, "%02d%02d:%02d +", tod_h,tod_m,tod_s);
X memset(bar+1,DOT,w-1);
X }
X else {
X memset(buf, ' ',TIMEWIDTH+w);
X bar[0] = '|';
X }
X for (k = 10; k < w; k += 10) bar[k] = ':';
X if (x1 >= w) x1 = w;
X if (x2 >= w) x2 = w;
X if (x3 >= w) x3 = w;
X for (k = x1+1; k < x3; ++k) bar[k] = '-';
X for (k = 10; k < w; k += 10)
X if (bar[k] == '-') bar[k] = '+';
X bar[x1] = '<';
X bar[x3] = '>';
X bar[x2] = '*';
X k = bar[w-1]; bar[w-1] = '\0';
X scpos(tx,by);
X for (bar = buf; *bar; ) swrite(*bar++);
X sputc(k); /* Leave cursor at (bx,by) */
X }
END_OF_FILE
if test 4246 -ne `wc -c <'netramet/src/meter/chart.c'`; then
echo shar: \"'netramet/src/meter/chart.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/chart.c'
fi
if test -f 'netramet/src/meter/include/pktsnap.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/meter/include/pktsnap.h'\"
else
echo shar: Extracting \"'netramet/src/meter/include/pktsnap.h'\" \(2839 characters\)
sed "s/^X//" >'netramet/src/meter/include/pktsnap.h' <<'END_OF_FILE'
X/* 1400, Wed 6 Oct 93
X
X PKTSNAP.H: Declarations for AU packet monitoring
X extensions to Waterloo TCP/IP


X
X Copyright (C) 1992,1993 by Nevil Brownlee,
X Computer Centre, University of Auckland */
X

X#ifdef PKTSNAP
X#define EXTERN
X#else
X#define EXTERN extern
X#endif
X
X#ifdef AU_MSDOS
X/* Declared in wattcp\src\pcpkt.c .. */
X
Xvoid pkt_rcv_call2(unsigned int handle, unsigned int len,
X unsigned char far *buff);
X
Xextern char au_monitor; /* 1 to enable monitoring */
X
Xextern unsigned char eth_addr[6];
Xextern unsigned long npackets,nbytes;
X#else
XEXTERN unsigned long npackets; /* Declared in meter_ux.c */
X#endif
X
X/* Declared in wattcp\acct\meter_pc.c .. */
X
XEXTERN unsigned int bkgi; /* Seconds before next run of backgound process */
X
XEXTERN unsigned int /* Statistics variables */
X max_pkt_rate, pkt_backlog,max_pkt_backlog,
X dummypackets, mdpacketrate;
XEXTERN unsigned long
X stats_time, t_backlog,
X spackets,sbytes,
X kilodummypackets, dummypacketrate, mindummyrate,
X badpackets,nobufpackets;
XEXTERN unsigned char
X clear_pkt_stats; /* 1 to clear stats variables */
X
X/* Declared in wattcp\elib\q*.asm .. */
X
X#ifdef AU_MSDOS


Xvoid qmove(unsigned char far *s, unsigned char far *d, unsigned int n);

Xint qcmp(unsigned char far *s, unsigned char far *d, unsigned int n);
X
X#else
X
X#define qmove(s,d,n) memcpy((char *)d,(char *)s,n)
X#define qcmp(s,d,n) memcmp((char *)s,(char *)d,n)
X
X#define w_roll(x1,y1, x2,y2, up)
X#define scpos(x,y)
X#define w_clear(x1,y1, x2,y2)
X#endif
X
X/* Monitor variables .. */
X
XEXTERN long lostpackets;
X
X#define SNAPFROM 0 /* Dest Ethernet address */
X#define SNAPTO 43 /* IPX source socket */
X#define SNAPLEN (SNAPTO - SNAPFROM + 1) /* Save bytes FROM to TO in pkt */


X
X#define MAXPKTLEN 1526
X

X#ifdef AU_MSDOS
X/* pkt data structure */
Xstruct pkt {
X unsigned int p_len;
X unsigned char p_type,
X p_data[SNAPLEN];
X };
X
XEXTERN struct pkt far *pkts;
X
XEXTERN int
X maxpkt, /* Must be a power of 2 */
X pktmask, /* maxpkt-1 */
X maxpkthi, /* maxpkt/256 */
X prcv, /* Index of next pkt to be received (i.e. next empty pkt) */
X pproc; /* Index of next pkt to be processed (i.e. next full pkt) */
X#endif
X
XEXTERN long l_tod; /* Time of day */
XEXTERN char tod_h,tod_m,tod_s,
X s_tod_h,s_tod_m,s_tod_s; /* Time when counters last saved */
X
XEXTERN int midnight_crossings;
XEXTERN long boot_time;
X
XEXTERN long elapsed_sec; /* Seconds since counters last saved */
X
Xunsigned long uptime(void); /* Since startup, in centiseconds */
X
X#ifdef AU_MSDOS
Xvoid chart(int tx, int ty, /* Declared in chart.c */
X int bx, int by,
X int x1, int x2, int x3);
X
Xlong biosticks(void); /* PC clock ticks */
X
X/* 12 bytes interframe space + 8 bytes preamble + 4 byte FCS */
X#define util_pc(p,b) (((24l*p + b)/1250l + 5l)/10l) /* % utilisation */
X#endif
X


X#ifndef NULL
X#define NULL 0
X#endif
X
X

END_OF_FILE
if test 2839 -ne `wc -c <'netramet/src/meter/include/pktsnap.h'`; then
echo shar: \"'netramet/src/meter/include/pktsnap.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/meter/include/pktsnap.h'
fi
if test -f 'netramet/src/snmplib/include/asn1.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/asn1.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/asn1.h'\" \(3408 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/asn1.h' <<'END_OF_FILE'
X/*
X * Definitions for Abstract Syntax Notation One, ASN.1


X * As defined in ISO/IS 8824 and ISO/IS 8825

X *
X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X

X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#ifdef EIGHTBIT_SUBIDS
Xtypedef u_char oid;
X#define MAX_SUBID 0xFF
X#elif SIXTEENBIT_SUBIDS
Xtypedef u_short oid;
X#define MAX_SUBID 0xFFFF
X#else
Xtypedef u_long oid;
X#define MAX_SUBID 0xFFFFFFFF
X#endif
X
X#define MAX_OID_LEN 64 /* max subid's in an oid */
X
X#define ASN_BOOLEAN (0x01)
X#define ASN_INTEGER (0x02)
X#define ASN_BIT_STR (0x03)
X#define ASN_OCTET_STR (0x04)
X#define ASN_NULL (0x05)
X#define ASN_OBJECT_ID (0x06)
X#define ASN_SEQUENCE (0x10)
X#define ASN_SET (0x11)
X
X#define ASN_UNIVERSAL (0x00)
X#define ASN_APPLICATION (0x40)
X#define ASN_CONTEXT (0x80)
X#define ASN_PRIVATE (0xC0)
X
X#define ASN_PRIMITIVE (0x00)
X#define ASN_CONSTRUCTOR (0x20)
X
X#define ASN_LONG_LEN (0x80)
X#define ASN_EXTENSION_ID (0x1F)
X#define ASN_BIT8 (0x80)
X
X#define IS_CONSTRUCTOR(byte) ((byte) & ASN_CONSTRUCTOR)
X#define IS_EXTENSION_ID(byte) (((byte) & ASN_EXTENSION_ID) == ASN_EXTENSION_ID)
X
Xu_char *asn_parse_int(u_char *data, int *datalength, u_char *type,
X long *intp, int intsize);
Xu_char *asn_build_int(u_char *, int *, u_char,
X long far *, int);
X/* u_char *asn_build_int(u_char *data, int *datalength, u_char type,
X long far *intp, int intsize); */
Xu_char *asn_parse_string(u_char *, int *, u_char *,
X u_char *, int *);
Xu_char *asn_build_string(u_char *, int *, u_char,
X u_char far *, int);
X/* u_char *asn_build_string(u_char *data, int *datalength, u_char type,
X u_char far *string, int strlength); */
Xu_char *asn_parse_header(u_char *data, int *datalength, u_char *type);
Xu_char *asn_build_header(u_char *data, int *datalength, u_char type,
X int length);
Xu_char *asn_parse_length(u_char *data, u_long *length);
Xu_char *asn_build_length(u_char *data, int *datalength,
X int length);
Xu_char *asn_parse_objid(u_char *, int *, u_char *,
X oid *, int *);
X/* u_char *asn_parse_objid(u_char *data, int *datalength, u_char *type,
X oid *objid, int *objidlength); */
Xu_char *asn_build_objid(u_char *data, int *datalength, u_char type,
X oid far *objid, int objidlength);
Xu_char *asn_parse_null(u_char *data, int *datalength, u_char *type);
Xu_char *asn_build_null(u_char *data, int *datalength, u_char type);
END_OF_FILE
if test 3408 -ne `wc -c <'netramet/src/snmplib/include/asn1.h'`; then
echo shar: \"'netramet/src/snmplib/include/asn1.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/asn1.h'
fi
if test -f 'netramet/src/snmplib/include/snmpimpl.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/snmpimpl.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/snmpimpl.h'\" \(2616 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/snmpimpl.h' <<'END_OF_FILE'
X/*
X * Definitions for SNMP (RFC 1067) implementation.


X *
X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X

X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/
X

X#ifdef NOT_ANSI_C
X#if (defined vax) || (defined (mips))
X/*
X * This is a fairly bogus thing to do, but there seems to be no better way for
X * compilers that don't understand void pointers.
X */
X#define void char
X#endif
X#endif
X
X/*
X * Error codes:
X */
X/*
X * These must not clash with SNMP error codes (all positive).
X */
X#define PARSE_ERROR -1
X#define BUILD_ERROR -2
X
X#define SID_MAX_LEN 64
X#define MAX_NAME_LEN 64 /* number of subid's in a objid */
X


X#ifndef NULL
X#define NULL 0
X#endif
X

X#ifndef TRUE
X#define TRUE 1
X#endif
X#ifndef FALSE
X#define FALSE 0
X#endif
X
X#define READ 1
X#define WRITE 0
X
X#define RONLY 0xAAAA /* read access for everyone */
X#define RWRITE 0xAABA /* add write access for community private */
X#define NOACCESS 0x0000 /* no access for anybody */
X
X#define INTEGER ASN_INTEGER
X#define STRING ASN_OCTET_STR
X#define OBJID ASN_OBJECT_ID
X#define NULLOBJ ASN_NULL
X
X/* defined types (from the SMI, RFC 1065) */
X#define IPADDRESS (ASN_APPLICATION | 0)
X#define COUNTER (ASN_APPLICATION | 1)
X#define GAUGE (ASN_APPLICATION | 2)
X#define TIMETICKS (ASN_APPLICATION | 3)
X#define OPAQUE (ASN_APPLICATION | 4)
X
X#ifdef DEBUG
X#define ERROR(string) printf("%s(%d): %s",__FILE__, __LINE__, string);
X#else
X#define ERROR(string)
X#endif
X
X/* from snmp.c*/
Xextern u_char sid[]; /* size SID_MAX_LEN */
X
Xu_char *snmp_parse_var_op();
Xu_char *snmp_build_var_op();
X
Xu_char *snmp_auth_parse();
Xu_char *snmp_auth_build();
END_OF_FILE
if test 2616 -ne `wc -c <'netramet/src/snmplib/include/snmpimpl.h'`; then
echo shar: \"'netramet/src/snmplib/include/snmpimpl.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/snmpimpl.h'
fi
if test -f 'netramet/src/snmplib/snmpauth.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/snmpauth.c'\"
else
echo shar: Extracting \"'netramet/src/snmplib/snmpauth.c'\" \(3057 characters\)
sed "s/^X//" >'netramet/src/snmplib/snmpauth.c' <<'END_OF_FILE'
X/*
X * snmp_auth.c -
X * Authentication for SNMP (RFC 1067). This implements a null
X * authentication layer.


X *
X *
X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X

X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X
X#include "ausnmp.h"
X
X#ifdef KINETICS
X#include "gw.h"

X#include "fp4/cmdmacro.h"


X#endif
X
X#if (defined(unix) && !defined(KINETICS))
X#include <sys/types.h>
X#include <netinet/in.h>

X#ifndef NULL
X#define NULL 0
X#endif

X#endif


X
X#include "asn1.h"
X#include "snmp.h"
X#include "snmpimpl.h"
X

Xu_char *
Xsnmp_auth_parse(data, length, sid, slen, version)
X u_char *data;
X int *length;
X u_char *sid;
X int *slen;
X long *version;


X{
X u_char type;
X

X data = asn_parse_header(data, length, &type);


X if (data == NULL){

X ERROR("bad header");
X return NULL;
X }
X if (type != (ASN_SEQUENCE | ASN_CONSTRUCTOR)){
X ERROR("wrong auth header type");
X return NULL;
X }
X data = asn_parse_int(data, length, &type, version, sizeof(*version));


X if (data == NULL){

X ERROR("bad parse of version");
X return NULL;
X }
X data = asn_parse_string(data, length, &type, sid, slen);


X if (data == NULL){

X ERROR("bad parse of community");
X return NULL;
X }
X sid[*slen] = '\0';
X return (u_char *)data;
X}
X
Xu_char *
Xsnmp_auth_build(data, length, sid, slen, version, messagelen)
X u_char *data;
X int *length;
X u_char *sid;
X int *slen;
X long *version;
X int messagelen;
X{
X data = asn_build_header(data, length, (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR), messagelen + *slen + 5);


X if (data == NULL){

X ERROR("buildheader");
X return NULL;
X }
X data = asn_build_int(data, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
X (long *)version, sizeof(*version));


X if (data == NULL){

X ERROR("buildint");
X return NULL;
X }
X data = asn_build_string(data, length,
X (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OCTET_STR),
X sid, *slen);


X if (data == NULL){

X ERROR("buildstring");
X return NULL;
X }
X return (u_char *)data;
X}
END_OF_FILE
if test 3057 -ne `wc -c <'netramet/src/snmplib/snmpauth.c'`; then
echo shar: \"'netramet/src/snmplib/snmpauth.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/snmpauth.c'
fi
echo shar: End of archive 23 \(of 25\).
cp /dev/null ark23isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:08:06 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 112
Archive-name: netramet/part24
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet/doc/NeTraMet/to.do
# netramet/doc/snmp/Makefile.snmp netramet/doc/snmp/snmpget.1
# netramet/doc/snmp/snmpgetnext.1 netramet/doc/snmp/snmptrapd.1
# netramet/examples/rules.gateway netramet/examples/rules.lan
# netramet/pc/wattcp.cfg.UU netramet/sg/manager/Makefile
# netramet/sg/snmplib/Makefile netramet/src/apps/kernel.c
# netramet/src/snmplib/include/parse.h
# netramet/src/snmplib/include/snmp.h
# netramet/src/snmplib/include/snmpclnt.h netramet/sun/apps/Makefile
# netramet/sun/apps/snmpnetstat/Makefile netramet/sun/meter/Makefile
# netramet/sun/snmplib/Makefile


# Wrapped by kent@sparky on Tue Nov 2 18:17:14 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 24 (of 25)."'
if test -f 'netramet/doc/NeTraMet/to.do' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/NeTraMet/to.do'\"
else
echo shar: Extracting \"'netramet/doc/NeTraMet/to.do'\" \(1199 characters\)
sed "s/^X//" >'netramet/doc/NeTraMet/to.do' <<'END_OF_FILE'
X# 2015, Sun 17 Oct 93
X
X# doc/NeTraMet/to.do
X
X Nevil Brownlee, Computer Centre, University of Auckland
X
X
XThis file lists some useful development projects for NeTraMet ..
X
X1) Change to using more recent versions of CMU SNMP and Waterloo TCP.
X The versions used for this release are those which were current 18
X months ago. This will be my next development activity.
X
X2) Extend the list of protocols known to NeTraMet. Possibilities
X include:
X
X * Novell IPX. Version 2.0 recognises IPX packets in Novell's
X default packet format, but there are other possibilities, e.g.
X the one you get when you ECONFIG a Novell server. I believe
X it's also possible to produce real 802.2 LLC packets from a
X Novell server (rather than the default ones which
X have the cehcksum field set to 0xFFFF).
X
X * CLNP. I don't have any of this on my network. It would require
X a slightly more elaborate memory allocation scheme for flows,
X but shouldn't be difficult to implement.
X
X3) Implement secure SNMP for communications between NeTraMet and
X NeMaC.
X
X
XIf you think of other developments you'd like to see, please let me
Xknow by e-mail to n.bro...@auckland.ac.nz.
END_OF_FILE
if test 1199 -ne `wc -c <'netramet/doc/NeTraMet/to.do'`; then
echo shar: \"'netramet/doc/NeTraMet/to.do'\" unpacked with wrong size!
fi
# end of 'netramet/doc/NeTraMet/to.do'
fi
if test -f 'netramet/doc/snmp/Makefile.snmp' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/Makefile.snmp'\"
else
echo shar: Extracting \"'netramet/doc/snmp/Makefile.snmp'\" \(999 characters\)
sed "s/^X//" >'netramet/doc/snmp/Makefile.snmp' <<'END_OF_FILE'
X# Original CMU Makefile for whole SNMP collection
X
XTARG = bin/snmpget bin/snmpgetnext bin/snmpstatus bin/snmpwalk bin/snmptest bin/snmptrap bin/snmptrapd bin/snmpnetstat bin/snmpmon bin/snmpd
X
Xall: makeall
X
Xinstall: apps/snmpget apps/snmpgetnext apps/snmpstatus apps/snmpwalk apps/snmptest apps/snmptrap apps/snmptrapd apps/snmpnetstat/snmpnetstat apps/snmpd
X cp apps/snmpget bin/snmpget
X cp apps/snmpgetnext bin/snmpgetnext
X cp apps/snmpstatus bin/snmpstatus
X cp apps/snmpwalk bin/snmpwalk
X cp apps/snmptest bin/snmptest
X cp apps/snmptrap bin/snmptrap
X cp apps/snmptrapd bin/snmptrapd
X cp apps/snmpnetstat/snmpnetstat bin/snmpnetstat
X cp apps/snmpd bin/snmpd
X
Xapps/snmpget apps/snmpgetnext apps/snmpstatus apps/snmpwalk apps/snmptest apps/snmptrap apps/snmptrapd apps/snmpnetstat/snmpnetstat apps/snmpmon apps/snmpd: makeall
X
Xmakeall:
X cd snmplib; make all install
X cd apps; make
X cd apps/snmpnetstat; make
X
Xclean:
X cd snmplib; make clean
X cd apps; make clean
X cd apps/snmpnetstat; make clean
X
X
END_OF_FILE
if test 999 -ne `wc -c <'netramet/doc/snmp/Makefile.snmp'`; then
echo shar: \"'netramet/doc/snmp/Makefile.snmp'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/Makefile.snmp'
fi
if test -f 'netramet/doc/snmp/snmpget.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmpget.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmpget.1'\" \(2626 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmpget.1' <<'END_OF_FILE'


X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University
X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPGET 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmpget - communicates with a network entity using SNMP GET Requests.
X.SH SYNOPSIS
Xsnmpget host community variable-name [variable-name]...
X.SH DESCRIPTION
XSnmpget is an SNMP application that uses the GET Request to query for
Xinformation on a network entity. One or more fully qualified object
Xidentifiers may be given as arguments on the command line.


XEach variable name is given in the format specified in
X.IR variables (5).
X.PP

XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP

XFor example
X.PP
X.I snmpget netdev-kbox.cc.cmu.edu public system.sysdescr.0 system.sysUpTime.0
X.PP
Xwill retrieve the variables sysDescr.0 and sysUpTime.0:


X.PP
X.I Name: system.sysDescr.0
X.br
X.I OCTET STRING- (ascii): Kinetics FastPath2
X.PP

X.I Name: system.sysUpTime.0
X.br
X.I Timeticks: (2270351) 6:18:23


X.PP
XIf the network entity has an error processing the request packet, an error
Xpacket will be returned and a message will be shown, helping to pinpoint in what

Xway the request was malformed. If there were other variables in the request,
Xthe request will be resent without the bad variable.


X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"
Xvariables(5), RFC 1065, RFC 1066, RFC 1067
END_OF_FILE

if test 2626 -ne `wc -c <'netramet/doc/snmp/snmpget.1'`; then
echo shar: \"'netramet/doc/snmp/snmpget.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmpget.1'
fi
if test -f 'netramet/doc/snmp/snmpgetnext.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmpgetnext.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmpgetnext.1'\" \(2605 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmpgetnext.1' <<'END_OF_FILE'


X.\* /***********************************************************
X.\" Copyright 1988, 1989 by Carnegie Mellon University
X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPGETNEXT 1 "17 September 1989"
X.UC 4
X.SH NAME
Xsnmpgetnext - communicates with a network entity using SNMP GET NEXT Requests.
X.SH SYNOPSIS
Xsnmpgetnext host community variable-name [variable-name]...
X.SH DESCRIPTION
XSnmpget is an SNMP application that uses the GET NEXT Request to query for
Xinformation on a network entity. One or more object
Xidentifiers may be given as arguments on the command line.


XEach variable name is given in the format specified in
X.IR variables (5).

XFor each one, the variable that is lexicographicly "next" in the remote entity's
XMIB will be returned.


X.PP
XThe
X.I host
Xspecification may be either a host name or an internet address
Xspecified in "dot notation"
X.PP
XThe
X.I community
Xspecifies the community name for the transaction with the remote system.
X.PP

XFor example
X.PP
X.I snmpgetnext netdev-kbox.cc.cmu.edu public system.sysdescr system.sysUpTime
X.PP
Xwill retrieve the variables sysDescr.0 and sysUpTime.0:


X.PP
X.I Name: system.sysDescr.0
X.br
X.I OCTET STRING- (ascii): Kinetics FastPath2
X.PP

X.I Name: system.sysUpTime.0
X.br
X.I Timeticks: (2270351) 6:18:23


X.PP
XIf the network entity has an error processing the request packet, an error

Xmessage will be shown, helping to pinpoint in what way the request was malformed.


X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"
Xvariables(5), RFC 1065, RFC 1066, RFC 1067
END_OF_FILE

if test 2605 -ne `wc -c <'netramet/doc/snmp/snmpgetnext.1'`; then
echo shar: \"'netramet/doc/snmp/snmpgetnext.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmpgetnext.1'
fi
if test -f 'netramet/doc/snmp/snmptrapd.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/doc/snmp/snmptrapd.1'\"
else
echo shar: Extracting \"'netramet/doc/snmp/snmptrapd.1'\" \(2145 characters\)
sed "s/^X//" >'netramet/doc/snmp/snmptrapd.1' <<'END_OF_FILE'
X.\* /***********************************************************
X.\" Copyright 1989 by Carnegie Mellon University


X.\"
X.\" All Rights Reserved
X.\"
X.\" Permission to use, copy, modify, and distribute this software and its
X.\" documentation for any purpose and without fee is hereby granted,
X.\" provided that the above copyright notice appear in all copies and that
X.\" both that copyright notice and this permission notice appear in
X.\" supporting documentation, and that the name of CMU not be
X.\" used in advertising or publicity pertaining to distribution of the
X.\" software without specific, written prior permission.
X.\"
X.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X.\" SOFTWARE.
X.\" ******************************************************************/

X.TH SNMPTRAPD 1 "17 SEPTEMBER 1989"
X.UC 4
X.SH NAME
Xsnmptrapd - Receive and log snmp trap messages.
X.SH SYNOPSIS
Xsnmptrapd [ -p ]
X.SH DESCRIPTION
XSnmptrapd
Xis an SNMP application that receives and logs snmp trap messages
Xsent to the SNMP-TRAP port (162) on the local machine.
X.PP
XIf the
X.B -p
Xoption is given,
X.I snmptrapd
Xwill print it's messages to the standard output. Otherwise it will use
X.IR syslog (8)
Xto log messages. These syslog messages are sent with the level of LOG_WARNING, and
Xare if available (usually on 4.3 systems) are sent to the LOG_LOCAL0 facility.
X.PP
XThe log messages are of the form:
X.br
X.I Sep 17 22:39:52 suffern snmptrapd: 128.2.13.41:
X.I Cold Start Trap (0) Uptime:
X.I 8 days, 0:35:46
X.PP
X.I Snmptrapd
Xmust be run as root so that UDP port 162 can be opened.


X.PP
XAdding a "-d" to the argument list will cause the application to dump input and output packets.
X.PP
X.SH "SEE ALSO"

Xsyslog(8), variables(5), RFC 1065, RFC 1066, RFC 1067
END_OF_FILE
if test 2145 -ne `wc -c <'netramet/doc/snmp/snmptrapd.1'`; then
echo shar: \"'netramet/doc/snmp/snmptrapd.1'\" unpacked with wrong size!
fi
# end of 'netramet/doc/snmp/snmptrapd.1'
fi
if test -f 'netramet/examples/rules.gateway' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/examples/rules.gateway'\"
else
echo shar: Extracting \"'netramet/examples/rules.gateway'\" \(2465 characters\)
sed "s/^X//" >'netramet/examples/rules.gateway' <<'END_OF_FILE'
X# 1605, Fri 24 Sep 93
X#
X# Rule specification file to tally traffic to/from ccr1
X#
X# Nevil Brownlee, Computer Centre, University of Auckland
X#
XSET 6 # Rule + action set number 6
X#
XRULES
X#
XDestAdjacentAddress, ff-ff-ff-ff-ff-ff, aa-00-04-00-f4-ed, # ccr1
X Pushto, 3; # 1
XNull, 0, 0, Fail, 0; # 2 Try again
X#
XSourcePeerType, 255, IP, Pushto, 5; # 3
XNull, 0, 0, Succeed, 0; # 4 Ignore
X#
XSourcePeerAddress, 255.255.0.0, 130.216.0.0, Pushto, 8; # 5 Auckland
XSourcePeerAddress, 192.0.0.0, 192.0.0.0, Pushto, 8; # 6 Low C
XNull, 0, 0, Pushto, 11; # 7 Low B
X#
XDestPeerAddress, 192.0.0.0, 192.0.0.0, Tally, 1; # 8 Tally C-C
XDestPeerAddress, 192.0.0.0, 128.0.0.0, Tally, 2; # 9 Tally C-B
XNull, 0, 0, Tally, 3; # 10 Tally C-A
X#
XDestPeerAddress, 192.0.0.0, 128.0.0.0, Tally, 4; # 11 Tally B-B
XDestPeerAddress, 192.0.0.0, 192.0.0.0, Tally, 5; # 12 Tally B-C
XNull, 0, 0, Tally, 6; # 13 Tally B-A
X#
XACTIONS
X#
XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0, # 1 Tally C-C


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;

XSourcePeerMask=255.255.255.0, DestPeerMask=255.255.0.0, # 1 Tally C-B


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;

XSourcePeerMask=255.255.255.0, DestPeerMask=255.0.0.0, # 1 Tally C-A


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;

XSourcePeerMask=255.255.0.0, DestPeerMask=255.255.255.0, # 1 Tally B-C


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;

XSourcePeerMask=255.255.0.0, DestPeerMask=255.255.0.0, # 1 Tally B-B


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;

XSourcePeerMask=255.255.0.0, DestPeerMask=255.0.0.0, # 1 Tally B-A


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
X#

XFORMAT FlowRuleSet FlowIndex FirstTime " "
X# SourceAdjacentAddress DestAdjacentAddress " "
X# SourcePeerType
X SourcePeerAddress DestPeerAddress " "
X SourceDetailType SourceDetailAddress DestDetailAddress " "

X ToOctets FromOctets;


X#
XSTATISTICS # Collect meter statistics
X#
X# end of file
END_OF_FILE

if test 2465 -ne `wc -c <'netramet/examples/rules.gateway'`; then
echo shar: \"'netramet/examples/rules.gateway'\" unpacked with wrong size!
fi
# end of 'netramet/examples/rules.gateway'
fi
if test -f 'netramet/examples/rules.lan' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/examples/rules.lan'\"
else
echo shar: Extracting \"'netramet/examples/rules.lan'\" \(2170 characters\)
sed "s/^X//" >'netramet/examples/rules.lan' <<'END_OF_FILE'
X# 1015, Mon 4 Oct 93
X#
X# Rule specification file to tally Local Area Network traffic
X#
X# Nevil Brownlee, Computer Centre, University of Auckland
X#
XSET 4 # Rule + action set number
X#
XRULES
X#
XSourcePeerType & 255 = IP.0.0.0 : Tally, 1; # 1
XSourcePeerType & 255 = DECnet : Pushto, 6; # 2
XSourcePeerType & 255 = EtherTalk : Pushto, 11; # 3
XSourcePeerType & 255 = Novell : Tally, 6; # 4


XNull & 0 = 0 : Succeed, 0; # 5 Ignore

X#
XSourceDetailType & 255 = 38 : Tally, 2; # 6 Tally DECnet data by host
XSourceDetailType & 255 = 6 : Tally, 2; # 7
XSourceDetailType & 255 = 46 : Tally, 2; # 8
XSourceDetailType & 255 = 14 : Tally, 2; # 9
XNull & 0 = 0 : Tally, 3; # 10 Tally rest of DECnet by detail
X#
XSourceDetailType & 255 = 3 : Tally, 4; # 11 Tally AT data by host
XNull & 0 = 0 : Tally, 5; # 12 Tally rest of AT by detail
X#
XACTIONS
X#
XSourcePeerType=IP, # 1 Tally IP by subnet and port
X SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
X#

XSourcePeerType=DECnet, # 2 Tally DECnet data by host
X SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,
X SourceDetailTypeMask=255;
XSourcePeerType=DECnet, # 3 Tally DECnet by protocol
X SourceDetailTypeMask=255;
X#
XSourcePeerType=EtherTalk, # 4 Tally Ethertalk data by host
X SourcePeerMask=255.255.255.0, DestPeerMask=255.255.255.0,
X SourceDetailTypeMask=255;
XSourcePeerType=EtherTalk, # 5 Tally Ethertalk by DDP type
X SourceDetailTypeMask=255;
X#
XSourcePeerType=Novell, # 6 Tally IPX by network nbr and port
X SourcePeerMask=255.255.255.255, DestPeerMask=255.255.255.255,


X SourceDetailTypeMask=255,
X SourceDetailMask=255.255, DestDetailMask=255.255;
X#

XSTATISTICS


X#
XFORMAT FlowRuleSet FlowIndex FirstTime " "

X SourcePeerType SourcePeerAddress DestPeerAddress " "


X SourceDetailType SourceDetailAddress DestDetailAddress " "
X ToPDUs FromPDUs " " ToOctets FromOctets;
X#

X# end of file
END_OF_FILE

if test 2170 -ne `wc -c <'netramet/examples/rules.lan'`; then
echo shar: \"'netramet/examples/rules.lan'\" unpacked with wrong size!
fi
# end of 'netramet/examples/rules.lan'
fi
if test -f 'netramet/pc/wattcp.cfg.UU' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/wattcp.cfg.UU'\"
else
echo shar: Extracting \"'netramet/pc/wattcp.cfg.UU'\" \(1015 characters\)
sed "s/^X//" >'netramet/pc/wattcp.cfg.UU' <<'END_OF_FILE'
Xbegin 640 netramet/pc/wattcp.cfg
XM(" @(" @(" C('-E="!I<"!N=6UB97(*(" @(" @("!M>5]I<#TQ,C,N,3(S
XM+C$R,RXQ,C,*(" @(" @(" C(&]R(&9O<B!B;V]T<"!S970@;7E?:7 ]8F]O
XM=' *"B @(" @(" @(R!S970@82!N;VXM>F5R;R!N971W;W)K(&UA<VL*(" @
XM(" @("!N971M87-K/3(U-2XR-34N,C4U+C *"B @(" @(" @(R!E;G1E<B!O
XM;F4@;W(@;6]R92!N86UE<V5R=F5R<PH@(" @(" @(&YA;65S97)V97(],3(S
XM+C$R,RXQ+C(*"B @(" @(" @(R!E;G1E<B!O;F4@;W(@;6]R92!G871E=V%Y
XM<PH@(" @(" @(&=A=&5W87D],3(S+C$R,RXQ+C(U- H*(" @(" @(" C('-H
XM;W5L9"!H879E(&$@9&]M86EN(&QI<W0*"61O;6%I;G-L:7-T/2)A=6-K;&%N
XM9"YA8RYN>B(*"B @(" @(" @(R!O<'1I;VYA;"!I;F%C=&EV92!F;&%G('1E
XM;&QS(%=!5%1#4"!T;R!K:6QL(&-O;FYE8W1I;VX@:68@;F]T:&EN9PH@(" @
XM(" @(",@:&%P<&5N<R!F;W(@82!P97)I;V0@;V8@=&EM92!I;B!S96-O;F1S
XM"B @(" @(" @(R!E9RX@:6YA8W1I=F4],S P(" @(",@,S P('-E8V]N9',@
XM;W(@-2!M:6YU=&5S"@H@(" @(" @(",@9&5F:6YE('1I;65O=70@9F]R(&UO
XM<W0@=&AI;F=S+"!L:6ME(&]P96YI;F<@<V5S<VEO;G,*(" @(" @(" C(&1E
XM9F%U;'1S('1O(#,P('-E8V]N9',*(" @(" @(" C(&5G+B!S;V-K9&5L87D]
XA-C @(" @(R!E>'1E;F0@:70@=&\@;VYE(&UI;G5T90H:
X
Xend
END_OF_FILE
if test 1015 -ne `wc -c <'netramet/pc/wattcp.cfg.UU'`; then
echo shar: \"'netramet/pc/wattcp.cfg.UU'\" unpacked with wrong size!
else
echo shar: Uudecoding \"'netramet/pc/wattcp.cfg'\" \(708 characters\)
cat netramet/pc/wattcp.cfg.UU | uudecode
if test 708 -ne `wc -c <'netramet/pc/wattcp.cfg'`; then
echo shar: \"'netramet/pc/wattcp.cfg'\" uudecoded with wrong size!
else
rm netramet/pc/wattcp.cfg.UU
fi
fi
# end of 'netramet/pc/wattcp.cfg.UU'
fi
if test -f 'netramet/sg/manager/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sg/manager/Makefile'\"
else
echo shar: Extracting \"'netramet/sg/manager/Makefile'\" \(837 characters\)
sed "s/^X//" >'netramet/sg/manager/Makefile' <<'END_OF_FILE'
X#
X# Makefile for NeMaC
X#
X# Nevil Brownlee, Computer Centre, UNiversity of Auckland


X#
X
XSRC= ../../src/manager
XSINCLUDE= ../../src/snmplib/include
XNINCLUDE= ../../src/manager/include

X
XSNMPH = $(SINCLUDE)/asn1.h $(SINCLUDE)/mib.h $(SINCLUDE)/parse.h \
X $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/snmpclnt.h $(SINCLUDE)/snmpimpl.h
X

XTARG= NeMaC
X
XLIBS= ../snmplib/libsnmp.a
X
XCFLAGS= -g -I$(NINCLUDE) -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT


X
X
Xall: $(TARG)
X

Xnmc.o: $(SNMPH) $(SRC)/nmc.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc.c
X
Xnmc_pars.o: $(SNMPH) $(SRC)/nmc_pars.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc_pars.c
X
Xnmc_snmp.o: $(SNMPH) $(SRC)/nmc_snmp.c
X ${CC} $(CFLAGS) -c $(SRC)/nmc_snmp.c
X

XNeMaC: nmc.o nmc_pars.o nmc_snmp.o ${LIBS}
X ${CC} -o $@ nmc.o nmc_pars.o nmc_snmp.o ${LIBS}


X
X
Xclean:
X rm -f *.o ${TARG}
X
Xinstall:
X cp ${TARG} ../bin

END_OF_FILE
if test 837 -ne `wc -c <'netramet/sg/manager/Makefile'`; then
echo shar: \"'netramet/sg/manager/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sg/manager/Makefile'
fi
if test -f 'netramet/sg/snmplib/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sg/snmplib/Makefile'\"
else
echo shar: Extracting \"'netramet/sg/snmplib/Makefile'\" \(1537 characters\)
sed "s/^X//" >'netramet/sg/snmplib/Makefile' <<'END_OF_FILE'
X#
X# Makefile for snmplib.
X#


X# Modified by Nevil Brownlee, Auckland University

X# Silicon Grpahics version
X#
X
XTARG=libsnmp.a
X
XSRC= ../../src/snmplib
XSINCLUDE= ../../src/snmplib/include
X
XOBJS= asn1.o mib.o parse.o snmp.o snmpapi.o snmpauth.o snmpclnt.o
X
XCFLAGS= -g -cckr -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT


X#CFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT
X

Xall: $(TARG)
X
Xasn1.o: $(SINCLUDE)/asn1.h $(SRC)/asn1.c
X cc $(CFLAGS) -c $(SRC)/asn1.c
X
Xmib.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmpimpl.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/parse.h $(SRC)/mib.c
X cc $(CFLAGS) -c $(SRC)/mib.c
X
Xparse.o: $(SINCLUDE)/parse.h $(SRC)/parse.c
X cc $(CFLAGS) -c $(SRC)/parse.c
X
Xsnmp.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/mib.h $(SRC)/snmp.c
X cc $(CFLAGS) -c $(SRC)/snmp.c
X
Xsnmpapi.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/snmpapi.h $(SRC)/snmpapi.c
X cc $(CFLAGS) -c $(SRC)/snmpapi.c
X
Xsnmpauth.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SRC)/snmpauth.c
X cc $(CFLAGS) -c $(SRC)/snmpauth.c
X
Xsnmpclnt.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/snmpapi.h $(SINCLUDE)/snmpclnt.h \
X $(SRC)/snmpclnt.c
X cc $(CFLAGS) -c $(SRC)/snmpclnt.c
X
X
Xlibsnmp.a: ${OBJS}
X ar r libsnmp.a ${OBJS}
X# ranlib libsnmp.a
X
Xinstall: ../lib/libsnmp.a
X
X#../lib/libsnmp.a: libsnmp.a
X# cp libsnmp.a ../lib
X# ranlib ../lib/libsnmp.a
X
X
Xlint:
X lint -nhx $(CSRCS)
X
Xclean:
X rm -f ${OBJS} ${TARG}
X# rm -f ../lib/${TARG}
X
END_OF_FILE
if test 1537 -ne `wc -c <'netramet/sg/snmplib/Makefile'`; then
echo shar: \"'netramet/sg/snmplib/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sg/snmplib/Makefile'
fi
if test -f 'netramet/src/apps/kernel.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/apps/kernel.c'\"
else
echo shar: Extracting \"'netramet/src/apps/kernel.c'\" \(672 characters\)
sed "s/^X//" >'netramet/src/apps/kernel.c' <<'END_OF_FILE'
X
X#include <sys/types.h>
X#include <stdio.h>
X
Xstatic int kmem;
Xint swap, mem;
X
Xinit_kmem(file)
X char *file;
X{
X kmem = open(file, 0);
X if (kmem < 0){
X fprintf(stderr, "cannot open ");
X perror(file);
X exit(1);
X }
X#ifdef ibm032
X mem = open("/dev/mem");
X if (mem < 0){
X fprintf(stderr, "cannot open ");
X perror(file);
X exit(1);
X }
X swap = open("/dev/drum");
X if (swap < 0){
X fprintf(stderr, "cannot open ");
X perror(file);
X exit(1);
X }
X#endif
X}
X
X/*
X * Seek into the kernel for a value.
X */
Xoff_t
Xklseek(base)
X off_t base;
X{
X return (lseek(kmem, base, 0));
X}
X
Xklread(buf, buflen)
X char *buf;
X int buflen;
X{
X read(kmem, buf, buflen);
X}
X
END_OF_FILE
if test 672 -ne `wc -c <'netramet/src/apps/kernel.c'`; then
echo shar: \"'netramet/src/apps/kernel.c'\" unpacked with wrong size!
fi
# end of 'netramet/src/apps/kernel.c'
fi
if test -f 'netramet/src/snmplib/include/parse.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/parse.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/parse.h'\" \(2568 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/parse.h' <<'END_OF_FILE'


X/***********************************************************
X Copyright 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

X/*
X * parse.h
X */
X
X/*
X * A linked list of tag-value pairs for enumerated integers.
X */
Xstruct enum_list {
X struct enum_list *next;
X int value;
X char *label;
X};
X
X/*
X * A linked list of nodes.
X */
Xstruct node {
X struct node *next;
X char label[32]; /* This node's (unique) textual name */
X u_long subid; /* This node's integer subidentifier */
X char parent[32];/* The parent's textual name */
X int type; /* The type of object this represents */
X struct enum_list *enums; /* (optional) list of enumerated integers (otherwise NULL) */
X};
X
X/*
X * A tree in the format of the tree structure of the MIB.
X */
Xstruct tree {
X struct tree *child_list; /* list of children of this node */
X struct tree *next_peer; /* Next node in list of peers */
X struct tree *parent;
X char label[32]; /* This node's textual name */
X u_long subid; /* This node's integer subidentifier */
X int type; /* This node's object type */
X struct enum_list *enums; /* (optional) list of enumerated integers (otherwise NULL) */
X void (*printer)(); /* Value printing function */
X};
X
X/* non-aggregate types for tree end nodes */
X#define TYPE_OTHER 0
X#define TYPE_OBJID 1
X#define TYPE_OCTETSTR 2
X#define TYPE_INTEGER 3
X#define TYPE_NETADDR 4
X#define TYPE_IPADDR 5
X#define TYPE_COUNTER 6
X#define TYPE_GAUGE 7
X#define TYPE_TIMETICKS 8
X#define TYPE_OPAQUE 9
X#define TYPE_NULL 10
X
Xstruct tree *read_mib();
X
END_OF_FILE
if test 2568 -ne `wc -c <'netramet/src/snmplib/include/parse.h'`; then
echo shar: \"'netramet/src/snmplib/include/parse.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/parse.h'
fi
if test -f 'netramet/src/snmplib/include/snmp.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/snmp.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/snmp.h'\" \(2082 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/snmp.h' <<'END_OF_FILE'
X/*
X * Definitions for the Simple Network Management Protocol (RFC 1067).

X#define SNMP_PORT 161
X#define SNMP_TRAP_PORT 162
X
X#define SNMP_MAX_LEN 484
X
X#define SNMP_VERSION_1 0
X
X#define GET_REQ_MSG (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x0)
X#define GETNEXT_REQ_MSG (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x1)
X#define GET_RSP_MSG (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x2)
X#define SET_REQ_MSG (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x3)
X#define TRP_REQ_MSG (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x4)
X
X#define SNMP_ERR_NOERROR (0x0)
X#define SNMP_ERR_TOOBIG (0x1)
X#define SNMP_ERR_NOSUCHNAME (0x2)
X#define SNMP_ERR_BADVALUE (0x3)
X#define SNMP_ERR_READONLY (0x4)
X#define SNMP_ERR_GENERR (0x5)
X
X#define SNMP_TRAP_COLDSTART (0x0)
X#define SNMP_TRAP_WARMSTART (0x1)
X#define SNMP_TRAP_LINKDOWN (0x2)
X#define SNMP_TRAP_LINKUP (0x3)
X#define SNMP_TRAP_AUTHFAIL (0x4)
X#define SNMP_TRAP_EGPNEIGHBORLOSS (0x5)
X#define SNMP_TRAP_ENTERPRISESPECIFIC (0x6)
X
END_OF_FILE
if test 2082 -ne `wc -c <'netramet/src/snmplib/include/snmp.h'`; then
echo shar: \"'netramet/src/snmplib/include/snmp.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/snmp.h'
fi
if test -f 'netramet/src/snmplib/include/snmpclnt.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/src/snmplib/include/snmpclnt.h'\"
else
echo shar: Extracting \"'netramet/src/snmplib/include/snmpclnt.h'\" \(1453 characters\)
sed "s/^X//" >'netramet/src/snmplib/include/snmpclnt.h' <<'END_OF_FILE'
X/*
X * snmp_client.h


X */
X/***********************************************************
X Copyright 1988, 1989 by Carnegie Mellon University
X
X All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its
Xdocumentation for any purpose and without fee is hereby granted,
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in
Xsupporting documentation, and that the name of CMU not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.
X
XCMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XCMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X******************************************************************/

Xstruct synch_state {
X int waiting;
X int status;
X/* status codes */
X#define STAT_SUCCESS 0
X#define STAT_ERROR 1
X#define STAT_TIMEOUT 2


X int reqid;
X struct snmp_pdu *pdu;

X};
X
Xextern struct synch_state snmp_synch_state;
X
Xstruct snmp_pdu *snmp_pdu_create();
Xstruct snmp_pdu *snmp_fix_pdu();
Xchar *snmp_errstring();
END_OF_FILE
if test 1453 -ne `wc -c <'netramet/src/snmplib/include/snmpclnt.h'`; then
echo shar: \"'netramet/src/snmplib/include/snmpclnt.h'\" unpacked with wrong size!
fi
# end of 'netramet/src/snmplib/include/snmpclnt.h'
fi
if test -f 'netramet/sun/apps/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sun/apps/Makefile'\"
else
echo shar: Extracting \"'netramet/sun/apps/Makefile'\" \(2704 characters\)
sed "s/^X//" >'netramet/sun/apps/Makefile' <<'END_OF_FILE'


X# Modified by Nevil Brownlee, Auckland University

X# SunOS version


X#
X# Makefile for snmpget, manager, snmpgetnext, collect, snmpwalk, snmpstatus, snmptest snmptrap snmptrapd snmpd
X#
X
XSRC= ../../src/apps
XSINCLUDE= ../../src/snmplib/include
X
XSNMPH = $(SINCLUDE)/asn1.h $(SINCLUDE)/mib.h $(SINCLUDE)/parse.h \
X $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/snmpclnt.h $(SINCLUDE)/snmpimpl.h
X
XTARG= snmpagnt.o snmptest \
X# snmpget snmpgetnext snmpwalk snmpstatus \
X# snmptrap snmptrapd

X# snmptest snmptrap snmptrapd \
X# snmpd
X
XLIBS= ../snmplib/libsnmp.a
X


XCC= acc # Sun ANSI C compiler

XCFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT -DSUNOS


X
X
Xall: $(TARG)
X
X
Xsnmptest.o: $(SNMPH) $(SRC)/snmptest.c
X ${CC} $(CFLAGS) -c $(SRC)/snmptest.c
X
Xsnmptest: snmptest.o ${LIBS}
X ${CC} -o $@ snmptest.o ${LIBS}
X
X
Xsnmptrap.o: $(SNMPH) $(SRC)/snmptrap.c
X ${CC} $(CFLAGS) -c $(SRC)/snmptrap.c
X
Xsnmptrap: snmptrap.o ${LIBS}
X ${CC} -o $@ snmptrap.o ${LIBS}

X# snmpd.o: $(SNMPH) $(SRC)/snmpd.c
X# ${CC} $(CFLAGS) -c $(SRC)/snmpd.c
X
X# kernel.o: $(SNMPH) $(SRC)/kernel.c
X# ${CC} $(CFLAGS) -c $(SRC)/kernel.c


X
Xsnmpagnt.o: $(SNMPH) $(SRC)/snmpagnt.c
X ${CC} $(CFLAGS) -c $(SRC)/snmpagnt.c
X

X# snmp_vars.o: $(SNMPH) $(SRC)/snmp_vars.c
X# ${CC} $(CFLAGS) -c $(SRC)/snmp_vars.c
X
X# snmp_var_route.o: $(SNMPH) $(SRC)/snmp_var_route.c
X# ${CC} $(CFLAGS) -c $(SRC)/snmp_var_route.c
X
X# snmpd: snmpd.o kernel.o snmpagnt.o snmp_vars.o snmp_var_route.o ${LIBS}
X# ${CC} -o $@ snmpd.o kernel.o snmpagnt.o snmp_vars.o \
X# snmp_var_route.o ${LIBS}


X
X
Xclean:
X rm -f *.o ${TARG}
X
Xinstall:
X cp ${TARG} ../bin
X
X
END_OF_FILE

if test 2704 -ne `wc -c <'netramet/sun/apps/Makefile'`; then
echo shar: \"'netramet/sun/apps/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sun/apps/Makefile'
fi
if test -f 'netramet/sun/apps/snmpnetstat/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sun/apps/snmpnetstat/Makefile'\"
else
echo shar: Extracting \"'netramet/sun/apps/snmpnetstat/Makefile'\" \(1552 characters\)
sed "s/^X//" >'netramet/sun/apps/snmpnetstat/Makefile' <<'END_OF_FILE'


X# Modified by Nevil Brownlee, Auckland University

X# SunOS version


X#
X#
X# Copyright (c) 1987 Regents of the University of California.
X# All rights reserved.
X#
X# Redistribution and use in source and binary forms are permitted
X# provided that the above copyright notice and this paragraph are
X# duplicated in all such forms and that any documentation,
X# advertising materials, and other materials related to such
X# distribution and use acknowledge that the software was developed
X# by the University of California, Berkeley. The name of the
X# University may not be used to endorse or promote products derived
X# from this software without specific prior written permission.
X# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X#
X# @(#)Makefile 5.10 (Berkeley) 9/20/88
X#
XSINCLUDE= ../../../src/snmplib/include
X

XCC= acc # Sun ANSII compiler
XCFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT
X


XLIBS= ../../snmplib/libsnmp.a
X
XSRC= ../../../src/apps/snmpnetstat
X
XSRCS= ${SRC}/inet.c ${SRC}/if.c ${SRC}/main.c ${SRC}/route.c
XOBJS= ${SRC}/inet.o ${SRC}/if.o ${SRC}/main.o ${SRC}/route.o
X
Xall: snmpnetstat
X
Xsnmpnetstat: ${SRCS} ${LIBS}
X ${CC} -o $@ ${CFLAGS} ${SRCS} ${LIBS}

X
Xclean:


X rm -f ${OBJS} core snmpnetstat
X
Xcleandir: clean
X rm -f ${MAN} tags .depend
X
Xdepend: ${SRCS}
X mkdep ${CFLAGS} ${SRCS}
X
Xlint: ${SRCS}
X lint ${CFLAGS} ${SRCS}
X
Xtags: ${SRCS}
X ctags ${SRCS}
X
Xinstall:
X cp snmpnetstat ../../bin
X
END_OF_FILE

if test 1552 -ne `wc -c <'netramet/sun/apps/snmpnetstat/Makefile'`; then
echo shar: \"'netramet/sun/apps/snmpnetstat/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sun/apps/snmpnetstat/Makefile'
fi
if test -f 'netramet/sun/meter/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sun/meter/Makefile'\"
else
echo shar: Extracting \"'netramet/sun/meter/Makefile'\" \(956 characters\)
sed "s/^X//" >'netramet/sun/meter/Makefile' <<'END_OF_FILE'
X#
X# Makefile flowd
X#
X
XSRC= ../../src/meter
XSINCLUDE= ../../src/snmplib/include
XMINCLUDE= ../../src/meter/include
X
XSNMPH = $(SINCLUDE)/ausnmp.h \
X $(SINCLUDE)/asn1.h $(SINCLUDE)/mib.h \
X $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h
X
XMETERH = $(MINCLUDE)/flowhash.h $(MINCLUDE)/met_vars.h \
X $(MINCLUDE)/decnet.h $(MINCLUDE)/pktsnap.h
X
XTARG= NeTraMet
X
XLIBS= ../apps/snmpagnt.o ../snmplib/libsnmp.a


X
XCC= acc # Sun ANSI C compiler

XCFLAGS= -g -I$(MINCLUDE) -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT -DSUNOS


X
X
Xall: $(TARG)
X
X

Xmeter_ux.o: $(SNMPH) $(METERH) $(SRC)/meter_ux.c
X ${CC} $(CFLAGS) -c $(SRC)/meter_ux.c
X
Xflowhash.o: $(SNMPH) $(METERH) $(SRC)/flowhash.c
X ${CC} $(CFLAGS) -c $(SRC)/flowhash.c
X
Xmet_vars.o: $(SNMPH) $(METERH) $(SRC)/met_vars.c
X ${CC} $(CFLAGS) -c $(SRC)/met_vars.c
X
X
XNeTraMet: flowhash.o met_vars.o meter_ux.o ${LIBS}
X ${CC} -o $@ meter_ux.o flowhash.o met_vars.o ${LIBS}
X


X
X
Xclean:
X rm -f *.o ${TARG}
X
Xinstall:
X cp ${TARG} ../bin
X
X

X
X
END_OF_FILE
if test 956 -ne `wc -c <'netramet/sun/meter/Makefile'`; then
echo shar: \"'netramet/sun/meter/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sun/meter/Makefile'
fi
if test -f 'netramet/sun/snmplib/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/sun/snmplib/Makefile'\"
else
echo shar: Extracting \"'netramet/sun/snmplib/Makefile'\" \(1546 characters\)
sed "s/^X//" >'netramet/sun/snmplib/Makefile' <<'END_OF_FILE'
X#
X# Makefile for snmplib.
X#


X# Modified by Nevil Brownlee, Auckland University

X# SunOS version
X#
X
XTARG=libsnmp.a
X
XSRC= ../../src/snmplib
XSINCLUDE= ../../src/snmplib/include
X
XOBJS= asn1.o mib.o parse.o snmp.o snmpapi.o snmpauth.o snmpclnt.o \
X snmp.o snmpapi.o


X
XCC= acc # Sun ANSI C compiler

XCFLAGS= -g -I$(SINCLUDE) -D_BSD_SIGNALS -D_BSD_COMPAT -DSUNOS
X
Xall: $(TARG)
X
Xasn1.o: $(SINCLUDE)/asn1.h $(SRC)/asn1.c
X $(CC) $(CFLAGS) -c $(SRC)/asn1.c
X
Xmib.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmpimpl.h $(SINCLUDE)/snmpapi.h \
X $(SINCLUDE)/parse.h $(SRC)/mib.c
X $(CC) $(CFLAGS) -c $(SRC)/mib.c
X
Xparse.o: $(SINCLUDE)/parse.h $(SRC)/parse.c
X $(CC) $(CFLAGS) -c $(SRC)/parse.c
X
Xsnmp.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/mib.h $(SRC)/snmp.c
X $(CC) $(CFLAGS) -c $(SRC)/snmp.c
X
Xsnmpapi.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/snmpapi.h $(SRC)/snmpapi.c
X $(CC) $(CFLAGS) -c $(SRC)/snmpapi.c
X
Xsnmpauth.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SRC)/snmpauth.c
X $(CC) $(CFLAGS) -c $(SRC)/snmpauth.c
X
Xsnmpclnt.o: $(SINCLUDE)/asn1.h $(SINCLUDE)/snmp.h $(SINCLUDE)/snmpimpl.h \
X $(SINCLUDE)/snmpapi.h $(SINCLUDE)/snmpclnt.h \
X $(SRC)/snmpclnt.c
X $(CC) $(CFLAGS) -c $(SRC)/snmpclnt.c
X
X
Xlibsnmp.a: ${OBJS}
X ar r libsnmp.a ${OBJS}
X ranlib libsnmp.a
X
Xinstall: ../lib/libsnmp.a
X
X#../lib/libsnmp.a: libsnmp.a
X# cp libsnmp.a ../lib
X# ranlib ../lib/libsnmp.a
X
X
Xlint:
X lint -nhx $(CSRCS)
X
Xclean:
X rm -f ${OBJS} ${TARG}
X# rm -f ../lib/${TARG}
X
END_OF_FILE
if test 1546 -ne `wc -c <'netramet/sun/snmplib/Makefile'`; then
echo shar: \"'netramet/sun/snmplib/Makefile'\" unpacked with wrong size!
fi
# end of 'netramet/sun/snmplib/Makefile'
fi
echo shar: End of archive 24 \(of 25\).
cp /dev/null ark24isdone

J Nevil Brownlee

unread,
Nov 8, 1993, 9:08:19 PM11/8/93
to
Submitted-by: ne...@ccu1.aukuni.ac.nz (J Nevil Brownlee)
Posting-number: Volume 40, Issue 113
Archive-name: netramet/part25
Environment: INET, UNIX, DOS

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: netramet netramet/pc netramet/pc/NOTE
# netramet/release.note
# Wrapped by kent@sparky on Wed Nov 3 15:43:13 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 25 (of 25)."'
if test ! -d 'netramet' ; then
echo shar: Creating directory \"'netramet'\"
mkdir 'netramet'
fi
if test ! -d 'netramet/pc' ; then
echo shar: Creating directory \"'netramet/pc'\"
mkdir 'netramet/pc'
fi
if test -f 'netramet/pc/NOTE' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/pc/NOTE'\"
else
echo shar: Extracting \"'netramet/pc/NOTE'\" \(207 characters\)
sed "s/^X//" >'netramet/pc/NOTE' <<'END_OF_FILE'
X
XPC Users Please Note:
X
XThis directory contains files for the PC distribution. The file NeTraMet.zip
Xshould be moved to a PC, where it can be unpacked and NeTraMet.exe built
Xusing Turbo Make and Turbo C.
X
END_OF_FILE
if test 207 -ne `wc -c <'netramet/pc/NOTE'`; then
echo shar: \"'netramet/pc/NOTE'\" unpacked with wrong size!
fi
# end of 'netramet/pc/NOTE'
fi
if test -f 'netramet/release.note' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'netramet/release.note'\"
else
echo shar: Extracting \"'netramet/release.note'\" \(2594 characters\)
sed "s/^X//" >'netramet/release.note' <<'END_OF_FILE'
X Network Traffic Metering software now available
X -----------------------------------------------
X
XNeTraMet, the first implementation of the Internet Accounting
XArchitecture (outlined in RFC 1272, "Internet Accounting Background")
Xis now complete.
X
XNeTraMet is an accounting meter which runs on a PC under DOS or a
XSunOS Unix system. It builds up packet and byte counts for traffic
Xflows, which are defined by their end-point addresses. Addresses can be
Xethernet addresses, protocol addresses (IP, DECnet, EtherTalk or IPX)
Xor 'detail' addresses (IP port numbers, etc), or any combination of
Xthese. The traffic flows to be observed are specified by a set of
Xrules, which are downloaded to NeTraMet by a 'manager' program. Traffic
Xflow data is collected via SNMP from NeTraMet by a 'collector' program.
X
XNeMaC, a combined manager and collector program, is supplied with
XNeTraMet. It downloads rules to meters, and collects data from them.
XAlthough a meter may only have one manager, its data can be collected
Xby several collectors, which do not have to be synchronised. NeMac
Xcan manage and collect data from an arbitrary number of meters.
X
XThe format of NeMaC's collected flow data files is very general; the
Xcontents of data lines in the file is completely specified by the
Xuser. ASN.1 opaque objects are used to retrieve flow data so as to
Xminimise the overheads in using SNMP for this purpose.
X
XNeTraMet is free software, and can be obtained by anonymous FTP from
Xccu1.auckland.ac.nz. at any time between 0700 and 2000 GMT (traffic
Xcharges to New Zealand - which we pay - are cheaper between 8 pm and
X9 am).
X
XThe NeTraMet distribution files are in the directory iawg/NeTraMet.
XThere are four of them:
X
X Release.note This file.
X
X NeTraMet.man.ps.gz Users' manual only, in Postscript,
X compressed with gzip.
X
X NeTraMet.tar.gz Full distibution file, including NeTraMet.man.ps,
X source and Make files for SunOS and Irix,
X executable files for PC. Compressed with gzip.
X
X NeTraMet.zip Full PC source and Make files. Archived
X with pkzip; use pkunzip -d to unpack.
X
XNeTraMet provides a valuable tool for analysing network traffic flows,
Xand should prove to be of interest to anyone interested in network monitoring,
Xcapacity planning, performance measurement, etc. You are invited to
Xtry it on your network!
X
XUser comments and suggestions will be very welcome: please post these to the
XInternet Accounting mailing list, accoun...@wugate.wustl.edu. To
Xjoin the mailing list, send a request to accounting-ml-request@
Xwugate.wustl.edu.
X
END_OF_FILE
if test 2594 -ne `wc -c <'netramet/release.note'`; then
echo shar: \"'netramet/release.note'\" unpacked with wrong size!
fi
# end of 'netramet/release.note'
fi
echo shar: End of archive 25 \(of 25\).
cp /dev/null ark25isdone

0 new messages